diff options
author | Michael Tuexen <tuexen@wireshark.org> | 2022-08-17 23:54:54 +0200 |
---|---|---|
committer | Michael Tuexen <tuexen@wireshark.org> | 2022-08-18 00:08:30 +0200 |
commit | c2574b72f405221e52bc8ef7b0e78c8772fa39ce (patch) | |
tree | abc9369b868e5a3049edc25d0e031e17fbbfe793 /epan | |
parent | 9cea2c26a1fcb5831c6dc4421dae368ea3f5573b (diff) |
TCP: Add support for TARR option
Based on https://datatracker.ietf.org/doc/html/draft-gomez-tcpm-ack-rate-request-05.
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-tcp.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c index f61e3bb12b..39cc2d3212 100644 --- a/epan/dissectors/packet-tcp.c +++ b/epan/dissectors/packet-tcp.c @@ -232,6 +232,8 @@ static int hf_tcp_option_ao_rnextkeyid = -1; static int hf_tcp_option_ao_mac = -1; static int hf_tcp_option_qs_rate = -1; static int hf_tcp_option_qs_ttl_diff = -1; +static int hf_tcp_option_tarr_rate = -1; +static int hf_tcp_option_tarr_reserved = -1; static int hf_tcp_option_exp_data = -1; static int hf_tcp_option_exp_exid = -1; static int hf_tcp_option_unknown_payload = -1; @@ -4885,6 +4887,35 @@ dissect_tcpopt_tfo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da return tvb_captured_length(tvb); } +/* + * TCP ACK Rate Request option is based on + * https://datatracker.ietf.org/doc/html/draft-gomez-tcpm-ack-rate-request-05 + */ + +#define TCPOPT_TARR_RATE_MASK 0xffe0 +#define TCPOPT_TARR_RESERVED_MASK 0x001f +#define TCPOPT_TARR_RATE_SHIFT 5 + +static void +dissect_tcpopt_tarr_data(tvbuff_t *tvb, int data_offset, guint data_len, + packet_info *pinfo, proto_tree *tree, proto_item *item, void *data _U_) +{ + guint16 rate; + + switch (data_len) { + case 0: + col_append_str(pinfo->cinfo, COL_INFO, " TARR"); + break; + case 2: + rate = (tvb_get_ntohs(tvb, data_offset) & TCPOPT_TARR_RATE_MASK) >> TCPOPT_TARR_RATE_SHIFT; + proto_tree_add_item(tree, hf_tcp_option_tarr_rate, tvb, data_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_tcp_option_tarr_reserved, tvb, data_offset, 2, ENC_BIG_ENDIAN); + tcp_info_append_uint(pinfo, "TARR", rate); + proto_item_append_text(item, " %u", rate); + break; + } +} + static int dissect_tcpopt_exp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { @@ -4906,6 +4937,16 @@ dissect_tcpopt_exp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da offset + 2, 2, ENC_BIG_ENDIAN); proto_item_append_text(item, ": %s", val_to_str_const(exid, tcp_exid_vs, "Unknown")); switch (exid) { + case TCPEXID_TARR: + if (optlen != 4 && optlen != 6) { + expert_add_info_format(pinfo, length_item, &ei_tcp_opt_len_invalid, + "option length should be 4 or 6 instead of %d", + optlen); + } else { + dissect_tcpopt_tarr_data(tvb, offset + 4, optlen - 4, + pinfo, exp_tree, item, data); + } + break; case TCPEXID_FO: dissect_tcpopt_tfo_payload(tvb, offset + 2, optlen - 2, pinfo, exp_tree, data); break; @@ -8542,6 +8583,14 @@ proto_register_tcp(void) { "QS Rate", "tcp.options.qs.ttl_diff", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}}, + { &hf_tcp_option_tarr_rate, + { "TARR Rate", "tcp.options.tarr.rate", FT_UINT16, BASE_DEC, + NULL, TCPOPT_TARR_RATE_MASK, NULL, HFILL}}, + + { &hf_tcp_option_tarr_reserved, + { "TARR Reserved", "tcp.options.tar.reserved", FT_UINT16, BASE_DEC, + NULL, TCPOPT_TARR_RESERVED_MASK, NULL, HFILL}}, + { &hf_tcp_option_scps_vector, { "TCP SCPS Capabilities Vector", "tcp.options.scps.vector", FT_UINT8, BASE_HEX, NULL, 0x0, |