X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/1ea8a8c4a4f1140e775a6dd4384802aac7b6d622..6c78ecd7a8b996bc81cc28d412ed9afa55f0b84c:/print-mptcp.c diff --git a/print-mptcp.c b/print-mptcp.c index c5fad69b..a604e563 100644 --- a/print-mptcp.c +++ b/print-mptcp.c @@ -46,9 +46,125 @@ #include "addrtoname.h" #include "ipproto.h" -#include "mptcp.h" #include "tcp.h" +#define MPTCP_SUB_CAPABLE 0x0 +#define MPTCP_SUB_JOIN 0x1 +#define MPTCP_SUB_DSS 0x2 +#define MPTCP_SUB_ADD_ADDR 0x3 +#define MPTCP_SUB_REMOVE_ADDR 0x4 +#define MPTCP_SUB_PRIO 0x5 +#define MPTCP_SUB_FAIL 0x6 +#define MPTCP_SUB_FCLOSE 0x7 + +struct mptcp_option { + u_int8_t kind; + u_int8_t len; + u_int8_t sub_etc; /* subtype upper 4 bits, other stuff lower 4 bits */ +}; + +#define MPTCP_OPT_SUBTYPE(sub_etc) (((sub_etc) >> 4) & 0xF) + +struct mp_capable { + u_int8_t kind; + u_int8_t len; + u_int8_t sub_ver; + u_int8_t flags; + u_int8_t sender_key[8]; + u_int8_t receiver_key[8]; +}; + +#define MP_CAPABLE_OPT_VERSION(sub_ver) (((sub_ver) >> 0) & 0xF) +#define MP_CAPABLE_C 0x80 +#define MP_CAPABLE_S 0x01 + +struct mp_join { + u_int8_t kind; + u_int8_t len; + u_int8_t sub_b; + u_int8_t addr_id; + union { + struct { + u_int8_t token[4]; + u_int8_t nonce[4]; + } syn; + struct { + u_int8_t mac[8]; + u_int8_t nonce[4]; + } synack; + struct { + u_int8_t mac[20]; + } ack; + } u; +}; + +#define MP_JOIN_B 0x01 + +struct mp_dss { + u_int8_t kind; + u_int8_t len; + u_int8_t sub; + u_int8_t flags; +}; + +#define MP_DSS_F 0x10 +#define MP_DSS_m 0x08 +#define MP_DSS_M 0x04 +#define MP_DSS_a 0x02 +#define MP_DSS_A 0x01 + +struct mp_add_addr { + u_int8_t kind; + u_int8_t len; + u_int8_t sub_ipver; + u_int8_t addr_id; + union { + struct { + u_int8_t addr[4]; + u_int8_t port[2]; + } v4; + struct { + u_int8_t addr[16]; + u_int8_t port[2]; + } v6; + } u; +}; + +#define MP_ADD_ADDR_IPVER(sub_ipver) (((sub_ipver) >> 0) & 0xF) + +struct mp_remove_addr { + u_int8_t kind; + u_int8_t len; + u_int8_t sub; + /* list of addr_id */ + u_int8_t addrs_id; +}; + +struct mp_fail { + u_int8_t kind; + u_int8_t len; + u_int8_t sub; + u_int8_t resv; + u_int8_t data_seq[8]; +}; + +struct mp_close { + u_int8_t kind; + u_int8_t len; + u_int8_t sub; + u_int8_t rsv; + u_int8_t key[8]; +}; + +struct mp_prio { + u_int8_t kind; + u_int8_t len; + u_int8_t sub_b; + u_int8_t addr_id; +}; + +#define MP_PRIO_B 0x01 + static int dummy_print(const u_char *opt _U_, u_int opt_len _U_, u_char flags _U_) { return 1; @@ -217,8 +333,8 @@ static int add_addr_print(const u_char *opt, u_int opt_len, u_char flags _U_) static int remove_addr_print(const u_char *opt, u_int opt_len, u_char flags _U_) { - struct mp_remove_addr *rem_addr = (struct mp_remove_addr *) opt; - u_int8_t *addr_id = &rem_addr->addrs_id; + struct mp_remove_addr *remove_addr = (struct mp_remove_addr *) opt; + u_int8_t *addr_id = &remove_addr->addrs_id; if (opt_len < 4) return 0; @@ -265,7 +381,7 @@ static int mp_fast_close_print(const u_char *opt, u_int opt_len, u_char flags _U return 1; } -static struct { +static const struct { const char *name; int (*print)(const u_char *, u_int, u_char); } mptcp_options[] = {