diff options
author | Michael Mann <mmann78@netscape.net> | 2015-08-12 09:01:45 -0400 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2015-08-15 06:49:38 +0000 |
commit | 828254042a703fd8452f87873c01c3260a67d554 (patch) | |
tree | ef5f568e24ea8148ca6e7bd55d734ac33be4a249 /epan/dissectors/packet-gsm_cbch.c | |
parent | 8368f3b7f0b59cdb41a2a91543d7e01ff10afb06 (diff) | |
download | wireshark-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.c | 73 |
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); |