diff options
author | Davide Caratti <dcaratti@redhat.com> | 2021-05-07 15:42:53 +0200 |
---|---|---|
committer | Davide Caratti <dcaratti@redhat.com> | 2021-07-12 10:51:58 +0200 |
commit | 1ac47641c5766875f0c02fa3ace8b6a1786a61ed (patch) | |
tree | 954dba26b2a132a1b6a61bfa8328cbdfd61f82fa /print-mptcp.c | |
parent | 5ff873f0d277e10ad9deffa92b00b38cbfef4914 (diff) | |
download | tcpdump-1ac47641c5766875f0c02fa3ace8b6a1786a61ed.tar.gz |
mptcp: add support for MP_TCPRST
dissect the MP_TCPRST sub-option in accordance to RFC8684 ยง3.6.
Link: https://github.com/multipath-tcp/mptcp_net-next/issues/189
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Diffstat (limited to 'print-mptcp.c')
-rw-r--r-- | print-mptcp.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/print-mptcp.c b/print-mptcp.c index 6697b884..b8af92db 100644 --- a/print-mptcp.c +++ b/print-mptcp.c @@ -56,6 +56,7 @@ #define MPTCP_SUB_PRIO 0x5 #define MPTCP_SUB_FAIL 0x6 #define MPTCP_SUB_FCLOSE 0x7 +#define MPTCP_SUB_TCPRST 0x8 struct mptcp_option { nd_uint8_t kind; @@ -182,6 +183,32 @@ struct mp_prio { #define MP_PRIO_B 0x01 +static const struct tok mp_tcprst_flags[] = { + { 0x08, "U" }, + { 0x04, "V" }, + { 0x02, "W" }, + { 0x01, "T" }, + { 0, NULL } +}; + +static const struct tok mp_tcprst_reasons[] = { + { 0x06, "Middlebox interference" }, + { 0x05, "Unacceptable performance" }, + { 0x04, "Too much outstanding data" }, + { 0x03, "Administratively prohibited" }, + { 0x02, "Lack of resources" }, + { 0x01, "MPTCP-specific error" }, + { 0x00, "Unspecified error" }, + { 0, NULL } +}; + +struct mp_tcprst { + nd_uint8_t kind; + nd_uint8_t len; + nd_uint8_t sub_b; + nd_uint8_t reason; +}; + static int dummy_print(netdissect_options *ndo _U_, const u_char *opt _U_, u_int opt_len _U_, u_char flags _U_) @@ -454,6 +481,23 @@ mp_fast_close_print(netdissect_options *ndo, return 1; } +static int +mp_tcprst_print(netdissect_options *ndo, + const u_char *opt, u_int opt_len, u_char flags _U_) +{ + const struct mp_tcprst *mpr = (const struct mp_tcprst *)opt; + + if (opt_len != 4) + return 0; + + ND_PRINT(" flags [%s]", bittok2str_nosep(mp_tcprst_flags, "none", + GET_U_1(mpr->sub_b))); + + ND_PRINT(" reason %s", tok2str(mp_tcprst_reasons, "unknown (0x%02x)", + GET_U_1(mpr->reason))); + return 1; +} + static const struct { const char *name; int (*print)(netdissect_options *, const u_char *, u_int, u_char); @@ -466,6 +510,7 @@ static const struct { { "prio", mp_prio_print }, { "fail", mp_fail_print }, { "fast-close", mp_fast_close_print }, + { "tcprst", mp_tcprst_print }, { "unknown", dummy_print }, }; @@ -482,7 +527,7 @@ mptcp_print(netdissect_options *ndo, opt = (const struct mptcp_option *) cp; subtype = MPTCP_OPT_SUBTYPE(GET_U_1(opt->sub_etc)); - subtype = ND_MIN(subtype, MPTCP_SUB_FCLOSE + 1); + subtype = ND_MIN(subtype, MPTCP_SUB_TCPRST + 1); ND_PRINT(" %u", len); |