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