From 1ac47641c5766875f0c02fa3ace8b6a1786a61ed Mon Sep 17 00:00:00 2001 From: Davide Caratti Date: Fri, 7 May 2021 15:42:53 +0200 Subject: mptcp: add support for MP_TCPRST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- print-mptcp.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'print-mptcp.c') 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); -- cgit v1.2.1