diff options
author | Peter Krystad <peter.krystad@linux.intel.com> | 2020-02-27 10:55:51 -0800 |
---|---|---|
committer | fxlb <devel.fx.lebail@orange.fr> | 2020-03-02 11:26:30 +0100 |
commit | fdd065fb0f505ca6d0396b144878581d56983018 (patch) | |
tree | 2e7c9fec2ff34ef3c966d09ab4f13ccbe3653693 /print-mptcp.c | |
parent | 1dc8113bf795ec74364b5e8e048abd24192d66a5 (diff) | |
download | tcpdump-fdd065fb0f505ca6d0396b144878581d56983018.tar.gz |
MPTCP: parse v1 ADD_ADDR option
RFC6824bis-18 (MPTCP version 1) makes changes to the MPTCP
ADD_ADDR option format.
An HMAC field is added to the option and the IP version field is
removed and replaced with an Echo bit that provides a reliability
mechanism.
This change allows either v0 or v1 ADD_ADDR options
to be parsed and displayed correctly.
Signed-off-by: Peter Krystad <peter.krystad@linux.intel.com>
Diffstat (limited to 'print-mptcp.c')
-rw-r--r-- | print-mptcp.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/print-mptcp.c b/print-mptcp.c index 43258e50..c2d61e15 100644 --- a/print-mptcp.c +++ b/print-mptcp.c @@ -116,22 +116,30 @@ struct mp_dss { struct mp_add_addr { nd_uint8_t kind; nd_uint8_t len; - nd_uint8_t sub_ipver; + nd_uint8_t sub_echo; nd_uint8_t addr_id; union { struct { nd_ipv4 addr; nd_uint16_t port; + nd_uint64_t mac; } v4; struct { + nd_ipv4 addr; + nd_uint64_t mac; + } v4np; + struct { nd_ipv6 addr; nd_uint16_t port; + nd_uint64_t mac; } v6; + struct { + nd_ipv6 addr; + nd_uint64_t mac; + } v6np; } u; }; -#define MP_ADD_ADDR_IPVER(sub_ipver) ((GET_U_1(sub_ipver) >> 0) & 0xF) - struct mp_remove_addr { nd_uint8_t kind; nd_uint8_t len; @@ -341,26 +349,30 @@ add_addr_print(netdissect_options *ndo, const u_char *opt, u_int opt_len, u_char flags _U_) { const struct mp_add_addr *add_addr = (const struct mp_add_addr *) opt; - u_int ipver = MP_ADD_ADDR_IPVER(add_addr->sub_ipver); - if (!((opt_len == 8 || opt_len == 10) && ipver == 4) && - !((opt_len == 20 || opt_len == 22) && ipver == 6)) + if (!(opt_len == 8 || opt_len == 10 || opt_len == 16 || opt_len == 18 || + opt_len == 20 || opt_len == 22 || opt_len == 28 || opt_len == 30)) return 0; ND_PRINT(" id %u", GET_U_1(add_addr->addr_id)); - switch (ipver) { - case 4: + if (opt_len == 8 || opt_len == 10 || opt_len == 16 || opt_len == 18) { ND_PRINT(" %s", GET_IPADDR_STRING(add_addr->u.v4.addr)); - if (opt_len == 10) + if (opt_len == 10 || opt_len == 18) ND_PRINT(":%u", GET_BE_U_2(add_addr->u.v4.port)); - break; - case 6: + if (opt_len == 16) + ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v4np.mac)); + if (opt_len == 18) + ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v4.mac)); + } + + if (opt_len == 20 || opt_len == 22 || opt_len == 28 || opt_len == 30) { ND_PRINT(" %s", GET_IP6ADDR_STRING(add_addr->u.v6.addr)); - if (opt_len == 22) + if (opt_len == 22 || opt_len == 30) ND_PRINT(":%u", GET_BE_U_2(add_addr->u.v6.port)); - break; - default: - return 0; + if (opt_len == 28) + ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v6np.mac)); + if (opt_len == 30) + ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v6.mac)); } return 1; |