diff options
author | Jason Cohen <j.cohen@f5.com> | 2019-07-01 14:07:04 -0500 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2019-07-24 09:33:26 +0000 |
commit | e9fca54df05c0738dba6e39fc3f7f462f852b076 (patch) | |
tree | d9b005fcf33004117140d66db4669963c1e84ca4 /epan/dissectors/packet-f5ethtrailer.c | |
parent | f26b7cbd22f67c0efb250a84fd8e18164a50fea7 (diff) |
f5ethtrailer - Collapsible-Header trailer header
Brings some less needed info from the trailer header into
a tree collapsible tree. This save several lines in the packet
decode tree.
Bug: 15880
Change-Id: I7a3330a0a870e1e10f115e26ad7923b46de41f2e
Reviewed-on: https://code.wireshark.org/review/34060
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-f5ethtrailer.c')
-rw-r--r-- | epan/dissectors/packet-f5ethtrailer.c | 107 |
1 files changed, 66 insertions, 41 deletions
diff --git a/epan/dissectors/packet-f5ethtrailer.c b/epan/dissectors/packet-f5ethtrailer.c index 48be886287..7471cded64 100644 --- a/epan/dissectors/packet-f5ethtrailer.c +++ b/epan/dissectors/packet-f5ethtrailer.c @@ -254,6 +254,7 @@ static gint hf_length = -1; static gint hf_version = -1; static gint hf_data = -1; static gint hf_dpt_unknown = -1; +static gint hf_trailer_hdr = -1; /* Low */ static gint hf_low_id = -1; static gint hf_flags = -1; @@ -327,6 +328,7 @@ static gint ett_f5ethtrailer_low_flags = -1; static gint ett_f5ethtrailer_med = -1; static gint ett_f5ethtrailer_high = -1; static gint ett_f5ethtrailer_rstcause = -1; +static gint ett_f5ethtrailer_trailer_hdr = -1; /* For fileinformation */ static gint hf_fi_command = -1; @@ -1574,6 +1576,30 @@ static proto_item *displayIPv6as4( return(pi); } /* displayIPv6as4() */ +/* The legacy trailers used a fair amount of magic numbers. Continuing that + use for now with the same magic numbers in this function */ +static gint +render_f5_legacy_hdr( + tvbuff_t *tvb, + proto_tree *tree, + gint offset +) { + proto_item *pi = NULL; + guint32 trailer_type; + + pi = proto_tree_add_item(tree, hf_trailer_hdr, tvb, offset, 3, ENC_NA); + tree = proto_item_add_subtree(pi, ett_f5ethtrailer_trailer_hdr); + + proto_tree_add_item_ret_uint(tree, hf_type, tvb, offset, 1, ENC_BIG_ENDIAN, &trailer_type); + offset += 1; + proto_item_append_text(pi, ", Type: %u", trailer_type); + proto_tree_add_item(tree, hf_length, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + proto_tree_add_item(tree, hf_version, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + return 3; + +} /* render_f5_legacy_hdr() */ /*---------------------------------------------------------------------------*/ /* High level trailers */ @@ -1587,7 +1613,7 @@ dissect_high_trailer( guint8 trailer_ver, f5eth_tap_data_t *tdata) { - proto_item *pi; + proto_item *pi = NULL; guint o; guint8 ipproto; @@ -1603,13 +1629,7 @@ dissect_high_trailer( if(tree == NULL) return(trailer_length); o = offset; - - proto_tree_add_item(tree, hf_type, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; - proto_tree_add_item(tree, hf_length, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; - proto_tree_add_item(tree, hf_version, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; + o += render_f5_legacy_hdr(tvb, tree, o); if(tdata->peer_flow == 0) { proto_tree_add_item(tree, hf_peer_nopeer, tvb, o, trailer_length-3, ENC_NA); @@ -1718,7 +1738,7 @@ dissect_med_trailer( guint8 trailer_ver, f5eth_tap_data_t *tdata) { - proto_item *pi; + proto_item *pi = NULL; guint o; guint rstcauselen = 0; guint rstcausever = 0xff; @@ -1798,13 +1818,7 @@ dissect_med_trailer( if(pref_perform_analysis == FALSE && tree == NULL) return(trailer_length); o = offset; - - proto_tree_add_item(tree, hf_type, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; - proto_tree_add_item(tree, hf_length, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; - proto_tree_add_item(tree, hf_version, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; + o += render_f5_legacy_hdr(tvb, tree, o); /* After 9.4, flow IDs and flags and type are here in medium */ if(trailer_length != F5_MEDV94_LEN || trailer_ver > 0) { @@ -1926,7 +1940,7 @@ dissect_low_trailer( guint8 trailer_ver, f5eth_tap_data_t *tdata) { - proto_item *pi; + proto_item *pi = NULL; guint ingress; guint o; guint vipnamelen = VIP_NAME_LEN; @@ -2001,13 +2015,7 @@ dissect_low_trailer( } o = offset; - - proto_tree_add_item(tree, hf_type, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; - proto_tree_add_item(tree, hf_length, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; - proto_tree_add_item(tree, hf_version, tvb, o, 1, ENC_BIG_ENDIAN); - o += 1; + o += render_f5_legacy_hdr(tvb, tree, o); /* Use special formatting here so that users do not have to filter on "IN" * and "OUT", but rather can continue to use typical boolean values. "IN" @@ -2060,15 +2068,22 @@ dissect_low_trailer( static void render_f5dptv1_tlvhdr( tvbuff_t *tvb, - packet_info *pinfo _U_, proto_tree *tree, - void *data _U_, gint offset ) { - proto_tree_add_item(tree, hf_provider, tvb, offset+F5_DPT_V1_TLV_PROVIDER_OFF, - F5_DPT_V1_TLV_PROVIDER_LEN, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_type, tvb, offset+F5_DPT_V1_TLV_TYPE_OFF, - F5_DPT_V1_TLV_TYPE_LEN, ENC_BIG_ENDIAN); + proto_item *pi = NULL; + guint32 provider; + guint32 type; + + pi = proto_tree_add_item(tree, hf_trailer_hdr, tvb, offset, F5_DPT_V1_TLV_HDR_LEN, ENC_NA); + tree = proto_item_add_subtree(pi, ett_f5ethtrailer_trailer_hdr); + + proto_tree_add_item_ret_uint(tree, hf_provider, tvb, offset+F5_DPT_V1_TLV_PROVIDER_OFF, + F5_DPT_V1_TLV_PROVIDER_LEN, ENC_BIG_ENDIAN, &provider); + proto_item_append_text(pi, ", Provider: %u", provider); + proto_tree_add_item_ret_uint(tree, hf_type, tvb, offset+F5_DPT_V1_TLV_TYPE_OFF, + F5_DPT_V1_TLV_TYPE_LEN, ENC_BIG_ENDIAN, &type); + proto_item_append_text(pi, ", Type: %u", type); proto_tree_add_item(tree, hf_length, tvb, offset+F5_DPT_V1_TLV_LENGTH_OFF, F5_DPT_V1_TLV_LENGTH_LEN, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_version, tvb, offset+F5_DPT_V1_TLV_VERSION_OFF, @@ -2088,7 +2103,7 @@ render_f5dptv1_tlvhdr( static int dissect_dpt_trailer_noise_high( tvbuff_t *tvb, - packet_info *pinfo, + packet_info *pinfo _U_, proto_tree *tree, void *data ) { @@ -2116,7 +2131,7 @@ dissect_dpt_trailer_noise_high( pi = proto_tree_add_item(tree, hf_high_id, tvb, 0, len, ENC_NA); tree = proto_item_add_subtree(pi, ett_f5ethtrailer_high); - render_f5dptv1_tlvhdr(tvb, pinfo, tree, data, 0); + render_f5dptv1_tlvhdr(tvb, tree, 0); o = F5_DPT_V1_TLV_HDR_LEN; @@ -2247,7 +2262,7 @@ dissect_dpt_trailer_noise_med( pi = proto_tree_add_item(tree, hf_med_id, tvb, 0, len, ENC_NA); tree = proto_item_add_subtree(pi, ett_f5ethtrailer_med); - render_f5dptv1_tlvhdr(tvb, pinfo, tree, data, 0); + render_f5dptv1_tlvhdr(tvb, tree, 0); o = F5_DPT_V1_TLV_HDR_LEN; rstcauselen = F5TRL_MEDV4_RSTCLEN(tvb,o); @@ -2403,7 +2418,7 @@ dissect_dpt_trailer_noise_low( pi = proto_tree_add_item(tree, hf_low_id, tvb, 0, len, ENC_NA); tree = proto_item_add_subtree(pi, ett_f5ethtrailer_low); - render_f5dptv1_tlvhdr(tvb, pinfo, tree, data, 0); + render_f5dptv1_tlvhdr(tvb, tree, 0); o = F5_DPT_V1_TLV_HDR_LEN; @@ -2541,9 +2556,9 @@ dissect_dpt_trailer_noise( static int dissect_dpt_trailer_unknown( tvbuff_t *tvb, - packet_info *pinfo, + packet_info *pinfo _U_, proto_tree *tree, - void *data + void *data _U_ ) { proto_item *pi; gint len; @@ -2554,7 +2569,7 @@ dissect_dpt_trailer_unknown( pi = proto_tree_add_item(tree, hf_dpt_unknown, tvb, 0, len, ENC_NA); tree = proto_item_add_subtree(pi, ett_f5ethtrailer_unknown); - render_f5dptv1_tlvhdr(tvb, pinfo, tree, data, 0); + render_f5dptv1_tlvhdr(tvb, tree, 0); proto_tree_add_item(tree, hf_data, tvb, F5_DPT_V1_TLV_HDR_LEN, len - F5_DPT_V1_TLV_HDR_LEN, ENC_NA); @@ -2581,6 +2596,7 @@ dissect_dpt_trailer( void *data ) { proto_item *pi; + proto_tree *hdr_tree; gint dpt_len; gint dpt_ver; gint o; /* offset*/ @@ -2589,11 +2605,15 @@ dissect_dpt_trailer( dpt_ver = tvb_get_ntohs(tvb, F5_DPT_V1_HDR_VERSION_OFF); /* Render the DPT header */ - proto_tree_add_item(tree, hf_dpt_magic, tvb, F5_DPT_V1_HDR_MAGIC_OFF, + pi = proto_tree_add_item(tree, hf_trailer_hdr, tvb, 0, F5_DPT_V1_TLV_HDR_LEN, ENC_NA); + proto_item_append_text(pi, " - Version: %d", dpt_ver); + hdr_tree = proto_item_add_subtree(pi, ett_f5ethtrailer_trailer_hdr); + + proto_tree_add_item(hdr_tree, hf_dpt_magic, tvb, F5_DPT_V1_HDR_MAGIC_OFF, F5_DPT_V1_HDR_MAGIC_LEN, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_dpt_len, tvb, F5_DPT_V1_HDR_LENGTH_OFF, + proto_tree_add_item(hdr_tree, hf_dpt_len, tvb, F5_DPT_V1_HDR_LENGTH_OFF, F5_DPT_V1_HDR_LENGTH_LEN, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_dpt_ver, tvb, F5_DPT_V1_HDR_VERSION_OFF, + proto_tree_add_item(hdr_tree, hf_dpt_ver, tvb, F5_DPT_V1_HDR_VERSION_OFF, F5_DPT_V1_HDR_VERSION_LEN, ENC_BIG_ENDIAN); /* If this is an unknown version, return after rendering header and data */ @@ -2932,6 +2952,10 @@ void proto_register_f5ethtrailer (void) * {&(field id), {name, abrv, type, display, strs, bitmask, blurb, HFILL}}. */ static hf_register_info hf[] = { + { &hf_trailer_hdr, + { "F5 Trailer Header", "f5ethtrailer.header", FT_NONE, BASE_NONE, NULL, + 0x0, NULL, HFILL } + }, { &hf_provider, { "Provider", "f5ethtrailer.provider", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } @@ -3166,7 +3190,8 @@ void proto_register_f5ethtrailer (void) &ett_f5ethtrailer_low_flags, &ett_f5ethtrailer_med, &ett_f5ethtrailer_high, - &ett_f5ethtrailer_rstcause + &ett_f5ethtrailer_rstcause, + &ett_f5ethtrailer_trailer_hdr }; expert_module_t *expert_f5ethtrailer; |