diff options
author | Michael Mann <mmann78@netscape.net> | 2014-09-11 16:43:00 -0400 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2014-09-12 05:51:11 +0000 |
commit | 3df42e79a54af411d3b197f461e8f98913cce59e (patch) | |
tree | 3313b9bf2326667ac80f1c3302c4ed90c25293e7 /epan | |
parent | 47c592938ba9f0caeacc4c2ccadb370e72f293a2 (diff) |
proto_tree_add_text cleanup
Create filters (expert and hf_) that have the "most bang for the buck" (ie have many instances for a single filter)
Change-Id: I61995e41c5b298df77e084e65cdf30ebe95da1e6
Reviewed-on: https://code.wireshark.org/review/4086
Reviewed-by: Michael Mann <mmann78@netscape.net>
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-bgp.c | 343 | ||||
-rw-r--r-- | epan/dissectors/packet-bssap.c | 56 | ||||
-rw-r--r-- | epan/dissectors/packet-dlsw.c | 34 | ||||
-rw-r--r-- | epan/dissectors/packet-fcfcs.c | 38 | ||||
-rw-r--r-- | epan/dissectors/packet-fcswils.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_bssmap.c | 58 | ||||
-rw-r--r-- | epan/dissectors/packet-gtpv2.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-lmp.c | 80 | ||||
-rw-r--r-- | epan/dissectors/packet-mpls-echo.c | 14 | ||||
-rw-r--r-- | epan/dissectors/packet-nbns.c | 95 | ||||
-rw-r--r-- | epan/dissectors/packet-netbios.c | 152 | ||||
-rw-r--r-- | epan/dissectors/packet-ses.c | 70 | ||||
-rw-r--r-- | epan/dissectors/packet-sna.c | 58 | ||||
-rw-r--r-- | epan/dissectors/packet-spice.c | 148 | ||||
-rw-r--r-- | epan/dissectors/packet-tipc.c | 73 |
15 files changed, 648 insertions, 591 deletions
diff --git a/epan/dissectors/packet-bgp.c b/epan/dissectors/packet-bgp.c index 419191a480..90022d2b19 100644 --- a/epan/dissectors/packet-bgp.c +++ b/epan/dissectors/packet-bgp.c @@ -1119,6 +1119,7 @@ static int proto_bgp = -1; static int hf_bgp_marker = -1; static int hf_bgp_length = -1; +static int hf_bgp_prefix_length = -1; static int hf_bgp_type = -1; /* BGP open message header filed */ @@ -1620,6 +1621,7 @@ static expert_field ei_bgp_cap_gr_helper_mode_only = EI_INIT; static expert_field ei_bgp_notify_minor_unknown = EI_INIT; static expert_field ei_bgp_route_refresh_orf_type_unknown = EI_INIT; static expert_field ei_bgp_length_invalid = EI_INIT; +static expert_field ei_bgp_prefix_length_invalid = EI_INIT; static expert_field ei_bgp_afi_type_not_supported = EI_INIT; static expert_field ei_bgp_ls_error = EI_INIT; static expert_field ei_bgp_ext_com_len_bad = EI_INIT; @@ -1694,7 +1696,7 @@ detect_add_path_prefix4(tvbuff_t *tvb, gint offset, gint end) { * Code inspired from the decode_prefix4 function */ static int -decode_path_prefix4(proto_tree *tree, int hf_path_id, int hf_addr, tvbuff_t *tvb, gint offset, +decode_path_prefix4(proto_tree *tree, packet_info *pinfo, int hf_path_id, int hf_addr, tvbuff_t *tvb, gint offset, const char *tag) { proto_tree *prefix_tree; @@ -1710,7 +1712,7 @@ decode_path_prefix4(proto_tree *tree, int hf_path_id, int hf_addr, tvbuff_t *tvb plen = tvb_get_guint8(tvb, offset + 4); length = ipv4_addr_and_mask(tvb, offset + 4 + 1, ip_addr.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, offset + 4 , 1, "%s length %u invalid (> 32)", + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_length_invalid, tvb, offset + 4 , 1, "%s length %u invalid (> 32)", tag, plen); return -1; } @@ -1725,7 +1727,7 @@ decode_path_prefix4(proto_tree *tree, int hf_path_id, int hf_addr, tvbuff_t *tvb proto_tree_add_text(prefix_tree, tvb, offset, 4, "%s Path Id: %u", tag, path_identifier); } - proto_tree_add_text(prefix_tree, tvb, offset + 4, 1, "%s prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, offset + 4, 1, plen, "%s prefix length: %u", tag, plen); if (hf_addr != -1) { proto_tree_add_ipv4(prefix_tree, hf_addr, tvb, offset + 4 + 1, length, @@ -1741,7 +1743,7 @@ decode_path_prefix4(proto_tree *tree, int hf_path_id, int hf_addr, tvbuff_t *tvb * Decode an IPv4 prefix. */ static int -decode_prefix4(proto_tree *tree, proto_item *parent_item, int hf_addr, tvbuff_t *tvb, gint offset, +decode_prefix4(proto_tree *tree, packet_info *pinfo, proto_item *parent_item, int hf_addr, tvbuff_t *tvb, gint offset, guint16 tlen, const char *tag) { proto_tree *prefix_tree; @@ -1756,7 +1758,7 @@ decode_prefix4(proto_tree *tree, proto_item *parent_item, int hf_addr, tvbuff_t plen = tvb_get_guint8(tvb, offset); length = ipv4_addr_and_mask(tvb, offset + 1, ip_addr.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, offset, 1, "%s length %u invalid (> 32)", + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_length_invalid, tvb, offset, 1, "%s length %u invalid (> 32)", tag, plen); return -1; } @@ -1770,7 +1772,7 @@ decode_prefix4(proto_tree *tree, proto_item *parent_item, int hf_addr, tvbuff_t proto_item_append_text(parent_item, " (%s/%u)", ip_to_str(ip_addr.addr_bytes), plen); - proto_tree_add_text(prefix_tree, tvb, offset, 1, "%s prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, offset, 1, plen, "%s prefix length: %u", tag, plen); if (hf_addr != -1) { proto_tree_add_ipv4(prefix_tree, hf_addr, tvb, offset + 1, length, @@ -1786,7 +1788,7 @@ decode_prefix4(proto_tree *tree, proto_item *parent_item, int hf_addr, tvbuff_t * Decode an IPv6 prefix. */ static int -decode_prefix6(proto_tree *tree, int hf_addr, tvbuff_t *tvb, gint offset, +decode_prefix6(proto_tree *tree, packet_info *pinfo, int hf_addr, tvbuff_t *tvb, gint offset, guint16 tlen, const char *tag) { proto_tree *prefix_tree; @@ -1798,7 +1800,7 @@ decode_prefix6(proto_tree *tree, int hf_addr, tvbuff_t *tvb, gint offset, plen = tvb_get_guint8(tvb, offset); length = ipv6_addr_and_mask(tvb, offset + 1, &addr, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, offset, 1, "%s length %u invalid", + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_length_invalid, tvb, offset, 1, "%s length %u invalid", tag, plen); return -1; } @@ -1807,7 +1809,7 @@ decode_prefix6(proto_tree *tree, int hf_addr, tvbuff_t *tvb, gint offset, prefix_tree = proto_tree_add_subtree_format(tree, tvb, offset, tlen != 0 ? tlen : 1 + length, ett_bgp_prefix, NULL, "%s/%u", ip6_to_str(&addr), plen); - proto_tree_add_text(prefix_tree, tvb, offset, 1, "%s prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, offset, 1, plen, "%s prefix length: %u", tag, plen); if (hf_addr != -1) { proto_tree_add_ipv6(prefix_tree, hf_addr, tvb, offset + 1, length, @@ -1938,20 +1940,18 @@ decode_mcast_vpn_nlri_addresses(proto_tree *tree, tvbuff_t *tvb, static void decode_bgp_flow_spec_dec_operator(proto_tree *tree, tvbuff_t *tvb, gint offset) { + static const int * flags[] = { + &hf_bgp_flowspec_nlri_op_eol, + &hf_bgp_flowspec_nlri_op_and, + &hf_bgp_flowspec_nlri_op_val_len, + &hf_bgp_flowspec_nlri_op_un_bit4, + &hf_bgp_flowspec_nlri_op_lt, + &hf_bgp_flowspec_nlri_op_gt, + &hf_bgp_flowspec_nlri_op_eq, + NULL + }; - proto_item *op_item; - proto_tree *op_tree; - - op_item = proto_tree_add_item(tree, hf_bgp_flowspec_nlri_op_flags, tvb, offset, 1, ENC_NA); - op_tree = proto_item_add_subtree(op_item, ett_bgp_flow_spec_nlri_op_flags); - - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_eol,tvb,offset,1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_and, tvb,offset,1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_val_len ,tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_un_bit4, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_lt, tvb,offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_gt, tvb,offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_eq, tvb,offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_bitmask(tree, tvb, offset, hf_bgp_flowspec_nlri_op_flags, ett_bgp_flow_spec_nlri_op_flags, flags, ENC_NA); } /* @@ -2030,19 +2030,18 @@ decode_bgp_nlri_op_dec_value(proto_tree *parent_tree, proto_item *parent_item, t static void decode_bgp_flow_spec_bitmask_operator(proto_tree *tree, tvbuff_t *tvb, gint offset) { - proto_item *op_item; - proto_tree *op_tree; - - op_item = proto_tree_add_item(tree, hf_bgp_flowspec_nlri_op_flags, tvb, offset, 1, ENC_NA); - op_tree = proto_item_add_subtree(op_item, ett_bgp_flow_spec_nlri_op_flags); - - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_eol,tvb,offset,1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_and, tvb,offset,1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_val_len ,tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_un_bit4, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_un_bit5, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_flg_not, tvb,offset, 1,ENC_BIG_ENDIAN); - proto_tree_add_item(op_tree, hf_bgp_flowspec_nlri_op_flg_match, tvb,offset, 1,ENC_BIG_ENDIAN); + static const int * flags[] = { + &hf_bgp_flowspec_nlri_op_eol, + &hf_bgp_flowspec_nlri_op_and, + &hf_bgp_flowspec_nlri_op_val_len, + &hf_bgp_flowspec_nlri_op_un_bit4, + &hf_bgp_flowspec_nlri_op_un_bit5, + &hf_bgp_flowspec_nlri_op_flg_not, + &hf_bgp_flowspec_nlri_op_flg_match, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_bgp_flowspec_nlri_op_flags, ett_bgp_flow_spec_nlri_op_flags, flags, ENC_NA); } /* @@ -2054,12 +2053,22 @@ decode_bgp_nlri_op_tcpf_value(proto_tree *parent_tree, proto_item *parent_item, guint8 nlri_operator; guint8 tcp_flags; guint cursor_op_val=0; - proto_tree *tcp_tree; - proto_item *tcp_item; guint8 value_len=0; guint8 shift_amount=0; guint first_loop=0; + static const int * nlri_tcp_flags[] = { + &hf_bgp_flowspec_nlri_tcp_flags_cwr, + &hf_bgp_flowspec_nlri_tcp_flags_ecn, + &hf_bgp_flowspec_nlri_tcp_flags_urg, + &hf_bgp_flowspec_nlri_tcp_flags_ack, + &hf_bgp_flowspec_nlri_tcp_flags_push, + &hf_bgp_flowspec_nlri_tcp_flags_reset, + &hf_bgp_flowspec_nlri_tcp_flags_syn, + &hf_bgp_flowspec_nlri_tcp_flags_fin, + NULL + }; + proto_item_append_text(parent_item," ("); do { @@ -2091,18 +2100,9 @@ decode_bgp_nlri_op_tcpf_value(proto_tree *parent_tree, proto_item *parent_item, cursor_op_val++; /* tcp flags are coded over 2 bytes only the second one is significant, we move to second byte */ } - tcp_item = proto_tree_add_item(parent_tree, hf_bgp_flowspec_nlri_tcp_flags, tvb, offset+cursor_op_val, 1, ENC_NA); - tcp_tree = proto_item_add_subtree(tcp_item, ett_bgp_flow_spec_nlri_tcp); + proto_tree_add_bitmask(parent_tree, tvb, offset+cursor_op_val, hf_bgp_flowspec_nlri_tcp_flags, ett_bgp_flow_spec_nlri_tcp, nlri_tcp_flags, ENC_NA); tcp_flags = tvb_get_guint8(tvb,offset+cursor_op_val); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_cwr, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_ecn, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_urg, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_ack, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_push, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_reset, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_syn, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tcp_tree, hf_bgp_flowspec_nlri_tcp_flags_fin, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); proto_item_append_text(parent_item," %s%s%s%s%s%s", ((tcp_flags & BGPNLRI_FSPEC_TH_URG) == 0) ? "" : "U", ((tcp_flags & BGPNLRI_FSPEC_TH_ACK) == 0) ? "" : "A", @@ -2126,12 +2126,18 @@ decode_bgp_nlri_op_fflag_value(proto_tree *parent_tree, proto_item *parent_item, guint8 nlri_operator; guint8 fragment_flags; guint cursor_op_val=0; - proto_tree *ff_tree; - proto_item *ff_item; guint8 value_len=0; guint8 shift_amount=0; guint first_loop=0; + static const int * nlri_flags[] = { + &hf_bgp_flowspec_nlri_fflag_lf, + &hf_bgp_flowspec_nlri_fflag_ff, + &hf_bgp_flowspec_nlri_fflag_isf, + &hf_bgp_flowspec_nlri_fflag_df, + NULL + }; + proto_item_append_text(parent_item," ("); do { @@ -2164,12 +2170,9 @@ decode_bgp_nlri_op_fflag_value(proto_tree *parent_tree, proto_item *parent_item, return -1; /* frag flags have to be coded in 1 byte */ } fragment_flags = tvb_get_guint8(tvb,offset+cursor_op_val); - ff_item = proto_tree_add_item(parent_tree, hf_bgp_flowspec_nlri_fflag, tvb, offset+cursor_op_val, 1, ENC_NA); - ff_tree = proto_item_add_subtree(ff_item, ett_bgp_flow_spec_nlri_ff); - proto_tree_add_item(ff_tree, hf_bgp_flowspec_nlri_fflag_lf, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ff_tree, hf_bgp_flowspec_nlri_fflag_ff, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ff_tree, hf_bgp_flowspec_nlri_fflag_isf, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ff_tree, hf_bgp_flowspec_nlri_fflag_df, tvb, offset+cursor_op_val, 1, ENC_BIG_ENDIAN); + + proto_tree_add_bitmask(parent_tree, tvb, offset+cursor_op_val, hf_bgp_flowspec_nlri_fflag, ett_bgp_flow_spec_nlri_ff, nlri_flags, ENC_NA); + proto_item_append_text(parent_item," %s%s%s%s", ((fragment_flags & BGPNLRI_FSPEC_FG_DF) == 0) ? "" : "DF", ((fragment_flags & BGPNLRI_FSPEC_FG_ISF) == 0) ? "" : "IsF", @@ -2296,7 +2299,7 @@ decode_flowspec_nlri(proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 afi, case BGPNLRI_FSPEC_DST_PFIX: cursor_fspec++; if (afi == AFNUM_INET) - filter_len = decode_prefix4(filter_tree, filter_item, hf_bgp_flowspec_nlri_dst_pref_ipv4, + filter_len = decode_prefix4(filter_tree, pinfo, filter_item, hf_bgp_flowspec_nlri_dst_pref_ipv4, tvb, offset+cursor_fspec, 0, "Destination IP filter"); else if (afi == AFNUM_INET6) filter_len = decode_fspec_match_prefix6(filter_tree, filter_item, hf_bgp_flowspec_nlri_dst_ipv6_pref, @@ -2308,7 +2311,7 @@ decode_flowspec_nlri(proto_tree *tree, tvbuff_t *tvb, gint offset, guint16 afi, case BGPNLRI_FSPEC_SRC_PFIX: cursor_fspec++; if (afi == AFNUM_INET) - filter_len = decode_prefix4(filter_tree, filter_item, hf_bgp_flowspec_nlri_src_pref_ipv4, + filter_len = decode_prefix4(filter_tree, pinfo, filter_item, hf_bgp_flowspec_nlri_src_pref_ipv4, tvb, offset+cursor_fspec, 0, "Source IP filter"); else if (afi == AFNUM_INET6) filter_len = decode_fspec_match_prefix6(filter_tree, filter_item, hf_bgp_flowspec_nlri_src_ipv6_pref, @@ -3439,24 +3442,30 @@ decode_link_state_attribute_tlv(proto_tree *tree, tvbuff_t *tvb, gint offset, pa length, BGP_NLRI_TLV_LEN_LINK_PROTECTION_TYPE); break; } - proto_tree_add_item(tlv_tree, hf_bgp_ls_type, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_tree, hf_bgp_ls_length, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - tmp8 = tvb_get_guint8(tvb, offset + 4); - tlv_sub_item = proto_tree_add_item(tlv_tree, hf_bgp_ls_tlv_link_protection_type_value, tvb, offset + 4, 1, ENC_NA); - tlv_sub_tree = proto_item_add_subtree(tlv_sub_item, ett_bgp_mp_reach_nlri); - proto_tree_add_boolean(tlv_sub_tree, hf_bgp_ls_link_protection_type_extra_traffic, tvb, offset + 4, 1, tmp8); - proto_tree_add_boolean(tlv_sub_tree, hf_bgp_ls_link_protection_type_unprotected, tvb, offset + 4, 1, tmp8); - proto_tree_add_boolean(tlv_sub_tree, hf_bgp_ls_link_protection_type_shared, tvb, offset + 4, 1, tmp8); - proto_tree_add_boolean(tlv_sub_tree, hf_bgp_ls_link_protection_type_dedicated_1to1, tvb, offset + 4, 1, tmp8); - proto_tree_add_boolean(tlv_sub_tree, hf_bgp_ls_link_protection_type_dedicated_1plus1, tvb, offset + 4, 1, tmp8); - proto_tree_add_boolean(tlv_sub_tree, hf_bgp_ls_link_protection_type_enhanced, tvb, offset + 4, 1, tmp8); - tmp8 >>= 6; - if(tmp8){ - expert_add_info_format(pinfo, tlv_sub_tree, &ei_bgp_ls_error, "Reserved Protection Capabilities bits are not set to zero (%u).", tmp8); - } - tmp8 = tvb_get_guint8(tvb, offset + 4 + 1); - if(tmp8){ - expert_add_info_format(pinfo, tlv_tree, &ei_bgp_ls_error, "Reserved field is not set to zero. (%u)", tmp8); + else { + static const int * nlri_flags[] = { + &hf_bgp_ls_link_protection_type_extra_traffic, + &hf_bgp_ls_link_protection_type_unprotected, + &hf_bgp_ls_link_protection_type_shared, + &hf_bgp_ls_link_protection_type_dedicated_1to1, + &hf_bgp_ls_link_protection_type_dedicated_1plus1, + &hf_bgp_ls_link_protection_type_enhanced, + NULL + }; + + proto_tree_add_item(tlv_tree, hf_bgp_ls_type, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_tree, hf_bgp_ls_length, tvb, offset + 2, 2, ENC_BIG_ENDIAN); + tmp8 = tvb_get_guint8(tvb, offset + 4); + + tlv_sub_item = proto_tree_add_bitmask(tlv_tree, tvb, offset + 4, hf_bgp_ls_tlv_link_protection_type_value, ett_bgp_mp_reach_nlri, nlri_flags, ENC_NA); + tmp8 >>= 6; + if(tmp8){ + expert_add_info_format(pinfo, tlv_sub_item, &ei_bgp_ls_error, "Reserved Protection Capabilities bits are not set to zero (%u).", tmp8); + } + tmp8 = tvb_get_guint8(tvb, offset + 4 + 1); + if(tmp8){ + expert_add_info_format(pinfo, tlv_tree, &ei_bgp_ls_error, "Reserved field is not set to zero. (%u)", tmp8); + } } break; case BGP_NLRI_TLV_MPLS_PROTOCOL_MASK: @@ -3915,7 +3924,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case SAFNUM_UNICAST: case SAFNUM_MULCAST: case SAFNUM_UNIMULC: - total_length = decode_prefix4(tree, NULL,hf_addr4, tvb, offset, 0, tag); + total_length = decode_prefix4(tree, pinfo, NULL,hf_addr4, tvb, offset, 0, tag); if (total_length < 0) return -1; break; @@ -3927,7 +3936,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, offset += (1 + labnum * 3); if (plen <= (labnum * 3*8)) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled IPv4 prefix length %u invalid", tag, plen); return -1; @@ -3935,7 +3944,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, plen -= (labnum * 3*8); length = ipv4_addr_and_mask(tvb, offset, ip4addr.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled IPv4 prefix length %u invalid", tag, plen + (labnum * 3*8)); return -1; @@ -3947,8 +3956,8 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, "Label Stack=%s IPv4=%s/%u", wmem_strbuf_get_str(stack_strbuf), ip_to_str(ip4addr.addr_bytes), plen); - proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u", - tag, plen + labnum * 3 * 8); + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, start_offset, 1, plen + labnum * 3 * 8, + "%s Prefix length: %u", tag, plen + labnum * 3 * 8); proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum, "%s Label Stack: %s", tag, wmem_strbuf_get_str(stack_strbuf)); if (hf_addr4 != -1) { @@ -3982,7 +3991,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, } if ((plen < 32) || (plen > 96)) { - proto_tree_add_text(tree, tvb, offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_length_invalid, tvb, offset, 1, "%s Route target length %u invalid", tag, plen); return -1; @@ -4016,7 +4025,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, tag, tvb_get_ntohl(tvb, offset + 1 + 0), wmem_strbuf_get_str(comm_strbuf), plen); - proto_tree_add_text(prefix_tree, tvb, offset, 1, "%s Prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, offset, 1, plen, "%s Prefix length: %u", tag, plen); proto_tree_add_text(prefix_tree, tvb, offset + 1, 4, "%s Originating AS: %u", tag, tvb_get_ntohl(tvb, offset + 1 + 0)); @@ -4027,7 +4036,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case SAFNUM_ENCAPSULATION: plen = tvb_get_guint8(tvb, offset); if (plen != 32){ - proto_tree_add_text(tree, tvb, offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_length_invalid, tvb, offset, 1, "%s IPv4 address length %u invalid", tag, plen); return -1; @@ -4045,7 +4054,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case SAFNUM_TUNNEL: plen = tvb_get_guint8(tvb, offset); if (plen <= 16){ - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Tunnel IPv4 prefix length %u invalid", tag, plen); return -1; @@ -4055,7 +4064,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, plen -= 16; /* 2-octet Identifier */ length = ipv4_addr_and_mask(tvb, offset, ip4addr.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Tunnel IPv4 prefix length %u invalid", tag, plen + 16); return -1; @@ -4066,7 +4075,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, "Tunnel Identifier=0x%x IPv4=%s/%u", tnl_id, ip_to_str(ip4addr.addr_bytes), plen); - proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, start_offset, 1, plen + 16, "%s Prefix length: %u", tag, plen + 16); proto_tree_add_item(prefix_tree, hf_bgp_mp_nlri_tnl_id, tvb, start_offset + 1, 2, ENC_BIG_ENDIAN); @@ -4090,7 +4099,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, offset += (1 + labnum * 3); if (plen <= (labnum * 3*8)) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv4 prefix length %u invalid", tag, plen); return -1; @@ -4099,7 +4108,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, rd_type = tvb_get_ntohs(tvb, offset); if (plen < 8*8) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv4 prefix length %u invalid", tag, plen + (labnum * 3*8)); return -1; @@ -4111,7 +4120,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case FORMAT_AS2_LOC: /* Code borrowed from the decode_prefix4 function */ length = ipv4_addr_and_mask(tvb, offset + 8, ip4addr.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv4 prefix length %u invalid", tag, plen + (labnum * 3*8) + 8*8); return -1; @@ -4125,7 +4134,8 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, tvb_get_ntohs(tvb, offset + 2), tvb_get_ntohl(tvb, offset + 4), ip_to_str(ip4addr.addr_bytes), plen); - proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, start_offset, 1, + plen + labnum * 3 * 8 + 8 * 8, "%s Prefix length: %u", tag, plen + labnum * 3 * 8 + 8 * 8); proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum, "%s Label Stack: %s", tag, wmem_strbuf_get_str(stack_strbuf)); @@ -4148,7 +4158,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, length = ipv4_addr_and_mask(tvb, offset + 8, ip4addr2.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv4 prefix length %u invalid", tag, plen + (labnum * 3*8) + 8*8); return -1; @@ -4163,7 +4173,8 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, tvb_get_ntohs(tvb, offset + 6), ip_to_str(ip4addr2.addr_bytes), plen); - proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, start_offset, 1, + plen + labnum * 3 * 8 + 8 * 8, "%s Prefix length: %u", tag, plen + labnum * 3 * 8 + 8 * 8); proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum, "%s Label Stack: %s", tag, wmem_strbuf_get_str(stack_strbuf)); @@ -4184,7 +4195,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case FORMAT_AS4_LOC: /* Code borrowed from the decode_prefix4 function */ length = ipv4_addr_and_mask(tvb, offset + 8, ip4addr.addr_bytes, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv4 prefix length %u invalid", tag, plen + (labnum * 3*8) + 8*8); return -1; @@ -4199,7 +4210,8 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, tvb_get_ntohs(tvb, offset + 4), tvb_get_ntohs(tvb, offset + 6), ip_to_str(ip4addr.addr_bytes), plen); - proto_tree_add_text(prefix_tree, tvb, start_offset, 1, "%s Prefix length: %u", + proto_tree_add_uint_format(prefix_tree, hf_bgp_prefix_length, tvb, start_offset, 1, + plen + labnum * 3 * 8 + 8 * 8, "%s Prefix length: %u", tag, plen + labnum * 3 * 8 + 8 * 8); proto_tree_add_text(prefix_tree, tvb, start_offset + 1, 3 * labnum, "%s Label Stack: %s", tag, wmem_strbuf_get_str(stack_strbuf)); @@ -4245,7 +4257,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case SAFNUM_UNICAST: case SAFNUM_MULCAST: case SAFNUM_UNIMULC: - total_length = decode_prefix6(tree, hf_addr6, tvb, offset, 0, tag); + total_length = decode_prefix6(tree, pinfo, hf_addr6, tvb, offset, 0, tag); if (total_length < 0) return -1; break; @@ -4257,7 +4269,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, offset += (1 + labnum * 3); if (plen <= (labnum * 3*8)) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled IPv6 prefix length %u invalid", tag, plen); return -1; } @@ -4265,7 +4277,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, length = ipv6_addr_and_mask(tvb, offset, &ip6addr, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled IPv6 prefix length %u invalid", tag, plen + (labnum * 3*8)); return -1; @@ -4281,7 +4293,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case SAFNUM_ENCAPSULATION: plen = tvb_get_guint8(tvb, offset); if (plen != 128){ - proto_tree_add_text(tree, tvb, offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_length_invalid, tvb, offset, 1, "%s IPv6 address length %u invalid", tag, plen); return -1; @@ -4299,7 +4311,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case SAFNUM_TUNNEL: plen = tvb_get_guint8(tvb, offset); if (plen <= 16){ - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Tunnel IPv6 prefix length %u invalid", tag, plen); return -1; @@ -4309,7 +4321,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, plen -= 16; /* 2-octet Identifier */ length = ipv6_addr_and_mask(tvb, offset, &ip6addr, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Tunnel IPv6 prefix length %u invalid", tag, plen + 16); return -1; @@ -4330,7 +4342,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, offset += (1 + labnum * 3); if (plen <= (labnum * 3*8)) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv6 prefix length %u invalid", tag, plen); return -1; } @@ -4338,7 +4350,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, rd_type = tvb_get_ntohs(tvb,offset); if (plen < 8*8) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv6 prefix length %u invalid", tag, plen + (labnum * 3*8)); return -1; @@ -4350,7 +4362,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case FORMAT_AS2_LOC: length = ipv6_addr_and_mask(tvb, offset + 8, &ip6addr, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv6 prefix length %u invalid", tag, plen + (labnum * 3*8) + 8*8); return -1; @@ -4371,7 +4383,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, length = ipv6_addr_and_mask(tvb, offset + 8, &ip6addr, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv6 prefix length %u invalid", tag, plen + (labnum * 3*8) + 8*8); return -1; @@ -4390,7 +4402,7 @@ decode_prefix_MP(proto_tree *tree, int hf_addr4, int hf_addr6, case FORMAT_AS4_LOC: length = ipv6_addr_and_mask(tvb, offset + 8, &ip6addr, plen); if (length < 0) { - proto_tree_add_text(tree, tvb, start_offset, 1, + proto_tree_add_expert_format(tree, pinfo, &ei_bgp_prefix_length_invalid, tvb, start_offset, 1, "%s Labeled VPN IPv6 prefix length %u invalid", tag, plen + (labnum * 3*8) + 8*8); return -1; @@ -4823,17 +4835,19 @@ dissect_bgp_capability_item(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, } else { int eclen = offset + clen; - proto_tree *sub_tree; + + static const int * timer_flags[] = { + &hf_bgp_cap_gr_timers_restart_flag, + &hf_bgp_cap_gr_timers_restart_time, + NULL + }; if (clen == 2){ expert_add_info(pinfo, ti_len, &ei_bgp_cap_gr_helper_mode_only); } /* Timers */ - ti = proto_tree_add_item(cap_tree, hf_bgp_cap_gr_timers, tvb, offset, 2, ENC_NA); - sub_tree = proto_item_add_subtree(ti, ett_bgp_cap); - proto_tree_add_item(sub_tree, hf_bgp_cap_gr_timers_restart_flag, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(sub_tree, hf_bgp_cap_gr_timers_restart_time, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_bitmask(cap_tree, tvb, offset, hf_bgp_cap_gr_timers, ett_bgp_cap, timer_flags, ENC_BIG_ENDIAN); offset += 2; /* @@ -4841,6 +4855,11 @@ dissect_bgp_capability_item(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, * read it until the TLV ends */ while (offset < eclen) { + static const int * flags[] = { + &hf_bgp_cap_gr_flag_pfs, + NULL + }; + /* AFI */ proto_tree_add_item(cap_tree, hf_bgp_cap_gr_afi, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; @@ -4850,9 +4869,7 @@ dissect_bgp_capability_item(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, offset += 1; /* Flags */ - ti = proto_tree_add_item(cap_tree, hf_bgp_cap_gr_flag, tvb, offset, 1, ENC_BIG_ENDIAN); - sub_tree = proto_item_add_subtree(ti, ett_bgp_cap); - proto_tree_add_item(sub_tree, hf_bgp_cap_gr_flag_pfs, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_bitmask(cap_tree, tvb, offset, hf_bgp_cap_gr_flag, ett_bgp_cap, flags, ENC_BIG_ENDIAN); offset += 1; } } @@ -5173,10 +5190,8 @@ dissect_bgp_update_ext_com(proto_tree *parent_tree, tvbuff_t *tvb, guint16 tlen, guint8 dscp_flags; proto_tree *communities_tree; proto_tree *community_tree; - proto_tree *community_flags_tree; proto_item *communities_item=NULL; proto_item *community_item=NULL; - proto_item *com_flags_item=NULL; guint32 ipaddr; /* IPv4 address */ gfloat linkband; /* Link bandwidth */ guint16 as_num; /* Autonomous System Number */ @@ -5298,21 +5313,26 @@ dissect_bgp_update_ext_com(proto_tree *parent_tree, tvbuff_t *tvb, guint16 tlen, case BGP_EXT_COM_TYPE_HIGH_TR_QOS: /* QoS Marking [Thomas_Martin_Knoll] */ case BGP_EXT_COM_TYPE_HIGH_NTR_QOS: /* QoS Marking [Thomas_Martin_Knoll] */ + { + static const int * qos_flags[] = { + &hf_bgp_ext_com_qos_flags_remarking, + &hf_bgp_ext_com_qos_flags_ignore_remarking, + &hf_bgp_ext_com_qos_flags_agg_marking, + NULL + }; + proto_tree_add_item(community_tree, hf_bgp_ext_com_type_high, tvb, offset, 1, ENC_BIG_ENDIAN); proto_item_append_text(community_item, " %s: 0x%02x",val_to_str(com_type_high_byte, bgpext_com_type_high, "Unknown type: 0x%02x"),com_type_high_byte); - com_flags_item = proto_tree_add_item(community_tree, hf_bgp_ext_com_qos_flags, tvb, offset+1, 1, ENC_BIG_ENDIAN); - community_flags_tree = proto_item_add_subtree(com_flags_item,ett_bgp_ext_com_flags); - /* add flag bitfield */ - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_qos_flags_remarking, tvb, offset+1, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_qos_flags_ignore_remarking, tvb, offset+1, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_qos_flags_agg_marking, tvb, offset+1, 1, ENC_BIG_ENDIAN); + + proto_tree_add_bitmask(community_tree, tvb, offset, hf_bgp_ext_com_qos_flags, ett_bgp_ext_com_flags, qos_flags, ENC_BIG_ENDIAN); proto_tree_add_item(community_tree, hf_bgp_ext_com_qos_set_number, tvb, offset+2, 1, ENC_BIG_ENDIAN); proto_tree_add_item(community_tree, hf_bgp_ext_com_qos_tech_type, tvb, offset+3, 1, ENC_BIG_ENDIAN); proto_tree_add_item(community_tree, hf_bgp_ext_com_qos_marking_o, tvb, offset+4, 2, ENC_BIG_ENDIAN); proto_tree_add_item(community_tree, hf_bgp_ext_com_qos_marking_a, tvb, offset+6, 1, ENC_BIG_ENDIAN); proto_tree_add_item(community_tree, hf_bgp_ext_com_qos_default_to_zero, tvb, offset+7, 1, ENC_BIG_ENDIAN); + } break; case BGP_EXT_COM_TYPE_HIGH_TR_COS: /* CoS Capability [Thomas_Martin_Knoll] */ @@ -5320,13 +5340,15 @@ dissect_bgp_update_ext_com(proto_tree *parent_tree, tvbuff_t *tvb, guint16 tlen, proto_item_append_text(community_item, " %s: 0x%02x",val_to_str(com_type_high_byte, bgpext_com_type_high, "Unknown type: 0x%02x"),com_type_high_byte); for (i=1; i < 8; i++) { - com_flags_item = proto_tree_add_item(community_tree, hf_bgp_ext_com_cos_flags, tvb, offset+i, 1, ENC_BIG_ENDIAN); - community_flags_tree = proto_item_add_subtree(com_flags_item,ett_bgp_ext_com_flags); - /* add flag bitfield */ - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_cos_flags_be, tvb, offset+i, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_cos_flags_ef, tvb, offset+i, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_cos_flags_af, tvb, offset+i, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_cos_flags_le, tvb, offset+i, 1, ENC_BIG_ENDIAN); + static const int * cos_flags[] = { + &hf_bgp_ext_com_cos_flags_be, + &hf_bgp_ext_com_cos_flags_ef, + &hf_bgp_ext_com_cos_flags_af, + &hf_bgp_ext_com_cos_flags_le, + NULL + }; + + proto_tree_add_bitmask(community_tree, tvb, offset+i, hf_bgp_ext_com_cos_flags, ett_bgp_ext_com_flags, cos_flags, ENC_BIG_ENDIAN); } break; @@ -5375,16 +5397,22 @@ dissect_bgp_update_ext_com(proto_tree *parent_tree, tvbuff_t *tvb, guint16 tlen, break; case BGP_EXT_COM_STYPE_EXP_L2: + { + static const int * com_l2_flags[] = { + &hf_bgp_ext_com_l2_flag_d, + &hf_bgp_ext_com_l2_flag_z1, + &hf_bgp_ext_com_l2_flag_f, + &hf_bgp_ext_com_l2_flag_z345, + &hf_bgp_ext_com_l2_flag_c, + &hf_bgp_ext_com_l2_flag_s, + NULL + }; + proto_tree_add_item(community_tree, hf_bgp_ext_com_l2_encaps,tvb,offset+2, 1, ENC_BIG_ENDIAN); - com_flags_item = proto_tree_add_item(community_tree, hf_bgp_ext_com_l2_c_flags, tvb, offset+3, 1, ENC_BIG_ENDIAN); - community_flags_tree = proto_item_add_subtree(com_flags_item, ett_bgp_ext_com_l2_flags); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_flag_d, tvb, offset+3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_flag_z1, tvb, offset+3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_flag_f, tvb, offset+3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_flag_z345, tvb, offset+3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_flag_c, tvb, offset+3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_flag_s, tvb, offset+3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(community_flags_tree, hf_bgp_ext_com_l2_mtu, tvb, offset+4, 2, ENC_BIG_ENDIAN); + + proto_tree_add_bitmask(community_tree, tvb, offset+3, hf_bgp_ext_com_l2_c_flags, ett_bgp_ext_com_l2_flags, com_l2_flags, ENC_BIG_ENDIAN); + proto_tree_add_item(community_tree, hf_bgp_ext_com_l2_mtu, tvb, offset+4, 2, ENC_BIG_ENDIAN); + } break; } break; @@ -5605,7 +5633,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) if( detect_add_path_prefix4(tvb, o, end) ) { /* IPv4 prefixes with Path Id */ while (o < end) { - i = decode_path_prefix4(subtree, hf_bgp_nlri_path_id, hf_bgp_withdrawn_prefix, tvb, o, + i = decode_path_prefix4(subtree, pinfo, hf_bgp_nlri_path_id, hf_bgp_withdrawn_prefix, tvb, o, "Withdrawn route"); if (i < 0) return; @@ -5613,7 +5641,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) } } else { while (o < end) { - i = decode_prefix4(subtree, NULL, hf_bgp_withdrawn_prefix, tvb, o, len, + i = decode_prefix4(subtree, pinfo, NULL, hf_bgp_withdrawn_prefix, tvb, o, len, "Withdrawn route"); if (i < 0) return; @@ -5634,7 +5662,6 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) while (i < len) { proto_item *hidden_item; proto_item *ti_pa, *ti_flags; - proto_tree *flags_tree; int off; guint16 alen, tlen, aoff, aoff_save; guint16 af; @@ -5642,6 +5669,14 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) guint8 nexthop_len; guint8 asn_len = 0; + static const int * path_flags[] = { + &hf_bgp_update_path_attribute_flags_optional, + &hf_bgp_update_path_attribute_flags_transitive, + &hf_bgp_update_path_attribute_flags_partial, + &hf_bgp_update_path_attribute_flags_extended_length, + NULL + }; + bgpa_flags = tvb_get_guint8(tvb, o + i); bgpa_type = tvb_get_guint8(tvb, o + i+1); @@ -5660,14 +5695,8 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) subtree2 = proto_item_add_subtree(ti_pa, ett_bgp_attr); - ti_flags = proto_tree_add_item(subtree2, hf_bgp_update_path_attribute_flags, tvb, o + i, 1, ENC_NA); - flags_tree = proto_item_add_subtree(ti_flags, ett_bgp_attr_flags); + ti_flags = proto_tree_add_bitmask(subtree2, tvb, o + i, hf_bgp_update_path_attribute_flags, ett_bgp_attr_flags, path_flags, ENC_NA); - /* add flag bitfield subtrees */ - proto_tree_add_item(flags_tree, hf_bgp_update_path_attribute_flags_optional, tvb, o + i, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(flags_tree, hf_bgp_update_path_attribute_flags_transitive, tvb, o + i, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(flags_tree, hf_bgp_update_path_attribute_flags_partial, tvb, o + i, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(flags_tree, hf_bgp_update_path_attribute_flags_extended_length, tvb, o + i, 1, ENC_BIG_ENDIAN); proto_item_append_text(ti_flags,"%s%s%s%s", ((bgpa_flags & BGP_ATTR_FLAG_OPTIONAL) == 0) ? ": Well-known" : ": Optional", ((bgpa_flags & BGP_ATTR_FLAG_TRANSITIVE) == 0) ? ", Non-transitive" : ", Transitive", @@ -6011,11 +6040,10 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) tlen -= off; aoff += off; - ti = proto_tree_add_text(subtree2, tvb, o + i + aoff, tlen, - "Network layer reachability information (%u byte%s)", + subtree3 = proto_tree_add_subtree_format(subtree2, tvb, o + i + aoff, tlen, + ett_bgp_mp_reach_nlri, NULL, "Network layer reachability information (%u byte%s)", tlen, plurality(tlen, "", "s")); if (tlen) { - subtree3 = proto_item_add_subtree(ti,ett_bgp_mp_reach_nlri); if (af != AFNUM_INET && af != AFNUM_INET6 && af != AFNUM_L2VPN && af != AFNUM_LINK_STATE) { proto_tree_add_text(subtree3, tvb, o + i + aoff, tlen, "Unknown Address Family"); @@ -6045,15 +6073,14 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) "Subsequent address family identifier: %s (%u)", val_to_str_const(saf, bgpattr_nlri_safi, saf >= 134 ? "Vendor specific" : "Unknown"), saf); - ti = proto_tree_add_text(subtree2, tvb, o + i + aoff + 3, - tlen - 3, "Withdrawn routes (%u byte%s)", tlen - 3, + subtree3 = proto_tree_add_subtree_format(subtree2, tvb, o + i + aoff + 3, + tlen - 3, ett_bgp_mp_unreach_nlri, NULL, "Withdrawn routes (%u byte%s)", tlen - 3, plurality(tlen - 3, "", "s")); aoff_save = aoff; tlen -= 3; aoff += 3; if (tlen > 0) { - subtree3 = proto_item_add_subtree(ti,ett_bgp_mp_unreach_nlri); while (tlen > 0) { advance = decode_prefix_MP(subtree3, @@ -6299,7 +6326,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) if( detect_add_path_prefix4(tvb, o, end) ) { /* IPv4 prefixes with Path Id */ while (o < end) { - i = decode_path_prefix4(subtree, hf_bgp_nlri_path_id, hf_bgp_nlri_prefix, tvb, o, + i = decode_path_prefix4(subtree, pinfo, hf_bgp_nlri_path_id, hf_bgp_nlri_prefix, tvb, o, "NLRI"); if (i < 0) return; @@ -6308,7 +6335,7 @@ dissect_bgp_update(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) } else { /* Standard prefixes */ while (o < end) { - i = decode_prefix4(subtree, NULL, hf_bgp_nlri_prefix, tvb, o, 0, + i = decode_prefix4(subtree, pinfo, NULL, hf_bgp_nlri_prefix, tvb, o, 0, "NLRI"); if (i < 0) return; @@ -6476,7 +6503,7 @@ example 2 proto_tree_add_item(subtree1, hf_bgp_route_refresh_orf_entry_prefixmask_upper, tvb, p, 1, ENC_BIG_ENDIAN); p++; - advance = decode_prefix4(subtree1, NULL, -1, tvb, p, 0, "ORF"); + advance = decode_prefix4(subtree1, pinfo, NULL, -1, tvb, p, 0, "ORF"); if (advance < 0) break; entrylen = 7 + 1 + advance; @@ -6804,6 +6831,9 @@ proto_register_bgp(void) { &hf_bgp_length, { "Length", "bgp.length", FT_UINT16, BASE_DEC, NULL, 0x0, "The total length of the message, including the header in octets", HFILL }}, + { &hf_bgp_prefix_length, + { "Prefix Length", "bgp.prefix_length", FT_UINT8, BASE_DEC, + NULL, 0x0, NULL, HFILL }}, { &hf_bgp_type, { "Type", "bgp.type", FT_UINT8, BASE_DEC, VALS(bgptypevals), 0x0, "BGP message type", HFILL }}, @@ -8020,6 +8050,7 @@ proto_register_bgp(void) { &ei_bgp_notify_minor_unknown, { "bgp.notify.minor_error.unknown", PI_UNDECODED, PI_NOTE, "Unknown notification error", EXPFILL }}, { &ei_bgp_route_refresh_orf_type_unknown, { "bgp.route_refresh.orf.type.unknown", PI_CHAT, PI_ERROR, "ORFEntry-Unknown", EXPFILL }}, { &ei_bgp_length_invalid, { "bgp.length.invalid", PI_MALFORMED, PI_ERROR, "Length is invalid", EXPFILL }}, + { &ei_bgp_prefix_length_invalid, { "bgp.prefix_length.invalid", PI_MALFORMED, PI_ERROR, "Prefix length is invalid", EXPFILL }}, { &ei_bgp_afi_type_not_supported, { "bgp.afi_type_not_supported", PI_PROTOCOL, PI_ERROR, "AFI Type not supported", EXPFILL }}, { &ei_bgp_ls_error, { "bgp.ls.error", PI_PROTOCOL, PI_ERROR, "Link State error", EXPFILL }}, { &ei_bgp_ext_com_len_bad, { "bgp.ext_com.length.bad", PI_PROTOCOL, PI_ERROR, "Extended community length is wrong", EXPFILL }}, diff --git a/epan/dissectors/packet-bssap.c b/epan/dissectors/packet-bssap.c index 9132eb7291..4c289c82dd 100644 --- a/epan/dissectors/packet-bssap.c +++ b/epan/dissectors/packet-bssap.c @@ -312,6 +312,7 @@ static int hf_bssap_global_cn_id = -1; static int hf_bssap_plmn_id = -1; static int hf_bssap_cn_id = -1; static int hf_bssap_cell_global_id = -1; +static int hf_bssap_extraneous_data = -1; /* Initialize the subtree pointers */ static gint ett_bssap = -1; @@ -1643,7 +1644,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_PAGING_REJECT: /* 17.1.18 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1655,7 +1656,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_DOWNLINK_TUNNEL_REQUEST: /* 17.1.4 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1672,7 +1673,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_UPLINK_TUNNEL_REQUEST: /* 17.1.23 */ /* SGSN number 18.4.22 M TLV 5-11 */ @@ -1685,7 +1686,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_LOCATION_UPDATE_REQUEST: /* 17.1.11 BSSAP+-LOCATION-UPDATE-REQUEST */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1733,7 +1734,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_imesiv(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_LOCATION_UPDATE_ACCEPT: /* 17.1.9 */ /* IMSI 18.4.10 M TLV 6-10 */ @@ -1752,7 +1753,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_mobile_id(tvb, bssap_tree, pinfo, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_LOCATION_UPDATE_REJECT: /* 17.1.10 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1763,7 +1764,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_reject_cause(tvb, bssap_tree, pinfo, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_TMSI_REALLOCATION_COMPLETE: /* 17.1.22 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1785,7 +1786,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_service_area_id(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_ALERT_REQUEST: /* 17.1.3 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1794,7 +1795,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_ALERT_ACK: /* 17.1.1 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1803,7 +1804,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_ALERT_REJECT: /* 17.1.2 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1816,7 +1817,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_MS_ACTIVITY_INDICATION: /* 17.1.14 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1838,7 +1839,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_service_area_id(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_GPRS_DETACH_INDICATION: /* 17.1.6 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1868,7 +1869,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_service_area_id(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_GPRS_DETACH_ACK: /* 17.1.5 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1877,7 +1878,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_IMSI_DETACH_INDICATION: /* 17.1.8 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1914,7 +1915,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_service_area_id(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_IMSI_DETACH_ACK: /* 17.1.7 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -1923,7 +1924,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_RESET_INDICATION: /* 17.1.21 */ /* Conditional IE:s */ @@ -1932,14 +1933,14 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_sgsn_number(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); }else{ /* VLR number VLR number 18.4.26 C TLV 5-11 */ if (check_optional_ie(tvb, offset, BSSAP_VLR_NUMBER)) { offset = dissect_bssap_vlr_number(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); } } proto_tree_add_text(tree, tvb, offset, -1, "Conditional IE"); @@ -1951,14 +1952,14 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_sgsn_number(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); }else{ /* VLR number VLR number 18.4.26 C TLV 5-11 */ if (check_optional_ie(tvb, offset, BSSAP_VLR_NUMBER)) { offset = dissect_bssap_vlr_number(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); } } proto_tree_add_text(tree, tvb, offset, -1, "Conditional IE"); @@ -1975,7 +1976,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_MS_INFORMATION_RESPONSE: /* 17.1.16 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -2032,7 +2033,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_service_area_id(tvb, bssap_tree, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_MM_INFORMATION_REQUEST: /* 17.1.12 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -2046,7 +2047,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr offset = dissect_bssap_MM_information(tvb, bssap_tree, pinfo, offset); if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_MOBILE_STATUS: /* 17.1.13 */ /* IMSI IMSI 18.4.10 O TLV 6-10 */ @@ -2062,7 +2063,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; case BSSAP_MS_UNREACHABLE: /* 17.1.17 */ /* IMSI IMSI 18.4.10 M TLV 6-10 */ @@ -2075,7 +2076,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr if (tvb_reported_length_remaining(tvb, offset) <= 0) return; - proto_tree_add_text(tree, tvb, offset, -1, "Extraneous data"); + proto_tree_add_item(tree, hf_bssap_extraneous_data, tvb, offset, -1, ENC_NA); break; default: break; @@ -2454,6 +2455,11 @@ proto_register_bssap(void) { "Cell global identity", "bssap.cell_global_id", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, + + { &hf_bssap_extraneous_data, + { "Extraneous data", "bssap.extraneous_data", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL}}, }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-dlsw.c b/epan/dissectors/packet-dlsw.c index 5e2f1f9288..8065339d4f 100644 --- a/epan/dissectors/packet-dlsw.c +++ b/epan/dissectors/packet-dlsw.c @@ -89,6 +89,10 @@ static int hf_dlsw_target_link_sap = -1; static int hf_dlsw_dlc_header_da = -1; static int hf_dlsw_netbios_name = -1; static int hf_dlsw_dlc_header_dsap = -1; +static int hf_dlsw_reserved = -1; +static int hf_dlsw_data = -1; +static int hf_dlsw_vector_data = -1; +static int hf_dlsw_unknown_data = -1; static gint ett_dlsw = -1; static gint ett_dlsw_header = -1; @@ -98,6 +102,7 @@ static gint ett_dlsw_data = -1; static gint ett_dlsw_vector = -1; static expert_field ei_dlsw_dlc_header_length = EI_INIT; +static expert_field ei_dlsw_not_used_for_capex = EI_INIT; #define CANUREACH 0x03 #define ICANREACH 0x04 @@ -302,7 +307,7 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data proto_tree_add_item(dlsw_header_tree, hf_dlsw_message_length, tvb, 2, 2, ENC_BIG_ENDIAN); proto_tree_add_item(dlsw_header_tree, hf_dlsw_remote_dlc, tvb, 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(dlsw_header_tree, hf_dlsw_remote_dlc_pid, tvb, 8, 4, ENC_BIG_ENDIAN); - proto_tree_add_text (dlsw_header_tree,tvb,12,2,"Reserved") ; + proto_tree_add_item(dlsw_header_tree, hf_dlsw_reserved, tvb, 12, 2, ENC_NA) ; } ; mtype=tvb_get_guint8(tvb,14); @@ -312,7 +317,7 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data proto_tree_add_item(dlsw_header_tree, hf_dlsw_message_type, tvb, 14, 1, ENC_NA); if (mtype==CAP_EXCHANGE) { - proto_tree_add_text (dlsw_header_tree,tvb, 15,1,"Not used for CapEx") ; + proto_tree_add_expert(dlsw_header_tree, pinfo, &ei_dlsw_not_used_for_capex, tvb, 15, 1); } else { @@ -332,17 +337,17 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data { proto_tree_add_item(dlsw_header_tree, hf_dlsw_protocol_id, tvb, 16, 1, ENC_NA); proto_tree_add_item(dlsw_header_tree, hf_dlsw_header_number, tvb, 17, 1, ENC_NA); - proto_tree_add_text (dlsw_header_tree,tvb, 18,5,"Not used for CapEx") ; + proto_tree_add_expert(dlsw_header_tree, pinfo, &ei_dlsw_not_used_for_capex, tvb, 18, 5); proto_tree_add_item(dlsw_header_tree, hf_dlsw_old_message_type, tvb, 23, 1, ENC_NA); - proto_tree_add_text (dlsw_header_tree,tvb, 24,14,"Not used for CapEx") ; + proto_tree_add_expert(dlsw_header_tree, pinfo, &ei_dlsw_not_used_for_capex, tvb, 24, 14); proto_tree_add_item(dlsw_header_tree, hf_dlsw_capex_type, tvb, 38, 1, ENC_NA); - proto_tree_add_text (dlsw_header_tree,tvb, 39,33,"Not used for CapEx") ; + proto_tree_add_expert(dlsw_header_tree, pinfo, &ei_dlsw_not_used_for_capex, tvb, 39, 33); } else { proto_tree_add_item(dlsw_header_tree, hf_dlsw_protocol_id, tvb, 16, 1, ENC_NA); proto_tree_add_item(dlsw_header_tree, hf_dlsw_header_number, tvb, 17, 1, ENC_NA); - proto_tree_add_text (dlsw_header_tree,tvb, 18,2,"Reserved") ; + proto_tree_add_item(dlsw_header_tree, hf_dlsw_reserved, tvb, 18, 2, ENC_NA) ; proto_tree_add_item(dlsw_header_tree, hf_dlsw_largest_frame_size, tvb, 20, 1, ENC_NA); ti2 = proto_tree_add_item(dlsw_header_tree, hf_dlsw_ssp_flags, tvb, 21, 1, ENC_NA); dlsw_flags_tree = proto_item_add_subtree(ti2, ett_dlsw_sspflags); @@ -354,7 +359,7 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data proto_tree_add_item(dlsw_header_tree, hf_dlsw_origin_link_sap, tvb, 36, 1, ENC_NA); proto_tree_add_item(dlsw_header_tree, hf_dlsw_target_link_sap, tvb, 37, 1, ENC_NA); proto_tree_add_item(dlsw_header_tree, hf_dlsw_frame_direction, tvb, 38, 1, ENC_NA); - proto_tree_add_text (dlsw_header_tree,tvb, 39,3,"Reserved") ; + proto_tree_add_item(dlsw_header_tree, hf_dlsw_reserved, tvb, 39, 3, ENC_NA) ; dlchlen=tvb_get_ntohs(tvb,42); ti = proto_tree_add_item(dlsw_header_tree, hf_dlsw_dlc_header_length, tvb, 42, 2, ENC_BIG_ENDIAN); if ( dlchlen > mlen ) @@ -369,7 +374,7 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data proto_tree_add_item(dlsw_header_tree, hf_dlsw_target_dlc_port_id, tvb, 56, 4, ENC_BIG_ENDIAN); proto_tree_add_item(dlsw_header_tree, hf_dlsw_target_dlc, tvb, 60, 4, ENC_BIG_ENDIAN); proto_tree_add_item(dlsw_header_tree, hf_dlsw_target_transport_id, tvb, 64, 4, ENC_BIG_ENDIAN); - proto_tree_add_text (dlsw_header_tree,tvb, 68,4,"Reserved") ; + proto_tree_add_item(dlsw_header_tree, hf_dlsw_reserved, tvb, 68, 4, ENC_NA) ; } } @@ -385,7 +390,7 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data case IFCM: case INFOFRAME: case KEEPALIVE: - proto_tree_add_text (dlsw_data_tree,tvb,hlen,mlen,"Data") ; + proto_tree_add_item(dlsw_data_tree, hf_dlsw_data, tvb, hlen, mlen, ENC_NA); break; default: @@ -400,7 +405,7 @@ dissect_dlsw_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data proto_tree_add_item(dlsw_data_tree, hf_dlsw_dlc_header_ssap, tvb, hlen+33, 1, ENC_NA); proto_tree_add_item(dlsw_data_tree, hf_dlsw_dlc_header_ctrl, tvb, hlen+34, 1, ENC_NA); } - proto_tree_add_text (dlsw_data_tree,tvb,hlen+dlchlen,mlen-dlchlen,"Data") ; + proto_tree_add_item(dlsw_data_tree, hf_dlsw_data, tvb, hlen+dlchlen, mlen-dlchlen, ENC_NA); } } @@ -484,13 +489,13 @@ dissect_dlsw_capex(tvbuff_t *tvb, proto_tree *tree, proto_tree *ti2) proto_tree_add_item(dlsw_vector_tree, hf_dlsw_multicast_version_number, tvb, offset+2, vlen-2, ENC_NA); break; default: - proto_tree_add_text (dlsw_vector_tree,tvb,offset+2,vlen-2,"Vector Data = ???"); + proto_tree_add_item(dlsw_vector_tree, hf_dlsw_vector_data, tvb, offset+2, vlen-2, ENC_NA); } offset+=vlen; }; break; default: - proto_tree_add_text (tree,tvb,4,mlen - 4,"Unknown data"); + proto_tree_add_item(tree, hf_dlsw_unknown_data, tvb, 4, mlen - 4, ENC_NA); } } @@ -605,6 +610,10 @@ proto_register_dlsw(void) { &hf_dlsw_netbios_name, { "NetBIOS name", "dlsw.netbios_name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_dlsw_vendor_oui, { "Vendor OUI", "dlsw.vendor_oui", FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_dlsw_multicast_version_number, { "Multicast Version Number", "dlsw.multicast_version_number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_dlsw_reserved, { "Reserved", "dlsw.reserved", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_dlsw_data, { "Data", "dlsw.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_dlsw_vector_data, { "Data", "dlsw.vector_data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_dlsw_unknown_data, { "Data", "dlsw.unknown_data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, }; static gint *ett[] = { @@ -618,6 +627,7 @@ proto_register_dlsw(void) static ei_register_info ei[] = { { &ei_dlsw_dlc_header_length, { "dlsw.dlc_header_length.bogus", PI_PROTOCOL, PI_WARN, "DLC Header Length bogus", EXPFILL }}, + { &ei_dlsw_not_used_for_capex, { "dlsw.not_used_for_capex", PI_PROTOCOL, PI_NOTE, "Not used for CapEx", EXPFILL }}, }; expert_module_t* expert_dlsw; diff --git a/epan/dissectors/packet-fcfcs.c b/epan/dissectors/packet-fcfcs.c index 1c268cbcf2..c2c1655ca8 100644 --- a/epan/dissectors/packet-fcfcs.c +++ b/epan/dissectors/packet-fcfcs.c @@ -60,6 +60,7 @@ static int hf_fcs_porttype = -1; static int hf_fcs_physportnum = -1; static int hf_fcs_portflags = -1; static int hf_fcs_portstate = -1; +static int hf_fcs_platformname_len = -1; static int hf_fcs_platformname = -1; static int hf_fcs_platformnname = -1; static int hf_fcs_platformtype = -1; @@ -426,8 +427,7 @@ dissect_fcfcs_gplnl (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint(tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); } @@ -455,8 +455,7 @@ dissect_fcfcs_gplt (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint(tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); } @@ -476,8 +475,7 @@ dissect_fcfcs_gplml (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint(tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); } @@ -513,8 +511,7 @@ dissect_fcfcs_gnpl (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) } else { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); } @@ -537,9 +534,7 @@ dissect_fcfcs_gpnl (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) offset += 4; for (i = 0; i < numelem; i++) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", - len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); offset += 256; @@ -575,8 +570,7 @@ dissect_fcfcs_rpl (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); proto_tree_add_item (tree, hf_fcs_platformtype, tvb, offset+256, 4, @@ -617,8 +611,7 @@ dissect_fcfcs_rpln (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); proto_tree_add_string (tree, hf_fcs_platformnname, tvb, offset+256, @@ -636,8 +629,7 @@ dissect_fcfcs_rplt (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); proto_tree_add_item (tree, hf_fcs_platformtype, tvb, offset+256, @@ -655,8 +647,7 @@ dissect_fcfcs_rplm (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); len = tvb_get_guint8 (tvb, offset+256); @@ -677,8 +668,7 @@ dissect_fcfcs_dpl (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); } @@ -707,8 +697,7 @@ dissect_fcfcs_dplml (tvbuff_t *tvb, proto_tree *tree, gboolean isreq) if (tree) { if (isreq) { len = tvb_get_guint8 (tvb, offset); - proto_tree_add_text (tree, tvb, offset, 1, - "Platform Name Length: %d", len); + proto_tree_add_uint (tree, hf_fcs_platformname_len, tvb, offset, 1, len); proto_tree_add_item (tree, hf_fcs_platformname, tvb, offset+1, len, ENC_NA); } @@ -1044,6 +1033,9 @@ proto_register_fcfcs (void) { &hf_fcs_portstate, {"Port State", "fcs.port.state", FT_UINT8, BASE_HEX, VALS (fc_fcs_port_state_val), 0x0, NULL, HFILL}}, + { &hf_fcs_platformname_len, + {"Platform Name Length", "fcs.platform.len", FT_UINT8, BASE_DEC, + NULL, 0x0, NULL, HFILL}}, { &hf_fcs_platformname, {"Platform Name", "fcs.platform.name", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, diff --git a/epan/dissectors/packet-fcswils.c b/epan/dissectors/packet-fcswils.c index 3e6429d4d2..d546d17a49 100644 --- a/epan/dissectors/packet-fcswils.c +++ b/epan/dissectors/packet-fcswils.c @@ -1,4 +1,4 @@ -/* packet-fcswils +/* packet-fcswils.c * Routines for FC Inter-switch link services * Copyright 2001, Dinesh G Dutt <ddutt@cisco.com> * diff --git a/epan/dissectors/packet-gsm_a_bssmap.c b/epan/dissectors/packet-gsm_a_bssmap.c index bc015c1f34..89dd4da8d2 100644 --- a/epan/dissectors/packet-gsm_a_bssmap.c +++ b/epan/dissectors/packet-gsm_a_bssmap.c @@ -651,6 +651,7 @@ static int hf_gsm_a_bssmap_lcls_bss_status = -1; static int hf_gsm_a_bssmap_selected_plmn_id = -1; static expert_field ei_gsm_a_bssmap_extraneous_data = EI_INIT; +static expert_field ei_gsm_a_bssmap_not_decoded_yet = EI_INIT; /* Initialize the subtree pointers */ static gint ett_bssmap_msg = -1; @@ -2203,7 +2204,7 @@ be_cell_id_list_seg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui /* Cell identification discriminator */ proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - proto_tree_add_text(tree, tvb, curr_offset, len-2, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-2); return(len); @@ -2213,7 +2214,7 @@ be_cell_id_list_seg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui * 3.2.2.27b Cell Identifier List Segment for established cells */ static guint16 -be_cell_id_lst_seg_f_est_cells(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_cell_id_lst_seg_f_est_cells(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; @@ -2224,7 +2225,7 @@ be_cell_id_lst_seg_f_est_cells(tvbuff_t *tvb, proto_tree *tree, packet_info *pin proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1); return(len); @@ -2233,7 +2234,7 @@ be_cell_id_lst_seg_f_est_cells(tvbuff_t *tvb, proto_tree *tree, packet_info *pin * 3.2.2.27c Cell Identifier List Segment for cells to be established */ static guint16 -be_cell_id_lst_seg_f_cell_tb_est(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_cell_id_lst_seg_f_cell_tb_est(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; @@ -2244,7 +2245,7 @@ be_cell_id_lst_seg_f_cell_tb_est(tvbuff_t *tvb, proto_tree *tree, packet_info *p proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1); return(len); @@ -2256,7 +2257,7 @@ be_cell_id_lst_seg_f_cell_tb_est(tvbuff_t *tvb, proto_tree *tree, packet_info *p * 3.2.2.27e Cell Identifier List Segment for released cells - no user present */ static guint16 -be_cell_id_lst_seg_f_rel_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_cell_id_lst_seg_f_rel_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; @@ -2267,7 +2268,7 @@ be_cell_id_lst_seg_f_rel_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1); return(len); @@ -2276,7 +2277,7 @@ be_cell_id_lst_seg_f_rel_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf * 3.2.2.27f Cell Identifier List Segment for not established cells - no establishment possible */ static guint16 -be_cell_id_lst_seg_f_not_est_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_cell_id_lst_seg_f_not_est_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; @@ -2287,7 +2288,7 @@ be_cell_id_lst_seg_f_not_est_cell(tvbuff_t *tvb, proto_tree *tree, packet_info * proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - proto_tree_add_text(tree, tvb, curr_offset, len-1, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1); return(len); @@ -2865,13 +2866,13 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o * 3.2.2.52 Assignment Requirement */ static guint16 -be_ass_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_ass_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3177,13 +3178,13 @@ be_apdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, gui * Requested GPS Data element of 3GPP TS 49.031 BSSAP-LE. */ static guint16 -be_gps_assist_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_gps_assist_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); @@ -3198,13 +3199,13 @@ be_gps_assist_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guin * Return Error Request element of 3GPP TS 49.031 BSSAP-LE. */ static guint16 -be_ret_err_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_ret_err_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3213,13 +3214,13 @@ be_ret_err_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 * Return Error Cause element of 3GPP TS 49.031 BSSAP-LE. */ static guint16 -be_ret_err_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_ret_err_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3228,13 +3229,13 @@ be_ret_err_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint3 * Segmentation element of 3GPP TS 49.031 BSSAP-LE. */ static guint16 -be_seg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_seg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3293,13 +3294,13 @@ be_src_rnc_to_tar_rnc_umts(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, * 3.2.2.77 Source RNC to target RNC transparent information (cdma2000) */ static guint16 -be_src_rnc_to_tar_rnc_cdma(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_src_rnc_to_tar_rnc_cdma(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); /* The Source RNC to Target RNC transparent Information value (structure and encoding) * for cdma2000 is defined in relevant specifications. */ @@ -3409,13 +3410,13 @@ be_inter_sys_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint3 * 3.2.2.82 SNA Access Information */ static guint16 -be_sna_acc_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_sna_acc_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len , "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3680,13 +3681,13 @@ be_vgcs_vbs_cell_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, * XXX move to packet-gsm_bssmap_le.c */ guint16 -be_ganss_ass_dta(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_ganss_ass_dta(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3745,7 +3746,7 @@ be_ganss_loc_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -3753,13 +3754,13 @@ be_ganss_loc_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint * 3.2.2.98 Application Data */ static guint16 -be_app_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +be_app_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { guint32 curr_offset; curr_offset = offset; - proto_tree_add_text(tree, tvb, curr_offset, len, "Not decoded yet"); + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len); return(len); } @@ -8079,6 +8080,7 @@ proto_register_gsm_a_bssmap(void) static ei_register_info ei[] = { { &ei_gsm_a_bssmap_extraneous_data, { "gsm_a_bssmap.extraneous_data", PI_PROTOCOL, PI_NOTE, "Extraneous Data, dissector bug or later version spec(report to wireshark.org)", EXPFILL }}, + { &ei_gsm_a_bssmap_not_decoded_yet, { "gsm_a_bssmap.not_decoded_yet", PI_UNDECODED, PI_WARN, "Not decoded yet", EXPFILL }}, }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-gtpv2.c b/epan/dissectors/packet-gtpv2.c index 3a441bd428..39c3a11857 100644 --- a/epan/dissectors/packet-gtpv2.c +++ b/epan/dissectors/packet-gtpv2.c @@ -3043,7 +3043,7 @@ dissect_gtpv2_mm_context_gsm_t(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr /* Dissect octet j to r */ offset = dissect_gtpv2_mm_context_common_data(tvb, pinfo, tree, offset, samb_ri, uamb_ri); - proto_tree_add_text(flag_tree, tvb, offset, -1, "The rest of the IE not dissected yet"); + proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet"); } /* Type = 104 (decimal) @@ -3145,7 +3145,7 @@ dissect_gtpv2_mm_context_utms_cq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr return; } - proto_tree_add_text(flag_tree, tvb, offset, -1, "The rest of the IE not dissected yet"); + proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet"); } @@ -3244,7 +3244,7 @@ dissect_gtpv2_mm_context_gsm_cq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre return; } - proto_tree_add_text(flag_tree, tvb, offset, -1, "The rest of the IE not dissected yet"); + proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet"); } @@ -3349,7 +3349,7 @@ dissect_gtpv2_mm_context_utms_q(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre } /* (s+3) to (n+4) These octet(s) is/are present only if explicitly specified */ - proto_tree_add_text(flag_tree, tvb, offset, -1, "The rest of the IE not dissected yet"); + proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet"); } @@ -3583,7 +3583,7 @@ dissect_gtpv2_mm_context_utms_qq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr } if (offset < (guint32)length) { - proto_tree_add_text(tree, tvb, offset, -1, "The rest of the IE not dissected yet"); + proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet"); } } @@ -3864,7 +3864,7 @@ dissect_gtpv2_F_container(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p * information. If the Cause IE contains the value "Request * accepted", this IE shall be included. */ - proto_tree_add_text(tree, tvb, offset, length-offset, "Not dissected yet"); + proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, length-offset); } @@ -3950,7 +3950,7 @@ dissect_gtpv2_F_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, p break; } } - proto_tree_add_text(tree, tvb, offset, length-offset, "Not dissected yet"); + proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, length-offset); } @@ -4073,7 +4073,7 @@ dissect_gtpv2_target_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro default: break; } - proto_tree_add_text(tree, tvb, offset, length-offset, "Not dissected yet"); + proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, length-offset); } @@ -6995,7 +6995,7 @@ void proto_register_gtpv2(void) }; static ei_register_info ei[] = { - { &ei_gtpv2_ie_data_not_dissected, { "gtpv2.ie_data_not_dissected", PI_PROTOCOL, PI_NOTE, "IE data not dissected yet", EXPFILL }}, + { &ei_gtpv2_ie_data_not_dissected, { "gtpv2.ie_data_not_dissected", PI_UNDECODED, PI_NOTE, "IE data not dissected yet", EXPFILL }}, { &ei_gtpv2_ie_len_invalid, { "gtpv2.ie_len_invalid", PI_PROTOCOL, PI_ERROR, "Wrong length", EXPFILL }}, { &ei_gtpv2_source_type_unknown, { "gtpv2.source_type.unknown", PI_PROTOCOL, PI_ERROR, "Unknown source type", EXPFILL }}, { &ei_gtpv2_fq_csid_type_bad, { "gtpv2.fq_csid_type.unknown", PI_PROTOCOL, PI_ERROR, "Wrong Node-ID Type", EXPFILL }}, diff --git a/epan/dissectors/packet-lmp.c b/epan/dissectors/packet-lmp.c index b6abbcfb7c..42d452def6 100644 --- a/epan/dissectors/packet-lmp.c +++ b/epan/dissectors/packet-lmp.c @@ -504,6 +504,7 @@ enum hf_lmp_filter_keys { }; static int hf_lmp_filter[LMPF_MAX]; +static int hf_lmp_data; static expert_field ei_lmp_checksum_incorrect = EI_INIT; static expert_field ei_lmp_invalid_msg_type = EI_INIT; @@ -824,8 +825,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) offset2, 4, tvb_get_ntohl(tvb, offset2)); break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -848,8 +848,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -886,8 +885,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -925,8 +923,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -951,8 +948,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -975,8 +971,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1000,8 +995,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1045,8 +1039,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1068,8 +1061,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1087,8 +1079,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) tvb_get_ntohl(tvb, offset2)); break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1151,8 +1142,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) tvb, offset2+8, 4, ENC_BIG_ENDIAN); break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1218,8 +1208,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } @@ -1272,9 +1261,8 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, - tvb_get_guint8(tvb, offset2+l+1), - "Data (%d bytes)", tvb_get_guint8(tvb, offset2+l+1)); + proto_tree_add_item(lmp_subobj_tree, hf_lmp_data, tvb, offset2+l, + tvb_get_guint8(tvb, offset2+l+1), ENC_NA); break; } if (tvb_get_guint8(tvb, offset2+l+1) < 1) @@ -1341,9 +1329,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2+l, obj_length-4-l, - "Data (%d bytes)", obj_length-4-l); - l = obj_length - 4; + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2+l, obj_length-4-l, ENC_NA); break; } if (l == obj_length - 4) break; @@ -1394,9 +1380,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2+l, - obj_length-4-l, - "Data (%d bytes)", obj_length-4-l); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2+l, obj_length-4-l, ENC_NA); l = obj_length - 4; break; } @@ -1508,8 +1492,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) default: proto_item_append_text(ti, ": UNKNOWN_ERROR (%d): 0x%04x", type, l); - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1561,8 +1544,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } @@ -1580,8 +1562,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } @@ -1818,8 +1799,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) default: /* Unknown type in Service Config object */ - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1840,8 +1820,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1952,10 +1931,8 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_subobj_tree, tvb, offset2+l, - tvb_get_guint8(tvb, offset2+l+1), - "Data (%d bytes)", tvb_get_guint8(tvb, - offset2+l+1)); + proto_tree_add_item(lmp_subobj_tree, hf_lmp_data, tvb, offset2+l, + tvb_get_guint8(tvb, offset2+l+1), ENC_NA); break; } if (tvb_get_guint8(tvb, offset2+l+1) < 1) @@ -1966,8 +1943,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) break; default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } break; @@ -1975,8 +1951,7 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) default: - proto_tree_add_text(lmp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + proto_tree_add_item(lmp_object_tree, hf_lmp_data, tvb, offset2, mylen, ENC_NA); break; } @@ -2696,6 +2671,9 @@ proto_register_lmp(void) {&hf_lmp_filter[LMPF_CHECKSUM], { "Message Checksum", "lmp.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + {&hf_lmp_data, + { "Data", "lmp.data", FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-mpls-echo.c b/epan/dissectors/packet-mpls-echo.c index d2741aee91..be96ffa0d2 100644 --- a/epan/dissectors/packet-mpls-echo.c +++ b/epan/dissectors/packet-mpls-echo.c @@ -1483,7 +1483,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre val_to_str_ext_const(type, &mpls_echo_tlv_type_names_ext, "Unknown TLV type"), saved_type); } - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN); + ti = proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN); } /* MPLS Echo TLV Value */ @@ -1526,9 +1526,9 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre #if 0 case TLV_RTO_IPv4: if (length != 4) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be 4", - length); + expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len, + "Invalid TLV Length (claimed %u, should be 4)", + length); break; } proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv4, @@ -1536,9 +1536,9 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre break; case TLV_RTO_IPv6: if (length != 16) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be 16", - length); + expert_add_info_format(pinfo, ti, &ei_mpls_echo_tlv_len, + "Invalid TLV Length (claimed %u, should be 16)", + length); break; } proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv6, diff --git a/epan/dissectors/packet-nbns.c b/epan/dissectors/packet-nbns.c index 45db5bbff5..1ddb4b2599 100644 --- a/epan/dissectors/packet-nbns.c +++ b/epan/dissectors/packet-nbns.c @@ -28,6 +28,7 @@ #include <glib.h> #include <epan/packet.h> +#include <epan/expert.h> #include <epan/exceptions.h> #include <epan/wmem/wmem.h> #include <epan/prefs.h> @@ -77,6 +78,8 @@ static gint ett_nbns_rr = -1; static gint ett_nbns_qry = -1; static gint ett_nbns_ans = -1; +static expert_field ei_nbns_incomplete_entry = EI_INIT; + static int proto_nbdgm = -1; static int hf_nbdgm_type = -1; static int hf_nbdgm_fragment = -1; @@ -609,7 +612,7 @@ nbns_add_name_flags(proto_tree *rr_tree, tvbuff_t *tvb, int offset) } static int -dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, +dissect_nbns_answer(tvbuff_t *tvb, packet_info *pinfo, int offset, int nbns_data_offset, column_info *cinfo, proto_tree *nbns_tree, int opcode) { int len; @@ -678,8 +681,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, * same type of RR data as other T_NB * responses. */ if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } flags = tvb_get_ntohs(tvb, cur_offset); @@ -689,8 +691,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; } else { if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } nbns_add_nb_flags(rr_tree, tvb, cur_offset); @@ -698,8 +699,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 4) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } proto_tree_add_text(rr_tree, tvb, cur_offset, 4, @@ -725,8 +725,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, } if (data_len < 1) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } @@ -737,8 +736,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, while (num_names != 0) { if (data_len < NETBIOS_NAME_LEN) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); goto out; } if (rr_tree) { @@ -755,8 +753,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= NETBIOS_NAME_LEN; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); goto out; } if (rr_tree) { @@ -769,8 +766,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, } if (data_len < 6) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } @@ -783,8 +779,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 6; if (data_len < 1) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } @@ -796,8 +791,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 1; if (data_len < 1) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -808,8 +802,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 1; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -820,8 +813,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -833,8 +825,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -845,8 +836,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -858,8 +848,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -870,8 +859,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -882,8 +870,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 4) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -894,8 +881,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 4; if (data_len < 4) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -907,8 +893,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 4; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -919,8 +904,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -932,8 +916,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -945,8 +928,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -958,8 +940,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -971,8 +952,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -984,8 +964,7 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset, data_len -= 2; if (data_len < 2) { - proto_tree_add_text(rr_tree, tvb, cur_offset, - data_len, "(incomplete entry)"); + proto_tree_add_expert(rr_tree, pinfo, &ei_nbns_incomplete_entry, tvb, cur_offset, data_len); break; } if (rr_tree) { @@ -1041,7 +1020,7 @@ dissect_query_records(tvbuff_t *tvb, int cur_off, int nbns_data_offset, } static int -dissect_answer_records(tvbuff_t *tvb, int cur_off, int nbns_data_offset, +dissect_answer_records(tvbuff_t *tvb, packet_info *pinfo, int cur_off, int nbns_data_offset, int count, column_info *cinfo, proto_tree *nbns_tree, int opcode, const char *name) { @@ -1053,7 +1032,7 @@ dissect_answer_records(tvbuff_t *tvb, int cur_off, int nbns_data_offset, qatree = proto_tree_add_subtree(nbns_tree, tvb, start_off, -1, ett_nbns_ans, &ti, name); while (count-- > 0) { - add_off = dissect_nbns_answer(tvb, cur_off, nbns_data_offset, + add_off = dissect_nbns_answer(tvb, pinfo, cur_off, nbns_data_offset, cinfo, qatree, opcode); cur_off += add_off; } @@ -1134,7 +1113,7 @@ dissect_nbns(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* If this is a request, don't add information about the answers to the summary, just add information about the queries. */ - cur_off += dissect_answer_records(tvb, cur_off, + cur_off += dissect_answer_records(tvb, pinfo, cur_off, nbns_data_offset, ans, ((flags & F_RESPONSE) ? pinfo->cinfo : NULL), nbns_tree, opcode, "Answers"); @@ -1143,13 +1122,13 @@ dissect_nbns(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Don't add information about the authoritative name servers, or the additional records, to the summary. */ if (auth > 0) - cur_off += dissect_answer_records(tvb, cur_off, + cur_off += dissect_answer_records(tvb, pinfo, cur_off, nbns_data_offset, auth, NULL, nbns_tree, opcode, "Authoritative nameservers"); if (add > 0) - /*cur_off += */dissect_answer_records(tvb, cur_off, + /*cur_off += */dissect_answer_records(tvb, pinfo, cur_off, nbns_data_offset, add, NULL, nbns_tree, opcode, "Additional records"); @@ -2053,10 +2032,18 @@ proto_register_nbt(void) &ett_nbss, &ett_nbss_flags, }; + + static ei_register_info ei[] = { + { &ei_nbns_incomplete_entry, { "nbns.incomplete_entry", PI_MALFORMED, PI_ERROR, "incomplete entry", EXPFILL }}, + }; + module_t *nbss_module; + expert_module_t* expert_nbns; proto_nbns = proto_register_protocol("NetBIOS Name Service", "NBNS", "nbns"); proto_register_field_array(proto_nbns, hf_nbns, array_length(hf_nbns)); + expert_nbns = expert_register_protocol(proto_nbns); + expert_register_field_array(expert_nbns, ei, array_length(ei)); proto_nbdgm = proto_register_protocol("NetBIOS Datagram Service", "NBDS", "nbdgm"); diff --git a/epan/dissectors/packet-netbios.c b/epan/dissectors/packet-netbios.c index 0a9c22e900..65b5116a86 100644 --- a/epan/dissectors/packet-netbios.c +++ b/epan/dissectors/packet-netbios.c @@ -32,6 +32,7 @@ #include <epan/llcsaps.h> #include <epan/reassemble.h> #include <epan/prefs.h> +#include <epan/expert.h> #include "packet-netbios.h" void proto_register_netbios(void); @@ -81,6 +82,7 @@ void proto_reg_handoff_netbios(void); static int proto_netbios = -1; static int hf_netb_cmd = -1; static int hf_netb_hdr_len = -1; +static int hf_netb_delimiter = -1; static int hf_netb_xmit_corrl = -1; static int hf_netb_resp_corrl = -1; static int hf_netb_call_name_type = -1; @@ -110,6 +112,11 @@ static int hf_netb_data2_user = -1; static int hf_netb_data2_status = -1; static int hf_netb_datagram_mac = -1; static int hf_netb_datagram_bcast_mac = -1; +static int hf_netb_resync_indicator = -1; +static int hf_netb_status_request = -1; +static int hf_netb_local_session_no = -1; +static int hf_netb_state_of_name = -1; +static int hf_netb_status_response = -1; static int hf_netb_fragments = -1; static int hf_netb_fragment = -1; static int hf_netb_fragment_overlap = -1; @@ -127,6 +134,8 @@ static gint ett_netb_status = -1; static gint ett_netb_fragments = -1; static gint ett_netb_fragment = -1; +static expert_field ei_netb_unknown_command_data = EI_INIT; + static const fragment_items netbios_frag_items = { &ett_netb_fragment, &ett_netb_fragments, @@ -556,18 +565,17 @@ nb_resync_indicator( tvbuff_t *tvb, int offset, proto_tree *tree, const char *cm switch (resync_indicator) { case 0x0000: - proto_tree_add_text(tree, tvb, offset + NB_DATA2, 2, - "Re-sync indicator: No re-sync"); + proto_tree_add_uint_format_value(tree, hf_netb_resync_indicator, tvb, offset + NB_DATA2, 2, + resync_indicator, "No re-sync"); break; case 0x0001: - proto_tree_add_text(tree, tvb, offset + NB_DATA2, 2, - "Re-sync indicator: First '%s' following 'Receive Outstanding'", cmd_str); + proto_tree_add_uint_format_value(tree, hf_netb_resync_indicator, tvb, offset + NB_DATA2, 2, + resync_indicator, "First '%s' following 'Receive Outstanding'", cmd_str); break; default: - proto_tree_add_text(tree, tvb, offset + NB_DATA2, 2, - "Re-sync indicator: 0x%04x", resync_indicator); + proto_tree_add_item(tree, hf_netb_resync_indicator, tvb, offset + NB_DATA2, 2, ENC_LITTLE_ENDIAN); break; } } @@ -579,19 +587,18 @@ nb_resync_indicator( tvbuff_t *tvb, int offset, proto_tree *tree, const char *cm /************************************************************************/ static guint32 -dissect_netb_unknown( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_unknown( tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree) {/* Handle any unknown commands, do nothing */ - proto_tree_add_text(tree, tvb, offset + NB_COMMAND + 1, -1, - "Unknown NetBIOS command data"); + proto_tree_add_expert(tree, pinfo, &ei_netb_unknown_command_data, tvb, offset + NB_COMMAND + 1, -1); return 0; } static guint32 -dissect_netb_add_group_name( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_add_group_name( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the ADD GROUP NAME QUERY command */ @@ -605,7 +612,7 @@ dissect_netb_add_group_name( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_add_name( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_add_name( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the ADD NAME QUERY command */ @@ -618,7 +625,7 @@ dissect_netb_add_name( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_name_in_conflict( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_name_in_conflict( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the NAME IN CONFLICT command */ @@ -631,7 +638,7 @@ dissect_netb_name_in_conflict( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_status_query( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_status_query( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the STATUS QUERY command */ guint8 status_request = tvb_get_guint8( tvb, offset + NB_DATA1); @@ -639,18 +646,18 @@ dissect_netb_status_query( tvbuff_t *tvb, int offset, proto_tree *tree) switch (status_request) { case 0: - proto_tree_add_text(tree, tvb, offset + NB_DATA1, 1, - "Status request: NetBIOS 1.x or 2.0"); + proto_tree_add_uint_format_value(tree, hf_netb_status_request, tvb, offset + NB_DATA1, 1, + status_request, "NetBIOS 1.x or 2.0"); break; case 1: - proto_tree_add_text(tree, tvb, offset + NB_DATA1, 1, - "Status request: NetBIOS 2.1, initial status request"); + proto_tree_add_uint_format_value(tree, hf_netb_status_request, tvb, offset + NB_DATA1, 1, + status_request, "NetBIOS 2.1, initial status request"); break; default: - proto_tree_add_text(tree, tvb, offset + NB_DATA1, 1, - "Status request: NetBIOS 2.1, %u names received so far", + proto_tree_add_uint_format_value(tree, hf_netb_status_request, tvb, offset + NB_DATA1, 1, + status_request, "NetBIOS 2.1, %u names received so far", status_request); break; } @@ -664,7 +671,7 @@ dissect_netb_status_query( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_terminate_trace( tvbuff_t *tvb _U_, int offset _U_, proto_tree *tree _U_) +dissect_netb_terminate_trace( tvbuff_t *tvb _U_, packet_info *pinfo _U_, int offset _U_, proto_tree *tree _U_) {/* Handle the TERMINATE TRACE command */ @@ -680,7 +687,7 @@ dissect_netb_terminate_trace( tvbuff_t *tvb _U_, int offset _U_, proto_tree *tre static const guchar zeroes[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static guint32 -dissect_netb_datagram( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_datagram( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the DATAGRAM command */ @@ -701,7 +708,7 @@ dissect_netb_datagram( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_datagram_bcast( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_datagram_bcast( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the DATAGRAM BROADCAST command */ @@ -719,17 +726,16 @@ dissect_netb_datagram_bcast( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_name_query( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_name_query( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the NAME QUERY command */ guint8 local_session_number = tvb_get_guint8( tvb, offset + NB_DATA2); if (local_session_number == 0) { - proto_tree_add_text( tree, tvb, offset + NB_DATA2, 1, - "Local Session No.: 0 (FIND.NAME request)"); + proto_tree_add_uint_format_value( tree, hf_netb_local_session_no, tvb, offset + NB_DATA2, 1, + local_session_number, "0 (FIND.NAME request)"); } else { - proto_tree_add_text( tree, tvb, offset + NB_DATA2, 1, - "Local Session No.: 0x%02x", local_session_number); + proto_tree_add_item( tree, hf_netb_local_session_no, tvb, offset + NB_DATA2, 1, ENC_NA); } nb_call_name_type( tvb, offset, tree); nb_resp_corrl( tvb, offset, tree); @@ -744,7 +750,7 @@ dissect_netb_name_query( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_add_name_resp( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_add_name_resp( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the ADD NAME RESPONSE command */ @@ -761,7 +767,7 @@ dissect_netb_add_name_resp( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_name_resp( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_name_resp( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the NAME RECOGNIZED command */ guint8 local_session_number = tvb_get_guint8( tvb, offset + NB_DATA2); @@ -769,18 +775,17 @@ dissect_netb_name_resp( tvbuff_t *tvb, int offset, proto_tree *tree) switch (local_session_number) { case 0x00: - proto_tree_add_text( tree, tvb, offset + NB_DATA2, 1, - "State of name: No LISTEN pending, or FIND.NAME response"); + proto_tree_add_uint_format_value( tree, hf_netb_state_of_name, tvb, offset + NB_DATA2, 1, + local_session_number, "No LISTEN pending, or FIND.NAME response"); break; case 0xFF: - proto_tree_add_text( tree, tvb, offset + NB_DATA2, 1, - "State of name: LISTEN pending, but insufficient resources to establish session"); + proto_tree_add_uint_format_value( tree, hf_netb_state_of_name, tvb, offset + NB_DATA2, 1, + local_session_number, "LISTEN pending, but insufficient resources to establish session"); break; default: - proto_tree_add_text( tree, tvb, offset + NB_DATA2, 1, - "Local Session No.: 0x%02x", local_session_number); + proto_tree_add_item( tree, hf_netb_local_session_no, tvb, offset + NB_DATA2, 1, ENC_NA); break; } nb_call_name_type( tvb, offset, tree); @@ -798,7 +803,7 @@ dissect_netb_name_resp( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_status_resp( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_status_resp( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the STATUS RESPONSE command */ guint8 status_response = tvb_get_guint8( tvb, offset + NB_DATA1); @@ -807,11 +812,11 @@ dissect_netb_status_resp( tvbuff_t *tvb, int offset, proto_tree *tree) nb_call_name_type( tvb, offset, tree); if (status_response == 0) { - proto_tree_add_text(tree, tvb, offset + NB_DATA1, 1, - "Status response: NetBIOS 1.x or 2.0"); + proto_tree_add_uint_format_value(tree, hf_netb_status_response, tvb, offset + NB_DATA1, 1, + status_response, "NetBIOS 1.x or 2.0"); } else { - proto_tree_add_text(tree, tvb, offset + NB_DATA1, 1, - "Status response: NetBIOS 2.1, %u names sent so far", + proto_tree_add_uint_format_value(tree, hf_netb_status_response, tvb, offset + NB_DATA1, 1, + status_response, "NetBIOS 2.1, %u names sent so far", status_response); } @@ -831,7 +836,7 @@ dissect_netb_status_resp( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_data_ack( tvbuff_t* tvb, int offset, proto_tree *tree) +dissect_netb_data_ack( tvbuff_t* tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the DATA ACK command */ @@ -844,7 +849,7 @@ dissect_netb_data_ack( tvbuff_t* tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_data_first_middle( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_data_first_middle( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the DATA FIRST MIDDLE command */ @@ -879,7 +884,7 @@ dissect_netb_data_first_middle( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_data_only_last( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_data_only_last( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the DATA ONLY LAST command */ @@ -907,7 +912,7 @@ dissect_netb_data_only_last( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_session_confirm( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_session_confirm( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the SESSION CONFIRM command */ @@ -924,7 +929,7 @@ dissect_netb_session_confirm( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_session_end( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_session_end( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the SESSION END command */ @@ -937,7 +942,7 @@ dissect_netb_session_end( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_session_init( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_session_init( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the SESSION INITIALIZE command */ @@ -953,7 +958,7 @@ dissect_netb_session_init( tvbuff_t *tvb, int offset, proto_tree *tree) } static guint32 -dissect_netb_no_receive( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_no_receive( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the NO RECEIVE command */ @@ -968,7 +973,7 @@ dissect_netb_no_receive( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_receive_outstanding( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_receive_outstanding( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the RECEIVE OUTSTANDING command */ @@ -981,7 +986,7 @@ dissect_netb_receive_outstanding( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_receive_continue( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_receive_continue( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the RECEIVE CONTINUE command */ @@ -994,7 +999,7 @@ dissect_netb_receive_continue( tvbuff_t *tvb, int offset, proto_tree *tree) static guint32 -dissect_netb_session_alive( tvbuff_t *tvb, int offset, proto_tree *tree) +dissect_netb_session_alive( tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) {/* Handle the SESSION ALIVE command */ @@ -1020,7 +1025,7 @@ dissect_netb_session_alive( tvbuff_t *tvb, int offset, proto_tree *tree) /* */ /************************************************************************/ -static guint32 (*const dissect_netb[])(tvbuff_t *, int, proto_tree *) = { +static guint32 (*const dissect_netb[])(tvbuff_t *, packet_info *, int, proto_tree *) = { dissect_netb_add_group_name, /* Add Group Name 0x00 */ dissect_netb_add_name, /* Add Name 0x01 */ @@ -1138,11 +1143,11 @@ dissect_netbios(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) ti = proto_tree_add_item(tree, proto_netbios, tvb, 0, hdr_len, ENC_NA); netb_tree = proto_item_add_subtree(ti, ett_netb); - proto_tree_add_uint_format(netb_tree, hf_netb_hdr_len, tvb, offset, 2, hdr_len, - "Length: %d bytes", hdr_len); + proto_tree_add_uint_format_value(netb_tree, hf_netb_hdr_len, tvb, offset, 2, hdr_len, + "%d bytes", hdr_len); - proto_tree_add_text(netb_tree, tvb, offset + 2, 2, - "Delimiter: EFFF (NetBIOS)"); + proto_tree_add_uint_format_value(netb_tree, hf_netb_delimiter, tvb, offset + 2, 2, + tvb_get_letohs(tvb, offset + 2), "EFFF (NetBIOS)"); proto_tree_add_uint(netb_tree, hf_netb_cmd, tvb, offset + NB_COMMAND, 1, command); } @@ -1151,7 +1156,7 @@ dissect_netbios(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if ( command < sizeof( dissect_netb)/ sizeof(void *)) { /* branch to handle commands */ - session_id = (dissect_netb[ command])( tvb, offset, netb_tree); + session_id = (dissect_netb[ command])( tvb, pinfo, offset, netb_tree); offset += hdr_len; /* move past header */ @@ -1264,7 +1269,11 @@ proto_register_netbios(void) &cmd_vals_ext, 0x0, NULL, HFILL }}, { &hf_netb_hdr_len, - { "Header Length", "netbios.hdr_len", FT_UINT16, BASE_DEC, + { "Length", "netbios.hdr_len", FT_UINT16, BASE_DEC, + NULL, 0x0, "Header Length", HFILL }}, + + { &hf_netb_delimiter, + { "Delimiter", "netbios.delimiter", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_netb_xmit_corrl, @@ -1383,6 +1392,26 @@ proto_register_netbios(void) { "Sender's Node Address", "netbios.datagram_bcast_mac", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_netb_resync_indicator, + { "Re-sync indicator", "netbios.resync_indicator", FT_UINT16, BASE_HEX, + NULL, 0x0, NULL, HFILL }}, + + { &hf_netb_status_request, + { "Status request", "netbios.status_request", FT_UINT8, BASE_DEC, + NULL, 0x0, NULL, HFILL }}, + + { &hf_netb_local_session_no, + { "Local Session No.", "netbios.local_session_no", FT_UINT8, BASE_HEX, + NULL, 0x0, NULL, HFILL }}, + + { &hf_netb_state_of_name, + { "State of name", "netbios.state_of_name", FT_UINT8, BASE_HEX, + NULL, 0x0, NULL, HFILL }}, + + { &hf_netb_status_response, + { "Status response", "netbios.status_response", FT_UINT8, BASE_DEC, + NULL, 0x0, NULL, HFILL }}, + { &hf_netb_fragment_overlap, { "Fragment overlap", "netbios.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "Fragment overlaps with other fragments", HFILL }}, @@ -1421,11 +1450,20 @@ proto_register_netbios(void) {"Reassembled NetBIOS length", "netbios.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x0, "The total length of the reassembled payload", HFILL }}, }; + + static ei_register_info ei[] = { + { &ei_netb_unknown_command_data, { "netbios.unknown_command_data", PI_UNDECODED, PI_WARN, "Unknown NetBIOS command data", EXPFILL }}, + }; + module_t *netbios_module; + expert_module_t* expert_netbios; proto_netbios = proto_register_protocol("NetBIOS", "NetBIOS", "netbios"); proto_register_subtree_array(ett, array_length(ett)); proto_register_field_array(proto_netbios, hf_netb, array_length(hf_netb)); + expert_netbios = expert_register_protocol(proto_netbios); + expert_register_field_array(expert_netbios, ei, array_length(ei)); + register_heur_dissector_list("netbios", &netbios_heur_subdissector_list); diff --git a/epan/dissectors/packet-ses.c b/epan/dissectors/packet-ses.c index e39fb1abb1..64aceaa182 100644 --- a/epan/dissectors/packet-ses.c +++ b/epan/dissectors/packet-ses.c @@ -29,6 +29,7 @@ #include <epan/wmem/wmem.h> #include <epan/packet.h> +#include <epan/expert.h> #include <epan/prefs.h> #include <epan/asn1.h> #include <epan/conversation.h> @@ -179,6 +180,8 @@ static int hf_large_second_initial_serial_number = -1; /* clses header fields */ static int proto_clses = -1; +static expert_field ei_ses_bad_length = EI_INIT; + #define PROTO_STRING_CLSES "ISO 9548-1 OSI Connectionless Session Protocol" static dissector_handle_t pres_handle = NULL; @@ -366,7 +369,7 @@ get_item_len(tvbuff_t *tvb, int offset, int *len_len) static gboolean dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, proto_tree *param_tree, packet_info *pinfo, guint8 param_type, - guint16 param_len, guint8 *enclosure_item_flags, + guint16 param_len, proto_item *param_len_item, guint8 *enclosure_item_flags, struct SESSION_DATA_STRUCTURE *session) { gboolean has_user_information = TRUE; @@ -425,9 +428,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case Token_Item: if (param_len != 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 1", param_len); break; } if (tree) @@ -452,9 +454,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case Transport_Disconnect: if (param_len != 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 1", param_len); break; } if (tree) @@ -507,9 +508,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case Protocol_Options: if (param_len != 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 1", param_len); break; } if (tree) @@ -529,9 +529,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case Session_Requirement: if (param_len != 2) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 2", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 2", param_len); break; } if (tree) @@ -585,9 +584,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case TSDU_Maximum_Size: if (param_len != 4) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 4", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 4", param_len); break; } if (tree) @@ -604,9 +602,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case Version_Number: if (param_len != 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 1", param_len); break; } if (tree) @@ -638,9 +635,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case EnclosureItem: if (param_len != 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 1", param_len); break; } flags = tvb_get_guint8(tvb, offset); @@ -684,9 +680,8 @@ dissect_parameter(tvbuff_t *tvb, int offset, proto_tree *tree, case Token_Setting_Item: if (param_len != 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be 1", param_len); break; } if (tree) @@ -748,9 +743,8 @@ does not exceed 65 539 octets if Protocol Version 2 has been selected. PICS. */ if (param_len < 1) { - proto_tree_add_text(param_tree, tvb, offset, - param_len, "Length is %u, should be >= 1", - param_len); + expert_add_info_format(pinfo, param_len_item, &ei_ses_bad_length, + "Length is %u, should be >= 1", param_len); break; } if (tree) @@ -849,7 +843,7 @@ dissect_parameter_group(tvbuff_t *tvb, int offset, proto_tree *tree, guint8 *enclosure_item_flags, struct SESSION_DATA_STRUCTURE *session) { gboolean has_user_information = TRUE; - proto_item *ti; + proto_item *ti, *param_len_item; proto_tree *param_tree; guint8 param_type; const char *param_str; @@ -883,7 +877,7 @@ dissect_parameter_group(tvbuff_t *tvb, int offset, proto_tree *tree, return has_user_information; } proto_item_set_len(ti, 1 + len_len + param_len); - proto_tree_add_text(param_tree, tvb, offset, len_len, + param_len_item = proto_tree_add_text(param_tree, tvb, offset, len_len, "Parameter length: %u", param_len); offset += len_len; @@ -904,7 +898,7 @@ dissect_parameter_group(tvbuff_t *tvb, int offset, proto_tree *tree, default: if (!dissect_parameter(tvb, offset, tree, - param_tree, pinfo, param_type, param_len, + param_tree, pinfo, param_type, param_len, param_len_item, enclosure_item_flags, session)) has_user_information = FALSE; break; @@ -926,7 +920,7 @@ dissect_parameters(tvbuff_t *tvb, int offset, guint16 len, proto_tree *tree, guint8 *enclosure_item_flags, struct SESSION_DATA_STRUCTURE *session) { gboolean has_user_information = TRUE; - proto_item *ti; + proto_item *ti, *param_len_item; proto_tree *param_tree; guint8 param_type; const char *param_str; @@ -960,7 +954,7 @@ dissect_parameters(tvbuff_t *tvb, int offset, guint16 len, proto_tree *tree, return has_user_information; } proto_item_set_len(ti, 1 + len_len + param_len); - proto_tree_add_text(param_tree, tvb, offset, len_len, + param_len_item = proto_tree_add_text(param_tree, tvb, offset, len_len, "Parameter length: %u", param_len); offset += len_len; @@ -991,7 +985,7 @@ dissect_parameters(tvbuff_t *tvb, int offset, guint16 len, proto_tree *tree, /* everything else is a PI */ default: if (!dissect_parameter(tvb, offset, tree, - param_tree, pinfo, param_type, param_len, + param_tree, pinfo, param_type, param_len, param_len_item, enclosure_item_flags, session)) has_user_information = FALSE; break; @@ -1903,11 +1897,19 @@ proto_register_ses(void) &ett_ses_segment, &ett_ses_segments }; + + static ei_register_info ei[] = { + { &ei_ses_bad_length, { "ses.bad_length", PI_MALFORMED, PI_ERROR, "Bad length", EXPFILL }}, + }; + module_t *ses_module; + expert_module_t* expert_ses; proto_ses = proto_register_protocol(PROTO_STRING_SES, "SES", "ses"); proto_register_field_array(proto_ses, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); + expert_ses = expert_register_protocol(proto_ses); + expert_register_field_array(expert_ses, ei, array_length(ei)); register_init_routine (&ses_reassemble_init); diff --git a/epan/dissectors/packet-sna.c b/epan/dissectors/packet-sna.c index 2962372e48..aff53a548f 100644 --- a/epan/dissectors/packet-sna.c +++ b/epan/dissectors/packet-sna.c @@ -249,6 +249,7 @@ static int hf_sna_control_05_ptp = -1; static int hf_sna_control_0e_type = -1; static int hf_sna_control_0e_value = -1; static int hf_sna_padding = -1; +static int hf_sna_reserved = -1; static gint ett_sna = -1; static gint ett_sna_th = -1; @@ -839,7 +840,7 @@ dissect_optional_0d(tvbuff_t *tvb, proto_tree *tree) proto_tree_add_boolean(sub_tree, hf_sna_nlp_opti_0d_dedicated, tvb, 4, 1, bits); - proto_tree_add_text(tree, tvb, 5, 3, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 5, 3, ENC_NA); offset = 8; @@ -849,8 +850,7 @@ dissect_optional_0d(tvbuff_t *tvb, proto_tree *tree) dissect_control(tvb, offset, len, tree, 1, LT); pad = (len+3) & 0xfffc; if (pad > len) - proto_tree_add_text(tree, tvb, offset+len, - pad-len, "Padding"); + proto_tree_add_item(tree, hf_sna_padding, tvb, offset+len, pad-len, ENC_NA); offset += pad; } else { /* Avoid endless loop */ @@ -887,7 +887,7 @@ dissect_optional_0e(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) tvb, 6, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_sna_nlp_opti_0e_rseq, tvb, 8, 4, ENC_BIG_ENDIAN); - proto_tree_add_text(tree, tvb, 12, 8, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 12, 8, ENC_NA); if (tvb_offset_exists(tvb, offset)) call_dissector(data_handle, @@ -918,7 +918,7 @@ dissect_optional_10(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (!tree) return; - proto_tree_add_text(tree, tvb, 2, 2, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 2, 2, ENC_NA); proto_tree_add_item(tree, hf_sna_nlp_opti_10_tcid, tvb, 4, 8, ENC_NA); if (tvb_offset_exists(tvb, 12)) call_dissector(data_handle, @@ -928,10 +928,7 @@ dissect_optional_10(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static void dissect_optional_12(tvbuff_t *tvb, proto_tree *tree) { - if (!tree) - return; - - proto_tree_add_text(tree, tvb, 2, 2, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 2, 2, ENC_NA); proto_tree_add_item(tree, hf_sna_nlp_opti_12_sense, tvb, 4, -1, ENC_NA); } @@ -942,10 +939,7 @@ dissect_optional_14(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_item *bf_item; int len, pad, type, bits, offset, num, sublen; - if (!tree) - return; - - proto_tree_add_text(tree, tvb, 2, 2, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 2, 2, ENC_NA); offset = 4; @@ -984,7 +978,7 @@ dissect_optional_14(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree_add_boolean(bf_tree, hf_sna_nlp_opti_14_si_mnpsrscv, tvb, offset+2, 1, bits); - proto_tree_add_text(sub_tree, tvb, offset+3, 1, "Reserved"); + proto_tree_add_item(sub_tree, hf_sna_reserved, tvb, offset+3, 1, ENC_NA); proto_tree_add_item(sub_tree, hf_sna_nlp_opti_14_si_maxpsize, tvb, offset+4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(sub_tree, hf_sna_nlp_opti_14_si_switch, @@ -1243,13 +1237,10 @@ dissect_nlp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, nhdr_x = tvb_get_guint8(tvb, indx + counter); counter ++; } while (nhdr_x != 0xff); - if (tree) - proto_tree_add_item(nlp_tree, + proto_tree_add_item(nlp_tree, hf_sna_nlp_fra, tvb, indx, counter, ENC_NA); indx += counter; - if (tree) - proto_tree_add_text(nlp_tree, tvb, indx, 1, - "Reserved"); + proto_tree_add_item(nlp_tree, hf_sna_reserved, tvb, indx, 1, ENC_NA); indx++; if (tree) @@ -1279,9 +1270,7 @@ dissect_nlp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tvb, indx, counter, ENC_NA); indx += counter; - if (tree) - proto_tree_add_text(nlp_tree, tvb, indx, 1, - "Reserved"); + proto_tree_add_item(nlp_tree, hf_sna_reserved, tvb, indx, 1, ENC_NA); indx++; if (tree) @@ -1392,10 +1381,7 @@ dissect_nlp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void dissect_xid1(tvbuff_t *tvb, proto_tree *tree) { - if (!tree) - return; - - proto_tree_add_text(tree, tvb, 0, 2, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 0, 2, ENC_NA); } @@ -1428,7 +1414,7 @@ dissect_xid3(tvbuff_t *tvb, proto_tree *tree) if (!tree) return; - proto_tree_add_text(tree, tvb, 0, 2, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 0, 2, ENC_NA); val = tvb_get_ntohs(tvb, 2); @@ -1486,7 +1472,7 @@ dissect_xid3(tvbuff_t *tvb, proto_tree *tree) proto_tree_add_boolean(sub_tree, hf_sna_xid_3_negcsup, tvb, 6, 1, val); proto_tree_add_boolean(sub_tree, hf_sna_xid_3_negcomp, tvb, 6, 1, val); - proto_tree_add_text(tree, tvb, 7, 2, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 7, 2, ENC_NA); val = tvb_get_guint8(tvb, 9); @@ -1733,7 +1719,7 @@ dissect_fid0_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree_add_uint(bf_tree, hf_sna_th_efi, tvb, 0, 1, th_0); /* Byte 1 */ - proto_tree_add_text(tree, tvb, 1, 1, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 1, 1, ENC_NA); /* Bytes 2-3 */ proto_tree_add_item(tree, hf_sna_th_daf, tvb, 2, 2, ENC_BIG_ENDIAN); @@ -1793,7 +1779,7 @@ dissect_fid2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Byte 1 */ - proto_tree_add_text(tree, tvb, 1, 1, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 1, 1, ENC_NA); /* Byte 2 */ proto_tree_add_item(tree, hf_sna_th_daf, tvb, 2, 1, ENC_NA); @@ -2077,7 +2063,7 @@ dissect_fid5(tvbuff_t *tvb, proto_tree *tree) proto_tree_add_uint(bf_tree, hf_sna_th_mpf, tvb, 0, 1, th_0); proto_tree_add_uint(bf_tree, hf_sna_th_efi, tvb, 0, 1, th_0); - proto_tree_add_text(tree, tvb, 1, 1, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 1, 1, ENC_NA); proto_tree_add_item(tree, hf_sna_th_snf, tvb, 2, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_sna_th_sa, tvb, 4, 8, ENC_NA); @@ -2107,14 +2093,14 @@ dissect_fidf(tvbuff_t *tvb, proto_tree *tree) bf_tree = proto_item_add_subtree(bf_item, ett_sna_th_fid); proto_tree_add_uint(bf_tree, hf_sna_th_fid, tvb, 0, 1, th_0); - proto_tree_add_text(tree, tvb, 1, 1, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 1, 1, ENC_NA); proto_tree_add_item(tree, hf_sna_th_cmd_fmt, tvb, 2, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_sna_th_cmd_type, tvb, 3, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_sna_th_cmd_sn, tvb, 4, 2, ENC_BIG_ENDIAN); /* Yup, bytes 6-23 are reserved! */ - proto_tree_add_text(tree, tvb, 6, 18, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 6, 18, ENC_NA); proto_tree_add_item(tree, hf_sna_th_dcf, tvb, 24, 2, ENC_BIG_ENDIAN); @@ -2339,7 +2325,7 @@ dissect_control_05hpr(tvbuff_t *tvb, proto_tree *tree, int hpr, bf_tree = proto_item_add_subtree(bf_item, ett_sna_control_05hpr_type); proto_tree_add_boolean(bf_tree, hf_sna_control_05_ptp, tvb, 2, 1, type); - proto_tree_add_text(tree, tvb, 3, 1, "Reserved"); + proto_tree_add_item(tree, hf_sna_reserved, tvb, 3, 1, ENC_NA); offset = 4; @@ -3470,6 +3456,10 @@ proto_register_sna(void) { &hf_sna_padding, { "Padding", "sna.padding", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }}, + + { &hf_sna_reserved, + { "Reserved", "sna.reserved", + FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }}, }; static gint *ett[] = { &ett_sna, diff --git a/epan/dissectors/packet-spice.c b/epan/dissectors/packet-spice.c index 3ae4f54abb..886f76d777 100644 --- a/epan/dissectors/packet-spice.c +++ b/epan/dissectors/packet-spice.c @@ -684,6 +684,7 @@ static int hf_vd_agent_reply_type = -1; static int hf_vd_agent_reply_error = -1; static expert_field ei_spice_decompress_error = EI_INIT; +static expert_field ei_spice_unknown_message = EI_INIT; static dissector_handle_t jpeg_handle; @@ -1545,7 +1546,7 @@ dissect_spice_mini_data_header(tvbuff_t *tvb, proto_tree *tree, const spice_conv static void dissect_spice_data_header(tvbuff_t *tvb, proto_tree *tree, const spice_conversation_t *spice_info, - const gboolean client_message, const guint16 message_type, guint32 *sublist_size, guint32 offset) + const gboolean client_message, const guint16 message_type, proto_item** msgtype_item, guint32 *sublist_size, guint32 offset) { proto_tree* subtree; *sublist_size = tvb_get_letohl(tvb, offset + 14); @@ -1555,7 +1556,7 @@ dissect_spice_data_header(tvbuff_t *tvb, proto_tree *tree, const spice_conversat offset += 8; subtree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_common_client_message, NULL, "Message type: %s (%d)", get_message_type_string(message_type, spice_info, client_message), message_type); - proto_tree_add_item(subtree, hf_message_type, tvb, offset, 2, ENC_LITTLE_ENDIAN); + *msgtype_item = proto_tree_add_item(subtree, hf_message_type, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; offset += 2; proto_tree_add_item(tree, hf_data_size, tvb, offset, 4, ENC_LITTLE_ENDIAN); @@ -1566,7 +1567,7 @@ dissect_spice_data_header(tvbuff_t *tvb, proto_tree *tree, const spice_conversat static guint32 -dissect_spice_common_client_messages(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_common_client_messages(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { switch (message_type) { case SPICE_MSGC_ACK_SYNC: @@ -1587,7 +1588,7 @@ dissect_spice_common_client_messages(tvbuff_t *tvb, proto_tree *tree, const guin case SPICE_MSGC_DISCONNECTING: */ default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown common client message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown common client message - cannot dissect"); break; } @@ -1595,7 +1596,8 @@ dissect_spice_common_client_messages(tvbuff_t *tvb, proto_tree *tree, const guin } static guint32 -dissect_spice_common_server_messages(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset, const guint32 total_message_size) +dissect_spice_common_server_messages(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, + guint32 offset, const guint32 total_message_size) { guint32 message_len; @@ -1640,14 +1642,14 @@ dissect_spice_common_server_messages(tvbuff_t *tvb, proto_tree *tree, const guin offset += (message_len + 1); break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown common server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown common server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_record_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_record_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { proto_tree *record_tree; @@ -1661,7 +1663,7 @@ dissect_spice_record_client(tvbuff_t *tvb, proto_tree *tree, const guint16 messa /* TODO - mode dependant, there may be more data here */ break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown record client message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown record client message - cannot dissect"); break; } @@ -1669,7 +1671,7 @@ dissect_spice_record_client(tvbuff_t *tvb, proto_tree *tree, const guint16 messa } static guint32 -dissect_spice_display_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_display_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { switch (message_type) { case SPICE_MSGC_DISPLAY_INIT: @@ -1683,7 +1685,7 @@ dissect_spice_display_client(tvbuff_t *tvb, proto_tree *tree, const guint16 mess offset += 4; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown display client message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown display client message - cannot dissect"); break; } @@ -1691,7 +1693,7 @@ dissect_spice_display_client(tvbuff_t *tvb, proto_tree *tree, const guint16 mess } static guint32 -dissect_spice_display_server(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, const guint16 message_type, guint32 offset) +dissect_spice_display_server(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { guint32 data_size, displayBaseLen; guint8 clip_type; @@ -1970,14 +1972,15 @@ dissect_spice_display_server(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo offset += 4; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown display server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown display server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_playback_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 message_size, spice_conversation_t *spice_info, guint32 offset) +dissect_spice_playback_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, + guint32 message_size, spice_conversation_t *spice_info, guint32 offset) { guint8 num_channels, i; proto_tree* subtree; @@ -2028,14 +2031,14 @@ dissect_spice_playback_server(tvbuff_t *tvb, proto_tree *tree, const guint16 mes offset += 4; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown playback server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown playback server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_cursor_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_cursor_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { guint32 RedCursorSize; @@ -2080,14 +2083,14 @@ dissect_spice_cursor_server(tvbuff_t *tvb, proto_tree *tree, const guint16 messa case SPICE_MSG_CURSOR_INVAL_ALL: break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown cursor server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown cursor server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_record_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_record_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { guint8 num_channels, i; proto_tree* subtree; @@ -2110,14 +2113,14 @@ dissect_spice_record_server(tvbuff_t *tvb, proto_tree *tree, const guint16 messa offset += 1; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown record server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown record server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_agent_message(tvbuff_t *tvb, proto_tree *tree, const guint32 message_type, guint32 message_len, guint32 offset) +dissect_spice_agent_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint32 message_type, proto_item* msgtype_item, guint32 message_len, guint32 offset) { proto_tree *agent_tree; guint32 n_monitors = 0, i; @@ -2193,7 +2196,7 @@ dissect_spice_agent_message(tvbuff_t *tvb, proto_tree *tree, const guint32 messa proto_tree_add_text(tree, tvb, offset, 0, "VD_AGENT_CLIPBOARD_RELEASE message"); break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown agent message (%u) - cannot dissect", message_type); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown agent message (%u) - cannot dissect", message_type); break; } return offset; @@ -2222,7 +2225,7 @@ dissect_supported_mouse_modes(tvbuff_t *tvb, proto_tree *tree, guint32 offset, g } static guint32 -dissect_spice_main_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_main_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { guint32 num_channels, i, agent_msg_type, agent_msg_len, name_len, data_size; proto_tree *subtree = NULL; @@ -2309,7 +2312,7 @@ dissect_spice_main_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message proto_tree_add_item(tree, hf_agent_size, tvb, offset, 4, ENC_LITTLE_ENDIAN); agent_msg_len = tvb_get_letohl(tvb, offset); offset += 4; - offset = dissect_spice_agent_message(tvb, tree, agent_msg_type, agent_msg_len, offset); + offset = dissect_spice_agent_message(tvb, pinfo, tree, agent_msg_type, msgtype_item, agent_msg_len, offset); break; case SPICE_MSG_MAIN_AGENT_TOKEN: case SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS: @@ -2334,14 +2337,14 @@ dissect_spice_main_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message case SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK: break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown main server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown main server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_main_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_main_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { proto_tree *main_tree; guint32 agent_msg_type, agent_msg_len; @@ -2370,10 +2373,10 @@ dissect_spice_main_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message proto_tree_add_item(main_tree, hf_agent_size, tvb, offset, 4, ENC_LITTLE_ENDIAN); agent_msg_len = tvb_get_letohl(tvb, offset); offset += 4; - offset = dissect_spice_agent_message(tvb, main_tree, agent_msg_type, agent_msg_len, offset); + offset = dissect_spice_agent_message(tvb, pinfo, main_tree, agent_msg_type, msgtype_item, agent_msg_len, offset); break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown main client message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown main client message - cannot dissect"); break; } return offset; @@ -2395,7 +2398,7 @@ dissect_spice_keyboard_modifiers(tvbuff_t *tvb, proto_tree *tree, guint32 offset } static guint32 -dissect_spice_inputs_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_inputs_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { proto_tree *inputs_tree; @@ -2444,14 +2447,14 @@ dissect_spice_inputs_client(tvbuff_t *tvb, proto_tree *tree, const guint16 messa offset += 1; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown inputs client message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown inputs client message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_inputs_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_inputs_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { switch (message_type) { case SPICE_MSG_INPUTS_INIT: @@ -2464,62 +2467,62 @@ dissect_spice_inputs_server(tvbuff_t *tvb, proto_tree *tree, const guint16 messa proto_tree_add_text(tree, tvb, offset, 0, "Server INPUTS_MOUSE_MOTION_ACK message"); break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown inputs server message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown inputs server message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_tunnel_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_tunnel_client(packet_info *pinfo, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { /* TODO: Not implemented yet */ switch (message_type) { default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_tunnel_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_tunnel_server(packet_info *pinfo, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { /* TODO: Not implemented yet */ switch (message_type) { default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_smartcard_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_smartcard_client(packet_info *pinfo, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { /* TODO: Not implemented yet */ switch (message_type) { default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_smartcard_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset) +dissect_spice_smartcard_server(packet_info *pinfo, const guint16 message_type, proto_item* msgtype_item, guint32 offset) { /* TODO: Not implemented yet */ switch (message_type) { default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_usbredir_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 message_size, guint32 offset) +dissect_spice_usbredir_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 message_size, guint32 offset) { switch (message_type) { case SPICE_MSGC_SPICEVMC_DATA: @@ -2527,14 +2530,14 @@ dissect_spice_usbredir_client(tvbuff_t *tvb, proto_tree *tree, const guint16 mes offset += message_size; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_usbredir_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 message_size, guint32 offset) +dissect_spice_usbredir_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 message_size, guint32 offset) { switch (message_type) { case SPICE_MSG_SPICEVMC_DATA: @@ -2542,14 +2545,14 @@ dissect_spice_usbredir_server(tvbuff_t *tvb, proto_tree *tree, const guint16 mes offset += message_size; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_port_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 message_size, guint32 offset) +dissect_spice_port_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 message_size, guint32 offset) { switch (message_type) { case SPICE_MSGC_SPICEVMC_DATA: @@ -2561,14 +2564,14 @@ dissect_spice_port_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message offset += 1; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; } static guint32 -dissect_spice_port_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 message_size, guint32 offset) +dissect_spice_port_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint16 message_type, proto_item* msgtype_item, guint32 message_size, guint32 offset) { switch (message_type) { case SPICE_MSG_SPICEVMC_DATA: @@ -2591,7 +2594,7 @@ dissect_spice_port_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message offset += 1; break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown message - cannot dissect"); + expert_add_info_format(pinfo, msgtype_item, &ei_spice_unknown_message, "Unknown message - cannot dissect"); break; } return offset; @@ -2601,7 +2604,7 @@ dissect_spice_port_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message static guint32 dissect_spice_data_server_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, spice_conversation_t *spice_info, guint32 offset, const guint32 total_message_size) { - proto_item *ti = NULL, *msg_ti=NULL; + proto_item *ti = NULL, *msg_ti=NULL, *msgtype_ti=NULL; proto_tree *data_header_tree, *message_tree; guint16 message_type; guint32 message_size, sublist_size, old_offset; @@ -2629,7 +2632,7 @@ dissect_spice_data_server_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf message_size + header_size); ti = proto_tree_add_item(message_tree, hf_data, tvb, offset, header_size, ENC_NA); data_header_tree = proto_item_add_subtree(ti, ett_data); - dissect_spice_data_header(tvb, data_header_tree, spice_info, FALSE, message_type, &sublist_size, offset); + dissect_spice_data_header(tvb, data_header_tree, spice_info, FALSE, message_type, &msgtype_ti, &sublist_size, offset); } proto_item_set_len(msg_ti, message_size + header_size); offset += header_size; @@ -2637,43 +2640,43 @@ dissect_spice_data_server_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf col_append_str(pinfo->cinfo, COL_INFO, get_message_type_string(message_type, spice_info, FALSE)); if (message_type < SPICE_FIRST_AVAIL_MESSAGE) { /* this is a common message */ - offset = dissect_spice_common_server_messages(tvb, message_tree, message_type, offset, total_message_size - header_size); + offset = dissect_spice_common_server_messages(tvb, pinfo, message_tree, message_type, msgtype_ti, offset, total_message_size - header_size); return offset; } switch (spice_info->channel_type) { case SPICE_CHANNEL_PLAYBACK: - offset = dissect_spice_playback_server(tvb, message_tree, message_type, message_size, spice_info, offset); + offset = dissect_spice_playback_server(tvb, pinfo, message_tree, message_type, msgtype_ti, message_size, spice_info, offset); break; case SPICE_CHANNEL_RECORD: - offset = dissect_spice_record_server(tvb, message_tree, message_type, offset); + offset = dissect_spice_record_server(tvb, pinfo, message_tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_MAIN: - offset = dissect_spice_main_server(tvb, message_tree, message_type, offset); + offset = dissect_spice_main_server(tvb, pinfo, message_tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_CURSOR: - offset = dissect_spice_cursor_server(tvb, message_tree, message_type, offset); + offset = dissect_spice_cursor_server(tvb, pinfo, message_tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_DISPLAY: - offset = dissect_spice_display_server(tvb, message_tree, pinfo, message_type, offset); + offset = dissect_spice_display_server(tvb, message_tree, pinfo, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_INPUTS: - offset = dissect_spice_inputs_server(tvb, message_tree, message_type, offset); + offset = dissect_spice_inputs_server(tvb, pinfo, message_tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_TUNNEL: - offset = dissect_spice_tunnel_server(tvb, message_tree, message_type, offset); + offset = dissect_spice_tunnel_server(pinfo, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_SMARTCARD: - offset = dissect_spice_smartcard_server(tvb, message_tree, message_type, offset); + offset = dissect_spice_smartcard_server(pinfo, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_USBREDIR: - offset = dissect_spice_usbredir_server(tvb, message_tree, message_type, message_size, offset); + offset = dissect_spice_usbredir_server(tvb, pinfo, message_tree, message_type, msgtype_ti, message_size, offset); break; case SPICE_CHANNEL_PORT: - offset = dissect_spice_port_server(tvb, message_tree, message_type, message_size, offset); + offset = dissect_spice_port_server(tvb, pinfo, message_tree, message_type, msgtype_ti, message_size, offset); break; default: - proto_tree_add_text(message_tree, tvb, offset, 0, "Unknown server PDU - cannot dissect"); + expert_add_info_format(pinfo, msgtype_ti, &ei_spice_unknown_message, "Unknown server PDU - cannot dissect"); } if ((offset - old_offset) != message_size) { @@ -2690,7 +2693,7 @@ dissect_spice_data_server_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf static guint32 dissect_spice_data_client_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, spice_conversation_t *spice_info, guint32 offset) { - proto_item *ti = NULL; + proto_item *ti = NULL, *msgtype_ti = NULL; proto_tree *data_header_tree; guint16 message_type; guint32 message_size = 0, sublist_size; @@ -2709,7 +2712,7 @@ dissect_spice_data_client_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf data_header_tree = proto_item_add_subtree(ti, ett_data); message_type = tvb_get_letohs(tvb, offset + 8); message_size = tvb_get_letohl(tvb, offset + 10); - dissect_spice_data_header(tvb, data_header_tree, spice_info, TRUE, message_type, &sublist_size, offset); + dissect_spice_data_header(tvb, data_header_tree, spice_info, TRUE, message_type, &msgtype_ti, &sublist_size, offset); } col_append_str(pinfo->cinfo, COL_INFO, get_message_type_string(message_type, spice_info, TRUE)); offset += header_size; @@ -2717,38 +2720,38 @@ dissect_spice_data_client_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf /* it cannot be implemented in the dissector yet. */ if (message_type < SPICE_FIRST_AVAIL_MESSAGE) { /* this is a common message */ - return dissect_spice_common_client_messages(tvb, tree, message_type, offset); + return dissect_spice_common_client_messages(tvb, pinfo, tree, message_type, msgtype_ti, offset); } switch (spice_info->channel_type) { case SPICE_CHANNEL_PLAYBACK: break; case SPICE_CHANNEL_RECORD: - offset = dissect_spice_record_client(tvb, tree, message_type, offset); + offset = dissect_spice_record_client(tvb, pinfo, tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_MAIN: - offset = dissect_spice_main_client(tvb, tree, message_type, offset); + offset = dissect_spice_main_client(tvb, pinfo, tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_DISPLAY: - offset = dissect_spice_display_client(tvb, tree, message_type, offset); + offset = dissect_spice_display_client(tvb, pinfo, tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_INPUTS: - offset = dissect_spice_inputs_client(tvb, tree, message_type, offset); + offset = dissect_spice_inputs_client(tvb, pinfo, tree, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_TUNNEL: - offset = dissect_spice_tunnel_client(tvb, tree, message_type, offset); + offset = dissect_spice_tunnel_client(pinfo, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_SMARTCARD: - offset = dissect_spice_smartcard_client(tvb, tree, message_type, offset); + offset = dissect_spice_smartcard_client(pinfo, message_type, msgtype_ti, offset); break; case SPICE_CHANNEL_USBREDIR: - offset = dissect_spice_usbredir_client(tvb, tree, message_type, message_size, offset); + offset = dissect_spice_usbredir_client(tvb, pinfo, tree, message_type, msgtype_ti, message_size, offset); break; case SPICE_CHANNEL_PORT: - offset = dissect_spice_port_client(tvb, tree, message_type, message_size, offset); + offset = dissect_spice_port_client(tvb, pinfo, tree, message_type, msgtype_ti, message_size, offset); break; default: - proto_tree_add_text(tree, tvb, offset, 0, "Unknown client PDU - cannot dissect"); + expert_add_info_format(pinfo, msgtype_ti, &ei_spice_unknown_message, "Unknown client PDU - cannot dissect"); break; } @@ -4487,6 +4490,7 @@ proto_register_spice(void) static ei_register_info ei[] = { { &ei_spice_decompress_error, { "spice.decompress_error", PI_PROTOCOL, PI_WARN, "Error: Unable to decompress content", EXPFILL }}, + { &ei_spice_unknown_message, { "spice.unknown_message", PI_UNDECODED, PI_WARN, "Unknown message - cannot dissect", EXPFILL }}, }; expert_module_t* expert_spice; diff --git a/epan/dissectors/packet-tipc.c b/epan/dissectors/packet-tipc.c index 667e257c9a..ae93661a63 100644 --- a/epan/dissectors/packet-tipc.c +++ b/epan/dissectors/packet-tipc.c @@ -34,6 +34,7 @@ #include <glib.h> #include <epan/packet.h> +#include <epan/expert.h> #include <epan/etypes.h> #include <epan/wmem/wmem.h> #include <epan/reassemble.h> @@ -97,6 +98,7 @@ static int hf_tipc_seq_gap = -1; static int hf_tipc_nxt_snt_pkg = -1; static int hf_tipc_unused3 = -1; static int hf_tipc_bearer_name = -1; +static int hf_tipc_data = -1; static int hf_tipc_name_dist_type = -1; static int hf_tipc_name_dist_lower = -1; @@ -183,6 +185,8 @@ static gint ett_tipc_msg_fragments = -1; static gint ett_tipc = -1; static gint ett_tipc_data = -1; +static expert_field ei_tipc_words_unused_for_user = EI_INIT; + /* protocol preferences */ static gboolean tipc_defragment = TRUE; static gboolean dissect_tipc_data = TRUE; @@ -867,11 +871,11 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W4-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20, "words 4-8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 20, "words 4-8 unused for this user"); offset = offset + 20; } else { /* W4 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 4 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 4 unused for this user"); offset = offset + 4; /* W5 */ proto_tree_add_item(tipc_tree, hf_tipcv2_network_id, tipc_tvb, offset, 4, ENC_BIG_ENDIAN); @@ -887,7 +891,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ @@ -899,7 +903,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i if (handle_v2_as & (V2_AS_1_6)) { /* W1+W2 */ /* No message types */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 1+2 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 8, "words 1+2 unused for this user"); offset = offset + 8; } else { /* W1 */ @@ -918,11 +922,11 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W4-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20, "words 4-8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 20, "words 4-8 unused for this user"); offset = offset + 20; } else { /* W4+5 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 4+5 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 8, "words 4+5 unused for this user"); offset = offset + 8; /* W6 */ dword = tvb_get_ntohl(tipc_tvb, offset); @@ -935,7 +939,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ @@ -1013,7 +1017,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W6-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 12, "words 6-8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 12, "words 6-8 unused for this user"); offset = offset + 12; } else { /* W6 */ @@ -1104,7 +1108,8 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i /* according to Allan Stephens this was never verfied by the receiver proto_tree_add_item(tipc_tree, hf_tipcv2_transport_seq_no, tipc_tvb, offset, 4, ENC_BIG_ENDIAN); */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user (might be set prior to 1.7.3 but was never verified)"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, + "word 8 unused for this user (might be set prior to 1.7.3 but was never verified)"); offset = offset + 4; @@ -1149,11 +1154,11 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i if (handle_v2_as & V2_AS_1_6) { /* W4-9 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 24, "words 4-9 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 24, "words 4-9 unused for this user"); offset = offset + 24; } else { /* W4 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 4 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 4 unused for this user"); offset = offset + 4; /* W5 */ proto_tree_add_item(tipc_tree, hf_tipc_dst_port, tipc_tvb, offset, 4, ENC_BIG_ENDIAN); @@ -1169,7 +1174,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; /* W9 */ dword = tvb_get_ntohl(tipc_tvb, offset); @@ -1238,7 +1243,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W4 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 4 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 4 unused for this user"); offset = offset + 4; /* W5 */ /* the following two fields appear in this user according to */ @@ -1253,7 +1258,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i /* W6-W8 */ if (handle_v2_as & (V2_AS_1_6)) { /* W6-8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 12, "words 6-8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 12, "words 6-8 unused for this user"); offset = offset + 12; } else { /* W6 */ @@ -1267,7 +1272,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ @@ -1275,7 +1280,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i { case 0: /* DUPLICATE_MSG */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 9 unused for this message type"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 9 unused for this message type"); break; case 1: /* ORIGINAL_MSG */ @@ -1302,7 +1307,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_prev_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W4+W5 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 4+5 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 8, "words 4+5 unused for this user"); offset = offset + 8; /* W6 */ /* Originating Node: 32 bits. */ @@ -1322,12 +1327,12 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_item(tipc_tree, hf_tipcv2_transport_seq_no, tipc_tvb, offset, 4, ENC_BIG_ENDIAN); offset = offset + 4; } else { - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 8 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 8 unused for this user"); offset = offset + 4; } /* W9 */ if (handle_v2_as & V2_AS_1_6) { - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 9 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 9 unused for this user"); offset = offset + 4; } else { dword = tvb_get_ntohl(tipc_tvb, offset); @@ -1365,11 +1370,11 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i offset = offset + 4; if (handle_v2_as & (V2_AS_1_6)) { /* W5-W9 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 20, "words 5-9 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 20, "words 5-9 unused for this user"); offset = offset + 20; } else { /* W5 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 4, "word 5 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 4, "word 5 unused for this user"); offset = offset + 4; /* W6 */ dword = tvb_get_ntohl(tipc_tvb, offset); @@ -1382,7 +1387,7 @@ dissect_tipc_v2_internal_msg(tvbuff_t *tipc_tvb, proto_tree *tipc_tree, packet_i proto_tree_add_string(tipc_tree, hf_tipcv2_dest_node, tipc_tvb, offset, 4, addr_str_ptr); offset = offset + 4; /* W8+9 */ - proto_tree_add_text(tipc_tree, tipc_tvb, offset, 8, "words 8+9 unused for this user"); + proto_tree_add_expert_format(tipc_tree, pinfo, &ei_tipc_words_unused_for_user, tipc_tvb, offset, 8, "words 8+9 unused for this user"); offset = offset + 8; } @@ -1997,7 +2002,7 @@ dissect_tipc_int_prot_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tipc_tr } break; default: - proto_tree_add_text(tipc_tree, tvb, offset, -1, "%u bytes Data", (msg_size - 28)); + proto_tree_add_item(tipc_tree, hf_tipc_data, tvb, offset, -1, ENC_NA); break; } } @@ -2216,7 +2221,7 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ should be by far the most frequent one this small optimization pays off. */ if (hdr_size <= 6) { - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); + proto_tree_add_item(tipc_tree, hf_tipc_data, tipc_tvb, offset, -1, ENC_NA); } else { switch (user) { case TIPC_NAME_DISTRIBUTOR: @@ -2280,18 +2285,18 @@ dissect_tipc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ guint32 *name_type_p = &msg_type32; switch (msg_type) { case TIPC_CONNECTED_MSG: - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); + proto_tree_add_item(tipc_tree, hf_tipc_data, tipc_tvb, offset, -1, ENC_NA); break; case TIPC_NAMED_MSG: data_tvb = tvb_new_subset_remaining(tipc_tvb, offset+14); proto_tree_add_text(tipc_tree, tipc_tvb, offset, 14, "TIPC_NAMED_MSG Hdr"); - proto_tree_add_text(tipc_tree, data_tvb, 0, -1, "%u bytes Data", (msg_size - hdr_size*4)); + proto_tree_add_item(tipc_tree, hf_tipc_data, data_tvb, 0, -1, ENC_NA); break; case TIPC_DIRECT_MSG: - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); + proto_tree_add_item(tipc_tree, hf_tipc_data, tipc_tvb, offset, -1, ENC_NA); break; default: - proto_tree_add_text(tipc_tree, tipc_tvb, offset, -1, "%u bytes Data", (msg_size - hdr_size*4)); + proto_tree_add_item(tipc_tree, hf_tipc_data, tipc_tvb, offset, -1, ENC_NA); break; } /* tipc data type user doesn't change format, reuse v2 function */ @@ -2538,6 +2543,11 @@ proto_register_tipc(void) FT_STRINGZ, BASE_NONE, NULL, 0x0, "TIPC Bearer name", HFILL } }, + { &hf_tipc_data, + { "Data", "tipc.data", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_tipc_name_dist_type, { "Published port name type", "tipc.name_dist_type", FT_UINT32, BASE_DEC, NULL, 0xffffffff, @@ -2890,7 +2900,12 @@ proto_register_tipc(void) &ett_tipc_msg_fragments }; + static ei_register_info ei[] = { + { &ei_tipc_words_unused_for_user, { "tipc.words_unused_for_user", PI_PROTOCOL, PI_WARN, "words unused for this user", EXPFILL }}, + }; + module_t *tipc_module; + expert_module_t* expert_tipc; /* options for the enum in the protocol preferences */ static const enum_val_t handle_v2_as_options[] = { @@ -2907,6 +2922,8 @@ proto_register_tipc(void) /* Required function calls to register the header fields and subtrees used */ proto_register_field_array(proto_tipc, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); + expert_tipc = expert_register_protocol(proto_tipc); + expert_register_field_array(expert_tipc, ei, array_length(ei)); /* allow other protocols to be called according to specific values in order to * dissect the protocols sent by TIPC */ |