diff --git a/wireshark/packet-gsm_a_rr.c b/wireshark/packet-gsm_a_rr.c
deleted file mode 100644
index cc36a99..0000000
--- a/wireshark/packet-gsm_a_rr.c
+++ /dev/null
@@ -1,10176 +0,0 @@
-/* packet-gsm_a_rr.c
- * Routines for GSM A Interface (actually A-bis really) RR dissection - A.K.A. GSM layer 3 Radio Resource Protocol
- *
- * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
- * In association with Telos Technology Inc.
- *
- * Added Dissection of Radio Resource Management Information Elements
- * and othere enhancements and fixes.
- * Copyright 2005 - 2006, Anders Broman [AT] ericsson.com
- *
- * Title		3GPP			Other
- *
- *   Reference [3]
- *   Mobile radio interface Layer 3 specification;
- *   Core network protocols;
- *   Stage 3
- *   (3GPP TS 24.008 version 4.7.0 Release 4)
- *   (ETSI TS 124 008 V6.8.0 (2005-03))
- *
- *   Reference [4]
- *   Mobile radio interface layer 3 specification;
- *   Radio Resource Control Protocol
- *   (GSM 04.18 version 8.4.1 Release 1999)
- *   (3GPP TS 04.18 version 8.26.0 Release 1999)
- *
- * $Id: packet-gsm_a_rr.c 29403 2009-08-13 12:17:20Z krj $
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <string.h>
-
-#include <epan/packet.h>
-#include <epan/prefs.h>
-#include <epan/tap.h>
-#include <epan/asn1.h>
-
-#include "packet-bssap.h"
-#include "packet-sccp.h"
-#include "packet-ber.h"
-#include "packet-q931.h"
-#include "packet-gsm_a_common.h"
-#include "packet-ipv6.h"
-#include "packet-e212.h"
-#include "packet-ppp.h"
-
-static dissector_handle_t rrc_irat_ho_info_handle;
-static dissector_handle_t rrc_irat_ho_to_utran_cmd_handle;
-static packet_info *rr_apdu_pinfo;
-
-#define PADDING_BYTE 0x2B
-
-gboolean gsm_a_rr_is_bit_high(tvbuff_t *tvb, gint bit_offset)
-{
-    guint8 bit_mask = 0x80 >> (bit_offset & 0x07);
-    if ((tvb_get_guint8(tvb,bit_offset >> 3) & bit_mask) != (PADDING_BYTE & bit_mask))
-        return TRUE;
-    return FALSE;
-}
-
-/* PROTOTYPES/FORWARDS */
-
-const value_string gsm_a_dtap_msg_rr_strings[] = {
-    { 0x3c, "Reserved" },
-    { 0x3b, "Additional Assignment" },
-    { 0x3f, "Immediate Assignment" },
-    { 0x39, "Immediate Assignment Extended" },
-    { 0x3a, "Immediate Assignment Reject" },
-
-    { 0x48, "DTM Assignment Failure" },
-    { 0x49, "DTM Reject" },
-    { 0x4a, "DTM Request" },
-    { 0x4b, "Main DCCH Assignment Command" },
-    { 0x4c, "Packet Assignment Command" },
-
-    { 0x35, "Ciphering Mode Command" },
-    { 0x32, "Ciphering Mode Complete" },
-
-    { 0x30, "Configuration Change Command" },
-    { 0x31, "Configuration Change Ack." },
-    { 0x33, "Configuration Change Reject" },
-
-    { 0x2e, "Assignment Command" },
-    { 0x29, "Assignment Complete" },
-    { 0x2f, "Assignment Failure" },
-    { 0x2b, "Handover Command" },
-    { 0x2c, "Handover Complete" },
-    { 0x28, "Handover Failure" },
-    { 0x2d, "Physical Information" },
-    { 0x4d, "DTM Assignment Command" },
-
-    { 0x08, "RR-cell Change Order" },
-    { 0x23, "PDCH Assignment Command" },
-
-    { 0x0d, "Channel Release" },
-    { 0x0a, "Partial Release" },
-    { 0x0f, "Partial Release Complete" },
-
-    { 0x21, "Paging Request Type 1" },
-    { 0x22, "Paging Request Type 2" },
-    { 0x24, "Paging Request Type 3" },
-    { 0x27, "Paging Response" },
-    { 0x20, "Notification/NCH" },
-    { 0x25, "Reserved" },
-    { 0x26, "Notification/Response" },
-
-    { 0x0b, "Reserved" },
-
-#if 0
-/* ETSI TS 101 503 V8.5.0 Seems to give Other def for this Messages??? */
-    { 0xc0, "Utran Classmark Change" }, CONFLICTS WITH Handover To UTRAN Command
-    { 0xc1, "UE RAB Preconfiguration" },
-    { 0xc2, "cdma2000 Classmark Change" },
-#endif
-
-    /* ETSI TS 101 503 V8.5.0 */
-    { 0x60, "Utran Classmark Change" },
-    { 0x62, "cdma2000 Classmark Change" },
-    { 0x63, "Inter System to UTRAN Handover Command" },
-    { 0x64, "Inter System to cdma2000 Handover Command" },
-    { 0x18, "System Information Type 8" },
-    { 0x19, "System Information Type 1" },
-    { 0x1a, "System Information Type 2" },
-    { 0x1b, "System Information Type 3" },
-    { 0x1c, "System Information Type 4" },
-    { 0x1d, "System Information Type 5" },
-    { 0x1e, "System Information Type 6" },
-    { 0x1f, "System Information Type 7" },
-
-    { 0x02, "System Information Type 2bis" },
-    { 0x03, "System Information Type 2ter" },
-    { 0x07, "System Information Type 2quater" },
-    { 0x05, "System Information Type 5bis" },
-    { 0x06, "System Information Type 5ter" },
-    { 0x04, "System Information Type 9" },
-    { 0x00, "System Information Type 13" },
-
-    { 0x3d, "System Information Type 16" },
-    { 0x3e, "System Information Type 17" },
-
-    { 0x40, "System Information Type 18" },
-    { 0x41, "System Information Type 19" },
-    { 0x42, "System Information Type 20" },
-
-    { 0x10, "Channel Mode Modify" },
-    { 0x12, "RR Status" },
-    { 0x17, "Channel Mode Modify Acknowledge" },
-    { 0x14, "Frequency Redefinition" },
-    { 0x15, "Measurement Report" },
-    { 0x16, "Classmark Change" },
-    { 0x13, "Classmark Enquiry" },
-    { 0x36, "Extended Measurement Report" },
-    { 0x37, "Extended Measurement Order" },
-    { 0x34, "GPRS Suspension Request" },
-
-    { 0x09, "VGCS Uplink Grant" },
-    { 0x0e, "Uplink Release" },
-    { 0x0c, "Reserved" },
-    { 0x2a, "Uplink Busy" },
-    { 0x11, "Talker Indication" },
-
-    { 0xc0, "UTRAN Classmark Change/Handover To UTRAN Command" }, /* spec conflict */
-
-    { 0x38, "Application Information" },
-
-    {    0, NULL }
-};
-
-const value_string gsm_rr_elem_strings[] = {
-    /* Radio Resource Management Information Elements 10.5.2, most are from 10.5.1 */
-    { 0x00, "BA Range" },       						/* [3]  10.5.2.1a BA Range */
-    { 0x00, "Cell Channel Description" },     					/* [3]  10.5.2.1b */
-    { 0x00, "BA List Pref" },      						/* [3]  10.5.2.1c BA List Pref */
-    { 0x00, "UTRAN Frequency List" },     					/* [3]  10.5.2.1d UTRAN Frequency List */
-    { 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 */
-    { 0x00, "Cell Description" },						/* 10.5.2.2  */
-    { 0x00, "Cell Options (BCCH)" },						/* [3]  10.5.2.3	Cell Options (BCCH) */
-    { 0x00, "Cell Options (SACCH)" },						/* [3]  10.5.2.3a	Cell Options (SACCH) */
-    { 0x00, "Cell Selection Parameters" },					/* [3]  10.5.2.4	Cell Selection Parameters */
-/* [3]  10.5.2.4a	(void) */
-    { 0x00, "Channel Description" },						/* 10.5.2.5	 */
-    { 0x00, "Channel Description 2" },						/* 10.5.2.5a */
-    { 0x00, "Channel Description 3" },						/* 10.5.2.5c */
-    { 0x00, "Channel Mode" },							/* [3]  10.5.2.6 */
-    { 0x00, "Channel Mode 2" },							/* [3]  10.5.2.7 */
-    { 0x00, "UTRAN Classmark" },						/* [3]  10.5.2.7a	*/
-/* [3]  10.5.2.7b	(void) */
-    { 0x00, "Classmark Enquiry Mask" },						/* [3]  10.5.2.7c */
-/* [3]  10.5.2.7d	GERAN Iu Mode Classmark information element */
-    { 0x00, "Channel Needed"},							/* [3]  10.5.2.8	*/
-    /* [3]  10.5.2.8a	(void) */
-    /* [3]  10.5.2.8b	Channel Request Description 2 */
-    /* Pos 20 */
-    { 0x00, "Cipher Mode Setting" },						/* [3]  10.5.2.9	*/
-    { 0x00, "Cipher Mode Response" },			  			/* [3]  10.5.2.10	*/
-    { 0x00, "Control Channel Description" },					/* [3]  10.5.2.11	Control Channel Description */
-/* [3]  10.5.2.11a	DTM Information Details */
-    { 0x00, "Dynamic ARFCN Mapping" },						/* [3]  10.5.2.11b	*/
-    { 0x00, "Frequency Channel Sequence" },					/* [3]  10.5.2.12	*/
-    { 0x00, "Frequency List" },							/* 10.5.2.13		*/
-    { 0x00, "Frequency Short List" },						/* 10.5.2.14		*/
-    { 0x00, "Frequency Short List2" },						/* 10.5.2.14a		*/
-/* [3]  10.5.2.14b	Group Channel Description */
-    { 0x00, "GPRS Resumption" },						/* [3]  10.5.2.14c	GPRS Resumption */
-    { 0x00, "GPRS Broadcast Information" },					/* [3]  10.5.2.14d	GPRS broadcast information */
-/* [3]  10.5.2.14e	Enhanced DTM CS Release Indication */
-    { 0x00, "Handover Reference" },						/* 10.5.2.15		*/
-    { 0x00, "IA Rest Octets" },							/* [3] 10.5.2.16	*/
-    { 0x00, "IAR Rest Octets" },						/* [3] 10.5.2.17 IAR Rest Octets */
-    { 0x00, "IAX Rest Octets" },						/* [3] 10.5.2.18 IAX Rest Octets */
-    { 0x00, "L2 Pseudo Length" },						/* [3] 10.5.2.19	*/
-    { 0x00, "Measurement Results" },						/* [3] 10.5.2.20 Measurement Results */
-/*
- * [3] 10.5.2.20a GPRS Measurement Results
- */
-    { 0x00, "Mobile Allocation" },						/* [3] 10.5.2.21	*/
-    { 0x00, "Mobile Time Difference" },						/* [3] 10.5.2.21a	*/
-    { 0x00, "MultiRate configuration" },					/* [3] 10.5.2.21aa	*/
-    /* Pos 30 */
-    { 0x00, "Multislot Allocation" },						/* [3] 10.5.2.21b	*/
-    /*
-     * [3] 10.5.2.21c NC mode
-     */
-    { 0x00, "Neighbour Cell Description" },					/* [3] 10.5.2.22 Neighbour Cell Description */
-    { 0x00, "Neighbour Cell Description 2" },					/* [3] 10.5.2.22a Neighbour Cell Description 2 */
-/*
- * [3] 10.5.2.22b (void)
- * [3] 10.5.2.22c NT/N Rest Octets */
-    { 0x00, "P1 Rest Octets" },							/* [3] 10.5.2.23 P1 Rest Octets */
-    { 0x00, "P2 Rest Octets" },							/* [3] 10.5.2.24 P2 Rest Octets */
-    { 0x00, "P3 Rest Octets" },							/* [3] 10.5.2.25 P3 Rest Octets */
-    { 0x00, "Packet Channel Description" },					/* [3] 10.5.2.25a	*/
-    { 0x00, "Dedicated mode or TBF" },						/* [3] 10.5.2.25b */
-    /* [3] 10.5.2.25c RR Packet Uplink Assignment
-     * [3] 10.5.2.25d RR Packet Downlink Assignment */
-    { 0x00, "Page Mode" },							/* [3] 10.5.2.26  */
-/*
- * [3] 10.5.2.26a (void)
- * [3] 10.5.2.26b (void)
- * [3] 10.5.2.26c (void)
- * [3] 10.5.2.26d (void)
- */
-    { 0x00, "NCC Permitted" },							/* [3] 10.5.2.27 NCC Permitted */
-    { 0x00, "Power Command" },							/* 10.5.2.28 */
-    { 0x00, "Power Command and access type" },					/* 10.5.2.28a */
-    { 0x00, "RACH Control Parameters" },					/* [3] 10.5.2.29 RACH Control Parameters */
-    { 0x00, "Request Reference" },						/* [3] 10.5.2.30 Request Reference */
-    { 0x00, "RR Cause" },							/* 10.5.2.31 */
-    { 0x00, "Synchronization Indication" },					/* 10.5.2.39 */
-    { 0x00, "SI 1 Rest Octets" },						/* [3] 10.5.2.32 */
-/* [3] 10.5.2.33 SI 2bis Rest Octets */
-    { 0x00, "SI 2ter Rest Octets" },						/* [3] 10.5.2.33a */
-    { 0x00, "SI 2quater Rest Octets" },						/* [3] 10.5.2.33b */
-    { 0x00, "SI 3 Rest Octets" },						/* [3] 10.5.2.34 */
-    { 0x00, "SI 4 Rest Octets" },						/* [3] 10.5.2.35 */
-    { 0x00, "SI 6 Rest Octets" },						/* [3] 10.5.2.35a */
-/* [3] 10.5.2.36 SI 7 Rest Octets
- * [3] 10.5.2.37 SI 8 Rest Octets
- * [3] 10.5.2.37a SI 9 Rest Octets
- */
-    { 0x00, "SI 13 Rest Octets" },						/* [3] 10.5.2.37b */
-/* [3] 10.5.2.37c (void)
- * [3] 10.5.2.37d (void)
- * [3] 10.5.2.37e SI 16 Rest Octets
- * [3] 10.5.2.37f SI 17 Rest Octets
- * [3] 10.5.2.37g SI 19 Rest Octets
- * [3] 10.5.2.37h SI 18 Rest Octets
- * [3] 10.5.2.37i SI 20 Rest Octets */
-    { 0x00, "Starting Time" },							/* [3] 10.5.2.38 Starting Time	*/
-    { 0x00, "Timing Advance" },							/* [3] 10.5.2.40 Timing Advance */
-    { 0x00, "Time Difference" },						/* [3] 10.5.2.41 Time Difference */
-    { 0x00, "TLLI" },								/* [3] 10.5.2.41a TLLI	*/
-    { 0x00, "TMSI/P-TMSI" },							/* [3] 10.5.2.42 TMSI/P-TMSI */
-    { 0x00, "VGCS target mode Indication" },					/* [3] 10.5.2.42a */
-    /* Pos 40 */
-    { 0x00, "VGCS Ciphering Parameters" },					/* [3] 10.5.2.42b */
-    { 0x00, "Wait Indication" },						/* [3] 10.5.2.43 Wait Indication */
-/* [3] 10.5.2.44 SI10 rest octets $(ASCI)$ */
-    { 0x00, "Extended Measurement Results" },					/* [3] 10.5.2.45 Extended Measurement Results */
-    { 0x00, "Extended Measurement Frequency List" },				/* [3] 10.5.2.46 Extended Measurement Frequency List */
-    { 0x00, "Suspension Cause" },						/* [3] 10.5.2.47								*/
-/* [3] 10.5.2.48 APDU ID
- * [3] 10.5.2.49 APDU Flags
- * [3] 10.5.2.50 APDU Data */
-    { 0x00, "Handover to UTRAN Command" },					/* [3] 10.5.2.51 Handover To UTRAN Command */
-/* [3] 10.5.2.52 Handover To cdma2000 Command
- * [3] 10.5.2.53 (void)
- * [3] 10.5.2.54 (void)
- * [3] 10.5.2.55 (void)
- * [3] 10.5.2.56 3G Target Cell */
-    { 0x00, "Service Support" },						/* [3] 10.5.2.57	*/
-    /* 10.5.2.58 MBMS p-t-m Channel Description */
-    { 0x00, "Dedicated Service Information" },					/* [3] 10.5.2.59	*/
-/*
- * 10.5.2.60 MPRACH Description
- * 10.5.2.61 Restriction Timer
- * 10.5.2.62 MBMS Session Identity
- * 10.5.2.63 Reduced group or broadcast call reference
- * 10.5.2.64 Talker Priority status
- * 10.5.2.65 Talker Identity
- * 10.5.2.66 Token
- * 10.5.2.67 PS Cause
- * 10.5.2.68 VGCS AMR Configuration
- */
-    { 0x00, "Carrier Indication" },						/* 10.5.2.69 Carrier Indication */
-    {    0, NULL }
-};
-
-const value_string gsm_rr_rest_octets_elem_strings[] = {
-    /* RR Rest Octets information elements */
-    { 0, "UTRAN FDD Description" },
-    { 0, "UTRAN TDD Description" }, 
-    { 0, "3G Measurement Parameters Description" },
-    { 0, "3G Additional Measurement Parameters Description" },
-    { 0, "Measurement Parameters Description" },
-    { 0, "GPRS Real Time Difference Description" },
-    { 0, "GPRS BSIC Description" },
-    { 0, "GPRS Report Priority Description" },
-    { 0, "GPRS Measurement Parameters Description" },
-    { 0, "NC Measurement Parameters" },
-    { 0, "SI2q Extension Information" },
-    { 0, "CCN Support Description" },
-    { 0, "3G Neighbour Cell Description" },
-    { 0, "FDD Cell Information Field" },
-    { 0, "TDD Cell Information Field" },
-    { 0, "GPRS 3G Measurement Parameters Description" },
-    { 0, "3G Additional Measurement Parameters Description 2" },
-    { 0, "Optional Selection Parameters" },
-    { 0, "GPRS Indicator" },
-    { 0, "SI4 Rest Octets_O" },
-    { 0, "SI4 Rest Octets_S" },
-    { 0, "LSA Parameters" },
-    { 0, "LSA ID Information" },
-    { 0, "PCH and NCH Info" },
-    { 0, "VBS/VGCS Options" },
-    { 0, "GPRS Mobile Allocation" },
-    { 0, "GPRS Cell Options" },
-    { 0, "GPRS Cell Options Extension Information" },
-    { 0, "GPRS Power Control Parameters" },
-    { 0, "PBCCH Description" },
-    { 0, "GSM Description" },
-    { 0, "Real Time Difference Description" },
-    { 0, "BSIC Description" },
-    { 0, "Report Priority Description" },
-    { 0, "CDMA2000 Description" },
-    { 0, "Serving cell data" },
-    { 0, "Repeated Invalid BSIC Information" },
-    { 0, "Bitmap Type Reporting" },
-    { 0, NULL }
-};
-
-
-/* RR cause value (octet 2) TS 44.018 6.11.0*/
-static const value_string gsm_a_rr_RR_cause_vals[] = {
-    {    0, "Normal event"},
-    {    1, "Abnormal release, unspecified"},
-    {    2, "Abnormal release, channel unacceptable"},
-    {    3, "Abnormal release, timer expired"},
-    {    4, "Abnormal release, no activity on the radio path"},
-    {    5, "Preemptive release"},
-    {    6, "UTRAN configuration unknown"},
-    {    8, "Handover impossible, timing advance out of range"},
-    {    9, "Channel mode unacceptable"},
-    {   10, "Frequency not implemented"},
-    {   13, "Originator or talker leaving group call area"},
-    {   12, "Lower layer failure"},
-    { 0x41, "Call already cleared"},
-    { 0x5f, "Semantically incorrect message"},
-    { 0x60, "Invalid mandatory information"},
-    { 0x61, "Message type non-existent or not implemented"},
-    { 0x62, "Message type not compatible with protocol state"},
-    { 0x64, "Conditional IE error"},
-    { 0x65, "No cell allocation available"},
-    { 0x6f, "Protocol error unspecified"},
-    { 0,	NULL }
-};
-
-static const value_string gsm_a_algorithm_identifier_vals[] = {
-    { 0, "Cipher with algorithm A5/1"},
-    { 1, "Cipher with algorithm A5/2"},
-    { 2, "Cipher with algorithm A5/3"},
-    { 3, "Cipher with algorithm A5/4"},
-    { 4, "Cipher with algorithm A5/5"},
-    { 5, "Cipher with algorithm A5/6"},
-    { 6, "Cipher with algorithm A5/7"},
-    { 7, "Reserved"},
-    { 0, NULL }
-};
-
-
-#define	DTAP_PD_MASK		0x0f
-#define	DTAP_SKIP_MASK		0xf0
-#define	DTAP_TI_MASK		DTAP_SKIP_MASK
-#define	DTAP_TIE_PRES_MASK	0x07			/* after TI shifted to right */
-#define	DTAP_TIE_MASK		0x7f
-
-#define	DTAP_RR_IEI_MASK	0xff
-
-/* Initialize the protocol and registered fields */
-static int proto_a_ccch = -1;
-static int proto_a_sacch = -1;
-static int rrlp_dissector = -1;
-
-static int hf_gsm_a_dtap_msg_rr_type = -1;
-int hf_gsm_a_rr_elem_id = -1;
-
-static int hf_gsm_a_sacch_msg_rr_type = -1;
-
-static int hf_gsm_a_bcc	= -1;
-static int hf_gsm_a_ncc	= -1;
-static int hf_gsm_a_bcch_arfcn = -1;
-static int hf_gsm_a_rr_range_nb = -1;
-static int hf_gsm_a_rr_range_lower = -1;
-static int hf_gsm_a_rr_range_higher = -1;
-static int hf_gsm_a_rr_ba_list_pref_length = -1;
-static int hf_gsm_a_rr_ba_freq = -1;
-static int hf_gsm_a_rr_utran_freq_list_length = -1;
-static int hf_gsm_a_rr_ho_ref_val	= -1;
-static int hf_gsm_a_rr_L2_pseudo_len = -1;
-static int hf_gsm_a_rr_ba_used = -1;
-static int hf_gsm_a_rr_dtx_used = -1;
-static int hf_gsm_a_rr_3g_ba_used = -1;
-static int hf_gsm_a_rr_meas_valid = -1;
-static int hf_gsm_a_rr_rxlev_full_serv_cell = -1;
-static int hf_gsm_a_rr_rxlev_sub_serv_cell = -1;
-static int hf_gsm_a_rr_rxqual_full_serv_cell = -1;
-static int hf_gsm_a_rr_rxqual_sub_serv_cell = -1;
-static int hf_gsm_a_rr_no_ncell_m = -1;
-static int hf_gsm_a_rr_rxlev_ncell = -1;
-static int hf_gsm_a_rr_bcch_freq_ncell = -1;
-static int hf_gsm_a_rr_bsic_ncell = -1;
-static int hf_gsm_a_rr_mobile_time_difference = -1;
-static int hf_gsm_a_rr_pow_cmd_atc = -1;
-static int hf_gsm_a_rr_pow_cmd_epc = -1;
-static int hf_gsm_a_rr_page_mode = -1;
-static int hf_gsm_a_rr_dedicated_mode_or_tbf = -1;
-static int hf_gsm_a_rr_pow_cmd_fpcepc = -1;
-static int hf_gsm_a_rr_pow_cmd_powlev = -1;
-static int hf_gsm_a_rr_sync_ind_nci = -1;
-static int hf_gsm_a_rr_sync_ind_rot = -1;
-static int hf_gsm_a_rr_sync_ind_si = -1;
-static int hf_gsm_a_rr_format_id = -1;
-static int hf_gsm_a_rr_channel_mode = -1;
-static int hf_gsm_a_rr_channel_mode2 = -1;
-static int hf_gsm_a_rr_sc = -1;
-static int hf_gsm_a_algorithm_id = -1;
-static int hf_gsm_a_rr_cr = -1;
-static int hf_gsm_a_rr_multirate_speech_ver = -1;
-static int hf_gsm_a_rr_NCSB = -1;
-static int hf_gsm_a_rr_ICMI = -1;
-static int hf_gsm_a_rr_start_mode = -1;
-static int hf_gsm_a_rr_timing_adv = -1;
-static int hf_gsm_a_rr_time_diff = -1;
-static int hf_gsm_a_rr_tlli = -1;
-static int hf_gsm_a_rr_tmsi_ptmsi = -1;
-static int hf_gsm_a_rr_target_mode = -1;
-static int hf_gsm_a_rr_wait_indication = -1;
-static int hf_gsm_a_rr_seq_code = -1;
-static int hf_gsm_a_rr_group_cipher_key_number = -1;
-static int hf_gsm_a_rr_MBMS_multicast = -1;
-static int hf_gsm_a_rr_MBMS_broadcast = -1;
-static int hf_gsm_a_rr_last_segment = -1;
-static int hf_gsm_a_rr_carrier_ind = -1;
-static int hf_gsm_a_rr_ra = -1;
-static int hf_gsm_a_rr_T1prim = -1;
-static int hf_gsm_a_rr_T3 = -1;
-static int hf_gsm_a_rr_T2 = -1;
-static int hf_gsm_a_rr_rfn = -1;
-static int hf_gsm_a_rr_RR_cause = -1;
-static int hf_gsm_a_rr_cm_cng_msg_req = -1;
-static int hf_gsm_a_rr_utran_cm_cng_msg_req = -1;
-static int hf_gsm_a_rr_cdma200_cm_cng_msg_req = -1;
-static int hf_gsm_a_rr_geran_iu_cm_cng_msg_req = -1;
-int hf_gsm_a_rr_chnl_needed_ch1 = -1;
-static int hf_gsm_a_rr_chnl_needed_ch2 = -1;
-static int hf_gsm_a_rr_chnl_needed_ch3 = -1;
-static int hf_gsm_a_rr_chnl_needed_ch4 = -1;
-static int hf_gsm_a_rr_suspension_cause = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2 = -1;
-static int hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1 = -1;
-static int hf_gsm_a_rr_amr_threshold = -1;
-static int hf_gsm_a_rr_amr_hysteresis = -1;
-static int hf_gsm_a_rr_pwrc = -1;
-static int hf_gsm_a_rr_dtx_bcch = -1;
-static int hf_gsm_a_rr_dtx_sacch = -1;
-static int hf_gsm_a_rr_radio_link_timeout = -1;
-static int hf_gsm_a_rr_cell_reselect_hyst = -1;
-static int hf_gsm_a_rr_ms_txpwr_max_cch = -1;
-static int hf_gsm_a_rr_acs = -1;
-static int hf_gsm_a_rr_neci = -1;
-static int hf_gsm_a_rr_rxlev_access_min = -1;
-static int hf_gsm_a_rr_mscr = -1;
-static int hf_gsm_a_rr_att = -1;
-static int hf_gsm_a_rr_ccch_conf = -1;
-static int hf_gsm_a_rr_cbq3 = -1;
-static int hf_gsm_a_rr_bs_pa_mfrms = -1;
-static int hf_gsm_a_rr_bs_ag_blks_res = -1;
-static int hf_gsm_a_rr_t3212 = -1;
-static int hf_gsm_a_rr_dyn_arfcn_length = -1;
-static int hf_gsm_a_rr_gsm_band = -1;
-static int hf_gsm_a_rr_arfcn_first = -1;
-static int hf_gsm_a_rr_band_offset = -1;
-static int hf_gsm_a_rr_arfcn_range = -1;
-static int hf_gsm_a_rr_lowest_arfcn = -1;
-static int hf_gsm_a_rr_inc_skip_arfcn = -1;
-static int hf_gsm_a_rr_gprs_resumption_ack = -1;
-static int hf_gsm_a_rr_ext_ind = -1;
-static int hf_gsm_a_rr_ba_ind = -1;
-static int hf_gsm_a_rr_multiband_reporting = -1;
-static int hf_gsm_a_rr_ncc_permitted = -1;
-static int hf_gsm_a_rr_max_retrans = -1;
-static int hf_gsm_a_rr_tx_integer = -1;
-static int hf_gsm_a_rr_cell_barr_access = -1;
-static int hf_gsm_a_rr_re = -1;
-static int hf_gsm_a_rr_acc = -1;
-static int hf_gsm_a_rr_nch_position = -1;
-static int hf_gsm_a_rr_si2ter_mp_change_mark = -1;
-static int hf_gsm_a_rr_si2ter_3g_change_mark = -1;
-static int hf_gsm_a_rr_si2ter_index = -1;
-static int hf_gsm_a_rr_si2ter_count = -1;
-static int hf_gsm_a_rr_fdd_uarfcn = -1;
-static int hf_gsm_a_rr_bandwidth_fdd = -1;
-static int hf_gsm_a_rr_tdd_uarfcn = -1;
-static int hf_gsm_a_rr_bandwidth_tdd = -1;
-static int hf_gsm_a_rr_arfcn = -1;
-static int hf_gsm_a_rr_bsic = -1;
-static int hf_gsm_a_rr_qsearch_i = -1;
-static int hf_gsm_a_rr_fdd_qoffset = -1;
-static int hf_gsm_a_rr_fdd_qmin = -1;
-static int hf_gsm_a_rr_tdd_qoffset = -1;
-static int hf_gsm_a_rr_fdd_qmin_offset = -1;
-static int hf_gsm_a_rr_fdd_rscpmin = -1;
-static int hf_gsm_a_rr_3g_ba_ind = -1;
-static int hf_gsm_a_rr_mp_change_mark = -1;
-static int hf_gsm_a_rr_si2quater_index = -1;
-static int hf_gsm_a_rr_si2quater_count = -1;
-static int hf_gsm_a_rr_gsm_report_type = -1;
-static int hf_gsm_a_rr_serving_band_reporting = -1;
-static int hf_gsm_a_rr_frequency_scrolling = -1;
-static int hf_gsm_a_rr_rep_priority = -1;
-static int hf_gsm_a_rr_report_type = -1;
-static int hf_gsm_a_rr_reporting_rate = -1;
-static int hf_gsm_a_rr_invalid_bsic_reporting = -1;
-static int hf_gsm_a_rr_scale_ord = -1;
-static int hf_gsm_a_rr_900_reporting_offset = -1;
-static int hf_gsm_a_rr_900_reporting_threshold = -1;
-static int hf_gsm_a_rr_1800_reporting_offset = -1;
-static int hf_gsm_a_rr_1800_reporting_threshold = -1;
-static int hf_gsm_a_rr_400_reporting_offset = -1;
-static int hf_gsm_a_rr_400_reporting_threshold = -1;
-static int hf_gsm_a_rr_1900_reporting_offset = -1;
-static int hf_gsm_a_rr_1900_reporting_threshold = -1;
-static int hf_gsm_a_rr_850_reporting_offset = -1;
-static int hf_gsm_a_rr_850_reporting_threshold = -1;
-static int hf_gsm_a_rr_network_control_order = -1;
-static int hf_gsm_a_rr_nc_non_drx_period = -1;
-static int hf_gsm_a_rr_nc_reporting_period_i = -1;
-static int hf_gsm_a_rr_nc_reporting_period_t = -1;
-static int hf_gsm_a_rr_index_start_3g = -1;
-static int hf_gsm_a_rr_absolute_index_start_emr = -1;
-static int hf_gsm_a_rr_qsearch_c_initial = -1;
-static int hf_gsm_a_rr_fdd_rep_quant = -1;
-static int hf_gsm_a_rr_fdd_multirat_reporting = -1;
-static int hf_gsm_a_rr_tdd_multirat_reporting = -1;
-static int hf_gsm_a_rr_qsearch_p = -1;
-static int hf_gsm_a_rr_3g_search_prio = -1;
-static int hf_gsm_a_rr_fdd_reporting_offset = -1;
-static int hf_gsm_a_rr_fdd_reporting_threshold = -1;
-static int hf_gsm_a_rr_tdd_reporting_offset = -1;
-static int hf_gsm_a_rr_tdd_reporting_threshold = -1;
-static int hf_gsm_a_rr_fdd_reporting_threshold_2 = -1;
-static int hf_gsm_a_rr_3g_ccn_active = -1;
-static int hf_gsm_a_rr_700_reporting_offset = -1;
-static int hf_gsm_a_rr_700_reporting_threshold = -1;
-static int hf_gsm_a_rr_810_reporting_offset = -1;
-static int hf_gsm_a_rr_810_reporting_threshold = -1;
-static int hf_gsm_a_rr_cbq = -1;
-static int hf_gsm_a_rr_cell_reselect_offset = -1;
-static int hf_gsm_a_rr_temporary_offset = -1;
-static int hf_gsm_a_rr_penalty_time = -1;
-static int hf_gsm_a_rr_si13_position = -1;
-static int hf_gsm_a_rr_power_offset = -1;
-static int hf_gsm_a_rr_si2quater_position = -1;
-static int hf_gsm_a_rr_si13alt_position = -1;
-static int hf_gsm_a_rr_prio_thr = -1;
-static int hf_gsm_a_rr_lsa_offset = -1;
-static int hf_gsm_a_rr_paging_channel_restructuring = -1;
-static int hf_gsm_a_rr_nln_sacch = -1;
-static int hf_gsm_a_rr_nln_status_sacch = -1;
-static int hf_gsm_a_rr_nln_pch = -1;
-static int hf_gsm_a_rr_nln_status_pch = -1;
-static int hf_gsm_a_rr_vbs_vgcs_inband_notifications = -1;
-static int hf_gsm_a_rr_vbs_vgcs_inband_pagings = -1;
-static int hf_gsm_a_rr_rac = -1;
-static int hf_gsm_a_rr_max_lapdm = -1;
-static int hf_gsm_a_rr_gprs_ms_txpwr_max_ccch = -1;
-static int hf_gsm_a_rr_dedicated_mode_mbms_notification_support = -1;
-static int hf_gsm_a_rr_mnci_support = -1;
-static int hf_gsm_a_rr_amr_config = -1;
-static int hf_gsm_a_rr_bcch_change_mark = -1;
-static int hf_gsm_a_rr_si_change_field = -1;
-static int hf_gsm_a_rr_si13_change_mark = -1;
-static int hf_gsm_a_rr_hsn = -1;
-static int hf_gsm_a_rr_rfl_number = -1;
-static int hf_gsm_a_rr_arfcn_index = -1;
-static int hf_gsm_a_rr_ma_length = -1;
-static int hf_gsm_a_rr_psi1_repeat_period = -1;
-static int hf_gsm_a_rr_pbcch_pb = -1;
-static int hf_gsm_a_rr_pbcch_tsc = -1;
-static int hf_gsm_a_rr_pbcch_tn = -1;
-static int hf_gsm_a_rr_spgc_ccch_sup = -1;
-static int hf_gsm_a_rr_priority_access_thr = -1;
-static int hf_gsm_a_rr_nmo = -1;
-static int hf_gsm_a_rr_t3168 = -1;
-static int hf_gsm_a_rr_t3192 = -1;
-static int hf_gsm_a_rr_drx_timer_max = -1;
-static int hf_gsm_a_rr_access_burst_type = -1;
-static int hf_gsm_a_rr_control_ack_type = -1;
-static int hf_gsm_a_rr_bs_cv_max = -1;
-static int hf_gsm_a_rr_pan_dec = -1;
-static int hf_gsm_a_rr_pan_inc = -1;
-static int hf_gsm_a_rr_pan_max = -1;
-static int hf_gsm_a_rr_egprs_packet_channel_request = -1;
-static int hf_gsm_a_rr_bep_period = -1;
-static int hf_gsm_a_rr_pfc_feature_mode = -1;
-static int hf_gsm_a_rr_dtm_support = -1;
-static int hf_gsm_a_rr_bss_paging_coordination = -1;
-static int hf_gsm_a_rr_ccn_active = -1;
-static int hf_gsm_a_rr_nw_ext_utbf = -1;
-static int hf_gsm_a_rr_multiple_tbf_capability = -1;
-static int hf_gsm_a_rr_ext_utbf_no_data = -1;
-static int hf_gsm_a_rr_dtm_enhancements_capability = -1;
-static int hf_gsm_a_rr_reduced_latency_access = -1;
-static int hf_gsm_a_rr_alpha = -1;
-static int hf_gsm_a_rr_t_avg_w = -1;
-static int hf_gsm_a_rr_t_avg_t = -1;
-static int hf_gsm_a_rr_pc_meas_chan = -1;
-static int hf_gsm_a_rr_n_avg_i = -1;
-static int hf_gsm_a_rr_sgsnr = -1;
-static int hf_gsm_a_rr_si_status_ind = -1;
-static int hf_gsm_a_rr_lb_ms_txpwr_max_cch = -1;
-static int hf_gsm_a_rr_si2n_support = -1;
-static int hf_gsm_a_rr_mi_index = -1;
-static int hf_gsm_a_rr_mi_count = -1;
-static int hf_gsm_a_rr_3g_wait = -1;
-static int hf_gsm_a_rr_qsearch_c = -1;
-static int hf_gsm_a_rr_bsic_seen = -1;
-static int hf_gsm_a_rr_scale = -1;
-static int hf_gsm_a_rr_mean_bep_gmsk = -1;
-static int hf_gsm_a_rr_mean_cv_bep = -1;
-static int hf_gsm_a_rr_nbr_rcvd_blocks = -1;
-static int hf_gsm_a_rr_reporting_quantity = -1;
-
-/* Initialize the subtree pointers */
-static gint ett_ccch_msg = -1;
-static gint ett_ccch_oct_1 = -1;
-static gint ett_sacch_msg = -1;
-
-static char a_bigbuf[1024];
-
-static dissector_handle_t data_handle;
-
-
-
-#define	NUM_GSM_RR_ELEM (sizeof(gsm_rr_elem_strings)/sizeof(value_string))
-gint ett_gsm_rr_elem[NUM_GSM_RR_ELEM];
-
-typedef enum
-{
-    /* RR Rest Octets information elements */
-    DE_RR_REST_OCTETS_UTRAN_FDD_DESC,
-    DE_RR_REST_OCTETS_UTRAN_TDD_DESC,
-    DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC,
-    DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC,
-    DE_RR_REST_OCTETS_MEAS_PARAM_DESC,
-    DE_RR_REST_OCTETS_GPRS_RTD_DESC,
-    DE_RR_REST_OCTETS_GPRS_BSIC_DESC,
-    DE_RR_REST_OCTETS_GPRS_REPORT_PRIO_DESC,
-    DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC,
-    DE_RR_REST_OCTETS_NC_MEAS_PARAM,
-    DE_RR_REST_OCTETS_SI2Q_EXT_INFO,
-    DE_RR_REST_OCTETS_CCN_SUPPORT_DESC,
-    DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC,
-    DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD,
-    DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD,
-    DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC,
-    DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2,
-    DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM,
-    DE_RR_REST_OCTETS_GPRS_INDICATOR,
-    DE_RR_REST_OCTETS_SI4_REST_OCTETS_O,
-    DE_RR_REST_OCTETS_SI4_REST_OCTETS_S,
-    DE_RR_REST_OCTETS_LSA_PARAMETERS,
-    DE_RR_REST_OCTETS_LSA_ID_INFO,
-    DE_RR_REST_OCTETS_PCH_AND_NCH_INFO,
-    DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS,
-    DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC,
-    DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS,
-    DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO,
-    DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS,
-    DE_RR_REST_OCTETS_PBCCH_DESC,
-    DE_RR_REST_OCTETS_GSM_DESC,
-    DE_RR_REST_OCTETS_RTD_DESC,
-    DE_RR_REST_OCTETS_BSIC_DESC,
-    DE_RR_REST_OCTETS_REPORT_PRIO_DESC,
-    DE_RR_REST_OCTETS_CDMA2000_DESC,
-    DE_RR_REST_OCTETS_SERVING_CELL_DATA,
-    DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO,
-    DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING,
-    DE_RR_REST_OCTETS_NONE
-}
-rr_rest_octets_elem_idx_t;
-
-#define NUM_GSM_RR_REST_OCTETS_ELEM (sizeof(gsm_rr_rest_octets_elem_strings)/sizeof(value_string))
-gint ett_gsm_rr_rest_octets_elem[NUM_GSM_RR_REST_OCTETS_ELEM];
-
-/*
-10.5.2 Radio Resource management information elements
- * [3] 10.5.2.1a BA Range
- */
-guint16
-de_rr_ba_range(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    gint bit_offset;
-    guint8 value;
-
-    curr_offset = offset;
-    proto_tree_add_item(tree, hf_gsm_a_rr_range_nb, tvb, curr_offset, 1, FALSE);
-    value = tvb_get_guint8(tvb, curr_offset);
-    curr_offset += 1;
-    bit_offset = curr_offset << 3;
-    while (value)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        value -= 1;
-    }
-
-    curr_offset += len - 1;
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.1b Cell Channel Description
- */
-
-#define ARFCN_MAX 1024 /* total number of ARFCNs defined */
-
-static void display_channel_list(guint8 *list, tvbuff_t *tvb, proto_tree *tree, guint32 offset)
-{
-    int arfcn;
-    proto_item *ti=NULL;
-
-    ti = proto_tree_add_text(tree, tvb, 0, offset, "List of ARFCNs =");
-    for (arfcn=0; arfcn<ARFCN_MAX; arfcn++) {
-        if (list[arfcn])
-            proto_item_append_text(ti, " %d", arfcn);
-    }
-
-    return;
-}
-
-static gint greatest_power_of_2_lesser_or_equal_to(gint index)
-{
-    gint j = 1;
-    do {
-        j<<=1;
-    } while (j<=index);
-    j >>= 1;
-    return j;
-}
-
-static gint f_k(gint k, gint *w, gint range)
-{
-    gint index, n, j;
-
-    index = k;
-    range -= 1;
-    range = range/greatest_power_of_2_lesser_or_equal_to(index);
-    n = w[index]-1;
-
-    while (index>1) {
-        j = greatest_power_of_2_lesser_or_equal_to(index);
-        range = 2*range+1;
-        if ((2*index) < 3*j){ /* left child */
-            index -= j/2;
-            n = (n+w[index]-1+((range-1)/2)+1)%range;
-        }
-        else { /* right child */
-            index -= j;
-            n = (n+w[index]-1+1)%range;
-        }
-    }
-
-    return (n+1)%1024;
-}
-
-static void dissect_channel_list_n_range(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gint range)
-{
-    gint curr_offset=offset, f0, arfcn_orig, bits, w[64], wsize, i, wi;
-    gint octet, nwi=1, jwi=0, wbits, imax, iused, arfcn;
-    guint8 list[1024];
-
-    memset((void*)list,0,sizeof(list));
-
-    octet = tvb_get_guint8(tvb, curr_offset++);
-    if (range==1024) {
-        f0 = (octet>>2)&1;
-        if (f0)
-            list[0] = 1;
-        bits = 2;
-        arfcn_orig = 0;
-        wsize = 10;
-        imax = 16;
-    }
-    else {
-        arfcn_orig = (octet&1);
-        arfcn_orig = (arfcn_orig << 8) + tvb_get_guint8(tvb, curr_offset++);
-        octet = tvb_get_guint8(tvb, curr_offset++);
-        arfcn_orig = (arfcn_orig << 1) + (octet>>7);
-        list[arfcn_orig] = 1;
-        bits = 7;
-        switch (range) {
-        case 512:
-            wsize=9;
-            imax = 17;
-            break;
-        case 256:
-            wsize=8;
-            imax = 21;
-            break;
-        case 128:
-            wsize=7;
-            imax = 28;
-            break;
-        default:
-            wsize=0;
-            imax = 0;
-            DISSECTOR_ASSERT_NOT_REACHED();
-        }
-    }
-    iused = imax;   /* in case the list is actually full */
-
-    /* extract the variable size w[] elements */
-    for (i=1; i<=imax; i++) {
-        wi = octet & ~(0xff<<bits);	 /* mask "bits" low bits to start wi from existing octet */
-        wbits = bits;
-        if (wsize>wbits) {	         /* need to extract more bits from the next octet */
-            octet = tvb_get_guint8(tvb, curr_offset++);
-            wi = (wi << 8) + octet;
-            bits = 8;
-            wbits += 8;
-        }
-
-        if (wbits>wsize) {      /* now we have too many bits - save some */
-            bits = wbits - wsize;
-            wi >>= bits;
-        }
-        else			/* just right number of bits */
-            bits = 0;
-
-        w[i] = wi;
-        if ((w[i]==0) || ((curr_offset-offset)>len)) {
-            iused = i - 1;
-            break;	  /* all remaining elements must also be zero */
-        }
-
-        if (++jwi==nwi) {	/* check if the number of wi at this wsize has been extracted */
-            jwi = 0;		/* reset the count of wi at this size */
-            nwi <<= 1;		/* get twice as many of the next size */
-            wsize--;		/* make the next size 1 bit smaller */
-        }
-    }
-
-    for (i=1; i<=iused; i++) {
-        arfcn = (f_k(i, w, range) + arfcn_orig)%1024;
-        list[arfcn] = 1;
-    }
-
-    display_channel_list(list, tvb, tree, offset);
-
-    return;
-}
-
-static guint16
-dissect_arfcn_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    guint8  oct,bit,byte;
-    guint16 arfcn;
-    proto_item	*item;
-
-    curr_offset = offset;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    /* FORMAT-ID, Format Identifier (part of octet 3)*/
-    proto_tree_add_item(tree, hf_gsm_a_rr_format_id, tvb, curr_offset, 1, FALSE);
-
-    if ((oct & 0xc0) == 0x00)
-    {
-        /* bit map 0 */
-        item = proto_tree_add_text(tree,tvb, curr_offset, len, "List of ARFCNs =");
-        bit = 4;
-        arfcn = 125;
-        for (byte = 0;byte <= len-1;byte++)
-        {
-            oct = tvb_get_guint8(tvb, curr_offset);
-            while (bit-- != 0)
-            {
-                arfcn--;
-                if (((oct >> bit) & 1) == 1)
-                {
-                    proto_item_append_text(item," %d",arfcn);
-                }
-            }
-            bit = 8;
-            curr_offset++;
-        }
-    }
-    else if ((oct & 0xc8) == 0x80)
-    {
-        /* 1024 range */
-        dissect_channel_list_n_range(tvb, tree, curr_offset, len, 1024);
-        curr_offset = curr_offset + len;
-    }
-    else if ((oct & 0xce) == 0x88)
-    {
-        /* 512 range */
-        dissect_channel_list_n_range(tvb, tree, curr_offset, len, 512);
-        curr_offset = curr_offset + len;
-    }
-    else if ((oct & 0xce) == 0x8a)
-    {
-        /* 256 range */
-        dissect_channel_list_n_range(tvb, tree, curr_offset, len, 256);
-        curr_offset = curr_offset + len;
-    }
-    else if ((oct & 0xce) == 0x8c)
-    {
-        /* 128 range */
-        dissect_channel_list_n_range(tvb, tree, curr_offset, len, 128);
-        curr_offset = curr_offset + len;
-    }
-    else if ((oct & 0xce) == 0x8e)
-    {
-        /* variable bit map */
-        arfcn = ((oct & 0x01) << 9) | (tvb_get_guint8(tvb, curr_offset+1) << 1) | ((tvb_get_guint8(tvb, curr_offset + 2) & 0x80) >> 7);
-        item = proto_tree_add_text(tree,tvb,curr_offset,len,"List of ARFCNs = %d",arfcn);
-        curr_offset = curr_offset + 2;
-        bit = 7;
-        for (byte = 0;byte <= len-3;byte++)
-        {
-            oct = tvb_get_guint8(tvb, curr_offset);
-            while (bit-- != 0)
-            {
-                arfcn++;
-                if (((oct >> bit) & 1) == 1)
-                {
-                    proto_item_append_text(item," %d",arfcn);
-                }
-            }
-            bit = 8;
-            curr_offset++;
-        }
-    }
-
-    return(curr_offset - offset);
-}
-
-guint16
-de_rr_cell_ch_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
-}
-/*
- * [3] 10.5.2.1c BA List Pref
- */
-guint16
-de_rr_ba_list_pref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    gint bit_offset;
-    guint8 value;
-
-    curr_offset = offset;
-    proto_tree_add_item(tree, hf_gsm_a_rr_ba_list_pref_length, tvb, curr_offset, 1, FALSE);
-    curr_offset += 1;
-    bit_offset = curr_offset << 3;
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    while (value)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_lower, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_range_higher, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    while (value)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_freq, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-    }
-
-    curr_offset += len - 1;
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.1d UTRAN Frequency List
- */
-guint16
-de_rr_utran_freq_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    gint bit_offset;
-    guint8 value;
-
-    curr_offset = offset;
-    proto_tree_add_item(tree, hf_gsm_a_rr_utran_freq_list_length, tvb, curr_offset, 1, FALSE);
-    curr_offset += 1;
-    bit_offset = curr_offset << 3;
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    while (value)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
-        bit_offset += 14;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    while (value)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
-        bit_offset += 14;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-    }
-
-    curr_offset += len - 1;
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.1e Cell selection indicator after release of all TCH and SDCCH
- */
-static const guint8
-convert_n_to_p[32] = {   0, 10, 19, 28, 26, 44, 52, 60, 67, 74, 81, 88, 95, 102, 109, 116,
-                       122,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0,   0,   0};
-
-static const guint8
-convert_n_to_q[32] = {   0,   9,  17,  25,  32, 39, 46, 53, 59, 65, 71, 77, 83, 89, 95, 101,
-                       106, 111, 116, 121, 126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   0};
-
-guint16
-de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree *subtree, *subtree2;
-    proto_item *item, *item2;
-    guint32 curr_offset;
-    gint bit_offset, bit_offset_sav, idx, xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
-    guint8 value, length;
-
-    curr_offset = offset;
-    length = tvb_get_guint8(tvb, curr_offset);
-    curr_offset += 1;
-    bit_offset = curr_offset << 3;
-    value = tvb_get_bits8(tvb,bit_offset,3);
-    bit_offset += 3;
-    switch (value)
-    {
-    case 0: /* GSM Description */
-        bit_offset_sav = bit_offset;
-        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);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GSM_DESC]);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        while (value)
-        {
-            proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Band Indicator: %s",tvb_get_bits8(tvb,bit_offset,1) ? "1900" : "1800");
-            bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_arfcn, tvb, bit_offset, 10, FALSE);
-            bit_offset += 10;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, bit_offset, 6, FALSE);
-            bit_offset += 6;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-        }
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-        break;
-    case 1: /* UTRAN FDD Description */
-        bit_offset_sav = bit_offset;
-        item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", 
-                                   gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        while (value)
-        {
-            if (tvb_get_bits8(tvb,bit_offset,1))
-            {
-                bit_offset += 1;
-                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, FALSE);
-                bit_offset += 3;
-            }
-            else
-                bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
-            bit_offset += 14;
-            if (tvb_get_bits8(tvb,bit_offset,1))
-            {
-                bit_offset += 1;
-                xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
-                proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "FDD Indic0: %d", xdd_indic0);
-                bit_offset += 1;
-                idx = tvb_get_bits8(tvb,bit_offset,5);
-                proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of FDD Cells : %d", idx);
-                bit_offset += 5;
-                idx = convert_n_to_p[idx];
-                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);
-                subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]);
-                proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
-                if (xdd_indic0)
-                {
-                    proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Scrambling Code: %d", 0);
-                    proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity: %d", 0);
-                }
-                if (idx)
-                {
-                    wsize = 10;
-                    nwi = 1;
-                    jwi = 0;
-                    i = 1;
-   
-                    while (idx > 0)
-                    {
-                        w[i] = tvb_get_bits16(tvb, bit_offset, wsize, FALSE);
-                        bit_offset += wsize;
-                        idx -= wsize;
-                        if (w[i] == 0)
-                        {
-                            idx = 0;
-                            break;
-                        }
-                        if (++jwi==nwi)
-                        {
-                            jwi = 0;
-                            nwi <<= 1;
-                            wsize--;
-                        }
-                        i++;
-                    }
-                    if (idx < 0)
-                    {
-                        bit_offset += idx;
-                    }
-                    iused = i-1;
-   
-                    for (i=1; i <= iused; i++)
-                    {
-                        xdd_cell_info = f_k(i, w, 1024);
-                        proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, 
-                                            "Scrambling Code: %d", xdd_cell_info & 0x01FF);
-                        proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, 
-                                            "Diversity: %d", (xdd_cell_info >> 9) & 0x01);
-                    }
-                }
-            }
-            else
-                bit_offset += 1;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-        }
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-        break;
-    case 2: /* UTRAN TDD Description */
-        bit_offset_sav = bit_offset;
-        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);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        while (value)
-        {
-            if (tvb_get_bits8(tvb,bit_offset,1))
-            {
-                bit_offset += 1;
-                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, FALSE);
-                bit_offset += 3;
-            }
-            else
-                bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
-            bit_offset += 14;
-            if (tvb_get_bits8(tvb,bit_offset,1))
-            {
-                bit_offset += 1;
-                xdd_indic0 = tvb_get_bits8(tvb,bit_offset,1);
-                proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "TDD Indic0: %d", xdd_indic0);
-                bit_offset += 1;
-                idx = tvb_get_bits8(tvb,bit_offset,5);
-                proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
-                bit_offset += 5;
-                idx = convert_n_to_q[idx];
-                item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s", 
-                                            gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
-                subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
-                proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
-                if (xdd_indic0)
-                {
-                    proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Cell Parameter: %d", 0);
-                    proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Sync Case TSTD: %d", 0);
-                    proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0, "Diversity TDD: %d", 0);
-                }
-                if (idx)
-                {
-                    wsize = 9;
-                    nwi = 1;
-                    jwi = 0;
-                    i = 1;
-   
-                    while (idx > 0)
-                    {
-                        w[i] = tvb_get_bits16(tvb, bit_offset, wsize, FALSE);
-                        bit_offset += wsize;
-                        idx -= wsize;
-                        if (w[i] == 0)
-                        {
-                            idx = 0;
-                            break;
-                        }
-                        if (++jwi==nwi)
-                        {
-                            jwi = 0;
-                            nwi <<= 1;
-                            wsize--;
-                        }
-                        i++;
-                    }
-                    if (idx < 0)
-                    {
-                        bit_offset += idx;
-                    }
-                    iused = i-1;
-						
-                    for (i=1; i <= iused; i++)
-                    {
-                        xdd_cell_info = f_k(i, w, 512);
-                        proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
-                                            "Cell Parameter: %d", xdd_cell_info & 0x07F);
-                        proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
-                                            "Sync Case TSTD: %d", (xdd_cell_info >> 7) & 0x01);
-                        proto_tree_add_text(subtree2,tvb, bit_offset>>3, 0,
-                                            "Diversity TDD: %d", (xdd_cell_info >> 8) & 0x01);
-                    }
-                }
-            }
-            else
-                bit_offset += 1;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-        }
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-        break;
-    default:
-        break;
-    }
-
-    curr_offset += length;
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.2 Cell Description
- */
-guint16
-de_rr_cell_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint8	oct;
-    guint32	curr_offset;
-    guint16 bcch_arfcn;
-
-    curr_offset = offset;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 2, "%s",
-                            gsm_rr_elem_strings[DE_RR_CELL_DSC].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_DSC]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_ncc, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_bcc, tvb, curr_offset, 1, FALSE);
-    bcch_arfcn = (tvb_get_guint8(tvb,curr_offset) & 0xc0) << 2;
-    bcch_arfcn = bcch_arfcn | tvb_get_guint8(tvb,curr_offset+1);
-    proto_tree_add_uint(subtree, hf_gsm_a_bcch_arfcn , tvb, curr_offset, 2, bcch_arfcn );
-
-    curr_offset = curr_offset + 2;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.3 Cell Options (BCCH)
- */
-static const value_string gsm_a_rr_dtx_bcch_vals[] = {
-    { 0x00, "The MSs may use uplink discontinuous transmission" },
-    { 0x01, "The MSs shall use uplink discontinuous transmission" },
-    { 0x02, "The MSs shall not use uplink discontinuous transmission" },
-    { 0x03, "Reserved" },
-    {    0, NULL } };
-
-static const value_string gsm_a_rr_radio_link_timeout_vals[] = {
-    { 0x00, "4" },
-    { 0x01, "8" },
-    { 0x02, "12" },
-    { 0x03, "16" },
-    { 0x04, "20" },
-    { 0x05, "24" },
-    { 0x06, "28" },
-    { 0x07, "32" },
-    { 0x08, "36" },
-    { 0x09, "40" },
-    { 0x0A, "44" },
-    { 0x0B, "48" },
-    { 0x0C, "52" },
-    { 0x0D, "56" },
-    { 0x0E, "60" },
-    { 0x0F, "64" },
-    {    0, NULL } };
-
-static guint16
-de_rr_cell_opt_bcch(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 1, "%s",
-                               gsm_rr_elem_strings[DE_RR_CELL_OPT_BCCH].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_OPT_BCCH]);
-
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pwrc, tvb, (curr_offset<<3)+1, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_dtx_bcch, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_radio_link_timeout, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.3a Cell Options (SACCH)
- */
-static const value_string gsm_a_rr_dtx_sacch_vals[] = {
-    { 0x00, "The MS may use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
-    { 0x01, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
-    { 0x02, "The MS shall not use uplink discontinuous transmission on a TCH-F. The MS shall not use uplink discontinuous transmission on TCH-H" },
-    { 0x03, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS may use uplink discontinuous transmission on TCH-H" },
-    { 0x04, "The MS may use uplink discontinuous transmission on a TCH-F. The MS may use uplink discontinuous transmission on TCH-H" },
-    { 0x05, "The MS shall use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
-    { 0x06, "The MS shall not use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
-    { 0x07, "The MS may use uplink discontinuous transmission on a TCH-F. The MS shall use uplink discontinuous transmission on TCH-H" },
-    {    0, NULL } };
-
-static guint16
-de_rr_cell_opt_sacch(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint8	oct;
-    guint8	dtx;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-    dtx = ((oct&0x80)>>5)|((oct&0x30)>>4); /* DTX is a split filed in bits 8, 6 and 5 */
-    item = proto_tree_add_text(tree, tvb, curr_offset, 1, "%s",
-                               gsm_rr_elem_strings[DE_RR_CELL_OPT_SACCH].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_OPT_SACCH]);
-
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pwrc, tvb, (curr_offset<<3)+1, 1, FALSE);
-    proto_tree_add_uint(subtree, hf_gsm_a_rr_dtx_sacch, tvb, curr_offset, 1, dtx);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_radio_link_timeout, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.4 Cell Selection Parameters
- */
-static guint16
-de_rr_cell_sel_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint8	oct;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-    item = proto_tree_add_text(tree, tvb, curr_offset, 2, "%s",
-                               gsm_rr_elem_strings[DE_RR_CELL_SEL_PARAM].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CELL_SEL_PARAM]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_cell_reselect_hyst, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_ms_txpwr_max_cch, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_acs, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_neci, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_access_min, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.4a MAC Mode and Channel Coding Requested
- * [3] 10.5.2.5 Channel Description
- */
-guint16
-de_rr_ch_dsc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    guint8	oct8,subchannel;
-    guint16 arfcn, hsn, maio;
-    proto_tree	*subtree;
-    proto_item	*item;
-    const gchar *str;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree,tvb, curr_offset, 3, "%s", gsm_rr_elem_strings[DE_RR_CH_DSC].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CH_DSC]);
-
-    /* Octet 2 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-
-    if ((oct8 & 0xf8) == 0x08)
-    {
-        str = "TCH/F + ACCHs";
-        other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
-    }
-    else
-    {
-        if ((oct8 & 0xf0) == 0x10)
-        {
-            str = "TCH/H + ACCHs, Subchannel";
-            subchannel = ((oct8 & 0x08)>>3);
-        }
-        else if ((oct8 & 0xe0) == 0x20)
-        {
-            str = "SDCCH/4 + SACCH/C4 or CBCH (SDCCH/4), Subchannel";
-            subchannel = ((oct8 & 0x18)>>3);
-        }
-        else if ((oct8 & 0xc0) == 0x40)
-        {
-            str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
-            subchannel = ((oct8 % 0x38)>>3);
-        } else {
-            str = "Unknown channel information";
-            subchannel = oct8;
-        }
-	
-        other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
-    }
-
-    other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
-
-    curr_offset +=1;
-	
-    /* Octet 3 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-    other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
-	
-
-    if ((oct8 & 0x10) == 0x10)
-    {
-        /* Hopping sequence */
-        maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
-        hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
-        str = "Yes";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
-    }
-    else
-    {
-        /* single ARFCN */
-        arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
-        str = "No";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
-    }
-	
-    curr_offset = curr_offset + 2;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.5a Channel Description 2
- */
-static guint16
-de_rr_ch_dsc2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    guint8	oct8,subchannel;
-    guint16 arfcn, hsn, maio;
-    proto_tree	*subtree;
-    proto_item	*item;
-    const gchar *str;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree,tvb, curr_offset, 3, "%s", gsm_rr_elem_strings[DE_RR_CH_DSC2].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CH_DSC2]);
-
-    /* Octet 2 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-
-    if ((oct8 & 0xf8) == 0x0)
-    {
-        str = "TCH/F + FACCH/F and SACCH/M";
-        other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
-    }
-    else if ((oct8 & 0xf8) == 0x08)
-    {
-        str = "TCH/F + FACCH/F and SACCH/F";
-        other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
-    }
-    else if ((oct8 & 0xf8) == 0xf0)
-    {
-        str = "TCH/F + FACCH/F and SACCH/M + bi- and unidirectional channels";
-        other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
-    }
-    else
-    {
-        if ((oct8 & 0xf0) == 0x10)
-        {
-            str = "TCH/H + ACCHs, Subchannel";
-            subchannel = ((oct8 & 0x08)>>3);
-        }
-        else if ((oct8 & 0xe0) == 0x20)
-        {
-            str = "SDCCH/4 + SACCH/C4 or CBCH (SDCCH/4), Subchannel";
-            subchannel = ((oct8 & 0x18)>>3);
-        }
-        else if ((oct8 & 0xc0) == 0x40)
-        {
-            str = "SDCCH/8 + SACCH/C8 or CBCH (SDCCH/8), Subchannel";
-            subchannel = ((oct8 % 0x38)>>3);
-        }
-        else if ((oct8 & 0xc0) == 0x80)
-        {
-            str = "TCH/F + FACCH/F and SACCH/M + bidirectional channels at timeslot";
-            subchannel = ((oct8 % 0x38)>>3);
-        }
-        else if ((oct8 & 0xe0) == 0xc0)
-        {
-            str = "TCH/F + FACCH/F and SACCH/M + unidirectional channels at timeslot";
-            subchannel = ((oct8 % 0x38)>>3);
-        } else {
-            str = "Unknown channel information";
-            subchannel = oct8;
-        }
-        other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s %d",a_bigbuf,str,subchannel);
-    }
-
-    other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
-
-    curr_offset +=1;
-	
-    /* Octet 3 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-    other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
-
-    if ((oct8 & 0x10) == 0x10)
-    {
-        /* Hopping sequence */
-        maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
-        hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
-        str = "Yes";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
-    }
-    else
-    {
-        /* single ARFCN */
-        arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
-        str = "No";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
-    }
-	
-    curr_offset = curr_offset + 2;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.5c Channel Description 3
- */
-static guint16
-de_rr_ch_dsc3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    guint8	oct8;
-    guint16 arfcn, hsn, maio;
-    proto_tree	*subtree;
-    proto_item	*item;
-    const gchar *str;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree,tvb, curr_offset, 3, "%s", gsm_rr_elem_strings[DE_RR_CH_DSC3].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CH_DSC3]);
-
-    /* Octet 2 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-    other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
-
-    if ((oct8 & 0x10) == 0x10)
-    {
-        /* Hopping sequence */
-        maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
-        hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
-        str = "Yes";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
-    }
-    else
-    {
-        /* single ARFCN */
-        arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
-        str = "No";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
-    }
-	
-    curr_offset = curr_offset + 2;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.6 Channel Mode
- */
-/* Channel Mode  */
-static const value_string gsm_a_rr_channel_mode_vals[] = {
-    { 0x00, "signalling only"},
-    { 0x01, "speech full rate or half rate version 1(GSM FR or GSM HR)"},
-    { 0x21, "speech full rate or half rate version 2(GSM EFR)"},
-    { 0x41, "speech full rate or half rate version 3(FR AMR or HR AMR)"},
-    { 0x81, "speech full rate or half rate version 4(OFR AMR-WB or OHR AMR-WB)"},
-    { 0x82, "speech full rate or half rate version 5(FR AMR-WB )"},
-    { 0x83, "speech full rate or half rate version 6(OHR AMR )"},
-    { 0x61, "data, 43.5 kbit/s (downlink)+14.5 kbps (uplink)"},
-    { 0x62, "data, 29.0 kbit/s (downlink)+14.5 kbps (uplink)"},
-    { 0x64, "data, 43.5 kbit/s (downlink)+29.0 kbps (uplink)"},
-    { 0x67, "data, 14.5 kbit/s (downlink)+43.5 kbps (uplink)"},
-    { 0x65, "data, 14.5 kbit/s (downlink)+29.0 kbps (uplink)"},
-    { 0x66, "data, 29.0 kbit/s (downlink)+43.5 kbps (uplink)"},
-    { 0x27, "data, 43.5 kbit/s radio interface rate"},
-    { 0x63, "data, 32.0 kbit/s radio interface rate"},
-    { 0x43, "data, 29.0 kbit/s radio interface rate"},
-    { 0x0f, "data, 14.5 kbit/s radio interface rate"},
-    { 0x03, "data, 12.0 kbit/s radio interface rate"},
-    { 0x0b, "data, 6.0 kbit/s radio interface rate"},
-    { 0x13, "data, 3.6 kbit/s radio interface rate"},
-    {    0, NULL }
-};
-
-guint16
-de_rr_ch_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_channel_mode, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.7 Channel Mode 2
- */
-
-static const value_string gsm_a_rr_channel_mode2_vals[] = {
-    { 0x00, "signalling only"},
-    { 0x05, "speech half rate version 1(GSM HR)"},
-    { 0x25, "speech half rate version 2(GSM EFR)"},
-    { 0x45, "speech half rate version 3(HR AMR)"},
-    { 0x85, "speech half rate version 4(OHR AMR-WB)"},
-    { 0x06, "speech half rate version 6(OHR AMR )"},
-    { 0x0f, "data, 6.0 kbit/s radio interface rate"},
-    { 0x17, "data, 3.6 kbit/s radio interface rate"},
-    {    0, NULL }
-};
-
-static guint16
-de_rr_ch_mode2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_channel_mode2, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.7a UTRAN Classmark information element
- */
-static guint16
-de_rr_utran_cm(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    tvbuff_t *rrc_irat_ho_info_tvb;
-    static packet_info p_info;
-
-    curr_offset = offset;
-    if (len)
-    {
-        rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
-        if (rrc_irat_ho_info_handle)
-            call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, &p_info, tree);
-    }
-
-    curr_offset += len;
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.7b (void)
- */
-
-/*
- * [3] 10.5.2.7c Classmark Enquiry Mask
- * Bit 8:
- * 0	CLASSMARK CHANGE message is requested
- * 1	CLASSMARK CHANGE message is not requested
- * Bits 7-5 . 5
- * 000	UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is requested
- * 111	UTRAN CLASSMARK CHANGE message including status on predefined configurations (i.e. Sequence Description) is not requested.
- * All other values shall not be sent. If received, they shall be interpreted as '000'.
- * Bit 4:
- * 0	CDMA2000 CLASSMARK CHANGE message requested
- * 1	CDMA2000 CLASSMARK CHANGE message not requested.
- * Bit 3:
- * 0	GERAN IU MODE CLASSMARK CHANGE message requested
- * 1	GERAN IU MODE CLASSMARK CHANGE message not requested.
- * Bits 2 - 1: spare(0).
- */
-static const true_false_string gsm_a_msg_req_value  = {
-    "message is not requested",
-    "message is requested"
-};
-
-static const value_string gsm_a_rr_utran_cm_cng_msg_req_vals[] = {
-    { 0x0, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x1, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x2, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x3, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x4, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x5, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x6, "message including status on predefined configurations (i.e. Sequence Description) is requested"},
-    { 0x7, "message including status on predefined configurations (i.e. Sequence Description) is not requested."},
-    {   0, NULL }
-};
-guint16
-de_rr_cm_enq_mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_utran_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_cdma200_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_geran_iu_cm_cng_msg_req, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.8 Channel Needed
- */
-static const value_string gsm_a_rr_channel_needed_vals[] = {
-    { 0x00, "Any channel"},
-    { 0x01, "SDCCH"},
-    { 0x02, "TCH/F (Full rate)"},
-    { 0x03, "TCH/H or TCH/F (Dual rate)"},
-    {    0, NULL }
-};
-guint16
-de_rr_chnl_needed(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-    gint bit_offset;
-
-    curr_offset = offset;
-    if (UPPER_NIBBLE==len)
-        bit_offset = 4;
-    else
-        bit_offset = 0;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
-                               gsm_rr_elem_strings[DE_RR_CHNL_NEEDED].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CHNL_NEEDED]);
-
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch1, tvb, (curr_offset<<3)+bit_offset+2, 2, FALSE);
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch2, tvb, (curr_offset<<3)+bit_offset, 2, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.8a Channel Request Description
- * [3] 10.5.2.8b Channel Request Description 2
- */
-/*
- * [3] 10.5.2.9 Cipher Mode Setting
- */
-/* SC (octet 1) */
-static const value_string gsm_a_rr_sc_vals[] = {
-    { 0, "No ciphering"},
-    { 1, "Start ciphering"},
-    { 0, NULL }
-};
-/* algorithm identifier
- * If SC=1 then:
- * bits
- * 4 3 2
- */
-guint16
-de_rr_cip_mode_set(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    gint bit_offset;
-    guint64 value;
-
-    curr_offset = offset;
-
-    /* Cipher Mode Setting
-     * Note: The coding of fields SC and algorithm identifier is defined in [44.018]
-     * as part of the Cipher Mode Setting IE.
-     */
-    if (UPPER_NIBBLE==len)
-        bit_offset = 4;
-    else
-        bit_offset = 0;
-
-    proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_sc, tvb, (curr_offset<<3)+bit_offset+3, 1, &value, FALSE);
-    if (value == 1){ /* Start ciphering */
-        /* algorithm identifier */
-        proto_tree_add_bits_item(tree, hf_gsm_a_algorithm_id, tvb, (curr_offset<<3)+bit_offset, 3, FALSE);
-    }
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.10 Cipher Response
- */
-/* CR (octet 1) */
-static const value_string gsm_a_rr_cr_vals[] = {
-    { 0, "IMEISV shall not be included"},
-    { 1, "IMEISV shall be included"},
-    { 0, NULL }
-};
-
-static guint16
-de_rr_cip_mode_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    gint bit_offset;
-
-    curr_offset = offset;
-    if (UPPER_NIBBLE==len)
-        bit_offset = 4;
-    else
-        bit_offset = 0;
-
-    /* Cipher Mode Response
-     * Note: The coding of field CR is defined in [44.018]
-     * as part of the Cipher Mode Response IE.
-     */
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_cr, tvb, (curr_offset<<3)+bit_offset+3, 1, FALSE);
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/* [3] 10.5.2.11 Control Channel Description */
-
-static const value_string gsm_a_rr_mscr_vals[] = {
-    { 0, "MSC is Release '98 or older"},
-    { 1, "MSC is Release '99 onwards"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_att_vals[] = {
-    { 0, "MSs in the cell are not allowed to apply IMSI attach and detach procedure"},
-    { 1, "MSs in the cell shall apply IMSI attach and detach procedure"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_ccch_conf_vals[] = {
-    { 0, "1 basic physical channel used for CCCH, not combined with SDCCHs"},
-    { 1, "1 basic physical channel used for CCCH, combined with SDCCHs"},
-    { 2, "2 basic physical channels used for CCCH, not combined with SDCCHs"},
-    { 3, "Reserved"},
-    { 4, "3 basic physical channels used for CCCH, not combined with SDCCHs"},
-    { 5, "Reserved"},
-    { 6, "4 basic physical channels used for CCCH, not combined with SDCCHs"},
-    { 7, "Reserved"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_cbq3_vals[] = {
-    { 0, "Iu mode not supported"},
-    { 1, "Iu mode capable MSs barred"},
-    { 2, "Iu mode supported, cell not barred"},
-    { 3, "Iu mode supported, cell not barred"},
-    { 0, NULL }
-};
-
-static guint16
-de_rr_ctrl_ch_desc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint8	oct;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
-                               gsm_rr_elem_strings[DE_RR_CTRL_CH_DESC].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CTRL_CH_DESC]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_mscr, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_att, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_bs_ag_blks_res, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_ccch_conf, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq3, tvb, (curr_offset<<3)+1, 2, FALSE);
-    proto_tree_add_uint(subtree, hf_gsm_a_rr_bs_pa_mfrms, tvb, curr_offset, 1, (oct&0x07)+2);
-
-    curr_offset = curr_offset + 1;
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_t3212, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/* [3] 10.5.2.11a DTM Information Details
- */
-/*
- * [3]  10.5.2.11b	Dynamic ARFCN Mapping	
- */
-static const value_string gsm_a_rr_gsm_band_vals[] = {
-    {  0, "GSM 750"},
-    {  1, "DCS 1800"},
-    {  2, "PCS 1900"},
-    {  3, "GSM T 380"},
-    {  4, "GSM T 410"},
-    {  5, "GSM T 900"},
-    {  6, "GSM 710"},
-    {  7, "GSM T 810"},
-    {  8, "Reserved"},
-    {  9, "Reserved"},
-    { 10, "Reserved"},
-    { 11, "Reserved"},
-    { 12, "Reserved"},
-    { 13, "Reserved"},
-    { 14, "Reserved"},
-    { 15, "Reserved"},
-    {  0, NULL }
-};
-
-
-static guint16
-de_rr_dyn_arfcn_map(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    gint bit_offset;
-    guint64 length;
-    guint value;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    proto_tree_add_bits_ret_val(tree, hf_gsm_a_rr_dyn_arfcn_length, tvb, bit_offset, 8, &length, FALSE);
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    while (value && length)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_gsm_band, tvb, bit_offset, 4, FALSE);
-        bit_offset += 4;
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_arfcn_first, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_band_offset, tvb, bit_offset, 10, FALSE);
-        bit_offset += 10;
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_arfcn_range, tvb, bit_offset, 7, FALSE);
-        bit_offset += 7;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        length -= 4;
-    }
-
-    curr_offset = curr_offset + len;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.12 Frequency Channel Sequence
- */
-static guint16
-de_rr_freq_ch_seq(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    gint bit_offset, i;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_lowest_arfcn, tvb, curr_offset, 1, FALSE);
-    curr_offset += 1;
-    bit_offset = curr_offset << 3;
-    for (i=0; i<16; i++)
-    {
-        proto_tree_add_bits_item(tree, hf_gsm_a_rr_inc_skip_arfcn, tvb, bit_offset, 4, FALSE);
-        bit_offset += 4;
-    }
-
-    curr_offset = curr_offset + 8;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.13 Frequency List
- */
-/*
- * [3] 10.5.2.13 Frequency List
- * 
- * Bit Bit Bit Bit Bit format notation
- * 8 7  4 3 2
- * 0 0  X X X bit map 0
- * 1 0  0 X X 1024 range
- * 1 0  1 0 0 512 range
- * 1 0  1 0 1 256 range
- * 1 0  1 1 0 128 range
- * 1 0  1 1 1 variable bit map
- */
-/* The mask 0xce (1100 1110) will produce the result 0110 0111*/ 
-static const value_string gsm_a_rr_freq_list_format_id_vals[] = {
-    { 0x00, "bit map 0"},
-    { 0x02, "bit map 0"},
-    { 0x04, "bit map 0"},
-    { 0x06, "bit map 0"},
-    { 0x08, "bit map 0"},
-    { 0x0a, "bit map 0"},
-    { 0x0c, "bit map 0"},
-    { 0x0e, "bit map 0"},
-    { 0x40, "1024 range"},
-    { 0x41, "1024 range"},
-    { 0x42, "1024 range"},
-    { 0x43, "1024 range"},
-    { 0x44, "512 range"},
-    { 0x45, "256 range"},
-    { 0x46, "128 range"},
-    { 0x47, "variable bit map"},
-    { 0x00, NULL }
-};
-static guint16
-de_rr_freq_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    return dissect_arfcn_list(tvb, tree, offset, len, add_string, string_len);
-}
-/*
- * [3] 10.5.2.14 Frequency Short List
- *
- *The Frequency Short List information element is a type 3 information element of 10 octet length.
- *
- * This element is encoded exactly as the Frequency List information element,
- * except that it has a fixed length instead of a variable length and does
- * not contain a length indicator and that it shall not be encoded in bitmap 0 format.
- */
-
- static guint16
-de_rr_freq_short_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
- {
-     return dissect_arfcn_list(tvb, tree, offset, 9, add_string, string_len);
- }
-
-/*
- * [3] 10.5.2.14a Frequency Short List 2
- *
- * The Frequency Short List information element is a type 3 information element of 8 octet length.
- *
- * This element is encoded exactly as the Frequency List information element,
- * except that it has a fixed length instead of a variable length and does
- * not contain a length indicator and that it shall not be encoded in bitmap 0 format.
- */
-static guint16
-de_rr_freq_short_list2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    return dissect_arfcn_list(tvb, tree, offset, 8, add_string, string_len);
-}
-/*
- * [3] 10.5.2.14b Group Channel Description
- */
-
-/*
- * [3] 10.5.2.14c GPRS Resumption
- */
-static const true_false_string gsm_a_rr_gprs_resumption_ack_value  = {
-    "Resumption of GPRS services successfully acknowledged",
-    "Resumption of GPRS services not successfully acknowledged"
-};
-
-static guint16
-de_rr_gprs_resumption(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_gprs_resumption_ack, tvb, curr_offset, 1, FALSE);
-    curr_offset += 1;
-
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.14d GPRS broadcast information
- */
-
-static gint
-de_rr_rest_oct_gprs_cell_options(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree, *subtree2;
-    proto_item *item, *item2;
-    gint curr_bit_offset, curr_bit_offset_sav;
-    guint8 value;
-
-    curr_bit_offset = bit_offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS]);
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nmo, tvb, curr_bit_offset, 2, FALSE);
-    curr_bit_offset += 2;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3168, tvb, curr_bit_offset, 3, FALSE);
-    curr_bit_offset += 3;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3192, tvb, curr_bit_offset, 3, FALSE);
-    curr_bit_offset += 3;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_drx_timer_max, tvb, curr_bit_offset, 3, FALSE);
-    curr_bit_offset += 3;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_access_burst_type, tvb, curr_bit_offset, 1, FALSE);
-    curr_bit_offset += 1;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_control_ack_type, tvb, curr_bit_offset, 1, FALSE);
-    curr_bit_offset += 1;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bs_cv_max, tvb, curr_bit_offset, 4, FALSE);
-    curr_bit_offset += 4;
-    if (tvb_get_bits8(tvb,curr_bit_offset,1))
-    {
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_dec, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_inc, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pan_max, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    else
-        curr_bit_offset += 1;
-    if (tvb_get_bits8(tvb,curr_bit_offset,1))
-    { /* Optional extension information */
-        curr_bit_offset += 1;
-        curr_bit_offset_sav = curr_bit_offset;
-        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);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO]);
-        value = tvb_get_bits8(tvb,curr_bit_offset,6);
-        proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 1, "Extension Length: %d", value);
-        curr_bit_offset += 6;
-        value += 1;
-        proto_item_set_len(item2,((curr_bit_offset+value-curr_bit_offset_sav)>>3)+1);
-        if (tvb_get_bits8(tvb,curr_bit_offset,1))
-        {
-            curr_bit_offset += 1;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_egprs_packet_channel_request, tvb, curr_bit_offset, 1, FALSE);
-            curr_bit_offset += 1;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bep_period, tvb, curr_bit_offset, 4, FALSE);
-            curr_bit_offset += 4;
-            value -= 5;
-        }
-        else
-            curr_bit_offset += 1;
-        value -= 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pfc_feature_mode, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dtm_support, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bss_paging_coordination, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        value -= 3;
-        if (value > 0)
-        { /* Rel 4 extension */
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_ccn_active, tvb, curr_bit_offset, 1, FALSE);
-            curr_bit_offset += 1;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nw_ext_utbf, tvb, curr_bit_offset, 1, FALSE);
-            curr_bit_offset += 1;
-            value -= 2;
-            if (value > 0)
-            { /* Rel 6 extension */
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_multiple_tbf_capability, tvb, curr_bit_offset, 1, FALSE);
-                curr_bit_offset += 1;
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_ext_utbf_no_data, tvb, curr_bit_offset, 1, FALSE);
-                curr_bit_offset += 1;
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_dtm_enhancements_capability, tvb, curr_bit_offset, 1, FALSE);
-                curr_bit_offset += 1;
-                value -= 3;
-                if (tvb_get_bits8(tvb,curr_bit_offset,1))
-                {
-                    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dedicated_mode_mbms_notification_support, tvb, bit_offset, 1, FALSE);
-                    bit_offset += 1;
-                    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mnci_support, tvb, bit_offset, 1, FALSE);
-                    bit_offset += 1;
-                    value -= 2;
-                }
-                else
-                    bit_offset += 1;
-                value -= 1;
-                if (value > 0)
-                { /* Rel 7 extension */
-                    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reduced_latency_access, tvb, bit_offset, 1, FALSE);
-                    bit_offset += 1;
-                    value -= 1;
-                }
-            }
-        }
-        curr_bit_offset += value;
-    }
-    else
-        curr_bit_offset += 1;
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_rest_oct_gprs_power_control_parameters(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset;
-	
-    curr_bit_offset = bit_offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS]);
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, FALSE);
-    curr_bit_offset += 4;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_w, tvb, curr_bit_offset, 5, FALSE);
-    curr_bit_offset += 5;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_t, tvb, curr_bit_offset, 5, FALSE);
-    curr_bit_offset += 5;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_pc_meas_chan, tvb, curr_bit_offset, 1, FALSE);
-    curr_bit_offset += 1;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_n_avg_i, tvb, curr_bit_offset, 4, FALSE);
-    curr_bit_offset += 4;
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static guint16
-de_rr_gprs_broadcast_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len , gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    gint bit_offset;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, tree, bit_offset);
-    bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, tree, bit_offset);  
-    curr_offset += len;
-
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.15 Handover Reference
- */
-static guint16
-de_rr_ho_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 1, "%s",
-                            gsm_rr_elem_strings[DE_RR_HO_REF].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_HO_REF]);
-
-    /* Handover reference value */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_ho_ref_val, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.16 IA Rest Octets
- */
-
-static guint16
-de_rr_ia_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    len = tvb_length_remaining(tvb,offset);
-    if (len==0)
-        return 0;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, len, "%s",
-                            gsm_rr_elem_strings[DE_RR_IA_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_IA_REST_OCT]);
-
-    proto_tree_add_text(subtree,tvb, curr_offset, len ,"Data(Not decoded)");
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.17 IAR Rest Octets
- */
-
-static guint16
-de_rr_iar_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    len = 3;
-    curr_offset = offset;
-
-    item =
-	proto_tree_add_text(tree,
-                            tvb, curr_offset, 3, "%s",
-                            gsm_rr_elem_strings[DE_RR_IAR_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_IAR_REST_OCT]);
-
-    proto_tree_add_text(subtree,tvb, curr_offset, len ,"Data(Not decoded)");
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.18 IAX Rest Octets
- */
-static guint16
-de_rr_iax_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    len = tvb_length_remaining(tvb,offset);
-    if (len==0)
-        return 0;
-
-    curr_offset = offset;
-
-    item =
-	proto_tree_add_text(tree,
-                            tvb, curr_offset, len, "%s",
-                            gsm_rr_elem_strings[DE_RR_IAX_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_IAX_REST_OCT]);
-
-    proto_tree_add_text(subtree,tvb, curr_offset, len ,"Data(Not decoded)");
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.19 L2 Pseudo Length
- */
-static guint16
-de_rr_l2_pseudo_len(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree,tvb, curr_offset, 1, "%s", gsm_rr_elem_strings[DE_RR_L2_PSEUDO_LEN].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_L2_PSEUDO_LEN]);
-
-    /* L2 Pseudo Length value */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_L2_pseudo_len, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.20 Measurement Results
- */
-static const true_false_string gsm_a_rr_dtx_vals  = {
-    "DTX was used",
-    "DTX was not used"
-};
-
-static const value_string gsm_a_rr_rxlev_vals [] = {
-    { 0, "< -110 dBm"},
-    { 1, "-110 <= x < -109 dBm"},
-    { 2, "-109 <= x < -108 dBm"},
-    { 3, "-108 <= x < -107 dBm"},
-    { 4, "-107 <= x < -106 dBm"},
-    { 5, "-106 <= x < -105 dBm"},
-    { 6, "-105 <= x < -104 dBm"},
-    { 7, "-104 <= x < -103 dBm"},
-    { 8, "-103 <= x < -102 dBm"},
-    { 9, "-102 <= x < -101 dBm"},
-    {10, "-101 <= x < -100 dBm"},
-    {11, "-100 <= x < -99 dBm"},
-    {12, "-99 <= x < -98 dBm"},
-    {13, "-98 <= x < -97 dBm"},
-    {14, "-97 <= x < -96 dBm"},
-    {15, "-96 <= x < -95 dBm"},
-    {16, "-95 <= x < -94 dBm"},
-    {17, "-94 <= x < -93 dBm"},
-    {18, "-93 <= x < -92 dBm"},
-    {19, "-92 <= x < -91 dBm"},
-    {20, "-91 <= x < -90 dBm"},
-    {21, "-90 <= x < -89 dBm"},
-    {22, "-89 <= x < -88 dBm"},
-    {23, "-88 <= x < -87 dBm"},
-    {24, "-87 <= x < -86 dBm"},
-    {25, "-86 <= x < -85 dBm"},
-    {26, "-85 <= x < -84 dBm"},
-    {27, "-84 <= x < -83 dBm"},
-    {28, "-83 <= x < -82 dBm"},
-    {29, "-82 <= x < -81 dBm"},
-    {30, "-81 <= x < -80 dBm"},
-    {31, "-80 <= x < -79 dBm"},
-    {32, "-79 <= x < -78 dBm"},
-    {33, "-78 <= x < -77 dBm"},
-    {34, "-77 <= x < -76 dBm"},
-    {35, "-76 <= x < -75 dBm"},
-    {36, "-75 <= x < -74 dBm"},
-    {37, "-74 <= x < -73 dBm"},
-    {38, "-73 <= x < -72 dBm"},
-    {39, "-72 <= x < -71 dBm"},
-    {40, "-71 <= x < -70 dBm"},
-    {41, "-70 <= x < -69 dBm"},
-    {42, "-69 <= x < -68 dBm"},
-    {43, "-68 <= x < -67 dBm"},
-    {44, "-67 <= x < -66 dBm"},
-    {45, "-66 <= x < -65 dBm"},
-    {46, "-65 <= x < -64 dBm"},
-    {47, "-64 <= x < -63 dBm"},
-    {48, "-63 <= x < -62 dBm"},
-    {49, "-62 <= x < -61 dBm"},
-    {50, "-61 <= x < -60 dBm"},
-    {51, "-60 <= x < -59 dBm"},
-    {52, "-59 <= x < -58 dBm"},
-    {53, "-58 <= x < -57 dBm"},
-    {54, "-57 <= x < -56 dBm"},
-    {55, "-56 <= x < -55 dBm"},
-    {56, "-55 <= x < -54 dBm"},
-    {57, "-54 <= x < -53 dBm"},
-    {58, "-53 <= x < -52 dBm"},
-    {59, "-52 <= x < -51 dBm"},
-    {60, "-51 <= x < -50 dBm"},
-    {61, "-50 <= x < -49 dBm"},
-    {62, "-49 <= x < -48 dBm"},
-    {63, ">= -48 dBm"},
-    { 0, NULL}
-};
-
-static const true_false_string gsm_a_rr_mv_vals  = {
-    "The measurement results are valid",
-    "The measurement results are not valid"
-};
-
-static const value_string gsm_a_rr_rxqual_vals [] = {
-    {0, "BER < 0.2%, Mean value 0.14%"},
-    {1, "0.2% <= BER < 0.4%, Mean value 0.28%"},
-    {2, "0.4% <= BER < 0.8%, Mean value 0.57%"},
-    {3, "0.8% <= BER < 1.6%, Mean value 1.13%"},
-    {4, "1.6% <= BER < 3.2%, Mean value 2.26%"},
-    {5, "3.2% <= BER < 6.4%, Mean value 4.53%"},
-    {6, "6.4% <= BER < 12.8%, Mean value 9.05%"},
-    {7, "BER > 12.8%, Mean value 18.10%"},
-    {0, NULL}
-};
-
-static const value_string gsm_a_rr_ncell_vals [] = {
-    {0, "No neighbour cell measurement result"},
-    {1, "1 neighbour cell measurement result"},
-    {2, "2 neighbour cell measurement result"},
-    {3, "3 neighbour cell measurement result"},
-    {4, "4 neighbour cell measurement result"},
-    {5, "5 neighbour cell measurement result"},
-    {6, "6 neighbour cell measurement result"},
-    {7, "Neighbour cell information not available for serving cell"},
-    {0, NULL}
-};
-
-guint16
-de_rr_meas_res(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-    gint bit_offset;
-    guint64 no_ncell_m;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 16, "%s",
-                            gsm_rr_elem_strings[DE_RR_MEAS_RES].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_MEAS_RES]);
-
-    /* 2nd octet */
-    /* BA-USED */
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ba_used, tvb, curr_offset<<3, 1, FALSE);
-    /* DTX USED */
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dtx_used, tvb, (curr_offset<<3)+1, 1, FALSE);
-    /* RXLEV-FULL-SERVING-CELL */
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_full_serv_cell, tvb, (curr_offset<<3)+2, 6, FALSE);
-    curr_offset++;
-
-    /* 3rd octet */
-    /* 3G-BA-USED */ 
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ba_used, tvb, curr_offset<<3, 1, FALSE);
-    /* MEAS-VALID */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_meas_valid, tvb, curr_offset, 1, FALSE);	
-    /* RXLEV-SUB-SERVING-CELL */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_rxlev_sub_serv_cell, tvb, curr_offset, 1, FALSE);
-
-    curr_offset++;
-
-    /* 4th octet */
-    /* RXQUAL-FULL-SERVING-CELL */
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxqual_full_serv_cell, tvb, (curr_offset<<3)+1, 3, FALSE);
-
-    /* RXQUAL-SUB-SERVING-CELL */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_rxqual_sub_serv_cell, tvb, curr_offset, 1, FALSE);
-    /* NO-NCELL-M */
-    bit_offset = (curr_offset << 3) + 7;
-    proto_tree_add_bits_ret_val(subtree, hf_gsm_a_rr_no_ncell_m, tvb, bit_offset, 3, &no_ncell_m, FALSE);
-    bit_offset += 3;
-    if (no_ncell_m == 7) /* No neighbour cell information available) */
-        no_ncell_m = 0;
-    while (no_ncell_m)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_ncell, tvb, bit_offset, 6, FALSE);
-        bit_offset += 6;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_freq_ncell, tvb, bit_offset, 5, FALSE);
-        bit_offset += 5;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic_ncell, tvb, bit_offset, 6, FALSE);
-        bit_offset += 6;
-        no_ncell_m -= 1;
-    }
-
-    return(len);
-}
-
-/*
- * [3] 10.5.2.20a GPRS Measurement Results
- */
-/*
- * [3] 10.5.2.21 Mobile Allocation
- */
-static guint16
-de_rr_mob_all(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    proto_item *item;
-    gint i, j;
-    guint8 value;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "Bitmap of increasing ARFCNs included in the Mobile Allocation: ");
-    for(i=len; i>0; i--)
-    {
-        value = tvb_get_guint8(tvb,curr_offset+i-1);
-        for (j=0; j<8; j++)
-        {
-            proto_item_append_text(item,"%d",(value>>j)&0x01);
-        }
-    }
-
-    curr_offset = curr_offset + len;
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.21a Mobile Time Difference
- */
-static guint16
-de_rr_mob_time_diff(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_mobile_time_difference, tvb, curr_offset, len, FALSE);
-
-    curr_offset = curr_offset + len;
-    return(curr_offset - offset);
-
-}
-/*
- * [3] 10.5.2.21aa MultiRate configuration
- */
-/*	Multirate speech version Octet 3 Bits 8 7 6 */
-static const value_string multirate_speech_ver_vals[] = {
-    { 1, "Adaptive Multirate speech version 1"},
-    { 2, "Adaptive Multirate speech version 2"},
-    { 0, NULL }
-};
-/* Bit 5  NSCB: Noise Suppression Control Bit */
-static const value_string NSCB_vals[] = {
-    { 0, "Noise Suppression can be used (default)"},
-    { 1, "Noise Suppression shall be turned off"},
-    { 0, NULL }
-};
-/* Bit 4 ICMI: Initial Codec Mode Indicator */
-static const value_string ICMI_vals[] = {
-    { 0, "The initial codec mode is defined by the implicit rule provided in 3GPP TS 05.09"},
-    { 1, "The initial codec mode is defined by the Start Mode field"},
-    { 0, NULL }
-};
-/*
-Table 10.5.2.21aa.2: Set of adaptive multirate codec modes field (octet 4)
-for the Multirate speech version 1
-*/
-static const true_false_string gsm_a_rr_set_of_amr_codec_modes  = {
-    "is part of the subset",
-    "is not part of the subset"
-};
-
-static const value_string gsm_a_rr_amr_threshold_vals[] = {
-    {  0, "0.0 dB"},
-    {  1, "0.5 dB"},
-    {  2, "1.0 dB"},
-    {  3, "1.5 dB"},
-    {  4, "2.0 dB"},
-    {  5, "2.5 dB"},
-    {  6, "3.0 dB"},
-    {  7, "3.5 dB"},
-    {  8, "4.0 dB"},
-    {  9, "4.5 dB"},
-    { 10, "5.0 dB"},
-    { 11, "5.5 dB"},
-    { 12, "6.0 dB"},
-    { 13, "6.5 dB"},
-    { 14, "7.0 dB"},
-    { 15, "7.5 dB"},
-    { 16, "8.0 dB"},
-    { 17, "8.5 dB"},
-    { 18, "9.0 dB"},
-    { 19, "9.5 dB"},
-    { 20, "10.0 dB"},
-    { 21, "10.5 dB"},
-    { 22, "11.0 dB"},
-    { 23, "11.5 dB"},
-    { 24, "12.0 dB"},
-    { 25, "12.5 dB"},
-    { 26, "13.0 dB"},
-    { 27, "13.5 dB"},
-    { 28, "14.0 dB"},
-    { 29, "14.5 dB"},
-    { 30, "15.0 dB"},
-    { 31, "15.5 dB"},
-    { 32, "16.0 dB"},
-    { 33, "16.5 dB"},
-    { 34, "17.0 dB"},
-    { 35, "17.5 dB"},
-    { 36, "18.0 dB"},
-    { 37, "18.5 dB"},
-    { 38, "19.0 dB"},
-    { 39, "19.5 dB"},
-    { 40, "20.0 dB"},
-    { 41, "20.5 dB"},
-    { 42, "21.0 dB"},
-    { 43, "21.5 dB"},
-    { 44, "22.0 dB"},
-    { 45, "22.5 dB"},
-    { 46, "23.0 dB"},
-    { 47, "23.5 dB"},
-    { 48, "24.0 dB"},
-    { 49, "24.5 dB"},
-    { 50, "25.0 dB"},
-    { 51, "25.5 dB"},
-    { 52, "26.0 dB"},
-    { 53, "26.5 dB"},
-    { 54, "27.0 dB"},
-    { 55, "27.5 dB"},
-    { 56, "28.0 dB"},
-    { 57, "28.5 dB"},
-    { 58, "29.0 dB"},
-    { 59, "29.5 dB"},
-    { 60, "30.0 dB"},
-    { 61, "30.5 dB"},
-    { 62, "31.0 dB"},
-    { 63, "31.5 dB"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_amr_hysteresis_vals[] = {
-    {  0, "0.0 dB"},
-    {  1, "0.5 dB"},
-    {  2, "1.0 dB"},
-    {  3, "1.5 dB"},
-    {  4, "2.0 dB"},
-    {  5, "2.5 dB"},
-    {  6, "3.0 dB"},
-    {  7, "3.5 dB"},
-    {  8, "4.0 dB"},
-    {  9, "4.5 dB"},
-    { 10, "5.0 dB"},
-    { 11, "5.5 dB"},
-    { 12, "6.0 dB"},
-    { 13, "6.5 dB"},
-    { 14, "7.0 dB"},
-    { 15, "7.5 dB"},
-    { 0, NULL }
-};
-
-guint16
-de_rr_multirate_conf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    guint8 oct;
-    gint bit_offset, remaining_length, nb_of_params;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_multirate_speech_ver, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_NCSB, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_ICMI, tvb, curr_offset, 1, FALSE);
-    /* The initial codec mode is coded as in 3GPP TS 45.009 */
-    proto_tree_add_item(tree, hf_gsm_a_rr_start_mode, tvb, curr_offset, 1, FALSE);
-    oct = ( tvb_get_guint8(tvb,curr_offset) &0xe0 ) >> 5;
-    curr_offset++;
-    switch ( oct){
-    case 1:
-        /* Adaptive Multirate speech version 1 */
-        /* Set of AMR codec modes */
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1, tvb, curr_offset, 1, FALSE);
-        curr_offset++;
-
-        remaining_length = len-2;
-        break;
-    case 2:
-        /* Adaptive Multirate speech version 2 */
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2, tvb, curr_offset, 1, FALSE);
-        proto_tree_add_item(tree, hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1, tvb, curr_offset, 1, FALSE);
-        curr_offset++;
-
-        remaining_length = len-2;
-        break;
-    default:
-        proto_tree_add_text(tree,tvb,offset,1,"Unknown version");
-        proto_tree_add_text(tree,tvb, curr_offset, len-1 ,"Data(Not decoded)");
-        remaining_length = 0;
-        break;
-    }
-
-    if (remaining_length)
-    {
-        bit_offset = (curr_offset<<3) + 2;
-        nb_of_params = remaining_length - 1;
-        while (nb_of_params)
-        {
-            proto_tree_add_bits_item(tree, hf_gsm_a_rr_amr_threshold, tvb, bit_offset, 6, FALSE);
-            bit_offset += 6;
-            proto_tree_add_bits_item(tree, hf_gsm_a_rr_amr_hysteresis, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-            nb_of_params -= 1;
-        }
-    }
-
-    curr_offset = offset + len;
-    return(curr_offset - offset);
-
-}
-/*
- * [3] 10.5.2.21b Multislot Allocation
- */
-static guint16
-de_rr_mult_all(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_text(tree,tvb, curr_offset, len ,"Data(Not decoded)");
-
-    curr_offset = curr_offset + len;
-    return(curr_offset - offset);
-
-}
-/*
- * [3] 10.5.2.21c NC mode
- */
-
- /*
- * [3] 10.5.2.22 Neighbour Cell Description
- */
-static const value_string gsm_a_rr_ext_ind_vals[] = {
-    { 0, "The information element carries the complete BA"},
-    { 1, "The information element carries only a part of the BA"},
-    { 0, NULL }
-};
-static guint16
-de_rr_neigh_cell_desc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_ext_ind, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, (curr_offset<<3)+3, 1, FALSE);
-
-    return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
-}
-
- /*
- * [3] 10.5.2.22a Neighbour Cell Description 2
- */
-static guint16
-de_rr_neigh_cell_desc2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_multiband_reporting, tvb, (curr_offset<<3)+1, 2, FALSE);
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, (curr_offset<<3)+3, 1, FALSE);
-
-    return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
-}
-
-/*
- * [3] 10.5.2.22b (void)
- * [3] 10.5.2.22c NT/N Rest Octets
- */
-
-/*
- * [3] 10.5.2.23 P1 Rest Octets
- */
-static guint16
-de_rr_p1_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree *subtree;
-    proto_item *item, *item2;
-    guint32 curr_offset, value;
-    gint bit_offset, bit_offset_sav, i;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-    len = tvb_length_remaining(tvb,offset);
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_P1_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_P1_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-    }
-    else
-        bit_offset += 1;
-    for (i=1; i<=2; i++)
-    {
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        {
-            bit_offset += 1;
-            item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_item_append_text(item2, " for Mobile Identity %d", i);
-        }
-        else
-            bit_offset += 1;
-    }
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* Group Call Information */
-        bit_offset += 1;
-        bit_offset_sav = bit_offset;
-        bit_offset += 36;
-        if (tvb_get_bits8(tvb,bit_offset,1))
-        { /* Group Channel Description */
-            bit_offset += 24+1;
-            if (tvb_get_bits8(tvb,bit_offset,1))
-            { /* Hopping case */
-                bit_offset += 1;
-                if (tvb_get_bits8(tvb,bit_offset,1))
-                {
-                    bit_offset += 64+1;
-                }
-                else
-                {
-                    bit_offset += 1;
-                    value = tvb_get_bits8(tvb,bit_offset,8);
-                    bit_offset += 8 + (value<<3);
-                }
-            }
-            else
-                bit_offset += 1;
-        }
-        else
-            bit_offset += 1;
-        proto_tree_add_text(subtree,tvb, bit_offset_sav>>3, (bit_offset-bit_offset_sav)>>3,"Group Call Information: Data(Not decoded)");
-    }
-    else
-        bit_offset += 1;
-    for (i=1; i<=2; i++)
-    {
-        item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Packet Page Indication %d: ", i);
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-            proto_item_append_text(item2, "Packet paging procedure");
-        else
-            proto_item_append_text(item2, "Paging procedure for RR connection establishment");
-        bit_offset += 1;
-    }
-    if (((curr_offset + len)<<3) - bit_offset > 0)
-    {
-        /* There is still room left in the Rest Octets IE */
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* Additions in release 6 */
-            bit_offset += 1;
-            proto_tree_add_text(subtree, tvb, bit_offset>>3, -1,"Additions in Release 6: Data(Not decoded)");
-        }
-        else
-            bit_offset += 1;
-    }
-
-    curr_offset = curr_offset + len;
-
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.24 P2 Rest Octets
- */
-static guint16
-de_rr_p2_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-
-{
-    proto_tree *subtree;
-    proto_item *item, *item2;
-    guint32 curr_offset;
-    gint bit_offset, i;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-    len = tvb_length_remaining(tvb,offset);
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_P2_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_P2_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch3, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-    }
-    else
-        bit_offset += 1;
-    for (i=1; i<=3; i++)
-    {
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        {
-            bit_offset += 1;
-            item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_item_append_text(item2, " for Mobile Identity %d", i);
-        }
-        else
-            bit_offset += 1;
-    }
-    item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Packet Page Indication 3: ");
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        proto_item_append_text(item2, "Packet paging procedure");
-    else
-        proto_item_append_text(item2, "Paging procedure for RR connection establishment");
-    bit_offset += 1;
-    if (((curr_offset + len)<<3) - bit_offset > 0)
-    {
-        /* There is still room left in the Rest Octets IE */
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* Additions in release 6 */
-            bit_offset += 1;
-            proto_tree_add_text(subtree, tvb, bit_offset>>3, -1,"Additions in Release 6: Data(Not decoded)");
-        }
-        else
-            bit_offset += 1;
-    }
-
-    curr_offset = curr_offset + len;
-
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.25 P3 Rest Octets
- */
-static guint16
-de_rr_p3_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree *subtree;
-    proto_item *item, *item2;
-    guint32 curr_offset;
-    gint bit_offset, i;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-    len = 3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_P3_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_P3_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch3, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_chnl_needed_ch4, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_pch, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nln_status_pch, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-    }
-    else
-        bit_offset += 1;
-    for (i=1; i<=4; i++)
-    {
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        {
-            bit_offset += 1;
-            item2 = proto_tree_add_bits_item(subtree, hf_gsm_a_call_prio, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_item_append_text(item2, " for Mobile Identity %d", i);
-        }
-        else
-            bit_offset += 1;
-    }
-
-    curr_offset = curr_offset + len;
-
-    return (curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.25a Packet Channel Description C V 3
- */
-static guint16
-de_rr_packet_ch_desc(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-    guint8	oct8;
-    guint16	arfcn, hsn, maio;
-    proto_tree	*subtree;
-    proto_item	*item;
-    const gchar *str;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree,tvb,curr_offset,3, "%s", gsm_rr_elem_strings[DE_RR_PACKET_CH_DESC].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_PACKET_CH_DESC]);
-
-    /* Octet 2 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-    /* Channel Type */
-    str = "Spare bits (ignored by receiver)";
-    other_decode_bitfield_value(a_bigbuf, oct8, 0xf8, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = %s",a_bigbuf,str);
-    /* TN */
-    other_decode_bitfield_value(a_bigbuf, oct8, 0x07, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Timeslot: %d",a_bigbuf,(oct8 & 0x07));
-
-    curr_offset +=1;
-	
-    /* Octet 3 */
-    oct8 = tvb_get_guint8(tvb, curr_offset);
-    other_decode_bitfield_value(a_bigbuf, oct8, 0xe0, 8);
-    proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Training Sequence: %d",a_bigbuf,((oct8 & 0xe0)>>5));
-	
-    if ((oct8 & 0x10) == 0x10)
-    {
-        /* Hopping sequence */
-        maio = ((oct8 & 0x0f)<<2) | ((tvb_get_guint8(tvb,curr_offset+1) & 0xc0) >> 6);
-        hsn = (tvb_get_guint8(tvb,curr_offset+1) & 0x3f);
-        str = "Yes";
-
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: MAIO %d",maio);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Hopping channel: HSN %d",hsn);
-    }
-    else
-    {
-        /* single ARFCN */
-        arfcn = ((oct8 & 0x03) << 8) | tvb_get_guint8(tvb,curr_offset+1);
-        str = "No";
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x10, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Hopping channel: %s",a_bigbuf,str);
-        other_decode_bitfield_value(a_bigbuf, oct8, 0x0c, 8);
-        proto_tree_add_text(subtree,tvb, curr_offset, 1,"%s = Spare",a_bigbuf);
-        proto_tree_add_text(subtree,tvb, curr_offset, 2,"Single channel : ARFCN %d",arfcn);
-    }
-
-    curr_offset = curr_offset + 2;
-    return(curr_offset - offset);
-
-}
-/*
- * [3] 10.5.2.25b Dedicated mode or TBF
- */
-
-static const value_string gsm_a_rr_dedicated_mode_or_tbf_vals[] = {
-    { 0, "This message assigns a dedicated mode resource"},
-    { 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"},
-    { 2, "Not used"},
-    { 3, "This message assigns a downlink TBF to the mobile station identified in the IA Rest Octets IE"},
-    { 4, "Not used"},
-    { 5, "This message is the first message of two in a two-message assignment of an uplink TBF"},
-    { 6, "Not used"},
-    { 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"},
-    { 0, NULL }
-};
-static guint16
-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_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 1, "%s",
-                            gsm_rr_elem_strings[DE_RR_DED_MOD_OR_TBF].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_DED_MOD_OR_TBF]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_dedicated_mode_or_tbf, tvb, curr_offset, 1, FALSE);
-
-    curr_offset += 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.25c RR Packet Uplink Assignment
- * [3] 10.5.2.25d RR Packet Downlink Assignment
- */
-/*
- * [3] 10.5.2.26 Page Mode
- */
-
-static const value_string gsm_a_rr_page_mode_vals[] = {
-    { 0, "Normal paging"},
-    { 1, "Extended paging"},
-    { 2, "Paging reorganization"},
-    { 3, "Same as before"},
-    { 0, NULL }
-};
-static guint16
-de_rr_page_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 1, "%s",
-                            gsm_rr_elem_strings[DE_RR_PAGE_MODE].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_PAGE_MODE]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_page_mode, tvb, curr_offset, 1, FALSE);
-
-    curr_offset += 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.26a (void)
- * [3] 10.5.2.26b (void)
- * [3] 10.5.2.26c (void)
- * [3] 10.5.2.26d (void)
- */
-/*
- * [3] 10.5.2.27 NCC Permitted
- */
-static guint16
-de_rr_ncc_perm(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 1, "%s",
-                               gsm_rr_elem_strings[DE_RR_NCC_PERM].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_NCC_PERM]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_ncc_permitted, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.28 Power Command
- *
- *
- * ATC (Access Type Control) (octet 2)Bit 8
- * 0	Sending of Handover access is mandatory
- * 1	Sending of Handover access is optional
- */
-static const true_false_string gsm_a_rr_pow_cmd_atc_value  = {
-    "Sending of Handover access is optional",
-    "Sending of Handover access is mandatory"
-};
-/*
- *  The EPC mode field (octet 2) indicates whether the assigned channel(s)
- *  shall be in enhanced power control (EPC) mode. It is only valid for channels
- *  on which EPC may be used. It is coded as follows:
-*/
-static const true_false_string gsm_a_rr_pow_cmd_epc_value  = {
-    "Channel(s) in EPC mode",
-    "Channel(s) not in EPC mode"
-};
-/*
- * FPC_EPC (octet 2)
- * The FPC_EPC field (octet 2) has different interpretation depending
- *		on the channel mode	of the assigned channel (s) and the value
- *		of the EPC mode field.
- * If the channel mode is such that fast power control (FPC) may be
- *		used, the FPC_EPC field indicates whether Fast Measurement
- *		Reporting and Power Control mechanism is used.
- *		It is coded as follows:
- * Value 0	FPC not in use
- *	   1	FPC in use
- * If the channel mode is such that EPC may be used and the EPC mode
- *		field indicates that the channel is in EPC mode, the FPC_EPC
- *		field indicates whether EPC shall be used for uplink power control.
- * It is coded as follows:
- * Value 0	EPC not in use for uplink power control
- *		 1	EPC in use for uplink power control
- *
- */
-static const true_false_string gsm_a_rr_pow_cmd_fpcepc_value  = {
-    "FPC in use/EPC in use for uplink power control",
-    "FPC not in use/C not in use for uplink power control"
-};
-
-/*
- * Power level (octet 2)The power level field is coded as the binaryRepresentation
- * of the "power control level", see 3GPP TS 3GPP TS 45.005. This value shall be used
- * by the mobile station According to 3GPP TS 45.008.Range: 0 to 31.
- */
-
-static guint16
-de_rr_pow_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 1, "%s",
-                            gsm_rr_elem_strings[DE_RR_POW_CMD].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_POW_CMD]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_b8spare, tvb, curr_offset, 1, FALSE);
-    /*EPC mode */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_epc, tvb, curr_offset, 1, FALSE);
-    /*FPC_EPC*/
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_fpcepc, tvb, curr_offset, 1, FALSE);
-    /*POWER LEVEL*/
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_powlev, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.28a Power Command and access type
- */
-static guint16
-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_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 1, "%s",
-                            gsm_rr_elem_strings[DE_RR_POW_CMD_AND_ACC_TYPE].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_POW_CMD_AND_ACC_TYPE]);
-
-    /*ATC */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_atc, tvb, curr_offset, 1, FALSE);
-    /*EPC mode */
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_epc, tvb, curr_offset, 1, FALSE);
-    /*FPC_EPC*/
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_fpcepc, tvb, curr_offset, 1, FALSE);
-    /*POWER LEVEL*/
-    proto_tree_add_item(subtree, hf_gsm_a_rr_pow_cmd_powlev, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.29 RACH Control Parameters
- */
-
-static const value_string gsm_a_rr_max_retrans_vals[] = {
-    {  0, "Maximum 1 retransmission"},
-    {  1, "Maximum 2 retransmissions"},
-    {  2, "Maximum 4 retransmissions"},
-    {  3, "Maximum 7 retransmissions"},
-    {  0, NULL }
-};
-
-static const value_string gsm_a_rr_tx_integer_vals[] = {
-    {  0, "3 slots used to spread transmission"},
-    {  1, "4 slots used to spread transmission"},
-    {  2, "5 slots used to spread transmission"},
-    {  3, "6 slots used to spread transmission"},
-    {  4, "7 slots used to spread transmission"},
-    {  5, "8 slots used to spread transmission"},
-    {  6, "9 slots used to spread transmission"},
-    {  7, "10 slots used to spread transmission"},
-    {  8, "11 slots used to spread transmission"},
-    {  9, "12 slots used to spread transmission"},
-    { 10, "14 slots used to spread transmission"},
-    { 11, "16 slots used to spread transmission"},
-    { 12, "20 slots used to spread transmission"},
-    { 13, "25 slots used to spread transmission"},
-    { 14, "32 slots used to spread transmission"},
-    { 15, "50 slots used to spread transmission"},
-    {  0, NULL }
-};
-static const value_string gsm_a_rr_cell_barr_access_vals[] = {
-    {  0, "The cell is not barred"},
-    {  1, "The cell is barred"},
-    {  0, NULL }
-};
-static const value_string gsm_a_rr_re_vals[] = {
-    {  0, "Call Reestablishment allowed in the cell"},
-    {  1, "Call Reestablishment not allowed in the cell"},
-    {  0, NULL }
-};
-
-static guint16
-de_rr_rach_ctrl_param(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
-                               gsm_rr_elem_strings[DE_RR_RACH_CTRL_PARAM].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_RACH_CTRL_PARAM]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_max_retrans, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_tx_integer, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_cell_barr_access, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_re, tvb, curr_offset, 1, FALSE);
-    curr_offset = curr_offset + 1;
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_acc, tvb, curr_offset, 2, FALSE);
-
-    curr_offset = curr_offset + 2;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.30 Request Reference M V 3
- */
-static guint16 reduced_frame_number(guint16 fn)
-{
-    /* great care needed with signed/unsigned - -1 in unsigned is 0xffff, which mod(26) is not what you think !!! */
-    gint16	t2, t3, t;
-    guint16	frame, t1;
-
-    t1 = (fn >> 11) & 0x1f;
-    t2 = (fn >> 0) & 0x1f;
-    t3 = (fn >> 5) & 0x3f;
-
-    t = (t3-t2)%26;
-    if (t<0)
-        t += 26;
-
-    frame = 51*(unsigned)t+(unsigned)t3+51*26*t1;
-
-    return frame;
-}
-
-static guint16
-de_rr_req_ref(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-    guint16	rfn;
-    guint16	fn;
-
-    curr_offset = offset;
-
-    item =
-        proto_tree_add_text(tree,
-                            tvb, curr_offset, 3, "%s",
-                            gsm_rr_elem_strings[DE_RR_REQ_REF].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_REQ_REF]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_ra, tvb, curr_offset, 1, FALSE);
-    curr_offset++;
-    fn = tvb_get_ntohs(tvb,curr_offset);
-    rfn = reduced_frame_number(fn);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_T1prim, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(subtree, hf_gsm_a_rr_T3, tvb, curr_offset, 2, FALSE);
-    curr_offset++;
-    proto_tree_add_item(subtree, hf_gsm_a_rr_T2, tvb, curr_offset, 1, FALSE);
-    curr_offset++;
-    item = proto_tree_add_uint(subtree, hf_gsm_a_rr_rfn, tvb, curr_offset-2, 2, rfn);
-    PROTO_ITEM_SET_GENERATED(item);
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.31
- */
-guint16
-de_rr_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_RR_cause, tvb, curr_offset, 1, FALSE);
-
-    curr_offset++;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.32 SI 1 Rest Octets
- */
-static const value_string gsm_a_rr_nch_position_vals[] = {
-    { 0, "No of blocks = 1 and Number of first block = 0"},
-    { 1, "No of blocks = 1 and Number of first block = 1"},
-    { 2, "No of blocks = 1 and Number of first block = 2"},
-    { 3, "No of blocks = 1 and Number of first block = 3"},
-    { 4, "No of blocks = 1 and Number of first block = 4"},
-    { 5, "No of blocks = 1 and Number of first block = 5"},
-    { 6, "No of blocks = 1 and Number of first block = 6"},
-    { 7, "No of blocks = 1 and Number of first block = 0"},
-    { 8, "No of blocks = 2 and Number of first block = 1"},
-    { 9, "No of blocks = 2 and Number of first block = 2"},
-    {10, "No of blocks = 2 and Number of first block = 3"},
-    {11, "No of blocks = 2 and Number of first block = 4"},
-    {12, "No of blocks = 2 and Number of first block = 5"},
-    {13, "No of blocks = 3 and Number of first block = 0"},
-    {14, "No of blocks = 3 and Number of first block = 1"},
-    {15, "No of blocks = 3 and Number of first block = 2"},
-    {16, "No of blocks = 3 and Number of first block = 3"},
-    {17, "No of blocks = 3 and Number of first block = 4"},
-    {18, "No of blocks = 4 and Number of first block = 0"},
-    {19, "No of blocks = 4 and Number of first block = 1"},
-    {20, "No of blocks = 4 and Number of first block = 2"},
-    {21, "No of blocks = 4 and Number of first block = 3"},
-    {22, "No of blocks = 5 and Number of first block = 0"},
-    {23, "No of blocks = 5 and Number of first block = 1"},
-    {24, "No of blocks = 5 and Number of first block = 2"},
-    {25, "No of blocks = 6 and Number of first block = 0"},
-    {26, "No of blocks = 6 and Number of first block = 1"},
-    {27, "No of blocks = 7 and Number of first block = 0"},
-    {28, "Reserved"},
-    {29, "Reserved"},
-    {30, "Reserved"},
-    {31, "Reserved"},
-    { 0, NULL }
-};
-
-static guint16
-de_rr_si1_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-    gint bit_offset;
-
-    len = 1;
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI1_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI1_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nch_position, tvb, bit_offset, 5, FALSE);
-        bit_offset += 5;
-    }
-    else
-    {
-        proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "NCH position: not present");
-        bit_offset += 1;
-    }
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Band Indicator: 1900");
-    else
-        proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Band Indicator: 1800");
-    bit_offset += 1;
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.33 SI 2bis Rest Octets
- */
-
-/*
- * [3] 10.5.2.33a SI 2ter Rest Octets
- */
-static const value_string gsm_a_rr_qsearch_x_vals[] = {
-    { 0, "-98 dBm"},
-    { 1, "-94 dBm"},
-    { 2, "-90 dBm"},
-    { 3, "-86 dBm"},
-    { 4, "-82 dBm"},
-    { 5, "-78 dBm"},
-    { 6, "-74 dBm"},
-    { 7, "Always"},
-    { 8, "-78 dBm"},
-    { 9, "-74 dBm"},
-    {10, "-70 dBm"},
-    {11, "-66 dBm"},
-    {12, "-62 dBm"},
-    {13, "-58 dBm"},
-    {14, "-54 dBm"},
-    {15, "Never"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_xdd_qoffset_vals[] = {
-    { 0, "always select a cell if acceptable"},
-    { 1, "-28 dB"},
-    { 2, "-24 dB"},
-    { 3, "-20 dB"},
-    { 4, "-16 dB"},
-    { 5, "-12 dB"},
-    { 6, "-8 dB"},
-    { 7, "-4 dB"},
-    { 8, "0 dB"},
-    { 9, "4 dB"},
-    {10, "8 dB"},
-    {11, "12 dB"},
-    {12, "16 dB"},
-    {13, "20 dB"},
-    {14, "24 dB"},
-    {15, "28 dB"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_fdd_qmin_vals[] = {
-    { 0, "-20 dB"},
-    { 1, "-6 dB"},
-    { 2, "-18 dB"},
-    { 3, "-8 dB"},
-    { 4, "-16 dB"},
-    { 5, "-10 dB"},
-    { 6, "-14 dB"},
-    { 7, "-12 dB"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_fdd_qmin_offset_vals[] = {
-    { 0, "0 dB"},
-    { 1, "2 dB"},
-    { 2, "4 dB"},
-    { 3, "6 dB"},
-    { 4, "8 dB"},
-    { 5, "10 dB"},
-    { 6, "12 dB"},
-    { 7, "14 dB"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_fdd_rscpmin_vals[] = {
-    { 0, "-114 dBm"},
-    { 1, "-112 dBm"},
-    { 2, "-110 dBm"},
-    { 3, "-108 dBm"},
-    { 4, "-106 dBm"},
-    { 5, "-104 dBm"},
-    { 6, "-102 dBm"},
-    { 7, "-100 dBm"},
-    { 8, "-98 dBm"},
-    { 9, "-96 dBm"},
-    {10, "-94 dBm"},
-    {11, "-92 dBm"},
-    {12, "-90 dBm"},
-    {13, "-88 dBm"},
-    {14, "-86 dBm"},
-    {15, "-84 dBm"},
-    { 0, NULL }
-};
-
-static guint16
-de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree, *subtree2;
-    proto_item	*item, *item2;
-    guint32	curr_offset;
-    gint bit_offset, bit_offset_sav;
-    guint8 value;
-
-    len = 4;
-    curr_offset = offset;
-    bit_offset = curr_offset<<3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI2TER_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI2TER_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_mp_change_mark, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_3g_change_mark, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_index, tvb, bit_offset, 3, FALSE);
-        bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2ter_count, tvb, bit_offset, 3, FALSE);
-        bit_offset += 3;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* UTRAN FDD Description */
-            bit_offset_sav = bit_offset;
-            item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
-            subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
-            bit_offset += 2; /* skip '01' bits */
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, FALSE);
-            bit_offset += 14;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bandwidth_fdd, tvb, bit_offset, 3, FALSE);
-                bit_offset += 3;
-            }
-            proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* UTRAN TDD Description */
-            bit_offset_sav = bit_offset;
-            item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
-            subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
-            bit_offset += 2; /* skip '01' bits */
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, FALSE);
-            bit_offset += 14;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_bandwidth_tdd, tvb, bit_offset, 3, FALSE);
-                bit_offset += 3;
-            }
-            proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* 3G Measurement Parameters Description */
-            bit_offset_sav = bit_offset;
-            item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr);
-            subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]);
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_i, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qoffset, tvb, bit_offset, 4, FALSE);
-                bit_offset += 4;
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin, tvb, bit_offset, 3, FALSE);
-                bit_offset += 3;
-            }
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_qoffset, tvb, bit_offset, 4, FALSE);
-                bit_offset += 4;
-            }
-            proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-        }
-        if (((curr_offset + len)<<3) - bit_offset > 0)
-        {
-            /* There is still room left in the Rest Octets IE */
-            if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-            { /* Additions in release R5 */
-                bit_offset += 1;
-                value = tvb_get_bits8(tvb,bit_offset,1);
-                bit_offset += 1;
-                if (value)
-                { /* 3G Additional Measurement Parameters Description */
-                    bit_offset_sav = bit_offset;
-                    item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr);
-                    subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC]);
-                    proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin_offset, tvb, bit_offset, 3, FALSE);
-                    bit_offset += 3;
-                    proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rscpmin, tvb, bit_offset, 4, FALSE);
-                    bit_offset += 4;
-                    proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-                }
-            }
-            else
-                bit_offset += 1;
-        }
-    }
-    else
-    {
-        bit_offset += 1;
-        proto_tree_add_text(subtree,tvb, curr_offset, len ,"Empty");
-    }
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.33b SI 2quater Rest Octets
- */
-static const true_false_string gsm_a_rr_gsm_report_type_value = {
-    "The MS shall use the Measurement Report message for reporting",
-    "The MS shall use the Enhanced Measurement Report message for reporting if at least one BSIC is allocated to each BA (list) frequency. Otherwise, the Measurement Report message shall be used"
-};
-
-static const true_false_string gsm_a_rr_frequency_scrolling_value = {
-    "Next BSIC in the structure relates to the subsequent frequency in the BA(list)",
-    "Next BSIC in the structure relates to the same frequency in the BA(list)"
-};
-
-static const true_false_string gsm_a_rr_rep_priority_value = {
-    "High reporting priority",
-    "Normal reporting priority"
-};
-
-static const true_false_string gsm_a_rr_report_type_value = {
-    "The MS shall use the PACKET MEASUREMENT REPORT message for reporting",
-    "The MS shall use the PACKET ENHANCED MEASUREMENT REPORT message for reporting"
-};
-
-static const true_false_string gsm_a_rr_reporting_rate_value = {
-    "Reduced reporting rate allowed",
-    "Normal reporting rate"
-};
-
-static const true_false_string gsm_a_rr_invalid_bsic_reporting_value = {
-    "Report on cells with invalid BSIC and allowed NCC part of BSIC is allowed",
-    "Report on cells with invalid BSIC and allowed NCC part of BSIC is not allowed"
-};
-
-static const value_string gsm_a_rr_scale_ord_vals[] = {
-    { 0, "An offset of 0 dB shall be used for the reported RXLEV values"},
-    { 1, "An offset of 10 dB shall be used for the reported RXLEV values"},
-    { 2, "An automatic offset shall be used for the reported RXLEV values"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_xxx_reporting_offset_vals[] = {
-    { 0, "Apply an offset of 0 dB to the reported value when prioritising the cells for reporting"},
-    { 1, "Apply an offset of 6 dB to the reported value when prioritising the cells for reporting"},
-    { 2, "Apply an offset of 12 dB to the reported value when prioritising the cells for reporting"},
-    { 3, "Apply an offset of 18 dB to the reported value when prioritising the cells for reporting"},
-    { 4, "Apply an offset of 24 dB to the reported value when prioritising the cells for reporting"},
-    { 5, "Apply an offset of 30 dB to the reported value when prioritising the cells for reporting"},
-    { 6, "Apply an offset of 36 dB to the reported value when prioritising the cells for reporting"},
-    { 7, "Apply an offset of 42 dB to the reported value when prioritising the cells for reporting"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_xxx_reporting_threshold_vals[] = {
-    { 0, "Apply priority reporting if the reported value is above 0 dB"},
-    { 1, "Apply priority reporting if the reported value is above 6 dB"},
-    { 2, "Apply priority reporting if the reported value is above 12 dB"},
-    { 3, "Apply priority reporting if the reported value is above 18 dB"},
-    { 4, "Apply priority reporting if the reported value is above 24 dB"},
-    { 5, "Apply priority reporting if the reported value is above 30 dB"},
-    { 6, "Apply priority reporting if the reported value is above 36 dB"},
-    { 7, "Never apply priority reporting"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_network_control_order_vals[] = {
-    { 0, "NC0"},
-    { 1, "NC1"},
-    { 2, "NC2"},
-    { 3, "NC0"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_nc_non_drx_period_vals[] = {
-    { 0, "No non-DRX mode after a measurement report has been sent"},
-    { 1, "0,24 s"},
-    { 2, "0,48 s"},
-    { 3, "0.72 s"},
-    { 4, "0.96 s"},
-    { 5, "1.20 s"},
-    { 6, "1.44 s"},
-    { 7, "1.92 s"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_nc_reporting_period_x_vals[] = {
-    { 0, "0.48 s"},
-    { 1, "0.96 s"},
-    { 2, "1.92 s"},
-    { 3, "3.84 s"},
-    { 4, "7.68 s"},
-    { 5, "15.36 s"},
-    { 6, "30.72 s"},
-    { 7, "61.44 s"},
-    { 0, NULL }
-};
-
-static const true_false_string gsm_a_rr_qsearch_c_initial_value = {
-    "Always",
-    "use Qsearch I"
-};
-
-static const true_false_string gsm_a_rr_fdd_rep_quant_value = {
-    "Ec/No",
-    "RSCP"
-};
-
-static const true_false_string gsm_a_rr_3g_search_prio_value = {
-    "3G cells may be searched when BSIC decoding is required",
-    "3G cells may not be searched when BSIC decoding is required"
-};
-
-static const true_false_string gsm_a_rr_3g_ccn_active_value = {
-    "CCN towards 3G cells is enabled in the cell",
-    "CCN towards 3G cells is disabled in the cell"
-};
-
-static gint
-de_rr_si2quater_meas_info_utran_fdd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree, *subtree2;
-    proto_item *item, *item2;
-    gint curr_bit_offset, idx;
-    gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
-    guint8 value;
-
-    curr_bit_offset = bit_offset; 
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]);
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    while (value)
-    {
-        curr_bit_offset += 1; /* skip a 0 bit */
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_uarfcn, tvb, curr_bit_offset, 14, FALSE);
-        curr_bit_offset += 14;
-        xdd_indic0 = tvb_get_bits8(tvb,curr_bit_offset,1);
-        proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "FDD Indic0: %d", xdd_indic0);
-        curr_bit_offset += 1;
-        idx = tvb_get_bits8(tvb,curr_bit_offset,5);
-        proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Nr of FDD Cells : %d", idx);
-        curr_bit_offset += 5;
-        idx = convert_n_to_p[idx];
-        item2 = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]);
-        proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
-        if (xdd_indic0)
-        {
-            proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Scrambling Code: %d", 0);
-            proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity: %d", 0);
-        }
-        if (idx)
-        {
-            wsize = 10;
-            nwi = 1;
-            jwi = 0;
-            i = 1;
-
-            while (idx > 0)
-            {
-                w[i] = tvb_get_bits16(tvb, curr_bit_offset, wsize, FALSE);
-                curr_bit_offset += wsize;
-                idx -= wsize;
-                if (w[i] == 0)
-                {
-                    idx = 0;
-                    break;
-                }
-                if (++jwi==nwi)
-                {
-                    jwi = 0;
-                    nwi <<= 1;
-                    wsize--;
-                }
-                i++;
-            }
-            if (idx < 0)
-            {
-                curr_bit_offset += idx;
-            }
-            iused = i-1;
-
-            for (i=1; i <= iused; i++)
-            {
-                xdd_cell_info = f_k(i, w, 1024);
-                proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Scrambling Code: %d", xdd_cell_info & 0x01FF);
-                proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity: %d", (xdd_cell_info >> 9) & 0x01);
-            }
-        }
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_si2quater_meas_info_utran_tdd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree, *subtree2;
-    proto_item *item, *item2;
-    gint curr_bit_offset, idx;
-    gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0;
-    guint8 value;
-
-    curr_bit_offset = bit_offset; 
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]);
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    while (value)
-    {
-        curr_bit_offset += 1; /* skip a 0 bit */
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_uarfcn, tvb, curr_bit_offset, 14, FALSE);
-        curr_bit_offset += 14;
-        xdd_indic0 = tvb_get_bits8(tvb,curr_bit_offset,1);
-        proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "TDD Indic0: %d", xdd_indic0);
-        curr_bit_offset += 1;
-        idx = tvb_get_bits8(tvb,curr_bit_offset,5);
-        proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Nr of TDD Cells : %d", idx);
-        curr_bit_offset += 5;
-        idx = convert_n_to_q[idx];
-        item2 = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]);
-        proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx);
-        if (xdd_indic0)
-        {
-            proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Cell Parameter: %d", 0);
-            proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Sync Case TSTD: %d", 0);
-            proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity TDD: %d", 0);
-        }
-        if (idx)
-        {
-            wsize = 9;
-            nwi = 1;
-            jwi = 0;
-            i = 1;
-
-            while (idx > 0)
-            {
-                w[i] = tvb_get_bits16(tvb, curr_bit_offset, wsize, FALSE);
-                curr_bit_offset += wsize;
-                idx -= wsize;
-                if (w[i] == 0)
-                {
-                    idx = 0;
-                    break;
-                }
-                if (++jwi==nwi)
-                {
-                    jwi = 0;
-                    nwi <<= 1;
-                    wsize--;
-                }
-                i++;
-            }
-            if (idx < 0)
-            {
-                curr_bit_offset += idx;
-            }
-            iused = i-1;
-
-            for (i=1; i <= iused; i++)
-            {
-                xdd_cell_info = f_k(i, w, 512);
-                proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Cell Parameter: %d", xdd_cell_info & 0x07F);
-                proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Sync Case TSTD: %d", (xdd_cell_info >> 7) & 0x01);
-                proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 0, "Diversity TDD: %d", (xdd_cell_info >> 8) & 0x01);
-            }
-        }
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_rtd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset, idx;
-    guint8 value;
-
-    curr_bit_offset = bit_offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-        if (value)
-        {
-            idx = tvb_get_bits8(tvb,curr_bit_offset,5);
-            proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start RTD: %d", idx);
-            curr_bit_offset += 5;
-        }
-        else
-            idx = 0;
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-        while (value == 0)
-        {
-            proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "RTD index %d: %d TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits8(tvb,curr_bit_offset,6));
-            curr_bit_offset += 6;
-            value = tvb_get_bits8(tvb,curr_bit_offset,1);
-            curr_bit_offset += 1;
-        }
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-        while (value == 0)
-        {
-            idx += 1;
-            value = tvb_get_bits8(tvb,curr_bit_offset,1);
-            curr_bit_offset += 1;
-            while (value == 0)
-            {
-                proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "RTD index %d: %d TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits8(tvb,curr_bit_offset,6));
-                curr_bit_offset += 6;
-                value = tvb_get_bits8(tvb,curr_bit_offset,1);
-                curr_bit_offset += 1;
-            }
-        }
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-        if (value)
-        {
-            idx = tvb_get_bits8(tvb,curr_bit_offset,5);
-            proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start RTD: %d", idx);
-            curr_bit_offset += 5;
-        }
-        else
-            idx = 0;
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-        while (value == 0)
-        {
-            proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 2, "RTD index %d: %d/64 TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits16(tvb,curr_bit_offset,12,FALSE));
-            curr_bit_offset += 12;
-            value = tvb_get_bits8(tvb,curr_bit_offset,1);
-            curr_bit_offset += 1;
-        }
-        value = tvb_get_bits8(tvb,curr_bit_offset,1);
-        curr_bit_offset += 1;
-        while (value == 0)
-        {
-            idx += 1;
-            value = tvb_get_bits8(tvb,curr_bit_offset,1);
-            curr_bit_offset += 1;
-            while (value == 0)
-            {
-                proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 2, "RTD index %d: %d/64 TDMA frame(s) modulo 51 TDMA frames", idx, tvb_get_bits16(tvb,curr_bit_offset,12,FALSE));
-                curr_bit_offset += 12;
-                value = tvb_get_bits8(tvb,curr_bit_offset,1);
-                curr_bit_offset += 1;
-            }
-        }
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_bsic_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset, idx;
-    guint8 value;
-
-    curr_bit_offset = bit_offset;
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start BSIC: %d", tvb_get_bits8(tvb,curr_bit_offset,5));
-        curr_bit_offset += 5;
-    }
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, bit_offset, 6, FALSE);
-    curr_bit_offset += 6;
-    idx = tvb_get_bits8(tvb,curr_bit_offset,7);
-    proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Number Remaining BSIC: %d", idx);
-    curr_bit_offset += 7;
-    while (idx)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_frequency_scrolling, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic, tvb, bit_offset, 6, FALSE);
-        curr_bit_offset += 6;
-        idx -= 1;
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return(curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_report_priority_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset, idx;
-
-    curr_bit_offset = bit_offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
-    idx = tvb_get_bits8(tvb,curr_bit_offset,7);
-    proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Number Cells: %d", idx);
-    curr_bit_offset += 7;
-    while (idx)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rep_priority, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        idx -= 1;
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return(curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_meas_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_elem_idx_t id)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset;
-    guint8 value;
-
-    curr_bit_offset = bit_offset;
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]);
-    if (id == DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_report_type, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reporting_rate, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset +=1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_invalid_bsic_reporting, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset +=1;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_multiband_reporting, tvb, curr_bit_offset, 2, FALSE);
-        curr_bit_offset += 2;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_serving_band_reporting, tvb, curr_bit_offset, 2, FALSE);
-        curr_bit_offset += 2;
-    }
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_scale_ord, tvb, curr_bit_offset, 2, FALSE);
-    curr_bit_offset += 2;
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_900_reporting_offset, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_900_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1800_reporting_offset, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1800_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_400_reporting_offset, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_400_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1900_reporting_offset, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_1900_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_850_reporting_offset, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_850_reporting_threshold, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return(curr_bit_offset - bit_offset);
-}
-
-static gint
-de_rr_3g_add_meas_param_desc2(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset;
-    guint8 value;
-
-    curr_bit_offset = bit_offset;
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2]);
-    value = tvb_get_bits8(tvb,curr_bit_offset,1);
-    curr_bit_offset += 1;
-    if (value)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, FALSE);
-        curr_bit_offset += 6;
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return(curr_bit_offset - bit_offset);
-}
-
-static guint16
-de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree, *subtree2, *subtree3;
-    proto_item	*item, *item2, *item3;
-    guint32	curr_offset;
-    gint bit_offset, bit_offset_sav, idx;
-    guint8 value;
-
-    len = 20;
-    curr_offset = offset;
-    bit_offset = curr_offset<<3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI2QUATER_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI2QUATER_REST_OCT]);
-
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_ba_ind, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ba_ind, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mp_change_mark, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2quater_index, tvb, bit_offset, 4, FALSE);
-    bit_offset += 4;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2quater_count, tvb, bit_offset, 4, FALSE);
-    bit_offset += 4;
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* Measurement Parameters Description */
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MEAS_PARAM_DESC].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MEAS_PARAM_DESC]);
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_gsm_report_type, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_serving_band_reporting, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    value  = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* GPRS Real Time Difference Description */
-        bit_offset += de_rr_rtd_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_RTD_DESC);
-
-    }
-    value  = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* GPRS BSIC Description */
-        bit_offset += de_rr_bsic_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_BSIC_DESC);
-    }
-    value  = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* GPRS Report Priority Description */
-        bit_offset += de_rr_report_priority_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_REPORT_PRIO_DESC);
-    }
-    value  = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* GPRS Measurement Parameters Description */
-        bit_offset += de_rr_meas_param_desc(tvb, subtree, bit_offset, DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* NC Measurement Parameters */
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_NC_MEAS_PARAM].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_NC_MEAS_PARAM]);
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_network_control_order, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nc_non_drx_period, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nc_reporting_period_i, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nc_reporting_period_t, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* SI 2quater Extension Information */
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI2Q_EXT_INFO].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI2Q_EXT_INFO]);
-        idx = tvb_get_bits8(tvb,bit_offset,8);
-        proto_tree_add_text(subtree2,tvb, bit_offset>>3, 1, "Extension Length: %d", idx);
-        bit_offset += 8;
-        proto_item_set_len(item2,((bit_offset+idx+1-bit_offset_sav)>>3)+1);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* CCN Support Description */
-            bit_offset_sav = bit_offset;
-            item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC].strptr);
-            subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC]);
-            value = tvb_get_bits8(tvb,bit_offset,7);
-            proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "Number Cells: %d", value);
-            bit_offset += 7;
-            idx -= 7;
-            item2 = proto_tree_add_text(subtree3,tvb, bit_offset>>3, (value>>3)+1, "CCN Supported: ");
-            while (value)
-            {
-                proto_item_append_text(item2,"%d",tvb_get_bits8(tvb,bit_offset,1));
-                bit_offset += 1;
-                value -= 1;
-                idx -= 1;
-            }
-            proto_item_set_len(item3,((bit_offset+-bit_offset_sav)>>3)+1);
-        }
-        bit_offset += idx;
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* 3G Neighbour Cell Description */
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC]);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_index_start_3g, tvb, bit_offset, 7, FALSE);
-            bit_offset += 7;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_absolute_index_start_emr, tvb, bit_offset, 7, FALSE);
-            bit_offset += 7;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* UTRAN FDD Description */
-            bit_offset += de_rr_si2quater_meas_info_utran_fdd_desc(tvb, subtree2, bit_offset);
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* UTRAN TDD Description */
-            bit_offset += de_rr_si2quater_meas_info_utran_tdd_desc(tvb, subtree2, bit_offset);
-        }
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* 3G Measurement Parameters Description */
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]);
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_i, tvb, bit_offset, 4, FALSE);
-        bit_offset += 4;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_c_initial, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qoffset, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rep_quant, tvb, bit_offset, 1, FALSE);
-            bit_offset += 1;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_multirat_reporting, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_qoffset, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_multirat_reporting, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-        }
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* GPRS 3G Measurement Parameters Description */
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC]);
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_p, tvb, bit_offset, 4, FALSE);
-        bit_offset += 4;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_3g_search_prio, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rep_quant, tvb, bit_offset, 1, FALSE);
-            bit_offset += 1;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_multirat_reporting, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_reporting_offset, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_reporting_threshold, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_multirat_reporting, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_reporting_offset, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_reporting_threshold, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    if (((curr_offset + len)<<3) - bit_offset > 0)
-    {
-        /* There is still room left in the Rest Octets IE */
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* Additions in Rel-5 */
-            bit_offset += 1;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            { /* 3G Additional Measurement Parameters Description */
-                bit_offset_sav = bit_offset;
-                item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr);
-                subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC]);
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin_offset, tvb, bit_offset, 3, FALSE);
-                bit_offset += 3;
-                proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rscpmin, tvb, bit_offset, 4, FALSE);
-                bit_offset += 4;
-                proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-            }
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            { /* 3G Additional Measurement Parameters Description 2 */
-                bit_offset += de_rr_3g_add_meas_param_desc2(tvb, subtree, bit_offset);
-            }
-            if (((curr_offset + len)<<3) - bit_offset > 0)
-            {
-                /* There is still room left in the Rest Octets IE */
-                if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-                { /* Additions in Rel-6 */
-                    bit_offset += 1;
-                    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_ccn_active, tvb, bit_offset, 1, FALSE);
-                    bit_offset += 1;
-                    if (((curr_offset + len)<<3) - bit_offset > 0)
-                    {
-                        /* There is still room left in the Rest Octets IE */
-                        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-                        { /* Additions in Rel-7 */
-                            bit_offset += 1;
-                            value = tvb_get_bits8(tvb,bit_offset,1);
-                            bit_offset += 1;
-                            if (value)
-                            {
-                                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_700_reporting_offset, tvb, bit_offset, 3, FALSE);
-                                bit_offset += 3;
-                                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_700_reporting_threshold, tvb, bit_offset, 3, FALSE);
-                                bit_offset += 3;
-                            }
-                            value = tvb_get_bits8(tvb,bit_offset,1);
-                            bit_offset += 1;
-                            if (value)
-                            {
-                                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_810_reporting_offset, tvb, bit_offset, 3, FALSE);
-                                bit_offset += 3;
-                                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_810_reporting_threshold, tvb, bit_offset, 3, FALSE);
-                                bit_offset += 3;
-                            }
-                        }
-                        else
-                            bit_offset += 1;
-                    }
-                }
-                else
-                    bit_offset += 1;
-            }
-        }
-        else bit_offset += 1;
-    }
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.34 SI 3 Rest Octets
- */
-static const value_string gsm_a_rr_temporary_offset_vals[] = {
-    { 0, "0 dB"},
-    { 1, "10 dB"},
-    { 2, "20 dB"},
-    { 3, "30 dB"},
-    { 4, "40 dB"},
-    { 5, "50 dB"},
-    { 6, "60 dB"},
-    { 7, "infinity"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_cell_reselect_offset_vals[] = {
-    { 0, "0 dB"},
-    { 1, "2 dB"},
-    { 2, "4 dB"},
-    { 3, "6 dB"},
-    { 4, "8 dB"},
-    { 5, "10 dB"},
-    { 6, "12 dB"},
-    { 7, "14 dB"},
-    { 8, "16 dB"},
-    { 9, "18 dB"},
-    {10, "20 dB"},
-    {11, "22 dB"},
-    {12, "24 dB"},
-    {13, "26 dB"},
-    {14, "28 dB"},
-    {15, "30 dB"},
-    {16, "32 dB"},
-    {17, "34 dB"},
-    {18, "36 dB"},
-    {19, "38 dB"},
-    {20, "40 dB"},
-    {21, "42 dB"},
-    {22, "44 dB"},
-    {23, "46 dB"},
-    {24, "48 dB"},
-    {25, "50 dB"},
-    {26, "52 dB"},
-    {27, "54 dB"},
-    {28, "56 dB"},
-    {29, "58 dB"},
-    {30, "60 dB"},
-    {31, "62 dB"},
-    {32, "64 dB"},
-    {33, "66 dB"},
-    {34, "68 dB"},
-    {35, "70 dB"},
-    {36, "72 dB"},
-    {37, "74 dB"},
-    {38, "76 dB"},
-    {39, "78 dB"},
-    {40, "80 dB"},
-    {41, "82 dB"},
-    {42, "84 dB"},
-    {43, "86 dB"},
-    {44, "88 dB"},
-    {45, "90 dB"},
-    {46, "92 dB"},
-    {47, "94 dB"},
-    {48, "96 dB"},
-    {49, "98 dB"},
-    {50, "100 dB"},
-    {51, "102 dB"},
-    {52, "104 dB"},
-    {53, "106 dB"},
-    {54, "108 dB"},
-    {55, "110 dB"},
-    {56, "112 dB"},
-    {57, "114 dB"},
-    {58, "116 dB"},
-    {59, "118 dB"},
-    {60, "120 dB"},
-    {61, "122 dB"},
-    {62, "124 dB"},
-    {63, "126 dB"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_penalty_time_vals[] = {
-    { 0, "20 s"},
-    { 1, "40 s"},
-    { 2, "60 s"},
-    { 3, "80 s"},
-    { 4, "100 s"},
-    { 5, "120 s"},
-    { 6, "140 s"},
-    { 7, "160 s"},
-    { 8, "180 s"},
-    { 9, "200 s"},
-    {10, "220 s"},
-    {11, "240 s"},
-    {12, "260 s"},
-    {13, "280 s"},
-    {14, "300 s"},
-    {15, "320 s"},
-    {16, "340 s"},
-    {17, "360 s"},
-    {18, "380 s"},
-    {19, "400 s"},
-    {20, "420 s"},
-    {21, "440 s"},
-    {22, "460 s"},
-    {23, "480 s"},
-    {24, "500 s"},
-    {25, "520 s"},
-    {26, "540 s"},
-    {27, "560 s"},
-    {28, "580 s"},
-    {29, "600 s"},
-    {30, "620 s"},
-    {31, "Cell Reselect Offset is subtracted from C2 and Temporary Offset is ignored"},
-    { 0, NULL }
-};
-
-static gint
-de_rr_rest_oct_opt_sel_param(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset;
-
-    curr_bit_offset = bit_offset;
-
-    if (gsm_a_rr_is_bit_high(tvb,curr_bit_offset) == TRUE)
-    { /* Selection Parameters */
-        curr_bit_offset += 1;
-        item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM]);
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq, tvb, curr_bit_offset, 1, FALSE);
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cell_reselect_offset, tvb, curr_bit_offset, 6, FALSE);
-        curr_bit_offset += 6;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_temporary_offset, tvb, curr_bit_offset, 3, FALSE);
-        curr_bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_penalty_time, tvb, curr_bit_offset, 5, FALSE);
-        curr_bit_offset += 5;
-        proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-    }
-    else
-        curr_bit_offset += 1;
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static const value_string gsm_a_rr_si13_position_vals[] = {
-    { 0, "SYSTEM INFORMATION TYPE 13 message is sent on BCCH Norm"},
-    { 1, "SYSTEM INFORMATION TYPE 13 message is sent on BCCH Ext"},
-    { 0, NULL }
-};
-
-static gint
-de_rr_rest_oct_gprs_indicator(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset;
-
-    curr_bit_offset = bit_offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_INDICATOR].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_INDICATOR]);
-    proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, 1, "RA Colour: %d",tvb_get_bits8(tvb,curr_bit_offset,3));
-    curr_bit_offset += 3;
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13_position, tvb, curr_bit_offset, 1, FALSE);
-    curr_bit_offset += 1;
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static const value_string gsm_a_rr_power_offset_vals[] = {
-    { 0, "0 dB"},
-    { 1, "2 dB"},
-    { 2, "4 dB"},
-    { 3, "8 dB"},
-    { 0, NULL }
-};
-
-static const true_false_string gsm_a_rr_si2quater_position_value = {
-    "SYSTEM INFORMATION TYPE 2 quater message is sent on BCCH Ext",
-    "SYSTEM INFORMATION TYPE 2 quater message is sent on BCCH Norm"
-};
-
-static const true_false_string gsm_a_rr_si13alt_position_value = {
-    "If Iu mode is supported in the cell, SYSTEM INFORMATION TYPE 13alt message is sent on BCCH Ext",
-    "If Iu mode is supported in the cell, SYSTEM INFORMATION TYPE 13alt message is sent on BCCH Norm"
-};
-
-static guint16
-de_rr_si3_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-    gint bit_offset;
-    gboolean gprs_indicator;
-
-    len = 4;
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI3_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI3_REST_OCT]);
-
-    bit_offset += de_rr_rest_oct_opt_sel_param(tvb, subtree, bit_offset);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* Optional Power Offset */
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_power_offset, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "SYSTEM INFORMATION TYPE 2ter message is available");
-    else
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "SYSTEM INFORMATION TYPE 2ter message is not available");
-    bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Early Classmark Sending is allowed");
-    else
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Early Classmark Sending is forbidden");
-    bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* Scheduling if and where */
-        bit_offset += 1;
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Where: %d",tvb_get_bits8(tvb,bit_offset,3));
-        bit_offset += 3;
-    }
-    else
-        bit_offset += 1;
-    gprs_indicator = gsm_a_rr_is_bit_high(tvb,bit_offset);
-    if (gprs_indicator == TRUE)
-    { /* GPRS indicator */
-        bit_offset += 1;
-        bit_offset += de_rr_rest_oct_gprs_indicator(tvb, subtree, bit_offset);
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "3G Early Classmark Sending Restriction: The sending of UTRAN,CDMA2000 and GERAN IU MODE CLASSMARK CHANGE messages are controlled by the Early Classmark Sending Control parameter");
-    else
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "3G Early Classmark Sending Restriction: Neither UTRAN, CDMA2000 nor GERAN IU MODE CLASSMARK CHANGE message shall be sent with the Early classmark sending");
-    bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* SI2quater Indicator */
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2quater_position, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-    }
-    else
-        bit_offset += 1;
-    if (gprs_indicator == FALSE)
-    {
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13alt_position, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-    }
-   
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.32 SI 4 Rest Octets
- */
-static const value_string gsm_a_rr_prio_thr_vals[] = {
-    { 0, "0 dB"},
-    { 1, "6 dB"},
-    { 2, "12 dB"},
-    { 3, "18 dB"},
-    { 4, "24 dB"},
-    { 5, "30 dB"},
-    { 6, "36 dB"},
-    { 7, "Infinite"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_lsa_offset_vals[] = {
-    { 0, "0 dB"},
-    { 1, "4 dB"},
-    { 2, "8 dB"},
-    { 3, "16 dB"},
-    { 4, "24 dB"},
-    { 5, "32 dB"},
-    { 6, "48 dB"},
-    { 7, "64 dB"},
-    { 0, NULL }
-};
-
-static guint16
-de_rr_si4_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree, *subtree2, *subtree3;
-    proto_item	*item, *item2, *item3;
-    guint32	curr_offset;
-    gint bit_offset, bit_offset_sav, bit_offset_sav2;
-    guint value;
-
-    len = tvb_length_remaining(tvb,offset);
-    if (len==0)
-        return 0;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI4_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI4_REST_OCT]);
-
-    item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O].strptr);
-
-    subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O]);
-
-    bit_offset += de_rr_rest_oct_opt_sel_param(tvb, subtree2, bit_offset);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* Optional Power Offset */
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_power_offset, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        bit_offset += de_rr_rest_oct_gprs_indicator(tvb, subtree2, bit_offset);
-    }
-    else
-        bit_offset += 1;
-    proto_item_set_len(item2,(bit_offset>>3)+1-curr_offset);
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* SI4 Rest Octets_S */
-        bit_offset += 1;
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S]);
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* LSA Parameters */
-            bit_offset += 1;
-            bit_offset_sav2 = bit_offset;
-            item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_PARAMETERS].strptr);
-            subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_PARAMETERS]);
-            proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_prio_thr, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_lsa_offset, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_text(subtree3, tvb, bit_offset>>3, 2, "MCC: %d", tvb_get_bits16(tvb,bit_offset,12,FALSE));
-                bit_offset += 12;
-                proto_tree_add_text(subtree3, tvb, bit_offset>>3, 2, "MNC: %d", tvb_get_bits16(tvb,bit_offset,12,FALSE));
-                bit_offset += 12;
-            }
-            proto_item_set_len(item2,((bit_offset-bit_offset_sav2)>>3)+1);
-        }
-        else
-            bit_offset += 1;
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* Cell Identity */
-            bit_offset += 1;
-            value = tvb_get_bits16(tvb, bit_offset, 16, FALSE);
-            proto_tree_add_uint(subtree2, hf_gsm_a_bssmap_cell_ci, tvb, bit_offset>>3, 2, value);
-            bit_offset += 16;
-        }
-        else
-            bit_offset += 1;
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* LSA ID information */
-            bit_offset += 1;
-            bit_offset_sav2 = bit_offset;
-            item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, len, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_ID_INFO].strptr);
-            subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_ID_INFO]);
-            do
-            {
-                value = tvb_get_bits8(tvb,bit_offset,1);
-                bit_offset += 1;
-                if (value)
-                {
-                    proto_tree_add_text(subtree3, tvb, bit_offset>>3, 3, "Short LSA ID: %d",tvb_get_bits16(tvb,bit_offset,10,FALSE));
-                    bit_offset += 10;
-                }
-                else
-                {
-                    proto_tree_add_text(subtree3, tvb, bit_offset>>3, 3, "LSA ID: %d",tvb_get_bits32(tvb,bit_offset,24,FALSE));
-                    bit_offset += 24;
-                }
-                value = tvb_get_bits8(tvb,bit_offset,1);
-                bit_offset += 1;
-            } while (value);
-        }
-        else
-            bit_offset += 1;
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        {
-            bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq3, tvb, (curr_offset<<3)+1, 2, FALSE);
-            bit_offset += 3;
-        }
-        else
-            bit_offset += 1;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13alt_position, tvb, bit_offset, 1, FALSE);
-            bit_offset += 1;
-        }
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    else
-    { /* Break indicator */
-        bit_offset += 1;
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-            proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Break Indicator: Additional parameters \"SI4 Rest Octets_S\" are sent in SYSTEM INFORMATION TYPE 7 and 8");
-        else
-            proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Break Indicator: Additional parameters \"SI4 Rest Octets_S\" are not sent in SYSTEM INFORMATION TYPE 7 and 8");
-        bit_offset += 1;
-    }
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/*
- * [3] 10.5.2.35a SI 6 Rest Octets
- */
-static const true_false_string gsm_a_rr_paging_channel_restructuring_value = {
-    "Paging channel is restructured",
-    "Paging channel is not restructured"
-};
-
-static const true_false_string gsm_a_rr_vbs_vgcs_inband_notifications_value = {
-    "The mobile shall be notified on incoming high priority VBS/VGCS calls through NOTIFICATION/FACCH, the mobile need not to inspect the NCH",
-    "The network does not provide notification on FACCH so that the mobile should inspect the NCH for notifications"
-};
-
-static const true_false_string gsm_a_rr_vbs_vgcs_inband_pagings_value = {
-    "The mobile shall be notified on incoming high priority point-to-point calls through NOTIFICATION/FACCH, the mobile need not to inspect the PCH",
-    "The network does not provide paging information on FACCH so that the mobile should inspect the PCH for pagings"
-};
-
-static const value_string gsm_a_rr_max_lapdm_vals[] = {
-    { 0, "Any message segmented in up to 5 LAPDm frames"},
-    { 1, "Any message segmented in up to 6 LAPDm frames"},
-    { 2, "Any message segmented in up to 7 LAPDm frames"},
-    { 3, "Any message segmented in up to 8 LAPDm frames"},
-    { 4, "Any message segmented in up to 9 LAPDm frames"},
-    { 5, "Any message segmented in up to 10 LAPDm frames"},
-    { 6, "Any message segmented in up to 11 LAPDm frames"},
-    { 7, "Any message segmented in up to 12 LAPDm frames"},
-    { 0, NULL }
-};
-
-static const true_false_string gsm_a_rr_dedicated_mode_mbms_notification_support_value = {
-    "The cell supports the Dedicated Mode MBMS Notification procedures",
-    "The cell does not support the Dedicated Mode MBMS Notification procedures"
-};
-
-static const true_false_string gsm_a_rr_mnci_support_value = {
-    "The cell supports the distribution of MBMS NEIGHBOURING CELL INFORMATION messages",
-    "The cell does not support the distribution of MBMS NEIGHBOURING CELL INFORMATION messages"
-};
-
-static guint16
-de_rr_si6_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree, *subtree2;
-    proto_item	*item, *item2;
-    guint32	curr_offset;
-    gint bit_offset, bit_offset_sav;
-    guint8 value;
-
-    len = 7;
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI6_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI6_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* PCH and NCH Info */
-        bit_offset += 1;
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO]);
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_paging_channel_restructuring, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nln_sacch, tvb, bit_offset, 2, FALSE);
-        bit_offset += 2;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_call_prio, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nln_status_sacch, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* VBS/VGCS options */
-        bit_offset += 1;
-        bit_offset_sav = bit_offset;
-        item2 = proto_tree_add_text(subtree, tvb,bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS].strptr);
-        subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS]);
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_vbs_vgcs_inband_notifications, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_vbs_vgcs_inband_pagings, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    else
-        bit_offset += 1;
-    value = gsm_a_rr_is_bit_high(tvb,bit_offset);
-    if (value == TRUE)
-    {
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "DTM is supported in the serving cell");
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rac, tvb, bit_offset, 8, FALSE);
-        bit_offset += 8;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_max_lapdm, tvb, bit_offset, 3, FALSE);
-        bit_offset += 3;
-    }
-    else
-    {
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "DTM is not supported in the serving cell");
-        bit_offset += 1;
-    }
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Band Indicator: 1900");
-    else
-        proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Band Indicator: 1800");
-    bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gprs_ms_txpwr_max_ccch, tvb, bit_offset, 5, FALSE);
-        bit_offset += 5;
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* MBMS Procedures */
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dedicated_mode_mbms_notification_support, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mnci_support, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-    }
-    else
-        bit_offset += 1;
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    { /* Additions in Release 7 */
-        bit_offset += 1;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_amr_config, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-        }
-    }
-    else
-        bit_offset += 1;
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/* [3] 10.5.2.36 SI 7 Rest Octets
- * [3] 10.5.2.37 SI 8 Rest Octets
- * [3] 10.5.2.37a SI 9 Rest Octets
- */
-
-/*
- * [3] 10.5.2.37b SI 13 Rest Octets
- */
-static const value_string gsm_a_rr_si_change_field_vals[] = {
-    {  0, "Update of unspecified SI message or SI messages"},
-    {  1, "Update of SI1 message"},
-    {  2, "Update of SI2, SI2 bis or SI2 ter message or any instance of SI2quater messages"},
-    {  3, "Update of SI3, SI4, SI7, SI8, SI16 or SI17 message"},
-    {  4, "Update of SI9 message"},
-    {  5, "Update of SI18 or SI20 message"},
-    {  6, "Update of SI19 message"},
-    {  7, "Update of SI15 message"},
-    {  8, "Update of SI2n message"},
-    {  9, "Update of unknown SI message type"},
-    { 10, "Update of unknown SI message type"},
-    { 11, "Update of unknown SI message type"},
-    { 12, "Update of unknown SI message type"},
-    { 13, "Update of unknown SI message type"},
-    { 14, "Update of unknown SI message type"},
-    { 15, "Update of unknown SI message type"},
-    {  0, NULL }
-};
-
-static const value_string gsm_a_rr_psi1_repeat_period_vals[] = {
-    {  0, "1 multiframe"},
-    {  1, "2 multiframes"},
-    {  2, "3 multiframes"},
-    {  3, "4 multiframes"},
-    {  4, "5 multiframes"},
-    {  5, "6 multiframes"},
-    {  6, "7 multiframes"},
-    {  7, "8 multiframes"},
-    {  8, "9 multiframes"},
-    {  9, "10 multiframes"},
-    { 10, "11 multiframes"},
-    { 11, "12 multiframes"},
-    { 12, "13 multiframes"},
-    { 13, "14 multiframes"},
-    { 14, "15 multiframes"},
-    { 15, "16 multiframes"},
-    {  0, NULL }
-};
-
-static const value_string gsm_a_rr_pbcch_pb_vals[] = {
-    {  0, "0 dB"},
-    {  1, "-2 dB"},
-    {  2, "-4 dB"},
-    {  3, "-6 dB"},
-    {  4, "-8 dB"},
-    {  5, "-10 dB"},
-    {  6, "-12 dB"},
-    {  7, "-14 dB"},
-    {  8, "-16 dB"},
-    {  9, "-18 dB"},
-    { 10, "-20 dB"},
-    { 11, "-22 dB"},
-    { 12, "-24 dB"},
-    { 13, "-26 dB"},
-    { 14, "-28 dB"},
-    { 15, "-30 dB"},
-    {  0, NULL }
-};
-
-static const true_false_string gsm_a_rr_spgc_ccch_sup_value = {
-    "SPLIT_PG_CYCLE is supported on CCCH in this cell",
-    "SPLIT_PG_CYCLE is not supported on CCCH in this cell"
-};
-
-static const value_string gsm_a_rr_priority_access_thr_vals[] = {
-    {  0, "Packet access is not allowed in the cell"},
-    {  1, "Packet access is not allowed in the cell"},
-    {  2, "Packet access is not allowed in the cell"},
-    {  3, "Packet access is allowed for priority level 1"},
-    {  4, "Packet access is allowed for priority level 1 to 2"},
-    {  5, "Packet access is allowed for priority level 1 to 3"},
-    {  6, "Packet access is allowed for priority level 1 to 4"},
-    {  7, "Packet access is allowed for priority level 1 to 4"},
-    {  0, NULL }
-};
-
-static gint
-de_rr_rest_oct_gprs_mobile_allocation(tvbuff_t *tvb, proto_tree *tree, gint bit_offset)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    gint curr_bit_offset;
-    guint8 value;
-    guint64 ma_length;
-
-    curr_bit_offset = bit_offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC].strptr);
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC]);
-    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_hsn, tvb, curr_bit_offset, 6, FALSE);
-    curr_bit_offset += 6;
-    while (tvb_get_bits8(tvb,curr_bit_offset,1))
-    {
-        curr_bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rfl_number, tvb, curr_bit_offset, 4, FALSE);
-        curr_bit_offset += 4;
-    }
-    curr_bit_offset += 1;
-    if (tvb_get_bits8(tvb,curr_bit_offset,1))
-    {
-        curr_bit_offset += 1;
-        while (tvb_get_bits8(tvb,curr_bit_offset,1))
-        {
-            curr_bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_arfcn_index, tvb, curr_bit_offset, 6, FALSE);
-            curr_bit_offset += 6;
-        }
-        curr_bit_offset += 1;
-    }
-    else
-    {
-        curr_bit_offset += 1;
-        proto_tree_add_bits_ret_val(subtree, hf_gsm_a_rr_ma_length, tvb, curr_bit_offset, 6, &ma_length, FALSE);
-        curr_bit_offset += 6;
-        value = (gint)ma_length + 1;
-        item = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (value>>3)+1, "MA Bitmap: ");
-        while (value)
-        {
-            proto_item_append_text(item,"%d",tvb_get_bits8(tvb,curr_bit_offset,1));
-            curr_bit_offset += 1;
-            value -= 1;
-        }
-    }
-    proto_item_set_len(item,((curr_bit_offset-bit_offset)>>3)+1);
-
-    return (curr_bit_offset - bit_offset);
-}
-
-static const value_string gsm_a_rr_nmo_vals[] = {
-    { 0, "Network Mode of Operation I"},
-    { 1, "Network Mode of Operation II"},
-    { 2, "Network Mode of Operation III"},
-    { 3, "Reserved"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_t3168_vals[] = {
-    { 0, "500 ms"},
-    { 1, "1000 ms"},
-    { 2, "1500 ms"},
-    { 3, "2000 ms"},
-    { 4, "2500 ms"},
-    { 5, "3000 ms"},
-    { 6, "3500 ms"},
-    { 7, "4000 ms"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_t3192_vals[] = {
-    { 0, "500 ms"},
-    { 1, "1000 ms"},
-    { 2, "1500 ms"},
-    { 3, "0 ms"},
-    { 4, "80 ms"},
-    { 5, "120 ms"},
-    { 6, "160 ms"},
-    { 7, "200 ms"},
-    { 0, NULL }
-};
-
-static const value_string gsm_a_rr_drx_timer_max_vals[] = {
-    { 0, "0 s"},
-    { 1, "1 s"},
-    { 2, "2 s"},
-    { 3, "4 s"},
-    { 4, "8 s"},
-    { 5, "16 s"},
-    { 6, "32 s"},
-    { 7, "64 s"},
-    { 0, NULL }
-};
-
-static const true_false_string gsm_a_rr_access_burst_type_value = {
-    "11-bit format shall be used",
-    "8-bit format shall be used"
-};
-
-static const true_false_string gsm_a_rr_control_ack_type_value = {
-    "Default format is RLC/MAC control block",
-    "Default format is four access bursts"
-};
-
-static const value_string gsm_a_rr_pan_max_vals[] = {
-    { 0, "maximum value allowed for counter N3102 is 4"},
-    { 1, "maximum value allowed for counter N3102 is 8"},
-    { 2, "maximum value allowed for counter N3102 is 12"},
-    { 3, "maximum value allowed for counter N3102 is 16"},
-    { 4, "maximum value allowed for counter N3102 is 20"},
-    { 5, "maximum value allowed for counter N3102 is 24"},
-    { 6, "maximum value allowed for counter N3102 is 28"},
-    { 7, "maximum value allowed for counter N3102 is 32"},
-    { 0, NULL }
-};
-
-static const true_false_string gsm_a_rr_egprs_packet_channel_request_value = {
-    "Use two phase packet access with PACKET CHANNEL REQUEST message for uplink TBF establishment on the PRACH",
-    "Use EGPRS PACKET CHANNEL REQUEST message for uplink TBF establishment on the PRACH"
-};
-
-static const value_string gsm_a_rr_bep_period_vals[] = {
-    {  0, "1"},
-    {  1, "2"},
-    {  2, "3"},
-    {  3, "4"},
-    {  4, "5"},
-    {  5, "7"},
-    {  6, "10"},
-    {  7, "12"},
-    {  8, "15"},
-    {  9, "20"},
-    { 10, "25"},
-    { 11, "Reserved"},
-    { 12, "Reserved"},
-    { 13, "Reserved"},
-    { 14, "Reserved"},
-    { 15, "Reserved"},
-    {  0, NULL }
-};
-
-static const true_false_string gsm_a_rr_pfc_feature_mode_value = {
-    "The network supports packet flow context procedures",
-    "The network does not support packet flow context procedures"
-};
-
-static const true_false_string gsm_a_rr_dtm_support_value = {
-    "The cell supports DTM procedures",
-    "The cell does not support DTM procedures"
-};
-
-static const true_false_string gsm_a_rr_bss_paging_coordination_value = {
-    "The cell supports Circuit-Switched paging coordination",
-    "The cell does not support Circuit-Switched paging coordination"
-};
-
-static const true_false_string gsm_a_rr_ccn_active_value = {
-    "CCN is enabled in the cell",
-    "CCN is disabled in the cell"
-};
-
-static const true_false_string gsm_a_rr_nw_ext_utbf_value = {
-    "The extended uplink TBF mode is supported by the network",
-    "The extended uplink TBF mode is not supported by the network"
-};
-
-static const true_false_string gsm_a_rr_multiple_tbf_capability_value = {
-    "The cell supports multiple TBF procedures",
-    "The cell does not support multiple TBF procedures"
-};
-
-static const true_false_string gsm_a_rr_ext_utbf_no_data_value = {
-    "The mobile station may refrain from sending a PACKET UPLINK DUMMY CONTROL BLOCK message when there is no other RLC/MAC block ready to send in an uplink radio block allocated by the network",
-    "The mobile station shall send a PACKET UPLINK DUMMY CONTROL BLOCK message when there is no other RLC/MAC block ready to send in an uplink radio block allocated by the network"
-};
-
-static const true_false_string gsm_a_rr_dtm_enhancements_capability_value = {
-    "The cell supports enhanced DTM CS establishment and enhanced DTM CS release procedures",
-    "The cell does not support enhanced DTM CS establishment and enhanced DTM CS release procedures"
-};
-
-static const true_false_string gsm_a_rr_reduced_latency_access_value = {
-    "The cell supports \"One Phase Access Request by Reduced Latency MS\"",
-    "The cell does not support \"One Phase Access Request by Reduced Latency MS\""
-};
-
-static const value_string gsm_a_rr_alpha_vals[] = {
-    {  0, "0.0"},
-    {  1, "0.1"},
-    {  2, "0.2"},
-    {  3, "0.3"},
-    {  4, "0.4"},
-    {  5, "0.5"},
-    {  6, "0.6"},
-    {  7, "0.7"},
-    {  8, "0.8"},
-    {  9, "0.9"},
-    { 10, "1.0"},
-    { 11, "1.0"},
-    { 12, "1.0"},
-    { 13, "1.0"},
-    { 14, "1.0"},
-    { 15, "1.0"},
-    {  0, NULL }
-};
-
-static const value_string gsm_a_rr_t_avg_x_vals[] = {
-    {  0, "2^(0/2) / 6 multiframes"},
-    {  1, "2^(1/2) / 6 multiframes"},
-    {  2, "2^(2/2) / 6 multiframes"},
-    {  3, "2^(3/2) / 6 multiframes"},
-    {  4, "2^(4/2) / 6 multiframes"},
-    {  5, "2^(5/2) / 6 multiframes"},
-    {  6, "2^(6/2) / 6 multiframes"},
-    {  7, "2^(7/2) / 6 multiframes"},
-    {  8, "2^(8/2) / 6 multiframes"},
-    {  9, "2^(9/2) / 6 multiframes"},
-    { 10, "2^(10/2) / 6 multiframes"},
-    { 11, "2^(11/2) / 6 multiframes"},
-    { 12, "2^(12/2) / 6 multiframes"},
-    { 13, "2^(13/2) / 6 multiframes"},
-    { 14, "2^(14/2) / 6 multiframes"},
-    { 15, "2^(15/2) / 6 multiframes"},
-    { 16, "2^(16/2) / 6 multiframes"},
-    { 17, "2^(17/2) / 6 multiframes"},
-    { 18, "2^(18/2) / 6 multiframes"},
-    { 19, "2^(19/2) / 6 multiframes"},
-    { 20, "2^(20/2) / 6 multiframes"},
-    { 21, "2^(21/2) / 6 multiframes"},
-    { 22, "2^(22/2) / 6 multiframes"},
-    { 23, "2^(23/2) / 6 multiframes"},
-    { 24, "2^(24/2) / 6 multiframes"},
-    { 25, "2^(25/2) / 6 multiframes"},
-    { 26, "2^(25/2) / 6 multiframes"},
-    { 27, "2^(25/2) / 6 multiframes"},
-    { 28, "2^(25/2) / 6 multiframes"},
-    { 29, "2^(25/2) / 6 multiframes"},
-    { 30, "2^(25/2) / 6 multiframes"},
-    { 31, "2^(25/2) / 6 multiframes"},
-    {  0, NULL }
-};
-
-static const true_false_string gsm_a_rr_pc_meas_chan_value = {
-    "Downlink measurements for power control shall be made on PDCH",
-    "Downlink measurements for power control shall be made on BCCH"
-};
-
-static const value_string gsm_a_rr_n_avg_i_vals[] = {
-    {  0, "2^(0/2)"},
-    {  1, "2^(1/2)"},
-    {  2, "2^(2/2)"},
-    {  3, "2^(3/2)"},
-    {  4, "2^(4/2)"},
-    {  5, "2^(5/2)"},
-    {  6, "2^(6/2)"},
-    {  7, "2^(7/2)"},
-    {  8, "2^(8/2)"},
-    {  9, "2^(9/2)"},
-    { 10, "2^(10/2)"},
-    { 11, "2^(11/2)"},
-    { 12, "2^(12/2)"},
-    { 13, "2^(13/2)"},
-    { 14, "2^(14/2)"},
-    { 15, "2^(15/2)"},
-    {  0, NULL }
-};
-
-static const true_false_string gsm_a_rr_sgsnr_value = {
-    "SGSN is Release '99 onwards",
-    "SGSN is Release '98 or older"
-};
-
-static const true_false_string gsm_a_rr_si_status_ind_value = {
-    "The network supports the PACKET SI STATUS message",
-    "The network does not support the PACKET SI STATUS message"
-};
-
-static const value_string gsm_a_rr_lb_ms_txpwr_max_cch_vals[] = {
-    {  0, "43 dBm"},
-    {  1, "41 dBm"},
-    {  2, "39 dBm"},
-    {  3, "37 dBm"},
-    {  4, "35 dBm"},
-    {  5, "33 dBm"},
-    {  6, "31 dBm"},
-    {  7, "29 dBm"},
-    {  8, "27 dBm"},
-    {  9, "25 dBm"},
-    { 10, "23 dBm"},
-    { 11, "21 dBm"},
-    { 12, "19 dBm"},
-    { 13, "17 dBm"},
-    { 14, "15 dBm"},
-    { 15, "13 dBm"},
-    { 16, "11 dBm"},
-    { 17, "9 dBm"},
-    { 18, "7 dBm"},
-    { 19, "5 dBm"},
-    { 20, "5 dBm"},
-    { 21, "5 dBm"},
-    { 22, "5 dBm"},
-    { 23, "5 dBm"},
-    { 24, "5 dBm"},
-    { 25, "5 dBm"},
-    { 26, "5 dBm"},
-    { 27, "5 dBm"},
-    { 28, "5 dBm"},
-    { 29, "5 dBm"},
-    { 30, "5 dBm"},
-    { 31, "5 dBm"},
-    {  0, NULL }
-};
-
-static const value_string gsm_a_rr_si2n_support_vals[] = {
-    { 0, "SI2n is not supported"},
-    { 1, "SI2n is supported on PACCH"},
-    { 2, "SI2n is supported on PACCH and broadcast on BCCH"},
-    { 3, "SI2n is supported on PACCH and broadcast on BCCH Ext"},
-    { 0, NULL }
-};
-
-static guint16
-de_rr_si13_rest_oct(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree, *subtree2;
-    proto_item	*item, *item2;
-    guint32	curr_offset;
-    gint bit_offset, bit_offset_sav;
-    guint8 value;
-
-    len = 20;
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, len, "%s",
-                               gsm_rr_elem_strings[DE_RR_SI13_REST_OCT].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_SI13_REST_OCT]);
-
-    if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-    {
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_change_mark, tvb, bit_offset, 3, FALSE);
-        bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si_change_field, tvb, bit_offset, 4, FALSE);
-        bit_offset += 4;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13_change_mark, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-            bit_offset += de_rr_rest_oct_gprs_mobile_allocation(tvb, subtree, bit_offset);
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* PBCCH present in the cell */
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_psi1_repeat_period, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-            bit_offset_sav = bit_offset;
-            item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PBCCH_DESC].strptr);
-            subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PBCCH_DESC]);
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_pb, tvb, bit_offset, 4, FALSE);
-            bit_offset += 4;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_tsc, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_tn, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_text(subtree2, tvb, bit_offset>>3, 1, "MAIO: %d", tvb_get_bits8(tvb,bit_offset,6));
-                bit_offset += 6;
-            }
-            else
-            {
-                value = tvb_get_bits8(tvb,bit_offset,1);
-                bit_offset += 1;
-                if (value)
-                {
-                    proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_arfcn, tvb, bit_offset, 10, FALSE);
-                    bit_offset += 10;
-                }
-                else
-                    proto_tree_add_text(subtree2, tvb, bit_offset>>3, 1, "PBCCH shall use the BCCH carrier");
-            }
-            proto_item_set_len(item2,((bit_offset-bit_offset_sav)>>3)+1);
-        }
-        else
-        { /* PBCCH not present in the cell */
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rac, tvb, bit_offset, 8, FALSE);
-            bit_offset += 8;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_spgc_ccch_sup, tvb, bit_offset, 1, FALSE);
-            bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_priority_access_thr, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_network_control_order, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-            bit_offset += de_rr_rest_oct_gprs_cell_options(tvb, subtree, bit_offset);
-            bit_offset += de_rr_rest_oct_gprs_power_control_parameters(tvb, subtree, bit_offset);  
-        }
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* Additions in release 99 */
-            bit_offset += 1;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_sgsnr, tvb, bit_offset, 1, FALSE);
-            bit_offset += 1;
-            if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-            { /* Additions in release Rel-4 */
-                bit_offset += 1;
-                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si_status_ind, tvb, bit_offset, 1, FALSE);
-                bit_offset += 1;
-                if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-                { /* Additions in release Rel-6 */
-                    bit_offset += 1;
-                    value = tvb_get_bits8(tvb,bit_offset,1);
-                    bit_offset += 1;
-                    if (value)
-                    {
-                        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_lb_ms_txpwr_max_cch, tvb, bit_offset, 5, FALSE);
-                        bit_offset += 5;
-                    }
-                    proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si2n_support, tvb, bit_offset, 2, FALSE);
-                    bit_offset += 2;
-                }
-                else
-                    bit_offset += 1;
-            }
-            else
-                bit_offset += 1;
-        }
-        else
-            bit_offset += 1;
-    }
-    else
-    {
-        bit_offset += 1;
-        proto_tree_add_text(subtree,tvb, curr_offset, len ,"Empty");
-    }
-
-    curr_offset = curr_offset + len;
-
-    return curr_offset-offset;
-}
-
-/* [3] 10.5.2.37c (void)
- * [3] 10.5.2.37d (void)
- * [3] 10.5.2.37e SI 16 Rest Octets
- * [3] 10.5.2.37f SI 17 Rest Octets
- * [3] 10.5.2.37g SI 19 Rest Octets
- * [3] 10.5.2.37h SI 18 Rest Octets
- * [3] 10.5.2.37i SI 20 Rest Octets
- */
-/*
- * [3] 10.5.2.38 Starting Time
- */
-static guint16
-de_rr_starting_time(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_item *item;
-    guint32	curr_offset;
-    guint16	rfn, fn;
-
-    curr_offset = offset;
-
-    fn = tvb_get_ntohs(tvb,curr_offset);
-    rfn = reduced_frame_number(fn);
-    proto_tree_add_item(tree, hf_gsm_a_rr_T1prim, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_T3, tvb, curr_offset, 2, FALSE);
-    curr_offset++;
-    proto_tree_add_item(tree, hf_gsm_a_rr_T2, tvb, curr_offset, 1, FALSE);
-    curr_offset++;
-    item = proto_tree_add_uint(tree, hf_gsm_a_rr_rfn, tvb, curr_offset-2, 2, rfn);
-    PROTO_ITEM_SET_GENERATED(item);
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.39 Synchronization Indication
- */
-/*
- * ROT: Report Observed Time Difference (Octet1 bit 3) */
-
-static const true_false_string sm_a_rr_sync_ind_rot_value  = {
-    "Mobile Time Difference IE shall be included in the HANDOVER COMPLETE message",
-    "Mobile Time Difference IE shall not be included in the HANDOVER COMPLETE message"
-};
-
-/* SI: Synchronization indication (octet 1)Bit2 1 */
-
-static const value_string gsm_a_rr_sync_ind_si_vals[] = {
-    { 0, "Non-synchronized"},
-    { 1, "Synchronized"},
-    { 2, "Pre-synchronised"},
-    { 3, "Pseudo-synchronised"},
-    { 0, NULL }
-};
-/* NCI: Normal cell indication (octet 1, bit 4) */
-
-static const true_false_string gsm_a_rr_sync_ind_nci_value  = {
-    "Out of range timing advance shall trigger a handover failure procedure",
-    "Out of range timing advance is ignored"
-};
-static guint16
-de_rr_sync_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    /*NCI */
-    proto_tree_add_item(tree, hf_gsm_a_rr_sync_ind_nci, tvb, curr_offset, 1, FALSE);
-    /*ROT */
-    proto_tree_add_item(tree, hf_gsm_a_rr_sync_ind_rot, tvb, curr_offset, 1, FALSE);
-    /*SI*/
-    proto_tree_add_item(tree, hf_gsm_a_rr_sync_ind_si, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.40 Timing Advance
- */
-static guint16
-de_rr_timing_adv(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_timing_adv, tvb, curr_offset, 1, FALSE);
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.41 Time Difference
- */
-static guint16
-de_rr_time_diff(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_time_diff, tvb, curr_offset, 1, FALSE);
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.41a TLLI
- * The TLLI is encoded as a binary number with a length of 4 octets. TLLI is defined in 3GPP TS 23.003
- */
-guint16
-de_rr_tlli(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_tlli, tvb, curr_offset, 4, FALSE);
-    curr_offset = curr_offset + 4;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.42 TMSI/P-TMSI
- */
-guint16
-de_rr_tmsi_ptmsi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree	*subtree;
-    proto_item	*item;
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
-                               gsm_rr_elem_strings[DE_RR_TMSI_PTMSI].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_TMSI_PTMSI]);
-
-    proto_tree_add_item(subtree, hf_gsm_a_rr_tmsi_ptmsi, tvb, curr_offset, 4, FALSE);
-    curr_offset = curr_offset + 4;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.42a VGCS target mode Indication
- */
-/*
-Target mode (octet 3)
-Bit  8 7
-     0 0    dedicated mode
-     0 1    group transmit mode
-     Other values are reserved for future use.
-*/
-static const value_string gsm_a_rr_target_mode_vals[] _U_ = {
-    { 0,	"Dedicated mode"},
-    { 1,	"Group transmit mode"},
-    { 0,	NULL }
-};
-static guint16
-de_rr_vgcs_tar_mode_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_target_mode, tvb, curr_offset, 1, FALSE);
-    proto_tree_add_item(tree, hf_gsm_a_rr_group_cipher_key_number, tvb, curr_offset, 1, FALSE);
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.42b	VGCS Ciphering Parameters
- */
-static guint16
-de_rr_vgcs_cip_par(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_text(tree,tvb, curr_offset, len ,"Data(Not decoded)");
-
-    curr_offset = curr_offset + 2;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.43 Wait Indication
- */
-static guint16
-de_rr_wait_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_wait_indication, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.44 SI10 rest octets $(ASCI)$
- */
-
-/*
- * [3] 10.5.2.45 Extended Measurement Results
- */
-static guint16
-de_rr_ext_meas_result(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    gint bit_offset, i;
-    guint8 value;
-
-    curr_offset = offset;
-    len = 16;
-    bit_offset = curr_offset << 3;
-
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_seq_code, tvb,bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_dtx_used, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    for (i=0; i<21; i++)
-    {
-        value = tvb_get_bits8(tvb,bit_offset,6);
-        proto_tree_add_text(tree, tvb, bit_offset>>3, 1, "RXLEV carrier %d: %s (%d)",i,gsm_a_rr_rxlev_vals[value].strptr,value);
-        bit_offset += 6;
-    }
-
-    curr_offset = offset + len;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.46 Extended Measurement Frequency List
- */
-static guint16
-de_rr_ext_meas_freq_list(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-   guint32 curr_offset;
-
-   curr_offset = offset;
-
-   proto_tree_add_bits_item(tree, hf_gsm_a_rr_seq_code, tvb,(curr_offset<<3)+3, 1, FALSE);
-   
-   return dissect_arfcn_list(tvb, tree, offset, 16, add_string, string_len);
-}
-
-/*
- * [3] 10.5.2.47 Suspension Cause
- */
-/*Suspension cause value (octet 2)*/
-static const value_string gsm_a_rr_suspension_cause_vals[] = {
-    { 0, "Emergency call, mobile originating call or call re-establishment"},
-    { 1, "Location Area Update"},
-    { 2, "MO Short message service"},
-    { 3, "Other procedure which can be completed with an SDCCH"},
-    { 4, "MO Voice broadcast or group call"},
-    { 5, "Mobile terminating CS connection"},
-    { 6, "DTM not supported in the cell"},
-    { 0, NULL }
-};
-guint16
-de_rr_sus_cau(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_suspension_cause, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 1;
-
-    return(curr_offset - offset);
-}
-/*
- * [3] 10.5.2.48 APDU ID
- * [3] 10.5.2.49 APDU Flags
- * [3] 10.5.2.50 APDU Data
- */
-
-/*
- * [3] 10.5.2.51 Handover To UTRAN Command
- */
-static guint16
-de_rr_ho_to_utran_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
-{
-    guint32 curr_offset;
-    tvbuff_t *rrc_irat_ho_to_utran_cmd_tvb;
-    static packet_info p_info;
-
-    curr_offset = offset;
-    if (len)
-    {
-        rrc_irat_ho_to_utran_cmd_tvb = tvb_new_subset(tvb, curr_offset, len, len);
-        if (rrc_irat_ho_to_utran_cmd_handle)
-            call_dissector(rrc_irat_ho_to_utran_cmd_handle, rrc_irat_ho_to_utran_cmd_tvb, &p_info, tree);
-    }
-
-    curr_offset += len;
-    return(curr_offset - offset);
-}
-
-
-/*
- * [3] 10.5.2.52 Handover To cdma2000 Command
- * [3] 10.5.2.53 (void)
- * [3] 10.5.2.54 (void)
- * [3] 10.5.2.55 (void)
- * [3] 10.5.2.56 3G Target Cell
- */
-/*
- * 10.5.2.57 Service Support
- */
-static const true_false_string gsm_a_rr_MBMS_multicast_value  = {
-    "mobile station requires notification of multicast MBMS services",
-    "mobile station does not require notification of multicast MBMS services"
-};
-static const true_false_string gsm_a_rr_MBMS_broadcast_value  = {
-    "mobile station requires notification of broadcast MBMS services",
-    "mobile station does not require notification of broadcast MBMS services"
-};
-static guint16
-de_rr_serv_sup(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-    /* bit 1
-     * 0 mobile station does not require notification of broadcast MBMS services
-     * 1 mobile station requires notification of broadcast MBMS services
-     * bit 2
-     * 0 mobile station does not require notification of multicast MBMS services
-     * 1 mobile station requires notification of multicast MBMS services
-     */
-    /* MBMS Multicast */
-    proto_tree_add_item(tree, hf_gsm_a_rr_MBMS_multicast, tvb, curr_offset, 1, FALSE);
-
-    /* MBMS Broadcast */
-    proto_tree_add_item(tree, hf_gsm_a_rr_MBMS_broadcast, tvb, curr_offset, 1, FALSE);
-    curr_offset++;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.59	Dedicated Service Information
- */
-/*
-Last Segment (octet 2)
-bit 1
-  0  mobile station shall not perform Service Information Sending procedure on new cell.
-  1  mobile station shall perform Service Information Sending procedure on new cell.
-*/
-static const true_false_string gsm_a_rr_last_segment_value  = {
-    "Mobile station shall perform Service Information Sending procedure on new cell.",
-    "mobile station shall not perform Service Information Sending procedure on new cell."
-};
-static guint16
-de_rr_ded_serv_inf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    guint32	curr_offset;
-
-    curr_offset = offset;
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_last_segment, tvb, curr_offset, 1, FALSE);
-
-    curr_offset = curr_offset + 3;
-
-    return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.2.69	Carrier Indication
- */
-static const true_false_string gsm_a_rr_carrier_ind_value  = {
-    "Carrier 2",
-    "Carrier 1"
-};
-
-static guint16
-de_rr_carrier_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    guint32 curr_offset;
-
-    curr_offset = offset;
-
-    item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s",
-                               gsm_rr_elem_strings[DE_RR_CARRIER_IND].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CARRIER_IND]);
-
-    proto_tree_add_item(tree, hf_gsm_a_rr_carrier_ind, tvb, curr_offset, 1, FALSE);
-
-    curr_offset += 1;
-
-    return(curr_offset - offset);
-}
-
-guint16 (*rr_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string, int string_len) = {
-    /* Radio Resource Management  Information Elements 10.5.2, most are from 10.5.1 */
-
-    de_rr_ba_range,			      	/* [3]  10.5.2.1a	BA Range */
-    de_rr_cell_ch_dsc,				/* [3]  10.5.2.1b	Cell Channel Description	*/
-    de_rr_ba_list_pref,				/* [3]  10.5.2.1c	BA List Pref 			*/
-    de_rr_utran_freq_list,			/* [3]  10.5.2.1d	UTRAN Frequency List 		*/
-    de_rr_cell_select_indic,			/* [3]  10.5.2.1e	Cell selection indicator after release of all TCH and SDCCH IE */
-    de_rr_cell_dsc,				/* 10.5.2.2   RR Cell Description			*/
-    de_rr_cell_opt_bcch,			/* [3]  10.5.2.3	Cell Options (BCCH)		*/
-    de_rr_cell_opt_sacch,			/* [3]  10.5.2.3a	Cell Options (SACCH)		*/
-    de_rr_cell_sel_param,			/* [3]  10.5.2.4	Cell Selection Parameters	*/
-/*
- * [3]  10.5.2.4a	(void)
- */
-    de_rr_ch_dsc,				/* [3]  10.5.2.5	Channel Description		*/
-    de_rr_ch_dsc2,				/* [3]  10.5.2.5a   RR Channel Description 2 		*/
-    de_rr_ch_dsc3,				/* [3]  10.5.2.5c   RR Channel Description 3 		*/
-    de_rr_ch_mode,				/* [3]  10.5.2.6	Channel Mode			*/
-    de_rr_ch_mode2,				/* [3]  10.5.2.7	Channel Mode 2			*/
-    de_rr_utran_cm,				/* [3]  10.5.2.7a	UTRAN Classmark */
-/* [3]  10.5.2.7b	(void) */
-
-    de_rr_cm_enq_mask,				/* [3]  10.5.2.7c	Classmark Enquiry Mask		*/
-/* [3]  10.5.2.7d	GERAN Iu Mode Classmark information element					*/
-    de_rr_chnl_needed,				/* [3]  10.5.2.8	Channel Needed
-                                                 * [3]  10.5.2.8a	(void)
-                                                 * [3]  10.5.2.8b	Channel Request Description 2	*/
-    /* Pos 20 */
-    de_rr_cip_mode_set,				/* [3]  10.5.2.9	Cipher Mode Setting		*/
-    de_rr_cip_mode_resp,			/* [3]  10.5.2.10	Cipher Response */
-    de_rr_ctrl_ch_desc,				/* [3]  10.5.2.11	Control Channel Description	*/
-/* [3]  10.5.2.11a	DTM Information Details */
-    de_rr_dyn_arfcn_map,			/* [3]  10.5.2.11b	Dynamic ARFCN Mapping		*/
-    de_rr_freq_ch_seq,				/* [3]  10.5.2.12	Frequency Channel Sequence	*/
-    de_rr_freq_list,				/* [3]  10.5.2.13	Frequency List			*/
-    de_rr_freq_short_list,			/* [3]  10.5.2.14	Frequency Short List		*/
-    de_rr_freq_short_list2,			/* [3]  10.5.2.14a	Frequency Short List 2		*/
-/* [3]  10.5.2.14b	Group Channel Description */
-    de_rr_gprs_resumption,			/* [3]  10.5.2.14c	GPRS Resumption 		*/
-    de_rr_gprs_broadcast_info,			/* [3]  10.5.2.14d	GPRS broadcast information 	*/
-/* [3]  10.5.2.14e	Enhanced DTM CS Release Indication */
-    de_rr_ho_ref,				/* 10.5.2.15  Handover Reference			*/
-    de_rr_ia_rest_oct,				/* [3] 10.5.2.16 IA Rest Octets				*/
-    de_rr_iar_rest_oct,				/* [3] 10.5.2.17 IAR Rest Octets			*/
-    de_rr_iax_rest_oct,				/* [3] 10.5.2.18 IAX Rest Octets			*/
-    de_rr_l2_pseudo_len,			/*[3] 10.5.2.19 L2 Pseudo Length			*/
-    de_rr_meas_res,				/* [3] 10.5.2.20 Measurement Results			*/
-/*
- * [3] (void)
- */
-    de_rr_mob_all,				/* [3] 10.5.2.21 Mobile Allocation			*/
-    de_rr_mob_time_diff,			/* [3] 10.5.2.21a Mobile Time Difference		*/
-    de_rr_multirate_conf,			/* [3] 10.5.2.21aa MultiRate configuration		*/
-    /* Pos 30 */
-    de_rr_mult_all,				/* [3] 10.5.2.21b Multislot Allocation			*/
-/*
- * [3] 10.5.2.21c (void)
- */
-    de_rr_neigh_cell_desc,			/* [3] 10.5.2.22 Neighbour Cell Description		*/
-    de_rr_neigh_cell_desc2,			/* [3] 10.5.2.22a Neighbour Cell Description 2		*/
-/*
- * [3] 10.5.2.22b (void)
- * [3] 10.5.2.22c NT/N Rest Octets */
-    de_rr_p1_rest_oct,				/* [3] 10.5.2.23 P1 Rest Octets 			*/
-    de_rr_p2_rest_oct,				/* [3] 10.5.2.24 P2 Rest Octets 			*/
-    de_rr_p3_rest_oct,				/* [3] 10.5.2.25 P3 Rest Octets 			*/
-    de_rr_packet_ch_desc,			/* [3] 10.5.2.25a Packet Channel Description		*/
-    de_rr_ded_mod_or_tbf,			/* [3] 10.5.2.25b Dedicated mode or TBF			*/
-/* [3] 10.5.2.25c RR Packet Uplink Assignment
- * [3] 10.5.2.25d RR Packet Downlink Assignment
- */
-    de_rr_page_mode,				/* [3] 10.5.2.26 Page Mode				*/
-/*
- * [3] 10.5.2.26a (void)
- * [3] 10.5.2.26b (void)
- * [3] 10.5.2.26c (void)
- * [3] 10.5.2.26d (void)
- */
-    de_rr_ncc_perm,				/* [3] 10.5.2.27 NCC Permitted				*/
-    de_rr_pow_cmd,				/* 10.5.2.28  Power Command				*/
-    de_rr_pow_cmd_and_acc_type,			/* 10.5.2.28a Power Command and access type		*/
-    de_rr_rach_ctrl_param,			/* [3] 10.5.2.29 RACH Control Parameters 		*/
-    de_rr_req_ref,				/* [3] 10.5.2.30 Request Reference			*/
-    de_rr_cause,				/* 10.5.2.31  RR Cause					*/
-    de_rr_sync_ind,				/* 10.5.2.39  Synchronization Indication		*/
-    de_rr_si1_rest_oct,				/* [3] 10.5.2.32 SI1 Rest Octets			*/
-/* [3] 10.5.2.33 SI 2bis Rest Octets */
-    de_rr_si2ter_rest_oct,			/* [3] 10.5.2.33a SI 2ter Rest Octets 			*/
-    de_rr_si2quater_rest_oct,			/* [3] 10.5.2.33b SI 2quater Rest Octets 		*/
-    de_rr_si3_rest_oct,				/* [3] 10.5.2.34 SI3 Rest Octets			*/
-    de_rr_si4_rest_oct,				/* [3] 10.5.2.35 SI4 Rest Octets			*/
-    de_rr_si6_rest_oct,				/* [3] 10.5.2.35b SI6 Rest Octets			*/
-/* [3] 10.5.2.36 SI 7 Rest Octets
- * [3] 10.5.2.37 SI 8 Rest Octets
- * [3] 10.5.2.37a SI 9 Rest Octets
- */
-    de_rr_si13_rest_oct,			/* [3] 10.5.2.37a SI13 Rest Octets			*/
-/* [3] 10.5.2.37c (void)
- * [3] 10.5.2.37d (void)
- * [3] 10.5.2.37e SI 16 Rest Octets
- * [3] 10.5.2.37f SI 17 Rest Octets
- * [3] 10.5.2.37g SI 19 Rest Octets
- * [3] 10.5.2.37h SI 18 Rest Octets
- * [3] 10.5.2.37i SI 20 Rest Octets */
-    de_rr_starting_time,			/* [3] 10.5.2.38 Starting Time				*/
-    de_rr_timing_adv,				/* [3] 10.5.2.40 Timing Advance				*/
-    de_rr_time_diff,				/* [3] 10.5.2.41 Time Difference			*/
-    de_rr_tlli,					/* [3] 10.5.2.41a TLLI					*/
-    de_rr_tmsi_ptmsi,				/* [3] 10.5.2.42 TMSI/P-TMSI 				*/
-    de_rr_vgcs_tar_mode_ind,			/* [3] 10.5.2.42a VGCS target mode Indication		*/
-    /* Pos 40 */
-    de_rr_vgcs_cip_par,				/* [3] 10.5.2.42b	VGCS Ciphering Parameters	*/
-    de_rr_wait_ind,				/* [3] 10.5.2.43 Wait Indication 			*/
-/* [3] 10.5.2.44 SI10 rest octets $(ASCI)$ */
-    de_rr_ext_meas_result,			/* [3] 10.5.2.45 Extended Measurement Results 		*/
-    de_rr_ext_meas_freq_list,			/* [3] 10.5.2.46 Extended Measurement Frequency List 	*/
-    de_rr_sus_cau,				/* [3] 10.5.2.47 Suspension Cause			*/
-/* [3] 10.5.2.48 APDU ID
- * [3] 10.5.2.49 APDU Flags
- * [3] 10.5.2.50 APDU Data */
-    de_rr_ho_to_utran_cmd,			/* [3] 10.5.2.51 Handover To UTRAN Command 		*/
-/* [3] 10.5.2.52 Handover To cdma2000 Command
- * [3] 10.5.2.53 (void)
- * [3] 10.5.2.54 (void)
- * [3] 10.5.2.55 (void)
- * [3] 10.5.2.56 3G Target Cell
- * 10.5.2.57 Service Support */
-    de_rr_serv_sup,				/* 10.5.2.57		Service Support			*/
-/*
- * 10.5.2.58 MBMS p-t-m Channel Description
- */
-    de_rr_ded_serv_inf,				/* [3] 10.5.2.59	Dedicated Service Information 	*/
-/*
- * 10.5.2.60 MPRACH Description
- * 10.5.2.61 Restriction Timer
- * 10.5.2.62 MBMS Session Identity
- * 10.5.2.63 Reduced group or broadcast call reference
- * 10.5.2.64 Talker Priority status
- * 10.5.2.65 Talker Identity
- * 10.5.2.66 Token
- * 10.5.2.67 PS Cause
- * 10.5.2.68 VGCS AMR Configuration
- */
-    de_rr_carrier_ind,				/* 10.5.2.69 Carrier Indication 			*/
-    NULL,	/* NONE */
-};
-
-/* MESSAGE FUNCTIONS */
-
-/*
- * 9.1.1 Additional Assignment
- */
-static void
-dtap_rr_add_ass(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Channel Description  10.5.2.5  M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC);
-
-    /* Mobile Allocation  10.5.2.21  C TLV 3-10 */
-    ELEM_OPT_TLV(0x72, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
-
-    /* Starting Time  10.5.2.38  O TV 3 */
-    ELEM_OPT_TV(0x7c, GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * 9.1.2 Assignment command
- */
-static void
-dtap_rr_ass_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Channel Description 2	10.5.2.5a	M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2);
-
-    /* Power Command			10.5.2.28	M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_POW_CMD);
-
-    /* 05 Frequency List		10.5.2.13	C TLV 4-132 */
-    ELEM_OPT_TLV(0x05, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, after time");
-
-    /* 62 Cell Channel Description	10.5.2.1b	O TV 17 */
-    ELEM_OPT_TV(0x62, GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
-
-    /* 10 Multislot Allocation		10.5.2.21b	C TLV 3-12 */
-    ELEM_OPT_TLV(0x10,GSM_A_PDU_TYPE_RR, DE_RR_MULT_ALL, " - Description of the multislot configuration");
-
-    /* 63 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x63,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of the First Channel(Channel Set 1)");
-
-    /* 11 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 2");
-
-    /* 13 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x13,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 3");
-
-    /* 14 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x14,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 4");
-
-    /* 15 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x15,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 5");
-
-    /* 16 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x16,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 6");
-
-    /* 17 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 7");
-
-    /* 18 Channel Mode				10.5.2.6	O TV 2 */
-    ELEM_OPT_TV(0x18,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 8");
-
-    /* 64 Channel Description		10.5.2.5	O TV 4 */
-    ELEM_OPT_TV(0x64,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, "Description of the Second Channel, after time");
-
-    /* 66  Channel Mode 2			10.5.2.7	O TV 2 */
-    ELEM_OPT_TV(0x66,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE2, " - Mode of the Second Channel");
-
-    /* 72 Mobile Allocation			10.5.2.21	C TLV 3-10 */
-    ELEM_OPT_TLV(0x72,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, after time");
-
-    /* 7C Starting Time				10.5.2.38	O TV 3 */
-    ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
-
-    /* 19 Frequency List			10.5.2.13	C TLV 4-132 */
-    ELEM_OPT_TLV(0x19, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, before time");
-
-    /* 1C Channel Description 2		10.5.2.5a	O TV 4 */
-    ELEM_OPT_TV(0x1c,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, " - Description of the First Channel, before time");
-
-    /* 1D Channel Description		10.5.2.5	O TV 4 */
-    ELEM_OPT_TV(0x1d,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Description of the Second Channel, before time");
-
-    /* 1E Frequency channel sequence 10.5.2.12	C TV 10 */
-    ELEM_OPT_TV(0x1e,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_CH_SEQ, " - Frequency channel sequence before time");
-
-    /* 21 Mobile Allocation			10.5.2.21	C TLV 3-10 */
-    ELEM_OPT_TLV(0x21,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, before time");
-
-    /* 9- Cipher Mode Setting		10.5.2.9	O TV 1 */
-    ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET, NULL);
-    /* 01 VGCS target mode Indication VGCS target mode Indication 10.5.2.42a O TLV 3 */
-    ELEM_OPT_TLV(0x01,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_TAR_MODE_IND, NULL);
-
-    /* 03 Multi-Rate configuration,	MultiRate configuration 10.5.2.21aa	O TLV 4-8 */
-    ELEM_OPT_TLV(0x03,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
-
-    /* 04 VGCS Ciphering Parameters VGCS Ciphering Parameters 10.5.2.42b O TLV 3-15	*/
-    ELEM_OPT_TLV(0x04,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_CIP_PAR, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.3 Assignment complete
- */
-static void
-dtap_rr_ass_comp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* RR Cause RR Cause 10.5.2.31 M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.4 Assignment failure
- */
-static void
-dtap_rr_ass_fail(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* RR Cause RR Cause 10.5.2.31 M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.5 Channel Mode Modify
- */
-static void
-dtap_rr_ch_mode_mod(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Channel Description 2	10.5.2.5a	M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2);
-
-    /* Channel Mode				10.5.2.6	M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE);
-
-    /* 01 VGCS target mode Indication VGCS target mode Indication 10.5.2.42a O TLV 3 */
-    ELEM_OPT_TLV(0x01,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_TAR_MODE_IND, NULL);
-
-    /* 03 Multi-Rate configuration,	MultiRate configuration 10.5.2.21aa	O TLV 4-8 */
-    ELEM_OPT_TLV(0x03,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.6 Channel Mode Modify Acknowledge
- */
-static void
-dtap_rr_ch_mode_mod_ack(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Channel Description 2	10.5.2.5a	M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2);
-
-    /* Channel Mode				10.5.2.6	M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.7 Channel Release
- */
-static void
-dtap_rr_ch_rel(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* RR Cause RR Cause 10.5.2.31 M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    /* 73 BA Range BA Range 10.5.2.1a O TLV 6-7 */
-    ELEM_OPT_TLV(0x73, GSM_A_PDU_TYPE_RR, DE_RR_BA_RANGE, NULL);
-
-    /* 74 Group Channel Description Group Channel Description 10.5.2.14b O TLV 5-13 */
-    /* ELEM_OPT_TLV(0x74, GSM_A_PDU_TYPE_RR, DE_GRP_CH_DESC, NULL); */
-
-    /* 8x Group Cipher Key Number Group Cipher Key Number 10.5.1.10 C TV 1 */
-    /* ELEM_OPT_TV_SHORT(0x80, GSM_A_PDU_TYPE_RR, DE_GRP_CIP_KEY_NUM, NULL); */
-
-    /* Cx GPRS Resumption GPRS Resumption 10.5.2.14c O TV 1 */
-    ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_RR, DE_RR_GPRS_RESUMPTION, NULL);
-
-    /* 75 BA List Pref BA List Pref 10.5.2.1c O TLV 3-? */
-    ELEM_OPT_TLV(0x75, GSM_A_PDU_TYPE_RR, DE_RR_BA_LIST_PREF, NULL);
-
-    /* 76 UTRAN Freq List 10.5.2.1d O TLV 3-? */
-    ELEM_OPT_TLV(0x76, GSM_A_PDU_TYPE_RR, DE_RR_UTRAN_FREQ_LIST, NULL);
-
-    /* 62 Cell Channel Description Cell Channel Description 10.5.2.1b O TV 17 */
-    ELEM_OPT_TV(0x62, GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
-
-    /* 62 Cell selection indicator after release of all TCH and SDCCH 10.5.2.1e O TLV 4-? */
-    ELEM_OPT_TLV(0x77, GSM_A_PDU_TYPE_RR, DE_RR_CELL_SELECT_INDIC, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.8 Channel Request
- */
-/* This message is NOT follow the basic format, and is only found on RACH - ignored here */
-
-/*
- * 9.1.9 Ciphering Mode Command
- */
-static void
-dtap_rr_cip_mode_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-    lower_nibble = FALSE;
-
-    /* Ciphering Mode Setting		10.5.2.9	M V 0.5 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET);
-    /* Cipher Response	10.5.2.10	M V 0.5 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_RESP);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-/*
- * 9.1.10 Ciphering Mode Complete
- */
-static void
-dtap_rr_cip_mode_cpte(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-    lower_nibble = FALSE;
-
-    /* Mobile Equipment Identity		10.5.1.4	O TLV */
-    ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, "Mobile Equipment Identity");
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.11 Classmark change
- */
-static void
-dtap_rr_mm_cm_change(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Mobile Station Classmark 2		10.5.1.6	M LV 4 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
-    /* 20 Mobile Station Classmark 3	10.5.1.7	C TLV 3-34 */
-    ELEM_OPT_TLV(0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.11 UTRAN Classmark Change
- */
-static void
-dtap_rr_utran_classmark_change(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* UTRAN Classmark		10.5.2.7a	M LV 2-? */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_UTRAN_CM, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * 9.1.12 Classmark enquiry
- */
-static void
-dtap_rr_cm_enq(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* 10 Classmark Enquiry Mask 	10.5.2.7c	O TLV 3 */
-    ELEM_OPT_TLV(0x10, GSM_A_PDU_TYPE_RR, DE_RR_CM_ENQ_MASK, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.12b Configuration change command
- */
-static void
-dtap_rr_conf_change_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Multislot Allocation  10.5.2.21b  M LV 2-11 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MULT_ALL, NULL);
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x63,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 1");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 2");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x13,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 3");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x14,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 4");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x15,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 5");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x16,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 6");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 7");
-
-    /* Channel Mode  10.5.2.6  O TV 2 */
-    ELEM_OPT_TV(0x18,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 8");
-
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-}
-
-/*
- * 9.1.12c	Configuration change acknowledge
- */
-/* empty message */
-
-/*
- * 9.1.12d	Configuration change reject
- */
-static void
-dtap_rr_conf_change_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* RR Cause  10.5.2.31  M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-
-/*
- * 9.1.13 Frequency Redefinition
- */
-static void
-dtap_rr_freq_redef(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Channel Description  10.5.2.5  M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC);
-
-    /* Mobile Allocation  10.5.2.21  M LV 1-9 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
-
-    /* Starting Time  10.5.2.38  M V 2 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
-
-    /* Cell Channel Description  10.5.2.1b  O TV 17 */
-    ELEM_OPT_TV(0x62,GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
-
-    /* Carrier Indication  10.5.2.69  O TV 1 */
-    ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CARRIER_IND,NULL);
-
-    /* Mobile Allocation  10.5.2.21  O TLV 1-9 */
-    ELEM_OPT_TLV(0x11, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation C2");
-
-    /* Channel Description 3  10.5.2.5c  O TV 3 */
-    ELEM_OPT_TV(0x12,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC3, " - Channel Description C2");
-
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-}
-
-/*
- * 9.1.13b GPRS suspension request
- */
-static void
-dtap_rr_gprs_sus_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    curr_offset = offset;
-    curr_len = len;
-
-    /* TLLI								10.5.2.41a	M V 4 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TLLI);
-
-    /* Routeing Area Identification		10.5.5.15	M V 6 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_GM, DE_RAI);
-    /* Suspension cause					10.5.2.47	M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SUS_CAU);
-
-    /* 01 Service Support					10.5.2.57	O TV 2 */
-    ELEM_OPT_TV_SHORT(0x01,GSM_A_PDU_TYPE_RR, DE_RR_SERV_SUP,NULL);
-
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-}
-
-static void
-dtap_rr_app_inf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-	tvbuff_t *sub_tvb;
-	guint8 apdu_len;
-
-	apdu_len = tvb_get_guint8(tvb, 2);
-
-	sub_tvb = tvb_new_subset(tvb, 3, len, apdu_len);
-	call_dissector(rrlp_dissector, sub_tvb, rr_apdu_info, pinfo, tree);
-}
-
-/*
- * 9.1.14 Handover Access
- */
-/* This message does NOT follow the basic format, and is only found on DCH during initial handover access */
-
-/* 3GPP TS 24.008 version 4.7.0 Release 4
- * [3] 9.1.15
- */
-void
-dtap_rr_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Mandatory Elemets
-     * Cell description 10.5.2.2
-     */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_DSC);
-
-    /* Description of the first channel,after time
-     * Channel Description 2 10.5.2.5a
-     */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2);
-
-    /* Handover Reference 10.5.2.15 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_HO_REF);
-
-    /* Power Command and Access type 10.5.2.28a */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_POW_CMD_AND_ACC_TYPE);
-
-    /* optional elements */
-
-    /* Synchronization Indication 10.5.2.39 */
-    ELEM_OPT_TV_SHORT(0xD0,GSM_A_PDU_TYPE_RR, DE_RR_SYNC_IND,NULL);
-
-    /* Frequency Short List 10.5.2.14 */
-    ELEM_OPT_TV(0x02,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_SHORT_LIST," - Frequency Short List, after time");
-
-    /* Frequency List 10.5.2.13 */
-    ELEM_OPT_TLV(0x05, GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, after time");
-
-    /* Cell Channel Description 10.5.2.1b */
-    ELEM_OPT_TV(0x62,GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC, NULL);
-
-    /* Multislot Allocation 10.5.2.21b */
-    ELEM_OPT_TLV(0x10,GSM_A_PDU_TYPE_RR, DE_RR_MULT_ALL, NULL);
-
-    /* Mode of the First Channel(Channel Set 1)) Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x63,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of the First Channel(Channel Set 1))");
-
-    /* Mode of Channel Set 2 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x11,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 2");
-
-    /* Mode of Channel Set 3 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x13,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 3");
-
-    /* Mode of Channel Set 4 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x14,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 4");
-
-    /* Mode of Channel Set 5 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x15,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 5");
-
-    /* Mode of Channel Set 6 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x16,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 6");
-
-    /* Mode of Channel Set 7 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x17,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 7");
-
-    /* Mode of Channel Set 8 Channel Mode 10.5.2.6*/
-    ELEM_OPT_TV(0x18,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE, " - Mode of Channel Set 8");
-
-    /* Description of the Second Channel, after time, Channel Description 10.5.2.5 */
-    ELEM_OPT_TV(0x64,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Description of the Second Channel, after time");
-
-    /* Mode of the Second Channel, Channel Mode 2 10.5.2.7 */
-    ELEM_OPT_TV(0x66,GSM_A_PDU_TYPE_RR, DE_RR_CH_MODE2, " - Mode of the Second Channel");
-
-    /* Frequency Channel Sequence, after time, Frequency Channel Sequence 10.5.2.12 */
-    ELEM_OPT_TV(0x69,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_CH_SEQ, " - Frequency Channel Sequence, after time");
-
-    /* Mobile Allocation, after time, Mobile Allocation 10.5.2.21 */
-    ELEM_OPT_TLV(0x72,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, after time");
-
-    /* Starting Time 10.5.2.38 */
-    ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
-
-    /* Real Time Difference, Time Difference 10.5.2.41 */
-    ELEM_OPT_TV(0x7B,GSM_A_PDU_TYPE_RR, DE_RR_TIME_DIFF, " - Real Time Difference");
-
-    /* Timing Advance, Timing Advance 10.5.2.40 */
-    ELEM_OPT_TV(0x7D,GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV, NULL);
-
-    /* Frequency Short List, before time, Frequency Short List 10.5.2.14 */
-    ELEM_OPT_TV(0x12,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_SHORT_LIST, " - Frequency Short List, before time");
-
-    /* Frequency List, before time,	Frequency List 10.5.2.13 */
-    ELEM_OPT_TLV(0x19,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_LIST, " - Frequency List, before time");
-
-    /* Description of the First Channel, before time,	Channel Description 2 10.5.2.5a*/
-    ELEM_OPT_TV(0x1c,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC2, " - Description of the First Channel, before time");
-
-    /* Description of the Second Channel, before time,	Channel Description 10.5.2.5*/
-    ELEM_OPT_TV(0x1d,GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, " - Description of the Second Channel, before time");
-
-    /* Frequency channel sequence before time,	Frequency channel sequence 10.5.2.12*/
-    ELEM_OPT_TV(0x1e,GSM_A_PDU_TYPE_RR, DE_RR_FREQ_CH_SEQ, " - Frequency channel sequence before time");
-
-    /* Mobile Allocation, before time,	Mobile Allocation 10.5.2.21 */
-    ELEM_OPT_TLV(0x21,GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, " - Mobile Allocation, before time");
-
-    /* Cipher Mode Setting,	Cipher Mode Setting 10.5.2.9 */
-    ELEM_OPT_TV_SHORT(0x90,GSM_A_PDU_TYPE_RR, DE_RR_CIP_MODE_SET, NULL);
-
-    /* VGCS target mode Indication,	VGCS target mode Indication 10.5.2.42a */
-    ELEM_OPT_TLV(0x01,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_TAR_MODE_IND, NULL);
-
-    /* Multi-Rate configuration,	MultiRate configuration 10.5.2.21a */
-    ELEM_OPT_TLV(0x03,GSM_A_PDU_TYPE_RR, DE_RR_MULTIRATE_CONF, NULL);
-
-    /* Dynamic ARFCN Mapping,	Dynamic ARFCN Mapping 10.5.2.11b */
-    ELEM_OPT_TLV(0x76,GSM_A_PDU_TYPE_RR, DE_RR_DYN_ARFCN_MAP, NULL);
-
-    /* VGCS Ciphering Parameters,	VGCS Ciphering Parameters 10.5.2.42b */
-    ELEM_OPT_TLV(0x04,GSM_A_PDU_TYPE_RR, DE_RR_VGCS_CIP_PAR, NULL);
-
-    /* Dedicated Service Information,	Dedicated Service Information 10.5.2.59 */
-    ELEM_OPT_TV(0x51,GSM_A_PDU_TYPE_RR, DE_RR_DED_SERV_INF, NULL);
-
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-}
-
-/*
- * 9.1.15a Inter System To UTRAN Handover Command
- */
-static void
-dtap_rr_inter_syst_to_utran_ho_cmd(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* UTRAN Classmark		10.5.2.51	M LV 2-? */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_HO_TO_UTRAN_CMD, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/* 3GPP TS 24.008 version 4.7.0 Release 4
- * [3] 9.1.16
- */
-static void
-dtap_rr_ho_cpte(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    curr_offset = offset;
-    curr_len = len;
-
-    /* RR Cause RR Cause 10.5.2.31 M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    /* 77 Mobile Observed Time Difference	Mobile Time Difference 10.5.2.21a */
-    ELEM_OPT_TLV(0x77,GSM_A_PDU_TYPE_RR, DE_RR_MOB_TIME_DIFF, " - Mobile Observed Time Difference");
-
-    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
-}
-
-/*
- * 9.1.17 Handover failure
- */
-static void
-dtap_rr_ho_fail(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* RR Cause RR Cause 10.5.2.31 M V 1 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-
-}
-
-/*
- * 9.1.18 Immediate assignment
- */
-static void
-dtap_rr_imm_ass(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    guint8 oct;
-    curr_offset = offset;
-    curr_len = len;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    /* NOTE: The order of the mandatory information elements should be chosen so that
-     * information elements with 1/2 octet of content (type 1) go together in succession.
-     * The first type 1 information element occupies bits 1 to 4 of octet N,
-     * the second bits 5 to 8 of octet N, the third bits 1 to 4 of octet N+1 etc.
-     * If the number of type 1 information elements is odd then bits 5 to 8 of the last octet
-     *  occupied by these information elements should be treated as spare bits,
-     * i.e. coded with a "0" in each.
-     */
-
-    /* Page Mode					10.5.2.26	M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE);
-
-    /* Dedicated mode or TBF		10.5.2.25b	M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_DED_MOD_OR_TBF);
-
-    if((oct&0x10) == 0){
-	/* Channel Description			10.5.2.5	C V 3m */
-        ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC);
-    }else{
-	/* Packet Channel Description	10.5.2.25a	C V 3
-	 * If the Dedicated mode or TBF IE indicates that the message assigns a Temporary Block Flow (TBF),
-	 * the mobile station shall consider this information element present in the message.
-	 * If the Dedicated mode or TBF IE indicates that this message is the first of two in a two-message
-	 * assignment of an uplink or downlink TBF, the mobile station shall ignore the contents
-	 * of this information element and regard it as an unnecessary IE.
-	 */
-        if((oct&0x04) == 0){
-            ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_PACKET_CH_DESC);
-        }
-    }
-    /* Request Reference			10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-
-    /* Timing Advance				10.5.2.40	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV);
-    /* Mobile Allocation			10.5.2.21	M LV 1-9 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
-    /* 7C Starting Time				10.5.2.38	O TV 3	*/
-    ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
-    /* IA Rest Octets				10.5.2.16	M V 0-11 */
-    if(tvb_length_remaining(tvb,curr_offset) > 0)
-        ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_IA_REST_OCT);
-
-}
-
-/*
- * 9.1.19 Immediate assignment extended
- */
-static void
-dtap_rr_imm_ass_ext(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    guint8 oct;
-    curr_offset = offset;
-    curr_len = len;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    /* Page Mode						10.5.2.26	M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE);
-    /* Spare Half Octet						10.5.1.8	M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
-    /* Channel Description 1	Channel Description		10.5.2.5	M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC);
-    /* Request Reference 1	Request Reference		10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-    /* Timing Advance 1	Timing Advance				10.5.2.40	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV);
-    /* Channel Description 2	Channel Description		10.5.2.5	M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC);
-    /* Request Reference 2	Request Reference		10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-    /* Timing Advance 2	Timing Advance				10.5.2.40	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV);
-    /* Mobile Allocation					10.5.2.21	M LV 1-9 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, NULL);
-    /* 7C Starting Time						10.5.2.38	O TV 3	*/
-    ELEM_OPT_TV(0x7C,GSM_A_PDU_TYPE_RR, DE_RR_STARTING_TIME, NULL);
-    /* IAX Rest Octets						10.5.2.18	M V 0-4 */
-    if(tvb_length_remaining(tvb,curr_offset) > 0)
-        ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_IAX_REST_OCT);
-
-}
-
-/*
- * 9.1.20 Immediate assignment reject
- */
-static void
-dtap_rr_imm_ass_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    guint8 oct;
-    curr_offset = offset;
-    curr_len = len;
-
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    /* Page Mode					10.5.2.26	M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE);
-    /* Spare Half Octet		10.5.1.8	M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
-    /* Request Reference 1	Request Reference		10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-    /* Wait Indication 1	Wait Indication			10.5.2.43	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND);
-    /* Request Reference 2	Request Reference		10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-    /* Wait Indication 2	Wait Indication			10.5.2.43	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND);
-    /* Request Reference 3	Request Reference		10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-    /* Wait Indication 3	Wait Indication			10.5.2.43	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND);
-    /* Request Reference 4	Request Reference		10.5.2.30	M V 3	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_REQ_REF);
-    /* Wait Indication 4	Wait Indication			10.5.2.43	M V 1	*/
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_WAIT_IND);
-    /* IAR Rest Octets				10.5.2.19	M V 3 */
-    if(tvb_length_remaining(tvb,curr_offset) > 0)
-        ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_IAR_REST_OCT);
-
-}
-
-/*
- * 9.1.21 Measurement report
- */
-static void
-dtap_rr_meas_rep(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Measurement Results 10.5.2.20 M V 16 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_MEAS_RES);
-}
-
-/*
- * 9.1.7 Paging Request Type 1
- */
-static void
-dtap_rr_paging_req_type_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-    lower_nibble = FALSE;
-
-    /* RR Page Mode 10.5.2.26 M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE);
-
-    /* RR Channel Needed 10.5.2.8 M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED);
-
-    /* RR Mobile Identity 10.5.1.4 M LV 2-9 */
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 1");
-
-    /* RR Mobile Identity 10.5.1.4 O TLV 3-10 */
-    ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 2");
-
-    /* RR P1 Rest Octets 10.5.2.23 M V 0-17 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_P1_REST_OCT);
-
-}
-
-/*
- * 9.1.8 Paging Request Type 2
- */
-static void
-dtap_rr_paging_req_type_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-    lower_nibble = FALSE;
-
-    /* RR Page Mode 10.5.2.26 M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE);
-
-    /* RR Channel Needed 10.5.2.8 M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED);
-
-    /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
-    proto_tree_add_text(tree, tvb, curr_offset, 4, "Mobile Identity 1");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI);
-
-    /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
-    proto_tree_add_text(tree, tvb, curr_offset, 4, "Mobile Identity 2");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI);
-
-    /* RR Mobile Identity 10.5.1.4 O TLV 3-10 */
-    ELEM_OPT_TLV(0x17, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Mobile Identity 3");
-
-    /* RR P2 Rest Octets 10.5.2.24 M V 1-11 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_P2_REST_OCT);
-
-}
-
-/*
- * 9.1.9 Paging Request Type 3
- */
-static void
-dtap_rr_paging_req_type_3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-    lower_nibble = FALSE;
-
-    /* RR Page Mode 10.5.2.26 M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_PAGE_MODE);
-
-    /* RR Channel Needed 10.5.2.8 M V 1/2 */
-    ELEM_MAND_V_SHORT(GSM_A_PDU_TYPE_RR, DE_RR_CHNL_NEEDED);
-
-    /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
-    proto_tree_add_text(tree, tvb, curr_offset, 4, "Mobile Identity 1");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI);
-
-    /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
-    proto_tree_add_text(tree, tvb, curr_offset, 4, "Mobile Identity 2");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI);
-
-    /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
-    proto_tree_add_text(tree, tvb, curr_offset, 4, "Mobile Identity 3");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI);
-
-    /* RR TMSI/P-TMSI 10.5.2.42 M V 4 */
-    proto_tree_add_text(tree, tvb, curr_offset, 4, "Mobile Identity 4");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI);
-
-    /* RR P3 Rest Octets 10.5.2.25 M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_P3_REST_OCT);
-
-}
-
-/*
- * [4] 9.1.25 Paging response
- */
-static void
-dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-    guint8	oct;
-    proto_tree	*subtree;
-    proto_item	*item;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /*
-     * special dissection for Cipher Key Sequence Number
-     */
-    oct = tvb_get_guint8(tvb, curr_offset);
-
-    other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
-    proto_tree_add_text(tree,
-                        tvb, curr_offset, 1,
-                        "%s :  Spare",
-                        a_bigbuf);
-
-    item =
-	proto_tree_add_text(tree,
-                            tvb, curr_offset, 1, "%s",
-                            gsm_common_elem_strings[DE_CIPH_KEY_SEQ_NUM].strptr);
-
-    subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]);
-
-    other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
-    proto_tree_add_text(subtree,
-                        tvb, curr_offset, 1,
-                        "%s :  Spare",
-                        a_bigbuf);
-
-    other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
-
-    switch (oct & 0x07)
-    {
-    case 0x07:
-        proto_tree_add_text(subtree,
-                            tvb, curr_offset, 1,
-                            "%s :  Ciphering Key Sequence Number: No key is available",
-                            a_bigbuf);
-        break;
-
-    default:
-        proto_tree_add_text(subtree,
-                            tvb, curr_offset, 1,
-                            "%s :  Ciphering Key Sequence Number: %u",
-                            a_bigbuf,
-                            oct & 0x07);
-        break;
-    }
-
-    curr_offset++;
-    curr_len--;
-
-    if ((signed)curr_len <= 0) return;
-
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
-
-    ELEM_MAND_LV(GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * [4] 9.1.26 Partial Release
- */
-static void
-dtap_rr_partial_rel(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Channel Description  10.5.2.5  M V 3 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * [4] 9.1.27 Partial Release Complete
- */
-/* empty message */
-
-/*
- * [4] 9.1.29 Physical Information
- */
-static void
-dtap_rr_phy_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TIMING_ADV);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * [4] 9.1.29
- */
-static void
-dtap_rr_rr_status(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CAUSE);
-
-    EXTRANEOUS_DATA_CHECK(curr_len, 0);
-}
-
-/*
- * [4] 9.1.31
- */
-static void
-dtap_rr_sys_info_1(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_CH_DSC);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI1_REST_OCT);
-}
-
-/*
- * [4] 9.1.32
- */
-static void
-dtap_rr_sys_info_2(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    proto_tree_add_text(tree, tvb, curr_offset, 16, "BCCH Frequency List");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NCC_PERM);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM);
-}
-
-/*
- * [4] 9.1.33
- */
-static void
-dtap_rr_sys_info_2bis(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    proto_tree_add_text(tree, tvb, curr_offset, 16, "Extended BCCH Frequency List");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM);
-}
-
-/*
- * [4] 9.1.34
- */
-static void
-dtap_rr_sys_info_2ter(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    proto_tree_add_text(tree, tvb, curr_offset, 16, "Extended BCCH Frequency List");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC2);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI2TER_REST_OCT);
-}
-
-/*
- * [4] 9.1.34a
- */
-static void
-dtap_rr_sys_info_2quater(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI2QUATER_REST_OCT);
-}
-
-/*
- * [4] 9.1.35
- */
-static void
-dtap_rr_sys_info_3(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CELL_ID);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_LAI);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CTRL_CH_DESC);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_OPT_BCCH);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_SEL_PARAM);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI3_REST_OCT);
-}
-
-/*
- * [4] 9.1.36
- */
-static void
-dtap_rr_sys_info_4(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_LAI);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_SEL_PARAM);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_RACH_CTRL_PARAM);
-
-    ELEM_OPT_TV(0x64, GSM_A_PDU_TYPE_RR, DE_RR_CH_DSC, "CBCH Channel Description");
-
-    ELEM_OPT_TV(0x72, GSM_A_PDU_TYPE_RR, DE_RR_MOB_ALL, "CBCH Mobile Allocation");
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI4_REST_OCT);
-}
-
-/*
- * [4] 9.1.37
- */
-static void
-dtap_rr_sys_info_5(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    proto_tree_add_text(tree, tvb, curr_offset, 16, "BCCH Frequency List");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC);
-}
-
-/*
- * [4] 9.1.38
- */
-static void
-dtap_rr_sys_info_5bis(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    proto_tree_add_text(tree, tvb, curr_offset, 16, "Extended BCCH Frequency List");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC);
-}
-
-/*
- * [4] 9.1.39
- */
-static void
-dtap_rr_sys_info_5ter(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    proto_tree_add_text(tree, tvb, curr_offset, 16, "Extended BCCH Frequency List");
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NEIGH_CELL_DESC2);
-}
-
-/*
- * [4] 9.1.40
- */
-static void
-dtap_rr_sys_info_6(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_CELL_ID);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_COMMON, DE_LAI);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_CELL_OPT_SACCH);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_NCC_PERM);
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI6_REST_OCT);
-}
-
-/*
- * [4] 9.1.43a
- */
-static void
-dtap_rr_sys_info_13(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32	curr_offset;
-    guint32	consumed;
-    guint	curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_SI13_REST_OCT);
-}
-
-/*
- * [4] 9.1.51 Extended Measurement Order
- */
-static void
-dtap_rr_ext_meas_order(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Extended Measurement Frequency List  10.5.2.46  M V 16 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_EXT_MEAS_FREQ_LIST);
-}
-
-/*
- * [4] 9.1.52 Extended Measurement Report
- */
-static void
-dtap_rr_ext_meas_report(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    guint32 curr_offset;
-    guint32 consumed;
-    guint curr_len;
-
-    curr_offset = offset;
-    curr_len = len;
-
-    /* Extended Measurement Result  10.5.2.45  M V 16 */
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_EXT_MEAS_RESULT);
-}
-
-/*
- * [4] 9.1.54 Measurement Information
- */
-static const value_string gsm_a_rr_3g_wait_vals[] = {
-    { 0, "1 instance that contain 3G Neighbour Cell Description shall be received"},
-    { 1, "2 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 2, "3 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 3, "4 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 4, "5 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 5, "6 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 6, "7 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 7, "8 instances that contain 3G Neighbour Cell Description shall be received"},
-    { 0, NULL }
-};
-
-
-static void
-sacch_rr_meas_info(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_)
-{
-    proto_tree *subtree, *subtree2;
-    proto_item *item, *item2;
-    guint32 curr_offset;
-    gint bit_offset, bit_offset_sav, bit_offset_sav2;
-    guint8 value, idx;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_ind, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_3g_ba_ind, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_mp_change_mark, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_mi_index, tvb, bit_offset, 4, FALSE);
-    bit_offset += 4;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_mi_count, tvb, bit_offset, 4, FALSE);
-    bit_offset += 4;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_pwrc, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_gsm_report_type, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_reporting_rate, tvb, bit_offset, 1, FALSE);
-    bit_offset +=1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_invalid_bsic_reporting, tvb, bit_offset, 1, FALSE);
-    bit_offset +=1;
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* Real Time Difference Description */
-        bit_offset += de_rr_rtd_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_RTD_DESC);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* BSIC Description */
-        bit_offset += de_rr_bsic_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_BSIC_DESC);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* Report Priority Description */
-        bit_offset += de_rr_report_priority_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_REPORT_PRIO_DESC);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* Measurement Parameters Description */
-        bit_offset += de_rr_meas_param_desc(tvb, tree, bit_offset, DE_RR_REST_OCTETS_MEAS_PARAM_DESC);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    {  /* used for future extensions of the 2G parameters */
-        value = tvb_get_bits8(tvb,bit_offset,8);
-        bit_offset += 8 + value + 1;
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* 3G Neighbour Cell Description */
-        bit_offset_sav = bit_offset;
-        item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC]);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_wait, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_index_start_3g, tvb, bit_offset, 7, FALSE);
-            bit_offset += 7;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_absolute_index_start_emr, tvb, bit_offset, 7, FALSE);
-            bit_offset += 7;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* UTRAN FDD Description */
-            bit_offset += de_rr_si2quater_meas_info_utran_fdd_desc(tvb, subtree, bit_offset);
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* UTRAN TDD Description */
-            bit_offset += de_rr_si2quater_meas_info_utran_tdd_desc(tvb, subtree, bit_offset);
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        { /* CDMA2000 Description */
-            bit_offset_sav2 = bit_offset;
-            item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CDMA2000_DESC].strptr);
-            subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CDMA2000_DESC]);
-            bit_offset += 16; /* cdma2000 frequency band + cdma2000 frequency */
-            idx = tvb_get_bits8(tvb,bit_offset,5); /* number_cdma2000_cells */
-            bit_offset += 5;
-            while (idx)
-            {
-                bit_offset += 9; /* Pilot PN offset */
-                if (tvb_get_bits8(tvb,bit_offset,1))
-                {
-                    bit_offset += 1;
-                    value = tvb_get_bits8(tvb,bit_offset,3);
-                    switch (value)
-                    {
-                    case 0:
-                        bit_offset += 5; /* TD_MODE + TD_POWER_LEVEL */
-                        break;
-                    case 1:
-                        bit_offset += 2; /* QOF */
-                        bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LEN_A + bit(val(WALSH_LEN_A)+6) */
-                        break;
-                    case 2:
-                        bit_offset += 2; /* QOF */
-                        bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LEN_B + bit(val(WALSH_LEN_B)+6) */
-                        bit_offset += 4; /* AUX_TD_POWER_LEVEL + TD_MODE */
-                        break;
-                    case 3:
-                        bit_offset += 8; /* SR3_PRIM_PILOT + SR3_PILOT_POWER1 + SR3_PILOT_POWER2 */
-                        break;
-                    case 6:
-                        bit_offset += 10; /* SR3_PRIM_PILOT + SR3_PILOT_POWER1 + SR3_PILOT_POWER2 + QOF */
-                        bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LEN_C + bit(val(WALSH_LEN_C)+6) */
-                        if (tvb_get_bits8(tvb,bit_offset,1))
-                        {
-                            bit_offset += 3; /* 1 + QOF1 */
-                            bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LENGTH1 + bit(val(WALSH_LENGTH1)+6) */
-                        }
-                        else
-                            bit_offset += 1;
-                        if (tvb_get_bits8(tvb,bit_offset,1))
-                        {
-                            bit_offset += 3; /* 1 + QOF2 */
-                            bit_offset += tvb_get_bits8(tvb,bit_offset,3) + 3 + 6; /* WALSH_LENGTH2 + bit(val(WALSH_LENGTH2)+6) */
-                        }
-                        else
-                            bit_offset += 1;
-                        break;
-                    default:
-                        /* decoding sequence is unknown ! */
-                        return;
-                    }
-                }
-                else
-                    bit_offset += 1;
-                idx -= 1;
-            }
-            proto_tree_add_text(subtree2,tvb, bit_offset_sav2>>3, ((bit_offset-bit_offset_sav2)>>3)+1,"Data(Not decoded)");
-            proto_item_set_len(item2,((bit_offset-bit_offset_sav2)>>3)+1);
-        }
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* 3G Measurement Parameters Description */
-        bit_offset_sav = bit_offset;
-        item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]);
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_qsearch_c, tvb, bit_offset, 4, FALSE);
-        bit_offset += 4;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_search_prio, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_rep_quant, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_multirat_reporting, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_offset, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_threshold, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_multirat_reporting, tvb, bit_offset, 2, FALSE);
-            bit_offset += 2;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-        {
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_reporting_offset, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-            proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tdd_reporting_threshold, tvb, bit_offset, 3, FALSE);
-            bit_offset += 3;
-        }
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-            bit_offset += 2; /* CDMA2000 Multirat Reporting */
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-        if (value)
-            bit_offset += 6; /* CDMA2000 Reporting Offset + CDMA2000 Reporting Threshold */
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    if (((curr_offset + len)<<3) - bit_offset > 0)
-    {
-        /* There is still room left in the Rest Octets IE */
-        if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-        { /* Additions in Rel-5 */
-            bit_offset += 1;
-            value = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            { /* 3G Additional Measurement Parameters Description 2 */
-                bit_offset += de_rr_3g_add_meas_param_desc2(tvb, tree, bit_offset);
-            }
-            if (((curr_offset + len)<<3) - bit_offset > 0)
-            {
-                /* There is still room left in the Rest Octets IE */
-                if (gsm_a_rr_is_bit_high(tvb,bit_offset) == TRUE)
-                { /* Additions in Rel-7 */
-                    bit_offset += 1;
-                    value = tvb_get_bits8(tvb,bit_offset,1);
-                    bit_offset += 1;
-                    if (value)
-                    {
-                        proto_tree_add_bits_item(tree, hf_gsm_a_rr_700_reporting_offset, tvb, bit_offset, 3, FALSE);
-                        bit_offset += 3;
-                        proto_tree_add_bits_item(tree, hf_gsm_a_rr_700_reporting_threshold, tvb, bit_offset, 3, FALSE);
-                        bit_offset += 3;
-                    }
-                    value = tvb_get_bits8(tvb,bit_offset,1);
-                    bit_offset += 1;
-                    if (value)
-                    {
-                        proto_tree_add_bits_item(tree, hf_gsm_a_rr_810_reporting_offset, tvb, bit_offset, 3, FALSE);
-                        bit_offset += 3;
-                        proto_tree_add_bits_item(tree, hf_gsm_a_rr_810_reporting_threshold, tvb, bit_offset, 3, FALSE);
-                        bit_offset += 3;
-                    }
-                }
-                else
-                    bit_offset += 1;
-            }
-        }
-        else
-            bit_offset += 1;
-    }
-}
-
-/*
- * [4] 9.1.55 Enhanced Measurement Information
- */
-static const true_false_string gsm_a_rr_bsic_seen_value = {
-    "One Cell or more with invalid BSIC and allowed NCC part of BSIC is seen",
-    "No cell with invalid BSIC and allowed NCC part of BSIC is seen"
-};
-
-static const true_false_string gsm_a_rr_scale_value = {
-    "+10 dB",
-    "0 dB"
-};
-
-static const value_string gsm_a_rr_mean_bep_gmsk_vals[] = {
-    {  0, "log10(BEP) > -0.60"},
-    {  1, "-0.70 < log10(BEP) < -0.60"},
-    {  2, "-0.80 < log10(BEP) < -0.70"},
-    {  3, "-0.90 < log10(BEP) < -0.80"},
-    {  4, "-1.00 < log10(BEP) < -0.90"},
-    {  5, "-1.10 < log10(BEP) < -1.00"},
-    {  6, "-1.20 < log10(BEP) < -1.10"},
-    {  7, "-1.30 < log10(BEP) < -1.20"},
-    {  8, "-1.40 < log10(BEP) < -1.30"},
-    {  9, "-1.50 < log10(BEP) < -1.40"},
-    { 10, "-1.60 < log10(BEP) < -1.50"},
-    { 11, "-1.70 < log10(BEP) < -1.60"},
-    { 12, "-1.80 < log10(BEP) < -1.70"},
-    { 13, "-1.90 < log10(BEP) < -1.80"},
-    { 14, "-2.00 < log10(BEP) < -1.90"},
-    { 15, "-2.10 < log10(BEP) < -2.00"},
-    { 16, "-2.20 < log10(BEP) < -2.10"},
-    { 17, "-2.30 < log10(BEP) < -2.20"},
-    { 18, "-2.40 < log10(BEP) < -2.30"},
-    { 19, "-2.50 < log10(BEP) < -2.40"},
-    { 20, "-2.60 < log10(BEP) < -2.50"},
-    { 21, "-2.70 < log10(BEP) < -2.60"},
-    { 22, "-2.80 < log10(BEP) < -2.70"},
-    { 23, "-2.90 < log10(BEP) < -2.80"},
-    { 24, "-3.00 < log10(BEP) < -2.90"},
-    { 25, "-3.10 < log10(BEP) < -3.00"},
-    { 26, "-3.20 < log10(BEP) < -3.10"},
-    { 27, "-3.30 < log10(BEP) < -3.20"},
-    { 28, "-3.40 < log10(BEP) < -3.30"},
-    { 29, "-3.50 < log10(BEP) < -3.40"},
-    { 30, "-3.60 < log10(BEP) < -3.50"},
-    { 31, "log10(BEP) < -3.60"},
-    {  0, NULL }
-};
-
-static const value_string gsm_a_rr_cv_bep_vals[] = {
-    {  0, "1.75 < CV BEP < 2.00"},
-    {  1, "1.50 < CV BEP < 1.75"},
-    {  2, "1.25 < CV BEP < 1.50"},
-    {  3, "1.00 < CV BEP < 1.25"},
-    {  4, "0.75 < CV BEP < 1.00"},
-    {  5, "0.50 < CV BEP < 0.75"},
-    {  6, "0.25 < CV BEP < 0.50"},
-    {  7, "0.00 < CV BEP < 0.25"},
-    {  0, NULL }
-};
-
-
-static void
-sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
-{
-    proto_tree *subtree;
-    proto_item *item;
-    guint32 curr_offset;
-    gint bit_offset, bit_offset_sav;
-    guint8 value, idx;
-
-    curr_offset = offset;
-    bit_offset = curr_offset << 3;
-
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_ba_used, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_3g_ba_used, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_bsic_seen, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    proto_tree_add_bits_item(tree, hf_gsm_a_rr_scale, tvb, bit_offset, 1, FALSE);
-    bit_offset += 1;
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* Serving cell data */
-        bit_offset_sav = bit_offset;
-        item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_DATA].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_DATA]);
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dtx_used, tvb, bit_offset, 1, FALSE);
-        bit_offset += 1;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_full_serv_cell, tvb, bit_offset, 6, FALSE);
-        bit_offset += 6;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxqual_full_serv_cell, tvb, bit_offset, 3, FALSE);
-        bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mean_bep_gmsk, tvb, bit_offset, 5, FALSE);
-        bit_offset += 5;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_mean_cv_bep, tvb, bit_offset, 3, FALSE);
-        bit_offset += 3;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nbr_rcvd_blocks, tvb, bit_offset, 5, FALSE);
-        bit_offset += 5;
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    while (value)
-    { /* Repeated Invalid BSIC Information */
-        bit_offset_sav = bit_offset;
-        item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO]);
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_freq_ncell, tvb, bit_offset, 5, FALSE);
-        bit_offset += 5;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic_ncell, tvb, bit_offset, 6, FALSE);
-        bit_offset += 6;
-        proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_ncell, tvb, bit_offset, 6, FALSE);
-        bit_offset += 6;
-        proto_item_set_len(item,((bit_offset-bit_offset_sav)>>3)+1);
-        value = tvb_get_bits8(tvb,bit_offset,1);
-        bit_offset += 1;
-    }
-    value = tvb_get_bits8(tvb,bit_offset,1);
-    bit_offset += 1;
-    if (value)
-    { /* Bitmap Type Reporting */
-        bit_offset_sav = bit_offset;
-        item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING].strptr);
-        subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING]);
-        idx = 0;
-        while (((guint)(bit_offset>>3) <= (offset + len)) && (idx < 96))
-        {
-            value  = tvb_get_bits8(tvb,bit_offset,1);
-            bit_offset += 1;
-            if (value)
-            {
-                proto_tree_add_text(subtree, tvb, bit_offset>>3, 1, "Neighbour Cell List index: %u", idx);
-                proto_tree_add_bits_item(subtree, hf_gsm_a_rr_reporting_quantity, tvb, bit_offset, 6, FALSE);
-                bit_offset += 6;
-            }
-            idx += 1;
-        }
-    }
-}
-
-#define	NUM_GSM_DTAP_MSG_RR (sizeof(gsm_a_dtap_msg_rr_strings)/sizeof(value_string))
-static gint ett_gsm_dtap_msg_rr[NUM_GSM_DTAP_MSG_RR];
-static void (*dtap_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
-    NULL,	/* Reserved */
-    dtap_rr_add_ass,		/* Additional Assignment */
-    dtap_rr_imm_ass,		/* 9.1.18 Immediate assignment  */
-    dtap_rr_imm_ass_ext,	/* Immediate Assignment Extended */
-    dtap_rr_imm_ass_rej,	/* Immediate Assignment Reject */
-
-    NULL,			/* DTM Assignment Failure */
-    NULL,			/* DTM Reject */
-    NULL,			/* DTM Request */
-    NULL,			/* Main DCCH Assignment Command */
-    NULL,			/* Packet Assignment Command */
-
-    dtap_rr_cip_mode_cmd,	/* Ciphering Mode Command */
-    dtap_rr_cip_mode_cpte,	/* Ciphering Mode Complete */
-
-    dtap_rr_conf_change_cmd,	/* Configuration Change Command */
-    NULL,			/* Configuration Change Ack. */
-    dtap_rr_conf_change_rej,	/* Configuration Change Reject */
-
-    dtap_rr_ass_cmd,		/* 9.1.2 Assignment Command */
-    dtap_rr_ass_comp,		/* Assignment Complete */
-    dtap_rr_ass_fail,		/* Assignment Failure */
-    dtap_rr_ho_cmd,		/* Handover Command */
-    dtap_rr_ho_cpte,		/* Handover Complete */
-    dtap_rr_ho_fail,		/* Handover Failure */
-    dtap_rr_phy_info,		/* Physical Information */
-    NULL,			/* DTM Assignment Command */
-
-    NULL,			/* RR-cell Change Order */
-    NULL,			/* PDCH Assignment Command */
-
-    dtap_rr_ch_rel,		/* Channel Release */
-    dtap_rr_partial_rel,	/* Partial Release */
-    NULL,			/* Partial Release Complete */
-
-    dtap_rr_paging_req_type_1,	/* Paging Request Type 1 */
-    dtap_rr_paging_req_type_2,	/* Paging Request Type 2 */
-    dtap_rr_paging_req_type_3,	/* Paging Request Type 3 */
-    dtap_rr_paging_resp,	/* Paging Response */
-    NULL,			/* Notification/NCH */
-    NULL,			/* Reserved */
-    NULL,			/* Notification/Response */
-
-    NULL,			/* Reserved */
-
-    dtap_rr_utran_classmark_change,	/* Utran Classmark Change  */
-    NULL,			/* cdma2000 Classmark Change */
-    dtap_rr_inter_syst_to_utran_ho_cmd,	/* Inter System to UTRAN Handover Command */
-    NULL,			/* Inter System to cdma2000 Handover Command */
-
-    NULL,			/* System Information Type 8 */
-    dtap_rr_sys_info_1,		/* System Information Type 1 */
-    dtap_rr_sys_info_2,		/* System Information Type 2 */
-    dtap_rr_sys_info_3,		/* System Information Type 3 */
-    dtap_rr_sys_info_4,		/* System Information Type 4 */
-    dtap_rr_sys_info_5,		/* System Information Type 5 */
-    dtap_rr_sys_info_6,		/* System Information Type 6 */
-    NULL,			/* System Information Type 7 */
-
-    dtap_rr_sys_info_2bis,	/* System Information Type 2bis */
-    dtap_rr_sys_info_2ter,	/* System Information Type 2ter */
-    dtap_rr_sys_info_2quater,	/* System Information Type 2quater */
-    dtap_rr_sys_info_5bis,	/* System Information Type 5bis */
-    dtap_rr_sys_info_5ter,	/* System Information Type 5ter */
-    NULL,			/* System Information Type 9 */
-    dtap_rr_sys_info_13,	/* System Information Type 13 */
-
-    NULL,			/* System Information Type 16 */
-    NULL,			/* System Information Type 17 */
-
-    NULL,			/* System Information Type 18 */
-    NULL,			/* System Information Type 19 */
-    NULL,			/* System Information Type 20 */
-
-    dtap_rr_ch_mode_mod,	/* Channel Mode Modify */
-    dtap_rr_rr_status,		/* RR Status */
-    dtap_rr_ch_mode_mod_ack,	/* Channel Mode Modify Acknowledge */
-    dtap_rr_freq_redef,		/* Frequency Redefinition */
-    dtap_rr_meas_rep,		/* 9.1.21 Measurement report */
-    dtap_rr_mm_cm_change,	/* 9.1.11 Classmark Change */
-    dtap_rr_cm_enq,		/* Classmark Enquiry */
-    dtap_rr_ext_meas_report,	/* Extended Measurement Report */
-    dtap_rr_ext_meas_order,	/* Extended Measurement Order */
-    dtap_rr_gprs_sus_req,	/* 9.1.13b GPRS Suspension Request */
-
-    NULL,			/* VGCS Uplink Grant */
-    NULL,			/* Uplink Release */
-    NULL,			/* Reserved */
-    NULL,			/* Uplink Busy */
-    NULL,			/* Talker Indication */
-
-    NULL,			/* UTRAN Classmark Change/Handover To UTRAN Command */	/* spec conflict */
-
-    dtap_rr_app_inf,		/* Application Information */
-
-    NULL,			/* NONE */
-};
-
-void get_rr_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn)
-{
-    gint			idx;
-
-    *msg_str = match_strval_idx((guint32) (oct & DTAP_RR_IEI_MASK), gsm_a_dtap_msg_rr_strings, &idx);
-    *hf_idx = hf_gsm_a_dtap_msg_rr_type;
-    if (*msg_str != NULL) {
-        *ett_tree = ett_gsm_dtap_msg_rr[idx];
-        *msg_fcn  = dtap_msg_rr_fcn[idx];
-    }
-
-    return;
-}
-/* This is more or less a copy of the dissect_dtap() code just adding
- * L2 Pseudo Length decoding first
- * The code should probably be cleaned up.
- * The name CCCH might not be correct!
- */
-static void
-dissect_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
-{
-
-    static gsm_a_tap_rec_t	tap_rec[4];
-    static gsm_a_tap_rec_t	*tap_p;
-    static guint		tap_current=0;
-
-    void			(*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
-    guint8			oct;
-    guint8			pd;
-    guint32			offset, saved_offset;
-    guint32			len;
-    guint32			oct_1, oct_2;
-    proto_item			*ccch_item = NULL;
-    proto_tree			*ccch_tree = NULL;
-    proto_item			*oct_1_item = NULL;
-    proto_tree			*pd_tree = NULL;
-    proto_tree			*saved_tree = NULL;
-    const gchar			*msg_str;
-    gint			ett_tree;
-    gint			ti;
-    int				hf_idx;
-    gboolean			nsd;
-    guint8			pseudo_len;
-    guint32			curr_offset;
-    guint32			consumed;
-    guint			curr_len;
-
-    len = tvb_length(tvb);
-
-    if (len < 2){
-        /*
-         * too short to be CCCH
-         */
-        call_dissector(data_handle, tvb, pinfo, tree);
-        return;
-    }
-
-    if (check_col(pinfo->cinfo, COL_INFO)){
-        col_append_str(pinfo->cinfo, COL_INFO, "(CCCH) ");
-    }
-    /*
-     * set tap record pointer
-     */
-    tap_current++;
-    if (tap_current >= 4)
-    {
-        tap_current = 0;
-    }
-    tap_p = &tap_rec[tap_current];
-
-    offset = 0;
-    oct_2 = 0;
-
-    /* Skip pseeudo hdr here */
-    offset = 1;
-
-    /*
-     * get protocol discriminator
-     */
-    oct_1 = tvb_get_guint8(tvb, offset++);
-
-    if ((((oct_1 & DTAP_TI_MASK) >> 4) & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){
-        /*
-         * eventhough we don't know if a TI should be in the message yet
-         * we rely on the TI/SKIP indicator to be 0 to avoid taking this
-         * octet
-         */
-        oct_2 = tvb_get_guint8(tvb, offset++);
-    }
-
-    oct = tvb_get_guint8(tvb, offset);
-
-    pd = oct_1 & DTAP_PD_MASK;
-    ti = -1;
-    msg_str = NULL;
-    ett_tree = -1;
-    hf_idx = -1;
-    msg_fcn = NULL;
-    nsd = FALSE;
-    if (check_col(pinfo->cinfo, COL_INFO)){
-        col_append_fstr(pinfo->cinfo, COL_INFO, "(%s) ",val_to_str(pd,gsm_a_pd_short_str_vals,"Unknown (%u)"));
-    }
-
-    /*
-     * octet 1
-     */
-    switch (pd){
-    case 6:
-	rr_apdu_pinfo = pinfo;
-        get_rr_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn);
-        break;
-
-    default:
-        /* XXX - hf_idx is still -1! this is a bug in the implementation, and I don't know how to fix it so simple return here */
-        return;
-    }
-
-    /*
-     * create the protocol tree
-     */
-    if (msg_str == NULL){
-        ccch_item = proto_tree_add_protocol_format(tree, proto_a_ccch, tvb, 0, len,
-                                                   "GSM CCCH - Message Type (0x%02x)",
-                                                   oct);
-
-        ccch_tree = proto_item_add_subtree(ccch_item, ett_ccch_msg);
-    }else{
-        ccch_item = proto_tree_add_protocol_format(tree, proto_a_ccch, tvb, 0, -1,
-                                                   "GSM CCCH - %s", msg_str);
-
-        ccch_tree = proto_item_add_subtree(ccch_item, ett_tree);
-    }
-
-    if (check_col(pinfo->cinfo, COL_INFO)){
-        col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", msg_str);
-    }
-
-    /* back to the begining */
-    saved_offset = offset;
-    offset = 0;
-
-    curr_offset = offset;
-    curr_len = len;
-    len = 1;
-
-    /*	L2 Pseudo Length 10.5.2.19 */
-    pseudo_len = tvb_get_guint8(tvb,offset)>>2;
-
-    saved_tree = tree;
-    tree = ccch_tree;
-    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_L2_PSEUDO_LEN);
-    tree = saved_tree;
-    offset = saved_offset;
-
-    oct_1_item =
-	proto_tree_add_text(ccch_tree,
-                            tvb, 1, 1,
-                            "Protocol Discriminator: %s",
-                            val_to_str(pd, protocol_discriminator_vals, "Unknown (%u)"));
-
-    pd_tree = proto_item_add_subtree(oct_1_item, ett_ccch_oct_1);
-
-    if (ti == -1){
-        proto_tree_add_item(pd_tree, hf_gsm_a_skip_ind, tvb, 1, 1, FALSE);
-    }else{
-        other_decode_bitfield_value(a_bigbuf, oct_1, 0x80, 8);
-        proto_tree_add_text(pd_tree,tvb, 1, 1,
-                            "%s :  TI flag: %s",
-                            a_bigbuf,
-                            ((oct_1 & 0x80) ?  "allocated by receiver" : "allocated by sender"));
-
-        if ((ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){
-            /* ti is extended to next octet */
-            other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
-            proto_tree_add_text(pd_tree, tvb, 1, 1,
-				"%s :  TIO: The TI value is given by the TIE in octet 2",
-				a_bigbuf);
-        }else{
-            other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
-            proto_tree_add_text(pd_tree,tvb, 1, 1,
-				"%s :  TIO: %u",a_bigbuf,ti & DTAP_TIE_PRES_MASK);
-        }
-    }
-
-    proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 1, 1, FALSE);
-
-    if ((ti != -1) && (ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK){
-        proto_tree_add_item(tree, hf_gsm_a_extension, tvb, 2, 1, FALSE);
-        other_decode_bitfield_value(a_bigbuf, oct_2, DTAP_TIE_MASK, 8);
-        proto_tree_add_text(pd_tree, tvb, 2, 1,
-                            "%s :  TIE: %u", a_bigbuf, oct_2 & DTAP_TIE_MASK);
-    }
-
-    /*
-     * N(SD)
-     */
-    if ((pinfo->p2p_dir == P2P_DIR_RECV) &&
-        nsd)
-    {
-        /* XXX */
-    }
-
-    /*
-     * add DTAP message name
-     */
-    proto_tree_add_uint_format(ccch_tree, hf_idx, tvb, offset, 1, oct,
-                               "Message Type: %s",msg_str ? msg_str : "(Unknown)");
-
-    offset++;
-
-    tap_p->pdu_type = GSM_A_PDU_TYPE_DTAP;
-    tap_p->message_type = (nsd ? (oct & 0x3f) : oct);
-    tap_p->protocol_disc = pd;
-
-    tap_queue_packet(gsm_a_tap, pinfo, tap_p);
-
-    if (msg_str == NULL)
-        return;
-
-    if (offset >= len)
-        return;
-
-    /*
-     * decode elements
-     */
-    if (msg_fcn == NULL){
-        proto_tree_add_text(ccch_tree, tvb, offset, len - offset,
-                            "Message Elements");
-    }else{
-        (*msg_fcn)(tvb, ccch_tree, offset, len - offset);
-    }
-}
-
-const value_string gsm_a_sacch_msg_rr_strings[] = {
-    { 0x00, "System Information Type 10" },
-    { 0x01, "Notification/FACCH" },
-    { 0x02, "Uplink Free" },
-    { 0x04, "Enhanced Measurement Report" },
-    { 0x05, "Measurement Information" },
-    { 0x06, "VBS/VGCS Reconfigure" },
-    { 0x07, "VBS/VGCS Reconfigure2" },
-    { 0x08, "VGCS Additional Information" },
-    { 0x09, "VGCS SMS Information" },
-    {    0, NULL }
-};
-
-#define	NUM_GSM_SACCH_MSG_RR (sizeof(gsm_a_sacch_msg_rr_strings)/sizeof(value_string))
-static gint ett_gsm_sacch_msg_rr[NUM_GSM_SACCH_MSG_RR];
-static void (*sacch_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
-    NULL,			/* System Information Type 10 */
-    NULL,			/* Notification/FACCH */
-    NULL, 			/* Uplink Free  */
-    sacch_rr_enh_meas_report, 	/* Enhanced Measurement Report */
-    sacch_rr_meas_info, 	/* Measurement Information */
-    NULL, 			/* VBS/VGCS Reconfigure */
-    NULL, 			/* VBS/VGCS Reconfigure2 */
-    NULL, 			/* VGCS Additional Information */
-    NULL, 			/* VGCS SMS Information */
-    NULL, 			/* NONE */
-};
-
-void get_rr_short_pd_msg_params(guint8 mess_type, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn)
-{
-    gint			idx;
-
-    *msg_str = match_strval_idx((guint32) mess_type, gsm_a_sacch_msg_rr_strings, &idx);
-    *hf_idx = hf_gsm_a_sacch_msg_rr_type;
-    if (*msg_str != NULL) {
-        *ett_tree = ett_gsm_sacch_msg_rr[idx];
-        *msg_fcn = sacch_msg_rr_fcn[idx];
-    }
-}
-
-const value_string short_protocol_discriminator_vals[] = {
-    {0x0, "Radio Resources Management messages"},
-    {  0, NULL }
-};
-
-static void
-dissect_sacch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
-{
-    static gsm_a_tap_rec_t	tap_rec[4];
-    static gsm_a_tap_rec_t	*tap_p;
-    static guint		tap_current=0;
-
-    void			(*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
-    guint8			oct, short_pd, mess_type;
-    guint32			offset;
-    guint32			len;
-    proto_item			*sacch_item = NULL;
-    proto_tree			*sacch_tree = NULL;
-    const gchar			*msg_str;
-    gint			ett_tree;
-    int				hf_idx;
-
-    len = tvb_length(tvb);
-
-    if (check_col(pinfo->cinfo, COL_INFO))
-        col_append_str(pinfo->cinfo, COL_INFO, "(SACCH) ");
-
-    /*
-     * set tap record pointer
-     */
-    tap_current++;
-    if (tap_current >= 4)
-    {
-        tap_current = 0;
-    }
-    tap_p = &tap_rec[tap_current];
-
-    offset = 0;
-
-    oct = tvb_get_guint8(tvb, offset);
-
-    msg_str = NULL;
-    ett_tree = -1;
-    hf_idx = -1;
-    msg_fcn = NULL;
-
-    short_pd = (oct & 0x80) >> 7;
-    mess_type = (oct & 0x7c) >> 2;
-
-    if (short_pd == 0)
-    {
-        if (check_col(pinfo->cinfo, COL_INFO))
-            col_append_fstr(pinfo->cinfo, COL_INFO, "(RR) ");
-        get_rr_short_pd_msg_params(mess_type, &msg_str, &ett_tree, &hf_idx, &msg_fcn);
-    }
-    else
-    {
-        if (check_col(pinfo->cinfo, COL_INFO))
-            col_append_fstr(pinfo->cinfo, COL_INFO, "(Unknown) ");
-    }
-
-    /*
-     * create the protocol tree
-     */
-    if (msg_str == NULL){
-        sacch_item = proto_tree_add_protocol_format(tree, proto_a_sacch, tvb, 0, len,
-                                                    "GSM SACCH - Message Type (0x%02x)", mess_type);
-
-        sacch_tree = proto_item_add_subtree(sacch_item, ett_sacch_msg);
-    }else{
-        sacch_item = proto_tree_add_protocol_format(tree, proto_a_sacch, tvb, 0, -1,
-                                                    "GSM SACCH - %s", msg_str);
-
-        sacch_tree = proto_item_add_subtree(sacch_item, ett_tree);
-
-   	if (check_col(pinfo->cinfo, COL_INFO)){
-            col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", msg_str);
-        }
-    }
-
-    if (short_pd == 0)
-	proto_tree_add_text(sacch_tree,
-                            tvb, offset, 1,
-                            "Short Protocol Discriminator: %s",
-                            val_to_str(short_pd, short_protocol_discriminator_vals, "Unknown (%u)"));
-
-    if (hf_idx == -1)
-        return;
-
-    /*
-     * add SACCH message name
-     */
-    proto_tree_add_uint_format(sacch_tree, hf_idx, tvb, offset, 1, oct,
-                               "Message Type: %s",msg_str ? msg_str : "(Unknown)");
-
-    proto_tree_add_text(sacch_tree, tvb, offset, 1,
-                        "Short Layer 2 header: %u", oct & 0x03);
-
-    offset++;
-
-    tap_p->pdu_type = GSM_A_PDU_TYPE_SACCH;
-    tap_p->message_type = mess_type;
-    tap_p->protocol_disc = short_pd;
-
-    tap_queue_packet(gsm_a_tap, pinfo, tap_p);
-
-    if (msg_str == NULL)
-        return;
-
-    /*
-     * decode elements
-     */
-    if (msg_fcn == NULL){
-        proto_tree_add_text(sacch_tree, tvb, offset, len - offset,
-                            "Message Elements");
-    }else{
-        (*msg_fcn)(tvb, sacch_tree, offset, len - offset);
-    }
-}
-
-/* Register the protocol with Wireshark */
-void
-proto_register_gsm_a_rr(void)
-{
-    guint		i;
-    guint		last_offset;
-
-    /* Setup list of header fields */
-
-    static hf_register_info hf[] =
-        {
-            { &hf_gsm_a_dtap_msg_rr_type,
-              { "DTAP Radio Resources Management Message Type",	"gsm_a.dtap_msg_rr_type",
-		FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_rr_strings), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_elem_id,
-              { "Element ID",	"gsm_a_rr.elem_id",
-		FT_UINT8, BASE_DEC, NULL, 0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_bcc,
-              { "BCC","gsm_a.bcc",
-		FT_UINT8,BASE_DEC,  NULL, 0x07,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_ncc,
-              { "NCC","gsm_a.ncc",
-		FT_UINT8,BASE_DEC,  NULL, 0x38,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_bcch_arfcn,
-              { "BCCH ARFCN(RF channel number)","gsm_a.bcch_arfcn",
-		FT_UINT16,BASE_DEC,  NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_range_nb,
-              { "Number of Ranges","gsm_a.rr.range_nb",
-		FT_UINT8, BASE_DEC,  NULL, 0xff,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_range_lower,
-              { "Range Lower","gsm_a.rr.range_lower",
-		FT_UINT16, BASE_DEC,  NULL, 0x0000,
-		"ARFCN used as the lower limit of a range of frequencies to be used by the mobile station in cell selection (Range Lower)", HFILL }
-            },
-            { &hf_gsm_a_rr_range_higher,
-              { "Range Higher","gsm_a.rr.range_higher",
-		FT_UINT16, BASE_DEC,  NULL, 0x0000,
-		"ARFCN used as the higher limit of a range of frequencies to be used by the mobile station in cell selection (Range Higher)", HFILL }
-            },
-            { &hf_gsm_a_rr_ba_list_pref_length,
-              { "Length of BA List Pref","gsm_a.rr.ba_list_pref_length",
-		FT_UINT8, BASE_DEC,  NULL, 0xff,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ba_freq,
-              { "BA Freq","gsm_a.rr.ba_freq",
-		FT_UINT16, BASE_DEC,  NULL, 0x0000,
-		"ARFCN indicating a single frequency to be used by the mobile station in cell selection and reselection (BA Freq)", HFILL }
-            },
-            { &hf_gsm_a_rr_utran_freq_list_length,
-              { "Length of BA List Pref","gsm_a.rr.ba_list_pref_length",
-		FT_UINT8, BASE_DEC,  NULL, 0xff,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ho_ref_val,
-              { "Handover reference value","gsm_a.rr.ho_ref_val",
-		FT_UINT8,BASE_DEC,  NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_L2_pseudo_len,
-              { "L2 Pseudo Length value","gsm_a.rr.rr_2_pseudo_len",
-		FT_UINT8, BASE_DEC, NULL, 0xfc,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ba_used,
-              { "BA-USED","gsm_a.rr.ba_used",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_dtx_used,
-              { "DTX-USED","gsm_a.rr.dtx_used",
-		FT_BOOLEAN, BASE_NONE,  TFS(&gsm_a_rr_dtx_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_3g_ba_used,
-              { "3G-BA-USED","gsm_a.rr.3g_ba_used",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_meas_valid,
-              { "MEAS-VALID","gsm_a.rr.meas_valid",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_mv_vals), 0x40,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rxlev_full_serv_cell,
-              { "RXLEV-FULL-SERVING-CELL","gsm_a.rr.rxlev_full_serv_cell",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_rxlev_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rxlev_sub_serv_cell,
-              { "RXLEV-SUB-SERVING-CELL","gsm_a.rr.rxlev_sub_serv_cell",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_rxlev_vals), 0x3f,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rxqual_full_serv_cell,
-              { "RXQUAL-FULL-SERVING-CELL","gsm_a.rr.rxqual_full_serv_cell",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rxqual_sub_serv_cell,
-              { "RXQUAL-SUB-SERVING-CELL","gsm_a.rr.rxqual_sub_serv_cell",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_rxqual_vals), 0x0e,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_no_ncell_m,
-              { "NO-NCELL-M","gsm_a.rr.no_ncell_m",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_ncell_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rxlev_ncell,
-              { "RXLEV-NCELL","gsm_a.rr.rxlev_ncell",
-		FT_UINT8,BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_bcch_freq_ncell,
-              { "BCCH-FREQ-NCELL","gsm_a.rr.bcch_freq_ncell",
-		FT_UINT8,BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_bsic_ncell,
-              { "BSIC-NCELL","gsm_a.rr.bsic_ncell",
-		FT_UINT8,BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_mobile_time_difference,
-              { "Mobile Timing Difference value (in half bit periods)","gsm_a.rr.mobile_time_difference",
-		FT_UINT32,BASE_DEC, NULL, 0xFFFFF8,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pow_cmd_atc,
-              { "ATC","gsm_a.rr.pow_cmd_atc",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_pow_cmd_atc_value), 0x80,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_page_mode,
-              { "Page Mode","gsm_a.rr.page_mode",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_page_mode_vals), 0x03,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_dedicated_mode_or_tbf,
-              { "Dedicated mode or TBF","gsm_a.rr.dedicated_mode_or_tbf",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_dedicated_mode_or_tbf_vals), 0x70,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pow_cmd_epc,
-              { "EPC_mode","gsm_a.rr.pow_cmd_epc",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_pow_cmd_epc_value), 0x40,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pow_cmd_fpcepc,
-              { "FPC_EPC","gsm_a.rr.pow_cmd_fpcepc",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_pow_cmd_fpcepc_value), 0x20,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pow_cmd_powlev,
-              { "POWER LEVEL","gsm_a.rr.pow_cmd_pow",
-		FT_UINT8,BASE_DEC,  NULL, 0x1f,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_sync_ind_nci,
-              { "Normal cell indication(NCI)","gsm_a.rr.sync_ind_nci",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_sync_ind_nci_value), 0x08,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_sync_ind_rot,
-              { "Report Observed Time Difference(ROT)","gsm_a.rr.sync_ind_rot",
-		FT_BOOLEAN,8,  TFS(&sm_a_rr_sync_ind_rot_value), 0x04,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_sync_ind_si,
-              { "Synchronization indication(SI)","gsm_a.rr_sync_ind_si",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_sync_ind_si_vals), 0x03,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_format_id,
-              { "Format Identifier","gsm_a.rr_format_id",
-		FT_UINT8,BASE_HEX,  VALS(gsm_a_rr_freq_list_format_id_vals), 0xce,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_channel_mode,
-              { "Channel Mode","gsm_a.rr.channel_mode",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_channel_mode_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_channel_mode2,
-              { "Channel Mode 2","gsm_a.rr.channel_mode2",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_channel_mode2_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_sc,
-              { "SC","gsm_a.rr.SC",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_sc_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_algorithm_id,
-              { "Algorithm identifier","gsm_a.algorithm_identifier",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_algorithm_identifier_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_cr,
-              { "CR","gsm_a.rr.CR",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_cr_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_multirate_speech_ver,
-              { "Multirate speech version","gsm_a.rr.multirate_speech_ver",
-		FT_UINT8,BASE_DEC,  VALS(multirate_speech_ver_vals), 0xe0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_NCSB,
-              { "NSCB: Noise Suppression Control Bit","gsm_a.rr.NCSB",
-		FT_UINT8,BASE_DEC,  VALS(NSCB_vals), 0x10,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ICMI,
-              { "ICMI: Initial Codec Mode Indicator","gsm_a.rr.ICMI",
-		FT_UINT8,BASE_DEC,  VALS(ICMI_vals), 0x8,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_start_mode,
-              { "Start Mode","gsm_a.rr.start_mode",
-		FT_UINT8,BASE_DEC,  NULL, 0x3,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_timing_adv,
-              { "Timing advance value","gsm_a.rr.timing_adv",
-		FT_UINT8,BASE_DEC,  NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_time_diff,
-              { "Time difference value","gsm_a.rr.time_diff",
-		FT_UINT8,BASE_DEC,  NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_tlli,
-              { "TLLI","gsm_a.rr.tlli",
-		FT_UINT32,BASE_HEX,  NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_tmsi_ptmsi,
-              { "TMSI/P-TMSI Value","gsm_a.rr.tmsi_ptmsi",
-		FT_UINT32,BASE_HEX,  NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_target_mode,
-              { "Target mode","gsm_a.rr.target_mode",
-		FT_UINT8,BASE_DEC,  NULL, 0xc0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_wait_indication,
-              { "Wait Indication","gsm_a.rr.wait_indication",
-		FT_UINT8,BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_seq_code,
-              { "Sequence Code","gsm_a.rr.seq_code",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-
-            { &hf_gsm_a_rr_group_cipher_key_number,
-              { "Group cipher key number","gsm_a.rr.Group_cipher_key_number",
-		FT_UINT8,BASE_DEC,  NULL, 0x3c,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_MBMS_broadcast,
-              { "MBMS Broadcast","gsm_a.rr.MBMS_broadcast",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_MBMS_broadcast_value), 0x01,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_MBMS_multicast,
-              { "MBMS Multicast","gsm_a.rr.MBMS_multicast",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_MBMS_multicast_value), 0x02,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_last_segment,
-              { "Last Segment","gsm_a.rr.last_segment",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_last_segment_value), 0x01,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_carrier_ind,
-              { "Carrier Indication","gsm_a.rr.carrier_ind",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_carrier_ind_value), 0x01,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ra,
-              { "Random Access Information (RA)", "gsm_a_rr_ra",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_T1prim,
-              { "T1'",		   "gsm_a.rr.T1prim",
-		FT_UINT8, BASE_DEC, NULL, 0xf8,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_T3,
-              { "T3",		   "gsm_a.rr.T3",
-		FT_UINT16, BASE_DEC, NULL, 0x07e0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_T2,
-              { "T2",		   "gsm_a.rr.T2",
-		FT_UINT8, BASE_DEC, NULL, 0x1f,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rfn,
-              { "RFN",		   "gsm_a.rr.rfn",
-		FT_UINT16, BASE_DEC, NULL, 0x0,
-		"Reduced Frame Number", HFILL }
-            },
-            { &hf_gsm_a_rr_RR_cause,
-              { "RR cause value","gsm_a.rr.RRcause",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_RR_cause_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_cm_cng_msg_req,
-              { "CLASSMARK CHANGE","gsm_a.rr_cm_cng_msg_req",
-		FT_BOOLEAN,8,  TFS(&gsm_a_msg_req_value), 0x80,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_utran_cm_cng_msg_req,
-              { "UTRAN CLASSMARK CHANGE","gsm_a.rr_utran_cm_cng_msg_req",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_utran_cm_cng_msg_req_vals), 0x70,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_cdma200_cm_cng_msg_req,
-              { "CDMA2000 CLASSMARK CHANGE","gsm_a.rr_cdma200_cm_cng_msg_req",
-		FT_BOOLEAN,8,  TFS(&gsm_a_msg_req_value), 0x08,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_geran_iu_cm_cng_msg_req,
-              { "GERAN IU MODE CLASSMARK CHANGE","gsm_a.rr_geran_iu_cm_cng_msg_req",
-		FT_BOOLEAN,8,  TFS(&gsm_a_msg_req_value), 0x04,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_chnl_needed_ch1,
-              { "Channel 1","gsm_a.rr_chnl_needed_ch1",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_channel_needed_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_chnl_needed_ch2,
-              { "Channel 2","gsm_a.rr_chnl_needed_ch2",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_channel_needed_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_chnl_needed_ch3,
-              { "Channel 3","gsm_a.rr_chnl_needed_ch3",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_channel_needed_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_chnl_needed_ch4,
-              { "Channel 4","gsm_a.rr_chnl_needed_ch4",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_channel_needed_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_suspension_cause,
-              { "Suspension cause value","gsm_a.rr.suspension_cause",
-		FT_UINT8,BASE_DEC,  VALS(gsm_a_rr_suspension_cause_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b8,
-              { "12,2 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b8",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x80,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b7,
-              { "10,2 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b7",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x40,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b6,
-              { "7,95 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b6",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x20,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b5,
-              { "7,40 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b5",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x10,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b4,
-              { "6,70 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b4",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x08,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b3,
-              { "5,90 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b3",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x04,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b2,
-              { "5,15 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b2",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x02,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v1_b1,
-              { "4,75 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v1b1",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x01,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b5,
-              { "23,85 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b5",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x10,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b4,
-              { "15,85 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b4",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x08,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b3,
-              { "12,65 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b3",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x04,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b2,
-              { "8,85 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b2",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x02,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_set_of_amr_codec_modes_v2_b1,
-              { "6,60 kbit/s codec rate", "gsm_a.rr.set_of_amr_codec_modes_v2b1",
-		FT_BOOLEAN,8,  TFS(&gsm_a_rr_set_of_amr_codec_modes), 0x01,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_amr_threshold,
-              { "AMR Threshold", "gsm_a.rr.amr_threshold",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_amr_threshold_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_amr_hysteresis,
-              { "AMR Hysteresis", "gsm_a.rr.amr_hysteresis",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_amr_hysteresis_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pwrc,
-              { "PWRC", "gsm_a.rr.pwrc",
-		FT_BOOLEAN, BASE_NONE,  NULL, 0x0,
-		"Power Control Indicator (PWRC)", HFILL }
-            },
-            { &hf_gsm_a_rr_dtx_bcch,
-              { "DTX (BCCH)", "gsm_a.rr.dtx_bcch",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_dtx_bcch_vals), 0x30,
-		"Discontinuous Transmission (DTX-BCCH)", HFILL }
-            },
-            { &hf_gsm_a_rr_dtx_sacch,
-              { "DTX (SACCH)", "gsm_a.rr.dtx_sacch",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_dtx_sacch_vals), 0xb0,
-		"Discontinuous Transmission (DTX-SACCH)", HFILL }
-            },
-            { &hf_gsm_a_rr_radio_link_timeout,
-              { "Radio Link Timeout", "gsm_a.rr.radio_link_timeout",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_radio_link_timeout_vals), 0x0f,
-		"Radio Link Timeout (s)", HFILL }
-            },
-            { &hf_gsm_a_rr_cell_reselect_hyst,
-              { "Cell Reselection Hysteresis", "gsm_a.rr.cell_reselect_hyst",
-		FT_UINT8, BASE_DEC,  NULL, 0xe0,
-		"Cell Reselection Hysteresis (dB)", HFILL }
-            },
-            { &hf_gsm_a_rr_ms_txpwr_max_cch,
-              { "MS TXPWR MAX CCH", "gsm_a.rr.ms_txpwr_max_cch",
-		FT_UINT8, BASE_DEC,  NULL, 0x1f,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_acs,
-              { "ACS", "gsm_a.rr.acs",
-		FT_BOOLEAN, 8,  NULL, 0x80,
-		"Additional Reselect Param Indicator (ACS)", HFILL }
-            },
-            { &hf_gsm_a_rr_neci,
-              { "NECI", "gsm_a.rr.neci",
-		FT_UINT8, BASE_DEC,  NULL, 0x40,
-		"New Establishment Cause Indicator (NECI)", HFILL }
-            },
-            { &hf_gsm_a_rr_rxlev_access_min,
-              { "RXLEV-ACCESS-MIN", "gsm_a.rr.rxlev_access_min",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_rxlev_vals), 0x3f,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_mscr,
-              { "MSCR", "gsm_a.rr.mscr",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_mscr_vals), 0x80,
-		"MSC Release Indicator (MSCR)", HFILL }
-            },
-            { &hf_gsm_a_rr_att,
-              { "ATT", "gsm_a.rr.att",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_att_vals), 0x40,
-		"Attach Indicator (ATT)", HFILL }
-            },
-            { &hf_gsm_a_rr_bs_ag_blks_res,
-              { "BS_AG_BLKS_RES", "gsm_a.rr.bs_ag_blks_res",
-		FT_UINT8, BASE_DEC,  NULL, 0x38,
-		"Access Grant Reserved Blocks (BS_AG_BLKS_RES)", HFILL }
-            },
-            { &hf_gsm_a_rr_ccch_conf,
-              { "CCCH-CONF", "gsm_a.rr.ccch_conf",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_ccch_conf_vals), 0x07,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_cbq3,
-              { "CBQ3", "gsm_a.rr.cbq3",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_cbq3_vals), 0x00,
-		"Cell Bar Qualify 3", HFILL }
-            },
-            { &hf_gsm_a_rr_bs_pa_mfrms,
-              { "BS-PA-MFRMS", "gsm_a.rr.bs_pa_mfrms",
-		FT_UINT8, BASE_DEC,  NULL, 0x07,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_t3212,
-              { "T3212", "gsm_a.rr.t3212",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"Periodic Update period (T3212) (deci-hours)", HFILL }
-            },
-            { &hf_gsm_a_rr_dyn_arfcn_length,
-              { "Length of Dynamic Mapping", "gsm_a.rr.dyn_arfcn_length",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_gsm_band,
-              { "GSM Band", "gsm_a.rr.gsm_band",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_gsm_band_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_arfcn_first,
-              { "ARFCN First", "gsm_a.rr.arfcn_first",
-		FT_UINT16, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_band_offset,
-              { "Band Offset", "gsm_a.rr.band_offset",
-		FT_UINT16, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_arfcn_range,
-              { "ARFCN Range", "gsm_a.rr.arfcn_range",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_lowest_arfcn,
-              { "Lowest ARFCN", "gsm_a.rr.lowest_arfcn",
-		FT_UINT8, BASE_DEC,  NULL, 0x7f,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_inc_skip_arfcn,
-              { "Increment skip ARFCN", "gsm_a.rr.inc_skip_arfcn",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_gprs_resumption_ack,
-              { "Ack", "gsm_a.rr.gprs_resumption_ack",
-		FT_BOOLEAN, 8,  TFS(&gsm_a_rr_gprs_resumption_ack_value), 0x01,
-		"GPRS Resumption Ack bit", HFILL }
-            },
-            { &hf_gsm_a_rr_ext_ind,
-              { "EXT-IND", "gsm_a.rr.ext_ind",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_ext_ind_vals), 0x20,
-		"Extension Indication (EXT-IND)", HFILL }
-            },
-            { &hf_gsm_a_rr_ba_ind,
-              { "BA-IND", "gsm_a.rr.ba_ind",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"BCCH Allocation Indication (BA-IND)", HFILL }
-            },
-            { &hf_gsm_a_rr_multiband_reporting,
-              { "Multiband Reporting", "gsm_a.rr.multiband_reporting",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"Number of cells to be reported in each band if Multiband Reporting", HFILL }
-            },
-            { &hf_gsm_a_rr_ncc_permitted,
-              { "NCC Permitted", "gsm_a.rr.ncc_permitted",
-		FT_UINT8, BASE_HEX,  NULL, 0xff,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_max_retrans,
-              { "Max retrans", "gsm_a.rr.max_retrans",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_max_retrans_vals), 0xc0,
-		"Maximum number of retransmissions", HFILL }
-            },
-            { &hf_gsm_a_rr_tx_integer,
-              { "Tx-integer", "gsm_a.rr.tx_integer",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_tx_integer_vals), 0x3c,
-		"Number of Slots to spread Transmission (Tx-integer)", HFILL }
-            },
-            { &hf_gsm_a_rr_cell_barr_access,
-              { "CELL_BARR_ACCESS", "gsm_a.rr.cell_barr_access",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_cell_barr_access_vals), 0x02,
-		"Cell Barred for Access (CELL_BARR_ACCESS)", HFILL }
-            },
-            { &hf_gsm_a_rr_re,
-              { "RE", "gsm_a.rr.re",
-		FT_BOOLEAN, 8,  NULL, 0x01,
-		"Call re-establishment allowed (RE)", HFILL }
-            },
-            { &hf_gsm_a_rr_acc,
-              { "ACC", "gsm_a.rr.acc",
-		FT_UINT16, BASE_HEX,  NULL, 0xffff,
-		"Access Control Class N barred (ACC)", HFILL }
-            },
-            { &hf_gsm_a_rr_nch_position,
-              { "NCH Position", "gsm_a.rr.nch_position",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_nch_position_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si2ter_mp_change_mark,
-              { "SI2ter Measurement Parameter Change Mark", "gsm_a.rr.si2ter_mp_change_mark",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si2ter_3g_change_mark,
-              { "SI2ter 3G Change Mark", "gsm_a.rr.si2ter_3g_change_mark",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si2ter_index,
-              { "SI2ter Index", "gsm_a.rr.si2ter_index",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si2ter_count,
-              { "SI2ter Count", "gsm_a.rr.si2ter_count",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_uarfcn,
-              { "FDD UARFCN", "gsm_a.rr.fdd_uarfcn",
-		FT_UINT16, BASE_DEC,  NULL, 0x0000,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_bandwidth_fdd,
-              { "Bandwidth FDD", "gsm_a.rr.bandwidth_fdd",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_tdd_uarfcn,
-              { "TDD UARFCN", "gsm_a.rr.tdd_uarfcn",
-		FT_UINT16, BASE_DEC,  NULL, 0x0000,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_bandwidth_tdd,
-              { "Bandwidth TDD", "gsm_a.rr.bandwidth_tdd",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_arfcn,
-              { "ARFCN", "gsm_a.rr.arfcn",
-		FT_UINT16, BASE_DEC,  NULL, 0x0000,
-		"Absolute Radio Frequency Channel Number (ARFCN)", HFILL }
-            },
-            { &hf_gsm_a_rr_bsic,
-              { "BSIC", "gsm_a.rr.bsic",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"Base Station Identify Code (BSIC)", HFILL }
-            },
-            { &hf_gsm_a_rr_qsearch_i,
-              { "Qsearch I", "gsm_a.rr.qsearch_i",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_qsearch_x_vals), 0x00,
-		"Search for 3G cells if signal level is below (0 7) or above (8 15) threshold (Qsearch I)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_qoffset,
-              { "FDD Qoffset", "gsm_a.rr.fdd_qoffset",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_xdd_qoffset_vals), 0x00,
-		"Offset to RLA_C for cell re selection to FDD access technology (FDD Qoffset)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_qmin,
-              { "FDD Qmin", "gsm_a.rr.fdd_qmin",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_fdd_qmin_vals), 0x00,
-		"Minimum threshold for Ec/No for UTRAN FDD cell re-selection (FDD Qmin)", HFILL }
-            },
-            { &hf_gsm_a_rr_tdd_qoffset,
-              { "TDD Qoffset", "gsm_a.rr.tdd_qoffset",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_xdd_qoffset_vals), 0x00,
-		"Offset to RLA_C for cell re selection to TDD access technology (TDD Qoffset)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_qmin_offset,
-              { "FDD Qmin Offset", "gsm_a.rr.fdd_qmin_offset",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_fdd_qmin_offset_vals), 0x00,
-		"Offset to FDD Qmin value (FDD Qmin Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_rscpmin,
-              { "FDD RSCPmin", "gsm_a.rr.fdd_rscpmin",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_fdd_rscpmin_vals), 0x00,
-		"Minimum threshold of RSCP for UTRAN FDD cell re-selection (FDD RSCPmin)", HFILL }
-            },
-            { &hf_gsm_a_rr_3g_ba_ind,
-              { "3G BA-IND", "gsm_a.rr.3g_ba_ind",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"3G BCCH Allocation Indication (3G BA-IND)", HFILL }
-            },
-            { &hf_gsm_a_rr_mp_change_mark,
-              { "Measurement Parameter Change Mark", "gsm_a.rr.mp_change_mark",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si2quater_index,
-              { "SI2quater Index", "gsm_a.rr.si2quater_index",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si2quater_count,
-              { "SI2quater Count", "gsm_a.rr.si2quater_count",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_gsm_report_type,
-              { "Report Type", "gsm_a.rr.gsm_report_type",
-		FT_BOOLEAN, BASE_NONE,  TFS(&gsm_a_rr_gsm_report_type_value), 0x0,
-		"Report type the MS shall use (Report Type)", HFILL }
-            },
-            { &hf_gsm_a_rr_serving_band_reporting,
-              { "Serving Band Reporting", "gsm_a.rr.serving_band_reporting",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		"Number of cells reported from the GSM serving frequency band (Serving Band Reporting)", HFILL }
-            },
-            { &hf_gsm_a_rr_frequency_scrolling,
-              { "Frequency Scrolling", "gsm_a.rr.frequency_scrolling",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_frequency_scrolling_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rep_priority,
-              { "Rep Priority", "gsm_a.rr.rep_priority",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_rep_priority_value), 0x0,
-		"Reporting Priority", HFILL }
-            },
-            { &hf_gsm_a_rr_report_type,
-              { "Report Type", "gsm_a.rr.report_type",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_report_type_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_reporting_rate,
-              { "Reporting Rate", "gsm_a.rr.reporting_rate",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_reporting_rate_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_invalid_bsic_reporting,
-              { "Invalid BSIC Reporting", "gsm_a.rr.invalid_bsic_reporting",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_invalid_bsic_reporting_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_scale_ord,
-              { "Scale Ord", "gsm_a.rr.scale_ord",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_scale_ord_vals), 0x00,
-		"Offset used for the reported RXLEV values (Scale Ord)", HFILL }
-            },
-            { &hf_gsm_a_rr_900_reporting_offset,
-              { "900 Reporting Offset", "gsm_a.rr.900_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 900 (900 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_900_reporting_threshold,
-              { "900 Reporting Threshold", "gsm_a.rr.900_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 900 (900 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_1800_reporting_offset,
-              { "1800 Reporting Offset", "gsm_a.rr.1800_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 1800 (1800 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_1800_reporting_threshold,
-              { "1800 Reporting Threshold", "gsm_a.rr.1800_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 1800 (1800 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_400_reporting_offset,
-              { "400 Reporting Offset", "gsm_a.rr.400_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 400 (400 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_400_reporting_threshold,
-              { "400 Reporting Threshold", "gsm_a.rr.400_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 400 (400 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_1900_reporting_offset,
-              { "1900 Reporting Offset", "gsm_a.rr.1900_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 1900 (1900 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_1900_reporting_threshold,
-              { "1900 Reporting Threshold", "gsm_a.rr.1900_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 1900 (1900 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_850_reporting_offset,
-              { "850 Reporting Offset", "gsm_a.rr.850_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 850 (850 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_850_reporting_threshold,
-              { "850 Reporting Threshold", "gsm_a.rr.900_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 850 (850 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_network_control_order,
-              { "Network Control Order", "gsm_a.rr.network_control_order",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_network_control_order_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nc_non_drx_period,
-              { "NC Non DRX Period", "gsm_a.rr.nc_non_drx_period",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nc_non_drx_period_vals), 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nc_reporting_period_i,
-              { "NC Reporting Period I", "gsm_a.rr.nc_reporting_period_i",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nc_reporting_period_x_vals), 0x00,
-		"NC Reporting Period in Packet Idle mode (NC Reporting Period I)", HFILL }
-            },
-            { &hf_gsm_a_rr_nc_reporting_period_t,
-              { "NC Reporting Period T", "gsm_a.rr.nc_reporting_period_t",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nc_reporting_period_x_vals), 0x00,
-		"NC Reporting Period in Packet Transfer mode (NC Reporting Period T)", HFILL }
-            },
-            { &hf_gsm_a_rr_index_start_3g,
-              { "Index Start 3G", "gsm_a.rr.index_start_3g",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_absolute_index_start_emr,
-              { "Absolute Index Start EMR", "gsm_a.rr.absolute_index_start_emr",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_qsearch_c_initial,
-              { "QSearch C Initial", "gsm_a.rr.qsearch_c_initial",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_qsearch_c_initial_value), 0x0,
-		"Qsearch value to be used in connected mode before Qsearch C is received (QSearch C Initial)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_rep_quant,
-              { "FDD Rep Quant", "gsm_a.rr.fdd_rep_quant",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_fdd_rep_quant_value), 0x0,
-		"FDD Reporting Quantity (FDD Rep Quant)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_multirat_reporting,
-              { "FDD Multirat Reporting", "gsm_a.rr.fdd_multirat_reporting",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		"Number of cells from the FDD access technology that shall be included in the list of strongest cells or in the measurement report (FDD Multirat Reporting)", HFILL }
-            },
-            { &hf_gsm_a_rr_tdd_multirat_reporting,
-              { "TDD Multirat Reporting", "gsm_a.rr.tdd_multirat_reporting",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		"Number of cells from the TDD access technology that shall be included in the list of strongest cells or in the measurement report (TDD Multirat Reporting)", HFILL }
-            },
-            { &hf_gsm_a_rr_qsearch_p,
-              { "Qsearch P", "gsm_a.rr.qsearch_p",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_qsearch_x_vals), 0x00,
-		"Search for 3G cells if signal level below threshold (Qsearch P)", HFILL }
-            },
-            { &hf_gsm_a_rr_3g_search_prio,
-              { "3G Search Prio", "gsm_a.rr.3g_search_prio",
-		FT_BOOLEAN, BASE_NONE,  TFS(&gsm_a_rr_3g_search_prio_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_reporting_offset,
-              { "FDD Reporting Offset", "gsm_a.rr.fdd_reporting_offset",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for FDD access technology (FDD Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_reporting_threshold,
-              { "FDD Reporting Threshold", "gsm_a.rr.fdd_reporting_threshold",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for FDD access technology (FDD Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_tdd_reporting_offset,
-              { "TDD Reporting Offset", "gsm_a.rr.tdd_reporting_offset",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for TDD access technology (TDD Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_tdd_reporting_threshold,
-              { "TDD Reporting Threshold", "gsm_a.rr.tdd_reporting_threshold",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for TDD access technology (TDD Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_fdd_reporting_threshold_2,
-              { "FDD Reporting Threshold 2", "gsm_a.rr.fdd_reporting_threshold_2",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"Reporting threshold for the CPICH parameter (Ec/No or RSCP) that is not reported according to FDD_REP_QUANT (FDD Reporting Threshold 2)", HFILL }
-            },
-            { &hf_gsm_a_rr_3g_ccn_active,
-              { "3G CCN Active", "gsm_a.rr.3g_ccn_active",
-		FT_BOOLEAN, BASE_NONE,  TFS(&gsm_a_rr_3g_ccn_active_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_700_reporting_offset,
-              { "700 Reporting Offset", "gsm_a.rr.700_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 700 (700 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_700_reporting_threshold,
-              { "700 Reporting Threshold", "gsm_a.rr.700_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 700 (700 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_810_reporting_offset,
-              { "810 Reporting Offset", "gsm_a.rr.810_reporting_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_offset_vals), 0x00,
-		"Offset to the reported value when prioritising the cells for reporting for GSM frequency band 810 (810 Reporting Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_810_reporting_threshold,
-              { "810 Reporting Threshold", "gsm_a.rr.810_reporting_threshold",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_xxx_reporting_threshold_vals), 0x00,
-		"Apply priority reporting if the reported value is above threshold for GSM frequency band 810 (810 Reporting Threshold)", HFILL }
-            },
-            { &hf_gsm_a_rr_cbq,
-              { "CBQ", "gsm_a.rr.cbq",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		"Cell Bar Qualify", HFILL }
-            },
-            { &hf_gsm_a_rr_cell_reselect_offset,
-              { "Cell Reselect Offset", "gsm_a.rr.cell_reselect_offset",
-		FT_UINT8, BASE_DEC,  VALS(gsm_a_rr_cell_reselect_offset_vals), 0x00,
-		"Offset to the C2 reselection criterion (Cell Reselect Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_temporary_offset,
-              { "Temporary Offset", "gsm_a.rr.temporary_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_temporary_offset_vals), 0x0,
-		"Negative offset to C2 for the duration of Penalty Time (Temporary Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_penalty_time,
-              { "Penalty Time", "gsm_a.rr.penalty_time",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_penalty_time_vals), 0x0,
-		"Duration for which the temporary offset is applied (Penalty Time)", HFILL }
-            },
-            { &hf_gsm_a_rr_si13_position,
-              { "SI13 Position", "gsm_a.rr.si13_position",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si13_position_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_power_offset,
-              { "Power Offset", "gsm_a.rr.power_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_power_offset_vals), 0x0,
-		"Power offset used in conjunction with the MS TXPWR MAX CCH parameter by the class 3 DCS 1800 MS (Power Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_si2quater_position,
-              { "SI2quater Position", "gsm_a.rr.si2quater_position",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_si2quater_position_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si13alt_position,
-              { "SI13alt Position", "gsm_a.rr.si13alt_position",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_si13alt_position_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_prio_thr,
-              { "Prio Thr", "gsm_a.rr.prio_thr",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_prio_thr_vals), 0x0,
-		"Prio signal strength threshold is related to RXLEV ACCESS_MIN (Prio Thr)", HFILL }
-            },
-            { &hf_gsm_a_rr_lsa_offset,
-              { "LSA Offset", "gsm_a.rr.lsa_offset",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_lsa_offset_vals), 0x0,
-		"Offset to be used for LSA cell re selection between cells with the same LSA priorities (LSA Offset)", HFILL }
-            },
-            { &hf_gsm_a_rr_paging_channel_restructuring,
-              { "Paging Channel Restructuring", "gsm_a.rr.paging_channel_restructuring",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_paging_channel_restructuring_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nln_sacch,
-              { "NLN (SACCH)", "gsm_a.rr.nln_sacch",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nln_status_sacch,
-              { "NLN Status (SACCH)", "gsm_a.rr.nln_status_sacch",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nln_pch,
-              { "NLN (PCH)", "gsm_a.rr.nln_pch",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nln_status_pch,
-              { "NLN Status (PCH)", "gsm_a.rr.nln_status_pch",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_vbs_vgcs_inband_notifications,
-              { "Inband Notifications", "gsm_a.rr.vbs_vgcs_inband_notifications",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_vbs_vgcs_inband_notifications_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_vbs_vgcs_inband_pagings,
-              { "Inband Pagings", "gsm_a.rr.vbs_vgcs_inband_pagings",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_vbs_vgcs_inband_pagings_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_rac,
-              { "RAC", "gsm_a.rr.rac",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Routeing Area Code", HFILL }
-            },
-            { &hf_gsm_a_rr_max_lapdm,
-              { "Max LAPDm", "gsm_a.rr.max_lapdm",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_max_lapdm_vals), 0x0,
-		"Maximum number of LAPDm frames on which a layer 3 can be segmented into and be sent on the main DCCH (Max LAPDm)", HFILL }
-            },
-            { &hf_gsm_a_rr_gprs_ms_txpwr_max_ccch,
-              { "GPRS MS TxPwr Max CCH", "gsm_a.rr.gprs_ms_txpwr_max_cch",
-		FT_UINT8, BASE_DEC,  NULL, 0x00,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_dedicated_mode_mbms_notification_support,
-              { "Dedicated Mode MBMS Notification Support", "gsm_a.rr.dedicated_mode_mbms_notification_support",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dedicated_mode_mbms_notification_support_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_mnci_support,
-              { "MNCI Support", "gsm_a.rr.mnci_support",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_mnci_support_value), 0x0,
-		"MBMS Neighbouring Cell Information Support (MNCI Support)", HFILL }
-            },
-            { &hf_gsm_a_rr_amr_config,
-              { "AMR Configuration", "gsm_a.rr.amr_config",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_bcch_change_mark,
-              { "BCCH Change Mark", "gsm_a.rr.bcch_change_mark",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si_change_field,
-              { "SI Change Field", "gsm_a.rr.si_change_field",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si_change_field_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_si13_change_mark,
-              { "SI13 Change Mark", "gsm_a.rr.si13_change_mark",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_hsn,
-              { "HSN", "gsm_a.rr.hsn",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Hopping Sequence Number (HSN)", HFILL }
-            },
-            { &hf_gsm_a_rr_rfl_number,
-              { "RFL Number", "gsm_a.rr.rfl_number",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Radio Frequency List Number (RFL Number)", HFILL }
-            },
-            { &hf_gsm_a_rr_arfcn_index,
-              { "ARFCN Index", "gsm_a.rr.arfcn_index",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ma_length,
-              { "MA Length", "gsm_a.rr.ma_length",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Mobile Allocation Length (MA Length)", HFILL }
-            },
-            { &hf_gsm_a_rr_psi1_repeat_period,
-              { "PSI1 Repeat Period", "gsm_a.rr.psi1_repeat_period",
-		FT_UINT8, BASE_DEC, VALS(&gsm_a_rr_psi1_repeat_period_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pbcch_pb,
-              { "Pb", "gsm_a.rr.pbcch_pb",
-		FT_UINT8, BASE_DEC, VALS(&gsm_a_rr_pbcch_pb_vals), 0x0,
-		"Power reduction on PBCCH/PCCCH (Pb)", HFILL }
-            },
-            { &hf_gsm_a_rr_pbcch_tsc,
-              { "TSC", "gsm_a.rr.pbcch_tsc",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Training Sequence Code for PBCCH (TSC)", HFILL }
-            },
-            { &hf_gsm_a_rr_pbcch_tn,
-              { "TN", "gsm_a.rr.pbcch_tn",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Timeslot Number for PCCH (TN)", HFILL }
-            },
-            { &hf_gsm_a_rr_spgc_ccch_sup,
-              { "SPGC CCCH Sup", "gsm_a.rr.spgc_ccch_sup",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_spgc_ccch_sup_value), 0x0,
-		"Split PG Cycle Code on CCCH Support (SPGC CCCH Sup)", HFILL }
-            },
-            { &hf_gsm_a_rr_priority_access_thr,
-              { "Priority Access Thr", "gsm_a.rr.priority_access_thr",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_priority_access_thr_vals), 0x0,
-		"Priority Access Threshold for packet access (Priority Access Thr)", HFILL }
-            },
-            { &hf_gsm_a_rr_nmo,
-              { "NMO", "gsm_a.rr.nmo",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_nmo_vals), 0x0,
-		"Network mode of Operation (NMO)", HFILL }
-            },
-            { &hf_gsm_a_rr_t3168,
-              { "T3168", "gsm_a.rr.t3168",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t3168_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_t3192,
-              { "T3192", "gsm_a.rr.t3192",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t3192_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_drx_timer_max,
-              { "DRX Timer Max", "gsm_a.rr.drx_timer_max",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_drx_timer_max_vals), 0x0,
-		"Discontinuous Reception Timer Max (DRX Timer Max)", HFILL }
-            },
-            { &hf_gsm_a_rr_access_burst_type,
-              { "Access Burst Type", "gsm_a.rr.access_burst_type",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_access_burst_type_value), 0x0,
-		"Format used in the PACKET CHANNEL REQUEST message, the PS HANDOVER ACCESS message, the PTCCH uplink block and in the PACKET CONTROL ACKNOWLEDGMENT message (Access Burst Type)", HFILL }
-            },
-            { &hf_gsm_a_rr_control_ack_type,
-              { "Control Ack Type", "gsm_a.rr.control_ack_type",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_control_ack_type_value), 0x0,
-		"Default format of the PACKET CONTROL ACKNOWLEDGMENT message (Control Ack Type)", HFILL }
-            },
-            { &hf_gsm_a_rr_bs_cv_max,
-              { "BS CV Max", "gsm_a.rr.bs_cv_max",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		"Base Station Countdown Value Maximum (BS CV Max)", HFILL }
-            },
-            { &hf_gsm_a_rr_pan_dec,
-              { "PAN Dec", "gsm_a.rr.pan_dec",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pan_inc,
-              { "PAN Inc", "gsm_a.rr.pan_inc",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pan_max,
-              { "PAN Max", "gsm_a.rr.pan_max",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_pan_max_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_egprs_packet_channel_request,
-              { "EGPRS Packet Channel Request", "gsm_a.rr.egprs_packet_channel_request",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_egprs_packet_channel_request_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_bep_period,
-              { "BEP Period", "gsm_a.rr.bep_period",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_bep_period_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_pfc_feature_mode,
-              { "PFC Feature Mode", "gsm_a.rr.pfc_feature_mode",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_pfc_feature_mode_value), 0x0,
-		"Packet Flow Context Feature Mode (PFC Feature Mode)", HFILL }
-            },
-            { &hf_gsm_a_rr_dtm_support,
-              { "DTM Support", "gsm_a.rr.dtm_support",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dtm_support_value), 0x0,
-		"Dual Transfer Mode Support (DTM Support)", HFILL }
-            },
-            { &hf_gsm_a_rr_bss_paging_coordination,
-              { "BSS Paging Coordination", "gsm_a.rr.bss_paging_coordination",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_bss_paging_coordination_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ccn_active,
-              { "CCN Active", "gsm_a.rr.ccn_active",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_ccn_active_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_nw_ext_utbf,
-              { "NW Ext UTBF", "gsm_a.rr.nw_ext_utbf",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_nw_ext_utbf_value), 0x0,
-		"Network Extended Uplink TBF (NW Ext UTBF)", HFILL }
-            },
-            { &hf_gsm_a_rr_multiple_tbf_capability,
-              { "Multiple TBF Capability", "gsm_a.rr.multiple_tbf_capability",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_multiple_tbf_capability_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_ext_utbf_no_data,
-              { "Ext UTBF No Data", "gsm_a.rr.ext_utbf_no_data",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_ext_utbf_no_data_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_dtm_enhancements_capability,
-              { "DTM Enhancements Capability", "gsm_a.rr.dtm_enhancements_capability",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_dtm_enhancements_capability_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_reduced_latency_access,
-              { "Reduced Latency Access", "gsm_a.rr.reduced_latency_access",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_reduced_latency_access_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_alpha,
-              { "Alpha", "gsm_a.rr.alpha",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_alpha_vals), 0x0,
-		"Alpha parameter for GPR MS output power control (Alpha)", HFILL }
-            },
-            { &hf_gsm_a_rr_t_avg_w,
-              { "T Avg W", "gsm_a.rr.t_avg_w",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t_avg_x_vals), 0x0,
-		"Signal strength filter period for power control in packet idle mode", HFILL }
-            },
-            { &hf_gsm_a_rr_t_avg_t,
-              { "T Avg T", "gsm_a.rr.t_avg_t",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_t_avg_x_vals), 0x0,
-		"Signal strength filter period for power control in packet transfer mode", HFILL }
-            },
-            { &hf_gsm_a_rr_pc_meas_chan,
-              { "PC Meas Chan", "gsm_a.rr.pc_meas_chan",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_pc_meas_chan_value), 0x0,
-		"Channel used to measure the received power level on the downlink for the purpose of the uplink power control (PC Meas Chan)", HFILL }
-            },
-            { &hf_gsm_a_rr_n_avg_i,
-              { "N Avg I", "gsm_a.rr.n_avg_i",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_n_avg_i_vals), 0x0,
-		"Interfering signal strength filter constant for power control (N Avg I)", HFILL }
-            },
-            { &hf_gsm_a_rr_sgsnr,
-              { "SGSNR", "gsm_a.rr.sgsnr",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_sgsnr_value), 0x0,
-		"SGSN Release (SGSNR)", HFILL }
-            },
-            { &hf_gsm_a_rr_si_status_ind,
-              { "SI Status Ind", "gsm_a.rr.si_status_ind",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_si_status_ind_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_lb_ms_txpwr_max_cch,
-              { "LB MS TxPwr Max CCCH", "gsm_a.rr.n_avg_i",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_n_avg_i_vals), 0x0,
-		"Maximum TX power level an MS is allowed to use on all other than DCS 1800 and PCS 1900 frequency bands when accessing the system until otherwise commanded (LB MS TxPwr Max CCCH)", HFILL }
-            },
-            { &hf_gsm_a_rr_si2n_support,
-              { "SI2n Support", "gsm_a.rr.si2n_support",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_si2n_support_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_mi_index,
-              { "Measurement Information Index", "gsm_a.rr.mi_index",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_mi_count,
-              { "Measurement Information Count", "gsm_a.rr.mi_count",
-		FT_UINT8, BASE_DEC, NULL, 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_3g_wait,
-              { "3G Wait", "gsm_a.rr.3g_wait",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_3g_wait_vals), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_qsearch_c,
-              { "Qsearch C", "gsm_a.rr.qsearch_c",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_qsearch_x_vals), 0x00,
-		"Search for 3G cells if signal level is below (0 7) or above (8 15) threshold (Qsearch C)", HFILL }
-            },
-            { &hf_gsm_a_rr_bsic_seen,
-              { "BSIC Seen", "gsm_a.rr.bsic_seen",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_bsic_seen_value), 0x0,
-		NULL, HFILL }
-            },
-            { &hf_gsm_a_rr_scale,
-              { "Scale", "gsm_a.rr.scale",
-		FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_rr_scale_value), 0x0,
-		"Offset applied for the reported RXLEV values (Scale)", HFILL }
-            },
-            { &hf_gsm_a_rr_mean_bep_gmsk,
-              { "Mean BEP GMSK", "gsm_a.rr.mean_bep_gmsk",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_mean_bep_gmsk_vals), 0x00,
-		"Mean Bit Error Probability in GMSK (Mean BEP GMSK)", HFILL }
-            },
-            { &hf_gsm_a_rr_mean_cv_bep,
-              { "CV BEP", "gsm_a.rr.cv_bep",
-		FT_UINT8, BASE_DEC, VALS(gsm_a_rr_cv_bep_vals), 0x00,
-		"Coefficient of Variation of the Bit Error Probability (CV BEP)", HFILL }
-            },
-            { &hf_gsm_a_rr_nbr_rcvd_blocks,
-              { "Nb Rcvd Blocks", "gsm_a.rr.nbr_rcvd_blocks",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		"Number of correctly decoded blocks that were completed during the measurement report period (Nb Rcvd Blocks)", HFILL }
-            },
-            { &hf_gsm_a_rr_reporting_quantity,
-              { "Reporting Quantity", "gsm_a.rr.reporting_quantity",
-		FT_UINT8, BASE_DEC, NULL, 0x00,
-		NULL, HFILL }
-            }
-	};
-
-    static hf_register_info hf_sacch[] =
-	{
-            { &hf_gsm_a_sacch_msg_rr_type,
-              { "SACCH Radio Resources Management Message Type",	"gsm_a.sacch_msg_rr_type",
-		FT_UINT8, BASE_HEX, VALS(gsm_a_sacch_msg_rr_strings), 0x0,
-		NULL, HFILL }
-            }
-	};
-
-	/* Setup protocol subtree array */
-#define	NUM_INDIVIDUAL_ELEMS	3
-    static gint *ett[NUM_INDIVIDUAL_ELEMS +
-                     NUM_GSM_DTAP_MSG_RR +
-                     NUM_GSM_RR_ELEM +
-                     NUM_GSM_RR_REST_OCTETS_ELEM +
-                     NUM_GSM_SACCH_MSG_RR];
-
-    ett[0] = &ett_ccch_msg;
-    ett[1] = &ett_ccch_oct_1;
-    ett[2] = &ett_sacch_msg;
-
-    last_offset = NUM_INDIVIDUAL_ELEMS;
-
-    for (i=0; i < NUM_GSM_DTAP_MSG_RR; i++, last_offset++)
-    {
-        ett_gsm_dtap_msg_rr[i] = -1;
-        ett[last_offset] = &ett_gsm_dtap_msg_rr[i];
-    }
-
-    for (i=0; i < NUM_GSM_RR_ELEM; i++, last_offset++)
-    {
-        ett_gsm_rr_elem[i] = -1;
-        ett[last_offset] = &ett_gsm_rr_elem[i];
-    }
-
-    for (i=0; i < NUM_GSM_RR_REST_OCTETS_ELEM; i++, last_offset++)
-    {
-        ett_gsm_rr_rest_octets_elem[i] = -1;
-        ett[last_offset] = &ett_gsm_rr_rest_octets_elem[i];
-    }
-
-    for (i=0; i < NUM_GSM_SACCH_MSG_RR; i++, last_offset++)
-    {
-        ett_gsm_sacch_msg_rr[i] = -1;
-        ett[last_offset] = &ett_gsm_sacch_msg_rr[i];
-    }
-
-    /* Register the protocol name and description */
-    proto_a_ccch =
-        proto_register_protocol("GSM CCCH", "GSM CCCH", "gsm_a_ccch");
-
-    proto_register_field_array(proto_a_ccch, hf, array_length(hf));
-
-    /* subdissector code */
-    register_dissector("gsm_a_ccch", dissect_ccch, proto_a_ccch);
-
-    /* Register the protocol name and description */
-    proto_a_sacch =
-        proto_register_protocol("GSM SACCH", "GSM SACCH", "gsm_a_sacch");
-
-    proto_register_field_array(proto_a_sacch, hf_sacch, array_length(hf_sacch));
-
-    /* subdissector code */
-    register_dissector("gsm_a_sacch", dissect_sacch, proto_a_sacch);
-
-    /* subtree array (for both sub-dissectors) */
-    proto_register_subtree_array(ett, array_length(ett));
-}
-
-void
-proto_reg_handoff_gsm_a_rr(void)
-{
-    data_handle = find_dissector("data");
-    rrc_irat_ho_info_handle = find_dissector("rrc.irat.irat_ho_info");
-    rrc_irat_ho_to_utran_cmd_handle = find_dissector("rrc.irat.ho_to_utran_cmd");
-    rrlp_dissector = find_dissector("rrlp");
-}
