summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-gsm_cbch.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2015-08-12 09:01:45 -0400
committerAnders Broman <a.broman58@gmail.com>2015-08-15 06:49:38 +0000
commit828254042a703fd8452f87873c01c3260a67d554 (patch)
treeef5f568e24ea8148ca6e7bd55d734ac33be4a249 /epan/dissectors/packet-gsm_cbch.c
parent8368f3b7f0b59cdb41a2a91543d7e01ff10afb06 (diff)
downloadwireshark-828254042a703fd8452f87873c01c3260a67d554.tar.gz
Eliminate proto_tree_add_text from GSM dissectors.
Change-Id: I36a3d15a4fa86847a83d1dbea40111d36d7cfd61 Reviewed-on: https://code.wireshark.org/review/10036 Reviewed-by: Michael Mann <mmann78@netscape.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-gsm_cbch.c')
-rw-r--r--epan/dissectors/packet-gsm_cbch.c73
1 files changed, 52 insertions, 21 deletions
diff --git a/epan/dissectors/packet-gsm_cbch.c b/epan/dissectors/packet-gsm_cbch.c
index e84e23cc78..82a0c1d853 100644
--- a/epan/dissectors/packet-gsm_cbch.c
+++ b/epan/dissectors/packet-gsm_cbch.c
@@ -26,6 +26,7 @@
#include <epan/packet.h>
#include <epan/reassemble.h>
+#include <epan/expert.h>
void proto_register_gsm_cbch(void);
void proto_reg_handoff_gsm_cbch(void);
@@ -69,6 +70,8 @@ static int hf_gsm_cbch_sched_spare = -1;
static int hf_gsm_cbch_sched_end_slot = -1;
static int hf_gsm_cbch_slot = -1;
/* static int hf_gsm_cbch_sched_msg_id = -1; */
+static int hf_gsm_cbch_padding = -1;
+static int hf_gsm_cbch_block = -1;
/* These fields are used when reassembling cbch fragments
*/
@@ -90,6 +93,11 @@ static gint ett_schedule_new_msg = -1;
static gint ett_cbch_fragment = -1;
static gint ett_cbch_fragments = -1;
+static expert_field ei_gsm_cbch_sched_end_slot = EI_INIT;
+static expert_field ei_gsm_cbch_seq_num_null = EI_INIT;
+static expert_field ei_gsm_cbch_seq_num_reserved = EI_INIT;
+static expert_field ei_gsm_cbch_lpd = EI_INIT;
+
static dissector_handle_t data_handle;
static dissector_handle_t cbs_handle;
@@ -129,6 +137,15 @@ cbch_defragment_cleanup(void)
reassembly_table_destroy(&cbch_block_reassembly_table);
}
+static const range_string gsm_cbch_sched_begin_slot_rvals[] = {
+ { 0, 0, "Out of range (ignoring message)" },
+ { 1, 1, "(apparently) Scheduled Scheduling Message" },
+ { 2, 48, "(apparently) Unscheduled Scheduling Message" },
+ { 49, 0xFF, "Out of range (ignoring message)" },
+
+ { 0x00, 0x00, NULL },
+};
+
static void
dissect_schedule_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *top_tree)
{
@@ -153,27 +170,19 @@ dissect_schedule_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *top_tree
octet1 = tvb_get_guint8(tvb, offset);
if (0 == (octet1 & 0xC0))
{
+ proto_item* slot_item;
sched_begin = octet1 & 0x3F;
proto_tree_add_item(sched_tree, hf_gsm_cbch_sched_begin_slot, tvb, offset++, 1, ENC_BIG_ENDIAN);
- if (1 == sched_begin)
+ if ((sched_begin < 1) || (sched_begin > 48))
{
- proto_tree_add_text(sched_tree, tvb, offset - 1, 1, "(apparently) Scheduled Scheduling Message");
- }
- else if ((2 <= sched_begin) && (48 >= sched_begin))
- {
- proto_tree_add_text(sched_tree, tvb, offset - 1, 1, "(apparently) Unscheduled Scheduling Message");
- }
- else
- {
- proto_tree_add_text(sched_tree, tvb, offset - 1, 1, "Begin Slot Number out of range: ignoring message");
valid_message = FALSE;
}
proto_tree_add_item(sched_tree, hf_gsm_cbch_sched_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
sched_end = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(sched_tree, hf_gsm_cbch_sched_end_slot, tvb, offset++, 1, ENC_BIG_ENDIAN);
+ slot_item = proto_tree_add_item(sched_tree, hf_gsm_cbch_sched_end_slot, tvb, offset++, 1, ENC_BIG_ENDIAN);
if (sched_end < sched_begin)
{
- proto_tree_add_text(sched_tree, tvb, offset - 1, 1, "End Slot Number less than Begin Slot Number: ignoring message");
+ expert_add_info(pinfo, slot_item, &ei_gsm_cbch_sched_end_slot);
valid_message = FALSE;
}
@@ -355,7 +364,7 @@ dissect_schedule_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *top_tree
}
}
proto_item_set_end(item, tvb, offset);
- proto_tree_add_text(sched_tree, tvb, offset, -1, "Padding");
+ proto_tree_add_item(sched_tree, hf_gsm_cbch_padding, tvb, offset, -1, ENC_NA);
}
}
}
@@ -366,7 +375,7 @@ dissect_cbch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
fragment_head *frag_data = NULL;
guint8 octet, lb, lpd, seq_num;
guint32 offset;
- proto_item *cbch_item;
+ proto_item *cbch_item, *lpd_item, *seq_item;
proto_tree *cbch_tree;
tvbuff_t *reass_tvb = NULL, *msg_tvb = NULL;
@@ -383,12 +392,12 @@ dissect_cbch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
cbch_tree = proto_item_add_subtree(cbch_item, ett_cbch_msg);
- proto_tree_add_text(cbch_tree, tvb, offset, 1, "CBCH Block");
+ proto_tree_add_uint(cbch_tree, hf_gsm_cbch_block, tvb, offset, 1, octet);
proto_tree_add_uint(cbch_tree, hf_gsm_cbch_spare_bit, tvb, offset, 1, octet);
- proto_tree_add_uint(cbch_tree, hf_gsm_cbch_lpd, tvb, offset, 1, octet);
+ lpd_item = proto_tree_add_uint(cbch_tree, hf_gsm_cbch_lpd, tvb, offset, 1, octet);
proto_tree_add_uint(cbch_tree, hf_gsm_cbch_lb, tvb, offset, 1, octet);
- proto_tree_add_uint(cbch_tree, hf_gsm_cbch_seq_num, tvb, offset, 1, octet);
+ seq_item = proto_tree_add_uint(cbch_tree, hf_gsm_cbch_seq_num, tvb, offset, 1, octet);
seq_num = octet & 0x0F;
lpd = (octet & 0x60) >> 5;
lb = (octet & 0x10) >> 4;
@@ -429,12 +438,12 @@ dissect_cbch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
break;
case 0x0F:
- proto_tree_add_text(cbch_tree, tvb, offset, 1, "NULL message");
+ expert_add_info(pinfo, seq_item, &ei_gsm_cbch_seq_num_null);
call_dissector(data_handle, tvb, pinfo, cbch_tree);
break;
default:
- proto_tree_add_text(cbch_tree, tvb, offset, 1, "reserved Sequence Number");
+ expert_add_info(pinfo, seq_item, &ei_gsm_cbch_seq_num_reserved);
call_dissector(data_handle, tvb, pinfo, cbch_tree);
break;
}
@@ -461,7 +470,7 @@ dissect_cbch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
else
{
- proto_tree_add_text(cbch_tree, tvb, offset, 1, "invalid Link Protocol Discriminator");
+ expert_add_info(pinfo, lpd_item, &ei_gsm_cbch_lpd);
call_dissector(data_handle, tvb, pinfo, cbch_tree);
}
}
@@ -500,7 +509,7 @@ proto_register_gsm_cbch(void)
},
{ &hf_gsm_cbch_sched_begin_slot,
{ "GSM CBCH Schedule Begin slot", "gsm_cbch.schedule_begin",
- FT_UINT8, BASE_DEC, NULL, 0x3F,
+ FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_cbch_sched_begin_slot_rvals), 0x3F,
NULL, HFILL}
},
{ &hf_gsm_cbch_sched_spare,
@@ -518,6 +527,17 @@ proto_register_gsm_cbch(void)
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL}
},
+ { &hf_gsm_cbch_padding,
+ { "Padding", "gsm_cbch.padding",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}
+ },
+ { &hf_gsm_cbch_block,
+ { "CBCH Block", "gsm_cbch.block",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL}
+ },
+
#if 0
{ &hf_gsm_cbch_sched_msg_id,
{ "GSM CBCH Schedule Message ID", "gsm_cbch.sched_msg_id",
@@ -608,9 +628,20 @@ proto_register_gsm_cbch(void)
&ett_cbch_fragments,
};
+ expert_module_t* expert_cbch;
+
+ static ei_register_info ei[] = {
+ { &ei_gsm_cbch_sched_end_slot, { "gsm_cbch.sched_end.bad_range", PI_PROTOCOL, PI_WARN, "End Slot Number less than Begin Slot Number: ignoring message", EXPFILL }},
+ { &ei_gsm_cbch_seq_num_null, { "gsm_cbch.block_type.seq_num.null", PI_PROTOCOL, PI_NOTE, "NULL message", EXPFILL }},
+ { &ei_gsm_cbch_seq_num_reserved, { "gsm_cbch.block_type.seq_num.reserved", PI_PROTOCOL, PI_NOTE, "Reserved Sequence Number", EXPFILL }},
+ { &ei_gsm_cbch_lpd, { "gsm_cbch.block_type.lpd.invalid", PI_PROTOCOL, PI_WARN, "Invalid Link Protocol Discriminator", EXPFILL }},
+ };
+
/* Register the protocol name and description */
proto_cbch = proto_register_protocol("GSM Cell Broadcast Channel", "GSM CBCH", "gsm_cbch");
proto_register_field_array(proto_cbch, hf_smscb, array_length(hf_smscb));
+ expert_cbch = expert_register_protocol(proto_cbch);
+ expert_register_field_array(expert_cbch, ei, array_length(ei));
/* subdissector code */
register_dissector("gsm_cbch", dissect_cbch, proto_cbch);