diff options
author | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2014-12-24 15:30:03 +0100 |
---|---|---|
committer | Evan Huus <eapache@gmail.com> | 2015-01-04 18:39:05 +0000 |
commit | c2f6ce7571442a1d51bb466a16bd08ec90f71e5b (patch) | |
tree | d37e55a22d0d2e2ccead6489e2a3fecd1c2486cf /epan/dissectors | |
parent | f648247f343d0f9cc300ea9d6eabe67bccfbe365 (diff) |
TCP: Update Multipath TCP (MPTCP) to final RFC (RFC 6824)
* Add Fast Close subtype
* Sender MAC => Sender HMAC
* Display some reserved field
* Add new flag (Checksum, Extensibility, HMAC-SHA1...) from MP Capability subtype
* Use also proto_tree_add_bitmask for flag
Change-Id: I2e4dfd75623d3218c574e3a112e799666adcc377
Reviewed-on: https://code.wireshark.org/review/6034
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Evan Huus <eapache@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-tcp.c | 104 |
1 files changed, 68 insertions, 36 deletions
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c index fc38eb9187..71b28c76e5 100644 --- a/epan/dissectors/packet-tcp.c +++ b/epan/dissectors/packet-tcp.c @@ -198,23 +198,26 @@ static int hf_tcp_option_rvbd_trpy_dst_port = -1; static int hf_tcp_option_rvbd_trpy_client_port = -1; static int hf_tcp_option_mptcp_flags = -1; +static int hf_tcp_option_mptcp_backup_flag = -1; +static int hf_tcp_option_mptcp_checksum_flag = -1; static int hf_tcp_option_mptcp_B_flag = -1; -static int hf_tcp_option_mptcp_C_flag = -1; -static int hf_tcp_option_mptcp_S_flag = -1; +static int hf_tcp_option_mptcp_H_flag = -1; static int hf_tcp_option_mptcp_F_flag = -1; static int hf_tcp_option_mptcp_m_flag = -1; static int hf_tcp_option_mptcp_M_flag = -1; static int hf_tcp_option_mptcp_a_flag = -1; static int hf_tcp_option_mptcp_A_flag = -1; +static int hf_tcp_option_mptcp_reserved_flag = -1; static int hf_tcp_option_mptcp_subtype = -1; static int hf_tcp_option_mptcp_version = -1; +static int hf_tcp_option_mptcp_reserved = -1; static int hf_tcp_option_mptcp_address_id = -1; static int hf_tcp_option_mptcp_recv_token = -1; static int hf_tcp_option_mptcp_sender_key = -1; static int hf_tcp_option_mptcp_recv_key = -1; static int hf_tcp_option_mptcp_sender_rand = -1; -static int hf_tcp_option_mptcp_sender_trunc_mac = -1; -static int hf_tcp_option_mptcp_sender_mac = -1; +static int hf_tcp_option_mptcp_sender_trunc_hmac = -1; +static int hf_tcp_option_mptcp_sender_hmac = -1; static int hf_tcp_option_mptcp_data_ack = -1; static int hf_tcp_option_mptcp_data_seq_no = -1; static int hf_tcp_option_mptcp_subflow_seq_no = -1; @@ -411,6 +414,7 @@ static gboolean tcp_exp_options_with_magic = TRUE; #define TCPOPT_MPTCP_REMOVE_ADDR 0x4 /* Multipath TCP Remove Address */ #define TCPOPT_MPTCP_MP_PRIO 0x5 /* Multipath TCP Change Subflow Priority */ #define TCPOPT_MPTCP_MP_FAIL 0x6 /* Multipath TCP Fallback */ +#define TCPOPT_MPTCP_MP_FASTCLOSE 0x7 /* Multipath TCP Fast Close */ static const true_false_string tcp_option_user_to_granularity = { "Minutes", "Seconds" @@ -485,6 +489,7 @@ static const value_string mptcp_subtype_vs[] = { { TCPOPT_MPTCP_REMOVE_ADDR, "Remove Address" }, { TCPOPT_MPTCP_MP_PRIO, "Change Subflow Priority" }, { TCPOPT_MPTCP_MP_FAIL, "TCP Fallback" }, + { TCPOPT_MPTCP_MP_FASTCLOSE, "Fast Close" }, { 0, NULL } }; @@ -499,6 +504,14 @@ static guint32 tcp_stream_count; #define UTF8_RIGHTWARDS_ARROW "\xe2\x86\x92" /* 8594 / 0x2192 */ #define UTF8_LEFT_RIGHT_ARROW "\xe2\x86\x94" /* 8596 / 0x2194 */ +static const int *tcp_option_mptcp_capable_flags[] = { + &hf_tcp_option_mptcp_checksum_flag, + &hf_tcp_option_mptcp_B_flag, + &hf_tcp_option_mptcp_H_flag, + &hf_tcp_option_mptcp_reserved_flag, + NULL +}; + static void tcp_src_prompt(packet_info *pinfo, gchar *result) { @@ -2800,9 +2813,9 @@ dissect_tcpopt_timestamp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, /* * The TCP Extensions for Multipath Operation with Multiple Addresses - * are defined in draft-ietf-mptcp-multiaddressed-04 + * are defined in RFC 6824 * - * <http://tools.ietf.org/html/draft-ief-mptcp-multiaddressed-04> + * <http://http://tools.ietf.org/html/rfc6824> * * Author: Andrei Maruseac <andrei.maruseac@intel.com> */ @@ -2815,7 +2828,6 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, proto_tree *mptcp_flags_tree; guint8 subtype; - guint8 indx; guint8 flags; guint8 ipver; int start_offset = offset; @@ -2839,15 +2851,9 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - flags = tvb_get_guint8(tvb, offset); - ti = proto_tree_add_uint(mptcp_tree, hf_tcp_option_mptcp_flags, tvb, - offset, 1, flags); - mptcp_flags_tree = proto_item_add_subtree(ti, ett_tcp_option_mptcp); - - proto_tree_add_item(mptcp_flags_tree, hf_tcp_option_mptcp_C_flag, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mptcp_flags_tree, hf_tcp_option_mptcp_S_flag, - tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_bitmask(mptcp_tree, tvb, offset, hf_tcp_option_mptcp_flags, + ett_tcp_option_mptcp, tcp_option_mptcp_capable_flags, + ENC_BIG_ENDIAN); offset += 1; if (optlen == 12 || optlen == 20) { @@ -2873,7 +2879,7 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, ett_tcp_option_mptcp); proto_tree_add_item(mptcp_flags_tree, - hf_tcp_option_mptcp_B_flag, tvb, offset, + hf_tcp_option_mptcp_backup_flag, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; @@ -2901,7 +2907,7 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, ett_tcp_option_mptcp); proto_tree_add_item(mptcp_flags_tree, - hf_tcp_option_mptcp_B_flag, tvb, offset, + hf_tcp_option_mptcp_backup_flag, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; @@ -2911,7 +2917,7 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, offset += 1; proto_tree_add_item(mptcp_tree, - hf_tcp_option_mptcp_sender_trunc_mac, tvb, offset, + hf_tcp_option_mptcp_sender_trunc_hmac, tvb, offset, 8, ENC_BIG_ENDIAN); offset += 8; @@ -2921,13 +2927,15 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, break; case 24: + proto_tree_add_item(mptcp_tree, + hf_tcp_option_mptcp_reserved, tvb, offset, + 2, ENC_BIG_ENDIAN); offset += 2; - for (indx = 0; indx < 5; indx++) { - proto_tree_add_item(mptcp_tree, - hf_tcp_option_mptcp_sender_mac, tvb, offset, - 4, ENC_BIG_ENDIAN); - offset += 4; - } + + proto_tree_add_item(mptcp_tree, + hf_tcp_option_mptcp_sender_hmac, tvb, offset, + 20, ENC_NA); + /*offset += 20;*/ break; default: @@ -2938,6 +2946,7 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, case TCPOPT_MPTCP_DSS: offset += 1; flags = tvb_get_guint8(tvb, offset) & 0x1F; + ti = proto_tree_add_uint(mptcp_tree, hf_tcp_option_mptcp_flags, tvb, offset, 1, flags); mptcp_flags_tree = proto_item_add_subtree(ti, ett_tcp_option_mptcp); @@ -3046,7 +3055,7 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, offset, 1, flags); mptcp_flags_tree = proto_item_add_subtree(ti, ett_tcp_option_mptcp); - proto_tree_add_item(mptcp_flags_tree, hf_tcp_option_mptcp_B_flag, + proto_tree_add_item(mptcp_flags_tree, hf_tcp_option_mptcp_backup_flag, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; @@ -3057,12 +3066,23 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, break; case TCPOPT_MPTCP_MP_FAIL: - offset += 1; - offset += 1; + proto_tree_add_item(mptcp_tree, + hf_tcp_option_mptcp_reserved, tvb, offset,2, ENC_BIG_ENDIAN); + offset += 2; + proto_tree_add_item(mptcp_tree, hf_tcp_option_mptcp_data_seq_no, tvb, offset, 8, ENC_BIG_ENDIAN); break; + case TCPOPT_MPTCP_MP_FASTCLOSE: + proto_tree_add_item(mptcp_tree, + hf_tcp_option_mptcp_reserved, tvb, offset,2, ENC_BIG_ENDIAN); + offset += 2; + + proto_tree_add_item(mptcp_tree, + hf_tcp_option_mptcp_recv_key, tvb, offset, 8, ENC_BIG_ENDIAN); + break; + default: break; } @@ -5369,19 +5389,27 @@ proto_register_tcp(void) { "Multipath TCP version", "tcp.options.mptcp.version", FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL}}, + { &hf_tcp_option_mptcp_reserved, + { "Reserved", "tcp.options.mptcp.reserved", FT_UINT16, + BASE_HEX, NULL, 0x0FFF, NULL, HFILL}}, + { &hf_tcp_option_mptcp_flags, { "Multipath TCP flags", "tcp.options.mptcp.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, - { &hf_tcp_option_mptcp_B_flag, + { &hf_tcp_option_mptcp_backup_flag, { "Backup flag", "tcp.options.mptcp.backup.flag", FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL}}, - { &hf_tcp_option_mptcp_C_flag, + { &hf_tcp_option_mptcp_checksum_flag, { "Checksum required", "tcp.options.mptcp.checksumreq.flags", FT_UINT8, BASE_DEC, NULL, 0x80, NULL, HFILL}}, - { &hf_tcp_option_mptcp_S_flag, + { &hf_tcp_option_mptcp_B_flag, + { "Extensibility", "tcp.options.mptcp.extensibility.flag", FT_UINT8, + BASE_DEC, NULL, 0x40, NULL, HFILL}}, + + { &hf_tcp_option_mptcp_H_flag, { "Use HMAC-SHA1", "tcp.options.mptcp.sha1.flag", FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL}}, @@ -5405,6 +5433,10 @@ proto_register_tcp(void) { "Data ACK is present", "tcp.options.mptcp.dataackpresent.flag", FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL}}, + { &hf_tcp_option_mptcp_reserved_flag, + { "Reserved", "tcp.options.mptcp.reserved.flag", FT_UINT8, + BASE_HEX, NULL, 0x3E, NULL, HFILL}}, + { &hf_tcp_option_mptcp_address_id, { "Multipath TCP Address ID", "tcp.options.mptcp.addrid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}}, @@ -5425,13 +5457,13 @@ proto_register_tcp(void) { "Multipath TCP Sender's Random Number", "tcp.options.mptcp.sendrand", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}}, - { &hf_tcp_option_mptcp_sender_trunc_mac, - { "Multipath TCP Sender's Truncated MAC", "tcp.options.mptcp.sendtruncmac", FT_UINT64, + { &hf_tcp_option_mptcp_sender_trunc_hmac, + { "Multipath TCP Sender's Truncated HMAC", "tcp.options.mptcp.sendtrunchmac", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}}, - { &hf_tcp_option_mptcp_sender_mac, - { "Multipath TCP Sender's MAC", "tcp.options.mptcp.sendmac", FT_UINT32, - BASE_DEC, NULL, 0x0, NULL, HFILL}}, + { &hf_tcp_option_mptcp_sender_hmac, + { "Multipath TCP Sender's HMAC", "tcp.options.mptcp.sendhmac", FT_BYTES, + BASE_NONE, NULL, 0x0, NULL, HFILL}}, { &hf_tcp_option_mptcp_data_ack, { "Multipath TCP Data ACK", "tcp.options.mptcp.dataack", FT_UINT64, |