* In association with Telos Technology Inc.
*
* Added Dissection of Radio Resource Management Information Elements
- * and othere enhancements and fixes.
+ * and other enhancements and fixes.
* Copyright 2005 - 2006, Anders Broman [AT] ericsson.com
*
* Title 3GPP Other
const value_string gsm_rr_rest_octets_elem_strings[] = {
/* RR Rest Octets information elements */
{ 0, "UTRAN FDD Description" },
- { 0, "UTRAN TDD Description" },
+ { 0, "UTRAN TDD Description" },
{ 0, "3G Measurement Parameters Description" },
{ 0, "3G Additional Measurement Parameters Description" },
{ 0, "Measurement Parameters Description" },
{ 0, "TDD Cell Information Field" },
{ 0, "GPRS 3G Measurement Parameters Description" },
{ 0, "3G Additional Measurement Parameters Description 2" },
+ { 0, "Priority and E-UTRAN Parameters Description" },
+ { 0, "Serving Cell Priority Parameters Description" },
+ { 0, "3G Priority Parameters Description" },
+ { 0, "UTRAN Priority Parameters" },
+ { 0, "E-UTRAN Parameters Description" },
+ { 0, "E-UTRAN Neighbour Cells" },
+ { 0, "E-UTRAN Not Allowed Cells" },
+ { 0, "E-UTRAN PCID to TA mapping" },
+ { 0, "3G CSG Description" },
+ { 0, "E-UTRAN CSG Description" },
{ 0, "Optional Selection Parameters" },
{ 0, "GPRS Indicator" },
{ 0, "SI4 Rest Octets_O" },
static int hf_gsm_a_rr_mean_cv_bep = -1;
static int hf_gsm_a_rr_nbr_rcvd_blocks = -1;
static int hf_gsm_a_rr_reporting_quantity = -1;
+/* Additions in Rel-8 */
+static int hf_gsm_a_rr_3g_priority_param_desc_utran_start = -1;
+static int hf_gsm_a_rr_3g_priority_param_desc_utran_stop = -1;
+static int hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio = -1;
+static int hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran = -1;
+static int hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin = -1;
+static int hf_gsm_a_rr_utran_frequency_index = -1;
+static int hf_gsm_a_rr_utran_priority = -1;
+static int hf_gsm_a_rr_thresh_utran_high = -1;
+static int hf_gsm_a_rr_thresh_utran_low = -1;
+static int hf_gsm_a_rr_utran_qrxlevmin = -1;
+static int hf_gsm_a_rr_eutran_ccn_active = -1;
+static int hf_gsm_a_rr_eutran_start = -1;
+static int hf_gsm_a_rr_eutran_stop = -1;
+static int hf_gsm_a_rr_qsearch_c_eutran_initial = -1;
+static int hf_gsm_a_rr_eutran_rep_quant = -1;
+static int hf_gsm_a_rr_eutran_multirat_reporting = -1;
+static int hf_gsm_a_rr_eutran_fdd_reporting_threshold = -1;
+static int hf_gsm_a_rr_eutran_fdd_reporting_threshold_2 = -1;
+static int hf_gsm_a_rr_eutran_tdd_reporting_threshold = -1;
+static int hf_gsm_a_rr_eutran_tdd_reporting_threshold_2 = -1;
+static int hf_gsm_a_rr_eutran_fdd_measurement_report_offset = -1;
+static int hf_gsm_a_rr_eutran_tdd_measurement_report_offset = -1;
+static int hf_gsm_a_rr_reporting_granularity = -1;
+static int hf_gsm_a_rr_qsearch_p_eutran = -1;
+static int hf_gsm_a_rr_serving_cell_priority_param_geran_priority = -1;
+static int hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search = -1;
+static int hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low = -1;
+static int hf_gsm_a_rr_serving_cell_priority_param_h_prio = -1;
+static int hf_gsm_a_rr_serving_cell_priority_param_t_reselection = -1;
+static int hf_gsm_a_rr_eutran_earfcn = -1;
+static int hf_gsm_a_rr_eutran_measurement_bandwidth = -1;
+static int hf_gsm_a_rr_eutran_priority = -1;
+static int hf_gsm_a_rr_thresh_eutran_high = -1;
+static int hf_gsm_a_rr_thresh_eutran_low = -1;
+static int hf_gsm_a_rr_eutran_qrxlevmin = -1;
+static int hf_gsm_a_rr_eutran_pcid = -1;
+static int hf_gsm_a_rr_eutran_pcid_bitmap_group = -1;
+static int hf_gsm_a_rr_eutran_pcid_pattern_length = -1;
+static int hf_gsm_a_rr_eutran_pcid_pattern = -1;
+static int hf_gsm_a_rr_eutran_pcid_pattern_sense = -1;
+static int hf_gsm_a_rr_eutran_frequency_index = -1;
+static int hf_gsm_a_rr_psc = -1;
+static int hf_gsm_a_rr_utran_psc_pattern_length = -1;
+static int hf_gsm_a_rr_utran_psc_pattern_sense = -1;
+static int hf_gsm_a_rr_utran_csg_fdd_uarfcn = -1;
+static int hf_gsm_a_rr_utran_csg_tdd_uarfcn = -1;
+static int hf_gsm_a_rr_csg_earfcn = -1;
/* Initialize the subtree pointers */
static gint ett_ccch_msg = -1;
DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD,
DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC,
DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2,
+ DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC,
+ DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC,
+ DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC,
+ DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM,
+ DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC,
+ DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS,
+ DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS,
+ DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING,
+ DE_RR_REST_OCTETS_3G_CSG_DESC,
+ DE_RR_REST_OCTETS_EUTRAN_CSG_DESC,
DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM,
DE_RR_REST_OCTETS_GPRS_INDICATOR,
DE_RR_REST_OCTETS_SI4_REST_OCTETS_O,
for (i=1; i<=imax; i++) {
wi = octet & ~(0xff<<bits); /* mask "bits" low bits to start wi from existing octet */
wbits = bits;
- if (wsize>wbits) { /* need to extract more bits from the next octet */
+ while (wsize>wbits) { /* need to extract more bits from the next octet */
octet = tvb_get_guint8(tvb, curr_offset++);
wi = (wi << 8) + octet;
bits = 8;
static guint16
dissect_arfcn_list_core(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_, guint8 format)
{
- guint32 curr_offset;
- guint8 oct,bit,byte;
+ guint32 curr_offset,byte;
+ guint8 oct,bit;
guint16 arfcn;
proto_item *item;
curr_offset = offset;
- if ((format & 0xc0) == 0x00)
+ if ((format & 0xc0) == 0x00)
{
/* bit map 0 */
item = proto_tree_add_text(tree,tvb, curr_offset, len, "List of ARFCNs =");
}
}
- return(curr_offset - offset);
+ return(curr_offset - offset);
}
/*
curr_offset += dissect_arfcn_list_core(tvb, tree, offset, len, add_string, string_len, oct);
- return(curr_offset - offset);
+ return(curr_offset - offset);
}
/*
curr_offset = offset;
- /* Turn bit 127 off, in order to reuse the ARFCN dissection code */
+ /* Turn bit 127 off, in order to reuse the ARFCN dissection code */
oct = tvb_get_guint8(tvb, curr_offset) & 0xbf;
/* FORMAT-ID, Format Identifier (part of octet 3)*/
curr_offset += dissect_arfcn_list_core(tvb, tree, offset, len, add_string, string_len, oct);
- return(curr_offset - offset);
+ return(curr_offset - offset);
}
guint16
guint8 value;
curr_offset = offset;
- proto_tree_add_item(tree, hf_gsm_a_rr_ba_list_pref_length, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_rr_ba_list_pref_length, tvb, curr_offset, 1, FALSE);
bit_offset = curr_offset << 3;
value = tvb_get_bits8(tvb,bit_offset,1);
bit_offset += 1;
guint8 value;
curr_offset = offset;
- proto_tree_add_item(tree, hf_gsm_a_rr_utran_freq_list_length, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_gsm_a_rr_utran_freq_list_length, tvb, curr_offset, 1, FALSE);
bit_offset = curr_offset << 3;
value = tvb_get_bits8(tvb,bit_offset,1);
bit_offset += 1;
break;
case 1: /* UTRAN FDD Description */
bit_offset_sav = bit_offset;
- item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s",
+ item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s",
gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
value = tvb_get_bits8(tvb,bit_offset,1);
nwi = 1;
jwi = 0;
i = 1;
-
+
while (idx > 0)
{
w[i] = tvb_get_bits(tvb, bit_offset, wsize, FALSE);
bit_offset += idx;
}
iused = i-1;
-
+
for (i=1; i <= iused; i++)
{
xdd_cell_info = f_k(i, w, 1024);
- proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
"Scrambling Code: %d", xdd_cell_info & 0x01FF);
- proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
+ proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
"Diversity: %d", (xdd_cell_info >> 9) & 0x01);
}
}
proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
bit_offset += 5;
idx = convert_n_to_q[idx];
- item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s",
+ item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s",
gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
nwi = 1;
jwi = 0;
i = 1;
-
+
while (idx > 0)
{
w[i] = tvb_get_bits(tvb, bit_offset, wsize, FALSE);
bit_offset += idx;
}
iused = i-1;
-
+
for (i=1; i <= iused; i++)
{
xdd_cell_info = f_k(i, w, 512);
else if ((oct8 & 0xc0) == 0x40)
{
str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
- subchannel = ((oct8 % 0x38)>>3);
+ subchannel = ((oct8 & 0x38)>>3);
} else {
str = "Unknown channel information";
subchannel = oct8;
}
-
+
other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
}
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
curr_offset +=1;
-
+
/* Octet 3 */
oct8 = tvb_get_guint8(tvb, curr_offset);
other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
-
+
if ((oct8 & 0x10) == 0x10)
{
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
}
-
+
curr_offset = curr_offset + 2;
return(curr_offset - offset);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
curr_offset +=1;
-
+
/* Octet 3 */
oct8 = tvb_get_guint8(tvb, curr_offset);
other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
}
-
+
curr_offset = curr_offset + 2;
return(curr_offset - offset);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
}
-
+
curr_offset = curr_offset + 2;
return(curr_offset - offset);
/* [3] 10.5.2.11a DTM Information Details
*/
/*
- * [3] 10.5.2.11b Dynamic ARFCN Mapping
+ * [3] 10.5.2.11b Dynamic ARFCN Mapping
*/
static const value_string gsm_a_rr_gsm_band_vals[] = {
{ 0, "GSM 750"},
*/
/*
* [3] 10.5.2.13 Frequency List
- *
+ *
* Bit Bit Bit Bit Bit format notation
* 8 7 4 3 2
* 0 0 X X X bit map 0
* 1 0 1 1 0 128 range
* 1 0 1 1 1 variable bit map
*/
-/* The mask 0xce (1100 1110) will produce the result 0110 0111*/
+/* The mask 0xce (1100 1110) will produce the result 0110 0111*/
static const value_string gsm_a_rr_freq_list_format_id_vals[] = {
{ 0x00, "bit map 0"},
{ 0x02, "bit map 0"},
proto_tree *subtree;
proto_item *item;
gint curr_bit_offset;
-
+
curr_bit_offset = bit_offset;
item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS].strptr);
bit_offset = curr_offset << 3;
bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, tree, bit_offset);
- bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, tree, bit_offset);
+ bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, tree, bit_offset);
curr_offset += len;
return (curr_offset - offset);
"DTX was not used"
};
-static const value_string gsm_a_rr_rxlev_vals [] = {
- { 0, "< -110 dBm"},
- { 1, "-110 <= x < -109 dBm"},
- { 2, "-109 <= x < -108 dBm"},
- { 3, "-108 <= x < -107 dBm"},
- { 4, "-107 <= x < -106 dBm"},
- { 5, "-106 <= x < -105 dBm"},
- { 6, "-105 <= x < -104 dBm"},
- { 7, "-104 <= x < -103 dBm"},
- { 8, "-103 <= x < -102 dBm"},
- { 9, "-102 <= x < -101 dBm"},
- {10, "-101 <= x < -100 dBm"},
- {11, "-100 <= x < -99 dBm"},
- {12, "-99 <= x < -98 dBm"},
- {13, "-98 <= x < -97 dBm"},
- {14, "-97 <= x < -96 dBm"},
- {15, "-96 <= x < -95 dBm"},
- {16, "-95 <= x < -94 dBm"},
- {17, "-94 <= x < -93 dBm"},
- {18, "-93 <= x < -92 dBm"},
- {19, "-92 <= x < -91 dBm"},
- {20, "-91 <= x < -90 dBm"},
- {21, "-90 <= x < -89 dBm"},
- {22, "-89 <= x < -88 dBm"},
- {23, "-88 <= x < -87 dBm"},
- {24, "-87 <= x < -86 dBm"},
- {25, "-86 <= x < -85 dBm"},
- {26, "-85 <= x < -84 dBm"},
- {27, "-84 <= x < -83 dBm"},
- {28, "-83 <= x < -82 dBm"},
- {29, "-82 <= x < -81 dBm"},
- {30, "-81 <= x < -80 dBm"},
- {31, "-80 <= x < -79 dBm"},
- {32, "-79 <= x < -78 dBm"},
- {33, "-78 <= x < -77 dBm"},
- {34, "-77 <= x < -76 dBm"},
- {35, "-76 <= x < -75 dBm"},
- {36, "-75 <= x < -74 dBm"},
- {37, "-74 <= x < -73 dBm"},
- {38, "-73 <= x < -72 dBm"},
- {39, "-72 <= x < -71 dBm"},
- {40, "-71 <= x < -70 dBm"},
- {41, "-70 <= x < -69 dBm"},
- {42, "-69 <= x < -68 dBm"},
- {43, "-68 <= x < -67 dBm"},
- {44, "-67 <= x < -66 dBm"},
- {45, "-66 <= x < -65 dBm"},
- {46, "-65 <= x < -64 dBm"},
- {47, "-64 <= x < -63 dBm"},
- {48, "-63 <= x < -62 dBm"},
- {49, "-62 <= x < -61 dBm"},
- {50, "-61 <= x < -60 dBm"},
- {51, "-60 <= x < -59 dBm"},
- {52, "-59 <= x < -58 dBm"},
- {53, "-58 <= x < -57 dBm"},
- {54, "-57 <= x < -56 dBm"},
- {55, "-56 <= x < -55 dBm"},
- {56, "-55 <= x < -54 dBm"},
- {57, "-54 <= x < -53 dBm"},
- {58, "-53 <= x < -52 dBm"},
- {59, "-52 <= x < -51 dBm"},
- {60, "-51 <= x < -50 dBm"},
- {61, "-50 <= x < -49 dBm"},
- {62, "-49 <= x < -48 dBm"},
- {63, ">= -48 dBm"},
- { 0, NULL}
-};
static const true_false_string gsm_a_rr_mv_vals = {
"The measurement results are not valid",
curr_offset++;
/* 3rd octet */
- /* 3G-BA-USED */
+ /* 3G-BA-USED */
proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ba_used, tvb, curr_offset<<3, 1, FALSE);
/* MEAS-VALID */
- proto_tree_add_item(subtree, hf_gsm_a_rr_meas_valid, tvb, curr_offset, 1, FALSE);
+ proto_tree_add_item(subtree, hf_gsm_a_rr_meas_valid, tvb, curr_offset, 1, FALSE);
/* RXLEV-SUB-SERVING-CELL */
proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_sub_serv_cell, tvb, curr_offset, 1, FALSE);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
curr_offset +=1;
-
+
/* Octet 3 */
oct8 = tvb_get_guint8(tvb, curr_offset);
other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
-
+
if ((oct8 & 0x10) == 0x10)
{
/* Hopping sequence */
gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
guint8 value;
- curr_bit_offset = bit_offset;
+ curr_bit_offset = bit_offset;
item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
guint8 value;
- curr_bit_offset = bit_offset;
+ curr_bit_offset = bit_offset;
item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
return(curr_bit_offset - bit_offset);
}
+/* Additions in Rel-8 */
+static const true_false_string priority_utran_start = {
+ "This is the first instance of the message",
+ "This is not the first instance of the message"
+};
+
+static const true_false_string priority_utran_stop = {
+ "This is the last instance of the message",
+ "This is not the last instance of the message"
+};
+
+static const true_false_string eutran_ccn_active = {
+ "CCN towards E-UTRAN cells is enabled in the cell",
+ "The broadcast E-UTRAN_CCN_ACTIVE parameter shall apply if applicable. Otherwise, CCN towards E-UTRAN cells is disabled in the cell"
+};
+
+static const value_string gsm_a_rr_pcid_psc_pattern_length[] = {
+ { 0, "1"},
+ { 1, "2"},
+ { 2, "3"},
+ { 3, "4"},
+ { 4, "5"},
+ { 5, "6"},
+ { 6, "7"},
+ { 7, "8"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_eutran_measurement_bandwidth[] = {
+ { 0, "NRB = 6"},
+ { 1, "NRB = 15"},
+ { 2, "NRB = 25"},
+ { 3, "NRB = 50"},
+ { 4, "NRB = 75"},
+ { 5, "NRB = 100"},
+ { 6, "Reserved for future use"},
+ { 7, "Reserved for future use"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_serving_cell_thresh_gsm_low[] = {
+ { 0, "0 dB"},
+ { 1, "2 dB"},
+ { 2, "4 dB"},
+ { 3, "6 dB"},
+ { 4, "8 dB"},
+ { 5, "10 dB"},
+ { 6, "12 dB"},
+ { 7, "14 dB"},
+ { 8, "16 dB"},
+ { 9, "18 dB"},
+ {10, "20 dB"},
+ {11, "22 dB"},
+ {12, "24 dB"},
+ {13, "26 dB"},
+ {14, "28 dB"},
+ {15, "Always allowed"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_serving_cell_thresh_priority_search[] = {
+ { 0, "-98 dBm"},
+ { 1, "-95 dBm"},
+ { 2, "-92 dBm"},
+ { 3, "-89 dBm"},
+ { 4, "-86 dBm"},
+ { 5, "-83 dBm"},
+ { 6, "-80 dBm"},
+ { 7, "-77 dBm"},
+ { 8, "-74 dBm"},
+ { 9, "-71 dBm"},
+ {10, "-68 dBm"},
+ {11, "-65 dBm"},
+ {12, "-62 dBm"},
+ {13, "-59 dBm"},
+ {14, "-56 dBm"},
+ {15, "Always search"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_utran_qrxlevmin[] = {
+ { 0, "-119 dBm"},
+ { 1, "-117 dBm"},
+ { 2, "-115 dBm"},
+ { 3, "-113 dBm"},
+ { 4, "-111 dBm"},
+ { 5, "-109 dBm"},
+ { 6, "-107 dBm"},
+ { 7, "-105 dBm"},
+ { 8, "-103 dBm"},
+ { 9, "-101 dBm"},
+ {10, "-99 dBm"},
+ {11, "-97 dBm"},
+ {12, "-95 dBm"},
+ {13, "-93 dBm"},
+ {14, "-91 dBm"},
+ {15, "-89 dBm"},
+ {16, "-87 dBm"},
+ {17, "-85 dBm"},
+ {18, "-83 dBm"},
+ {19, "-81 dBm"},
+ {20, "-79 dBm"},
+ {21, "-77 dBm"},
+ {22, "-75 dBm"},
+ {23, "-73 dBm"},
+ {24, "-71 dBm"},
+ {25, "-69 dBm"},
+ {26, "-67 dBm"},
+ {27, "-65 dBm"},
+ {28, "-63 dBm"},
+ {29, "-61 dBm"},
+ {30, "-59 dBm"},
+ {31, "-57 dBm"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_thresh_utran_eutran_high_low[] = {
+ { 0, "0 dB"},
+ { 1, "2 dB"},
+ { 2, "4 dB"},
+ { 3, "6 dB"},
+ { 4, "8 dB"},
+ { 5, "10 dB"},
+ { 6, "12 dB"},
+ { 7, "14 dB"},
+ { 8, "16 dB"},
+ { 9, "18 dB"},
+ {10, "20 dB"},
+ {11, "22 dB"},
+ {12, "24 dB"},
+ {13, "26 dB"},
+ {14, "28 dB"},
+ {15, "30 dB"},
+ {16, "32 dB"},
+ {17, "34 dB"},
+ {18, "36 dB"},
+ {19, "38 dB"},
+ {20, "40 dB"},
+ {21, "42 dB"},
+ {22, "44 dB"},
+ {23, "46 dB"},
+ {24, "48 dB"},
+ {25, "50 dB"},
+ {26, "52 dB"},
+ {27, "54 dB"},
+ {28, "56 dB"},
+ {29, "58 dB"},
+ {30, "60 dB"},
+ {31, "62 dB"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_eutran_qrxlevmin[] = {
+ { 0, "-140 dBm"},
+ { 1, "-138 dBm"},
+ { 2, "-136 dBm"},
+ { 3, "-134 dBm"},
+ { 4, "-132 dBm"},
+ { 5, "-130 dBm"},
+ { 6, "-128 dBm"},
+ { 7, "-126 dBm"},
+ { 8, "-124 dBm"},
+ { 9, "-122 dBm"},
+ {10, "-120 dBm"},
+ {11, "-118 dBm"},
+ {12, "-116 dBm"},
+ {13, "-114 dBm"},
+ {14, "-112 dBm"},
+ {15, "-110 dBm"},
+ {16, "-108 dBm"},
+ {17, "-106 dBm"},
+ {18, "-104 dBm"},
+ {19, "-102 dBm"},
+ {20, "-100 dBm"},
+ {21, "-98 dBm"},
+ {22, "-96 dBm"},
+ {23, "-94 dBm"},
+ {24, "-92 dBm"},
+ {25, "-90 dBm"},
+ {26, "-88 dBm"},
+ {27, "-86 dBm"},
+ {28, "-84 dBm"},
+ {29, "-82 dBm"},
+ {30, "-80 dBm"},
+ {31, "-78 dBm"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_serving_cell_priority_param_h_prio[] = {
+ { 0, "disabled"},
+ { 1, "5 dB"},
+ { 2, "4 dB"},
+ { 3, "3 dB"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_serving_cell_priority_param_t_reselection[] = {
+ { 0, "5 s"},
+ { 1, "10 s"},
+ { 2, "15 s"},
+ { 3, "20 s"},
+ { 0, NULL }
+};
+
+static const value_string gsm_a_rr_qsearch_c_eutran_initial[] = {
+ { 0, "search if signal is below -98 dBm"},
+ { 1, "search if signal is below -94 dBm"},
+ { 2, "search if signal is below -90 dBm"},
+ { 3, "search if signal is below -86 dBm"},
+ { 4, "search if signal is below -82 dBm"},
+ { 5, "search if signal is below -78 dBm"},
+ { 6, "search if signal is below -74 dBm"},
+ { 7, "always search"},
+ { 8, "search is signal is above -78 dBm"},
+ { 9, "search is signal is above -74 dBm"},
+ {10, "search is signal is above -70 dBm"},
+ {11, "search is signal is above -66 dBm"},
+ {12, "search is signal is above -62 dBm"},
+ {13, "search is signal is above -58 dBm"},
+ {14, "search is signal is above -54 dBm"},
+ {15, "never search"},
+ { 0, NULL }
+};
+
+static const true_false_string gsm_a_rr_pcid_pattern_sense = {
+ "The group of identified cells are the one not belonging to the PCID_BITMAP_GROUP",
+ "The group of identified cells are the one identified by the PCID_BITMAP_GROUP"
+};
+
+static gint
+de_rr_3g_priority_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC]);
+
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_start, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_stop, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+ /* Repeated UTRAN Priority Parameters */
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree *subtree_rep_utran_prio;
+ proto_item *item_rep_utran_prio;
+ gint rep_utran_prio_bit_offset = curr_bit_offset;
+
+ item_rep_utran_prio = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, 1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM].strptr);
+ subtree_rep_utran_prio = proto_item_add_subtree(item_rep_utran_prio, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM]);
+
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_utran_frequency_index, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_utran_priority, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ }
+ proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_thresh_utran_high, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_thresh_utran_low, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_utran_qrxlevmin, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+ proto_item_set_len(item_rep_utran_prio,((curr_bit_offset-rep_utran_prio_bit_offset)>>3)+1);
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_eutran_neighbour_cells(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS]);
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_earfcn, tvb, curr_bit_offset, 16, FALSE);
+ curr_bit_offset += 16;
+
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_measurement_bandwidth, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ }
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_priority, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ }
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_thresh_eutran_high, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_thresh_eutran_low, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_qrxlevmin, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_eutran_pcid(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ gint curr_bit_offset = bit_offset;
+ guint8 value;
+ proto_item *item;
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid, tvb, curr_bit_offset, 9, FALSE);
+ curr_bit_offset += 9;
+ }
+
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ gint i;
+ guint8 bitmap = tvb_get_bits8(tvb,curr_bit_offset,6);
+ item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid_bitmap_group, tvb, curr_bit_offset, 6, FALSE);
+ if (bitmap > 0)
+ {
+ proto_item_append_text(item, ": Cells IDs addressed by the bitmap:");
+ }
+ for (i = 0; i < 6; i++)
+ {
+ if ((1 << i) & bitmap)
+ {
+ if ( i != 0)
+ {
+ proto_item_append_text(item, ",");
+ }
+ proto_item_append_text(item, " %d to %d",i*84, (i+1)*84 - 1);
+ }
+ }
+ curr_bit_offset += 6;
+ }
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ gint pcid_pattern_length;
+ gint pcid_pattern;
+ gint pattern_lower_bound, pattern_upper_bound;
+ gint i;
+
+ pcid_pattern_length = tvb_get_bits8(tvb,curr_bit_offset,3) + 1;
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid_pattern_length, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ pcid_pattern = tvb_get_bits8(tvb,curr_bit_offset, pcid_pattern_length);
+
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s = PCID_Pattern: %d",
+ decode_bits_in_field(curr_bit_offset,pcid_pattern_length, pcid_pattern),
+ pcid_pattern);
+
+ pattern_lower_bound = pcid_pattern << (9 - pcid_pattern_length);
+ pattern_upper_bound = pattern_lower_bound;
+ for (i = 0; i < (9-pcid_pattern_length); i++)
+ {
+ pattern_upper_bound |= 1 << i;
+ }
+ proto_item_append_text(item, ": Cells IDs addressed by the pattern: %d to %d", pattern_lower_bound, pattern_upper_bound);
+
+ curr_bit_offset += pcid_pattern_length;
+ proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid_pattern_sense, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ }
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_eutran_not_allowed_cells(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS]);
+
+ /* dissect PCID group */
+ curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_frequency_index, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_eutran_pcid_to_ta_mapping(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING]);
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ /* dissect PCID group */
+ curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC]);
+
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_ccn_active, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_start, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_stop, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ /* E-UTRAN Measurement Parameters Description */
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_qsearch_c_eutran_initial, tvb, curr_bit_offset, 4, FALSE);
+ curr_bit_offset += 4;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_rep_quant, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_multirat_reporting, tvb, curr_bit_offset, 2, FALSE);
+ curr_bit_offset += 2;
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (!value)
+ {
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ }
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ }
+ }
+ }
+ else
+ {
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_measurement_report_offset, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ }
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_measurement_report_offset, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ }
+ }
+ }
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reporting_granularity, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ /* GPRS E-UTRAN Measurement Parameters Description */
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_qsearch_p_eutran, tvb, curr_bit_offset, 4, FALSE);
+ curr_bit_offset += 4;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_rep_quant, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_multirat_reporting, tvb, curr_bit_offset, 2, FALSE);
+ curr_bit_offset += 2;
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ }
+ }
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ if (value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
+ curr_bit_offset += 6;
+ }
+ }
+ }
+
+ /* Repeated E-UTRAN Neighbour Cells */
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ curr_bit_offset += de_rr_eutran_neighbour_cells(tvb, subtree, curr_bit_offset);
+ }
+
+ /* Repeated E-UTRAN Not Allowed Cells */
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ curr_bit_offset += de_rr_eutran_not_allowed_cells(tvb, subtree, curr_bit_offset);
+ }
+
+ /* Repeated E-UTRAN PCID to TA mapping */
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ curr_bit_offset += de_rr_eutran_pcid_to_ta_mapping(tvb, subtree, curr_bit_offset);
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_priority_and_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC]);
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+
+ /* Serving Cell Priority Parameters Description */
+ if (value)
+ {
+ proto_tree *subtree_serv;
+ proto_item *item_serv;
+ gint serv_bit_offset = curr_bit_offset;
+
+ item_serv = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, ((curr_bit_offset+15)>>3)-(curr_bit_offset>>3) + 1 , "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC].strptr);
+ subtree_serv = proto_item_add_subtree(item_serv, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC]);
+
+ proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_geran_priority, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search, tvb, curr_bit_offset, 4, FALSE);
+ curr_bit_offset += 4;
+ proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low, tvb, curr_bit_offset, 4, FALSE);
+ curr_bit_offset += 4;
+ proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_h_prio, tvb, curr_bit_offset, 2, FALSE);
+ curr_bit_offset += 2;
+ proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_t_reselection, tvb, curr_bit_offset, 2, FALSE);
+ curr_bit_offset += 2;
+ proto_item_set_len(item_serv,((curr_bit_offset-serv_bit_offset)>>3)+1);
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ /* 3G Priority Parameters Description */
+ if (value)
+ {
+ curr_bit_offset += de_rr_3g_priority_param_desc(tvb, subtree, curr_bit_offset);
+ }
+ value = tvb_get_bits8(tvb,curr_bit_offset,1);
+ curr_bit_offset += 1;
+ /* E-UTRAN Parameters Description */
+ if (value)
+ {
+ curr_bit_offset += de_rr_eutran_param_desc(tvb, subtree, curr_bit_offset);
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_3g_csg_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_CSG_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_CSG_DESC]);
+
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ /* CSG_PSC_SPLIT struct */
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_psc, tvb, curr_bit_offset, 9, FALSE);
+ curr_bit_offset += 9;
+ }
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ gint psc_pattern_length;
+ gint psc_pattern;
+
+ psc_pattern_length = tvb_get_bits8(tvb,curr_bit_offset,3) + 1;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_psc_pattern_length, tvb, curr_bit_offset, 3, FALSE);
+ curr_bit_offset += 3;
+ psc_pattern = tvb_get_bits8(tvb,curr_bit_offset, psc_pattern_length);
+
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s = PSC_Pattern: %d",
+ decode_bits_in_field(curr_bit_offset,psc_pattern_length, psc_pattern),
+ psc_pattern);
+
+ curr_bit_offset += psc_pattern_length;
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_psc_pattern_sense, tvb, curr_bit_offset, 1, FALSE);
+ curr_bit_offset += 1;
+ }
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_frequency_index, tvb, curr_bit_offset, 5, FALSE);
+ curr_bit_offset += 5;
+ }
+ }
+
+ while((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ /* CSG_FDD_UARFCN */
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (!value)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_csg_fdd_uarfcn, tvb, curr_bit_offset, 14, FALSE);
+ curr_bit_offset += 14;
+ }
+ else
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_csg_tdd_uarfcn, tvb, curr_bit_offset, 14, FALSE);
+ curr_bit_offset += 14;
+ }
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
+static gint
+de_rr_eutran_csg_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
+{
+ proto_tree *subtree;
+ proto_item *item;
+ gint curr_bit_offset;
+ guint8 value;
+
+ curr_bit_offset = bit_offset;
+ item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC].strptr);
+ subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC]);
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ /* dissect PCID group */
+ curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
+ }
+
+ while ((value = tvb_get_bits8(tvb,curr_bit_offset++,1)) == 1)
+ {
+ proto_tree_add_bits_item(subtree, hf_gsm_a_rr_csg_earfcn, tvb, curr_bit_offset, 16, FALSE);
+ curr_bit_offset += 16;
+ }
+
+ proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
+
+ return(curr_bit_offset - bit_offset);
+}
+
static guint16
de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
proto_tree_add_bits_item(subtree, hf_gsm_a_rr_810_reporting_threshold, tvb, bit_offset, 3, FALSE);
bit_offset += 3;
}
+ /* Additions in Rel-8 */
+ if (((curr_offset + len)<<3) - bit_offset > 0)
+ {
+ /* There is still room left in the Rest Octets IE */
+ if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
+ { /* Additions in Rel-8 */
+ bit_offset += 1;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (value)
+ {
+ bit_offset += de_rr_priority_and_eutran_param_desc(tvb, subtree, bit_offset);
+ }
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (value)
+ {
+ bit_offset += de_rr_3g_csg_desc(tvb, subtree, bit_offset);
+ }
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (value)
+ {
+ bit_offset += de_rr_eutran_csg_desc(tvb, subtree, bit_offset);
+ }
+ }
+ }
}
else
- bit_offset += 1;
+ bit_offset += 1;
}
}
else
proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13alt_position, tvb, bit_offset, 1, FALSE);
bit_offset += 1;
}
-
+
curr_offset = curr_offset + len;
return curr_offset-offset;
proto_tree_add_bits_item(subtree, hf_gsm_a_rr_network_control_order, tvb, bit_offset, 2, FALSE);
bit_offset += 2;
bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, subtree, bit_offset);
- bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, subtree, bit_offset);
+ bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, subtree, bit_offset);
}
if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
{ /* Additions in release 99 */
curr_offset = offset;
proto_tree_add_bits_item(tree, hf_gsm_a_rr_seq_code, tvb,(curr_offset<<3)+3, 1, FALSE);
-
+
return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
}
* [3] 10.5.2.48 APDU ID
*/
static const value_string gsm_a_rr_apdu_id_vals[] = {
- { 0, "RRLP (GSM 04.31) LCS" },
- { 0, NULL },
+ { 0, "RRLP (GSM 04.31) LCS" },
+ { 0, NULL },
};
static guint16
de_rr_apdu_id(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
* [3] 10.5.2.49 APDU Flags
*/
static const value_string gsm_a_rr_apdu_flags_vals[] = {
- { 1, "Last or only segment" },
- { 2, "First or only segment" },
- { 0, NULL },
+ { 1, "Last or only segment" },
+ { 2, "First or only segment" },
+ { 0, NULL },
};
static guint16
de_rr_apdu_flags(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
sub_tvb = tvb_new_subset(tvb, offset, len, len);
- call_dissector(rrlp_dissector, sub_tvb, gsm_a_dtap_pinfo, tree);
+ /* gsm_a_dtap_pinfo MUST be set by any dissector calling de_rr_apdu_data */
+ /* XXX: test added to match de_rr_ho_to_utran_cmd & etc (and to fix a crash) */
+ if (rrlp_dissector && gsm_a_dtap_pinfo)
+ call_dissector(rrlp_dissector, sub_tvb, gsm_a_dtap_pinfo, tree);
return len;
}
{
rrc_irat_ho_to_utran_cmd_tvb = tvb_new_subset(tvb, curr_offset, len, len);
if (rrc_irat_ho_to_utran_cmd_handle && gsm_a_dtap_pinfo)
- /* gsm_a_dtap_pinfo MUST be set by any dissector calling de_rr_ho_to_utran_cmd */
+ /* gsm_a_dtap_pinfo MUST be set by any dissector calling de_rr_ho_to_utran_cmd */
call_dissector(rrc_irat_ho_to_utran_cmd_handle, rrc_irat_ho_to_utran_cmd_tvb, gsm_a_dtap_pinfo, tree);
}
static void
sacch_rr_meas_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_)
{
- proto_tree *subtree, *subtree2;
+ proto_tree *subtree = NULL, *subtree2 = NULL;
proto_item *item, *item2;
guint32 curr_offset;
gint bit_offset, bit_offset_sav, bit_offset_sav2;
proto_tree_add_bits_item(tree, hf_gsm_a_rr_810_reporting_threshold, tvb, bit_offset, 3, FALSE);
bit_offset += 3;
}
+ /* Additions in Rel-8 */
+ if (((curr_offset + len)<<3) - bit_offset > 0)
+ {
+ /* There is still room left in the Rest Octets IE */
+ if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
+ { /* Additions in Rel-8 */
+ bit_offset += 1;
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (value)
+ {
+ bit_offset += de_rr_priority_and_eutran_param_desc(tvb, subtree, bit_offset);
+ }
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (value)
+ {
+ bit_offset += de_rr_3g_csg_desc(tvb, subtree, bit_offset);
+ }
+ value = tvb_get_bits8(tvb,bit_offset,1);
+ bit_offset += 1;
+ if (value)
+ {
+ bit_offset += de_rr_eutran_csg_desc(tvb, subtree, bit_offset);
+ }
+ }
+ }
}
else
bit_offset += 1;
{ 0, NULL }
};
-
static void
sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
{
ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_L2_PSEUDO_LEN);
tree = saved_tree;
offset = saved_offset;
- len = curr_len;
+ len = curr_len;
oct_1_item =
proto_tree_add_text(ccch_tree,
{ "Reporting Quantity", "gsm_a.rr.reporting_quantity",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_3g_priority_param_desc_utran_start,
+ { "UTRAN Start", "gsm_a.rr.3g_priority.utran_start",
+ FT_BOOLEAN, BASE_DEC, TFS(&priority_utran_start), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_3g_priority_param_desc_utran_stop,
+ { "UTRAN Stop", "gsm_a.rr.3g_priority.utran_stop",
+ FT_BOOLEAN, BASE_DEC, TFS(&priority_utran_stop), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio,
+ { "DEFAULT_UTRAN_PRIORITY", "gsm_a.rr.3g_priority.default_utran_prio",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran,
+ { "DEFAULT_THRESH_UTRAN", "gsm_a.rr.3g_priority.default_threshold_utran",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin,
+ { "DEFAULT_UTRAN_QRXLEVMIN", "gsm_a.rr.3g_priority.default_utran_qrxlevmin",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_utran_qrxlevmin), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_frequency_index,
+ { "UTRAN Frequency Index", "gsm_a.rr.3g_priority.utran_frequency_index",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_priority,
+ { "UTRAN_PRIORITY", "gsm_a.rr.3g_priority.utran_priority",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_thresh_utran_high,
+ { "THRESH_UTRAN_high", "gsm_a.rr.3g_priority.thres_utran_high",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_thresh_utran_low,
+ { "THRESH_UTRAN_low", "gsm_a.rr.3g_priority.thres_utran_low",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_qrxlevmin,
+ { "UTRAN_QRXLEVMIN", "gsm_a.rr.3g_priority.utran_qrxlevmin",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_ccn_active,
+ { "E-UTRAN_CCN_ACTIVE", "gsm_a.rr.3g_priority.eutran_ccn_active",
+ FT_BOOLEAN, BASE_DEC, TFS(&eutran_ccn_active), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_start,
+ { "E-UTRAN Start", "gsm_a.rr.3g_priority.eutran_start",
+ FT_BOOLEAN, BASE_DEC, TFS(&priority_utran_start), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_stop,
+ { "E-UTRAN Stop", "gsm_a.rr.3g_priority.utran_stop",
+ FT_BOOLEAN, BASE_DEC, TFS(&priority_utran_stop), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_qsearch_c_eutran_initial,
+ { "Qsearch_C_E-UTRAN_Initial", "gsm_a.rr.qsearch_c_eutran_initial",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_c_eutran_initial), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_rep_quant,
+ { "E-UTRAN_REP_QUANT", "gsm_a.rr.eutran_rep_quant",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_multirat_reporting,
+ { "E-UTRAN_MULTIRAT_REPORTING", "gsm_a.rr.eutran_multirat_reporting",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_fdd_reporting_threshold,
+ { "E-UTRAN_FDD_REPORTING_THRESHOLD", "gsm_a.rr.eutran_fdd_reporting_threshold",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_fdd_reporting_threshold_2,
+ { "E-UTRAN_FDD_REPORTING_THRESHOLD_2", "gsm_a.rr.eutran_fdd_reporting_threshold_2",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_tdd_reporting_threshold,
+ { "E-UTRAN_TDD_REPORTING_THRESHOLD", "gsm_a.rr.eutran_tdd_reporting_threshold",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_tdd_reporting_threshold_2,
+ { "E-UTRAN_TDD_REPORTING_THRESHOLD_2", "gsm_a.rr.eutran_tdd_reporting_threshold_2",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_fdd_measurement_report_offset,
+ { "E-UTRAN_FDD_MEASUREMENT_REPORT_OFFSET", "gsm_a.rr.eutran_fdd_measurement_report_offset",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_tdd_measurement_report_offset,
+ { "E-UTRAN_TDD_MEASUREMENT_REPORT_OFFSET", "gsm_a.rr.eutran_tdd_measurement_report_offset",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_reporting_granularity,
+ { "REPORTING_GRANULARITY", "gsm_a.rr.reporting_granularity",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_qsearch_p_eutran,
+ { "Qsearch_P_E-UTRAN", "gsm_a.rr.qsearch_p_eutran",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_serving_cell_priority_param_geran_priority,
+ { "GERAN_PRIORITY", "gsm_a.rr.serving_cell_priority_param_geran_priority",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search,
+ { "THRESH_Priority_Search", "gsm_a.rr.serving_cell_priority_param_thresh_prio_search",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_thresh_priority_search), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low,
+ { "THRESH_GSM_low", "gsm_a.rr.serving_cell_priority_param_thresh_gsm_low",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_thresh_gsm_low), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_serving_cell_priority_param_h_prio,
+ { "H_PRIO", "gsm_a.rr.serving_cell_priority_param_h_prio",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_priority_param_h_prio), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_serving_cell_priority_param_t_reselection,
+ { "T_Reselection", "gsm_a.rr.serving_cell_priority_param_t_reselection",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_priority_param_t_reselection), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_earfcn,
+ { "EARFCN", "gsm_a.rr.earfcn",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_measurement_bandwidth,
+ { "Measurement Bandwidth", "gsm_a.rr.eutran_measurement_bandwidth",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_eutran_measurement_bandwidth), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_priority,
+ { "E-UTRAN_PRIORITY", "gsm_a.rr.eutran_priority",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_thresh_eutran_high,
+ { "THRESH_EUTRAN_high", "gsm_a.rr.thresh_eutran_high",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_thresh_eutran_low,
+ { "THRESH_EUTRAN_low", "gsm_a.rr.thresh_eutran_low",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_qrxlevmin,
+ { "E-UTRAN_QRXLEVMIN", "gsm_a.rr.eutran_qrxlevmin",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_eutran_qrxlevmin), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_pcid,
+ { "PCID", "gsm_a.rr.pcid",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_pcid_bitmap_group,
+ { "PCID_BITMAP_GROUP", "gsm_a.rr.pcid_bitmap_group",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_pcid_pattern_length,
+ { "PCID_Pattern_length", "gsm_a.rr.pcid_pattern_length",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pcid_psc_pattern_length), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_pcid_pattern,
+ { "PCID_Pattern", "gsm_a.rr.pcid_pattern",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_pcid_pattern_sense,
+ { "PCID_pattern_sense", "gsm_a.rr.pcid_pattern_sense",
+ FT_BOOLEAN, BASE_DEC, TFS(&gsm_a_rr_pcid_pattern_sense), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_eutran_frequency_index,
+ { "E-UTRAN_FREQUENCY_INDEX", "gsm_a.rr.eutran_frequency_index",
+ FT_UINT8, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_psc,
+ { "PSC", "gsm_a.rr.psc",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_psc_pattern_length,
+ { "PSC_Pattern_length", "gsm_a.rr.psc_pattern_length",
+ FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pcid_psc_pattern_length), 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_psc_pattern_sense,
+ { "PSC_pattern_sense", "gsm_a.rr.psc_pattern_sense",
+ FT_BOOLEAN, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_csg_fdd_uarfcn,
+ { "CSG FDD UARFCN", "gsm_a.rr.utran_csg_fdd_uarfcn",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_utran_csg_tdd_uarfcn,
+ { "CSG TDD UARFCN", "gsm_a.rr.utran_csg_tdd_uarfcn",
+ FT_UINT16, BASE_DEC, NULL, 0x0000,
+ NULL, HFILL }
+ },
+ { &hf_gsm_a_rr_csg_earfcn,
+ { "CSG_EARFCN", "gsm_a.rr.csg_earfcn",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
+ NULL, HFILL }
}
};
}
};
- /* Setup protocol subtree array */
+ /* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS 3
gint *ett[NUM_INDIVIDUAL_ELEMS +
NUM_GSM_DTAP_MSG_RR +