Fix various typos and spelling errors.
[obnox/wireshark/wip.git] / epan / dissectors / packet-rsl.c
1 /* packet-rsl.c
2  * Routines for Radio Signalling Link (RSL) dissection.
3  *
4  * Copyright 2007, Anders Broman <anders.broman@ericsson.com>
5  *
6  * $Id$
7  *
8  * Wireshark - Network traffic analyzer
9  * By Gerald Combs <gerald@wireshark.org>
10  * Copyright 1998 Gerald Combs
11  *
12  * Copied from packet-cops.c
13  *
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27  *
28  * REF: 3GPP TS 48.058 version 6.1.0 Release 6
29  * http://www.3gpp.org/ftp/Specs/html-info/48058.htm
30  *
31  */
32
33 #ifdef HAVE_CONFIG_H
34 # include "config.h"
35 #endif
36
37 #include <stdlib.h>
38 #include <ctype.h>
39
40 #include <epan/packet.h>
41 #include <epan/proto.h>
42 #include <epan/lapd_sapi.h>
43
44 #include "packet-gsm_a_common.h"
45
46 /* Initialize the protocol and registered fields */
47 static int proto_rsl            = -1;
48
49 static int hf_rsl_msg_type                      = -1;
50 static int hf_rsl_T_bit                         = -1;
51 static int hf_rsl_msg_dsc                       = -1;
52 static int hf_rsl_ie_id                         = -1;
53 static int hf_rsl_ie_length                     = -1;
54 static int hf_rsl_ch_no_Cbits           = -1;
55 static int hf_rsl_ch_no_TN                      = -1;
56 static int hf_rsl_acc_delay                     = -1;
57 static int hf_rsl_rach_slot_cnt         = -1;
58 static int hf_rsl_rach_busy_cnt         = -1;
59 static int hf_rsl_rach_acc_cnt          = -1;
60 static int hf_rsl_req_ref_ra            = -1;
61 static int hf_rsl_req_ref_T1prim        = -1;
62 static int hf_rsl_req_ref_T3            = -1;
63 static int hf_rsl_req_ref_T2            = -1;
64 static int hf_rsl_timing_adv            = -1;
65 static int hf_rsl_ho_ref                        = -1;
66 static int hf_rsl_l1inf_power_lev               = -1;
67 static int hf_rsl_l1inf_fpc                     = -1;
68 static int hf_rsl_ms_power_lev          = -1;
69 static int hf_rsl_ms_fpc                        = -1;
70 static int hf_rsl_act_timing_adv        = -1;
71 static int hf_rsl_phy_ctx                       = -1;
72 static int hf_rsl_na                            = -1;
73 static int hf_rsl_ch_type                       = -1;
74 static int hf_rsl_prio                          = -1;
75 static int hf_rsl_sapi                          = -1;
76 static int hf_rsl_rbit                          = -1;
77 static int hf_rsl_a3a2                          = -1;
78 static int hf_rsl_a1_0                          = -1;
79 static int hf_rsl_a1_1                          = -1;
80 static int hf_rsl_a1_2                          = -1;
81 static int hf_rsl_epc_mode                      = -1;
82 static int hf_rsl_bs_fpc_epc_mode       = -1;
83 static int hf_rsl_bs_power                      = -1;
84 static int hf_rsl_cm_dtxd                       = -1;
85 static int hf_rsl_cm_dtxu                       = -1;
86 static int hf_rsl_speech_or_data        = -1;
87 static int hf_rsl_ch_rate_and_type      = -1;
88 static int hf_rsl_speech_coding_alg = -1;
89 static int hf_rsl_t_nt_bit                      = -1;
90 static int hf_rsl_ra_if_data_rte        = -1;
91 static int hf_rsl_data_rte                      = -1;
92 static int hf_rsl_alg_id                        = -1;
93 static int hf_rsl_key                           = -1;
94 static int hf_rsl_cause                         = -1;
95 static int hf_rsl_rel_mode                      = -1;
96 static int hf_rsl_interf_band           = -1;
97 static int hf_rsl_meas_res_no           = -1;
98 static int hf_rsl_extension_bit         = -1;
99 static int hf_rsl_dtxd                          = -1;
100 static int hf_rsl_rxlev_full_up         = -1;
101 static int hf_rsl_rxlev_sub_up          = -1;
102 static int hf_rsl_rxqual_full_up        = -1;
103 static int hf_rsl_rxqual_sub_up         = -1;
104 static int hf_rsl_class                         = -1;
105 static int hf_rsl_paging_grp            = -1;
106 static int hf_rsl_paging_load           = -1;
107 static int hf_rsl_sys_info_type         = -1;
108 static int hf_rsl_timing_offset         = -1;
109 static int hf_rsl_ch_needed                     = -1;
110 static int hf_rsl_cbch_load_type        = -1;
111 static int hf_rsl_msg_slt_cnt           = -1;
112 static int hf_rsl_ch_ind                        = -1;
113 static int hf_rsl_command                       = -1;
114 static int hf_rsl_emlpp_prio            = -1;
115 static int hf_rsl_rtd                           = -1;
116 static int hf_rsl_delay_ind                     = -1;
117 static int hf_rsl_tfo                           = -1;
118
119 /* Initialize the subtree pointers */
120 static int ett_rsl = -1;
121 static int ett_ie_link_id = -1;
122 static int ett_ie_act_type = -1;
123 static int ett_ie_bs_power = -1;
124 static int ett_ie_ch_id = -1;
125 static int ett_ie_ch_mode = -1;
126 static int ett_ie_enc_inf = -1;
127 static int ett_ie_ch_no = -1;
128 static int ett_ie_frame_no = -1;
129 static int ett_ie_ho_ref = -1;
130 static int ett_ie_l1_inf = -1;
131 static int ett_ie_L3_inf = -1;
132 static int ett_ie_ms_id = -1;
133 static int ett_ie_ms_pow = -1;
134 static int ett_ie_phy_ctx = -1;
135 static int ett_ie_paging_grp = -1;
136 static int ett_ie_paging_load = -1;
137 static int ett_ie_access_delay = -1;
138 static int ett_ie_rach_load = -1;
139 static int ett_ie_req_ref = -1;
140 static int ett_ie_rel_mode = -1;
141 static int ett_ie_resource_inf = -1;
142 static int ett_ie_rlm_cause     =-1;
143 static int ett_ie_staring_time = -1;
144 static int ett_ie_timing_adv = -1;
145 static int ett_ie_uplink_meas = -1;
146 static int ett_ie_full_imm_ass_inf = -1;
147 static int ett_ie_smscb_inf = -1;
148 static int ett_ie_ms_timing_offset = -1;
149 static int ett_ie_err_msg = -1;
150 static int ett_ie_full_bcch_inf = -1;
151 static int ett_ie_ch_needed = -1;
152 static int ett_ie_cb_cmd_type = -1;
153 static int ett_ie_smscb_mess = -1;
154 static int ett_ie_cbch_load_inf = -1;
155 static int ett_ie_smscb_ch_ind = -1;
156 static int ett_ie_grp_call_ref = -1;
157 static int ett_ie_ch_desc = -1;
158 static int ett_ie_nch_drx = -1;
159 static int ett_ie_cmd_ind = -1;
160 static int ett_ie_emlpp_prio = -1;
161 static int ett_ie_uic = -1;
162 static int ett_ie_main_ch_ref = -1;
163 static int ett_ie_multirate_conf = -1;
164 static int ett_ie_multirate_cntrl = -1;
165 static int ett_ie_sup_codec_types = -1;
166 static int ett_ie_codec_conf = -1;
167 static int ett_ie_rtd = -1;
168 static int ett_ie_tfo_status = -1;
169 static int ett_ie_llp_apdu = -1;
170 static int ett_ie_tfo_transp_cont = -1;
171 static int ett_ie_cause = -1;
172 static int ett_ie_meas_res_no = -1;
173 static int ett_ie_message_id = -1;
174 static int ett_ie_sys_info_type = -1;
175
176 static proto_tree *top_tree;
177 static dissector_handle_t gsm_a_ccch_handle;
178 static dissector_handle_t gsm_a_dtap_handle;
179
180 static gboolean is_si2q = FALSE;
181
182 /* Forward declarations */
183 static int dissct_rsl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset);
184
185 static const true_false_string rsl_t_bit_vals = {
186   "Considered transparent by BTS",
187   "Not considered transparent by BTS"
188 };
189
190 static const true_false_string rsl_na_vals = {
191   "Not Applicable",
192   "Applicable"
193 };
194
195 static const true_false_string rsl_extension_bit_value = {
196   "Extension",
197   "No Extension"
198 };
199
200 /*
201  * 9.1 Message discriminator
202  */
203 static const value_string rsl_msg_disc_vals[] = {
204         {  0x00,                "Reserved" },
205         {  0x01,                "Radio Link Layer Management messages" },
206         {  0x04,                "Dedicated Channel Management messages" },
207         {  0x06,                "Common Channel Management messages" },
208         {  0x08,                "TRX Management messages" },
209         {  0x16,                "Location Services messages" },
210         { 0,                    NULL }
211 };
212 /*
213  * 9.2 MESSAGE TYPE
214  */
215 #define RSL_MSG_TYPE_DATA_REQ           1
216 #define RSL_MSG_TYPE_DATA_IND           2
217 #define RSL_MSG_TYPE_ERROR_IND          3
218 #define RSL_MSG_TYPE_EST_REQ            4
219 #define RSL_MSG_TYPE_EST_CONF           5
220 #define RSL_MSG_EST_IND                         6
221 #define RSL_MSG_REL_REQ                         7
222 #define RSL_MSG_REL_CONF                        8
223 #define RSL_MSG_REL_IND                         9
224 #define RSL_MSG_UNIT_DATA_REQ           10
225 /* Common Channel Management/TRX Management messages */
226 #define RSL_MSG_BCCH_INFO                       17
227 #define RSL_MSG_CCCH_LOAD_IND           18
228 #define RSL_MSG_CHANRQD                         19
229 #define RSL_MSG_DELETE_IND                      20
230 #define RSL_MSG_PAGING_CMD                      21
231 #define RSL_MSG_IMM_ASS_CMD                     22
232 #define RSL_MSG_SMS_BC_REQ                      23      /* 8.5.7 */
233 #define RSL_MSG_RF_RES_IND                      25      /* 8.6.1 */
234 #define RSL_MSG_SACCH_FILL                      26      /* 8.6.2 */
235
236 #define RSL_MSG_OVERLOAD                        27      /* 8.6.3 */
237 #define RSL_MSG_ERROR_REPORT            28      /* 8.6.4 */
238 #define RSL_MSG_SMS_BC_CMD                      29      /* 8.5.8 */
239 #define RSL_MSG_CBCH_LOAD_IND           30      /* 8.5.9 */
240 #define RSL_MSG_NOT_CMD                         31      /* 8.5.10 */
241
242 /* 0 0 1 - - - - - Dedicated Channel Management messages: */
243 #define RSL_MSG_CHAN_ACTIV                      33
244 #define RSL_MSG_CHAN_ACTIV_ACK          34
245 #define RSL_MSG_CHAN_ACTIV_N_ACK        35
246 #define RSL_MSG_CONN_FAIL                       36
247 #define RSL_MSG_DEACTIVATE_SACCH        37
248
249 #define RSL_MSG_ENCR_CMD                                38      /* 8.4.6 */
250 #define RSL_MSG_HANDODET                                39      /* 8.4.7 */
251 #define RSL_MSG_MEAS_RES                                40      /* 8.4.8 */
252 #define RSL_MSG_MODE_MODIFY_REQ                 41      /* 8.4.9 */
253 #define RSL_MSG_MODE_MODIFY_ACK                 42      /* 8.4.10 */
254 #define RSL_MSG_MODE_MODIFY_NACK                43      /* 8.4.11 */
255 #define RSL_MSG_PHY_CONTEXT_REQ                 44      /* 8.4.12 */
256 #define RSL_MSG_PHY_CONTEXT_CONF                45      /* 8.4.13 */
257 #define RSL_MSG_RF_CHAN_REL                             46      /* 8.4.14 */
258 #define RSL_MSG_MS_POWER_CONTROL                47      /* 8.4.15 */
259 #define RSL_MSG_BS_POWER_CONTROL                48      /* 8.4.16 */
260 #define RSL_MSG_PREPROC_CONFIG                  49      /* 8.4.17 */
261 #define RSL_MSG_PREPROC_MEAS_RES                50      /* 8.4.18 */
262 #define RSL_MSG_RF_CHAN_REL_ACK                 51      /* 8.4.19 */
263 #define RSL_MSG_SACCH_INFO_MODIFY               52      /* 8.4.20 */
264 #define RSL_MSG_TALKER_DET                              53      /* 8.4.21 */
265 #define RSL_MSG_LISTENER_DET                    54      /* 8.4.22 */
266 #define RSL_MSG_REMOTE_CODEC_CONF_REP   55      /* 8.4.23 */
267 #define RSL_MSG_R_T_D_REP                               56      /* 8.4.24 */
268 #define RSL_MSG_PRE_HANDO_NOTIF                 57      /* 8.4.25 */
269 #define RSL_MSG_MR_CODEC_MOD_REQ                58      /* 8.4.26 */
270 #define RSL_MSG_MR_CODEC_MOD_ACK                59      /* 8.4.27 */
271 #define RSL_MSG_MR_CODEC_MOD_NACK               60      /* 8.4.28 */
272 #define RSL_MSG_MR_CODEC_MOD_PER                61      /* 8.4.29 */
273 #define RSL_MSG_TFO_REP                                 62      /* 8.4.30 */
274 #define RSL_MSG_TFO_MOD_REQ                             63      /* 8.4.31 */
275         /*      0 1 - - - - - - Location Services messages: */
276 #define RSL_MSG_LOC_INF                                 65      /* 8.7.1 */
277
278
279 static const value_string rsl_msg_type_vals[] = {
280           /*    0 0 0 0 - - - - Radio Link Layer Management messages: */
281         {  0x01,        "DATA REQuest" },                                                               /* 8.3.1 */
282         {  0x02,        "DATA INDication" },                                                    /* 8.3.2 */
283         {  0x03,        "ERROR INDication" },                                                   /* 8.3.3 */
284         {  0x04,        "ESTablish REQuest" },                                                  /* 8.3.4 */
285         {  0x05,        "ESTablish CONFirm" },                                                  /* 8.3.5 */
286         {  0x06,        "ESTablish INDication" },                                               /* 8.3.6 */
287         {  0x07,        "RELease REQuest" },                                                    /* 8.3.7 */
288         {  0x08,        "RELease CONFirm" },                                                    /* 8.3.8 */
289         {  0x09,        "RELease INDication" },                                                 /* 8.3.9 */
290         {  0x0a,        "UNIT DATA REQuest" },                                                  /* 8.3.10 */
291         /* 0 0 0 1 - - - - Common Channel Management/TRX Management messages: */
292         {  0x11,        "BCCH INFOrmation" },                                                   /* 8.5.1 */
293         {  0x12,        "CCCH LOAD INDication" },                                               /* 8.5.2 */
294         {  0x13,        "CHANnel ReQuireD" },                                                   /* 8.5.3 */
295         {  0x14,        "DELETE INDication" },                                                  /* 8.5.4 */
296         {  0x15,        "PAGING CoMmanD" },                                                             /* 8.5.5 */
297         {  0x16,        "IMMEDIATE ASSIGN COMMAND" },                                   /* 8.5.6 */
298         {  0x17,        "SMS BroadCast REQuest" },                                              /* 8.5.7 */
299         {  0x19,        "RF RESource INDication" },                                             /* 8.6.1 */
300         {  0x1a,        "SACCH FILLing" },                                                              /* 8.6.2 */
301         {  0x1b,        "OVERLOAD" },                                                                   /* 8.6.3 */
302         {  0x1c,        "ERROR REPORT" },                                                               /* 8.6.4 */
303         {  0x1d,        "SMS BroadCast CoMmanD" },                                              /* 8.5.8 */
304         {  0x1e,        "CBCH LOAD INDication" },                                               /* 8.5.9 */
305         {  0x1f,        "NOTification CoMmanD" },                                               /* 8.5.10 */
306         /* 0 0 1 - - - - - Dedicated Channel Management messages: */
307         {  0x21,        "CHANnel ACTIVation" },                                                 /* 8.4.1 */
308         {  0x22,        "CHANnel ACTIVation ACKnowledge" },                             /* 8.4.2 */
309         {  0x23,        "CHANnel ACTIVation Negative ACK" },                    /* 8.4.3 */
310         {  0x24,        "CONNection FAILure" },                                                 /* 8.4.4 */
311         {  0x25,        "DEACTIVATE SACCH" },                                                   /* 8.4.5 */
312         {  0x26,        "ENCRyption CoMmanD" },                                                 /* 8.4.6 */
313         {  0x27,        "HANDOver DETection" },                                                 /* 8.4.7 */
314         {  0x28,        "MEASurement RESult" },                                                 /* 8.4.8 */
315         {  0x29,        "MODE MODIFY REQuest" },                                                /* 8.4.9 */
316         {  0x2a,        "MODE MODIFY ACKnowledge" },                                    /* 8.4.10 */
317         {  0x2b,        "MODE MODIFY Negative ACKnowledge" },                   /* 8.4.11 */
318         {  0x2c,        "PHYsical CONTEXT REQuest" },                                   /* 8.4.12 */
319         {  0x2d,        "PHYsical CONTEXT CONFirm" },                                   /* 8.4.13 */
320         {  0x2e,        "RF CHANnel RELease" },                                                 /* 8.4.14 */
321         {  0x2f,        "MS POWER CONTROL" },                                                   /* 8.4.15 */
322         {  0x30,        "BS POWER CONTROL" },                                                   /* 8.4.16 */
323         {  0x31,        "PREPROCess CONFIGure" },                                               /* 8.4.17 */
324         {  0x32,        "PREPROCessed MEASurement RESult" },                    /* 8.4.18 */
325         {  0x33,        "RF CHANnel RELease ACKnowledge" },                             /* 8.4.19 */
326         {  0x34,        "SACCH INFO MODIFY" },                                                  /* 8.4.20 */
327         {  0x35,        "TALKER DETection" },                                                   /* 8.4.21 */
328         {  0x36,        "LISTENER DETection" },                                                 /* 8.4.22 */
329         {  0x37,        "REMOTE CODEC CONFiguration REPort" },                  /* 8.4.23 */
330         {  0x38,        "Round Trip Delay REPort" },                                    /* 8.4.24 */
331         {  0x39,        "PRE-HANDOver NOTIFication" },                                  /* 8.4.25 */
332         {  0x3a,        "MultiRate CODEC MODification REQest" },                /* 8.4.26 */
333         {  0x3b,        "MultiRate CODEC MOD ACKnowledge" },                    /* 8.4.27 */
334         {  0x3c,        "MultiRate CODEC MOD Negative ACKnowledge" },   /* 8.4.28 */
335         {  0x3d,        "MultiRate CODEC MOD PERformed" },                              /* 8.4.29 */
336         {  0x3e,        "TFO REPort" },                                                                 /* 8.4.30 */
337         {  0x3f,        "TFO MODification REQuest" },                                   /* 8.4.31 */
338         /*      0 1 - - - - - - Location Services messages: */
339         {  0x41,        "Location Information" },                                               /* 8.7.1 */
340         { 0,            NULL }
341 };
342
343 #define RSL_IE_CH_NO                    1
344 #define RSL_IE_LINK_ID                  2
345 #define RSL_IE_ACT_TYPE                 3
346 #define RSL_IE_BS_POW                   4
347 #define RSL_IE_CH_ID                    5
348 #define RSL_IE_CH_MODE                  6
349 #define RSL_IE_ENC_INF                  7
350 #define RSL_IE_FRAME_NO                 8
351 #define RSL_IE_HO_REF                   9
352 #define RSL_IE_L1_INF                   10
353 #define RSL_IE_L3_INF                   11
354 #define RSL_IE_MS_ID                    12
355 #define RSL_IE_MS_POW                   13
356 #define RSL_IE_PAGING_GRP               14
357 #define RSL_IE_PAGING_LOAD              15
358 #define RSL_IE_PHY_CTX                  16
359 #define RSL_IE_ACCESS_DELAY             17
360 #define RSL_IE_RACH_LOAD                18
361 #define RSL_IE_REQ_REF                  19
362 #define RSL_IE_REL_MODE                 20
363 #define RSL_IE_RESOURCE_INF             21
364 #define RSL_IE_RLM_CAUSE                22
365 #define RSL_IE_STARTING_TIME    23
366 #define RSL_IE_TIMING_ADV               24
367 #define RSL_IE_UPLINK_MEAS              25
368 #define RSL_IE_CAUSE                    26
369 #define RSL_IE_MEAS_RES_NO              27
370 #define RSL_IE_MESSAGE_ID               28
371
372 #define RSL_IE_SYS_INFO_TYPE    30
373
374
375
376
377 #define RSL_IE_FULL_IMM_ASS_INF                 35
378 #define RSL_IE_SMSCB_INF                                36
379 #define RSL_IE_FULL_MS_TIMING_OFFSET    37
380 #define RSL_IE_ERR_MSG                                  38
381 #define RSL_IE_FULL_BCCH_INF                    39
382 #define RSL_IE_CH_NEEDED                                40
383 #define RSL_IE_CB_CMD_TYPE                              41
384 #define RSL_IE_SMSCB_MESS                               42
385 #define RSL_IE_CBCH_LOAD_INF                    43
386
387
388 #define RSL_IE_SMSCB_CH_IND                             46
389 #define RSL_IE_GRP_CALL_REF                             47
390 #define RSL_IE_CH_DESC                                  48
391 #define RSL_IE_NCH_DRX_INF                              49
392 #define RSL_IE_CMD_IND                                  50
393 #define RSL_IE_EMLPP_PRIO                               51
394 #define RSL_IE_UIC                                              52
395 #define RSL_IE_MAIN_CH_REF                              53
396 #define RSL_IE_MULTIRATE_CONF                   54
397 #define RSL_IE_MULTIRATE_CNTRL                  55
398 #define RSL_IE_SUP_CODEC_TYPES                  56
399 #define RSL_IE_CODEC_CONF                               57
400 #define RSL_IE_RTD                                              58
401 #define RSL_IE_TFO_STATUS                               59
402 #define RSL_IE_LLP_APDU                                 60
403 #define RSL_IE_TFO_TRANSP_CONT                  61
404
405 static const value_string rsl_ie_type_vals[] = {
406         {  0x01,        "Channel Number" },                             /*  9.3.1 */
407         {  0x02,        "Link Identifier" },                    /*  9.3.2 */
408         {  0x03,        "Activation Type" },                    /*  9.3.3 */
409         {  0x04,        "BS Power" },                                   /*  9.3.4 */
410         {  0x05,        "Channel Identification" },             /*  9.3.5 */
411         {  0x06,        "Channel Mode" },                               /*  9.3.6 */
412         {  0x07,        "Encryption Information" },             /*  9.3.7 */
413         {  0x08,        "Frame Number" },                               /*  9.3.8 */
414         {  0x09,        "Handover Reference" },                 /*  9.3.9 */
415         {  0x0a,        "L1 Information" },                             /*  9.3.10 */
416         {  0x0b,        "L3 Information" },                             /*  9.3.11 */
417         {  0x0c,        "MS Identity" },                                /*  9.3.12 */
418         {  0x0d,        "MS Power" },                                   /*  9.3.13 */
419         {  0x0e,        "Paging Group" },                               /*  9.3.14 */
420         {  0x0f,        "Paging Load" },                                /*  9.3.15 */
421         {  0x10,        "Physical Context" },                   /*  9.3.16 */
422         {  0x11,        "Access Delay" },                               /*  9.3.17 */
423         {  0x12,        "RACH Load" },                                  /*  9.3.18 */
424         {  0x13,        "Request Reference" },                  /*  9.3.19 */
425         {  0x14,        "Release Mode" },                               /*  9.3.20 */
426         {  0x15,        "Resource Information" },               /*  9.3.21 */
427         {  0x16,        "RLM Cause" },                                  /*  9.3.22 */
428         {  0x17,        "Starting Time" },                              /*  9.3.23 */
429         {  0x18,        "Timing Advance" },                             /*  9.3.24 */
430         {  0x19,        "Uplink Measurements" },                /*  9.3.25 */
431         {  0x1a,        "Cause" },                                              /*  9.3.26 */
432         {  0x1b,        "Measurement Result Number" },  /*  9.3.27 */
433         {  0x1c,        "Message Identifier" },                 /*  9.3.28 */
434         {  0x1d,        "reserved" },                                   /*  */
435         {  0x1e,        "System Info Type" },                   /*  9.3.30 */
436         {  0x1f,        "MS Power Parameters" },                /*  9.3.31 */
437         {  0x20,        "BS Power Parameters" },                /*  9.3.32 */
438         {  0x21,        "Pre-processing Parameters" },  /*  9.3.33 */
439         {  0x22,        "Pre-processed Measurements" }, /*  9.3.34 */
440         {  0x23,        "reserved" },                                   /*  */
441         {  0x24,        "SMSCB Information" },                  /*  9.3.36 */
442         {  0x25,        "MS Timing Offset" },                   /*  9.3.37 */
443         {  0x26,        "Erroneous Message" },                  /*  9.3.38 */
444         {  0x27,        "Full BCCH Information" },              /*  9.3.39 */
445         {  0x28,        "Channel Needed" },                             /*  9.3.40 */
446         {  0x29,        "CB Command type" },                    /*  9.3.41 */
447         {  0x2a,        "SMSCB Message" },                              /*  9.3.42 */
448         {  0x2b,        "Full Immediate Assign Info" }, /*  9.3.35 */
449         {  0x2c,        "SACCH Information" },                  /*  9.3.29 */
450         {  0x2d,        "CBCH Load Information" },              /*  9.3.43 */
451         {  0x2e,        "SMSCB Channel Indicator" },    /*  9.3.44 */
452         {  0x2f,        "Group Call Reference" },               /*  9.3.45 */
453         {  0x30,        "Channel Description" },                /*  9.3.46 */
454         {  0x31,        "NCH DRX Information" },                /*  9.3.47 */
455         {  0x32,        "Command Indicator" },                  /*  9.3.48 */
456         {  0x33,        "eMLPP Priority" },                             /*  9.3.49 */
457         {  0x34,        "UIC" },                                                /*  9.3.50 */
458         {  0x35,        "Main Channel Reference" },             /*  9.3.51 */
459         {  0x36,        "MultiRate Configuration" },    /*  9.3.52 */
460         {  0x37,        "MultiRate Control" },                  /*  9.3.53 */
461         {  0x38,        "Supported Codec Types" },              /*  9.3.54 */
462         {  0x39,        "Codec Configuration" },                /*  9.3.55 */
463         {  0x3a,        "Round Trip Delay" },                   /*  9.3.56 */
464         {  0x3b,        "TFO Status" },                                 /*  9.3.57 */
465         {  0x3c,        "LLP APDU" },                                   /*  9.3.58 */
466         {  0x3d,        "TFO Transparent Container" },  /*  9.3.59 */
467         /*
468                         0 0 1 1 1 1 1 0
469                         to
470                         1 1 1 0 1 1 1 1
471                         Reserved for future use
472
473                         1 1 1 1 0 0 0 0
474                         to
475                         1 1 1 1 1 1 1 1
476                         Not used
477
478         */
479         { 0,                    NULL }
480 };
481
482
483 /*
484 C5      C4      C3      C2      C1
485 0       0       0       0       1       Bm + ACCH's
486 0       0       0       1       T       Lm + ACCH's
487 0       0       1       T       T       SDCCH/4 + ACCH
488 0       1       T       T       T       SDCCH/8 + ACCH
489 1       0       0       0       0       BCCH
490 1       0       0       0       1       Uplink CCCH (RACH)
491 1       0       0       1       0       Downlink CCCH (PCH + AGCH)
492 */
493 static const value_string rsl_ch_no_Cbits_vals[] = {
494         {  0x01,        "Bm + ACCH's" },
495         {  0x03,        "Lm + ACCH's" },
496         {  0x03,        "Lm + ACCH's" },
497         {  0x04,        "SDCCH/4 + ACCH" },
498         {  0x05,        "SDCCH/4 + ACCH" },
499         {  0x06,        "SDCCH/4 + ACCH" },
500         {  0x07,        "SDCCH/4 + ACCH" },
501         {  0x08,        "SDCCH/8 + ACCH" },
502         {  0x09,        "SDCCH/8 + ACCH" },
503         {  0x0a,        "SDCCH/8 + ACCH" },
504         {  0x0b,        "SDCCH/8 + ACCH" },
505         {  0x0c,        "SDCCH/8 + ACCH" },
506         {  0x0d,        "SDCCH/8 + ACCH" },
507         {  0x0e,        "SDCCH/8 + ACCH" },
508         {  0x0f,        "SDCCH/8 + ACCH" },
509         {  0x10,        "BCCH" },
510         {  0x11,        "Uplink CCCH (RACH)" },
511         {  0x12,        "Downlink CCCH (PCH + AGCH)" },
512         { 0,                    NULL }
513 };
514
515 /* 9.3.1 Channel number                 9.3.1   M TV 2 */
516 static int
517 dissect_rsl_ie_ch_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
518 {
519         proto_item *ti;
520         proto_tree *ie_tree;
521         guint8 ie_id;
522
523         if(is_mandatory == FALSE){
524                 ie_id = tvb_get_guint8(tvb,offset);
525                 if (ie_id != RSL_IE_CH_NO)
526                         return offset;
527         }
528
529         ti = proto_tree_add_text(tree, tvb,offset,2,"Channel number IE ");
530         ie_tree = proto_item_add_subtree(ti, ett_ie_ch_no);
531
532
533         /* Element identifier */
534         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
535         offset++;
536         /* C-bits */
537         proto_tree_add_item(ie_tree, hf_rsl_ch_no_Cbits, tvb, offset, 1, FALSE);
538         /* TN is time slot number, binary represented as in 3GPP TS 45.002.
539          * 3 Bits
540          */
541         proto_tree_add_item(ie_tree, hf_rsl_ch_no_TN, tvb, offset, 1, FALSE);
542         offset++;
543         return offset;
544 }
545
546 static const value_string rsl_ch_type_vals[] = {
547         {  0x00,        "Main signalling channel (FACCH or SDCCH)" },
548         {  0x01,        "SACCH" },
549         { 0,                    NULL }
550 };
551
552 static const value_string rsl_prio_vals[] = {
553         {  0x00,        "Normal Priority" },
554         {  0x01,        "High Priority" },
555         {  0x02,        "Low Priority" },
556         { 0,                    NULL }
557 };
558
559 /*
560  * 9.3.2 Link Identifier M TV 2
561  */
562 static int
563 dissect_rsl_ie_link_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
564 {
565         proto_item *ti;
566         proto_tree *ie_tree;
567         guint8 octet;
568         guint8 ie_id;
569
570         if(is_mandatory == FALSE){
571                 ie_id = tvb_get_guint8(tvb,offset);
572                 if (ie_id != RSL_IE_LINK_ID)
573                         return offset;
574         }
575
576         ti = proto_tree_add_text(tree, tvb,offset,2, "Link Identifier IE ");
577         ie_tree = proto_item_add_subtree(ti, ett_ie_link_id);
578
579         /* Element identifier */
580         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
581         offset++;
582
583         octet = tvb_get_guint8(tvb,offset);
584
585         if((octet&0x20) == 0x20){
586                 /* Not applicable */
587                 proto_tree_add_item(ie_tree, hf_rsl_na, tvb, offset, 1, FALSE);
588                 return offset++;
589         }
590         /* channel type */
591         proto_tree_add_item(ie_tree, hf_rsl_ch_type, tvb, offset, 1, FALSE);
592         /* NA - Not applicable */
593         proto_tree_add_item(ie_tree, hf_rsl_na, tvb, offset, 1, FALSE);
594         /* Priority */
595         proto_tree_add_item(ie_tree, hf_rsl_prio, tvb, offset, 1, FALSE);
596         /* SAPI
597          * The SAPI field contains the SAPI value as defined in 3GPP TS 44.005.
598          */
599         proto_tree_add_item(ie_tree, hf_rsl_sapi, tvb, offset, 1, FALSE);
600         offset++;
601
602         return offset;
603 }
604
605 /*
606  * 9.3.3 Activation Type
607  */
608 static const true_false_string rsl_rbit_vals = {
609   "Reactivation",
610   "Initial activation"
611 };
612
613 static const value_string rsl_a3a2_vals[] = {
614         {  0x00,        "Activation related to intra-cell channel change" },
615         {  0x01,        "Activation related to inter-cell channel change (handover)" },
616         {  0x02,        "Activation related to secondary channels" },
617         { 0,                    NULL }
618 };
619
620 static const true_false_string rsl_a1_0_vals = {
621   "related to normal assignment procedure",
622   "related to immediate assignment procedure"
623 };
624
625 static const true_false_string rsl_a1_1_vals = {
626   "related to synchronous handover procedure",
627   "related to asynchronous handover procedure"
628 };
629
630 static const true_false_string rsl_a1_2_vals = {
631   "related to multislot configuration",
632   "related to additional assignment procedure"
633 };
634
635 static int
636 dissect_rsl_ie_act_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
637 {
638         proto_item *ti;
639         proto_tree *ie_tree;
640         guint8 ie_id;
641         guint   octet;
642
643         if(is_mandatory == FALSE){
644                 ie_id = tvb_get_guint8(tvb,offset);
645                 if (ie_id != RSL_IE_ACT_TYPE)
646                         return offset;
647         }
648
649         ti = proto_tree_add_text(tree, tvb,offset,2,"Activation Type IE ");
650         ie_tree = proto_item_add_subtree(ti, ett_ie_act_type);
651
652
653         /* Element identifier */
654         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
655         offset++;
656
657         /* The R bit indicates if the procedure is an initial activation or a reactivation. */
658         proto_tree_add_item(ie_tree, hf_rsl_rbit, tvb, offset, 1, FALSE);
659
660         /* The A-bits indicate the type of activation, which defines the access procedure
661          * and the operation of the data link layer
662          */
663         octet = (tvb_get_guint8(tvb,offset) & 0x06)>>1;
664         proto_tree_add_item(ie_tree, hf_rsl_a3a2, tvb, offset, 1, FALSE);
665         switch(octet){
666         case 0:
667                 /* Activation related to intra-cell channel change */
668                 proto_tree_add_item(ie_tree, hf_rsl_a1_0, tvb, offset, 1, FALSE);
669                 break;
670         case 1:
671                 /* Activation related to inter-cell channel change (handover) */
672                 proto_tree_add_item(ie_tree, hf_rsl_a1_1, tvb, offset, 1, FALSE);
673                 break;
674         case 2:
675                 /* Activation related to secondary channels */
676                 proto_tree_add_item(ie_tree, hf_rsl_a1_2, tvb, offset, 1, FALSE);
677                 break;
678         default:
679                 break;
680         }
681         offset++;
682
683         return offset;
684 }
685 /*
686  * 9.3.4 BS Power
687  */
688
689 static const true_false_string rsl_epc_mode_vals = {
690   "Channel in EPC mode",
691   "Channel not in EPC mode"
692 };
693
694 static const true_false_string rsl_fpc_epc_mode_vals = {
695   "Fast Power Control in use",
696   "Fast Power Control not in use"
697 };
698
699 static const value_string rsl_rlm_bs_power_vals[] = {
700         {  0x00,        "Pn" },
701         {  0x01,        "Pn - 2 dB" },
702         {  0x02,        "Pn - 4 dB" },
703         {  0x03,        "Pn - 6 dB" },
704         {  0x04,        "Pn - 8 dB" },
705         {  0x05,        "Pn - 10 dB" },
706         {  0x06,        "Pn - 12 dB" },
707         {  0x07,        "Pn - 14 dB" },
708         {  0x08,        "Pn - 16 dB" },
709         {  0x09,        "Pn - 18 dB" },
710         {  0x0a,        "Pn - 20 dB" },
711         {  0x0b,        "Pn - 22 dB" },
712         {  0x0c,        "Pn - 24 dB" },
713         {  0x0d,        "Pn - 26 dB" },
714         {  0x0e,        "Pn - 28 dB" },
715         {  0x0f,        "Pn - 30 dB" },
716         { 0,                    NULL }
717 };
718
719 static int
720 dissect_rsl_ie_bs_power(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
721 {
722         proto_item *ti;
723         proto_tree *ie_tree;
724         guint8 ie_id;
725
726         if(is_mandatory == FALSE){
727                 ie_id = tvb_get_guint8(tvb,offset);
728                 if (ie_id != RSL_IE_BS_POW)
729                         return offset;
730         }
731
732         ti = proto_tree_add_text(tree, tvb,offset,2,"BS Power IE");
733         ie_tree = proto_item_add_subtree(ti, ett_ie_bs_power);
734
735         /* Element identifier */
736         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
737         offset++;
738
739         /* EPC mode */
740         proto_tree_add_item(ie_tree, hf_rsl_epc_mode, tvb, offset, 1, FALSE);
741         /* FPC_EPC mode */
742         proto_tree_add_item(ie_tree, hf_rsl_bs_fpc_epc_mode, tvb, offset, 1, FALSE);
743
744         /* The Power Level field (octet 2) indicates the number of 2 dB steps by
745          * which the power shall be reduced from its nominal value, Pn,
746          * set by the network operator to adjust the coverage.
747          * Thus the Power Level values correspond to the following powers (relative to Pn):
748          */
749         proto_tree_add_item(ie_tree, hf_rsl_bs_power, tvb, offset, 1, FALSE);
750         offset++;
751
752         return offset;
753 }
754 /*
755  * 9.3.5 Channel Identification
756  */
757 static int
758 dissect_rsl_ie_ch_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
759 {
760         proto_item *ti;
761         proto_tree *ie_tree;
762         guint8 length;
763         int ie_offset;
764         guint8 ie_id;
765
766         if(is_mandatory == FALSE){
767                 ie_id = tvb_get_guint8(tvb,offset);
768                 if (ie_id != RSL_IE_CH_ID)
769                         return offset;
770         }
771
772         ti = proto_tree_add_text(tree, tvb,offset,0,"Channel Identification IE");
773         ie_tree = proto_item_add_subtree(ti, ett_ie_ch_id);
774
775         /* Element identifier */
776         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
777         offset++;
778         /* Length */
779         length = tvb_get_guint8(tvb, offset);
780         proto_item_set_len(ti, length+2);
781         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
782         offset++;
783
784         ie_offset = offset;
785
786         /* 3GPP TS 44.018 "Channel Description" */
787         de_rr_ch_dsc(tvb, ie_tree, offset, length, NULL, 0);
788         /*
789          * The 3GPP TS 24.008 "Mobile Allocation" shall for compatibility reasons be
790          * included but empty, i.e. the length shall be zero.
791          */
792         return ie_offset + length;
793 }
794 /*
795  * 9.3.6 Channel Mode
796  */
797
798 static const true_false_string rsl_dtx_vals = {
799   "DTX is applied",
800   "DTX is not applied"
801 };
802 static const value_string rsl_speech_or_data_vals[] = {
803         {  0x01,        "Speech" },
804         {  0x02,        "Data" },
805         {  0x03,        "Signalling" },
806         { 0,                    NULL }
807 };
808 static const value_string rsl_ch_rate_and_type_vals[] = {
809         {  0x01,        "SDCCH" },
810         {  0x08,        "Full rate TCH channel Bm" },
811         {  0x09,        "Half rate TCH channel Lm" },
812         {  0x0a,        "Full rate TCH channel bi-directional Bm, Multislot configuration" },
813         {  0x1a,        "Full rate TCH channel uni-directional downlink Bm, Multislot configuration" },
814         {  0x18,        "Full rate TCH channel Bm Group call channel" },
815         {  0x19,        "Half rate TCH channel Lm Group call channel" },
816         {  0x28,        "Full rate TCH channel Bm Broadcast call channel" },
817         {  0x29,        "PHalf rate TCH channel Lm Broadcast call channel" },
818         { 0,                    NULL }
819 };
820
821 static const value_string rsl_speech_coding_alg_vals[] = {
822         {  0x01,        "GSM speech coding algorithm version 1: GSM FR or GSM HR" },
823         {  0x11,        "GSM speech coding algorithm version 2: GSM EFR (half rate not defined in this version of the protocol)" },
824         {  0x21,        "GSM speech coding algorithm version 3: FR AMR or HR AMR" },
825         {  0x31,        "GSM speech coding algorithm version 4: OFR AMR-WB or OHR AMR-WB" },
826         {  0x09,        "GSM speech coding algorithm version 5: FR AMR-WB" },
827         {  0x0d,        "GSM speech coding algorithm version 6: OHR AMR" },
828         { 0,                    NULL }
829 };
830
831 static const true_false_string t_nt_bit_vals = {
832   "Non-transparent service",
833   "Transparent service"
834 };
835
836 static const value_string rsl_ra_if_data_rte_vals[] = {
837         {  0x21,        "asymmetric 43.5 kbit/s (downlink) + 14.5 kbit/s (uplink)" },
838         {  0x22,        "asymmetric 29.0 kbit/s (downlink) + 14.5 kbit/s (uplink)" },
839         {  0x23,        "asymmetric 43.5 kbit/s (downlink) + 29.0 kbit/s (uplink)" },
840         {  0x29,        "asymmetric 14.5 kbit/s (downlink) + 43.5 kbit/s (uplink)" },
841         {  0x2a,        "asymmetric 14.5 kbit/s (downlink) + 29.0 kbit/s (uplink)" },
842         {  0x2b,        "asymmetric 29.0 kbit/s (downlink) + 43.5 kbit/s (uplink)" },
843         {  0x34,        "43.5 kbit/s" },
844         {  0x31,        "28.8 kbit/s" },
845         {  0x18,        "14.5 kbit/s" },
846         {  0x10,        "12 kbit/s" },
847         {  0x11,        "6 kbit/s" },
848         { 0,                    NULL }
849 };
850
851 static const value_string rsl_data_rte_vals[] = {
852         {  0x38,        "32 kbit/s" },
853         {  0x22,        "39 kbit/s" },
854         {  0x18,        "14.4 kbit/s" },
855         {  0x10,        "9.6 kbit/s" },
856         {  0x11,        "4.8 kbit/s" },
857         {  0x12,        "2.4 kbit/s" },
858         {  0x13,        "1.2 kbit/s" },
859         {  0x14,        "600 bit/s" },
860         {  0x15,        "1 200/75 bit/s (1 200 network-to-MS, 75 MS-to-network)" },
861         { 0,                    NULL }
862 };
863
864 static int
865 dissect_rsl_ie_ch_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
866 {
867         proto_item *ti;
868         proto_tree *ie_tree;
869         guint8 length;
870         int ie_offset;
871         guint8 ie_id;
872         guint8 octet;
873
874         if(is_mandatory == FALSE){
875                 ie_id = tvb_get_guint8(tvb,offset);
876                 if (ie_id != RSL_IE_CH_MODE)
877                         return offset;
878         }
879
880         ti = proto_tree_add_text(tree, tvb,offset,0,"Channel Mode IE");
881         ie_tree = proto_item_add_subtree(ti, ett_ie_ch_mode);
882
883         /* Element identifier */
884         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
885         offset++;
886         /* Length */
887         length = tvb_get_guint8(tvb, offset);
888         proto_item_set_len(ti, length+2);
889         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
890         offset++;
891         ie_offset = offset;
892
893         /* The DTX bits of octet 3 indicate whether DTX is applied
894          * DTXd indicates use of DTX in the downlink direction (BTS to MS) and
895          * DTXu indicates use of DTX in the uplink direction (MS to BTS).
896          */
897         proto_tree_add_item(ie_tree, hf_rsl_cm_dtxd, tvb, offset, 1, FALSE);
898         proto_tree_add_item(ie_tree, hf_rsl_cm_dtxu, tvb, offset, 1, FALSE);
899         offset++;
900         /* The "Speech or data indicator" field (octet 4) */
901         proto_tree_add_item(ie_tree, hf_rsl_speech_or_data, tvb, offset, 1, FALSE);
902         octet = tvb_get_guint8(tvb,offset);
903         offset++;
904         /* Channel rate and type */
905         proto_tree_add_item(ie_tree, hf_rsl_ch_rate_and_type, tvb, offset, 1, FALSE);
906         offset++;
907         /* Speech coding algor./data rate + transp ind */
908         switch(octet){
909         case 1:
910                 /* Speech */
911                 proto_tree_add_item(ie_tree, hf_rsl_speech_coding_alg, tvb, offset, 1, FALSE);
912                 break;
913         case 2:
914                 /* Data */
915                 proto_tree_add_item(ie_tree, hf_rsl_extension_bit, tvb, offset, 1, FALSE);
916                 proto_tree_add_item(ie_tree, hf_rsl_t_nt_bit, tvb, offset, 1, FALSE);
917                 octet = tvb_get_guint8(tvb,offset);
918                 if ((octet&0x40)==0x40){
919                         /* Non-transparent service */
920                         /* For the non-transparent service, bits 6 to 1 indicate the radio interface data rate:*/
921                         proto_tree_add_item(ie_tree, hf_rsl_ra_if_data_rte, tvb, offset, 1, FALSE);
922                 }else{
923                         /* For the transparent service, bits 6-1 indicate the data rate: */
924                         proto_tree_add_item(ie_tree, hf_rsl_data_rte, tvb, offset, 1, FALSE);
925                 }
926                 break;
927         case 3:
928                 /* Signalling
929                  * If octet 4 indicates signalling then octet 6 is coded as follows:
930                  * 0000 0000 No resources required
931                  */
932                 proto_tree_add_text(tree, tvb,offset,1,"0 No resources required(All other values are reserved)");
933                 break;
934         default:
935                 /* Should not happen */
936                 proto_tree_add_text(ie_tree, tvb,offset,1,"Speech or data indicator != 1,2 or 3");
937                 break;
938         }
939
940         offset++;
941
942         return ie_offset + length;
943 }
944
945 /*
946  * 9.3.7 Encryption information
947  */
948
949 /* The Algorithm Identifier field (octet 3) indicates the relevant ciphering algorithm. It is coded as: */
950 static const value_string rsl_algorithm_id_vals[] = {
951         {  0x00,        "Pn" },
952         {  0x00,        "Reserved" },
953         {  0x01,        "No encryption shall be used" },
954         {  0x02,        "GSM encryption algorithm version 1 (A5/1)" },
955         {  0x03,        "GSM A5/2" },
956         {  0x04,        "GSM A5/3" },
957         {  0x05,        "GSM A5/4" },
958         {  0x06,        "GSM A5/5" },
959         {  0x07,        "GSM A5/6" },
960         {  0x08,        "GSM A5/7" },
961         { 0,                    NULL }
962 };
963
964 static int
965 dissect_rsl_ie_enc_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
966 {
967         proto_item *ti;
968         proto_tree *ie_tree;
969         guint8 length;
970         guint8 ie_id;
971
972         if(is_mandatory == FALSE){
973                 ie_id = tvb_get_guint8(tvb,offset);
974                 if (ie_id != RSL_IE_ENC_INF)
975                         return offset;
976         }
977
978         ti = proto_tree_add_text(tree, tvb,offset,0,"Encryption information IE");
979         ie_tree = proto_item_add_subtree(ti, ett_ie_enc_inf);
980
981         /* Element identifier */
982         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
983         offset++;
984         /* Length */
985         length = tvb_get_guint8(tvb, offset);
986         proto_item_set_len(ti, length+2);
987         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
988         offset++;
989
990         /* Algorithm Identifier field (octet 3) */
991         proto_tree_add_item(ie_tree, hf_rsl_alg_id, tvb, offset, 1, FALSE);
992
993         /* key */
994         proto_tree_add_item(ie_tree, hf_rsl_key, tvb, offset+1, length -1, FALSE);
995
996         return offset + length;
997
998 }
999 /*
1000  * 9.3.8 Frame Number
1001  */
1002 static int
1003 dissect_rsl_ie_frame_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1004 {
1005         proto_item *ti;
1006         proto_tree *ie_tree;
1007         guint8 ie_id;
1008
1009         if(is_mandatory == FALSE){
1010                 ie_id = tvb_get_guint8(tvb,offset);
1011                 if (ie_id != RSL_IE_FRAME_NO)
1012                         return offset;
1013         }
1014
1015         ti = proto_tree_add_text(tree, tvb,offset,3,"Frame Number IE");
1016         ie_tree = proto_item_add_subtree(ti, ett_ie_frame_no);
1017
1018         /* Element identifier */
1019         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1020         offset++;
1021
1022         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T1prim, tvb, offset, 1, FALSE);
1023         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T3, tvb, offset, 2, FALSE);
1024         offset++;
1025         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T2, tvb, offset, 1, FALSE);
1026         offset++;
1027
1028         return offset;
1029 }
1030
1031 /*
1032  * 9.3.9 Handover reference
1033  */
1034 static int
1035 dissect_rsl_ie_ho_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1036 {
1037         proto_item *ti;
1038         proto_tree *ie_tree;
1039         guint8 ie_id;
1040
1041         if(is_mandatory == FALSE){
1042                 ie_id = tvb_get_guint8(tvb,offset);
1043                 if (ie_id != RSL_IE_HO_REF)
1044                         return offset;
1045         }
1046
1047         ti = proto_tree_add_text(tree, tvb,offset,2,"Handover reference IE");
1048         ie_tree = proto_item_add_subtree(ti, ett_ie_ho_ref);
1049
1050         /* Element identifier */
1051         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1052         offset++;
1053
1054         /* Hand-over reference */
1055         proto_tree_add_item(ie_tree, hf_rsl_ho_ref, tvb, offset, 1, FALSE);
1056         offset++;
1057
1058         return offset;
1059 }
1060
1061 /*
1062  * 9.3.10 L1 Information
1063  */
1064
1065 static int
1066 dissect_rsl_ie_l1_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1067 {
1068         proto_item *ti;
1069         proto_tree *ie_tree;
1070         guint8 ie_id;
1071
1072         if(is_mandatory == FALSE){
1073                 ie_id = tvb_get_guint8(tvb,offset);
1074                 if (ie_id != RSL_IE_L1_INF)
1075                         return offset;
1076         }
1077
1078         ti = proto_tree_add_text(tree, tvb,offset, 3,"L1 Information IE");
1079         ie_tree = proto_item_add_subtree(ti, ett_ie_l1_inf);
1080
1081         /* Element identifier */
1082         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1083         offset++;
1084
1085         /* Octets 2-3 contain the L1 header information of SACCH blocks.
1086          * The information fields and codings are as defined in 3GPP TS 44.004.
1087          */
1088         /* Power level */
1089         proto_tree_add_item(ie_tree, hf_rsl_l1inf_power_lev, tvb, offset, 1, FALSE);
1090         /* FPC */
1091         proto_tree_add_item(ie_tree, hf_rsl_l1inf_fpc, tvb, offset, 1, FALSE);
1092         offset++;
1093         /* Actual Timing Advance */
1094         proto_tree_add_item(ie_tree, hf_rsl_act_timing_adv, tvb, offset, 1, FALSE);
1095         offset++;
1096
1097         return offset;
1098 }
1099
1100 /*
1101  * 9.3.11 L3 Information                        9.3.11  M TLV >=3
1102  *
1103  * This element contains a link layer service data unit (L3 message).
1104  * It is used to forward a complete L3 message as specified in
1105  * 3GPP TS 24.008 or 3GPP TS 44.018 between BTS and BSC.
1106  */
1107 static int
1108 dissect_rsl_ie_L3_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, gboolean is_mandatory)
1109 {
1110         proto_item *ti;
1111         proto_tree *ie_tree;
1112         tvbuff_t        *next_tvb;
1113         guint16 length;
1114         guint8 ie_id;
1115
1116         if(is_mandatory == FALSE){
1117                 ie_id = tvb_get_guint8(tvb,offset);
1118                 if (ie_id != RSL_IE_L3_INF)
1119                         return offset;
1120         }
1121
1122         ti = proto_tree_add_text(tree, tvb,offset,0,"L3 Information IE");
1123         ie_tree = proto_item_add_subtree(ti, ett_ie_L3_inf);
1124
1125         /* Element identifier */
1126         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1127         offset++;
1128         /* Length */
1129         length = tvb_get_ntohs(tvb, offset);
1130         proto_item_set_len(ti, length+3);
1131         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 2, FALSE);
1132         offset= offset+2;
1133
1134         /* Link Layer Service Data Unit (i.e. a layer 3 message
1135          * as defined in 3GPP TS 24.008 or 3GPP TS 44.018)
1136          */
1137         proto_tree_add_text(ie_tree, tvb,offset,length,"Link Layer Service Data Unit ( L3 Message)");
1138         next_tvb = tvb_new_subset(tvb, offset, length, length);
1139         call_dissector(gsm_a_dtap_handle, next_tvb, pinfo, top_tree);
1140
1141         offset = offset + length;
1142
1143         return offset;
1144  }
1145
1146 /*
1147  * 9.3.12 MS Identity
1148  */
1149 static int
1150 dissect_rsl_ie_ms_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1151 {
1152         proto_item *ti;
1153         proto_tree *ie_tree;
1154         guint length;
1155         guint8 ie_id;
1156
1157         if(is_mandatory == FALSE){
1158                 ie_id = tvb_get_guint8(tvb,offset);
1159                 if (ie_id != RSL_IE_MS_ID)
1160                         return offset;
1161         }
1162         ti = proto_tree_add_text(tree, tvb,offset,0,"MS Identity IE");
1163         ie_tree = proto_item_add_subtree(ti, ett_ie_ms_id);
1164
1165         /* Element identifier */
1166         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1167         offset++;
1168         /* Length */
1169         length = tvb_get_guint8(tvb,offset);
1170         proto_item_set_len(ti, length+2);
1171         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1172         offset++;
1173
1174         de_mid(tvb, ie_tree, offset, length, NULL, 0);
1175
1176         offset = offset + length;
1177
1178         return offset;
1179 }
1180
1181 static const true_false_string rsl_ms_fpc_epc_mode_vals = {
1182   "In use",
1183   "Not in use"
1184 };
1185 /*
1186  * 9.3.13 MS Power
1187  */
1188 static int
1189 dissect_rsl_ie_ms_pow(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1190 {
1191         proto_item *ti;
1192         proto_tree *ie_tree;
1193         guint8 ie_id;
1194
1195         if(is_mandatory == FALSE){
1196                 ie_id = tvb_get_guint8(tvb,offset);
1197                 if (ie_id != RSL_IE_MS_POW)
1198                         return offset;
1199         }
1200
1201         ti = proto_tree_add_text(tree, tvb,offset, 2,"MS Power IE");
1202         ie_tree = proto_item_add_subtree(ti, ett_ie_ms_pow);
1203
1204         /* Element identifier */
1205         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1206         offset++;
1207
1208         /* MS power level */
1209         proto_tree_add_item(ie_tree, hf_rsl_ms_power_lev, tvb, offset, 1, FALSE);
1210         /* FPC */
1211         proto_tree_add_item(ie_tree, hf_rsl_ms_fpc, tvb, offset, 1, FALSE);
1212         /* Reserved */
1213         offset++;
1214
1215         return offset;
1216 }
1217
1218 /*
1219  * 9.3.14 Paging Group M TV 2 2
1220  */
1221 static int
1222 dissect_rsl_ie_paging_grp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1223 {
1224         proto_item *ti;
1225         proto_tree *ie_tree;
1226         guint8 ie_id;
1227
1228         if(is_mandatory == FALSE){
1229                 ie_id = tvb_get_guint8(tvb,offset);
1230                 if (ie_id != RSL_IE_PAGING_GRP)
1231                         return offset;
1232         }
1233         ti = proto_tree_add_text(tree, tvb,offset,2,"Paging Group IE");
1234         ie_tree = proto_item_add_subtree(ti, ett_ie_paging_grp);
1235
1236         /* Element identifier */
1237         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1238         offset++;
1239
1240         /* The Paging Group field (octet 2) contains the binary representation of the paging
1241          * group as defined in 3GPP TS 45.002.
1242          */
1243         proto_tree_add_item(ie_tree, hf_rsl_paging_grp, tvb, offset, 1, FALSE);
1244         offset++;
1245
1246         return offset;
1247
1248 }
1249
1250 /*
1251  * 9.3.15 Paging Load
1252  */
1253 static int
1254 dissect_rsl_ie_paging_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1255 {
1256         proto_item *ti;
1257         proto_tree *ie_tree;
1258         guint8 ie_id;
1259
1260         if(is_mandatory == FALSE){
1261                 ie_id = tvb_get_guint8(tvb,offset);
1262                 if (ie_id != RSL_IE_PAGING_LOAD)
1263                         return offset;
1264         }
1265         ti = proto_tree_add_text(tree, tvb,offset,3,"Paging Load IE");
1266         ie_tree = proto_item_add_subtree(ti, ett_ie_paging_load);
1267
1268         /* Element identifier */
1269         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1270         offset++;
1271
1272         /*
1273          * Paging Buffer Space.
1274          */
1275         proto_tree_add_item(ie_tree, hf_rsl_paging_load, tvb, offset, 2, FALSE);
1276         offset = offset + 2;
1277
1278         return offset;
1279
1280 }
1281 /*
1282  * 9.3.16 Physical Context TLV
1283  */
1284 static int
1285 dissect_rsl_ie_phy_ctx(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1286 {
1287         proto_item *ti;
1288         proto_tree *ie_tree;
1289         guint length;
1290         guint8 ie_id;
1291
1292         if(is_mandatory == FALSE){
1293                 ie_id = tvb_get_guint8(tvb,offset);
1294                 if (ie_id != RSL_IE_PHY_CTX)
1295                         return offset;
1296         }
1297
1298         ti = proto_tree_add_text(tree, tvb,offset,0,"Physical Context IE ");
1299         ie_tree = proto_item_add_subtree(ti, ett_ie_phy_ctx);
1300
1301         /* Element identifier */
1302         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1303         offset++;
1304         /* Length */
1305         length = tvb_get_guint8(tvb,offset);
1306         proto_item_set_len(ti, length+2);
1307         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1308         offset++;
1309
1310         /*
1311          * Physical Context Information:
1312          *      The Physical Context Information field is not specified.
1313          *      This information should not be analysed by BSC, but merely
1314          *      forwarded from one TRX/channel to another.
1315          */
1316         proto_tree_add_item(ie_tree, hf_rsl_phy_ctx, tvb, offset, length, FALSE);
1317         offset = offset + length;
1318
1319         return offset;
1320 }
1321 /*
1322  * 9.3.17 Access Delay M TV 2
1323  */
1324 static int
1325 dissect_rsl_ie_access_delay(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1326 {
1327         proto_item *ti;
1328         proto_tree *ie_tree;
1329         guint8 ie_id;
1330
1331         if(is_mandatory == FALSE){
1332                 ie_id = tvb_get_guint8(tvb,offset);
1333                 if (ie_id != RSL_IE_ACCESS_DELAY)
1334                         return offset;
1335         }
1336
1337         ti = proto_tree_add_text(tree, tvb,offset,2,"Access Delay IE ");
1338         ie_tree = proto_item_add_subtree(ti, ett_ie_access_delay);
1339
1340         /* Element identifier */
1341         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1342         offset++;
1343         proto_tree_add_item(ie_tree, hf_rsl_acc_delay, tvb, offset, 1, FALSE);
1344         offset++;
1345         return offset;
1346 }
1347
1348 /*
1349  * 9.3.18 RACH Load
1350  */
1351
1352 static int
1353 dissect_rsl_ie_rach_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1354 {
1355         proto_item *ti;
1356         proto_tree *ie_tree;
1357         guint length;
1358         guint8 ie_id;
1359         int ie_offset;
1360
1361         if(is_mandatory == FALSE){
1362                 ie_id = tvb_get_guint8(tvb,offset);
1363                 if (ie_id != RSL_IE_RACH_LOAD)
1364                         return offset;
1365         }
1366
1367         ti = proto_tree_add_text(tree, tvb,offset,0,"RACH Load IE ");
1368         ie_tree = proto_item_add_subtree(ti, ett_ie_rach_load);
1369
1370         /* Element identifier */
1371         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1372         offset++;
1373         /* Length */
1374         length = tvb_get_guint8(tvb,offset);
1375         proto_item_set_len(ti, length+2);
1376         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1377         offset++;
1378         ie_offset = offset;
1379
1380         /*
1381          * This element is used to carry information on the load of the RACH (Random Access Channel)
1382          * associated with this CCCH timeslot. It is of variable length.
1383          */
1384         /*      RACH Slot Count */
1385         proto_tree_add_item(ie_tree, hf_rsl_rach_slot_cnt, tvb, offset, 2, FALSE);
1386         offset = offset +2;
1387         length = length -2;
1388         /* RACH Busy Count */
1389         proto_tree_add_item(ie_tree, hf_rsl_rach_busy_cnt, tvb, offset, 2, FALSE);
1390         offset = offset +2;
1391         length = length -2;
1392
1393         /* RACH Access Count */
1394         proto_tree_add_item(ie_tree, hf_rsl_rach_acc_cnt, tvb, offset, 2, FALSE);
1395         offset = offset +2;
1396         length = length -2;
1397
1398         /* Supplementary Information */
1399         if( length > 0){
1400                 proto_tree_add_text(ie_tree, tvb, offset,length ,"Supplementary Information");
1401         }
1402         offset = ie_offset + length;
1403
1404         return offset;
1405 }
1406
1407 /*
1408  * 9.3.19 Request Reference M TV 4
1409  */
1410 static int
1411 dissect_rsl_ie_req_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1412 {
1413         proto_item *ti;
1414         proto_tree *ie_tree;
1415         guint8 ie_id;
1416
1417         if(is_mandatory == FALSE){
1418                 ie_id = tvb_get_guint8(tvb,offset);
1419                 if (ie_id != RSL_IE_REQ_REF)
1420                         return offset;
1421         }
1422
1423         ti = proto_tree_add_text(tree, tvb,offset,4,"Request Reference IE ");
1424         ie_tree = proto_item_add_subtree(ti, ett_ie_req_ref);
1425
1426         /* Element identifier */
1427         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1428         offset++;
1429         proto_tree_add_item(ie_tree, hf_rsl_req_ref_ra, tvb, offset, 1, FALSE);
1430         offset++;
1431         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T1prim, tvb, offset, 1, FALSE);
1432         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T3, tvb, offset, 2, FALSE);
1433         offset++;
1434         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T2, tvb, offset, 1, FALSE);
1435         offset++;
1436         return offset;
1437 }
1438
1439 static const value_string rel_mode_vals[] = {
1440         {  0x00,        "Normal Release" },
1441         {  0x01,        "Local End Release" },
1442         { 0,                    NULL }
1443 };
1444
1445 /*
1446  * 9.3.20 Release Mode                          9.3.20  M TV 2
1447  */
1448 static int
1449 dissect_rsl_ie_rel_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1450 {
1451         proto_item *ti;
1452         proto_tree *ie_tree;
1453         guint8 ie_id;
1454
1455         if(is_mandatory == FALSE){
1456                 ie_id = tvb_get_guint8(tvb,offset);
1457                 if (ie_id != RSL_IE_REL_MODE)
1458                         return offset;
1459         }
1460
1461         ti = proto_tree_add_text(tree, tvb,offset,4,"Release Mode IE ");
1462         ie_tree = proto_item_add_subtree(ti, ett_ie_rel_mode);
1463
1464         /* Element identifier */
1465         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1466         offset++;
1467
1468         /*      The M bit is coded as follows:
1469          * 0 normal release
1470          * 1 local end release
1471          */
1472         proto_tree_add_item(ie_tree, hf_rsl_rel_mode, tvb, offset, 1, FALSE);
1473
1474         offset++;
1475         return offset;
1476 }
1477
1478 static const value_string rsl_rlm_cause_vals[] = {
1479         {  0x00,        "reserved" },
1480         {  0x01,        "timer T200 expired (N200+1) times" },
1481         {  0x02,        "re-establishment request" },
1482         {  0x03,        "unsolicited UA response" },
1483         {  0x04,        "unsolicited DM response" },
1484         {  0x05,        "unsolicited DM response, multiple frame established state" },
1485         {  0x06,        "unsolicited supervisory response" },
1486         {  0x07,        "sequence error" },
1487         {  0x08,        "U-frame with incorrect parameters" },
1488         {  0x09,        "S-frame with incorrect parameters" },
1489         {  0x0a,        "I-frame with incorrect use of M bit" },
1490         {  0x0b,        "I-frame with incorrect length" },
1491         {  0x0c,        "frame not implemented" },
1492         {  0x0d,        "SABM command, multiple frame established state" },
1493         {  0x0e,        "SABM frame with information not allowed in this state" },
1494         { 0,                    NULL }
1495 };
1496
1497 /*
1498  * 9.3.21 Resource Information
1499  */
1500 static int
1501 dissect_rsl_ie_resource_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1502 {
1503         proto_item *ti;
1504         proto_tree *ie_tree;
1505         guint8 ie_id;
1506         guint           length;
1507         int ie_offset;
1508
1509         if(is_mandatory == FALSE){
1510                 ie_id = tvb_get_guint8(tvb,offset);
1511                 if (ie_id != RSL_IE_RESOURCE_INF)
1512                         return offset;
1513         }
1514
1515         ti = proto_tree_add_text(tree, tvb,offset,0,"Resource Information IE");
1516         ie_tree = proto_item_add_subtree(ti, ett_ie_resource_inf);
1517
1518         /* Element identifier */
1519         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1520         offset++;
1521
1522         /* Length */
1523         length = tvb_get_guint8(tvb,offset);
1524         proto_item_set_len(ti, length+2);
1525
1526         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1527         offset++;
1528
1529         ie_offset = offset;
1530
1531         while (length > 0){
1532                 proto_tree_add_item(ie_tree, hf_rsl_ch_no_Cbits, tvb, offset, 1, FALSE);
1533                 /* TN is time slot number, binary represented as in 3GPP TS 45.002.
1534                  * 3 Bits
1535                  */
1536                 proto_tree_add_item(ie_tree, hf_rsl_ch_no_TN, tvb, offset, 1, FALSE);
1537                 offset++;
1538
1539                 /* Interference level (1) */
1540                 /* Interf Band */
1541                 proto_tree_add_item(ie_tree, hf_rsl_interf_band, tvb, offset, 1, FALSE);
1542                 offset++;
1543                 length = length - 2;
1544         }
1545         return ie_offset + length;
1546 }
1547
1548 /*
1549  * 9.3.22 RLM Cause                             9.3.22  M TLV 2-4
1550  */
1551 static int
1552 dissect_rsl_ie_rlm_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1553 {
1554         proto_item *ti;
1555         proto_tree *ie_tree;
1556
1557         guint           length;
1558         guint8          octet;
1559         guint8 ie_id;
1560
1561         if(is_mandatory == FALSE){
1562                 ie_id = tvb_get_guint8(tvb,offset);
1563                 if (ie_id != RSL_IE_RLM_CAUSE)
1564                         return offset;
1565         }
1566
1567         ti = proto_tree_add_text(tree, tvb,offset,0,"RLM Cause IE ");
1568         ie_tree = proto_item_add_subtree(ti, ett_ie_rlm_cause);
1569
1570         /* Element identifier */
1571         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1572         offset++;
1573         /* Length */
1574         length = tvb_get_guint8(tvb,offset);
1575         proto_item_set_len(ti, length+2);
1576
1577         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1578         offset++;
1579
1580         /* The Cause Value is a one octet field if the extension bit is set to 0.
1581          * If the extension bit is set to 1, the Cause Value is a two octet field.
1582          */
1583         octet = tvb_get_guint8(tvb,offset);
1584         proto_tree_add_item(tree, hf_rsl_extension_bit, tvb, offset, 1, FALSE);
1585         proto_tree_add_item(ie_tree, hf_rsl_cause, tvb, offset, 1, FALSE);
1586         offset++;
1587
1588         return offset;
1589 }
1590
1591 /*
1592  * 9.3.23 Starting Time
1593  */
1594 static int
1595 dissect_rsl_ie_staring_time(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1596 {
1597         proto_item *ti;
1598         proto_tree *ie_tree;
1599         guint8 ie_id;
1600
1601         if(is_mandatory == FALSE){
1602                 ie_id = tvb_get_guint8(tvb,offset);
1603                 if (ie_id != RSL_IE_STARTING_TIME)
1604                         return offset;
1605         }
1606
1607         ti = proto_tree_add_text(tree, tvb,offset,3,"Starting Time IE");
1608         ie_tree = proto_item_add_subtree(ti, ett_ie_staring_time);
1609
1610         /* Element identifier */
1611         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1612         offset++;
1613
1614         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T1prim, tvb, offset, 1, FALSE);
1615         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T3, tvb, offset, 2, FALSE);
1616         offset++;
1617         proto_tree_add_item(ie_tree, hf_rsl_req_ref_T2, tvb, offset, 1, FALSE);
1618         offset++;
1619
1620         return offset;
1621 }
1622
1623 /*
1624  * 9.3.24 Timing Advance
1625  */
1626 static int
1627 dissect_rsl_ie_timing_adv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1628 {
1629         proto_item *ti;
1630         proto_tree *ie_tree;
1631         guint8 ie_id;
1632
1633         if(is_mandatory == FALSE){
1634                 ie_id = tvb_get_guint8(tvb,offset);
1635                 if (ie_id != RSL_IE_TIMING_ADV)
1636                         return offset;
1637         }
1638
1639         ti = proto_tree_add_text(tree, tvb,offset,2,"Timing Advance IE");
1640         ie_tree = proto_item_add_subtree(ti, ett_ie_timing_adv);
1641
1642         /* Element identifier */
1643         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1644         offset++;
1645
1646         proto_tree_add_item(ie_tree, hf_rsl_timing_adv, tvb, offset, 1, FALSE);
1647         offset++;
1648
1649         return offset;
1650 }
1651
1652 /*
1653  * 9.3.25 Uplink Measurements
1654  */
1655 static const true_false_string rsl_dtxd_vals = {
1656   "Employed",
1657   "Not employed"
1658 };
1659
1660 static int
1661 dissect_rsl_ie_uplik_meas(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1662 {
1663         proto_item *ti;
1664         proto_tree *ie_tree;
1665         guint           length;
1666         int                     ie_offset;
1667         guint8 ie_id;
1668
1669         if(is_mandatory == FALSE){
1670                 ie_id = tvb_get_guint8(tvb,offset);
1671                 if (ie_id != RSL_IE_UPLINK_MEAS)
1672                         return offset;
1673         }
1674
1675         ti = proto_tree_add_text(tree, tvb,offset,0,"Uplink Measurements IE");
1676         ie_tree = proto_item_add_subtree(ti, ett_ie_uplink_meas);
1677
1678         /* Element identifier */
1679         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1680         offset++;
1681
1682         /* Length */
1683         length = tvb_get_guint8(tvb,offset);
1684         proto_item_set_len(ti, length+2);
1685
1686         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1687         offset++;
1688         ie_offset = offset;
1689
1690         /* Octet 3
1691          * 8    7        6      5       4       3       2       1
1692          * rfu  DTXd | RXLEV.FULL.up
1693          */
1694         proto_tree_add_item(ie_tree, hf_rsl_dtxd, tvb, offset, 1, FALSE);
1695         proto_tree_add_item(ie_tree, hf_rsl_rxlev_full_up, tvb, offset, 1, FALSE);
1696         offset++;
1697
1698         /* Octet4
1699          * 8    7       6       5       4       3       2       1
1700          * Reserved |  RXLEV.SUB.up 4
1701          */
1702         proto_tree_add_item(ie_tree, hf_rsl_rxlev_sub_up, tvb, offset, 1, FALSE);
1703         offset++;
1704         /* Octet 5
1705          * 8    7        6      5       4                 3     2       1
1706          * Reserved | RXQUAL.FULL.up | RXQUAL.SUB.up
1707          */
1708         proto_tree_add_item(ie_tree, hf_rsl_rxqual_full_up, tvb, offset, 1, FALSE);
1709         proto_tree_add_item(ie_tree, hf_rsl_rxqual_sub_up, tvb, offset, 1, FALSE);
1710          offset++;
1711         /* Octet 6 - N
1712          * Supplementary Measurement Information
1713          */
1714         return ie_offset+length;
1715 }
1716
1717
1718 static const value_string rsl_class_vals[] = {
1719         {  0x00,        "Normal event" },
1720         {  0x01,        "Normal event" },
1721         {  0x02,        "Resource unavailable" },
1722         {  0x03,        "Service or option not available" },
1723         {  0x04,        "Service or option not implemented" },
1724         {  0x05,        "Invalid message (e.g. parameter out of range)" },
1725         {  0x06,        "Protocol error" },
1726         {  0x07,        "Interworking" },
1727         { 0,                    NULL }
1728 };
1729
1730  /*
1731   * 9.3.26 Cause
1732   */
1733 static int
1734 dissect_rsl_ie_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1735 {
1736         proto_item *ti;
1737         proto_tree *ie_tree;
1738         guint           length;
1739         guint8          octet;
1740         int                     ie_offset;
1741         guint8 ie_id;
1742
1743         if(is_mandatory == FALSE){
1744                 ie_id = tvb_get_guint8(tvb,offset);
1745                 if (ie_id != RSL_IE_CAUSE)
1746                         return offset;
1747         }
1748
1749         ti = proto_tree_add_text(tree, tvb,offset,0,"Cause IE");
1750         ie_tree = proto_item_add_subtree(ti, ett_ie_cause);
1751
1752         /* Element identifier */
1753         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1754         offset++;
1755         /* Length */
1756         length = tvb_get_guint8(tvb,offset);
1757         proto_item_set_len(ti, length+2);
1758         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1759         offset++;
1760         ie_offset = offset;
1761
1762         /* Cause Value */
1763         octet = tvb_get_guint8(tvb,offset);
1764         proto_tree_add_item(tree, hf_rsl_extension_bit, tvb, offset, 1, FALSE);
1765         proto_tree_add_item(tree, hf_rsl_class, tvb, offset, 1, FALSE);
1766         if ((octet & 0x80) == 80)
1767         /* Cause Extension*/
1768                 offset++;
1769
1770         /* Diagnostic(s) if any */
1771         return ie_offset+length;
1772 }
1773 /*
1774  * 9.3.27 Measurement result number
1775  */
1776
1777 static int
1778 dissect_rsl_ie_meas_res_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1779 {
1780         proto_item *ti;
1781         proto_tree *ie_tree;
1782         guint8 ie_id;
1783
1784         if(is_mandatory == FALSE){
1785                 ie_id = tvb_get_guint8(tvb,offset);
1786                 if (ie_id != RSL_IE_MEAS_RES_NO)
1787                         return offset;
1788         }
1789
1790         ti = proto_tree_add_text(tree, tvb,offset,2,"Measurement result number IE");
1791         ie_tree = proto_item_add_subtree(ti, ett_ie_meas_res_no);
1792
1793         /* Element identifier */
1794         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1795         offset++;
1796
1797         /* Measurement result number */
1798         proto_tree_add_item(ie_tree, hf_rsl_meas_res_no, tvb, offset, 1, FALSE);
1799         offset++;
1800
1801         return offset;
1802 }
1803 /*
1804  * 9.3.28 Message Identifier
1805  */
1806 static int
1807 dissect_rsl_ie_message_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1808 {
1809         proto_item *ti;
1810         proto_tree *ie_tree;
1811         guint8 ie_id;
1812
1813         if(is_mandatory == FALSE){
1814                 ie_id = tvb_get_guint8(tvb,offset);
1815                 if (ie_id != RSL_IE_MESSAGE_ID)
1816                         return offset;
1817         }
1818
1819         ti = proto_tree_add_text(tree, tvb,offset,0,"Message Identifier IE");
1820         ie_tree = proto_item_add_subtree(ti, ett_ie_message_id);
1821
1822         /* Element identifier */
1823         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1824         offset++;
1825         /* Message Type */
1826         proto_tree_add_item(tree, hf_rsl_msg_type, tvb, offset, 1, FALSE);
1827         offset++;
1828         return offset;
1829 }
1830 /*
1831  * 9.3.30 System Info Type
1832  */
1833 static const value_string rsl_sys_info_type_vals[] = {
1834         {  0x00,        "SYSTEM INFORMATION 8" },
1835         {  0x01,        "SYSTEM INFORMATION 1" },
1836         {  0x02,        "SYSTEM INFORMATION 2" },
1837         {  0x03,        "SYSTEM INFORMATION 3" },
1838         {  0x04,        "SYSTEM INFORMATION 4" },
1839         {  0x05,        "SYSTEM INFORMATION 5" },
1840         {  0x06,        "SYSTEM INFORMATION 6" },
1841         {  0x07,        "SYSTEM INFORMATION 7" },
1842         {  0x08,        "SYSTEM INFORMATION 16" },
1843         {  0x09,        "SYSTEM INFORMATION 17" },
1844         {  0x0a,        "SYSTEM INFORMATION 2bis" },
1845         {  0x0b,        "SYSTEM INFORMATION 2ter" },
1846         {  0x0d,        "SYSTEM INFORMATION 5bis" },
1847         {  0x0e,        "SYSTEM INFORMATION 5ter" },
1848         {  0x0f,        "SYSTEM INFORMATION 10" },
1849         {  0x47,        "EXTENDED MEASUREMENT ORDER" },
1850         {  0x48,        "MEASUREMENT INFORMATION" },
1851         {  0x28,        "SYSTEM INFORMATION 13" },
1852         {  0x29,        "SYSTEM INFORMATION 2quater" },
1853         {  0x2a,        "SYSTEM INFORMATION 9" },
1854         {  0x2b,        "SYSTEM INFORMATION 18" },
1855         {  0x2c,        "SYSTEM INFORMATION 19" },
1856         {  0x2d,        "SYSTEM INFORMATION 20" },
1857         { 0,                    NULL }
1858 };
1859
1860
1861 static int
1862 dissect_rsl_ie_sys_info_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1863 {
1864         proto_item *ti;
1865         proto_tree *ie_tree;
1866         guint8 ie_id, sitype;
1867
1868         if(is_mandatory == FALSE){
1869                 ie_id = tvb_get_guint8(tvb,offset);
1870                 if (ie_id != RSL_IE_SYS_INFO_TYPE)
1871                         return offset;
1872         }
1873
1874         ti = proto_tree_add_text(tree, tvb,offset,2,"System Info Type IE");
1875         ie_tree = proto_item_add_subtree(ti, ett_ie_sys_info_type);
1876
1877         /* Element identifier */
1878         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1879         offset++;
1880         /* Message Type */
1881         proto_tree_add_item(tree, hf_rsl_sys_info_type, tvb, offset, 1, FALSE);
1882         sitype = tvb_get_guint8(tvb, offset);
1883         offset++;
1884
1885         /* Check if SI is 2q, if so set flag */
1886         if (sitype==0x29) {
1887                 is_si2q = TRUE; }
1888
1889         return offset;
1890 }
1891
1892 /*
1893  * 9.3.35 Full Immediate Assign Info TLV 25
1894  */
1895 static int
1896 dissect_rsl_ie_full_imm_ass_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, gboolean is_mandatory)
1897 {
1898         proto_item *ti;
1899         proto_tree *ie_tree;
1900
1901         guint           length;
1902         tvbuff_t        *next_tvb;
1903         guint8          ie_id;
1904
1905         if(is_mandatory == FALSE){
1906                 ie_id = tvb_get_guint8(tvb,offset);
1907                 if (ie_id != RSL_IE_FULL_IMM_ASS_INF)
1908                         return offset;
1909         }
1910
1911         ti = proto_tree_add_text(tree, tvb,offset,0,"Full Immediate Assign Info IE ");
1912         ie_tree = proto_item_add_subtree(ti, ett_ie_full_imm_ass_inf);
1913
1914         /* Element identifier */
1915         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1916         offset++;
1917         /* Length */
1918         length = tvb_get_guint8(tvb,offset);
1919         proto_item_set_len(ti, length+2);
1920
1921         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1922         offset++;
1923         /*      The Full Immediate Assign Info field (octets 3-25)
1924          * contains a complete immediate assign message (IMMEDIATE ASSIGNMENT or
1925          * IMMEDIATE ASSIGNMENT EXTENDED or IMMEDIATE ASSIGNMENT REJECT)
1926          * as defined in 3GPP TS 44.018.
1927          */
1928         proto_tree_add_text(ie_tree, tvb,offset,length,"Full Immediate Assign Info field");
1929         next_tvb = tvb_new_subset(tvb, offset, length, length);
1930         call_dissector(gsm_a_ccch_handle, next_tvb, pinfo, top_tree);
1931
1932         offset = offset + length;
1933
1934         return offset;
1935 }
1936
1937 /*
1938  * 9.3.36 SMSCB Information
1939  *
1940  * This element is used to convey a complete frame to be broadcast on the CBCH
1941  * including the Layer 2 header for the radio path.
1942  */
1943 static int
1944 dissect_rsl_ie_smscb_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1945 {
1946         proto_item *ti;
1947         proto_tree *ie_tree;
1948
1949         guint           length;
1950         guint8          ie_id;
1951
1952         if(is_mandatory == FALSE){
1953                 ie_id = tvb_get_guint8(tvb,offset);
1954                 if (ie_id != RSL_IE_SMSCB_INF)
1955                         return offset;
1956         }
1957
1958         ti = proto_tree_add_text(tree, tvb,offset,0,"SMSCB Information IE ");
1959         ie_tree = proto_item_add_subtree(ti, ett_ie_smscb_inf);
1960
1961         /* Element identifier */
1962         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
1963         offset++;
1964         /* Length */
1965         length = tvb_get_guint8(tvb,offset);
1966         proto_item_set_len(ti, length+2);
1967
1968         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
1969         offset++;
1970         /*
1971          * SMSCB frame
1972          */
1973         proto_tree_add_text(ie_tree, tvb,offset,length,"SMSCB frame");
1974
1975         offset = offset + length;
1976
1977         return offset;
1978 }
1979
1980 /*
1981  * 9.3.37 MS Timing Offset
1982  */
1983
1984 static int
1985 dissect_rsl_ie_ms_timing_offset(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
1986 {
1987         proto_item *ti;
1988         proto_tree *ie_tree;
1989         guint8          ie_id;
1990
1991         if(is_mandatory == FALSE){
1992                 ie_id = tvb_get_guint8(tvb,offset);
1993                 if (ie_id != RSL_IE_FULL_MS_TIMING_OFFSET)
1994                         return offset;
1995         }
1996
1997         ti = proto_tree_add_text(tree, tvb,offset,0,"MS Timing Offset IE");
1998         ie_tree = proto_item_add_subtree(ti, ett_ie_ms_timing_offset);
1999
2000         /* Element identifier */
2001         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2002         offset++;
2003
2004         /* Timing Offset
2005          * The meaning of the MS Timing Offset is as defined in 3GPP TS 45.010.
2006          * The value of MS Timing Offset is the binary value of the 8-bit Timing Offset field (octet 2) - 63.
2007          * The range of MS Timing Offset is therefore -63 to 192.
2008          */
2009         proto_tree_add_item(ie_tree, hf_rsl_timing_offset, tvb, offset, 1, FALSE);
2010         offset++;
2011
2012         return offset;
2013 }
2014
2015 /*
2016  * 9.3.38 Erroneous Message
2017  * This information element is used to carry a complete A-bis interface message
2018  * which was considered erroneous at reception.
2019  */
2020 static int
2021 dissect_rsl_ie_err_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, gboolean is_mandatory)
2022 {
2023         proto_item *ti;
2024         proto_tree *ie_tree;
2025
2026         guint           length;
2027         guint8          ie_id;
2028         if(is_mandatory == FALSE){
2029                 ie_id = tvb_get_guint8(tvb,offset);
2030                 if (ie_id != RSL_IE_ERR_MSG)
2031                         return offset;
2032         }
2033
2034         ti = proto_tree_add_text(tree, tvb,offset,0,"Erroneous Message IE ");
2035         ie_tree = proto_item_add_subtree(ti, ett_ie_err_msg);
2036
2037         /* Element identifier */
2038         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2039         offset++;
2040         /* Length */
2041         length = tvb_get_guint8(tvb,offset);
2042         proto_item_set_len(ti, length+2);
2043
2044         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2045         offset++;
2046
2047         /* Received Message */
2048         offset = dissct_rsl_msg(tvb, pinfo, ie_tree, offset);
2049
2050         return offset;
2051 }
2052
2053 /*
2054  * 9.3.39 Full BCCH Information (message name)
2055  */
2056 static int
2057 dissect_rsl_ie_full_bcch_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2058 {
2059         proto_item *ti;
2060         proto_tree *ie_tree;
2061         tvbuff_t        *next_tvb;
2062         guint16 length;
2063         guint8 ie_id;
2064
2065         if(is_mandatory == FALSE){
2066                 ie_id = tvb_get_guint8(tvb,offset);
2067                 if (ie_id != RSL_IE_FULL_BCCH_INF)
2068                         return offset;
2069         }
2070
2071         ti = proto_tree_add_text(tree, tvb,offset,0,"Full BCCH Information IE");
2072         ie_tree = proto_item_add_subtree(ti, ett_ie_full_bcch_inf);
2073
2074         /* Element identifier */
2075         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2076         offset++;
2077         /* Length */
2078         length = tvb_get_guint8(tvb, offset);
2079         proto_item_set_len(ti, length+2);
2080         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2081         offset++;
2082
2083         /*
2084          * Octets 3-25 contain the complete L3 message as defined in 3GPP TS 44.018.
2085          */
2086
2087         proto_tree_add_text(ie_tree, tvb,offset,length,"Layer 3 message");
2088         next_tvb = tvb_new_subset(tvb, offset, length, length);
2089         call_dissector(gsm_a_ccch_handle, next_tvb, pinfo, top_tree);
2090
2091         offset = offset + length;
2092
2093         return offset;
2094  }
2095
2096 /*
2097  * 9.3.40 Channel Needed
2098  */
2099 static const value_string rsl_ch_needed_vals[] = {
2100         {  0x00,        "Any Channel" },
2101         {  0x01,        "SDCCH" },
2102         {  0x02,        "TCH/F (Full rate)" },
2103         {  0x03,        "TCH/F or TCH/H (Dual rate)" },
2104         { 0,            NULL }
2105 };
2106
2107 static int
2108 dissect_rsl_ie_ch_needed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2109 {
2110         proto_item *ti;
2111         proto_tree *ie_tree;
2112         guint8          ie_id;
2113
2114         if(is_mandatory == FALSE){
2115                 ie_id = tvb_get_guint8(tvb,offset);
2116                 if (ie_id != RSL_IE_CH_NEEDED)
2117                         return offset;
2118         }
2119
2120
2121         ti = proto_tree_add_text(tree, tvb,offset,0,"Channel Needed IE");
2122         ie_tree = proto_item_add_subtree(ti, ett_ie_ch_needed);
2123
2124         /* Element identifier */
2125         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2126         offset++;
2127
2128         /* Channel */
2129         proto_tree_add_item(ie_tree, hf_rsl_ch_needed, tvb, offset, 1, FALSE);
2130         offset++;
2131
2132         return offset;
2133 }
2134 /*
2135  * 9.3.41 CB Command type
2136  */
2137 static int
2138 dissect_rsl_ie_cb_cmd_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2139 {
2140         proto_item *ti;
2141         proto_tree *ie_tree;
2142         guint8          ie_id;
2143
2144         if(is_mandatory == FALSE){
2145                 ie_id = tvb_get_guint8(tvb,offset);
2146                 if (ie_id != RSL_IE_CB_CMD_TYPE)
2147                         return offset;
2148         }
2149
2150
2151         ti = proto_tree_add_text(tree, tvb,offset,0,"CB Command type IE");
2152         ie_tree = proto_item_add_subtree(ti, ett_ie_cb_cmd_type);
2153
2154         /* Element identifier */
2155         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2156         offset++;
2157
2158         /* Channel */
2159         proto_tree_add_item(ie_tree, hf_rsl_ch_needed, tvb, offset, 1, FALSE);
2160         offset++;
2161
2162         return offset;
2163 }
2164
2165 /*
2166  * 9.3.42 SMSCB Message
2167  */
2168 static int
2169 dissect_rsl_ie_smscb_mess(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2170 {
2171         proto_item *ti;
2172         proto_tree *ie_tree;
2173         guint length;
2174         guint8 ie_id;
2175         int     ie_offset;
2176
2177         if(is_mandatory == FALSE){
2178                 ie_id = tvb_get_guint8(tvb,offset);
2179                 if (ie_id != RSL_IE_SMSCB_MESS)
2180                         return offset;
2181         }
2182         ti = proto_tree_add_text(tree, tvb,offset,0,"SMSCB Message IE");
2183         ie_tree = proto_item_add_subtree(ti, ett_ie_smscb_mess);
2184
2185         /* Element identifier */
2186         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2187         offset++;
2188         /* Length */
2189         length = tvb_get_guint8(tvb,offset);
2190         proto_item_set_len(ti, length+2);
2191         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2192         offset++;
2193         ie_offset = offset;
2194
2195         /*
2196          * SMSCB Message
2197          */
2198
2199         proto_tree_add_text(ie_tree, tvb,offset,length ,"SMSCB Message");
2200
2201         offset = ie_offset + length;
2202
2203         return offset;
2204 }
2205
2206 /*
2207  * 9.3.43 CBCH Load Information
2208  */
2209
2210 static const true_false_string rsl_cbch_load_type_vals = {
2211   "Overflow",
2212   "Underflow"
2213 };
2214
2215 static int
2216 dissect_rsl_ie_cbch_load_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2217 {
2218         proto_item *ti, *item;
2219         proto_tree *ie_tree;
2220         guint8          ie_id;
2221         guint8          octet;
2222
2223         if(is_mandatory == FALSE){
2224                 ie_id = tvb_get_guint8(tvb,offset);
2225                 if (ie_id != RSL_IE_CBCH_LOAD_INF)
2226                         return offset;
2227         }
2228
2229
2230         ti = proto_tree_add_text(tree, tvb,offset,0,"CBCH Load Information IE");
2231         ie_tree = proto_item_add_subtree(ti, ett_ie_cbch_load_inf);
2232
2233         /* Element identifier */
2234         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2235         offset++;
2236
2237         octet = tvb_get_guint8(tvb,offset);
2238         /* CBCH Load Type */
2239         proto_tree_add_item(ie_tree, hf_rsl_cbch_load_type, tvb, offset, 1, FALSE);
2240
2241         /* Message Slot Count */
2242         item = proto_tree_add_item(ie_tree, hf_rsl_msg_slt_cnt, tvb, offset, 1, FALSE);
2243         if ((octet & 0x80) == 0x80){
2244                 proto_item_append_text(item,"The amount of SMSCB messages (1 to 15) that are needed immediately by BTS");
2245         }else{
2246                 proto_item_append_text(item,"The amount of delay in message slots (1 to 15) that is needed immediately by BTS");
2247         }
2248         offset++;
2249
2250         return offset;
2251 }
2252
2253 /*
2254  * 9.3.44 SMSCB Channel Indicator
2255  */
2256
2257 static const value_string rsl_ch_ind_vals[] = {
2258         {  0x00,        "Basic CBCH" },
2259         {  0x01,        "Extended CBCH (supporting the extended CBCH by the network or MSs is optional)" },
2260         { 0,            NULL }
2261 };
2262
2263 static int
2264 dissect_rsl_ie_smscb_ch_ind(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2265 {
2266         proto_item *ti;
2267         proto_tree *ie_tree;
2268         guint8          ie_id;
2269
2270         if(is_mandatory == FALSE){
2271                 ie_id = tvb_get_guint8(tvb,offset);
2272                 if (ie_id != RSL_IE_SMSCB_CH_IND)
2273                         return offset;
2274         }
2275
2276
2277         ti = proto_tree_add_text(tree, tvb,offset,0,"SMSCB Channel Indicator IE");
2278         ie_tree = proto_item_add_subtree(ti, ett_ie_smscb_ch_ind);
2279
2280         /* Element identifier */
2281         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2282         offset++;
2283
2284         /* Channel Ind */
2285         proto_tree_add_item(ie_tree, hf_rsl_ch_ind, tvb, offset, 1, FALSE);
2286         offset++;
2287
2288         return offset;
2289 }
2290
2291 /*
2292  * 9.3.45 Group call reference
2293  */
2294 static int
2295 dissect_rsl_ie_grp_call_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2296 {
2297         proto_item *ti;
2298         proto_tree *ie_tree;
2299         guint length;
2300         guint8 ie_id;
2301
2302         if(is_mandatory == FALSE){
2303                 ie_id = tvb_get_guint8(tvb,offset);
2304                 if (ie_id != RSL_IE_GRP_CALL_REF)
2305                         return offset;
2306         }
2307         ti = proto_tree_add_text(tree, tvb,offset,0,"Group call reference IE");
2308         ie_tree = proto_item_add_subtree(ti, ett_ie_grp_call_ref);
2309
2310         /* Element identifier */
2311         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2312         offset++;
2313         /* Length */
2314         length = tvb_get_guint8(tvb,offset);
2315         proto_item_set_len(ti, length+2);
2316         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2317         offset++;
2318
2319         proto_tree_add_text(ie_tree, tvb,offset,length,"Descriptive group or broadcast call reference");
2320
2321         /* The octets 3 to 7 are coded in the same way as the octets 2 to 6
2322          * in the Descriptive group or broadcast call reference
2323          * information element as defined in 3GPP TS 24.008.
2324          */
2325         de_d_gb_call_ref(tvb, ie_tree, offset, length, NULL, 0);
2326
2327         offset = offset + length;
2328
2329         return offset;
2330 }
2331 /*
2332  * 9.3.46 Channel description
2333  */
2334 static int
2335 dissect_rsl_ie_ch_desc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2336 {
2337         proto_item *ti;
2338         proto_tree *ie_tree;
2339         guint length;
2340         guint8 ie_id;
2341
2342         if(is_mandatory == FALSE){
2343                 ie_id = tvb_get_guint8(tvb,offset);
2344                 if (ie_id != RSL_IE_CH_DESC)
2345                         return offset;
2346         }
2347         ti = proto_tree_add_text(tree, tvb,offset,0,"Channel description IE");
2348         ie_tree = proto_item_add_subtree(ti, ett_ie_ch_desc);
2349
2350         /* Element identifier */
2351         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2352         offset++;
2353         /* Length */
2354         length = tvb_get_guint8(tvb,offset);
2355         proto_item_set_len(ti, length+2);
2356         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2357         offset++;
2358
2359         proto_tree_add_text(ie_tree, tvb,offset,length,"Group Channel Description");
2360
2361         /* Octet j (j = 3, 4, ..., n) is the unchanged octet j-2 of a radio interface Group Channel description
2362          * information element as defined in 3GPP TS 44.018, n-2 is equal to the length of the radio interface
2363          * Group channel description information element
2364          */
2365
2366         offset = offset + length;
2367
2368         return offset;
2369 }
2370 /*
2371  * 9.3.47 NCH DRX information
2372  * This is a variable length element used to pass a radio interface information element
2373  * from BSC to BTS.
2374  */
2375 static int
2376 dissect_rsl_ie_nch_drx(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2377 {
2378         proto_item *ti;
2379         proto_tree *ie_tree;
2380         guint8          ie_id;
2381
2382         if(is_mandatory == FALSE){
2383                 ie_id = tvb_get_guint8(tvb,offset);
2384                 if (ie_id != RSL_IE_NCH_DRX_INF)
2385                         return offset;
2386         }
2387
2388         ti = proto_tree_add_text(tree, tvb,offset,2,"NCH DRX information IE");
2389         ie_tree = proto_item_add_subtree(ti, ett_ie_nch_drx);
2390
2391         /* Element identifier */
2392         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2393         offset++;
2394         /* NCH DRX information */
2395         /* Octet 3 bits 7 and 8 are spare and set to zero. */
2396         /* Octet 3 bit 6 is the NLN status parameter as defined in 3GPP TS 44.018.*/
2397         /* Octet 3 bits 3, 4 and 5 are bits 1, 2 and 3 of the radio interface
2398          * eMLPP priority as defined in 3GPP TS 44.018.
2399          */
2400         /* Octet 3 bits 1 and 2 are bits 1 and 2 of the radio interface NLN
2401          * as defined in 3GPP TS 44.018.
2402          */
2403
2404         offset++;
2405
2406         return offset;
2407 }
2408 /*
2409  * 9.3.48 Command indicator
2410  */
2411
2412 static int
2413 dissect_rsl_ie_cmd_ind(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2414 {
2415         proto_item *ti;
2416         proto_tree *ie_tree;
2417         guint8          ie_id;
2418         guint8          octet;
2419
2420         if(is_mandatory == FALSE){
2421                 ie_id = tvb_get_guint8(tvb,offset);
2422                 if (ie_id != RSL_IE_CMD_IND)
2423                         return offset;
2424         }
2425
2426
2427         /* TODO Length wrong if extended */
2428         ti = proto_tree_add_text(tree, tvb,offset,2,"Command indicator IE");
2429         ie_tree = proto_item_add_subtree(ti, ett_ie_cmd_ind);
2430
2431         /* Element identifier */
2432         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2433         offset++;
2434
2435         /* Extension bit */
2436         proto_tree_add_item(ie_tree, hf_rsl_extension_bit, tvb, offset, 1, FALSE);
2437
2438
2439         /* TODO this should probably be add_uint instead!!! */
2440         octet = tvb_get_guint8(tvb,offset);
2441         if ((octet&0x80)==0x80){
2442                 /* extended */
2443                 /* Command Extension */
2444                 proto_tree_add_item(ie_tree, hf_rsl_command, tvb, offset, 2, FALSE);
2445                 offset = offset+2;
2446         }else{
2447                 /* Command Value */
2448                 proto_tree_add_item(ie_tree, hf_rsl_command, tvb, offset, 1, FALSE);
2449                 offset++;
2450         }
2451
2452         return offset;
2453 }
2454 /*
2455  * 9.3.49 eMLPP Priority
2456  */
2457 static const value_string rsl_emlpp_prio_vals[] = {
2458         {  0x00,        "no priority applied" },
2459         {  0x01,        "call priority level 4" },
2460         {  0x02,        "call priority level 3" },
2461         {  0x03,        "call priority level 2" },
2462         {  0x04,        "call priority level 1" },
2463         {  0x05,        "call priority level 0" },
2464         {  0x06,        "call priority level B" },
2465         {  0x07,        "call priority level A" },
2466         { 0,                    NULL }
2467 };
2468
2469 static int
2470 dissect_rsl_ie_emlpp_prio(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2471 {
2472         proto_item *ti;
2473         proto_tree *ie_tree;
2474         guint8          ie_id;
2475
2476         if(is_mandatory == FALSE){
2477                 ie_id = tvb_get_guint8(tvb,offset);
2478                 if (ie_id != RSL_IE_EMLPP_PRIO)
2479                         return offset;
2480         }
2481
2482         ti = proto_tree_add_text(tree, tvb,offset,2,"eMLPP Priority IE");
2483         ie_tree = proto_item_add_subtree(ti, ett_ie_emlpp_prio);
2484
2485         /* Element identifier */
2486         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2487         offset++;
2488
2489         /* The call priority field (bit 3 to 1 of octet 2) is coded in the same way
2490          * as the call priority field (bit 3 to 1 of octet 5) in the
2491          * Descriptive group or broadcast call reference information element
2492          * as defined in 3GPP TS 24.008.
2493          */
2494         proto_tree_add_item(ie_tree, hf_rsl_emlpp_prio, tvb, offset, 1, FALSE);
2495         offset++;
2496
2497         return offset;
2498 }
2499
2500 /*
2501  * 9.3.50 UIC
2502  */
2503 static int
2504 dissect_rsl_ie_uic(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2505 {
2506         proto_item *ti;
2507         proto_tree *ie_tree;
2508         guint8          ie_id;
2509
2510         if(is_mandatory == FALSE){
2511                 ie_id = tvb_get_guint8(tvb,offset);
2512                 if (ie_id != RSL_IE_UIC)
2513                         return offset;
2514         }
2515
2516         ti = proto_tree_add_text(tree, tvb,offset,0,"UIC IE");
2517         ie_tree = proto_item_add_subtree(ti, ett_ie_uic);
2518
2519         /* Element identifier */
2520         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2521         offset++;
2522
2523         /* Octet 3 bits 1 to 6 contain the radio interface octet 2 bits 3 to 8 of the
2524          * UIC information element as defined in 3GPP TS 44.018.
2525          */
2526         proto_tree_add_text(ie_tree, tvb,offset,1,"UIC");
2527         offset++;
2528
2529         return offset;
2530 }
2531
2532 /*
2533  * 9.3.51 Main channel reference
2534  */
2535
2536 static int
2537 dissect_rsl_ie_main_ch_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2538 {
2539         proto_item *ti;
2540         proto_tree *ie_tree;
2541         guint8          ie_id;
2542
2543         if(is_mandatory == FALSE){
2544                 ie_id = tvb_get_guint8(tvb,offset);
2545                 if (ie_id != RSL_IE_MAIN_CH_REF)
2546                         return offset;
2547         }
2548
2549         ti = proto_tree_add_text(tree, tvb,offset,0,"Main channel reference IE");
2550         ie_tree = proto_item_add_subtree(ti, ett_ie_main_ch_ref);
2551
2552         /* Element identifier */
2553         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2554         offset++;
2555
2556         /* TN is time slot number, binary represented as in 3GPP TS 45.002.
2557          * 3 Bits
2558          */
2559         proto_tree_add_item(ie_tree, hf_rsl_ch_no_TN, tvb, offset, 1, FALSE);
2560         offset++;
2561         return offset;
2562 }
2563
2564 /*
2565  * 9.3.52 MultiRate configuration
2566  */
2567
2568 static int
2569 dissect_rsl_ie_multirate_conf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2570 {
2571         proto_item *ti;
2572         proto_tree *ie_tree;
2573         guint length;
2574         guint8 ie_id;
2575
2576         if(is_mandatory == FALSE){
2577                 ie_id = tvb_get_guint8(tvb,offset);
2578                 if (ie_id != RSL_IE_MULTIRATE_CONF)
2579                         return offset;
2580         }
2581         ti = proto_tree_add_text(tree, tvb,offset,0,"MultiRate configuration IE");
2582         ie_tree = proto_item_add_subtree(ti, ett_ie_multirate_conf);
2583
2584         /* Element identifier */
2585         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2586         offset++;
2587         /* Length */
2588         length = tvb_get_guint8(tvb,offset);
2589         proto_item_set_len(ti, length+2);
2590         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2591         offset++;
2592
2593         /* Rest of element coded as in 3GPP TS 44.018 not including
2594          * 3GPP TS 44.018 element identifier or 3GPP TS 44.018 octet length value
2595          */
2596
2597         de_rr_multirate_conf(tvb, ie_tree, offset, length, NULL, 0);
2598
2599         offset = offset + length;
2600
2601         return offset;
2602 }
2603
2604 /*
2605  * 9.3.53 MultiRate Control
2606  */
2607 static int
2608 dissect_rsl_ie_multirate_cntrl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2609 {
2610         proto_item *ti;
2611         proto_tree *ie_tree;
2612         guint8 ie_id;
2613
2614         if(is_mandatory == FALSE){
2615                 ie_id = tvb_get_guint8(tvb,offset);
2616                 if (ie_id != RSL_IE_MULTIRATE_CNTRL)
2617                         return offset;
2618         }
2619         ti = proto_tree_add_text(tree, tvb,offset,2,"MultiRate Control IE");
2620         ie_tree = proto_item_add_subtree(ti, ett_ie_multirate_cntrl);
2621
2622         /* Element identifier */
2623         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2624         offset++;
2625
2626         /* Bit 8 -5 Spare */
2627         /* The OD field (bit 5 of octet 3) indicates if the BSC expects distant parameters or
2628          * TFO Decision algorithm result from the BTS
2629          */
2630         /* The PRE field (bit 4 of octet 3) indicates if an handover is to be expected soon or not. */
2631         /* The RAE field (bits 2-3, octet 3) defines whether the RATSCCH mechanism is enabled or not.*/
2632         offset++;
2633
2634         return offset;
2635 }
2636
2637 /*
2638  * 9.3.54 Supported Codec Types
2639  * This element indicates the codec types supported by the BSS or remote BSS.
2640  */
2641 static int
2642 dissect_rsl_ie_sup_codec_types(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2643 {
2644         proto_item *ti;
2645         proto_tree *ie_tree;
2646         guint length;
2647         guint8 ie_id;
2648
2649         if(is_mandatory == FALSE){
2650                 ie_id = tvb_get_guint8(tvb,offset);
2651                 if (ie_id != RSL_IE_SUP_CODEC_TYPES)
2652                         return offset;
2653         }
2654         ti = proto_tree_add_text(tree, tvb,offset,0,"Supported Codec Types IE");
2655         ie_tree = proto_item_add_subtree(ti, ett_ie_sup_codec_types);
2656
2657         /* Element identifier */
2658         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2659         offset++;
2660         /* Length */
2661         length = tvb_get_guint8(tvb,offset);
2662         proto_item_set_len(ti, length+2);
2663         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2664         offset++;
2665
2666         proto_tree_add_text(tree, tvb,offset,length,"Codec List");
2667
2668         /* The Codec List field (octet 4) lists the codec types that are supported
2669          * by the BSS and Transcoder, and are therefore potential candidates for TFO
2670          * establishment.
2671          */
2672         /* The Codec List extension 1 field (octet 5) lists additional codec types
2673          * that are supported by the BSS and Transcoder, and are therefore potential
2674          * candidates for TFO establishment. When no codec from this list is supported,
2675          * then this field shall not be sent, and the extension bit of octet 4 shall
2676          * be set to 0.
2677          */
2678         /* If bit 4 of the Codec List field (octet 4) indicates that FR AMR is supported
2679          * or if bit 5 of the Codec List field (octet 4) indicates that HR AMR is supported
2680          * and bit 8 is set to 0, or if bit 6 of the Codec List field (octet 4) indicates
2681          * that UMTS AMR is supported, or if bit 7 of the Codec List field (octet 4)
2682          * indicates that UMTS AMR 2 is supported, or if bit 1, 3, 4 or 5 of the Codec List
2683          * extension 1 field (octet 5) indicates that AMR WB is supported, the following
2684          * two octets (after the Codec List field and its extensions) is present
2685          */
2686
2687         return offset + length;
2688
2689 }
2690 /*
2691  * 9.3.55 Codec Configuration
2692  */
2693 /* The Active Codec Type field (bits 1-8, octet 3) indicates the type of codec in use. It is coded as follows: */
2694 /*
2695 0 0 0 0 . 0 0 0 0: Full Rate Codec in use
2696 0 0 0 0 . 0 0 0 1: Half Rate Codec in use
2697 0 0 0 0 . 0 0 1 0: Enhanced Full Rate Codec in use
2698 0 0 0 0 . 0 0 1 1: FR Adaptive Multi Rate Codec in use
2699 0 0 0 0 . 0 1 0 0: HR Adaptive Multi Rate Codec in use
2700 0 0 0 0 . 0 1 0 1: UMTS Adaptive Multi Rate Codec in use
2701 0 0 0 0 . 0 1 1 0: UMTS Adaptive Multi Rate 2 Codec in use
2702 0 0 0 0 . 1 0 0 1: Full Rate Adaptive Multi-Rate WideBand Codec in use
2703 0 0 0 0 1 0 1 0 UMTS Adaptive Multi-Rate WideBand Codec in use
2704 0 0 0 0 1 0 1 1 8PSK Half Rate Adaptive Multi-Rate Codec in use
2705 0 0 0 0 1 1 0 0 8PSK Full Rate Adaptive Multi-Rate WideBand Codec in use
2706 0 0 0 0 1 1 0 1 8PSK Half Rate Adaptive Multi-Rate WideBand Codec in use
2707 All other values are reserved for future use
2708 */
2709 static int
2710 dissect_rsl_ie_codec_conf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2711 {
2712         proto_item *ti;
2713         proto_tree *ie_tree;
2714         guint length;
2715         guint8 ie_id;
2716
2717         if(is_mandatory == FALSE){
2718                 ie_id = tvb_get_guint8(tvb,offset);
2719                 if (ie_id != RSL_IE_CODEC_CONF)
2720                         return offset;
2721         }
2722         ti = proto_tree_add_text(tree, tvb,offset,0,"Codec Configuration IE");
2723         ie_tree = proto_item_add_subtree(ti, ett_ie_codec_conf);
2724
2725         /* Element identifier */
2726         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2727         offset++;
2728         /* Length */
2729         length = tvb_get_guint8(tvb,offset);
2730         proto_item_set_len(ti, length+2);
2731         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2732         offset++;
2733
2734         /* Active Codec Type */
2735
2736         return offset + length;
2737 }
2738
2739 /*
2740  * 9.3.56 Round Trip Delay
2741  * This element indicates the value of the calculated round trip delay between the BTS
2742  * and the transcoder, or between the BTS and the remote BTS, if TFO is established.
2743  */
2744
2745 static const value_string rsl_delay_ind_vals[] = {
2746         {  0x00,        "The RTD field contains the BTS-Transcoder round trip delay" },
2747         {  0x01,        "The RTD field contains the BTS-Remote BTS round trip delay" },
2748         { 0,                    NULL }
2749 };
2750 static int
2751 dissect_rsl_ie_rtd(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2752 {
2753         proto_item *ti, *rtd_item;
2754         proto_tree *ie_tree;
2755         guint8          ie_id;
2756         guint8          rtd;
2757
2758         if(is_mandatory == FALSE){
2759                 ie_id = tvb_get_guint8(tvb,offset);
2760                 if (ie_id != RSL_IE_RTD)
2761                         return offset;
2762         }
2763
2764         ti = proto_tree_add_text(tree, tvb,offset,0,"Round Trip Delay IE");
2765         ie_tree = proto_item_add_subtree(ti, ett_ie_rtd);
2766
2767         /* Element identifier */
2768         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2769         offset++;
2770
2771         /* The RTD field is the binary representation of the value of the
2772          * round trip delay in 20 ms increments.
2773          */
2774         rtd = (tvb_get_guint8(tvb,offset)>>1)*20;
2775         rtd_item = proto_tree_add_uint(tree, hf_rsl_rtd, tvb,offset,1,rtd);
2776         proto_item_append_text(rtd_item," ms");
2777
2778         /* The Delay IND field indicates if the delay corresponds to a BTS
2779          * to transcoder delay or to a BTS to remote BTS delay.
2780          */
2781         proto_tree_add_item(ie_tree, hf_rsl_delay_ind, tvb, offset, 1, FALSE);
2782         offset++;
2783
2784         return offset;
2785 }
2786 /*
2787  * 9.3.57 TFO Status
2788  * This element indicates if TFO is established. It is coded in 2 octets
2789  */
2790
2791 static const true_false_string rsl_tfo_vals = {
2792   "TFO is established",
2793   "TFO is not established"
2794 };
2795
2796 static int
2797 dissect_rsl_ie_tfo_status(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2798 {
2799         proto_item *ti;
2800         proto_tree *ie_tree;
2801         guint8          ie_id;
2802
2803         if(is_mandatory == FALSE){
2804                 ie_id = tvb_get_guint8(tvb,offset);
2805                 if (ie_id != RSL_IE_TFO_STATUS)
2806                         return offset;
2807         }
2808
2809         ti = proto_tree_add_text(tree, tvb,offset,0,"TFO Status IE");
2810         ie_tree = proto_item_add_subtree(ti, ett_ie_tfo_status);
2811
2812         /* Element identifier */
2813         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2814         offset++;
2815
2816         proto_tree_add_item(ie_tree, hf_rsl_tfo, tvb, offset, 1, FALSE);
2817         offset++;
2818         return offset;
2819 }
2820 /*
2821  * 9.3.58 LLP APDU
2822  */
2823
2824 static int
2825 dissect_rsl_ie_llp_apdu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2826 {
2827         proto_item *ti;
2828         proto_tree *ie_tree;
2829         guint8 length;
2830         int ie_offset;
2831         guint8 ie_id;
2832
2833         if(is_mandatory == FALSE){
2834                 ie_id = tvb_get_guint8(tvb,offset);
2835                 if (ie_id != RSL_IE_LLP_APDU)
2836                         return offset;
2837         }
2838
2839         ti = proto_tree_add_text(tree, tvb,offset,0,"LLP APDU IE");
2840         ie_tree = proto_item_add_subtree(ti, ett_ie_llp_apdu);
2841
2842         /* Element identifier */
2843         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2844         offset++;
2845         /* Length */
2846         length = tvb_get_guint8(tvb, offset);
2847         proto_item_set_len(ti, length+2);
2848         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2849         offset++;
2850
2851         ie_offset = offset;
2852
2853         /* The rest of the information element contains the embedded message
2854          * that contains a Facility Information Element as defined in
2855          * 3GPP TS 44.071 excluding the Facility IEI and length of Facility IEI
2856          * octets defined in 3GPP TS 44.071.
2857          */
2858         /* TODO: Given traces with LLP data this IE could be further dissected */
2859         proto_tree_add_text(tree, tvb,offset,length,
2860                 "Facility Information Element as defined in 3GPP TS 44.071");
2861         return ie_offset + length;
2862 }
2863 /*
2864  * 9.3.59 TFO transparent container
2865  * This is a variable length element that conveys a message associated with TFO protocol,
2866  * as defined in 3GPP TS 28.062. This element can be sent from the BSC to the BTS or
2867  * from the BTS to the BSC. The BTS shall retrieve the information it is able to understand,
2868  * and forward transparently the complete information to the BSC or to the TRAU.
2869  */
2870 static int
2871 dissect_rsl_ie_tfo_transp_cont(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
2872 {
2873         proto_item *ti;
2874         proto_tree *ie_tree;
2875         guint8 length;
2876         int ie_offset;
2877         guint8 ie_id;
2878
2879         if(is_mandatory == FALSE){
2880                 ie_id = tvb_get_guint8(tvb,offset);
2881                 if (ie_id != RSL_IE_TFO_TRANSP_CONT)
2882                         return offset;
2883         }
2884
2885         ti = proto_tree_add_text(tree, tvb,offset,0,"TFO transparent container IE");
2886         ie_tree = proto_item_add_subtree(ti, ett_ie_tfo_transp_cont);
2887
2888         /* Element identifier */
2889         proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
2890         offset++;
2891         /* Length */
2892         length = tvb_get_guint8(tvb, offset);
2893         proto_item_set_len(ti, length+2);
2894         proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
2895         offset++;
2896
2897         ie_offset = offset;
2898
2899         /* The rest of the information element contains the embedded message
2900          * that contains a Facility Information Element as defined in
2901          * 3GPP TS 44.071 excluding the Facility IEI and length of Facility IEI
2902          * octets defined in 3GPP TS 44.071.
2903          */
2904         proto_tree_add_text(tree, tvb,offset,length,
2905                 "Embedded message that contains the TFO configuration");
2906         return ie_offset + length;
2907 }
2908
2909 static int
2910 dissct_rsl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
2911 {
2912         guint8  msg_type;
2913
2914         msg_type = tvb_get_guint8(tvb,offset)&0x7f;
2915         proto_tree_add_item(tree, hf_rsl_msg_type, tvb, offset, 1, FALSE);
2916         offset++;
2917
2918         switch (msg_type){
2919 /* Radio Link Layer Management messages */
2920         /* 8.3.1 DATA REQUEST */
2921         case RSL_MSG_TYPE_DATA_REQ:
2922                 /* Channel number                       9.3.1   M TV 2          */
2923                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2924                 /* Link Identifier                      9.3.2   M TV 2          */
2925                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2926                 /* L3 Information                       9.3.11  M TLV >=3       */
2927                 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, TRUE);
2928                 break;
2929         /* 8.3.2 DATA INDICATION */
2930         case RSL_MSG_TYPE_DATA_IND:
2931                 /* Channel number                       9.3.1   M TV 2          */
2932                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2933                 /* Link Identifier                      9.3.2   M TV 2          */
2934                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2935                 /* L3 Information                       9.3.11  M TLV >=3       */
2936                 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, TRUE);
2937                 break;
2938         /* 8.3.3 ERROR INDICATION */
2939         case RSL_MSG_TYPE_ERROR_IND:
2940                 /* Channel number                       9.3.1   M TV 2          */
2941                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2942                 /* Link Identifier                      9.3.2   M TV 2          */
2943                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2944                 /* RLM Cause                            9.3.22  M TLV 2-4       */
2945                 offset = dissect_rsl_ie_rlm_cause(tvb, pinfo, tree, offset, TRUE);
2946                 break;
2947         /* 8.3.4 ESTABLISH REQUEST */
2948         case RSL_MSG_TYPE_EST_REQ:
2949                 /* Channel number                       9.3.1   M TV 2          */
2950                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2951                 /* Link Identifier                      9.3.2   M TV 2          */
2952                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2953                 break;
2954         /* 8.3.5 ESTABLISH CONFIRM */
2955         case RSL_MSG_TYPE_EST_CONF:
2956                 /* Channel number                       9.3.1   M TV 2          */
2957                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2958                 /* Link Identifier                      9.3.2   M TV 2          */
2959                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2960                 break;
2961         /* 8.3.6 */
2962         case RSL_MSG_EST_IND:
2963                 /*      Channel number                  9.3.1   M TV 2                           */
2964                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2965                 /*      Link Identifier                 9.3.2   M TV 2                           */
2966                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2967                 /*      L3 Information                  9.3.11  O (note 1) TLV 3-23      */
2968                 if(tvb_length_remaining(tvb,offset) >1)
2969                         offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, FALSE);
2970                 break;
2971         /* 8.3.7 RELEASE REQUEST */
2972         case RSL_MSG_REL_REQ:
2973                 /*      Channel number                  9.3.1   M TV 2                           */
2974                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2975                 /*      Link Identifier                 9.3.2   M TV 2                           */
2976                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2977                 /* Release Mode                         9.3.20  M TV 2                          */
2978                 offset = dissect_rsl_ie_rel_mode(tvb, pinfo, tree, offset, TRUE);
2979                 break;
2980         /* 8.3.8 RELEASE CONFIRM */
2981         case RSL_MSG_REL_CONF:
2982                 /*      Channel number                  9.3.1   M TV 2                           */
2983                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2984                 /*      Link Identifier                 9.3.2   M TV 2                           */
2985                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2986                 break;
2987         /* 8.3.9 RELEASE INDICATION */
2988         case RSL_MSG_REL_IND:
2989                 /*      Channel number                  9.3.1   M TV 2                           */
2990                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2991                 /*      Link Identifier                 9.3.2   M TV 2                           */
2992                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
2993                 break;
2994         /* 8.3.10 UNIT DATA REQUEST 10 */
2995         case RSL_MSG_UNIT_DATA_REQ:
2996                 /*      Channel number                  9.3.1   M TV 2                           */
2997                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
2998                 /*      Link Identifier                 9.3.2   M TV 2                           */
2999                 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, TRUE);
3000                 /*      L3 Information                  9.3.11  O (note 1) TLV 3-23      */
3001                 if(tvb_length_remaining(tvb,offset) > 0)
3002                         offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, FALSE);
3003                 break;
3004 /* Common Channel Management/TRX Management messages */
3005         /* 8.5.1 BCCH INFORMATION 17*/
3006         case RSL_MSG_BCCH_INFO:
3007                 /*      Channel number                  9.3.1   M TV 2 */
3008                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
3009                 /*      System Info Type                9.3.30  M TV 2 */
3010                 offset = dissect_rsl_ie_sys_info_type(tvb, pinfo, tree, offset, TRUE);
3011                 /*      Full BCCH Info (SYS INFO) 9.3.39 O 1) TLV 25 */
3012                 if(tvb_length_remaining(tvb,offset) > 0)
3013                         offset = dissect_rsl_ie_full_bcch_inf(tvb, pinfo, tree, offset, TRUE);
3014                 /*      Starting Time                   9.3.23  O 2) TV 3 */
3015                 if(tvb_length_remaining(tvb,offset) > 0)
3016                         offset = dissect_rsl_ie_staring_time(tvb, pinfo, tree, offset, FALSE);
3017                 break;
3018         /* 8.5.2 CCCH LOAD INDICATION 18*/
3019         case RSL_MSG_CCCH_LOAD_IND:
3020                 /*      Channel number (note)   9.3.1   M TV 2 */
3021                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
3022                 /* Either RACH Load or Paging Load present */
3023                 /*      RACH Load                               9.3.18  C 1) TLV >=8 */
3024                 offset = dissect_rsl_ie_rach_load(tvb, pinfo, tree, offset, FALSE);
3025                 /*      Paging Load                             9.3.15  C 2) TV 3 */
3026                 if(tvb_length_remaining(tvb,offset) > 0)
3027                         offset = dissect_rsl_ie_paging_load(tvb, pinfo, tree, offset, FALSE);
3028                 break;
3029         /* 8.5.3 */
3030         case RSL_MSG_CHANRQD: /* 19 */
3031                 /* Channel number                       9.3.1   M TV 2 */
3032                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
3033                 /* Request Reference            9.3.19  M TV 4 */
3034                 offset = dissect_rsl_ie_req_ref(tvb, pinfo, tree, offset, TRUE);
3035                 /* Access Delay                         9.3.17  M TV 2 */
3036                 offset = dissect_rsl_ie_access_delay(tvb, pinfo, tree, offset, TRUE);
3037                 /* Physical Context                     9.3.16  O 1) TLV >=2 */
3038                 if(tvb_length_remaining(tvb,offset) > 0)
3039                         offset = dissect_rsl_ie_phy_ctx(tvb, pinfo, tree, offset, FALSE);
3040                 break;
3041         /* 8.5.4 DELETE INDICATION */
3042         case RSL_MSG_DELETE_IND: /* 20 */
3043                 /* Channel number                       9.3.1   M TV 2 */
3044                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
3045                 /* Full Imm. Assign Info        9.3.35  M TLV 25 */
3046                 offset = dissect_rsl_ie_full_imm_ass_inf(tvb, pinfo, tree, offset, TRUE);
3047                 break;
3048         case RSL_MSG_PAGING_CMD:        /* 21 */
3049                 /* Channel number                       9.3.1   M TV 2 */
3050                 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
3051                 /* Paging Group                         9.3.14  M TV 2 2 */
3052                 offset = dissect_rsl_ie_paging_grp(tvb, pinfo, tree, offset, TRUE);
3053                 /* MS Identity                          9.3.12  M TLV 2-10 2 */
3054                 offset = dissect_rsl_ie_ms_id(tvb, pinfo, tree, offset, TRUE);
3055                 /* Channel Needed                       9.3.40  O 1) TV 2 2 */
3056                 if(tvb_length_remaining(tvb,offset) > 0)
3057                         offset = dissect_rsl_ie_ch_needed(tvb, pinfo, tree, offset, FALSE);
3058                 /* eMLPP Priority                       9.3.49  O 2) TV 2 2 */
3059                 if(tvb_length_remaining(tvb,offset) > 0)
3060                         offset = dissect_rsl_ie_emlpp_prio(tvb, pinfo, tree, offset, FALSE);
3061                 break;
3062         /* 8.5.6 IMMEDIATE ASSIGN COMMAND */
3063         case RSL_MSG_IMM_ASS_CMD:       /* 22 */
3064                 /* Channel number                       9.3.1   M TV 2&nbs