X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3c8346f0efa4ae16b9fa2d9467311b387b2d7d58..e4adb4b6e18aae3017797c8f214fd7dd0dd51efc:/print-mptcp.c diff --git a/print-mptcp.c b/print-mptcp.c index 7ffb1f51..6697b884 100644 --- a/print-mptcp.c +++ b/print-mptcp.c @@ -72,6 +72,7 @@ struct mp_capable { nd_uint8_t flags; nd_uint64_t sender_key; nd_uint64_t receiver_key; + nd_uint16_t data_len; }; #define MP_CAPABLE_OPT_VERSION(sub_ver) (((sub_ver) >> 0) & 0xF) @@ -193,10 +194,10 @@ mp_capable_print(netdissect_options *ndo, const u_char *opt, u_int opt_len, u_char flags) { const struct mp_capable *mpc = (const struct mp_capable *) opt; - uint8_t version; + uint8_t version, csum_enabled; if (!((opt_len == 12 || opt_len == 4) && flags & TH_SYN) && - !((opt_len == 20 || opt_len == 22) && (flags & (TH_SYN | TH_ACK)) == + !((opt_len == 20 || opt_len == 22 || opt_len == 24) && (flags & (TH_SYN | TH_ACK)) == TH_ACK)) return 0; @@ -211,12 +212,17 @@ mp_capable_print(netdissect_options *ndo, return 1; } - if (GET_U_1(mpc->flags) & MP_CAPABLE_C) + csum_enabled = GET_U_1(mpc->flags) & MP_CAPABLE_C; + if (csum_enabled) ND_PRINT(" csum"); if (opt_len == 12 || opt_len >= 20) { ND_PRINT(" {0x%" PRIx64, GET_BE_U_8(mpc->sender_key)); if (opt_len >= 20) ND_PRINT(",0x%" PRIx64, GET_BE_U_8(mpc->receiver_key)); + + /* RFC 8684 Section 3.1 */ + if ((opt_len == 22 && !csum_enabled) || opt_len == 24) + ND_PRINT(",data_len=%u", GET_BE_U_2(mpc->data_len)); ND_PRINT("}"); } return 1;