MSWSP: fix dissect_mswsp_smb()
[wireshark-wip.git] / epan / dissectors / packet-gsm_a_rr.c
blob774d02d3162e5a389d7dae2e56132c7764fd50a1
1 /* packet-gsm_a_rr.c
2 * Routines for GSM A Interface (actually A-bis really) RR dissection - A.K.A. GSM layer 3 Radio Resource Protocol
4 * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
5 * In association with Telos Technology Inc.
7 * Added Dissection of Radio Resource Management Information Elements
8 * and other enhancements and fixes.
9 * Copyright 2005 - 2006, Anders Broman [AT] ericsson.com
11 * Title 3GPP Other
13 * Reference [3]
14 * Mobile radio interface Layer 3 specification;
15 * Core network protocols;
16 * Stage 3
17 * (3GPP TS 24.008 version 4.7.0 Release 4)
18 * (ETSI TS 124 008 V6.8.0 (2005-03))
20 * Reference [4]
21 * Mobile radio interface layer 3 specification;
22 * Radio Resource Control Protocol
23 * (GSM 04.18 version 8.4.1 Release 1999)
24 * (3GPP TS 04.18 version 8.26.0 Release 1999)
26 * $Id$
28 * Wireshark - Network traffic analyzer
29 * By Gerald Combs <gerald@wireshark.org>
30 * Copyright 1998 Gerald Combs
32 * This program is free software; you can redistribute it and/or
33 * modify it under the terms of the GNU General Public License
34 * as published by the Free Software Foundation; either version 2
35 * of the License, or (at your option) any later version.
37 * This program is distributed in the hope that it will be useful,
38 * but WITHOUT ANY WARRANTY; without even the implied warranty of
39 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40 * GNU General Public License for more details.
42 * You should have received a copy of the GNU General Public License
43 * along with this program; if not, write to the Free Software
44 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
47 #include "config.h"
49 #include <epan/packet.h>
50 #include <epan/prefs.h>
51 #include <epan/tap.h>
52 #include <epan/asn1.h>
53 #include <epan/expert.h>
54 #include "packet-bssap.h"
55 #include "packet-sccp.h"
56 #include "packet-ber.h"
57 #include "packet-q931.h"
58 #include "packet-gsm_a_common.h"
59 #include "packet-e212.h"
60 #include "packet-ppp.h"
62 static dissector_handle_t rrc_irat_ho_info_handle;
63 static dissector_handle_t rrc_irat_ho_to_utran_cmd_handle;
65 #define PADDING_BYTE 0x2B
67 /* 3GPP TS 44.018 version 11.2.0 Release 11 */
68 const value_string gsm_a_dtap_msg_rr_strings[] = {
69 { 0x3c, "Reserved" },
70 { 0x3b, "Additional Assignment" },
71 { 0x3f, "Immediate Assignment" },
72 { 0x39, "Immediate Assignment Extended" },
73 { 0x3a, "Immediate Assignment Reject" },
75 { 0x48, "DTM Assignment Failure" },
76 { 0x49, "DTM Reject" },
77 { 0x4a, "DTM Request" },
78 { 0x4b, "Packet Assignment" },
79 { 0x4c, "DTM Assignment Command" },
80 { 0x4d, "DTM Information" },
81 { 0x4e, "Packet Notification" },
83 { 0x35, "Ciphering Mode Command" },
84 { 0x32, "Ciphering Mode Complete" },
86 { 0x30, "Configuration Change Command" },
87 { 0x31, "Configuration Change Ack." },
88 { 0x33, "Configuration Change Reject" },
90 { 0x2e, "Assignment Command" },
91 { 0x29, "Assignment Complete" },
92 { 0x2f, "Assignment Failure" },
93 { 0x2b, "Handover Command" },
94 { 0x2c, "Handover Complete" },
95 { 0x28, "Handover Failure" },
96 { 0x2d, "Physical Information" },
98 { 0x08, "RR-cell Change Order" },
99 { 0x23, "PDCH Assignment Command" },
101 { 0x0d, "Channel Release" },
102 { 0x0a, "Partial Release" },
103 { 0x0f, "Partial Release Complete" },
105 { 0x21, "Paging Request Type 1" },
106 { 0x22, "Paging Request Type 2" },
107 { 0x24, "Paging Request Type 3" },
108 { 0x27, "Paging Response" },
109 { 0x20, "Notification/NCH" },
110 { 0x25, "Reserved" },
111 { 0x26, "Notification/Response" },
113 { 0x0b, "Reserved" },
115 #if 0
116 /* ETSI TS 101 503 V8.5.0 Seems to give Other def for this Messages??? */
117 { 0xc0, "Utran Classmark Change" }, CONFLICTS WITH Handover To UTRAN Command
118 { 0xc1, "UE RAB Preconfiguration" },
119 { 0xc2, "cdma2000 Classmark Change" },
120 #endif
122 /* ETSI TS 101 503 V8.5.0 */
123 { 0x60, "Utran Classmark Change" },
124 { 0x62, "cdma2000 Classmark Change" },
125 { 0x63, "Inter System to UTRAN Handover Command" },
126 { 0x64, "Inter System to cdma2000 Handover Command" },
127 { 0x18, "System Information Type 8" },
128 { 0x19, "System Information Type 1" },
129 { 0x1a, "System Information Type 2" },
130 { 0x1b, "System Information Type 3" },
131 { 0x1c, "System Information Type 4" },
132 { 0x1d, "System Information Type 5" },
133 { 0x1e, "System Information Type 6" },
134 { 0x1f, "System Information Type 7" },
136 { 0x02, "System Information Type 2bis" },
137 { 0x03, "System Information Type 2ter" },
138 { 0x07, "System Information Type 2quater" },
139 { 0x05, "System Information Type 5bis" },
140 { 0x06, "System Information Type 5ter" },
141 { 0x04, "System Information Type 9" },
142 { 0x00, "System Information Type 13" },
144 { 0x3d, "System Information Type 16" },
145 { 0x3e, "System Information Type 17" },
147 { 0x40, "System Information Type 18" },
148 { 0x41, "System Information Type 19" },
149 { 0x42, "System Information Type 20" },
151 { 0x10, "Channel Mode Modify" },
152 { 0x12, "RR Status" },
153 { 0x17, "Channel Mode Modify Acknowledge" },
154 { 0x14, "Frequency Redefinition" },
155 { 0x15, "Measurement Report" },
156 { 0x16, "Classmark Change" },
157 { 0x13, "Classmark Enquiry" },
158 { 0x36, "Extended Measurement Report" },
159 { 0x37, "Extended Measurement Order" },
160 { 0x34, "GPRS Suspension Request" },
162 { 0x09, "VGCS Uplink Grant" },
163 { 0x0e, "Uplink Release" },
164 { 0x0c, "Reserved" },
165 { 0x2a, "Uplink Busy" },
166 { 0x11, "Talker Indication" },
168 { 0xc0, "UTRAN Classmark Change/Handover To UTRAN Command" }, /* spec conflict */
170 { 0x38, "Application Information" },
172 { 0, NULL }
175 static const value_string gsm_rr_elem_strings[] = {
176 /* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
177 { DE_RR_BA_RANGE, "BA Range" }, /* [3] 10.5.2.1a BA Range */
178 { DE_RR_CELL_CH_DSC, "Cell Channel Description" }, /* [3] 10.5.2.1b */
179 { DE_RR_BA_LIST_PREF, "BA List Pref" }, /* [3] 10.5.2.1c BA List Pref */
180 { DE_RR_UTRAN_FREQ_LIST, "UTRAN Frequency List" }, /* [3] 10.5.2.1d UTRAN Frequency List */
181 { DE_RR_CELL_SELECT_INDIC, "Cell Selection Indicator after Release of all TCH and SDCCH" }, /* [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE */
182 { DE_RR_CELL_DSC, "Cell Description" }, /* 10.5.2.2 */
183 { DE_RR_CELL_OPT_BCCH, "Cell Options (BCCH)" }, /* [3] 10.5.2.3 Cell Options (BCCH) */
184 { DE_RR_CELL_OPT_SACCH, "Cell Options (SACCH)" }, /* [3] 10.5.2.3a Cell Options (SACCH) */
185 { DE_RR_CELL_SEL_PARAM, "Cell Selection Parameters" }, /* [3] 10.5.2.4 Cell Selection Parameters */
186 /* [3] 10.5.2.4a (void) */
187 { DE_RR_CH_DSC, "Channel Description" }, /* 10.5.2.5 */
188 { DE_RR_CH_DSC2, "Channel Description 2" }, /* 10.5.2.5a */
189 { DE_RR_CH_DSC3, "Channel Description 3" }, /* 10.5.2.5c */
190 { DE_RR_CH_MODE, "Channel Mode" }, /* [3] 10.5.2.6 */
191 { DE_RR_CH_MODE2, "Channel Mode 2" }, /* [3] 10.5.2.7 */
192 { DE_RR_UTRAN_CM, "UTRAN Classmark" }, /* [3] 10.5.2.7a */
193 /* [3] 10.5.2.7b (void) */
194 { DE_RR_CM_ENQ_MASK, "Classmark Enquiry Mask" }, /* [3] 10.5.2.7c */
195 /* [3] 10.5.2.7d GERAN Iu Mode Classmark information element */
196 { DE_RR_CHNL_NEEDED, "Channel Needed"}, /* [3] 10.5.2.8 */
197 /* [3] 10.5.2.8a (void) */
198 { DE_RR_CHNL_REQ_DESC2, "Channel Request Description 2"}, /* [3] 10.5.2.8b Channel Request Description 2 */
199 /* Pos 20 */
200 { DE_RR_CIP_MODE_SET, "Cipher Mode Setting" }, /* [3] 10.5.2.9 */
201 { DE_RR_CIP_MODE_RESP, "Cipher Mode Response" }, /* [3] 10.5.2.10 */
202 { DE_RR_CTRL_CH_DESC, "Control Channel Description" }, /* [3] 10.5.2.11 Control Channel Description */
203 { DE_RR_DTM_INFO_DETAILS, "DTM Information Details" }, /* [3] 10.5.2.11a DTM Information Details */
204 { DE_RR_DYN_ARFCN_MAP, "Dynamic ARFCN Mapping" }, /* [3] 10.5.2.11b */
205 { DE_RR_FREQ_CH_SEQ, "Frequency Channel Sequence" }, /* [3] 10.5.2.12 */
206 { DE_RR_FREQ_LIST, "Frequency List" }, /* 10.5.2.13 */
207 { DE_RR_FREQ_SHORT_LIST, "Frequency Short List" }, /* 10.5.2.14 */
208 { DE_RR_FREQ_SHORT_LIST2, "Frequency Short List 2" }, /* 10.5.2.14a */
209 /* [3] 10.5.2.14b Group Channel Description */
210 { DE_RR_GPRS_RESUMPTION, "GPRS Resumption" }, /* [3] 10.5.2.14c GPRS Resumption */
211 { DE_RR_GPRS_BROADCAST_INFORMATION, "GPRS Broadcast Information" }, /* [3] 10.5.2.14d GPRS broadcast information */
212 /* [3] 10.5.2.14e Enhanced DTM CS Release Indication */
213 { DE_RR_HO_REF, "Handover Reference" }, /* 10.5.2.15 */
214 { DE_RR_IA_REST_OCT, "IA Rest Octets" }, /* [3] 10.5.2.16 */
215 { DE_RR_IAR_REST_OCT, "IAR Rest Octets" }, /* [3] 10.5.2.17 IAR Rest Octets */
216 { DE_RR_IAX_REST_OCT, "IAX Rest Octets" }, /* [3] 10.5.2.18 IAX Rest Octets */
217 { DE_RR_L2_PSEUDO_LEN, "L2 Pseudo Length" }, /* [3] 10.5.2.19 */
218 { DE_RR_MEAS_RES, "Measurement Results" }, /* [3] 10.5.2.20 Measurement Results */
220 * [3] 10.5.2.20a GPRS Measurement Results
222 { DE_RR_MOB_ALL, "Mobile Allocation" }, /* [3] 10.5.2.21 */
223 { DE_RR_MOB_TIME_DIFF, "Mobile Time Difference" }, /* [3] 10.5.2.21a */
224 { DE_RR_MULTIRATE_CONF, "MultiRate configuration" }, /* [3] 10.5.2.21aa */
225 /* Pos 30 */
226 { DE_RR_MULT_ALL, "Multislot Allocation" }, /* [3] 10.5.2.21b */
228 * [3] 10.5.2.21c NC mode
230 { DE_RR_NEIGH_CELL_DESC, "Neighbour Cell Description" }, /* [3] 10.5.2.22 Neighbour Cell Description */
231 { DE_RR_NEIGH_CELL_DESC2, "Neighbour Cell Description 2" }, /* [3] 10.5.2.22a Neighbour Cell Description 2 */
233 * [3] 10.5.2.22b (void)
234 * [3] 10.5.2.22c NT/N Rest Octets */
235 { DE_RR_P1_REST_OCT, "P1 Rest Octets" }, /* [3] 10.5.2.23 P1 Rest Octets */
236 { DE_RR_P2_REST_OCT, "P2 Rest Octets" }, /* [3] 10.5.2.24 P2 Rest Octets */
237 { DE_RR_P3_REST_OCT, "P3 Rest Octets" }, /* [3] 10.5.2.25 P3 Rest Octets */
238 { DE_RR_PACKET_CH_DESC, "Packet Channel Description" }, /* [3] 10.5.2.25a */
239 { DE_RR_DED_MOD_OR_TBF, "Dedicated mode or TBF" }, /* [3] 10.5.2.25b */
240 { DE_RR_PKT_UL_ASS, "Packet Uplink Assignment" }, /* [3] 10.5.2.25c RR Packet Uplink Assignment */
241 { DE_RR_PKT_DL_ASS, "Packet Downlink Assignment" }, /* [3] 10.5.2.25d RR Packet Downlink Assignment */
242 { DE_RR_PKT_DL_ASS_TYPE2, "Packet Downlink Assignment Type 2" }, /* [3] 110.5.2.25e RR Packet Downlink Assignment Type 2 */
243 { DE_RR_PAGE_MODE, "Page Mode" }, /* [3] 10.5.2.26 */
244 { DE_RR_NCC_PERM, "NCC Permitted" }, /* [3] 10.5.2.27 NCC Permitted */
245 { DE_RR_POW_CMD, "Power Command" }, /* 10.5.2.28 */
246 { DE_RR_POW_CMD_AND_ACC_TYPE, "Power Command and access type" }, /* 10.5.2.28a */
247 { DE_RR_RACH_CTRL_PARAM, "RACH Control Parameters" }, /* [3] 10.5.2.29 RACH Control Parameters */
248 { DE_RR_REQ_REF, "Request Reference" }, /* [3] 10.5.2.30 Request Reference */
249 { DE_RR_CAUSE, "RR Cause" }, /* 10.5.2.31 */
250 { DE_RR_SYNC_IND, "Synchronization Indication" }, /* 10.5.2.39 */
251 { DE_RR_SI1_REST_OCT, "SI 1 Rest Octets" }, /* [3] 10.5.2.32 */
252 /* [3] 10.5.2.33 SI 2bis Rest Octets */
253 { DE_RR_SI2TER_REST_OCT, "SI 2ter Rest Octets" }, /* [3] 10.5.2.33a */
254 { DE_RR_SI2QUATER_REST_OCT, "SI 2quater Rest Octets" }, /* [3] 10.5.2.33b */
255 { DE_RR_SI3_REST_OCT, "SI 3 Rest Octets" }, /* [3] 10.5.2.34 */
256 { DE_RR_SI4_REST_OCT, "SI 4 Rest Octets" }, /* [3] 10.5.2.35 */
257 { DE_RR_SI6_REST_OCT, "SI 6 Rest Octets" }, /* [3] 10.5.2.35a */
258 /* [3] 10.5.2.36 SI 7 Rest Octets
259 * [3] 10.5.2.37 SI 8 Rest Octets
260 * [3] 10.5.2.37a SI 9 Rest Octets
262 { DE_RR_SI13_REST_OCT, "SI 13 Rest Octets" }, /* [3] 10.5.2.37b */
263 /* [3] 10.5.2.37c (void)
264 * [3] 10.5.2.37d (void)
265 * [3] 10.5.2.37e SI 16 Rest Octets
266 * [3] 10.5.2.37f SI 17 Rest Octets
267 * [3] 10.5.2.37g SI 19 Rest Octets
268 * [3] 10.5.2.37h SI 18 Rest Octets
269 * [3] 10.5.2.37i SI 20 Rest Octets */
270 { DE_RR_STARTING_TIME, "Starting Time" }, /* [3] 10.5.2.38 Starting Time */
271 { DE_RR_TIMING_ADV, "Timing Advance" }, /* [3] 10.5.2.40 Timing Advance */
272 { DE_RR_TIME_DIFF, "Time Difference" }, /* [3] 10.5.2.41 Time Difference */
273 { DE_RR_TLLI, "TLLI" }, /* [3] 10.5.2.41a TLLI */
274 { DE_RR_TMSI_PTMSI, "TMSI/P-TMSI" }, /* [3] 10.5.2.42 TMSI/P-TMSI */
275 { DE_RR_VGCS_TAR_MODE_IND, "VGCS target mode Indication" }, /* [3] 10.5.2.42a */
276 /* Pos 40 */
277 { DE_RR_VGCS_CIP_PAR, "VGCS Ciphering Parameters" }, /* [3] 10.5.2.42b */
278 { DE_RR_WAIT_IND, "Wait Indication" }, /* [3] 10.5.2.43 Wait Indication */
279 /* [3] 10.5.2.44 SI10 rest octets $(ASCI)$ */
280 { DE_RR_EXT_MEAS_RESULT, "Extended Measurement Results" }, /* [3] 10.5.2.45 Extended Measurement Results */
281 { DE_RR_EXT_MEAS_FREQ_LIST, "Extended Measurement Frequency List" },/* [3] 10.5.2.46 Extended Measurement Frequency List */
282 { DE_RR_SUS_CAU, "Suspension Cause" }, /* [3] 10.5.2.47 */
283 { DE_RR_APDU_ID, "APDU ID" }, /* [3] 10.5.2.48 APDU ID */
284 { DE_RR_APDU_FLAGS, "APDU Flags" }, /* [3] 10.5.2.49 APDU Flags */
285 { DE_RR_APDU_DATA, "APDU Data" }, /* [3] 10.5.2.50 APDU Data */
286 { DE_RR_HO_TO_UTRAN_CMD, "Handover to UTRAN Command" }, /* [3] 10.5.2.51 Handover To UTRAN Command */
287 /* [3] 10.5.2.52 Handover To cdma2000 Command
288 * [3] 10.5.2.53 (void)
289 * [3] 10.5.2.54 (void)
290 * [3] 10.5.2.55 (void)
291 * [3] 10.5.2.56 3G Target Cell */
292 { DE_RR_SERV_SUP, "Service Support" }, /* [3] 10.5.2.57 */
293 /* 10.5.2.58 MBMS p-t-m Channel Description */
294 { DE_RR_DED_SERV_INF, "Dedicated Service Information" }, /* [3] 10.5.2.59 */
296 * 10.5.2.60 MPRACH Description
297 * 10.5.2.61 Restriction Timer
298 * 10.5.2.62 MBMS Session Identity
299 * 10.5.2.63 Reduced group or broadcast call reference
300 * 10.5.2.64 Talker Priority status
301 * 10.5.2.65 Talker Identity
302 * 10.5.2.66 Token
303 * 10.5.2.67 PS Cause
304 * 10.5.2.68 VGCS AMR Configuration
306 { DE_RR_CARRIER_IND, "Carrier Indication" }, /* 10.5.2.69 Carrier Indication */
307 { 0, NULL }
309 value_string_ext gsm_rr_elem_strings_ext = VALUE_STRING_EXT_INIT(gsm_rr_elem_strings);
311 const value_string gsm_rr_rest_octets_elem_strings[] = {
312 /* RR Rest Octets information elements */
313 { 0, "UTRAN FDD Description" },
314 { 0, "UTRAN TDD Description" },
315 { 0, "3G Measurement Parameters Description" },
316 { 0, "3G Additional Measurement Parameters Description" },
317 { 0, "Measurement Parameters Description" },
318 { 0, "GPRS Real Time Difference Description" },
319 { 0, "GPRS BSIC Description" },
320 { 0, "GPRS Report Priority Description" },
321 { 0, "GPRS Measurement Parameters Description" },
322 { 0, "NC Measurement Parameters" },
323 { 0, "SI2q Extension Information" },
324 { 0, "CCN Support Description" },
325 { 0, "3G Neighbour Cell Description" },
326 { 0, "FDD Cell Information Field" },
327 { 0, "TDD Cell Information Field" },
328 { 0, "GPRS 3G Measurement Parameters Description" },
329 { 0, "3G Additional Measurement Parameters Description 2" },
330 { 0, "Priority and E-UTRAN Parameters Description" },
331 { 0, "Serving Cell Priority Parameters Description" },
332 { 0, "3G Priority Parameters Description" },
333 { 0, "UTRAN Priority Parameters" },
334 { 0, "E-UTRAN Parameters Description" },
335 { 0, "E-UTRAN Neighbour Cells" },
336 { 0, "E-UTRAN Not Allowed Cells" },
337 { 0, "E-UTRAN PCID to TA mapping" },
338 { 0, "3G CSG Description" },
339 { 0, "E-UTRAN CSG Description" },
340 { 0, "Optional Selection Parameters" },
341 { 0, "GPRS Indicator" },
342 { 0, "SI4 Rest Octets_O" },
343 { 0, "SI4 Rest Octets_S" },
344 { 0, "LSA Parameters" },
345 { 0, "LSA ID Information" },
346 { 0, "PCH and NCH Info" },
347 { 0, "VBS/VGCS Options" },
348 { 0, "GPRS Mobile Allocation" },
349 { 0, "GPRS Cell Options" },
350 { 0, "GPRS Cell Options Extension Information" },
351 { 0, "GPRS Power Control Parameters" },
352 { 0, "PBCCH Description" },
353 { 0, "GSM Description" },
354 { 0, "Real Time Difference Description" },
355 { 0, "BSIC Description" },
356 { 0, "Report Priority Description" },
357 { 0, "CDMA2000 Description" },
358 { 0, "Serving cell data" },
359 { 0, "Repeated Invalid BSIC Information" },
360 { 0, "Bitmap Type Reporting" },
361 { 0, "3G Supplementary Parameters Description" },
362 { 0, "UTRAN Measurement Control Parameters" },
363 { 0, "EGPRS Packet Uplink Assignment" },
364 { 0, "Multiple Blocks Packet Downlink Assignment" },
365 { 0, "Temporary Mobile Group Identity (TMGI)" },
366 { 0, "Packet Timing Advance" },
367 { 0, "Packet Uplink Assignment" },
368 { 0, "Packet Downlink Assignment" },
369 { 0, "Second Part Packet Assignment" },
370 { 0, "REPORTING QUANTITY" },
371 { 0, "E-UTRAN Measurement Report" },
372 { 0, NULL }
376 /* RR cause value (octet 2) TS 44.018 6.11.0*/
377 static const value_string gsm_a_rr_RR_cause_vals[] = {
378 { 0, "Normal event"},
379 { 1, "Abnormal release, unspecified"},
380 { 2, "Abnormal release, channel unacceptable"},
381 { 3, "Abnormal release, timer expired"},
382 { 4, "Abnormal release, no activity on the radio path"},
383 { 5, "Preemptive release"},
384 { 6, "UTRAN configuration unknown"},
385 { 8, "Handover impossible, timing advance out of range"},
386 { 9, "Channel mode unacceptable"},
387 { 10, "Frequency not implemented"},
388 { 13, "Originator or talker leaving group call area"},
389 { 12, "Lower layer failure"},
390 { 0x41, "Call already cleared"},
391 { 0x5f, "Semantically incorrect message"},
392 { 0x60, "Invalid mandatory information"},
393 { 0x61, "Message type non-existent or not implemented"},
394 { 0x62, "Message type not compatible with protocol state"},
395 { 0x64, "Conditional IE error"},
396 { 0x65, "No cell allocation available"},
397 { 0x6f, "Protocol error unspecified"},
398 { 0, NULL }
401 static const value_string gsm_a_rr_algorithm_identifier_vals[] = {
402 { 0, "Cipher with algorithm A5/1"},
403 { 1, "Cipher with algorithm A5/2"},
404 { 2, "Cipher with algorithm A5/3"},
405 { 3, "Cipher with algorithm A5/4"},
406 { 4, "Cipher with algorithm A5/5"},
407 { 5, "Cipher with algorithm A5/6"},
408 { 6, "Cipher with algorithm A5/7"},
409 { 7, "Reserved"},
410 { 0, NULL }
414 #define DTAP_PD_MASK 0x0f
415 #define DTAP_SKIP_MASK 0xf0
416 #define DTAP_TI_MASK DTAP_SKIP_MASK
417 #define DTAP_TIE_PRES_MASK 0x07 /* after TI shifted to right */
418 #define DTAP_TIE_MASK 0x7f
420 #define DTAP_RR_IEI_MASK 0xff
422 /* Initialize the protocol and registered fields */
423 static int proto_a_rr = -1;
424 static int proto_a_ccch = -1;
425 static int proto_a_sacch = -1;
427 static int hf_gsm_a_dtap_msg_rr_type = -1;
428 int hf_gsm_a_rr_elem_id = -1;
430 static int hf_gsm_a_rr_short_pd_msg_type = -1;
431 static int hf_gsm_a_rr_short_pd = -1;
432 static int hf_gsm_a_rr_short_l2_header = -1;
435 static int hf_gsm_a_rr_bcc = -1;
436 static int hf_gsm_a_rr_ncc = -1;
437 static int hf_gsm_a_rr_bcch_arfcn = -1;
438 static int hf_gsm_a_rr_range_nb = -1;
439 static int hf_gsm_a_rr_range_lower = -1;
440 static int hf_gsm_a_rr_range_higher = -1;
441 static int hf_gsm_a_rr_ba_freq = -1;
442 static int hf_gsm_a_rr_ho_ref_val = -1;
443 static int hf_gsm_a_rr_L2_pseudo_len = -1;
444 static int hf_gsm_a_rr_ba_used = -1;
445 static int hf_gsm_a_rr_dtx_used = -1;
446 static int hf_gsm_a_rr_3g_ba_used = -1;
447 static int hf_gsm_a_rr_meas_valid = -1;
448 static int hf_gsm_a_rr_rxlev_full_serv_cell = -1;
449 static int hf_gsm_a_rr_rxlev_sub_serv_cell = -1;
450 static int hf_gsm_a_rr_rxqual_full_serv_cell = -1;
451 static int hf_gsm_a_rr_rxqual_sub_serv_cell = -1;
452 static int hf_gsm_a_rr_no_ncell_m = -1;
453 static int hf_gsm_a_rr_rxlev_ncell = -1;
454 static int hf_gsm_a_rr_bcch_freq_ncell = -1;
455 static int hf_gsm_a_rr_bsic_ncell = -1;
456 static int hf_gsm_a_rr_mobile_time_difference = -1;
457 static int hf_gsm_a_rr_pow_cmd_atc = -1;
458 static int hf_gsm_a_rr_pow_cmd_epc = -1;
459 static int hf_gsm_a_rr_page_mode = -1;
460 static int hf_gsm_a_rr_dedicated_mode_or_tbf = -1;
461 static int hf_gsm_a_rr_pow_cmd_fpcepc = -1;
462 static int hf_gsm_a_rr_pow_cmd_powlev = -1;
463 static int hf_gsm_a_rr_sync_ind_nci = -1;
464 static int hf_gsm_a_rr_sync_ind_rot = -1;
465 static int hf_gsm_a_rr_sync_ind_si = -1;
466 static int hf_gsm_a_rr_format_id = -1;
467 static int hf_gsm_a_rr_format_id2 = -1;
468 static int hf_gsm_a_rr_channel_mode = -1;
469 static int hf_gsm_a_rr_channel_mode2 = -1;
470 static int hf_gsm_a_rr_sc = -1;
471 static int hf_gsm_a_rr_algorithm_id = -1;
472 static int hf_gsm_a_rr_cr = -1;
473 static int hf_gsm_a_rr_multirate_speech_ver = -1;
474 static int hf_gsm_a_rr_NCSB = -1;
475 static int hf_gsm_a_rr_ICMI = -1;
476 static int hf_gsm_a_rr_start_mode = -1;
477 static int hf_gsm_a_rr_timing_adv = -1;
478 static int hf_gsm_a_rr_time_diff = -1;
479 static int hf_gsm_a_rr_tlli = -1;
480 static int hf_gsm_a_rr_tmsi_ptmsi = -1;
481 static int hf_gsm_a_rr_target_mode = -1;
482 static int hf_gsm_a_rr_wait_indication = -1;
483 static int hf_gsm_a_rr_seq_code = -1;
484 static int hf_gsm_a_rr_group_cipher_key_number = -1;
485 static int hf_gsm_a_rr_MBMS_multicast = -1;
486 static int hf_gsm_a_rr_MBMS_broadcast = -1;
487 static int hf_gsm_a_rr_last_segment = -1;
488 static int hf_gsm_a_rr_carrier_ind = -1;
489 static int hf_gsm_a_rr_ra = -1;
490 static int hf_gsm_a_rr_T1prim = -1;
491 static int hf_gsm_a_rr_T3 = -1;
492 static int hf_gsm_a_rr_T2 = -1;
493 static int hf_gsm_a_rr_tbf_T1prim = -1;
494 static int hf_gsm_a_rr_tbf_T3 = -1;
495 static int hf_gsm_a_rr_tbf_T2 = -1;
496 static int hf_gsm_a_rr_rfn = -1;
497 static int hf_gsm_a_rr_RR_cause = -1;
498 static int hf_gsm_a_rr_cm_cng_msg_req = -1;
499 static int hf_gsm_a_rr_utran_cm_cng_msg_req = -1;
500 static int hf_gsm_a_rr_cdma200_cm_cng_msg_req = -1;
501 static int hf_gsm_a_rr_geran_iu_cm_cng_msg_req = -1;
502 int hf_gsm_a_rr_chnl_needed_ch1 = -1;
503 static int hf_gsm_a_rr_chnl_needed_ch2 = -1;
504 static int hf_gsm_a_rr_chnl_needed_ch3 = -1;
505 static int hf_gsm_a_rr_chnl_needed_ch4 = -1;
506 static int hf_gsm_a_rr_pkt_estab_cause = -1;
507 static int hf_gsm_a_rr_peak_throughput_class = -1;
508 static int hf_gsm_a_rr_radio_priority = -1;
509 static int hf_gsm_a_rr_llc_pdu_type = -1;
510 static int hf_gsm_a_rr_rlc_octet_count = -1;
511 static int hf_gsm_a_rr_rlc_non_pers_mode_cap = -1;
512 static int hf_gsm_a_rr_reduced_latency_cap = -1;
513 static int hf_gsm_a_rr_ul_egprs2 = -1;
514 static int hf_gsm_a_rr_dl_egprs2 = -1;
515 static int hf_gsm_a_rr_emst_ms_cap = -1;
516 static int hf_gsm_a_rr_suspension_cause = -1;
517 static int hf_gsm_a_rr_apdu_id = -1;
518 static int hf_gsm_a_rr_apdu_flags = -1;
519 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8 = -1;
520 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7 = -1;
521 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6 = -1;
522 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5 = -1;
523 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4 = -1;
524 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3 = -1;
525 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2 = -1;
526 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1 = -1;
527 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5 = -1;
528 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4 = -1;
529 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3 = -1;
530 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2 = -1;
531 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1 = -1;
532 static int hf_gsm_a_rr_amr_threshold = -1;
533 static int hf_gsm_a_rr_amr_hysteresis = -1;
534 static int hf_gsm_a_rr_pwrc = -1;
535 static int hf_gsm_a_rr_dtx_bcch = -1;
536 static int hf_gsm_a_rr_dtx_sacch = -1;
537 static int hf_gsm_a_rr_radio_link_timeout = -1;
538 static int hf_gsm_a_rr_cell_reselect_hyst = -1;
539 static int hf_gsm_a_rr_ms_txpwr_max_cch = -1;
540 static int hf_gsm_a_rr_acs = -1;
541 static int hf_gsm_a_rr_neci = -1;
542 static int hf_gsm_a_rr_rxlev_access_min = -1;
543 static int hf_gsm_a_rr_mscr = -1;
544 static int hf_gsm_a_rr_att = -1;
545 static int hf_gsm_a_rr_ccch_conf = -1;
546 static int hf_gsm_a_rr_cbq3 = -1;
547 static int hf_gsm_a_rr_bs_pa_mfrms = -1;
548 static int hf_gsm_a_rr_bs_ag_blks_res = -1;
549 int hf_gsm_a_rr_t3212 = -1;
550 static int hf_gsm_a_rr_gsm_band = -1;
551 static int hf_gsm_a_rr_arfcn_first = -1;
552 static int hf_gsm_a_rr_band_offset = -1;
553 static int hf_gsm_a_rr_arfcn_range = -1;
554 static int hf_gsm_a_rr_lowest_arfcn = -1;
555 static int hf_gsm_a_rr_inc_skip_arfcn = -1;
556 static int hf_gsm_a_rr_gprs_resumption_ack = -1;
557 static int hf_gsm_a_rr_ext_ind = -1;
558 static int hf_gsm_a_rr_ba_ind = -1;
559 static int hf_gsm_a_rr_multiband_reporting = -1;
560 static int hf_gsm_a_rr_ncc_permitted = -1;
561 static int hf_gsm_a_rr_max_retrans = -1;
562 static int hf_gsm_a_rr_tx_integer = -1;
563 static int hf_gsm_a_rr_cell_barr_access = -1;
564 static int hf_gsm_a_rr_re = -1;
565 static int hf_gsm_a_rr_acc = -1;
566 static int hf_gsm_a_rr_nch_position = -1;
567 static int hf_gsm_a_rr_si2ter_mp_change_mark = -1;
568 static int hf_gsm_a_rr_si2ter_3g_change_mark = -1;
569 static int hf_gsm_a_rr_si2ter_index = -1;
570 static int hf_gsm_a_rr_si2ter_count = -1;
571 static int hf_gsm_a_rr_fdd_uarfcn = -1;
572 static int hf_gsm_a_rr_bandwidth_fdd = -1;
573 static int hf_gsm_a_rr_tdd_uarfcn = -1;
574 static int hf_gsm_a_rr_bandwidth_tdd = -1;
575 static int hf_gsm_a_rr_arfcn = -1;
576 static int hf_gsm_a_rr_bsic = -1;
577 static int hf_gsm_a_rr_qsearch_i = -1;
578 static int hf_gsm_a_rr_fdd_qoffset = -1;
579 static int hf_gsm_a_rr_fdd_qmin = -1;
580 static int hf_gsm_a_rr_tdd_qoffset = -1;
581 static int hf_gsm_a_rr_fdd_qmin_offset = -1;
582 static int hf_gsm_a_rr_fdd_rscpmin = -1;
583 static int hf_gsm_a_rr_3g_ba_ind = -1;
584 static int hf_gsm_a_rr_mp_change_mark = -1;
585 static int hf_gsm_a_rr_si2quater_index = -1;
586 static int hf_gsm_a_rr_si2quater_count = -1;
587 static int hf_gsm_a_rr_gsm_report_type = -1;
588 static int hf_gsm_a_rr_serving_band_reporting = -1;
589 static int hf_gsm_a_rr_frequency_scrolling = -1;
590 static int hf_gsm_a_rr_rep_priority = -1;
591 static int hf_gsm_a_rr_report_type = -1;
592 static int hf_gsm_a_rr_reporting_rate = -1;
593 static int hf_gsm_a_rr_invalid_bsic_reporting = -1;
594 static int hf_gsm_a_rr_scale_ord = -1;
595 static int hf_gsm_a_rr_900_reporting_offset = -1;
596 static int hf_gsm_a_rr_900_reporting_threshold = -1;
597 static int hf_gsm_a_rr_1800_reporting_offset = -1;
598 static int hf_gsm_a_rr_1800_reporting_threshold = -1;
599 static int hf_gsm_a_rr_400_reporting_offset = -1;
600 static int hf_gsm_a_rr_400_reporting_threshold = -1;
601 static int hf_gsm_a_rr_1900_reporting_offset = -1;
602 static int hf_gsm_a_rr_1900_reporting_threshold = -1;
603 static int hf_gsm_a_rr_850_reporting_offset = -1;
604 static int hf_gsm_a_rr_850_reporting_threshold = -1;
605 static int hf_gsm_a_rr_network_control_order = -1;
606 static int hf_gsm_a_rr_nc_non_drx_period = -1;
607 static int hf_gsm_a_rr_nc_reporting_period_i = -1;
608 static int hf_gsm_a_rr_nc_reporting_period_t = -1;
609 static int hf_gsm_a_rr_index_start_3g = -1;
610 static int hf_gsm_a_rr_absolute_index_start_emr = -1;
611 static int hf_gsm_a_rr_qsearch_c_initial = -1;
612 static int hf_gsm_a_rr_fdd_rep_quant = -1;
613 static int hf_gsm_a_rr_fdd_multirat_reporting = -1;
614 static int hf_gsm_a_rr_tdd_multirat_reporting = -1;
615 static int hf_gsm_a_rr_qsearch_p = -1;
616 static int hf_gsm_a_rr_3g_search_prio = -1;
617 static int hf_gsm_a_rr_fdd_reporting_offset = -1;
618 static int hf_gsm_a_rr_fdd_reporting_threshold_rscp = -1;
619 static int hf_gsm_a_rr_fdd_reporting_threshold_ecn0 = -1;
620 static int hf_gsm_a_rr_tdd_reporting_offset = -1;
621 static int hf_gsm_a_rr_tdd_reporting_threshold_rscp = -1;
622 static int hf_gsm_a_rr_tdd_reporting_threshold_ecn0 = -1;
623 static int hf_gsm_a_rr_fdd_reporting_threshold_2 = -1;
624 static int hf_gsm_a_rr_3g_ccn_active = -1;
625 static int hf_gsm_a_rr_700_reporting_offset = -1;
626 static int hf_gsm_a_rr_700_reporting_threshold = -1;
627 static int hf_gsm_a_rr_810_reporting_offset = -1;
628 static int hf_gsm_a_rr_810_reporting_threshold = -1;
629 static int hf_gsm_a_rr_cbq = -1;
630 static int hf_gsm_a_rr_cell_reselect_offset = -1;
631 static int hf_gsm_a_rr_temporary_offset = -1;
632 static int hf_gsm_a_rr_penalty_time = -1;
633 static int hf_gsm_a_rr_gprs_ra_colour = -1;
634 static int hf_gsm_a_rr_si13_position = -1;
635 static int hf_gsm_a_rr_power_offset = -1;
636 static int hf_gsm_a_rr_si2quater_position = -1;
637 static int hf_gsm_a_rr_si13alt_position = -1;
638 static int hf_gsm_a_rr_prio_thr = -1;
639 static int hf_gsm_a_rr_lsa_offset = -1;
640 static int hf_gsm_a_rr_cell_id = -1;
641 static int hf_gsm_a_rr_paging_channel_restructuring = -1;
642 static int hf_gsm_a_rr_nln_sacch = -1;
643 static int hf_gsm_a_rr_nln_status_sacch = -1;
644 static int hf_gsm_a_rr_nln_pch = -1;
645 static int hf_gsm_a_rr_nln_status_pch = -1;
646 static int hf_gsm_a_rr_vbs_vgcs_inband_notifications = -1;
647 static int hf_gsm_a_rr_vbs_vgcs_inband_pagings = -1;
648 static int hf_gsm_a_rr_rac = -1;
649 static int hf_gsm_a_rr_max_lapdm = -1;
650 static int hf_gsm_a_rr_gprs_ms_txpwr_max_ccch = -1;
651 static int hf_gsm_a_rr_dedicated_mode_mbms_notification_support = -1;
652 static int hf_gsm_a_rr_mnci_support = -1;
653 static int hf_gsm_a_rr_amr_config = -1;
654 static int hf_gsm_a_rr_bcch_change_mark = -1;
655 static int hf_gsm_a_rr_si_change_field = -1;
656 static int hf_gsm_a_rr_si13_change_mark = -1;
657 static int hf_gsm_a_rr_hsn = -1;
658 static int hf_gsm_a_rr_rfl_number = -1;
659 static int hf_gsm_a_rr_arfcn_index = -1;
660 static int hf_gsm_a_rr_ma_length = -1;
661 static int hf_gsm_a_rr_psi1_repeat_period = -1;
662 static int hf_gsm_a_rr_pbcch_pb = -1;
663 static int hf_gsm_a_rr_pbcch_tsc = -1;
664 static int hf_gsm_a_rr_pbcch_tn = -1;
665 static int hf_gsm_a_rr_spgc_ccch_sup = -1;
666 static int hf_gsm_a_rr_priority_access_thr = -1;
667 static int hf_gsm_a_rr_nmo = -1;
668 static int hf_gsm_a_rr_t3168 = -1;
669 static int hf_gsm_a_rr_t3192 = -1;
670 static int hf_gsm_a_rr_drx_timer_max = -1;
671 static int hf_gsm_a_rr_access_burst_type = -1;
672 static int hf_gsm_a_rr_control_ack_type = -1;
673 static int hf_gsm_a_rr_bs_cv_max = -1;
674 static int hf_gsm_a_rr_pan_dec = -1;
675 static int hf_gsm_a_rr_pan_inc = -1;
676 static int hf_gsm_a_rr_pan_max = -1;
677 static int hf_gsm_a_rr_egprs_packet_channel_request = -1;
678 static int hf_gsm_a_rr_bep_period = -1;
679 static int hf_gsm_a_rr_pfc_feature_mode = -1;
680 static int hf_gsm_a_rr_dtm_support = -1;
681 static int hf_gsm_a_rr_bss_paging_coordination = -1;
682 static int hf_gsm_a_rr_ccn_active = -1;
683 static int hf_gsm_a_rr_nw_ext_utbf = -1;
684 static int hf_gsm_a_rr_multiple_tbf_capability = -1;
685 static int hf_gsm_a_rr_ext_utbf_no_data = -1;
686 static int hf_gsm_a_rr_dtm_enhancements_capability = -1;
687 static int hf_gsm_a_rr_reduced_latency_access = -1;
688 static int hf_gsm_a_rr_alpha = -1;
689 static int hf_gsm_a_rr_t_avg_w = -1;
690 static int hf_gsm_a_rr_t_avg_t = -1;
691 static int hf_gsm_a_rr_pc_meas_chan = -1;
692 static int hf_gsm_a_rr_n_avg_i = -1;
693 static int hf_gsm_a_rr_sgsnr = -1;
694 static int hf_gsm_a_rr_si_status_ind = -1;
695 static int hf_gsm_a_rr_lb_ms_txpwr_max_cch = -1;
696 static int hf_gsm_a_rr_si2n_support = -1;
697 static int hf_gsm_a_rr_mi_index = -1;
698 static int hf_gsm_a_rr_mi_count = -1;
699 static int hf_gsm_a_rr_3g_wait = -1;
700 static int hf_gsm_a_rr_qsearch_c = -1;
701 static int hf_gsm_a_rr_bsic_seen = -1;
702 static int hf_gsm_a_rr_scale = -1;
703 static int hf_gsm_a_rr_mean_bep_gmsk = -1;
704 static int hf_gsm_a_rr_mean_cv_bep = -1;
705 static int hf_gsm_a_rr_nbr_rcvd_blocks = -1;
706 static int hf_gsm_a_rr_reporting_quantity = -1;
707 static int hf_gsm_a_rr_extended_ra = -1;
708 static int hf_gsm_a_rr_access_tech_type = -1;
709 static int hf_gsm_a_rr_tfi_assignment = -1;
710 static int hf_gsm_a_rr_polling = -1;
711 static int hf_gsm_a_rr_usf = -1;
712 static int hf_gsm_a_rr_usf_granularity = -1;
713 static int hf_gsm_a_rr_p0 = -1;
714 static int hf_gsm_a_rr_pr_mode = -1;
715 static int hf_gsm_a_rr_egprs_mcs = -1;
716 static int hf_gsm_a_rr_tlli_block_channel_coding = -1;
717 static int hf_gsm_a_rr_bep_period2 = -1;
718 static int hf_gsm_a_rr_resegment = -1;
719 static int hf_gsm_a_rr_egprs_window_size = -1;
720 static int hf_gsm_a_rr_gamma = -1;
721 static int hf_gsm_a_rr_timing_adv_index = -1;
722 static int hf_gsm_a_rr_timing_adv_timeslot_num = -1;
723 static int hf_gsm_a_rr_tbf_starting_time = -1;
724 static int hf_gsm_a_rr_num_of_radio_block_allocated = -1;
725 static int hf_gsm_a_rr_pfi = -1;
726 static int hf_gsm_a_rr_mbms_service_id = -1;
727 static int hf_gsm_a_rr_ms_id = -1;
728 static int hf_gsm_a_rr_gprs_cs = -1;
729 static int hf_gsm_a_rr_rlc_mode = -1;
730 static int hf_gsm_a_rr_ta_valid = -1;
731 static int hf_gsm_a_rr_link_quality_meas_mode = -1;
732 static int hf_gsm_a_rr_emr_bitmap_length = -1;
733 static int hf_gsm_a_rr_eutran_mr_n_eutran = -1;
734 static int hf_gsm_a_rr_eutran_mr_freq_idx = -1;
735 static int hf_gsm_a_rr_eutran_mr_cell_id = -1;
736 static int hf_gsm_a_rr_eutran_mr_rpt_quantity = -1;
737 static int hf_gsm_a_rr_ma_channel_set = -1;
738 static int hf_n_range_orig_arfcn = -1;
742 /* Additions in Rel-8 */
743 static int hf_gsm_a_rr_3g_priority_param_desc_utran_start = -1;
744 static int hf_gsm_a_rr_3g_priority_param_desc_utran_stop = -1;
745 static int hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio = -1;
746 static int hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran = -1;
747 static int hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin = -1;
748 static int hf_gsm_a_rr_utran_frequency_index = -1;
749 static int hf_gsm_a_rr_utran_priority = -1;
750 static int hf_gsm_a_rr_thresh_utran_high = -1;
751 static int hf_gsm_a_rr_thresh_utran_low = -1;
752 static int hf_gsm_a_rr_utran_qrxlevmin = -1;
753 static int hf_gsm_a_rr_eutran_ccn_active = -1;
754 static int hf_gsm_a_rr_eutran_start = -1;
755 static int hf_gsm_a_rr_eutran_stop = -1;
756 static int hf_gsm_a_rr_qsearch_c_eutran_initial = -1;
757 static int hf_gsm_a_rr_eutran_multirat_reporting = -1;
758 static int hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrp = -1;
759 static int hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrq = -1;
760 static int hf_gsm_a_rr_eutran_fdd_reporting_threshold_2 = -1;
761 static int hf_gsm_a_rr_eutran_fdd_reporting_offset = -1;
762 static int hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrp = -1;
763 static int hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrq = -1;
764 static int hf_gsm_a_rr_eutran_tdd_reporting_threshold_2 = -1;
765 static int hf_gsm_a_rr_eutran_tdd_reporting_offset = -1;
766 static int hf_gsm_a_rr_eutran_fdd_measurement_report_offset = -1;
767 static int hf_gsm_a_rr_eutran_tdd_measurement_report_offset = -1;
768 static int hf_gsm_a_rr_reporting_granularity = -1;
769 static int hf_gsm_a_rr_eutran_default_measurement_control_eutran = -1;
770 static int hf_gsm_a_rr_eutran_measurement_control_eutran = -1;
771 static int hf_gsm_a_rr_qsearch_p_eutran = -1;
772 static int hf_gsm_a_rr_serving_cell_priority_param_geran_priority = -1;
773 static int hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search = -1;
774 static int hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low = -1;
775 static int hf_gsm_a_rr_serving_cell_priority_param_h_prio = -1;
776 static int hf_gsm_a_rr_serving_cell_priority_param_t_reselection = -1;
777 static int hf_gsm_a_rr_eutran_earfcn = -1;
778 static int hf_gsm_a_rr_eutran_measurement_bandwidth = -1;
779 static int hf_gsm_a_rr_eutran_priority = -1;
780 static int hf_gsm_a_rr_thresh_eutran_high = -1;
781 static int hf_gsm_a_rr_thresh_eutran_low = -1;
782 static int hf_gsm_a_rr_eutran_qrxlevmin = -1;
783 static int hf_gsm_a_rr_eutran_pcid = -1;
784 static int hf_gsm_a_rr_eutran_pcid_bitmap_group = -1;
785 static int hf_gsm_a_rr_eutran_pcid_pattern_length = -1;
786 /* static int hf_gsm_a_rr_eutran_pcid_pattern = -1; */
787 static int hf_gsm_a_rr_eutran_pcid_pattern_sense = -1;
788 static int hf_gsm_a_rr_eutran_frequency_index = -1;
789 static int hf_gsm_a_rr_psc = -1;
790 static int hf_gsm_a_rr_utran_psc_pattern_length = -1;
791 static int hf_gsm_a_rr_utran_psc_pattern_sense = -1;
792 static int hf_gsm_a_rr_utran_csg_fdd_uarfcn = -1;
793 static int hf_gsm_a_rr_utran_csg_tdd_uarfcn = -1;
794 static int hf_gsm_a_rr_csg_earfcn = -1;
795 static int hf_gsm_a_rr_3g_control_param_desc_meas_ctrl_utran = -1;
797 /* Initialize the subtree pointers */
798 static gint ett_ccch_msg = -1;
799 static gint ett_ccch_oct_1 = -1;
800 static gint ett_sacch_msg = -1;
802 static expert_field ei_gsm_a_rr_ie_overrun = EI_INIT;
803 static expert_field ei_gsm_a_rr_ie_underrun = EI_INIT;
805 static char a_bigbuf[1024];
807 static dissector_handle_t data_handle;
808 static dissector_handle_t rrlp_dissector;
811 #define NUM_GSM_RR_ELEM (sizeof(gsm_rr_elem_strings)/sizeof(value_string))
812 gint ett_gsm_rr_elem[NUM_GSM_RR_ELEM];
814 typedef enum
816 /* RR Rest Octets information elements */
817 DE_RR_REST_OCTETS_UTRAN_FDD_DESC,
818 DE_RR_REST_OCTETS_UTRAN_TDD_DESC,
819 DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC,
820 DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC,
821 DE_RR_REST_OCTETS_MEAS_PARAM_DESC,
822 DE_RR_REST_OCTETS_GPRS_RTD_DESC,
823 DE_RR_REST_OCTETS_GPRS_BSIC_DESC,
824 DE_RR_REST_OCTETS_GPRS_REPORT_PRIO_DESC,
825 DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC,
826 DE_RR_REST_OCTETS_NC_MEAS_PARAM,
827 DE_RR_REST_OCTETS_SI2Q_EXT_INFO,
828 DE_RR_REST_OCTETS_CCN_SUPPORT_DESC,
829 DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC,
830 DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD,
831 DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD,
832 DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC,
833 DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2,
834 DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC,
835 DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC,
836 DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC,
837 DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM,
838 DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC,
839 DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS,
840 DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS,
841 DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING,
842 DE_RR_REST_OCTETS_3G_CSG_DESC,
843 DE_RR_REST_OCTETS_EUTRAN_CSG_DESC,
844 DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM,
845 DE_RR_REST_OCTETS_GPRS_INDICATOR,
846 DE_RR_REST_OCTETS_SI4_REST_OCTETS_O,
847 DE_RR_REST_OCTETS_SI4_REST_OCTETS_S,
848 DE_RR_REST_OCTETS_LSA_PARAMETERS,
849 DE_RR_REST_OCTETS_LSA_ID_INFO,
850 DE_RR_REST_OCTETS_PCH_AND_NCH_INFO,
851 DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS,
852 DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC,
853 DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS,
854 DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO,
855 DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS,
856 DE_RR_REST_OCTETS_PBCCH_DESC,
857 DE_RR_REST_OCTETS_GSM_DESC,
858 DE_RR_REST_OCTETS_RTD_DESC,
859 DE_RR_REST_OCTETS_BSIC_DESC,
860 DE_RR_REST_OCTETS_REPORT_PRIO_DESC,
861 DE_RR_REST_OCTETS_CDMA2000_DESC,
862 DE_RR_REST_OCTETS_SERVING_CELL_DATA,
863 DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO,
864 DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING,
865 DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC,
866 DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC,
867 DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT,
868 DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT,
869 DE_RR_REST_OCTETS_TMGI,
870 DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE,
871 DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT,
872 DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT,
873 DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT,
874 DE_RR_REST_OCTETS_REPORTING_QUANTITY,
875 DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT,
876 DE_RR_REST_OCTETS_NONE
878 rr_rest_octets_elem_idx_t;
880 #define NUM_GSM_RR_REST_OCTETS_ELEM (sizeof(gsm_rr_rest_octets_elem_strings)/sizeof(value_string))
881 gint ett_gsm_rr_rest_octets_elem[NUM_GSM_RR_REST_OCTETS_ELEM];
884 * Generates a string representing the bits in a bitfield at "bit_offset" from an 8 bit boundary
885 * with the length in bits of no_of_bits based on value.
886 * Ex: ..xx x...
889 /* this function is used for dissecting the 0/1 presence flags in CSN.1 coded IEs */
890 static gboolean gsm_rr_csn_flag(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, const char *description, const char *true_string, const char * false_string)
892 guint8 bit_mask = 0x80 >> (bit_offset % 8);
893 guint8 value = tvb_get_guint8(tvb, bit_offset >> 3);
894 guint8 offset_in_octet = bit_offset % 8;
895 char bits_str[] = {".... ...."};
897 if (value & bit_mask)
899 bits_str[offset_in_octet + (offset_in_octet / 4)] = '1';
900 proto_tree_add_text(tree, tvb, bit_offset>>3, 1, "%s: %s: %s", bits_str, description, true_string);
901 return TRUE;
903 bits_str[offset_in_octet + (offset_in_octet / 4)] = '0';
904 proto_tree_add_text(tree, tvb, bit_offset>>3, 1, "%s: %s: %s", bits_str, description, false_string);
905 return FALSE;
908 /* this function is used for dissecting the H/L presence flags in CSN.1 coded IEs"
909 If truncation ( 44.018 section 8.9) is allowed, truncation_length is set to the actual bit length of the CSN.1 string,
910 otherwise it is set to 0 */
911 static gboolean gsm_rr_csn_HL_flag(tvbuff_t *tvb, proto_tree *tree, guint truncation_length, guint bit_offset, const char *description, const char *true_string, const char * false_string)
913 guint8 bit_mask = 0x80 >> (bit_offset % 8);
914 guint8 value = PADDING_BYTE;
915 char bits_str[] = {".... ...."};
916 guint8 offset_in_octet = bit_offset % 8;
918 if (truncation_length)
920 if (bit_offset < truncation_length)
922 /* there should be some real data to fetch */
923 value = tvb_get_guint8(tvb, bit_offset >> 3)^PADDING_BYTE;
925 else
927 /* implicit L bit */
928 proto_tree_add_text(tree, tvb, truncation_length>>3, 1, "(implicit L bit): %s: %s", description, false_string);
929 return FALSE;
932 else
934 /* if truncation_length == 0, then don't check for truncation*/
935 value = tvb_get_guint8(tvb, bit_offset >> 3)^PADDING_BYTE;
938 if (value & bit_mask)
940 bits_str[offset_in_octet + (offset_in_octet / 4)] = 'H';
941 proto_tree_add_text(tree, tvb, bit_offset>>3, 1, "%s: %s: %s", bits_str, description, true_string);
942 return TRUE;
944 bits_str[offset_in_octet + (offset_in_octet / 4)] = 'L';
945 proto_tree_add_text(tree, tvb, bit_offset>>3, 1, "%s: %s: %s", bits_str, description, false_string);
946 return FALSE;
950 10.5.2 Radio Resource management information elements
951 * [3] 10.5.2.1a BA Range
953 static guint16
954 de_rr_ba_range(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
956 guint32 curr_offset;
957 gint bit_offset;
958 guint8 value;
960 curr_offset = offset;
961 proto_tree_add_item(tree, hf_gsm_a_rr_range_nb, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
962 value = tvb_get_guint8(tvb, curr_offset);
963 curr_offset += 1;
964 bit_offset = curr_offset << 3;
965 while (value)
967 proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
968 bit_offset += 10;
969 proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
970 bit_offset += 10;
971 value -= 1;
974 curr_offset += len - 1;
975 return (curr_offset - offset);
979 * [3] 10.5.2.1b Cell Channel Description
982 #define ARFCN_MAX 1024 /* total number of ARFCNs defined */
984 static void display_channel_list(guint8 *list, tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
986 int arfcn;
987 proto_item *ti = NULL;
989 ti = proto_tree_add_text(tree, tvb, offset, len, "List of ARFCNs =");
990 for (arfcn=0; arfcn<ARFCN_MAX; arfcn++) {
991 if (list[arfcn])
992 proto_item_append_text(ti, " %d", arfcn);
995 return;
999 * Checks that the remaining "rest octets" all contain the default padding value.
1000 * If not, it can be assumed that there is a protocol extension
1001 * that we don't handle,
1002 * or a malformed PDU.
1004 * len: total length of buffer
1005 * bit_offset: bit offset in TVB of first bit to be examined
1007 static void gsm_rr_csn_padding_bits(proto_tree* tree, tvbuff_t* tvb, guint16 bit_offset, guint8 octet_len)
1009 guint i;
1010 gboolean non_padding_found = FALSE;
1011 guint8 octet_offset = bit_offset >> 3;
1013 if ((octet_len << 3) > bit_offset)
1015 /* there is spare room, check the first padding octet */
1016 guint8 bit_mask = 0xFF >> (bit_offset & 0x07);
1017 if ((tvb_get_guint8(tvb, octet_offset) & bit_mask) != (PADDING_BYTE & bit_mask))
1019 non_padding_found = TRUE;
1021 else
1023 for (i=octet_offset+1; (i<octet_len) && !non_padding_found; i++)
1025 if (tvb_get_guint8(tvb, i) != PADDING_BYTE)
1026 non_padding_found = TRUE;
1030 if (non_padding_found)
1032 /* there is something here we don't understand */
1033 proto_tree_add_text(tree, tvb, octet_offset, -1,"Padding Bits: Unknown extension detected or malformed PDU (Not decoded)");
1035 else
1037 proto_tree_add_text(tree, tvb, octet_offset, -1,"Padding Bits: default padding");
1040 else
1042 proto_tree_add_text(tree, tvb, 0, 0,"No space for padding bits");
1046 static gint greatest_power_of_2_lesser_or_equal_to(gint idx)
1048 gint j = 1;
1049 do {
1050 j <<= 1;
1051 } while (j <= idx);
1052 j >>= 1;
1053 return j;
1056 gint f_k(gint k, gint *w, gint range)
1058 gint idx, n, j;
1060 idx = k;
1061 range -= 1;
1062 range = range/greatest_power_of_2_lesser_or_equal_to(idx);
1063 n = w[idx]-1;
1065 while (idx>1) {
1066 j = greatest_power_of_2_lesser_or_equal_to(idx);
1067 range = 2*range+1;
1068 if ((2*idx) < 3*j){ /* left child */
1069 idx -= j/2;
1070 n = (n+w[idx]-1+((range-1)/2)+1)%range;
1072 else { /* right child */
1073 idx -= j;
1074 n = (n+w[idx]-1+1)%range;
1078 return (n+1)%1024;
1081 static void dissect_channel_list_n_range(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gint range)
1083 gint curr_offset = offset, bit_offset, f0, arfcn_orig, w[64], wsize, i;
1084 gint octet, nwi = 1, jwi=0, imax, iused, arfcn;
1085 guint8 list[1024];
1086 proto_item *item;
1087 proto_tree *subtree;
1089 memset((void*)list,0,sizeof(list));
1091 item = proto_tree_add_text(tree,tvb, curr_offset, len, "Range %d format", range);
1092 subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_NEIGH_CELL_DESC]);
1094 octet = tvb_get_guint8(tvb, curr_offset);
1095 if (range == 1024) {
1096 f0 = (octet>>2)&1;
1097 if (f0)
1098 list[0] = 1;
1099 arfcn_orig = 0;
1100 wsize = 10;
1101 imax = 16;
1102 bit_offset = curr_offset*8 + 6;
1104 else {
1105 bit_offset = curr_offset*8 + 7;
1106 arfcn_orig = (gint) tvb_get_bits(tvb, bit_offset, 10, FALSE);
1107 proto_tree_add_bits_item(subtree, hf_n_range_orig_arfcn, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
1108 bit_offset+=10;
1110 list[arfcn_orig] = 1;
1112 switch (range) {
1113 case 512:
1114 wsize=9;
1115 imax = 17;
1116 break;
1117 case 256:
1118 wsize=8;
1119 imax = 21;
1120 break;
1121 case 128:
1122 wsize=7;
1123 imax = 28;
1124 break;
1125 default:
1126 DISSECTOR_ASSERT_NOT_REACHED();
1129 iused = imax; /* in case the list is actually full */
1131 /* extract the variable size w[] elements */
1132 for (i=1; i<=imax; i++) {
1133 w[i] = (gint) tvb_get_bits(tvb, bit_offset, wsize, FALSE);
1134 proto_tree_add_text(subtree, tvb, bit_offset>>3, ((bit_offset+wsize-1)>>3) - (bit_offset>>3) + 1 , "%s %s(%d): %d",
1135 decode_bits_in_field(bit_offset, wsize, w[i]),
1136 "W",
1138 w[i]);
1139 bit_offset += wsize;
1140 curr_offset = bit_offset>>3;
1142 if ((iused == imax) && (w[i] == 0) ) {
1143 iused = i - 1;
1145 if ((curr_offset-offset)>len) {
1146 iused = i - 1;
1147 break;
1149 if (++jwi == nwi) { /* check if the number of wi at this wsize has been extracted */
1150 jwi = 0; /* reset the count of wi at this size */
1151 nwi <<= 1; /* get twice as many of the next size */
1152 wsize--; /* make the next size 1 bit smaller */
1156 for (i=1; i<=iused; i++) {
1157 arfcn = (f_k(i, w, range) + arfcn_orig)%1024;
1158 list[arfcn] = 1;
1161 display_channel_list(list, tvb, tree, offset, curr_offset-offset);
1163 return;
1166 static guint16
1167 dissect_arfcn_list_core(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_, guint8 format)
1169 guint32 curr_offset, byte;
1170 guint8 oct,bit;
1171 guint16 arfcn;
1172 proto_item *item;
1174 curr_offset = offset;
1176 if ((format & 0xc0) == 0x00)
1178 /* bit map 0 */
1179 item = proto_tree_add_text(tree,tvb, curr_offset, len, "List of ARFCNs =");
1180 bit = 4;
1181 arfcn = 125;
1182 for (byte = 0; byte <= len-1; byte++)
1184 oct = tvb_get_guint8(tvb, curr_offset);
1185 while (bit-- != 0)
1187 arfcn--;
1188 if (((oct >> bit) & 1) == 1)
1190 proto_item_append_text(item," %d",arfcn);
1193 bit = 8;
1194 curr_offset++;
1197 else if ((format & 0xc8) == 0x80)
1199 /* 1024 range */
1200 dissect_channel_list_n_range(tvb, tree, pinfo, curr_offset, len, 1024);
1201 curr_offset = curr_offset + len;
1203 else if ((format & 0xce) == 0x88)
1205 /* 512 range */
1206 dissect_channel_list_n_range(tvb, tree, pinfo, curr_offset, len, 512);
1207 curr_offset = curr_offset + len;
1209 else if ((format & 0xce) == 0x8a)
1211 /* 256 range */
1212 dissect_channel_list_n_range(tvb, tree, pinfo, curr_offset, len, 256);
1213 curr_offset = curr_offset + len;
1215 else if ((format & 0xce) == 0x8c)
1217 /* 128 range */
1218 dissect_channel_list_n_range(tvb, tree, pinfo, curr_offset, len, 128);
1219 curr_offset = curr_offset + len;
1221 else if ((format & 0xce) == 0x8e)
1223 /* variable bit map */
1224 arfcn = ((format & 0x01) << 9) | (tvb_get_guint8(tvb, curr_offset+1) << 1) | ((tvb_get_guint8(tvb, curr_offset + 2) & 0x80) >> 7);
1225 item = proto_tree_add_text(tree,tvb,curr_offset,len,"List of ARFCNs = %d",arfcn);
1226 curr_offset = curr_offset + 2;
1227 bit = 7;
1228 for (byte = 0; byte <= len-3; byte++)
1230 oct = tvb_get_guint8(tvb, curr_offset);
1231 while (bit-- != 0)
1233 arfcn++;
1234 if (((oct >> bit) & 1) == 1)
1236 proto_item_append_text(item," %d",arfcn);
1239 bit = 8;
1240 curr_offset++;
1244 return(curr_offset - offset);
1248 * Format ID is in bits:
1249 * 128 127 124 123 122 (hf_gsm_a_rr_format_id)
1251 static guint16
1252 dissect_arfcn_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1254 guint32 curr_offset;
1255 guint8 oct;
1257 curr_offset = offset;
1259 oct = tvb_get_guint8(tvb, curr_offset);
1261 /* FORMAT-ID, Format Identifier (part of octet 3)*/
1262 proto_tree_add_item(tree, hf_gsm_a_rr_format_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1264 curr_offset += dissect_arfcn_list_core(tvb, tree, pinfo, offset, len, add_string, string_len, oct);
1266 return(curr_offset - offset);
1270 * Format ID is in bits:
1271 * 128 124 123 122 (hf_gsm_a_rr_format_id2)
1273 static guint16
1274 dissect_arfcn_list2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1276 guint32 curr_offset;
1277 guint8 oct;
1279 curr_offset = offset;
1281 /* Turn bit 127 off, in order to reuse the ARFCN dissection code */
1282 oct = tvb_get_guint8(tvb, curr_offset) & 0xbf;
1284 /* FORMAT-ID, Format Identifier (part of octet 3)*/
1285 proto_tree_add_item(tree, hf_gsm_a_rr_format_id2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1287 curr_offset += dissect_arfcn_list_core(tvb, tree, pinfo, offset, len, add_string, string_len, oct);
1289 return(curr_offset - offset);
1292 static guint16
1293 de_rr_cell_ch_dsc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1295 return dissect_arfcn_list(tvb, tree, pinfo, offset, 16, add_string, string_len);
1298 * [3] 10.5.2.1c BA List Pref
1300 static guint16
1301 de_rr_ba_list_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1303 guint bit_offset;
1305 bit_offset = offset << 3;
1306 while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeating Range Limits", "Present", "Not Present"))
1308 proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
1309 bit_offset += 10;
1310 proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
1311 bit_offset += 10;
1313 while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeating BA Frequency", "Present", "Not Present"))
1315 proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_freq, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
1316 bit_offset += 10;
1319 if (((bit_offset + 7) >> 3) > (offset + len))
1321 expert_add_info(pinfo, proto_tree_get_parent(tree), &ei_gsm_a_rr_ie_overrun);
1323 else if ((bit_offset >> 3) < (offset + len))
1325 expert_add_info(pinfo, proto_tree_get_parent(tree), &ei_gsm_a_rr_ie_underrun);
1327 return len;
1331 * [3] 10.5.2.1d UTRAN Frequency List
1333 static guint16
1334 de_rr_utran_freq_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1336 guint bit_offset;
1338 /* < UTRAN Freq List >::=
1339 * < LENGTH OF UTRAN FREQ LIST : bit (8) > -- length following in octets
1340 * { 1 < FDD_ARFCN > : bit (14) } ** 0 -- FDD frequencies
1341 * { 1 < TDD_ARFCN > : bit (14) } ** 0 -- TDD frequencies
1342 * <spare bit>**;
1343 * Spare bits in the end of the field are used to fill the last octet.
1345 bit_offset = offset << 3;
1346 while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeating FDD Frequency", "Present", "Not Present"))
1348 proto_tree_add_bits_item(tree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN);
1349 bit_offset += 14;
1351 while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeating TDD Frequency", "Present", "Not Present"))
1353 proto_tree_add_bits_item(tree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN);
1354 bit_offset += 14;
1357 if (((bit_offset + 7) >> 3) > (offset + len))
1359 expert_add_info(pinfo, proto_tree_get_parent(tree), &ei_gsm_a_rr_ie_overrun);
1361 else if ((bit_offset >> 3) < (offset + len))
1363 expert_add_info(pinfo, proto_tree_get_parent(tree), &ei_gsm_a_rr_ie_underrun);
1365 return (len);
1369 * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH
1371 static const guint8
1372 convert_n_to_p[32] = { 0, 10, 19, 28, 36, 44, 52, 60, 67, 74, 81, 88, 95, 102, 109, 116,
1373 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1375 static const guint8
1376 convert_n_to_q[32] = { 0, 9, 17, 25, 32, 39, 46, 53, 59, 65, 71, 77, 83, 89, 95, 101,
1377 106, 111, 116, 121, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1379 static guint16
1380 de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1382 proto_tree *subtree, *subtree2;
1383 proto_item *item, *item2;
1384 guint32 curr_offset;
1385 gint bit_offset, bit_offset_sav, idx, xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
1386 guint8 value;
1388 curr_offset = offset;
1389 bit_offset = curr_offset << 3;
1390 value = tvb_get_bits8(tvb,bit_offset,3);
1391 bit_offset += 3;
1392 switch (value)
1394 case 0: /* GSM Description */
1395 bit_offset_sav = bit_offset;
1396 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s",
1397 gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GSM_DESC].strptr);
1398 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GSM_DESC]);
1399 while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeating GSM Description struct", "Present", "Not Present"))
1401 gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Band Indicator", "1900", "1800");
1402 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_arfcn, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
1403 bit_offset += 10;
1404 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
1405 bit_offset += 6;
1407 proto_item_set_len(item,((bit_offset>>3) - (bit_offset_sav>>3) + 1));
1408 break;
1409 case 1: /* UTRAN FDD Description */
1410 bit_offset_sav = bit_offset;
1411 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s",
1412 gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
1413 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
1414 while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeating UTRAN FDD Description struct", "Present", "Not Present"))
1416 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Bandwidth FDD", "Present", "Not Present"))
1418 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
1419 bit_offset += 3;
1421 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN);
1422 bit_offset += 14;
1423 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "FDD Cell Information", "Present", "Not Present"))
1425 xdd_indic0 = gsm_rr_csn_flag(tvb, subtree, bit_offset++, "FDD Indic0", "1", "0");
1426 idx = tvb_get_bits8(tvb,bit_offset,5);
1427 proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of FDD Cells : %d", idx);
1428 bit_offset += 5;
1429 idx = convert_n_to_p[idx];
1430 item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s",
1431 gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
1432 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]);
1433 proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
1434 if (xdd_indic0)
1436 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Scrambling Code: %d", 0);
1437 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity: %d", 0);
1439 if (idx)
1441 wsize = 10;
1442 nwi = 1;
1443 jwi = 0;
1444 i = 1;
1446 while (idx > 0)
1448 w[i] = tvb_get_bits(tvb, bit_offset, wsize, ENC_BIG_ENDIAN);
1449 bit_offset += wsize;
1450 idx -= wsize;
1451 if (w[i] == 0)
1453 idx = 0;
1454 break;
1456 if (++jwi == nwi)
1458 jwi = 0;
1459 nwi <<= 1;
1460 wsize--;
1462 i++;
1464 if (idx < 0)
1466 bit_offset += idx;
1468 iused = i-1;
1470 for (i=1; i <= iused; i++)
1472 xdd_cell_info = f_k(i, w, 1024);
1473 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1474 "Scrambling Code: %d", xdd_cell_info & 0x01FF);
1475 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1476 "Diversity: %d", (xdd_cell_info >> 9) & 0x01);
1481 proto_item_set_len(item,((bit_offset>>3) - (bit_offset_sav>>3) + 1));
1482 break;
1483 case 2: /* UTRAN TDD Description */
1484 bit_offset_sav = bit_offset;
1485 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
1486 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
1487 while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeating UTRAN TDD Description struct", "Present", "Not Present"))
1489 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Bandwidth TDD", "Present", "Not Present"))
1491 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
1492 bit_offset += 3;
1494 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN);
1495 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "TDD Cell Information", "Present", "Not Present"))
1497 xdd_indic0 = gsm_rr_csn_flag(tvb, subtree, bit_offset++, "TDD Indic0", "1", "0");
1498 idx = tvb_get_bits8(tvb,bit_offset,5);
1499 proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
1500 bit_offset += 5;
1501 idx = convert_n_to_q[idx];
1502 item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s",
1503 gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
1504 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
1505 proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
1506 if (xdd_indic0)
1508 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Cell Parameter: %d", 0);
1509 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Sync Case TSTD: %d", 0);
1510 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity TDD: %d", 0);
1512 if (idx)
1514 wsize = 9;
1515 nwi = 1;
1516 jwi = 0;
1517 i = 1;
1519 while (idx > 0)
1521 w[i] = tvb_get_bits(tvb, bit_offset, wsize, ENC_BIG_ENDIAN);
1522 bit_offset += wsize;
1523 idx -= wsize;
1524 if (w[i] == 0)
1526 idx = 0;
1527 break;
1529 if (++jwi == nwi)
1531 jwi = 0;
1532 nwi <<= 1;
1533 wsize--;
1535 i++;
1537 if (idx < 0)
1539 bit_offset += idx;
1541 iused = i-1;
1543 for (i=1; i <= iused; i++)
1545 xdd_cell_info = f_k(i, w, 512);
1546 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1547 "Cell Parameter: %d", xdd_cell_info & 0x07F);
1548 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1549 "Sync Case TSTD: %d", (xdd_cell_info >> 7) & 0x01);
1550 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1551 "Diversity TDD: %d", (xdd_cell_info >> 8) & 0x01);
1556 proto_item_set_len(item,((bit_offset>>3) - (bit_offset_sav>>3) + 1));
1557 break;
1558 default:
1559 break;
1562 curr_offset += len;
1563 return (curr_offset - offset);
1567 * [3] 10.5.2.2 Cell Description
1569 guint16
1570 de_rr_cell_dsc(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1572 guint32 curr_offset;
1573 guint16 bcch_arfcn;
1575 curr_offset = offset;
1577 proto_tree_add_item(subtree, hf_gsm_a_rr_ncc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1578 proto_tree_add_item(subtree, hf_gsm_a_rr_bcc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1579 bcch_arfcn = (tvb_get_guint8(tvb,curr_offset) & 0xc0) << 2;
1580 bcch_arfcn = bcch_arfcn | tvb_get_guint8(tvb,curr_offset+1);
1581 proto_tree_add_uint(subtree, hf_gsm_a_rr_bcch_arfcn , tvb, curr_offset, 2, bcch_arfcn );
1583 curr_offset = curr_offset + 2;
1585 return(curr_offset - offset);
1589 * [3] 10.5.2.3 Cell Options (BCCH)
1591 static const value_string gsm_a_rr_dtx_bcch_vals[] = {
1592 { 0x00, "The MSs may use uplink discontinuous transmission" },
1593 { 0x01, "The MSs shall use uplink discontinuous transmission" },
1594 { 0x02, "The MSs shall not use uplink discontinuous transmission" },
1595 { 0x03, "Reserved" },
1596 { 0, NULL } };
1598 static const value_string gsm_a_rr_radio_link_timeout_vals[] = {
1599 { 0x00, "4" },
1600 { 0x01, "8" },
1601 { 0x02, "12" },
1602 { 0x03, "16" },
1603 { 0x04, "20" },
1604 { 0x05, "24" },
1605 { 0x06, "28" },
1606 { 0x07, "32" },
1607 { 0x08, "36" },
1608 { 0x09, "40" },
1609 { 0x0A, "44" },
1610 { 0x0B, "48" },
1611 { 0x0C, "52" },
1612 { 0x0D, "56" },
1613 { 0x0E, "60" },
1614 { 0x0F, "64" },
1615 { 0, NULL } };
1617 static guint16
1618 de_rr_cell_opt_bcch(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1620 guint32 curr_offset;
1622 curr_offset = offset;
1624 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pwrc, tvb, (curr_offset<<3)+1, 1, ENC_BIG_ENDIAN);
1625 proto_tree_add_item(subtree, hf_gsm_a_rr_dtx_bcch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1626 proto_tree_add_item(subtree, hf_gsm_a_rr_radio_link_timeout, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1628 curr_offset = curr_offset + 1;
1630 return(curr_offset - offset);
1634 * [3] 10.5.2.3a Cell Options (SACCH)
1636 static const value_string gsm_a_rr_dtx_sacch_vals[] = {
1637 { 0x00, "The MS may use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
1638 { 0x01, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
1639 { 0x02, "The MS shall not use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
1640 { 0x03, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS may use uplink discontinuous transmission on TCH-H" },
1641 { 0x04, "The MS may use uplink discontinuous transmission on a TCH-F. The MS may use uplink discontinuous transmission on TCH-H" },
1642 { 0x05, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
1643 { 0x06, "The MS shall not use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
1644 { 0x07, "The MS may use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
1645 { 0, NULL } };
1647 static const crumb_spec_t gsm_a_rr_dtx_sacch_crumbs[] = {
1648 { 0, 1}, /* B8 */
1649 { 2, 2}, /* B6 - B5 */
1650 { 0, 0}
1653 static guint16
1654 de_rr_cell_opt_sacch(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1656 guint32 curr_offset;
1658 curr_offset = offset;
1661 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pwrc, tvb, (curr_offset<<3)+1, 1, ENC_BIG_ENDIAN);
1662 /* DTX is a split field in bits 8, 6 and 5 */
1663 proto_tree_add_split_bits_item_ret_val(subtree, hf_gsm_a_rr_dtx_sacch, tvb, (curr_offset<<3), gsm_a_rr_dtx_sacch_crumbs, NULL);
1664 proto_tree_add_item(subtree, hf_gsm_a_rr_radio_link_timeout, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1666 curr_offset = curr_offset + 1;
1668 return(curr_offset - offset);
1672 * [3] 10.5.2.4 Cell Selection Parameters
1674 static guint16
1675 de_rr_cell_sel_param(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1677 guint32 curr_offset;
1679 curr_offset = offset;
1681 proto_tree_add_item(subtree, hf_gsm_a_rr_cell_reselect_hyst, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1682 proto_tree_add_item(subtree, hf_gsm_a_rr_ms_txpwr_max_cch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1684 curr_offset = curr_offset + 1;
1686 proto_tree_add_item(subtree, hf_gsm_a_rr_acs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1687 proto_tree_add_item(subtree, hf_gsm_a_rr_neci, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1688 proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_access_min, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1690 curr_offset = curr_offset + 1;
1692 return(curr_offset - offset);
1696 * [3] 10.5.2.4a MAC Mode and Channel Coding Requested
1697 * [3] 10.5.2.5 Channel Description
1699 guint16
1700 de_rr_ch_dsc(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1702 guint32 curr_offset;
1703 guint8 oct8,subchannel;
1704 guint16 arfcn, hsn, maio;
1705 const gchar *str;
1707 curr_offset = offset;
1709 /* Octet 2 */
1710 oct8 = tvb_get_guint8(tvb, curr_offset);
1712 if ((oct8 & 0xf8) == 0x08)
1714 str = "TCH/F + ACCHs";
1715 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1716 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1718 else
1720 if ((oct8 & 0xf0) == 0x10)
1722 str = "TCH/H + ACCHs, Subchannel";
1723 subchannel = ((oct8 & 0x08)>>3);
1725 else if ((oct8 & 0xe0) == 0x20)
1727 str = "SDCCH/4 + SACCH/C4 or CBCH (SDCCH/4), Subchannel";
1728 subchannel = ((oct8 & 0x18)>>3);
1730 else if ((oct8 & 0xc0) == 0x40)
1732 str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
1733 subchannel = ((oct8 & 0x38)>>3);
1734 } else {
1735 str = "Unknown channel information";
1736 subchannel = oct8;
1739 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1740 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
1743 other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
1744 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
1746 curr_offset +=1;
1748 /* Octet 3 */
1749 oct8 = tvb_get_guint8(tvb, curr_offset);
1750 other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
1751 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
1754 if ((oct8 & 0x10) == 0x10)
1756 /* Hopping sequence */
1757 maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
1758 hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
1759 str = "Yes";
1761 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1762 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1763 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
1764 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
1766 else
1768 /* single ARFCN */
1769 arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
1770 str = "No";
1772 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1773 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1774 other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
1775 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
1776 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
1779 curr_offset = curr_offset + 2;
1781 return(curr_offset - offset);
1784 * [3] 10.5.2.5a Channel Description 2
1786 static guint16
1787 de_rr_ch_dsc2(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1789 guint32 curr_offset;
1790 guint8 oct8,subchannel;
1791 guint16 arfcn, hsn, maio;
1792 const gchar *str;
1794 curr_offset = offset;
1796 /* Octet 2 */
1797 oct8 = tvb_get_guint8(tvb, curr_offset);
1799 if ((oct8 & 0xf8) == 0x0)
1801 str = "TCH/F + FACCH/F and SACCH/M";
1802 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1803 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1805 else if ((oct8 & 0xf8) == 0x08)
1807 str = "TCH/F + FACCH/F and SACCH/F";
1808 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1809 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1811 else if ((oct8 & 0xf8) == 0xf0)
1813 str = "TCH/F + FACCH/F and SACCH/M + bi- and unidirectional channels";
1814 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1815 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1817 else
1819 if ((oct8 & 0xf0) == 0x10)
1821 str = "TCH/H + ACCHs, Subchannel";
1822 subchannel = ((oct8 & 0x08)>>3);
1824 else if ((oct8 & 0xe0) == 0x20)
1826 str = "SDCCH/4 + SACCH/C4 or CBCH (SDCCH/4), Subchannel";
1827 subchannel = ((oct8 & 0x18)>>3);
1829 else if ((oct8 & 0xc0) == 0x40)
1831 str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
1832 subchannel = ((oct8 % 0x38)>>3);
1834 else if ((oct8 & 0xc0) == 0x80)
1836 str = "TCH/F + FACCH/F and SACCH/M + bidirectional channels at timeslot";
1837 subchannel = ((oct8 % 0x38)>>3);
1839 else if ((oct8 & 0xe0) == 0xc0)
1841 str = "TCH/F + FACCH/F and SACCH/M + unidirectional channels at timeslot";
1842 subchannel = ((oct8 % 0x38)>>3);
1843 } else {
1844 str = "Unknown channel information";
1845 subchannel = oct8;
1847 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1848 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
1851 other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
1852 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
1854 curr_offset +=1;
1856 /* Octet 3 */
1857 oct8 = tvb_get_guint8(tvb, curr_offset);
1858 other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
1859 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
1861 if ((oct8 & 0x10) == 0x10)
1863 /* Hopping sequence */
1864 maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
1865 hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
1866 str = "Yes";
1868 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1869 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1870 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
1871 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
1873 else
1875 /* single ARFCN */
1876 arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
1877 str = "No";
1879 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1880 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1881 other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
1882 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
1883 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
1886 curr_offset = curr_offset + 2;
1888 return(curr_offset - offset);
1892 * [3] 10.5.2.5c Channel Description 3
1894 static guint16
1895 de_rr_ch_dsc3(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1897 guint32 curr_offset;
1898 guint8 oct8;
1899 guint16 arfcn, hsn, maio;
1900 const gchar *str;
1902 curr_offset = offset;
1904 /* Octet 2 */
1905 oct8 = tvb_get_guint8(tvb, curr_offset);
1906 other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
1907 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
1909 if ((oct8 & 0x10) == 0x10)
1911 /* Hopping sequence */
1912 maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
1913 hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
1914 str = "Yes";
1916 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1917 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1918 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
1919 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
1921 else
1923 /* single ARFCN */
1924 arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
1925 str = "No";
1927 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1928 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1929 other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
1930 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
1931 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
1934 curr_offset = curr_offset + 2;
1936 return(curr_offset - offset);
1940 * [3] 10.5.2.6 Channel Mode
1942 /* Channel Mode */
1943 static const value_string gsm_a_rr_channel_mode_vals[] = {
1944 { 0x00, "signalling only"},
1945 { 0x01, "speech full rate or half rate version 1(GSM FR or GSM HR)"},
1946 { 0x21, "speech full rate or half rate version 2(GSM EFR)"},
1947 { 0x41, "speech full rate or half rate version 3(FR AMR or HR AMR)"},
1948 { 0x81, "speech full rate or half rate version 4(OFR AMR-WB or OHR AMR-WB)"},
1949 { 0x82, "speech full rate or half rate version 5(FR AMR-WB )"},
1950 { 0x83, "speech full rate or half rate version 6(OHR AMR )"},
1951 { 0x61, "data, 43.5 kbit/s (downlink)+14.5 kbps (uplink)"},
1952 { 0x62, "data, 29.0 kbit/s (downlink)+14.5 kbps (uplink)"},
1953 { 0x64, "data, 43.5 kbit/s (downlink)+29.0 kbps (uplink)"},
1954 { 0x67, "data, 14.5 kbit/s (downlink)+43.5 kbps (uplink)"},
1955 { 0x65, "data, 14.5 kbit/s (downlink)+29.0 kbps (uplink)"},
1956 { 0x66, "data, 29.0 kbit/s (downlink)+43.5 kbps (uplink)"},
1957 { 0x27, "data, 43.5 kbit/s radio interface rate"},
1958 { 0x63, "data, 32.0 kbit/s radio interface rate"},
1959 { 0x43, "data, 29.0 kbit/s radio interface rate"},
1960 { 0x0f, "data, 14.5 kbit/s radio interface rate"},
1961 { 0x03, "data, 12.0 kbit/s radio interface rate"},
1962 { 0x0b, "data, 6.0 kbit/s radio interface rate"},
1963 { 0x13, "data, 3.6 kbit/s radio interface rate"},
1964 { 0, NULL }
1967 guint16
1968 de_rr_ch_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1970 guint32 curr_offset;
1972 curr_offset = offset;
1974 proto_tree_add_item(tree, hf_gsm_a_rr_channel_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1976 curr_offset = curr_offset + 1;
1978 return(curr_offset - offset);
1981 * [3] 10.5.2.7 Channel Mode 2
1984 static const value_string gsm_a_rr_channel_mode2_vals[] = {
1985 { 0x00, "signalling only"},
1986 { 0x05, "speech half rate version 1(GSM HR)"},
1987 { 0x25, "speech half rate version 2(GSM EFR)"},
1988 { 0x45, "speech half rate version 3(HR AMR)"},
1989 { 0x85, "speech half rate version 4(OHR AMR-WB)"},
1990 { 0x06, "speech half rate version 6(OHR AMR )"},
1991 { 0x0f, "data, 6.0 kbit/s radio interface rate"},
1992 { 0x17, "data, 3.6 kbit/s radio interface rate"},
1993 { 0, NULL }
1996 static guint16
1997 de_rr_ch_mode2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1999 guint32 curr_offset;
2001 curr_offset = offset;
2003 proto_tree_add_item(tree, hf_gsm_a_rr_channel_mode2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2005 curr_offset = curr_offset + 1;
2007 return(curr_offset - offset);
2010 * [3] 10.5.2.7a UTRAN Classmark information element
2012 static guint16
2013 de_rr_utran_cm(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2015 guint32 curr_offset;
2016 tvbuff_t *rrc_irat_ho_info_tvb;
2018 curr_offset = offset;
2019 if (len)
2021 rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
2022 if (rrc_irat_ho_info_handle)
2023 call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, pinfo, tree);
2026 curr_offset += len;
2027 return(curr_offset - offset);
2031 * [3] 10.5.2.7b (void)
2035 * [3] 10.5.2.7c Classmark Enquiry Mask
2036 * Bit 8:
2037 * 0 CLASSMARK CHANGE message is requested
2038 * 1 CLASSMARK CHANGE message is not requested
2039 * Bits 7-5 . 5
2040 * 000 UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is requested
2041 * 111 UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is not requested.
2042 * All other values shall not be sent. If received, they shall be interpreted as '000'.
2043 * Bit 4:
2044 * 0 CDMA2000 CLASSMARK CHANGE message requested
2045 * 1 CDMA2000 CLASSMARK CHANGE message not requested.
2046 * Bit 3:
2047 * 0 GERAN IU MODE CLASSMARK CHANGE message requested
2048 * 1 GERAN IU MODE CLASSMARK CHANGE message not requested.
2049 * Bits 2 - 1: spare(0).
2051 static const true_false_string gsm_a_msg_req_value = {
2052 "message is not requested",
2053 "message is requested"
2056 static const value_string gsm_a_rr_utran_cm_cng_msg_req_vals[] = {
2057 { 0x0, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2058 { 0x1, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2059 { 0x2, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2060 { 0x3, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2061 { 0x4, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2062 { 0x5, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2063 { 0x6, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
2064 { 0x7, "message including status on predefined configurations (i.e. Sequence Description) is not requested."},
2065 { 0, NULL }
2067 guint16
2068 de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2070 guint32 curr_offset;
2072 curr_offset = offset;
2074 proto_tree_add_item(tree, hf_gsm_a_rr_cm_cng_msg_req, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2075 proto_tree_add_item(tree, hf_gsm_a_rr_utran_cm_cng_msg_req, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2076 proto_tree_add_item(tree, hf_gsm_a_rr_cdma200_cm_cng_msg_req, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2077 proto_tree_add_item(tree, hf_gsm_a_rr_geran_iu_cm_cng_msg_req, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2079 curr_offset = curr_offset + 1;
2081 return(curr_offset - offset);
2084 * [3] 10.5.2.8 Channel Needed
2086 static const value_string gsm_a_rr_channel_needed_vals[] = {
2087 { 0x00, "Any channel"},
2088 { 0x01, "SDCCH"},
2089 { 0x02, "TCH/F (Full rate)"},
2090 { 0x03, "TCH/H or TCH/F (Dual rate)"},
2091 { 0, NULL }
2093 guint16
2094 de_rr_chnl_needed(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2096 guint32 curr_offset;
2097 gint bit_offset;
2099 curr_offset = offset;
2100 if (RIGHT_NIBBLE == len)
2101 bit_offset = 4;
2102 else
2103 bit_offset = 0;
2105 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch1, tvb, (curr_offset<<3)+bit_offset+2, 2, ENC_BIG_ENDIAN);
2106 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch2, tvb, (curr_offset<<3)+bit_offset, 2, ENC_BIG_ENDIAN);
2108 curr_offset = curr_offset + 1;
2110 return(curr_offset - offset);
2113 * [3] 10.5.2.8a Channel Request Description
2117 * [3] 10.5.2.8b Channel Request Description 2
2119 static const value_string gsm_a_rr_pkt_estab_cause_vals[] = {
2120 { 0x00, "User Data"},
2121 { 0x01, "Page Response"},
2122 { 0x02, "Cell Update"},
2123 { 0x03, "Mobility Management procedure"},
2124 { 0, NULL }
2126 static const value_string gsm_a_rr_radio_priority_vals[] = {
2127 { 0x00, "1"},
2128 { 0x01, "2"},
2129 { 0x02, "3"},
2130 { 0x03, "4"},
2131 { 0, NULL }
2133 static const true_false_string gsm_a_rr_llc_pdu_type_value = {
2134 "LLC PDU is not SACK or ACK",
2135 "LLC PDU is SACK or ACK"
2137 static const true_false_string gsm_a_rr_reduced_latency_cap_value = {
2138 "The mobile station supports Reduced TTI configurations and Fast Ack/Nack Reporting",
2139 "The mobile station does not support Reduced TTI configurations and Fast Ack/Nack Reporting"
2141 static const value_string gsm_a_rr_egprs2_vals[] = {
2142 { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B"},
2143 { 0x01, "The mobile station supports EGPRS2-A"},
2144 { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B"},
2145 { 0, NULL }
2147 guint16
2148 de_rr_chnl_req_desc2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2150 guint32 bit_offset = offset << 3;
2152 proto_tree_add_bits_item(tree, hf_gsm_a_rr_pkt_estab_cause, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2153 bit_offset += 2;
2154 proto_tree_add_bits_item(tree, hf_gsm_a_rr_peak_throughput_class, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
2155 bit_offset += 4;
2156 proto_tree_add_bits_item(tree, hf_gsm_a_rr_radio_priority, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2157 bit_offset += 2;
2158 proto_tree_add_bits_item(tree, hf_gsm_a_rr_rlc_mode, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2159 bit_offset += 1;
2160 proto_tree_add_bits_item(tree, hf_gsm_a_rr_llc_pdu_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2161 bit_offset += 1;
2162 proto_tree_add_bits_item(tree, hf_gsm_a_rr_rlc_octet_count, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
2163 bit_offset += 16;
2164 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "PFI", "Present", "Not Present")) {
2165 proto_tree_add_bits_item(tree, hf_gsm_a_rr_pfi, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
2166 bit_offset += 7;
2168 gsm_rr_csn_HL_flag(tvb, tree, 0, bit_offset++, "Multiple TBF Capability",
2169 "Multiple TBF procedures in A/Gb mode supported",
2170 "Multiple TBF procedures in A/Gb mode not supported");
2171 bit_offset += 1;
2172 if (gsm_rr_csn_HL_flag(tvb, tree, (offset+len)<<3, bit_offset++, "Additions in Rel-7", "Present", "Not present")) {
2173 proto_tree_add_bits_item(tree, hf_gsm_a_rr_rlc_non_pers_mode_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2174 bit_offset += 1;
2175 proto_tree_add_bits_item(tree, hf_gsm_a_rr_reduced_latency_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2176 bit_offset += 1;
2177 proto_tree_add_bits_item(tree, hf_gsm_a_rr_ul_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2178 bit_offset += 2;
2179 proto_tree_add_bits_item(tree, hf_gsm_a_rr_dl_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2180 bit_offset += 2;
2181 if (gsm_rr_csn_HL_flag(tvb, tree, (offset+len)<<3, bit_offset++, "Additions in Rel-9", "Present", "Not present")) {
2182 proto_tree_add_bits_item(tree, hf_gsm_a_rr_emst_ms_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2183 /*bit_offset += 1;*/
2187 return len;
2191 * [3] 10.5.2.9 Cipher Mode Setting
2193 /* SC (octet 1) */
2194 static const value_string gsm_a_rr_sc_vals[] = {
2195 { 0, "No ciphering"},
2196 { 1, "Start ciphering"},
2197 { 0, NULL }
2199 /* algorithm identifier
2200 * If SC=1 then:
2201 * bits
2202 * 4 3 2
2204 guint16
2205 de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2207 guint32 curr_offset;
2208 gint bit_offset;
2209 guint64 value;
2211 curr_offset = offset;
2213 /* Cipher Mode Setting
2214 * Note: The coding of fields SC and algorithm identifier is defined in [44.018]
2215 * as part of the Cipher Mode Setting IE.
2217 if (RIGHT_NIBBLE == len)
2218 bit_offset = 4;
2219 else
2220 bit_offset = 0;
2222 proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_sc, tvb, (curr_offset<<3)+bit_offset+3, 1, &value, ENC_BIG_ENDIAN);
2223 if (value == 1){ /* Start ciphering */
2224 /* algorithm identifier */
2225 proto_tree_add_bits_item(tree, hf_gsm_a_rr_algorithm_id, tvb, (curr_offset<<3)+bit_offset, 3, ENC_BIG_ENDIAN);
2227 curr_offset = curr_offset + 1;
2229 return(curr_offset - offset);
2232 * [3] 10.5.2.10 Cipher Response
2234 /* CR (octet 1) */
2235 static const value_string gsm_a_rr_cr_vals[] = {
2236 { 0, "IMEISV shall not be included"},
2237 { 1, "IMEISV shall be included"},
2238 { 0, NULL }
2241 static guint16
2242 de_rr_cip_mode_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2244 guint32 curr_offset;
2245 gint bit_offset;
2247 curr_offset = offset;
2248 if (RIGHT_NIBBLE == len)
2249 bit_offset = 4;
2250 else
2251 bit_offset = 0;
2253 /* Cipher Mode Response
2254 * Note: The coding of field CR is defined in [44.018]
2255 * as part of the Cipher Mode Response IE.
2257 proto_tree_add_bits_item(tree, hf_gsm_a_rr_cr, tvb, (curr_offset<<3)+bit_offset+3, 1, ENC_BIG_ENDIAN);
2258 curr_offset = curr_offset + 1;
2260 return(curr_offset - offset);
2262 /* [3] 10.5.2.11 Control Channel Description */
2264 static const value_string gsm_a_rr_mscr_vals[] = {
2265 { 0, "MSC is Release '98 or older"},
2266 { 1, "MSC is Release '99 onwards"},
2267 { 0, NULL }
2270 static const value_string gsm_a_rr_att_vals[] = {
2271 { 0, "MSs in the cell are not allowed to apply IMSI attach and detach procedure"},
2272 { 1, "MSs in the cell shall apply IMSI attach and detach procedure"},
2273 { 0, NULL }
2276 static const value_string gsm_a_rr_ccch_conf_vals[] = {
2277 { 0, "1 basic physical channel used for CCCH, not combined with SDCCHs"},
2278 { 1, "1 basic physical channel used for CCCH, combined with SDCCHs"},
2279 { 2, "2 basic physical channels used for CCCH, not combined with SDCCHs"},
2280 { 3, "Reserved"},
2281 { 4, "3 basic physical channels used for CCCH, not combined with SDCCHs"},
2282 { 5, "Reserved"},
2283 { 6, "4 basic physical channels used for CCCH, not combined with SDCCHs"},
2284 { 7, "Reserved"},
2285 { 0, NULL }
2288 static const value_string gsm_a_rr_cbq3_vals[] = {
2289 { 0, "Iu mode not supported"},
2290 { 1, "Iu mode capable MSs barred"},
2291 { 2, "Iu mode supported, cell not barred"},
2292 { 3, "Iu mode supported, cell not barred"},
2293 { 0, NULL }
2296 static guint16
2297 de_rr_ctrl_ch_desc(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2299 guint8 oct;
2300 guint32 curr_offset;
2302 curr_offset = offset;
2304 proto_tree_add_item(subtree, hf_gsm_a_rr_mscr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2305 proto_tree_add_item(subtree, hf_gsm_a_rr_att, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2306 proto_tree_add_item(subtree, hf_gsm_a_rr_bs_ag_blks_res, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2307 proto_tree_add_item(subtree, hf_gsm_a_rr_ccch_conf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2309 curr_offset = curr_offset + 1;
2310 oct = tvb_get_guint8(tvb, curr_offset);
2312 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq3, tvb, (curr_offset<<3)+1, 2, ENC_BIG_ENDIAN);
2313 proto_tree_add_uint(subtree, hf_gsm_a_rr_bs_pa_mfrms, tvb, curr_offset, 1, (oct&0x07)+2);
2315 curr_offset = curr_offset + 1;
2317 proto_tree_add_item(subtree, hf_gsm_a_rr_t3212, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2319 curr_offset = curr_offset + 1;
2321 return(curr_offset - offset);
2324 /* [3] 10.5.2.11a DTM Information Details
2326 static guint16
2327 de_rr_dtm_info_details(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2329 guint32 bit_offset = offset << 3;
2331 proto_tree_add_bits_item(tree, hf_gsm_a_rr_max_lapdm, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
2332 bit_offset += 3;
2333 proto_tree_add_bits_item(tree, hf_gsm_a_rr_gprs_ms_txpwr_max_ccch, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
2334 bit_offset += 5;
2335 proto_tree_add_bits_item(tree, hf_gsm_a_rr_cell_id, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
2336 bit_offset += 16;
2337 if (gsm_rr_csn_HL_flag(tvb, tree, (offset+len)<<3, bit_offset++, "Additions in Rel-6", "Present", "Not present")) {
2338 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "MBMS procedures", "Supported by cell", "Not supported by cell")) {
2339 proto_tree_add_bits_item(tree, hf_gsm_a_rr_dedicated_mode_mbms_notification_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2340 bit_offset += 1;
2341 proto_tree_add_bits_item(tree, hf_gsm_a_rr_mnci_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2342 /*bit_offset += 1;*/
2346 return len;
2350 * [3] 10.5.2.11b Dynamic ARFCN Mapping
2352 static const value_string gsm_a_rr_gsm_band_vals[] = {
2353 { 0, "GSM 750"},
2354 { 1, "DCS 1800"},
2355 { 2, "PCS 1900"},
2356 { 3, "GSM T 380"},
2357 { 4, "GSM T 410"},
2358 { 5, "GSM T 900"},
2359 { 6, "GSM 710"},
2360 { 7, "GSM T 810"},
2361 { 8, "Reserved"},
2362 { 9, "Reserved"},
2363 { 10, "Reserved"},
2364 { 11, "Reserved"},
2365 { 12, "Reserved"},
2366 { 13, "Reserved"},
2367 { 14, "Reserved"},
2368 { 15, "Reserved"},
2369 { 0, NULL }
2373 static guint16
2374 de_rr_dyn_arfcn_map(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2376 guint bit_offset;
2378 bit_offset = offset << 3;
2380 while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeating Dynamic ARFCN Mapping", "Present", "Not Present"))
2382 proto_tree_add_bits_item(tree, hf_gsm_a_rr_gsm_band, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
2383 bit_offset += 4;
2384 proto_tree_add_bits_item(tree, hf_gsm_a_rr_arfcn_first, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
2385 bit_offset += 10;
2386 proto_tree_add_bits_item(tree, hf_gsm_a_rr_band_offset, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
2387 bit_offset += 10;
2388 proto_tree_add_bits_item(tree, hf_gsm_a_rr_arfcn_range, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
2389 bit_offset += 7;
2392 if (((bit_offset + 7) >> 3) > (offset + len))
2394 expert_add_info(pinfo, proto_tree_get_parent(tree), &ei_gsm_a_rr_ie_overrun);
2396 else if ((bit_offset >> 3) < (offset + len))
2398 expert_add_info(pinfo, proto_tree_get_parent(tree), &ei_gsm_a_rr_ie_underrun);
2400 return(len);
2403 * [3] 10.5.2.12 Frequency Channel Sequence
2405 static guint16
2406 de_rr_freq_ch_seq(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2408 guint32 curr_offset;
2409 gint bit_offset, i;
2411 curr_offset = offset;
2413 proto_tree_add_item(tree, hf_gsm_a_rr_lowest_arfcn, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2414 curr_offset += 1;
2415 bit_offset = curr_offset << 3;
2416 for (i=0; i<16; i++)
2418 proto_tree_add_bits_item(tree, hf_gsm_a_rr_inc_skip_arfcn, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
2419 bit_offset += 4;
2422 curr_offset = curr_offset + 8;
2424 return(curr_offset - offset);
2428 * [3] 10.5.2.13 Frequency List
2431 * [3] 10.5.2.13 Frequency List
2433 * Bit Bit Bit Bit Bit format notation
2434 * 8 7 4 3 2
2435 * 0 0 X X X bit map 0
2436 * 1 0 0 X X 1024 range
2437 * 1 0 1 0 0 512 range
2438 * 1 0 1 0 1 256 range
2439 * 1 0 1 1 0 128 range
2440 * 1 0 1 1 1 variable bit map
2442 /* The mask 0xce (1100 1110) will produce the result 0110 0111*/
2443 static const value_string gsm_a_rr_freq_list_format_id_vals[] = {
2444 { 0x00, "bit map 0"},
2445 { 0x02, "bit map 0"},
2446 { 0x04, "bit map 0"},
2447 { 0x06, "bit map 0"},
2448 { 0x08, "bit map 0"},
2449 { 0x0a, "bit map 0"},
2450 { 0x0c, "bit map 0"},
2451 { 0x0e, "bit map 0"},
2452 { 0x40, "1024 range"},
2453 { 0x41, "1024 range"},
2454 { 0x42, "1024 range"},
2455 { 0x43, "1024 range"},
2456 { 0x44, "512 range"},
2457 { 0x45, "256 range"},
2458 { 0x46, "128 range"},
2459 { 0x47, "variable bit map"},
2460 { 0x00, NULL }
2463 static guint16
2464 de_rr_freq_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2466 return dissect_arfcn_list(tvb, tree, pinfo, offset, len, add_string, string_len);
2469 * [3] 10.5.2.14 Frequency Short List
2471 *The Frequency Short List information element is a type 3 information element of 10 octet length.
2473 * This element is encoded exactly as the Frequency List information element,
2474 * except that it has a fixed length instead of a variable length and does
2475 * not contain a length indicator and that it shall not be encoded in bitmap 0 format.
2478 static guint16
2479 de_rr_freq_short_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2481 return dissect_arfcn_list(tvb, tree, pinfo, offset, 9, add_string, string_len);
2485 * [3] 10.5.2.14a Frequency Short List 2
2487 * The Frequency Short List information element is a type 3 information element of 8 octet length.
2489 * This element is encoded exactly as the Frequency List information element,
2490 * except that it has a fixed length instead of a variable length and does
2491 * not contain a length indicator and that it shall not be encoded in bitmap 0 format.
2493 static guint16
2494 de_rr_freq_short_list2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2496 return dissect_arfcn_list(tvb, tree, pinfo, offset, 8, add_string, string_len);
2499 * [3] 10.5.2.14b Group Channel Description
2503 * [3] 10.5.2.14c GPRS Resumption
2505 static const true_false_string gsm_a_rr_gprs_resumption_ack_value = {
2506 "Resumption of GPRS services successfully acknowledged",
2507 "Resumption of GPRS services not successfully acknowledged"
2510 static guint16
2511 de_rr_gprs_resumption(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2513 guint32 curr_offset;
2515 curr_offset = offset;
2517 proto_tree_add_item(tree, hf_gsm_a_rr_gprs_resumption_ack, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2518 curr_offset += 1;
2520 return (curr_offset - offset);
2524 * [3] 10.5.2.14d GPRS broadcast information
2527 static gint
2528 de_rr_rest_oct_gprs_cell_options(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
2530 proto_tree *subtree, *subtree2;
2531 proto_item *item, *item2;
2532 gint curr_bit_offset, curr_bit_offset_sav;
2533 guint8 value;
2535 curr_bit_offset = bit_offset;
2537 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS].strptr);
2538 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS]);
2539 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nmo, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
2540 curr_bit_offset += 2;
2541 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3168, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2542 curr_bit_offset += 3;
2543 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3192, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2544 curr_bit_offset += 3;
2545 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_drx_timer_max, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2546 curr_bit_offset += 3;
2547 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_access_burst_type, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2548 curr_bit_offset += 1;
2549 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_control_ack_type, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2550 curr_bit_offset += 1;
2551 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bs_cv_max, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2552 curr_bit_offset += 4;
2553 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "PAN bits", "Present", "Not Present"))
2555 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_dec, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2556 curr_bit_offset += 3;
2557 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_inc, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2558 curr_bit_offset += 3;
2559 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_max, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2560 curr_bit_offset += 3;
2562 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Optional Extensions", "Present", "Not Present"))
2563 { /* Optional extension information */
2564 curr_bit_offset_sav = curr_bit_offset;
2565 item2 = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, -1, "%s",
2566 gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO].strptr);
2567 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO]);
2568 value = tvb_get_bits8(tvb,curr_bit_offset,6);
2569 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 1, "Extension Length: %d", value);
2570 curr_bit_offset += 6;
2571 value += 1;
2572 proto_item_set_len(item2,((curr_bit_offset+value)>>3) - (curr_bit_offset_sav>>3)+1);
2573 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "EGPRS", "Supported by cell", "Not supported by cell"))
2575 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_egprs_packet_channel_request, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2576 curr_bit_offset += 1;
2577 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bep_period, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2578 curr_bit_offset += 4;
2579 value -= 5;
2581 value -= 1;
2582 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pfc_feature_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2583 curr_bit_offset += 1;
2584 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dtm_support, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2585 curr_bit_offset += 1;
2586 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bss_paging_coordination, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2587 curr_bit_offset += 1;
2588 value -= 3;
2589 if (value > 0)
2590 { /* Rel 4 extension */
2591 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_ccn_active, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2592 curr_bit_offset += 1;
2593 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nw_ext_utbf, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2594 curr_bit_offset += 1;
2595 value -= 2;
2596 if (value > 0)
2597 { /* Rel 6 extension */
2598 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_multiple_tbf_capability, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2599 curr_bit_offset += 1;
2600 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_ext_utbf_no_data, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2601 curr_bit_offset += 1;
2602 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dtm_enhancements_capability, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2603 curr_bit_offset += 1;
2604 value -= 3;
2605 if (gsm_rr_csn_flag(tvb, subtree2, curr_bit_offset++, "MBMS procedures", "Supported by cell", "Not supported by cell"))
2607 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dedicated_mode_mbms_notification_support, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2608 curr_bit_offset += 1;
2609 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_mnci_support, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2610 curr_bit_offset += 1;
2611 value -= 2;
2613 value -= 1;
2614 if (value > 0)
2615 { /* Rel 7 extension */
2616 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_reduced_latency_access, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2617 curr_bit_offset += 1;
2618 value -= 1;
2622 curr_bit_offset += value;
2624 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
2626 return (curr_bit_offset - bit_offset);
2629 static gint
2630 de_rr_rest_oct_gprs_power_control_parameters(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
2632 proto_tree *subtree;
2633 proto_item *item;
2634 gint curr_bit_offset;
2636 curr_bit_offset = bit_offset;
2638 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);
2639 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS]);
2640 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2641 curr_bit_offset += 4;
2642 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_w, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2643 curr_bit_offset += 5;
2644 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_t, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2645 curr_bit_offset += 5;
2646 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pc_meas_chan, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2647 curr_bit_offset += 1;
2648 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_n_avg_i, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2649 curr_bit_offset += 4;
2650 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
2652 return (curr_bit_offset - bit_offset);
2655 static guint16
2656 de_rr_gprs_broadcast_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len , gchar *add_string _U_, int string_len _U_)
2658 guint32 curr_offset;
2659 gint bit_offset;
2661 curr_offset = offset;
2662 bit_offset = curr_offset << 3;
2664 bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, tree, bit_offset);
2665 /*bit_offset += */de_rr_rest_oct_gprs_power_control_parameters(tvb, tree, bit_offset);
2666 curr_offset += len;
2668 return (curr_offset - offset);
2672 * [3] 10.5.2.15 Handover Reference
2674 static guint16
2675 de_rr_ho_ref(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2677 guint32 curr_offset;
2679 curr_offset = offset;
2681 /* Handover reference value */
2682 proto_tree_add_item(subtree, hf_gsm_a_rr_ho_ref_val, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2684 curr_offset = curr_offset + 1;
2686 return(curr_offset - offset);
2689 static const value_string gsm_a_access_tech_type_vals[] = {
2690 { 0, "GSM P"},
2691 { 1, "GSM E --note that GSM E covers GSM P"},
2692 { 2, "GSM R --note that GSM R covers GSM E and GSM P"},
2693 { 3, "GSM 1800"},
2694 { 4, "GSM 1900"},
2695 { 5, "GSM 450"},
2696 { 6, "GSM 480"},
2697 { 7, "GSM 850"},
2698 { 8, "GSM 750"},
2699 { 9, "GSM T 380"},
2700 { 10, "GSM T 410"},
2701 { 11, "GSM T 900"},
2702 { 12, "GSM 710"},
2703 { 13, "GSM T 810"},
2704 { 14, "reserved"},
2705 { 15, "Indicates the presence of a list of Additional access technologies"},
2706 { 0, NULL }
2710 static const value_string gsm_a_egprs_mcs_vals[] = {
2711 { 0, "MCS-1"},
2712 { 1, "MCS-2"},
2713 { 2, "MCS-3"},
2714 { 3, "MCS-4"},
2715 { 4, "MCS-5"},
2716 { 5, "MCS-6"},
2717 { 6, "MCS-7"},
2718 { 7, "MCS-8"},
2719 { 8, "MCS-9"},
2720 { 9, "MCS-5-7"},
2721 { 10, "MCS-6-9"},
2722 { 11, "reserved"},
2723 { 0, NULL }
2726 static const value_string gsm_a_gprs_cs_vals[] = {
2727 { 0, "CS-1"},
2728 { 1, "CS-2"},
2729 { 2, "CS-3"},
2730 { 3, "CS-4"},
2731 { 0, NULL }
2735 static const true_false_string gsm_a_tlli_block_channel_coding_vals = {
2736 "mobile station shall use coding scheme as specified by the corresponding CHANNEL CODING COMMAND or EGPRS CHANNEL CODING COMMAND field",
2737 "mobile station shall use CS-1 in GPRS TBF mode or MCS-1 in EGPRS TBF mode"
2740 static const true_false_string gsm_a_resegment_vals = {
2741 "Retransmitted RLC data blocks shall be re-segmented according to commanded MCS",
2742 "Retransmitted RLC data blocks shall not be re-segmented"
2745 static const true_false_string gsm_a_polling_vals = {
2746 "MS shall send a PACKET CONTROL ACKNOWLEDGEMENT message in the uplink block specified by TBF Starting Time, on the assigned PDCH",
2747 "no action is required from MS"
2750 static const true_false_string gsm_a_usf_granularity_vals = {
2751 "the mobile station shall transmit four consecutive RLC/MAC blocks",
2752 "the mobile station shall transmit one RLC/MAC block"
2755 static const true_false_string gsm_a_rlc_mode_vals = {
2756 "RLC unacknowledged mode",
2757 "RLC acknowledged mode"
2760 static const true_false_string gsm_a_ta_valid_vals = {
2761 "the timing advance value is valid",
2762 "the timing advance value is not valid"
2767 static const value_string gsm_a_egprs_windows_size_vals[] = {
2768 { 0, "64"},
2769 { 1, "96"},
2770 { 2, "128"},
2771 { 3, "160"},
2772 { 4, "192"},
2773 { 5, "224"},
2774 { 6, "256"},
2775 { 7, "288"},
2776 { 8, "320"},
2777 { 9, "352"},
2778 { 10, "384"},
2779 { 11, "416"},
2780 { 12, "448"},
2781 { 13, "480"},
2782 { 14, "512"},
2783 { 15, "544"},
2784 { 16, "576"},
2785 { 17, "608"},
2786 { 18, "640"},
2787 { 19, "672"},
2788 { 20, "704"},
2789 { 21, "736"},
2790 { 22, "768"},
2791 { 23, "800"},
2792 { 24, "832"},
2793 { 25, "864"},
2794 { 26, "896"},
2795 { 27, "928"},
2796 { 28, "960"},
2797 { 29, "992"},
2798 { 30, "1024"},
2799 { 31, "reserved"},
2800 { 0, NULL }
2803 static const value_string gsm_a_rr_gamma_vals[] = {
2804 { 0, "0 dB"},
2805 { 1, "2 dB"},
2806 { 2, "4 dB"},
2807 { 3, "6 dB"},
2808 { 4, "8 dB"},
2809 { 5, "10 dB"},
2810 { 6, "12 dB"},
2811 { 7, "14 dB"},
2812 { 8, "16 dB"},
2813 { 9, "18 dB"},
2814 { 10, "20 dB"},
2815 { 11, "22 dB"},
2816 { 12, "24 dB"},
2817 { 13, "26 dB"},
2818 { 14, "28 dB"},
2819 { 15, "30 dB"},
2820 { 16, "32 dB"},
2821 { 17, "34 dB"},
2822 { 18, "36 dB"},
2823 { 19, "38 dB"},
2824 { 20, "40 dB"},
2825 { 21, "42 dB"},
2826 { 22, "44 dB"},
2827 { 23, "46 dB"},
2828 { 24, "48 dB"},
2829 { 25, "50 dB"},
2830 { 26, "52 dB"},
2831 { 27, "54 dB"},
2832 { 28, "56 dB"},
2833 { 29, "58 dB"},
2834 { 30, "60 dB"},
2835 { 31, "62 dB"},
2836 { 0, NULL }
2841 static const value_string gsm_a_link_quality_meas_mode_vals[] = {
2842 { 0, "The MS shall not report either interference measurements or per slot BEP measurements"},
2843 { 1, "The MS shall report available interference measurements for timeslots 0 through 7"},
2844 { 2, "The MS shall report mean BEP on each assigned time slot ... No interference measurements shall be reported..."},
2845 { 3, "The MS shall report mean BEP on each assigned time slot ... In addition to mean BEP, the MS shall report interference measurements for no more than four time slots..."},
2846 { 0, NULL }
2850 static guint16
2851 de_tbf_starting_time(tvbuff_t *tvb, proto_tree *tree, guint32 bit_offset)
2853 proto_item *item;
2854 guint32 curr_bit_offset;
2855 guint16 rfn, t;
2856 guint64 t1, t2, t3;
2858 curr_bit_offset = bit_offset;
2860 proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_tbf_T1prim, tvb, curr_bit_offset, 5, &t1, ENC_BIG_ENDIAN);
2861 curr_bit_offset += 5;
2862 proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_tbf_T3, tvb, curr_bit_offset, 6, &t3, ENC_BIG_ENDIAN);
2863 curr_bit_offset += 6;
2864 proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_tbf_T2, tvb, curr_bit_offset, 5, &t2, ENC_BIG_ENDIAN);
2865 curr_bit_offset += 5;
2868 /* great care needed with signed/unsigned - -1 in unsigned is 0xffff, which mod(26) is not what you think !!! */
2869 t = (26 + t3 - t2) % 26;
2870 rfn = (guint16)((51 * t) + t3 + (51 * 26 * t1));
2872 item = proto_tree_add_uint(tree, hf_gsm_a_rr_tbf_starting_time, tvb, bit_offset >> 3, ((curr_bit_offset - bit_offset) >> 3) + 1, rfn);
2873 PROTO_ITEM_SET_GENERATED(item);
2874 return(curr_bit_offset - bit_offset);
2877 static gint
2878 de_rr_ia_rest_oct_egprs_packet_uplink_assignment(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, guint bit_len)
2880 proto_tree *subtree;
2881 proto_item *item;
2882 guint curr_bit_offset;
2884 curr_bit_offset = bit_offset;
2886 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT].strptr);
2887 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT]);
2888 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_extended_ra, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2889 curr_bit_offset += 5;
2890 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Access Technologies Request", "Present", "Not Present"))
2892 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_access_tech_type, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2893 curr_bit_offset += 4;
2896 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "", "TFI Assignment Present", "Multi Block Allocation Present"))
2898 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tfi_assignment, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2899 curr_bit_offset += 5;
2900 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_polling, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2901 curr_bit_offset += 1;
2902 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Allocation Type", "Fixed Allocation (not to be used after Rel-4)", "Dynamic Allocation (mandatory after Rel-4)"))
2904 gint8 bitmap_len = tvb_get_bits8(tvb, curr_bit_offset, 5);
2905 gint32 bitmap;
2906 proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1+((curr_bit_offset+5)>>3) - (curr_bit_offset>>3), "Bitmap length %d", bitmap_len);
2907 curr_bit_offset += 5;
2908 bitmap = tvb_get_bits32(tvb, curr_bit_offset, bitmap_len, ENC_BIG_ENDIAN);
2909 proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1+((curr_bit_offset+bitmap_len)>>3) - (curr_bit_offset>>3), "Bitmap %d", bitmap);
2910 curr_bit_offset += bitmap_len;
2911 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "P0 bits", "Present", "Not Present"))
2913 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2914 curr_bit_offset += 4;
2915 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2916 curr_bit_offset += 1;
2919 else
2921 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_usf, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
2922 curr_bit_offset += 3;
2923 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_usf_granularity, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2924 curr_bit_offset += 1;
2925 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "P0 bits", "Present", "Not Present"))
2927 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2928 curr_bit_offset += 4;
2929 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2930 curr_bit_offset += 1;
2934 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_egprs_mcs, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2935 curr_bit_offset += 4;
2936 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tlli_block_channel_coding, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2937 curr_bit_offset += 1;
2938 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BEP_PERIOD2", "Present", "Not Present"))
2940 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bep_period2, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2941 curr_bit_offset += 4;
2943 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_resegment, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2944 curr_bit_offset += 1;
2945 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_egprs_window_size, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2946 curr_bit_offset += 5;
2947 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Alpha", "Present", "Not Present"))
2949 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2950 curr_bit_offset += 4;
2952 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gamma, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2953 curr_bit_offset += 5;
2954 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Timing Advance Index", "Present", "Not Present"))
2956 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_timing_adv_index, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2957 curr_bit_offset += 4;
2959 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "TBF Starting Time", "Present", "Not Present"))
2961 curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset);
2963 /* Null breakpoint */
2965 else /* Multi Block Allocation */
2967 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Alpha", "Present", "Not Present"))
2969 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2970 curr_bit_offset += 4;
2972 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gamma, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
2973 curr_bit_offset += 5;
2974 curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset);
2975 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_num_of_radio_block_allocated, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
2976 curr_bit_offset += 2;
2977 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "P0 bits", "Present", "Not Present"))
2979 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
2980 curr_bit_offset += 4;
2981 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BTS Power Control Mode", "Mode B (not to be used after Rel-4)", "Mode A (mandatory after Rel-4)");
2982 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
2983 curr_bit_offset += 1;
2986 /* Null breakpoint */
2987 if (curr_bit_offset < bit_len)
2989 if (gsm_rr_csn_HL_flag(tvb,subtree, 0,curr_bit_offset++,"Additions in Rel-7", "Present", "Not present"))
2991 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "PFI", "Present", "Not Present"))
2993 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pfi, tvb, curr_bit_offset, 7, ENC_BIG_ENDIAN);
2994 curr_bit_offset += 7;
2999 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3001 return (curr_bit_offset - bit_offset);
3005 static gint
3006 de_rr_ia_rest_oct_tmgi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
3008 proto_tree *subtree;
3009 proto_item *item;
3010 gint curr_bit_offset;
3011 guint16 value16;
3012 gchar mcc[4];
3013 gchar mnc[4];
3015 curr_bit_offset = bit_offset;
3017 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_TMGI].strptr);
3018 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TMGI]);
3020 if (0 == gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "MCC and MNC Parameters", "Present", "Not Present")) /* without MCC and MNC parameters */
3022 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mbms_service_id, tvb, curr_bit_offset, 24, ENC_BIG_ENDIAN);
3023 curr_bit_offset += 24;
3025 else /* with MCC and MNC parameters */
3027 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mbms_service_id, tvb, curr_bit_offset, 24, ENC_BIG_ENDIAN);
3028 curr_bit_offset += 24;
3030 value16 = tvb_get_bits16(tvb,curr_bit_offset,12,ENC_BIG_ENDIAN);
3031 mcc[0] = '0' + ((value16>>8)&0xf);
3032 mcc[1] = '0' + ((value16>>4)&0xf);
3033 mcc[2] = '0' + ((value16 )&0xf);
3034 mcc[3] = '\0';
3035 proto_tree_add_text(tree,
3036 tvb, curr_bit_offset>>3, 12,
3037 "Mobile Country Code (MCC): %s",
3038 mcc);
3039 curr_bit_offset += 12;
3041 value16 = tvb_get_bits16(tvb,curr_bit_offset,12,ENC_BIG_ENDIAN);
3042 mnc[0] = '0' + ((value16>>8)&0xf);
3043 mnc[1] = '0' + ((value16>>4)&0xf);
3044 mnc[2] = '0' + ((value16 )&0xf);
3045 mnc[3] = '\0';
3046 proto_tree_add_text(tree,
3047 tvb, curr_bit_offset>>3, 12,
3048 "Mobile Network Code (MNC): %s",
3049 mnc);
3050 curr_bit_offset += 12;
3052 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3054 return (curr_bit_offset - bit_offset);
3059 static gint
3060 de_rr_ia_rest_oct_packet_timing_advance(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
3062 proto_tree *subtree;
3063 proto_item *item;
3064 gint curr_bit_offset;
3067 curr_bit_offset = bit_offset;
3069 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE].strptr);
3070 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE]);
3072 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Timing Advance Value", "Present", "Not Present"))
3074 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_timing_adv, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
3075 curr_bit_offset += 6;
3078 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Timing Advance Index and Timeslot", "Present", "Not Present"))
3080 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_timing_adv_index, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3081 curr_bit_offset += 4;
3082 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_timing_adv_timeslot_num, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
3083 curr_bit_offset += 3;
3085 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3087 return (curr_bit_offset - bit_offset);
3092 static gint
3093 de_rr_ia_rest_oct_multiple_blocks_packet_downlink_assignment(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
3095 proto_tree *subtree;
3096 proto_item *item;
3097 gint curr_bit_offset;
3098 guint8 value;
3100 curr_bit_offset = bit_offset;
3102 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT].strptr);
3103 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT]);
3105 curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset);
3106 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_num_of_radio_block_allocated, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3107 curr_bit_offset += 4;
3109 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "", "default 0 bit", "Reserved Value"))
3111 if (0 == gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "MBMS Assignment", "(Non-distribution)", "(Distribution)"))
3112 {/* MBMS Assignment (Distribution) */
3113 curr_bit_offset += de_rr_ia_rest_oct_tmgi(tvb, tree, curr_bit_offset);
3115 else /* MBMS Assignment (Non-distribution) */
3117 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tlli, tvb, curr_bit_offset, 32, ENC_BIG_ENDIAN);
3118 curr_bit_offset += 32;
3119 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "MS Parameters", "Present", "Not Present"))
3121 value = tvb_get_bits8(tvb,curr_bit_offset,2);
3122 proto_tree_add_text(tree,
3123 tvb, curr_bit_offset>>3, 2,
3124 "Length Indicator of MS ID: %d",
3125 value);
3126 curr_bit_offset += 2;
3128 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ms_id, tvb, curr_bit_offset, value+1, ENC_BIG_ENDIAN);
3129 curr_bit_offset += value+1;
3130 curr_bit_offset += de_rr_ia_rest_oct_packet_timing_advance(tvb, tree, curr_bit_offset);
3131 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Alpha", "Present", "Not Present"))
3133 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3134 curr_bit_offset += 4;
3135 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Gamma", "Present", "Not Present"))
3137 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gamma, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3138 curr_bit_offset += 5;
3144 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3146 return (curr_bit_offset - bit_offset);
3152 static gint
3153 de_rr_ia_rest_oct_packet_uplink_assignment(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, guint bit_len)
3155 proto_tree *subtree;
3156 proto_item *item;
3157 guint curr_bit_offset;
3159 curr_bit_offset = bit_offset;
3161 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT].strptr);
3162 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT]);
3164 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Packet Uplink Assignment", "Normal", "Single Block"))
3166 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tfi_assignment, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3167 curr_bit_offset += 5;
3168 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_polling, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3169 curr_bit_offset += 1;
3170 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Allocation Type", "Fixed Allocation (not to be used after Rel-4))", "Dynamic Allocation (mandatory after Rel-4)"))
3172 gint8 bitmap_len = tvb_get_bits8(tvb, curr_bit_offset, 5);
3173 gint32 bitmap;
3174 proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1+((curr_bit_offset+5)>>3) - (curr_bit_offset>>3), "Bitmap length %d", bitmap_len);
3175 curr_bit_offset += 5;
3176 bitmap = tvb_get_bits32(tvb, curr_bit_offset, bitmap_len, ENC_BIG_ENDIAN);
3177 proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1+((curr_bit_offset+bitmap_len)>>3) - (curr_bit_offset>>3), "Bitmap %d", bitmap);
3178 curr_bit_offset += bitmap_len;
3179 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "P0 bits", "Present", "Not Present"))
3181 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3182 curr_bit_offset += 4;
3183 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3184 curr_bit_offset += 1;
3187 else
3189 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_usf, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
3190 curr_bit_offset += 3;
3191 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_usf_granularity, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3192 curr_bit_offset += 1;
3193 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "P0", "Present", "Not Present"))
3195 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3196 curr_bit_offset += 4;
3197 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3198 curr_bit_offset += 1;
3201 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gprs_cs, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
3202 curr_bit_offset += 2;
3203 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tlli_block_channel_coding, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3204 curr_bit_offset += 1;
3205 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Alpha", "Present", "Not Present"))
3207 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3208 curr_bit_offset += 4;
3210 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gamma, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3211 curr_bit_offset += 5;
3212 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Timing Advance Index", "Present", "Not Present"))
3214 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_timing_adv_index, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3215 curr_bit_offset += 4;
3217 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "TBF Starting Time", "Present", "Not Present"))
3219 curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset);
3222 else /* Single Block Allocation */
3224 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Alpha", "Present", "Not Present"))
3226 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3227 curr_bit_offset += 4;
3229 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gamma, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3230 curr_bit_offset += 5;
3231 /* fixed bits '01' */
3232 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bit reserved for earlier version of protocol", "Early R97 version", "Later than R97 version");
3233 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bit reserved for earlier version of protocol", "Later than R97 version", "Early R97 version");
3234 curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset);
3235 if (gsm_rr_csn_HL_flag(tvb,subtree, 0,curr_bit_offset++,"P0", "Present", "Not Present"))
3237 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3238 curr_bit_offset += 4;
3239 /* The value '1' was allocated in an earlier version of the protocol and shall not be used */
3240 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version");
3241 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3242 curr_bit_offset += 1;
3246 /* Null breakpoint */
3247 if (curr_bit_offset < bit_len)
3249 if (gsm_rr_csn_HL_flag(tvb,subtree, 0,curr_bit_offset++,"Additions in R99", "Present", "Not Present"))
3251 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Extended RA", "Present", "Not Present"))
3253 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_extended_ra, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3254 curr_bit_offset += 5;
3259 /* Null breakpoint */
3260 if (curr_bit_offset < bit_len)
3262 if (gsm_rr_csn_HL_flag(tvb,subtree, 0,curr_bit_offset++,"Additions in Rel-6", "Present", "Not Present"))
3264 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "PFI", "Present", "Not Present"))
3266 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pfi, tvb, curr_bit_offset, 7, ENC_BIG_ENDIAN);
3267 curr_bit_offset += 7;
3271 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3273 return (curr_bit_offset - bit_offset);
3277 static gint
3278 de_rr_ia_rest_oct_packet_downlink_assignment(tvbuff_t *tvb, proto_tree *tree, guint bit_offset, guint bit_len)
3280 proto_tree *subtree;
3281 proto_item *item;
3282 guint curr_bit_offset;
3284 curr_bit_offset = bit_offset;
3286 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT].strptr);
3287 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT]);
3289 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tlli, tvb, curr_bit_offset, 32, ENC_BIG_ENDIAN);
3290 curr_bit_offset += 32;
3292 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "TFI Assignment (etc)", "Present", "Not Present"))
3294 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tfi_assignment, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3295 curr_bit_offset += 5;
3296 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rlc_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3297 curr_bit_offset += 1;
3298 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Alpha", "Present", "Not Present"))
3300 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3301 curr_bit_offset += 4;
3303 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gamma, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3304 curr_bit_offset += 5;
3305 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_polling, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3306 curr_bit_offset += 1;
3307 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ta_valid, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3308 curr_bit_offset += 1;
3310 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Timing Advance Index", "Present", "Not Present"))
3312 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_timing_adv_index, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3313 curr_bit_offset += 4;
3315 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "TBF Starting Time", "Present", "Not Present"))
3317 curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset);
3319 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "P0", "Present", "Not Present"))
3321 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_p0, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3322 curr_bit_offset += 4;
3323 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BTS Power Control Mode", "Mode B (not to be used after Rel-4)", "Mode A (mandatory after Rel-4)");
3324 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pr_mode, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
3325 curr_bit_offset += 1;
3328 /* Null breakpoint */
3329 if (curr_bit_offset < bit_len)
3331 if (gsm_rr_csn_HL_flag(tvb,subtree, 0,curr_bit_offset++,"Additions in R99", "Present", "Not Present"))
3333 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_egprs_window_size, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3334 curr_bit_offset += 5;
3335 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_link_quality_meas_mode, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
3336 curr_bit_offset += 2;
3337 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BEP_PERIOD2", "Present", "Not Present"))
3339 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bep_period2, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
3340 curr_bit_offset += 4;
3345 /* Null breakpoint */
3346 if (curr_bit_offset < bit_len)
3348 if (gsm_rr_csn_HL_flag(tvb,subtree, 0, curr_bit_offset++, "Additions in Rel-6", "Present", "Not Present"))
3350 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "PFI", "Present", "Not Present"))
3352 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pfi, tvb, curr_bit_offset, 7, ENC_BIG_ENDIAN);
3353 curr_bit_offset += 7;
3357 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3359 return (curr_bit_offset - bit_offset);
3362 static gint
3363 de_rr_ia_rest_oct_second_part_packet_assignment(tvbuff_t *tvb, proto_tree *tree, guint bit_offset, guint bit_len)
3365 proto_tree *subtree;
3366 proto_item *item;
3367 guint curr_bit_offset;
3369 curr_bit_offset = bit_offset;
3371 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT].strptr);
3372 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT]);
3374 /* Null breakpoint */
3375 if (curr_bit_offset < bit_len)
3377 if (gsm_rr_csn_HL_flag(tvb,subtree, 0,curr_bit_offset++,"Additions in R99", "Present", "Not Present"))
3379 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Extended RA", "Present", "Not Present"))
3381 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_extended_ra, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3382 curr_bit_offset += 5;
3386 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
3388 return (curr_bit_offset - bit_offset);
3393 * [3] 10.5.2.16 IA Rest Octets
3396 static guint16
3397 de_rr_ia_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3399 proto_item *item;
3400 guint32 curr_offset;
3401 gint bit_offset;
3402 gint length;
3403 guint64 ma_length;
3404 guint8 tvb_len = tvb_length(tvb);
3405 guint16 bit_len = tvb_len << 3;
3407 curr_offset = offset;
3409 bit_offset = curr_offset << 3;
3410 if (0 == gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "First Discriminator Bit", "High", "Low"))
3412 if (0 == gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Second Discriminator Bit", "High", "Low"))
3414 /* LL */
3415 gsm_rr_csn_HL_flag(tvb, subtree, 0,bit_offset++, "A compressed version of the INTER RAT HANDOVER INFO message ", "shall be used", "shall not be used");
3417 else /* LH */
3419 if (0 == gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Discriminator bit", "reserved for future use", "EGPRS Packet Uplink Assignment or Multiple blocks Packet Downlink Assignment"))
3421 if (0 == gsm_rr_csn_flag(tvb, subtree, bit_offset++, "", "Multiple blocks Packet Downlink Assignment", "EGPRS Packet Uplink Assignment"))
3423 bit_offset += de_rr_ia_rest_oct_egprs_packet_uplink_assignment(tvb, subtree, bit_offset, bit_len);
3425 else
3427 bit_offset += de_rr_ia_rest_oct_multiple_blocks_packet_downlink_assignment(tvb, subtree, bit_offset);
3430 else
3432 proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "reserved for future use (however the value 7C for the first octet shall not be used)");
3436 else
3438 if (0 == gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Second Discriminator Bit", "High", "Low"))
3440 /* HL */
3441 proto_tree_add_bits_ret_val(subtree, hf_gsm_a_rr_ma_length, tvb, bit_offset, 6, &ma_length, ENC_BIG_ENDIAN);
3442 bit_offset += 6;
3443 /* Frequency Parameters, before time */
3444 if (ma_length>0)
3446 /* two '0' bits */
3447 bit_offset += 2;
3448 proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "MAIO: %d", tvb_get_bits8(tvb,bit_offset,6));
3449 bit_offset += 6;
3450 length = (gint)ma_length;
3451 item = proto_tree_add_text(subtree,tvb, bit_offset>>3, (length>>3)-1, "MA Bitmap: ");
3452 length = (length-1)*8;
3453 while (length)
3455 proto_item_append_text(item,"%d",tvb_get_bits8(tvb,bit_offset,1));
3456 bit_offset += 1;
3457 length -= 1;
3460 gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "A compressed version of the INTER RAT HANDOVER INFO message", "shall be used", "shall not be used");
3462 else /* HH */
3464 if (0 == gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Discriminator Bit", "Second Part Packet Assignment", "Packet Assignment"))
3466 if (0 == gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Discriminator Bit", "Packet Downlink Assignment", "Packet Uplink Assignment"))
3468 /* 00 < Packet Uplink Assignment > */
3469 bit_offset += de_rr_ia_rest_oct_packet_uplink_assignment(tvb, subtree, bit_offset, bit_len);
3471 else /* 01 < Packet Downlink Assignment > */
3473 bit_offset += de_rr_ia_rest_oct_packet_downlink_assignment(tvb, subtree, bit_offset, bit_len);
3476 else /* 1 < Second Part Packet Assignment > */
3478 bit_offset += de_rr_ia_rest_oct_second_part_packet_assignment(tvb, subtree, bit_offset, bit_len);
3482 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
3483 return tvb_len - offset;
3487 * [3] 10.5.2.17 IAR Rest Octets
3490 static guint16
3491 de_rr_iar_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3493 guint32 curr_bit_offset;
3494 guint8 i;
3495 guint8 tvb_len = tvb_length(tvb);
3497 curr_bit_offset = offset<<3;
3499 for( i=0; i<4; i++ )
3501 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Extended RA", "Present", "Not Present"))
3503 proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, 1, "Extended RA %d present", i);
3504 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_extended_ra, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
3505 curr_bit_offset += 5;
3507 else
3509 proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, 1, "Extended RA %d not present", i);
3512 gsm_rr_csn_padding_bits(subtree, tvb, curr_bit_offset, tvb_len);
3513 return tvb_len - offset;
3517 * [3] 10.5.2.18 IAX Rest Octets
3519 static guint16
3520 de_rr_iax_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3522 guint32 curr_bit_offset;
3523 guint8 tvb_len = tvb_length(tvb);
3525 curr_bit_offset = offset<<3;
3527 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "A compressed version of the INTER RAT HANDOVER INFO message", "shall be used", "shall not be used");
3529 gsm_rr_csn_padding_bits(subtree, tvb, curr_bit_offset, tvb_len);
3530 return tvb_len - offset;
3534 * [3] 10.5.2.19 L2 Pseudo Length
3536 static guint16
3537 de_rr_l2_pseudo_len(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3539 guint32 curr_offset;
3541 curr_offset = offset;
3543 /* L2 Pseudo Length value */
3544 proto_tree_add_item(subtree, hf_gsm_a_rr_L2_pseudo_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3546 curr_offset = curr_offset + 1;
3548 return(curr_offset - offset);
3552 * [3] 10.5.2.20 Measurement Results
3554 static const true_false_string gsm_a_rr_dtx_vals = {
3555 "DTX was used",
3556 "DTX was not used"
3560 static const true_false_string gsm_a_rr_mv_vals = {
3561 "The measurement results are not valid",
3562 "The measurement results are valid"
3565 static const value_string gsm_a_rr_rxqual_vals [] = {
3566 {0, "BER < 0.2%, Mean value 0.14%"},
3567 {1, "0.2% <= BER < 0.4%, Mean value 0.28%"},
3568 {2, "0.4% <= BER < 0.8%, Mean value 0.57%"},
3569 {3, "0.8% <= BER < 1.6%, Mean value 1.13%"},
3570 {4, "1.6% <= BER < 3.2%, Mean value 2.26%"},
3571 {5, "3.2% <= BER < 6.4%, Mean value 4.53%"},
3572 {6, "6.4% <= BER < 12.8%, Mean value 9.05%"},
3573 {7, "BER > 12.8%, Mean value 18.10%"},
3574 {0, NULL}
3577 static const value_string gsm_a_rr_ncell_vals [] = {
3578 {0, "No neighbour cell measurement result"},
3579 {1, "1 neighbour cell measurement result"},
3580 {2, "2 neighbour cell measurement result"},
3581 {3, "3 neighbour cell measurement result"},
3582 {4, "4 neighbour cell measurement result"},
3583 {5, "5 neighbour cell measurement result"},
3584 {6, "6 neighbour cell measurement result"},
3585 {7, "Neighbour cell information not available for serving cell"},
3586 {0, NULL}
3589 guint16
3590 de_rr_meas_res(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3592 guint32 curr_offset;
3593 gint bit_offset;
3594 guint64 no_ncell_m;
3596 curr_offset = offset;
3598 /* 2nd octet */
3599 /* BA-USED */
3600 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ba_used, tvb, curr_offset<<3, 1, ENC_BIG_ENDIAN);
3601 /* DTX USED */
3602 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dtx_used, tvb, (curr_offset<<3)+1, 1, ENC_BIG_ENDIAN);
3603 /* RXLEV-FULL-SERVING-CELL */
3604 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_full_serv_cell, tvb, (curr_offset<<3)+2, 6, ENC_BIG_ENDIAN);
3605 curr_offset++;
3607 /* 3rd octet */
3608 /* 3G-BA-USED */
3609 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ba_used, tvb, curr_offset<<3, 1, ENC_BIG_ENDIAN);
3610 /* MEAS-VALID */
3611 proto_tree_add_item(subtree, hf_gsm_a_rr_meas_valid, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3612 /* RXLEV-SUB-SERVING-CELL */
3613 proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_sub_serv_cell, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3615 curr_offset++;
3617 /* 4th octet */
3618 /* RXQUAL-FULL-SERVING-CELL */
3619 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxqual_full_serv_cell, tvb, (curr_offset<<3)+1, 3, ENC_BIG_ENDIAN);
3621 /* RXQUAL-SUB-SERVING-CELL */
3622 proto_tree_add_item(subtree, hf_gsm_a_rr_rxqual_sub_serv_cell, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3623 /* NO-NCELL-M */
3624 bit_offset = (curr_offset << 3) + 7;
3625 proto_tree_add_bits_ret_val(subtree, hf_gsm_a_rr_no_ncell_m, tvb, bit_offset, 3, &no_ncell_m, ENC_BIG_ENDIAN);
3626 bit_offset += 3;
3627 if (no_ncell_m == 7) /* No neighbour cell information available) */
3628 no_ncell_m = 0;
3629 while (no_ncell_m)
3631 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_ncell, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3632 bit_offset += 6;
3633 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_freq_ncell, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3634 bit_offset += 5;
3635 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic_ncell, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3636 bit_offset += 6;
3637 no_ncell_m -= 1;
3640 return(len);
3644 * [3] 10.5.2.20a GPRS Measurement Results
3647 * [3] 10.5.2.21 Mobile Allocation
3649 static guint16
3650 de_rr_mob_all(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3652 guint32 curr_offset;
3653 proto_item *item;
3654 gint i, j;
3655 guint8 value;
3657 curr_offset = offset;
3659 item = proto_tree_add_text(tree, tvb, curr_offset, len, "Bitmap of increasing ARFCNs included in the Mobile Allocation: ");
3660 for(i=len; i>0; i--)
3662 value = tvb_get_guint8(tvb,curr_offset+i-1);
3663 for (j=0; j<8; j++)
3665 proto_item_append_text(item,"%d",(value>>j)&0x01);
3669 curr_offset = curr_offset + len;
3670 return(curr_offset - offset);
3674 * [3] 10.5.2.21a Mobile Time Difference
3676 static guint16
3677 de_rr_mob_time_diff(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3679 guint32 curr_offset;
3681 curr_offset = offset;
3683 proto_tree_add_item(tree, hf_gsm_a_rr_mobile_time_difference, tvb, curr_offset, len, ENC_BIG_ENDIAN);
3685 curr_offset = curr_offset + len;
3686 return(curr_offset - offset);
3690 * [3] 10.5.2.21aa MultiRate configuration
3692 /* Multirate speech version Octet 3 Bits 8 7 6 */
3693 static const value_string multirate_speech_ver_vals[] = {
3694 { 1, "Adaptive Multirate speech version 1"},
3695 { 2, "Adaptive Multirate speech version 2"},
3696 { 0, NULL }
3698 /* Bit 5 NSCB: Noise Suppression Control Bit */
3699 static const value_string NSCB_vals[] = {
3700 { 0, "Noise Suppression can be used (default)"},
3701 { 1, "Noise Suppression shall be turned off"},
3702 { 0, NULL }
3704 /* Bit 4 ICMI: Initial Codec Mode Indicator */
3705 static const value_string ICMI_vals[] = {
3706 { 0, "The initial codec mode is defined by the implicit rule provided in 3GPP TS 05.09"},
3707 { 1, "The initial codec mode is defined by the Start Mode field"},
3708 { 0, NULL }
3711 Table 10.5.2.21aa.2: Set of adaptive multirate codec modes field (octet 4)
3712 for the Multirate speech version 1
3714 static const true_false_string gsm_a_rr_set_of_amr_codec_modes = {
3715 "is part of the subset",
3716 "is not part of the subset"
3719 static const value_string gsm_a_rr_amr_threshold_vals[] = {
3720 { 0, "0.0 dB"},
3721 { 1, "0.5 dB"},
3722 { 2, "1.0 dB"},
3723 { 3, "1.5 dB"},
3724 { 4, "2.0 dB"},
3725 { 5, "2.5 dB"},
3726 { 6, "3.0 dB"},
3727 { 7, "3.5 dB"},
3728 { 8, "4.0 dB"},
3729 { 9, "4.5 dB"},
3730 { 10, "5.0 dB"},
3731 { 11, "5.5 dB"},
3732 { 12, "6.0 dB"},
3733 { 13, "6.5 dB"},
3734 { 14, "7.0 dB"},
3735 { 15, "7.5 dB"},
3736 { 16, "8.0 dB"},
3737 { 17, "8.5 dB"},
3738 { 18, "9.0 dB"},
3739 { 19, "9.5 dB"},
3740 { 20, "10.0 dB"},
3741 { 21, "10.5 dB"},
3742 { 22, "11.0 dB"},
3743 { 23, "11.5 dB"},
3744 { 24, "12.0 dB"},
3745 { 25, "12.5 dB"},
3746 { 26, "13.0 dB"},
3747 { 27, "13.5 dB"},
3748 { 28, "14.0 dB"},
3749 { 29, "14.5 dB"},
3750 { 30, "15.0 dB"},
3751 { 31, "15.5 dB"},
3752 { 32, "16.0 dB"},
3753 { 33, "16.5 dB"},
3754 { 34, "17.0 dB"},
3755 { 35, "17.5 dB"},
3756 { 36, "18.0 dB"},
3757 { 37, "18.5 dB"},
3758 { 38, "19.0 dB"},
3759 { 39, "19.5 dB"},
3760 { 40, "20.0 dB"},
3761 { 41, "20.5 dB"},
3762 { 42, "21.0 dB"},
3763 { 43, "21.5 dB"},
3764 { 44, "22.0 dB"},
3765 { 45, "22.5 dB"},
3766 { 46, "23.0 dB"},
3767 { 47, "23.5 dB"},
3768 { 48, "24.0 dB"},
3769 { 49, "24.5 dB"},
3770 { 50, "25.0 dB"},
3771 { 51, "25.5 dB"},
3772 { 52, "26.0 dB"},
3773 { 53, "26.5 dB"},
3774 { 54, "27.0 dB"},
3775 { 55, "27.5 dB"},
3776 { 56, "28.0 dB"},
3777 { 57, "28.5 dB"},
3778 { 58, "29.0 dB"},
3779 { 59, "29.5 dB"},
3780 { 60, "30.0 dB"},
3781 { 61, "30.5 dB"},
3782 { 62, "31.0 dB"},
3783 { 63, "31.5 dB"},
3784 { 0, NULL }
3787 static value_string_ext gsm_a_rr_amr_threshold_vals_ext = VALUE_STRING_EXT_INIT(gsm_a_rr_amr_threshold_vals);
3789 static const value_string gsm_a_rr_amr_hysteresis_vals[] = {
3790 { 0, "0.0 dB"},
3791 { 1, "0.5 dB"},
3792 { 2, "1.0 dB"},
3793 { 3, "1.5 dB"},
3794 { 4, "2.0 dB"},
3795 { 5, "2.5 dB"},
3796 { 6, "3.0 dB"},
3797 { 7, "3.5 dB"},
3798 { 8, "4.0 dB"},
3799 { 9, "4.5 dB"},
3800 { 10, "5.0 dB"},
3801 { 11, "5.5 dB"},
3802 { 12, "6.0 dB"},
3803 { 13, "6.5 dB"},
3804 { 14, "7.0 dB"},
3805 { 15, "7.5 dB"},
3806 { 0, NULL }
3809 guint16
3810 de_rr_multirate_conf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3812 guint32 curr_offset;
3813 guint8 oct;
3814 gint bit_offset, remaining_length, nb_of_params;
3816 curr_offset = offset;
3818 proto_tree_add_item(tree, hf_gsm_a_rr_multirate_speech_ver, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3819 proto_tree_add_item(tree, hf_gsm_a_rr_NCSB, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3820 proto_tree_add_item(tree, hf_gsm_a_rr_ICMI, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3821 /* The initial codec mode is coded as in 3GPP TS 45.009 */
3822 proto_tree_add_item(tree, hf_gsm_a_rr_start_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3823 oct = ( tvb_get_guint8(tvb,curr_offset) &0xe0 ) >> 5;
3824 curr_offset++;
3825 switch ( oct){
3826 case 1:
3827 /* Adaptive Multirate speech version 1 */
3828 /* Set of AMR codec modes */
3829 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3830 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3831 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3832 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3833 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3834 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3835 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3836 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3837 curr_offset++;
3839 remaining_length = len-2;
3840 break;
3841 case 2:
3842 /* Adaptive Multirate speech version 2 */
3843 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3844 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3845 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3846 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3847 proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3848 curr_offset++;
3850 remaining_length = len-2;
3851 break;
3852 default:
3853 proto_tree_add_text(tree,tvb,offset,1,"Unknown version");
3854 proto_tree_add_text(tree,tvb, curr_offset, len-1 ,"Data(Not decoded)");
3855 remaining_length = 0;
3856 break;
3859 if (remaining_length)
3861 bit_offset = (curr_offset<<3) + 2;
3862 nb_of_params = remaining_length - 1;
3863 while (nb_of_params)
3865 proto_tree_add_bits_item(tree, hf_gsm_a_rr_amr_threshold, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3866 bit_offset += 6;
3867 proto_tree_add_bits_item(tree, hf_gsm_a_rr_amr_hysteresis, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3868 bit_offset += 4;
3869 nb_of_params -= 1;
3873 curr_offset = offset + len;
3874 return(curr_offset - offset);
3878 * [3] 10.5.2.21b Multislot Allocation
3880 static guint16
3881 de_rr_mult_all(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3883 proto_item *item;
3884 guint32 curr_offset;
3885 guint8 oct;
3886 guint8 i;
3888 curr_offset = offset;
3890 item = proto_tree_add_text(tree,tvb, curr_offset, 1 ,"List of DA:");
3892 oct = tvb_get_guint8(tvb, curr_offset);
3893 curr_offset++;
3894 for( i=0;i<7;i++ )
3896 if( (oct>>i) & 1 )
3898 proto_item_append_text(item," DA%d",i+1);
3902 if( oct & 0x80 ) /* octet 3a present */
3904 item = proto_tree_add_text(tree,tvb, curr_offset, 1 ,"List of UA:");
3905 oct = tvb_get_guint8(tvb, curr_offset);
3906 curr_offset++;
3907 for( i=0;i<7;i++ )
3909 if( (oct>>i) & 1 )
3911 proto_item_append_text(item," UA%d",i+1);
3916 while ( curr_offset < offset + len )
3918 proto_tree_add_item(tree, hf_gsm_a_rr_ma_channel_set, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3919 curr_offset++;
3922 return(curr_offset - offset);
3926 * [3] 10.5.2.21c NC mode
3930 * [3] 10.5.2.22 Neighbour Cell Description
3932 static const value_string gsm_a_rr_ext_ind_vals[] = {
3933 { 0, "The information element carries the complete BA"},
3934 { 1, "The information element carries only a part of the BA"},
3935 { 0, NULL }
3937 static guint16
3938 de_rr_neigh_cell_desc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3940 guint32 curr_offset;
3942 curr_offset = offset;
3944 proto_tree_add_item(tree, hf_gsm_a_rr_ext_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3945 proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, (curr_offset<<3)+3, 1, ENC_BIG_ENDIAN);
3947 return dissect_arfcn_list(tvb, tree, pinfo, offset, 16, add_string, string_len);
3951 * [3] 10.5.2.22a Neighbour Cell Description 2
3953 static guint16
3954 de_rr_neigh_cell_desc2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3956 guint32 curr_offset;
3958 curr_offset = offset;
3960 proto_tree_add_bits_item(tree, hf_gsm_a_rr_multiband_reporting, tvb, (curr_offset<<3)+1, 2, ENC_BIG_ENDIAN);
3961 proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, (curr_offset<<3)+3, 1, ENC_BIG_ENDIAN);
3963 return dissect_arfcn_list2(tvb, tree, pinfo, offset, 16, add_string, string_len);
3967 * [3] 10.5.2.22b (void)
3968 * [3] 10.5.2.22c NT/N Rest Octets
3972 * [3] 10.5.2.23 P1 Rest Octets
3974 static guint16
3975 de_rr_p1_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3977 proto_item *item2;
3978 guint32 curr_offset, value;
3979 gint bit_offset, bit_offset_sav;
3980 guint8 tvb_len = tvb_length(tvb);
3981 guint16 bit_len = tvb_len << 3;
3983 curr_offset = offset;
3984 bit_offset = curr_offset << 3;
3986 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "NLN(PCH)", "Present", "Not present"))
3988 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3989 bit_offset += 2;
3990 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3991 bit_offset += 1;
3993 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 1", "Present", "Not present"))
3995 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3996 bit_offset += 3;
3997 proto_item_append_text(item2, " for Mobile Identity 1");
3999 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 2", "Present", "Not present"))
4001 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4002 bit_offset += 3;
4003 proto_item_append_text(item2, " for Mobile Identity 2");
4005 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Group Call Information", "Present", "Not present"))
4006 { /* Group Call Information */
4007 bit_offset_sav = bit_offset;
4008 bit_offset += 36;
4009 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Group Channel Description", "Present", "Not Present"))
4010 { /* Group Channel Description */
4011 bit_offset += 24;
4012 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Hopping case", "Present", "Not Present"))
4013 { /* Hopping case */
4014 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "????", "Present", "Not Present"))
4016 bit_offset += 64;
4018 else
4020 value = tvb_get_bits8(tvb,bit_offset,8);
4021 bit_offset += 8 + (value<<3);
4025 proto_tree_add_text(subtree,tvb, bit_offset_sav>>3, (bit_offset-bit_offset_sav)>>3,"Group Call Information: Data(Not decoded)");
4027 gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Packet Page Indication 1", "For GPRS", "For RR connection establishment");
4028 gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Packet Page Indication 2", "For GPRS", "For RR connection establishment");
4030 /* Truncation allowed (see 44.018 section 8.9) */
4032 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
4033 return tvb_len - offset;
4037 * [3] 10.5.2.24 P2 Rest Octets
4039 static guint16
4040 de_rr_p2_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4043 proto_item *item2;
4044 guint32 curr_offset;
4045 gint bit_offset;
4046 guint8 tvb_len = tvb_length(tvb);
4047 guint16 bit_len = tvb_len << 3;
4049 curr_offset = offset;
4050 bit_offset = curr_offset << 3;
4052 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Channel Needed 3", "Present", "Not present"))
4054 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch3, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
4055 bit_offset += 2;
4057 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len ,bit_offset++, "NLN (PCH)", "Present", "Not present"))
4059 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
4060 bit_offset += 2;
4061 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4062 bit_offset += 1;
4064 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 1", "Present", "Not present"))
4066 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4067 bit_offset += 3;
4068 proto_item_append_text(item2, " for Mobile Identity 1");
4070 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 2", "Present", "Not present"))
4072 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4073 bit_offset += 3;
4074 proto_item_append_text(item2, " for Mobile Identity 2");
4076 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 3", "Present", "Not present"))
4078 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4079 bit_offset += 3;
4080 proto_item_append_text(item2, " for Mobile Identity 3");
4082 gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Packet Paging Procedure 1", "For GPRS", "For RR connection establishment");
4083 gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Packet Paging Procedure 2", "For GPRS", "For RR connection establishment");
4084 gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Packet Paging Procedure 3", "For GPRS", "For RR connection establishment");
4087 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Additions in release 6", "Present", "Not present"))
4088 { /* Additions in release 6 */
4089 bit_offset += 1;
4090 proto_tree_add_text(subtree, tvb, bit_offset>>3, -1,"Additions in Release 6: Data(Not decoded)");
4093 /* Truncation allowed (see 44.018 section 8.9 */
4094 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
4095 return tvb_len - offset;
4099 * [3] 10.5.2.25 P3 Rest Octets
4101 static guint16
4102 de_rr_p3_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4104 proto_item *item2;
4105 guint32 curr_offset;
4106 gint bit_offset;
4107 guint8 tvb_len = tvb_length(tvb);
4108 guint16 bit_len = tvb_len << 3;
4110 curr_offset = offset;
4111 bit_offset = curr_offset << 3;
4113 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Channel Needed 3 & 4", "Present", "Not present"))
4115 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch3, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
4116 bit_offset += 2;
4117 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch4, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
4118 bit_offset += 2;
4120 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "NLN (PCH)", "Present", "Not present"))
4122 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
4123 bit_offset += 2;
4124 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4125 bit_offset += 1;
4127 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 1", "Present", "Not present"))
4129 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4130 bit_offset += 3;
4131 proto_item_append_text(item2, " for Mobile Identity 1");
4133 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 2", "Present", "Not present"))
4135 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4136 bit_offset += 3;
4137 proto_item_append_text(item2, " for Mobile Identity 2");
4139 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 3", "Present", "Not present"))
4141 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4142 bit_offset += 3;
4143 proto_item_append_text(item2, " for Mobile Identity 3");
4145 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Priority 4", "Present", "Not present"))
4147 item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4148 bit_offset += 3;
4149 proto_item_append_text(item2, " for Mobile Identity 4");
4152 /* Truncation allowed (see 44.018 section 8.9 */
4153 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
4154 return tvb_len - offset;
4158 * [3] 10.5.2.25a Packet Channel Description C V 3
4160 static guint16
4161 de_rr_packet_ch_desc(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4163 guint32 curr_offset;
4164 guint8 oct8;
4165 guint16 arfcn, hsn, maio;
4166 const gchar *str;
4168 curr_offset = offset;
4170 /* Octet 2 */
4171 oct8 = tvb_get_guint8(tvb, curr_offset);
4172 /* Channel Type */
4173 str = "Spare bits (ignored by receiver)";
4174 other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
4175 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
4176 /* TN */
4177 other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
4178 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
4180 curr_offset +=1;
4182 /* Octet 3 */
4183 oct8 = tvb_get_guint8(tvb, curr_offset);
4184 other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
4185 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
4187 if ((oct8 & 0x10) == 0x10)
4189 /* Hopping sequence */
4190 maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
4191 hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
4192 str = "Yes";
4194 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
4195 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
4196 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
4197 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
4199 else
4201 /* single ARFCN */
4202 arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
4203 str = "No";
4204 other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
4205 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
4206 other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
4207 proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
4208 proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
4211 curr_offset = curr_offset + 2;
4212 return(curr_offset - offset);
4216 * [3] 10.5.2.25b Dedicated mode or TBF
4219 static const value_string gsm_a_rr_dedicated_mode_or_tbf_vals[] = {
4220 { 0, "This message assigns a dedicated mode resource"},
4221 { 1, "This message assigns an uplink TBF or is the second message of two in a two-message assignment of an uplink or downlink TBF"},
4222 { 2, "Not used"},
4223 { 3, "This message assigns a downlink TBF to the mobile station identified in the IA Rest Octets IE"},
4224 { 4, "Not used"},
4225 { 5, "This message is the first message of two in a two-message assignment of an uplink TBF"},
4226 { 6, "Not used"},
4227 { 7, "This message is the first message of two in a two-message assignment of a downlink TBF to the mobile station identified in the IA Rest Octets IE"},
4228 { 0, NULL }
4230 static guint16
4231 de_rr_ded_mod_or_tbf(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4233 guint32 curr_offset;
4235 curr_offset = offset;
4237 proto_tree_add_item(subtree, hf_gsm_a_rr_dedicated_mode_or_tbf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4239 curr_offset += 1;
4241 return(curr_offset - offset);
4244 * [3] 10.5.2.25c RR Packet Uplink Assignment
4246 static guint16
4247 de_rr_pkt_ul_ass(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4249 guint32 curr_offset;
4251 curr_offset = offset;
4253 proto_tree_add_text(subtree, tvb, curr_offset, len, "Not dissected yet");
4255 return len;
4259 * [3] 10.5.2.25d RR Packet Downlink Assignment
4261 static guint16
4262 de_rr_pkt_dl_ass(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4264 guint32 curr_offset;
4266 curr_offset = offset;
4268 proto_tree_add_text(subtree, tvb, curr_offset, len, "Not dissected yet");
4270 return len;
4274 * [3] 10.5.2.25e RR Packet Downlink Assignment Type 2
4276 static guint16
4277 de_rr_pkt_dl_ass_type2(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4279 guint32 curr_offset;
4281 curr_offset = offset;
4283 proto_tree_add_text(subtree, tvb, curr_offset, len, "Not dissected yet");
4285 return len;
4289 * [3] 10.5.2.26 Page Mode
4292 static const value_string gsm_a_rr_page_mode_vals[] = {
4293 { 0, "Normal paging"},
4294 { 1, "Extended paging"},
4295 { 2, "Paging reorganization"},
4296 { 3, "Same as before"},
4297 { 0, NULL }
4299 static guint16
4300 de_rr_page_mode(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4302 guint32 curr_offset;
4304 curr_offset = offset;
4306 proto_tree_add_item(subtree, hf_gsm_a_rr_page_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4308 curr_offset += 1;
4310 return(curr_offset - offset);
4313 * [3] 10.5.2.26a (void)
4314 * [3] 10.5.2.26b (void)
4315 * [3] 10.5.2.26c (void)
4316 * [3] 10.5.2.26d (void)
4319 * [3] 10.5.2.27 NCC Permitted
4321 static guint16
4322 de_rr_ncc_perm(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4324 guint32 curr_offset;
4326 curr_offset = offset;
4328 proto_tree_add_item(subtree, hf_gsm_a_rr_ncc_permitted, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4330 curr_offset = curr_offset + 1;
4332 return(curr_offset - offset);
4335 * [3] 10.5.2.28 Power Command
4338 * ATC (Access Type Control) (octet 2)Bit 8
4339 * 0 Sending of Handover access is mandatory
4340 * 1 Sending of Handover access is optional
4342 static const true_false_string gsm_a_rr_pow_cmd_atc_value = {
4343 "Sending of Handover access is optional",
4344 "Sending of Handover access is mandatory"
4347 * The EPC mode field (octet 2) indicates whether the assigned channel(s)
4348 * shall be in enhanced power control (EPC) mode. It is only valid for channels
4349 * on which EPC may be used. It is coded as follows:
4351 static const true_false_string gsm_a_rr_pow_cmd_epc_value = {
4352 "Channel(s) in EPC mode",
4353 "Channel(s) not in EPC mode"
4356 * FPC_EPC (octet 2)
4357 * The FPC_EPC field (octet 2) has different interpretation depending
4358 * on the channel mode of the assigned channel (s) and the value
4359 * of the EPC mode field.
4360 * If the channel mode is such that fast power control (FPC) may be
4361 * used, the FPC_EPC field indicates whether Fast Measurement
4362 * Reporting and Power Control mechanism is used.
4363 * It is coded as follows:
4364 * Value 0 FPC not in use
4365 * 1 FPC in use
4366 * If the channel mode is such that EPC may be used and the EPC mode
4367 * field indicates that the channel is in EPC mode, the FPC_EPC
4368 * field indicates whether EPC shall be used for uplink power control.
4369 * It is coded as follows:
4370 * Value 0 EPC not in use for uplink power control
4371 * 1 EPC in use for uplink power control
4374 static const true_false_string gsm_a_rr_pow_cmd_fpcepc_value = {
4375 "FPC in use/EPC in use for uplink power control",
4376 "FPC not in use/C not in use for uplink power control"
4380 * Power level (octet 2)The power level field is coded as the binaryRepresentation
4381 * of the "power control level", see 3GPP TS 3GPP TS 45.005. This value shall be used
4382 * by the mobile station According to 3GPP TS 45.008.Range: 0 to 31.
4385 static guint16
4386 de_rr_pow_cmd(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4388 guint32 curr_offset;
4390 curr_offset = offset;
4392 proto_tree_add_item(subtree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4393 /*EPC mode */
4394 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4395 /*FPC_EPC*/
4396 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_fpcepc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4397 /*POWER LEVEL*/
4398 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_powlev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4400 curr_offset = curr_offset + 1;
4402 return(curr_offset - offset);
4406 * [3] 10.5.2.28a Power Command and access type
4408 static guint16
4409 de_rr_pow_cmd_and_acc_type(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4411 guint32 curr_offset;
4413 curr_offset = offset;
4415 /*ATC */
4416 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_atc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4417 /*EPC mode */
4418 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4419 /*FPC_EPC*/
4420 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_fpcepc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4421 /*POWER LEVEL*/
4422 proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_powlev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4424 curr_offset = curr_offset + 1;
4426 return(curr_offset - offset);
4429 * [3] 10.5.2.29 RACH Control Parameters
4432 static const value_string gsm_a_rr_max_retrans_vals[] = {
4433 { 0, "Maximum 1 retransmission"},
4434 { 1, "Maximum 2 retransmissions"},
4435 { 2, "Maximum 4 retransmissions"},
4436 { 3, "Maximum 7 retransmissions"},
4437 { 0, NULL }
4440 static const value_string gsm_a_rr_tx_integer_vals[] = {
4441 { 0, "3 slots used to spread transmission"},
4442 { 1, "4 slots used to spread transmission"},
4443 { 2, "5 slots used to spread transmission"},
4444 { 3, "6 slots used to spread transmission"},
4445 { 4, "7 slots used to spread transmission"},
4446 { 5, "8 slots used to spread transmission"},
4447 { 6, "9 slots used to spread transmission"},
4448 { 7, "10 slots used to spread transmission"},
4449 { 8, "11 slots used to spread transmission"},
4450 { 9, "12 slots used to spread transmission"},
4451 { 10, "14 slots used to spread transmission"},
4452 { 11, "16 slots used to spread transmission"},
4453 { 12, "20 slots used to spread transmission"},
4454 { 13, "25 slots used to spread transmission"},
4455 { 14, "32 slots used to spread transmission"},
4456 { 15, "50 slots used to spread transmission"},
4457 { 0, NULL }
4459 static const value_string gsm_a_rr_cell_barr_access_vals[] = {
4460 { 0, "The cell is not barred"},
4461 { 1, "The cell is barred"},
4462 { 0, NULL }
4464 static const value_string gsm_a_rr_re_vals[] = {
4465 { 0, "Call Reestablishment allowed in the cell"},
4466 { 1, "Call Reestablishment not allowed in the cell"},
4467 { 0, NULL }
4470 static guint16
4471 de_rr_rach_ctrl_param(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4473 guint32 curr_offset;
4475 curr_offset = offset;
4477 proto_tree_add_item(subtree, hf_gsm_a_rr_max_retrans, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4478 proto_tree_add_item(subtree, hf_gsm_a_rr_tx_integer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4479 proto_tree_add_item(subtree, hf_gsm_a_rr_cell_barr_access, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4480 proto_tree_add_item(subtree, hf_gsm_a_rr_re, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4481 curr_offset = curr_offset + 1;
4483 proto_tree_add_item(subtree, hf_gsm_a_rr_acc, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4485 curr_offset = curr_offset + 2;
4487 return(curr_offset - offset);
4490 * [3] 10.5.2.30 Request Reference M V 3
4492 static guint16 reduced_frame_number(guint16 fn)
4494 /* great care needed with signed/unsigned - -1 in unsigned is 0xffff, which mod(26) is not what you think !!! */
4495 gint16 t2, t3, t;
4496 guint16 frame, t1;
4498 t1 = (fn >> 11) & 0x1f;
4499 t2 = (fn >> 0) & 0x1f;
4500 t3 = (fn >> 5) & 0x3f;
4502 t = (t3-t2)%26;
4503 if (t<0)
4504 t += 26;
4506 frame = 51*(unsigned)t+(unsigned)t3+51*26*t1;
4508 return frame;
4511 static guint16
4512 de_rr_req_ref(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4514 proto_item *item;
4515 guint32 curr_offset;
4516 guint16 rfn;
4517 guint16 fn;
4519 curr_offset = offset;
4521 proto_tree_add_item(subtree, hf_gsm_a_rr_ra, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4522 curr_offset++;
4523 fn = tvb_get_ntohs(tvb,curr_offset);
4524 rfn = reduced_frame_number(fn);
4525 proto_tree_add_item(subtree, hf_gsm_a_rr_T1prim, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4526 proto_tree_add_item(subtree, hf_gsm_a_rr_T3, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4527 curr_offset++;
4528 proto_tree_add_item(subtree, hf_gsm_a_rr_T2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4529 curr_offset++;
4530 item = proto_tree_add_uint(subtree, hf_gsm_a_rr_rfn, tvb, curr_offset-2, 2, rfn);
4531 PROTO_ITEM_SET_GENERATED(item);
4533 return(curr_offset - offset);
4536 * [3] 10.5.2.31
4538 guint16
4539 de_rr_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4541 guint32 curr_offset;
4543 curr_offset = offset;
4545 proto_tree_add_item(tree, hf_gsm_a_rr_RR_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4547 curr_offset++;
4549 return(curr_offset - offset);
4553 * [3] 10.5.2.32 SI 1 Rest Octets
4555 static const value_string gsm_a_rr_nch_position_vals[] = {
4556 { 0, "No of blocks = 1 and Number of first block = 0"},
4557 { 1, "No of blocks = 1 and Number of first block = 1"},
4558 { 2, "No of blocks = 1 and Number of first block = 2"},
4559 { 3, "No of blocks = 1 and Number of first block = 3"},
4560 { 4, "No of blocks = 1 and Number of first block = 4"},
4561 { 5, "No of blocks = 1 and Number of first block = 5"},
4562 { 6, "No of blocks = 1 and Number of first block = 6"},
4563 { 7, "No of blocks = 1 and Number of first block = 0"},
4564 { 8, "No of blocks = 2 and Number of first block = 1"},
4565 { 9, "No of blocks = 2 and Number of first block = 2"},
4566 {10, "No of blocks = 2 and Number of first block = 3"},
4567 {11, "No of blocks = 2 and Number of first block = 4"},
4568 {12, "No of blocks = 2 and Number of first block = 5"},
4569 {13, "No of blocks = 3 and Number of first block = 0"},
4570 {14, "No of blocks = 3 and Number of first block = 1"},
4571 {15, "No of blocks = 3 and Number of first block = 2"},
4572 {16, "No of blocks = 3 and Number of first block = 3"},
4573 {17, "No of blocks = 3 and Number of first block = 4"},
4574 {18, "No of blocks = 4 and Number of first block = 0"},
4575 {19, "No of blocks = 4 and Number of first block = 1"},
4576 {20, "No of blocks = 4 and Number of first block = 2"},
4577 {21, "No of blocks = 4 and Number of first block = 3"},
4578 {22, "No of blocks = 5 and Number of first block = 0"},
4579 {23, "No of blocks = 5 and Number of first block = 1"},
4580 {24, "No of blocks = 5 and Number of first block = 2"},
4581 {25, "No of blocks = 6 and Number of first block = 0"},
4582 {26, "No of blocks = 6 and Number of first block = 1"},
4583 {27, "No of blocks = 7 and Number of first block = 0"},
4584 {28, "Reserved"},
4585 {29, "Reserved"},
4586 {30, "Reserved"},
4587 {31, "Reserved"},
4588 { 0, NULL }
4591 static guint16
4592 de_rr_si1_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4594 guint32 curr_offset;
4595 gint bit_offset;
4596 guint8 tvb_len = tvb_length(tvb);
4598 curr_offset = offset;
4599 bit_offset = curr_offset << 3;
4601 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "NCH position", "Present", "Not present"))
4603 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nch_position, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
4604 bit_offset += 5;
4606 gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Band Indicator", "1900", "1800");
4608 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
4609 return tvb_len - offset;
4613 * [3] 10.5.2.33 SI 2bis Rest Octets
4617 * [3] 10.5.2.33a SI 2ter Rest Octets
4619 static const value_string gsm_a_rr_qsearch_x_vals[] = {
4620 { 0, "-98 dBm"},
4621 { 1, "-94 dBm"},
4622 { 2, "-90 dBm"},
4623 { 3, "-86 dBm"},
4624 { 4, "-82 dBm"},
4625 { 5, "-78 dBm"},
4626 { 6, "-74 dBm"},
4627 { 7, "Always"},
4628 { 8, "-78 dBm"},
4629 { 9, "-74 dBm"},
4630 {10, "-70 dBm"},
4631 {11, "-66 dBm"},
4632 {12, "-62 dBm"},
4633 {13, "-58 dBm"},
4634 {14, "-54 dBm"},
4635 {15, "Never"},
4636 { 0, NULL }
4639 static const value_string gsm_a_rr_xdd_qoffset_vals[] = {
4640 { 0, "always select a cell if acceptable"},
4641 { 1, "-28 dB"},
4642 { 2, "-24 dB"},
4643 { 3, "-20 dB"},
4644 { 4, "-16 dB"},
4645 { 5, "-12 dB"},
4646 { 6, "-8 dB"},
4647 { 7, "-4 dB"},
4648 { 8, "0 dB"},
4649 { 9, "4 dB"},
4650 {10, "8 dB"},
4651 {11, "12 dB"},
4652 {12, "16 dB"},
4653 {13, "20 dB"},
4654 {14, "24 dB"},
4655 {15, "28 dB"},
4656 { 0, NULL }
4659 static const value_string gsm_a_rr_fdd_qmin_vals[] = {
4660 { 0, "-20 dB"},
4661 { 1, "-6 dB"},
4662 { 2, "-18 dB"},
4663 { 3, "-8 dB"},
4664 { 4, "-16 dB"},
4665 { 5, "-10 dB"},
4666 { 6, "-14 dB"},
4667 { 7, "-12 dB"},
4668 { 0, NULL }
4671 static const value_string gsm_a_rr_fdd_qmin_offset_vals[] = {
4672 { 0, "0 dB"},
4673 { 1, "2 dB"},
4674 { 2, "4 dB"},
4675 { 3, "6 dB"},
4676 { 4, "8 dB"},
4677 { 5, "10 dB"},
4678 { 6, "12 dB"},
4679 { 7, "14 dB"},
4680 { 0, NULL }
4683 static const value_string gsm_a_rr_fdd_rscpmin_vals[] = {
4684 { 0, "-114 dBm"},
4685 { 1, "-112 dBm"},
4686 { 2, "-110 dBm"},
4687 { 3, "-108 dBm"},
4688 { 4, "-106 dBm"},
4689 { 5, "-104 dBm"},
4690 { 6, "-102 dBm"},
4691 { 7, "-100 dBm"},
4692 { 8, "-98 dBm"},
4693 { 9, "-96 dBm"},
4694 {10, "-94 dBm"},
4695 {11, "-92 dBm"},
4696 {12, "-90 dBm"},
4697 {13, "-88 dBm"},
4698 {14, "-86 dBm"},
4699 {15, "-84 dBm"},
4700 { 0, NULL }
4703 static guint16
4704 de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4706 proto_tree *subtree2;
4707 proto_item *item2;
4708 guint32 curr_offset;
4709 gint bit_offset, bit_offset_sav;
4710 guint8 tvb_len = tvb_length(tvb);
4711 guint16 bit_len = tvb_len << 3;
4713 curr_offset = offset;
4714 bit_offset = curr_offset<<3;
4716 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "MP Changemark", "Present", "Not present"))
4718 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_mp_change_mark, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4719 bit_offset += 1;
4720 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_3g_change_mark, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4721 bit_offset += 1;
4722 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_index, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4723 bit_offset += 3;
4724 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_count, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4725 bit_offset += 3;
4726 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "UTRAN FDD Description", "Present", "Not Present"))
4727 { /* UTRAN FDD Description */
4728 bit_offset_sav = bit_offset;
4729 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
4730 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
4731 gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version");
4732 gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Current version", "Earlier version");
4733 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN);
4734 bit_offset += 14;
4735 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bandwidth FDD", "Present", "Not Present"))
4737 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4738 bit_offset += 3;
4740 proto_item_set_len(item2,(bit_offset>>3) - (bit_offset_sav>>3)+1);
4742 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "UTRAN TDD Description", "Present", "Not Present"))
4743 { /* UTRAN TDD Description */
4744 bit_offset_sav = bit_offset;
4745 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
4746 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
4747 gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version");
4748 gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Current version", "Earlier version");
4749 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN);
4750 bit_offset += 14;
4751 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bandwidth TDD", "Present", "Not Present"))
4753 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4754 bit_offset += 3;
4756 proto_item_set_len(item2,(bit_offset>>3) - (bit_offset_sav>>3)+1);
4758 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Measurement Parameters Description", "Present", "Not Present"))
4759 { /* 3G Measurement Parameters Description */
4760 bit_offset_sav = bit_offset;
4761 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr);
4762 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]);
4763 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_i, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
4764 bit_offset += 4;
4765 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "FDD Parameters", "Present", "Not Present"))
4767 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qoffset, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
4768 bit_offset += 4;
4769 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4770 bit_offset += 3;
4772 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "TDD Parameters", "Present", "Not Present"))
4774 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_qoffset, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
4775 bit_offset += 4;
4777 proto_item_set_len(item2,(bit_offset>>3) - (bit_offset_sav>>3)+1);
4779 /* Null breakpoint */
4780 if (bit_len - bit_offset > 0)
4782 /* There is still room left in the Rest Octets IE */
4783 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-5", "Present", "Not present"))
4784 { /* Additions in release R5 */
4785 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Additional Measurement Parameters Description", "Present", "Not Present"))
4786 { /* 3G Additional Measurement Parameters Description */
4787 bit_offset_sav = bit_offset;
4788 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr);
4789 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC]);
4790 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4791 bit_offset += 3;
4792 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rscpmin, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
4793 bit_offset += 4;
4794 proto_item_set_len(item2,(bit_offset>>3) - (bit_offset_sav>>3)+1);
4799 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
4800 return tvb_len - offset;
4804 * [3] 10.5.2.33b SI 2quater Rest Octets
4806 static const true_false_string gsm_a_rr_gsm_report_type_value = {
4807 "The MS shall use the Measurement Report message for reporting",
4808 "The MS shall use the Enhanced Measurement Report message for reporting if at least one BSIC is allocated to each BA (list) frequency. Otherwise, the Measurement Report message shall be used"
4811 static const true_false_string gsm_a_rr_frequency_scrolling_value = {
4812 "Next BSIC in the structure relates to the subsequent frequency in the BA(list)",
4813 "Next BSIC in the structure relates to the same frequency in the BA(list)"
4816 static const true_false_string gsm_a_rr_rep_priority_value = {
4817 "High reporting priority",
4818 "Normal reporting priority"
4821 static const true_false_string gsm_a_rr_report_type_value = {
4822 "The MS shall use the PACKET MEASUREMENT REPORT message for reporting",
4823 "The MS shall use the PACKET ENHANCED MEASUREMENT REPORT message for reporting"
4826 static const true_false_string gsm_a_rr_reporting_rate_value = {
4827 "Reduced reporting rate allowed",
4828 "Normal reporting rate"
4831 static const true_false_string gsm_a_rr_invalid_bsic_reporting_value = {
4832 "Report on cells with invalid BSIC and allowed NCC part of BSIC is allowed",
4833 "Report on cells with invalid BSIC and allowed NCC part of BSIC is not allowed"
4836 static const value_string gsm_a_rr_scale_ord_vals[] = {
4837 { 0, "An offset of 0 dB shall be used for the reported RXLEV values"},
4838 { 1, "An offset of 10 dB shall be used for the reported RXLEV values"},
4839 { 2, "An automatic offset shall be used for the reported RXLEV values"},
4840 { 0, NULL }
4843 static const value_string gsm_a_rr_xxx_reporting_offset_vals[] = {
4844 { 0, "Apply an offset of 0 dB to the reported value when prioritising the cells for reporting"},
4845 { 1, "Apply an offset of 6 dB to the reported value when prioritising the cells for reporting"},
4846 { 2, "Apply an offset of 12 dB to the reported value when prioritising the cells for reporting"},
4847 { 3, "Apply an offset of 18 dB to the reported value when prioritising the cells for reporting"},
4848 { 4, "Apply an offset of 24 dB to the reported value when prioritising the cells for reporting"},
4849 { 5, "Apply an offset of 30 dB to the reported value when prioritising the cells for reporting"},
4850 { 6, "Apply an offset of 36 dB to the reported value when prioritising the cells for reporting"},
4851 { 7, "Apply an offset of 42 dB to the reported value when prioritising the cells for reporting"},
4852 { 0, NULL }
4855 /* The TS 45.008 is not that clear, but it should be understood: threshold = minimum reported value + 6 * resolution
4856 * The minimum reported value, resolution is, for the different access technologies:
4857 * GSM: -111 dBm, 1 dBm
4858 * WCDMA/RSCP: -116 dBm, 1 dBm
4859 * WCDMA/EcN0: -24.5 dB, 0.5 dB
4860 * LTE/RSRP: -140 dBm, 1 dB
4861 * LTE/RSRQ: -19.5 dB, 0.5 dB
4863 static const value_string gsm_a_rr_gsm_reporting_threshold_vals[] = {
4864 { 0, "Apply priority reporting if the reported value is above -111 dBm"},
4865 { 1, "Apply priority reporting if the reported value is above -105 dBm"},
4866 { 2, "Apply priority reporting if the reported value is above -99 dBm"},
4867 { 3, "Apply priority reporting if the reported value is above -93 dBm"},
4868 { 4, "Apply priority reporting if the reported value is above -87 dBm"},
4869 { 5, "Apply priority reporting if the reported value is above -81 dBm"},
4870 { 6, "Apply priority reporting if the reported value is above -75 dBm"},
4871 { 7, "Never apply priority reporting"},
4872 { 0, NULL }
4875 static const value_string gsm_a_rr_wcdma_rscp_reporting_threshold_vals[] = {
4876 { 0, "Apply priority reporting if the reported value is above -116 dBm"},
4877 { 1, "Apply priority reporting if the reported value is above -110 dBm"},
4878 { 2, "Apply priority reporting if the reported value is above -104 dBm"},
4879 { 3, "Apply priority reporting if the reported value is above -98 dBm"},
4880 { 4, "Apply priority reporting if the reported value is above -92 dBm"},
4881 { 5, "Apply priority reporting if the reported value is above -86 dBm"},
4882 { 6, "Apply priority reporting if the reported value is above -80 dBm"},
4883 { 7, "Never apply priority reporting"},
4884 { 0, NULL }
4887 static const value_string gsm_a_rr_wcdma_ecn0_reporting_threshold_vals[] = {
4888 { 0, "Apply priority reporting if the reported value is above -24.5 dB"},
4889 { 1, "Apply priority reporting if the reported value is above -21.5 dB"},
4890 { 2, "Apply priority reporting if the reported value is above -17.5 dB"},
4891 { 3, "Apply priority reporting if the reported value is above -14.5 dB"},
4892 { 4, "Apply priority reporting if the reported value is above -11.5 dB"},
4893 { 5, "Apply priority reporting if the reported value is above -8.5 dB"},
4894 { 6, "Apply priority reporting if the reported value is above -5.5 dB"},
4895 { 7, "Never apply priority reporting"},
4896 { 0, NULL }
4899 static const value_string gsm_a_rr_lte_rsrp_reporting_threshold_vals[] = {
4900 { 0, "Apply priority reporting if the reported value is above -140 dBm"},
4901 { 1, "Apply priority reporting if the reported value is above -134 dBm"},
4902 { 2, "Apply priority reporting if the reported value is above -128 dBm"},
4903 { 3, "Apply priority reporting if the reported value is above -122 dBm"},
4904 { 4, "Apply priority reporting if the reported value is above -116 dBm"},
4905 { 5, "Apply priority reporting if the reported value is above -110 dBm"},
4906 { 6, "Apply priority reporting if the reported value is above -104 dBm"},
4907 { 7, "Never apply priority reporting"},
4908 { 0, NULL }
4911 static const value_string gsm_a_rr_lte_rsrq_reporting_threshold_vals[] = {
4912 { 0, "Apply priority reporting if the reported value is above -19.5 dB"},
4913 { 1, "Apply priority reporting if the reported value is above -16.5 dB"},
4914 { 2, "Apply priority reporting if the reported value is above -13.5 dB"},
4915 { 3, "Apply priority reporting if the reported value is above -10.5 dB"},
4916 { 4, "Apply priority reporting if the reported value is above -7.5 dB"},
4917 { 5, "Apply priority reporting if the reported value is above -4.5 dB"},
4918 { 6, "Apply priority reporting if the reported value is above -1.5 dB"},
4919 { 7, "Never apply priority reporting"},
4920 { 0, NULL }
4923 static const value_string gsm_a_rr_network_control_order_vals[] = {
4924 { 0, "NC0"},
4925 { 1, "NC1"},
4926 { 2, "NC2"},
4927 { 3, "NC0"},
4928 { 0, NULL }
4931 static const value_string gsm_a_rr_nc_non_drx_period_vals[] = {
4932 { 0, "No non-DRX mode after a measurement report has been sent"},
4933 { 1, "0,24 s"},
4934 { 2, "0,48 s"},
4935 { 3, "0.72 s"},
4936 { 4, "0.96 s"},
4937 { 5, "1.20 s"},
4938 { 6, "1.44 s"},
4939 { 7, "1.92 s"},
4940 { 0, NULL }
4943 static const value_string gsm_a_rr_nc_reporting_period_x_vals[] = {
4944 { 0, "0.48 s"},
4945 { 1, "0.96 s"},
4946 { 2, "1.92 s"},
4947 { 3, "3.84 s"},
4948 { 4, "7.68 s"},
4949 { 5, "15.36 s"},
4950 { 6, "30.72 s"},
4951 { 7, "61.44 s"},
4952 { 0, NULL }
4955 static const true_false_string gsm_a_rr_qsearch_c_initial_value = {
4956 "Always",
4957 "use Qsearch I"
4960 static const true_false_string gsm_a_rr_fdd_rep_quant_value = {
4961 "Ec/No",
4962 "RSCP"
4965 static const true_false_string gsm_a_rr_3g_search_prio_value = {
4966 "3G cells may be searched when BSIC decoding is required",
4967 "3G cells may not be searched when BSIC decoding is required"
4970 static const true_false_string gsm_a_rr_3g_ccn_active_value = {
4971 "CCN towards 3G cells is enabled in the cell",
4972 "CCN towards 3G cells is disabled in the cell"
4975 static gint
4976 de_rr_si2quater_meas_info_utran_fdd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
4978 proto_tree *subtree, *subtree2;
4979 proto_item *item, *item2;
4980 gint curr_bit_offset, idx;
4981 gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
4983 curr_bit_offset = bit_offset;
4985 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);
4986 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
4987 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bandwidth FDD", "Present", "Not Present"))
4989 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
4990 curr_bit_offset += 3;
4992 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UMTS FDD Neighbour Cells", "Present", "Not Present"))
4994 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version");
4995 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_uarfcn, tvb, curr_bit_offset, 14, ENC_BIG_ENDIAN);
4996 curr_bit_offset += 14;
4997 xdd_indic0 = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "the FDD_CELL_INFORMATION parameter value '0000000000' ", "is a member of the set", "is not a member of the set");
4998 idx = tvb_get_bits8(tvb,curr_bit_offset,5);
4999 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Nr of FDD Cells : %d", idx);
5000 curr_bit_offset += 5;
5001 idx = convert_n_to_p[idx];
5002 item2 = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
5003 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]);
5004 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
5005 if (xdd_indic0)
5007 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Scrambling Code: %d", 0);
5008 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity: %d", 0);
5010 if (idx)
5012 wsize = 10;
5013 nwi = 1;
5014 jwi = 0;
5015 i = 1;
5017 while (idx > 0)
5019 w[i] = tvb_get_bits(tvb, curr_bit_offset, wsize, ENC_BIG_ENDIAN);
5020 curr_bit_offset += wsize;
5021 idx -= wsize;
5022 if (w[i] == 0)
5024 idx = 0;
5025 break;
5027 if (++jwi == nwi)
5029 jwi = 0;
5030 nwi <<= 1;
5031 wsize--;
5033 i++;
5035 if (idx < 0)
5037 curr_bit_offset += idx;
5039 iused = i-1;
5041 for (i=1; i <= iused; i++)
5043 xdd_cell_info = f_k(i, w, 1024);
5044 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Scrambling Code: %d", xdd_cell_info & 0x01FF);
5045 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity: %d", (xdd_cell_info >> 9) & 0x01);
5049 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5051 return (curr_bit_offset - bit_offset);
5054 static gint
5055 de_rr_si2quater_meas_info_utran_tdd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5057 proto_tree *subtree, *subtree2;
5058 proto_item *item, *item2;
5059 gint curr_bit_offset, idx;
5060 gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
5062 curr_bit_offset = bit_offset;
5064 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);
5065 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
5066 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bandwidth TDD", "Present", "Not Present"))
5068 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5069 curr_bit_offset += 3;
5071 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UMTS TDD Neighbour Cells", "Present", "Not Present"))
5073 gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version");
5074 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_uarfcn, tvb, curr_bit_offset, 14, ENC_BIG_ENDIAN);
5075 curr_bit_offset += 14;
5076 xdd_indic0 = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "the FDD_CELL_INFORMATION parameter value '0000000000' ", "is a member of the set", "is not a member of the set");
5077 idx = tvb_get_bits8(tvb,curr_bit_offset,5);
5078 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
5079 curr_bit_offset += 5;
5080 idx = convert_n_to_q[idx];
5081 item2 = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
5082 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
5083 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
5084 if (xdd_indic0)
5086 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Cell Parameter: %d", 0);
5087 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Sync Case TSTD: %d", 0);
5088 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity TDD: %d", 0);
5090 if (idx)
5092 wsize = 9;
5093 nwi = 1;
5094 jwi = 0;
5095 i = 1;
5097 while (idx > 0)
5099 w[i] = tvb_get_bits(tvb, curr_bit_offset, wsize, ENC_BIG_ENDIAN);
5100 curr_bit_offset += wsize;
5101 idx -= wsize;
5102 if (w[i] == 0)
5104 idx = 0;
5105 break;
5107 if (++jwi == nwi)
5109 jwi = 0;
5110 nwi <<= 1;
5111 wsize--;
5113 i++;
5115 if (idx < 0)
5117 curr_bit_offset += idx;
5119 iused = i-1;
5121 for (i=1; i <= iused; i++)
5123 xdd_cell_info = f_k(i, w, 512);
5124 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Cell Parameter: %d", xdd_cell_info & 0x07F);
5125 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Sync Case TSTD: %d", (xdd_cell_info >> 7) & 0x01);
5126 proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity TDD: %d", (xdd_cell_info >> 8) & 0x01);
5130 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5132 return (curr_bit_offset - bit_offset);
5135 static gint
5136 de_rr_rtd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
5138 proto_tree *subtree;
5139 proto_item *item;
5140 gint curr_bit_offset, idx;
5141 guint8 value;
5143 curr_bit_offset = bit_offset;
5145 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
5146 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
5147 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RTD6", "Present", "Not Present"))
5149 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BA Index Start RTD", "Present", "Not Present"))
5151 idx = tvb_get_bits8(tvb,curr_bit_offset,5);
5152 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start RTD: %d", idx);
5153 curr_bit_offset += 5;
5155 else
5156 idx = 0;
5158 value = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RTD", "Not Present", "Present");
5159 while (value == 0)
5160 { /* all the RTDs on the first frequency */
5161 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "RTD index %d: %d TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits8(tvb,curr_bit_offset,6));
5162 curr_bit_offset += 6;
5163 value = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "additional RTD", "Not Present", "Present");
5166 value = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "additional RTD struct", "Not Present", "Present");
5167 while(value == 0)
5168 { /* all other frequencies */
5169 idx += 1;
5170 value = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RTD", "Not Present", "Present");
5171 while (value == 0)
5172 { /* all the RTDs on the first frequency */
5173 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "RTD index %d: %d TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits8(tvb,curr_bit_offset,6));
5174 curr_bit_offset += 6;
5175 value = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "additional RTD", "Not Present", "Present");
5177 value = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "additional RTD struct", "Not Present", "Present");
5180 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RTD12", "Present", "Not Present"))
5182 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RTD12", "Present", "Not Present"))
5184 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BA Index Start RTD", "Present", "Not Present"))
5186 idx = tvb_get_bits8(tvb,curr_bit_offset,5);
5187 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start RTD: %d", idx);
5188 curr_bit_offset += 5;
5190 else
5191 idx = 0;
5193 while (0 == gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated RTD", "Not Present", "Present"))
5194 { /* all the RTDs on the first frequency */
5195 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 2, "RTD index %d: %d/64 TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits16(tvb,curr_bit_offset,12,ENC_BIG_ENDIAN));
5196 curr_bit_offset += 12;
5199 while(0 == gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated RTD Frequency", "Not Present", "Present"))
5200 { /* all other frequencies */
5201 idx += 1;
5202 while (0 == gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated RTD", "Not Present", "Present"))
5203 { /* all the RTDs on the first frequency */
5204 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 2, "RTD index %d: %d/64 TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits16(tvb,curr_bit_offset,12,ENC_BIG_ENDIAN));
5205 curr_bit_offset += 12;
5210 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5212 return (curr_bit_offset - bit_offset);
5215 static gint
5216 de_rr_bsic_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
5218 proto_tree *subtree;
5219 proto_item *item;
5220 gint curr_bit_offset, idx;
5222 curr_bit_offset = bit_offset;
5223 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
5224 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
5225 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BA Index Start BSIC", "Present", "Not Present"))
5227 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start BSIC: %d", tvb_get_bits8(tvb,curr_bit_offset,5));
5228 curr_bit_offset += 5;
5230 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5231 curr_bit_offset += 6;
5232 idx = tvb_get_bits8(tvb,curr_bit_offset,7);
5233 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Number Remaining BSIC: %d", idx);
5234 curr_bit_offset += 7;
5235 while (idx)
5237 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_frequency_scrolling, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5238 curr_bit_offset += 1;
5239 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5240 curr_bit_offset += 6;
5241 idx -= 1;
5243 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5245 return(curr_bit_offset - bit_offset);
5248 static gint
5249 de_rr_report_priority_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
5251 proto_tree *subtree;
5252 proto_item *item;
5253 gint curr_bit_offset, idx;
5255 curr_bit_offset = bit_offset;
5257 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
5258 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
5259 idx = tvb_get_bits8(tvb,curr_bit_offset,7);
5260 proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Number Cells: %d", idx);
5261 curr_bit_offset += 7;
5262 while (idx)
5264 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rep_priority, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5265 curr_bit_offset += 1;
5266 idx -= 1;
5268 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5270 return(curr_bit_offset - bit_offset);
5273 static gint
5274 de_rr_meas_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
5276 proto_tree *subtree;
5277 proto_item *item;
5278 gint curr_bit_offset;
5280 curr_bit_offset = bit_offset;
5281 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
5282 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
5283 if (id == DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC)
5285 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_report_type, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5286 curr_bit_offset += 1;
5287 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reporting_rate, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5288 curr_bit_offset +=1;
5289 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_invalid_bsic_reporting, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5290 curr_bit_offset +=1;
5292 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Multiband Reporting", "Present", "Not Present"))
5294 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_multiband_reporting, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
5295 curr_bit_offset += 2;
5297 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Serving Reporting", "Present", "Not Present"))
5299 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_serving_band_reporting, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
5300 curr_bit_offset += 2;
5302 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_scale_ord, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
5303 curr_bit_offset += 2;
5304 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "900 Reporting", "Present", "Not Present"))
5306 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_900_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5307 curr_bit_offset += 3;
5308 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_900_reporting_threshold, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5309 curr_bit_offset += 3;
5311 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "1800 Reporting", "Present", "Not Present"))
5313 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1800_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5314 curr_bit_offset += 3;
5315 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1800_reporting_threshold, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5316 curr_bit_offset += 3;
5318 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "400 Reporting", "Present", "Not Present"))
5320 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_400_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5321 curr_bit_offset += 3;
5322 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_400_reporting_threshold, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5323 curr_bit_offset += 3;
5325 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "1900 Reporting", "Present", "Not Present"))
5327 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1900_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5328 curr_bit_offset += 3;
5329 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1900_reporting_threshold, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5330 curr_bit_offset += 3;
5332 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "850 Reporting", "Present", "Not Present"))
5334 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_850_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5335 curr_bit_offset += 3;
5336 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_850_reporting_threshold, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5337 curr_bit_offset += 3;
5339 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5341 return(curr_bit_offset - bit_offset);
5344 static gint
5345 de_rr_3g_add_meas_param_desc2(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5347 proto_tree *subtree;
5348 proto_item *item;
5349 gint curr_bit_offset;
5351 curr_bit_offset = bit_offset;
5352 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2].strptr);
5353 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2]);
5354 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "FDD Reporting Threshold2", "Present", "Not Present"))
5356 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5357 curr_bit_offset += 6;
5359 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5361 return(curr_bit_offset - bit_offset);
5364 /* Additions in Rel-8 */
5365 static const true_false_string priority_utran_start = {
5366 "This is the first instance of the message",
5367 "This is not the first instance of the message"
5370 static const true_false_string priority_utran_stop = {
5371 "This is the last instance of the message",
5372 "This is not the last instance of the message"
5375 static const true_false_string eutran_ccn_active = {
5376 "CCN towards E-UTRAN cells is enabled in the cell",
5377 "The broadcast E-UTRAN_CCN_ACTIVE parameter shall apply if applicable. Otherwise, CCN towards E-UTRAN cells is disabled in the cell"
5380 #if 0
5381 static const true_false_string eutran_rep_quant = {
5382 "RSRQ",
5383 "RSRP"
5385 #endif
5387 static const value_string gsm_a_rr_pcid_psc_pattern_length[] = {
5388 { 0, "1"},
5389 { 1, "2"},
5390 { 2, "3"},
5391 { 3, "4"},
5392 { 4, "5"},
5393 { 5, "6"},
5394 { 6, "7"},
5395 { 7, "8"},
5396 { 0, NULL }
5399 static const value_string gsm_a_rr_eutran_measurement_bandwidth[] = {
5400 { 0, "NRB = 6"},
5401 { 1, "NRB = 15"},
5402 { 2, "NRB = 25"},
5403 { 3, "NRB = 50"},
5404 { 4, "NRB = 75"},
5405 { 5, "NRB = 100"},
5406 { 6, "Reserved for future use"},
5407 { 7, "Reserved for future use"},
5408 { 0, NULL }
5411 static const value_string gsm_a_rr_serving_cell_thresh_gsm_low[] = {
5412 { 0, "0 dB"},
5413 { 1, "2 dB"},
5414 { 2, "4 dB"},
5415 { 3, "6 dB"},
5416 { 4, "8 dB"},
5417 { 5, "10 dB"},
5418 { 6, "12 dB"},
5419 { 7, "14 dB"},
5420 { 8, "16 dB"},
5421 { 9, "18 dB"},
5422 {10, "20 dB"},
5423 {11, "22 dB"},
5424 {12, "24 dB"},
5425 {13, "26 dB"},
5426 {14, "28 dB"},
5427 {15, "Always allowed"},
5428 { 0, NULL }
5431 static const value_string gsm_a_rr_serving_cell_thresh_priority_search[] = {
5432 { 0, "-98 dBm"},
5433 { 1, "-95 dBm"},
5434 { 2, "-92 dBm"},
5435 { 3, "-89 dBm"},
5436 { 4, "-86 dBm"},
5437 { 5, "-83 dBm"},
5438 { 6, "-80 dBm"},
5439 { 7, "-77 dBm"},
5440 { 8, "-74 dBm"},
5441 { 9, "-71 dBm"},
5442 {10, "-68 dBm"},
5443 {11, "-65 dBm"},
5444 {12, "-62 dBm"},
5445 {13, "-59 dBm"},
5446 {14, "-56 dBm"},
5447 {15, "Always search"},
5448 { 0, NULL }
5451 static const value_string gsm_a_rr_utran_qrxlevmin[] = {
5452 { 0, "-119 dBm"},
5453 { 1, "-117 dBm"},
5454 { 2, "-115 dBm"},
5455 { 3, "-113 dBm"},
5456 { 4, "-111 dBm"},
5457 { 5, "-109 dBm"},
5458 { 6, "-107 dBm"},
5459 { 7, "-105 dBm"},
5460 { 8, "-103 dBm"},
5461 { 9, "-101 dBm"},
5462 {10, "-99 dBm"},
5463 {11, "-97 dBm"},
5464 {12, "-95 dBm"},
5465 {13, "-93 dBm"},
5466 {14, "-91 dBm"},
5467 {15, "-89 dBm"},
5468 {16, "-87 dBm"},
5469 {17, "-85 dBm"},
5470 {18, "-83 dBm"},
5471 {19, "-81 dBm"},
5472 {20, "-79 dBm"},
5473 {21, "-77 dBm"},
5474 {22, "-75 dBm"},
5475 {23, "-73 dBm"},
5476 {24, "-71 dBm"},
5477 {25, "-69 dBm"},
5478 {26, "-67 dBm"},
5479 {27, "-65 dBm"},
5480 {28, "-63 dBm"},
5481 {29, "-61 dBm"},
5482 {30, "-59 dBm"},
5483 {31, "-57 dBm"},
5484 { 0, NULL }
5487 static const value_string gsm_a_rr_thresh_utran_eutran_high_low[] = {
5488 { 0, "0 dB"},
5489 { 1, "2 dB"},
5490 { 2, "4 dB"},
5491 { 3, "6 dB"},
5492 { 4, "8 dB"},
5493 { 5, "10 dB"},
5494 { 6, "12 dB"},
5495 { 7, "14 dB"},
5496 { 8, "16 dB"},
5497 { 9, "18 dB"},
5498 {10, "20 dB"},
5499 {11, "22 dB"},
5500 {12, "24 dB"},
5501 {13, "26 dB"},
5502 {14, "28 dB"},
5503 {15, "30 dB"},
5504 {16, "32 dB"},
5505 {17, "34 dB"},
5506 {18, "36 dB"},
5507 {19, "38 dB"},
5508 {20, "40 dB"},
5509 {21, "42 dB"},
5510 {22, "44 dB"},
5511 {23, "46 dB"},
5512 {24, "48 dB"},
5513 {25, "50 dB"},
5514 {26, "52 dB"},
5515 {27, "54 dB"},
5516 {28, "56 dB"},
5517 {29, "58 dB"},
5518 {30, "60 dB"},
5519 {31, "62 dB"},
5520 { 0, NULL }
5523 static const value_string gsm_a_rr_eutran_qrxlevmin[] = {
5524 { 0, "-140 dBm"},
5525 { 1, "-138 dBm"},
5526 { 2, "-136 dBm"},
5527 { 3, "-134 dBm"},
5528 { 4, "-132 dBm"},
5529 { 5, "-130 dBm"},
5530 { 6, "-128 dBm"},
5531 { 7, "-126 dBm"},
5532 { 8, "-124 dBm"},
5533 { 9, "-122 dBm"},
5534 {10, "-120 dBm"},
5535 {11, "-118 dBm"},
5536 {12, "-116 dBm"},
5537 {13, "-114 dBm"},
5538 {14, "-112 dBm"},
5539 {15, "-110 dBm"},
5540 {16, "-108 dBm"},
5541 {17, "-106 dBm"},
5542 {18, "-104 dBm"},
5543 {19, "-102 dBm"},
5544 {20, "-100 dBm"},
5545 {21, "-98 dBm"},
5546 {22, "-96 dBm"},
5547 {23, "-94 dBm"},
5548 {24, "-92 dBm"},
5549 {25, "-90 dBm"},
5550 {26, "-88 dBm"},
5551 {27, "-86 dBm"},
5552 {28, "-84 dBm"},
5553 {29, "-82 dBm"},
5554 {30, "-80 dBm"},
5555 {31, "-78 dBm"},
5556 { 0, NULL }
5559 static const value_string gsm_a_rr_serving_cell_priority_param_h_prio[] = {
5560 { 0, "disabled"},
5561 { 1, "5 dB"},
5562 { 2, "4 dB"},
5563 { 3, "3 dB"},
5564 { 0, NULL }
5567 static const value_string gsm_a_rr_serving_cell_priority_param_t_reselection[] = {
5568 { 0, "5 s"},
5569 { 1, "10 s"},
5570 { 2, "15 s"},
5571 { 3, "20 s"},
5572 { 0, NULL }
5575 static const value_string gsm_a_rr_qsearch_c_eutran_initial[] = {
5576 { 0, "search if signal is below -98 dBm"},
5577 { 1, "search if signal is below -94 dBm"},
5578 { 2, "search if signal is below -90 dBm"},
5579 { 3, "search if signal is below -86 dBm"},
5580 { 4, "search if signal is below -82 dBm"},
5581 { 5, "search if signal is below -78 dBm"},
5582 { 6, "search if signal is below -74 dBm"},
5583 { 7, "always search"},
5584 { 8, "search is signal is above -78 dBm"},
5585 { 9, "search is signal is above -74 dBm"},
5586 {10, "search is signal is above -70 dBm"},
5587 {11, "search is signal is above -66 dBm"},
5588 {12, "search is signal is above -62 dBm"},
5589 {13, "search is signal is above -58 dBm"},
5590 {14, "search is signal is above -54 dBm"},
5591 {15, "never search"},
5592 { 0, NULL }
5595 static const true_false_string gsm_a_rr_pcid_pattern_sense = {
5596 "The group of identified cells are the one not belonging to the PCID_BITMAP_GROUP",
5597 "The group of identified cells are the one identified by the PCID_BITMAP_GROUP"
5600 static const true_false_string measurement_control_utran = {
5601 "Frequency-specific search enabled: use Qsearch_C_E-UTRAN if received, otherwise use Qsearch_C_EUTRAN_Initial",
5602 "Frequency-specific search enabled: Never search"
5605 static const true_false_string measurement_control_eutran = {
5606 "Frequency-specific search enabled: use Qsearch_C if received, otherwise use Qsearch_C_Initial",
5607 "Frequency-specific search enabled: Never search"
5610 static gint
5611 de_rr_3g_priority_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5613 proto_tree *subtree;
5614 proto_item *item;
5615 gint curr_bit_offset;
5617 curr_bit_offset = bit_offset;
5618 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);
5619 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC]);
5621 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5622 curr_bit_offset += 1;
5623 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_stop, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5624 curr_bit_offset += 1;
5626 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Default UTRAN Priority Parameters", "Present", "Not Present"))
5628 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5629 curr_bit_offset += 3;
5630 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5631 curr_bit_offset += 5;
5632 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5633 curr_bit_offset += 5;
5635 /* Repeated UTRAN Priority Parameters */
5636 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UTRAN Priority Parameters", "Present", "Not Present"))
5638 proto_tree *subtree_rep_utran_prio;
5639 proto_item *item_rep_utran_prio;
5640 gint rep_utran_prio_bit_offset = curr_bit_offset;
5642 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);
5643 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]);
5645 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "UTRAN Frequency Index", "Present", "Not Present"))
5647 proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_utran_frequency_index, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5648 curr_bit_offset += 5;
5651 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "UTRAN Priority", "Present", "Not Present"))
5653 proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_utran_priority, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5654 curr_bit_offset += 3;
5656 proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_thresh_utran_high, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5657 curr_bit_offset += 5;
5659 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Threshold UTRAN Low", "Present", "Not Present"))
5661 proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_thresh_utran_low, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5662 curr_bit_offset += 5;
5665 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "UTRAN Qrxlev Min", "Present", "Not Present"))
5667 proto_tree_add_bits_item(subtree_rep_utran_prio, hf_gsm_a_rr_utran_qrxlevmin, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5668 curr_bit_offset += 5;
5670 proto_item_set_len(item_rep_utran_prio, (curr_bit_offset>>3) - (rep_utran_prio_bit_offset>>3)+1);
5672 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5674 return(curr_bit_offset - bit_offset);
5677 static gint
5678 de_rr_eutran_neighbour_cells(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5680 proto_tree *subtree;
5681 proto_item *item;
5682 gint curr_bit_offset;
5684 curr_bit_offset = bit_offset;
5685 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);
5686 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS]);
5688 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Neighbour Cells Struct", "Present", "Not Present"))
5690 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_earfcn, tvb, curr_bit_offset, 16, ENC_BIG_ENDIAN);
5691 curr_bit_offset += 16;
5693 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Measurement Bandwidth", "Present", "Not Present"))
5695 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_measurement_bandwidth, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5696 curr_bit_offset += 3;
5700 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Priority", "Present", "Not Present"))
5702 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_priority, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5703 curr_bit_offset += 3;
5705 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_thresh_eutran_high, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5706 curr_bit_offset += 5;
5708 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Threshold E-UTRAN Low", "Present", "Not Present"))
5710 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_thresh_eutran_low, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5711 curr_bit_offset += 5;
5714 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Qrxlev Min", "Present", "Not Present"))
5716 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_qrxlevmin, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
5717 curr_bit_offset += 5;
5719 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5721 return(curr_bit_offset - bit_offset);
5724 static gint
5725 de_rr_eutran_neighbour_cells_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5727 proto_tree *subtree;
5728 proto_item *item;
5729 gint curr_bit_offset;
5731 curr_bit_offset = bit_offset;
5732 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);
5733 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS]);
5735 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_earfcn, tvb, curr_bit_offset, 16, ENC_BIG_ENDIAN);
5736 curr_bit_offset += 16;
5737 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated EARFCN", "Present", "Not Present"))
5739 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_earfcn, tvb, curr_bit_offset, 16, ENC_BIG_ENDIAN);
5740 curr_bit_offset += 16;
5742 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Measurement Bandwidth ", "Present", "Not Present"))
5744 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_measurement_bandwidth, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5745 curr_bit_offset += 3;
5747 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5749 return(curr_bit_offset - bit_offset);
5752 static gint
5753 de_rr_eutran_pcid(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5755 gint curr_bit_offset = bit_offset;
5756 proto_item *item;
5758 while (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "Repeated PCID", "Present", "Not Present"))
5760 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid, tvb, curr_bit_offset, 9, ENC_BIG_ENDIAN);
5761 curr_bit_offset += 9;
5764 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "PCID Bitmap Group", "Present", "Not Present"))
5766 gint i;
5767 guint8 bitmap = tvb_get_bits8(tvb,curr_bit_offset,6);
5768 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid_bitmap_group, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5769 if (bitmap > 0)
5771 proto_item_append_text(item, ": Cells IDs addressed by the bitmap:");
5773 for (i = 0; i < 6; i++)
5775 if ((1 << i) & bitmap)
5777 if ( i != 0)
5779 proto_item_append_text(item, ",");
5781 proto_item_append_text(item, " %d to %d",i*84, (i+1)*84 - 1);
5784 curr_bit_offset += 6;
5786 while (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "PCID Pattern", "Present", "Not Present"))
5788 gint pcid_pattern_length;
5789 gint pcid_pattern;
5790 gint pattern_lower_bound, pattern_upper_bound;
5791 gint i;
5793 pcid_pattern_length = tvb_get_bits8(tvb,curr_bit_offset,3) + 1;
5794 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid_pattern_length, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5795 curr_bit_offset += 3;
5796 pcid_pattern = tvb_get_bits8(tvb,curr_bit_offset, pcid_pattern_length);
5798 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s = PCID_Pattern: %d",
5799 decode_bits_in_field(curr_bit_offset,pcid_pattern_length, pcid_pattern),
5800 pcid_pattern);
5802 pattern_lower_bound = pcid_pattern << (9 - pcid_pattern_length);
5803 pattern_upper_bound = pattern_lower_bound;
5804 for (i = 0; i < (9-pcid_pattern_length); i++)
5806 pattern_upper_bound |= 1 << i;
5808 proto_item_append_text(item, ": Cells IDs addressed by the pattern: %d to %d", pattern_lower_bound, pattern_upper_bound);
5810 curr_bit_offset += pcid_pattern_length;
5811 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_pcid_pattern_sense, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
5812 curr_bit_offset += 1;
5815 return(curr_bit_offset - bit_offset);
5818 static gint
5819 de_rr_eutran_not_allowed_cells(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5821 proto_tree *subtree;
5822 proto_item *item;
5823 gint curr_bit_offset;
5825 curr_bit_offset = bit_offset;
5826 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);
5827 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS]);
5829 /* dissect PCID group */
5830 curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
5832 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Frequency Index", "Present", "Not Present"))
5834 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_frequency_index, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5835 curr_bit_offset += 3;
5837 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5839 return(curr_bit_offset - bit_offset);
5842 static gint
5843 de_rr_eutran_pcid_to_ta_mapping(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5845 proto_tree *subtree;
5846 proto_item *item;
5847 gint curr_bit_offset;
5849 curr_bit_offset = bit_offset;
5850 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);
5851 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING]);
5853 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeating PCID group", "Present", "Not Present"))
5855 /* dissect PCID group */
5856 curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
5858 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
5860 return(curr_bit_offset - bit_offset);
5863 static gint
5864 de_rr_eutran_measurement_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
5866 gint curr_bit_offset;
5867 proto_item *item;
5868 guint8 rep_quant;
5870 curr_bit_offset = bit_offset;
5872 /* E-UTRAN Measurement Parameters Description */
5873 proto_tree_add_bits_item(tree, hf_gsm_a_rr_qsearch_c_eutran_initial, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
5874 curr_bit_offset += 4;
5875 rep_quant = gsm_rr_csn_flag(tvb, tree, curr_bit_offset, "E-UTRAN Reporting Quantity", "RSRQ", "RSRP");
5876 curr_bit_offset += 1;
5877 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_multirat_reporting, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
5878 curr_bit_offset += 2;
5881 if (!gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "Reporting", "3 bit", "6 bit"))
5883 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN FDD FDD 3 bit Reporting", "Present", "Not Present"))
5885 if (rep_quant == 0)
5887 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrp, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5889 else
5891 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrq, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5893 curr_bit_offset += 3;
5895 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN FDD Reporting Threshold2", "Present", "Not Present"))
5897 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5898 if (rep_quant == 0)
5900 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
5902 else
5904 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
5906 curr_bit_offset += 6;
5908 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-EUTRAN FDD Reporting Offset", "Present", "Not Present"))
5910 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5912 curr_bit_offset += 3;
5916 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN TDD TDD 3 bit Reporting", "Present", "Not Present"))
5918 if (rep_quant == 0)
5920 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrp, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5922 else
5924 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrq, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5926 curr_bit_offset += 3;
5928 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN TDD Reporting Threshold2", "Present", "Not Present"))
5930 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5931 if (rep_quant == 0)
5933 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
5935 else
5937 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
5939 curr_bit_offset += 6;
5941 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-EUTRAN TDD Reporting Offset", "Present", "Not Present"))
5943 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5945 curr_bit_offset += 3;
5949 else
5951 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-EUTRAN FDD Reporting Threshold", "Present", "Not Present"))
5953 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_measurement_report_offset, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5954 if (rep_quant == 0)
5956 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
5958 else
5960 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
5962 curr_bit_offset += 6;
5964 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN FDD Reporting Threshold2", "Present", "Not Present"))
5966 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5967 if (rep_quant == 0)
5969 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
5971 else
5973 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
5975 curr_bit_offset += 6;
5977 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN FDD Reporting Offset", "Present", "Not Present"))
5979 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
5980 curr_bit_offset += 3;
5984 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN TDD Reporting Offset", "Present", "Not Present"))
5986 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_measurement_report_offset, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
5987 if (rep_quant == 0)
5989 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
5991 else
5993 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
5995 curr_bit_offset += 6;
5997 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN TDD Reporting Threshold2", "Present", "Not Present"))
5999 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
6000 if (rep_quant == 0)
6002 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
6004 else
6006 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
6008 curr_bit_offset += 6;
6010 if (gsm_rr_csn_flag(tvb, tree, curr_bit_offset++, "E-UTRAN TDD Reporting Offset", "Present", "Not Present"))
6012 proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6013 curr_bit_offset += 3;
6016 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_reporting_granularity, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6017 if (rep_quant == 0)
6019 proto_item_append_text(item, " (%d dB step)", 2 + tvb_get_bits8(tvb,curr_bit_offset,1));
6021 else
6023 proto_item_append_text(item, " (%d dB step)", 1 + tvb_get_bits8(tvb,curr_bit_offset,1));
6025 curr_bit_offset += 1;
6028 return(curr_bit_offset - bit_offset);
6031 static gint
6032 de_rr_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6034 proto_tree *subtree;
6035 proto_item *item;
6036 gint curr_bit_offset;
6037 guint8 rep_quant = 0;
6039 curr_bit_offset = bit_offset;
6040 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);
6041 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC]);
6043 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_ccn_active, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6044 curr_bit_offset += 1;
6045 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6046 curr_bit_offset += 1;
6047 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_stop, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6048 curr_bit_offset += 1;
6050 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Measurement Parameters Description", "Present", "Not Present"))
6052 /* E-UTRAN Measurement Parameters Description */
6053 curr_bit_offset += de_rr_eutran_measurement_param_desc(tvb, subtree, curr_bit_offset);
6056 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "GPRS E-UTRAN Measurement Parameters Description", "Present", "Not Present"))
6058 /* GPRS E-UTRAN Measurement Parameters Description */
6059 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_qsearch_p_eutran, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
6060 curr_bit_offset += 4;
6061 rep_quant = gsm_rr_csn_flag(tvb, subtree, curr_bit_offset, "E-UTRAN Reporting Quantity", "RSRQ", "RSRP");
6062 curr_bit_offset++;
6063 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_multirat_reporting, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
6064 curr_bit_offset += 2;
6066 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN FDD Reporting", "Present", "Not Present"))
6068 if (rep_quant == 0)
6070 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrp, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6072 else
6074 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrq, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6076 curr_bit_offset += 3;
6078 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN FDD Reporting Threshold 2", "Present", "Not Present"))
6080 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
6081 if (rep_quant == 0)
6083 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
6085 else
6087 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
6089 curr_bit_offset += 6;
6091 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN FDD Reporting Offset", "Present", "Not Present"))
6093 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_fdd_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6094 curr_bit_offset += 3;
6098 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN TDD Reporting", "Present", "Not Present"))
6100 if (rep_quant == 0)
6102 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrp, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6104 else
6106 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrq, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6108 curr_bit_offset += 3;
6110 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN TDD Reporting Threshold 2", "Present", "Not Present"))
6112 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
6113 if (rep_quant == 0)
6115 proto_item_append_text(item, " (%.1f dB)", (gfloat)tvb_get_bits8(tvb,curr_bit_offset,6)/2 - 19.5);
6117 else
6119 proto_item_append_text(item, " (%d dBm)", tvb_get_bits8(tvb,curr_bit_offset,6) - 140);
6121 curr_bit_offset += 6;
6123 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN TDD Reporting Offset", "Present", "Not Present"))
6125 item = proto_tree_add_bits_item(tree, hf_gsm_a_rr_eutran_tdd_reporting_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6126 curr_bit_offset += 3;
6131 /* Repeated E-UTRAN Neighbour Cells */
6132 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Neighbour Cells", "Present", "Not Present"))
6134 curr_bit_offset += de_rr_eutran_neighbour_cells(tvb, subtree, curr_bit_offset);
6137 /* Repeated E-UTRAN Not Allowed Cells */
6138 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Not Allowed Cells", "Present", "Not Present"))
6140 curr_bit_offset += de_rr_eutran_not_allowed_cells(tvb, subtree, curr_bit_offset);
6143 /* Repeated E-UTRAN PCID to TA mapping */
6144 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN PCID to TA mapping", "Present", "Not Present"))
6146 curr_bit_offset += de_rr_eutran_pcid_to_ta_mapping(tvb, subtree, curr_bit_offset);
6148 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6150 return(curr_bit_offset - bit_offset);
6153 static gint
6154 de_rr_eutran_param_desc_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6156 proto_tree *subtree;
6157 proto_item *item;
6158 gint curr_bit_offset;
6160 curr_bit_offset = bit_offset;
6161 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);
6162 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC]);
6164 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6165 curr_bit_offset += 1;
6166 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_stop, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6167 curr_bit_offset += 1;
6169 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Measurement Parameters Description", "Present", "Not Present"))
6171 /* E-UTRAN Measurement Parameters Description */
6172 curr_bit_offset += de_rr_eutran_measurement_param_desc(tvb, subtree, curr_bit_offset);
6175 /* Repeated E-UTRAN Neighbour Cells */
6176 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Neighbour Cells", "Present", "Not Present"))
6178 curr_bit_offset += de_rr_eutran_neighbour_cells_mi(tvb, subtree, curr_bit_offset);
6181 /* Repeated E-UTRAN Not Allowed Cells */
6182 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Not Allowed Cells", "Present", "Not Present"))
6184 curr_bit_offset += de_rr_eutran_not_allowed_cells(tvb, subtree, curr_bit_offset);
6187 /* Measurement Control Parameters Description */
6188 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Measurement Control Parameters Description", "Present", "Not Present"))
6190 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Default Measurement Control E-UTRAN", "Present", "Not Present"))
6192 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_default_measurement_control_eutran, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6193 curr_bit_offset += 1;
6195 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Measurement Control Parameters", "Present", "Not Present"))
6197 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated E-UTRAN Frequency Index", "Present", "Not Present"))
6199 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_frequency_index, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6200 curr_bit_offset += 3;
6202 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_measurement_control_eutran, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6203 curr_bit_offset += 1;
6206 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6208 return(curr_bit_offset - bit_offset);
6211 static gint
6212 de_rr_priority_and_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6214 proto_tree *subtree;
6215 proto_item *item;
6216 gint curr_bit_offset;
6218 curr_bit_offset = bit_offset;
6219 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);
6220 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC]);
6223 /* Serving Cell Priority Parameters Description */
6224 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Serving Cell Priority Parameters Description", "Present", "Not Present"))
6226 proto_tree *subtree_serv;
6227 proto_item *item_serv;
6228 gint serv_bit_offset = curr_bit_offset;
6230 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);
6231 subtree_serv = proto_item_add_subtree(item_serv, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC]);
6233 proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_geran_priority, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6234 curr_bit_offset += 3;
6235 proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
6236 curr_bit_offset += 4;
6237 proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
6238 curr_bit_offset += 4;
6239 proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_h_prio, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
6240 curr_bit_offset += 2;
6241 proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_t_reselection, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
6242 curr_bit_offset += 2;
6243 proto_item_set_len(item_serv, (curr_bit_offset>>3) - (serv_bit_offset>>3)+1);
6246 /* 3G Priority Parameters Description */
6247 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "3G Priority Parameters Description", "Present", "Not Present"))
6249 curr_bit_offset += de_rr_3g_priority_param_desc(tvb, subtree, curr_bit_offset);
6252 /* E-UTRAN Parameters Description */
6253 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Parameters Description", "Present", "Not Present"))
6255 curr_bit_offset += de_rr_eutran_param_desc(tvb, subtree, curr_bit_offset);
6257 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6259 return (curr_bit_offset - bit_offset);
6262 static gint
6263 de_rr_3g_csg_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6265 proto_tree *subtree;
6266 proto_item *item;
6267 gint curr_bit_offset;
6269 curr_bit_offset = bit_offset;
6270 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);
6271 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_CSG_DESC]);
6273 while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeated CSG_PSC_SPLIT struct", "Present", "Not Present"))
6275 /* CSG_PSC_SPLIT struct */
6276 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "PSC", "Present", "Not Present"))
6278 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_psc, tvb, curr_bit_offset, 9, ENC_BIG_ENDIAN);
6279 curr_bit_offset += 9;
6281 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "PSC Pattern", "Present", "Not Present"))
6283 gint psc_pattern_length;
6284 gint psc_pattern;
6286 psc_pattern_length = tvb_get_bits8(tvb,curr_bit_offset,3) + 1;
6287 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_psc_pattern_length, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6288 curr_bit_offset += 3;
6289 psc_pattern = tvb_get_bits8(tvb,curr_bit_offset, psc_pattern_length);
6291 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s = PSC_Pattern: %d",
6292 decode_bits_in_field(curr_bit_offset,psc_pattern_length, psc_pattern),
6293 psc_pattern);
6295 curr_bit_offset += psc_pattern_length;
6296 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_psc_pattern_sense, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6297 curr_bit_offset += 1;
6300 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UTRAN Frequency Index", "Present", "Not Present"))
6302 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_frequency_index, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
6303 curr_bit_offset += 5;
6307 while(gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "repeated CSG FDD UARFCN", "Present", "Not Present"))
6309 /* CSG_FDD_UARFCN */
6310 if (!gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Technology", "TDD", "FDD"))
6312 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_csg_fdd_uarfcn, tvb, curr_bit_offset, 14, ENC_BIG_ENDIAN);
6313 curr_bit_offset += 14;
6315 else
6317 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_csg_tdd_uarfcn, tvb, curr_bit_offset, 14, ENC_BIG_ENDIAN);
6318 curr_bit_offset += 14;
6321 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6323 return(curr_bit_offset - bit_offset);
6326 static gint
6327 de_rr_eutran_csg_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6329 proto_tree *subtree;
6330 proto_item *item;
6331 gint curr_bit_offset;
6333 curr_bit_offset = bit_offset;
6334 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);
6335 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC]);
6337 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated PCID group", "Present", "Not Present"))
6339 /* dissect PCID group */
6340 curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
6343 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated EARFCN", "Present", "Not Present"))
6345 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_csg_earfcn, tvb, curr_bit_offset, 16, ENC_BIG_ENDIAN);
6346 curr_bit_offset += 16;
6348 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6350 return(curr_bit_offset - bit_offset);
6353 static gint
6354 de_rr_eutran_csg_desc_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6356 proto_tree *subtree;
6357 proto_item *item;
6358 gint curr_bit_offset;
6360 curr_bit_offset = bit_offset;
6361 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);
6362 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC]);
6364 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated CSG PCI Split", "Present", "Not Present"))
6366 /* dissect PCID group */
6367 curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset);
6369 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6371 return(curr_bit_offset - bit_offset);
6374 static gint
6375 de_rr_utran_measurement_control_param_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6377 proto_tree *subtree;
6378 proto_item *item;
6379 gint curr_bit_offset;
6381 curr_bit_offset = bit_offset;
6382 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC].strptr);
6383 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC]);
6385 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UTRAN Frequency Index", "Present", "Not Present"))
6387 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_utran_frequency_index, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
6388 curr_bit_offset += 5;
6390 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_control_param_desc_meas_ctrl_utran, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6391 curr_bit_offset += 1;
6393 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6395 return(curr_bit_offset - bit_offset);
6398 static gint
6399 de_rr_3g_supplementary_param_desc_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6401 proto_tree *subtree;
6402 proto_item *item;
6403 gint curr_bit_offset;
6405 curr_bit_offset = bit_offset;
6406 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC].strptr);
6407 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC]);
6409 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6410 curr_bit_offset += 1;
6411 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_stop, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6412 curr_bit_offset += 1;
6414 /* 3G Measurement Control Parameters Description */
6415 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "3G Measurement Control Parameters Description", "Present", "Not Present"))
6417 /* 3G Measurement Control Parameters Description struct */
6418 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "3G Measurement Control Parameters Description struct", "Present", "Not Present"))
6420 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_control_param_desc_meas_ctrl_utran, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6421 curr_bit_offset += 1;
6423 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UTRAN Measurement Control Parameters struct", "Present", "Not Present"))
6425 curr_bit_offset += de_rr_utran_measurement_control_param_mi(tvb, subtree, curr_bit_offset);
6428 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6430 return(curr_bit_offset - bit_offset);
6433 static guint16
6434 de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
6436 proto_tree *subtree2, *subtree3;
6437 proto_item *item2, *item3;
6438 guint32 curr_offset;
6439 gint bit_offset, bit_offset_sav, idx;
6440 guint8 value;
6441 guint8 tvb_len = tvb_length(tvb);
6442 guint16 bit_len = tvb_len << 3;
6444 curr_offset = offset;
6445 bit_offset = curr_offset << 3;
6447 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ba_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6448 bit_offset += 1;
6449 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ba_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6450 bit_offset += 1;
6451 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mp_change_mark, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6452 bit_offset += 1;
6453 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2quater_index, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6454 bit_offset += 4;
6455 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2quater_count, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6456 bit_offset += 4;
6457 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Measurement Parameters Description", "Present", "Not Present"))
6458 { /* Measurement Parameters Description */
6459 bit_offset_sav = bit_offset;
6460 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MEAS_PARAM_DESC].strptr);
6461 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MEAS_PARAM_DESC]);
6462 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_gsm_report_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6463 bit_offset += 1;
6464 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_serving_band_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6465 bit_offset += 2;
6466 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6468 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "GPRS Real Time Difference Description", "Present", "Not Present"))
6469 { /* GPRS Real Time Difference Description */
6470 bit_offset += de_rr_rtd_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_RTD_DESC);
6472 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "GPRS BSIC Description", "Present", "Not Present"))
6473 { /* GPRS BSIC Description */
6474 bit_offset += de_rr_bsic_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_BSIC_DESC);
6476 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "GPRS Report Priority Description", "Present", "Not Present"))
6477 { /* GPRS Report Priority Description */
6478 bit_offset += de_rr_report_priority_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_REPORT_PRIO_DESC);
6480 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "GPRS Measurement Parameters Description", "Present", "Not Present"))
6481 { /* GPRS Measurement Parameters Description */
6482 bit_offset += de_rr_meas_param_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC);
6484 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "NC Measurement Parameters", "Present", "Not Present"))
6485 { /* NC Measurement Parameters */
6486 bit_offset_sav = bit_offset;
6487 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_NC_MEAS_PARAM].strptr);
6488 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_NC_MEAS_PARAM]);
6489 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_network_control_order, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6490 bit_offset += 2;
6491 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "NC Periods", "Present", "Not Present"))
6493 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nc_non_drx_period, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6494 bit_offset += 3;
6495 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nc_reporting_period_i, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6496 bit_offset += 3;
6497 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nc_reporting_period_t, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6498 bit_offset += 3;
6500 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6502 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "SI 2quater Extension Information", "Present", "Not Present"))
6503 { /* SI 2quater Extension Information */
6504 bit_offset_sav = bit_offset;
6505 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI2Q_EXT_INFO].strptr);
6506 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI2Q_EXT_INFO]);
6507 idx = tvb_get_bits8(tvb,bit_offset,8);
6508 proto_tree_add_text(subtree2,tvb, bit_offset>>3, 1, "Extension Length: %d", idx);
6509 bit_offset += 8;
6510 proto_item_set_len(item2,((bit_offset+idx+1)>>3) - (bit_offset_sav>>3)+1);
6511 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "CCN Support Description", "Present", "Not Present"))
6512 { /* CCN Support Description */
6513 bit_offset_sav = bit_offset;
6514 item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC].strptr);
6515 subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC]);
6516 value = tvb_get_bits8(tvb,bit_offset,7);
6517 proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "Number Cells: %d", value);
6518 bit_offset += 7;
6519 idx -= 7;
6520 item2 = proto_tree_add_text(subtree3,tvb, bit_offset>>3, (value>>3)+1, "CCN Supported: ");
6521 while (value)
6523 proto_item_append_text(item2,"%d",tvb_get_bits8(tvb,bit_offset,1));
6524 bit_offset += 1;
6525 value -= 1;
6526 idx -= 1;
6528 proto_item_set_len(item3, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6530 bit_offset += idx;
6532 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Neighbour Cell Description", "Present", "Not Present"))
6533 { /* 3G Neighbour Cell Description */
6534 bit_offset_sav = bit_offset;
6535 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr);
6536 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC]);
6537 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Index Start 3G", "Present", "Not Present"))
6539 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_index_start_3g, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
6540 bit_offset += 7;
6542 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Absolute Index Start EMR", "Present", "Not Present"))
6544 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_absolute_index_start_emr, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
6545 bit_offset += 7;
6547 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "UTRAN FDD Description", "Present", "Not Present"))
6548 { /* UTRAN FDD Description */
6549 bit_offset += de_rr_si2quater_meas_info_utran_fdd_desc(tvb, subtree2, bit_offset);
6551 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "UTRAN TDD Description", "Present", "Not Present"))
6552 { /* UTRAN TDD Description */
6553 bit_offset += de_rr_si2quater_meas_info_utran_tdd_desc(tvb, subtree2, bit_offset);
6555 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6557 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Measurement Parameters Description", "Present", "Not Present"))
6558 { /* 3G Measurement Parameters Description */
6559 bit_offset_sav = bit_offset;
6560 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr);
6561 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]);
6562 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_i, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6563 bit_offset += 4;
6564 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_c_initial, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6565 bit_offset += 1;
6566 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "FDD Information", "Present", "Not Present"))
6568 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qoffset, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6569 bit_offset += 4;
6570 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rep_quant, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6571 bit_offset += 1;
6572 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_multirat_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6573 bit_offset += 2;
6574 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6575 bit_offset += 3;
6577 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "TDD Information", "Present", "Not Present"))
6579 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_qoffset, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6580 bit_offset += 4;
6581 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_multirat_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6582 bit_offset += 2;
6584 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6586 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "GPRS 3G Measurement Parameters Description", "Present", "Not Present"))
6587 { /* GPRS 3G Measurement Parameters Description */
6588 guint8 reporting_quant = 0;
6589 bit_offset_sav = bit_offset;
6590 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC].strptr);
6591 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC]);
6592 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_p, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6593 bit_offset += 4;
6594 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_3g_search_prio, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6595 bit_offset += 1;
6596 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "FDD Parameters", "Present", "Not Present"))
6598 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rep_quant, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6599 reporting_quant = gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Reporting Quantity", "Ec/No", "RSCP");
6600 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_multirat_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6601 bit_offset += 2;
6603 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "FDD Reporting Parameters", "Present", "Not Present"))
6605 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6606 bit_offset += 3;
6607 if (reporting_quant == 0)
6609 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_reporting_threshold_rscp, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6611 else
6613 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_reporting_threshold_ecn0, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6615 bit_offset += 3;
6617 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "TDD Multirat Reporting", "Present", "Not Present"))
6619 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_multirat_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6620 bit_offset += 2;
6622 if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "TDD Reporting Parameters", "Present", "Not Present"))
6624 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6625 bit_offset += 3;
6626 if (reporting_quant == 0)
6628 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_reporting_threshold_rscp, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6630 else
6632 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_reporting_threshold_ecn0, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6634 bit_offset += 3;
6636 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6638 /* Null breakpoint */
6639 if (bit_len - bit_offset > 0)
6641 /* There is still room left in the Rest Octets IE */
6642 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-5", "Present", "Not present"))
6643 { /* Additions in Rel-5 */
6644 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Additional Measurement Parameters Description", "Present", "Not Present"))
6645 { /* 3G Additional Measurement Parameters Description */
6646 bit_offset_sav = bit_offset;
6647 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr);
6648 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC]);
6649 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6650 bit_offset += 3;
6651 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rscpmin, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6652 bit_offset += 4;
6653 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
6655 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Additional Measurement Parameters Description 2", "Present", "Not Present"))
6656 { /* 3G Additional Measurement Parameters Description 2 */
6657 bit_offset += de_rr_3g_add_meas_param_desc2(tvb, subtree, bit_offset);
6659 /* Null breakpoint */
6660 if (bit_len - bit_offset > 0)
6662 /* There is still room left in the Rest Octets IE */
6663 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-6", "Present", "Not present"))
6664 { /* Additions in Rel-6 */
6665 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ccn_active, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6666 bit_offset += 1;
6668 /* Null breakpoint */
6669 if (bit_len - bit_offset > 0)
6671 /* There is still room left in the Rest Octets IE */
6672 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-7", "Present", "Not present"))
6673 { /* Additions in Rel-7 */
6674 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "700 Reporting", "Present", "Not Present"))
6676 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_700_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6677 bit_offset += 3;
6678 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_700_reporting_threshold, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6679 bit_offset += 3;
6681 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "810 Reporting", "Present", "Not Present"))
6683 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_810_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6684 bit_offset += 3;
6685 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_810_reporting_threshold, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6686 bit_offset += 3;
6689 /* Null breakpoint */
6690 if (bit_len - bit_offset > 0)
6692 /* There is still room left in the Rest Octets IE */
6693 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-8", "Present", "Not present"))
6694 { /* Additions in Rel-8 */
6695 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Supplementary Parameters Description ", "Present", "Not Present"))
6697 bit_offset += de_rr_priority_and_eutran_param_desc(tvb, subtree, bit_offset);
6699 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G CSG Description ", "Present", "Not Present"))
6701 bit_offset += de_rr_3g_csg_desc(tvb, subtree, bit_offset);
6703 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "EUTRAN CSG Description ", "Present", "Not Present"))
6705 bit_offset += de_rr_eutran_csg_desc(tvb, subtree, bit_offset);
6715 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
6716 return tvb_len - offset;
6720 * [3] 10.5.2.34 SI 3 Rest Octets
6722 static const value_string gsm_a_rr_temporary_offset_vals[] = {
6723 { 0, "0 dB"},
6724 { 1, "10 dB"},
6725 { 2, "20 dB"},
6726 { 3, "30 dB"},
6727 { 4, "40 dB"},
6728 { 5, "50 dB"},
6729 { 6, "60 dB"},
6730 { 7, "infinity"},
6731 { 0, NULL }
6734 static const value_string gsm_a_rr_cell_reselect_offset_vals[] = {
6735 { 0, "0 dB"},
6736 { 1, "2 dB"},
6737 { 2, "4 dB"},
6738 { 3, "6 dB"},
6739 { 4, "8 dB"},
6740 { 5, "10 dB"},
6741 { 6, "12 dB"},
6742 { 7, "14 dB"},
6743 { 8, "16 dB"},
6744 { 9, "18 dB"},
6745 {10, "20 dB"},
6746 {11, "22 dB"},
6747 {12, "24 dB"},
6748 {13, "26 dB"},
6749 {14, "28 dB"},
6750 {15, "30 dB"},
6751 {16, "32 dB"},
6752 {17, "34 dB"},
6753 {18, "36 dB"},
6754 {19, "38 dB"},
6755 {20, "40 dB"},
6756 {21, "42 dB"},
6757 {22, "44 dB"},
6758 {23, "46 dB"},
6759 {24, "48 dB"},
6760 {25, "50 dB"},
6761 {26, "52 dB"},
6762 {27, "54 dB"},
6763 {28, "56 dB"},
6764 {29, "58 dB"},
6765 {30, "60 dB"},
6766 {31, "62 dB"},
6767 {32, "64 dB"},
6768 {33, "66 dB"},
6769 {34, "68 dB"},
6770 {35, "70 dB"},
6771 {36, "72 dB"},
6772 {37, "74 dB"},
6773 {38, "76 dB"},
6774 {39, "78 dB"},
6775 {40, "80 dB"},
6776 {41, "82 dB"},
6777 {42, "84 dB"},
6778 {43, "86 dB"},
6779 {44, "88 dB"},
6780 {45, "90 dB"},
6781 {46, "92 dB"},
6782 {47, "94 dB"},
6783 {48, "96 dB"},
6784 {49, "98 dB"},
6785 {50, "100 dB"},
6786 {51, "102 dB"},
6787 {52, "104 dB"},
6788 {53, "106 dB"},
6789 {54, "108 dB"},
6790 {55, "110 dB"},
6791 {56, "112 dB"},
6792 {57, "114 dB"},
6793 {58, "116 dB"},
6794 {59, "118 dB"},
6795 {60, "120 dB"},
6796 {61, "122 dB"},
6797 {62, "124 dB"},
6798 {63, "126 dB"},
6799 { 0, NULL }
6802 static const value_string gsm_a_rr_penalty_time_vals[] = {
6803 { 0, "20 s"},
6804 { 1, "40 s"},
6805 { 2, "60 s"},
6806 { 3, "80 s"},
6807 { 4, "100 s"},
6808 { 5, "120 s"},
6809 { 6, "140 s"},
6810 { 7, "160 s"},
6811 { 8, "180 s"},
6812 { 9, "200 s"},
6813 {10, "220 s"},
6814 {11, "240 s"},
6815 {12, "260 s"},
6816 {13, "280 s"},
6817 {14, "300 s"},
6818 {15, "320 s"},
6819 {16, "340 s"},
6820 {17, "360 s"},
6821 {18, "380 s"},
6822 {19, "400 s"},
6823 {20, "420 s"},
6824 {21, "440 s"},
6825 {22, "460 s"},
6826 {23, "480 s"},
6827 {24, "500 s"},
6828 {25, "520 s"},
6829 {26, "540 s"},
6830 {27, "560 s"},
6831 {28, "580 s"},
6832 {29, "600 s"},
6833 {30, "620 s"},
6834 {31, "Cell Reselect Offset is subtracted from C2 and Temporary Offset is ignored"},
6835 { 0, NULL }
6838 static gint
6839 de_rr_rest_oct_opt_sel_param(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6841 proto_tree *subtree;
6842 proto_item *item;
6843 gint curr_bit_offset;
6845 curr_bit_offset = bit_offset;
6847 if (gsm_rr_csn_HL_flag(tvb, tree, 0, curr_bit_offset++, "Selection Parameters", "Present", "Not present"))
6848 { /* Selection Parameters */
6849 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM].strptr);
6850 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM]);
6851 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6852 curr_bit_offset += 1;
6853 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cell_reselect_offset, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
6854 curr_bit_offset += 6;
6855 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_temporary_offset, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6856 curr_bit_offset += 3;
6857 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_penalty_time, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN);
6858 curr_bit_offset += 5;
6859 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
6862 return (curr_bit_offset - bit_offset);
6865 static const value_string gsm_a_rr_si13_position_vals[] = {
6866 { 0, "SYSTEM INFORMATION TYPE 13 message is sent on BCCH Norm"},
6867 { 1, "SYSTEM INFORMATION TYPE 13 message is sent on BCCH Ext"},
6868 { 0, NULL }
6871 static gint
6872 de_rr_rest_oct_gprs_indicator(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
6874 proto_tree *subtree;
6875 proto_item *item;
6876 gint curr_bit_offset;
6878 curr_bit_offset = bit_offset;
6880 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_INDICATOR].strptr);
6881 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_INDICATOR]);
6882 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gprs_ra_colour, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
6883 curr_bit_offset += 3;
6884 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13_position, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN);
6885 curr_bit_offset += 1;
6887 return (curr_bit_offset - bit_offset);
6890 static const value_string gsm_a_rr_power_offset_vals[] = {
6891 { 0, "0 dB"},
6892 { 1, "2 dB"},
6893 { 2, "4 dB"},
6894 { 3, "8 dB"},
6895 { 0, NULL }
6898 static const true_false_string gsm_a_rr_si2quater_position_value = {
6899 "SYSTEM INFORMATION TYPE 2 quater message is sent on BCCH Ext",
6900 "SYSTEM INFORMATION TYPE 2 quater message is sent on BCCH Norm"
6903 static const true_false_string gsm_a_rr_si13alt_position_value = {
6904 "If Iu mode is supported in the cell, SYSTEM INFORMATION TYPE 13alt message is sent on BCCH Ext",
6905 "If Iu mode is supported in the cell, SYSTEM INFORMATION TYPE 13alt message is sent on BCCH Norm"
6908 static guint16
6909 de_rr_si3_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
6911 guint32 curr_offset;
6912 gint bit_offset;
6913 gboolean gprs_indicator;
6914 guint8 tvb_len = tvb_length(tvb);
6916 curr_offset = offset;
6917 bit_offset = curr_offset << 3;
6919 bit_offset += de_rr_rest_oct_opt_sel_param(tvb, subtree, bit_offset);
6921 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Optional Power Offset", "Present", "Not present"))
6922 { /* Optional Power Offset */
6923 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_power_offset, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
6924 bit_offset += 2;
6926 gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "SYSTEM INFORMATION TYPE 2ter", "Available", "Not Available");
6927 gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Early Classmark Sending", "Is allowed", "Is forbidden");
6928 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Scheduling if and where", "Present", "Not present"))
6929 { /* Scheduling if and where */
6930 proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Where: %d",tvb_get_bits8(tvb,bit_offset,3));
6931 bit_offset += 3;
6933 gprs_indicator = gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "GPRS Indicator", "Present", "Not present");
6934 if (gprs_indicator)
6935 { /* GPRS indicator */
6936 bit_offset += de_rr_rest_oct_gprs_indicator(tvb, subtree, bit_offset);
6938 gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "3G Early Classmark Sending Restriction",
6939 "The sending of UTRAN,CDMA2000 and GERAN IU MODE CLASSMARK CHANGE messages are controlled by the Early Classmark Sending Control parameter",
6940 "Neither UTRAN, CDMA2000 nor GERAN IU MODE CLASSMARK CHANGE message shall be sent with the Early classmark sending");
6941 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "SI2quater Indicator", "Present", "Not present"))
6942 { /* SI2quater Indicator */
6943 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2quater_position, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6944 bit_offset += 1;
6946 if (gprs_indicator == FALSE)
6948 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13alt_position, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6949 bit_offset += 1;
6951 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
6952 return tvb_len - offset;
6956 * [3] 10.5.2.32 SI 4 Rest Octets
6958 static const value_string gsm_a_rr_prio_thr_vals[] = {
6959 { 0, "0 dB"},
6960 { 1, "6 dB"},
6961 { 2, "12 dB"},
6962 { 3, "18 dB"},
6963 { 4, "24 dB"},
6964 { 5, "30 dB"},
6965 { 6, "36 dB"},
6966 { 7, "Infinite"},
6967 { 0, NULL }
6970 static const value_string gsm_a_rr_lsa_offset_vals[] = {
6971 { 0, "0 dB"},
6972 { 1, "4 dB"},
6973 { 2, "8 dB"},
6974 { 3, "16 dB"},
6975 { 4, "24 dB"},
6976 { 5, "32 dB"},
6977 { 6, "48 dB"},
6978 { 7, "64 dB"},
6979 { 0, NULL }
6982 static guint16
6983 de_rr_si4_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
6985 proto_tree *subtree2, *subtree3;
6986 proto_item *item2, *item3;
6987 guint32 curr_offset;
6988 gint bit_offset, bit_offset_sav;
6989 guint8 tvb_len = tvb_length(tvb);
6990 guint16 bit_len = tvb_len << 3;
6992 curr_offset = offset;
6993 bit_offset = curr_offset << 3;
6995 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O].strptr);
6997 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O]);
6999 bit_offset += de_rr_rest_oct_opt_sel_param(tvb, subtree2, bit_offset);
7001 if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "Optional Power Offset", "Present", "Not present"))
7002 { /* Optional Power Offset */
7003 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_power_offset, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
7004 bit_offset += 2;
7006 if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "GPRS Indicator", "Present", "Not present"))
7008 bit_offset += de_rr_rest_oct_gprs_indicator(tvb, subtree2, bit_offset);
7010 proto_item_set_len(item2,(bit_offset>>3) + 1 - curr_offset);
7012 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "SI4 Rest Octets_S", "Present", "Not present"))
7013 { /* SI4 Rest Octets_S */
7014 bit_offset_sav = bit_offset;
7015 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S].strptr);
7016 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S]);
7018 if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "LSA Parameters", "Present", "Not present"))
7019 { /* LSA Parameters */
7020 item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_PARAMETERS].strptr);
7021 subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_PARAMETERS]);
7022 proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_prio_thr, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7023 bit_offset += 3;
7024 proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_lsa_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7025 bit_offset += 3;
7026 if (gsm_rr_csn_flag(tvb,subtree3, bit_offset++,"MCC/MNC", "Present", "Not Present"))
7028 proto_tree_add_text(subtree3, tvb, bit_offset>>3, 2, "MCC: %d", tvb_get_bits16(tvb,bit_offset,12,ENC_BIG_ENDIAN));
7029 bit_offset += 12;
7030 proto_tree_add_text(subtree3, tvb, bit_offset>>3, 2, "MNC: %d", tvb_get_bits16(tvb,bit_offset,12,ENC_BIG_ENDIAN));
7031 bit_offset += 12;
7033 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
7036 if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "Cell Identity", "Present", "Not present"))
7037 { /* Cell Identity */
7038 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_cell_id, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
7039 bit_offset += 16;
7042 if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "LSA ID information", "Present", "Not present"))
7043 { /* LSA ID information */
7044 item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, len, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_ID_INFO].strptr);
7045 subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_ID_INFO]);
7048 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Type", "Short LSA ID", "LSA ID"))
7050 proto_tree_add_text(subtree3, tvb, bit_offset>>3, 3, "Short LSA ID: %d",tvb_get_bits16(tvb,bit_offset,10,ENC_BIG_ENDIAN));
7051 bit_offset += 10;
7053 else
7055 proto_tree_add_text(subtree3, tvb, bit_offset>>3, 3, "LSA ID: %d",tvb_get_bits32(tvb,bit_offset,24,ENC_BIG_ENDIAN));
7056 bit_offset += 24;
7058 } while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Additional LSA ID", "Present", "Not Present"));
7060 if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "CBQ3", "Present", "Not present"))
7062 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq3, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
7063 bit_offset += 3;
7065 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "SI3 alt position", "Present", "Not Present"))
7067 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13alt_position, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7068 bit_offset += 1;
7070 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
7072 else
7073 { /* Break indicator */
7074 gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "Break Indicator",
7075 "Additional parameters \"SI4 Rest Octets_S\" are sent in SYSTEM INFORMATION TYPE 7 and 8",
7076 "Additional parameters \"SI4 Rest Octets_S\" are not sent in SYSTEM INFORMATION TYPE 7 and 8");
7078 /* Truncation allowed (see 44.018 section 8.9 */
7079 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
7080 return tvb_len - offset;
7084 * [3] 10.5.2.35a SI 6 Rest Octets
7086 static const true_false_string gsm_a_rr_paging_channel_restructuring_value = {
7087 "Paging channel is restructured",
7088 "Paging channel is not restructured"
7091 static const true_false_string gsm_a_rr_vbs_vgcs_inband_notifications_value = {
7092 "The mobile shall be notified on incoming high priority VBS/VGCS calls through NOTIFICATION/FACCH, the mobile need not to inspect the NCH",
7093 "The network does not provide notification on FACCH so that the mobile should inspect the NCH for notifications"
7096 static const true_false_string gsm_a_rr_vbs_vgcs_inband_pagings_value = {
7097 "The mobile shall be notified on incoming high priority point-to-point calls through NOTIFICATION/FACCH, the mobile need not to inspect the PCH",
7098 "The network does not provide paging information on FACCH so that the mobile should inspect the PCH for pagings"
7101 static const value_string gsm_a_rr_max_lapdm_vals[] = {
7102 { 0, "Any message segmented in up to 5 LAPDm frames"},
7103 { 1, "Any message segmented in up to 6 LAPDm frames"},
7104 { 2, "Any message segmented in up to 7 LAPDm frames"},
7105 { 3, "Any message segmented in up to 8 LAPDm frames"},
7106 { 4, "Any message segmented in up to 9 LAPDm frames"},
7107 { 5, "Any message segmented in up to 10 LAPDm frames"},
7108 { 6, "Any message segmented in up to 11 LAPDm frames"},
7109 { 7, "Any message segmented in up to 12 LAPDm frames"},
7110 { 0, NULL }
7113 static const true_false_string gsm_a_rr_dedicated_mode_mbms_notification_support_value = {
7114 "The cell supports the Dedicated Mode MBMS Notification procedures",
7115 "The cell does not support the Dedicated Mode MBMS Notification procedures"
7118 static const true_false_string gsm_a_rr_mnci_support_value = {
7119 "The cell supports the distribution of MBMS NEIGHBOURING CELL INFORMATION messages",
7120 "The cell does not support the distribution of MBMS NEIGHBOURING CELL INFORMATION messages"
7123 static guint16
7124 de_rr_si6_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7126 proto_tree *subtree2;
7127 proto_item *item2;
7128 guint32 curr_offset;
7129 gint bit_offset, bit_offset_sav;
7130 guint8 value;
7131 guint8 tvb_len = tvb_length(tvb);
7133 curr_offset = offset;
7134 bit_offset = curr_offset << 3;
7136 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "PCH and NCH Info", "Present", "Not present"))
7137 { /* PCH and NCH Info */
7138 bit_offset_sav = bit_offset;
7139 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO].strptr);
7140 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO]);
7141 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_paging_channel_restructuring, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7142 bit_offset += 1;
7143 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nln_sacch, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
7144 bit_offset += 2;
7145 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Call Priority", "Present", "Not Present"))
7147 proto_tree_add_bits_item(subtree2, hf_gsm_a_call_prio, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7148 bit_offset += 3;
7150 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nln_status_sacch, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7151 bit_offset += 1;
7152 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
7154 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "VBS/VGCS options", "Present", "Not present"))
7155 { /* VBS/VGCS options */
7156 bit_offset_sav = bit_offset;
7157 item2 = proto_tree_add_text(subtree, tvb,bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS].strptr);
7158 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS]);
7159 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_vbs_vgcs_inband_notifications, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7160 bit_offset += 1;
7161 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_vbs_vgcs_inband_pagings, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7162 bit_offset += 1;
7163 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
7165 value = gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "DTM", "Supported in Serving cell", "Not Supported in Serving cell");
7166 if (value == TRUE)
7168 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rac, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
7169 bit_offset += 8;
7170 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_max_lapdm, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7171 bit_offset += 3;
7173 gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Band Indicator", "1900", "1800");
7174 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "GPRS MS PWR MAX CCCH", "Present", "Not present"))
7176 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gprs_ms_txpwr_max_ccch, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
7177 bit_offset += 5;
7179 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "MBMS Procedures", "Supported", "Not supported"))
7180 { /* MBMS Procedures */
7181 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dedicated_mode_mbms_notification_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7182 bit_offset += 1;
7183 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mnci_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7184 bit_offset += 1;
7186 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-7", "Present", "Not present"))
7187 { /* Additions in Release 7 */
7188 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "AMR Config", "Present", "Not Present"))
7190 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_amr_config, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
7191 bit_offset += 4;
7194 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
7195 return tvb_len - offset;
7198 /* [3] 10.5.2.36 SI 7 Rest Octets
7199 * [3] 10.5.2.37 SI 8 Rest Octets
7200 * [3] 10.5.2.37a SI 9 Rest Octets
7204 * [3] 10.5.2.37b SI 13 Rest Octets
7206 static const value_string gsm_a_rr_si_change_field_vals[] = {
7207 { 0, "Update of unspecified SI message or SI messages"},
7208 { 1, "Update of SI1 message"},
7209 { 2, "Update of SI2, SI2 bis or SI2 ter message or any instance of SI2quater messages"},
7210 { 3, "Update of SI3, SI4, SI7, SI8, SI16 or SI17 message"},
7211 { 4, "Update of SI9 message"},
7212 { 5, "Update of SI18 or SI20 message"},
7213 { 6, "Update of SI19 message"},
7214 { 7, "Update of SI15 message"},
7215 { 8, "Update of SI2n message"},
7216 { 9, "Update of unknown SI message type"},
7217 { 10, "Update of unknown SI message type"},
7218 { 11, "Update of unknown SI message type"},
7219 { 12, "Update of unknown SI message type"},
7220 { 13, "Update of unknown SI message type"},
7221 { 14, "Update of unknown SI message type"},
7222 { 15, "Update of unknown SI message type"},
7223 { 0, NULL }
7226 static const value_string gsm_a_rr_psi1_repeat_period_vals[] = {
7227 { 0, "1 multiframe"},
7228 { 1, "2 multiframes"},
7229 { 2, "3 multiframes"},
7230 { 3, "4 multiframes"},
7231 { 4, "5 multiframes"},
7232 { 5, "6 multiframes"},
7233 { 6, "7 multiframes"},
7234 { 7, "8 multiframes"},
7235 { 8, "9 multiframes"},
7236 { 9, "10 multiframes"},
7237 { 10, "11 multiframes"},
7238 { 11, "12 multiframes"},
7239 { 12, "13 multiframes"},
7240 { 13, "14 multiframes"},
7241 { 14, "15 multiframes"},
7242 { 15, "16 multiframes"},
7243 { 0, NULL }
7246 static const value_string gsm_a_rr_pbcch_pb_vals[] = {
7247 { 0, "0 dB"},
7248 { 1, "-2 dB"},
7249 { 2, "-4 dB"},
7250 { 3, "-6 dB"},
7251 { 4, "-8 dB"},
7252 { 5, "-10 dB"},
7253 { 6, "-12 dB"},
7254 { 7, "-14 dB"},
7255 { 8, "-16 dB"},
7256 { 9, "-18 dB"},
7257 { 10, "-20 dB"},
7258 { 11, "-22 dB"},
7259 { 12, "-24 dB"},
7260 { 13, "-26 dB"},
7261 { 14, "-28 dB"},
7262 { 15, "-30 dB"},
7263 { 0, NULL }
7266 static const true_false_string gsm_a_rr_spgc_ccch_sup_value = {
7267 "SPLIT_PG_CYCLE is supported on CCCH in this cell",
7268 "SPLIT_PG_CYCLE is not supported on CCCH in this cell"
7271 static const value_string gsm_a_rr_priority_access_thr_vals[] = {
7272 { 0, "Packet access is not allowed in the cell"},
7273 { 1, "Packet access is not allowed in the cell"},
7274 { 2, "Packet access is not allowed in the cell"},
7275 { 3, "Packet access is allowed for priority level 1"},
7276 { 4, "Packet access is allowed for priority level 1 to 2"},
7277 { 5, "Packet access is allowed for priority level 1 to 3"},
7278 { 6, "Packet access is allowed for priority level 1 to 4"},
7279 { 7, "Packet access is allowed for priority level 1 to 4"},
7280 { 0, NULL }
7283 static gint
7284 de_rr_rest_oct_gprs_mobile_allocation(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
7286 proto_tree *subtree;
7287 proto_item *item;
7288 gint curr_bit_offset;
7289 guint8 value;
7290 guint64 ma_length;
7292 curr_bit_offset = bit_offset;
7294 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC].strptr);
7295 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC]);
7296 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_hsn, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
7297 curr_bit_offset += 6;
7298 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RFL number list", "Present", "Not Present"))
7300 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rfl_number, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN);
7301 curr_bit_offset += 4;
7303 if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "MA", "Not Present", "Present"))
7305 while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "ARFCN index list", "Present", "Not Present"))
7307 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_arfcn_index, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
7308 curr_bit_offset += 6;
7311 else
7313 proto_tree_add_bits_ret_val(subtree, hf_gsm_a_rr_ma_length, tvb, curr_bit_offset, 6, &ma_length, ENC_BIG_ENDIAN);
7314 curr_bit_offset += 6;
7315 value = (gint)ma_length + 1;
7316 item = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (value>>3)+1, "MA Bitmap: ");
7317 while (value)
7319 proto_item_append_text(item,"%d",tvb_get_bits8(tvb,curr_bit_offset,1));
7320 curr_bit_offset += 1;
7321 value -= 1;
7324 proto_item_set_len(item,((curr_bit_offset>>3) - (bit_offset>>3) + 1));
7326 return (curr_bit_offset - bit_offset);
7329 static const value_string gsm_a_rr_nmo_vals[] = {
7330 { 0, "Network Mode of Operation I"},
7331 { 1, "Network Mode of Operation II"},
7332 { 2, "Network Mode of Operation III"},
7333 { 3, "Reserved"},
7334 { 0, NULL }
7337 static const value_string gsm_a_rr_t3168_vals[] = {
7338 { 0, "500 ms"},
7339 { 1, "1000 ms"},
7340 { 2, "1500 ms"},
7341 { 3, "2000 ms"},
7342 { 4, "2500 ms"},
7343 { 5, "3000 ms"},
7344 { 6, "3500 ms"},
7345 { 7, "4000 ms"},
7346 { 0, NULL }
7349 static const value_string gsm_a_rr_t3192_vals[] = {
7350 { 0, "500 ms"},
7351 { 1, "1000 ms"},
7352 { 2, "1500 ms"},
7353 { 3, "0 ms"},
7354 { 4, "80 ms"},
7355 { 5, "120 ms"},
7356 { 6, "160 ms"},
7357 { 7, "200 ms"},
7358 { 0, NULL }
7361 static const value_string gsm_a_rr_drx_timer_max_vals[] = {
7362 { 0, "0 s"},
7363 { 1, "1 s"},
7364 { 2, "2 s"},
7365 { 3, "4 s"},
7366 { 4, "8 s"},
7367 { 5, "16 s"},
7368 { 6, "32 s"},
7369 { 7, "64 s"},
7370 { 0, NULL }
7373 static const true_false_string gsm_a_rr_access_burst_type_value = {
7374 "11-bit format shall be used",
7375 "8-bit format shall be used"
7378 static const true_false_string gsm_a_rr_control_ack_type_value = {
7379 "Default format is RLC/MAC control block",
7380 "Default format is four access bursts"
7383 static const value_string gsm_a_rr_pan_max_vals[] = {
7384 { 0, "maximum value allowed for counter N3102 is 4"},
7385 { 1, "maximum value allowed for counter N3102 is 8"},
7386 { 2, "maximum value allowed for counter N3102 is 12"},
7387 { 3, "maximum value allowed for counter N3102 is 16"},
7388 { 4, "maximum value allowed for counter N3102 is 20"},
7389 { 5, "maximum value allowed for counter N3102 is 24"},
7390 { 6, "maximum value allowed for counter N3102 is 28"},
7391 { 7, "maximum value allowed for counter N3102 is 32"},
7392 { 0, NULL }
7395 static const true_false_string gsm_a_rr_egprs_packet_channel_request_value = {
7396 "Use two phase packet access with PACKET CHANNEL REQUEST message for uplink TBF establishment on the PRACH",
7397 "Use EGPRS PACKET CHANNEL REQUEST message for uplink TBF establishment on the PRACH"
7400 static const value_string gsm_a_rr_bep_period_vals[] = {
7401 { 0, "1"},
7402 { 1, "2"},
7403 { 2, "3"},
7404 { 3, "4"},
7405 { 4, "5"},
7406 { 5, "7"},
7407 { 6, "10"},
7408 { 7, "12"},
7409 { 8, "15"},
7410 { 9, "20"},
7411 { 10, "25"},
7412 { 11, "Reserved"},
7413 { 12, "Reserved"},
7414 { 13, "Reserved"},
7415 { 14, "Reserved"},
7416 { 15, "Reserved"},
7417 { 0, NULL }
7420 static const true_false_string gsm_a_rr_pfc_feature_mode_value = {
7421 "The network supports packet flow context procedures",
7422 "The network does not support packet flow context procedures"
7425 static const true_false_string gsm_a_rr_dtm_support_value = {
7426 "The cell supports DTM procedures",
7427 "The cell does not support DTM procedures"
7430 static const true_false_string gsm_a_rr_bss_paging_coordination_value = {
7431 "The cell supports Circuit-Switched paging coordination",
7432 "The cell does not support Circuit-Switched paging coordination"
7435 static const true_false_string gsm_a_rr_ccn_active_value = {
7436 "CCN is enabled in the cell",
7437 "CCN is disabled in the cell"
7440 static const true_false_string gsm_a_rr_nw_ext_utbf_value = {
7441 "The extended uplink TBF mode is supported by the network",
7442 "The extended uplink TBF mode is not supported by the network"
7445 static const true_false_string gsm_a_rr_multiple_tbf_capability_value = {
7446 "The cell supports multiple TBF procedures",
7447 "The cell does not support multiple TBF procedures"
7450 static const true_false_string gsm_a_rr_ext_utbf_no_data_value = {
7451 "The mobile station may refrain from sending a PACKET UPLINK DUMMY CONTROL BLOCK message when there is no other RLC/MAC block ready to send in an uplink radio block allocated by the network",
7452 "The mobile station shall send a PACKET UPLINK DUMMY CONTROL BLOCK message when there is no other RLC/MAC block ready to send in an uplink radio block allocated by the network"
7455 static const true_false_string gsm_a_rr_dtm_enhancements_capability_value = {
7456 "The cell supports enhanced DTM CS establishment and enhanced DTM CS release procedures",
7457 "The cell does not support enhanced DTM CS establishment and enhanced DTM CS release procedures"
7460 static const true_false_string gsm_a_rr_reduced_latency_access_value = {
7461 "The cell supports \"One Phase Access Request by Reduced Latency MS\"",
7462 "The cell does not support \"One Phase Access Request by Reduced Latency MS\""
7465 static const value_string gsm_a_rr_alpha_vals[] = {
7466 { 0, "0.0"},
7467 { 1, "0.1"},
7468 { 2, "0.2"},
7469 { 3, "0.3"},
7470 { 4, "0.4"},
7471 { 5, "0.5"},
7472 { 6, "0.6"},
7473 { 7, "0.7"},
7474 { 8, "0.8"},
7475 { 9, "0.9"},
7476 { 10, "1.0"},
7477 { 11, "1.0"},
7478 { 12, "1.0"},
7479 { 13, "1.0"},
7480 { 14, "1.0"},
7481 { 15, "1.0"},
7482 { 0, NULL }
7485 static const value_string gsm_a_rr_t_avg_x_vals[] = {
7486 { 0, "2^(0/2) / 6 multiframes"},
7487 { 1, "2^(1/2) / 6 multiframes"},
7488 { 2, "2^(2/2) / 6 multiframes"},
7489 { 3, "2^(3/2) / 6 multiframes"},
7490 { 4, "2^(4/2) / 6 multiframes"},
7491 { 5, "2^(5/2) / 6 multiframes"},
7492 { 6, "2^(6/2) / 6 multiframes"},
7493 { 7, "2^(7/2) / 6 multiframes"},
7494 { 8, "2^(8/2) / 6 multiframes"},
7495 { 9, "2^(9/2) / 6 multiframes"},
7496 { 10, "2^(10/2) / 6 multiframes"},
7497 { 11, "2^(11/2) / 6 multiframes"},
7498 { 12, "2^(12/2) / 6 multiframes"},
7499 { 13, "2^(13/2) / 6 multiframes"},
7500 { 14, "2^(14/2) / 6 multiframes"},
7501 { 15, "2^(15/2) / 6 multiframes"},
7502 { 16, "2^(16/2) / 6 multiframes"},
7503 { 17, "2^(17/2) / 6 multiframes"},
7504 { 18, "2^(18/2) / 6 multiframes"},
7505 { 19, "2^(19/2) / 6 multiframes"},
7506 { 20, "2^(20/2) / 6 multiframes"},
7507 { 21, "2^(21/2) / 6 multiframes"},
7508 { 22, "2^(22/2) / 6 multiframes"},
7509 { 23, "2^(23/2) / 6 multiframes"},
7510 { 24, "2^(24/2) / 6 multiframes"},
7511 { 25, "2^(25/2) / 6 multiframes"},
7512 { 26, "2^(25/2) / 6 multiframes"},
7513 { 27, "2^(25/2) / 6 multiframes"},
7514 { 28, "2^(25/2) / 6 multiframes"},
7515 { 29, "2^(25/2) / 6 multiframes"},
7516 { 30, "2^(25/2) / 6 multiframes"},
7517 { 31, "2^(25/2) / 6 multiframes"},
7518 { 0, NULL }
7521 static const true_false_string gsm_a_rr_pc_meas_chan_value = {
7522 "Downlink measurements for power control shall be made on PDCH",
7523 "Downlink measurements for power control shall be made on BCCH"
7526 static const value_string gsm_a_rr_n_avg_i_vals[] = {
7527 { 0, "2^(0/2)"},
7528 { 1, "2^(1/2)"},
7529 { 2, "2^(2/2)"},
7530 { 3, "2^(3/2)"},
7531 { 4, "2^(4/2)"},
7532 { 5, "2^(5/2)"},
7533 { 6, "2^(6/2)"},
7534 { 7, "2^(7/2)"},
7535 { 8, "2^(8/2)"},
7536 { 9, "2^(9/2)"},
7537 { 10, "2^(10/2)"},
7538 { 11, "2^(11/2)"},
7539 { 12, "2^(12/2)"},
7540 { 13, "2^(13/2)"},
7541 { 14, "2^(14/2)"},
7542 { 15, "2^(15/2)"},
7543 { 0, NULL }
7546 static const true_false_string gsm_a_rr_sgsnr_value = {
7547 "SGSN is Release '99 onwards",
7548 "SGSN is Release '98 or older"
7551 static const true_false_string gsm_a_rr_si_status_ind_value = {
7552 "The network supports the PACKET SI STATUS message",
7553 "The network does not support the PACKET SI STATUS message"
7556 static const value_string gsm_a_rr_lb_ms_txpwr_max_cch_vals[] = {
7557 { 0, "43 dBm"},
7558 { 1, "41 dBm"},
7559 { 2, "39 dBm"},
7560 { 3, "37 dBm"},
7561 { 4, "35 dBm"},
7562 { 5, "33 dBm"},
7563 { 6, "31 dBm"},
7564 { 7, "29 dBm"},
7565 { 8, "27 dBm"},
7566 { 9, "25 dBm"},
7567 { 10, "23 dBm"},
7568 { 11, "21 dBm"},
7569 { 12, "19 dBm"},
7570 { 13, "17 dBm"},
7571 { 14, "15 dBm"},
7572 { 15, "13 dBm"},
7573 { 16, "11 dBm"},
7574 { 17, "9 dBm"},
7575 { 18, "7 dBm"},
7576 { 19, "5 dBm"},
7577 { 20, "5 dBm"},
7578 { 21, "5 dBm"},
7579 { 22, "5 dBm"},
7580 { 23, "5 dBm"},
7581 { 24, "5 dBm"},
7582 { 25, "5 dBm"},
7583 { 26, "5 dBm"},
7584 { 27, "5 dBm"},
7585 { 28, "5 dBm"},
7586 { 29, "5 dBm"},
7587 { 30, "5 dBm"},
7588 { 31, "5 dBm"},
7589 { 0, NULL }
7592 static const value_string gsm_a_rr_si2n_support_vals[] = {
7593 { 0, "SI2n is not supported"},
7594 { 1, "SI2n is supported on PACCH"},
7595 { 2, "SI2n is supported on PACCH and broadcast on BCCH"},
7596 { 3, "SI2n is supported on PACCH and broadcast on BCCH Ext"},
7597 { 0, NULL }
7600 static guint16
7601 de_rr_si13_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7603 proto_tree *subtree2;
7604 proto_item *item2;
7605 guint bit_offset, bit_offset_sav;
7606 guint8 tvb_len = tvb_length(tvb);
7607 guint16 bit_len = tvb_len << 3;
7608 bit_offset = offset << 3;
7610 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "SI13 contents", "Present", "Not present"))
7612 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_change_mark, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7613 bit_offset += 3;
7614 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si_change_field, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
7615 bit_offset += 4;
7616 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "SI13 Change Mark", "Present", "Not Present"))
7618 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13_change_mark, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
7619 bit_offset += 2;
7620 bit_offset += de_rr_rest_oct_gprs_mobile_allocation(tvb, subtree, bit_offset);
7622 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "PBCCH", "Present In Cell", "Not Present In Cell"))
7623 { /* PBCCH present in the cell */
7624 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_psi1_repeat_period, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
7625 bit_offset += 4;
7626 bit_offset_sav = bit_offset;
7627 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PBCCH_DESC].strptr);
7628 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PBCCH_DESC]);
7629 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_pb, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
7630 bit_offset += 4;
7631 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_tsc, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7632 bit_offset += 3;
7633 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_tn, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7634 bit_offset += 3;
7635 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "MAIO", "Present", "Not Present"))
7637 proto_tree_add_text(subtree2, tvb, bit_offset>>3, 1, "MAIO: %d", tvb_get_bits8(tvb,bit_offset,6));
7638 bit_offset += 6;
7640 else
7642 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "ARFCN", "Present", "Not Present"))
7644 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_arfcn, tvb, bit_offset, 10, ENC_BIG_ENDIAN);
7645 bit_offset += 10;
7647 else
7648 proto_tree_add_text(subtree2, tvb, bit_offset>>3, 1, "PBCCH shall use the BCCH carrier");
7650 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
7652 else
7653 { /* PBCCH not present in the cell */
7654 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rac, tvb, bit_offset, 8, ENC_BIG_ENDIAN);
7655 bit_offset += 8;
7656 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_spgc_ccch_sup, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7657 bit_offset += 1;
7658 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_priority_access_thr, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
7659 bit_offset += 3;
7660 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_network_control_order, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
7661 bit_offset += 2;
7662 bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, subtree, bit_offset);
7663 bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, subtree, bit_offset);
7666 /* Null breakpoint */
7667 if (bit_offset < bit_len)
7669 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in R99", "Present", "Not present"))
7670 { /* Additions in release 99 */
7671 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_sgsnr, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7672 bit_offset += 1;
7674 /* Null breakpoint */
7675 if (bit_offset < bit_len)
7677 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-4", "Present", "Not present"))
7678 { /* Additions in release Rel-4 */
7679 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si_status_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7680 bit_offset += 1;
7682 /* Null breakpoint */
7683 if (bit_offset < bit_len)
7685 if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "Additions in Rel-6", "Present", "Not present"))
7686 { /* Additions in release Rel-6 */
7687 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "LB MS TXPWR MAX CCH ", "Present", "Not Present"))
7689 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_lb_ms_txpwr_max_cch, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
7690 bit_offset += 5;
7692 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2n_support, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
7693 bit_offset += 2;
7701 gsm_rr_csn_padding_bits(subtree, tvb, bit_offset, tvb_len);
7702 return tvb_len - offset;
7705 /* [3] 10.5.2.37c (void)
7706 * [3] 10.5.2.37d (void)
7707 * [3] 10.5.2.37e SI 16 Rest Octets
7708 * [3] 10.5.2.37f SI 17 Rest Octets
7709 * [3] 10.5.2.37g SI 19 Rest Octets
7710 * [3] 10.5.2.37h SI 18 Rest Octets
7711 * [3] 10.5.2.37i SI 20 Rest Octets
7714 * [3] 10.5.2.38 Starting Time
7716 static guint16
7717 de_rr_starting_time(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7719 proto_item *item;
7720 guint32 curr_offset;
7721 guint16 rfn, fn;
7723 curr_offset = offset;
7725 fn = tvb_get_ntohs(tvb,curr_offset);
7726 rfn = reduced_frame_number(fn);
7727 proto_tree_add_item(tree, hf_gsm_a_rr_T1prim, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7728 proto_tree_add_item(tree, hf_gsm_a_rr_T3, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
7729 curr_offset++;
7730 proto_tree_add_item(tree, hf_gsm_a_rr_T2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7731 curr_offset++;
7732 item = proto_tree_add_uint(tree, hf_gsm_a_rr_rfn, tvb, curr_offset-2, 2, rfn);
7733 PROTO_ITEM_SET_GENERATED(item);
7734 return(curr_offset - offset);
7737 * [3] 10.5.2.39 Synchronization Indication
7740 * ROT: Report Observed Time Difference (Octet1 bit 3) */
7742 static const true_false_string sm_a_rr_sync_ind_rot_value = {
7743 "Mobile Time Difference IE shall be included in the HANDOVER COMPLETE message",
7744 "Mobile Time Difference IE shall not be included in the HANDOVER COMPLETE message"
7747 /* SI: Synchronization indication (octet 1)Bit2 1 */
7749 static const value_string gsm_a_rr_sync_ind_si_vals[] = {
7750 { 0, "Non-synchronized"},
7751 { 1, "Synchronized"},
7752 { 2, "Pre-synchronised"},
7753 { 3, "Pseudo-synchronised"},
7754 { 0, NULL }
7756 /* NCI: Normal cell indication (octet 1, bit 4) */
7758 static const true_false_string gsm_a_rr_sync_ind_nci_value = {
7759 "Out of range timing advance shall trigger a handover failure procedure",
7760 "Out of range timing advance is ignored"
7762 static guint16
7763 de_rr_sync_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7765 guint32 curr_offset;
7767 curr_offset = offset;
7769 /*NCI */
7770 proto_tree_add_item(tree, hf_gsm_a_rr_sync_ind_nci, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7771 /*ROT */
7772 proto_tree_add_item(tree, hf_gsm_a_rr_sync_ind_rot, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7773 /*SI*/
7774 proto_tree_add_item(tree, hf_gsm_a_rr_sync_ind_si, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7776 curr_offset = curr_offset + 1;
7778 return(curr_offset - offset);
7782 * [3] 10.5.2.40 Timing Advance
7784 static guint16
7785 de_rr_timing_adv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7787 guint32 curr_offset;
7789 curr_offset = offset;
7791 proto_tree_add_item(tree, hf_gsm_a_rr_timing_adv, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7792 curr_offset = curr_offset + 1;
7794 return(curr_offset - offset);
7798 * [3] 10.5.2.41 Time Difference
7800 static guint16
7801 de_rr_time_diff(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7803 guint32 curr_offset;
7805 curr_offset = offset;
7807 proto_tree_add_item(tree, hf_gsm_a_rr_time_diff, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7808 curr_offset = curr_offset + 1;
7810 return(curr_offset - offset);
7813 * [3] 10.5.2.41a TLLI
7814 * The TLLI is encoded as a binary number with a length of 4 octets. TLLI is defined in 3GPP TS 23.003
7816 guint16
7817 de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7819 guint32 curr_offset, tlli;
7821 curr_offset = offset;
7823 tlli = tvb_get_ntohl(tvb, curr_offset);
7824 proto_tree_add_item(tree, hf_gsm_a_rr_tlli, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
7825 curr_offset = curr_offset + 4;
7826 if(add_string)
7827 g_snprintf(add_string, string_len, " - 0x%x", tlli);
7829 return(curr_offset - offset);
7833 * [3] 10.5.2.42 TMSI/P-TMSI
7835 static guint16
7836 de_rr_tmsi_ptmsi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7838 proto_tree *subtree;
7839 proto_item *item;
7840 guint32 curr_offset;
7842 curr_offset = offset;
7844 item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
7845 val_to_str_ext_const(DE_RR_TMSI_PTMSI, &gsm_rr_elem_strings_ext, ""));
7847 subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_TMSI_PTMSI]);
7849 proto_tree_add_item(subtree, hf_gsm_a_rr_tmsi_ptmsi, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
7850 curr_offset = curr_offset + 4;
7852 return(curr_offset - offset);
7856 * [3] 10.5.2.42a VGCS target mode Indication
7859 Target mode (octet 3)
7860 Bit 8 7
7861 0 0 dedicated mode
7862 0 1 group transmit mode
7863 Other values are reserved for future use.
7865 static const value_string gsm_a_rr_target_mode_vals[] _U_ = {
7866 { 0, "Dedicated mode"},
7867 { 1, "Group transmit mode"},
7868 { 0, NULL }
7870 static guint16
7871 de_rr_vgcs_tar_mode_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7873 guint32 curr_offset;
7875 curr_offset = offset;
7877 proto_tree_add_item(tree, hf_gsm_a_rr_target_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7878 proto_tree_add_item(tree, hf_gsm_a_rr_group_cipher_key_number, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7879 curr_offset = curr_offset + 1;
7881 return(curr_offset - offset);
7885 * [3] 10.5.2.42b VGCS Ciphering Parameters
7887 static guint16
7888 de_rr_vgcs_cip_par(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7890 guint32 curr_offset;
7892 curr_offset = offset;
7894 proto_tree_add_text(tree,tvb, curr_offset, len ,"Data(Not decoded)");
7896 curr_offset = curr_offset + 2;
7898 return(curr_offset - offset);
7901 * [3] 10.5.2.43 Wait Indication
7903 static guint16
7904 de_rr_wait_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7906 guint32 curr_offset;
7908 curr_offset = offset;
7910 proto_tree_add_item(tree, hf_gsm_a_rr_wait_indication, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7912 curr_offset = curr_offset + 1;
7914 return(curr_offset - offset);
7918 * [3] 10.5.2.44 SI10 rest octets $(ASCI)$
7922 * [3] 10.5.2.45 Extended Measurement Results
7924 static guint16
7925 de_rr_ext_meas_result(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
7927 guint32 curr_offset;
7928 gint bit_offset, i;
7929 guint8 value;
7931 curr_offset = offset;
7932 bit_offset = curr_offset << 3;
7934 proto_tree_add_bits_item(tree, hf_gsm_a_rr_seq_code, tvb,bit_offset, 1, ENC_BIG_ENDIAN);
7935 bit_offset += 1;
7936 proto_tree_add_bits_item(tree, hf_gsm_a_rr_dtx_used, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
7937 bit_offset += 1;
7938 for (i=0; i<21; i++)
7940 value = tvb_get_bits8(tvb,bit_offset,6);
7941 proto_tree_add_text(tree, tvb, bit_offset>>3, 1, "RXLEV carrier %d: %s (%d)",i,val_to_str_ext_const(value, &gsm_a_rr_rxlev_vals_ext, "Unknown"),value);
7942 bit_offset += 6;
7945 curr_offset = offset + len;
7947 return(curr_offset - offset);
7951 * [3] 10.5.2.46 Extended Measurement Frequency List
7953 static guint16
7954 de_rr_ext_meas_freq_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7956 guint32 curr_offset;
7958 curr_offset = offset;
7960 proto_tree_add_bits_item(tree, hf_gsm_a_rr_seq_code, tvb,(curr_offset<<3)+3, 1, ENC_BIG_ENDIAN);
7962 return dissect_arfcn_list(tvb, tree, pinfo, offset, 16, add_string, string_len);
7966 * [3] 10.5.2.47 Suspension Cause
7968 /*Suspension cause value (octet 2)*/
7969 static const value_string gsm_a_rr_suspension_cause_vals[] = {
7970 { 0, "Emergency call, mobile originating call or call re-establishment"},
7971 { 1, "Location Area Update"},
7972 { 2, "MO Short message service"},
7973 { 3, "Other procedure which can be completed with an SDCCH"},
7974 { 4, "MO Voice broadcast or group call"},
7975 { 5, "Mobile terminating CS connection"},
7976 { 6, "DTM not supported in the cell"},
7977 { 0, NULL }
7979 guint16
7980 de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
7982 guint32 curr_offset;
7984 curr_offset = offset;
7986 proto_tree_add_item(tree, hf_gsm_a_rr_suspension_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
7988 curr_offset = curr_offset + 1;
7990 return(curr_offset - offset);
7993 * [3] 10.5.2.48 APDU ID
7995 static const value_string gsm_a_rr_apdu_id_vals[] = {
7996 { 0, "RRLP (GSM 04.31) LCS" },
7997 { 0, NULL },
7999 static guint16
8000 de_rr_apdu_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
8002 proto_tree_add_item(tree, hf_gsm_a_rr_apdu_id, tvb, offset, 1, ENC_BIG_ENDIAN);
8004 return 0;
8008 * [3] 10.5.2.49 APDU Flags
8010 static const value_string gsm_a_rr_apdu_flags_vals[] = {
8011 { 1, "Last or only segment" },
8012 { 2, "First or only segment" },
8013 { 0, NULL },
8015 static guint16
8016 de_rr_apdu_flags(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
8018 proto_tree_add_item(tree, hf_gsm_a_rr_apdu_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
8020 return 1;
8024 * [3] 10.5.2.50 APDU Data
8026 static guint16
8027 de_rr_apdu_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
8029 tvbuff_t *sub_tvb;
8031 sub_tvb = tvb_new_subset(tvb, offset, len, len);
8033 if (rrlp_dissector)
8034 call_dissector(rrlp_dissector, sub_tvb,pinfo, tree);
8036 return len;
8040 * [3] 10.5.2.51 Handover To UTRAN Command
8042 static guint16
8043 de_rr_ho_to_utran_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
8045 guint32 curr_offset;
8046 tvbuff_t *rrc_irat_ho_to_utran_cmd_tvb;
8048 curr_offset = offset;
8049 if (len)
8051 rrc_irat_ho_to_utran_cmd_tvb = tvb_new_subset(tvb, curr_offset, len, len);
8052 if (rrc_irat_ho_to_utran_cmd_handle)
8053 call_dissector(rrc_irat_ho_to_utran_cmd_handle, rrc_irat_ho_to_utran_cmd_tvb, pinfo, tree);
8056 curr_offset += len;
8057 return(curr_offset - offset);
8062 * [3] 10.5.2.52 Handover To cdma2000 Command
8063 * [3] 10.5.2.53 (void)
8064 * [3] 10.5.2.54 (void)
8065 * [3] 10.5.2.55 (void)
8066 * [3] 10.5.2.56 3G Target Cell
8069 * 10.5.2.57 Service Support
8071 static const true_false_string gsm_a_rr_MBMS_multicast_value = {
8072 "mobile station requires notification of multicast MBMS services",
8073 "mobile station does not require notification of multicast MBMS services"
8075 static const true_false_string gsm_a_rr_MBMS_broadcast_value = {
8076 "mobile station requires notification of broadcast MBMS services",
8077 "mobile station does not require notification of broadcast MBMS services"
8079 static guint16
8080 de_rr_serv_sup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
8082 guint32 curr_offset;
8084 curr_offset = offset;
8085 /* bit 1
8086 * 0 mobile station does not require notification of broadcast MBMS services
8087 * 1 mobile station requires notification of broadcast MBMS services
8088 * bit 2
8089 * 0 mobile station does not require notification of multicast MBMS services
8090 * 1 mobile station requires notification of multicast MBMS services
8092 /* MBMS Multicast */
8093 proto_tree_add_item(tree, hf_gsm_a_rr_MBMS_multicast, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
8095 /* MBMS Broadcast */
8096 proto_tree_add_item(tree, hf_gsm_a_rr_MBMS_broadcast, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
8097 curr_offset++;
8099 return(curr_offset - offset);
8103 * [3] 10.5.2.59 Dedicated Service Information
8106 Last Segment (octet 2)
8107 bit 1
8108 0 mobile station shall not perform Service Information Sending procedure on new cell.
8109 1 mobile station shall perform Service Information Sending procedure on new cell.
8111 static const true_false_string gsm_a_rr_last_segment_value = {
8112 "Mobile station shall perform Service Information Sending procedure on new cell.",
8113 "mobile station shall not perform Service Information Sending procedure on new cell."
8115 static guint16
8116 de_rr_ded_serv_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
8118 guint32 curr_offset;
8120 curr_offset = offset;
8122 proto_tree_add_item(tree, hf_gsm_a_rr_last_segment, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
8124 curr_offset = curr_offset + 3;
8126 return(curr_offset - offset);
8130 * [3] 10.5.2.69 Carrier Indication
8132 static const true_false_string gsm_a_rr_carrier_ind_value = {
8133 "Carrier 2",
8134 "Carrier 1"
8137 static guint16
8138 de_rr_carrier_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
8140 proto_tree *subtree;
8141 proto_item *item;
8142 guint32 curr_offset;
8144 curr_offset = offset;
8146 item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
8147 val_to_str_ext_const(DE_RR_CARRIER_IND, &gsm_rr_elem_strings_ext, ""));
8149 subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CARRIER_IND]);
8151 proto_tree_add_item(subtree, hf_gsm_a_rr_carrier_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
8153 curr_offset += 1;
8155 return(curr_offset - offset);
8158 guint16 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len) = {
8159 /* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
8161 de_rr_ba_range, /* [3] 10.5.2.1a BA Range */
8162 de_rr_cell_ch_dsc, /* [3] 10.5.2.1b Cell Channel Description */
8163 de_rr_ba_list_pref, /* [3] 10.5.2.1c BA List Pref */
8164 de_rr_utran_freq_list, /* [3] 10.5.2.1d UTRAN Frequency List */
8165 de_rr_cell_select_indic, /* [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH IE */
8166 de_rr_cell_dsc, /* 10.5.2.2 RR Cell Description */
8167 de_rr_cell_opt_bcch, /* [3] 10.5.2.3 Cell Options (BCCH) */
8168 de_rr_cell_opt_sacch, /* [3] 10.5.2.3a Cell Options (SACCH) */
8169 de_rr_cell_sel_param, /* [3] 10.5.2.4 Cell Selection Parameters */
8171 * [3] 10.5.2.4a (void)
8173 de_rr_ch_dsc, /* [3] 10.5.2.5 Channel Description */
8174 de_rr_ch_dsc2, /* [3] 10.5.2.5a RR Channel Description 2 */
8175 de_rr_ch_dsc3, /* [3] 10.5.2.5c RR Channel Description 3 */
8176 de_rr_ch_mode, /* [3] 10.5.2.6 Channel Mode */
8177 de_rr_ch_mode2, /* [3] 10.5.2.7 Channel Mode 2 */
8178 de_rr_utran_cm, /* [3] 10.5.2.7a UTRAN Classmark */
8179 /* [3] 10.5.2.7b (void) */
8181 de_rr_cm_enq_mask, /* [3] 10.5.2.7c Classmark Enquiry Mask */
8182 /* [3] 10.5.2.7d GERAN Iu Mode Classmark information element */
8183 de_rr_chnl_needed, /* [3] 10.5.2.8 Channel Needed
8184 * [3] 10.5.2.8a (void) */
8185 de_rr_chnl_req_desc2, /* [3] 10.5.2.8b Channel Request Description 2 */
8186 /* Pos 20 */
8187 de_rr_cip_mode_set, /* [3] 10.5.2.9 Cipher Mode Setting */
8188 de_rr_cip_mode_resp, /* [3] 10.5.2.10 Cipher Response */
8189 de_rr_ctrl_ch_desc, /* [3] 10.5.2.11 Control Channel Description */
8190 de_rr_dtm_info_details, /* [3] 10.5.2.11a DTM Information Details */
8191 de_rr_dyn_arfcn_map, /* [3] 10.5.2.11b Dynamic ARFCN Mapping */
8192 de_rr_freq_ch_seq, /* [3] 10.5.2.12 Frequency Channel Sequence */
8193 de_rr_freq_list, /* [3] 10.5.2.13 Frequency List */
8194 de_rr_freq_short_list, /* [3] 10.5.2.14 Frequency Short List */
8195 de_rr_freq_short_list2, /* [3] 10.5.2.14a Frequency Short List 2 */
8196 /* [3] 10.5.2.14b Group Channel Description */
8197 de_rr_gprs_resumption, /* [3] 10.5.2.14c GPRS Resumption */
8198 de_rr_gprs_broadcast_info, /* [3] 10.5.2.14d GPRS broadcast information */
8199 /* [3] 10.5.2.14e Enhanced DTM CS Release Indication */
8200 de_rr_ho_ref, /* 10.5.2.15 Handover Reference */
8201 de_rr_ia_rest_oct, /* [3] 10.5.2.16 IA Rest Octets */
8202 de_rr_iar_rest_oct, /* [3] 10.5.2.17 IAR Rest Octets */
8203 de_rr_iax_rest_oct, /* [3] 10.5.2.18 IAX Rest Octets */
8204 de_rr_l2_pseudo_len, /*[3] 10.5.2.19 L2 Pseudo Length */
8205 de_rr_meas_res, /* [3] 10.5.2.20 Measurement Results */
8207 * [3] (void)
8209 de_rr_mob_all, /* [3] 10.5.2.21 Mobile Allocation */
8210 de_rr_mob_time_diff, /* [3] 10.5.2.21a Mobile Time Difference */
8211 de_rr_multirate_conf, /* [3] 10.5.2.21aa MultiRate configuration */
8212 /* Pos 30 */
8213 de_rr_mult_all, /* [3] 10.5.2.21b Multislot Allocation */
8215 * [3] 10.5.2.21c (void)
8217 de_rr_neigh_cell_desc, /* [3] 10.5.2.22 Neighbour Cell Description */
8218 de_rr_neigh_cell_desc2, /* [3] 10.5.2.22a Neighbour Cell Description 2 */
8220 * [3] 10.5.2.22b (void)
8221 * [3] 10.5.2.22c NT/N Rest Octets */
8222 de_rr_p1_rest_oct, /* [3] 10.5.2.23 P1 Rest Octets */
8223 de_rr_p2_rest_oct, /* [3] 10.5.2.24 P2 Rest Octets */
8224 de_rr_p3_rest_oct, /* [3] 10.5.2.25 P3 Rest Octets */
8225 de_rr_packet_ch_desc, /* [3] 10.5.2.25a Packet Channel Description */
8226 de_rr_ded_mod_or_tbf, /* [3] 10.5.2.25b Dedicated mode or TBF */
8227 de_rr_pkt_ul_ass, /* [3] 10.5.2.25c RR Packet Uplink Assignment */
8228 de_rr_pkt_dl_ass, /* [3] 10.5.2.25d RR Packet Downlink Assignment */
8229 de_rr_pkt_dl_ass_type2, /* [3] 10.5.2.25e RR Packet Downlink Assignment Type 2 */
8230 de_rr_page_mode, /* [3] 10.5.2.26 Page Mode */
8232 * [3] 10.5.2.26a (void)
8233 * [3] 10.5.2.26b (void)
8234 * [3] 10.5.2.26c (void)
8235 * [3] 10.5.2.26d (void)
8237 de_rr_ncc_perm, /* [3] 10.5.2.27 NCC Permitted */
8238 de_rr_pow_cmd, /* 10.5.2.28 Power Command */
8239 de_rr_pow_cmd_and_acc_type, /* 10.5.2.28a Power Command and access type */
8240 de_rr_rach_ctrl_param, /* [3] 10.5.2.29 RACH Control Parameters */
8241 de_rr_req_ref, /* [3] 10.5.2.30 Request Reference */
8242 de_rr_cause, /* 10.5.2.31 RR Cause */
8243 de_rr_sync_ind, /* 10.5.2.39 Synchronization Indication */
8244 de_rr_si1_rest_oct, /* [3] 10.5.2.32 SI1 Rest Octets */
8245 /* [3] 10.5.2.33 SI 2bis Rest Octets */
8246 de_rr_si2ter_rest_oct, /* [3] 10.5.2.33a SI 2ter Rest Octets */
8247 de_rr_si2quater_rest_oct, /* [3] 10.5.2.33b SI 2quater Rest Octets */
8248 de_rr_si3_rest_oct, /* [3] 10.5.2.34 SI3 Rest Octets */
8249 de_rr_si4_rest_oct, /* [3] 10.5.2.35 SI4 Rest Octets */
8250 de_rr_si6_rest_oct, /* [3] 10.5.2.35b SI6 Rest Octets */
8251 /* [3] 10.5.2.36 SI 7 Rest Octets
8252 * [3] 10.5.2.37 SI 8 Rest Octets
8253 * [3] 10.5.2.37a SI 9 Rest Octets
8255 de_rr_si13_rest_oct, /* [3] 10.5.2.37a SI13 Rest Octets */
8256 /* [3] 10.5.2.37c (void)
8257 * [3] 10.5.2.37d (void)
8258 * [3] 10.5.2.37e SI 16 Rest Octets
8259 * [3] 10.5.2.37f SI 17 Rest Octets
8260 * [3] 10.5.2.37g SI 19 Rest Octets
8261 * [3] 10.5.2.37h SI 18 Rest Octets
8262 * [3] 10.5.2.37i SI 20 Rest Octets */
8263 de_rr_starting_time, /* [3] 10.5.2.38 Starting Time */
8264 de_rr_timing_adv, /* [3] 10.5.2.40 Timing Advance */
8265 de_rr_time_diff, /* [3] 10.5.2.41 Time Difference */
8266 de_rr_tlli, /* [3] 10.5.2.41a TLLI */
8267 de_rr_tmsi_ptmsi, /* [3] 10.5.2.42 TMSI/P-TMSI */
8268 de_rr_vgcs_tar_mode_ind, /* [3] 10.5.2.42a VGCS target mode Indication */
8269 /* Pos 40 */
8270 de_rr_vgcs_cip_par, /* [3] 10.5.2.42b VGCS Ciphering Parameters */
8271 de_rr_wait_ind, /* [3] 10.5.2.43 Wait Indication */
8272 /* [3] 10.5.2.44 SI10 rest octets $(ASCI)$ */
8273 de_rr_ext_meas_result, /* [3] 10.5.2.45 Extended Measurement Results */
8274 de_rr_ext_meas_freq_list, /* [3] 10.5.2.46 Extended Measurement Frequency List */
8275 de_rr_sus_cau, /* [3] 10.5.2.47 Suspension Cause */
8276 de_rr_apdu_id, /* [3] 10.5.2.48 APDU ID */
8277 de_rr_apdu_flags, /* [3] 10.5.2.49 APDU Flags */
8278 de_rr_apdu_data, /* [3] 10.5.2.50 APDU Data */
8279 de_rr_ho_to_utran_cmd, /* [3] 10.5.2.51 Handover To UTRAN Command */
8280 /* [3] 10.5.2.52 Handover To cdma2000 Command
8281 * [3] 10.5.2.53 (void)
8282 * [3] 10.5.2.54 (void)
8283 * [3] 10.5.2.55 (void)
8284 * [3] 10.5.2.56 3G Target Cell
8285 * 10.5.2.57 Service Support */
8286 de_rr_serv_sup, /* 10.5.2.57 Service Support */
8288 * 10.5.2.58 MBMS p-t-m Channel Description
8290 de_rr_ded_serv_inf, /* [3] 10.5.2.59 Dedicated Service Information */
8292 * 10.5.2.60 MPRACH Description
8293 * 10.5.2.61 Restriction Timer
8294 * 10.5.2.62 MBMS Session Identity
8295 * 10.5.2.63 Reduced group or broadcast call reference
8296 * 10.5.2.64 Talker Priority status
8297 * 10.5.2.65 Talker Identity
8298 * 10.5.2.66 Token
8299 * 10.5.2.67 PS Cause
8300 * 10.5.2.68 VGCS AMR Configuration
8302 de_rr_carrier_ind, /* 10.5.2.69 Carrier Indication */
8303 NULL, /* NONE */
8306 /* MESSAGE FUNCTIONS */
8309 * 9.1.1 Additional Assignment
8311 static void
8312 dtap_rr_add_ass(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8314 guint32 curr_offset;
8315 guint32 consumed;
8316 guint curr_len;
8318 curr_offset = offset;
8319 curr_len = len;
8321 /* Channel Description 10.5.2.5 M V 3 */
8322 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, NULL);
8324 /* Mobile Allocation 10.5.2.21 C TLV 3-10 */
8325 ELEM_OPT_TLV(0x72, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
8327 /* Starting Time 10.5.2.38 O TV 3 */
8328 ELEM_OPT_TV(0x7c, GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
8330 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8334 * 9.1.2 Assignment command
8336 static void
8337 dtap_rr_ass_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8339 guint32 curr_offset;
8340 guint32 consumed;
8341 guint curr_len;
8343 curr_offset = offset;
8344 curr_len = len;
8346 /* Channel Description 2 10.5.2.5a M V 3 */
8347 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, " - Description of the First Channel, after time");
8349 /* Power Command 10.5.2.28 M V 1 */
8350 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_POW_CMD, NULL);
8352 /* 05 Frequency List 10.5.2.13 C TLV 4-132 */
8353 ELEM_OPT_TLV(0x05, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, after time");
8355 /* 62 Cell Channel Description 10.5.2.1b O TV 17 */
8356 ELEM_OPT_TV(0x62, GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
8358 /* 10 Multislot Allocation 10.5.2.21b C TLV 3-12 */
8359 ELEM_OPT_TLV(0x10,GSM_A_PDU_TYPE_RR, DE_RR_MULT_ALL, " - Description of the multislot configuration");
8361 /* 63 Channel Mode 10.5.2.6 O TV 2 */
8362 ELEM_OPT_TV(0x63,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of the First Channel(Channel Set 1)");
8364 /* 11 Channel Mode 10.5.2.6 O TV 2 */
8365 ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 2");
8367 /* 13 Channel Mode 10.5.2.6 O TV 2 */
8368 ELEM_OPT_TV(0x13,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 3");
8370 /* 14 Channel Mode 10.5.2.6 O TV 2 */
8371 ELEM_OPT_TV(0x14,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 4");
8373 /* 15 Channel Mode 10.5.2.6 O TV 2 */
8374 ELEM_OPT_TV(0x15,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 5");
8376 /* 16 Channel Mode 10.5.2.6 O TV 2 */
8377 ELEM_OPT_TV(0x16,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 6");
8379 /* 17 Channel Mode 10.5.2.6 O TV 2 */
8380 ELEM_OPT_TV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 7");
8382 /* 18 Channel Mode 10.5.2.6 O TV 2 */
8383 ELEM_OPT_TV(0x18,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 8");
8385 /* 64 Channel Description 10.5.2.5 O TV 4 */
8386 ELEM_OPT_TV(0x64,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, "Description of the Second Channel, after time");
8388 /* 66 Channel Mode 2 10.5.2.7 O TV 2 */
8389 ELEM_OPT_TV(0x66,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE2, " - Mode of the Second Channel");
8391 /* 72 Mobile Allocation 10.5.2.21 C TLV 3-10 */
8392 ELEM_OPT_TLV(0x72,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, after time");
8394 /* 7C Starting Time 10.5.2.38 O TV 3 */
8395 ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
8397 /* 19 Frequency List 10.5.2.13 C TLV 4-132 */
8398 ELEM_OPT_TLV(0x19, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, before time");
8400 /* 1C Channel Description 2 10.5.2.5a O TV 4 */
8401 ELEM_OPT_TV(0x1c,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, " - Description of the First Channel, before time");
8403 /* 1D Channel Description 10.5.2.5 O TV 4 */
8404 ELEM_OPT_TV(0x1d,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Description of the Second Channel, before time");
8406 /* 1E Frequency channel sequence 10.5.2.12 C TV 10 */
8407 ELEM_OPT_TV(0x1e,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_CH_SEQ, " - Frequency channel sequence before time");
8409 /* 21 Mobile Allocation 10.5.2.21 C TLV 3-10 */
8410 ELEM_OPT_TLV(0x21,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, before time");
8412 /* 9- Cipher Mode Setting 10.5.2.9 O TV 1 */
8413 ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET, NULL);
8414 /* 01 VGCS target mode Indication VGCS target mode Indication 10.5.2.42a O TLV 3 */
8415 ELEM_OPT_TLV(0x01,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_TAR_MODE_IND, NULL);
8417 /* 03 Multi-Rate configuration, MultiRate configuration 10.5.2.21aa O TLV 4-8 */
8418 ELEM_OPT_TLV(0x03,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
8420 /* 04 VGCS Ciphering Parameters VGCS Ciphering Parameters 10.5.2.42b O TLV 3-15 */
8421 ELEM_OPT_TLV(0x04,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_CIP_PAR, NULL);
8423 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8428 * 9.1.3 Assignment complete
8430 static void
8431 dtap_rr_ass_comp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8433 guint32 curr_offset;
8434 guint32 consumed;
8435 guint curr_len;
8437 curr_offset = offset;
8438 curr_len = len;
8440 /* RR Cause RR Cause 10.5.2.31 M V 1 */
8441 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
8443 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8448 * 9.1.4 Assignment failure
8450 static void
8451 dtap_rr_ass_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8453 guint32 curr_offset;
8454 guint32 consumed;
8455 guint curr_len;
8457 curr_offset = offset;
8458 curr_len = len;
8460 /* RR Cause RR Cause 10.5.2.31 M V 1 */
8461 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
8463 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8468 * 9.1.5 Channel Mode Modify
8470 static void
8471 dtap_rr_ch_mode_mod(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8473 guint32 curr_offset;
8474 guint32 consumed;
8475 guint curr_len;
8477 curr_offset = offset;
8478 curr_len = len;
8480 /* Channel Description 2 10.5.2.5a M V 3 */
8481 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, NULL);
8483 /* Channel Mode 10.5.2.6 M V 1 */
8484 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, NULL);
8486 /* 01 VGCS target mode Indication VGCS target mode Indication 10.5.2.42a O TLV 3 */
8487 ELEM_OPT_TLV(0x01,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_TAR_MODE_IND, NULL);
8489 /* 03 Multi-Rate configuration, MultiRate configuration 10.5.2.21aa O TLV 4-8 */
8490 ELEM_OPT_TLV(0x03,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
8492 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8497 * 9.1.6 Channel Mode Modify Acknowledge
8499 static void
8500 dtap_rr_ch_mode_mod_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8502 guint32 curr_offset;
8503 guint32 consumed;
8504 guint curr_len;
8506 curr_offset = offset;
8507 curr_len = len;
8509 /* Channel Description 2 10.5.2.5a M V 3 */
8510 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, NULL);
8512 /* Channel Mode 10.5.2.6 M V 1 */
8513 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, NULL);
8515 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8520 * 9.1.7 Channel Release
8522 static void
8523 dtap_rr_ch_rel(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8525 guint32 curr_offset;
8526 guint32 consumed;
8527 guint curr_len;
8529 curr_offset = offset;
8530 curr_len = len;
8532 /* RR Cause RR Cause 10.5.2.31 M V 1 */
8533 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
8535 /* 73 BA Range BA Range 10.5.2.1a O TLV 6-7 */
8536 ELEM_OPT_TLV(0x73, GSM_A_PDU_TYPE_RR, DE_RR_BA_RANGE, NULL);
8538 /* 74 Group Channel Description Group Channel Description 10.5.2.14b O TLV 5-13 */
8539 /* ELEM_OPT_TLV(0x74, GSM_A_PDU_TYPE_RR, DE_GRP_CH_DESC, NULL); */
8541 /* 8x Group Cipher Key Number Group Cipher Key Number 10.5.1.10 C TV 1 */
8542 /* ELEM_OPT_TV_SHORT(0x80, GSM_A_PDU_TYPE_RR, DE_GRP_CIP_KEY_NUM, NULL); */
8544 /* Cx GPRS Resumption GPRS Resumption 10.5.2.14c O TV 1 */
8545 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_RR, DE_RR_GPRS_RESUMPTION, NULL);
8547 /* 75 BA List Pref BA List Pref 10.5.2.1c O TLV 3-? */
8548 ELEM_OPT_TLV(0x75, GSM_A_PDU_TYPE_RR, DE_RR_BA_LIST_PREF, NULL);
8550 /* 76 UTRAN Freq List 10.5.2.1d O TLV 3-? */
8551 ELEM_OPT_TLV(0x76, GSM_A_PDU_TYPE_RR, DE_RR_UTRAN_FREQ_LIST, NULL);
8553 /* 62 Cell Channel Description Cell Channel Description 10.5.2.1b O TV 17 */
8554 ELEM_OPT_TV(0x62, GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
8556 /* 62 Cell selection indicator after release of all TCH and SDCCH 10.5.2.1e O TLV 4-? */
8557 ELEM_OPT_TLV(0x77, GSM_A_PDU_TYPE_RR, DE_RR_CELL_SELECT_INDIC, NULL);
8559 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8564 * 9.1.8 Channel Request
8566 /* This message is NOT follow the basic format, and is only found on RACH - ignored here */
8569 * 9.1.9 Ciphering Mode Command
8571 static void
8572 dtap_rr_cip_mode_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8574 guint32 curr_offset;
8575 guint curr_len;
8577 curr_offset = offset;
8578 curr_len = len;
8580 /* Ciphering Mode Setting 10.5.2.9 M V 0.5 */
8581 /* Cipher Response 10.5.2.10 M V 0.5 */
8582 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET,
8583 GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_RESP);
8585 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8589 * 9.1.10 Ciphering Mode Complete
8591 void
8592 dtap_rr_cip_mode_cpte(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8594 guint32 curr_offset;
8595 guint32 consumed;
8596 guint curr_len;
8598 curr_offset = offset;
8599 curr_len = len;
8601 /* Mobile Equipment Identity 10.5.1.4 O TLV */
8602 ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, "Mobile Equipment Identity");
8604 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8609 * 9.1.11 Classmark change
8611 static void
8612 dtap_rr_mm_cm_change(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8614 guint32 curr_offset;
8615 guint32 consumed;
8616 guint curr_len;
8618 curr_offset = offset;
8619 curr_len = len;
8621 /* Mobile Station Classmark 2 10.5.1.6 M LV 4 */
8622 ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
8623 /* 20 Mobile Station Classmark 3 10.5.1.7 C TLV 3-34 */
8624 ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
8626 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8631 * 9.1.11 UTRAN Classmark Change
8633 static void
8634 dtap_rr_utran_classmark_change(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8636 guint32 curr_offset;
8637 guint32 consumed;
8638 guint curr_len;
8640 curr_offset = offset;
8641 curr_len = len;
8643 /* UTRAN Classmark 10.5.2.7a M LV 2-? */
8644 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_UTRAN_CM, NULL);
8646 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8650 * 9.1.12 Classmark enquiry
8652 static void
8653 dtap_rr_cm_enq(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8655 guint32 curr_offset;
8656 guint32 consumed;
8657 guint curr_len;
8659 curr_offset = offset;
8660 curr_len = len;
8662 /* 10 Classmark Enquiry Mask 10.5.2.7c O TLV 3 */
8663 ELEM_OPT_TLV(0x10, GSM_A_PDU_TYPE_RR, DE_RR_CM_ENQ_MASK, NULL);
8665 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8670 * 9.1.12b Configuration change command
8672 static void
8673 dtap_rr_conf_change_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8675 guint32 curr_offset;
8676 guint32 consumed;
8677 guint curr_len;
8679 curr_offset = offset;
8680 curr_len = len;
8682 /* Multislot Allocation 10.5.2.21b M LV 2-11 */
8683 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MULT_ALL, NULL);
8685 /* Channel Mode 10.5.2.6 O TV 2 */
8686 ELEM_OPT_TV(0x63,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 1");
8688 /* Channel Mode 10.5.2.6 O TV 2 */
8689 ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 2");
8691 /* Channel Mode 10.5.2.6 O TV 2 */
8692 ELEM_OPT_TV(0x13,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 3");
8694 /* Channel Mode 10.5.2.6 O TV 2 */
8695 ELEM_OPT_TV(0x14,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 4");
8697 /* Channel Mode 10.5.2.6 O TV 2 */
8698 ELEM_OPT_TV(0x15,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 5");
8700 /* Channel Mode 10.5.2.6 O TV 2 */
8701 ELEM_OPT_TV(0x16,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 6");
8703 /* Channel Mode 10.5.2.6 O TV 2 */
8704 ELEM_OPT_TV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 7");
8706 /* Channel Mode 10.5.2.6 O TV 2 */
8707 ELEM_OPT_TV(0x18,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 8");
8709 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8713 * 9.1.12c Configuration change acknowledge
8715 /* empty message */
8718 * 9.1.12d Configuration change reject
8720 static void
8721 dtap_rr_conf_change_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8723 guint32 curr_offset;
8724 guint32 consumed;
8725 guint curr_len;
8727 curr_offset = offset;
8728 curr_len = len;
8730 /* RR Cause 10.5.2.31 M V 1 */
8731 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
8733 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8737 * 9.1.12e DTM Assignment Command
8739 static void
8740 dtap_rr_dtm_ass_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8742 guint32 curr_offset;
8743 guint32 consumed;
8744 guint curr_len;
8746 curr_offset = offset;
8747 curr_len = len;
8749 /* CS Power Command 10.5.2.28 M V 1 */
8750 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_POW_CMD, NULL);
8752 /* Description of the CS Channel 10.5.2.5 M V 3 */
8753 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, NULL);
8755 /* GPRS broadcast information 10.5.2.14d M LV 7 - n */
8756 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_GPRS_BROADCAST_INFORMATION, NULL);
8758 /* 10 Cell Channel Description 10.5.2.1b O TV 17 */
8759 ELEM_OPT_TV(0x10, GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
8761 /* 11 Channel mode Channel mode 10.5.2.6 O TV 2 */
8762 ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, NULL);
8763 /* 12 Frequency List Frequency List 10.5.2.13 C TLV 4 - 132 */
8764 ELEM_OPT_TLV(0x12, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, NULL);
8765 /* 13 Mobile Allocation Mobile Allocation 10.5.2.21 C TLV 3 - 10 */
8766 ELEM_OPT_TLV(0x13, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
8768 /* 15 Description of the Uplink Packet Channel Assignment RR Packet Uplink Assignment 10.5.2.25c O TLV 3 - n */
8769 ELEM_OPT_TLV(0x15, GSM_A_PDU_TYPE_RR, DE_RR_PKT_UL_ASS, NULL);
8771 /* 16 Description of the Downlink Packet Channel Assignment RR Packet Downlink Assignment 10.5.2.25d O TLV 3 - n */
8772 ELEM_OPT_TLV(0x16, GSM_A_PDU_TYPE_RR, DE_RR_PKT_DL_ASS, NULL);
8774 /* 17 Multi-Rate configuration MultiRate configuration 10.5.2.21aa O TLV 4-8 */
8775 ELEM_OPT_TLV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
8777 /* 9- Ciphering Mode Setting Ciphering Mode Setting 10.5.2.9 O TV 1 */
8778 ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET, NULL);
8780 /* 18 Mobile Allocation C2 Mobile Allocation 10.5.2.21 C TLV 3 - 10 */
8781 ELEM_OPT_TLV(0x18, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - C2");
8783 /* 19 Frequency List C2 Frequency List 10.5.2.13 C TLV 4 - 132 */
8784 ELEM_OPT_TLV(0x19, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - C2");
8786 /* 20 Description of the Downlink Packet Channel Assignment Type 2 RR Packet Downlink Assignment Type 2 10.5.2.25e C TLV 3 n */
8787 ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_RR, DE_RR_PKT_DL_ASS_TYPE2, NULL);
8789 /* 21 Channel Description C2 Channel Description 3 10.5.2.5c O TV 3 */
8790 ELEM_OPT_TV(0x21,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC3, " - Channel Description C2");
8792 EXTRANEOUS_DATA_CHECK(curr_len, 0);
8796 * 9.1.12f DTM Assignment Failure
8798 static void
8799 dtap_rr_dtm_ass_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8801 guint32 curr_offset;
8802 guint32 consumed;
8803 guint curr_len;
8805 curr_offset = offset;
8806 curr_len = len;
8808 /* RR Cause RR Cause 10.5.2.31 M V 1 */
8809 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
8811 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8815 * 9.1.12g DTM Information
8817 static void
8818 dtap_rr_dtm_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8820 guint32 curr_offset;
8821 guint32 consumed;
8822 guint curr_len;
8824 curr_offset = offset;
8825 curr_len = len;
8827 /* Routeing Area Identification 10.5.5.15 M V 6 */
8828 ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
8830 /* DTM Information Details 10.5.2.11a M LV 4-n */
8831 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_DTM_INFO_DETAILS, NULL);
8833 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8837 * 9.1.12h DTM Reject
8839 static void
8840 dtap_rr_dtm_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8842 guint32 curr_offset;
8843 guint32 consumed;
8844 guint curr_len;
8846 curr_offset = offset;
8847 curr_len = len;
8849 /* Wait indication 10.5.2.43 M V 1 */
8850 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND, " - DTM Wait Indication");
8852 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8856 * 9.1.12i DTM Request
8858 static void
8859 dtap_rr_dtm_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8861 guint32 curr_offset;
8862 guint32 consumed;
8863 guint curr_len;
8865 curr_offset = offset;
8866 curr_len = len;
8868 /* TLLI 10.5.2.41a M V 4 */
8869 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL);
8871 /* Channel Request Description 2 M LV 5-n */
8872 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_REQ_DESC2, NULL);
8874 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8878 * 9.1.13 Frequency Redefinition
8880 static void
8881 dtap_rr_freq_redef(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8883 guint32 curr_offset;
8884 guint32 consumed;
8885 guint curr_len;
8887 curr_offset = offset;
8888 curr_len = len;
8890 /* Channel Description 10.5.2.5 M V 3 */
8891 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, NULL);
8893 /* Mobile Allocation 10.5.2.21 M LV 1-9 */
8894 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
8896 /* Starting Time 10.5.2.38 M V 2 */
8897 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
8899 /* Cell Channel Description 10.5.2.1b O TV 17 */
8900 ELEM_OPT_TV(0x62,GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
8902 /* Carrier Indication 10.5.2.69 O TV 1 */
8903 ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CARRIER_IND,NULL);
8905 /* Mobile Allocation 10.5.2.21 O TLV 1-9 */
8906 ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation C2");
8908 /* Channel Description 3 10.5.2.5c O TV 3 */
8909 ELEM_OPT_TV(0x12,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC3, " - Channel Description C2");
8911 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8915 * 9.1.13b GPRS suspension request
8917 static void
8918 dtap_rr_gprs_sus_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8920 guint32 curr_offset;
8921 guint32 consumed;
8922 guint curr_len;
8924 curr_offset = offset;
8925 curr_len = len;
8927 /* TLLI 10.5.2.41a M V 4 */
8928 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL);
8930 /* Routeing Area Identification 10.5.5.15 M V 6 */
8931 ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
8932 /* Suspension cause 10.5.2.47 M V 1 */
8933 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SUS_CAU, NULL);
8935 /* 01 Service Support 10.5.2.57 O TV 2 */
8936 ELEM_OPT_TV_SHORT(0x01,GSM_A_PDU_TYPE_RR, DE_RR_SERV_SUP,NULL);
8938 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
8943 * 9.1.14 Handover Access
8945 /* This message does NOT follow the basic format, and is only found on DCH during initial handover access */
8947 /* 3GPP TS 24.008 version 4.7.0 Release 4
8948 * [3] 9.1.15
8950 void
8951 dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
8953 guint32 curr_offset;
8954 guint32 consumed;
8955 guint curr_len;
8957 curr_offset = offset;
8958 curr_len = len;
8960 /* Mandatory Elements
8961 * Cell description 10.5.2.2
8963 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_DSC, NULL);
8965 /* Description of the first channel,after time
8966 * Channel Description 2 10.5.2.5a
8968 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, " - Description of the first channel, after time");
8970 /* Handover Reference 10.5.2.15 */
8971 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_HO_REF, NULL);
8973 /* Power Command and Access type 10.5.2.28a */
8974 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_POW_CMD_AND_ACC_TYPE, NULL);
8976 /* optional elements */
8978 /* Synchronization Indication 10.5.2.39 */
8979 ELEM_OPT_TV_SHORT(0xD0,GSM_A_PDU_TYPE_RR, DE_RR_SYNC_IND,NULL);
8981 /* Frequency Short List 10.5.2.14 */
8982 ELEM_OPT_TV(0x02,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_SHORT_LIST," - Frequency Short List, after time");
8984 /* Frequency List 10.5.2.13 */
8985 ELEM_OPT_TLV(0x05, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, after time");
8987 /* Cell Channel Description 10.5.2.1b */
8988 ELEM_OPT_TV(0x62,GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
8990 /* Multislot Allocation 10.5.2.21b */
8991 ELEM_OPT_TLV(0x10,GSM_A_PDU_TYPE_RR, DE_RR_MULT_ALL, NULL);
8993 /* Mode of the First Channel(Channel Set 1)) Channel Mode 10.5.2.6*/
8994 ELEM_OPT_TV(0x63,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of the First Channel(Channel Set 1))");
8996 /* Mode of Channel Set 2 Channel Mode 10.5.2.6*/
8997 ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 2");
8999 /* Mode of Channel Set 3 Channel Mode 10.5.2.6*/
9000 ELEM_OPT_TV(0x13,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 3");
9002 /* Mode of Channel Set 4 Channel Mode 10.5.2.6*/
9003 ELEM_OPT_TV(0x14,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 4");
9005 /* Mode of Channel Set 5 Channel Mode 10.5.2.6*/
9006 ELEM_OPT_TV(0x15,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 5");
9008 /* Mode of Channel Set 6 Channel Mode 10.5.2.6*/
9009 ELEM_OPT_TV(0x16,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 6");
9011 /* Mode of Channel Set 7 Channel Mode 10.5.2.6*/
9012 ELEM_OPT_TV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 7");
9014 /* Mode of Channel Set 8 Channel Mode 10.5.2.6*/
9015 ELEM_OPT_TV(0x18,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 8");
9017 /* Description of the Second Channel, after time, Channel Description 10.5.2.5 */
9018 ELEM_OPT_TV(0x64,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Description of the Second Channel, after time");
9020 /* Mode of the Second Channel, Channel Mode 2 10.5.2.7 */
9021 ELEM_OPT_TV(0x66,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE2, " - Mode of the Second Channel");
9023 /* Frequency Channel Sequence, after time, Frequency Channel Sequence 10.5.2.12 */
9024 ELEM_OPT_TV(0x69,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_CH_SEQ, " - Frequency Channel Sequence, after time");
9026 /* Mobile Allocation, after time, Mobile Allocation 10.5.2.21 */
9027 ELEM_OPT_TLV(0x72,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, after time");
9029 /* Starting Time 10.5.2.38 */
9030 ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
9032 /* Real Time Difference, Time Difference 10.5.2.41 */
9033 ELEM_OPT_TV(0x7B,GSM_A_PDU_TYPE_RR, DE_RR_TIME_DIFF, " - Real Time Difference");
9035 /* Timing Advance, Timing Advance 10.5.2.40 */
9036 ELEM_OPT_TV(0x7D,GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV, NULL);
9038 /* Frequency Short List, before time, Frequency Short List 10.5.2.14 */
9039 ELEM_OPT_TV(0x12,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_SHORT_LIST, " - Frequency Short List, before time");
9041 /* Frequency List, before time, Frequency List 10.5.2.13 */
9042 ELEM_OPT_TLV(0x19,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, before time");
9044 /* Description of the First Channel, before time, Channel Description 2 10.5.2.5a*/
9045 ELEM_OPT_TV(0x1c,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, " - Description of the First Channel, before time");
9047 /* Description of the Second Channel, before time, Channel Description 10.5.2.5*/
9048 ELEM_OPT_TV(0x1d,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Description of the Second Channel, before time");
9050 /* Frequency channel sequence before time, Frequency channel sequence 10.5.2.12*/
9051 ELEM_OPT_TV(0x1e,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_CH_SEQ, " - Frequency channel sequence before time");
9053 /* Mobile Allocation, before time, Mobile Allocation 10.5.2.21 */
9054 ELEM_OPT_TLV(0x21,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, before time");
9056 /* Cipher Mode Setting, Cipher Mode Setting 10.5.2.9 */
9057 ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET, NULL);
9059 /* VGCS target mode Indication, VGCS target mode Indication 10.5.2.42a */
9060 ELEM_OPT_TLV(0x01,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_TAR_MODE_IND, NULL);
9062 /* Multi-Rate configuration, MultiRate configuration 10.5.2.21a */
9063 ELEM_OPT_TLV(0x03,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
9065 /* Dynamic ARFCN Mapping, Dynamic ARFCN Mapping 10.5.2.11b */
9066 ELEM_OPT_TLV(0x76,GSM_A_PDU_TYPE_RR, DE_RR_DYN_ARFCN_MAP, NULL);
9068 /* VGCS Ciphering Parameters, VGCS Ciphering Parameters 10.5.2.42b */
9069 ELEM_OPT_TLV(0x04,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_CIP_PAR, NULL);
9071 /* Dedicated Service Information, Dedicated Service Information 10.5.2.59 */
9072 ELEM_OPT_TV(0x51,GSM_A_PDU_TYPE_RR, DE_RR_DED_SERV_INF, NULL);
9074 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
9079 * 9.1.15a Inter System To UTRAN Handover Command
9081 static void
9082 dtap_rr_inter_syst_to_utran_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9084 guint32 curr_offset;
9085 guint32 consumed;
9086 guint curr_len;
9088 curr_offset = offset;
9089 curr_len = len;
9091 /* UTRAN Classmark 10.5.2.51 M LV 2-? */
9092 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_HO_TO_UTRAN_CMD, NULL);
9094 EXTRANEOUS_DATA_CHECK(curr_len, 0);
9097 /* 3GPP TS 24.008 version 4.7.0 Release 4
9098 * [3] 9.1.16
9100 static void
9101 dtap_rr_ho_cpte(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9103 guint32 curr_offset;
9104 guint32 consumed;
9105 guint curr_len;
9107 curr_offset = offset;
9108 curr_len = len;
9110 /* RR Cause RR Cause 10.5.2.31 M V 1 */
9111 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
9113 /* 77 Mobile Observed Time Difference Mobile Time Difference 10.5.2.21a */
9114 ELEM_OPT_TLV(0x77,GSM_A_PDU_TYPE_RR, DE_RR_MOB_TIME_DIFF, " - Mobile Observed Time Difference");
9116 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
9121 * 9.1.17 Handover failure
9123 static void
9124 dtap_rr_ho_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9126 guint32 curr_offset;
9127 guint32 consumed;
9128 guint curr_len;
9130 curr_offset = offset;
9131 curr_len = len;
9133 /* RR Cause RR Cause 10.5.2.31 M V 1 */
9134 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
9136 EXTRANEOUS_DATA_CHECK(curr_len, 0);
9141 * 9.1.18 Immediate assignment See 3GPP TS 44.018
9143 static void
9144 dtap_rr_imm_ass(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9146 guint32 curr_offset;
9147 guint32 consumed;
9148 guint curr_len;
9149 guint8 oct;
9151 curr_offset = offset;
9152 curr_len = len;
9154 oct = tvb_get_guint8(tvb, curr_offset);
9156 /* NOTE: The order of the mandatory information elements should be chosen so that
9157 * information elements with 1/2 octet of content (type 1) go together in succession.
9158 * The first type 1 information element occupies bits 1 to 4 of octet N,
9159 * the second bits 5 to 8 of octet N, the third bits 1 to 4 of octet N+1 etc.
9160 * If the number of type 1 information elements is odd then bits 5 to 8 of the last octet
9161 * occupied by these information elements should be treated as spare bits,
9162 * i.e. coded with a "0" in each.
9165 /* Page Mode 10.5.2.26 M V 1/2 */
9166 /* Dedicated mode or TBF 10.5.2.25b M V 1/2 */
9167 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE,
9168 GSM_A_PDU_TYPE_RR, DE_RR_DED_MOD_OR_TBF);
9170 if((oct&0x10) == 0){
9171 /* Channel Description 10.5.2.5 C V 3m */
9172 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, NULL);
9173 }else{
9174 /* Packet Channel Description 10.5.2.25a C V 3
9175 * If the Dedicated mode or TBF IE indicates that the message assigns a Temporary Block Flow (TBF),
9176 * the mobile station shall consider this information element present in the message.
9177 * If the Dedicated mode or TBF IE indicates that this message is the first of two in a two-message
9178 * assignment of an uplink or downlink TBF, the mobile station shall ignore the contents
9179 * of this information element and regard it as an unnecessary IE.
9181 if((oct&0x04) == 0){
9182 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_PACKET_CH_DESC, NULL);
9185 /* Request Reference 10.5.2.30 M V 3 */
9186 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, NULL);
9188 /* Timing Advance 10.5.2.40 M V 1 */
9189 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV, NULL);
9190 /* Mobile Allocation 10.5.2.21 M LV 1-9 */
9191 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
9192 /* 7C Starting Time 10.5.2.38 O TV 3 */
9193 ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
9194 /* IA Rest Octets 10.5.2.16 M V 0-11 */
9195 if(tvb_length_remaining(tvb,curr_offset) > 0)
9196 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_IA_REST_OCT, NULL);
9201 * 9.1.19 Immediate assignment extended
9203 static void
9204 dtap_rr_imm_ass_ext(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9206 guint32 curr_offset;
9207 guint32 consumed;
9208 guint curr_len;
9210 curr_offset = offset;
9211 curr_len = len;
9213 /* Page Mode 10.5.2.26 M V 1/2 */
9214 /* Spare Half Octet 10.5.1.8 M V 1/2 */
9215 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE,
9216 GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
9217 /* Channel Description 1 Channel Description 10.5.2.5 M V 3 */
9218 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Channel Description 1");
9219 /* Request Reference 1 Request Reference 10.5.2.30 M V 3 */
9220 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 1");
9221 /* Timing Advance 1 Timing Advance 10.5.2.40 M V 1 */
9222 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV, " - Timing Advance 1");
9223 /* Channel Description 2 Channel Description 10.5.2.5 M V 3 */
9224 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Channel Description 2");
9225 /* Request Reference 2 Request Reference 10.5.2.30 M V 3 */
9226 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 2");
9227 /* Timing Advance 2 Timing Advance 10.5.2.40 M V 1 */
9228 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV, " - Timing Advance 2");
9229 /* Mobile Allocation 10.5.2.21 M LV 1-9 */
9230 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
9231 /* 7C Starting Time 10.5.2.38 O TV 3 */
9232 ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
9233 /* IAX Rest Octets 10.5.2.18 M V 0-4 */
9234 if(tvb_length_remaining(tvb,curr_offset) > 0)
9235 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_IAX_REST_OCT, NULL);
9240 * 9.1.20 Immediate assignment reject
9242 static void
9243 dtap_rr_imm_ass_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9245 guint32 curr_offset;
9246 guint32 consumed;
9247 guint curr_len;
9249 curr_offset = offset;
9250 curr_len = len;
9252 /* Page Mode 10.5.2.26 M V 1/2 */
9253 /* Spare Half Octet 10.5.1.8 M V 1/2 */
9254 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE,
9255 GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
9256 /* Request Reference 1 Request Reference 10.5.2.30 M V 3 */
9257 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 1");
9258 /* Wait Indication 1 Wait Indication 10.5.2.43 M V 1 */
9259 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND, " - Wait Indication 1");
9260 /* Request Reference 2 Request Reference 10.5.2.30 M V 3 */
9261 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 2");
9262 /* Wait Indication 2 Wait Indication 10.5.2.43 M V 1 */
9263 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND, " - Wait Indication 2");
9264 /* Request Reference 3 Request Reference 10.5.2.30 M V 3 */
9265 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 3");
9266 /* Wait Indication 3 Wait Indication 10.5.2.43 M V 1 */
9267 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND, " - Wait Indication 3");
9268 /* Request Reference 4 Request Reference 10.5.2.30 M V 3 */
9269 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF, " - Request Reference 4");
9270 /* Wait Indication 4 Wait Indication 10.5.2.43 M V 1 */
9271 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND, " - Wait Indication 4");
9272 /* IAR Rest Octets 10.5.2.19 M V 3 */
9273 if(tvb_length_remaining(tvb,curr_offset) > 0)
9274 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_IAR_REST_OCT, NULL);
9279 * 9.1.21 Measurement report
9281 static void
9282 dtap_rr_meas_rep(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9284 guint32 curr_offset;
9285 guint32 consumed;
9286 guint curr_len;
9288 curr_offset = offset;
9289 curr_len = len;
9291 /* Measurement Results 10.5.2.20 M V 16 */
9292 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_MEAS_RES, NULL);
9296 * 9.1.21f Packet Assignment
9298 static void
9299 dtap_rr_pkt_assign(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9301 guint32 curr_offset;
9302 guint32 consumed;
9303 guint curr_len;
9305 curr_offset = offset;
9306 curr_len = len;
9308 /* GPRS broadcast information 10.5.2.14d M LV 7-n */
9309 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_GPRS_BROADCAST_INFORMATION, NULL);
9311 /* 0x22 RR Packet Uplink Assignment 10.5.2.25c O TLV 3-n */
9312 ELEM_OPT_TLV(0x22, GSM_A_PDU_TYPE_RR, DE_RR_PKT_UL_ASS, NULL);
9314 /* 0x23 RR Packet Downlink Assignment 10.5.2.25d O TLV 3-n */
9315 ELEM_OPT_TLV(0x23, GSM_A_PDU_TYPE_RR, DE_RR_PKT_DL_ASS, NULL);
9317 /* 0x12 Frequency List 10.5.2.13 C TLV 4-132 */
9318 ELEM_OPT_TLV(0x12, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List C2");
9320 /* 0x13 Mobile Allocation 10.5.2.21 C TLV 3-10 */
9321 ELEM_OPT_TLV(0x13, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation C2");
9323 /* 0x14 Channel Description 3 10.5.2.5c O TV 3 */
9324 ELEM_OPT_TV(0x14, GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC3, " - Channel Description C2");
9326 /* 0x24 RR Packet Downlink Assignment Type 2 10.5.2.25e C TLV 3-n */
9327 ELEM_OPT_TLV(0x24, GSM_A_PDU_TYPE_RR, DE_RR_PKT_DL_ASS_TYPE2, NULL);
9329 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
9333 * 9.1.21g Packet Notification
9335 static void
9336 dtap_rr_pkt_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9338 guint32 curr_offset;
9339 guint32 consumed;
9340 guint curr_len;
9342 curr_offset = offset;
9343 curr_len = len;
9345 /* 0x10 P-TMSI 10.5.2.42 C TV 5 */
9346 ELEM_OPT_TV(0x10, GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Packet TMSI");
9348 /* 0x11 Mobile Identity 10.5.1.4 C TLV 3-11 */
9349 ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
9351 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
9355 * 9.1.22 Paging Request Type 1
9357 static void
9358 dtap_rr_paging_req_type_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9360 guint32 curr_offset;
9361 guint32 consumed;
9362 guint curr_len;
9364 curr_offset = offset;
9365 curr_len = len;
9367 /* RR Page Mode 10.5.2.26 M V 1/2 */
9368 /* RR Channel Needed 10.5.2.8 M V 1/2 */
9369 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE,
9370 GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED);
9372 /* RR Mobile Identity 10.5.1.4 M LV 2-9 */
9373 ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 1");
9375 /* RR Mobile Identity 10.5.1.4 O TLV 3-10 */
9376 ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 2");
9378 /* RR P1 Rest Octets 10.5.2.23 M V 0-17 */
9379 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_P1_REST_OCT, NULL);
9384 * 9.1.23 Paging Request Type 2
9386 static void
9387 dtap_rr_paging_req_type_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9389 guint32 curr_offset;
9390 guint32 consumed;
9391 guint curr_len;
9393 curr_offset = offset;
9394 curr_len = len;
9396 /* RR Page Mode 10.5.2.26 M V 1/2 */
9397 /* RR Channel Needed 10.5.2.8 M V 1/2 */
9398 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE,
9399 GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED);
9401 /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
9402 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 1");
9404 /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
9405 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 2");
9407 /* RR Mobile Identity 10.5.1.4 O TLV 3-10 */
9408 ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 3");
9410 /* RR P2 Rest Octets 10.5.2.24 M V 1-11 */
9411 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_P2_REST_OCT, NULL);
9416 * 9.1.24 Paging Request Type 3
9418 static void
9419 dtap_rr_paging_req_type_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9421 guint32 curr_offset;
9422 guint32 consumed;
9423 guint curr_len;
9425 curr_offset = offset;
9426 curr_len = len;
9428 /* RR Page Mode 10.5.2.26 M V 1/2 */
9429 /* RR Channel Needed 10.5.2.8 M V 1/2 */
9430 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE,
9431 GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED);
9433 /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
9434 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 1");
9436 /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
9437 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 2");
9439 /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
9440 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 3");
9442 /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
9443 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, " - Mobile Identity 4");
9445 /* RR P3 Rest Octets 10.5.2.25 M V 3 */
9446 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_P3_REST_OCT, NULL);
9451 * [4] 9.1.25 Paging response
9453 static void
9454 dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9456 guint32 curr_offset;
9457 guint32 consumed;
9458 guint curr_len;
9459 guint8 oct;
9460 proto_tree *subtree;
9461 proto_item *item;
9463 curr_offset = offset;
9464 curr_len = len;
9467 * special dissection for Cipher Key Sequence Number
9469 oct = tvb_get_guint8(tvb, curr_offset);
9471 other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
9472 proto_tree_add_text(tree,
9473 tvb, curr_offset, 1,
9474 "%s : Spare",
9475 a_bigbuf);
9477 item =
9478 proto_tree_add_text(tree,
9479 tvb, curr_offset, 1, "%s",
9480 val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, ""));
9482 subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]);
9484 other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
9485 proto_tree_add_text(subtree,
9486 tvb, curr_offset, 1,
9487 "%s : Spare",
9488 a_bigbuf);
9490 other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
9492 switch (oct & 0x07)
9494 case 0x07:
9495 proto_tree_add_text(subtree,
9496 tvb, curr_offset, 1,
9497 "%s : Ciphering Key Sequence Number: No key is available",
9498 a_bigbuf);
9499 break;
9501 default:
9502 proto_tree_add_text(subtree,
9503 tvb, curr_offset, 1,
9504 "%s : Ciphering Key Sequence Number: %u",
9505 a_bigbuf,
9506 oct & 0x07);
9507 break;
9510 curr_offset++;
9511 curr_len--;
9513 if ((signed)curr_len <= 0) return;
9515 ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
9517 ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
9519 EXTRANEOUS_DATA_CHECK(curr_len, 0);
9523 * [4] 9.1.26 Partial Release
9525 static void
9526 dtap_rr_partial_rel(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9528 guint32 curr_offset;
9529 guint32 consumed;
9530 guint curr_len;
9532 curr_offset = offset;
9533 curr_len = len;
9535 /* Channel Description 10.5.2.5 M V 3 */
9536 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, NULL);
9538 EXTRANEOUS_DATA_CHECK(curr_len, 0);
9542 * [4] 9.1.27 Partial Release Complete
9544 /* empty message */
9547 * [4] 9.1.28 Physical Information
9549 static void
9550 dtap_rr_phy_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9552 guint32 curr_offset;
9553 guint32 consumed;
9554 guint curr_len;
9556 curr_offset = offset;
9557 curr_len = len;
9559 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV, NULL);
9561 EXTRANEOUS_DATA_CHECK(curr_len, 0);
9565 * [4] 9.1.29
9567 static void
9568 dtap_rr_rr_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9570 guint32 curr_offset;
9571 guint32 consumed;
9572 guint curr_len;
9574 curr_offset = offset;
9575 curr_len = len;
9577 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE, NULL);
9579 EXTRANEOUS_DATA_CHECK(curr_len, 0);
9583 * [4] 9.1.31
9585 static void
9586 dtap_rr_sys_info_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9588 guint32 curr_offset;
9589 guint32 consumed;
9590 guint curr_len;
9592 curr_offset = offset;
9593 curr_len = len;
9595 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
9597 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM, NULL);
9599 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI1_REST_OCT, NULL);
9603 * [4] 9.1.32
9605 static void
9606 dtap_rr_sys_info_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9608 guint32 curr_offset;
9609 guint32 consumed;
9610 guint curr_len;
9612 curr_offset = offset;
9613 curr_len = len;
9615 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC, " - BCCH Frequency List");
9617 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NCC_PERM, NULL);
9619 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM, NULL);
9623 * [4] 9.1.33
9625 static void
9626 dtap_rr_sys_info_2bis(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9628 guint32 curr_offset;
9629 guint32 consumed;
9630 guint curr_len;
9632 curr_offset = offset;
9633 curr_len = len;
9635 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC, " - Extended BCCH Frequency List");
9637 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM, NULL);
9641 * [4] 9.1.34
9643 static void
9644 dtap_rr_sys_info_2ter(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9646 guint32 curr_offset;
9647 guint32 consumed;
9648 guint curr_len;
9650 curr_offset = offset;
9651 curr_len = len;
9653 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC2, " - Extended BCCH Frequency List");
9655 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI2TER_REST_OCT, NULL);
9659 * [4] 9.1.34a
9661 static void
9662 dtap_rr_sys_info_2quater(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9664 guint32 curr_offset;
9665 guint32 consumed;
9666 guint curr_len;
9668 curr_offset = offset;
9669 curr_len = len;
9671 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI2QUATER_REST_OCT, NULL);
9675 * [4] 9.1.35
9677 static void
9678 dtap_rr_sys_info_3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9680 guint32 curr_offset;
9681 guint32 consumed;
9682 guint curr_len;
9684 curr_offset = offset;
9685 curr_len = len;
9687 ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CELL_ID, NULL);
9689 ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_LAI, NULL);
9691 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CTRL_CH_DESC, NULL);
9693 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_OPT_BCCH, NULL);
9695 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_SEL_PARAM, NULL);
9697 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM, NULL);
9699 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI3_REST_OCT, NULL);
9703 * [4] 9.1.36
9705 static void
9706 dtap_rr_sys_info_4(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9708 guint32 curr_offset;
9709 guint32 consumed;
9710 guint curr_len;
9712 curr_offset = offset;
9713 curr_len = len;
9715 ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_LAI, NULL);
9717 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_SEL_PARAM, NULL);
9719 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM, NULL);
9721 ELEM_OPT_TV(0x64, GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - CBCH");
9723 ELEM_OPT_TLV(0x72, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - CBCH");
9725 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI4_REST_OCT, NULL);
9729 * [4] 9.1.37
9731 static void
9732 dtap_rr_sys_info_5(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9734 guint32 curr_offset;
9735 guint32 consumed;
9736 guint curr_len;
9738 curr_offset = offset;
9739 curr_len = len;
9741 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC, " - BCCH Frequency List");
9745 * [4] 9.1.38
9747 static void
9748 dtap_rr_sys_info_5bis(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9750 guint32 curr_offset;
9751 guint32 consumed;
9752 guint curr_len;
9754 curr_offset = offset;
9755 curr_len = len;
9757 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC, " - Extended BCCH Frequency List");
9761 * [4] 9.1.39
9763 static void
9764 dtap_rr_sys_info_5ter(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9766 guint32 curr_offset;
9767 guint32 consumed;
9768 guint curr_len;
9770 curr_offset = offset;
9771 curr_len = len;
9773 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC2, " - Extended BCCH Frequency List");
9777 * [4] 9.1.40
9779 static void
9780 dtap_rr_sys_info_6(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9782 guint32 curr_offset;
9783 guint32 consumed;
9784 guint curr_len;
9786 curr_offset = offset;
9787 curr_len = len;
9789 ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CELL_ID, NULL);
9791 ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_LAI, NULL);
9793 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_OPT_SACCH, NULL);
9795 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NCC_PERM, NULL);
9797 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI6_REST_OCT, NULL);
9801 * [4] 9.1.43a
9803 static void
9804 dtap_rr_sys_info_13(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9806 guint32 curr_offset;
9807 guint32 consumed;
9808 guint curr_len;
9810 curr_offset = offset;
9811 curr_len = len;
9813 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI13_REST_OCT, NULL);
9817 * [4] 9.1.51 Extended Measurement Order
9819 static void
9820 dtap_rr_ext_meas_order(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9822 guint32 curr_offset;
9823 guint32 consumed;
9824 guint curr_len;
9826 curr_offset = offset;
9827 curr_len = len;
9829 /* Extended Measurement Frequency List 10.5.2.46 M V 16 */
9830 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_EXT_MEAS_FREQ_LIST, NULL);
9834 * [4] 9.1.52 Extended Measurement Report
9836 static void
9837 dtap_rr_ext_meas_report(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9839 guint32 curr_offset;
9840 guint32 consumed;
9841 guint curr_len;
9843 curr_offset = offset;
9844 curr_len = len;
9846 /* Extended Measurement Result 10.5.2.45 M V 16 */
9847 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_EXT_MEAS_RESULT, NULL);
9851 * 9.1.53 Application Information
9853 static void
9854 dtap_rr_app_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
9856 guint32 curr_offset;
9857 guint32 consumed;
9858 guint curr_len;
9860 curr_offset = offset;
9861 curr_len = len;
9863 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_APDU_ID, NULL);
9864 ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_APDU_FLAGS, NULL);
9865 ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_APDU_DATA, NULL);
9869 * [4] 9.1.54 Measurement Information
9871 static const value_string gsm_a_rr_3g_wait_vals[] = {
9872 { 0, "1 instance that contain 3G Neighbour Cell Description shall be received"},
9873 { 1, "2 instances that contain 3G Neighbour Cell Description shall be received"},
9874 { 2, "3 instances that contain 3G Neighbour Cell Description shall be received"},
9875 { 3, "4 instances that contain 3G Neighbour Cell Description shall be received"},
9876 { 4, "5 instances that contain 3G Neighbour Cell Description shall be received"},
9877 { 5, "6 instances that contain 3G Neighbour Cell Description shall be received"},
9878 { 6, "7 instances that contain 3G Neighbour Cell Description shall be received"},
9879 { 7, "8 instances that contain 3G Neighbour Cell Description shall be received"},
9880 { 0, NULL }
9884 static void
9885 sacch_rr_meas_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_)
9887 proto_tree *subtree = NULL, *subtree2 = NULL;
9888 proto_item *item, *item2;
9889 guint32 curr_offset;
9890 gint bit_offset, bit_offset_sav, bit_offset_sav2;
9891 guint8 value, idx;
9892 guint8 tvb_len = tvb_length(tvb);
9893 guint16 bit_len = tvb_len << 3;
9895 curr_offset = offset;
9896 bit_offset = curr_offset << 3;
9898 proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9899 bit_offset += 1;
9900 proto_tree_add_bits_item(tree, hf_gsm_a_rr_3g_ba_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9901 bit_offset += 1;
9902 proto_tree_add_bits_item(tree, hf_gsm_a_rr_mp_change_mark, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9903 bit_offset += 1;
9904 proto_tree_add_bits_item(tree, hf_gsm_a_rr_mi_index, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
9905 bit_offset += 4;
9906 proto_tree_add_bits_item(tree, hf_gsm_a_rr_mi_count, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
9907 bit_offset += 4;
9908 proto_tree_add_bits_item(tree, hf_gsm_a_rr_pwrc, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9909 bit_offset += 1;
9910 proto_tree_add_bits_item(tree, hf_gsm_a_rr_gsm_report_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9911 bit_offset += 1;
9912 proto_tree_add_bits_item(tree, hf_gsm_a_rr_reporting_rate, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9913 bit_offset +=1;
9914 proto_tree_add_bits_item(tree, hf_gsm_a_rr_invalid_bsic_reporting, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
9915 bit_offset +=1;
9916 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Real Time Difference Description", "Present", "Not Present"))
9917 { /* Real Time Difference Description */
9918 bit_offset += de_rr_rtd_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_RTD_DESC);
9920 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "BSIC Description", "Present", "Not Present"))
9921 { /* BSIC Description */
9922 bit_offset += de_rr_bsic_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_BSIC_DESC);
9924 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Report Priority Description", "Present", "Not Present"))
9925 { /* Report Priority Description */
9926 bit_offset += de_rr_report_priority_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_REPORT_PRIO_DESC);
9928 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Measurement Parameters Description", "Present", "Not Present"))
9929 { /* Measurement Parameters Description */
9930 bit_offset += de_rr_meas_param_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_MEAS_PARAM_DESC);
9932 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "future extensions of the 2G parameters", "Present", "Not Present"))
9933 { /* used for future extensions of the 2G parameters */
9934 value = tvb_get_bits8(tvb,bit_offset,8);
9935 bit_offset += 8 + value + 1;
9937 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "3G Neighbour Cell Description", "Present", "Not Present"))
9938 { /* 3G Neighbour Cell Description */
9939 bit_offset_sav = bit_offset;
9940 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr);
9941 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC]);
9942 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Wait", "Present", "Not Present"))
9944 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_wait, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
9945 bit_offset += 3;
9947 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Index Start 3G", "Present", "Not Present"))
9949 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_index_start_3g, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
9950 bit_offset += 7;
9952 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Absolute Index Start EMR", "Present", "Not Present"))
9954 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_absolute_index_start_emr, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
9955 bit_offset += 7;
9957 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "UTRAN FDD Description", "Present", "Not Present"))
9958 { /* UTRAN FDD Description */
9959 bit_offset += de_rr_si2quater_meas_info_utran_fdd_desc(tvb, subtree, bit_offset);
9961 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "UTRAN TDD Description", "Present", "Not Present"))
9962 { /* UTRAN TDD Description */
9963 bit_offset += de_rr_si2quater_meas_info_utran_tdd_desc(tvb, subtree, bit_offset);
9965 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "CDMA2000 Description", "Present", "Not Present"))
9966 { /* CDMA2000 Description */
9967 bit_offset_sav2 = bit_offset;
9968 item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CDMA2000_DESC].strptr);
9969 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CDMA2000_DESC]);
9970 bit_offset += 16; /* cdma2000 frequency band + cdma2000 frequency */
9971 idx = tvb_get_bits8(tvb,bit_offset,5); /* number_cdma2000_cells */
9972 bit_offset += 5;
9973 while (idx)
9975 bit_offset += 9; /* Pilot PN offset */
9976 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "additional information for 3X Auxiliary Pilot", "Present", "Not Present"))
9978 value = tvb_get_bits8(tvb,bit_offset,3);
9979 switch (value)
9981 case 0:
9982 bit_offset += 5; /* TD_MODE + TD_POWER_LEVEL */
9983 break;
9984 case 1:
9985 bit_offset += 2; /* QOF */
9986 bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LEN_A + bit(val(WALSH_LEN_A)+6) */
9987 break;
9988 case 2:
9989 bit_offset += 2; /* QOF */
9990 bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LEN_B + bit(val(WALSH_LEN_B)+6) */
9991 bit_offset += 4; /* AUX_TD_POWER_LEVEL + TD_MODE */
9992 break;
9993 case 3:
9994 bit_offset += 8; /* SR3_PRIM_PILOT + SR3_PILOT_POWER1 + SR3_PILOT_POWER2 */
9995 break;
9996 case 6:
9997 bit_offset += 10; /* SR3_PRIM_PILOT + SR3_PILOT_POWER1 + SR3_PILOT_POWER2 + QOF */
9998 bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LEN_C + bit(val(WALSH_LEN_C)+6) */
9999 if (tvb_get_bits8(tvb,bit_offset,1))
10001 bit_offset += 3; /* 1 + QOF1 */
10002 bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LENGTH1 + bit(val(WALSH_LENGTH1)+6) */
10004 else
10005 bit_offset += 1;
10006 if (tvb_get_bits8(tvb,bit_offset,1))
10008 bit_offset += 3; /* 1 + QOF2 */
10009 bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LENGTH2 + bit(val(WALSH_LENGTH2)+6) */
10011 else
10012 bit_offset += 1;
10013 break;
10014 default:
10015 /* decoding sequence is unknown ! */
10016 return;
10019 idx -= 1;
10021 proto_tree_add_text(subtree2,tvb, bit_offset_sav2>>3, ((bit_offset-bit_offset_sav2)>>3)+1,"Data(Not decoded)");
10022 proto_item_set_len(item2, (bit_offset>>3) - (bit_offset_sav>>3)+1);
10024 proto_item_set_len(item, (bit_offset>>3) - (bit_offset_sav>>3)+1);
10026 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Measurement Parameters Description", "Present", "Not Present"))
10027 { /* 3G Measurement Parameters Description */
10028 guint8 reporting_quant = 0;
10029 bit_offset_sav = bit_offset;
10030 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr);
10031 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]);
10032 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_qsearch_c, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
10033 bit_offset += 4;
10034 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_search_prio, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10035 bit_offset += 1;
10036 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_rep_quant, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10037 reporting_quant = gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Reporting Quantity", "Ec/No", "RSCP");
10038 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "FDD Multirat Reporting", "Present", "Not Present"))
10040 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_multirat_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
10041 bit_offset += 2;
10043 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "FDD Reporting Offset", "Present", "Not Present"))
10045 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10046 bit_offset += 3;
10047 if (reporting_quant == 0)
10049 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_threshold_rscp, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10051 else
10053 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_threshold_ecn0, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10055 bit_offset += 3;
10057 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "TDD Multirat Reporting", "Present", "Not Present"))
10059 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_multirat_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
10060 bit_offset += 2;
10062 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "TDD Reporting Offset", "Present", "Not Present"))
10064 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10065 bit_offset += 3;
10066 if (reporting_quant == 0)
10068 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_reporting_threshold_rscp, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10070 else
10072 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_reporting_threshold_ecn0, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10074 bit_offset += 3;
10076 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "CDMA2000 Multirat Reporting", "Present", "Not Present"))
10077 bit_offset += 2; /* CDMA2000 Multirat Reporting */
10078 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "CDMA2000 Reporting Threshold", "Present", "Not Present"))
10079 bit_offset += 6; /* CDMA2000 Reporting Offset + CDMA2000 Reporting Threshold */
10080 proto_item_set_len(item, (bit_offset>>3) - (bit_offset_sav>>3)+1);
10083 /* Null breakpoint */
10084 if (bit_len - bit_offset > 0)
10086 /* There is still room left in the Rest Octets IE */
10087 if (gsm_rr_csn_HL_flag(tvb, tree, 0, bit_offset++, "Additions in Rel-5", "Present", "Not present"))
10088 { /* Additions in Rel-5 */
10089 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Additional Measurement Parameters Description 2", "Present", "Not Present"))
10090 { /* 3G Additional Measurement Parameters Description 2 */
10091 bit_offset += de_rr_3g_add_meas_param_desc2(tvb, tree, bit_offset);
10094 /* Null breakpoint */
10095 if (bit_len - bit_offset > 0)
10097 /* There is still room left in the Rest Octets IE */
10098 if (gsm_rr_csn_HL_flag(tvb, tree, 0, bit_offset++,"Additions in Rel-7", "Present", "Not present"))
10099 { /* Additions in Rel-7 */
10100 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "700 Reporting", "Present", "Not Present"))
10102 proto_tree_add_bits_item(tree, hf_gsm_a_rr_700_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10103 bit_offset += 3;
10104 proto_tree_add_bits_item(tree, hf_gsm_a_rr_700_reporting_threshold, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10105 bit_offset += 3;
10107 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "810 Reporting", "Present", "Not Present"))
10109 proto_tree_add_bits_item(tree, hf_gsm_a_rr_810_reporting_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10110 bit_offset += 3;
10111 proto_tree_add_bits_item(tree, hf_gsm_a_rr_810_reporting_threshold, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10112 bit_offset += 3;
10115 /* Null breakpoint */
10116 if (bit_len - bit_offset > 0)
10118 /* There is still room left in the Rest Octets IE */
10119 /* Additions in Rel-8 */
10120 if (gsm_rr_csn_HL_flag(tvb, tree, 0, bit_offset++, "Additions in Rel-8", "Present", "Not present"))
10121 { /* Additions in Rel-8 */
10122 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Supplementary Parameters Description", "Present", "Not Present"))
10124 bit_offset += de_rr_3g_supplementary_param_desc_mi(tvb, tree, bit_offset);
10126 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "E-UTRAN Parameters Description", "Present", "Not Present"))
10128 bit_offset += de_rr_eutran_param_desc_mi(tvb, tree, bit_offset);
10130 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "E-UTRAN CSG Description", "Present", "Not Present"))
10132 bit_offset += de_rr_eutran_csg_desc_mi(tvb, tree, bit_offset);
10140 gsm_rr_csn_padding_bits(tree, tvb, bit_offset, tvb_len);
10143 static guint32
10144 sacch_rr_eutran_meas_report(tvbuff_t *tvb, proto_tree *tree, guint32 bit_offset, guint len_in_bit _U_)
10146 proto_tree *subtree;
10147 proto_item *item;
10148 gint curr_bit_offset;
10149 gint8 n_eutran;
10151 curr_bit_offset = bit_offset;
10153 item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT].strptr);
10154 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT]);
10156 n_eutran = tvb_get_bits8(tvb,curr_bit_offset,2);
10157 n_eutran += 1;
10158 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_mr_n_eutran, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN);
10159 curr_bit_offset += 2;
10161 while ( (n_eutran > 0) && (curr_bit_offset - bit_offset < len_in_bit) )
10163 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_mr_freq_idx, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN);
10164 curr_bit_offset += 3;
10165 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_mr_cell_id, tvb, curr_bit_offset, 9, ENC_BIG_ENDIAN);
10166 curr_bit_offset += 9;
10167 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_mr_rpt_quantity, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN);
10168 curr_bit_offset += 6;
10169 n_eutran -= 1;
10172 return curr_bit_offset - bit_offset;
10176 * [4] 9.1.55 Enhanced Measurement Information
10178 static const true_false_string gsm_a_rr_bsic_seen_value = {
10179 "One Cell or more with invalid BSIC and allowed NCC part of BSIC is seen",
10180 "No cell with invalid BSIC and allowed NCC part of BSIC is seen"
10183 static const true_false_string gsm_a_rr_scale_value = {
10184 "+10 dB",
10185 "0 dB"
10188 static const value_string gsm_a_rr_mean_bep_gmsk_vals[] = {
10189 { 0, "log10(BEP) > -0.60"},
10190 { 1, "-0.70 < log10(BEP) < -0.60"},
10191 { 2, "-0.80 < log10(BEP) < -0.70"},
10192 { 3, "-0.90 < log10(BEP) < -0.80"},
10193 { 4, "-1.00 < log10(BEP) < -0.90"},
10194 { 5, "-1.10 < log10(BEP) < -1.00"},
10195 { 6, "-1.20 < log10(BEP) < -1.10"},
10196 { 7, "-1.30 < log10(BEP) < -1.20"},
10197 { 8, "-1.40 < log10(BEP) < -1.30"},
10198 { 9, "-1.50 < log10(BEP) < -1.40"},
10199 { 10, "-1.60 < log10(BEP) < -1.50"},
10200 { 11, "-1.70 < log10(BEP) < -1.60"},
10201 { 12, "-1.80 < log10(BEP) < -1.70"},
10202 { 13, "-1.90 < log10(BEP) < -1.80"},
10203 { 14, "-2.00 < log10(BEP) < -1.90"},
10204 { 15, "-2.10 < log10(BEP) < -2.00"},
10205 { 16, "-2.20 < log10(BEP) < -2.10"},
10206 { 17, "-2.30 < log10(BEP) < -2.20"},
10207 { 18, "-2.40 < log10(BEP) < -2.30"},
10208 { 19, "-2.50 < log10(BEP) < -2.40"},
10209 { 20, "-2.60 < log10(BEP) < -2.50"},
10210 { 21, "-2.70 < log10(BEP) < -2.60"},
10211 { 22, "-2.80 < log10(BEP) < -2.70"},
10212 { 23, "-2.90 < log10(BEP) < -2.80"},
10213 { 24, "-3.00 < log10(BEP) < -2.90"},
10214 { 25, "-3.10 < log10(BEP) < -3.00"},
10215 { 26, "-3.20 < log10(BEP) < -3.10"},
10216 { 27, "-3.30 < log10(BEP) < -3.20"},
10217 { 28, "-3.40 < log10(BEP) < -3.30"},
10218 { 29, "-3.50 < log10(BEP) < -3.40"},
10219 { 30, "-3.60 < log10(BEP) < -3.50"},
10220 { 31, "log10(BEP) < -3.60"},
10221 { 0, NULL }
10224 static const value_string gsm_a_rr_cv_bep_vals[] = {
10225 { 0, "1.75 < CV BEP < 2.00"},
10226 { 1, "1.50 < CV BEP < 1.75"},
10227 { 2, "1.25 < CV BEP < 1.50"},
10228 { 3, "1.00 < CV BEP < 1.25"},
10229 { 4, "0.75 < CV BEP < 1.00"},
10230 { 5, "0.50 < CV BEP < 0.75"},
10231 { 6, "0.25 < CV BEP < 0.50"},
10232 { 7, "0.00 < CV BEP < 0.25"},
10233 { 0, NULL }
10236 static void
10237 sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len)
10239 proto_tree *subtree;
10240 proto_item *item;
10241 guint32 curr_offset;
10242 guint bit_offset, bit_offset_sav;
10243 guint8 tvb_len = tvb_length(tvb);
10244 guint16 bit_len = tvb_len << 3;
10245 guint8 idx;
10247 curr_offset = offset;
10248 bit_offset = curr_offset << 3;
10250 proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_used, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10251 bit_offset += 1;
10252 proto_tree_add_bits_item(tree, hf_gsm_a_rr_3g_ba_used, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10253 bit_offset += 1;
10254 proto_tree_add_bits_item(tree, hf_gsm_a_rr_bsic_seen, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10255 bit_offset += 1;
10256 proto_tree_add_bits_item(tree, hf_gsm_a_rr_scale, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10257 bit_offset += 1;
10258 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Serving cell data", "Present", "Not Present"))
10259 { /* Serving cell data */
10260 bit_offset_sav = bit_offset;
10261 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_DATA].strptr);
10262 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_DATA]);
10263 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dtx_used, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
10264 bit_offset += 1;
10265 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_full_serv_cell, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
10266 bit_offset += 6;
10267 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxqual_full_serv_cell, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10268 bit_offset += 3;
10269 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mean_bep_gmsk, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
10270 bit_offset += 5;
10271 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mean_cv_bep, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
10272 bit_offset += 3;
10273 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nbr_rcvd_blocks, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
10274 bit_offset += 5;
10275 proto_item_set_len(item, (bit_offset>>3) - (bit_offset_sav>>3)+1);
10277 while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeated Invalid BSIC Information", "Present", "Not Present"))
10278 { /* Repeated Invalid BSIC Information */
10279 bit_offset_sav = bit_offset;
10280 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO].strptr);
10281 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO]);
10282 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_freq_ncell, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
10283 bit_offset += 5;
10284 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic_ncell, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
10285 bit_offset += 6;
10286 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_ncell, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
10287 bit_offset += 6;
10288 proto_item_set_len(item, (bit_offset>>3) - (bit_offset_sav>>3)+1);
10290 if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Bitmap Type Reporting", "Present", "Not Present"))
10291 { /* Bitmap Type Reporting */
10292 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING].strptr);
10293 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING]);
10294 idx = 0;
10295 while (((guint)(bit_offset>>3) <= (offset + len)) && (idx < 96))
10297 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Reporting Quantity", "Present", "Not Present"))
10299 proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Neighbour Cell List index: %u", idx);
10300 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reporting_quantity, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
10301 bit_offset += 6;
10303 idx += 1;
10306 /* Null breakpoint */
10307 if (bit_offset < bit_len)
10309 if (gsm_rr_csn_HL_flag(tvb, tree, 0, bit_offset++, "Additions in Rel-8", "Present", "Not Present"))
10311 gint8 bitmap_length;
10312 bit_offset_sav = bit_offset;
10313 item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPORTING_QUANTITY].strptr);
10314 subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPORTING_QUANTITY]);
10316 bitmap_length = tvb_get_bits8(tvb,bit_offset,7);
10317 bitmap_length += 1;
10318 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_emr_bitmap_length, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
10319 bit_offset += 7;
10321 /* REPORTING_QUANTITY */
10322 idx = 0;
10323 while ((guint)(bit_offset>>3) <= (offset + len) && (idx < bitmap_length) )
10325 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Reporting Quantity", "Present", "Not Present"))
10327 proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Neighbour Cell List index: %u", idx);
10328 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reporting_quantity, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
10329 bit_offset += 6;
10331 idx += 1;
10334 /* E-UTRAN Measurement Report */
10335 if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "E-UTRAN Measurement Report", "Present", "Not Present"))
10337 bit_offset += sacch_rr_eutran_meas_report(tvb, subtree, bit_offset, len*8-(bit_offset-offset*8));
10339 proto_item_set_len(item, (bit_offset>>3) - (bit_offset_sav>>3)+1);
10342 gsm_rr_csn_padding_bits(tree, tvb, bit_offset, tvb_len);
10345 #define NUM_GSM_DTAP_MSG_RR (sizeof(gsm_a_dtap_msg_rr_strings)/sizeof(value_string))
10346 static gint ett_gsm_dtap_msg_rr[NUM_GSM_DTAP_MSG_RR];
10347 static void (*dtap_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len) = {
10348 NULL, /* Reserved */
10349 dtap_rr_add_ass, /* Additional Assignment */
10350 dtap_rr_imm_ass, /* 9.1.18 Immediate assignment */
10351 dtap_rr_imm_ass_ext, /* Immediate Assignment Extended */
10352 dtap_rr_imm_ass_rej, /* Immediate Assignment Reject */
10354 dtap_rr_dtm_ass_fail, /* DTM Assignment Failure */
10355 dtap_rr_dtm_rej, /* DTM Reject */
10356 dtap_rr_dtm_req, /* DTM Request */
10357 dtap_rr_pkt_assign, /* Packet Assignment */
10358 dtap_rr_dtm_ass_cmd, /* DTM Assignment Command */
10359 dtap_rr_dtm_info, /* DTM Information */
10360 dtap_rr_pkt_notif, /* Packet Notification */
10362 dtap_rr_cip_mode_cmd, /* Ciphering Mode Command */
10363 dtap_rr_cip_mode_cpte, /* Ciphering Mode Complete */
10365 dtap_rr_conf_change_cmd, /* Configuration Change Command */
10366 NULL, /* Configuration Change Ack. */
10367 dtap_rr_conf_change_rej, /* Configuration Change Reject */
10369 dtap_rr_ass_cmd, /* 9.1.2 Assignment Command */
10370 dtap_rr_ass_comp, /* Assignment Complete */
10371 dtap_rr_ass_fail, /* Assignment Failure */
10372 dtap_rr_ho_cmd, /* Handover Command */
10373 dtap_rr_ho_cpte, /* Handover Complete */
10374 dtap_rr_ho_fail, /* Handover Failure */
10375 dtap_rr_phy_info, /* Physical Information */
10377 NULL, /* RR-cell Change Order */
10378 NULL, /* PDCH Assignment Command */
10380 dtap_rr_ch_rel, /* Channel Release */
10381 dtap_rr_partial_rel, /* Partial Release */
10382 NULL, /* Partial Release Complete */
10384 dtap_rr_paging_req_type_1, /* Paging Request Type 1 */
10385 dtap_rr_paging_req_type_2, /* Paging Request Type 2 */
10386 dtap_rr_paging_req_type_3, /* Paging Request Type 3 */
10387 dtap_rr_paging_resp, /* Paging Response */
10388 NULL, /* Notification/NCH */
10389 NULL, /* Reserved */
10390 NULL, /* Notification/Response */
10392 NULL, /* Reserved */
10394 dtap_rr_utran_classmark_change, /* Utran Classmark Change */
10395 NULL, /* cdma2000 Classmark Change */
10396 dtap_rr_inter_syst_to_utran_ho_cmd, /* Inter System to UTRAN Handover Command */
10397 NULL, /* Inter System to cdma2000 Handover Command */
10399 NULL, /* System Information Type 8 */
10400 dtap_rr_sys_info_1, /* System Information Type 1 */
10401 dtap_rr_sys_info_2, /* System Information Type 2 */
10402 dtap_rr_sys_info_3, /* System Information Type 3 */
10403 dtap_rr_sys_info_4, /* System Information Type 4 */
10404 dtap_rr_sys_info_5, /* System Information Type 5 */
10405 dtap_rr_sys_info_6, /* System Information Type 6 */
10406 NULL, /* System Information Type 7 */
10408 dtap_rr_sys_info_2bis, /* System Information Type 2bis */
10409 dtap_rr_sys_info_2ter, /* System Information Type 2ter */
10410 dtap_rr_sys_info_2quater, /* System Information Type 2quater */
10411 dtap_rr_sys_info_5bis, /* System Information Type 5bis */
10412 dtap_rr_sys_info_5ter, /* System Information Type 5ter */
10413 NULL, /* System Information Type 9 */
10414 dtap_rr_sys_info_13, /* System Information Type 13 */
10416 NULL, /* System Information Type 16 */
10417 NULL, /* System Information Type 17 */
10419 NULL, /* System Information Type 18 */
10420 NULL, /* System Information Type 19 */
10421 NULL, /* System Information Type 20 */
10423 dtap_rr_ch_mode_mod, /* Channel Mode Modify */
10424 dtap_rr_rr_status, /* RR Status */
10425 dtap_rr_ch_mode_mod_ack, /* Channel Mode Modify Acknowledge */
10426 dtap_rr_freq_redef, /* Frequency Redefinition */
10427 dtap_rr_meas_rep, /* 9.1.21 Measurement report */
10428 dtap_rr_mm_cm_change, /* 9.1.11 Classmark Change */
10429 dtap_rr_cm_enq, /* Classmark Enquiry */
10430 dtap_rr_ext_meas_report, /* Extended Measurement Report */
10431 dtap_rr_ext_meas_order, /* Extended Measurement Order */
10432 dtap_rr_gprs_sus_req, /* 9.1.13b GPRS Suspension Request */
10434 NULL, /* VGCS Uplink Grant */
10435 NULL, /* Uplink Release */
10436 NULL, /* Reserved */
10437 NULL, /* Uplink Busy */
10438 NULL, /* Talker Indication */
10440 NULL, /* UTRAN Classmark Change/Handover To UTRAN Command */ /* spec conflict */
10442 dtap_rr_app_inf, /* Application Information */
10444 NULL, /* NONE */
10447 void get_rr_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn_p)
10449 gint idx;
10451 *msg_str = try_val_to_str_idx((guint32) (oct & DTAP_RR_IEI_MASK), gsm_a_dtap_msg_rr_strings, &idx);
10452 *hf_idx = hf_gsm_a_dtap_msg_rr_type;
10453 if (*msg_str != NULL) {
10454 *ett_tree = ett_gsm_dtap_msg_rr[idx];
10455 *msg_fcn_p = dtap_msg_rr_fcn[idx];
10458 return;
10460 /* This is more or less a copy of the dissect_dtap() code just adding
10461 * L2 Pseudo Length decoding first
10462 * The code should probably be cleaned up.
10463 * The name CCCH might not be correct!
10465 static void
10466 dissect_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
10469 static gsm_a_tap_rec_t tap_rec[4];
10470 static gsm_a_tap_rec_t *tap_p;
10471 static guint tap_current = 0;
10473 void (*msg_fcn_p)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len);
10474 guint8 oct;
10475 guint8 pd;
10476 guint32 offset;
10477 guint32 len;
10478 guint32 oct_1, oct_2;
10479 proto_item *ccch_item = NULL;
10480 proto_tree *ccch_tree = NULL;
10481 proto_item *oct_1_item = NULL;
10482 proto_tree *pd_tree = NULL;
10483 const gchar *msg_str;
10484 gint ett_tree;
10485 gint ti;
10486 int hf_idx;
10487 gboolean nsd;
10489 len = tvb_length(tvb);
10491 if (len < 3){
10493 * too short to be CCCH
10495 call_dissector(data_handle, tvb, pinfo, tree);
10496 return;
10499 col_append_str(pinfo->cinfo, COL_INFO, "(CCCH) ");
10501 * set tap record pointer
10503 tap_current++;
10504 if (tap_current >= 4)
10506 tap_current = 0;
10508 tap_p = &tap_rec[tap_current];
10510 offset = 0;
10511 oct_2 = 0;
10513 /* Skip pseudo hdr here - it is dissected later */
10514 offset += 1;
10517 * get protocol discriminator
10519 oct_1 = tvb_get_guint8(tvb, offset++);
10521 if ((((oct_1 & DTAP_TI_MASK) >> 4) & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){
10523 * even though we don't know if a TI should be in the message yet
10524 * we rely on the TI/SKIP indicator to be 0 to avoid taking this
10525 * octet
10527 oct_2 = tvb_get_guint8(tvb, offset++);
10530 oct = tvb_get_guint8(tvb, offset);
10532 pd = oct_1 & DTAP_PD_MASK;
10533 ti = -1;
10534 msg_str = NULL;
10535 ett_tree = -1;
10536 hf_idx = -1;
10537 msg_fcn_p = NULL;
10538 nsd = FALSE;
10539 col_append_fstr(pinfo->cinfo, COL_INFO, "(%s) ",val_to_str(pd,gsm_a_pd_short_str_vals,"Unknown (%u)"));
10542 * octet 1
10544 switch (pd){
10545 case 6:
10546 get_rr_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p);
10547 break;
10549 default:
10550 /* XXX - hf_idx is still -1! this is a bug in the implementation, and I don't know how to fix it so simple return here */
10551 return;
10555 * create the protocol tree
10557 if (msg_str == NULL){
10558 ccch_item = proto_tree_add_protocol_format(tree, proto_a_ccch, tvb, 0, len,
10559 "GSM CCCH - Message Type (0x%02x)",
10560 oct);
10562 ccch_tree = proto_item_add_subtree(ccch_item, ett_ccch_msg);
10563 }else{
10564 ccch_item = proto_tree_add_protocol_format(tree, proto_a_ccch, tvb, 0, -1,
10565 "GSM CCCH - %s", msg_str);
10567 ccch_tree = proto_item_add_subtree(ccch_item, ett_tree);
10570 col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", msg_str);
10572 /* L2 Pseudo Length 10.5.2.19 */
10573 /* note: dissected out of sequence! */
10574 elem_v(tvb, ccch_tree, pinfo, GSM_A_PDU_TYPE_RR, DE_RR_L2_PSEUDO_LEN, 0, NULL);
10576 oct_1_item =
10577 proto_tree_add_text(ccch_tree,
10578 tvb, 1, 1,
10579 "Protocol Discriminator: %s",
10580 val_to_str(pd, protocol_discriminator_vals, "Unknown (%u)"));
10582 pd_tree = proto_item_add_subtree(oct_1_item, ett_ccch_oct_1);
10583 proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 1, 1, ENC_BIG_ENDIAN);
10585 if (ti == -1){
10586 proto_tree_add_item(pd_tree, hf_gsm_a_skip_ind, tvb, 1, 1, ENC_BIG_ENDIAN);
10587 }else{
10588 other_decode_bitfield_value(a_bigbuf, oct_1, 0x80, 8);
10589 proto_tree_add_text(pd_tree,tvb, 1, 1,
10590 "%s : TI flag: %s",
10591 a_bigbuf,
10592 ((oct_1 & 0x80) ? "allocated by receiver" : "allocated by sender"));
10594 if ((ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){
10595 /* ti is extended to next octet */
10596 other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
10597 proto_tree_add_text(pd_tree, tvb, 1, 1,
10598 "%s : TIO: The TI value is given by the TIE in octet 2",
10599 a_bigbuf);
10600 }else{
10601 other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
10602 proto_tree_add_text(pd_tree,tvb, 1, 1,
10603 "%s : TIO: %u",a_bigbuf,ti & DTAP_TIE_PRES_MASK);
10608 if ((ti != -1) && (ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){
10609 proto_tree_add_item(tree, hf_gsm_a_extension, tvb, 2, 1, ENC_BIG_ENDIAN);
10610 other_decode_bitfield_value(a_bigbuf, oct_2, DTAP_TIE_MASK, 8);
10611 proto_tree_add_text(pd_tree, tvb, 2, 1,
10612 "%s : TIE: %u", a_bigbuf, oct_2 & DTAP_TIE_MASK);
10616 * N(SD)
10618 if ((pinfo->p2p_dir == P2P_DIR_RECV) &&
10619 nsd)
10621 /* XXX */
10625 * add DTAP message name
10627 proto_tree_add_uint_format(ccch_tree, hf_idx, tvb, offset, 1, oct,
10628 "Message Type: %s",msg_str ? msg_str : "(Unknown)");
10630 offset++;
10632 tap_p->pdu_type = GSM_A_PDU_TYPE_DTAP;
10633 tap_p->message_type = (nsd ? (oct & 0x3f) : oct);
10634 tap_p->protocol_disc = (gsm_a_pd_str_e)pd;
10636 tap_queue_packet(gsm_a_tap, pinfo, tap_p);
10638 if (msg_str == NULL)
10639 return;
10641 if (offset >= len)
10642 return;
10645 * decode elements
10647 if (msg_fcn_p == NULL){
10648 proto_tree_add_text(ccch_tree, tvb, offset, len - offset,
10649 "Message Elements");
10650 }else{
10651 (*msg_fcn_p)(tvb, ccch_tree, pinfo, offset, len - offset);
10655 const value_string gsm_a_rr_short_pd_msg_strings[] = {
10656 { 0x00, "System Information Type 10" },
10657 { 0x01, "Notification/FACCH" },
10658 { 0x02, "Uplink Free" },
10659 { 0x04, "Enhanced Measurement Report" },
10660 { 0x05, "Measurement Information" },
10661 { 0x06, "VBS/VGCS Reconfigure" },
10662 { 0x07, "VBS/VGCS Reconfigure2" },
10663 { 0x08, "VGCS Additional Information" },
10664 { 0x09, "VGCS SMS Information" },
10665 { 0, NULL }
10668 #define NUM_GSM_SACCH_MSG_RR (sizeof(gsm_a_rr_short_pd_msg_strings)/sizeof(value_string))
10669 static gint ett_gsm_sacch_msg_rr[NUM_GSM_SACCH_MSG_RR];
10670 static void (*sacch_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
10671 NULL, /* System Information Type 10 */
10672 NULL, /* Notification/FACCH */
10673 NULL, /* Uplink Free */
10674 sacch_rr_enh_meas_report, /* Enhanced Measurement Report */
10675 sacch_rr_meas_info, /* Measurement Information */
10676 NULL, /* VBS/VGCS Reconfigure */
10677 NULL, /* VBS/VGCS Reconfigure2 */
10678 NULL, /* VGCS Additional Information */
10679 NULL, /* VGCS SMS Information */
10680 NULL, /* NONE */
10683 static void
10684 get_rr_short_pd_msg_params(guint8 mess_type, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn_p)
10686 gint idx;
10688 *msg_str = try_val_to_str_idx((guint32) mess_type, gsm_a_rr_short_pd_msg_strings, &idx);
10689 *hf_idx = hf_gsm_a_rr_short_pd_msg_type;
10690 if (*msg_str != NULL) {
10691 *ett_tree = ett_gsm_sacch_msg_rr[idx];
10692 *msg_fcn_p = sacch_msg_rr_fcn[idx];
10696 const value_string short_protocol_discriminator_vals[] = {
10697 {0x0, "Radio Resources Management messages"},
10698 { 0, NULL }
10701 static void
10702 dissect_sacch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
10704 static gsm_a_tap_rec_t tap_rec[4];
10705 static gsm_a_tap_rec_t *tap_p;
10706 static guint tap_current = 0;
10708 void (*msg_fcn_p)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len);
10709 guint8 oct, short_pd, mess_type;
10710 guint32 offset, bit_offset = 0;
10711 guint32 len;
10712 proto_item *sacch_item = NULL;
10713 proto_tree *sacch_tree = NULL;
10714 const gchar *msg_str;
10715 gint ett_tree;
10716 int hf_idx;
10718 len = tvb_length(tvb);
10720 col_append_str(pinfo->cinfo, COL_INFO, "(SACCH) ");
10723 * set tap record pointer
10725 tap_current++;
10726 if (tap_current >= 4)
10728 tap_current = 0;
10730 tap_p = &tap_rec[tap_current];
10732 offset = 0;
10734 oct = tvb_get_guint8(tvb, offset);
10736 msg_str = NULL;
10737 ett_tree = -1;
10738 hf_idx = -1;
10739 msg_fcn_p = NULL;
10741 short_pd = (oct & 0x80) >> 7;
10742 mess_type = (oct & 0x7c) >> 2;
10744 if (short_pd == 0)
10746 col_append_str(pinfo->cinfo, COL_INFO, "(RR) ");
10747 get_rr_short_pd_msg_params(mess_type, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p);
10749 else
10751 col_append_str(pinfo->cinfo, COL_INFO, "(Unknown) ");
10755 * create the protocol tree
10757 if (msg_str == NULL){
10758 sacch_item = proto_tree_add_protocol_format(tree, proto_a_sacch, tvb, 0, len,
10759 "GSM SACCH - Message Type (0x%02x)", mess_type);
10761 sacch_tree = proto_item_add_subtree(sacch_item, ett_sacch_msg);
10762 }else{
10763 sacch_item = proto_tree_add_protocol_format(tree, proto_a_sacch, tvb, 0, -1,
10764 "GSM SACCH - %s", msg_str);
10766 sacch_tree = proto_item_add_subtree(sacch_item, ett_tree);
10768 col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", msg_str);
10771 if (short_pd == 0)
10772 proto_tree_add_bits_item(sacch_tree, hf_gsm_a_rr_short_pd, tvb, offset * 8 + bit_offset++, 1, ENC_BIG_ENDIAN);
10774 if (hf_idx == -1)
10775 return;
10778 * add SACCH message name
10780 proto_tree_add_bits_item(sacch_tree, hf_gsm_a_rr_short_pd_msg_type, tvb, offset * 8 + bit_offset, 5, ENC_BIG_ENDIAN);
10781 bit_offset += 5;
10783 proto_tree_add_bits_item(sacch_tree, hf_gsm_a_rr_short_l2_header, tvb, offset * 8 + bit_offset, 2, ENC_BIG_ENDIAN);
10784 offset++;
10786 tap_p->pdu_type = GSM_A_PDU_TYPE_SACCH;
10787 tap_p->message_type = mess_type;
10788 tap_p->protocol_disc = (gsm_a_pd_str_e)short_pd;
10790 tap_queue_packet(gsm_a_tap, pinfo, tap_p);
10792 if (msg_str == NULL)
10793 return;
10796 * decode elements
10798 if (msg_fcn_p == NULL){
10799 proto_tree_add_text(sacch_tree, tvb, offset, len - offset,
10800 "Message Elements");
10801 }else{
10802 (*msg_fcn_p)(tvb, sacch_tree, pinfo, offset, len - offset);
10806 /* Register the protocol with Wireshark */
10807 void
10808 proto_register_gsm_a_rr(void)
10810 guint i;
10811 guint last_offset;
10813 /* Setup list of header fields */
10815 static hf_register_info hf[] =
10817 { &hf_gsm_a_dtap_msg_rr_type,
10818 { "DTAP Radio Resources Management Message Type", "gsm_a.dtap.msg_rr_type",
10819 FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_rr_strings), 0x0,
10820 NULL, HFILL }
10822 { &hf_gsm_a_rr_elem_id,
10823 { "Element ID", "gsm_a.rr.elem_id",
10824 FT_UINT8, BASE_HEX, NULL, 0,
10825 NULL, HFILL }
10827 { &hf_gsm_a_rr_bcc,
10828 { "BCC","gsm_a.rr.bcc",
10829 FT_UINT8,BASE_DEC, NULL, 0x07,
10830 NULL, HFILL }
10832 { &hf_gsm_a_rr_ncc,
10833 { "NCC","gsm_a.rr.ncc",
10834 FT_UINT8,BASE_DEC, NULL, 0x38,
10835 NULL, HFILL }
10837 { &hf_gsm_a_rr_bcch_arfcn,
10838 { "BCCH ARFCN(RF channel number)","gsm_a.rr.bcch_arfcn",
10839 FT_UINT16,BASE_DEC, NULL, 0x0,
10840 NULL, HFILL }
10842 { &hf_gsm_a_rr_range_nb,
10843 { "Number of Ranges","gsm_a.rr.range_nb",
10844 FT_UINT8, BASE_DEC, NULL, 0xff,
10845 NULL, HFILL }
10847 { &hf_gsm_a_rr_range_lower,
10848 { "Range Lower","gsm_a.rr.range_lower",
10849 FT_UINT16, BASE_DEC, NULL, 0x0000,
10850 "ARFCN used as the lower limit of a range of frequencies to be used by the mobile station in cell selection (Range Lower)", HFILL }
10852 { &hf_gsm_a_rr_range_higher,
10853 { "Range Higher","gsm_a.rr.range_higher",
10854 FT_UINT16, BASE_DEC, NULL, 0x0000,
10855 "ARFCN used as the higher limit of a range of frequencies to be used by the mobile station in cell selection (Range Higher)", HFILL }
10857 { &hf_gsm_a_rr_ba_freq,
10858 { "BA Freq","gsm_a.rr.ba_freq",
10859 FT_UINT16, BASE_DEC, NULL, 0x0000,
10860 "ARFCN indicating a single frequency to be used by the mobile station in cell selection and reselection (BA Freq)", HFILL }
10862 { &hf_gsm_a_rr_ho_ref_val,
10863 { "Handover reference value","gsm_a.rr.ho_ref_val",
10864 FT_UINT8,BASE_DEC, NULL, 0x0,
10865 NULL, HFILL }
10867 { &hf_gsm_a_rr_L2_pseudo_len,
10868 { "L2 Pseudo Length value","gsm_a.rr.l2_pseudo_len",
10869 FT_UINT8, BASE_DEC, NULL, 0xfc,
10870 NULL, HFILL }
10872 { &hf_gsm_a_rr_ba_used,
10873 { "BA-USED","gsm_a.rr.ba_used",
10874 FT_UINT8, BASE_DEC, NULL, 0x00,
10875 NULL, HFILL }
10877 { &hf_gsm_a_rr_dtx_used,
10878 { "DTX-USED","gsm_a.rr.dtx_used",
10879 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dtx_vals), 0x0,
10880 NULL, HFILL }
10882 { &hf_gsm_a_rr_3g_ba_used,
10883 { "3G-BA-USED","gsm_a.rr.3g_ba_used",
10884 FT_UINT8, BASE_DEC, NULL, 0x00,
10885 NULL, HFILL }
10887 { &hf_gsm_a_rr_meas_valid,
10888 { "MEAS-VALID","gsm_a.rr.meas_valid",
10889 FT_BOOLEAN,8, TFS(&gsm_a_rr_mv_vals), 0x40,
10890 NULL, HFILL }
10892 { &hf_gsm_a_rr_rxlev_full_serv_cell,
10893 { "RXLEV-FULL-SERVING-CELL","gsm_a.rr.rxlev_full_serv_cell",
10894 FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_a_rr_rxlev_vals_ext, 0x00,
10895 NULL, HFILL }
10897 { &hf_gsm_a_rr_rxlev_sub_serv_cell,
10898 { "RXLEV-SUB-SERVING-CELL","gsm_a.rr.rxlev_sub_serv_cell",
10899 FT_UINT8,BASE_DEC|BASE_EXT_STRING, &gsm_a_rr_rxlev_vals_ext, 0x00,
10900 NULL, HFILL }
10902 { &hf_gsm_a_rr_rxqual_full_serv_cell,
10903 { "RXQUAL-FULL-SERVING-CELL","gsm_a.rr.rxqual_full_serv_cell",
10904 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x00,
10905 NULL, HFILL }
10907 { &hf_gsm_a_rr_rxqual_sub_serv_cell,
10908 { "RXQUAL-SUB-SERVING-CELL","gsm_a.rr.rxqual_sub_serv_cell",
10909 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x0e,
10910 NULL, HFILL }
10912 { &hf_gsm_a_rr_no_ncell_m,
10913 { "NO-NCELL-M","gsm_a.rr.no_ncell_m",
10914 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_ncell_vals), 0x00,
10915 NULL, HFILL }
10917 { &hf_gsm_a_rr_rxlev_ncell,
10918 { "RXLEV-NCELL","gsm_a.rr.rxlev_ncell",
10919 FT_UINT8,BASE_DEC, NULL, 0x00,
10920 NULL, HFILL }
10922 { &hf_gsm_a_rr_bcch_freq_ncell,
10923 { "BCCH-FREQ-NCELL","gsm_a.rr.bcch_freq_ncell",
10924 FT_UINT8,BASE_DEC, NULL, 0x00,
10925 NULL, HFILL }
10927 { &hf_gsm_a_rr_bsic_ncell,
10928 { "BSIC-NCELL","gsm_a.rr.bsic_ncell",
10929 FT_UINT8,BASE_DEC, NULL, 0x00,
10930 NULL, HFILL }
10932 { &hf_gsm_a_rr_mobile_time_difference,
10933 { "Mobile Timing Difference value (in half bit periods)","gsm_a.rr.mobile_time_difference",
10934 FT_UINT32,BASE_DEC, NULL, 0xFFFFF8,
10935 NULL, HFILL }
10937 { &hf_gsm_a_rr_pow_cmd_atc,
10938 { "ATC","gsm_a.rr.pow_cmd_atc",
10939 FT_BOOLEAN,8, TFS(&gsm_a_rr_pow_cmd_atc_value), 0x80,
10940 NULL, HFILL }
10942 { &hf_gsm_a_rr_page_mode,
10943 { "Page Mode","gsm_a.rr.page_mode",
10944 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_page_mode_vals), 0x0F,
10945 NULL, HFILL }
10947 { &hf_gsm_a_rr_dedicated_mode_or_tbf,
10948 { "Dedicated mode or TBF","gsm_a.rr.dedicated_mode_or_tbf",
10949 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_dedicated_mode_or_tbf_vals), 0xF0,
10950 NULL, HFILL }
10952 { &hf_gsm_a_rr_pow_cmd_epc,
10953 { "EPC_mode","gsm_a.rr.pow_cmd_epc",
10954 FT_BOOLEAN,8, TFS(&gsm_a_rr_pow_cmd_epc_value), 0x40,
10955 NULL, HFILL }
10957 { &hf_gsm_a_rr_pow_cmd_fpcepc,
10958 { "FPC_EPC","gsm_a.rr.pow_cmd_fpcepc",
10959 FT_BOOLEAN,8, TFS(&gsm_a_rr_pow_cmd_fpcepc_value), 0x20,
10960 NULL, HFILL }
10962 { &hf_gsm_a_rr_pow_cmd_powlev,
10963 { "POWER LEVEL","gsm_a.rr.pow_cmd_pow",
10964 FT_UINT8,BASE_DEC, NULL, 0x1f,
10965 NULL, HFILL }
10967 { &hf_gsm_a_rr_sync_ind_nci,
10968 { "Normal cell indication(NCI)","gsm_a.rr.sync_ind_nci",
10969 FT_BOOLEAN,8, TFS(&gsm_a_rr_sync_ind_nci_value), 0x08,
10970 NULL, HFILL }
10972 { &hf_gsm_a_rr_sync_ind_rot,
10973 { "Report Observed Time Difference(ROT)","gsm_a.rr.sync_ind_rot",
10974 FT_BOOLEAN,8, TFS(&sm_a_rr_sync_ind_rot_value), 0x04,
10975 NULL, HFILL }
10977 { &hf_gsm_a_rr_sync_ind_si,
10978 { "Synchronization indication(SI)","gsm_a.rr.sync_ind_si",
10979 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_sync_ind_si_vals), 0x03,
10980 NULL, HFILL }
10982 { &hf_gsm_a_rr_format_id,
10983 { "Format Identifier","gsm_a.rr.format_id",
10984 FT_UINT8,BASE_HEX, VALS(gsm_a_rr_freq_list_format_id_vals), 0xce,
10985 NULL, HFILL }
10987 { &hf_gsm_a_rr_format_id2,
10988 { "Format Identifier","gsm_a.rr.format_id",
10989 FT_UINT8,BASE_HEX, VALS(gsm_a_rr_freq_list_format_id_vals), 0x8e,
10990 NULL, HFILL }
10992 { &hf_gsm_a_rr_channel_mode,
10993 { "Channel Mode","gsm_a.rr.channel_mode",
10994 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_channel_mode_vals), 0x0,
10995 NULL, HFILL }
10997 { &hf_gsm_a_rr_channel_mode2,
10998 { "Channel Mode 2","gsm_a.rr.channel_mode2",
10999 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_channel_mode2_vals), 0x0,
11000 NULL, HFILL }
11002 { &hf_gsm_a_rr_sc,
11003 { "SC","gsm_a.rr.SC",
11004 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_sc_vals), 0x00,
11005 NULL, HFILL }
11007 { &hf_gsm_a_rr_algorithm_id,
11008 { "Algorithm identifier","gsm_a.rr.algorithm_identifier",
11009 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_algorithm_identifier_vals), 0x00,
11010 NULL, HFILL }
11012 { &hf_gsm_a_rr_cr,
11013 { "CR","gsm_a.rr.CR",
11014 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_cr_vals), 0x00,
11015 NULL, HFILL }
11017 { &hf_gsm_a_rr_multirate_speech_ver,
11018 { "Multirate speech version","gsm_a.rr.multirate_speech_ver",
11019 FT_UINT8,BASE_DEC, VALS(multirate_speech_ver_vals), 0xe0,
11020 NULL, HFILL }
11022 { &hf_gsm_a_rr_NCSB,
11023 { "NSCB: Noise Suppression Control Bit","gsm_a.rr.NCSB",
11024 FT_UINT8,BASE_DEC, VALS(NSCB_vals), 0x10,
11025 NULL, HFILL }
11027 { &hf_gsm_a_rr_ICMI,
11028 { "ICMI: Initial Codec Mode Indicator","gsm_a.rr.ICMI",
11029 FT_UINT8,BASE_DEC, VALS(ICMI_vals), 0x8,
11030 NULL, HFILL }
11032 { &hf_gsm_a_rr_start_mode,
11033 { "Start Mode","gsm_a.rr.start_mode",
11034 FT_UINT8,BASE_DEC, NULL, 0x3,
11035 NULL, HFILL }
11037 { &hf_gsm_a_rr_timing_adv,
11038 { "Timing advance value","gsm_a.rr.timing_adv",
11039 FT_UINT8,BASE_DEC, NULL, 0x0,
11040 NULL, HFILL }
11042 { &hf_gsm_a_rr_time_diff,
11043 { "Time difference value","gsm_a.rr.time_diff",
11044 FT_UINT8,BASE_DEC, NULL, 0x0,
11045 NULL, HFILL }
11047 { &hf_gsm_a_rr_tlli,
11048 { "TLLI","gsm_a.rr.tlli",
11049 FT_UINT32,BASE_HEX, NULL, 0x0,
11050 NULL, HFILL }
11052 { &hf_gsm_a_rr_tmsi_ptmsi,
11053 { "TMSI/P-TMSI Value","gsm_a.rr.tmsi_ptmsi",
11054 FT_UINT32,BASE_HEX, NULL, 0x0,
11055 NULL, HFILL }
11057 { &hf_gsm_a_rr_target_mode,
11058 { "Target mode","gsm_a.rr.target_mode",
11059 FT_UINT8,BASE_DEC, NULL, 0xc0,
11060 NULL, HFILL }
11062 { &hf_gsm_a_rr_wait_indication,
11063 { "Wait Indication","gsm_a.rr.wait_indication",
11064 FT_UINT8,BASE_DEC, NULL, 0x00,
11065 NULL, HFILL }
11067 { &hf_gsm_a_rr_seq_code,
11068 { "Sequence Code","gsm_a.rr.seq_code",
11069 FT_UINT8, BASE_DEC, NULL, 0x00,
11070 NULL, HFILL }
11073 { &hf_gsm_a_rr_group_cipher_key_number,
11074 { "Group cipher key number","gsm_a.rr.Group_cipher_key_number",
11075 FT_UINT8,BASE_DEC, NULL, 0x3c,
11076 NULL, HFILL }
11078 { &hf_gsm_a_rr_MBMS_broadcast,
11079 { "MBMS Broadcast","gsm_a.rr.MBMS_broadcast",
11080 FT_BOOLEAN,8, TFS(&gsm_a_rr_MBMS_broadcast_value), 0x01,
11081 NULL, HFILL }
11083 { &hf_gsm_a_rr_MBMS_multicast,
11084 { "MBMS Multicast","gsm_a.rr.MBMS_multicast",
11085 FT_BOOLEAN,8, TFS(&gsm_a_rr_MBMS_multicast_value), 0x02,
11086 NULL, HFILL }
11088 { &hf_gsm_a_rr_last_segment,
11089 { "Last Segment","gsm_a.rr.last_segment",
11090 FT_BOOLEAN,8, TFS(&gsm_a_rr_last_segment_value), 0x01,
11091 NULL, HFILL }
11093 { &hf_gsm_a_rr_carrier_ind,
11094 { "Carrier Indication","gsm_a.rr.carrier_ind",
11095 FT_BOOLEAN,8, TFS(&gsm_a_rr_carrier_ind_value), 0x01,
11096 NULL, HFILL }
11098 { &hf_gsm_a_rr_ra,
11099 { "Random Access Information (RA)", "gsm_a.rr.ra",
11100 FT_UINT8, BASE_DEC, NULL, 0x0,
11101 NULL, HFILL }
11103 { &hf_gsm_a_rr_T1prim,
11104 { "T1'", "gsm_a.rr.T1prim",
11105 FT_UINT8, BASE_DEC, NULL, 0xf8,
11106 NULL, HFILL }
11108 { &hf_gsm_a_rr_T3,
11109 { "T3", "gsm_a.rr.T3",
11110 FT_UINT16, BASE_DEC, NULL, 0x07e0,
11111 NULL, HFILL }
11113 { &hf_gsm_a_rr_T2,
11114 { "T2", "gsm_a.rr.T2",
11115 FT_UINT8, BASE_DEC, NULL, 0x1f,
11116 NULL, HFILL }
11118 { &hf_gsm_a_rr_tbf_T1prim,
11119 { "T1' (TBF)", "gsm_a.rr.tbf.T1prim",
11120 FT_UINT8, BASE_DEC, NULL, 0x00,
11121 NULL, HFILL }
11123 { &hf_gsm_a_rr_tbf_T3,
11124 { "T3 (TBF)", "gsm_a.rr.tbf.T3",
11125 FT_UINT16, BASE_DEC, NULL, 0x00,
11126 NULL, HFILL }
11128 { &hf_gsm_a_rr_tbf_T2,
11129 { "T2 (TBF)", "gsm_a.rr.tbf.T2",
11130 FT_UINT8, BASE_DEC, NULL, 0x00,
11131 NULL, HFILL }
11133 { &hf_gsm_a_rr_rfn,
11134 { "RFN", "gsm_a.rr.rfn",
11135 FT_UINT16, BASE_DEC, NULL, 0x0,
11136 "Reduced Frame Number", HFILL }
11138 { &hf_gsm_a_rr_RR_cause,
11139 { "RR cause value","gsm_a.rr.RRcause",
11140 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_RR_cause_vals), 0x0,
11141 NULL, HFILL }
11143 { &hf_gsm_a_rr_cm_cng_msg_req,
11144 { "CLASSMARK CHANGE","gsm_a.rr.cm_cng_msg_req",
11145 FT_BOOLEAN,8, TFS(&gsm_a_msg_req_value), 0x80,
11146 NULL, HFILL }
11148 { &hf_gsm_a_rr_utran_cm_cng_msg_req,
11149 { "UTRAN CLASSMARK CHANGE","gsm_a.rr.utran_cm_cng_msg_req",
11150 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_utran_cm_cng_msg_req_vals), 0x70,
11151 NULL, HFILL }
11153 { &hf_gsm_a_rr_cdma200_cm_cng_msg_req,
11154 { "CDMA2000 CLASSMARK CHANGE","gsm_a.rr.cdma200_cm_cng_msg_req",
11155 FT_BOOLEAN,8, TFS(&gsm_a_msg_req_value), 0x08,
11156 NULL, HFILL }
11158 { &hf_gsm_a_rr_geran_iu_cm_cng_msg_req,
11159 { "GERAN IU MODE CLASSMARK CHANGE","gsm_a.rr.geran_iu_cm_cng_msg_req",
11160 FT_BOOLEAN,8, TFS(&gsm_a_msg_req_value), 0x04,
11161 NULL, HFILL }
11163 { &hf_gsm_a_rr_chnl_needed_ch1,
11164 { "Channel 1","gsm_a.rr.chnl_needed_ch1",
11165 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_channel_needed_vals), 0x00,
11166 NULL, HFILL }
11168 { &hf_gsm_a_rr_chnl_needed_ch2,
11169 { "Channel 2","gsm_a.rr.chnl_needed_ch2",
11170 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_channel_needed_vals), 0x00,
11171 NULL, HFILL }
11173 { &hf_gsm_a_rr_chnl_needed_ch3,
11174 { "Channel 3","gsm_a.rr.chnl_needed_ch3",
11175 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_channel_needed_vals), 0x00,
11176 NULL, HFILL }
11178 { &hf_gsm_a_rr_chnl_needed_ch4,
11179 { "Channel 4","gsm_a.rr.chnl_needed_ch4",
11180 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_channel_needed_vals), 0x00,
11181 NULL, HFILL }
11183 { &hf_gsm_a_rr_pkt_estab_cause,
11184 { "PACKET_ESTABLISHMENT_CAUSE","gsm_a.rr.pkt_estab_cause",
11185 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pkt_estab_cause_vals), 0x00,
11186 NULL, HFILL }
11188 { &hf_gsm_a_rr_peak_throughput_class,
11189 { "PEAK_THROUGHPUT_CLASS","gsm_a.rr.peak_throughput_class",
11190 FT_UINT8, BASE_DEC, NULL, 0x00,
11191 NULL, HFILL }
11193 { &hf_gsm_a_rr_radio_priority,
11194 { "RADIO_PRIORITY","gsm_a.rr.radio_priority",
11195 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_radio_priority_vals), 0x00,
11196 NULL, HFILL }
11198 { &hf_gsm_a_rr_llc_pdu_type,
11199 { "LLC_PDU_TYPE","gsm_a.rr.llc_pdu_type",
11200 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_llc_pdu_type_value), 0x00,
11201 NULL, HFILL }
11203 { &hf_gsm_a_rr_rlc_octet_count,
11204 { "RLC_OCTET_COUNT","gsm_a.rr.rlc_octet_count",
11205 FT_UINT16, BASE_DEC, NULL, 0x00,
11206 NULL, HFILL }
11208 { &hf_gsm_a_rr_rlc_non_pers_mode_cap,
11209 { "RLC Non-persistent Mode Capability","gsm_a.rr.rlc_non_pers_mode_cap",
11210 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x00,
11211 NULL, HFILL }
11213 { &hf_gsm_a_rr_reduced_latency_cap,
11214 { "Reduced Latency Capability","gsm_a.rr.reduced_latency_cap",
11215 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_reduced_latency_cap_value), 0x00,
11216 NULL, HFILL }
11218 { &hf_gsm_a_rr_ul_egprs2,
11219 { "Uplink EGPRS2","gsm_a.rr.ul_egprs2",
11220 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_egprs2_vals), 0x00,
11221 NULL, HFILL }
11223 { &hf_gsm_a_rr_dl_egprs2,
11224 { "Downlink EGPRS2","gsm_a.rr.dl_egprs2",
11225 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_egprs2_vals), 0x00,
11226 NULL, HFILL }
11228 { &hf_gsm_a_rr_emst_ms_cap,
11229 { "EMST_MS_Capability","gsm_a.rr.emst_ms_cap",
11230 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x00,
11231 NULL, HFILL }
11233 { &hf_gsm_a_rr_suspension_cause,
11234 { "Suspension cause value","gsm_a.rr.suspension_cause",
11235 FT_UINT8,BASE_DEC, VALS(gsm_a_rr_suspension_cause_vals), 0x0,
11236 NULL, HFILL }
11238 { &hf_gsm_a_rr_apdu_id,
11239 { "APDU ID","gsm_a.rr.apdu_id",
11240 FT_UINT8,BASE_HEX, VALS(gsm_a_rr_apdu_id_vals), 0x0f,
11241 NULL, HFILL }
11243 { &hf_gsm_a_rr_apdu_flags,
11244 { "APDU Flags","gsm_a.rr.apdu_flags",
11245 FT_UINT8,BASE_HEX, VALS(gsm_a_rr_apdu_flags_vals), 0xf0,
11246 NULL, HFILL }
11248 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8,
11249 { "12,2 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b8",
11250 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x80,
11251 NULL, HFILL }
11253 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7,
11254 { "10,2 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b7",
11255 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x40,
11256 NULL, HFILL }
11258 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6,
11259 { "7,95 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b6",
11260 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x20,
11261 NULL, HFILL }
11263 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5,
11264 { "7,40 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b5",
11265 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x10,
11266 NULL, HFILL }
11268 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4,
11269 { "6,70 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b4",
11270 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x08,
11271 NULL, HFILL }
11273 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3,
11274 { "5,90 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b3",
11275 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x04,
11276 NULL, HFILL }
11278 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2,
11279 { "5,15 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b2",
11280 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x02,
11281 NULL, HFILL }
11283 { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1,
11284 { "4,75 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b1",
11285 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x01,
11286 NULL, HFILL }
11288 { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5,
11289 { "23,85 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b5",
11290 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x10,
11291 NULL, HFILL }
11293 { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4,
11294 { "15,85 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b4",
11295 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x08,
11296 NULL, HFILL }
11298 { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3,
11299 { "12,65 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b3",
11300 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x04,
11301 NULL, HFILL }
11303 { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2,
11304 { "8,85 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b2",
11305 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x02,
11306 NULL, HFILL }
11308 { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1,
11309 { "6,60 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b1",
11310 FT_BOOLEAN,8, TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x01,
11311 NULL, HFILL }
11313 { &hf_gsm_a_rr_amr_threshold,
11314 { "AMR Threshold", "gsm_a.rr.amr_threshold",
11315 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gsm_a_rr_amr_threshold_vals_ext, 0x00,
11316 NULL, HFILL }
11318 { &hf_gsm_a_rr_amr_hysteresis,
11319 { "AMR Hysteresis", "gsm_a.rr.amr_hysteresis",
11320 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_amr_hysteresis_vals), 0x00,
11321 NULL, HFILL }
11323 { &hf_gsm_a_rr_pwrc,
11324 { "PWRC", "gsm_a.rr.pwrc",
11325 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
11326 "Power Control Indicator (PWRC)", HFILL }
11328 { &hf_gsm_a_rr_dtx_bcch,
11329 { "DTX (BCCH)", "gsm_a.rr.dtx_bcch",
11330 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_dtx_bcch_vals), 0x30,
11331 "Discontinuous Transmission (DTX-BCCH)", HFILL }
11333 { &hf_gsm_a_rr_dtx_sacch,
11334 { "DTX (SACCH)", "gsm_a.rr.dtx_sacch",
11335 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_dtx_sacch_vals), 0x00,
11336 "Discontinuous Transmission (DTX-SACCH)", HFILL }
11338 { &hf_gsm_a_rr_radio_link_timeout,
11339 { "Radio Link Timeout", "gsm_a.rr.radio_link_timeout",
11340 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_radio_link_timeout_vals), 0x0f,
11341 "Radio Link Timeout (s)", HFILL }
11343 { &hf_gsm_a_rr_cell_reselect_hyst,
11344 { "Cell Reselection Hysteresis", "gsm_a.rr.cell_reselect_hyst",
11345 FT_UINT8, BASE_DEC, NULL, 0xe0,
11346 "Cell Reselection Hysteresis (dB)", HFILL }
11348 { &hf_gsm_a_rr_ms_txpwr_max_cch,
11349 { "MS TXPWR MAX CCH", "gsm_a.rr.ms_txpwr_max_cch",
11350 FT_UINT8, BASE_DEC, NULL, 0x1f,
11351 NULL, HFILL }
11353 { &hf_gsm_a_rr_acs,
11354 { "ACS", "gsm_a.rr.acs",
11355 FT_BOOLEAN, 8, NULL, 0x80,
11356 "Additional Reselect Param Indicator (ACS)", HFILL }
11358 { &hf_gsm_a_rr_neci,
11359 { "NECI", "gsm_a.rr.neci",
11360 FT_UINT8, BASE_DEC, NULL, 0x40,
11361 "New Establishment Cause Indicator (NECI)", HFILL }
11363 { &hf_gsm_a_rr_rxlev_access_min,
11364 { "RXLEV-ACCESS-MIN", "gsm_a.rr.rxlev_access_min",
11365 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gsm_a_rr_rxlev_vals_ext, 0x3f,
11366 NULL, HFILL }
11368 { &hf_gsm_a_rr_mscr,
11369 { "MSCR", "gsm_a.rr.mscr",
11370 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_mscr_vals), 0x80,
11371 "MSC Release Indicator (MSCR)", HFILL }
11373 { &hf_gsm_a_rr_att,
11374 { "ATT", "gsm_a.rr.att",
11375 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_att_vals), 0x40,
11376 "Attach Indicator (ATT)", HFILL }
11378 { &hf_gsm_a_rr_bs_ag_blks_res,
11379 { "BS_AG_BLKS_RES", "gsm_a.rr.bs_ag_blks_res",
11380 FT_UINT8, BASE_DEC, NULL, 0x38,
11381 "Access Grant Reserved Blocks (BS_AG_BLKS_RES)", HFILL }
11383 { &hf_gsm_a_rr_ccch_conf,
11384 { "CCCH-CONF", "gsm_a.rr.ccch_conf",
11385 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_ccch_conf_vals), 0x07,
11386 NULL, HFILL }
11388 { &hf_gsm_a_rr_cbq3,
11389 { "CBQ3", "gsm_a.rr.cbq3",
11390 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_cbq3_vals), 0x00,
11391 "Cell Bar Qualify 3", HFILL }
11393 { &hf_gsm_a_rr_bs_pa_mfrms,
11394 { "BS-PA-MFRMS", "gsm_a.rr.bs_pa_mfrms",
11395 FT_UINT8, BASE_DEC, NULL, 0x07,
11396 NULL, HFILL }
11398 { &hf_gsm_a_rr_t3212,
11399 { "T3212", "gsm_a.rr.t3212",
11400 FT_UINT8, BASE_DEC, NULL, 0x00,
11401 "Periodic Update period (T3212) (deci-hours)", HFILL }
11403 { &hf_gsm_a_rr_gsm_band,
11404 { "GSM Band", "gsm_a.rr.gsm_band",
11405 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_band_vals), 0x00,
11406 NULL, HFILL }
11408 { &hf_gsm_a_rr_arfcn_first,
11409 { "ARFCN First", "gsm_a.rr.arfcn_first",
11410 FT_UINT16, BASE_DEC, NULL, 0x00,
11411 NULL, HFILL }
11413 { &hf_gsm_a_rr_band_offset,
11414 { "Band Offset", "gsm_a.rr.band_offset",
11415 FT_UINT16, BASE_DEC, NULL, 0x00,
11416 NULL, HFILL }
11418 { &hf_gsm_a_rr_arfcn_range,
11419 { "ARFCN Range", "gsm_a.rr.arfcn_range",
11420 FT_UINT8, BASE_DEC, NULL, 0x00,
11421 NULL, HFILL }
11423 { &hf_gsm_a_rr_lowest_arfcn,
11424 { "Lowest ARFCN", "gsm_a.rr.lowest_arfcn",
11425 FT_UINT8, BASE_DEC, NULL, 0x7f,
11426 NULL, HFILL }
11428 { &hf_gsm_a_rr_inc_skip_arfcn,
11429 { "Increment skip ARFCN", "gsm_a.rr.inc_skip_arfcn",
11430 FT_UINT8, BASE_DEC, NULL, 0x00,
11431 NULL, HFILL }
11433 { &hf_gsm_a_rr_gprs_resumption_ack,
11434 { "Ack", "gsm_a.rr.gprs_resumption_ack",
11435 FT_BOOLEAN, 8, TFS(&gsm_a_rr_gprs_resumption_ack_value), 0x01,
11436 "GPRS Resumption Ack bit", HFILL }
11438 { &hf_gsm_a_rr_ext_ind,
11439 { "EXT-IND", "gsm_a.rr.ext_ind",
11440 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_ext_ind_vals), 0x20,
11441 "Extension Indication (EXT-IND)", HFILL }
11443 { &hf_gsm_a_rr_ba_ind,
11444 { "BA-IND", "gsm_a.rr.ba_ind",
11445 FT_UINT8, BASE_DEC, NULL, 0x00,
11446 "BCCH Allocation Indication (BA-IND)", HFILL }
11448 { &hf_gsm_a_rr_multiband_reporting,
11449 { "Multiband Reporting", "gsm_a.rr.multiband_reporting",
11450 FT_UINT8, BASE_DEC, NULL, 0x00,
11451 "Number of cells to be reported in each band if Multiband Reporting", HFILL }
11453 { &hf_gsm_a_rr_ncc_permitted,
11454 { "NCC Permitted", "gsm_a.rr.ncc_permitted",
11455 FT_UINT8, BASE_HEX, NULL, 0xff,
11456 NULL, HFILL }
11458 { &hf_gsm_a_rr_max_retrans,
11459 { "Max retrans", "gsm_a.rr.max_retrans",
11460 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_max_retrans_vals), 0xc0,
11461 "Maximum number of retransmissions", HFILL }
11463 { &hf_gsm_a_rr_tx_integer,
11464 { "Tx-integer", "gsm_a.rr.tx_integer",
11465 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_tx_integer_vals), 0x3c,
11466 "Number of Slots to spread Transmission (Tx-integer)", HFILL }
11468 { &hf_gsm_a_rr_cell_barr_access,
11469 { "CELL_BARR_ACCESS", "gsm_a.rr.cell_barr_access",
11470 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_cell_barr_access_vals), 0x02,
11471 "Cell Barred for Access (CELL_BARR_ACCESS)", HFILL }
11473 { &hf_gsm_a_rr_re,
11474 { "RE", "gsm_a.rr.re",
11475 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_re_vals), 0x01,
11476 "Call re-establishment allowed (RE)", HFILL }
11478 { &hf_gsm_a_rr_acc,
11479 { "ACC", "gsm_a.rr.acc",
11480 FT_UINT16, BASE_HEX, NULL, 0xffff,
11481 "Access Control Class N barred (ACC)", HFILL }
11483 { &hf_gsm_a_rr_nch_position,
11484 { "NCH Position", "gsm_a.rr.nch_position",
11485 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nch_position_vals), 0x00,
11486 NULL, HFILL }
11488 { &hf_gsm_a_rr_si2ter_mp_change_mark,
11489 { "SI2ter Measurement Parameter Change Mark", "gsm_a.rr.si2ter_mp_change_mark",
11490 FT_UINT8, BASE_DEC, NULL, 0x00,
11491 NULL, HFILL }
11493 { &hf_gsm_a_rr_si2ter_3g_change_mark,
11494 { "SI2ter 3G Change Mark", "gsm_a.rr.si2ter_3g_change_mark",
11495 FT_UINT8, BASE_DEC, NULL, 0x00,
11496 NULL, HFILL }
11498 { &hf_gsm_a_rr_si2ter_index,
11499 { "SI2ter Index", "gsm_a.rr.si2ter_index",
11500 FT_UINT8, BASE_DEC, NULL, 0x00,
11501 NULL, HFILL }
11503 { &hf_gsm_a_rr_si2ter_count,
11504 { "SI2ter Count", "gsm_a.rr.si2ter_count",
11505 FT_UINT8, BASE_DEC, NULL, 0x00,
11506 NULL, HFILL }
11508 { &hf_gsm_a_rr_fdd_uarfcn,
11509 { "FDD UARFCN", "gsm_a.rr.fdd_uarfcn",
11510 FT_UINT16, BASE_DEC, NULL, 0x0000,
11511 NULL, HFILL }
11513 { &hf_gsm_a_rr_bandwidth_fdd,
11514 { "Bandwidth FDD", "gsm_a.rr.bandwidth_fdd",
11515 FT_UINT8, BASE_DEC, NULL, 0x00,
11516 NULL, HFILL }
11518 { &hf_gsm_a_rr_tdd_uarfcn,
11519 { "TDD UARFCN", "gsm_a.rr.tdd_uarfcn",
11520 FT_UINT16, BASE_DEC, NULL, 0x0000,
11521 NULL, HFILL }
11523 { &hf_gsm_a_rr_bandwidth_tdd,
11524 { "Bandwidth TDD", "gsm_a.rr.bandwidth_tdd",
11525 FT_UINT8, BASE_DEC, NULL, 0x00,
11526 NULL, HFILL }
11528 { &hf_gsm_a_rr_arfcn,
11529 { "ARFCN", "gsm_a.rr.arfcn",
11530 FT_UINT16, BASE_DEC, NULL, 0x0000,
11531 "Absolute Radio Frequency Channel Number (ARFCN)", HFILL }
11533 { &hf_gsm_a_rr_bsic,
11534 { "BSIC", "gsm_a.rr.bsic",
11535 FT_UINT8, BASE_DEC, NULL, 0x00,
11536 "Base Station Identify Code (BSIC)", HFILL }
11538 { &hf_gsm_a_rr_qsearch_i,
11539 { "Qsearch I", "gsm_a.rr.qsearch_i",
11540 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_x_vals), 0x00,
11541 "Search for 3G cells if signal level is below (0 7) or above (8 15) threshold (Qsearch I)", HFILL }
11543 { &hf_gsm_a_rr_fdd_qoffset,
11544 { "FDD Qoffset", "gsm_a.rr.fdd_qoffset",
11545 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xdd_qoffset_vals), 0x00,
11546 "Offset to RLA_C for cell re selection to FDD access technology (FDD Qoffset)", HFILL }
11548 { &hf_gsm_a_rr_fdd_qmin,
11549 { "FDD Qmin", "gsm_a.rr.fdd_qmin",
11550 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_fdd_qmin_vals), 0x00,
11551 "Minimum threshold for Ec/No for UTRAN FDD cell re-selection (FDD Qmin)", HFILL }
11553 { &hf_gsm_a_rr_tdd_qoffset,
11554 { "TDD Qoffset", "gsm_a.rr.tdd_qoffset",
11555 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xdd_qoffset_vals), 0x00,
11556 "Offset to RLA_C for cell re selection to TDD access technology (TDD Qoffset)", HFILL }
11558 { &hf_gsm_a_rr_fdd_qmin_offset,
11559 { "FDD Qmin Offset", "gsm_a.rr.fdd_qmin_offset",
11560 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_fdd_qmin_offset_vals), 0x00,
11561 "Offset to FDD Qmin value (FDD Qmin Offset)", HFILL }
11563 { &hf_gsm_a_rr_fdd_rscpmin,
11564 { "FDD RSCPmin", "gsm_a.rr.fdd_rscpmin",
11565 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_fdd_rscpmin_vals), 0x00,
11566 "Minimum threshold of RSCP for UTRAN FDD cell re-selection (FDD RSCPmin)", HFILL }
11568 { &hf_gsm_a_rr_3g_ba_ind,
11569 { "3G BA-IND", "gsm_a.rr.3g_ba_ind",
11570 FT_UINT8, BASE_DEC, NULL, 0x00,
11571 "3G BCCH Allocation Indication (3G BA-IND)", HFILL }
11573 { &hf_gsm_a_rr_mp_change_mark,
11574 { "Measurement Parameter Change Mark", "gsm_a.rr.mp_change_mark",
11575 FT_UINT8, BASE_DEC, NULL, 0x00,
11576 NULL, HFILL }
11578 { &hf_gsm_a_rr_si2quater_index,
11579 { "SI2quater Index", "gsm_a.rr.si2quater_index",
11580 FT_UINT8, BASE_DEC, NULL, 0x00,
11581 NULL, HFILL }
11583 { &hf_gsm_a_rr_si2quater_count,
11584 { "SI2quater Count", "gsm_a.rr.si2quater_count",
11585 FT_UINT8, BASE_DEC, NULL, 0x00,
11586 NULL, HFILL }
11588 { &hf_gsm_a_rr_gsm_report_type,
11589 { "Report Type", "gsm_a.rr.gsm_report_type",
11590 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_gsm_report_type_value), 0x0,
11591 "Report type the MS shall use (Report Type)", HFILL }
11593 { &hf_gsm_a_rr_serving_band_reporting,
11594 { "Serving Band Reporting", "gsm_a.rr.serving_band_reporting",
11595 FT_UINT8, BASE_DEC, NULL, 0x00,
11596 "Number of cells reported from the GSM serving frequency band (Serving Band Reporting)", HFILL }
11598 { &hf_gsm_a_rr_frequency_scrolling,
11599 { "Frequency Scrolling", "gsm_a.rr.frequency_scrolling",
11600 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_frequency_scrolling_value), 0x0,
11601 NULL, HFILL }
11603 { &hf_gsm_a_rr_rep_priority,
11604 { "Rep Priority", "gsm_a.rr.rep_priority",
11605 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_rep_priority_value), 0x0,
11606 "Reporting Priority", HFILL }
11608 { &hf_gsm_a_rr_report_type,
11609 { "Report Type", "gsm_a.rr.report_type",
11610 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_report_type_value), 0x0,
11611 NULL, HFILL }
11613 { &hf_gsm_a_rr_reporting_rate,
11614 { "Reporting Rate", "gsm_a.rr.reporting_rate",
11615 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_reporting_rate_value), 0x0,
11616 NULL, HFILL }
11618 { &hf_gsm_a_rr_invalid_bsic_reporting,
11619 { "Invalid BSIC Reporting", "gsm_a.rr.invalid_bsic_reporting",
11620 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_invalid_bsic_reporting_value), 0x0,
11621 NULL, HFILL }
11623 { &hf_gsm_a_rr_scale_ord,
11624 { "Scale Ord", "gsm_a.rr.scale_ord",
11625 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_scale_ord_vals), 0x00,
11626 "Offset used for the reported RXLEV values (Scale Ord)", HFILL }
11628 { &hf_gsm_a_rr_900_reporting_offset,
11629 { "900 Reporting Offset", "gsm_a.rr.900_reporting_offset",
11630 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11631 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 900 (900 Reporting Offset)", HFILL }
11633 { &hf_gsm_a_rr_900_reporting_threshold,
11634 { "900 Reporting Threshold", "gsm_a.rr.900_reporting_threshold",
11635 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11636 "Apply priority reporting if the reported value is above threshold for GSM frequency band 900 (900 Reporting Threshold)", HFILL }
11638 { &hf_gsm_a_rr_1800_reporting_offset,
11639 { "1800 Reporting Offset", "gsm_a.rr.1800_reporting_offset",
11640 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11641 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 1800 (1800 Reporting Offset)", HFILL }
11643 { &hf_gsm_a_rr_1800_reporting_threshold,
11644 { "1800 Reporting Threshold", "gsm_a.rr.1800_reporting_threshold",
11645 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11646 "Apply priority reporting if the reported value is above threshold for GSM frequency band 1800 (1800 Reporting Threshold)", HFILL }
11648 { &hf_gsm_a_rr_400_reporting_offset,
11649 { "400 Reporting Offset", "gsm_a.rr.400_reporting_offset",
11650 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11651 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 400 (400 Reporting Offset)", HFILL }
11653 { &hf_gsm_a_rr_400_reporting_threshold,
11654 { "400 Reporting Threshold", "gsm_a.rr.400_reporting_threshold",
11655 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11656 "Apply priority reporting if the reported value is above threshold for GSM frequency band 400 (400 Reporting Threshold)", HFILL }
11658 { &hf_gsm_a_rr_1900_reporting_offset,
11659 { "1900 Reporting Offset", "gsm_a.rr.1900_reporting_offset",
11660 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11661 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 1900 (1900 Reporting Offset)", HFILL }
11663 { &hf_gsm_a_rr_1900_reporting_threshold,
11664 { "1900 Reporting Threshold", "gsm_a.rr.1900_reporting_threshold",
11665 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11666 "Apply priority reporting if the reported value is above threshold for GSM frequency band 1900 (1900 Reporting Threshold)", HFILL }
11668 { &hf_gsm_a_rr_850_reporting_offset,
11669 { "850 Reporting Offset", "gsm_a.rr.850_reporting_offset",
11670 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11671 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 850 (850 Reporting Offset)", HFILL }
11673 { &hf_gsm_a_rr_850_reporting_threshold,
11674 { "850 Reporting Threshold", "gsm_a.rr.900_reporting_threshold",
11675 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11676 "Apply priority reporting if the reported value is above threshold for GSM frequency band 850 (850 Reporting Threshold)", HFILL }
11678 { &hf_gsm_a_rr_network_control_order,
11679 { "Network Control Order", "gsm_a.rr.network_control_order",
11680 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_network_control_order_vals), 0x00,
11681 NULL, HFILL }
11683 { &hf_gsm_a_rr_nc_non_drx_period,
11684 { "NC Non DRX Period", "gsm_a.rr.nc_non_drx_period",
11685 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nc_non_drx_period_vals), 0x00,
11686 NULL, HFILL }
11688 { &hf_gsm_a_rr_nc_reporting_period_i,
11689 { "NC Reporting Period I", "gsm_a.rr.nc_reporting_period_i",
11690 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nc_reporting_period_x_vals), 0x00,
11691 "NC Reporting Period in Packet Idle mode (NC Reporting Period I)", HFILL }
11693 { &hf_gsm_a_rr_nc_reporting_period_t,
11694 { "NC Reporting Period T", "gsm_a.rr.nc_reporting_period_t",
11695 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nc_reporting_period_x_vals), 0x00,
11696 "NC Reporting Period in Packet Transfer mode (NC Reporting Period T)", HFILL }
11698 { &hf_gsm_a_rr_index_start_3g,
11699 { "Index Start 3G", "gsm_a.rr.index_start_3g",
11700 FT_UINT8, BASE_DEC, NULL, 0x00,
11701 NULL, HFILL }
11703 { &hf_gsm_a_rr_absolute_index_start_emr,
11704 { "Absolute Index Start EMR", "gsm_a.rr.absolute_index_start_emr",
11705 FT_UINT8, BASE_DEC, NULL, 0x00,
11706 NULL, HFILL }
11708 { &hf_gsm_a_rr_qsearch_c_initial,
11709 { "QSearch C Initial", "gsm_a.rr.qsearch_c_initial",
11710 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_qsearch_c_initial_value), 0x0,
11711 "Qsearch value to be used in connected mode before Qsearch C is received (QSearch C Initial)", HFILL }
11713 { &hf_gsm_a_rr_fdd_rep_quant,
11714 { "FDD Rep Quant", "gsm_a.rr.fdd_rep_quant",
11715 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_fdd_rep_quant_value), 0x0,
11716 "FDD Reporting Quantity (FDD Rep Quant)", HFILL }
11718 { &hf_gsm_a_rr_fdd_multirat_reporting,
11719 { "FDD Multirat Reporting", "gsm_a.rr.fdd_multirat_reporting",
11720 FT_UINT8, BASE_DEC, NULL, 0x00,
11721 "Number of cells from the FDD access technology that shall be included in the list of strongest cells or in the measurement report (FDD Multirat Reporting)", HFILL }
11723 { &hf_gsm_a_rr_tdd_multirat_reporting,
11724 { "TDD Multirat Reporting", "gsm_a.rr.tdd_multirat_reporting",
11725 FT_UINT8, BASE_DEC, NULL, 0x00,
11726 "Number of cells from the TDD access technology that shall be included in the list of strongest cells or in the measurement report (TDD Multirat Reporting)", HFILL }
11728 { &hf_gsm_a_rr_qsearch_p,
11729 { "Qsearch P", "gsm_a.rr.qsearch_p",
11730 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_x_vals), 0x00,
11731 "Search for 3G cells if signal level below threshold (Qsearch P)", HFILL }
11733 { &hf_gsm_a_rr_3g_search_prio,
11734 { "3G Search Prio (ignored in Rel-8)", "gsm_a.rr.3g_search_prio",
11735 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_3g_search_prio_value), 0x0,
11736 NULL, HFILL }
11738 { &hf_gsm_a_rr_fdd_reporting_offset,
11739 { "FDD Reporting Offset", "gsm_a.rr.fdd_reporting_offset",
11740 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11741 "Offset to the reported value when prioritising the cells for reporting for FDD access technology (FDD Reporting Offset)", HFILL }
11743 { &hf_gsm_a_rr_fdd_reporting_threshold_rscp,
11744 { "FDD Reporting Threshold RSCP", "gsm_a.rr.fdd_reporting_threshold_rscp",
11745 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_wcdma_rscp_reporting_threshold_vals), 0x00,
11746 "Apply priority reporting if the reported value is above threshold for FDD access technology (FDD Reporting Threshold)", HFILL }
11748 { &hf_gsm_a_rr_fdd_reporting_threshold_ecn0,
11749 { "FDD Reporting Threshold EcN0", "gsm_a.rr.fdd_reporting_threshold_ecn0",
11750 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_wcdma_ecn0_reporting_threshold_vals), 0x00,
11751 "Apply priority reporting if the reported value is above threshold for FDD access technology (FDD Reporting Threshold)", HFILL }
11753 { &hf_gsm_a_rr_tdd_reporting_offset,
11754 { "TDD Reporting Offset", "gsm_a.rr.tdd_reporting_offset",
11755 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11756 "Offset to the reported value when prioritising the cells for reporting for TDD access technology (TDD Reporting Offset)", HFILL }
11758 { &hf_gsm_a_rr_tdd_reporting_threshold_rscp,
11759 { "TDD Reporting Threshold RSCP", "gsm_a.rr.tdd_reporting_threshold_rscp",
11760 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_wcdma_rscp_reporting_threshold_vals), 0x00,
11761 "Apply priority reporting if the reported value is above threshold for TDD access technology (TDD Reporting Threshold)", HFILL }
11763 { &hf_gsm_a_rr_tdd_reporting_threshold_ecn0,
11764 { "TDD Reporting Threshold EcN0", "gsm_a.rr.tdd_reporting_threshold_ecn0",
11765 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_wcdma_ecn0_reporting_threshold_vals), 0x00,
11766 "Apply priority reporting if the reported value is above threshold for TDD access technology (TDD Reporting Threshold)", HFILL }
11768 { &hf_gsm_a_rr_fdd_reporting_threshold_2,
11769 { "FDD Reporting Threshold 2", "gsm_a.rr.fdd_reporting_threshold_2",
11770 FT_UINT8, BASE_DEC, NULL, 0x00,
11771 "Reporting threshold for the CPICH parameter (Ec/No or RSCP) that is not reported according to FDD_REP_QUANT (FDD Reporting Threshold 2)", HFILL }
11773 { &hf_gsm_a_rr_3g_ccn_active,
11774 { "3G CCN Active", "gsm_a.rr.3g_ccn_active",
11775 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_3g_ccn_active_value), 0x0,
11776 NULL, HFILL }
11778 { &hf_gsm_a_rr_700_reporting_offset,
11779 { "700 Reporting Offset", "gsm_a.rr.700_reporting_offset",
11780 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11781 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 700 (700 Reporting Offset)", HFILL }
11783 { &hf_gsm_a_rr_700_reporting_threshold,
11784 { "700 Reporting Threshold", "gsm_a.rr.700_reporting_threshold",
11785 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11786 "Apply priority reporting if the reported value is above threshold for GSM frequency band 700 (700 Reporting Threshold)", HFILL }
11788 { &hf_gsm_a_rr_810_reporting_offset,
11789 { "810 Reporting Offset", "gsm_a.rr.810_reporting_offset",
11790 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
11791 "Offset to the reported value when prioritising the cells for reporting for GSM frequency band 810 (810 Reporting Offset)", HFILL }
11793 { &hf_gsm_a_rr_810_reporting_threshold,
11794 { "810 Reporting Threshold", "gsm_a.rr.810_reporting_threshold",
11795 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gsm_reporting_threshold_vals), 0x00,
11796 "Apply priority reporting if the reported value is above threshold for GSM frequency band 810 (810 Reporting Threshold)", HFILL }
11798 { &hf_gsm_a_rr_cbq,
11799 { "CBQ", "gsm_a.rr.cbq",
11800 FT_UINT8, BASE_DEC, NULL, 0x00,
11801 "Cell Bar Qualify", HFILL }
11803 { &hf_gsm_a_rr_cell_reselect_offset,
11804 { "Cell Reselect Offset", "gsm_a.rr.cell_reselect_offset",
11805 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_cell_reselect_offset_vals), 0x00,
11806 "Offset to the C2 reselection criterion (Cell Reselect Offset)", HFILL }
11808 { &hf_gsm_a_rr_temporary_offset,
11809 { "Temporary Offset", "gsm_a.rr.temporary_offset",
11810 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_temporary_offset_vals), 0x0,
11811 "Negative offset to C2 for the duration of Penalty Time (Temporary Offset)", HFILL }
11813 { &hf_gsm_a_rr_penalty_time,
11814 { "Penalty Time", "gsm_a.rr.penalty_time",
11815 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_penalty_time_vals), 0x0,
11816 "Duration for which the temporary offset is applied (Penalty Time)", HFILL }
11818 { &hf_gsm_a_rr_gprs_ra_colour,
11819 { "GPRS RA Colour", "gsm_a.rr.gprs_ra_colour",
11820 FT_UINT8, BASE_DEC, NULL, 0x0,
11821 NULL, HFILL }
11823 { &hf_gsm_a_rr_si13_position,
11824 { "SI13 Position", "gsm_a.rr.si13_position",
11825 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si13_position_vals), 0x0,
11826 NULL, HFILL }
11828 { &hf_gsm_a_rr_power_offset,
11829 { "Power Offset", "gsm_a.rr.power_offset",
11830 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_power_offset_vals), 0x0,
11831 "Power offset used in conjunction with the MS TXPWR MAX CCH parameter by the class 3 DCS 1800 MS (Power Offset)", HFILL }
11833 { &hf_gsm_a_rr_si2quater_position,
11834 { "SI2quater Position", "gsm_a.rr.si2quater_position",
11835 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_si2quater_position_value), 0x0,
11836 NULL, HFILL }
11838 { &hf_gsm_a_rr_si13alt_position,
11839 { "SI13alt Position", "gsm_a.rr.si13alt_position",
11840 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_si13alt_position_value), 0x0,
11841 NULL, HFILL }
11843 { &hf_gsm_a_rr_prio_thr,
11844 { "Prio Thr", "gsm_a.rr.prio_thr",
11845 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_prio_thr_vals), 0x0,
11846 "Prio signal strength threshold is related to RXLEV ACCESS_MIN (Prio Thr)", HFILL }
11848 { &hf_gsm_a_rr_lsa_offset,
11849 { "LSA Offset", "gsm_a.rr.lsa_offset",
11850 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lsa_offset_vals), 0x0,
11851 "Offset to be used for LSA cell re selection between cells with the same LSA priorities (LSA Offset)", HFILL }
11853 { &hf_gsm_a_rr_cell_id,
11854 { "Cell Identity", "gsm_a.rr.cell_id",
11855 FT_UINT16, BASE_HEX_DEC, 0, 0x0,
11856 NULL, HFILL }
11858 { &hf_gsm_a_rr_paging_channel_restructuring,
11859 { "Paging Channel Restructuring", "gsm_a.rr.paging_channel_restructuring",
11860 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_paging_channel_restructuring_value), 0x0,
11861 NULL, HFILL }
11863 { &hf_gsm_a_rr_nln_sacch,
11864 { "NLN (SACCH)", "gsm_a.rr.nln_sacch",
11865 FT_UINT8, BASE_DEC, NULL, 0x0,
11866 NULL, HFILL }
11868 { &hf_gsm_a_rr_nln_status_sacch,
11869 { "NLN Status (SACCH)", "gsm_a.rr.nln_status_sacch",
11870 FT_UINT8, BASE_DEC, NULL, 0x0,
11871 NULL, HFILL }
11873 { &hf_gsm_a_rr_nln_pch,
11874 { "NLN (PCH)", "gsm_a.rr.nln_pch",
11875 FT_UINT8, BASE_DEC, NULL, 0x0,
11876 NULL, HFILL }
11878 { &hf_gsm_a_rr_nln_status_pch,
11879 { "NLN Status (PCH)", "gsm_a.rr.nln_status_pch",
11880 FT_UINT8, BASE_DEC, NULL, 0x0,
11881 NULL, HFILL }
11883 { &hf_gsm_a_rr_vbs_vgcs_inband_notifications,
11884 { "Inband Notifications", "gsm_a.rr.vbs_vgcs_inband_notifications",
11885 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_vbs_vgcs_inband_notifications_value), 0x0,
11886 NULL, HFILL }
11888 { &hf_gsm_a_rr_vbs_vgcs_inband_pagings,
11889 { "Inband Pagings", "gsm_a.rr.vbs_vgcs_inband_pagings",
11890 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_vbs_vgcs_inband_pagings_value), 0x0,
11891 NULL, HFILL }
11893 { &hf_gsm_a_rr_rac,
11894 { "RAC", "gsm_a.rr.rac",
11895 FT_UINT8, BASE_DEC, NULL, 0x0,
11896 "Routeing Area Code", HFILL }
11898 { &hf_gsm_a_rr_max_lapdm,
11899 { "Max LAPDm", "gsm_a.rr.max_lapdm",
11900 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_max_lapdm_vals), 0x0,
11901 "Maximum number of LAPDm frames on which a layer 3 can be segmented into and be sent on the main DCCH (Max LAPDm)", HFILL }
11903 { &hf_gsm_a_rr_gprs_ms_txpwr_max_ccch,
11904 { "GPRS MS TxPwr Max CCH", "gsm_a.rr.gprs_ms_txpwr_max_cch",
11905 FT_UINT8, BASE_DEC, NULL, 0x00,
11906 NULL, HFILL }
11908 { &hf_gsm_a_rr_dedicated_mode_mbms_notification_support,
11909 { "Dedicated Mode MBMS Notification Support", "gsm_a.rr.dedicated_mode_mbms_notification_support",
11910 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dedicated_mode_mbms_notification_support_value), 0x0,
11911 NULL, HFILL }
11913 { &hf_gsm_a_rr_mnci_support,
11914 { "MNCI Support", "gsm_a.rr.mnci_support",
11915 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_mnci_support_value), 0x0,
11916 "MBMS Neighbouring Cell Information Support (MNCI Support)", HFILL }
11918 { &hf_gsm_a_rr_amr_config,
11919 { "AMR Configuration", "gsm_a.rr.amr_config",
11920 FT_UINT8, BASE_DEC, NULL, 0x0,
11921 NULL, HFILL }
11923 { &hf_gsm_a_rr_bcch_change_mark,
11924 { "BCCH Change Mark", "gsm_a.rr.bcch_change_mark",
11925 FT_UINT8, BASE_DEC, NULL, 0x0,
11926 NULL, HFILL }
11928 { &hf_gsm_a_rr_si_change_field,
11929 { "SI Change Field", "gsm_a.rr.si_change_field",
11930 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si_change_field_vals), 0x0,
11931 NULL, HFILL }
11933 { &hf_gsm_a_rr_si13_change_mark,
11934 { "SI13 Change Mark", "gsm_a.rr.si13_change_mark",
11935 FT_UINT8, BASE_DEC, NULL, 0x0,
11936 NULL, HFILL }
11938 { &hf_gsm_a_rr_hsn,
11939 { "HSN", "gsm_a.rr.hsn",
11940 FT_UINT8, BASE_DEC, NULL, 0x0,
11941 "Hopping Sequence Number (HSN)", HFILL }
11943 { &hf_gsm_a_rr_rfl_number,
11944 { "RFL Number", "gsm_a.rr.rfl_number",
11945 FT_UINT8, BASE_DEC, NULL, 0x0,
11946 "Radio Frequency List Number (RFL Number)", HFILL }
11948 { &hf_gsm_a_rr_arfcn_index,
11949 { "ARFCN Index", "gsm_a.rr.arfcn_index",
11950 FT_UINT8, BASE_DEC, NULL, 0x0,
11951 NULL, HFILL }
11953 { &hf_gsm_a_rr_ma_length,
11954 { "MA Length", "gsm_a.rr.ma_length",
11955 FT_UINT8, BASE_DEC, NULL, 0x0,
11956 "Mobile Allocation Length (MA Length)", HFILL }
11958 { &hf_gsm_a_rr_psi1_repeat_period,
11959 { "PSI1 Repeat Period", "gsm_a.rr.psi1_repeat_period",
11960 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_psi1_repeat_period_vals), 0x0,
11961 NULL, HFILL }
11963 { &hf_gsm_a_rr_pbcch_pb,
11964 { "Pb", "gsm_a.rr.pbcch_pb",
11965 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pbcch_pb_vals), 0x0,
11966 "Power reduction on PBCCH/PCCCH (Pb)", HFILL }
11968 { &hf_gsm_a_rr_pbcch_tsc,
11969 { "TSC", "gsm_a.rr.pbcch_tsc",
11970 FT_UINT8, BASE_DEC, NULL, 0x0,
11971 "Training Sequence Code for PBCCH (TSC)", HFILL }
11973 { &hf_gsm_a_rr_pbcch_tn,
11974 { "TN", "gsm_a.rr.pbcch_tn",
11975 FT_UINT8, BASE_DEC, NULL, 0x0,
11976 "Timeslot Number for PCCH (TN)", HFILL }
11978 { &hf_gsm_a_rr_spgc_ccch_sup,
11979 { "SPGC CCCH Sup", "gsm_a.rr.spgc_ccch_sup",
11980 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_spgc_ccch_sup_value), 0x0,
11981 "Split PG Cycle Code on CCCH Support (SPGC CCCH Sup)", HFILL }
11983 { &hf_gsm_a_rr_priority_access_thr,
11984 { "Priority Access Thr", "gsm_a.rr.priority_access_thr",
11985 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_priority_access_thr_vals), 0x0,
11986 "Priority Access Threshold for packet access (Priority Access Thr)", HFILL }
11988 { &hf_gsm_a_rr_nmo,
11989 { "NMO", "gsm_a.rr.nmo",
11990 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nmo_vals), 0x0,
11991 "Network mode of Operation (NMO)", HFILL }
11993 { &hf_gsm_a_rr_t3168,
11994 { "T3168", "gsm_a.rr.t3168",
11995 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t3168_vals), 0x0,
11996 NULL, HFILL }
11998 { &hf_gsm_a_rr_t3192,
11999 { "T3192", "gsm_a.rr.t3192",
12000 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t3192_vals), 0x0,
12001 NULL, HFILL }
12003 { &hf_gsm_a_rr_drx_timer_max,
12004 { "DRX Timer Max", "gsm_a.rr.drx_timer_max",
12005 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_drx_timer_max_vals), 0x0,
12006 "Discontinuous Reception Timer Max (DRX Timer Max)", HFILL }
12008 { &hf_gsm_a_rr_access_burst_type,
12009 { "Access Burst Type", "gsm_a.rr.access_burst_type",
12010 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_access_burst_type_value), 0x0,
12011 "Format used in the PACKET CHANNEL REQUEST message, the PS HANDOVER ACCESS message, the PTCCH uplink block and in the PACKET CONTROL ACKNOWLEDGMENT message (Access Burst Type)", HFILL }
12013 { &hf_gsm_a_rr_control_ack_type,
12014 { "Control Ack Type", "gsm_a.rr.control_ack_type",
12015 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_control_ack_type_value), 0x0,
12016 "Default format of the PACKET CONTROL ACKNOWLEDGMENT message (Control Ack Type)", HFILL }
12018 { &hf_gsm_a_rr_bs_cv_max,
12019 { "BS CV Max", "gsm_a.rr.bs_cv_max",
12020 FT_UINT8, BASE_DEC, NULL, 0x0,
12021 "Base Station Countdown Value Maximum (BS CV Max)", HFILL }
12023 { &hf_gsm_a_rr_pan_dec,
12024 { "PAN Dec", "gsm_a.rr.pan_dec",
12025 FT_UINT8, BASE_DEC, NULL, 0x0,
12026 NULL, HFILL }
12028 { &hf_gsm_a_rr_pan_inc,
12029 { "PAN Inc", "gsm_a.rr.pan_inc",
12030 FT_UINT8, BASE_DEC, NULL, 0x0,
12031 NULL, HFILL }
12033 { &hf_gsm_a_rr_pan_max,
12034 { "PAN Max", "gsm_a.rr.pan_max",
12035 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pan_max_vals), 0x0,
12036 NULL, HFILL }
12038 { &hf_gsm_a_rr_egprs_packet_channel_request,
12039 { "EGPRS Packet Channel Request", "gsm_a.rr.egprs_packet_channel_request",
12040 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_egprs_packet_channel_request_value), 0x0,
12041 NULL, HFILL }
12043 { &hf_gsm_a_rr_bep_period,
12044 { "BEP Period", "gsm_a.rr.bep_period",
12045 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_bep_period_vals), 0x0,
12046 NULL, HFILL }
12048 { &hf_gsm_a_rr_pfc_feature_mode,
12049 { "PFC Feature Mode", "gsm_a.rr.pfc_feature_mode",
12050 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_pfc_feature_mode_value), 0x0,
12051 "Packet Flow Context Feature Mode (PFC Feature Mode)", HFILL }
12053 { &hf_gsm_a_rr_dtm_support,
12054 { "DTM Support", "gsm_a.rr.dtm_support",
12055 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dtm_support_value), 0x0,
12056 "Dual Transfer Mode Support (DTM Support)", HFILL }
12058 { &hf_gsm_a_rr_bss_paging_coordination,
12059 { "BSS Paging Coordination", "gsm_a.rr.bss_paging_coordination",
12060 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_bss_paging_coordination_value), 0x0,
12061 NULL, HFILL }
12063 { &hf_gsm_a_rr_ccn_active,
12064 { "CCN Active", "gsm_a.rr.ccn_active",
12065 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_ccn_active_value), 0x0,
12066 NULL, HFILL }
12068 { &hf_gsm_a_rr_nw_ext_utbf,
12069 { "NW Ext UTBF", "gsm_a.rr.nw_ext_utbf",
12070 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_nw_ext_utbf_value), 0x0,
12071 "Network Extended Uplink TBF (NW Ext UTBF)", HFILL }
12073 { &hf_gsm_a_rr_multiple_tbf_capability,
12074 { "Multiple TBF Capability", "gsm_a.rr.multiple_tbf_capability",
12075 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_multiple_tbf_capability_value), 0x0,
12076 NULL, HFILL }
12078 { &hf_gsm_a_rr_ext_utbf_no_data,
12079 { "Ext UTBF No Data", "gsm_a.rr.ext_utbf_no_data",
12080 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_ext_utbf_no_data_value), 0x0,
12081 NULL, HFILL }
12083 { &hf_gsm_a_rr_dtm_enhancements_capability,
12084 { "DTM Enhancements Capability", "gsm_a.rr.dtm_enhancements_capability",
12085 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dtm_enhancements_capability_value), 0x0,
12086 NULL, HFILL }
12088 { &hf_gsm_a_rr_reduced_latency_access,
12089 { "Reduced Latency Access", "gsm_a.rr.reduced_latency_access",
12090 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_reduced_latency_access_value), 0x0,
12091 NULL, HFILL }
12093 { &hf_gsm_a_rr_alpha,
12094 { "Alpha", "gsm_a.rr.alpha",
12095 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_alpha_vals), 0x0,
12096 "Alpha parameter for GPR MS output power control (Alpha)", HFILL }
12098 { &hf_gsm_a_rr_t_avg_w,
12099 { "T Avg W", "gsm_a.rr.t_avg_w",
12100 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t_avg_x_vals), 0x0,
12101 "Signal strength filter period for power control in packet idle mode", HFILL }
12103 { &hf_gsm_a_rr_t_avg_t,
12104 { "T Avg T", "gsm_a.rr.t_avg_t",
12105 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t_avg_x_vals), 0x0,
12106 "Signal strength filter period for power control in packet transfer mode", HFILL }
12108 { &hf_gsm_a_rr_pc_meas_chan,
12109 { "PC Meas Chan", "gsm_a.rr.pc_meas_chan",
12110 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_pc_meas_chan_value), 0x0,
12111 "Channel used to measure the received power level on the downlink for the purpose of the uplink power control (PC Meas Chan)", HFILL }
12113 { &hf_gsm_a_rr_n_avg_i,
12114 { "N Avg I", "gsm_a.rr.n_avg_i",
12115 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_n_avg_i_vals), 0x0,
12116 "Interfering signal strength filter constant for power control (N Avg I)", HFILL }
12118 { &hf_gsm_a_rr_sgsnr,
12119 { "SGSNR", "gsm_a.rr.sgsnr",
12120 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_sgsnr_value), 0x0,
12121 "SGSN Release (SGSNR)", HFILL }
12123 { &hf_gsm_a_rr_si_status_ind,
12124 { "SI Status Ind", "gsm_a.rr.si_status_ind",
12125 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_si_status_ind_value), 0x0,
12126 NULL, HFILL }
12128 { &hf_gsm_a_rr_lb_ms_txpwr_max_cch,
12129 { "LB MS TxPwr Max CCCH", "gsm_a.rr.lb_ms_txpwr_max_cch",
12130 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lb_ms_txpwr_max_cch_vals), 0x0,
12131 "Maximum TX power level an MS is allowed to use on all other than DCS 1800 and PCS 1900 frequency bands when accessing the system until otherwise commanded (LB MS TxPwr Max CCCH)", HFILL }
12133 { &hf_gsm_a_rr_si2n_support,
12134 { "SI2n Support", "gsm_a.rr.si2n_support",
12135 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si2n_support_vals), 0x0,
12136 NULL, HFILL }
12138 { &hf_gsm_a_rr_mi_index,
12139 { "Measurement Information Index", "gsm_a.rr.mi_index",
12140 FT_UINT8, BASE_DEC, NULL, 0x0,
12141 NULL, HFILL }
12143 { &hf_gsm_a_rr_mi_count,
12144 { "Measurement Information Count", "gsm_a.rr.mi_count",
12145 FT_UINT8, BASE_DEC, NULL, 0x0,
12146 NULL, HFILL }
12148 { &hf_gsm_a_rr_3g_wait,
12149 { "3G Wait", "gsm_a.rr.3g_wait",
12150 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_3g_wait_vals), 0x0,
12151 NULL, HFILL }
12153 { &hf_gsm_a_rr_qsearch_c,
12154 { "Qsearch C", "gsm_a.rr.qsearch_c",
12155 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_x_vals), 0x00,
12156 "Search for 3G cells if signal level is below (0 7) or above (8 15) threshold (Qsearch C)", HFILL }
12158 { &hf_gsm_a_rr_bsic_seen,
12159 { "BSIC Seen", "gsm_a.rr.bsic_seen",
12160 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_bsic_seen_value), 0x0,
12161 NULL, HFILL }
12163 { &hf_gsm_a_rr_scale,
12164 { "Scale", "gsm_a.rr.scale",
12165 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_scale_value), 0x0,
12166 "Offset applied for the reported RXLEV values (Scale)", HFILL }
12168 { &hf_gsm_a_rr_mean_bep_gmsk,
12169 { "Mean BEP GMSK", "gsm_a.rr.mean_bep_gmsk",
12170 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_mean_bep_gmsk_vals), 0x00,
12171 "Mean Bit Error Probability in GMSK (Mean BEP GMSK)", HFILL }
12173 { &hf_gsm_a_rr_mean_cv_bep,
12174 { "CV BEP", "gsm_a.rr.cv_bep",
12175 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_cv_bep_vals), 0x00,
12176 "Coefficient of Variation of the Bit Error Probability (CV BEP)", HFILL }
12178 { &hf_gsm_a_rr_nbr_rcvd_blocks,
12179 { "Nb Rcvd Blocks", "gsm_a.rr.nbr_rcvd_blocks",
12180 FT_UINT8, BASE_DEC, NULL, 0x00,
12181 "Number of correctly decoded blocks that were completed during the measurement report period (Nb Rcvd Blocks)", HFILL }
12183 { &hf_gsm_a_rr_reporting_quantity,
12184 { "Reporting Quantity", "gsm_a.rr.reporting_quantity",
12185 FT_UINT8, BASE_DEC, NULL, 0x00,
12186 NULL, HFILL }
12188 { &hf_gsm_a_rr_3g_priority_param_desc_utran_start,
12189 { "UTRAN Start", "gsm_a.rr.3g_priority.utran_start",
12190 FT_BOOLEAN, BASE_NONE, TFS(&priority_utran_start), 0x00,
12191 NULL, HFILL }
12193 { &hf_gsm_a_rr_3g_priority_param_desc_utran_stop,
12194 { "UTRAN Stop", "gsm_a.rr.3g_priority.utran_stop",
12195 FT_BOOLEAN, BASE_NONE, TFS(&priority_utran_stop), 0x00,
12196 NULL, HFILL }
12198 { &hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio,
12199 { "DEFAULT_UTRAN_PRIORITY", "gsm_a.rr.3g_priority.default_utran_prio",
12200 FT_UINT8, BASE_DEC, NULL, 0x00,
12201 NULL, HFILL }
12203 { &hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran,
12204 { "DEFAULT_THRESH_UTRAN", "gsm_a.rr.3g_priority.default_threshold_utran",
12205 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
12206 NULL, HFILL }
12208 { &hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin,
12209 { "DEFAULT_UTRAN_QRXLEVMIN", "gsm_a.rr.3g_priority.default_utran_qrxlevmin",
12210 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_utran_qrxlevmin), 0x00,
12211 NULL, HFILL }
12213 { &hf_gsm_a_rr_utran_frequency_index,
12214 { "UTRAN Frequency Index", "gsm_a.rr.3g_priority.utran_frequency_index",
12215 FT_UINT8, BASE_DEC, NULL, 0x00,
12216 NULL, HFILL }
12218 { &hf_gsm_a_rr_utran_priority,
12219 { "UTRAN_PRIORITY", "gsm_a.rr.3g_priority.utran_priority",
12220 FT_UINT8, BASE_DEC, NULL, 0x00,
12221 NULL, HFILL }
12223 { &hf_gsm_a_rr_thresh_utran_high,
12224 { "THRESH_UTRAN_high", "gsm_a.rr.3g_priority.thres_utran_high",
12225 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
12226 NULL, HFILL }
12228 { &hf_gsm_a_rr_thresh_utran_low,
12229 { "THRESH_UTRAN_low", "gsm_a.rr.3g_priority.thres_utran_low",
12230 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
12231 NULL, HFILL }
12233 { &hf_gsm_a_rr_utran_qrxlevmin,
12234 { "UTRAN_QRXLEVMIN", "gsm_a.rr.3g_priority.utran_qrxlevmin",
12235 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_utran_qrxlevmin), 0x00,
12236 NULL, HFILL }
12238 { &hf_gsm_a_rr_eutran_ccn_active,
12239 { "E-UTRAN_CCN_ACTIVE", "gsm_a.rr.3g_priority.eutran_ccn_active",
12240 FT_BOOLEAN, BASE_NONE, TFS(&eutran_ccn_active), 0x00,
12241 NULL, HFILL }
12243 { &hf_gsm_a_rr_eutran_start,
12244 { "E-UTRAN Start", "gsm_a.rr.3g_priority.eutran_start",
12245 FT_BOOLEAN, BASE_NONE, TFS(&priority_utran_start), 0x00,
12246 NULL, HFILL }
12248 { &hf_gsm_a_rr_eutran_stop,
12249 { "E-UTRAN Stop", "gsm_a.rr.3g_priority.utran_stop",
12250 FT_BOOLEAN, BASE_NONE, TFS(&priority_utran_stop), 0x00,
12251 NULL, HFILL }
12253 { &hf_gsm_a_rr_qsearch_c_eutran_initial,
12254 { "Qsearch_C_E-UTRAN_Initial", "gsm_a.rr.qsearch_c_eutran_initial",
12255 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_c_eutran_initial), 0x00,
12256 NULL, HFILL }
12258 { &hf_gsm_a_rr_eutran_multirat_reporting,
12259 { "E-UTRAN_MULTIRAT_REPORTING (nb of E-UTRAN cells to be included in measurement report)", "gsm_a.rr.eutran_multirat_reporting",
12260 FT_UINT8, BASE_DEC, NULL, 0x00,
12261 NULL, HFILL }
12263 { &hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrp,
12264 { "E-UTRAN_FDD_REPORTING_THRESHOLD", "gsm_a.rr.eutran_fdd_reporting_threshold_rsrp",
12265 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lte_rsrp_reporting_threshold_vals), 0x00,
12266 NULL, HFILL }
12268 { &hf_gsm_a_rr_eutran_fdd_reporting_threshold_rsrq,
12269 { "E-UTRAN_FDD_REPORTING_THRESHOLD", "gsm_a.rr.eutran_fdd_reporting_threshold_rsrq",
12270 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lte_rsrq_reporting_threshold_vals), 0x00,
12271 NULL, HFILL }
12273 { &hf_gsm_a_rr_eutran_fdd_reporting_threshold_2,
12274 { "E-UTRAN_FDD_REPORTING_THRESHOLD_2", "gsm_a.rr.eutran_fdd_reporting_threshold_2",
12275 FT_UINT8, BASE_DEC, NULL, 0x00,
12276 NULL, HFILL }
12278 { &hf_gsm_a_rr_eutran_fdd_reporting_offset,
12279 { "E-UTRAN_FDD_REPORTING_OFFSET", "gsm_a.rr.eutran_fdd_reporting_offset",
12280 FT_UINT8, BASE_DEC, NULL, 0x00,
12281 NULL, HFILL }
12283 { &hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrp,
12284 { "E-UTRAN_TDD_REPORTING_THRESHOLD", "gsm_a.rr.eutran_tdd_reporting_threshold_rsrp",
12285 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lte_rsrp_reporting_threshold_vals), 0x00,
12286 NULL, HFILL }
12288 { &hf_gsm_a_rr_eutran_tdd_reporting_threshold_rsrq,
12289 { "E-UTRAN_TDD_REPORTING_THRESHOLD", "gsm_a.rr.eutran_tdd_reporting_threshold_rsrq",
12290 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lte_rsrq_reporting_threshold_vals), 0x00,
12291 NULL, HFILL }
12293 { &hf_gsm_a_rr_eutran_tdd_reporting_threshold_2,
12294 { "E-UTRAN_TDD_REPORTING_THRESHOLD_2", "gsm_a.rr.eutran_tdd_reporting_threshold_2",
12295 FT_UINT8, BASE_DEC, NULL, 0x00,
12296 NULL, HFILL }
12298 { &hf_gsm_a_rr_eutran_tdd_reporting_offset,
12299 { "E-UTRAN_TDD_REPORTING_OFFSET", "gsm_a.rr.eutran_tdd_reporting_offset",
12300 FT_UINT8, BASE_DEC, NULL, 0x00,
12301 NULL, HFILL }
12303 { &hf_gsm_a_rr_eutran_fdd_measurement_report_offset,
12304 { "E-UTRAN_FDD_MEASUREMENT_REPORT_OFFSET", "gsm_a.rr.eutran_fdd_measurement_report_offset",
12305 FT_UINT8, BASE_DEC, NULL, 0x00,
12306 NULL, HFILL }
12308 { &hf_gsm_a_rr_eutran_tdd_measurement_report_offset,
12309 { "E-UTRAN_TDD_MEASUREMENT_REPORT_OFFSET", "gsm_a.rr.eutran_tdd_measurement_report_offset",
12310 FT_UINT8, BASE_DEC, NULL, 0x00,
12311 NULL, HFILL }
12313 { &hf_gsm_a_rr_reporting_granularity,
12314 { "REPORTING_GRANULARITY", "gsm_a.rr.reporting_granularity",
12315 FT_UINT8, BASE_DEC, NULL, 0x00,
12316 NULL, HFILL }
12318 { &hf_gsm_a_rr_eutran_default_measurement_control_eutran,
12319 { "DEFAULT_Measurement_Control_E-UTRAN", "gsm_a.rr.eutran_default_measurement_control_eutran",
12320 FT_UINT8, BASE_DEC, NULL, 0x00,
12321 NULL, HFILL }
12323 { &hf_gsm_a_rr_eutran_measurement_control_eutran,
12324 { "Measurement_Control_E-UTRAN", "gsm_a.rr.eutran_measurement_control_eutran",
12325 FT_BOOLEAN, BASE_NONE, TFS(&measurement_control_eutran), 0x00,
12326 NULL, HFILL }
12328 { &hf_gsm_a_rr_qsearch_p_eutran,
12329 { "Qsearch_P_E-UTRAN", "gsm_a.rr.qsearch_p_eutran",
12330 FT_UINT8, BASE_DEC, NULL, 0x00,
12331 NULL, HFILL }
12333 { &hf_gsm_a_rr_serving_cell_priority_param_geran_priority,
12334 { "GERAN_PRIORITY", "gsm_a.rr.serving_cell_priority_param_geran_priority",
12335 FT_UINT8, BASE_DEC, NULL, 0x00,
12336 NULL, HFILL }
12338 { &hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search,
12339 { "THRESH_Priority_Search", "gsm_a.rr.serving_cell_priority_param_thresh_prio_search",
12340 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_thresh_priority_search), 0x00,
12341 NULL, HFILL }
12343 { &hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low,
12344 { "THRESH_GSM_low", "gsm_a.rr.serving_cell_priority_param_thresh_gsm_low",
12345 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_thresh_gsm_low), 0x00,
12346 NULL, HFILL }
12348 { &hf_gsm_a_rr_serving_cell_priority_param_h_prio,
12349 { "H_PRIO", "gsm_a.rr.serving_cell_priority_param_h_prio",
12350 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_priority_param_h_prio), 0x00,
12351 NULL, HFILL }
12353 { &hf_gsm_a_rr_serving_cell_priority_param_t_reselection,
12354 { "T_Reselection", "gsm_a.rr.serving_cell_priority_param_t_reselection",
12355 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_serving_cell_priority_param_t_reselection), 0x00,
12356 NULL, HFILL }
12358 { &hf_gsm_a_rr_eutran_earfcn,
12359 { "EARFCN", "gsm_a.rr.earfcn",
12360 FT_UINT16, BASE_DEC, NULL, 0x00,
12361 NULL, HFILL }
12363 { &hf_gsm_a_rr_eutran_measurement_bandwidth,
12364 { "Measurement Bandwidth", "gsm_a.rr.eutran_measurement_bandwidth",
12365 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_eutran_measurement_bandwidth), 0x00,
12366 NULL, HFILL }
12368 { &hf_gsm_a_rr_eutran_priority,
12369 { "E-UTRAN_PRIORITY", "gsm_a.rr.eutran_priority",
12370 FT_UINT8, BASE_DEC, NULL, 0x00,
12371 NULL, HFILL }
12373 { &hf_gsm_a_rr_thresh_eutran_high,
12374 { "THRESH_EUTRAN_high", "gsm_a.rr.thresh_eutran_high",
12375 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
12376 NULL, HFILL }
12378 { &hf_gsm_a_rr_thresh_eutran_low,
12379 { "THRESH_EUTRAN_low", "gsm_a.rr.thresh_eutran_low",
12380 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_thresh_utran_eutran_high_low), 0x00,
12381 NULL, HFILL }
12383 { &hf_gsm_a_rr_eutran_qrxlevmin,
12384 { "E-UTRAN_QRXLEVMIN", "gsm_a.rr.eutran_qrxlevmin",
12385 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_eutran_qrxlevmin), 0x00,
12386 NULL, HFILL }
12388 { &hf_gsm_a_rr_eutran_pcid,
12389 { "PCID", "gsm_a.rr.pcid",
12390 FT_UINT16, BASE_DEC, NULL, 0x00,
12391 NULL, HFILL }
12393 { &hf_gsm_a_rr_eutran_pcid_bitmap_group,
12394 { "PCID_BITMAP_GROUP", "gsm_a.rr.pcid_bitmap_group",
12395 FT_UINT8, BASE_DEC, NULL, 0x00,
12396 NULL, HFILL }
12398 { &hf_gsm_a_rr_eutran_pcid_pattern_length,
12399 { "PCID_Pattern_length", "gsm_a.rr.pcid_pattern_length",
12400 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pcid_psc_pattern_length), 0x00,
12401 NULL, HFILL }
12403 #if 0
12404 { &hf_gsm_a_rr_eutran_pcid_pattern,
12405 { "PCID_Pattern", "gsm_a.rr.pcid_pattern",
12406 FT_UINT8, BASE_DEC, NULL, 0x00,
12407 NULL, HFILL }
12409 #endif
12410 { &hf_gsm_a_rr_eutran_pcid_pattern_sense,
12411 { "PCID_pattern_sense", "gsm_a.rr.pcid_pattern_sense",
12412 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_pcid_pattern_sense), 0x00,
12413 NULL, HFILL }
12415 { &hf_gsm_a_rr_eutran_frequency_index,
12416 { "E-UTRAN_FREQUENCY_INDEX", "gsm_a.rr.eutran_frequency_index",
12417 FT_UINT8, BASE_DEC, NULL, 0x00,
12418 NULL, HFILL }
12420 { &hf_gsm_a_rr_psc,
12421 { "PSC", "gsm_a.rr.psc",
12422 FT_UINT16, BASE_DEC, NULL, 0x00,
12423 NULL, HFILL }
12425 { &hf_gsm_a_rr_utran_psc_pattern_length,
12426 { "PSC_Pattern_length", "gsm_a.rr.psc_pattern_length",
12427 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pcid_psc_pattern_length), 0x00,
12428 NULL, HFILL }
12430 { &hf_gsm_a_rr_utran_psc_pattern_sense,
12431 { "PSC_pattern_sense", "gsm_a.rr.psc_pattern_sense",
12432 FT_BOOLEAN, BASE_NONE, NULL, 0x00,
12433 NULL, HFILL }
12435 { &hf_gsm_a_rr_utran_csg_fdd_uarfcn,
12436 { "CSG FDD UARFCN", "gsm_a.rr.utran_csg_fdd_uarfcn",
12437 FT_UINT16, BASE_DEC, NULL, 0x0000,
12438 NULL, HFILL }
12440 { &hf_gsm_a_rr_utran_csg_tdd_uarfcn,
12441 { "CSG TDD UARFCN", "gsm_a.rr.utran_csg_tdd_uarfcn",
12442 FT_UINT16, BASE_DEC, NULL, 0x0000,
12443 NULL, HFILL }
12445 { &hf_gsm_a_rr_csg_earfcn,
12446 { "CSG_EARFCN", "gsm_a.rr.csg_earfcn",
12447 FT_UINT16, BASE_DEC, NULL, 0x00,
12448 NULL, HFILL }
12450 { &hf_gsm_a_rr_3g_control_param_desc_meas_ctrl_utran,
12451 { "PCID_pattern_sense", "gsm_a.rr.meas_ctrl_utran",
12452 FT_BOOLEAN, BASE_NONE, TFS(&measurement_control_utran), 0x00,
12453 NULL, HFILL }
12455 { &hf_gsm_a_rr_extended_ra,
12456 { "Extended_RA", "gsm_a.rr.extended_ra",
12457 FT_UINT8, BASE_DEC, NULL, 0x00,
12458 NULL, HFILL }
12460 { &hf_gsm_a_rr_access_tech_type,
12461 { "Access_Technology_Type", "gsm_a.rr.access_tech_type",
12462 FT_UINT8, BASE_DEC, VALS(gsm_a_access_tech_type_vals), 0x00,
12463 NULL, HFILL }
12465 { &hf_gsm_a_rr_tfi_assignment,
12466 { "TFI_Assignment", "gsm_a.rr.tfi_assignment",
12467 FT_UINT8, BASE_DEC, NULL, 0x00,
12468 NULL, HFILL }
12470 { &hf_gsm_a_rr_polling,
12471 { "Polling", "gsm_a.rr.polling",
12472 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_polling_vals), 0x00,
12473 NULL, HFILL }
12475 { &hf_gsm_a_rr_usf,
12476 { "USF", "gsm_a.rr.usf",
12477 FT_UINT8, BASE_DEC, NULL, 0x00,
12478 NULL, HFILL }
12480 { &hf_gsm_a_rr_usf_granularity,
12481 { "USF_granularity", "gsm_a.rr.usf_granularity",
12482 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_usf_granularity_vals), 0x00,
12483 NULL, HFILL }
12485 { &hf_gsm_a_rr_p0,
12486 { "P0", "gsm_a.rr.p0",
12487 FT_UINT8, BASE_DEC, NULL, 0x00,
12488 NULL, HFILL }
12490 { &hf_gsm_a_rr_pr_mode,
12491 { "pr_mode", "gsm_a.rr.pr_mode",
12492 FT_BOOLEAN, BASE_NONE, NULL, 0x00,
12493 NULL, HFILL }
12495 { &hf_gsm_a_rr_egprs_mcs,
12496 { "Egprs_Modulation_and_Coding_Scheme", "gsm_a.rr.egprs_mcs",
12497 FT_UINT8, BASE_DEC, VALS(gsm_a_egprs_mcs_vals), 0x00,
12498 NULL, HFILL }
12500 { &hf_gsm_a_rr_tlli_block_channel_coding,
12501 { "TLLI_Block_Channel_Coding", "gsm_a.rr.tlli_block_cs",
12502 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_tlli_block_channel_coding_vals), 0x00,
12503 NULL, HFILL }
12505 { &hf_gsm_a_rr_bep_period2,
12506 { "Bep_Period2", "gsm_a.rr.bep_period2",
12507 FT_UINT8, BASE_DEC, NULL, 0x00,
12508 NULL, HFILL }
12510 { &hf_gsm_a_rr_resegment,
12511 { "Resegment", "gsm_a.rr.resegment",
12512 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_resegment_vals), 0x00,
12513 NULL, HFILL }
12515 { &hf_gsm_a_rr_egprs_window_size,
12516 { "Egprs_Windows_Size", "gsm_a.rr.egprs_win_size",
12517 FT_UINT8, BASE_DEC, VALS(gsm_a_egprs_windows_size_vals), 0x00,
12518 NULL, HFILL }
12520 { &hf_gsm_a_rr_gamma,
12521 { "Gamma", "gsm_a.rr.gamma",
12522 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_gamma_vals), 0x00,
12523 NULL, HFILL }
12525 { &hf_gsm_a_rr_timing_adv_index,
12526 { "Timing_Advance_Index", "gsm_a.rr.timing_adv_idx",
12527 FT_UINT8, BASE_DEC, NULL, 0x00,
12528 NULL, HFILL }
12530 { &hf_gsm_a_rr_tbf_starting_time,
12531 { "TBF_Starting_Time", "gsm_a.rr.tvf_start_time",
12532 FT_UINT16, BASE_DEC, NULL, 0x00,
12533 NULL, HFILL }
12535 { &hf_gsm_a_rr_num_of_radio_block_allocated,
12536 { "Number_of_Radio_Block_Allocated", "gsm_a.rr.num_of_radio_blk_allocated",
12537 FT_UINT8, BASE_DEC, NULL, 0x00,
12538 NULL, HFILL }
12540 { &hf_gsm_a_rr_pfi,
12541 { "PFI", "gsm_a.rr.pfi",
12542 FT_UINT8, BASE_DEC, NULL, 0x00,
12543 NULL, HFILL }
12545 { &hf_gsm_a_rr_mbms_service_id,
12546 { "MBMS_Service_ID", "gsm_a.rr.mbms_service_id",
12547 FT_UINT32, BASE_DEC, NULL, 0x00,
12548 NULL, HFILL }
12550 { &hf_gsm_a_rr_ms_id,
12551 { "MS_ID", "gsm_a.rr.ms_id",
12552 FT_UINT8, BASE_DEC, NULL, 0x00,
12553 NULL, HFILL }
12555 { &hf_gsm_a_rr_timing_adv_timeslot_num,
12556 { "Timing_Advance_Timeslot_Number", "gsm_a.rr.timing_adv_ts",
12557 FT_UINT8, BASE_DEC, NULL, 0x00,
12558 NULL, HFILL }
12560 { &hf_gsm_a_rr_gprs_cs,
12561 { "Channel_Coding_Command", "gsm_a.rr.gprs_cs",
12562 FT_UINT8, BASE_DEC, VALS(gsm_a_gprs_cs_vals), 0x00,
12563 NULL, HFILL }
12565 { &hf_gsm_a_rr_rlc_mode,
12566 { "RLC_Mode", "gsm_a.rr.rlc_mode",
12567 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rlc_mode_vals), 0x00,
12568 NULL, HFILL }
12570 { &hf_gsm_a_rr_ta_valid,
12571 { "TA_Valid", "gsm_a.rr.ta_valid",
12572 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_ta_valid_vals), 0x00,
12573 NULL, HFILL }
12575 { &hf_gsm_a_rr_link_quality_meas_mode,
12576 { "Link_Quality_Measure_Mode", "gsm_a.rr.link_qual_meas_mode",
12577 FT_UINT8, BASE_DEC, VALS(gsm_a_link_quality_meas_mode_vals), 0x00,
12578 NULL, HFILL }
12580 { &hf_gsm_a_rr_emr_bitmap_length,
12581 { "BITMAP_LENGTH", "gsm_a.rr.emr_bitmap_len",
12582 FT_UINT8, BASE_DEC, NULL, 0x00,
12583 NULL, HFILL }
12585 { &hf_gsm_a_rr_eutran_mr_n_eutran,
12586 { "N_E-UTRAN", "gsm_a.rr.eutran_mr_n_eutran",
12587 FT_UINT8, BASE_DEC, NULL, 0x00,
12588 NULL, HFILL }
12590 { &hf_gsm_a_rr_eutran_mr_freq_idx,
12591 { "E-UTRAN_FREQUENCY_INDEX", "gsm_a.rr.eutran_mr_freq_idx",
12592 FT_UINT8, BASE_DEC, NULL, 0x00,
12593 NULL, HFILL }
12595 { &hf_gsm_a_rr_eutran_mr_cell_id,
12596 { "CELL IDENTITY", "gsm_a.rr.eutran_mr_cell_id",
12597 FT_UINT16, BASE_DEC, NULL, 0x00,
12598 NULL, HFILL }
12600 { &hf_gsm_a_rr_eutran_mr_rpt_quantity,
12601 { "REPORTING_QUANTITY", "gsm_a.rr.eutran_mr_rpt_quantity",
12602 FT_UINT8, BASE_DEC, NULL, 0x00,
12603 NULL, HFILL }
12605 { &hf_gsm_a_rr_ma_channel_set,
12606 { "Channel Set", "gsm_a.rr.ma_channel_set",
12607 FT_UINT8, BASE_HEX, NULL, 0x00,
12608 NULL, HFILL }
12610 { &hf_n_range_orig_arfcn,
12611 { "ORIG-ARFCN", "gsm_a.rr.orig_arfcn",
12612 FT_UINT16, BASE_DEC, NULL, 0x00,
12613 NULL, HFILL }
12617 static hf_register_info hf_rr_short_pd[] =
12619 { &hf_gsm_a_rr_short_pd,
12620 { "Radio Resources Short Protocol Discriminator", "gsm_a.rr.short_pd",
12621 FT_UINT8, BASE_HEX, NULL, 0x0,
12622 NULL, HFILL }
12624 { &hf_gsm_a_rr_short_pd_msg_type,
12625 { "Radio Resources Short PD Message Type", "gsm_a.rr.short_pd_type",
12626 FT_UINT8, BASE_HEX, VALS(gsm_a_rr_short_pd_msg_strings), 0x0,
12627 NULL, HFILL }
12629 { &hf_gsm_a_rr_short_l2_header,
12630 { "Radio Resources Short L2 Header", "gsm_a.rr.short_l2_header",
12631 FT_UINT8, BASE_HEX, NULL, 0x0,
12632 NULL, HFILL }
12636 /* Setup protocol subtree array */
12637 #define NUM_INDIVIDUAL_ELEMS 3
12638 gint *ett[NUM_INDIVIDUAL_ELEMS +
12639 NUM_GSM_DTAP_MSG_RR +
12640 NUM_GSM_RR_ELEM +
12641 NUM_GSM_RR_REST_OCTETS_ELEM +
12642 NUM_GSM_SACCH_MSG_RR];
12644 static ei_register_info ei[] = {
12645 { &ei_gsm_a_rr_ie_overrun, { "gsm_a.rr.ie_overrun", PI_MALFORMED, PI_ERROR, "IE over-runs stated length", EXPFILL }},
12646 { &ei_gsm_a_rr_ie_underrun, { "gsm_a.rr.ie_underrun", PI_COMMENTS_GROUP, PI_NOTE, "IE under-runs stated length", EXPFILL }},
12649 expert_module_t* expert_a_rr;
12651 ett[0] = &ett_ccch_msg;
12652 ett[1] = &ett_ccch_oct_1;
12653 ett[2] = &ett_sacch_msg;
12655 last_offset = NUM_INDIVIDUAL_ELEMS;
12657 for (i=0; i < NUM_GSM_DTAP_MSG_RR; i++, last_offset++)
12659 ett_gsm_dtap_msg_rr[i] = -1;
12660 ett[last_offset] = &ett_gsm_dtap_msg_rr[i];
12663 for (i=0; i < NUM_GSM_RR_ELEM; i++, last_offset++)
12665 ett_gsm_rr_elem[i] = -1;
12666 ett[last_offset] = &ett_gsm_rr_elem[i];
12669 for (i=0; i < NUM_GSM_RR_REST_OCTETS_ELEM; i++, last_offset++)
12671 ett_gsm_rr_rest_octets_elem[i] = -1;
12672 ett[last_offset] = &ett_gsm_rr_rest_octets_elem[i];
12675 for (i=0; i < NUM_GSM_SACCH_MSG_RR; i++, last_offset++)
12677 ett_gsm_sacch_msg_rr[i] = -1;
12678 ett[last_offset] = &ett_gsm_sacch_msg_rr[i];
12681 /* Register the protocol name and description */
12682 proto_a_rr =
12683 proto_register_protocol("GSM A-I/F Radio Resource Management", "GSM RR", "gsm_a.rr");
12685 proto_register_field_array(proto_a_rr, hf, array_length(hf));
12686 expert_a_rr = expert_register_protocol(proto_a_rr);
12687 expert_register_field_array(expert_a_rr, ei, array_length(ei));
12689 /* Register the protocol name and description */
12690 proto_a_ccch =
12691 proto_register_protocol("GSM CCCH", "GSM CCCH", "gsm_a.ccch");
12693 /* subdissector code */
12694 register_dissector("gsm_a_ccch", dissect_ccch, proto_a_ccch);
12696 /* Register the protocol name and description */
12697 proto_a_sacch =
12698 proto_register_protocol("GSM SACCH", "GSM SACCH", "gsm_a.sacch");
12700 proto_register_field_array(proto_a_sacch, hf_rr_short_pd, array_length(hf_rr_short_pd));
12702 /* subdissector code */
12703 register_dissector("gsm_a_sacch", dissect_sacch, proto_a_sacch);
12705 /* subtree array (for both sub-dissectors) */
12706 proto_register_subtree_array(ett, array_length(ett));
12709 void
12710 proto_reg_handoff_gsm_a_rr(void)
12712 data_handle = find_dissector("data");
12713 rrc_irat_ho_info_handle = find_dissector("rrc.irat.irat_ho_info");
12714 rrc_irat_ho_to_utran_cmd_handle = find_dissector("rrc.irat.ho_to_utran_cmd");
12715 rrlp_dissector = find_dissector("rrlp");