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