diff options
-rw-r--r-- | epan/dissectors/packet-gsm_a_bssmap.c | 241 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.c | 168 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_dtap.c | 361 |
3 files changed, 279 insertions, 491 deletions
diff --git a/epan/dissectors/packet-gsm_a_bssmap.c b/epan/dissectors/packet-gsm_a_bssmap.c index 98478c8d05..97485fd034 100644 --- a/epan/dissectors/packet-gsm_a_bssmap.c +++ b/epan/dissectors/packet-gsm_a_bssmap.c @@ -348,7 +348,6 @@ static const value_string bssmap_location_information_vals[] = { { 0, NULL} }; - /* Initialize the protocol and registered fields */ static int proto_a_bssmap = -1; @@ -639,12 +638,7 @@ be_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_ oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - (oct & 0x80) ? "extended" : "not extended"); + proto_tree_add_item(tree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); if (oct & 0x80) { @@ -874,11 +868,7 @@ be_l3_header_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE); proto_tree_add_item(tree, hf_gsm_a_L3_protocol_discriminator, tvb, curr_offset, 1, FALSE); @@ -888,11 +878,7 @@ be_l3_header_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8); proto_tree_add_text(tree, @@ -987,11 +973,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE); sdi = oct & 0x0f; switch (sdi) @@ -1053,12 +1035,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * { oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - (oct & 0x80) ? "extended" : "not extended"); + proto_tree_add_item(tree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); switch (oct & 0x7f) { @@ -1148,12 +1125,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - (oct & 0x80) ? "extended" : "not extended"); + proto_tree_add_item(tree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8); proto_tree_add_text(tree, @@ -1252,18 +1224,9 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - (oct & 0x80) ? "extended" : "not extended"); + proto_tree_add_item(tree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); - other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+1, 3, FALSE); if (num_chan == 0) { @@ -1274,11 +1237,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * a_bigbuf, (oct & 0x08) ? "" : "not "); - other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+6, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8); proto_tree_add_text(tree, @@ -1303,11 +1262,7 @@ be_chan_type(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * a_bigbuf, (oct & 0x08) ? "" : "not "); - other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+6, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8); proto_tree_add_text(tree, @@ -1600,12 +1555,7 @@ be_cell_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); - + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE); proto_tree_add_item(tree, hf_gsm_a_bssmap_be_cell_id_disc, tvb, curr_offset, 1, FALSE); disc = oct&0x0f; curr_offset++; @@ -1826,12 +1776,7 @@ be_down_dtx_flag(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); - + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8); proto_tree_add_text(tree, tvb, curr_offset, 1, @@ -1864,11 +1809,7 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gcha oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE); disc = oct & 0x0f; proto_tree_add_item(tree, hf_gsm_a_bssmap_be_cell_id_disc, tvb, curr_offset, 1, FALSE); @@ -2177,11 +2118,7 @@ be_ciph_resp_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_ oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8); proto_tree_add_text(tree, @@ -2272,11 +2209,7 @@ be_for_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, FALSE); switch (oct & 0x0f) { @@ -2430,11 +2363,7 @@ be_que_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 6, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8); proto_tree_add_text(tree, @@ -2443,11 +2372,7 @@ be_que_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar a_bigbuf, (oct & 0x02) ? "" : "not "); - other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+7, 1, FALSE); curr_offset++; @@ -2473,6 +2398,10 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE); + /* The bits 7-1 of octet 2 are coded in the same way as the permitted speech version identifier + * in the Channel type information element. + */ + switch (oct & 0x7f) { case 0x01: str = "GSM speech full rate version 1"; short_str = "FR1"; break; @@ -2483,6 +2412,12 @@ be_speech_ver(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc case 0x15: str = "GSM speech half rate version 2"; short_str = "HR2"; break; case 0x25: str = "GSM speech half rate version 3 (AMR)"; short_str = "HR3 (AMR)"; break; + case 0x41: str = "GSM speech full rate version 4";short_str = "OFR AMR-WB"; break; + case 0x42: str = "GSM speech full rate version 5";short_str = "FR AMR-WB"; break; + case 0x46: str = "GSM speech half rate version 4";short_str = "OHR AMR-WB"; break; + case 0x45: str = "GSM speech half rate version 6";short_str = "OHR AMR"; break; + + default: str = "Reserved"; short_str = str; @@ -5770,107 +5705,107 @@ proto_register_gsm_a_bssmap(void) { &hf_gsm_a_bssmap_msg_type, { "BSSMAP Message Type", "gsm_a.bssmap_msgtype", FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_msg_strings), 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_elem_id, { "Element ID", "gsm_a_bssmap.elem_id", FT_UINT8, BASE_DEC, NULL, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_length, { "Length", "gsm_a.len", FT_UINT16, BASE_DEC, NULL, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_cell_ci, { "Cell CI", "gsm_a.cell_ci", FT_UINT16, BASE_HEX_DEC, 0, 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_cell_lac, { "Cell LAC", "gsm_a.cell_lac", FT_UINT16, BASE_HEX_DEC, 0, 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_dlci_cc, { "Control Channel", "bssap.dlci.cc", FT_UINT8, BASE_HEX, VALS(bssap_cc_values), 0xc0, - "", HFILL} + NULL, HFILL} }, { &hf_gsm_a_bssmap_dlci_spare, { "Spare", "bssap.dlci.spare", FT_UINT8, BASE_HEX, NULL, 0x38, - "", HFILL} + NULL, HFILL} }, { &hf_gsm_a_bssmap_dlci_sapi, { "SAPI", "bssap.dlci.sapi", FT_UINT8, BASE_HEX, VALS(bssap_sapi_values), 0x07, - "", HFILL} + NULL, HFILL} }, { &hf_gsm_a_bssmap_cause, { "BSSMAP Cause", "gsm_a_bssmap.cause", FT_UINT8, BASE_HEX, 0, 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_be_cell_id_disc, { "Cell identification discriminator","gsm_a.be.cell_id_disc", FT_UINT8,BASE_DEC, VALS(gsm_a_be_cell_id_disc_vals), 0x0f, - "Cell identification discriminator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_lsa_only, { "LSA only","ggsm_a_bssmap.lsa_only", FT_BOOLEAN,8, TFS(&bssmap_lsa_only_value), 0x01, - "LSA only", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_act, { "Active mode support","gsm_a_bssmap.act", FT_BOOLEAN,8, NULL, 0x20, - "Active mode support", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_pref, { "Preferential access","gsm_a_bssmap.pref", FT_BOOLEAN,8, NULL, 0x10, - "Preferential access", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_lsa_inf_prio, { "Priority","gsm_a_bssmap.lsa_inf_prio", FT_UINT8,BASE_DEC, NULL, 0x0f, - "Priority", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_seq_len, { "Sequence Length","gsm_a_bssmap.seq_len", FT_UINT8,BASE_DEC, NULL, 0xf0, - "Sequence Length", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_seq_no, { "Sequence Number","gsm_a_bssmap.seq_no", FT_UINT8,BASE_DEC, NULL, 0xf, - "Sequence Number", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, { "Cell identification discriminator","gsm_a_bssmap.cell_id_list_seg_cell_id_disc", FT_UINT8,BASE_DEC, VALS(gsm_a_bssap_cell_id_list_seg_cell_id_disc_vals), 0xf, - "Cell identification discriminator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssap_res_ind_method, { "Resource indication method","gsm_a_bssmap.res_ind_method", FT_UINT8,BASE_DEC, VALS(gsm_a_bssap_resource_indication_vals), 0xf, - "Resource indication method", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_ch_mode, { "Channel mode","gsm_a_bssmap.cch_mode", FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_ch_mode_vals), 0xf0, - "Channel mode", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_channel, { "Channel","gsm_a_bssmap.channel", FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_channel_vals), 0x0f, - "Channel", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_be_rnc_id, { "RNC-ID","gsm_a.be.rnc_id", FT_UINT16,BASE_DEC, NULL, 0x0, - "RNC-ID", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_apdu_protocol_id, { "Protocol ID", "gsm_a.apdu_protocol_id", @@ -5880,62 +5815,62 @@ proto_register_gsm_a_bssmap(void) { &hf_gsm_a_bssmap_periodicity, { "Periodicity", "gsm_a_bssmap.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, - "Periodicity", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_sm, { "Subsequent Mode","gsm_a_bssmap.sm", FT_BOOLEAN,8, NULL, 0x02, - "Subsequent Mode", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tarr, { "Total Accessible Resource Requested","gsm_a_bssmap.tarr", FT_BOOLEAN,8, NULL, 0x01, - "Total Accessible Resource Requested", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tot_no_of_fullr_ch, { "Total number of accessible full rate channels", "gsm_a_bssmap.tot_no_of_fullr_ch", FT_UINT16, BASE_DEC, NULL, 0x0, - "Total number of accessible full rate channels", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tot_no_of_hr_ch, { "Total number of accessible half rate channels", "gsm_a_bssmap.tot_no_of_hr_ch", FT_UINT16, BASE_DEC, NULL, 0x0, - "Total number of accessible half rate channels", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_lsa_id, { "Identification of Localised Service Area", "gsm_a_bssmap.lsa_id", FT_UINT24, BASE_HEX, NULL, 0x0, - "Identification of Localised Service Area", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_ep, { "EP", "gsm_a_bssmap.ep", FT_UINT8, BASE_DEC, NULL, 0x01, - "EP", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_smi, { "Subsequent Modification Indication(SMI)", "gsm_a_bssmap.smi", FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_smi_vals), 0x0f, - "Subsequent Modification Indication", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_lcs_pri, { "Periodicity", "gsm_a_bssmap.lcs_pri", FT_UINT8, BASE_DEC, VALS(lcs_priority_vals), 0x0, - "Periodicity", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_num_ms, { "Number of handover candidates", "gsm_a_bssmap.num_ms", FT_UINT8, BASE_DEC,NULL, 0x0, - "Number of handover candidates", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_talker_pri, { "Priority", "gsm_a_bssmap.talker_pri", FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_talker_pri_vals), 0x03, - "Priority ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_paging_cause, { "Paging Cause", "gsm_a_bssmap.paging_cause", FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_paging_cause_vals), 0x06, - "Paging Cause ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_paging_inf_flg, { "VGCS/VBS flag","ggsm_a_bssmap.paging_inf_flg", @@ -5945,138 +5880,138 @@ proto_register_gsm_a_bssmap(void) { &hf_gsm_a_bssmap_serv_ho_inf, { "Service Handover information", "gsm_a_bssmap.serv_ho_inf", FT_UINT8, BASE_HEX, NULL, 0x07, - "Service Handover information", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_spare_bits, { "Spare bit(s)", "gsm_a_bssmap.spare_bits", FT_UINT8, BASE_HEX, NULL, 0x0, - "Spare bit(s)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tpind, { "Talker priority indicator (TP Ind)","gsm_a_bssmap.tpind", FT_BOOLEAN,8, TFS(&gsm_bssmap_tpind_vals), 0x01, - "Talker priority indicator (TP Ind)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_asind_b2, { "A-interface resource sharing indicator (AS Ind) bit 2","gsm_a_bssmap.asind_b2", FT_BOOLEAN,8, TFS(&gsm_bssmap_asind_b2_vals), 0x02, - "A-interface resource sharing indicator (AS Ind) bit 2", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_asind_b3, { "A-interface resource sharing indicator (AS Ind) bit 3","gsm_a_bssmap.asind_b3", FT_BOOLEAN,8, TFS(&gsm_bssmap_asind_b3_vals), 0x04, - "A-interface resource sharing indicator (AS Ind) bit 3", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_bss_res, { "Group or broadcast call re-establishment by the BSS indicator","gsm_a_bssmap.bss_res", FT_BOOLEAN,8, TFS(&gsm_bssmap_bss_res_vals), 0x08, - "Group or broadcast call re-establishment by the BSS indicator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tcp, - { "Talker Channel Parameter (TCP).","gsm_a_bssmap.tcp", + { "Talker Channel Parameter (TCP)","gsm_a_bssmap.tcp", FT_BOOLEAN,8, TFS(&gsm_bssmap_bss_tcp_vals), 0x10, - "Talker Channel Parameter (TCP).", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_filler_bits, { "Filler Bits","gsm_a_bssmap.filler_bits", FT_UINT8, BASE_DEC,NULL, 0x07, - "Filler Bits", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_aoip_trans_ipv4, { "Transport Layer Address (IPv4)","gsm_a_bssmap.aoip_trans_ipv4", FT_IPv4,BASE_NONE, NULL, 0x0, - "Transport Layer Address (IPv4)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_aoip_trans_ipv6, { "Transport Layer Address (IPv6)","gsm_a_bssmap.aoip_trans_ipv6", FT_IPv6,BASE_NONE, NULL, 0x0, - "Transport Layer Address (IPv6)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_aoip_trans_port, { "UDP Port","gsm_a_bssmap.aoip_trans_port", FT_UINT16, BASE_DEC,NULL, 0x0, - "UDP Port", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_fi, { "FI(Full IP)","gsm_a_bssmap.fi", FT_BOOLEAN,8, TFS(&bssmap_fi_vals), 0x80, - "FI(Full IP)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_pi, { "PI","gsm_a_bssmap.pi", FT_BOOLEAN,8, TFS(&bssmap_pi_vals), 0x40, - "PI", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_pt, { "PT","gsm_a_bssmap.pt", FT_BOOLEAN,8, TFS(&bssmap_pt_vals), 0x20, - "PT", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tf, { "TF","gsm_a_bssmap.tf", FT_BOOLEAN,8, TFS(&bssmap_tf_vals), 0x10, - "TF", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssap_speech_codec, { "Codec Type","gsm_a_bssmap.speech_codec", FT_UINT8, BASE_DEC,VALS(bssap_speech_codec_values), 0x0f, - "Codec Type ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_fi2, { "FI(Full IP)","gsm_a_bssmap.fi2", FT_BOOLEAN,8, TFS(&bssmap_fi2_vals), 0x80, - "FI(Full IP)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_pi2, { "PI","gsm_a_bssmap.pi2", FT_BOOLEAN,8, TFS(&bssmap_pi2_vals), 0x40, - "PI", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_pt2, { "PT","gsm_a_bssmap.pt2", FT_BOOLEAN,8, TFS(&bssmap_pt2_vals), 0x20, - "PT", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_tf2, { "TF","gsm_a_bssmap.tf2", FT_BOOLEAN,8, TFS(&bssmap_tf2_vals), 0x10, - "TF", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_call_id, { "Call Identifier","gsm_a_bssmap.callid", FT_UINT32, BASE_DEC,NULL, 0x0, - "Call Identifier", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_spare, { "Spare", "gsm_a_bssmap.spare", FT_UINT8, BASE_HEX, NULL, 0x0, - "Spare", HFILL} + NULL, HFILL} }, { &hf_gsm_a_bssmap_positioning_data_discriminator, { "Positioning Data Discriminator", "gsm_a_bssmap.posData.discriminator", FT_UINT8, BASE_HEX, NULL, 0x0, - "Positioning Data Discriminator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_positioning_method, { "Positioning method", "gsm_a_bssmap.posData.method", FT_UINT8, BASE_HEX, VALS(bssmap_positioning_methods), 0x0, - "Positioning method", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_positioning_method_usage, { "Usage", "gsm_a_bssmap.posData.usage", FT_UINT8, BASE_HEX, VALS(bssmap_positioning_methods_usage), 0x0, - "Usage", HFILL } + NULL, HFILL } }, { &hf_gsm_a_bssmap_location_type_location_information, { "Location Information", "gsm_a_bssmap.locationType.locationInformation", FT_UINT8, BASE_HEX, VALS(bssmap_location_information_vals), 0x0, - "Location Information", HFILL} + NULL, HFILL} }, { &hf_gsm_a_bssmap_location_type_positioning_method, { "Positioning Method", "gsm_a_bssmap.locationType.positioningMethod", FT_UINT8, BASE_HEX, VALS(bssmap_positioning_method_vals), 0x0, - "Positioning Method", HFILL} + NULL, HFILL} }, }; diff --git a/epan/dissectors/packet-gsm_a_common.c b/epan/dissectors/packet-gsm_a_common.c index f603ab3a57..daa15aa154 100644 --- a/epan/dissectors/packet-gsm_a_common.c +++ b/epan/dissectors/packet-gsm_a_common.c @@ -1990,11 +1990,7 @@ de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, "%s : Ciphering Information", a_bigbuf); - other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8); - proto_tree_add_text(tree, tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); - + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 4, FALSE); curr_offset++; /* no length check possible */ @@ -2025,10 +2021,7 @@ de_pd_sapi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_PD_SAPI]); - other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8); - proto_tree_add_text(subtree, tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 2, FALSE); switch ((oct & 0x30) >> 4) { @@ -2161,334 +2154,347 @@ proto_register_gsm_a_common(void) { &hf_gsm_a_common_elem_id, { "Element ID", "gsm_a_common.elem_id", FT_UINT8, BASE_DEC, NULL, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_imsi, { "IMSI", "gsm_a.imsi", FT_STRING, BASE_DEC, 0, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_tmsi, { "TMSI/P-TMSI", "gsm_a.tmsi", FT_UINT32, BASE_HEX, 0, 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_imei, { "IMEI", "gsm_a.imei", FT_STRING, BASE_DEC, 0, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_imeisv, { "IMEISV", "gsm_a.imeisv", FT_STRING, BASE_DEC, 0, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_MSC_rev, { "Revision Level","gsm_a.MSC2_rev", FT_UINT8,BASE_DEC, VALS(gsm_a_msc_rev_vals), 0x60, - "Revision level", HFILL } + NULL, HFILL } }, { &hf_gsm_a_ES_IND, { "ES IND","gsm_a.MSC2_rev", FT_UINT8,BASE_DEC, VALS(ES_IND_vals), 0x10, - "ES IND", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_1_algorithm_sup, { "A5/1 algorithm supported","gsm_a.MSC2_rev", FT_UINT8,BASE_DEC, VALS(A5_1_algorithm_sup_vals), 0x08, - "A5/1 algorithm supported ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_RF_power_capability, { "RF Power Capability","gsm_a.MSC2_rev", FT_UINT8,BASE_DEC, VALS(RF_power_capability_vals), 0x07, - "RF Power Capability", HFILL } + NULL, HFILL } }, { &hf_gsm_a_ps_sup_cap, { "PS capability (pseudo-synchronization capability)","gsm_a.ps_sup_cap", FT_UINT8,BASE_DEC, VALS(ps_sup_cap_vals), 0x40, - "PS capability (pseudo-synchronization capability)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_SS_screening_indicator, { "SS Screening Indicator","gsm_a.SS_screening_indicator", FT_UINT8,BASE_DEC, VALS(SS_screening_indicator_vals), 0x30, - "SS Screening Indicator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_SM_capability, { "SM capability (MT SMS pt to pt capability)","gsm_a.SM_cap", FT_UINT8,BASE_DEC, VALS(SM_capability_vals), 0x08, - "SM capability (MT SMS pt to pt capability)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_VBS_notification_rec, { "VBS notification reception ","gsm_a.VBS_notification_rec", FT_UINT8,BASE_DEC, VALS(VBS_notification_rec_vals), 0x04, - "VBS notification reception ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_VGCS_notification_rec, { "VGCS notification reception ","gsm_a.VGCS_notification_rec", FT_UINT8,BASE_DEC, VALS(VGCS_notification_rec_vals), 0x02, - "VGCS notification reception", HFILL } + NULL, HFILL } }, { &hf_gsm_a_FC_frequency_cap, { "FC Frequency Capability","gsm_a.FC_frequency_cap", FT_UINT8,BASE_DEC, VALS(FC_frequency_cap_vals), 0x01, - "FC Frequency Capability", HFILL } + NULL, HFILL } }, { &hf_gsm_a_CM3, { "CM3","gsm_a.CM3", FT_UINT8,BASE_DEC, VALS(CM3_vals), 0x80, - "CM3", HFILL } + NULL, HFILL } }, { &hf_gsm_a_LCS_VA_cap, - { "LCS VA capability (LCS value added location request notification capability) ","gsm_a.LCS_VA_cap", + { "LCS VA capability (LCS value added location request notification capability)","gsm_a.LCS_VA_cap", FT_UINT8,BASE_DEC, VALS(LCS_VA_cap_vals), 0x20, - "LCS VA capability (LCS value added location request notification capability) ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_UCS2_treatment, - { "UCS2 treatment ","gsm_a.UCS2_treatment", + { "UCS2 treatment","gsm_a.UCS2_treatment", FT_UINT8,BASE_DEC, VALS(UCS2_treatment_vals), 0x10, - "UCS2 treatment ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_SoLSA, { "SoLSA","gsm_a.SoLSA", FT_UINT8,BASE_DEC, VALS(SoLSA_vals), 0x08, - "SoLSA", HFILL } + NULL, HFILL } }, { &hf_gsm_a_CMSP, { "CMSP: CM Service Prompt","gsm_a.CMSP", FT_UINT8,BASE_DEC, VALS(CMSP_vals), 0x04, - "CMSP: CM Service Prompt", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_7_algorithm_sup, { "A5/7 algorithm supported","gsm_a.A5_7_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_7_algorithm_sup_vals), 0x0, - "A5/7 algorithm supported", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_6_algorithm_sup, { "A5/6 algorithm supported","gsm_a.A5_6_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_6_algorithm_sup_vals), 0x0, - "A5/6 algorithm supported", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_5_algorithm_sup, { "A5/5 algorithm supported","gsm_a.A5_5_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_5_algorithm_sup_vals), 0x0, - "A5/5 algorithm supported", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_4_algorithm_sup, { "A5/4 algorithm supported","gsm_a.A5_4_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_4_algorithm_sup_vals), 0x0, - "A5/4 algorithm supported", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_3_algorithm_sup, { "A5/3 algorithm supported","gsm_a.A5_3_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_3_algorithm_sup_vals), 0x02, - "A5/3 algorithm supported", HFILL } + NULL, HFILL } }, { &hf_gsm_a_A5_2_algorithm_sup, { "A5/2 algorithm supported","gsm_a.A5_2_algorithm_sup", FT_UINT8,BASE_DEC, VALS(A5_2_algorithm_sup_vals), 0x01, - "A5/2 algorithm supported", HFILL } + NULL, HFILL } }, { &hf_gsm_a_mobile_identity_type, { "Mobile Identity Type","gsm_a.ie.mobileid.type", FT_UINT8, BASE_DEC, VALS(mobile_identity_type_vals), 0x07, - "Mobile Identity Type", HFILL } + NULL, HFILL } }, { &hf_gsm_a_odd_even_ind, { "Odd/even indication","gsm_a.oddevenind", FT_UINT8, BASE_DEC, oddevenind_vals, 0x08, - "Mobile Identity", HFILL } + NULL, HFILL } }, { &hf_gsm_a_tmgi_mcc_mnc_ind, { "MCC/MNC indication", "gsm_a.tmgi_mcc_mnc_ind", FT_BOOLEAN, 8, TFS(&gsm_a_present_vals), 0x10, - "MCC/MNC indication", HFILL} + NULL, HFILL} }, { &hf_gsm_a_mbs_ses_id_ind, { "MBMS Session Identity indication", "gsm_a.tmgi_mcc_mnc_ind", FT_BOOLEAN, 8, TFS(&gsm_a_present_vals), 0x20, - "MBMS Session Identity indication", HFILL} + NULL, HFILL} }, { &hf_gsm_a_mbs_service_id, { "MBMS Service ID", "gsm_a.mbs_service_id", FT_BYTES, BASE_HEX, NULL, 0x0, - "MBMS Service ID", HFILL } + NULL, HFILL } }, { &hf_gsm_a_L3_protocol_discriminator, { "Protocol discriminator","gsm_a.L3_protocol_discriminator", FT_UINT8,BASE_DEC, VALS(protocol_discriminator_vals), 0x0f, - "Protocol discriminator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_call_prio, { "Call priority", "gsm_a.call_prio", FT_UINT8, BASE_DEC, VALS(gsm_a_call_prio_vals), 0x00, - "Call priority", HFILL } + NULL, HFILL } }, { &hf_gsm_a_skip_ind, { "Skip Indicator", "gsm_a.skip.ind", FT_UINT8, BASE_DEC, NULL, 0xf0, - "Skip Indicator", HFILL } + NULL, HFILL } }, { &hf_gsm_a_b7spare, { "Spare","gsm_a.spareb7", FT_UINT8,BASE_DEC, NULL, 0x40, - "Spare", HFILL } + NULL, HFILL } }, { &hf_gsm_a_b8spare, { "Spare","gsm_a.spareb8", FT_UINT8,BASE_DEC, NULL, 0x80, - "Spare", HFILL } + NULL, HFILL } }, { &hf_gsm_a_spare_bits, { "Spare bit(s)","gsm_a.spare_bits", FT_UINT8,BASE_DEC, NULL, 0x0, - "Spare bit(s)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_multi_bnd_sup_fields, { "Multiband supported field","gsm_a.multi_bnd_sup_fields", FT_UINT8,BASE_DEC, NULL, 0x0, - "Multiband supported field", HFILL } + NULL, HFILL } }, { &hf_gsm_a_pgsm_supported, { "P-GSM Supported", "gsm_a.classmark3.pgsmSupported", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"P-GSM Supported", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_egsm_supported, { "E-GSM or R-GSM Supported", "gsm_a.classmark3.egsmSupported", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"E-GSM or R-GSM Supported", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_gsm1800_supported, { "GSM 1800 Supported", "gsm_a.classmark3.gsm1800Supported", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"GSM 1800 Supported", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_ass_radio_cap1, { "Associated Radio Capability 1", "gsm_a.classmark3.ass_radio_cap1", - FT_UINT8, BASE_DEC, NULL, 0x0,"Associated Radio Capability 1", HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} }, { &hf_gsm_a_ass_radio_cap2, { "Associated Radio Capability 2", "gsm_a.classmark3.ass_radio_cap2", - FT_UINT8, BASE_DEC, NULL, 0x0,"Associated Radio Capability 1", HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} }, { &hf_gsm_a_rsupport, { "R Support", "gsm_a.classmark3.rsupport", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"R Support", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_r_capabilities, { "R-GSM band Associated Radio Capability", "gsm_a.classmark3.r_capabilities", - FT_UINT8, BASE_DEC, NULL, 0x0,"R-GSM band Associated Radio Capability", HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} }, { &hf_gsm_a_multislot_capabilities, { "HSCSD Multi Slot Capability", "gsm_a.classmark3.multislot_capabilities", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"HSCSD Multi Slot Capability", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_multislot_class, { "HSCSD Multi Slot Class", "gsm_a.classmark3.multislot_cap", - FT_UINT8, BASE_DEC, NULL, 0x0,"HSCSD Multi Slot Class", HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} }, { &hf_gsm_a_ucs2_treatment, - { "UCS2 treatment ","gsm_a.UCS2_treatment", + { "UCS2 treatment","gsm_a.UCS2_treatment", FT_UINT8,BASE_DEC, VALS(UCS2_treatment_vals), 0x0, - "UCS2 treatment ", HFILL } + NULL, HFILL } }, { &hf_gsm_a_extended_measurement_cap, { "Extended Measurement Capability", "gsm_a.classmark3.ext_meas_cap", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"Extended Measurement Capability", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_ms_measurement_capability, { "MS measurement capability", "gsm_a.classmark3.ms_measurement_capability", - FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,"MS measurement capability", HFILL} + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_sms_value, { "SMS_VALUE (Switch-Measure-Switch)", "gsm_a.classmark3.sms_value", - FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0,"SMS_VALUE (Switch-Measure-Switch)", HFILL} + FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_sm_value, { "SM_VALUE (Switch-Measure)", "gsm_a.classmark3.sm_value", - FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0,"SM_VALUE (Switch-Measure)", HFILL} + FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0, + NULL, HFILL} }, { &hf_gsm_a_geo_loc_type_of_shape, { "Location estimate","gsm_a.gad.location_estimate", FT_UINT8,BASE_DEC, VALS(type_of_shape_vals), 0xf0, - "Location estimate", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_sign_of_lat, { "Sign of latitude","gsm_a.gad.sign_of_latitude", FT_UINT8,BASE_DEC, VALS(sign_of_latitude_vals), 0x80, - "Sign of latitude", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_deg_of_lat, { "Degrees of latitude","gsm_a.gad.sign_of_latitude", FT_UINT24,BASE_DEC, NULL, 0x7fffff, - "Degrees of latitude", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_deg_of_long, { "Degrees of longitude","gsm_a.gad.sign_of_longitude", FT_UINT24,BASE_DEC, NULL, 0xffffff, - "Degrees of longitude", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_uncertainty_code, { "Uncertainty code","gsm_a.gad.uncertainty_code", FT_UINT8,BASE_DEC, NULL, 0x7f, - "Uncertainty code", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_uncertainty_semi_major, { "Uncertainty semi-major","gsm_a.gad.uncertainty_semi_major", FT_UINT8,BASE_DEC, NULL, 0x7f, - "Uncertainty semi-major", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_uncertainty_semi_minor, { "Uncertainty semi-minor","gsm_a.gad.uncertainty_semi_minor", FT_UINT8,BASE_DEC, NULL, 0x7f, - "Uncertainty semi-minor", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_orientation_of_major_axis, { "Orientation of major axis","gsm_a.gad.orientation_of_major_axis", FT_UINT8,BASE_DEC, NULL, 0x0, - "Orientation of major axis", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_uncertainty_altitude, { "Uncertainty Altitude","gsm_a.gad.uncertainty_altitude", FT_UINT8,BASE_DEC, NULL, 0x7f, - "Uncertainty Altitude", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_confidence, { "Confidence(%)","gsm_a.gad.confidence", FT_UINT8,BASE_DEC, NULL, 0x7f, - "Confidence(%)", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_no_of_points, { "Number of points","gsm_a.gad.no_of_points", FT_UINT8,BASE_DEC, NULL, 0x0f, - "Number of points", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_D, { "D: Direction of Altitude","gsm_a.gad.D", FT_UINT16,BASE_DEC, VALS(dir_of_alt_vals), 0x8000, - "D: Direction of Altitude", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_altitude, { "Altitude in meters","gsm_a.gad.altitude", FT_UINT16,BASE_DEC, NULL, 0x7fff, - "Altitude", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_inner_radius, { "Inner radius","gsm_a.gad.altitude", FT_UINT16,BASE_DEC, NULL, 0x0, - "Inner radius", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_uncertainty_radius, { "Uncertainty radius","gsm_a.gad.no_of_points", FT_UINT8,BASE_DEC, NULL, 0x7f, - "Uncertainty radius", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_offset_angle, { "Offset angle","gsm_a.gad.offset_angle", FT_UINT8,BASE_DEC, NULL, 0x0, - "Offset angle", HFILL } + NULL, HFILL } }, { &hf_gsm_a_geo_loc_included_angle, { "Included angle","gsm_a.gad.included_angle", FT_UINT8,BASE_DEC, NULL, 0x0, - "Included angle", HFILL } + NULL, HFILL } }, }; diff --git a/epan/dissectors/packet-gsm_a_dtap.c b/epan/dissectors/packet-gsm_a_dtap.c index a9e56548be..441c516eca 100644 --- a/epan/dissectors/packet-gsm_a_dtap.c +++ b/epan/dissectors/packet-gsm_a_dtap.c @@ -15,7 +15,7 @@ * * Added Dissection of Radio Resource Management Information Elements * and othere enhancements and fixes. - * Copyright 2005 - 2006, Anders Broman [AT] ericsson.com + * Copyright 2005 - 2009, Anders Broman [AT] ericsson.com * Small bugfixes, mainly in Qos and TFT by Nils Ljungberg and Stefan Boman [AT] ericsson.com * * Title 3GPP Other @@ -386,6 +386,8 @@ static int hf_gsm_a_type_of_number = -1; static int hf_gsm_a_numbering_plan_id = -1; static int hf_gsm_a_lsa_id = -1; +static int hf_gsm_a_speech_vers_ind = -1; +static int hf_gsm_a_dtap_spare_bits = -1; /* Initialize the subtree pointers */ static gint ett_dtap_msg = -1; @@ -861,11 +863,7 @@ de_day_saving_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, g oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 6, FALSE); switch (oct & 0x03) { @@ -922,11 +920,7 @@ de_aux_states(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar proto_tree_add_item(tree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); - other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+1, 3, FALSE); switch ((oct & 0x0c) >> 2) { @@ -972,8 +966,33 @@ de_aux_states(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar * 10.5.4.4a Backup bearer capability */ /* - * [3] 10.5.4.5 Bearer capability + * [3] 10.5.4.5 Bearer capability (3GPP TS 24.008 version 8.4.0 Release 8) + */ +/* Speech version indication (octet(s) 3a etc.) Bits 4 3 2 1 */ + +const value_string gsm_a_speech_vers_ind_values[] = { + { 0x00, "GSM full rate speech version 1(GSM FR)" }, + { 0x1, "GSM half rate speech version 1(GSM HR)" }, + { 0x2, "GSM full rate speech version 2(GSM EFR)" }, + { 0x3, "Speech version tbd" }, + { 0x4, "GSM full rate speech version 3(FR AMR)" }, + { 0x5, "GSM half rate speech version 3(HR AMR)" }, + { 0x6, "GSM full rate speech version 4(OFR AMR-WB)" }, + { 0x7, "GSM half rate speech version 4(OHR AMR-WB)" }, + { 0x8, "GSM full rate speech version 5(FR AMR-WB)" }, + { 0x9, "Speech version tbd" }, + { 0xa, "Speech version tbd" }, + { 0xb, "GSM half rate speech version 6(OHR AMR)" }, + { 0xc, "Speech version tbd" }, + { 0xd, "Speech version tbd" }, + { 0xe, "Speech version tbd" }, + { 0xf, "No speech version supported for GERAN" }, + { 0, NULL } +}; +/* All other values have the meaning "speech version tbd" and shall be ignored + * when received. */ + guint16 de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) { @@ -1012,12 +1031,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar extended = (oct & 0x80) ? FALSE : TRUE; itc = oct & 0x07; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); switch (is_uplink) { @@ -1100,15 +1114,15 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar switch (itc) { - case DE_BC_ITC_SPEECH: str = "Speech"; break; - case DE_BC_ITC_UDI: str = "Unrestricted digital information"; break; - case DE_BC_ITC_EX_PLMN: str = "3.1 kHz audio, ex PLMN"; break; - case DE_BC_ITC_FASC_G3: str = "Facsimile group 3"; break; - case DE_BC_ITC_OTHER_ITC: str = "Other ITC (See Octet 5a)"; break; - case DE_BC_ITC_RSVD_NET: str = "Reserved, to be used in the network"; break; - default: - str = "Reserved"; - break; + case DE_BC_ITC_SPEECH: str = "Speech"; break; + case DE_BC_ITC_UDI: str = "Unrestricted digital information"; break; + case DE_BC_ITC_EX_PLMN: str = "3.1 kHz audio, ex PLMN"; break; + case DE_BC_ITC_FASC_G3: str = "Facsimile group 3"; break; + case DE_BC_ITC_OTHER_ITC: str = "Other ITC (See Octet 5a)"; break; + case DE_BC_ITC_RSVD_NET: str = "Reserved, to be used in the network"; break; + default: + str = "Reserved"; + break; } other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8); @@ -1145,12 +1159,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8); proto_tree_add_text(subtree, @@ -1160,31 +1169,9 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar (oct & 0x40) ? "other extension of octet 3" : "extension of information transfer capability"); - other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); - - switch (oct & 0x0f) - { - case 0: str = "GSM full rate speech version 1"; break; - case 2: str = "GSM full rate speech version 2"; break; - case 4: str = "GSM full rate speech version 3"; break; - case 1: str = "GSM half rate speech version 1"; break; - case 5: str = "GSM half rate speech version 3"; break; - default: - str = "Speech version TBD"; - break; - } - - other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Speech version indication: %s", - a_bigbuf, - str); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+2, 2, FALSE); + proto_tree_add_item(subtree, hf_gsm_a_speech_vers_ind, tvb, curr_offset, 1, FALSE); curr_offset++; } while (extended && @@ -1207,12 +1194,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8); proto_tree_add_text(subtree, @@ -1285,12 +1267,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8); proto_tree_add_text(subtree, @@ -1355,12 +1332,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8); proto_tree_add_text(subtree, @@ -1386,11 +1358,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar a_bigbuf, str); - other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+5, 3, FALSE); curr_offset++; @@ -1411,12 +1379,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8); proto_tree_add_text(subtree, @@ -1462,11 +1425,7 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar "with USER INFORMATION messages on a temporary signalling connection" : "in-band using logical link zero"); - other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+7, 1, FALSE); curr_offset++; @@ -1487,12 +1446,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8); proto_tree_add_text(subtree, @@ -1534,12 +1488,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8); proto_tree_add_text(subtree, @@ -1602,12 +1551,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); switch ((oct & 0x60) >> 5) { @@ -1677,12 +1621,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); switch ((oct & 0x60) >> 5) { @@ -1743,12 +1682,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); switch ((oct & 0x60) >> 5) { @@ -1811,12 +1745,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); if (is_uplink == IS_UPLINK_TRUE) { @@ -1888,12 +1817,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); switch ((oct & 0x70) >> 4) { @@ -1970,12 +1894,7 @@ bc_octet_6: extended = (oct & 0x80) ? FALSE : TRUE; - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); if (is_uplink == IS_UPLINK_TRUE) { @@ -2033,11 +1952,7 @@ bc_octet_6: a_bigbuf); } - other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+6, 2, FALSE); curr_offset++; @@ -2054,12 +1969,8 @@ bc_octet_7: subtree = proto_item_add_subtree(item, ett_bc_oct_7); extended = (oct & 0x80) ? FALSE : TRUE; oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Extension: %s", - a_bigbuf, - extended ? "extended" : "not extended"); + + proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8); proto_tree_add_text(subtree, @@ -2138,11 +2049,7 @@ de_cc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add break; } - other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+4, 2, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8); proto_tree_add_text(tree, @@ -2166,11 +2073,7 @@ de_cc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 4, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8); proto_tree_add_text(tree, @@ -2270,7 +2173,7 @@ de_call_state(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gc static const true_false_string gsm_a_extension_value = { "No Extension", - "Extension" + "Extended" }; const value_string gsm_a_type_of_number_values[] = { @@ -2382,11 +2285,7 @@ de_cld_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len (oct & 0x08) ? "odd number of address signals" : "even number of address signals"); - other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+5, 3, FALSE); curr_offset++; @@ -2443,11 +2342,7 @@ de_clg_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, a_bigbuf, str); - other_decode_bitfield_value(a_bigbuf, oct, 0x1c, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+3, 3, FALSE); switch (oct & 0x03) { @@ -2531,12 +2426,7 @@ de_clg_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len (oct & 0x08) ? "odd number of address signals" : "even number of address signals"); - other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); - + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+5, 3, FALSE); curr_offset++; NO_MORE_DATA_CHECK(len); @@ -2591,11 +2481,7 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_ a_bigbuf, str); - other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+3, 1, FALSE); switch (oct & 0x0f) { @@ -2811,11 +2697,7 @@ de_keypad_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8); proto_tree_add_text(tree, @@ -2897,11 +2779,7 @@ de_prog_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gcha a_bigbuf, str); - other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+3, 1, FALSE); switch (oct & 0x0f) { @@ -3720,11 +3598,7 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) */ oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 4, FALSE); item = proto_tree_add_text(tree, @@ -3733,11 +3607,7 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+4, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8); @@ -3838,11 +3708,7 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le */ oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 4, FALSE); item = proto_tree_add_text(tree, @@ -3851,11 +3717,7 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint le subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+4, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8); @@ -3982,12 +3844,7 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); - + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8); switch ((oct & 0x70) >> 4) @@ -4074,11 +3931,7 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) */ oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 4, FALSE); item = proto_tree_add_text(tree, @@ -4087,11 +3940,7 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_ID_TYPE]); - other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+4, 1, FALSE); switch (oct & 0x07) { @@ -4243,11 +4092,7 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 1, FALSE); other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8); @@ -4283,11 +4128,7 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) a_bigbuf, (oct & 0x08) ? "Follow-on request pending" : "No follow-on request pending"); - other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8); - proto_tree_add_text(subtree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, (curr_offset<<3)+5, 1, FALSE); switch (oct & 0x03) { @@ -4522,11 +4363,7 @@ dtap_cc_congestion_control(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guin */ oct = tvb_get_guint8(tvb, curr_offset); - other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8); - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "%s : Spare", - a_bigbuf); + proto_tree_add_bits_item(tree, hf_gsm_a_dtap_spare_bits, tvb, curr_offset<<3, 4, FALSE); item = proto_tree_add_text(tree, @@ -5861,72 +5698,82 @@ proto_register_gsm_a_dtap(void) { &hf_gsm_a_seq_no, { "Sequence number", "gsm_a.dtap_seq_no", FT_UINT8, BASE_DEC, NULL, 0xc0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_msg_mm_type, { "DTAP Mobility Management Message Type", "gsm_a.dtap_msg_mm_type", FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_mm_strings), 0x3f, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_msg_cc_type, { "DTAP Call Control Message Type", "gsm_a.dtap_msg_cc_type", FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_cc_strings), 0x3f, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_msg_sms_type, { "DTAP Short Message Service Message Type", "gsm_a.dtap_msg_sms_type", FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_sms_strings), 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_msg_ss_type, { "DTAP Non call Supplementary Service Message Type", "gsm_a.dtap_msg_ss_type", FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_ss_strings), 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_msg_tp_type, { "DTAP Tests Procedures Message Type", "gsm_a.dtap_msg_tp_type", FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_tp_strings), 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_elem_id, { "Element ID", "gsm_a_dtap.elem_id", FT_UINT8, BASE_DEC, NULL, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_cld_party_bcd_num, { "Called Party BCD Number", "gsm_a.cld_party_bcd_num", FT_STRING, BASE_DEC, 0, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_clg_party_bcd_num, { "Calling Party BCD Number", "gsm_a.clg_party_bcd_num", FT_STRING, BASE_DEC, 0, 0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_dtap_cause, { "DTAP Cause", "gsm_a_dtap.cause", FT_UINT8, BASE_HEX, 0, 0x0, - "", HFILL } + NULL, HFILL } }, { &hf_gsm_a_extension, { "Extension", "gsm_a.extension", FT_BOOLEAN, 8, TFS(&gsm_a_extension_value), 0x80, - "Extension", HFILL } + NULL, HFILL } }, { &hf_gsm_a_type_of_number, { "Type of number", "gsm_a.type_of_number", FT_UINT8, BASE_HEX, VALS(gsm_a_type_of_number_values), 0x70, - "Type of number", HFILL } + NULL, HFILL } }, { &hf_gsm_a_numbering_plan_id, { "Numbering plan identification", "gsm_a.numbering_plan_id", FT_UINT8, BASE_HEX, VALS(gsm_a_numbering_plan_id_values), 0x0f, - "Numbering plan identification", HFILL } + NULL, HFILL } }, { &hf_gsm_a_lsa_id, { "LSA Identifier", "gsm_a.lsa_id", FT_UINT24, BASE_HEX, NULL, 0x0, - "LSA Identifier", HFILL } + NULL, HFILL } + }, + { &hf_gsm_a_speech_vers_ind, + { "Speech version indication", "gsm_a.speech_vers_ind", + FT_UINT8, BASE_HEX, VALS(gsm_a_speech_vers_ind_values), 0x0f, + NULL, HFILL } + }, + { &hf_gsm_a_dtap_spare_bits, + { "Spare bit(s)","gsm_a.spare_bits", + FT_UINT8,BASE_DEC, NULL, 0x0, + NULL, HFILL } }, }; |