aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2015-04-22 07:57:37 -0400
committerMichael Mann <mmann78@netscape.net>2015-04-22 23:24:45 +0000
commit8d6324f759639c7d3c0cab839ca1d3c42c93f895 (patch)
treee2a36618d1c6892347c03bf479fc3eb15f5d9571 /epan
parent825aa502e7a1730141a3bfbf463f23167fb0b975 (diff)
Convert proto_tree_add_boolean to proto_tree_add_bitmask_[value|value_with_flags|list]
Part 2 of a few Change-Id: Ic1f1aafe2ed02dce95b15c03a91cbd68807a5cf4 Reviewed-on: https://code.wireshark.org/review/8165 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-gtp.c84
-rw-r--r--epan/dissectors/packet-h261.c21
-rw-r--r--epan/dissectors/packet-ieee80211.c15
-rw-r--r--epan/dissectors/packet-ieee802154.c108
-rw-r--r--epan/dissectors/packet-ifcp.c63
-rw-r--r--epan/dissectors/packet-igmp.c20
-rw-r--r--epan/dissectors/packet-ipx.c94
-rw-r--r--epan/dissectors/packet-iscsi.c37
-rw-r--r--epan/dissectors/packet-isis-lsp.c20
-rw-r--r--epan/dissectors/packet-isup.c530
-rw-r--r--epan/dissectors/packet-l2tp.c43
-rw-r--r--epan/dissectors/packet-lacp.c183
-rw-r--r--epan/dissectors/packet-ldap.c167
-rw-r--r--epan/dissectors/packet-mpeg1.c159
-rw-r--r--epan/dissectors/packet-ndps.c26
-rw-r--r--epan/dissectors/packet-nsip.c66
-rw-r--r--epan/dissectors/packet-nstrace.c41
-rw-r--r--epan/dissectors/packet-ntp.c4
-rw-r--r--epan/dissectors/packet-oampdu.c32
-rw-r--r--epan/dissectors/packet-ositp.c36
-rw-r--r--epan/dissectors/packet-pagp.c115
-rw-r--r--epan/dissectors/packet-pana.c63
22 files changed, 813 insertions, 1114 deletions
diff --git a/epan/dissectors/packet-gtp.c b/epan/dissectors/packet-gtp.c
index 2960581693..5c3b30b43e 100644
--- a/epan/dissectors/packet-gtp.c
+++ b/epan/dissectors/packet-gtp.c
@@ -179,6 +179,7 @@ static int hf_gtp_qos_guar_ul = -1;
static int hf_gtp_qos_guar_dl = -1;
static int hf_gtp_qos_src_stat_desc = -1;
static int hf_gtp_qos_sig_ind = -1;
+static int hf_gtp_qos_arp = -1;
static int hf_gtp_qos_arp_pvi = -1;
static int hf_gtp_qos_arp_pl = -1;
static int hf_gtp_qos_arp_pci = -1;
@@ -4235,7 +4236,7 @@ decode_qos_umts(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tr
guint8 trans_delay, traf_handl_prio;
guint8 guar_ul, guar_dl, guar_ul_ext, guar_dl_ext, guar_ul_ext2 = 0, guar_dl_ext2 = 0;
guint8 src_stat_desc, sig_ind;
- proto_tree *ext_tree_qos, *ext_tree_qos_arp;
+ proto_tree *ext_tree_qos;
int mss, mu, md, gu, gd;
guint8 arp, qci;
guint32 apn_ambr;
@@ -4321,13 +4322,19 @@ decode_qos_umts(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tr
if ((type == 3) && (rel_ind == 8)) {
/* Release 8 or higher P-GW QoS profile */
+ static const int * arp_flags[] = {
+ &hf_gtp_qos_arp_pci,
+ &hf_gtp_qos_arp_pl,
+ &hf_gtp_qos_arp_pvi,
+ NULL
+ };
+
offset++;
arp = wrapped_tvb_get_guint8(tvb, offset, 2);
- ext_tree_qos_arp = proto_tree_add_subtree(ext_tree_qos, tvb, offset, 2, ett_gtp_qos_arp, NULL, "Allocation/Retention Priority");
- proto_tree_add_boolean(ext_tree_qos_arp, hf_gtp_qos_arp_pci, tvb, offset, 2, arp);
- proto_tree_add_uint(ext_tree_qos_arp, hf_gtp_qos_arp_pl, tvb, offset, 2, arp);
- proto_tree_add_boolean(ext_tree_qos_arp, hf_gtp_qos_arp_pvi, tvb, offset, 2, arp);
+ proto_tree_add_bitmask_value_with_flags(ext_tree_qos, tvb, offset, hf_gtp_qos_arp,
+ ett_gtp_qos_arp, arp_flags, arp, BMT_NO_APPEND);
offset += 2;
+
qci = wrapped_tvb_get_guint8(tvb, offset, 2);
proto_tree_add_uint(ext_tree_qos, hf_gtp_qos_qci, tvb, offset, 2, qci);
offset += 2;
@@ -7984,19 +7991,28 @@ dissect_gtp_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
break;
}
if (tree) {
- proto_tree *flags_tree;
ti = proto_tree_add_item(tree, proto_gtp, tvb, 0, -1, ENC_NA);
gtp_tree = proto_item_add_subtree(ti, ett_gtp);
- tf = proto_tree_add_uint(gtp_tree, hf_gtp_flags, tvb, offset, 1, gtp_hdr->flags);
- flags_tree = proto_item_add_subtree(tf, ett_gtp_flags);
if(gtp_prime) {
+ const int * gtp_prime_flags[] = {
+ &hf_gtp_prime_flags_ver,
+ &hf_gtp_flags_pt,
+ &hf_gtp_flags_spare1,
+ NULL
+ };
+ const int * gtp_prime_v0_flags[] = {
+ &hf_gtp_prime_flags_ver,
+ &hf_gtp_flags_pt,
+ &hf_gtp_flags_spare1,
+ &hf_gtp_flags_hdr_length,
+ NULL
+ };
+
/* Octet 8 7 6 5 4 3 2 1
* 1 Version | PT| Spare '1 1 1 '| ' 0/1 '
*/
- proto_tree_add_uint(flags_tree, hf_gtp_prime_flags_ver, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_uint(flags_tree, hf_gtp_flags_pt, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_uint(flags_tree, hf_gtp_flags_spare1, tvb, offset, 1, gtp_hdr->flags);
+
/* Bit 1 of octet 1 is not used in GTP' (except in v0), and it is marked '0'
* in the GTP' header. It is in use in GTP' v0 and distinguishes the used header-length.
* In the case of GTP' v0, this bit being marked one (1) indicates the usage of the 6
@@ -8005,19 +8021,36 @@ dissect_gtp_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
* this does not suggest the use of the 20-octet header, rather a shorter 6-octet header.
*/
if(gtp_version == 0) {
- proto_tree_add_item(flags_tree, hf_gtp_flags_hdr_length, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bitmask_value_with_flags(gtp_tree, tvb, offset, hf_gtp_flags,
+ ett_gtp_flags, gtp_prime_v0_flags, gtp_hdr->flags, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_value_with_flags(gtp_tree, tvb, offset, hf_gtp_flags,
+ ett_gtp_flags, gtp_prime_flags, gtp_hdr->flags, BMT_NO_APPEND);
}
} else {
- proto_tree_add_uint(flags_tree, hf_gtp_flags_ver, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_uint(flags_tree, hf_gtp_flags_pt, tvb, offset, 1, gtp_hdr->flags);
+ const int * gtp_flags[] = {
+ &hf_gtp_flags_ver,
+ &hf_gtp_flags_pt,
+ &hf_gtp_flags_spare2,
+ &hf_gtp_flags_e,
+ &hf_gtp_flags_s,
+ &hf_gtp_flags_pn,
+ NULL
+ };
+ const int * gtp_v0_flags[] = {
+ &hf_gtp_flags_ver,
+ &hf_gtp_flags_pt,
+ &hf_gtp_flags_spare1,
+ &hf_gtp_flags_snn,
+ NULL
+ };
+
if(gtp_version == 0) {
- proto_tree_add_uint(flags_tree, hf_gtp_flags_spare1, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_boolean(flags_tree, hf_gtp_flags_snn, tvb, offset, 1, gtp_hdr->flags);
+ proto_tree_add_bitmask_value_with_flags(gtp_tree, tvb, offset, hf_gtp_flags,
+ ett_gtp_flags, gtp_v0_flags, gtp_hdr->flags, BMT_NO_APPEND);
} else {
- proto_tree_add_uint(flags_tree, hf_gtp_flags_spare2, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_boolean(flags_tree, hf_gtp_flags_e, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_boolean(flags_tree, hf_gtp_flags_s, tvb, offset, 1, gtp_hdr->flags);
- proto_tree_add_boolean(flags_tree, hf_gtp_flags_pn, tvb, offset, 1, gtp_hdr->flags);
+ proto_tree_add_bitmask_value_with_flags(gtp_tree, tvb, offset, hf_gtp_flags,
+ ett_gtp_flags, gtp_flags, gtp_hdr->flags, BMT_NO_APPEND);
}
}
}
@@ -8756,19 +8789,24 @@ proto_register_gtp(void)
FT_BOOLEAN, 8, TFS(&gtp_sig_ind), GTP_EXT_QOS_SIG_IND_MASK,
NULL, HFILL}
},
+ { &hf_gtp_qos_arp,
+ {"Allocation/Retention Priority", "gtp.qos_arp",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ NULL, HFILL}
+ },
{ &hf_gtp_qos_arp_pci,
{"Pre-emption Capability (PCI)", "gtp.qos_arp_pci",
- FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled), 0x40,
+ FT_BOOLEAN, 16, TFS(&tfs_disabled_enabled), 0x40,
NULL, HFILL}
},
{ &hf_gtp_qos_arp_pl,
{"Priority Level", "gtp.qos_arp_pl",
- FT_UINT8, BASE_DEC, NULL, 0x3c,
+ FT_UINT16, BASE_DEC, NULL, 0x3c,
NULL, HFILL}
},
{ &hf_gtp_qos_arp_pvi,
{"Pre-emption Vulnerability (PVI)", "gtp.qos_arp_pvi",
- FT_BOOLEAN, 8, TFS(&tfs_disabled_enabled), 0x01,
+ FT_BOOLEAN, 16, TFS(&tfs_disabled_enabled), 0x01,
NULL, HFILL}
},
{&hf_gtp_qos_qci,
diff --git a/epan/dissectors/packet-h261.c b/epan/dissectors/packet-h261.c
index 45717059dc..a754de75d0 100644
--- a/epan/dissectors/packet-h261.c
+++ b/epan/dissectors/packet-h261.c
@@ -62,6 +62,17 @@ dissect_h261( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
proto_item *ti = NULL;
proto_tree *h261_tree = NULL;
unsigned int offset = 0;
+ static const int * bits[] = {
+ /* SBIT 1st octet, 3 bits */
+ &hf_h261_sbit,
+ /* EBIT 1st octet, 3 bits */
+ &hf_h261_ebit,
+ /* I flag, 1 bit */
+ &hf_h261_ibit,
+ /* V flag, 1 bit */
+ &hf_h261_vbit,
+ NULL
+ };
col_set_str(pinfo->cinfo, COL_PROTOCOL, "H.261");
@@ -70,14 +81,8 @@ dissect_h261( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
if ( tree ) {
ti = proto_tree_add_item( tree, proto_h261, tvb, offset, -1, ENC_NA );
h261_tree = proto_item_add_subtree( ti, ett_h261 );
- /* SBIT 1st octet, 3 bits */
- proto_tree_add_uint( h261_tree, hf_h261_sbit, tvb, offset, 1, tvb_get_guint8( tvb, offset ) >> 5 );
- /* EBIT 1st octet, 3 bits */
- proto_tree_add_uint( h261_tree, hf_h261_ebit, tvb, offset, 1, ( tvb_get_guint8( tvb, offset ) >> 2 ) & 7 );
- /* I flag, 1 bit */
- proto_tree_add_boolean( h261_tree, hf_h261_ibit, tvb, offset, 1, tvb_get_guint8( tvb, offset ) & 2 );
- /* V flag, 1 bit */
- proto_tree_add_boolean( h261_tree, hf_h261_vbit, tvb, offset, 1, tvb_get_guint8( tvb, offset ) & 1 );
+
+ proto_tree_add_bitmask_list(h261_tree, tvb, offset, 1, bits, ENC_NA);
offset++;
/* GOBN 2nd octet, 4 bits */
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c
index 1e25acb8c6..88551cf174 100644
--- a/epan/dissectors/packet-ieee80211.c
+++ b/epan/dissectors/packet-ieee80211.c
@@ -15452,8 +15452,6 @@ add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset
{
guint8 flags = tvb_get_guint8(tvb, offset + 2);
guint8 targs, i;
- proto_item *item;
- proto_tree *subtree;
offset += 2;
proto_tree_add_item (tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -15481,10 +15479,15 @@ add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset
targs = tvb_get_guint8 (tvb, offset);
offset += 1;
for (i = 0; i < targs; i++) {
- item = proto_tree_add_item (tree, hf_ieee80211_ff_hwmp_targ_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- subtree = proto_item_add_subtree(item, ett_hwmp_targ_flags_tree);
- proto_tree_add_boolean(subtree, hf_ieee80211_ff_hwmp_targ_to_flags, tvb, offset, 1, flags);
- proto_tree_add_boolean(subtree, hf_ieee80211_ff_hwmp_targ_usn_flags, tvb, offset, 1, flags);
+ const int * targ_flags[] = {
+ &hf_ieee80211_ff_hwmp_targ_to_flags,
+ &hf_ieee80211_ff_hwmp_targ_usn_flags,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_hwmp_targ_flags,
+ ett_hwmp_targ_flags_tree, targ_flags, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+
offset += 1;
proto_tree_add_item (tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
offset += 6;
diff --git a/epan/dissectors/packet-ieee802154.c b/epan/dissectors/packet-ieee802154.c
index 43e0aca27b..051ea2bd76 100644
--- a/epan/dissectors/packet-ieee802154.c
+++ b/epan/dissectors/packet-ieee802154.c
@@ -207,6 +207,7 @@ static int hf_ieee802154_nonask_phr = -1;
static int proto_ieee802154 = -1;
static int hf_ieee802154_frame_length = -1;
+static int hf_ieee802154_fcf = -1;
static int hf_ieee802154_frame_type = -1;
static int hf_ieee802154_security = -1;
static int hf_ieee802154_pending = -1;
@@ -443,7 +444,17 @@ static void
dissect_ieee802154_fcf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ieee802154_packet *packet, guint *offset)
{
guint16 fcf;
- proto_tree *field_tree;
+ static const int * fields[] = {
+ &hf_ieee802154_frame_type,
+ &hf_ieee802154_security,
+ &hf_ieee802154_pending,
+ &hf_ieee802154_ack_request,
+ &hf_ieee802154_intra_pan,
+ &hf_ieee802154_dst_addr_mode,
+ &hf_ieee802154_version,
+ &hf_ieee802154_src_addr_mode,
+ NULL
+ };
/* Get the FCF field. */
fcf = tvb_get_letohs(tvb, *offset);
@@ -462,23 +473,8 @@ dissect_ieee802154_fcf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ieee
proto_item_append_text(tree, " %s", val_to_str_const(packet->frame_type, ieee802154_frame_types, "Reserved"));
col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(packet->frame_type, ieee802154_frame_types, "Reserved"));
- /* Add the FCF to the protocol tree. */
- if (tree) {
- /* Create the FCF subtree. */
- field_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 2, ett_ieee802154_fcf, NULL,
- "Frame Control Field: %s (0x%04x)",
- val_to_str_const(packet->frame_type, ieee802154_frame_types, "Unknown"), fcf);
-
- /* FCF Fields. */
- proto_tree_add_uint(field_tree, hf_ieee802154_frame_type, tvb, *offset, 1, fcf & IEEE802154_FCF_TYPE_MASK);
- proto_tree_add_boolean(field_tree, hf_ieee802154_security, tvb, *offset, 1, fcf & IEEE802154_FCF_SEC_EN);
- proto_tree_add_boolean(field_tree, hf_ieee802154_pending, tvb, *offset, 1, fcf & IEEE802154_FCF_FRAME_PND);
- proto_tree_add_boolean(field_tree, hf_ieee802154_ack_request, tvb, *offset, 1, fcf & IEEE802154_FCF_ACK_REQ);
- proto_tree_add_boolean(field_tree, hf_ieee802154_intra_pan, tvb, *offset, 1, fcf & IEEE802154_FCF_INTRA_PAN);
- proto_tree_add_uint(field_tree, hf_ieee802154_dst_addr_mode, tvb, (*offset)+1, 1, fcf & IEEE802154_FCF_DADDR_MASK);
- proto_tree_add_uint(field_tree, hf_ieee802154_version, tvb, (*offset)+1, 1, fcf & IEEE802154_FCF_VERSION);
- proto_tree_add_uint(field_tree, hf_ieee802154_src_addr_mode, tvb, (*offset)+1, 1, fcf & IEEE802154_FCF_SADDR_MASK);
- }
+ proto_tree_add_bitmask(tree, tvb, *offset, hf_ieee802154_fcf,
+ ett_ieee802154_fcf, fields, ENC_LITTLE_ENDIAN);
*offset += 2;
} /* dissect_ieee802154_fcf */
@@ -1397,35 +1393,32 @@ dissect_ieee802154_pendaddr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
* void
*---------------------------------------------------------------
*/
+static const true_false_string tfs_cinfo_device_type = { "FFD", "RFD" };
+static const true_false_string tfs_cinfo_power_src = { "AC/Mains Power", "Battery" };
+
static void
dissect_ieee802154_assoc_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ieee802154_packet *packet)
{
proto_tree *subtree;
- proto_item *ti;
- guint8 capability;
+ static const int * capability[] = {
+ &hf_ieee802154_cinfo_alt_coord,
+ &hf_ieee802154_cinfo_device_type,
+ &hf_ieee802154_cinfo_power_src,
+ &hf_ieee802154_cinfo_idle_rx,
+ &hf_ieee802154_cinfo_sec_capable,
+ &hf_ieee802154_cinfo_alloc_addr,
+ NULL
+ };
/* Create a subtree for this command frame. */
subtree = proto_tree_add_subtree(tree, tvb, 0, 1, ett_ieee802154_cmd, NULL,
val_to_str_const(packet->command_id, ieee802154_cmd_names, "Unknown Command"));
/* Get and display capability info. */
- capability = tvb_get_guint8(tvb, 0);
- if (tree) {
- /* Enter the capability bits. */
- proto_tree_add_boolean(subtree, hf_ieee802154_cinfo_alt_coord, tvb, 0, 1, capability & IEEE802154_CMD_CINFO_ALT_PAN_COORD);
- ti = proto_tree_add_boolean(subtree, hf_ieee802154_cinfo_device_type, tvb, 0, 1, capability & IEEE802154_CMD_CINFO_DEVICE_TYPE);
- if (capability & IEEE802154_CMD_CINFO_DEVICE_TYPE) proto_item_append_text(ti, " (FFD)");
- else proto_item_append_text(ti, " (RFD)");
- ti = proto_tree_add_boolean(subtree, hf_ieee802154_cinfo_power_src, tvb, 0, 1, capability & IEEE802154_CMD_CINFO_POWER_SRC);
- if (capability & IEEE802154_CMD_CINFO_POWER_SRC) proto_item_append_text(ti, " (AC/Mains Power)");
- else proto_item_append_text(ti, " (Battery)");
- proto_tree_add_boolean(subtree, hf_ieee802154_cinfo_idle_rx, tvb, 0, 1, capability & IEEE802154_CMD_CINFO_IDLE_RX);
- proto_tree_add_boolean(subtree, hf_ieee802154_cinfo_sec_capable, tvb, 0, 1, capability & IEEE802154_CMD_CINFO_SEC_CAPABLE);
- proto_tree_add_boolean(subtree, hf_ieee802154_cinfo_alloc_addr, tvb, 0, 1, capability & IEEE802154_CMD_CINFO_ALLOC_ADDR);
- }
+ proto_tree_add_bitmask_list(subtree, tvb, 0, 1, capability, ENC_NA);
/* Call the data dissector for any leftover bytes. */
- if (tvb_length(tvb) > 1) {
+ if (tvb_reported_length(tvb) > 1) {
call_dissector(data_handle, tvb_new_subset_remaining(tvb, 1), pinfo, tree);
}
} /* dissect_ieee802154_assoc_req */
@@ -1659,39 +1652,28 @@ dissect_ieee802154_realign(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
* void
*---------------------------------------------------------------
*/
+static const true_false_string tfs_gtsreq_dir = { "Receive", "Transmit" };
+static const true_false_string tfs_gtsreq_type= { "Allocate GTS", "Deallocate GTS" };
+
static void
dissect_ieee802154_gtsreq(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ieee802154_packet *packet)
{
proto_tree *subtree;
- proto_item *ti;
- guint8 characteristics;
- guint8 length;
- guint8 direction;
- guint8 type;
+ static const int * characteristics[] = {
+ &hf_ieee802154_gtsreq_len,
+ &hf_ieee802154_gtsreq_dir,
+ &hf_ieee802154_gtsreq_type,
+ NULL
+ };
/* Create a subtree for this command frame. */
subtree = proto_tree_add_subtree(tree, tvb, 0, 1, ett_ieee802154_cmd, NULL,
val_to_str_const(packet->command_id, ieee802154_cmd_names, "Unknown Command"));
- /* Get the characteristics field. */
- characteristics = tvb_get_guint8(tvb, 0);
- length = characteristics & IEEE802154_CMD_GTS_REQ_LEN;
- direction = characteristics & IEEE802154_CMD_GTS_REQ_DIR;
- type = characteristics & IEEE802154_CMD_GTS_REQ_TYPE;
-
- /* Display the characteristics field. */
- if (tree) {
- proto_tree_add_uint(subtree, hf_ieee802154_gtsreq_len, tvb, 0, 1, length);
- ti = proto_tree_add_boolean(subtree, hf_ieee802154_gtsreq_dir, tvb, 0, 1, direction);
- if (direction) proto_item_append_text(ti, " (Receive)");
- else proto_item_append_text(ti, " (Transmit)");
- ti = proto_tree_add_boolean(subtree, hf_ieee802154_gtsreq_type, tvb, 0, 1, type);
- if (type) proto_item_append_text(ti, " (Allocate GTS)");
- else proto_item_append_text(ti, " (Deallocate GTS)");
- }
+ proto_tree_add_bitmask_list(subtree, tvb, 0, 1, characteristics, ENC_NA);
/* Call the data dissector for any leftover bytes. */
- if (tvb_length(tvb) > 1) {
+ if (tvb_reported_length(tvb) > 1) {
call_dissector(data_handle, tvb_new_subset_remaining(tvb, 1), pinfo, tree);
}
} /* dissect_ieee802154_gtsreq */
@@ -2479,6 +2461,10 @@ void proto_register_ieee802154(void)
{ "Frame Length", "wpan.frame_length", FT_UINT8, BASE_DEC, NULL, 0x0,
"Frame Length as reported from lower layer", HFILL }},
+ { &hf_ieee802154_fcf,
+ { "Frame Control Field", "wpan.fcf", FT_UINT16, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
{ &hf_ieee802154_frame_type,
{ "Frame Type", "wpan.frame_type", FT_UINT16, BASE_HEX, VALS(ieee802154_frame_types),
IEEE802154_FCF_TYPE_MASK, NULL, HFILL }},
@@ -2572,11 +2558,11 @@ void proto_register_ieee802154(void)
"Whether this device can act as a PAN coordinator or not.", HFILL }},
{ &hf_ieee802154_cinfo_device_type,
- { "Device Type", "wpan.cinfo.device_type", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_CINFO_DEVICE_TYPE,
+ { "Device Type", "wpan.cinfo.device_type", FT_BOOLEAN, 8, TFS(&tfs_cinfo_device_type), IEEE802154_CMD_CINFO_DEVICE_TYPE,
"Whether this device is RFD (reduced-function device) or FFD (full-function device).", HFILL }},
{ &hf_ieee802154_cinfo_power_src,
- { "Power Source", "wpan.cinfo.power_src", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_CINFO_POWER_SRC,
+ { "Power Source", "wpan.cinfo.power_src", FT_BOOLEAN, 8, TFS(&tfs_cinfo_power_src), IEEE802154_CMD_CINFO_POWER_SRC,
"Whether this device is operating on AC/mains or battery power.", HFILL }},
{ &hf_ieee802154_cinfo_idle_rx,
@@ -2630,11 +2616,11 @@ void proto_register_ieee802154(void)
"Number of superframe slots the device is requesting.", HFILL }},
{ &hf_ieee802154_gtsreq_dir,
- { "GTS Direction", "wpan.gtsreq.direction", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_GTS_REQ_DIR,
+ { "GTS Direction", "wpan.gtsreq.direction", FT_BOOLEAN, 8, TFS(&tfs_gtsreq_dir), IEEE802154_CMD_GTS_REQ_DIR,
"The direction of traffic in the guaranteed timeslot.", HFILL }},
{ &hf_ieee802154_gtsreq_type,
- { "Characteristic Type", "wpan.gtsreq.type", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_GTS_REQ_TYPE,
+ { "Characteristic Type", "wpan.gtsreq.type", FT_BOOLEAN, 8, TFS(&tfs_gtsreq_type), IEEE802154_CMD_GTS_REQ_TYPE,
"Whether this request is to allocate or deallocate a timeslot.", HFILL }},
/* Beacon Frame Specific Fields */
diff --git a/epan/dissectors/packet-ifcp.c b/epan/dissectors/packet-ifcp.c
index b61d92d126..3e1b074456 100644
--- a/epan/dissectors/packet-ifcp.c
+++ b/epan/dissectors/packet-ifcp.c
@@ -241,35 +241,14 @@ static const true_false_string ifcp_flags_spc_tfs = {
static int
dissect_ifcpflags(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
{
- proto_item *item;
- proto_tree *tree;
- guint8 flags;
-
- item=proto_tree_add_item(parent_tree, hf_ifcp_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
- tree=proto_item_add_subtree (item, ett_ifcp_flags);
-
- flags=tvb_get_guint8(tvb, offset);
-
- /* SES */
- proto_tree_add_boolean(tree, hf_ifcp_flags_ses, tvb, offset, 1, flags);
- if(flags&IFCP_FLAGS_SES){
- proto_item_append_text(item, " SES");
- }
- flags&=(~IFCP_FLAGS_SES);
-
- /* TRP */
- proto_tree_add_boolean(tree, hf_ifcp_flags_trp, tvb, offset, 1, flags);
- if(flags&IFCP_FLAGS_TRP){
- proto_item_append_text(item, " TRP");
- }
- flags&=(~IFCP_FLAGS_TRP);
-
- /* SPC */
- proto_tree_add_boolean(tree, hf_ifcp_flags_spc, tvb, offset, 1, flags);
- if(flags&IFCP_FLAGS_SPC){
- proto_item_append_text(item, " SPC");
- }
-
+ static const int * flags[] = {
+ &hf_ifcp_flags_ses,
+ &hf_ifcp_flags_trp,
+ &hf_ifcp_flags_spc,
+ NULL
+ };
+ proto_tree_add_bitmask(parent_tree, tvb, offset, hf_ifcp_flags,
+ ett_ifcp_flags, flags, ENC_BIG_ENDIAN);
offset++;
return offset;
@@ -278,28 +257,16 @@ dissect_ifcpflags(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
#define IFCP_COMMON_FLAGS_CRCV 0x04
-static const true_false_string ifcp_common_flags_crcv_tfs = {
- "CRC is VALID",
- "Crc is NOT valid"
-};
-
static void
dissect_commonflags(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
{
- proto_item *item;
- proto_tree *tree;
- guint8 flags;
-
- item=proto_tree_add_item(parent_tree, hf_ifcp_common_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
- tree=proto_item_add_subtree (item, ett_ifcp_common_flags);
-
- flags=tvb_get_guint8(tvb, offset);
+ static const int * flags[] = {
+ &hf_ifcp_common_flags_crcv,
+ NULL
+ };
- /* CRCV */
- proto_tree_add_boolean(tree, hf_ifcp_common_flags_crcv, tvb, offset, 1, flags);
- if(flags&IFCP_COMMON_FLAGS_CRCV){
- proto_item_append_text(item, " CRCV");
- }
+ proto_tree_add_bitmask(parent_tree, tvb, offset, hf_ifcp_common_flags,
+ ett_ifcp_common_flags, flags, ENC_BIG_ENDIAN);
}
static int
@@ -593,7 +560,7 @@ proto_register_ifcp (void)
{"Flags", "ifcp.common_flags", FT_UINT8, BASE_HEX , NULL, 0xfc,
NULL, HFILL }},
{ &hf_ifcp_common_flags_crcv,
- {"CRCV", "ifcp.common_flags.crcv", FT_BOOLEAN, 8, TFS(&ifcp_common_flags_crcv_tfs), IFCP_COMMON_FLAGS_CRCV,
+ {"CRC", "ifcp.common_flags.crcv", FT_BOOLEAN, 8, TFS(&tfs_valid_not_valid), IFCP_COMMON_FLAGS_CRCV,
"Is the CRC field valid?", HFILL }},
{ &hf_ifcp_flags,
{"iFCP Flags", "ifcp.flags", FT_UINT8, BASE_HEX , NULL, 0,
diff --git a/epan/dissectors/packet-igmp.c b/epan/dissectors/packet-igmp.c
index 76094857f2..db1b3b642c 100644
--- a/epan/dissectors/packet-igmp.c
+++ b/epan/dissectors/packet-igmp.c
@@ -165,7 +165,6 @@ static int hf_mtrace_q_fwd_code = -1;
static int ett_igmp = -1;
static int ett_group_record = -1;
-static int ett_sqrv_bits = -1;
static int ett_max_resp = -1;
static int ett_mtrace_block = -1;
@@ -422,19 +421,13 @@ dissect_v3_max_resp(tvbuff_t *tvb, proto_tree *parent_tree, int offset)
static int
dissect_v3_sqrv_bits(tvbuff_t *tvb, proto_tree *parent_tree, int offset)
{
- proto_tree *tree;
- guint8 bits;
-
- bits = tvb_get_guint8(tvb, offset);
-
- tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, 1,
- ett_sqrv_bits, NULL, "QRV=%d S=%s", bits&IGMP_V3_QRV_MASK,
- (bits&IGMP_V3_S)?tfs_s.true_string:tfs_s.false_string);
+ static const int * bits[] = {
+ &hf_suppress,
+ &hf_qrv,
+ NULL
+ };
- /* S flag */
- proto_tree_add_boolean(tree, hf_suppress, tvb, offset, 1, bits);
- /* QRV */
- proto_tree_add_uint(tree, hf_qrv, tvb, offset, 1, bits);
+ proto_tree_add_bitmask_list(parent_tree, tvb, offset, 1, bits, ENC_NA);
offset += 1;
return offset;
@@ -1105,7 +1098,6 @@ proto_register_igmp(void)
static gint *ett[] = {
&ett_igmp,
&ett_group_record,
- &ett_sqrv_bits,
&ett_max_resp,
&ett_mtrace_block,
};
diff --git a/epan/dissectors/packet-ipx.c b/epan/dissectors/packet-ipx.c
index 63964a3c6b..6f447c14f8 100644
--- a/epan/dissectors/packet-ipx.c
+++ b/epan/dissectors/packet-ipx.c
@@ -576,31 +576,16 @@ spx_hash_lookup(conversation_t *conversation, guint32 spx_src, guint32 spx_seq)
#define SPX_RESERVED 0x02
#define SPX_EXT_HEADER 0x01
-static const char*
-spx_conn_ctrl(guint8 ctrl)
-{
- const char *p;
-
- static const value_string conn_vals[] = {
- { 0x00, "Data, No Ack Required" },
- { SPX_EOM, "End-of-Message" },
- { SPX_ATTN, "Attention" },
- { SPX_SEND_ACK, "Acknowledgment Required"},
- { SPX_SEND_ACK|SPX_EOM, "Send Ack: End Message"},
- { SPX_SYS_PACKET, "System Packet"},
- { SPX_SYS_PACKET|SPX_SEND_ACK, "System Packet: Send Ack"},
- { 0x00, NULL }
- };
-
- p = try_val_to_str((ctrl & 0xf0), conn_vals );
-
- if (p) {
- return p;
- }
- else {
- return "Unknown";
- }
-}
+static const value_string conn_vals[] = {
+ { 0x00, "Data, No Ack Required" },
+ { SPX_EOM, "End-of-Message" },
+ { SPX_ATTN, "Attention" },
+ { SPX_SEND_ACK, "Acknowledgment Required"},
+ { SPX_SEND_ACK|SPX_EOM, "Send Ack: End Message"},
+ { SPX_SYS_PACKET, "System Packet"},
+ { SPX_SYS_PACKET|SPX_SEND_ACK, "System Packet: Send Ack"},
+ { 0x00, NULL }
+};
static const char*
spx_datastream(guint8 type)
@@ -621,11 +606,10 @@ spx_datastream(guint8 type)
static void
dissect_spx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- proto_tree *spx_tree = NULL;
+ proto_tree *spx_tree;
proto_item *ti;
tvbuff_t *next_tvb;
guint8 conn_ctrl;
- proto_tree *cc_tree;
guint8 hdr_len = SPX_HEADER_LEN;
guint8 datastream_type;
const char *datastream_type_string;
@@ -648,36 +632,38 @@ dissect_spx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
hdr_len = SPX2_HEADER_LEN;
}
- if (tree) {
- ti = proto_tree_add_item(tree, proto_spx, tvb, 0, hdr_len, ENC_NA);
- spx_tree = proto_item_add_subtree(ti, ett_spx);
- }
+ ti = proto_tree_add_item(tree, proto_spx, tvb, 0, hdr_len, ENC_NA);
+ spx_tree = proto_item_add_subtree(ti, ett_spx);
- spx_msg_string = spx_conn_ctrl(conn_ctrl);
+ spx_msg_string = val_to_str_const((conn_ctrl & 0xf0), conn_vals, "Unknown" );
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", spx_msg_string);
if (tree) {
- ti = proto_tree_add_uint_format_value(spx_tree, hf_spx_connection_control, tvb,
- 0, 1, conn_ctrl,
- "%s (0x%02X)",
- spx_msg_string, conn_ctrl);
- cc_tree = proto_item_add_subtree(ti, ett_spx_connctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_sys, tvb,
- 0, 1, conn_ctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_send_ack, tvb,
- 0, 1, conn_ctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_attn, tvb,
- 0, 1, conn_ctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_eom, tvb,
- 0, 1, conn_ctrl);
+ const int * spx_flags[] = {
+ &hf_spx_connection_control_sys,
+ &hf_spx_connection_control_send_ack,
+ &hf_spx_connection_control_attn,
+ &hf_spx_connection_control_eom,
+ NULL
+ };
+
+ const int * spx_vii_flags[] = {
+ &hf_spx_connection_control_sys,
+ &hf_spx_connection_control_send_ack,
+ &hf_spx_connection_control_attn,
+ &hf_spx_connection_control_eom,
+ &hf_spx_connection_control_v2,
+ &hf_spx_connection_control_neg_size,
+ &hf_spx_connection_control_reserved,
+ &hf_spx_connection_control_ext_header,
+ NULL
+ };
+
if (conn_ctrl & SPX_VII_PACKET) {
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_v2, tvb,
- 0, 1, conn_ctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_neg_size, tvb,
- 0, 1, conn_ctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_reserved, tvb,
- 0, 1, conn_ctrl);
- proto_tree_add_boolean(cc_tree, hf_spx_connection_control_ext_header, tvb,
- 0, 1, conn_ctrl);
+ proto_tree_add_bitmask_with_flags(spx_tree, tvb, 0, hf_spx_connection_control,
+ ett_spx_connctrl, spx_vii_flags, ENC_NA, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_with_flags(spx_tree, tvb, 0, hf_spx_connection_control,
+ ett_spx_connctrl, spx_flags, ENC_NA, BMT_NO_APPEND);
}
}
@@ -1392,7 +1378,7 @@ proto_register_ipx(void)
static hf_register_info hf_spx[] = {
{ &hf_spx_connection_control,
{ "Connection Control", "spx.ctl",
- FT_UINT8, BASE_HEX, NULL, 0x0,
+ FT_UINT8, BASE_HEX, VALS(conn_vals), 0xF0,
NULL, HFILL }},
{ &hf_spx_connection_control_sys,
diff --git a/epan/dissectors/packet-iscsi.c b/epan/dissectors/packet-iscsi.c
index d975e5e46e..1e79d01d26 100644
--- a/epan/dissectors/packet-iscsi.c
+++ b/epan/dissectors/packet-iscsi.c
@@ -1295,10 +1295,33 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off
} else if(opcode == ISCSI_OPCODE_SCSI_DATA_IN) {
/* SCSI Data In (read) */
{
- gint b = tvb_get_guint8(tvb, offset + 1);
- proto_item *tf = proto_tree_add_uint(ti, hf_iscsi_Flags, tvb, offset + 1, 1, b);
- proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_Flags);
+ const int * scsi_data_in[] = {
+ &hf_iscsi_SCSIData_F,
+ &hf_iscsi_SCSIData_O,
+ &hf_iscsi_SCSIData_U,
+ &hf_iscsi_SCSIData_S,
+ NULL
+ };
+
+ const int * scsi_data_in_draft08[] = {
+ &hf_iscsi_SCSIData_F,
+ &hf_iscsi_SCSIData_A,
+ &hf_iscsi_SCSIData_O,
+ &hf_iscsi_SCSIData_U,
+ &hf_iscsi_SCSIData_S,
+ NULL
+ };
+ gint b;
+ if(iscsi_protocol_version > ISCSI_PROTOCOL_DRAFT08) {
+ proto_tree_add_bitmask_with_flags(ti, tvb, offset+1, hf_iscsi_Flags,
+ ett_iscsi_Flags, scsi_data_in_draft08, ENC_NA, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_with_flags(ti, tvb, offset+1, hf_iscsi_Flags,
+ ett_iscsi_Flags, scsi_data_in, ENC_NA, BMT_NO_APPEND);
+ }
+
+ b = tvb_get_guint8(tvb, offset + 1);
if(b&ISCSI_SCSI_DATA_FLAG_S){
S_bit=TRUE;
}
@@ -1306,13 +1329,7 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off
if(b&ISCSI_SCSI_DATA_FLAG_A){
A_bit=TRUE;
}
- proto_tree_add_boolean(tt, hf_iscsi_SCSIData_F, tvb, offset + 1, 1, b);
- if(iscsi_protocol_version > ISCSI_PROTOCOL_DRAFT08) {
- proto_tree_add_boolean(tt, hf_iscsi_SCSIData_A, tvb, offset + 1, 1, b);
- }
- proto_tree_add_boolean(tt, hf_iscsi_SCSIData_O, tvb, offset + 1, 1, b);
- proto_tree_add_boolean(tt, hf_iscsi_SCSIData_U, tvb, offset + 1, 1, b);
- proto_tree_add_boolean(tt, hf_iscsi_SCSIData_S, tvb, offset + 1, 1, b);
+
}
if(S_bit){
proto_tree_add_item(ti, hf_iscsi_SCSIResponse_Status, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
diff --git a/epan/dissectors/packet-isis-lsp.c b/epan/dissectors/packet-isis-lsp.c
index 48ccb0de06..8fdfc7009e 100644
--- a/epan/dissectors/packet-isis-lsp.c
+++ b/epan/dissectors/packet-isis-lsp.c
@@ -3120,8 +3120,8 @@ static void
dissect_isis_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
const isis_clv_handle_t *opts, int header_length, int id_length)
{
- proto_item *ti, *ta;
- proto_tree *lsp_tree, *info_tree, *att_tree;
+ proto_item *ti;
+ proto_tree *lsp_tree, *info_tree;
guint16 pdu_length, lifetime, checksum, cacl_checksum=0;
guint8 lsp_info;
int len, offset_checksum;
@@ -3187,6 +3187,14 @@ dissect_isis_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset
offset += 2;
if (tree) {
+ static const int * attach_flags[] = {
+ &hf_isis_lsp_error_metric,
+ &hf_isis_lsp_expense_metric,
+ &hf_isis_lsp_delay_metric,
+ &hf_isis_lsp_default_metric,
+ NULL
+ };
+
/*
* P | ATT | HIPPITY | IS TYPE description.
*/
@@ -3201,12 +3209,8 @@ dissect_isis_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset
);
proto_tree_add_boolean(info_tree, hf_isis_lsp_p, tvb, offset, 1, lsp_info);
- ta = proto_tree_add_uint(info_tree, hf_isis_lsp_att, tvb, offset, 1, lsp_info);
- att_tree = proto_item_add_subtree(ta, ett_isis_lsp_att);
- proto_tree_add_item(att_tree, hf_isis_lsp_error_metric, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(att_tree, hf_isis_lsp_expense_metric, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(att_tree, hf_isis_lsp_delay_metric, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(att_tree, hf_isis_lsp_default_metric, tvb, offset, 1, ENC_NA);
+ proto_tree_add_bitmask_with_flags(info_tree, tvb, offset, hf_isis_lsp_att,
+ ett_isis_lsp_att, attach_flags, ENC_NA, BMT_NO_APPEND);
proto_tree_add_boolean(info_tree, hf_isis_lsp_hippity, tvb, offset, 1, lsp_info);
proto_tree_add_uint(info_tree, hf_isis_lsp_is_type, tvb, offset, 1, lsp_info);
}
diff --git a/epan/dissectors/packet-isup.c b/epan/dissectors/packet-isup.c
index c880fee93d..cc12561770 100644
--- a/epan/dissectors/packet-isup.c
+++ b/epan/dissectors/packet-isup.c
@@ -3234,14 +3234,15 @@ static void
dissect_isup_nature_of_connection_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
guint8 nature_of_connection_ind;
+ static const int * indicators[] = {
+ &hf_isup_satellite_indicator,
+ &hf_isup_continuity_check_indicator,
+ &hf_isup_echo_control_device_indicator,
+ NULL
+ };
nature_of_connection_ind = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_item(parameter_tree, hf_isup_satellite_indicator,
- parameter_tvb, 0, NATURE_OF_CONNECTION_IND_LENGTH, ENC_BIG_ENDIAN);
- proto_tree_add_uint(parameter_tree, hf_isup_continuity_check_indicator,
- parameter_tvb, 0, NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_echo_control_device_indicator,
- parameter_tvb, 0, NATURE_OF_CONNECTION_IND_LENGTH, nature_of_connection_ind);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, NATURE_OF_CONNECTION_IND_LENGTH, indicators, ENC_BIG_ENDIAN);
proto_item_set_text(parameter_item, "Nature of Connection Indicators: 0x%x", nature_of_connection_ind);
}
@@ -3252,29 +3253,22 @@ dissect_isup_nature_of_connection_indicators_parameter(tvbuff_t *parameter_tvb,
static void
dissect_isup_forward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint16 forward_call_ind;
-
- forward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_natnl_inatnl_call_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_forw_call_end_to_end_method_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_interworking_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_end_to_end_info_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_isdn_user_part_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_forw_call_preferences_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_isdn_access_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_forw_call_sccp_method_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_ported_num_trans_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_forw_call_qor_attempt_indicator,
- parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, forward_call_ind);
+ guint16 forward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
+ static const int * indicators[] = {
+ &hf_isup_forw_call_natnl_inatnl_call_indicator,
+ &hf_isup_forw_call_end_to_end_method_indicator,
+ &hf_isup_forw_call_interworking_indicator,
+ &hf_isup_forw_call_end_to_end_info_indicator,
+ &hf_isup_forw_call_isdn_user_part_indicator,
+ &hf_isup_forw_call_preferences_indicator,
+ &hf_isup_forw_call_isdn_access_indicator,
+ &hf_isup_forw_call_sccp_method_indicator,
+ &hf_isup_forw_call_ported_num_trans_indicator,
+ &hf_isup_forw_call_qor_attempt_indicator,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, FORWARD_CALL_IND_LENGTH, indicators, ENC_BIG_ENDIAN);
proto_item_set_text(parameter_item, "Forward Call Indicators: 0x%x", forward_call_ind);
}
@@ -3344,14 +3338,24 @@ dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *
char called_number[MAXDIGITS + 1] = "";
e164_info_t e164_info;
gint number_plan;
+ static const int * indicators1_flags[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_called_party_nature_of_address_indicator,
+ NULL
+ };
+
+ static const int * indicators2_flags[] = {
+ &hf_isup_inn_indicator,
+ &hf_isup_numbering_plan_indicator,
+ NULL
+ };
+
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_flags, ENC_NA);
indicators2 = tvb_get_guint8(parameter_tvb, 1);
number_plan = (indicators2 & 0x70)>> 4;
- proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_flags, ENC_NA);
offset = 2;
if (tvb_reported_length_remaining(parameter_tvb, offset) == 0) {
@@ -3465,21 +3469,18 @@ dissect_isup_subsequent_number_parameter(tvbuff_t *parameter_tvb, proto_tree *pa
static void
dissect_isup_information_request_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint16 information_request_indicators;
-
- information_request_indicators = tvb_get_ntohs(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_calling_party_address_request_indicator,
- parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_info_req_holding_indicator,
- parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_request_indicator,
- parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_request_indicator,
- parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_malicious_call_identification_request_indicator,
- parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, information_request_indicators);
-
- proto_item_set_text(parameter_item, "Information request indicators: 0x%x", information_request_indicators);
+ static const int * indicators[] = {
+ &hf_isup_calling_party_address_request_indicator,
+ &hf_isup_info_req_holding_indicator,
+ &hf_isup_calling_partys_category_request_indicator,
+ &hf_isup_charge_information_request_indicator,
+ &hf_isup_malicious_call_identification_request_indicator,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, INFO_REQUEST_IND_LENGTH, indicators, ENC_BIG_ENDIAN);
+
+ proto_item_set_text(parameter_item, "Information request indicators: 0x%x", tvb_get_ntohs(parameter_tvb, 0));
}
/* ------------------------------------------------------------------
Dissector Parameter Information Indicators
@@ -3487,21 +3488,18 @@ dissect_isup_information_request_indicators_parameter(tvbuff_t *parameter_tvb, p
static void
dissect_isup_information_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint16 information_indicators;
-
- information_indicators = tvb_get_ntohs(parameter_tvb, 0);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_address_response_indicator,
- parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_hold_provided_indicator, parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_calling_partys_category_response_indicator,
- parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_charge_information_response_indicator,
- parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_solicited_indicator,
- parameter_tvb, 0, INFO_IND_LENGTH, information_indicators);
+ static const int * indicators[] = {
+ &hf_isup_calling_party_address_response_indicator,
+ &hf_isup_hold_provided_indicator,
+ &hf_isup_calling_partys_category_response_indicator,
+ &hf_isup_charge_information_response_indicator,
+ &hf_isup_solicited_indicator,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, INFO_IND_LENGTH, indicators, ENC_BIG_ENDIAN);
- proto_item_set_text(parameter_item, "Information indicators: 0x%x", information_indicators);
+ proto_item_set_text(parameter_item, "Information indicators: 0x%x", tvb_get_ntohs(parameter_tvb, 0));
}
/* ------------------------------------------------------------------
Dissector Parameter Continuity Indicators
@@ -3522,35 +3520,23 @@ dissect_isup_continuity_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree
static void
dissect_isup_backward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint16 backward_call_ind;
-
- backward_call_ind = tvb_get_ntohs(parameter_tvb, 0);
-
-
- proto_tree_add_uint(parameter_tree, hf_isup_backw_call_charge_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_status_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_backw_call_called_partys_category_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_backw_call_end_to_end_method_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_interworking_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_end_to_end_info_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_user_part_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_holding_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_isdn_access_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_boolean(parameter_tree, hf_isup_backw_call_echo_control_device_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
- proto_tree_add_uint(parameter_tree, hf_isup_backw_call_sccp_method_ind,
- parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, backward_call_ind);
-
- proto_item_set_text(parameter_item, "Backward Call Indicators: 0x%x", backward_call_ind);
+ static const int * indicators[] = {
+ &hf_isup_backw_call_charge_ind,
+ &hf_isup_backw_call_called_partys_status_ind,
+ &hf_isup_backw_call_called_partys_category_ind,
+ &hf_isup_backw_call_end_to_end_method_ind,
+ &hf_isup_backw_call_interworking_ind,
+ &hf_isup_backw_call_end_to_end_info_ind,
+ &hf_isup_backw_call_isdn_user_part_ind,
+ &hf_isup_backw_call_holding_ind,
+ &hf_isup_backw_call_isdn_access_ind,
+ &hf_isup_backw_call_echo_control_device_ind,
+ &hf_isup_backw_call_sccp_method_ind,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, BACKWARD_CALL_IND_LENGTH, indicators, ENC_BIG_ENDIAN);
+ proto_item_set_text(parameter_item, "Backward Call Indicators: 0x%x", tvb_get_ntohs(parameter_tvb, 0));
}
/* ------------------------------------------------------------------
Dissector Parameter Cause Indicators - no detailed dissection since defined in Rec. Q.850
@@ -4540,9 +4526,29 @@ static const value_string BAT_ASE_Report_Reason_vals[] = {
*/
extern int dissect_codec_mode(proto_tree *tree, tvbuff_t *tvb, int offset, int len) {
guint8 tempdata;
- proto_tree *scs_item, *acs_item;
- proto_tree *scs_tree, *acs_tree;
+ static const int * active_code_sets[] = {
+ &hf_active_code_set_12_2,
+ &hf_active_code_set_10_2,
+ &hf_active_code_set_7_95,
+ &hf_active_code_set_7_40,
+ &hf_active_code_set_6_70,
+ &hf_active_code_set_5_90,
+ &hf_active_code_set_5_15,
+ &hf_active_code_set_4_75,
+ NULL
+ };
+ static const int * supported_code_sets[] = {
+ &hf_supported_code_set_12_2,
+ &hf_supported_code_set_10_2,
+ &hf_supported_code_set_7_95,
+ &hf_supported_code_set_7_40,
+ &hf_supported_code_set_6_70,
+ &hf_supported_code_set_5_90,
+ &hf_supported_code_set_5_15,
+ &hf_supported_code_set_4_75,
+ NULL
+ };
tempdata = tvb_get_guint8(tvb, offset);
proto_tree_add_uint(tree, hf_Organization_Identifier , tvb, offset, 1, tempdata);
@@ -4591,31 +4597,14 @@ extern int dissect_codec_mode(proto_tree *tree, tvbuff_t *tvb, int offset, int l
if (len > 2) {
offset = offset + 1;
- acs_item = proto_tree_add_item(tree, hf_active_code_set, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- acs_tree = proto_item_add_subtree(acs_item, ett_acs);
- proto_tree_add_item(acs_tree, hf_active_code_set_12_2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_10_2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_7_95, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_7_40, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_6_70, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_5_90, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_5_15, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(acs_tree, hf_active_code_set_4_75, tvb, offset, 1, ENC_LITTLE_ENDIAN);
-
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_active_code_set,
+ ett_acs, active_code_sets, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
}
if (len > 3) {
offset = offset + 1;
- scs_item = proto_tree_add_item(tree, hf_supported_code_set, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- scs_tree = proto_item_add_subtree(scs_item, ett_scs);
- proto_tree_add_item(scs_tree, hf_supported_code_set_12_2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_10_2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_7_95, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_7_40, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_6_70, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_5_90, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_5_15, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(scs_tree, hf_supported_code_set_4_75, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_supported_code_set,
+ ett_acs, supported_code_sets, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
}
if (len > 4) {
offset = offset + 1;
@@ -4639,20 +4628,20 @@ static int
dissect_codec(tvbuff_t *parameter_tvb, proto_tree *bat_ase_element_tree, gint length_indicator, gint offset, gint identifier)
{
/* offset is at length indicator e.g 1 step past identifier */
- guint8 compatibility_info;
+ static const int * compatibility_info[] = {
+ &hf_Instruction_ind_for_general_action,
+ &hf_Send_notification_ind_for_general_action,
+ &hf_Instruction_ind_for_pass_on_not_possible,
+ &hf_Send_notification_ind_for_pass_on_not_possible,
+ &hf_isup_extension_ind,
+ NULL
+ };
proto_tree_add_uint(bat_ase_element_tree , hf_bat_ase_identifier , parameter_tvb, offset - 1, 1, identifier);
proto_tree_add_uint(bat_ase_element_tree , hf_length_indicator , parameter_tvb, offset, 1, length_indicator);
offset = offset + 1;
- compatibility_info = tvb_get_guint8(parameter_tvb, offset);
- proto_tree_add_uint(bat_ase_element_tree, hf_Instruction_ind_for_general_action , parameter_tvb, offset, 1, compatibility_info);
- proto_tree_add_boolean(bat_ase_element_tree, hf_Send_notification_ind_for_general_action,
- parameter_tvb, offset, 1, compatibility_info);
- proto_tree_add_uint(bat_ase_element_tree, hf_Instruction_ind_for_pass_on_not_possible,
- parameter_tvb, offset, 1, compatibility_info);
- proto_tree_add_boolean(bat_ase_element_tree, hf_Send_notification_ind_for_pass_on_not_possible,
- parameter_tvb, offset, 1, compatibility_info);
- proto_tree_add_boolean(bat_ase_element_tree, hf_isup_extension_ind , parameter_tvb, offset, 1, compatibility_info);
+
+ proto_tree_add_bitmask_list(bat_ase_element_tree, parameter_tvb, offset, 1, compatibility_info, ENC_NA);
offset = dissect_codec_mode(bat_ase_element_tree, parameter_tvb, offset+1, length_indicator-1);
return offset;
@@ -5158,19 +5147,20 @@ dissect_isup_application_transport_parameter(tvbuff_t *parameter_tvb, packet_inf
static void
dissect_isup_optional_forward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint8 indicators;
-
- indicators = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_uint(parameter_tree, hf_isup_cug_call_ind, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind,
- parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_connected_line_identity_request_ind,
- parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators);
+ guint8 ind;
+ static const int * indicators[] = {
+ &hf_isup_cug_call_ind,
+ &hf_isup_simple_segmentation_ind,
+ &hf_isup_connected_line_identity_request_ind,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, OPTIONAL_FORWARD_CALL_IND_LENGTH, indicators, ENC_NA);
+ ind = tvb_get_guint8(parameter_tvb, 0);
proto_item_set_text(parameter_item, "Optional forward call indicators: %s (%u)",
- val_to_str_const(indicators & BA_8BIT_MASK, isup_CUG_call_ind_value, "spare"),
- indicators);
+ val_to_str_const(ind & BA_8BIT_MASK, isup_CUG_call_ind_value, "spare"),
+ ind);
}
/* ------------------------------------------------------------------
Dissector Parameter calling party number
@@ -5189,16 +5179,24 @@ dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree
char calling_number[MAXDIGITS + 1] = "";
e164_info_t e164_info;
gint number_plan;
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_ni_indicator,
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ &hf_isup_screening_indicator,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
indicators2 = tvb_get_guint8(parameter_tvb, 1);
number_plan = (indicators2 & 0x70)>> 4;
- proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
offset = 2;
length = tvb_reported_length_remaining(parameter_tvb, offset);
@@ -5265,19 +5263,27 @@ dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, packet_in
{
proto_item *address_digits_item;
proto_tree *address_digits_tree;
- guint8 indicators1, indicators2;
+ guint8 indicators1;
guint8 address_digit_pair = 0;
gint offset = 0;
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
- indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
offset = 2;
length = tvb_reported_length_remaining(parameter_tvb, offset);
@@ -5333,19 +5339,27 @@ dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *p
{
proto_item *address_digits_item;
proto_tree *address_digits_tree;
- guint8 indicators1, indicators2;
+ guint8 indicators1;
guint8 address_digit_pair = 0;
gint offset = 0;
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
- indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
offset = 2;
length = tvb_reported_length_remaining(parameter_tvb, offset);
@@ -5401,19 +5415,27 @@ dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, proto_tree *p
{
proto_item *address_digits_item;
proto_tree *address_digits_tree;
- guint8 indicators1, indicators2;
+ guint8 indicators1;
guint8 address_digit_pair = 0;
gint offset = 0;
gint i = 0;
gint length;
char called_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_called_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_inn_indicator,
+ &hf_isup_numbering_plan_indicator,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_called_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
- indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
offset = 2;
address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb,
@@ -5557,20 +5579,28 @@ dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, proto_tree *par
{
proto_item *address_digits_item;
proto_tree *address_digits_tree;
- guint8 indicators1, indicators2;
+ guint8 indicators1;
guint8 address_digit_pair = 0;
gint offset = 0;
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ &hf_isup_screening_indicator,
+ NULL
+ };
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
- indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
offset = 2;
length = tvb_reported_length_remaining(parameter_tvb, offset);
@@ -5626,11 +5656,15 @@ dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, proto_
gint i = 0;
gint length;
char network_id[MAXDIGITS + 1] = "";
+ static const int * indicators_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_type_of_network_identification,
+ &hf_isup_network_identification_plan,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators_fields, ENC_NA);
indicators = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators);
- proto_tree_add_uint(parameter_tree, hf_isup_type_of_network_identification, parameter_tvb, 0, 1, indicators);
- proto_tree_add_uint(parameter_tree, hf_isup_network_identification_plan, parameter_tvb, 0, 1, indicators);
offset = 1;
address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb,
@@ -5699,16 +5733,17 @@ dissect_isup_automatic_congestion_level_parameter(tvbuff_t *parameter_tvb, proto
static void
dissect_isup_optional_backward_call_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint8 indicators;
-
- indicators = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_inband_information_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_call_diversion_may_occur_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_simple_segmentation_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_mlpp_user_ind, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators);
+ static const int * indicators[] = {
+ &hf_isup_inband_information_ind,
+ &hf_isup_call_diversion_may_occur_ind,
+ &hf_isup_simple_segmentation_ind,
+ &hf_isup_mlpp_user_ind,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, OPTIONAL_BACKWARD_CALL_IND_LENGTH, indicators, ENC_NA);
- proto_item_set_text(parameter_item, "Optional backward call indicators: 0x%x", indicators);
+ proto_item_set_text(parameter_item, "Optional backward call indicators: 0x%x", tvb_get_guint8(parameter_tvb, 0));
}
/* ------------------------------------------------------------------
Dissector Parameter User-to-user indicators
@@ -5743,22 +5778,31 @@ dissect_isup_user_to_user_indicators_parameter(tvbuff_t *parameter_tvb,
proto_item *parameter_item)
{
guint8 indicators;
+ static const int * req_fields[] = {
+ &hf_isup_UUI_type,
+ &hf_isup_UUI_req_service1,
+ &hf_isup_UUI_req_service2,
+ &hf_isup_UUI_req_service3,
+ NULL
+ };
+ static const int * res_fields[] = {
+ &hf_isup_UUI_type,
+ &hf_isup_UUI_res_service1,
+ &hf_isup_UUI_res_service2,
+ &hf_isup_UUI_res_service3,
+ &hf_isup_UUI_network_discard_ind,
+ NULL
+ };
indicators = tvb_get_guint8(parameter_tvb, 0);
proto_tree_add_boolean(parameter_tree, hf_isup_UUI_type, parameter_tvb, 0, 1, indicators);
if ((indicators & 0x01) == 0) {
/* Request */
- proto_tree_add_uint(parameter_tree, hf_isup_UUI_req_service1, parameter_tvb, 0, 1, indicators);
- proto_tree_add_uint(parameter_tree, hf_isup_UUI_req_service2, parameter_tvb, 0, 1, indicators);
- proto_tree_add_uint(parameter_tree, hf_isup_UUI_req_service3, parameter_tvb, 0, 1, indicators);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, req_fields, ENC_NA);
}
else {
/* Response */
- proto_tree_add_uint(parameter_tree, hf_isup_UUI_res_service1, parameter_tvb, 0, 1, indicators);
- proto_tree_add_uint(parameter_tree, hf_isup_UUI_res_service2, parameter_tvb, 0, 1, indicators);
- proto_tree_add_uint(parameter_tree, hf_isup_UUI_res_service3, parameter_tvb, 0, 1, indicators);
- proto_tree_add_boolean(parameter_tree, hf_isup_UUI_network_discard_ind, parameter_tvb, 0, 1, indicators);
-
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, res_fields, ENC_NA);
}
proto_item_set_text(parameter_item, "User-to-user indicators: 0x%x", indicators);
}
@@ -6309,18 +6353,35 @@ dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *para
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_inn_indicator,
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ &hf_isup_screening_indicator,
+ NULL
+ };
+ static const int * indicators2_fields_gfe[] = {
+ &hf_isup_inn_indicator,
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_number_different_meaning,
+ &hf_isup_address_presentation_restricted_indicator,
+ &hf_isup_screening_indicator,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_boolean(parameter_tree, hf_isup_inn_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
- if ((indicators2 & GFE_8BIT_MASK) == 0x50)
- proto_tree_add_uint_format_value(parameter_tree, hf_isup_number_different_meaning, parameter_tvb, 1, 1, indicators2 & GFE_8BIT_MASK,
- "Numbering plan indicator = private numbering plan");
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator, parameter_tvb, 1, 1, indicators2);
+ if ((indicators2 & GFE_8BIT_MASK) == 0x50) {
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields_gfe, ENC_NA);
+ } else {
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
+ }
/* NOTE When the address presentation restricted indicator indicates address not available, the
* subfields in items a), b), c) and d) are coded with 0's, and the screening indicator is set to 11
@@ -6612,19 +6673,26 @@ dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *par
{
proto_item *address_digits_item;
proto_tree *address_digits_tree;
- guint8 indicators1, indicators2;
+ guint8 indicators1;
guint8 address_digit_pair = 0;
gint offset = 0;
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
- indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA);
offset = 2;
address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb,
@@ -6796,9 +6864,7 @@ dissect_isup_calling_geodetic_location_parameter(tvbuff_t *parameter_tvb, packet
proto_tree_add_uint(parameter_tree, hf_isup_geo_loc_presentation_restricted_ind, parameter_tvb, 0, 1, oct);
proto_tree_add_uint(parameter_tree, hf_isup_geo_loc_screening_ind, parameter_tvb, 0, 1, oct);
- oct = tvb_get_guint8(parameter_tvb, 1);
-
- proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 1, 1, oct);
+ proto_tree_add_item(parameter_tree, hf_isup_extension_ind, parameter_tvb, 1, 1, ENC_NA);
proto_tree_add_item(parameter_tree, hf_isup_geo_loc_shape, parameter_tvb, 1, 1, ENC_NA);
if (length > 2)
@@ -6850,19 +6916,36 @@ dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinf
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_calling_party_nature_of_address_indicator,
+ NULL
+ };
+ static const int * indicators2_fields[] = {
+ &hf_isup_ni_indicator,
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_address_presentation_restricted_indicator,
+ &hf_isup_screening_indicator_enhanced,
+ NULL
+ };
+ static const int * indicators2_fields_gfe[] = {
+ &hf_isup_ni_indicator,
+ &hf_isup_numbering_plan_indicator,
+ &hf_isup_number_different_meaning,
+ &hf_isup_address_presentation_restricted_indicator,
+ &hf_isup_screening_indicator,
+ NULL
+ };
proto_tree_add_item(parameter_tree, hf_isup_number_qualifier_indicator, parameter_tvb, 0, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb,1 , 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 1, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_calling_party_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
indicators2 = tvb_get_guint8(parameter_tvb, 2);
- proto_tree_add_boolean(parameter_tree, hf_isup_ni_indicator, parameter_tvb, 2, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 2, 1, indicators2);
- if ((indicators2 & GFE_8BIT_MASK) == 0x50)
- proto_tree_add_uint_format_value(parameter_tree, hf_isup_number_different_meaning, parameter_tvb, 2, 1, indicators2 & GFE_8BIT_MASK,
- "Numbering plan indicator = private numbering plan");
- proto_tree_add_uint(parameter_tree, hf_isup_address_presentation_restricted_indicator, parameter_tvb, 2, 1, indicators2);
- proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 2, 1, indicators2);
+ if ((indicators2 & GFE_8BIT_MASK) == 0x50) {
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 2, 1, indicators2_fields_gfe, ENC_NA);
+ } else {
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 2, 1, indicators2_fields, ENC_NA);
+ }
offset = 3;
length = tvb_reported_length_remaining(parameter_tvb, offset);
@@ -6971,17 +7054,21 @@ dissect_isup_jurisdiction_parameter(tvbuff_t *parameter_tvb, proto_tree *paramet
static void
dissect_isup_generic_name_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- guint8 indicator;
gint gen_name_length;
char *gen_name = NULL;
+ static const int * indicators[] = {
+ &hf_isup_generic_name_presentation,
+ &hf_isup_generic_name_availability,
+ &hf_isup_generic_name_type,
+ NULL
+ };
gen_name = (char *)wmem_alloc(wmem_packet_scope(), MAXGNAME + 1);
gen_name[0] = '\0';
gen_name_length = tvb_reported_length(parameter_tvb) - 1;
- indicator = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_uint(parameter_tree, hf_isup_generic_name_presentation, parameter_tvb, 1, 1, indicator);
- proto_tree_add_boolean(parameter_tree, hf_isup_generic_name_availability, parameter_tvb, 1, 1, indicator);
- proto_tree_add_uint(parameter_tree, hf_isup_generic_name_type, parameter_tvb, 1, 1, indicator);
+
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators, ENC_NA);
+
gen_name = tvb_get_string_enc(wmem_packet_scope(), parameter_tvb, 1, gen_name_length, ENC_ASCII);
gen_name[gen_name_length] = '\0';
proto_tree_add_string(parameter_tree, hf_isup_generic_name_ia5, parameter_tvb, 2, gen_name_length, gen_name);
@@ -7007,18 +7094,21 @@ dissect_isup_charge_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parame
{
proto_item *address_digits_item;
proto_tree *address_digits_tree;
- guint8 indicators1, indicators2;
+ guint8 indicators1;
guint8 address_digit_pair = 0;
gint offset = 0;
gint i = 0;
gint length;
char calling_number[MAXDIGITS + 1] = "";
+ static const int * indicators1_fields[] = {
+ &hf_isup_odd_even_indicator,
+ &hf_isup_charge_number_nature_of_address_indicator,
+ NULL
+ };
+ proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA);
indicators1 = tvb_get_guint8(parameter_tvb, 0);
- proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1);
- proto_tree_add_uint(parameter_tree, hf_isup_charge_number_nature_of_address_indicator, parameter_tvb, 0, 1, indicators1);
- indicators2 = tvb_get_guint8(parameter_tvb, 1);
- proto_tree_add_uint(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, indicators2);
+ proto_tree_add_item(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, ENC_NA);
offset = 2;
address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb,
diff --git a/epan/dissectors/packet-l2tp.c b/epan/dissectors/packet-l2tp.c
index 0ab3d1cc97..8cff05f654 100644
--- a/epan/dissectors/packet-l2tp.c
+++ b/epan/dissectors/packet-l2tp.c
@@ -2206,6 +2206,14 @@ process_l2tpv3_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
}
+static const int * l2tp_control_fields[] = {
+ &hf_l2tp_type,
+ &hf_l2tp_length_bit,
+ &hf_l2tp_seq_bit,
+ &hf_l2tp_version,
+ NULL
+};
+
/*
* Processes v3 data message over UDP, to then call process_l2tpv3_data
* from the common part (Session ID)
@@ -2216,14 +2224,9 @@ process_l2tpv3_data_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
{
proto_tree *l2tp_tree, *ctrl_tree;
proto_item *l2tp_item;
-
- int idx = 0;
- int control;
+ int idx = 4; /* skip to sid */
int sid;
- control = tvb_get_ntohs(tvb, idx);
- idx += 2; /* skip ahead */
- idx += 2; /* Skip the reserved */
sid = tvb_get_ntohl(tvb, idx);
l2tp_item = proto_tree_add_item(tree, proto_l2tp, tvb, 0, -1, ENC_NA);
@@ -2235,11 +2238,8 @@ process_l2tpv3_data_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
ctrl_tree = proto_tree_add_subtree_format(l2tp_tree, tvb, 0, 2,
ett_l2tp_ctrl, NULL, "Packet Type: %s Session Id=%u",
data_msg, sid);
+ proto_tree_add_bitmask_list(ctrl_tree, tvb, 0, 2, l2tp_control_fields, ENC_BIG_ENDIAN);
- proto_tree_add_uint(ctrl_tree, hf_l2tp_type, tvb, 0, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_length_bit, tvb, 0, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_seq_bit, tvb, 0, 2, control);
- proto_tree_add_uint(ctrl_tree, hf_l2tp_version, tvb, 0, 2, control);
/* Data in v3 over UDP has this reserved */
proto_tree_add_item(l2tp_tree, hf_l2tp_res, tvb, 2, 2, ENC_BIG_ENDIAN);
}
@@ -2378,11 +2378,7 @@ process_l2tpv3_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
ctrl_tree = proto_tree_add_subtree_format(l2tp_tree, tvb, baseIdx, 2,
ett_l2tp_ctrl, NULL, "Packet Type: %s Control Connection Id=%d",
(CONTROL_BIT(control) ? control_msg : data_msg), ccid);
-
- proto_tree_add_uint(ctrl_tree, hf_l2tp_type, tvb, baseIdx, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_length_bit, tvb, baseIdx, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_seq_bit, tvb, baseIdx, 2, control);
- proto_tree_add_uint(ctrl_tree, hf_l2tp_version, tvb, baseIdx, 2, control);
+ proto_tree_add_bitmask_list(ctrl_tree, tvb, baseIdx, 2, l2tp_control_fields, ENC_BIG_ENDIAN);
}
idx = baseIdx + 2;
if (LENGTH_BIT(control)) {
@@ -2592,16 +2588,21 @@ dissect_l2tp_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data
l2tp_tree = proto_item_add_subtree(l2tp_item, ett_l2tp);
if (tree) {
+ static const int * control_fields[] = {
+ &hf_l2tp_type,
+ &hf_l2tp_length_bit,
+ &hf_l2tp_seq_bit,
+ &hf_l2tp_offset_bit,
+ &hf_l2tp_priority,
+ &hf_l2tp_version,
+ NULL
+ };
+
ctrl_tree = proto_tree_add_subtree_format(l2tp_tree, tvb, 0, 2, ett_l2tp_ctrl, NULL,
"Packet Type: %s Tunnel Id=%d Session Id=%d",
(CONTROL_BIT(control) ? control_msg : data_msg), tid, cid);
- proto_tree_add_uint(ctrl_tree, hf_l2tp_type, tvb, 0, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_length_bit, tvb, 0, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_seq_bit, tvb, 0, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_offset_bit, tvb, 0, 2, control);
- proto_tree_add_boolean(ctrl_tree, hf_l2tp_priority, tvb, 0, 2, control);
- proto_tree_add_uint(ctrl_tree, hf_l2tp_version, tvb, 0, 2, control);
+ proto_tree_add_bitmask_list(ctrl_tree, tvb, 0, 2, control_fields, ENC_BIG_ENDIAN);
}
idx = 2;
if (LENGTH_BIT(control)) {
diff --git a/epan/dissectors/packet-lacp.c b/epan/dissectors/packet-lacp.c
index 5db0942596..eb91774159 100644
--- a/epan/dissectors/packet-lacp.c
+++ b/epan/dissectors/packet-lacp.c
@@ -97,16 +97,6 @@ static gint ett_lacp = -1;
static gint ett_lacp_a_flags = -1;
static gint ett_lacp_p_flags = -1;
-static const char initial_sep[] = " (";
-static const char cont_sep[] = ", ";
-
-#define APPEND_BOOLEAN_FLAG(flag, item, string) \
- if(flag){ \
- if(item) \
- proto_item_append_text(item, string, sep); \
- sep = cont_sep; \
- }
-
/*
* Name: dissect_lacp
*
@@ -130,17 +120,30 @@ dissect_lacp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint16 raw_word;
guint8 raw_octet;
- guint8 flags;
-
proto_tree *lacpdu_tree;
proto_item *lacpdu_item;
- proto_tree *actor_flags_tree;
- proto_item *actor_flags_item;
- proto_tree *partner_flags_tree;
- proto_item *partner_flags_item;
-
- const char *sep;
-
+ static const int * actor_flags[] = {
+ &hf_lacp_flags_a_activity,
+ &hf_lacp_flags_a_timeout,
+ &hf_lacp_flags_a_aggregation,
+ &hf_lacp_flags_a_sync,
+ &hf_lacp_flags_a_collecting,
+ &hf_lacp_flags_a_distrib,
+ &hf_lacp_flags_a_defaulted,
+ &hf_lacp_flags_a_expired,
+ NULL
+ };
+ static const int * partner_flags[] = {
+ &hf_lacp_flags_p_activity,
+ &hf_lacp_flags_p_timeout,
+ &hf_lacp_flags_p_aggregation,
+ &hf_lacp_flags_p_sync,
+ &hf_lacp_flags_p_collecting,
+ &hf_lacp_flags_p_distrib,
+ &hf_lacp_flags_p_defaulted,
+ &hf_lacp_flags_p_expired,
+ NULL
+ };
col_set_str(pinfo->cinfo, COL_PROTOCOL, "LACP");
col_set_str(pinfo->cinfo, COL_INFO, "Link Aggregation Control Protocol");
@@ -203,75 +206,8 @@ dissect_lacp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset += 2;
/* Actor State */
-
- flags = tvb_get_guint8(tvb, offset);
- actor_flags_item = proto_tree_add_uint(lacpdu_tree, hf_lacp_actor_state, tvb,
- offset, 1, flags);
- actor_flags_tree = proto_item_add_subtree(actor_flags_item, ett_lacp_a_flags);
-
- sep = initial_sep;
-
- /* Activity Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_ACTIVITY, actor_flags_item,
- "%sActivity");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_activity, tvb,
- offset, 1, flags);
-
- /* Timeout Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_TIMEOUT, actor_flags_item,
- "%sTimeout");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_timeout, tvb,
- offset, 1, flags);
-
- /* Aggregation Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_AGGREGATION, actor_flags_item,
- "%sAggregation");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_aggregation, tvb,
- offset, 1, flags);
-
- /* Synchronization Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_SYNC, actor_flags_item,
- "%sSynchronization");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_sync, tvb,
- offset, 1, flags);
-
- /* Collecting Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_COLLECTING, actor_flags_item,
- "%sCollecting");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_collecting, tvb,
- offset, 1, flags);
-
- /* Distributing Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_DISTRIB, actor_flags_item,
- "%sDistributing");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_distrib, tvb,
- offset, 1, flags);
-
- /* Defaulted Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_DEFAULTED, actor_flags_item,
- "%sDefaulted");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_defaulted, tvb,
- offset, 1, flags);
-
- /* Expired Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_EXPIRED, actor_flags_item,
- "%sExpired");
- proto_tree_add_boolean(actor_flags_tree, hf_lacp_flags_a_expired, tvb,
- offset, 1, flags);
-
- if (sep != initial_sep)
- {
- /* We put something in; put in the terminating ")" */
- proto_item_append_text(actor_flags_item, ")");
- }
+ proto_tree_add_bitmask_with_flags(lacpdu_tree, tvb, offset, hf_lacp_actor_state,
+ ett_lacp_a_flags, actor_flags, ENC_NA, BMT_NO_INT|BMT_NO_TFS|BMT_NO_FALSE);
offset += 1;
/* Actor Reserved */
@@ -326,76 +262,9 @@ dissect_lacp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (tree)
{
- /* Partner State */
-
- flags = tvb_get_guint8(tvb, offset);
- partner_flags_item = proto_tree_add_uint(lacpdu_tree, hf_lacp_partner_state, tvb,
- offset, 1, flags);
- partner_flags_tree = proto_item_add_subtree(partner_flags_item, ett_lacp_p_flags);
-
- sep = initial_sep;
-
- /* Activity Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_ACTIVITY, partner_flags_item,
- "%sActivity");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_activity, tvb,
- offset, 1, flags);
-
- /* Timeout Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_TIMEOUT, partner_flags_item,
- "%sTimeout");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_timeout, tvb,
- offset, 1, flags);
-
- /* Aggregation Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_AGGREGATION, partner_flags_item,
- "%sAggregation");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_aggregation, tvb,
- offset, 1, flags);
-
- /* Synchronization Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_SYNC, partner_flags_item,
- "%sSynchronization");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_sync, tvb,
- offset, 1, flags);
-
- /* Collecting Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_COLLECTING, partner_flags_item,
- "%sCollecting");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_collecting, tvb,
- offset, 1, flags);
-
- /* Distributing Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_DISTRIB, partner_flags_item,
- "%sDistributing");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_distrib, tvb,
- offset, 1, flags);
-
- /* Defaulted Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_DEFAULTED, partner_flags_item,
- "%sDefaulted");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_defaulted, tvb,
- offset, 1, flags);
-
- /* Expired Flag */
-
- APPEND_BOOLEAN_FLAG(flags & LACPDU_FLAGS_EXPIRED, partner_flags_item,
- "%sExpired");
- proto_tree_add_boolean(partner_flags_tree, hf_lacp_flags_p_expired, tvb,
- offset, 1, flags);
+ proto_tree_add_bitmask_with_flags(lacpdu_tree, tvb, offset, hf_lacp_partner_state,
+ ett_lacp_p_flags, partner_flags, ENC_NA, BMT_NO_INT|BMT_NO_TFS|BMT_NO_FALSE);
- if (sep != initial_sep)
- {
- /* We put something in; put in the terminating ")" */
- proto_item_append_text(partner_flags_item, ")");
- }
offset += 1;
/* Partner Reserved */
diff --git a/epan/dissectors/packet-ldap.c b/epan/dissectors/packet-ldap.c
index 270c8549d2..0b963a44ba 100644
--- a/epan/dissectors/packet-ldap.c
+++ b/epan/dissectors/packet-ldap.c
@@ -743,52 +743,22 @@ attribute_types_initialize_cb(void)
/* MS-ADTS specification, section 7.3.1.1, NETLOGON_NT_VERSION Options Bits */
static int dissect_mscldap_ntver_flags(proto_tree *parent_tree, tvbuff_t *tvb, int offset)
{
- guint32 flags;
- proto_item *item;
- proto_tree *tree=NULL;
- guint *field;
- header_field_info *hfi;
- gboolean one_bit_set = FALSE;
- guint fields[11];
- fields[0] = hf_mscldap_ntver_flags_v1;
- fields[1] = hf_mscldap_ntver_flags_v5;
- fields[2] = hf_mscldap_ntver_flags_v5ex;
- fields[3] = hf_mscldap_ntver_flags_v5ep;
- fields[4] = hf_mscldap_ntver_flags_vcs;
- fields[5] = hf_mscldap_ntver_flags_vnt4;
- fields[6] = hf_mscldap_ntver_flags_vpdc;
- fields[7] = hf_mscldap_ntver_flags_vip;
- fields[8] = hf_mscldap_ntver_flags_vl;
- fields[9] = hf_mscldap_ntver_flags_vgc;
- fields[10] = 0;
-
-
- flags=tvb_get_letohl(tvb, offset);
- item=proto_tree_add_item(parent_tree, hf_mscldap_ntver_flags, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if(parent_tree){
- tree = proto_item_add_subtree(item, ett_mscldap_ntver_flags);
- }
-
- proto_item_append_text(item, " (");
-
- for(field = fields; *field; field++) {
- proto_tree_add_boolean(tree, *field, tvb, offset, 4, flags);
- hfi = proto_registrar_get_nth(*field);
-
- if(flags & hfi->bitmask) {
-
- if(one_bit_set)
- proto_item_append_text(item, ", ");
- else
- one_bit_set = TRUE;
-
- proto_item_append_text(item, "%s", hfi->name);
-
- }
- }
-
- proto_item_append_text(item, ")");
+ static const int * flags[] = {
+ &hf_mscldap_ntver_flags_v1,
+ &hf_mscldap_ntver_flags_v5,
+ &hf_mscldap_ntver_flags_v5ex,
+ &hf_mscldap_ntver_flags_v5ep,
+ &hf_mscldap_ntver_flags_vcs,
+ &hf_mscldap_ntver_flags_vnt4,
+ &hf_mscldap_ntver_flags_vpdc,
+ &hf_mscldap_ntver_flags_vip,
+ &hf_mscldap_ntver_flags_vl,
+ &hf_mscldap_ntver_flags_vgc,
+ NULL
+ };
+ proto_tree_add_bitmask_with_flags(parent_tree, tvb, offset, hf_mscldap_ntver_flags,
+ ett_mscldap_ntver_flags, flags, ENC_LITTLE_ENDIAN, BMT_NO_FALSE);
offset += 4;
return offset;
@@ -2550,7 +2520,7 @@ dissect_ldap_SEQUENCE_OF_LDAPURL(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, i
static int
dissect_ldap_SearchResultReference(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 805 "../../asn1/ldap/ldap.cnf"
+#line 795 "../../asn1/ldap/ldap.cnf"
offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
hf_index, BER_CLASS_APP, 19, TRUE, dissect_ldap_SEQUENCE_OF_LDAPURL);
@@ -2827,7 +2797,7 @@ dissect_ldap_CompareResponse(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int o
static int
dissect_ldap_AbandonRequest(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 812 "../../asn1/ldap/ldap.cnf"
+#line 802 "../../asn1/ldap/ldap.cnf"
offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
hf_index, BER_CLASS_APP, 16, TRUE, dissect_ldap_MessageID);
@@ -3402,7 +3372,6 @@ dissect_ldap_DirSyncFlags(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offs
gint32 tag;
guint32 len;
gint32 val;
- header_field_info *hfinfo;
int otheroffset = offset;
if(!implicit_tag){
@@ -3415,25 +3384,16 @@ dissect_ldap_DirSyncFlags(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offs
offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, -1, &val);
- hfinfo = proto_registrar_get_nth(hf_index);
-
if (val >0) {
- proto_tree *subtree;
- subtree = proto_tree_add_subtree_format(tree, tvb, otheroffset+1, len,
- ett_ldap_DirSyncFlagsSubEntry, NULL, "%s: 0x%08x", hfinfo->name, val);
-
- if (val & 0x1) {
- proto_tree_add_boolean(subtree, hf_ldap_object_security_flag, tvb, otheroffset+1, len, TRUE);
- }
- if (val & 0x800) {
- proto_tree_add_boolean(subtree, hf_ldap_ancestor_first_flag, tvb, otheroffset+1, len, TRUE);
- }
- if (val & 0x2000) {
- proto_tree_add_boolean(subtree, hf_ldap_public_data_only_flag, tvb, otheroffset+1, len, TRUE);
- }
- if (val & 0x80000000) {
- proto_tree_add_boolean(subtree, hf_ldap_incremental_value_flag, tvb, otheroffset+1, len, TRUE);
- }
+ const int * flags[] = {
+ &hf_ldap_object_security_flag,
+ &hf_ldap_ancestor_first_flag,
+ &hf_ldap_public_data_only_flag,
+ &hf_ldap_incremental_value_flag,
+ };
+
+ proto_tree_add_bitmask_value_with_flags(tree, tvb, otheroffset+1, hf_index,
+ ett_ldap_DirSyncFlagsSubEntry, flags, val, BMT_NO_APPEND);
} else {
proto_tree_add_uint(tree, hf_index, tvb, otheroffset+len, len, 0);
}
@@ -3807,7 +3767,7 @@ static int dissect_PasswordPolicyResponseValue_PDU(tvbuff_t *tvb _U_, packet_inf
/*--- End of included file: packet-ldap-fn.c ---*/
-#line 883 "../../asn1/ldap/packet-ldap-template.c"
+#line 853 "../../asn1/ldap/packet-ldap-template.c"
static int dissect_LDAPMessage_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ldap_conv_info_t *ldap_info) {
int offset = 0;
@@ -4287,54 +4247,27 @@ static const true_false_string tfs_ads_fnc = {
};
static int dissect_mscldap_netlogon_flags(proto_tree *parent_tree, tvbuff_t *tvb, int offset)
{
- guint32 flags;
- proto_item *item;
- proto_tree *tree;
- guint *field;
- header_field_info *hfi;
- gboolean one_bit_set = FALSE;
- guint fields[16];
- fields[0] = hf_mscldap_netlogon_flags_fnc;
- fields[1] = hf_mscldap_netlogon_flags_dnc;
- fields[2] = hf_mscldap_netlogon_flags_dns;
- fields[3] = hf_mscldap_netlogon_flags_wdc;
- fields[4] = hf_mscldap_netlogon_flags_rodc;
- fields[5] = hf_mscldap_netlogon_flags_ndnc;
- fields[6] = hf_mscldap_netlogon_flags_good_timeserv;
- fields[7] = hf_mscldap_netlogon_flags_writable;
- fields[8] = hf_mscldap_netlogon_flags_closest;
- fields[9] = hf_mscldap_netlogon_flags_timeserv;
- fields[10] = hf_mscldap_netlogon_flags_kdc;
- fields[11] = hf_mscldap_netlogon_flags_ds;
- fields[12] = hf_mscldap_netlogon_flags_ldap;
- fields[13] = hf_mscldap_netlogon_flags_gc;
- fields[14] = hf_mscldap_netlogon_flags_pdc;
- fields[15] = 0;
-
- flags=tvb_get_letohl(tvb, offset);
- item=proto_tree_add_item(parent_tree, hf_mscldap_netlogon_flags, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- tree = proto_item_add_subtree(item, ett_mscldap_netlogon_flags);
-
- proto_item_append_text(item, " (");
-
- for(field = fields; *field; field++) {
- proto_tree_add_boolean(tree, *field, tvb, offset, 4, flags);
- hfi = proto_registrar_get_nth(*field);
-
- if(flags & hfi->bitmask) {
-
- if(one_bit_set)
- proto_item_append_text(item, ", ");
- else
- one_bit_set = TRUE;
-
- proto_item_append_text(item, "%s", hfi->name);
-
- }
- }
-
- proto_item_append_text(item, ")");
+ static const int * flags[] = {
+ &hf_mscldap_netlogon_flags_fnc,
+ &hf_mscldap_netlogon_flags_dnc,
+ &hf_mscldap_netlogon_flags_dns,
+ &hf_mscldap_netlogon_flags_wdc,
+ &hf_mscldap_netlogon_flags_rodc,
+ &hf_mscldap_netlogon_flags_ndnc,
+ &hf_mscldap_netlogon_flags_good_timeserv,
+ &hf_mscldap_netlogon_flags_writable,
+ &hf_mscldap_netlogon_flags_closest,
+ &hf_mscldap_netlogon_flags_timeserv,
+ &hf_mscldap_netlogon_flags_kdc,
+ &hf_mscldap_netlogon_flags_ds,
+ &hf_mscldap_netlogon_flags_ldap,
+ &hf_mscldap_netlogon_flags_gc,
+ &hf_mscldap_netlogon_flags_pdc,
+ NULL
+ };
+ proto_tree_add_bitmask_with_flags(parent_tree, tvb, offset, hf_mscldap_netlogon_flags,
+ ett_mscldap_netlogon_flags, flags, ENC_LITTLE_ENDIAN, BMT_NO_FALSE);
offset += 4;
return offset;
@@ -5700,7 +5633,7 @@ void proto_register_ldap(void) {
NULL, HFILL }},
/*--- End of included file: packet-ldap-hfarr.c ---*/
-#line 2207 "../../asn1/ldap/packet-ldap-template.c"
+#line 2150 "../../asn1/ldap/packet-ldap-template.c"
};
/* List of subtrees */
@@ -5774,7 +5707,7 @@ void proto_register_ldap(void) {
&ett_ldap_T_warning,
/*--- End of included file: packet-ldap-ettarr.c ---*/
-#line 2221 "../../asn1/ldap/packet-ldap-template.c"
+#line 2164 "../../asn1/ldap/packet-ldap-template.c"
};
/* UAT for header fields */
static uat_field_t custom_attribute_types_uat_fields[] = {
@@ -5940,7 +5873,7 @@ proto_reg_handoff_ldap(void)
/*--- End of included file: packet-ldap-dis-tab.c ---*/
-#line 2370 "../../asn1/ldap/packet-ldap-template.c"
+#line 2313 "../../asn1/ldap/packet-ldap-template.c"
}
diff --git a/epan/dissectors/packet-mpeg1.c b/epan/dissectors/packet-mpeg1.c
index dceab98fb9..4044a463fb 100644
--- a/epan/dissectors/packet-mpeg1.c
+++ b/epan/dissectors/packet-mpeg1.c
@@ -38,26 +38,8 @@
void proto_register_mpeg1(void);
void proto_reg_handoff_mpeg1(void);
-#define RTP_MPG_MBZ(word) ( word >> 11)
-#define RTP_MPG_T(word) ( (word >> 10) & 1 )
-#define RTP_MPG_TR(word) ( word & 0x3ff )
-
-#define RTP_MPG_AN(octet) ( octet >> 7)
-#define RTP_MPG_N(octet) ( (octet >> 6) & 1 )
-#define RTP_MPG_S(octet) ( (octet >> 5) & 1 )
-#define RTP_MPG_B(octet) ( (octet >> 4) & 1 )
-#define RTP_MPG_E(octet) ( (octet >> 3) & 1 )
-#define RTP_MPG_P(octet) ( octet & 7 )
-
-#define RTP_MPG_FBV(octet) ( (octet >> 7) & 1 )
-#define RTP_MPG_BFC(octet) ( (octet >> 4) & 7 )
-#define RTP_MPG_FFV(octet) ( (octet >> 3) & 1 )
-#define RTP_MPG_FFC(octet) ( octet & 7 )
-
-
/* MPEG1 header fields */
-
static int proto_mpg = -1;
static int hf_rtp_mpg_mbz = -1;
@@ -78,7 +60,6 @@ static int hf_rtp_mpg_ffc = -1;
static int hf_rtp_mpg_data = -1;
-
/* MPEG-1 fields defining a sub tree */
static gint ett_mpg = -1;
@@ -98,84 +79,52 @@ static const value_string rtp_mpg_picture_types_vals[] =
static void
dissect_mpeg1( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
{
- proto_item *ti = NULL;
- proto_tree *mpg_tree = NULL;
+ proto_item *ti;
+ proto_tree *mpg_tree;
unsigned int offset = 0;
- guint8 octet;
- guint16 word;
-
-
- guint16 mpg_mbz;
- guint16 mpg_T;
- guint16 mpg_tr;
- guint16 mpg_an;
- guint16 mpg_n;
- gboolean mpg_s;
- gboolean mpg_b;
- gboolean mpg_e;
- guint16 mpg_p;
- guint16 mpg_fbv;
- guint16 mpg_bfc;
- guint16 mpg_ffv;
- guint16 mpg_ffc;
+ static const int * mpg_fields1[] = {
+ &hf_rtp_mpg_mbz,
+ &hf_rtp_mpg_T,
+ &hf_rtp_mpg_tr,
+ NULL
+ };
+ static const int * mpg_fields2[] = {
+ &hf_rtp_mpg_an,
+ &hf_rtp_mpg_n,
+ &hf_rtp_mpg_s,
+ &hf_rtp_mpg_b,
+ &hf_rtp_mpg_e,
+ &hf_rtp_mpg_p,
+ NULL
+ };
+ static const int * mpg_fields3[] = {
+ &hf_rtp_mpg_fbv,
+ &hf_rtp_mpg_bfc,
+ &hf_rtp_mpg_ffv,
+ &hf_rtp_mpg_ffc,
+ NULL
+ };
col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPEG-1");
-
col_set_str(pinfo->cinfo, COL_INFO, "MPEG-1 message");
/* Get MPEG-1 fields */
- word = tvb_get_guint8( tvb, offset );
- word = (word << 8) | tvb_get_guint8( tvb, offset +1 );
- mpg_mbz = RTP_MPG_MBZ(word);
- mpg_T = RTP_MPG_T(word);
- mpg_tr = RTP_MPG_TR(word);
-
- octet = tvb_get_guint8( tvb, offset + 2 );
- mpg_an = RTP_MPG_AN(octet);
- mpg_n = RTP_MPG_N(octet);
- mpg_s = RTP_MPG_S(octet);
- mpg_b = RTP_MPG_B(octet);
- mpg_e = RTP_MPG_E(octet);
- mpg_p = RTP_MPG_P(octet);
-
- octet = tvb_get_guint8( tvb, offset + 3 );
-
- mpg_fbv = RTP_MPG_FBV(octet);
- mpg_bfc = RTP_MPG_BFC(octet);
- mpg_ffv = RTP_MPG_FFV(octet);
- mpg_ffc = RTP_MPG_FFC(octet);
-
-
- if ( tree )
- {
- ti = proto_tree_add_item( tree, proto_mpg, tvb, offset, -1, ENC_NA );
- mpg_tree = proto_item_add_subtree( ti, ett_mpg );
-
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_mbz, tvb, offset, 1, mpg_mbz );
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_T , tvb, offset, 1, mpg_T );
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_tr , tvb, offset, 2, mpg_tr );
- offset += 2;
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_an, tvb, offset, 1, mpg_an );
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_n , tvb, offset, 1, mpg_n );
- proto_tree_add_boolean( mpg_tree, hf_rtp_mpg_s , tvb, offset, 1, mpg_s );
- proto_tree_add_boolean( mpg_tree, hf_rtp_mpg_b , tvb, offset, 1, mpg_b );
- proto_tree_add_boolean( mpg_tree, hf_rtp_mpg_e , tvb, offset, 1, mpg_e );
-
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_p, tvb , offset, 1, mpg_p );
- offset += 1;
-
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_fbv, tvb, offset, 1, mpg_fbv );
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_bfc, tvb, offset, 1, mpg_bfc );
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_ffv, tvb, offset, 1, mpg_ffv );
- proto_tree_add_uint( mpg_tree, hf_rtp_mpg_ffc, tvb, offset, 1, mpg_ffc );
- offset += 1;
-
- /* The rest of the packet is the MPEG-1 stream */
- proto_tree_add_item( mpg_tree, hf_rtp_mpg_data, tvb, offset, -1, ENC_NA );
-
- }
+ ti = proto_tree_add_item( tree, proto_mpg, tvb, offset, -1, ENC_NA );
+ mpg_tree = proto_item_add_subtree( ti, ett_mpg );
+
+ proto_tree_add_bitmask_list(mpg_tree, tvb, offset, 2, mpg_fields1, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_bitmask_list(mpg_tree, tvb, offset, 2, mpg_fields2, ENC_BIG_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_bitmask_list(mpg_tree, tvb, offset, 1, mpg_fields3, ENC_NA);
+ offset += 1;
+
+ /* The rest of the packet is the MPEG-1 stream */
+ proto_tree_add_item( mpg_tree, hf_rtp_mpg_data, tvb, offset, -1, ENC_NA );
}
void
@@ -191,7 +140,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0xF800,
NULL, HFILL
}
},
@@ -203,7 +152,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x0400,
NULL, HFILL
}
},
@@ -215,7 +164,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x03FF,
NULL, HFILL
}
},
@@ -227,7 +176,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x80,
NULL, HFILL
}
},
@@ -240,7 +189,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x40,
NULL, HFILL
}
},
@@ -251,9 +200,9 @@ proto_register_mpeg1(void)
"Sequence Header",
"rtp.payload_mpeg_s",
FT_BOOLEAN,
- BASE_NONE,
+ 16,
NULL,
- 0x0,
+ 0x20,
NULL, HFILL
}
},
@@ -264,9 +213,9 @@ proto_register_mpeg1(void)
"Beginning-of-slice",
"rtp.payload_mpeg_b",
FT_BOOLEAN,
- BASE_NONE,
+ 16,
NULL,
- 0x0,
+ 0x10,
NULL, HFILL
}
},
@@ -277,9 +226,9 @@ proto_register_mpeg1(void)
"End-of-slice",
"rtp.payload_mpeg_e",
FT_BOOLEAN,
- BASE_NONE,
+ 16,
NULL,
- 0x0,
+ 0x08,
NULL, HFILL
}
},
@@ -292,7 +241,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
VALS(rtp_mpg_picture_types_vals),
- 0x0,
+ 0x07,
NULL, HFILL
}
},
@@ -305,7 +254,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x80,
NULL, HFILL
}
},
@@ -318,7 +267,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x70,
NULL, HFILL
}
},
@@ -330,7 +279,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x08,
NULL, HFILL
}
},
@@ -343,7 +292,7 @@ proto_register_mpeg1(void)
FT_UINT16,
BASE_DEC,
NULL,
- 0x0,
+ 0x07,
NULL, HFILL
}
},
diff --git a/epan/dissectors/packet-ndps.c b/epan/dissectors/packet-ndps.c
index a6fa418e7f..c295bd5d46 100644
--- a/epan/dissectors/packet-ndps.c
+++ b/epan/dissectors/packet-ndps.c
@@ -5345,8 +5345,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g
foffset += 4;
proto_tree_add_item(ndps_tree, hf_ndps_profile_id, tvb, foffset, 4, ENC_BIG_ENDIAN);
foffset += 4;
- supplier_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_supplier_flag, tvb, foffset, 4, supplier_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_supplier_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &supplier_flag);
foffset += 4;
if (supplier_flag)
{
@@ -5361,16 +5360,14 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g
foffset += length;
proto_item_set_end(aitem, tvb, foffset);
}
- language_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_language_flag, tvb, foffset, 4, language_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_language_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &language_flag);
foffset += 4;
if (language_flag)
{
proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN);
foffset += 4;
}
- method_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_method_flag, tvb, foffset, 4, method_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_method_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &method_flag);
foffset += 4;
if (method_flag)
{
@@ -5380,8 +5377,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g
proto_item_set_end(aitem, tvb, foffset);
/* End of NameorID */
}
- delivery_address_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_delivery_address_flag, tvb, foffset, 4, delivery_address_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_delivery_address_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &delivery_address_flag);
foffset += 4;
if (delivery_address_flag)
{
@@ -5903,8 +5899,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g
foffset += 4;
proto_tree_add_item(ndps_tree, hf_ndps_profile_id, tvb, foffset, 4, ENC_BIG_ENDIAN);
foffset += 4;
- supplier_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_supplier_flag, tvb, foffset, 4, supplier_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_supplier_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &supplier_flag);
foffset += 4;
if (supplier_flag)
{
@@ -5919,16 +5914,14 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g
foffset += length;
proto_item_set_end(aitem, tvb, foffset);
}
- language_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_language_flag, tvb, foffset, 4, language_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_language_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &language_flag);
foffset += 4;
if (language_flag)
{
proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN);
foffset += 4;
}
- method_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_method_flag, tvb, foffset, 4, method_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_method_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &method_flag);
foffset += 4;
if (method_flag)
{
@@ -5938,8 +5931,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g
proto_item_set_end(aitem, tvb, foffset);
/* End of NameorID */
}
- delivery_address_flag = tvb_get_ntohl(tvb, foffset);
- proto_tree_add_boolean(ndps_tree, hf_ndps_delivery_address_flag, tvb, foffset, 4, delivery_address_flag);
+ proto_tree_add_item_ret_uint(ndps_tree, hf_ndps_delivery_address_flag, tvb, foffset, 4, ENC_BIG_ENDIAN, &delivery_address_flag);
foffset += 4;
if (delivery_address_flag)
{
@@ -9200,7 +9192,7 @@ proto_register_ndps(void)
{ &hf_ndps_supplier_flag,
{ "Supplier Data?", "ndps.supplier_flag",
- FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_ndps_language_flag,
diff --git a/epan/dissectors/packet-nsip.c b/epan/dissectors/packet-nsip.c
index c68cd0aefc..cbf5af7b4c 100644
--- a/epan/dissectors/packet-nsip.c
+++ b/epan/dissectors/packet-nsip.c
@@ -54,11 +54,13 @@ static int hf_nsip_max_num_ns_vc = -1;
static int hf_nsip_num_ip4_endpoints = -1;
static int hf_nsip_num_ip6_endpoints = -1;
static int hf_nsip_reset_flag = -1;
+static int hf_nsip_reset_flag_bit = -1;
static int hf_nsip_reset_flag_spare = -1;
static int hf_nsip_ip_address_type = -1;
static int hf_nsip_ip_address_ipv4 = -1;
static int hf_nsip_ip_address_ipv6 = -1;
static int hf_nsip_end_flag = -1;
+static int hf_nsip_end_flag_bit = -1;
static int hf_nsip_end_flag_spare = -1;
static int hf_nsip_control_bits = -1;
static int hf_nsip_control_bits_r = -1;
@@ -500,28 +502,19 @@ decode_iei_num_ip6_endpoints(nsip_ie_t *ie, build_info_t *bi, int ie_start_offse
}
static void
-decode_iei_reset_flag(nsip_ie_t *ie, build_info_t *bi, int ie_start_offset) {
+decode_iei_reset_flag(nsip_ie_t *ie _U_, build_info_t *bi, int ie_start_offset) {
guint8 flag;
- proto_tree *field_tree;
+ static const int * reset_flags[] = {
+ &hf_nsip_reset_flag_bit,
+ &hf_nsip_reset_flag_spare,
+ };
flag = tvb_get_guint8(bi->tvb, bi->offset);
- if (bi->nsip_tree) {
+ proto_tree_add_bitmask(bi->nsip_tree, bi->tvb, ie_start_offset, hf_nsip_reset_flag,
+ ett_nsip_reset_flag, reset_flags, ENC_NA);
- field_tree = proto_tree_add_subtree_format(bi->nsip_tree, bi->tvb, ie_start_offset,
- ie->total_length, ett_nsip_reset_flag, NULL,
- "Reset Flag: %#02x", flag);
-
- proto_tree_add_boolean(field_tree, hf_nsip_reset_flag, bi->tvb,
- bi->offset, 1,
- flag & NSIP_MASK_RESET_FLAG);
- if (flag & NSIP_MASK_RESET_FLAG) {
- col_append_sep_fstr(bi->pinfo->cinfo, COL_INFO, NSIP_SEP,
- "Reset");
- proto_item_append_text(bi->ti, ", Reset");
- }
- proto_tree_add_uint(field_tree, hf_nsip_reset_flag_spare,
- bi->tvb, bi->offset, 1,
- flag & NSIP_MASK_RESET_FLAG_SPARE);
+ if (flag & NSIP_MASK_RESET_FLAG) {
+ col_append_sep_fstr(bi->pinfo->cinfo, COL_INFO, NSIP_SEP, "Reset");
}
bi->offset += 1;
}
@@ -568,27 +561,14 @@ decode_iei_transaction_id(nsip_ie_t *ie, build_info_t *bi, int ie_start_offset)
}
static void
-decode_iei_end_flag(nsip_ie_t *ie, build_info_t *bi, int ie_start_offset) {
- guint8 flag;
- proto_tree *field_tree;
+decode_iei_end_flag(nsip_ie_t *ie _U_, build_info_t *bi, int ie_start_offset) {
+ static const int * end_flags[] = {
+ &hf_nsip_end_flag_bit,
+ &hf_nsip_end_flag_spare,
+ };
- if (bi->nsip_tree) {
- flag = tvb_get_guint8(bi->tvb, bi->offset);
-
- field_tree = proto_tree_add_subtree_format(bi->nsip_tree, bi->tvb, ie_start_offset,
- ie->total_length, ett_nsip_end_flag, NULL,
- "End Flag: %#02x", flag);
-
- proto_tree_add_boolean(field_tree, hf_nsip_end_flag, bi->tvb,
- bi->offset, 1,
- flag & NSIP_MASK_END_FLAG);
- if (flag & NSIP_MASK_END_FLAG) {
- proto_item_append_text(bi->ti, ", End");
- }
- proto_tree_add_uint(field_tree, hf_nsip_end_flag_spare,
- bi->tvb, bi->offset, 1,
- flag & NSIP_MASK_END_FLAG_SPARE);
- }
+ proto_tree_add_bitmask(bi->nsip_tree, bi->tvb, ie_start_offset, hf_nsip_end_flag,
+ ett_nsip_end_flag, end_flags, ENC_NA);
bi->offset += 1;
}
@@ -1036,6 +1016,11 @@ proto_register_nsip(void)
NULL, HFILL }
},
{ &hf_nsip_reset_flag,
+ { "Reset flag", "nsip.reset_flag",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_nsip_reset_flag_bit,
{ "Reset flag", "nsip.reset_flag.flag",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), NSIP_MASK_RESET_FLAG,
NULL, HFILL }
@@ -1061,6 +1046,11 @@ proto_register_nsip(void)
NULL, HFILL }
},
{ &hf_nsip_end_flag,
+ { "End flag", "nsip.end_flag",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_nsip_end_flag_bit,
{ "End flag", "nsip.end_flag.flag",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), NSIP_MASK_END_FLAG,
NULL, HFILL }
diff --git a/epan/dissectors/packet-nstrace.c b/epan/dissectors/packet-nstrace.c
index 4bde2421b2..a3ceb89504 100644
--- a/epan/dissectors/packet-nstrace.c
+++ b/epan/dissectors/packet-nstrace.c
@@ -406,11 +406,8 @@ dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
struct nstr_phdr *pnstr = &(pinfo->pseudo_header->nstr);
tvbuff_t *next_tvb_eth_client;
guint8 offset;
- guint i, bpos;
wmem_strbuf_t *flags_strbuf = wmem_strbuf_new_label(wmem_packet_scope());
- static const gchar *flags[] = {"FP", "FR", "DFD", "SRSS", "RSSH"};
- gboolean first_flag = TRUE;
- guint8 flagoffset, flagval;
+ guint8 flagoffset;
guint8 src_vmname_len = 0, dst_vmname_len = 0;
guint8 variable_ns_len = 0;
@@ -456,34 +453,22 @@ dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
case NSPR_HEADER_VERSION204:
-
- flagoffset = pnstr->clflags_offset;
- flagval = tvb_get_guint8(tvb, flagoffset);
-
- for (i = 0; i < 5; i++) {
- bpos = 1 << i;
- if (flagval & bpos) {
- if (first_flag) {
- wmem_strbuf_truncate(flags_strbuf, 0);
- }
- wmem_strbuf_append_printf(flags_strbuf, "%s%s", first_flag ? "" : ", ", flags[i]);
- first_flag = FALSE;
- }
- }
+ {
+ static const int * clflags[] = {
+ &hf_ns_clflags_res,
+ &hf_ns_clflags_rssh,
+ &hf_ns_clflags_rss,
+ &hf_ns_clflags_dfd,
+ &hf_ns_clflags_fr,
+ &hf_ns_clflags_fp,
+ NULL
+ };
proto_tree_add_item(ns_tree, hf_ns_snode, tvb, pnstr->srcnodeid_offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(ns_tree, hf_ns_dnode, tvb, pnstr->destnodeid_offset, 2, ENC_LITTLE_ENDIAN);
- flagitem = proto_tree_add_uint_format_value(ns_tree, hf_ns_clflags, tvb, flagoffset, 1, flagval,
- "0x%02x (%s)", flagval, wmem_strbuf_get_str(flags_strbuf));
- flagtree = proto_item_add_subtree(flagitem, ett_ns_flags);
-
- proto_tree_add_boolean(flagtree, hf_ns_clflags_res, tvb, flagoffset, 1, flagval);
- proto_tree_add_boolean(flagtree, hf_ns_clflags_rssh, tvb, flagoffset, 1, flagval);
- proto_tree_add_boolean(flagtree, hf_ns_clflags_rss, tvb, flagoffset, 1, flagval);
- proto_tree_add_boolean(flagtree, hf_ns_clflags_dfd, tvb, flagoffset, 1, flagval);
- proto_tree_add_boolean(flagtree, hf_ns_clflags_fr, tvb, flagoffset, 1, flagval);
- proto_tree_add_boolean(flagtree, hf_ns_clflags_fp, tvb, flagoffset, 1, flagval);
+ proto_tree_add_bitmask(ns_tree, tvb, pnstr->clflags_offset, hf_ns_clflags, ett_ns_flags, clflags, ENC_NA);
+ }
/* fall through to next case */
case NSPR_HEADER_VERSION203:
diff --git a/epan/dissectors/packet-ntp.c b/epan/dissectors/packet-ntp.c
index 0d139ee2ab..344ea16490 100644
--- a/epan/dissectors/packet-ntp.c
+++ b/epan/dissectors/packet-ntp.c
@@ -1377,8 +1377,6 @@ dissect_ntp_priv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *ntp_tree, gu
offset = 8 + itemsize * i;
- v6_flag = tvb_get_ntohl(tvb, offset + 32);
-
monlist_item = proto_tree_add_string_format(ntp_tree, hf_monlist_item, tvb, offset,
itemsize, "Monlist Item", "Monlist item: address: %s:%u",
tvb_ip_to_str(tvb, offset + 16), tvb_get_ntohs(tvb, offset + 28));
@@ -1394,7 +1392,7 @@ dissect_ntp_priv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *ntp_tree, gu
proto_tree_add_item(monlist_item_tree, hf_ntppriv_port, tvb, offset + 28, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(monlist_item_tree, hf_ntppriv_mode, tvb, offset + 30, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(monlist_item_tree, hf_ntppriv_version, tvb, offset + 31, 1, ENC_BIG_ENDIAN);
- proto_tree_add_boolean(monlist_item_tree, hf_ntppriv_v6_flag, tvb, offset + 32, 4, v6_flag);
+ proto_tree_add_item_ret_uint(monlist_item_tree, hf_ntppriv_v6_flag, tvb, offset + 32, 4, ENC_BIG_ENDIAN, &v6_flag);
if (v6_flag != 0) {
proto_tree_add_item(monlist_item_tree, hf_ntppriv_addr6, tvb, offset + 36, 16, ENC_NA);
diff --git a/epan/dissectors/packet-oampdu.c b/epan/dissectors/packet-oampdu.c
index c749a677e0..921856010e 100644
--- a/epan/dissectors/packet-oampdu.c
+++ b/epan/dissectors/packet-oampdu.c
@@ -1715,14 +1715,14 @@ dissect_oampdu_variable_response(tvbuff_t *tvb, proto_tree *tree)
static void
dissect_oampdu_loopback_control(tvbuff_t *tvb, proto_tree *tree)
{
- guint8 ctrl;
guint32 offset;
guint16 bytes;
- proto_tree *ctrl_tree;
- proto_item *ctrl_item;
-
- const char *sep;
+ static const int * ctrl[] = {
+ &hf_oampdu_lpbk_enable,
+ &hf_oampdu_lpbk_disable,
+ NULL
+ };
offset = OAMPDU_HEADER_SIZE;
@@ -1730,27 +1730,7 @@ dissect_oampdu_loopback_control(tvbuff_t *tvb, proto_tree *tree)
if (bytes >= 1)
{
- ctrl = tvb_get_guint8(tvb, offset);
-
- ctrl_item = proto_tree_add_uint(tree, hf_oampdu_lpbk,
- tvb, offset, 1, ctrl);
-
- ctrl_tree = proto_item_add_subtree(ctrl_item, ett_oampdu_lpbk_ctrl);
-
- sep = initial_sep;
-
- APPEND_BOOLEAN_FLAG(ctrl & OAMPDU_LPBK_ENABLE, ctrl_item,
- "%sEnable Remote Loopack");
- proto_tree_add_boolean(ctrl_tree, hf_oampdu_lpbk_enable,
- tvb, offset, 1, ctrl);
-
- APPEND_BOOLEAN_FLAG(ctrl & OAMPDU_LPBK_DISABLE, ctrl_item,
- "%sDisable Remote Loopback");
- proto_tree_add_boolean(ctrl_tree, hf_oampdu_lpbk_disable,
- tvb, offset, 1, ctrl);
-
- if (sep != initial_sep)
- proto_item_append_text(ctrl_item, ")");
+ proto_tree_add_bitmask(tree, tvb, offset, hf_oampdu_lpbk, ett_oampdu_lpbk_ctrl, ctrl, ENC_NA);
}
}
diff --git a/epan/dissectors/packet-ositp.c b/epan/dissectors/packet-ositp.c
index b7a2b260f8..15db2649a9 100644
--- a/epan/dissectors/packet-ositp.c
+++ b/epan/dissectors/packet-ositp.c
@@ -1512,6 +1512,12 @@ static int ositp_decode_CC(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
tvbuff_t *next_tvb;
guint tpdu_len;
heur_dtbl_entry_t *hdtbl_entry;
+ static const int * class_options[] = {
+ &hf_cotp_class,
+ &hf_cotp_opts_extended_formats,
+ &hf_cotp_opts_no_explicit_flow_control,
+ NULL,
+ };
src_ref = tvb_get_ntohs(tvb, offset + P_SRC_REF);
@@ -1531,26 +1537,20 @@ static int ositp_decode_CC(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
"%s TPDU src-ref: 0x%04x dst-ref: 0x%04x",
(tpdu == CR_TPDU) ? "CR" : "CC", src_ref, dst_ref);
- if (tree) {
- ti = proto_tree_add_item(tree, proto_cotp, tvb, offset, li + 1, ENC_NA);
- cotp_tree = proto_item_add_subtree(ti, ett_cotp);
- proto_tree_add_uint(cotp_tree, hf_cotp_li, tvb, offset, 1,li);
- }
+ ti = proto_tree_add_item(tree, proto_cotp, tvb, offset, li + 1, ENC_NA);
+ cotp_tree = proto_item_add_subtree(ti, ett_cotp);
+ proto_tree_add_uint(cotp_tree, hf_cotp_li, tvb, offset, 1,li);
offset += 1;
- if (tree) {
- item = proto_tree_add_uint(cotp_tree, hf_cotp_type, tvb, offset, 1, tpdu);
- }
+ item = proto_tree_add_uint(cotp_tree, hf_cotp_type, tvb, offset, 1, tpdu);
offset += 1;
li -= 1;
- if (tree)
- proto_tree_add_uint(cotp_tree, hf_cotp_destref, tvb, offset, 2, dst_ref);
+ proto_tree_add_uint(cotp_tree, hf_cotp_destref, tvb, offset, 2, dst_ref);
offset += 2;
li -= 2;
- if (tree)
- proto_tree_add_uint(cotp_tree, hf_cotp_srcref, tvb, offset, 2, src_ref);
+ proto_tree_add_uint(cotp_tree, hf_cotp_srcref, tvb, offset, 2, src_ref);
offset += 2;
li -= 2;
@@ -1560,17 +1560,10 @@ static int ositp_decode_CC(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
expert_add_info_format(pinfo, item, &ei_cotp_connection, "Connection %s: 0x%x -> 0x%x", tpdu == CR_TPDU ? "Request(CR)" : "Confirm(CC)", src_ref, dst_ref);
}
- if (tree) {
- proto_tree_add_uint(cotp_tree, hf_cotp_class, tvb, offset, 1, class_option);
- proto_tree_add_boolean(cotp_tree, hf_cotp_opts_extended_formats, tvb,
- offset, 1, class_option);
- proto_tree_add_boolean(cotp_tree, hf_cotp_opts_no_explicit_flow_control,
- tvb, offset, 1, class_option);
- }
+ proto_tree_add_bitmask_list(cotp_tree, tvb, offset, 1, class_options, ENC_NA);
offset += 1;
li -= 1;
- if (tree) {
/* Microsoft runs their Remote Desktop Protocol atop ISO COTP
atop TPKT, and does some weird stuff in the CR packet:
@@ -1595,9 +1588,8 @@ static int ositp_decode_CC(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
XXX - have TPKT know that a given session is an RDP session,
and let us know, so we know whether to check for this stuff. */
- ositp_decode_var_part(tvb, offset, li, class_option, tpdu_len , pinfo,
+ ositp_decode_var_part(tvb, offset, li, class_option, tpdu_len , pinfo,
cotp_tree);
- }
offset += li;
/*
diff --git a/epan/dissectors/packet-pagp.c b/epan/dissectors/packet-pagp.c
index 7060a34b13..af69587ffe 100644
--- a/epan/dissectors/packet-pagp.c
+++ b/epan/dissectors/packet-pagp.c
@@ -121,9 +121,6 @@ static expert_field ei_pagp_tlv_length = EI_INIT;
/* General declarations and macros */
-static const char initial_sep[] = " (";
-static const char cont_sep[] = ", ";
-
static const value_string pdu_vers[] = {
{ 1, "Info PDU" },
{ 2, "Flush PDU" },
@@ -149,19 +146,11 @@ static const true_false_string automode = {
"Desirable Mode"
};
-#define APPEND_BOOLEAN_FLAG(flag, item, string) \
- if(flag) { \
- if(item) \
- proto_item_append_text(item, string, sep); \
- sep = cont_sep; \
- }
-
/* Code to actually dissect the PAGP packets */
static void
dissect_pagp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint32 raw_word;
- guint16 raw_half_word;
guint16 num_tlvs;
guint16 tlv;
guint16 len;
@@ -171,15 +160,15 @@ dissect_pagp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint8 flags;
- guchar *ch;
-
proto_tree *pagp_tree = NULL;
proto_item *pagp_item, *len_item;
- proto_tree *flags_tree;
- proto_item *flags_item;
proto_tree *tlv_tree;
-
- const char *sep;
+ static const int * pagp_flags[] = {
+ &hf_pagp_flags_slow_hello,
+ &hf_pagp_flags_auto_mode,
+ &hf_pagp_flags_consistent_state,
+ NULL,
+ };
col_set_str(pinfo->cinfo, COL_PROTOCOL, "PAGP"); /* PAGP Protocol */
@@ -226,32 +215,7 @@ dissect_pagp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
flags = tvb_get_guint8(tvb, PAGP_FLAGS);
col_append_fstr(pinfo->cinfo, COL_INFO, "; Flags 0x%x", flags);
- if (tree) {
- flags_item = proto_tree_add_uint(pagp_tree, hf_pagp_flags, tvb,
- PAGP_FLAGS, 1, flags);
- flags_tree = proto_item_add_subtree(flags_item, ett_pagp_flags);
-
- sep = initial_sep;
-
- APPEND_BOOLEAN_FLAG(flags & PAGP_FLAGS_SLOW_HELLO, flags_item, "%sSlow Hello");
- proto_tree_add_boolean(flags_tree, hf_pagp_flags_slow_hello, tvb,
- PAGP_FLAGS, 1, flags);
-
- APPEND_BOOLEAN_FLAG(flags & PAGP_FLAGS_AUTO_MODE, flags_item, "%sAuto Mode");
- proto_tree_add_boolean(flags_tree, hf_pagp_flags_auto_mode, tvb,
- PAGP_FLAGS, 1, flags);
-
- APPEND_BOOLEAN_FLAG(flags & PAGP_FLAGS_CONSISTENT_STATE, flags_item,
- "%sConsistent State");
- proto_tree_add_boolean(flags_tree, hf_pagp_flags_consistent_state, tvb,
- PAGP_FLAGS, 1, flags);
-
- sep = cont_sep;
- if (sep != initial_sep) {
- /* We put something in; put in the terminating ")" */
- proto_item_append_text(flags_item, ")");
- }
- }
+ proto_tree_add_bitmask(pagp_tree, tvb, PAGP_FLAGS, hf_pagp_flags, ett_pagp_flags, pagp_flags, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, "; Local DevID: %s",
tvb_ether_to_str(tvb, PAGP_LOCAL_DEVICE_ID));
@@ -260,25 +224,20 @@ dissect_pagp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
PAGP_LOCAL_DEVICE_ID, 6, ENC_NA);
if (tree) {
- raw_octet = tvb_get_guint8(tvb, PAGP_LOCAL_LEARN_CAP);
- proto_tree_add_uint(pagp_tree, hf_pagp_local_learn_cap, tvb,
- PAGP_LOCAL_LEARN_CAP, 1, raw_octet);
+ proto_tree_add_item(pagp_tree, hf_pagp_local_learn_cap, tvb,
+ PAGP_LOCAL_LEARN_CAP, 1, ENC_NA);
- raw_octet = tvb_get_guint8(tvb, PAGP_LOCAL_PORT_PRIORITY);
- proto_tree_add_uint(pagp_tree, hf_pagp_local_port_priority, tvb,
- PAGP_LOCAL_PORT_PRIORITY, 1, raw_octet);
+ proto_tree_add_item(pagp_tree, hf_pagp_local_port_priority, tvb,
+ PAGP_LOCAL_PORT_PRIORITY, 1, ENC_NA);
- raw_word = tvb_get_ntohl(tvb, PAGP_LOCAL_SENT_PORT_IFINDEX);
- proto_tree_add_uint(pagp_tree, hf_pagp_local_sent_port_ifindex, tvb,
- PAGP_LOCAL_SENT_PORT_IFINDEX, 4, raw_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_local_sent_port_ifindex, tvb,
+ PAGP_LOCAL_SENT_PORT_IFINDEX, 4, ENC_BIG_ENDIAN);
- raw_word = tvb_get_ntohl(tvb, PAGP_LOCAL_GROUP_CAPABILITY);
- proto_tree_add_uint(pagp_tree, hf_pagp_local_group_capability, tvb,
- PAGP_LOCAL_GROUP_CAPABILITY, 4, raw_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_local_group_capability, tvb,
+ PAGP_LOCAL_GROUP_CAPABILITY, 4, ENC_BIG_ENDIAN);
- raw_word = tvb_get_ntohl(tvb, PAGP_LOCAL_GROUP_IFINDEX);
- proto_tree_add_uint(pagp_tree, hf_pagp_local_group_ifindex, tvb,
- PAGP_LOCAL_GROUP_IFINDEX, 4, raw_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_local_group_ifindex, tvb,
+ PAGP_LOCAL_GROUP_IFINDEX, 4, ENC_BIG_ENDIAN);
}
col_append_fstr(pinfo->cinfo, COL_INFO, ", Partner DevID: %s",
@@ -287,29 +246,23 @@ dissect_pagp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree_add_item(pagp_tree, hf_pagp_partner_device_id, tvb,
PAGP_PARTNER_DEVICE_ID, 6, ENC_NA);
- raw_octet = tvb_get_guint8(tvb, PAGP_PARTNER_LEARN_CAP);
- proto_tree_add_uint(pagp_tree, hf_pagp_partner_learn_cap, tvb,
- PAGP_PARTNER_LEARN_CAP, 1, raw_octet);
+ proto_tree_add_item(pagp_tree, hf_pagp_partner_learn_cap, tvb,
+ PAGP_PARTNER_LEARN_CAP, 1, ENC_NA);
- raw_octet = tvb_get_guint8(tvb, PAGP_PARTNER_PORT_PRIORITY);
- proto_tree_add_uint(pagp_tree, hf_pagp_partner_port_priority, tvb,
- PAGP_PARTNER_PORT_PRIORITY, 1, raw_octet);
+ proto_tree_add_item(pagp_tree, hf_pagp_partner_port_priority, tvb,
+ PAGP_PARTNER_PORT_PRIORITY, 1, ENC_NA);
- raw_word = tvb_get_ntohl(tvb, PAGP_PARTNER_SENT_PORT_IFINDEX);
- proto_tree_add_uint(pagp_tree, hf_pagp_partner_sent_port_ifindex, tvb,
- PAGP_PARTNER_SENT_PORT_IFINDEX, 4, raw_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_partner_sent_port_ifindex, tvb,
+ PAGP_PARTNER_SENT_PORT_IFINDEX, 4, ENC_BIG_ENDIAN);
- raw_word = tvb_get_ntohl(tvb, PAGP_PARTNER_GROUP_CAPABILITY);
- proto_tree_add_uint(pagp_tree, hf_pagp_partner_group_capability, tvb,
- PAGP_PARTNER_GROUP_CAPABILITY, 4, raw_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_partner_group_capability, tvb,
+ PAGP_PARTNER_GROUP_CAPABILITY, 4, ENC_BIG_ENDIAN);
- raw_word = tvb_get_ntohl(tvb, PAGP_PARTNER_GROUP_IFINDEX);
- proto_tree_add_uint(pagp_tree, hf_pagp_partner_group_ifindex, tvb,
- PAGP_PARTNER_GROUP_IFINDEX, 4, raw_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_partner_group_ifindex, tvb,
+ PAGP_PARTNER_GROUP_IFINDEX, 4, ENC_BIG_ENDIAN);
- raw_half_word = tvb_get_ntohs(tvb, PAGP_PARTNER_COUNT);
- proto_tree_add_uint(pagp_tree, hf_pagp_partner_count, tvb,
- PAGP_PARTNER_COUNT, 2, raw_half_word);
+ proto_tree_add_item(pagp_tree, hf_pagp_partner_count, tvb,
+ PAGP_PARTNER_COUNT, 2, ENC_BIG_ENDIAN);
num_tlvs = tvb_get_ntohs(tvb, PAGP_NUM_TLVS);
proto_tree_add_uint(pagp_tree, hf_pagp_num_tlvs, tvb,
@@ -340,14 +293,12 @@ dissect_pagp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
switch (tlv) {
case PAGP_TLV_DEVICE_NAME:
- ch = tvb_get_string_enc(wmem_packet_scope(), tvb, offset+4, len-4, ENC_ASCII);
- proto_tree_add_string(tlv_tree, hf_pagp_tlv_device_name,
- tvb, offset+4, len-4, ch);
+ proto_tree_add_item(tlv_tree, hf_pagp_tlv_device_name,
+ tvb, offset+4, len-4, ENC_NA|ENC_ASCII);
break;
case PAGP_TLV_PORT_NAME:
- ch = tvb_get_string_enc(wmem_packet_scope(), tvb, offset+4, len-4, ENC_ASCII);
- proto_tree_add_string(tlv_tree, hf_pagp_tlv_port_name,
- tvb, offset+4, len-4, ch);
+ proto_tree_add_item(tlv_tree, hf_pagp_tlv_port_name,
+ tvb, offset+4, len-4, ENC_NA|ENC_ASCII);
break;
case PAGP_TLV_AGPORT_MAC:
proto_tree_add_item(tlv_tree, hf_pagp_tlv_agport_mac,
diff --git a/epan/dissectors/packet-pana.c b/epan/dissectors/packet-pana.c
index 662a497771..4a755be9f2 100644
--- a/epan/dissectors/packet-pana.c
+++ b/epan/dissectors/packet-pana.c
@@ -220,38 +220,18 @@ dissect_pana_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static void
dissect_pana_flags(proto_tree *parent_tree, tvbuff_t *tvb, int offset, guint16 flags)
{
+ static const int * flag_fields[] = {
+ &hf_pana_flag_r,
+ &hf_pana_flag_s,
+ &hf_pana_flag_c,
+ &hf_pana_flag_a,
+ &hf_pana_flag_p,
+ &hf_pana_flag_i,
+ NULL,
+ };
- proto_item *flags_item;
- proto_tree *flags_tree;
-
- if(parent_tree == NULL)
- return;
-
- flags_item = proto_tree_add_uint(parent_tree, hf_pana_flags, tvb,
- offset, 2, flags);
- flags_tree = proto_item_add_subtree(flags_item, ett_pana_flags);
-
- proto_tree_add_boolean(flags_tree, hf_pana_flag_r, tvb, offset, 2, flags);
- if (flags & PANA_FLAG_R)
- proto_item_append_text(flags_item, ", Request");
- else
- proto_item_append_text(flags_item, ", Answer");
- proto_tree_add_boolean(flags_tree, hf_pana_flag_s, tvb, offset, 2, flags);
- if (flags & PANA_FLAG_S)
- proto_item_append_text(flags_item, ", S flag set");
- proto_tree_add_boolean(flags_tree, hf_pana_flag_c, tvb, offset, 2, flags);
- if (flags & PANA_FLAG_C)
- proto_item_append_text(flags_item, ", C flag set");
- proto_tree_add_boolean(flags_tree, hf_pana_flag_a, tvb, offset, 2, flags);
- if (flags & PANA_FLAG_A)
- proto_item_append_text(flags_item, ", A flag set");
- proto_tree_add_boolean(flags_tree, hf_pana_flag_p, tvb, offset, 2, flags);
- if (flags & PANA_FLAG_P)
- proto_item_append_text(flags_item, ", P flag set");
- proto_tree_add_boolean(flags_tree, hf_pana_flag_i, tvb, offset, 2, flags);
- if (flags & PANA_FLAG_I)
- proto_item_append_text(flags_item, ", I flag set");
-
+ proto_tree_add_bitmask_value_with_flags(parent_tree, tvb, offset, hf_pana_flags,
+ ett_pana_flags, flag_fields, flags, BMT_NO_TFS|BMT_NO_FALSE);
}
@@ -261,22 +241,13 @@ dissect_pana_flags(proto_tree *parent_tree, tvbuff_t *tvb, int offset, guint16 f
static void
dissect_pana_avp_flags(proto_tree *parent_tree, tvbuff_t *tvb, int offset, guint16 flags)
{
+ static const int * flag_fields[] = {
+ &hf_pana_avp_flag_v,
+ NULL,
+ };
- proto_item *avp_flags_item;
- proto_tree *avp_flags_tree;
-
- if(parent_tree == NULL) {
- return;
- }
- avp_flags_item = proto_tree_add_uint(parent_tree, hf_pana_avp_flags, tvb,
- offset, 2, flags);
- avp_flags_tree = proto_item_add_subtree(avp_flags_item, ett_pana_avp_flags);
-
- proto_tree_add_boolean(avp_flags_tree, hf_pana_avp_flag_v, tvb, offset, 2, flags);
- if (flags & PANA_AVP_FLAG_V) {
- proto_item_append_text(avp_flags_item, ", Vendor");
- }
-
+ proto_tree_add_bitmask_value_with_flags(parent_tree, tvb, offset, hf_pana_avp_flags,
+ ett_pana_avp_flags, flag_fields, flags, BMT_NO_TFS|BMT_NO_FALSE);
}