From Vincent Helfre:
[obnox/wireshark/wip.git] / epan / dissectors / packet-gsm_a_rr.c
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
3  *
4  * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
5  * In association with Telos Technology Inc.
6  *
7  * Added Dissection of Radio Resource Management Information Elements
8  * and other enhancements and fixes.
9  * Copyright 2005 - 2006, Anders Broman [AT] ericsson.com
10  *
11  * Title                3GPP                    Other
12  *
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))
19  *
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)
25  *
26  * $Id$
27  *
28  * Wireshark - Network traffic analyzer
29  * By Gerald Combs <gerald@wireshark.org>
30  * Copyright 1998 Gerald Combs
31  *
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.
36  *
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.
41  *
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
45  */
46
47 #ifdef HAVE_CONFIG_H
48 # include "config.h"
49 #endif
50
51 #include <stdlib.h>
52
53 #include <string.h>
54
55 #include <epan/packet.h>
56 #include <epan/prefs.h>
57 #include <epan/tap.h>
58 #include <epan/asn1.h>
59
60 #include "packet-bssap.h"
61 #include "packet-sccp.h"
62 #include "packet-ber.h"
63 #include "packet-q931.h"
64 #include "packet-gsm_a_common.h"
65 #include "packet-ipv6.h"
66 #include "packet-e212.h"
67 #include "packet-ppp.h"
68
69 static dissector_handle_t rrc_irat_ho_info_handle;
70 static dissector_handle_t rrc_irat_ho_to_utran_cmd_handle;
71
72 #define PADDING_BYTE 0x2B
73
74 gboolean gsm_a_rr_is_bit_high(tvbuff_t *tvb, gint bit_offset)
75 {
76     guint8 bit_mask = 0x80 >> (bit_offset & 0x07);
77     if ((tvb_get_guint8(tvb,bit_offset >> 3) & bit_mask) != (PADDING_BYTE & bit_mask))
78         return TRUE;
79     return FALSE;
80 }
81
82 /* PROTOTYPES/FORWARDS */
83
84 const value_string gsm_a_dtap_msg_rr_strings[] = {
85     { 0x3c, "Reserved" },
86     { 0x3b, "Additional Assignment" },
87     { 0x3f, "Immediate Assignment" },
88     { 0x39, "Immediate Assignment Extended" },
89     { 0x3a, "Immediate Assignment Reject" },
90
91     { 0x48, "DTM Assignment Failure" },
92     { 0x49, "DTM Reject" },
93     { 0x4a, "DTM Request" },
94     { 0x4b, "Main DCCH Assignment Command" },
95     { 0x4c, "Packet Assignment Command" },
96
97     { 0x35, "Ciphering Mode Command" },
98     { 0x32, "Ciphering Mode Complete" },
99
100     { 0x30, "Configuration Change Command" },
101     { 0x31, "Configuration Change Ack." },
102     { 0x33, "Configuration Change Reject" },
103
104     { 0x2e, "Assignment Command" },
105     { 0x29, "Assignment Complete" },
106     { 0x2f, "Assignment Failure" },
107     { 0x2b, "Handover Command" },
108     { 0x2c, "Handover Complete" },
109     { 0x28, "Handover Failure" },
110     { 0x2d, "Physical Information" },
111     { 0x4d, "DTM Assignment Command" },
112
113     { 0x08, "RR-cell Change Order" },
114     { 0x23, "PDCH Assignment Command" },
115
116     { 0x0d, "Channel Release" },
117     { 0x0a, "Partial Release" },
118     { 0x0f, "Partial Release Complete" },
119
120     { 0x21, "Paging Request Type 1" },
121     { 0x22, "Paging Request Type 2" },
122     { 0x24, "Paging Request Type 3" },
123     { 0x27, "Paging Response" },
124     { 0x20, "Notification/NCH" },
125     { 0x25, "Reserved" },
126     { 0x26, "Notification/Response" },
127
128     { 0x0b, "Reserved" },
129
130 #if 0
131 /* ETSI TS 101 503 V8.5.0 Seems to give Other def for this Messages??? */
132     { 0xc0, "Utran Classmark Change" }, CONFLICTS WITH Handover To UTRAN Command
133     { 0xc1, "UE RAB Preconfiguration" },
134     { 0xc2, "cdma2000 Classmark Change" },
135 #endif
136
137     /* ETSI TS 101 503 V8.5.0 */
138     { 0x60, "Utran Classmark Change" },
139     { 0x62, "cdma2000 Classmark Change" },
140     { 0x63, "Inter System to UTRAN Handover Command" },
141     { 0x64, "Inter System to cdma2000 Handover Command" },
142     { 0x18, "System Information Type 8" },
143     { 0x19, "System Information Type 1" },
144     { 0x1a, "System Information Type 2" },
145     { 0x1b, "System Information Type 3" },
146     { 0x1c, "System Information Type 4" },
147     { 0x1d, "System Information Type 5" },
148     { 0x1e, "System Information Type 6" },
149     { 0x1f, "System Information Type 7" },
150
151     { 0x02, "System Information Type 2bis" },
152     { 0x03, "System Information Type 2ter" },
153     { 0x07, "System Information Type 2quater" },
154     { 0x05, "System Information Type 5bis" },
155     { 0x06, "System Information Type 5ter" },
156     { 0x04, "System Information Type 9" },
157     { 0x00, "System Information Type 13" },
158
159     { 0x3d, "System Information Type 16" },
160     { 0x3e, "System Information Type 17" },
161
162     { 0x40, "System Information Type 18" },
163     { 0x41, "System Information Type 19" },
164     { 0x42, "System Information Type 20" },
165
166     { 0x10, "Channel Mode Modify" },
167     { 0x12, "RR Status" },
168     { 0x17, "Channel Mode Modify Acknowledge" },
169     { 0x14, "Frequency Redefinition" },
170     { 0x15, "Measurement Report" },
171     { 0x16, "Classmark Change" },
172     { 0x13, "Classmark Enquiry" },
173     { 0x36, "Extended Measurement Report" },
174     { 0x37, "Extended Measurement Order" },
175     { 0x34, "GPRS Suspension Request" },
176
177     { 0x09, "VGCS Uplink Grant" },
178     { 0x0e, "Uplink Release" },
179     { 0x0c, "Reserved" },
180     { 0x2a, "Uplink Busy" },
181     { 0x11, "Talker Indication" },
182
183     { 0xc0, "UTRAN Classmark Change/Handover To UTRAN Command" }, /* spec conflict */
184
185     { 0x38, "Application Information" },
186
187     {    0, NULL }
188 };
189
190 const value_string gsm_rr_elem_strings[] = {
191     /* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
192     { 0x00, "BA Range" },                                                       /* [3]  10.5.2.1a BA Range */
193     { 0x00, "Cell Channel Description" },                                       /* [3]  10.5.2.1b */
194     { 0x00, "BA List Pref" },                                                   /* [3]  10.5.2.1c BA List Pref */
195     { 0x00, "UTRAN Frequency List" },                                           /* [3]  10.5.2.1d UTRAN Frequency List */
196     { 0x00, "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 */
197     { 0x00, "Cell Description" },                                               /* 10.5.2.2  */
198     { 0x00, "Cell Options (BCCH)" },                                            /* [3]  10.5.2.3        Cell Options (BCCH) */
199     { 0x00, "Cell Options (SACCH)" },                                           /* [3]  10.5.2.3a       Cell Options (SACCH) */
200     { 0x00, "Cell Selection Parameters" },                                      /* [3]  10.5.2.4        Cell Selection Parameters */
201 /* [3]  10.5.2.4a       (void) */
202     { 0x00, "Channel Description" },                                            /* 10.5.2.5      */
203     { 0x00, "Channel Description 2" },                                          /* 10.5.2.5a */
204     { 0x00, "Channel Description 3" },                                          /* 10.5.2.5c */
205     { 0x00, "Channel Mode" },                                                   /* [3]  10.5.2.6 */
206     { 0x00, "Channel Mode 2" },                                                 /* [3]  10.5.2.7 */
207     { 0x00, "UTRAN Classmark" },                                                /* [3]  10.5.2.7a       */
208 /* [3]  10.5.2.7b       (void) */
209     { 0x00, "Classmark Enquiry Mask" },                                         /* [3]  10.5.2.7c */
210 /* [3]  10.5.2.7d       GERAN Iu Mode Classmark information element */
211     { 0x00, "Channel Needed"},                                                  /* [3]  10.5.2.8        */
212     /* [3]  10.5.2.8a   (void) */
213     /* [3]  10.5.2.8b   Channel Request Description 2 */
214     /* Pos 20 */
215     { 0x00, "Cipher Mode Setting" },                                            /* [3]  10.5.2.9        */
216     { 0x00, "Cipher Mode Response" },                                           /* [3]  10.5.2.10       */
217     { 0x00, "Control Channel Description" },                                    /* [3]  10.5.2.11       Control Channel Description */
218 /* [3]  10.5.2.11a      DTM Information Details */
219     { 0x00, "Dynamic ARFCN Mapping" },                                          /* [3]  10.5.2.11b      */
220     { 0x00, "Frequency Channel Sequence" },                                     /* [3]  10.5.2.12       */
221     { 0x00, "Frequency List" },                                                 /* 10.5.2.13            */
222     { 0x00, "Frequency Short List" },                                           /* 10.5.2.14            */
223     { 0x00, "Frequency Short List2" },                                          /* 10.5.2.14a           */
224 /* [3]  10.5.2.14b      Group Channel Description */
225     { 0x00, "GPRS Resumption" },                                                /* [3]  10.5.2.14c      GPRS Resumption */
226     { 0x00, "GPRS Broadcast Information" },                                     /* [3]  10.5.2.14d      GPRS broadcast information */
227 /* [3]  10.5.2.14e      Enhanced DTM CS Release Indication */
228     { 0x00, "Handover Reference" },                                             /* 10.5.2.15            */
229     { 0x00, "IA Rest Octets" },                                                 /* [3] 10.5.2.16        */
230     { 0x00, "IAR Rest Octets" },                                                /* [3] 10.5.2.17 IAR Rest Octets */
231     { 0x00, "IAX Rest Octets" },                                                /* [3] 10.5.2.18 IAX Rest Octets */
232     { 0x00, "L2 Pseudo Length" },                                               /* [3] 10.5.2.19        */
233     { 0x00, "Measurement Results" },                                            /* [3] 10.5.2.20 Measurement Results */
234 /*
235  * [3] 10.5.2.20a GPRS Measurement Results
236  */
237     { 0x00, "Mobile Allocation" },                                              /* [3] 10.5.2.21        */
238     { 0x00, "Mobile Time Difference" },                                         /* [3] 10.5.2.21a       */
239     { 0x00, "MultiRate configuration" },                                        /* [3] 10.5.2.21aa      */
240     /* Pos 30 */
241     { 0x00, "Multislot Allocation" },                                           /* [3] 10.5.2.21b       */
242     /*
243      * [3] 10.5.2.21c NC mode
244      */
245     { 0x00, "Neighbour Cell Description" },                                     /* [3] 10.5.2.22 Neighbour Cell Description */
246     { 0x00, "Neighbour Cell Description 2" },                                   /* [3] 10.5.2.22a Neighbour Cell Description 2 */
247 /*
248  * [3] 10.5.2.22b (void)
249  * [3] 10.5.2.22c NT/N Rest Octets */
250     { 0x00, "P1 Rest Octets" },                                                 /* [3] 10.5.2.23 P1 Rest Octets */
251     { 0x00, "P2 Rest Octets" },                                                 /* [3] 10.5.2.24 P2 Rest Octets */
252     { 0x00, "P3 Rest Octets" },                                                 /* [3] 10.5.2.25 P3 Rest Octets */
253     { 0x00, "Packet Channel Description" },                                     /* [3] 10.5.2.25a       */
254     { 0x00, "Dedicated mode or TBF" },                                          /* [3] 10.5.2.25b */
255     /* [3] 10.5.2.25c RR Packet Uplink Assignment
256      * [3] 10.5.2.25d RR Packet Downlink Assignment */
257     { 0x00, "Page Mode" },                                                      /* [3] 10.5.2.26  */
258 /*
259  * [3] 10.5.2.26a (void)
260  * [3] 10.5.2.26b (void)
261  * [3] 10.5.2.26c (void)
262  * [3] 10.5.2.26d (void)
263  */
264     { 0x00, "NCC Permitted" },                                                  /* [3] 10.5.2.27 NCC Permitted */
265     { 0x00, "Power Command" },                                                  /* 10.5.2.28 */
266     { 0x00, "Power Command and access type" },                                  /* 10.5.2.28a */
267     { 0x00, "RACH Control Parameters" },                                        /* [3] 10.5.2.29 RACH Control Parameters */
268     { 0x00, "Request Reference" },                                              /* [3] 10.5.2.30 Request Reference */
269     { 0x00, "RR Cause" },                                                       /* 10.5.2.31 */
270     { 0x00, "Synchronization Indication" },                                     /* 10.5.2.39 */
271     { 0x00, "SI 1 Rest Octets" },                                               /* [3] 10.5.2.32 */
272 /* [3] 10.5.2.33 SI 2bis Rest Octets */
273     { 0x00, "SI 2ter Rest Octets" },                                            /* [3] 10.5.2.33a */
274     { 0x00, "SI 2quater Rest Octets" },                                         /* [3] 10.5.2.33b */
275     { 0x00, "SI 3 Rest Octets" },                                               /* [3] 10.5.2.34 */
276     { 0x00, "SI 4 Rest Octets" },                                               /* [3] 10.5.2.35 */
277     { 0x00, "SI 6 Rest Octets" },                                               /* [3] 10.5.2.35a */
278 /* [3] 10.5.2.36 SI 7 Rest Octets
279  * [3] 10.5.2.37 SI 8 Rest Octets
280  * [3] 10.5.2.37a SI 9 Rest Octets
281  */
282     { 0x00, "SI 13 Rest Octets" },                                              /* [3] 10.5.2.37b */
283 /* [3] 10.5.2.37c (void)
284  * [3] 10.5.2.37d (void)
285  * [3] 10.5.2.37e SI 16 Rest Octets
286  * [3] 10.5.2.37f SI 17 Rest Octets
287  * [3] 10.5.2.37g SI 19 Rest Octets
288  * [3] 10.5.2.37h SI 18 Rest Octets
289  * [3] 10.5.2.37i SI 20 Rest Octets */
290     { 0x00, "Starting Time" },                                                  /* [3] 10.5.2.38 Starting Time  */
291     { 0x00, "Timing Advance" },                                                 /* [3] 10.5.2.40 Timing Advance */
292     { 0x00, "Time Difference" },                                                /* [3] 10.5.2.41 Time Difference */
293     { 0x00, "TLLI" },                                                           /* [3] 10.5.2.41a TLLI  */
294     { 0x00, "TMSI/P-TMSI" },                                                    /* [3] 10.5.2.42 TMSI/P-TMSI */
295     { 0x00, "VGCS target mode Indication" },                                    /* [3] 10.5.2.42a */
296     /* Pos 40 */
297     { 0x00, "VGCS Ciphering Parameters" },                                      /* [3] 10.5.2.42b */
298     { 0x00, "Wait Indication" },                                                /* [3] 10.5.2.43 Wait Indication */
299 /* [3] 10.5.2.44 SI10 rest octets $(ASCI)$ */
300     { 0x00, "Extended Measurement Results" },                                   /* [3] 10.5.2.45 Extended Measurement Results */
301     { 0x00, "Extended Measurement Frequency List" },                            /* [3] 10.5.2.46 Extended Measurement Frequency List */
302     { 0x00, "Suspension Cause" },                                               /* [3] 10.5.2.47                                                                */
303     { 0x00, "APDU ID" },                                                        /* [3] 10.5.2.48 APDU ID */
304     { 0x00, "APDU Flags" },                                                     /* [3] 10.5.2.49 APDU Flags */
305     { 0x00, "APDU Data" },                                                      /* [3] 10.5.2.50 APDU Data */
306     { 0x00, "Handover to UTRAN Command" },                                      /* [3] 10.5.2.51 Handover To UTRAN Command */
307 /* [3] 10.5.2.52 Handover To cdma2000 Command
308  * [3] 10.5.2.53 (void)
309  * [3] 10.5.2.54 (void)
310  * [3] 10.5.2.55 (void)
311  * [3] 10.5.2.56 3G Target Cell */
312     { 0x00, "Service Support" },                                                /* [3] 10.5.2.57        */
313     /* 10.5.2.58 MBMS p-t-m Channel Description */
314     { 0x00, "Dedicated Service Information" },                                  /* [3] 10.5.2.59        */
315 /*
316  * 10.5.2.60 MPRACH Description
317  * 10.5.2.61 Restriction Timer
318  * 10.5.2.62 MBMS Session Identity
319  * 10.5.2.63 Reduced group or broadcast call reference
320  * 10.5.2.64 Talker Priority status
321  * 10.5.2.65 Talker Identity
322  * 10.5.2.66 Token
323  * 10.5.2.67 PS Cause
324  * 10.5.2.68 VGCS AMR Configuration
325  */
326     { 0x00, "Carrier Indication" },                                             /* 10.5.2.69 Carrier Indication */
327     {    0, NULL }
328 };
329
330 const value_string gsm_rr_rest_octets_elem_strings[] = {
331     /* RR Rest Octets information elements */
332     { 0, "UTRAN FDD Description" },
333     { 0, "UTRAN TDD Description" },
334     { 0, "3G Measurement Parameters Description" },
335     { 0, "3G Additional Measurement Parameters Description" },
336     { 0, "Measurement Parameters Description" },
337     { 0, "GPRS Real Time Difference Description" },
338     { 0, "GPRS BSIC Description" },
339     { 0, "GPRS Report Priority Description" },
340     { 0, "GPRS Measurement Parameters Description" },
341     { 0, "NC Measurement Parameters" },
342     { 0, "SI2q Extension Information" },
343     { 0, "CCN Support Description" },
344     { 0, "3G Neighbour Cell Description" },
345     { 0, "FDD Cell Information Field" },
346     { 0, "TDD Cell Information Field" },
347     { 0, "GPRS 3G Measurement Parameters Description" },
348     { 0, "3G Additional Measurement Parameters Description 2" },
349     { 0, "Priority and E-UTRAN Parameters Description" },
350     { 0, "Serving Cell Priority Parameters Description" },
351     { 0, "3G Priority Parameters Description" },
352     { 0, "UTRAN Priority Parameters" },
353     { 0, "E-UTRAN Parameters Description" },
354     { 0, "E-UTRAN Neighbour Cells" },
355     { 0, "E-UTRAN Not Allowed Cells" },
356     { 0, "E-UTRAN PCID to TA mapping" },
357     { 0, "3G CSG Description" },
358     { 0, "E-UTRAN CSG Description" },
359     { 0, "Optional Selection Parameters" },
360     { 0, "GPRS Indicator" },
361     { 0, "SI4 Rest Octets_O" },
362     { 0, "SI4 Rest Octets_S" },
363     { 0, "LSA Parameters" },
364     { 0, "LSA ID Information" },
365     { 0, "PCH and NCH Info" },
366     { 0, "VBS/VGCS Options" },
367     { 0, "GPRS Mobile Allocation" },
368     { 0, "GPRS Cell Options" },
369     { 0, "GPRS Cell Options Extension Information" },
370     { 0, "GPRS Power Control Parameters" },
371     { 0, "PBCCH Description" },
372     { 0, "GSM Description" },
373     { 0, "Real Time Difference Description" },
374     { 0, "BSIC Description" },
375     { 0, "Report Priority Description" },
376     { 0, "CDMA2000 Description" },
377     { 0, "Serving cell data" },
378     { 0, "Repeated Invalid BSIC Information" },
379     { 0, "Bitmap Type Reporting" },
380     { 0, NULL }
381 };
382
383
384 /* RR cause value (octet 2) TS 44.018 6.11.0*/
385 static const value_string gsm_a_rr_RR_cause_vals[] = {
386     {    0, "Normal event"},
387     {    1, "Abnormal release, unspecified"},
388     {    2, "Abnormal release, channel unacceptable"},
389     {    3, "Abnormal release, timer expired"},
390     {    4, "Abnormal release, no activity on the radio path"},
391     {    5, "Preemptive release"},
392     {    6, "UTRAN configuration unknown"},
393     {    8, "Handover impossible, timing advance out of range"},
394     {    9, "Channel mode unacceptable"},
395     {   10, "Frequency not implemented"},
396     {   13, "Originator or talker leaving group call area"},
397     {   12, "Lower layer failure"},
398     { 0x41, "Call already cleared"},
399     { 0x5f, "Semantically incorrect message"},
400     { 0x60, "Invalid mandatory information"},
401     { 0x61, "Message type non-existent or not implemented"},
402     { 0x62, "Message type not compatible with protocol state"},
403     { 0x64, "Conditional IE error"},
404     { 0x65, "No cell allocation available"},
405     { 0x6f, "Protocol error unspecified"},
406     { 0,        NULL }
407 };
408
409 static const value_string gsm_a_algorithm_identifier_vals[] = {
410     { 0, "Cipher with algorithm A5/1"},
411     { 1, "Cipher with algorithm A5/2"},
412     { 2, "Cipher with algorithm A5/3"},
413     { 3, "Cipher with algorithm A5/4"},
414     { 4, "Cipher with algorithm A5/5"},
415     { 5, "Cipher with algorithm A5/6"},
416     { 6, "Cipher with algorithm A5/7"},
417     { 7, "Reserved"},
418     { 0, NULL }
419 };
420
421
422 #define DTAP_PD_MASK            0x0f
423 #define DTAP_SKIP_MASK          0xf0
424 #define DTAP_TI_MASK            DTAP_SKIP_MASK
425 #define DTAP_TIE_PRES_MASK      0x07                    /* after TI shifted to right */
426 #define DTAP_TIE_MASK           0x7f
427
428 #define DTAP_RR_IEI_MASK        0xff
429
430 /* Initialize the protocol and registered fields */
431 static int proto_a_ccch = -1;
432 static int proto_a_sacch = -1;
433
434 static int hf_gsm_a_dtap_msg_rr_type = -1;
435 int hf_gsm_a_rr_elem_id = -1;
436
437 static int hf_gsm_a_sacch_msg_rr_type = -1;
438
439 static int hf_gsm_a_bcc = -1;
440 static int hf_gsm_a_ncc = -1;
441 static int hf_gsm_a_bcch_arfcn = -1;
442 static int hf_gsm_a_rr_range_nb = -1;
443 static int hf_gsm_a_rr_range_lower = -1;
444 static int hf_gsm_a_rr_range_higher = -1;
445 static int hf_gsm_a_rr_ba_list_pref_length = -1;
446 static int hf_gsm_a_rr_ba_freq = -1;
447 static int hf_gsm_a_rr_utran_freq_list_length = -1;
448 static int hf_gsm_a_rr_ho_ref_val       = -1;
449 static int hf_gsm_a_rr_L2_pseudo_len = -1;
450 static int hf_gsm_a_rr_ba_used = -1;
451 static int hf_gsm_a_rr_dtx_used = -1;
452 static int hf_gsm_a_rr_3g_ba_used = -1;
453 static int hf_gsm_a_rr_meas_valid = -1;
454 static int hf_gsm_a_rr_rxlev_full_serv_cell = -1;
455 static int hf_gsm_a_rr_rxlev_sub_serv_cell = -1;
456 static int hf_gsm_a_rr_rxqual_full_serv_cell = -1;
457 static int hf_gsm_a_rr_rxqual_sub_serv_cell = -1;
458 static int hf_gsm_a_rr_no_ncell_m = -1;
459 static int hf_gsm_a_rr_rxlev_ncell = -1;
460 static int hf_gsm_a_rr_bcch_freq_ncell = -1;
461 static int hf_gsm_a_rr_bsic_ncell = -1;
462 static int hf_gsm_a_rr_mobile_time_difference = -1;
463 static int hf_gsm_a_rr_pow_cmd_atc = -1;
464 static int hf_gsm_a_rr_pow_cmd_epc = -1;
465 static int hf_gsm_a_rr_page_mode = -1;
466 static int hf_gsm_a_rr_dedicated_mode_or_tbf = -1;
467 static int hf_gsm_a_rr_pow_cmd_fpcepc = -1;
468 static int hf_gsm_a_rr_pow_cmd_powlev = -1;
469 static int hf_gsm_a_rr_sync_ind_nci = -1;
470 static int hf_gsm_a_rr_sync_ind_rot = -1;
471 static int hf_gsm_a_rr_sync_ind_si = -1;
472 static int hf_gsm_a_rr_format_id = -1;
473 static int hf_gsm_a_rr_format_id2 = -1;
474 static int hf_gsm_a_rr_channel_mode = -1;
475 static int hf_gsm_a_rr_channel_mode2 = -1;
476 static int hf_gsm_a_rr_sc = -1;
477 static int hf_gsm_a_algorithm_id = -1;
478 static int hf_gsm_a_rr_cr = -1;
479 static int hf_gsm_a_rr_multirate_speech_ver = -1;
480 static int hf_gsm_a_rr_NCSB = -1;
481 static int hf_gsm_a_rr_ICMI = -1;
482 static int hf_gsm_a_rr_start_mode = -1;
483 static int hf_gsm_a_rr_timing_adv = -1;
484 static int hf_gsm_a_rr_time_diff = -1;
485 static int hf_gsm_a_rr_tlli = -1;
486 static int hf_gsm_a_rr_tmsi_ptmsi = -1;
487 static int hf_gsm_a_rr_target_mode = -1;
488 static int hf_gsm_a_rr_wait_indication = -1;
489 static int hf_gsm_a_rr_seq_code = -1;
490 static int hf_gsm_a_rr_group_cipher_key_number = -1;
491 static int hf_gsm_a_rr_MBMS_multicast = -1;
492 static int hf_gsm_a_rr_MBMS_broadcast = -1;
493 static int hf_gsm_a_rr_last_segment = -1;
494 static int hf_gsm_a_rr_carrier_ind = -1;
495 static int hf_gsm_a_rr_ra = -1;
496 static int hf_gsm_a_rr_T1prim = -1;
497 static int hf_gsm_a_rr_T3 = -1;
498 static int hf_gsm_a_rr_T2 = -1;
499 static int hf_gsm_a_rr_rfn = -1;
500 static int hf_gsm_a_rr_RR_cause = -1;
501 static int hf_gsm_a_rr_cm_cng_msg_req = -1;
502 static int hf_gsm_a_rr_utran_cm_cng_msg_req = -1;
503 static int hf_gsm_a_rr_cdma200_cm_cng_msg_req = -1;
504 static int hf_gsm_a_rr_geran_iu_cm_cng_msg_req = -1;
505 int hf_gsm_a_rr_chnl_needed_ch1 = -1;
506 static int hf_gsm_a_rr_chnl_needed_ch2 = -1;
507 static int hf_gsm_a_rr_chnl_needed_ch3 = -1;
508 static int hf_gsm_a_rr_chnl_needed_ch4 = -1;
509 static int hf_gsm_a_rr_suspension_cause = -1;
510 static int hf_gsm_a_rr_apdu_id = -1;
511 static int hf_gsm_a_rr_apdu_flags = -1;
512 static int hf_gsm_a_rr_apdu_data = -1;
513 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8 = -1;
514 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7 = -1;
515 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6 = -1;
516 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5 = -1;
517 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4 = -1;
518 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3 = -1;
519 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2 = -1;
520 static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1 = -1;
521 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5 = -1;
522 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4 = -1;
523 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3 = -1;
524 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2 = -1;
525 static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1 = -1;
526 static int hf_gsm_a_rr_amr_threshold = -1;
527 static int hf_gsm_a_rr_amr_hysteresis = -1;
528 static int hf_gsm_a_rr_pwrc = -1;
529 static int hf_gsm_a_rr_dtx_bcch = -1;
530 static int hf_gsm_a_rr_dtx_sacch = -1;
531 static int hf_gsm_a_rr_radio_link_timeout = -1;
532 static int hf_gsm_a_rr_cell_reselect_hyst = -1;
533 static int hf_gsm_a_rr_ms_txpwr_max_cch = -1;
534 static int hf_gsm_a_rr_acs = -1;
535 static int hf_gsm_a_rr_neci = -1;
536 static int hf_gsm_a_rr_rxlev_access_min = -1;
537 static int hf_gsm_a_rr_mscr = -1;
538 static int hf_gsm_a_rr_att = -1;
539 static int hf_gsm_a_rr_ccch_conf = -1;
540 static int hf_gsm_a_rr_cbq3 = -1;
541 static int hf_gsm_a_rr_bs_pa_mfrms = -1;
542 static int hf_gsm_a_rr_bs_ag_blks_res = -1;
543 static int hf_gsm_a_rr_t3212 = -1;
544 static int hf_gsm_a_rr_dyn_arfcn_length = -1;
545 static int hf_gsm_a_rr_gsm_band = -1;
546 static int hf_gsm_a_rr_arfcn_first = -1;
547 static int hf_gsm_a_rr_band_offset = -1;
548 static int hf_gsm_a_rr_arfcn_range = -1;
549 static int hf_gsm_a_rr_lowest_arfcn = -1;
550 static int hf_gsm_a_rr_inc_skip_arfcn = -1;
551 static int hf_gsm_a_rr_gprs_resumption_ack = -1;
552 static int hf_gsm_a_rr_ext_ind = -1;
553 static int hf_gsm_a_rr_ba_ind = -1;
554 static int hf_gsm_a_rr_multiband_reporting = -1;
555 static int hf_gsm_a_rr_ncc_permitted = -1;
556 static int hf_gsm_a_rr_max_retrans = -1;
557 static int hf_gsm_a_rr_tx_integer = -1;
558 static int hf_gsm_a_rr_cell_barr_access = -1;
559 static int hf_gsm_a_rr_re = -1;
560 static int hf_gsm_a_rr_acc = -1;
561 static int hf_gsm_a_rr_nch_position = -1;
562 static int hf_gsm_a_rr_si2ter_mp_change_mark = -1;
563 static int hf_gsm_a_rr_si2ter_3g_change_mark = -1;
564 static int hf_gsm_a_rr_si2ter_index = -1;
565 static int hf_gsm_a_rr_si2ter_count = -1;
566 static int hf_gsm_a_rr_fdd_uarfcn = -1;
567 static int hf_gsm_a_rr_bandwidth_fdd = -1;
568 static int hf_gsm_a_rr_tdd_uarfcn = -1;
569 static int hf_gsm_a_rr_bandwidth_tdd = -1;
570 static int hf_gsm_a_rr_arfcn = -1;
571 static int hf_gsm_a_rr_bsic = -1;
572 static int hf_gsm_a_rr_qsearch_i = -1;
573 static int hf_gsm_a_rr_fdd_qoffset = -1;
574 static int hf_gsm_a_rr_fdd_qmin = -1;
575 static int hf_gsm_a_rr_tdd_qoffset = -1;
576 static int hf_gsm_a_rr_fdd_qmin_offset = -1;
577 static int hf_gsm_a_rr_fdd_rscpmin = -1;
578 static int hf_gsm_a_rr_3g_ba_ind = -1;
579 static int hf_gsm_a_rr_mp_change_mark = -1;
580 static int hf_gsm_a_rr_si2quater_index = -1;
581 static int hf_gsm_a_rr_si2quater_count = -1;
582 static int hf_gsm_a_rr_gsm_report_type = -1;
583 static int hf_gsm_a_rr_serving_band_reporting = -1;
584 static int hf_gsm_a_rr_frequency_scrolling = -1;
585 static int hf_gsm_a_rr_rep_priority = -1;
586 static int hf_gsm_a_rr_report_type = -1;
587 static int hf_gsm_a_rr_reporting_rate = -1;
588 static int hf_gsm_a_rr_invalid_bsic_reporting = -1;
589 static int hf_gsm_a_rr_scale_ord = -1;
590 static int hf_gsm_a_rr_900_reporting_offset = -1;
591 static int hf_gsm_a_rr_900_reporting_threshold = -1;
592 static int hf_gsm_a_rr_1800_reporting_offset = -1;
593 static int hf_gsm_a_rr_1800_reporting_threshold = -1;
594 static int hf_gsm_a_rr_400_reporting_offset = -1;
595 static int hf_gsm_a_rr_400_reporting_threshold = -1;
596 static int hf_gsm_a_rr_1900_reporting_offset = -1;
597 static int hf_gsm_a_rr_1900_reporting_threshold = -1;
598 static int hf_gsm_a_rr_850_reporting_offset = -1;
599 static int hf_gsm_a_rr_850_reporting_threshold = -1;
600 static int hf_gsm_a_rr_network_control_order = -1;
601 static int hf_gsm_a_rr_nc_non_drx_period = -1;
602 static int hf_gsm_a_rr_nc_reporting_period_i = -1;
603 static int hf_gsm_a_rr_nc_reporting_period_t = -1;
604 static int hf_gsm_a_rr_index_start_3g = -1;
605 static int hf_gsm_a_rr_absolute_index_start_emr = -1;
606 static int hf_gsm_a_rr_qsearch_c_initial = -1;
607 static int hf_gsm_a_rr_fdd_rep_quant = -1;
608 static int hf_gsm_a_rr_fdd_multirat_reporting = -1;
609 static int hf_gsm_a_rr_tdd_multirat_reporting = -1;
610 static int hf_gsm_a_rr_qsearch_p = -1;
611 static int hf_gsm_a_rr_3g_search_prio = -1;
612 static int hf_gsm_a_rr_fdd_reporting_offset = -1;
613 static int hf_gsm_a_rr_fdd_reporting_threshold = -1;
614 static int hf_gsm_a_rr_tdd_reporting_offset = -1;
615 static int hf_gsm_a_rr_tdd_reporting_threshold = -1;
616 static int hf_gsm_a_rr_fdd_reporting_threshold_2 = -1;
617 static int hf_gsm_a_rr_3g_ccn_active = -1;
618 static int hf_gsm_a_rr_700_reporting_offset = -1;
619 static int hf_gsm_a_rr_700_reporting_threshold = -1;
620 static int hf_gsm_a_rr_810_reporting_offset = -1;
621 static int hf_gsm_a_rr_810_reporting_threshold = -1;
622 static int hf_gsm_a_rr_cbq = -1;
623 static int hf_gsm_a_rr_cell_reselect_offset = -1;
624 static int hf_gsm_a_rr_temporary_offset = -1;
625 static int hf_gsm_a_rr_penalty_time = -1;
626 static int hf_gsm_a_rr_si13_position = -1;
627 static int hf_gsm_a_rr_power_offset = -1;
628 static int hf_gsm_a_rr_si2quater_position = -1;
629 static int hf_gsm_a_rr_si13alt_position = -1;
630 static int hf_gsm_a_rr_prio_thr = -1;
631 static int hf_gsm_a_rr_lsa_offset = -1;
632 static int hf_gsm_a_rr_paging_channel_restructuring = -1;
633 static int hf_gsm_a_rr_nln_sacch = -1;
634 static int hf_gsm_a_rr_nln_status_sacch = -1;
635 static int hf_gsm_a_rr_nln_pch = -1;
636 static int hf_gsm_a_rr_nln_status_pch = -1;
637 static int hf_gsm_a_rr_vbs_vgcs_inband_notifications = -1;
638 static int hf_gsm_a_rr_vbs_vgcs_inband_pagings = -1;
639 static int hf_gsm_a_rr_rac = -1;
640 static int hf_gsm_a_rr_max_lapdm = -1;
641 static int hf_gsm_a_rr_gprs_ms_txpwr_max_ccch = -1;
642 static int hf_gsm_a_rr_dedicated_mode_mbms_notification_support = -1;
643 static int hf_gsm_a_rr_mnci_support = -1;
644 static int hf_gsm_a_rr_amr_config = -1;
645 static int hf_gsm_a_rr_bcch_change_mark = -1;
646 static int hf_gsm_a_rr_si_change_field = -1;
647 static int hf_gsm_a_rr_si13_change_mark = -1;
648 static int hf_gsm_a_rr_hsn = -1;
649 static int hf_gsm_a_rr_rfl_number = -1;
650 static int hf_gsm_a_rr_arfcn_index = -1;
651 static int hf_gsm_a_rr_ma_length = -1;
652 static int hf_gsm_a_rr_psi1_repeat_period = -1;
653 static int hf_gsm_a_rr_pbcch_pb = -1;
654 static int hf_gsm_a_rr_pbcch_tsc = -1;
655 static int hf_gsm_a_rr_pbcch_tn = -1;
656 static int hf_gsm_a_rr_spgc_ccch_sup = -1;
657 static int hf_gsm_a_rr_priority_access_thr = -1;
658 static int hf_gsm_a_rr_nmo = -1;
659 static int hf_gsm_a_rr_t3168 = -1;
660 static int hf_gsm_a_rr_t3192 = -1;
661 static int hf_gsm_a_rr_drx_timer_max = -1;
662 static int hf_gsm_a_rr_access_burst_type = -1;
663 static int hf_gsm_a_rr_control_ack_type = -1;
664 static int hf_gsm_a_rr_bs_cv_max = -1;
665 static int hf_gsm_a_rr_pan_dec = -1;
666 static int hf_gsm_a_rr_pan_inc = -1;
667 static int hf_gsm_a_rr_pan_max = -1;
668 static int hf_gsm_a_rr_egprs_packet_channel_request = -1;
669 static int hf_gsm_a_rr_bep_period = -1;
670 static int hf_gsm_a_rr_pfc_feature_mode = -1;
671 static int hf_gsm_a_rr_dtm_support = -1;
672 static int hf_gsm_a_rr_bss_paging_coordination = -1;
673 static int hf_gsm_a_rr_ccn_active = -1;
674 static int hf_gsm_a_rr_nw_ext_utbf = -1;
675 static int hf_gsm_a_rr_multiple_tbf_capability = -1;
676 static int hf_gsm_a_rr_ext_utbf_no_data = -1;
677 static int hf_gsm_a_rr_dtm_enhancements_capability = -1;
678 static int hf_gsm_a_rr_reduced_latency_access = -1;
679 static int hf_gsm_a_rr_alpha = -1;
680 static int hf_gsm_a_rr_t_avg_w = -1;
681 static int hf_gsm_a_rr_t_avg_t = -1;
682 static int hf_gsm_a_rr_pc_meas_chan = -1;
683 static int hf_gsm_a_rr_n_avg_i = -1;
684 static int hf_gsm_a_rr_sgsnr = -1;
685 static int hf_gsm_a_rr_si_status_ind = -1;
686 static int hf_gsm_a_rr_lb_ms_txpwr_max_cch = -1;
687 static int hf_gsm_a_rr_si2n_support = -1;
688 static int hf_gsm_a_rr_mi_index = -1;
689 static int hf_gsm_a_rr_mi_count = -1;
690 static int hf_gsm_a_rr_3g_wait = -1;
691 static int hf_gsm_a_rr_qsearch_c = -1;
692 static int hf_gsm_a_rr_bsic_seen = -1;
693 static int hf_gsm_a_rr_scale = -1;
694 static int hf_gsm_a_rr_mean_bep_gmsk = -1;
695 static int hf_gsm_a_rr_mean_cv_bep = -1;
696 static int hf_gsm_a_rr_nbr_rcvd_blocks = -1;
697 static int hf_gsm_a_rr_reporting_quantity = -1;
698 /* Additions in Rel-8 */
699 static int hf_gsm_a_rr_3g_priority_param_desc_utran_start = -1;
700 static int hf_gsm_a_rr_3g_priority_param_desc_utran_stop = -1;
701 static int hf_gsm_a_rr_3g_priority_param_desc_default_utran_prio = -1;
702 static int hf_gsm_a_rr_3g_priority_param_desc_default_threshold_utran = -1;
703 static int hf_gsm_a_rr_3g_priority_param_desc_default_utran_qrxlevmin = -1;
704 static int hf_gsm_a_rr_utran_frequency_index = -1;
705 static int hf_gsm_a_rr_utran_priority = -1;
706 static int hf_gsm_a_rr_thresh_utran_high = -1;
707 static int hf_gsm_a_rr_thresh_utran_low = -1;
708 static int hf_gsm_a_rr_utran_qrxlevmin = -1;
709 static int hf_gsm_a_rr_eutran_ccn_active = -1;
710 static int hf_gsm_a_rr_eutran_start = -1;
711 static int hf_gsm_a_rr_eutran_stop = -1;
712 static int hf_gsm_a_rr_qsearch_c_eutran_initial = -1;
713 static int hf_gsm_a_rr_eutran_rep_quant = -1;
714 static int hf_gsm_a_rr_eutran_multirat_reporting = -1;
715 static int hf_gsm_a_rr_eutran_fdd_reporting_threshold = -1;
716 static int hf_gsm_a_rr_eutran_fdd_reporting_threshold_2 = -1;
717 static int hf_gsm_a_rr_eutran_tdd_reporting_threshold = -1;
718 static int hf_gsm_a_rr_eutran_tdd_reporting_threshold_2 = -1;
719 static int hf_gsm_a_rr_eutran_fdd_measurement_report_offset = -1;
720 static int hf_gsm_a_rr_eutran_tdd_measurement_report_offset = -1;
721 static int hf_gsm_a_rr_reporting_granularity = -1;
722 static int hf_gsm_a_rr_qsearch_p_eutran = -1;
723 static int hf_gsm_a_rr_serving_cell_priority_param_geran_priority = -1;
724 static int hf_gsm_a_rr_serving_cell_priority_param_thresh_prio_search = -1;
725 static int hf_gsm_a_rr_serving_cell_priority_param_thresh_gsm_low = -1;
726 static int hf_gsm_a_rr_serving_cell_priority_param_h_prio = -1;
727 static int hf_gsm_a_rr_serving_cell_priority_param_t_reselection = -1;
728 static int hf_gsm_a_rr_eutran_earfcn = -1;
729 static int hf_gsm_a_rr_eutran_measurement_bandwidth = -1;
730 static int hf_gsm_a_rr_eutran_priority = -1;
731 static int hf_gsm_a_rr_thresh_eutran_high = -1;
732 static int hf_gsm_a_rr_thresh_eutran_low = -1;
733 static int hf_gsm_a_rr_eutran_qrxlevmin = -1;
734 static int hf_gsm_a_rr_eutran_pcid = -1;
735 static int hf_gsm_a_rr_eutran_pcid_bitmap_group = -1;
736 static int hf_gsm_a_rr_eutran_pcid_pattern_length = -1;
737 static int hf_gsm_a_rr_eutran_pcid_pattern = -1;
738 static int hf_gsm_a_rr_eutran_pcid_pattern_sense = -1;
739 static int hf_gsm_a_rr_eutran_frequency_index = -1;
740 static int hf_gsm_a_rr_psc = -1;
741 static int hf_gsm_a_rr_utran_psc_pattern_length = -1;
742 static int hf_gsm_a_rr_utran_psc_pattern_sense = -1;
743 static int hf_gsm_a_rr_utran_csg_fdd_uarfcn = -1;
744 static int hf_gsm_a_rr_utran_csg_tdd_uarfcn = -1;
745 static int hf_gsm_a_rr_csg_earfcn = -1;
746
747 /* Initialize the subtree pointers */
748 static gint ett_ccch_msg = -1;
749 static gint ett_ccch_oct_1 = -1;
750 static gint ett_sacch_msg = -1;
751
752 static char a_bigbuf[1024];
753
754 static dissector_handle_t data_handle;
755 static dissector_handle_t rrlp_dissector;
756
757
758 #define NUM_GSM_RR_ELEM (sizeof(gsm_rr_elem_strings)/sizeof(value_string))
759 gint ett_gsm_rr_elem[NUM_GSM_RR_ELEM];
760
761 typedef enum
762 {
763     /* RR Rest Octets information elements */
764     DE_RR_REST_OCTETS_UTRAN_FDD_DESC,
765     DE_RR_REST_OCTETS_UTRAN_TDD_DESC,
766     DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC,
767     DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC,
768     DE_RR_REST_OCTETS_MEAS_PARAM_DESC,
769     DE_RR_REST_OCTETS_GPRS_RTD_DESC,
770     DE_RR_REST_OCTETS_GPRS_BSIC_DESC,
771     DE_RR_REST_OCTETS_GPRS_REPORT_PRIO_DESC,
772     DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC,
773     DE_RR_REST_OCTETS_NC_MEAS_PARAM,
774     DE_RR_REST_OCTETS_SI2Q_EXT_INFO,
775     DE_RR_REST_OCTETS_CCN_SUPPORT_DESC,
776     DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC,
777     DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD,
778     DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD,
779     DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC,
780     DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2,
781     DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC,
782     DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC,
783     DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC,
784     DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM,
785     DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC,
786     DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS,
787     DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS,
788     DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING,
789     DE_RR_REST_OCTETS_3G_CSG_DESC,
790     DE_RR_REST_OCTETS_EUTRAN_CSG_DESC,
791     DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM,
792     DE_RR_REST_OCTETS_GPRS_INDICATOR,
793     DE_RR_REST_OCTETS_SI4_REST_OCTETS_O,
794     DE_RR_REST_OCTETS_SI4_REST_OCTETS_S,
795     DE_RR_REST_OCTETS_LSA_PARAMETERS,
796     DE_RR_REST_OCTETS_LSA_ID_INFO,
797     DE_RR_REST_OCTETS_PCH_AND_NCH_INFO,
798     DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS,
799     DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC,
800     DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS,
801     DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO,
802     DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS,
803     DE_RR_REST_OCTETS_PBCCH_DESC,
804     DE_RR_REST_OCTETS_GSM_DESC,
805     DE_RR_REST_OCTETS_RTD_DESC,
806     DE_RR_REST_OCTETS_BSIC_DESC,
807     DE_RR_REST_OCTETS_REPORT_PRIO_DESC,
808     DE_RR_REST_OCTETS_CDMA2000_DESC,
809     DE_RR_REST_OCTETS_SERVING_CELL_DATA,
810     DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO,
811     DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING,
812     DE_RR_REST_OCTETS_NONE
813 }
814 rr_rest_octets_elem_idx_t;
815
816 #define NUM_GSM_RR_REST_OCTETS_ELEM (sizeof(gsm_rr_rest_octets_elem_strings)/sizeof(value_string))
817 gint ett_gsm_rr_rest_octets_elem[NUM_GSM_RR_REST_OCTETS_ELEM];
818
819 /*
820 10.5.2 Radio Resource management information elements
821  * [3] 10.5.2.1a BA Range
822  */
823 guint16
824 de_rr_ba_range(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
825 {
826     guint32 curr_offset;
827     gint bit_offset;
828     guint8 value;
829
830     curr_offset = offset;
831     proto_tree_add_item(tree, hf_gsm_a_rr_range_nb, tvb, curr_offset, 1, FALSE);
832     value = tvb_get_guint8(tvb, curr_offset);
833     curr_offset += 1;
834     bit_offset = curr_offset << 3;
835     while (value)
836     {
837         proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, FALSE);
838         bit_offset += 10;
839         proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, FALSE);
840         bit_offset += 10;
841         value -= 1;
842     }
843
844     curr_offset += len - 1;
845     return (curr_offset - offset);
846 }
847
848 /*
849  * [3] 10.5.2.1b Cell Channel Description
850  */
851
852 #define ARFCN_MAX 1024 /* total number of ARFCNs defined */
853
854 static void display_channel_list(guint8 *list, tvbuff_t *tvb, proto_tree *tree, guint32 offset)
855 {
856     int arfcn;
857     proto_item *ti=NULL;
858
859     ti = proto_tree_add_text(tree, tvb, 0, offset, "List of ARFCNs =");
860     for (arfcn=0; arfcn<ARFCN_MAX; arfcn++) {
861         if (list[arfcn])
862             proto_item_append_text(ti, " %d", arfcn);
863     }
864
865     return;
866 }
867
868 static gint greatest_power_of_2_lesser_or_equal_to(gint idx)
869 {
870     gint j = 1;
871     do {
872         j<<=1;
873     } while (j<=idx);
874     j >>= 1;
875     return j;
876 }
877
878 static gint f_k(gint k, gint *w, gint range)
879 {
880     gint idx, n, j;
881
882     idx = k;
883     range -= 1;
884     range = range/greatest_power_of_2_lesser_or_equal_to(idx);
885     n = w[idx]-1;
886
887     while (idx>1) {
888         j = greatest_power_of_2_lesser_or_equal_to(idx);
889         range = 2*range+1;
890         if ((2*idx) < 3*j){ /* left child */
891             idx -= j/2;
892             n = (n+w[idx]-1+((range-1)/2)+1)%range;
893         }
894         else { /* right child */
895             idx -= j;
896             n = (n+w[idx]-1+1)%range;
897         }
898     }
899
900     return (n+1)%1024;
901 }
902
903 static void dissect_channel_list_n_range(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gint range)
904 {
905     gint curr_offset=offset, f0, arfcn_orig, bits, w[64], wsize, i, wi;
906     gint octet, nwi=1, jwi=0, wbits, imax, iused, arfcn;
907     guint8 list[1024];
908
909     memset((void*)list,0,sizeof(list));
910
911     octet = tvb_get_guint8(tvb, curr_offset++);
912     if (range==1024) {
913         f0 = (octet>>2)&1;
914         if (f0)
915             list[0] = 1;
916         bits = 2;
917         arfcn_orig = 0;
918         wsize = 10;
919         imax = 16;
920     }
921     else {
922         arfcn_orig = (octet&1);
923         arfcn_orig = (arfcn_orig << 8) + tvb_get_guint8(tvb, curr_offset++);
924         octet = tvb_get_guint8(tvb, curr_offset++);
925         arfcn_orig = (arfcn_orig << 1) + (octet>>7);
926         list[arfcn_orig] = 1;
927         bits = 7;
928         switch (range) {
929         case 512:
930             wsize=9;
931             imax = 17;
932             break;
933         case 256:
934             wsize=8;
935             imax = 21;
936             break;
937         case 128:
938             wsize=7;
939             imax = 28;
940             break;
941         default:
942             wsize=0;
943             imax = 0;
944             DISSECTOR_ASSERT_NOT_REACHED();
945         }
946     }
947     iused = imax;   /* in case the list is actually full */
948
949     /* extract the variable size w[] elements */
950     for (i=1; i<=imax; i++) {
951         wi = octet & ~(0xff<<bits);      /* mask "bits" low bits to start wi from existing octet */
952         wbits = bits;
953         while (wsize>wbits) {        /* need to extract more bits from the next octet */
954             octet = tvb_get_guint8(tvb, curr_offset++);
955             wi = (wi << 8) + octet;
956             bits = 8;
957             wbits += 8;
958         }
959
960         if (wbits>wsize) {      /* now we have too many bits - save some */
961             bits = wbits - wsize;
962             wi >>= bits;
963         }
964         else                    /* just right number of bits */
965             bits = 0;
966
967         w[i] = wi;
968         if ((w[i]==0) || ((curr_offset-offset)>len)) {
969             iused = i - 1;
970             break;        /* all remaining elements must also be zero */
971         }
972
973         if (++jwi==nwi) {       /* check if the number of wi at this wsize has been extracted */
974             jwi = 0;            /* reset the count of wi at this size */
975             nwi <<= 1;          /* get twice as many of the next size */
976             wsize--;            /* make the next size 1 bit smaller */
977         }
978     }
979
980     for (i=1; i<=iused; i++) {
981         arfcn = (f_k(i, w, range) + arfcn_orig)%1024;
982         list[arfcn] = 1;
983     }
984
985     display_channel_list(list, tvb, tree, offset);
986
987     return;
988 }
989
990 static guint16
991 dissect_arfcn_list_core(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_, guint8 format)
992 {
993     guint32 curr_offset,byte;
994     guint8  oct,bit;
995     guint16 arfcn;
996     proto_item  *item;
997
998     curr_offset = offset;
999
1000     if ((format & 0xc0) == 0x00)
1001     {
1002         /* bit map 0 */
1003         item = proto_tree_add_text(tree,tvb, curr_offset, len, "List of ARFCNs =");
1004         bit = 4;
1005         arfcn = 125;
1006         for (byte = 0;byte <= len-1;byte++)
1007         {
1008             oct = tvb_get_guint8(tvb, curr_offset);
1009             while (bit-- != 0)
1010             {
1011                 arfcn--;
1012                 if (((oct >> bit) & 1) == 1)
1013                 {
1014                     proto_item_append_text(item," %d",arfcn);
1015                 }
1016             }
1017             bit = 8;
1018             curr_offset++;
1019         }
1020     }
1021     else if ((format & 0xc8) == 0x80)
1022     {
1023         /* 1024 range */
1024         dissect_channel_list_n_range(tvb, tree, curr_offset, len, 1024);
1025         curr_offset = curr_offset + len;
1026     }
1027     else if ((format & 0xce) == 0x88)
1028     {
1029         /* 512 range */
1030         dissect_channel_list_n_range(tvb, tree, curr_offset, len, 512);
1031         curr_offset = curr_offset + len;
1032     }
1033     else if ((format & 0xce) == 0x8a)
1034     {
1035         /* 256 range */
1036         dissect_channel_list_n_range(tvb, tree, curr_offset, len, 256);
1037         curr_offset = curr_offset + len;
1038     }
1039     else if ((format & 0xce) == 0x8c)
1040     {
1041         /* 128 range */
1042         dissect_channel_list_n_range(tvb, tree, curr_offset, len, 128);
1043         curr_offset = curr_offset + len;
1044     }
1045     else if ((format & 0xce) == 0x8e)
1046     {
1047         /* variable bit map */
1048         arfcn = ((format & 0x01) << 9) | (tvb_get_guint8(tvb, curr_offset+1) << 1) | ((tvb_get_guint8(tvb, curr_offset + 2) & 0x80) >> 7);
1049         item = proto_tree_add_text(tree,tvb,curr_offset,len,"List of ARFCNs = %d",arfcn);
1050         curr_offset = curr_offset + 2;
1051         bit = 7;
1052         for (byte = 0;byte <= len-3;byte++)
1053         {
1054             oct = tvb_get_guint8(tvb, curr_offset);
1055             while (bit-- != 0)
1056             {
1057                 arfcn++;
1058                 if (((oct >> bit) & 1) == 1)
1059                 {
1060                     proto_item_append_text(item," %d",arfcn);
1061                 }
1062             }
1063             bit = 8;
1064             curr_offset++;
1065         }
1066     }
1067
1068     return(curr_offset - offset);
1069 }
1070
1071 /*
1072  * Format ID is in bits:
1073  * 128 127 124 123 122 (hf_gsm_a_rr_format_id)
1074  */
1075 static guint16
1076 dissect_arfcn_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1077 {
1078     guint32     curr_offset;
1079     guint8  oct;
1080
1081     curr_offset = offset;
1082
1083     oct = tvb_get_guint8(tvb, curr_offset);
1084
1085     /* FORMAT-ID, Format Identifier (part of octet 3)*/
1086     proto_tree_add_item(tree, hf_gsm_a_rr_format_id, tvb, curr_offset, 1, FALSE);
1087
1088     curr_offset += dissect_arfcn_list_core(tvb, tree, offset, len, add_string, string_len, oct);
1089
1090     return(curr_offset - offset);
1091 }
1092
1093 /*
1094  * Format ID is in bits:
1095  * 128 124 123 122 (hf_gsm_a_rr_format_id2)
1096  */
1097 static guint16
1098 dissect_arfcn_list2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1099 {
1100     guint32     curr_offset;
1101     guint8  oct;
1102
1103     curr_offset = offset;
1104
1105     /* Turn bit 127 off, in order to reuse the ARFCN dissection code */
1106     oct = tvb_get_guint8(tvb, curr_offset) & 0xbf;
1107
1108     /* FORMAT-ID, Format Identifier (part of octet 3)*/
1109     proto_tree_add_item(tree, hf_gsm_a_rr_format_id2, tvb, curr_offset, 1, FALSE);
1110
1111     curr_offset += dissect_arfcn_list_core(tvb, tree, offset, len, add_string, string_len, oct);
1112
1113     return(curr_offset - offset);
1114 }
1115
1116 guint16
1117 de_rr_cell_ch_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1118 {
1119     return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
1120 }
1121 /*
1122  * [3] 10.5.2.1c BA List Pref
1123  */
1124 guint16
1125 de_rr_ba_list_pref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1126 {
1127     guint32 curr_offset;
1128     gint bit_offset;
1129     guint8 value;
1130
1131     curr_offset = offset;
1132     proto_tree_add_item(tree, hf_gsm_a_rr_ba_list_pref_length, tvb, curr_offset, 1, FALSE);
1133     bit_offset = curr_offset << 3;
1134     value = tvb_get_bits8(tvb,bit_offset,1);
1135     bit_offset += 1;
1136     while (value)
1137     {
1138         proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, FALSE);
1139         bit_offset += 10;
1140         proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, FALSE);
1141         bit_offset += 10;
1142         value = tvb_get_bits8(tvb,bit_offset,1);
1143         bit_offset += 1;
1144     }
1145     value = tvb_get_bits8(tvb,bit_offset,1);
1146     bit_offset += 1;
1147     while (value)
1148     {
1149         proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_freq, tvb, bit_offset, 10, FALSE);
1150         bit_offset += 10;
1151         value = tvb_get_bits8(tvb,bit_offset,1);
1152         bit_offset += 1;
1153     }
1154
1155     curr_offset += len;
1156     return (curr_offset - offset);
1157 }
1158
1159 /*
1160  * [3] 10.5.2.1d UTRAN Frequency List
1161  */
1162 guint16
1163 de_rr_utran_freq_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1164 {
1165     guint32 curr_offset;
1166     gint bit_offset;
1167     guint8 value;
1168
1169     curr_offset = offset;
1170     proto_tree_add_item(tree, hf_gsm_a_rr_utran_freq_list_length, tvb, curr_offset, 1, FALSE);
1171     bit_offset = curr_offset << 3;
1172     value = tvb_get_bits8(tvb,bit_offset,1);
1173     bit_offset += 1;
1174     while (value)
1175     {
1176         proto_tree_add_bits_item(tree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
1177         bit_offset += 14;
1178         value = tvb_get_bits8(tvb,bit_offset,1);
1179         bit_offset += 1;
1180     }
1181     value = tvb_get_bits8(tvb,bit_offset,1);
1182     bit_offset += 1;
1183     while (value)
1184     {
1185         proto_tree_add_bits_item(tree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
1186         bit_offset += 14;
1187         value = tvb_get_bits8(tvb,bit_offset,1);
1188         bit_offset += 1;
1189     }
1190
1191     curr_offset += len;
1192     return (curr_offset - offset);
1193 }
1194
1195 /*
1196  * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH
1197  */
1198 static const guint8
1199 convert_n_to_p[32] = {   0, 10, 19, 28, 26, 44, 52, 60, 67, 74, 81, 88, 95, 102, 109, 116,
1200                        122,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,   0};
1201
1202 static const guint8
1203 convert_n_to_q[32] = {   0,   9,  17,  25,  32, 39, 46, 53, 59, 65, 71, 77, 83, 89, 95, 101,
1204                        106, 111, 116, 121, 126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0};
1205
1206 guint16
1207 de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1208 {
1209     proto_tree *subtree, *subtree2;
1210     proto_item *item, *item2;
1211     guint32 curr_offset;
1212     gint bit_offset, bit_offset_sav, idx, xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
1213     guint8 value, length;
1214
1215     curr_offset = offset;
1216     length = tvb_get_guint8(tvb, curr_offset);
1217     curr_offset += 1;
1218     bit_offset = curr_offset << 3;
1219     value = tvb_get_bits8(tvb,bit_offset,3);
1220     bit_offset += 3;
1221     switch (value)
1222     {
1223     case 0: /* GSM Description */
1224         bit_offset_sav = bit_offset;
1225         item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s",
1226                                    gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GSM_DESC].strptr);
1227         subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GSM_DESC]);
1228         value = tvb_get_bits8(tvb,bit_offset,1);
1229         bit_offset += 1;
1230         while (value)
1231         {
1232             proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Band Indicator: %s",tvb_get_bits8(tvb,bit_offset,1) ? "1900" : "1800");
1233             bit_offset += 1;
1234             proto_tree_add_bits_item(subtree, hf_gsm_a_rr_arfcn, tvb, bit_offset, 10, FALSE);
1235             bit_offset += 10;
1236             proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, bit_offset, 6, FALSE);
1237             bit_offset += 6;
1238             value = tvb_get_bits8(tvb,bit_offset,1);
1239             bit_offset += 1;
1240         }
1241         proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
1242         break;
1243     case 1: /* UTRAN FDD Description */
1244         bit_offset_sav = bit_offset;
1245         item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s",
1246                                    gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
1247         subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
1248         value = tvb_get_bits8(tvb,bit_offset,1);
1249         bit_offset += 1;
1250         while (value)
1251         {
1252             if (tvb_get_bits8(tvb,bit_offset,1))
1253             {
1254                 bit_offset += 1;
1255                 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, FALSE);
1256                 bit_offset += 3;
1257             }
1258             else
1259                 bit_offset += 1;
1260             proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
1261             bit_offset += 14;
1262             if (tvb_get_bits8(tvb,bit_offset,1))
1263             {
1264                 bit_offset += 1;
1265                 xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
1266                 proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "FDD Indic0: %d", xdd_indic0);
1267                 bit_offset += 1;
1268                 idx = tvb_get_bits8(tvb,bit_offset,5);
1269                 proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of FDD Cells : %d", idx);
1270                 bit_offset += 5;
1271                 idx = convert_n_to_p[idx];
1272                 item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s",
1273                                             gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
1274                 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]);
1275                 proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
1276                 if (xdd_indic0)
1277                 {
1278                     proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Scrambling Code: %d", 0);
1279                     proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity: %d", 0);
1280                 }
1281                 if (idx)
1282                 {
1283                     wsize = 10;
1284                     nwi = 1;
1285                     jwi = 0;
1286                     i = 1;
1287
1288                     while (idx > 0)
1289                     {
1290                         w[i] = tvb_get_bits(tvb, bit_offset, wsize, FALSE);
1291                         bit_offset += wsize;
1292                         idx -= wsize;
1293                         if (w[i] == 0)
1294                         {
1295                             idx = 0;
1296                             break;
1297                         }
1298                         if (++jwi==nwi)
1299                         {
1300                             jwi = 0;
1301                             nwi <<= 1;
1302                             wsize--;
1303                         }
1304                         i++;
1305                     }
1306                     if (idx < 0)
1307                     {
1308                         bit_offset += idx;
1309                     }
1310                     iused = i-1;
1311
1312                     for (i=1; i <= iused; i++)
1313                     {
1314                         xdd_cell_info = f_k(i, w, 1024);
1315                         proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1316                                             "Scrambling Code: %d", xdd_cell_info & 0x01FF);
1317                         proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1318                                             "Diversity: %d", (xdd_cell_info >> 9) & 0x01);
1319                     }
1320                 }
1321             }
1322             else
1323                 bit_offset += 1;
1324             value = tvb_get_bits8(tvb,bit_offset,1);
1325             bit_offset += 1;
1326         }
1327         proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
1328         break;
1329     case 2: /* UTRAN TDD Description */
1330         bit_offset_sav = bit_offset;
1331         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);
1332         subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
1333         value = tvb_get_bits8(tvb,bit_offset,1);
1334         bit_offset += 1;
1335         while (value)
1336         {
1337             if (tvb_get_bits8(tvb,bit_offset,1))
1338             {
1339                 bit_offset += 1;
1340                 proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, FALSE);
1341                 bit_offset += 3;
1342             }
1343             else
1344                 bit_offset += 1;
1345             proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
1346             bit_offset += 14;
1347             if (tvb_get_bits8(tvb,bit_offset,1))
1348             {
1349                 bit_offset += 1;
1350                 xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
1351                 proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "TDD Indic0: %d", xdd_indic0);
1352                 bit_offset += 1;
1353                 idx = tvb_get_bits8(tvb,bit_offset,5);
1354                 proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
1355                 bit_offset += 5;
1356                 idx = convert_n_to_q[idx];
1357                 item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s",
1358                                             gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
1359                 subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
1360                 proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
1361                 if (xdd_indic0)
1362                 {
1363                     proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Cell Parameter: %d", 0);
1364                     proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Sync Case TSTD: %d", 0);
1365                     proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity TDD: %d", 0);
1366                 }
1367                 if (idx)
1368                 {
1369                     wsize = 9;
1370                     nwi = 1;
1371                     jwi = 0;
1372                     i = 1;
1373
1374                     while (idx > 0)
1375                     {
1376                         w[i] = tvb_get_bits(tvb, bit_offset, wsize, FALSE);
1377                         bit_offset += wsize;
1378                         idx -= wsize;
1379                         if (w[i] == 0)
1380                         {
1381                             idx = 0;
1382                             break;
1383                         }
1384                         if (++jwi==nwi)
1385                         {
1386                             jwi = 0;
1387                             nwi <<= 1;
1388                             wsize--;
1389                         }
1390                         i++;
1391                     }
1392                     if (idx < 0)
1393                     {
1394                         bit_offset += idx;
1395                     }
1396                     iused = i-1;
1397
1398                     for (i=1; i <= iused; i++)
1399                     {
1400                         xdd_cell_info = f_k(i, w, 512);
1401                         proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1402                                             "Cell Parameter: %d", xdd_cell_info & 0x07F);
1403                         proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1404                                             "Sync Case TSTD: %d", (xdd_cell_info >> 7) & 0x01);
1405                         proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
1406                                             "Diversity TDD: %d", (xdd_cell_info >> 8) & 0x01);
1407                     }
1408                 }
1409             }
1410             else
1411                 bit_offset += 1;
1412             value = tvb_get_bits8(tvb,bit_offset,1);
1413             bit_offset += 1;
1414         }
1415         proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
1416         break;
1417     default:
1418         break;
1419     }
1420
1421     curr_offset += length;
1422     return (curr_offset - offset);
1423 }
1424
1425 /*
1426  * [3] 10.5.2.2 Cell Description
1427  */
1428 guint16
1429 de_rr_cell_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1430 {
1431     proto_tree  *subtree;
1432     proto_item  *item;
1433     guint8      oct;
1434     guint32     curr_offset;
1435     guint16 bcch_arfcn;
1436
1437     curr_offset = offset;
1438
1439     oct = tvb_get_guint8(tvb, curr_offset);
1440     item =
1441         proto_tree_add_text(tree,
1442                             tvb, curr_offset, 2, "%s",
1443                             gsm_rr_elem_strings[DE_RR_CELL_DSC].strptr);
1444
1445     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_DSC]);
1446
1447     proto_tree_add_item(subtree, hf_gsm_a_ncc, tvb, curr_offset, 1, FALSE);
1448     proto_tree_add_item(subtree, hf_gsm_a_bcc, tvb, curr_offset, 1, FALSE);
1449     bcch_arfcn = (tvb_get_guint8(tvb,curr_offset) & 0xc0) << 2;
1450     bcch_arfcn = bcch_arfcn | tvb_get_guint8(tvb,curr_offset+1);
1451     proto_tree_add_uint(subtree, hf_gsm_a_bcch_arfcn , tvb, curr_offset, 2, bcch_arfcn );
1452
1453     curr_offset = curr_offset + 2;
1454
1455     return(curr_offset - offset);
1456 }
1457
1458 /*
1459  * [3] 10.5.2.3 Cell Options (BCCH)
1460  */
1461 static const value_string gsm_a_rr_dtx_bcch_vals[] = {
1462     { 0x00, "The MSs may use uplink discontinuous transmission" },
1463     { 0x01, "The MSs shall use uplink discontinuous transmission" },
1464     { 0x02, "The MSs shall not use uplink discontinuous transmission" },
1465     { 0x03, "Reserved" },
1466     {    0, NULL } };
1467
1468 static const value_string gsm_a_rr_radio_link_timeout_vals[] = {
1469     { 0x00, "4" },
1470     { 0x01, "8" },
1471     { 0x02, "12" },
1472     { 0x03, "16" },
1473     { 0x04, "20" },
1474     { 0x05, "24" },
1475     { 0x06, "28" },
1476     { 0x07, "32" },
1477     { 0x08, "36" },
1478     { 0x09, "40" },
1479     { 0x0A, "44" },
1480     { 0x0B, "48" },
1481     { 0x0C, "52" },
1482     { 0x0D, "56" },
1483     { 0x0E, "60" },
1484     { 0x0F, "64" },
1485     {    0, NULL } };
1486
1487 static guint16
1488 de_rr_cell_opt_bcch(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1489 {
1490     proto_tree  *subtree;
1491     proto_item  *item;
1492     guint32     curr_offset;
1493
1494     curr_offset = offset;
1495
1496     item = proto_tree_add_text(tree, tvb, curr_offset, 1, "%s",
1497                                gsm_rr_elem_strings[DE_RR_CELL_OPT_BCCH].strptr);
1498
1499     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_OPT_BCCH]);
1500
1501     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pwrc, tvb, (curr_offset<<3)+1, 1, FALSE);
1502     proto_tree_add_item(subtree, hf_gsm_a_rr_dtx_bcch, tvb, curr_offset, 1, FALSE);
1503     proto_tree_add_item(subtree, hf_gsm_a_rr_radio_link_timeout, tvb, curr_offset, 1, FALSE);
1504
1505     curr_offset = curr_offset + 1;
1506
1507     return(curr_offset - offset);
1508 }
1509
1510 /*
1511  * [3] 10.5.2.3a Cell Options (SACCH)
1512  */
1513 static const value_string gsm_a_rr_dtx_sacch_vals[] = {
1514     { 0x00, "The MS may use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
1515     { 0x01, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
1516     { 0x02, "The MS shall not use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
1517     { 0x03, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS may use uplink discontinuous transmission on TCH-H" },
1518     { 0x04, "The MS may use uplink discontinuous transmission on a TCH-F. The MS may use uplink discontinuous transmission on TCH-H" },
1519     { 0x05, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
1520     { 0x06, "The MS shall not use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
1521     { 0x07, "The MS may use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
1522     {    0, NULL } };
1523
1524 static guint16
1525 de_rr_cell_opt_sacch(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1526 {
1527     proto_tree  *subtree;
1528     proto_item  *item;
1529     guint8      oct;
1530     guint8      dtx;
1531     guint32     curr_offset;
1532
1533     curr_offset = offset;
1534
1535     oct = tvb_get_guint8(tvb, curr_offset);
1536     dtx = ((oct&0x80)>>5)|((oct&0x30)>>4); /* DTX is a split filed in bits 8, 6 and 5 */
1537     item = proto_tree_add_text(tree, tvb, curr_offset, 1, "%s",
1538                                gsm_rr_elem_strings[DE_RR_CELL_OPT_SACCH].strptr);
1539
1540     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_OPT_SACCH]);
1541
1542     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pwrc, tvb, (curr_offset<<3)+1, 1, FALSE);
1543     proto_tree_add_uint(subtree, hf_gsm_a_rr_dtx_sacch, tvb, curr_offset, 1, dtx);
1544     proto_tree_add_item(subtree, hf_gsm_a_rr_radio_link_timeout, tvb, curr_offset, 1, FALSE);
1545
1546     curr_offset = curr_offset + 1;
1547
1548     return(curr_offset - offset);
1549 }
1550
1551 /*
1552  * [3] 10.5.2.4 Cell Selection Parameters
1553  */
1554 static guint16
1555 de_rr_cell_sel_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1556 {
1557     proto_tree  *subtree;
1558     proto_item  *item;
1559     guint8      oct;
1560     guint32     curr_offset;
1561
1562     curr_offset = offset;
1563
1564     oct = tvb_get_guint8(tvb, curr_offset);
1565     item = proto_tree_add_text(tree, tvb, curr_offset, 2, "%s",
1566                                gsm_rr_elem_strings[DE_RR_CELL_SEL_PARAM].strptr);
1567
1568     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_SEL_PARAM]);
1569
1570     proto_tree_add_item(subtree, hf_gsm_a_rr_cell_reselect_hyst, tvb, curr_offset, 1, FALSE);
1571     proto_tree_add_item(subtree, hf_gsm_a_rr_ms_txpwr_max_cch, tvb, curr_offset, 1, FALSE);
1572
1573     curr_offset = curr_offset + 1;
1574
1575     proto_tree_add_item(subtree, hf_gsm_a_rr_acs, tvb, curr_offset, 1, FALSE);
1576     proto_tree_add_item(subtree, hf_gsm_a_rr_neci, tvb, curr_offset, 1, FALSE);
1577     proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_access_min, tvb, curr_offset, 1, FALSE);
1578
1579     curr_offset = curr_offset + 1;
1580
1581     return(curr_offset - offset);
1582 }
1583
1584 /*
1585  * [3] 10.5.2.4a MAC Mode and Channel Coding Requested
1586  * [3] 10.5.2.5 Channel Description
1587  */
1588 guint16
1589 de_rr_ch_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1590 {
1591     guint32     curr_offset;
1592     guint8      oct8,subchannel;
1593     guint16 arfcn, hsn, maio;
1594     proto_tree  *subtree;
1595     proto_item  *item;
1596     const gchar *str;
1597
1598     curr_offset = offset;
1599
1600     item = proto_tree_add_text(tree,tvb, curr_offset, 3, "%s", gsm_rr_elem_strings[DE_RR_CH_DSC].strptr);
1601
1602     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CH_DSC]);
1603
1604     /* Octet 2 */
1605     oct8 = tvb_get_guint8(tvb, curr_offset);
1606
1607     if ((oct8 & 0xf8) == 0x08)
1608     {
1609         str = "TCH/F + ACCHs";
1610         other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1611         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1612     }
1613     else
1614     {
1615         if ((oct8 & 0xf0) == 0x10)
1616         {
1617             str = "TCH/H + ACCHs, Subchannel";
1618             subchannel = ((oct8 & 0x08)>>3);
1619         }
1620         else if ((oct8 & 0xe0) == 0x20)
1621         {
1622             str = "SDCCH/4 + SACCH/C4 or CBCH (SDCCH/4), Subchannel";
1623             subchannel = ((oct8 & 0x18)>>3);
1624         }
1625         else if ((oct8 & 0xc0) == 0x40)
1626         {
1627             str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
1628             subchannel = ((oct8 & 0x38)>>3);
1629         } else {
1630             str = "Unknown channel information";
1631             subchannel = oct8;
1632         }
1633
1634         other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1635         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
1636     }
1637
1638     other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
1639     proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
1640
1641     curr_offset +=1;
1642
1643     /* Octet 3 */
1644     oct8 = tvb_get_guint8(tvb, curr_offset);
1645     other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
1646     proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
1647
1648
1649     if ((oct8 & 0x10) == 0x10)
1650     {
1651         /* Hopping sequence */
1652         maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
1653         hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
1654         str = "Yes";
1655
1656         other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1657         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1658         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
1659         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
1660     }
1661     else
1662     {
1663         /* single ARFCN */
1664         arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
1665         str = "No";
1666
1667         other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1668         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1669         other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
1670         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
1671         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
1672     }
1673
1674     curr_offset = curr_offset + 2;
1675
1676     return(curr_offset - offset);
1677 }
1678 /*
1679  * [3] 10.5.2.5a Channel Description 2
1680  */
1681 static guint16
1682 de_rr_ch_dsc2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1683 {
1684     guint32     curr_offset;
1685     guint8      oct8,subchannel;
1686     guint16 arfcn, hsn, maio;
1687     proto_tree  *subtree;
1688     proto_item  *item;
1689     const gchar *str;
1690
1691     curr_offset = offset;
1692
1693     item = proto_tree_add_text(tree,tvb, curr_offset, 3, "%s", gsm_rr_elem_strings[DE_RR_CH_DSC2].strptr);
1694
1695     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CH_DSC2]);
1696
1697     /* Octet 2 */
1698     oct8 = tvb_get_guint8(tvb, curr_offset);
1699
1700     if ((oct8 & 0xf8) == 0x0)
1701     {
1702         str = "TCH/F + FACCH/F and SACCH/M";
1703         other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1704         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1705     }
1706     else if ((oct8 & 0xf8) == 0x08)
1707     {
1708         str = "TCH/F + FACCH/F and SACCH/F";
1709         other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1710         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
1711     }
1712     else if ((oct8 & 0xf8) == 0xf0)
1713     {
1714         str = "TCH/F + FACCH/F and SACCH/M + bi- and unidirectional channels";
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);
1717     }
1718     else
1719     {
1720         if ((oct8 & 0xf0) == 0x10)
1721         {
1722             str = "TCH/H + ACCHs, Subchannel";
1723             subchannel = ((oct8 & 0x08)>>3);
1724         }
1725         else if ((oct8 & 0xe0) == 0x20)
1726         {
1727             str = "SDCCH/4 + SACCH/C4 or CBCH (SDCCH/4), Subchannel";
1728             subchannel = ((oct8 & 0x18)>>3);
1729         }
1730         else if ((oct8 & 0xc0) == 0x40)
1731         {
1732             str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
1733             subchannel = ((oct8 % 0x38)>>3);
1734         }
1735         else if ((oct8 & 0xc0) == 0x80)
1736         {
1737             str = "TCH/F + FACCH/F and SACCH/M + bidirectional channels at timeslot";
1738             subchannel = ((oct8 % 0x38)>>3);
1739         }
1740         else if ((oct8 & 0xe0) == 0xc0)
1741         {
1742             str = "TCH/F + FACCH/F and SACCH/M + unidirectional channels at timeslot";
1743             subchannel = ((oct8 % 0x38)>>3);
1744         } else {
1745             str = "Unknown channel information";
1746             subchannel = oct8;
1747         }
1748         other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
1749         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
1750     }
1751
1752     other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
1753     proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
1754
1755     curr_offset +=1;
1756
1757     /* Octet 3 */
1758     oct8 = tvb_get_guint8(tvb, curr_offset);
1759     other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
1760     proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
1761
1762     if ((oct8 & 0x10) == 0x10)
1763     {
1764         /* Hopping sequence */
1765         maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
1766         hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
1767         str = "Yes";
1768
1769         other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1770         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1771         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
1772         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
1773     }
1774     else
1775     {
1776         /* single ARFCN */
1777         arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
1778         str = "No";
1779
1780         other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1781         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1782         other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
1783         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
1784         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
1785     }
1786
1787     curr_offset = curr_offset + 2;
1788
1789     return(curr_offset - offset);
1790 }
1791
1792 /*
1793  * [3] 10.5.2.5c Channel Description 3
1794  */
1795 static guint16
1796 de_rr_ch_dsc3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1797 {
1798     guint32     curr_offset;
1799     guint8      oct8;
1800     guint16 arfcn, hsn, maio;
1801     proto_tree  *subtree;
1802     proto_item  *item;
1803     const gchar *str;
1804
1805     curr_offset = offset;
1806
1807     item = proto_tree_add_text(tree,tvb, curr_offset, 3, "%s", gsm_rr_elem_strings[DE_RR_CH_DSC3].strptr);
1808
1809     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CH_DSC3]);
1810
1811     /* Octet 2 */
1812     oct8 = tvb_get_guint8(tvb, curr_offset);
1813     other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
1814     proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
1815
1816     if ((oct8 & 0x10) == 0x10)
1817     {
1818         /* Hopping sequence */
1819         maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
1820         hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
1821         str = "Yes";
1822
1823         other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1824         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1825         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
1826         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
1827     }
1828     else
1829     {
1830         /* single ARFCN */
1831         arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
1832         str = "No";
1833
1834         other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
1835         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
1836         other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
1837         proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
1838         proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
1839     }
1840
1841     curr_offset = curr_offset + 2;
1842
1843     return(curr_offset - offset);
1844 }
1845
1846 /*
1847  * [3] 10.5.2.6 Channel Mode
1848  */
1849 /* Channel Mode  */
1850 static const value_string gsm_a_rr_channel_mode_vals[] = {
1851     { 0x00, "signalling only"},
1852     { 0x01, "speech full rate or half rate version 1(GSM FR or GSM HR)"},
1853     { 0x21, "speech full rate or half rate version 2(GSM EFR)"},
1854     { 0x41, "speech full rate or half rate version 3(FR AMR or HR AMR)"},
1855     { 0x81, "speech full rate or half rate version 4(OFR AMR-WB or OHR AMR-WB)"},
1856     { 0x82, "speech full rate or half rate version 5(FR AMR-WB )"},
1857     { 0x83, "speech full rate or half rate version 6(OHR AMR )"},
1858     { 0x61, "data, 43.5 kbit/s (downlink)+14.5 kbps (uplink)"},
1859     { 0x62, "data, 29.0 kbit/s (downlink)+14.5 kbps (uplink)"},
1860     { 0x64, "data, 43.5 kbit/s (downlink)+29.0 kbps (uplink)"},
1861     { 0x67, "data, 14.5 kbit/s (downlink)+43.5 kbps (uplink)"},
1862     { 0x65, "data, 14.5 kbit/s (downlink)+29.0 kbps (uplink)"},
1863     { 0x66, "data, 29.0 kbit/s (downlink)+43.5 kbps (uplink)"},
1864     { 0x27, "data, 43.5 kbit/s radio interface rate"},
1865     { 0x63, "data, 32.0 kbit/s radio interface rate"},
1866     { 0x43, "data, 29.0 kbit/s radio interface rate"},
1867     { 0x0f, "data, 14.5 kbit/s radio interface rate"},
1868     { 0x03, "data, 12.0 kbit/s radio interface rate"},
1869     { 0x0b, "data, 6.0 kbit/s radio interface rate"},
1870     { 0x13, "data, 3.6 kbit/s radio interface rate"},
1871     {    0, NULL }
1872 };
1873
1874 guint16
1875 de_rr_ch_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1876 {
1877     guint32     curr_offset;
1878
1879     curr_offset = offset;
1880
1881     proto_tree_add_item(tree, hf_gsm_a_rr_channel_mode, tvb, curr_offset, 1, FALSE);
1882
1883     curr_offset = curr_offset + 1;
1884
1885     return(curr_offset - offset);
1886 }
1887 /*
1888  * [3] 10.5.2.7 Channel Mode 2
1889  */
1890
1891 static const value_string gsm_a_rr_channel_mode2_vals[] = {
1892     { 0x00, "signalling only"},
1893     { 0x05, "speech half rate version 1(GSM HR)"},
1894     { 0x25, "speech half rate version 2(GSM EFR)"},
1895     { 0x45, "speech half rate version 3(HR AMR)"},
1896     { 0x85, "speech half rate version 4(OHR AMR-WB)"},
1897     { 0x06, "speech half rate version 6(OHR AMR )"},
1898     { 0x0f, "data, 6.0 kbit/s radio interface rate"},
1899     { 0x17, "data, 3.6 kbit/s radio interface rate"},
1900     {    0, NULL }
1901 };
1902
1903 static guint16
1904 de_rr_ch_mode2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1905 {
1906     guint32     curr_offset;
1907
1908     curr_offset = offset;
1909
1910     proto_tree_add_item(tree, hf_gsm_a_rr_channel_mode2, tvb, curr_offset, 1, FALSE);
1911
1912     curr_offset = curr_offset + 1;
1913
1914     return(curr_offset - offset);
1915 }
1916 /*
1917  * [3] 10.5.2.7a UTRAN Classmark information element
1918  */
1919 static guint16
1920 de_rr_utran_cm(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1921 {
1922     guint32 curr_offset;
1923     tvbuff_t *rrc_irat_ho_info_tvb;
1924
1925     curr_offset = offset;
1926     if (len)
1927     {
1928         rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
1929         if (rrc_irat_ho_info_handle && gsm_a_dtap_pinfo)
1930                         /* gsm_a_dtap_pinfo MUST be set by any dissector calling de_rr_utran_cm */
1931             call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, gsm_a_dtap_pinfo, tree);
1932     }
1933
1934     curr_offset += len;
1935     return(curr_offset - offset);
1936 }
1937
1938 /*
1939  * [3] 10.5.2.7b (void)
1940  */
1941
1942 /*
1943  * [3] 10.5.2.7c Classmark Enquiry Mask
1944  * Bit 8:
1945  * 0    CLASSMARK CHANGE message is requested
1946  * 1    CLASSMARK CHANGE message is not requested
1947  * Bits 7-5 . 5
1948  * 000  UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is requested
1949  * 111  UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is not requested.
1950  * All other values shall not be sent. If received, they shall be interpreted as '000'.
1951  * Bit 4:
1952  * 0    CDMA2000 CLASSMARK CHANGE message requested
1953  * 1    CDMA2000 CLASSMARK CHANGE message not requested.
1954  * Bit 3:
1955  * 0    GERAN IU MODE CLASSMARK CHANGE message requested
1956  * 1    GERAN IU MODE CLASSMARK CHANGE message not requested.
1957  * Bits 2 - 1: spare(0).
1958  */
1959 static const true_false_string gsm_a_msg_req_value  = {
1960     "message is not requested",
1961     "message is requested"
1962 };
1963
1964 static const value_string gsm_a_rr_utran_cm_cng_msg_req_vals[] = {
1965     { 0x0, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1966     { 0x1, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1967     { 0x2, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1968     { 0x3, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1969     { 0x4, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1970     { 0x5, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1971     { 0x6, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
1972     { 0x7, "message including status on predefined configurations (i.e. Sequence Description) is not requested."},
1973     {   0, NULL }
1974 };
1975 guint16
1976 de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
1977 {
1978     guint32     curr_offset;
1979
1980     curr_offset = offset;
1981
1982     proto_tree_add_item(tree, hf_gsm_a_rr_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
1983     proto_tree_add_item(tree, hf_gsm_a_rr_utran_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
1984     proto_tree_add_item(tree, hf_gsm_a_rr_cdma200_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
1985     proto_tree_add_item(tree, hf_gsm_a_rr_geran_iu_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
1986
1987     curr_offset = curr_offset + 1;
1988
1989     return(curr_offset - offset);
1990 }
1991 /*
1992  * [3] 10.5.2.8 Channel Needed
1993  */
1994 static const value_string gsm_a_rr_channel_needed_vals[] = {
1995     { 0x00, "Any channel"},
1996     { 0x01, "SDCCH"},
1997     { 0x02, "TCH/F (Full rate)"},
1998     { 0x03, "TCH/H or TCH/F (Dual rate)"},
1999     {    0, NULL }
2000 };
2001 guint16
2002 de_rr_chnl_needed(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2003 {
2004     proto_tree  *subtree;
2005     proto_item  *item;
2006     guint32     curr_offset;
2007     gint bit_offset;
2008
2009     curr_offset = offset;
2010     if (UPPER_NIBBLE==len)
2011         bit_offset = 4;
2012     else
2013         bit_offset = 0;
2014
2015     item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
2016                                gsm_rr_elem_strings[DE_RR_CHNL_NEEDED].strptr);
2017
2018     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CHNL_NEEDED]);
2019
2020     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch1, tvb, (curr_offset<<3)+bit_offset+2, 2, FALSE);
2021     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch2, tvb, (curr_offset<<3)+bit_offset, 2, FALSE);
2022
2023     curr_offset = curr_offset + 1;
2024
2025     return(curr_offset - offset);
2026 }
2027 /*
2028  * [3] 10.5.2.8a Channel Request Description
2029  * [3] 10.5.2.8b Channel Request Description 2
2030  */
2031 /*
2032  * [3] 10.5.2.9 Cipher Mode Setting
2033  */
2034 /* SC (octet 1) */
2035 static const value_string gsm_a_rr_sc_vals[] = {
2036     { 0, "No ciphering"},
2037     { 1, "Start ciphering"},
2038     { 0, NULL }
2039 };
2040 /* algorithm identifier
2041  * If SC=1 then:
2042  * bits
2043  * 4 3 2
2044  */
2045 guint16
2046 de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2047 {
2048     guint32     curr_offset;
2049     gint bit_offset;
2050     guint64 value;
2051
2052     curr_offset = offset;
2053
2054     /* Cipher Mode Setting
2055      * Note: The coding of fields SC and algorithm identifier is defined in [44.018]
2056      * as part of the Cipher Mode Setting IE.
2057      */
2058     if (UPPER_NIBBLE==len)
2059         bit_offset = 4;
2060     else
2061         bit_offset = 0;
2062
2063     proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_sc, tvb, (curr_offset<<3)+bit_offset+3, 1, &value, FALSE);
2064     if (value == 1){ /* Start ciphering */
2065         /* algorithm identifier */
2066         proto_tree_add_bits_item(tree, hf_gsm_a_algorithm_id, tvb, (curr_offset<<3)+bit_offset, 3, FALSE);
2067     }
2068     curr_offset = curr_offset + 1;
2069
2070     return(curr_offset - offset);
2071 }
2072 /*
2073  * [3] 10.5.2.10 Cipher Response
2074  */
2075 /* CR (octet 1) */
2076 static const value_string gsm_a_rr_cr_vals[] = {
2077     { 0, "IMEISV shall not be included"},
2078     { 1, "IMEISV shall be included"},
2079     { 0, NULL }
2080 };
2081
2082 static guint16
2083 de_rr_cip_mode_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2084 {
2085     guint32     curr_offset;
2086     gint bit_offset;
2087
2088     curr_offset = offset;
2089     if (UPPER_NIBBLE==len)
2090         bit_offset = 4;
2091     else
2092         bit_offset = 0;
2093
2094     /* Cipher Mode Response
2095      * Note: The coding of field CR is defined in [44.018]
2096      * as part of the Cipher Mode Response IE.
2097      */
2098     proto_tree_add_bits_item(tree, hf_gsm_a_rr_cr, tvb, (curr_offset<<3)+bit_offset+3, 1, FALSE);
2099     curr_offset = curr_offset + 1;
2100
2101     return(curr_offset - offset);
2102 }
2103 /* [3] 10.5.2.11 Control Channel Description */
2104
2105 static const value_string gsm_a_rr_mscr_vals[] = {
2106     { 0, "MSC is Release '98 or older"},
2107     { 1, "MSC is Release '99 onwards"},
2108     { 0, NULL }
2109 };
2110
2111 static const value_string gsm_a_rr_att_vals[] = {
2112     { 0, "MSs in the cell are not allowed to apply IMSI attach and detach procedure"},
2113     { 1, "MSs in the cell shall apply IMSI attach and detach procedure"},
2114     { 0, NULL }
2115 };
2116
2117 static const value_string gsm_a_rr_ccch_conf_vals[] = {
2118     { 0, "1 basic physical channel used for CCCH, not combined with SDCCHs"},
2119     { 1, "1 basic physical channel used for CCCH, combined with SDCCHs"},
2120     { 2, "2 basic physical channels used for CCCH, not combined with SDCCHs"},
2121     { 3, "Reserved"},
2122     { 4, "3 basic physical channels used for CCCH, not combined with SDCCHs"},
2123     { 5, "Reserved"},
2124     { 6, "4 basic physical channels used for CCCH, not combined with SDCCHs"},
2125     { 7, "Reserved"},
2126     { 0, NULL }
2127 };
2128
2129 static const value_string gsm_a_rr_cbq3_vals[] = {
2130     { 0, "Iu mode not supported"},
2131     { 1, "Iu mode capable MSs barred"},
2132     { 2, "Iu mode supported, cell not barred"},
2133     { 3, "Iu mode supported, cell not barred"},
2134     { 0, NULL }
2135 };
2136
2137 static guint16
2138 de_rr_ctrl_ch_desc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2139 {
2140     proto_tree  *subtree;
2141     proto_item  *item;
2142     guint8      oct;
2143     guint32     curr_offset;
2144
2145     curr_offset = offset;
2146
2147     item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
2148                                gsm_rr_elem_strings[DE_RR_CTRL_CH_DESC].strptr);
2149
2150     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CTRL_CH_DESC]);
2151
2152     proto_tree_add_item(subtree, hf_gsm_a_rr_mscr, tvb, curr_offset, 1, FALSE);
2153     proto_tree_add_item(subtree, hf_gsm_a_rr_att, tvb, curr_offset, 1, FALSE);
2154     proto_tree_add_item(subtree, hf_gsm_a_rr_bs_ag_blks_res, tvb, curr_offset, 1, FALSE);
2155     proto_tree_add_item(subtree, hf_gsm_a_rr_ccch_conf, tvb, curr_offset, 1, FALSE);
2156
2157     curr_offset = curr_offset + 1;
2158     oct = tvb_get_guint8(tvb, curr_offset);
2159
2160     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq3, tvb, (curr_offset<<3)+1, 2, FALSE);
2161     proto_tree_add_uint(subtree, hf_gsm_a_rr_bs_pa_mfrms, tvb, curr_offset, 1, (oct&0x07)+2);
2162
2163     curr_offset = curr_offset + 1;
2164
2165     proto_tree_add_item(subtree, hf_gsm_a_rr_t3212, tvb, curr_offset, 1, FALSE);
2166
2167     curr_offset = curr_offset + 1;
2168
2169     return(curr_offset - offset);
2170 }
2171
2172 /* [3] 10.5.2.11a DTM Information Details
2173  */
2174 /*
2175  * [3]  10.5.2.11b      Dynamic ARFCN Mapping
2176  */
2177 static const value_string gsm_a_rr_gsm_band_vals[] = {
2178     {  0, "GSM 750"},
2179     {  1, "DCS 1800"},
2180     {  2, "PCS 1900"},
2181     {  3, "GSM T 380"},
2182     {  4, "GSM T 410"},
2183     {  5, "GSM T 900"},
2184     {  6, "GSM 710"},
2185     {  7, "GSM T 810"},
2186     {  8, "Reserved"},
2187     {  9, "Reserved"},
2188     { 10, "Reserved"},
2189     { 11, "Reserved"},
2190     { 12, "Reserved"},
2191     { 13, "Reserved"},
2192     { 14, "Reserved"},
2193     { 15, "Reserved"},
2194     {  0, NULL }
2195 };
2196
2197
2198 static guint16
2199 de_rr_dyn_arfcn_map(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2200 {
2201     guint32     curr_offset;
2202     gint bit_offset;
2203     guint64 length;
2204     guint value;
2205
2206     curr_offset = offset;
2207     bit_offset = curr_offset << 3;
2208
2209     proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_dyn_arfcn_length, tvb, bit_offset, 8, &length, FALSE);
2210     value = tvb_get_bits8(tvb,bit_offset,1);
2211     bit_offset += 1;
2212     while (value && length)
2213     {
2214         proto_tree_add_bits_item(tree, hf_gsm_a_rr_gsm_band, tvb, bit_offset, 4, FALSE);
2215         bit_offset += 4;
2216         proto_tree_add_bits_item(tree, hf_gsm_a_rr_arfcn_first, tvb, bit_offset, 10, FALSE);
2217         bit_offset += 10;
2218         proto_tree_add_bits_item(tree, hf_gsm_a_rr_band_offset, tvb, bit_offset, 10, FALSE);
2219         bit_offset += 10;
2220         proto_tree_add_bits_item(tree, hf_gsm_a_rr_arfcn_range, tvb, bit_offset, 7, FALSE);
2221         bit_offset += 7;
2222         value = tvb_get_bits8(tvb,bit_offset,1);
2223         bit_offset += 1;
2224         length -= 4;
2225     }
2226
2227     curr_offset = curr_offset + len;
2228
2229     return(curr_offset - offset);
2230 }
2231 /*
2232  * [3] 10.5.2.12 Frequency Channel Sequence
2233  */
2234 static guint16
2235 de_rr_freq_ch_seq(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2236 {
2237     guint32     curr_offset;
2238     gint bit_offset, i;
2239
2240     curr_offset = offset;
2241
2242     proto_tree_add_item(tree, hf_gsm_a_rr_lowest_arfcn, tvb, curr_offset, 1, FALSE);
2243     curr_offset += 1;
2244     bit_offset = curr_offset << 3;
2245     for (i=0; i<16; i++)
2246     {
2247         proto_tree_add_bits_item(tree, hf_gsm_a_rr_inc_skip_arfcn, tvb, bit_offset, 4, FALSE);
2248         bit_offset += 4;
2249     }
2250
2251     curr_offset = curr_offset + 8;
2252
2253     return(curr_offset - offset);
2254 }
2255
2256 /*
2257  * [3] 10.5.2.13 Frequency List
2258  */
2259 /*
2260  * [3] 10.5.2.13 Frequency List
2261  *
2262  * Bit Bit Bit Bit Bit format notation
2263  * 8 7  4 3 2
2264  * 0 0  X X X bit map 0
2265  * 1 0  0 X X 1024 range
2266  * 1 0  1 0 0 512 range
2267  * 1 0  1 0 1 256 range
2268  * 1 0  1 1 0 128 range
2269  * 1 0  1 1 1 variable bit map
2270  */
2271 /* The mask 0xce (1100 1110) will produce the result 0110 0111*/
2272 static const value_string gsm_a_rr_freq_list_format_id_vals[] = {
2273     { 0x00, "bit map 0"},
2274     { 0x02, "bit map 0"},
2275     { 0x04, "bit map 0"},
2276     { 0x06, "bit map 0"},
2277     { 0x08, "bit map 0"},
2278     { 0x0a, "bit map 0"},
2279     { 0x0c, "bit map 0"},
2280     { 0x0e, "bit map 0"},
2281     { 0x40, "1024 range"},
2282     { 0x41, "1024 range"},
2283     { 0x42, "1024 range"},
2284     { 0x43, "1024 range"},
2285     { 0x44, "512 range"},
2286     { 0x45, "256 range"},
2287     { 0x46, "128 range"},
2288     { 0x47, "variable bit map"},
2289     { 0x00, NULL }
2290 };
2291
2292 static guint16
2293 de_rr_freq_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2294 {
2295     return dissect_arfcn_list(tvb, tree, offset, len, add_string, string_len);
2296 }
2297 /*
2298  * [3] 10.5.2.14 Frequency Short List
2299  *
2300  *The Frequency Short List information element is a type 3 information element of 10 octet length.
2301  *
2302  * This element is encoded exactly as the Frequency List information element,
2303  * except that it has a fixed length instead of a variable length and does
2304  * not contain a length indicator and that it shall not be encoded in bitmap 0 format.
2305  */
2306
2307  static guint16
2308 de_rr_freq_short_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2309  {
2310      return dissect_arfcn_list(tvb, tree, offset, 9, add_string, string_len);
2311  }
2312
2313 /*
2314  * [3] 10.5.2.14a Frequency Short List 2
2315  *
2316  * The Frequency Short List information element is a type 3 information element of 8 octet length.
2317  *
2318  * This element is encoded exactly as the Frequency List information element,
2319  * except that it has a fixed length instead of a variable length and does
2320  * not contain a length indicator and that it shall not be encoded in bitmap 0 format.
2321  */
2322 static guint16
2323 de_rr_freq_short_list2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2324 {
2325     return dissect_arfcn_list(tvb, tree, offset, 8, add_string, string_len);
2326 }
2327 /*
2328  * [3] 10.5.2.14b Group Channel Description
2329  */
2330
2331 /*
2332  * [3] 10.5.2.14c GPRS Resumption
2333  */
2334 static const true_false_string gsm_a_rr_gprs_resumption_ack_value  = {
2335     "Resumption of GPRS services successfully acknowledged",
2336     "Resumption of GPRS services not successfully acknowledged"
2337 };
2338
2339 static guint16
2340 de_rr_gprs_resumption(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2341 {
2342     guint32 curr_offset;
2343
2344     curr_offset = offset;
2345
2346     proto_tree_add_item(tree, hf_gsm_a_rr_gprs_resumption_ack, tvb, curr_offset, 1, FALSE);
2347     curr_offset += 1;
2348
2349     return (curr_offset - offset);
2350 }
2351
2352 /*
2353  * [3] 10.5.2.14d GPRS broadcast information
2354  */
2355
2356 static gint
2357 de_rr_rest_oct_gprs_cell_options(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
2358 {
2359     proto_tree *subtree, *subtree2;
2360     proto_item *item, *item2;
2361     gint curr_bit_offset, curr_bit_offset_sav;
2362     guint8 value;
2363
2364     curr_bit_offset = bit_offset;
2365
2366     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);
2367     subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS]);
2368     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nmo, tvb, curr_bit_offset, 2, FALSE);
2369     curr_bit_offset += 2;
2370     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3168, tvb, curr_bit_offset, 3, FALSE);
2371     curr_bit_offset += 3;
2372     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3192, tvb, curr_bit_offset, 3, FALSE);
2373     curr_bit_offset += 3;
2374     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_drx_timer_max, tvb, curr_bit_offset, 3, FALSE);
2375     curr_bit_offset += 3;
2376     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_access_burst_type, tvb, curr_bit_offset, 1, FALSE);
2377     curr_bit_offset += 1;
2378     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_control_ack_type, tvb, curr_bit_offset, 1, FALSE);
2379     curr_bit_offset += 1;
2380     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bs_cv_max, tvb, curr_bit_offset, 4, FALSE);
2381     curr_bit_offset += 4;
2382     if (tvb_get_bits8(tvb,curr_bit_offset,1))
2383     {
2384         curr_bit_offset += 1;
2385         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_dec, tvb, curr_bit_offset, 3, FALSE);
2386         curr_bit_offset += 3;
2387         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_inc, tvb, curr_bit_offset, 3, FALSE);
2388         curr_bit_offset += 3;
2389         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_max, tvb, curr_bit_offset, 3, FALSE);
2390         curr_bit_offset += 3;
2391     }
2392     else
2393         curr_bit_offset += 1;
2394     if (tvb_get_bits8(tvb,curr_bit_offset,1))
2395     { /* Optional extension information */
2396         curr_bit_offset += 1;
2397         curr_bit_offset_sav = curr_bit_offset;
2398         item2 = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, -1, "%s",
2399                                     gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO].strptr);
2400         subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO]);
2401         value = tvb_get_bits8(tvb,curr_bit_offset,6);
2402         proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 1, "Extension Length: %d", value);
2403         curr_bit_offset += 6;
2404         value += 1;
2405         proto_item_set_len(item2,((curr_bit_offset+value-curr_bit_offset_sav)>>3)+1);
2406         if (tvb_get_bits8(tvb,curr_bit_offset,1))
2407         {
2408             curr_bit_offset += 1;
2409             proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_egprs_packet_channel_request, tvb, curr_bit_offset, 1, FALSE);
2410             curr_bit_offset += 1;
2411             proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bep_period, tvb, curr_bit_offset, 4, FALSE);
2412             curr_bit_offset += 4;
2413             value -= 5;
2414         }
2415         else
2416             curr_bit_offset += 1;
2417         value -= 1;
2418         proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pfc_feature_mode, tvb, curr_bit_offset, 1, FALSE);
2419         curr_bit_offset += 1;
2420         proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dtm_support, tvb, curr_bit_offset, 1, FALSE);
2421         curr_bit_offset += 1;
2422         proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bss_paging_coordination, tvb, curr_bit_offset, 1, FALSE);
2423         curr_bit_offset += 1;
2424         value -= 3;
2425         if (value > 0)
2426         { /* Rel 4 extension */
2427             proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_ccn_active, tvb, curr_bit_offset, 1, FALSE);
2428             curr_bit_offset += 1;
2429             proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nw_ext_utbf, tvb, curr_bit_offset, 1, FALSE);
2430             curr_bit_offset += 1;
2431             value -= 2;
2432             if (value > 0)
2433             { /* Rel 6 extension */
2434                 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_multiple_tbf_capability, tvb, curr_bit_offset, 1, FALSE);
2435                 curr_bit_offset += 1;
2436                 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_ext_utbf_no_data, tvb, curr_bit_offset, 1, FALSE);
2437                 curr_bit_offset += 1;
2438                 proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dtm_enhancements_capability, tvb, curr_bit_offset, 1, FALSE);
2439                 curr_bit_offset += 1;
2440                 value -= 3;
2441                 if (tvb_get_bits8(tvb,curr_bit_offset,1))
2442                 {
2443                     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dedicated_mode_mbms_notification_support, tvb, bit_offset, 1, FALSE);
2444                     bit_offset += 1;
2445                     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mnci_support, tvb, bit_offset, 1, FALSE);
2446                     bit_offset += 1;
2447                     value -= 2;
2448                 }
2449                 else
2450                     bit_offset += 1;
2451                 value -= 1;
2452                 if (value > 0)
2453                 { /* Rel 7 extension */
2454                     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reduced_latency_access, tvb, bit_offset, 1, FALSE);
2455                     bit_offset += 1;
2456                     value -= 1;
2457                 }
2458             }
2459         }
2460         curr_bit_offset += value;
2461     }
2462     else
2463         curr_bit_offset += 1;
2464     proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
2465
2466     return (curr_bit_offset - bit_offset);
2467 }
2468
2469 static gint
2470 de_rr_rest_oct_gprs_power_control_parameters(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
2471 {
2472     proto_tree *subtree;
2473     proto_item *item;
2474     gint curr_bit_offset;
2475
2476     curr_bit_offset = bit_offset;
2477
2478     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);
2479     subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS]);
2480     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, FALSE);
2481     curr_bit_offset += 4;
2482     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_w, tvb, curr_bit_offset, 5, FALSE);
2483     curr_bit_offset += 5;
2484     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_t, tvb, curr_bit_offset, 5, FALSE);
2485     curr_bit_offset += 5;
2486     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pc_meas_chan, tvb, curr_bit_offset, 1, FALSE);
2487     curr_bit_offset += 1;
2488     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_n_avg_i, tvb, curr_bit_offset, 4, FALSE);
2489     curr_bit_offset += 4;
2490     proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
2491
2492     return (curr_bit_offset - bit_offset);
2493 }
2494
2495 static guint16
2496 de_rr_gprs_broadcast_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len , gchar *add_string _U_, int string_len _U_)
2497 {
2498     guint32 curr_offset;
2499     gint bit_offset;
2500
2501     curr_offset = offset;
2502     bit_offset = curr_offset << 3;
2503
2504     bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, tree, bit_offset);
2505     bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, tree, bit_offset);
2506     curr_offset += len;
2507
2508     return (curr_offset - offset);
2509 }
2510
2511 /*
2512  * [3] 10.5.2.15 Handover Reference
2513  */
2514 static guint16
2515 de_rr_ho_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2516 {
2517     proto_tree  *subtree;
2518     proto_item  *item;
2519     guint32     curr_offset;
2520
2521     curr_offset = offset;
2522
2523     item =
2524         proto_tree_add_text(tree,
2525                             tvb, curr_offset, 1, "%s",
2526                             gsm_rr_elem_strings[DE_RR_HO_REF].strptr);
2527
2528     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_HO_REF]);
2529
2530     /* Handover reference value */
2531     proto_tree_add_item(subtree, hf_gsm_a_rr_ho_ref_val, tvb, curr_offset, 1, FALSE);
2532
2533     curr_offset = curr_offset + 1;
2534
2535     return(curr_offset - offset);
2536 }
2537 /*
2538  * [3] 10.5.2.16 IA Rest Octets
2539  */
2540
2541 static guint16
2542 de_rr_ia_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2543 {
2544     proto_tree  *subtree;
2545     proto_item  *item;
2546     guint32     curr_offset;
2547
2548     len = tvb_length_remaining(tvb,offset);
2549     if (len==0)
2550         return 0;
2551
2552     curr_offset = offset;
2553
2554     item =
2555         proto_tree_add_text(tree,
2556                             tvb, curr_offset, len, "%s",
2557                             gsm_rr_elem_strings[DE_RR_IA_REST_OCT].strptr);
2558
2559     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_IA_REST_OCT]);
2560
2561     proto_tree_add_text(subtree,tvb, curr_offset, len ,"Data(Not decoded)");
2562
2563     curr_offset = curr_offset + len;
2564
2565     return curr_offset-offset;
2566 }
2567
2568 /*
2569  * [3] 10.5.2.17 IAR Rest Octets
2570  */
2571
2572 static guint16
2573 de_rr_iar_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2574 {
2575     proto_tree  *subtree;
2576     proto_item  *item;
2577     guint32     curr_offset;
2578
2579     len = 3;
2580     curr_offset = offset;
2581
2582     item =
2583         proto_tree_add_text(tree,
2584                             tvb, curr_offset, 3, "%s",
2585                             gsm_rr_elem_strings[DE_RR_IAR_REST_OCT].strptr);
2586
2587     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_IAR_REST_OCT]);
2588
2589     proto_tree_add_text(subtree,tvb, curr_offset, len ,"Data(Not decoded)");
2590
2591     curr_offset = curr_offset + len;
2592
2593     return curr_offset-offset;
2594 }
2595
2596 /*
2597  * [3] 10.5.2.18 IAX Rest Octets
2598  */
2599 static guint16
2600 de_rr_iax_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2601 {
2602     proto_tree  *subtree;
2603     proto_item  *item;
2604     guint32     curr_offset;
2605
2606     len = tvb_length_remaining(tvb,offset);
2607     if (len==0)
2608         return 0;
2609
2610     curr_offset = offset;
2611
2612     item =
2613         proto_tree_add_text(tree,
2614                             tvb, curr_offset, len, "%s",
2615                             gsm_rr_elem_strings[DE_RR_IAX_REST_OCT].strptr);
2616
2617     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_IAX_REST_OCT]);
2618
2619     proto_tree_add_text(subtree,tvb, curr_offset, len ,"Data(Not decoded)");
2620
2621     curr_offset = curr_offset + len;
2622
2623     return curr_offset-offset;
2624 }
2625
2626 /*
2627  * [3] 10.5.2.19 L2 Pseudo Length
2628  */
2629 static guint16
2630 de_rr_l2_pseudo_len(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2631 {
2632     proto_tree  *subtree;
2633     proto_item  *item;
2634     guint32     curr_offset;
2635
2636     curr_offset = offset;
2637
2638     item = proto_tree_add_text(tree,tvb, curr_offset, 1, "%s", gsm_rr_elem_strings[DE_RR_L2_PSEUDO_LEN].strptr);
2639
2640     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_L2_PSEUDO_LEN]);
2641
2642     /* L2 Pseudo Length value */
2643     proto_tree_add_item(subtree, hf_gsm_a_rr_L2_pseudo_len, tvb, curr_offset, 1, FALSE);
2644
2645     curr_offset = curr_offset + 1;
2646
2647     return(curr_offset - offset);
2648 }
2649
2650 /*
2651  * [3] 10.5.2.20 Measurement Results
2652  */
2653 static const true_false_string gsm_a_rr_dtx_vals  = {
2654     "DTX was used",
2655     "DTX was not used"
2656 };
2657
2658
2659 static const true_false_string gsm_a_rr_mv_vals  = {
2660     "The measurement results are not valid",
2661     "The measurement results are valid"
2662 };
2663
2664 static const value_string gsm_a_rr_rxqual_vals [] = {
2665     {0, "BER < 0.2%, Mean value 0.14%"},
2666     {1, "0.2% <= BER < 0.4%, Mean value 0.28%"},
2667     {2, "0.4% <= BER < 0.8%, Mean value 0.57%"},
2668     {3, "0.8% <= BER < 1.6%, Mean value 1.13%"},
2669     {4, "1.6% <= BER < 3.2%, Mean value 2.26%"},
2670     {5, "3.2% <= BER < 6.4%, Mean value 4.53%"},
2671     {6, "6.4% <= BER < 12.8%, Mean value 9.05%"},
2672     {7, "BER > 12.8%, Mean value 18.10%"},
2673     {0, NULL}
2674 };
2675
2676 static const value_string gsm_a_rr_ncell_vals [] = {
2677     {0, "No neighbour cell measurement result"},
2678     {1, "1 neighbour cell measurement result"},
2679     {2, "2 neighbour cell measurement result"},
2680     {3, "3 neighbour cell measurement result"},
2681     {4, "4 neighbour cell measurement result"},
2682     {5, "5 neighbour cell measurement result"},
2683     {6, "6 neighbour cell measurement result"},
2684     {7, "Neighbour cell information not available for serving cell"},
2685     {0, NULL}
2686 };
2687
2688 guint16
2689 de_rr_meas_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2690 {
2691     proto_tree  *subtree;
2692     proto_item  *item;
2693     guint32     curr_offset;
2694     gint bit_offset;
2695     guint64 no_ncell_m;
2696
2697     curr_offset = offset;
2698
2699     item =
2700         proto_tree_add_text(tree,
2701                             tvb, curr_offset, 16, "%s",
2702                             gsm_rr_elem_strings[DE_RR_MEAS_RES].strptr);
2703     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_MEAS_RES]);
2704
2705     /* 2nd octet */
2706     /* BA-USED */
2707     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ba_used, tvb, curr_offset<<3, 1, FALSE);
2708     /* DTX USED */
2709     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dtx_used, tvb, (curr_offset<<3)+1, 1, FALSE);
2710     /* RXLEV-FULL-SERVING-CELL */
2711     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_full_serv_cell, tvb, (curr_offset<<3)+2, 6, FALSE);
2712     curr_offset++;
2713
2714     /* 3rd octet */
2715     /* 3G-BA-USED */
2716     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ba_used, tvb, curr_offset<<3, 1, FALSE);
2717     /* MEAS-VALID */
2718     proto_tree_add_item(subtree, hf_gsm_a_rr_meas_valid, tvb, curr_offset, 1, FALSE);
2719     /* RXLEV-SUB-SERVING-CELL */
2720     proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_sub_serv_cell, tvb, curr_offset, 1, FALSE);
2721
2722     curr_offset++;
2723
2724     /* 4th octet */
2725     /* RXQUAL-FULL-SERVING-CELL */
2726     proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxqual_full_serv_cell, tvb, (curr_offset<<3)+1, 3, FALSE);
2727
2728     /* RXQUAL-SUB-SERVING-CELL */
2729     proto_tree_add_item(subtree, hf_gsm_a_rr_rxqual_sub_serv_cell, tvb, curr_offset, 1, FALSE);
2730     /* NO-NCELL-M */
2731     bit_offset = (curr_offset << 3) + 7;
2732     proto_tree_add_bits_ret_val(subtree, hf_gsm_a_rr_no_ncell_m, tvb, bit_offset, 3, &no_ncell_m, FALSE);
2733     bit_offset += 3;
2734     if (no_ncell_m == 7) /* No neighbour cell information available) */
2735         no_ncell_m = 0;
2736     while (no_ncell_m)
2737     {
2738         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_ncell, tvb, bit_offset, 6, FALSE);
2739         bit_offset += 6;
2740         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_freq_ncell, tvb, bit_offset, 5, FALSE);
2741         bit_offset += 5;
2742         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic_ncell, tvb, bit_offset, 6, FALSE);
2743         bit_offset += 6;
2744         no_ncell_m -= 1;
2745     }
2746
2747     return(len);
2748 }
2749
2750 /*
2751  * [3] 10.5.2.20a GPRS Measurement Results
2752  */
2753 /*
2754  * [3] 10.5.2.21 Mobile Allocation
2755  */
2756 static guint16
2757 de_rr_mob_all(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2758 {
2759     guint32     curr_offset;
2760     proto_item *item;
2761     gint i, j;
2762     guint8 value;
2763
2764     curr_offset = offset;
2765
2766     item = proto_tree_add_text(tree, tvb, curr_offset, len, "Bitmap of increasing ARFCNs included in the Mobile Allocation: ");
2767     for(i=len; i>0; i--)
2768     {
2769         value = tvb_get_guint8(tvb,curr_offset+i-1);
2770         for (j=0; j<8; j++)
2771         {
2772             proto_item_append_text(item,"%d",(value>>j)&0x01);
2773         }
2774     }
2775
2776     curr_offset = curr_offset + len;
2777     return(curr_offset - offset);
2778 }
2779
2780 /*
2781  * [3] 10.5.2.21a Mobile Time Difference
2782  */
2783 static guint16
2784 de_rr_mob_time_diff(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2785 {
2786     guint32     curr_offset;
2787
2788     curr_offset = offset;
2789
2790     proto_tree_add_item(tree, hf_gsm_a_rr_mobile_time_difference, tvb, curr_offset, len, FALSE);
2791
2792     curr_offset = curr_offset + len;
2793     return(curr_offset - offset);
2794
2795 }
2796 /*
2797  * [3] 10.5.2.21aa MultiRate configuration
2798  */
2799 /*      Multirate speech version Octet 3 Bits 8 7 6 */
2800 static const value_string multirate_speech_ver_vals[] = {
2801     { 1, "Adaptive Multirate speech version 1"},
2802     { 2, "Adaptive Multirate speech version 2"},
2803     { 0, NULL }
2804 };
2805 /* Bit 5  NSCB: Noise Suppression Control Bit */
2806 static const value_string NSCB_vals[] = {
2807     { 0, "Noise Suppression can be used (default)"},
2808     { 1, "Noise Suppression shall be turned off"},
2809     { 0, NULL }
2810 };
2811 /* Bit 4 ICMI: Initial Codec Mode Indicator */
2812 static const value_string ICMI_vals[] = {
2813     { 0, "The initial codec mode is defined by the implicit rule provided in 3GPP TS 05.09"},
2814     { 1, "The initial codec mode is defined by the Start Mode field"},
2815     { 0, NULL }
2816 };
2817 /*
2818 Table 10.5.2.21aa.2: Set of adaptive multirate codec modes field (octet 4)
2819 for the Multirate speech version 1
2820 */
2821 static const true_false_string gsm_a_rr_set_of_amr_codec_modes  = {
2822     "is part of the subset",
2823     "is not part of the subset"
2824 };
2825
2826 static const value_string gsm_a_rr_amr_threshold_vals[] = {
2827     {  0, "0.0 dB"},
2828     {  1, "0.5 dB"},
2829     {  2, "1.0 dB"},
2830     {  3, "1.5 dB"},
2831     {  4, "2.0 dB"},
2832     {  5, "2.5 dB"},
2833     {  6, "3.0 dB"},
2834     {  7, "3.5 dB"},
2835     {  8, "4.0 dB"},
2836     {  9, "4.5 dB"},
2837     { 10, "5.0 dB"},
2838     { 11, "5.5 dB"},
2839     { 12, "6.0 dB"},
2840     { 13, "6.5 dB"},
2841     { 14, "7.0 dB"},
2842     { 15, "7.5 dB"},
2843     { 16, "8.0 dB"},
2844     { 17, "8.5 dB"},
2845     { 18, "9.0 dB"},
2846     { 19, "9.5 dB"},
2847     { 20, "10.0 dB"},
2848     { 21, "10.5 dB"},
2849     { 22, "11.0 dB"},
2850     { 23, "11.5 dB"},
2851     { 24, "12.0 dB"},
2852     { 25, "12.5 dB"},
2853     { 26, "13.0 dB"},
2854     { 27, "13.5 dB"},
2855     { 28, "14.0 dB"},
2856     { 29, "14.5 dB"},
2857     { 30, "15.0 dB"},
2858     { 31, "15.5 dB"},
2859     { 32, "16.0 dB"},
2860     { 33, "16.5 dB"},
2861     { 34, "17.0 dB"},
2862     { 35, "17.5 dB"},
2863     { 36, "18.0 dB"},
2864     { 37, "18.5 dB"},
2865     { 38, "19.0 dB"},
2866     { 39, "19.5 dB"},
2867     { 40, "20.0 dB"},
2868     { 41, "20.5 dB"},
2869     { 42, "21.0 dB"},
2870     { 43, "21.5 dB"},
2871     { 44, "22.0 dB"},
2872     { 45, "22.5 dB"},
2873     { 46, "23.0 dB"},
2874     { 47, "23.5 dB"},
2875     { 48, "24.0 dB"},
2876     { 49, "24.5 dB"},
2877     { 50, "25.0 dB"},
2878     { 51, "25.5 dB"},
2879     { 52, "26.0 dB"},
2880     { 53, "26.5 dB"},
2881     { 54, "27.0 dB"},
2882     { 55, "27.5 dB"},
2883     { 56, "28.0 dB"},
2884     { 57, "28.5 dB"},
2885     { 58, "29.0 dB"},
2886     { 59, "29.5 dB"},
2887     { 60, "30.0 dB"},
2888     { 61, "30.5 dB"},
2889     { 62, "31.0 dB"},
2890     { 63, "31.5 dB"},
2891     { 0, NULL }
2892 };
2893
2894 static const value_string gsm_a_rr_amr_hysteresis_vals[] = {
2895     {  0, "0.0 dB"},
2896     {  1, "0.5 dB"},
2897     {  2, "1.0 dB"},
2898     {  3, "1.5 dB"},
2899     {  4, "2.0 dB"},
2900     {  5, "2.5 dB"},
2901     {  6, "3.0 dB"},
2902     {  7, "3.5 dB"},
2903     {  8, "4.0 dB"},
2904     {  9, "4.5 dB"},
2905     { 10, "5.0 dB"},
2906     { 11, "5.5 dB"},
2907     { 12, "6.0 dB"},
2908     { 13, "6.5 dB"},
2909     { 14, "7.0 dB"},
2910     { 15, "7.5 dB"},
2911     { 0, NULL }
2912 };
2913
2914 guint16
2915 de_rr_multirate_conf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
2916 {
2917     guint32     curr_offset;
2918     guint8 oct;
2919     gint bit_offset, remaining_length, nb_of_params;
2920
2921     curr_offset = offset;
2922
2923     proto_tree_add_item(tree, hf_gsm_a_rr_multirate_speech_ver, tvb, curr_offset, 1, FALSE);
2924     proto_tree_add_item(tree, hf_gsm_a_rr_NCSB, tvb, curr_offset, 1, FALSE);
2925     proto_tree_add_item(tree, hf_gsm_a_rr_ICMI, tvb, curr_offset, 1, FALSE);
2926     /* The initial codec mode is coded as in 3GPP TS 45.009 */
2927     proto_tree_add_item(tree, hf_gsm_a_rr_start_mode, tvb, curr_offset, 1, FALSE);
2928     oct = ( tvb_get_guint8(tvb,curr_offset) &0xe0 ) >> 5;
2929     curr_offset++;
2930     switch ( oct){
2931     case 1:
2932         /* Adaptive Multirate speech version 1 */
2933         /* Set of AMR codec modes */
2934         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8, tvb, curr_offset, 1, FALSE);
2935         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7, tvb, curr_offset, 1, FALSE);
2936         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6, tvb, curr_offset, 1, FALSE);
2937         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5, tvb, curr_offset, 1, FALSE);
2938         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4, tvb, curr_offset, 1, FALSE);
2939         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3, tvb, curr_offset, 1, FALSE);
2940         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2, tvb, curr_offset, 1, FALSE);
2941         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1, tvb, curr_offset, 1, FALSE);
2942         curr_offset++;
2943
2944         remaining_length = len-2;
2945         break;
2946     case 2:
2947         /* Adaptive Multirate speech version 2 */
2948         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5, tvb, curr_offset, 1, FALSE);
2949         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4, tvb, curr_offset, 1, FALSE);
2950         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3, tvb, curr_offset, 1, FALSE);
2951         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2, tvb, curr_offset, 1, FALSE);
2952         proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1, tvb, curr_offset, 1, FALSE);
2953         curr_offset++;
2954
2955         remaining_length = len-2;
2956         break;
2957     default:
2958         proto_tree_add_text(tree,tvb,offset,1,"Unknown version");
2959         proto_tree_add_text(tree,tvb, curr_offset, len-1 ,"Data(Not decoded)");
2960         remaining_length = 0;
2961         break;
2962     }
2963
2964     if (remaining_length)
2965     {
2966         bit_offset = (curr_offset<<3) + 2;
2967         nb_of_params = remaining_length - 1;
2968         while (nb_of_params)
2969         {
2970             proto_tree_add_bits_item(tree, hf_gsm_a_rr_amr_threshold, tvb, bit_offset, 6, FALSE);
2971             bit_offset += 6;
2972             proto_tree_add_bits_item(tree, hf_gsm_a_rr_amr_hysteresis, tvb, bit_offset, 4, FALSE);
2973             bit_offset += 4;
2974             nb_of_params -= 1;
2975         }
2976     }
2977
2978     curr_offset = offset + len;
2979     return(curr_offset - offset);
2980
2981 }
2982 /*
2983  * [3] 10.5.2.21b Multislot Allocation
2984  */
2985 static guint16
2986 de_rr_mult_all(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
2987 {
2988     guint32     curr_offset;
2989
2990     curr_offset = offset;
2991
2992     proto_tree_add_text(tree,tvb, curr_offset, len ,"Data(Not decoded)");
2993
2994     curr_offset = curr_offset + len;
2995     return(curr_offset - offset);
2996
2997 }
2998 /*
2999  * [3] 10.5.2.21c NC mode
3000  */
3001
3002  /*
3003  * [3] 10.5.2.22 Neighbour Cell Description
3004  */
3005 static const value_string gsm_a_rr_ext_ind_vals[] = {
3006     { 0, "The information element carries the complete BA"},
3007     { 1, "The information element carries only a part of the BA"},
3008     { 0, NULL }
3009 };
3010 static guint16
3011 de_rr_neigh_cell_desc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3012 {
3013     guint32     curr_offset;
3014
3015     curr_offset = offset;
3016
3017     proto_tree_add_item(tree, hf_gsm_a_rr_ext_ind, tvb, curr_offset, 1, FALSE);
3018     proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, (curr_offset<<3)+3, 1, FALSE);
3019
3020     return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
3021 }
3022
3023  /*
3024  * [3] 10.5.2.22a Neighbour Cell Description 2
3025  */
3026 static guint16
3027 de_rr_neigh_cell_desc2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3028 {
3029     guint32     curr_offset;
3030
3031     curr_offset = offset;
3032
3033     proto_tree_add_bits_item(tree, hf_gsm_a_rr_multiband_reporting, tvb, (curr_offset<<3)+1, 2, FALSE);
3034     proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, (curr_offset<<3)+3, 1, FALSE);
3035
3036     return dissect_arfcn_list2(tvb, tree, offset, 16, add_string, string_len);
3037 }
3038
3039 /*
3040  * [3] 10.5.2.22b (void)
3041  * [3] 10.5.2.22c NT/N Rest Octets
3042  */
3043
3044 /*
3045  * [3] 10.5.2.23 P1 Rest Octets
3046  */
3047 static guint16
3048 de_rr_p1_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3049 {
3050     proto_tree *subtree;
3051     proto_item *item, *item2;
3052     guint32 curr_offset, value;
3053     gint bit_offset, bit_offset_sav, i;
3054
3055     curr_offset = offset;
3056     bit_offset = curr_offset << 3;
3057     len = tvb_length_remaining(tvb,offset);
3058
3059     item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
3060                                gsm_rr_elem_strings[DE_RR_P1_REST_OCT].strptr);
3061
3062     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_P1_REST_OCT]);
3063
3064     if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3065     {
3066         bit_offset += 1;
3067         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, FALSE);
3068         bit_offset += 2;
3069         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, FALSE);
3070         bit_offset += 1;
3071     }
3072     else
3073         bit_offset += 1;
3074     for (i=1; i<=2; i++)
3075     {
3076         if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3077         {
3078             bit_offset += 1;
3079             item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, FALSE);
3080             bit_offset += 3;
3081             proto_item_append_text(item2, " for Mobile Identity %d", i);
3082         }
3083         else
3084             bit_offset += 1;
3085     }
3086     if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3087     { /* Group Call Information */
3088         bit_offset += 1;
3089         bit_offset_sav = bit_offset;
3090         bit_offset += 36;
3091         if (tvb_get_bits8(tvb,bit_offset,1))
3092         { /* Group Channel Description */
3093             bit_offset += 24+1;
3094             if (tvb_get_bits8(tvb,bit_offset,1))
3095             { /* Hopping case */
3096                 bit_offset += 1;
3097                 if (tvb_get_bits8(tvb,bit_offset,1))
3098                 {
3099                     bit_offset += 64+1;
3100                 }
3101                 else
3102                 {
3103                     bit_offset += 1;
3104                     value = tvb_get_bits8(tvb,bit_offset,8);
3105                     bit_offset += 8 + (value<<3);
3106                 }
3107             }
3108             else
3109                 bit_offset += 1;
3110         }
3111         else
3112             bit_offset += 1;
3113         proto_tree_add_text(subtree,tvb, bit_offset_sav>>3, (bit_offset-bit_offset_sav)>>3,"Group Call Information: Data(Not decoded)");
3114     }
3115     else
3116         bit_offset += 1;
3117     for (i=1; i<=2; i++)
3118     {
3119         item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Packet Page Indication %d: ", i);
3120         if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3121             proto_item_append_text(item2, "Packet paging procedure");
3122         else
3123             proto_item_append_text(item2, "Paging procedure for RR connection establishment");
3124         bit_offset += 1;
3125     }
3126     if (((curr_offset + len)<<3) - bit_offset > 0)
3127     {
3128         /* There is still room left in the Rest Octets IE */
3129         if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3130         { /* Additions in release 6 */
3131             bit_offset += 1;
3132             proto_tree_add_text(subtree, tvb, bit_offset>>3, -1,"Additions in Release 6: Data(Not decoded)");
3133         }
3134         else
3135             bit_offset += 1;
3136     }
3137
3138     curr_offset = curr_offset + len;
3139
3140     return (curr_offset - offset);
3141 }
3142
3143 /*
3144  * [3] 10.5.2.24 P2 Rest Octets
3145  */
3146 static guint16
3147 de_rr_p2_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3148
3149 {
3150     proto_tree *subtree;
3151     proto_item *item, *item2;
3152     guint32 curr_offset;
3153     gint bit_offset, i;
3154
3155     curr_offset = offset;
3156     bit_offset = curr_offset << 3;
3157     len = tvb_length_remaining(tvb,offset);
3158
3159     item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
3160                                gsm_rr_elem_strings[DE_RR_P2_REST_OCT].strptr);
3161
3162     subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_P2_REST_OCT]);
3163
3164     if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3165     {
3166         bit_offset += 1;
3167         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch3, tvb, bit_offset, 2, FALSE);
3168         bit_offset += 2;
3169     }
3170     else
3171         bit_offset += 1;
3172     if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3173     {
3174         bit_offset += 1;
3175         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, FALSE);
3176         bit_offset += 2;
3177         proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, FALSE);
3178         bit_offset += 1;
3179     }
3180     else
3181         bit_offset += 1;
3182     for (i=1; i<=3; i++)
3183     {
3184         if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3185         {
3186             bit_offset += 1;
3187             item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, FALSE);
3188             bit_offset += 3;
3189             proto_item_append_text(item2, " for Mobile Identity %d", i);
3190         }
3191         else
3192             bit_offset += 1;
3193     }
3194     item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Packet Page Indication 3: ");
3195     if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3196         proto_item_append_text(item2, "Packet paging procedure");
3197     else
3198         proto_item_append_text(item2, "Paging procedure for RR connection establishment");
3199     bit_offset += 1;
3200     if (((curr_offset + len)<<3) - bit_offset > 0)
3201     {
3202         /* There is still room left in the Rest Octets IE */
3203         if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
3204         { /* Additions in release 6 */
3205             bit_offset += 1;
3206             proto_tree_add_text(subtree, tvb, bit_offset>>3, -1,"Additions in Release 6: Data(Not decoded)");
3207         }
3208         else
3209             bit_offset += 1;
3210     }
3211
3212     curr_offset = curr_offset + len;
3213
3214     return (curr_offset - offset);
3215 }