diff options
author | alagoutte <alagoutte@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-07-23 16:13:05 +0000 |
---|---|---|
committer | alagoutte <alagoutte@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-07-23 16:13:05 +0000 |
commit | 49cdf19ce611438a01e78c1320af10153e59566a (patch) | |
tree | 5b29f0fd1bb4bbbdbf32c04feb6679bc4c8bad97 /epan/dissectors/packet-tcp.c | |
parent | 99b0e70468c9ec9b67088a793d3a8e1024a60379 (diff) |
From Edwin Groothuis via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5795
Add TCP Options support for #253, #254 (experimental), expand MSS / SACKPERM view, add hidden TCP Option Kind/Length to all
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@38175 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-tcp.c')
-rw-r--r-- | epan/dissectors/packet-tcp.c | 122 |
1 files changed, 114 insertions, 8 deletions
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c index 02eebcd154..78bb6c6855 100644 --- a/epan/dissectors/packet-tcp.c +++ b/epan/dissectors/packet-tcp.c @@ -150,6 +150,8 @@ static int hf_tcp_option_ccnew = -1; static int hf_tcp_option_ccecho = -1; static int hf_tcp_option_md5 = -1; static int hf_tcp_option_qs = -1; +static int hf_tcp_option_exp = -1; +static int hf_tcp_option_exp_data = -1; static int hf_tcp_option_rvbd_probe = -1; static int hf_tcp_option_rvbd_probe_version1 = -1; @@ -221,11 +223,14 @@ static gint ett_tcp = -1; static gint ett_tcp_flags = -1; static gint ett_tcp_options = -1; static gint ett_tcp_option_timestamp = -1; +static gint ett_tcp_option_mss = -1; static gint ett_tcp_option_wscale = -1; static gint ett_tcp_option_sack = -1; static gint ett_tcp_option_scps = -1; static gint ett_tcp_option_scps_extended = -1; static gint ett_tcp_option_user_to = -1; +static gint ett_tcp_option_exp = -1; +static gint ett_tcp_option_sack_perm = -1; static gint ett_tcp_analysis = -1; static gint ett_tcp_analysis_faults = -1; static gint ett_tcp_timestamps = -1; @@ -263,6 +268,8 @@ static gint ett_tcp_opt_rvbd_trpy_flags = -1; #define TCPOPT_MOOD 25 /* RFC5841 TCP Packet Mood */ #define TCPOPT_QS 27 /* RFC4782 */ #define TCPOPT_USER_TO 28 /* RFC5482 */ +#define TCPOPT_EXP_FD 0xfd /* Experimental, reserved */ +#define TCPOPT_EXP_FE 0xfe /* Experimental, reserved */ /* Non IANA registered option numbers */ #define TCPOPT_RVBD_PROBE 76 /* Riverbed probe option */ #define TCPOPT_RVBD_TRPY 78 /* Riverbed transparency option */ @@ -291,13 +298,18 @@ static gint ett_tcp_opt_rvbd_trpy_flags = -1; #define TCPOLEN_USER_TO 4 #define TCPOLEN_RVBD_PROBE_MIN 3 #define TCPOLEN_RVBD_TRPY_MIN 16 +#define TCPOLEN_EXP_MIN 2 static const true_false_string tcp_option_user_to_granularity = { "Minutes", "Seconds" }; static const value_string tcp_option_kind_vs[] = { + { TCPOPT_EXP_FD, "Experimental 0xFD" }, + { TCPOPT_EXP_FE, "Experimental 0xFE" }, { TCPOPT_WINDOW, "Window Scale" }, + { TCPOPT_SACK_PERM, "SACK Permission" }, + { TCPOPT_MSS, "MSS size" }, { TCPOPT_TIMESTAMP, "Timestamp" }, { 0, NULL } }; @@ -2249,27 +2261,53 @@ tcp_info_append_str(packet_info *pinfo, const char *abbrev, const char *val) static void +dissec_tcpopt_exp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, + int offset, guint optlen, packet_info *pinfo, proto_tree *opt_tree) +{ + proto_item *item; + proto_tree *exp_tree; + + item = proto_tree_add_item(opt_tree, hf_tcp_option_exp, tvb, + offset, optlen, FALSE); + exp_tree = proto_item_add_subtree(item, ett_tcp_option_exp); + proto_tree_add_item(exp_tree, hf_tcp_option_kind, tvb, offset, 1, FALSE); + proto_tree_add_item(exp_tree, hf_tcp_option_len, tvb, offset + 1, 1, FALSE); + proto_tree_add_item(exp_tree, hf_tcp_option_exp_data, tvb, + offset + 2, optlen - 2, FALSE); + tcp_info_append_uint(pinfo, "Expxx", TRUE); +} + + +static void dissect_tcpopt_sack_perm(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, int offset, guint optlen, packet_info *pinfo, proto_tree *opt_tree) { - proto_tree_add_boolean(opt_tree, hf_tcp_option_sack_perm, tvb, offset, + proto_item *item; + proto_tree *exp_tree; + + item = proto_tree_add_boolean(opt_tree, hf_tcp_option_sack_perm, tvb, offset, optlen, TRUE); + exp_tree = proto_item_add_subtree(item, ett_tcp_option_sack_perm); + proto_tree_add_item(exp_tree, hf_tcp_option_kind, tvb, offset, 1, FALSE); + proto_tree_add_item(exp_tree, hf_tcp_option_len, tvb, offset + 1, 1, FALSE); tcp_info_append_uint(pinfo, "SACK_PERM", TRUE); } static void -dissect_tcpopt_maxseg(const ip_tcp_opt *optp, tvbuff_t *tvb, +dissect_tcpopt_mss(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset, guint optlen, packet_info *pinfo, proto_tree *opt_tree) { - proto_item *hidden_item; + proto_item *item; + proto_tree *exp_tree; guint16 mss; mss = tvb_get_ntohs(tvb, offset + 2); - hidden_item = proto_tree_add_boolean(opt_tree, hf_tcp_option_mss, tvb, offset, - optlen, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_uint_format(opt_tree, hf_tcp_option_mss_val, tvb, offset, - optlen, mss, "%s: %u bytes", optp->name, mss); + item = proto_tree_add_none_format(opt_tree, hf_tcp_option_mss, tvb, offset, + optlen, "%s: %u bytes", optp->name, mss); + exp_tree = proto_item_add_subtree(item, ett_tcp_option_mss); + proto_tree_add_item(exp_tree, hf_tcp_option_kind, tvb, offset, 1, FALSE); + proto_tree_add_item(exp_tree, hf_tcp_option_len, tvb, offset + 1, 1, FALSE); + proto_tree_add_item(exp_tree, hf_tcp_option_mss_val, tvb, offset + 2, 2, ENC_NA); tcp_info_append_uint(pinfo, "MSS", mss); } @@ -2332,6 +2370,13 @@ dissect_tcpopt_sack(const ip_tcp_opt *optp, tvbuff_t *tvb, } } + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + tf = proto_tree_add_text(opt_tree, tvb, offset, optlen, "%s:", optp->name); offset += 2; /* skip past type and length */ optlen -= 2; /* subtract size of type and length */ @@ -2381,6 +2426,13 @@ dissect_tcpopt_echo(const ip_tcp_opt *optp, tvbuff_t *tvb, proto_item *hidden_item; guint32 echo; + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + echo = tvb_get_ntohl(tvb, offset + 2); hidden_item = proto_tree_add_boolean(opt_tree, hf_tcp_option_echo, tvb, offset, optlen, TRUE); @@ -2429,6 +2481,13 @@ dissect_tcpopt_cc(const ip_tcp_opt *optp, tvbuff_t *tvb, proto_item *hidden_item; guint32 cc; + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + cc = tvb_get_ntohl(tvb, offset + 2); hidden_item = proto_tree_add_boolean(opt_tree, hf_tcp_option_cc, tvb, offset, optlen, TRUE); @@ -2468,6 +2527,13 @@ dissect_tcpopt_qs(const ip_tcp_opt *optp, tvbuff_t *tvb, guint8 rate = tvb_get_guint8(tvb, offset + 2) & 0x0f; + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_boolean(opt_tree, hf_tcp_option_qs, tvb, offset, optlen, TRUE); PROTO_ITEM_SET_HIDDEN(hidden_item); @@ -2495,6 +2561,13 @@ dissect_tcpopt_scps(const ip_tcp_opt *optp, tvbuff_t *tvb, guint8 capvector; guint8 connid; + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + tcpd = get_tcp_conversation_data(NULL,pinfo); /* check direction and get ua lists */ @@ -2660,6 +2733,13 @@ dissect_tcpopt_user_to(const ip_tcp_opt *optp, tvbuff_t *tvb, gboolean g; guint16 to; + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + g = tvb_get_ntohs(tvb, offset + 2) & 0x8000; to = tvb_get_ntohs(tvb, offset + 2) & 0x7FFF; hidden_item = proto_tree_add_boolean(opt_tree, hf_tcp_option_user_to, tvb, offset, @@ -2718,6 +2798,13 @@ dissect_tcpopt_snack(const ip_tcp_opt *optp, tvbuff_t *tvb, char *modifier = null_modifier; proto_item *hidden_item; + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + tcpd = get_tcp_conversation_data(NULL,pinfo); /* The SNACK option reports missing data with a granualarity of segments. */ @@ -2808,6 +2895,13 @@ dissect_tcpopt_mood(const ip_tcp_opt _U_*optp, tvbuff_t *tvb, gchar *mood; mood = tvb_get_ephemeral_string(tvb, offset + 2, optlen-2); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_item(opt_tree, hf_tcp_option_len, tvb, + offset + 1, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(hidden_item); + hidden_item = proto_tree_add_boolean(opt_tree, hf_tcp_option_mood, tvb, offset+2, optlen-2, TRUE); PROTO_ITEM_SET_HIDDEN(hidden_item); @@ -2929,6 +3023,12 @@ dissect_tcpopt_rvbd_probe(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, int offset, /* optlen, type, ver are common for all probes */ field_tree = proto_item_add_subtree(pitem, ett_tcp_opt_rvbd_probe); + pitem = proto_tree_add_item(field_tree, hf_tcp_option_len, tvb, + offset + PROBE_OPTLEN_OFFSET, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(pitem); + pitem = proto_tree_add_item(field_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(pitem); proto_tree_add_item(field_tree, hf_tcp_option_rvbd_probe_optlen, tvb, offset + PROBE_OPTLEN_OFFSET, 1, FALSE); @@ -3137,6 +3237,12 @@ dissect_tcpopt_rvbd_trpy(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, "%s", ""); field_tree = proto_item_add_subtree(pitem, ett_tcp_opt_rvbd_trpy); + pitem = proto_tree_add_item(field_tree, hf_tcp_option_len, tvb, + offset + PROBE_OPTLEN_OFFSET, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(pitem); + pitem = proto_tree_add_item(field_tree, hf_tcp_option_kind, tvb, + offset, 1, FALSE); + PROTO_ITEM_SET_HIDDEN(pitem); proto_tree_add_item(field_tree, hf_tcp_option_rvbd_probe_optlen, tvb, offset + PROBE_OPTLEN_OFFSET, 1, FALSE); |