summaryrefslogtreecommitdiff
path: root/print-mptcp.c
diff options
context:
space:
mode:
authorDavide Caratti <dcaratti@redhat.com>2021-05-07 15:42:53 +0200
committerDavide Caratti <dcaratti@redhat.com>2021-07-12 10:51:58 +0200
commit1ac47641c5766875f0c02fa3ace8b6a1786a61ed (patch)
tree954dba26b2a132a1b6a61bfa8328cbdfd61f82fa /print-mptcp.c
parent5ff873f0d277e10ad9deffa92b00b38cbfef4914 (diff)
downloadtcpdump-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.c47
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);