diff options
author | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-12-12 07:24:57 +0000 |
---|---|---|
committer | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-12-12 07:24:57 +0000 |
commit | 34a33f3b02303ce821ad1ccfbe71d43dd1c5ccb5 (patch) | |
tree | 72bc6aeebe8366aacd2ac472cff20af3845ac497 | |
parent | c6e4a3d0740d1dfd6440055b49ccf71211121cf0 (diff) |
From Mike Morrin:
eliminates the global variable for tracking which nibble is
to be decoded by taking advantage of the fact that half octet IEs always occur
in pairs, and thus a pair can be grouped together for decoding.
There was probably also some confusion caused by the macros UPPER_NIBBLE and
LOWER_NIBBLE because the GSM bit numbering is opposite to Wireshark internal
numbering, so I have changed these to be LEFT_NIBBLE and RIGHT_NIBBLE, which
corresponds to the display format in Wireshark.
The dissection order of half octet IEs has been adjusted where necessary to
align with the ordering shown in the GSM specifications.
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6658
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@40157 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.c | 71 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_common.h | 40 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_dtap.c | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_a_rr.c | 47 |
4 files changed, 61 insertions, 100 deletions
diff --git a/epan/dissectors/packet-gsm_a_common.c b/epan/dissectors/packet-gsm_a_common.c index d0646d125d..edbbbd31f0 100644 --- a/epan/dissectors/packet-gsm_a_common.c +++ b/epan/dissectors/packet-gsm_a_common.c @@ -43,9 +43,6 @@ #include "packet-gsm_a_common.h" #include "packet-e212.h" -/* nasty globals as a result of the split of packet-gsm_a.c in need of further restructure */ -/* nasty static for handling half octet mandatory V IEs */ -gboolean lower_nibble=FALSE; const value_string gsm_common_elem_strings[] = { /* Common Information Elements 10.5.1 */ @@ -551,6 +548,7 @@ int hf_gsm_a_call_prio = -1; int hf_gsm_a_skip_ind = -1; int hf_gsm_a_spare_bits = -1; int hf_gsm_a_lac = -1; +static int hf_gsm_a_spare_nibble = -1; static int hf_gsm_a_type_of_ciph_alg = -1; static int hf_gsm_a_old_xid = -1; static int hf_gsm_a_iov_ui = -1; @@ -1514,7 +1512,7 @@ guint16 elem_tv_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint a_add_string=ep_alloc(1024); a_add_string[0] = '\0'; - consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, -1, a_add_string, 1024); + consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, RIGHT_NIBBLE, a_add_string, 1024); if (a_add_string[0] != '\0') { @@ -1746,50 +1744,35 @@ guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_typ /* * Short Value (V_SHORT) element dissector * - * Length is (ab)used in these functions to indicate upper nibble of the octet (-2) or lower nibble (-1) - * noting that the tv_short dissector always sets the length to -1, as the upper nibble is the IEI. - * This is expected to be used upper nibble first, as the tables of 24.008. + * nibble is used in this function to indicate right or left nibble of the octet + * This is expected to be used right nibble first, as the tables of 24.008. */ -guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset) +guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint32 nibble) { - guint16 consumed; + guint16 consumed = 1; guint32 curr_offset; const value_string *elem_names; gint *elem_ett; guint16 (**elem_funcs)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); + gchar *a_add_string; curr_offset = offset; - consumed = 0; SET_ELEM_VARS(pdu_type, elem_names, elem_ett, elem_funcs); + a_add_string=ep_alloc(1024); + a_add_string[0] = '\0'; + if (elem_funcs[idx] == NULL) { - /* NOT A BAD THING - LENGTH IS HALF NIBBLE */ - - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "No element dissector"); - - consumed = 1; + /* NOT NECESSARILY A BAD THING - LENGTH IS HALF OCTET */ + (void)de_spare_nibble(tvb, tree, pinfo, curr_offset, nibble, a_add_string, 1024); } else { - gchar *a_add_string; - - a_add_string=ep_alloc(1024); - a_add_string[0] = '\0'; - consumed = (*elem_funcs[idx])(tvb, tree, pinfo, curr_offset, (lower_nibble?LOWER_NIBBLE:UPPER_NIBBLE), a_add_string, 1024); - } - if (!lower_nibble) /* is this the first (upper) nibble ? */ - { - consumed--; /* only half a nibble has been consumed, but all ie dissectors assume they consume 1 octet */ - lower_nibble = TRUE; + (void)(*elem_funcs[idx])(tvb, tree, pinfo, curr_offset, nibble, a_add_string, 1024); } - else /* if it is the second (lower) nibble, move on... */ - lower_nibble = FALSE; - return(consumed); } @@ -3030,22 +3013,21 @@ de_ms_cm_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, /* * [3] 10.5.1.8 */ -static guint16 -de_spare_nibble(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) +guint16 de_spare_nibble(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { - guint32 curr_offset; + guint32 curr_offset; + gint bit_offset; - curr_offset = offset; + curr_offset = offset; + if (RIGHT_NIBBLE==len) + bit_offset = 4; + else + bit_offset = 0; - proto_tree_add_text(tree, - tvb, curr_offset, 1, - "Spare Nibble"); + proto_tree_add_bits_item(tree, hf_gsm_a_spare_nibble, tvb, (curr_offset<<3)+bit_offset+3, 1, ENC_BIG_ENDIAN); + curr_offset = curr_offset + 1; - curr_offset++; - - /* no length check possible */ - - return(curr_offset - offset); + return(curr_offset - offset); } /* @@ -4096,6 +4078,11 @@ proto_register_gsm_a_common(void) FT_UINT16, BASE_HEX_DEC, NULL, 0x00, NULL, HFILL } }, + { &hf_gsm_a_spare_nibble, + { "Spare Nibble","gsm_a.spare", + FT_UINT8, BASE_DEC_HEX, NULL, 0x00, + NULL, HFILL } + }, }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-gsm_a_common.h b/epan/dissectors/packet-gsm_a_common.h index 5e63de8c35..ca571c11ca 100644 --- a/epan/dissectors/packet-gsm_a_common.h +++ b/epan/dissectors/packet-gsm_a_common.h @@ -155,7 +155,6 @@ extern sccp_msg_info_t* sccp_msg; extern sccp_assoc_info_t* sccp_assoc; extern int gsm_a_tap; -extern gboolean lower_nibble; extern packet_info *gsm_a_dtap_pinfo; /* TS 23 032 */ @@ -203,20 +202,19 @@ extern const char* get_gsm_a_msg_string(int pdu_type, int idx); #define IS_UPLINK_TRUE 1 #define IS_UPLINK_UNKNOWN 2 -/* Defines and nasty static for handling half octet mandatory V IEs - * TODO: Note originally UPPER_NIBBLE was -2 and LOWER_NIBBLE was -1 - * changed here to unsigned integer as it wouldn't compile (Warnings on Ubuntu) - * ugly hack... +/* Defines for handling half octet mandatory V IEs + * Named LEFT and RIGHT (as displayed) because the GSM definitions and our internal representation + * have the bits numbered in opposite senses */ -#define UPPER_NIBBLE (2) -#define LOWER_NIBBLE (1) +#define LEFT_NIBBLE (2) +#define RIGHT_NIBBLE (1) /* FUNCTIONS */ /* ELEMENT FUNCTIONS */ #define EXTRANEOUS_DATA_CHECK(edc_len, edc_max_len) \ - if (((edc_len) > (edc_max_len))||lower_nibble) \ + if ((edc_len) > (edc_max_len)) \ { \ proto_tree_add_text(tree, tvb, \ curr_offset, (edc_len) - (edc_max_len), "Extraneous Data"); \ @@ -224,7 +222,7 @@ extern const char* get_gsm_a_msg_string(int pdu_type, int idx); } #define EXTRANEOUS_DATA_CHECK_EXPERT(edc_len, edc_max_len, pinfo) \ - if (((edc_len) > (edc_max_len))||lower_nibble) \ + if ((edc_len) > (edc_max_len)) \ { \ proto_item *expert_item; \ expert_item = proto_tree_add_text(tree, tvb, \ @@ -388,12 +386,10 @@ extern guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint /* * Short Value (V_SHORT) element dissector * - * Length is (ab)used in these functions to indicate upper nibble of the octet (-2) or lower nibble (-1) - * noting that the tv_short dissector always sets the length to -1, as the upper nibble is the IEI. - * This is expected to be used upper nibble first, as the tables of 24.008. + * nibble used in this functions to indicate left or right nibble of the octet + * This is expected to be used right nibble first, as the tables of 24.008. */ - -extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset); +extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int idx, guint32 offset, guint32 nibble); /* XXX: Most (if not all) the functions which make use of the following macros have the variables 'consumed', @@ -590,17 +586,12 @@ extern guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, if ((signed)curr_len <= 0) return; \ } -#define ELEM_MAND_V_SHORT(EMV_pdu_type, EMV_elem_idx) \ +#define ELEM_MAND_VV_SHORT(EMV_pdu_type, EMV_elem_idx1, EMV_elem_idx2) \ {\ - if ((consumed = elem_v_short(tvb, tree, pinfo, EMV_pdu_type, EMV_elem_idx, curr_offset)) > 0) \ - { \ - curr_offset += consumed; \ - curr_len -= consumed; \ - } \ - else \ - { \ - /* Mandatory, but nothing we can do */ \ - } \ + elem_v_short(tvb, tree, pinfo, EMV_pdu_type, EMV_elem_idx1, curr_offset, RIGHT_NIBBLE); \ + elem_v_short(tvb, tree, pinfo, EMV_pdu_type, EMV_elem_idx2, curr_offset, LEFT_NIBBLE); \ + curr_offset ++ ; /* consumed length is 1, regardless of contents */ \ + curr_len -- ; \ if ((signed)curr_len <= 0) return; \ } @@ -695,6 +686,7 @@ guint16 de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 guint16 de_rej_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); guint16 de_d_gb_call_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); +guint16 de_spare_nibble(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_); guint16 de_emm_ue_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); guint16 de_emm_trac_area_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len); diff --git a/epan/dissectors/packet-gsm_a_dtap.c b/epan/dissectors/packet-gsm_a_dtap.c index 0bd73552e9..4030ec57d3 100644 --- a/epan/dissectors/packet-gsm_a_dtap.c +++ b/epan/dissectors/packet-gsm_a_dtap.c @@ -6361,6 +6361,7 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) val_to_str(pd, protocol_discriminator_vals, "Unknown (%u)")); pd_tree = proto_item_add_subtree(oct_1_item, ett_dtap_oct_1); + proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 0, 1, ENC_BIG_ENDIAN); if (ti == -1) { @@ -6396,8 +6397,6 @@ dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } - proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 0, 1, ENC_BIG_ENDIAN); - if ((ti != -1) && (ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK) { diff --git a/epan/dissectors/packet-gsm_a_rr.c b/epan/dissectors/packet-gsm_a_rr.c index 56d3d9cdce..1f7d4c85f1 100644 --- a/epan/dissectors/packet-gsm_a_rr.c +++ b/epan/dissectors/packet-gsm_a_rr.c @@ -2066,12 +2066,12 @@ de_rr_chnl_needed(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint gint bit_offset; curr_offset = offset; - if (UPPER_NIBBLE==len) + if (RIGHT_NIBBLE==len) bit_offset = 4; else bit_offset = 0; - item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s", + item = proto_tree_add_text(tree, tvb, curr_offset, 1, "%s", gsm_rr_elem_strings[DE_RR_CHNL_NEEDED].strptr); subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CHNL_NEEDED]); @@ -2114,7 +2114,7 @@ de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guin * Note: The coding of fields SC and algorithm identifier is defined in [44.018] * as part of the Cipher Mode Setting IE. */ - if (UPPER_NIBBLE==len) + if (RIGHT_NIBBLE==len) bit_offset = 4; else bit_offset = 0; @@ -2145,7 +2145,7 @@ de_rr_cip_mode_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui gint bit_offset; curr_offset = offset; - if (UPPER_NIBBLE==len) + if (RIGHT_NIBBLE==len) bit_offset = 4; else bit_offset = 0; @@ -8966,17 +8966,14 @@ static void dtap_rr_cip_mode_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) { guint32 curr_offset; - guint32 consumed; guint curr_len; curr_offset = offset; curr_len = len; - lower_nibble = FALSE; /* Ciphering Mode Setting 10.5.2.9 M V 0.5 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET); /* Cipher Response 10.5.2.10 M V 0.5 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_RESP); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET, DE_RR_CIP_MODE_RESP); EXTRANEOUS_DATA_CHECK(curr_len, 0); @@ -8993,7 +8990,6 @@ dtap_rr_cip_mode_cpte(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, g curr_offset = offset; curr_len = len; - lower_nibble = FALSE; /* Mobile Equipment Identity 10.5.1.4 O TLV */ ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, "Mobile Equipment Identity"); @@ -9419,11 +9415,9 @@ dtap_rr_imm_ass(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 * i.e. coded with a "0" in each. */ - /* Page Mode 10.5.2.26 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE); - + /* Page Mode 10.5.2.26 M V 1/2 */ /* Dedicated mode or TBF 10.5.2.25b M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_DED_MOD_OR_TBF); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE, DE_RR_DED_MOD_OR_TBF); if((oct&0x10) == 0){ /* Channel Description 10.5.2.5 C V 3m */ @@ -9469,9 +9463,8 @@ dtap_rr_imm_ass_ext(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui curr_len = len; /* Page Mode 10.5.2.26 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE); /* Spare Half Octet 10.5.1.8 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE, DE_SPARE_NIBBLE); /* Channel Description 1 Channel Description 10.5.2.5 M V 3 */ ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Channel Description 1"); /* Request Reference 1 Request Reference 10.5.2.30 M V 3 */ @@ -9508,9 +9501,8 @@ dtap_rr_imm_ass_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui curr_len = len; /* Page Mode 10.5.2.26 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE); /* Spare Half Octet 10.5.1.8 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE, DE_SPARE_NIBBLE); /* Request Reference 1 Request Reference 10.5.2.30 M V 3 */ ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 1"); /* Wait Indication 1 Wait Indication 10.5.2.43 M V 1 */ @@ -9562,13 +9554,10 @@ dtap_rr_paging_req_type_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U curr_offset = offset; curr_len = len; - lower_nibble = FALSE; /* RR Page Mode 10.5.2.26 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE); - /* RR Channel Needed 10.5.2.8 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE, DE_RR_CHNL_NEEDED); /* RR Mobile Identity 10.5.1.4 M LV 2-9 */ ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 1"); @@ -9593,13 +9582,10 @@ dtap_rr_paging_req_type_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U curr_offset = offset; curr_len = len; - lower_nibble = FALSE; /* RR Page Mode 10.5.2.26 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE); - /* RR Channel Needed 10.5.2.8 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE, DE_RR_CHNL_NEEDED); /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */ ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 1"); @@ -9627,13 +9613,10 @@ dtap_rr_paging_req_type_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U curr_offset = offset; curr_len = len; - lower_nibble = FALSE; /* RR Page Mode 10.5.2.26 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE); - /* RR Channel Needed 10.5.2.8 M V 1/2 */ - ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED); + ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE, DE_RR_CHNL_NEEDED); /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */ ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 1"); @@ -10867,6 +10850,7 @@ dissect_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) val_to_str(pd, protocol_discriminator_vals, "Unknown (%u)")); pd_tree = proto_item_add_subtree(oct_1_item, ett_ccch_oct_1); + proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 1, 1, ENC_BIG_ENDIAN); if (ti == -1){ proto_tree_add_item(pd_tree, hf_gsm_a_skip_ind, tvb, 1, 1, ENC_BIG_ENDIAN); @@ -10890,7 +10874,6 @@ dissect_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } - proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 1, 1, ENC_BIG_ENDIAN); if ((ti != -1) && (ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){ proto_tree_add_item(tree, hf_gsm_a_extension, tvb, 2, 1, ENC_BIG_ENDIAN); @@ -11243,12 +11226,12 @@ proto_register_gsm_a_rr(void) }, { &hf_gsm_a_rr_page_mode, { "Page Mode","gsm_a.rr.page_mode", - FT_UINT8,BASE_DEC, VALS(gsm_a_rr_page_mode_vals), 0x03, + FT_UINT8,BASE_DEC, VALS(gsm_a_rr_page_mode_vals), 0x0F, NULL, HFILL } }, { &hf_gsm_a_rr_dedicated_mode_or_tbf, { "Dedicated mode or TBF","gsm_a.rr.dedicated_mode_or_tbf", - FT_UINT8,BASE_DEC, VALS(gsm_a_rr_dedicated_mode_or_tbf_vals), 0x70, + FT_UINT8,BASE_DEC, VALS(gsm_a_rr_dedicated_mode_or_tbf_vals), 0xF0, NULL, HFILL } }, { &hf_gsm_a_rr_pow_cmd_epc, |