aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2014-09-11 16:43:00 -0400
committerAnders Broman <a.broman58@gmail.com>2014-09-12 05:51:11 +0000
commit3df42e79a54af411d3b197f461e8f98913cce59e (patch)
tree3313b9bf2326667ac80f1c3302c4ed90c25293e7
parent47c592938ba9f0caeacc4c2ccadb370e72f293a2 (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>
-rw-r--r--epan/dissectors/packet-bgp.c343
-rw-r--r--epan/dissectors/packet-bssap.c56
-rw-r--r--epan/dissectors/packet-dlsw.c34
-rw-r--r--epan/dissectors/packet-fcfcs.c38
-rw-r--r--epan/dissectors/packet-fcswils.c2
-rw-r--r--epan/dissectors/packet-gsm_a_bssmap.c58
-rw-r--r--epan/dissectors/packet-gtpv2.c18
-rw-r--r--epan/dissectors/packet-lmp.c80
-rw-r--r--epan/dissectors/packet-mpls-echo.c14
-rw-r--r--epan/dissectors/packet-nbns.c95
-rw-r--r--epan/dissectors/packet-netbios.c152
-rw-r--r--epan/dissectors/packet-ses.c70
-rw-r--r--epan/dissectors/packet-sna.c58
-rw-r--r--epan/dissectors/packet-spice.c148
-rw-r--r--epan/dissectors/packet-tipc.c73
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 */