Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-rsl.c
blob8e5b90d08e3ed2263df0ce37d633223355545b0a
1 /* packet-rsl.c
2 * Routines for Radio Signalling Link (RSL) dissection.
4 * Copyright 2007, 2011, Anders Broman <anders.broman@ericsson.com>
5 * Copyright 2009-2011, Harald Welte <laforge@gnumonks.org>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * Copied from packet-cops.c
13 * SPDX-License-Identifier: GPL-2.0-or-later
15 * REF: 3GPP TS 48.058 version 6.1.0 Release 6
16 * http://www.3gpp.org/ftp/Specs/html-info/48058.htm
18 * Huawei paging encapsulation in RSL from:
19 * https://patents.google.com/patent/EP2192796B1/en
22 #include "config.h"
24 #include <epan/packet.h>
26 #include "packet-gsm_a_common.h"
27 #include "lapd_sapi.h"
28 #include <epan/prefs.h>
29 #include <epan/expert.h>
30 #include <epan/conversation.h>
31 #include <epan/tfs.h>
32 #include <epan/unit_strings.h>
34 #include <wsutil/array.h>
36 #include "packet-rtp.h"
37 #include "packet-rtcp.h"
39 void proto_register_rsl(void);
40 void proto_reg_handoff_rsl(void);
42 uint16_t parse_reduced_frame_number(tvbuff_t *tvb, const int offset);
44 /* Initialize the protocol and registered fields */
45 static int proto_rsl;
47 static int hf_rsl_msg_type;
48 static int hf_rsl_T_bit;
49 static int hf_rsl_msg_dsc;
50 static int hf_rsl_ie_id;
51 static int hf_rsl_ie_length;
52 static int hf_rsl_ch_no_Cbits;
53 static int hf_rsl_ch_no_TN;
54 static int hf_rsl_acc_delay;
55 static int hf_rsl_rach_slot_cnt;
56 static int hf_rsl_rach_busy_cnt;
57 static int hf_rsl_rach_acc_cnt;
58 static int hf_rsl_req_ref_ra;
59 static int hf_rsl_req_ref_ra_est_cause;
60 static int hf_rsl_req_ref_T1prim;
61 static int hf_rsl_req_ref_T3;
62 static int hf_rsl_req_ref_T2;
63 static int hf_rsl_req_ref_rfn;
64 static int hf_rsl_timing_adv;
65 static int hf_rsl_ho_ref;
66 static int hf_rsl_l1inf_power_lev;
67 static int hf_rsl_l1inf_fpc;
68 static int hf_rsl_l1inf_srr;
69 static int hf_rsl_ms_power_lev;
70 static int hf_rsl_ms_fpc;
71 static int hf_rsl_act_timing_adv;
72 static int hf_rsl_phy_ctx;
73 static int hf_rsl_na;
74 static int hf_rsl_ch_type;
75 static int hf_rsl_prio;
76 static int hf_rsl_sapi;
77 static int hf_rsl_rbit;
78 static int hf_rsl_a3a2;
79 static int hf_rsl_a1_0;
80 static int hf_rsl_a1_1;
81 static int hf_rsl_a1_2;
82 static int hf_rsl_epc_mode;
83 static int hf_rsl_bs_fpc_epc_mode;
84 static int hf_rsl_bs_power;
85 static int hf_rsl_cm_dtxd;
86 static int hf_rsl_cm_dtxu;
87 static int hf_rsl_speech_or_data;
88 static int hf_rsl_ch_rate_and_type;
89 static int hf_rsl_speech_coding_alg;
90 static int hf_rsl_t_nt_bit;
91 static int hf_rsl_ra_if_data_rte;
92 static int hf_rsl_data_rte;
93 static int hf_rsl_alg_id;
94 static int hf_rsl_key;
95 static int hf_rsl_cause;
96 static int hf_rsl_rel_mode;
97 static int hf_rsl_interf_band;
98 static int hf_rsl_interf_band_reserved;
99 static int hf_rsl_meas_res_no;
100 static int hf_rsl_extension_bit;
101 static int hf_rsl_dtxd;
102 static int hf_rsl_rxlev_full_up;
103 static int hf_rsl_rxlev_sub_up;
104 static int hf_rsl_rxqual_full_up;
105 static int hf_rsl_rxqual_sub_up;
106 static int hf_rsl_class;
107 static int hf_rsl_cause_value;
108 static int hf_rsl_paging_grp;
109 static int hf_rsl_paging_load;
110 static int hf_rsl_sys_info_type;
111 static int hf_rsl_timing_offset;
112 static int hf_rsl_ch_needed;
113 static int hf_rsl_cbch_load_type;
114 static int hf_rsl_msg_slt_cnt;
115 static int hf_rsl_ch_ind;
116 static int hf_rsl_command;
117 static int hf_rsl_command_ext;
118 static int hf_rsl_emlpp_prio;
119 static int hf_rsl_rtd;
120 static int hf_rsl_delay_ind;
121 static int hf_rsl_tfo;
122 static int hf_rsl_speech_mode_s;
123 static int hf_rsl_speech_mode_m;
124 static int hf_rsl_conn_id;
125 static int hf_rsl_rtp_payload;
126 static int hf_rsl_rtp_csd_fmt_d;
127 static int hf_rsl_rtp_csd_fmt_ir;
128 static int hf_rsl_local_port;
129 static int hf_rsl_remote_port;
130 static int hf_rsl_local_ip;
131 static int hf_rsl_remote_ip;
132 static int hf_rsl_cstat_tx_pkts;
133 static int hf_rsl_cstat_tx_octs;
134 static int hf_rsl_cstat_rx_pkts;
135 static int hf_rsl_cstat_rx_octs;
136 static int hf_rsl_cstat_lost_pkts;
137 static int hf_rsl_cstat_ia_jitter;
138 static int hf_rsl_cstat_avg_tx_dly;
139 /* Generated from convert_proto_tree_add_text.pl */
140 static int hf_rsl_channel_description_tag;
141 static int hf_rsl_mobile_allocation_tag;
142 static int hf_rsl_mobile_allocation_len;
143 static int hf_rsl_no_resources_required;
144 static int hf_rsl_llsdu_ccch;
145 static int hf_rsl_llsdu_sacch;
146 static int hf_rsl_llsdu;
147 static int hf_rsl_rach_supplementary_information;
148 static int hf_rsl_full_immediate_assign_info_field;
149 static int hf_rsl_layer_3_message;
150 static int hf_rsl_descriptive_group_or_broadcast_call_reference;
151 static int hf_rsl_group_channel_description;
152 static int hf_rsl_uic;
153 static int hf_rsl_codec_list;
154 static int hf_rsl_cb_cmd_type;
155 static int hf_rsl_cb_def_bcast;
156 static int hf_rsl_cb_last_block;
157 static int hf_rsl_etws_pn;
159 /* Encapsulating paging messages into a packet REF: EP2192796 - proprietor Huawei */
160 static int hf_rsl_paging_spare;
161 static int hf_rsl_paging_msg_no;
162 static int hf_rsl_paging_package_ch_no;
163 static int hf_rsl_paging_package_ch_needed;
164 static int hf_rsl_paging_emlpp_prio;
165 static int hf_rsl_paging_type;
166 static int hf_rsl_paging_group_cs;
167 static int hf_rsl_paging_group_empty_package;
168 static int hf_rsl_paging_group_ps_spare;
170 /* Physical Context dissection */
171 static int hf_rsl_phy_ctx_ie_id;
172 static int hf_rsl_phy_ctx_ext_rand_access;
173 static int hf_rsl_phy_ctx_ab_rx_lvl;
174 static int hf_rsl_phy_ctx_ab_err_bits;
175 static int hf_rsl_phy_ctx_rx_lvl_ext;
177 /* Osmocom specific IEs */
178 static int hf_rsl_osmo_rep_acch_rxqual;
179 static int hf_rsl_osmo_rep_acch_ul_sacch;
180 static int hf_rsl_osmo_rep_acch_dl_sacch;
181 static int hf_rsl_osmo_rep_acch_dl_facch_all;
182 static int hf_rsl_osmo_rep_acch_dl_facch_cmd;
183 static int hf_rsl_osmo_top_acch_val;
184 static int hf_rsl_osmo_top_acch_sacch;
185 static int hf_rsl_osmo_top_acch_facch;
186 static int hf_rsl_osmo_top_acch_rxqual;
187 static int hf_rsl_osmo_tsc_set;
188 static int hf_rsl_osmo_tsc_val;
189 static int hf_rsl_osmo_osmux_cid;
191 /* Initialize the subtree pointers */
192 static int ett_rsl;
193 static int ett_ie_link_id;
194 static int ett_ie_act_type;
195 static int ett_ie_bs_power;
196 static int ett_ie_bs_power_params;
197 static int ett_ie_ch_id;
198 static int ett_ie_ch_mode;
199 static int ett_ie_enc_inf;
200 static int ett_ie_ch_no;
201 static int ett_ie_frame_no;
202 static int ett_ie_ho_ref;
203 static int ett_ie_l1_inf;
204 static int ett_ie_L3_inf;
205 static int ett_ie_ms_id;
206 static int ett_ie_ms_pow;
207 static int ett_ie_ms_pow_params;
208 static int ett_ie_phy_ctx;
209 static int ett_ie_paging_grp;
210 static int ett_ie_paging_load;
211 static int ett_ie_access_delay;
212 static int ett_ie_rach_load;
213 static int ett_ie_req_ref;
214 static int ett_ie_req_ref_ra;
215 static int ett_ie_rel_mode;
216 static int ett_ie_resource_inf;
217 static int ett_ie_rlm_cause;
218 static int ett_ie_staring_time;
219 static int ett_ie_timing_adv;
220 static int ett_ie_uplink_meas;
221 static int ett_ie_full_imm_ass_inf;
222 static int ett_ie_smscb_inf;
223 static int ett_ie_ms_timing_offset;
224 static int ett_ie_err_msg;
225 static int ett_ie_full_bcch_inf;
226 static int ett_ie_ch_needed;
227 static int ett_ie_cb_cmd_type;
228 static int ett_ie_smscb_mess;
229 static int ett_ie_cbch_load_inf;
230 static int ett_ie_smscb_ch_ind;
231 static int ett_ie_grp_call_ref;
232 static int ett_ie_ch_desc;
233 static int ett_ie_nch_drx;
234 static int ett_ie_cmd_ind;
235 static int ett_ie_emlpp_prio;
236 static int ett_ie_uic;
237 static int ett_ie_main_ch_ref;
238 static int ett_ie_multirate_conf;
239 static int ett_ie_multirate_cntrl;
240 static int ett_ie_sup_codec_types;
241 static int ett_ie_codec_conf;
242 static int ett_ie_rtd;
243 static int ett_ie_tfo_status;
244 static int ett_ie_llp_apdu;
245 static int ett_ie_tfo_transp_cont;
246 static int ett_ie_cause;
247 static int ett_ie_meas_res_no;
248 static int ett_ie_message_id;
249 static int ett_ie_sys_info_type;
250 static int ett_ie_speech_mode;
251 static int ett_ie_conn_id;
252 static int ett_ie_remote_ip;
253 static int ett_ie_remote_port;
254 static int ett_ie_local_port;
255 static int ett_ie_local_ip;
256 static int ett_ie_rtp_payload;
257 static int ett_ie_etws_pn;
258 static int ett_ie_osmo_rep_acch_cap;
259 static int ett_ie_osmo_top_acch_cap;
260 static int ett_ie_osmo_training_seq;
262 /* Encapsulating paging messages into a packet REF: EP2192796 - proprietor Huawei */
263 static int ett_ie_paging_package;
264 static int ett_ie_paging_package_number;
265 static int ett_ie_paging_package_info;
266 static int ett_ie_paging_package_ch_a_emlpp;
267 static int ett_ie_paging_group_paras;
269 /* Physical Context dissection */
270 static int ett_phy_ctx_ie;
271 static int ett_phy_ctx_ie_ext_rand_access;
272 static int ett_phy_ctx_ab_rx_lvl_err_bits;
273 static int ett_phy_ctx_rxlvl_ext;
275 /* Generated from convert_proto_tree_add_text.pl */
276 static expert_field ei_rsl_speech_or_data_indicator;
277 static expert_field ei_rsl_facility_information_element_3gpp_ts_44071;
278 static expert_field ei_rsl_embedded_message_tfo_configuration;
279 static expert_field ei_rsl_mobile_allocation_deprecated;
281 static proto_tree *top_tree;
282 static dissector_handle_t rsl_handle;
283 static dissector_handle_t gsm_cbch_handle;
284 static dissector_handle_t gsm_cbs_handle;
285 static dissector_handle_t gsm_a_ccch_handle;
286 static dissector_handle_t gsm_a_dtap_handle;
287 static dissector_handle_t gsm_a_sacch_handle;
289 /* Decode things as nanoBTS traces */
290 static bool global_rsl_use_nano_bts;
292 /* Decode Osmocom specific messages and IEs */
293 static bool global_rsl_use_osmo_bts;
295 /* Decode things in Physical Context Information field. */
296 static bool global_rsl_dissect_phy_ctx_inf = true;
298 /* Forward declarations */
299 static int dissct_rsl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset);
301 static const true_false_string rsl_t_bit_vals = {
302 "Considered transparent by BTS",
303 "Not considered transparent by BTS"
306 static const true_false_string rsl_na_vals = {
307 "Not Applicable",
308 "Applicable"
311 static const true_false_string rsl_extension_bit_value = {
312 "Extension",
313 "No Extension"
317 * 9.1 Message discriminator
319 /* Radio link Layer Management Messages */
320 static const value_string rsl_msg_disc_vals[] = {
321 { 0x00, "Reserved" },
322 { 0x01, "Radio Link Layer Management messages" },
323 { 0x04, "Dedicated Channel Management messages" },
324 { 0x06, "Common Channel Management messages" },
325 { 0x08, "TRX Management messages" },
326 { 0x10, "Location Services messages" },
327 { 0x3f, "ip.access Vendor Specific messages" },
328 { 0x55, "HUAWEI Paging Extension" },
329 { 0, NULL }
331 #define RSL_MSGDISC_IPACCESS 0x3f
333 * 9.2 MESSAGE TYPE
335 /* Radio link Layer Management Messages */
336 #define RSL_MSG_TYPE_DATA_REQ 1 /* 0x01 */
337 #define RSL_MSG_TYPE_DATA_IND 2 /* 0x02 */
338 #define RSL_MSG_TYPE_ERROR_IND 3 /* 0x03 */
339 #define RSL_MSG_TYPE_EST_REQ 4 /* 0x04 */
340 #define RSL_MSG_TYPE_EST_CONF 5 /* 0x05 */
341 #define RSL_MSG_EST_IND 6 /* 0x06 */
342 #define RSL_MSG_REL_REQ 7 /* 0x07 */
343 #define RSL_MSG_REL_CONF 8 /* 0x08 */
344 #define RSL_MSG_REL_IND 9 /* 0x09 */
345 #define RSL_MSG_UNIT_DATA_REQ 10 /* 0x0a */
346 #define RSL_MSG_UNIT_DATA_IND 11 /* 0x0b */
347 /* Common Channel Management messages */
348 #define RSL_MSG_BCCH_INFO 17 /* 0x11 */
349 #define RSL_MSG_CCCH_LOAD_IND 18 /* 0x12 */
350 #define RSL_MSG_CHANRQD 19 /* 0x13 */
351 #define RSL_MSG_DELETE_IND 20 /* 0x14 */
352 #define RSL_MSG_PAGING_CMD 21 /* 0x15 */
353 #define RSL_MSG_IMM_ASS_CMD 22 /* 0x16 */
354 #define RSL_MSG_SMS_BC_REQ 23 /* 0x17 8.5.7 */
356 /* Encapsulating paging messages into a packet REF: EP2192796 - proprietor Huawei */
357 #define RSL_MSG_TYPE_PAGING 24 /* 0x18 */
359 /* TRX Management messages */
360 #define RSL_MSG_RF_RES_IND 25 /* 8.6.1 */
361 #define RSL_MSG_SACCH_FILL 26 /* 8.6.2 */
362 #define RSL_MSG_OVERLOAD 27 /* 8.6.3 */
363 #define RSL_MSG_ERROR_REPORT 28 /* 8.6.4 */
364 #define RSL_MSG_SMS_BC_CMD 29 /* 8.5.8 */
365 #define RSL_MSG_CBCH_LOAD_IND 30 /* 8.5.9 */
366 #define RSL_MSG_NOT_CMD 31 /* 8.5.10 */
368 /* 0 0 1 - - - - - Dedicated Channel Management messages: */
369 #define RSL_MSG_CHAN_ACTIV 33
370 #define RSL_MSG_CHAN_ACTIV_ACK 34
371 #define RSL_MSG_CHAN_ACTIV_N_ACK 35
372 #define RSL_MSG_CONN_FAIL 36
373 #define RSL_MSG_DEACTIVATE_SACCH 37
375 #define RSL_MSG_ENCR_CMD 38 /* 8.4.6 */
376 #define RSL_MSG_HANDODET 39 /* 8.4.7 */
377 #define RSL_MSG_MEAS_RES 40 /* 8.4.8 */
378 #define RSL_MSG_MODE_MODIFY_REQ 41 /* 8.4.9 */
379 #define RSL_MSG_MODE_MODIFY_ACK 42 /* 8.4.10 */
380 #define RSL_MSG_MODE_MODIFY_NACK 43 /* 8.4.11 */
381 #define RSL_MSG_PHY_CONTEXT_REQ 44 /* 8.4.12 */
382 #define RSL_MSG_PHY_CONTEXT_CONF 45 /* 8.4.13 */
383 #define RSL_MSG_RF_CHAN_REL 46 /* 8.4.14 */
384 #define RSL_MSG_MS_POWER_CONTROL 47 /* 8.4.15 */
385 #define RSL_MSG_BS_POWER_CONTROL 48 /* 8.4.16 */
386 #define RSL_MSG_PREPROC_CONFIG 49 /* 8.4.17 */
387 #define RSL_MSG_PREPROC_MEAS_RES 50 /* 8.4.18 */
388 #define RSL_MSG_RF_CHAN_REL_ACK 51 /* 8.4.19 */
389 #define RSL_MSG_SACCH_INFO_MODIFY 52 /* 8.4.20 */
390 #define RSL_MSG_TALKER_DET 53 /* 8.4.21 */
391 #define RSL_MSG_LISTENER_DET 54 /* 8.4.22 */
392 #define RSL_MSG_REMOTE_CODEC_CONF_REP 55 /* 8.4.23 */
393 #define RSL_MSG_R_T_D_REP 56 /* 8.4.24 */
394 #define RSL_MSG_PRE_HANDO_NOTIF 57 /* 8.4.25 */
395 #define RSL_MSG_MR_CODEC_MOD_REQ 58 /* 8.4.26 */
396 #define RSL_MSG_MR_CODEC_MOD_ACK 59 /* 8.4.27 */
397 #define RSL_MSG_MR_CODEC_MOD_NACK 60 /* 8.4.28 */
398 #define RSL_MSG_MR_CODEC_MOD_PER 61 /* 8.4.29 */
399 #define RSL_MSG_TFO_REP 62 /* 8.4.30 */
400 #define RSL_MSG_TFO_MOD_REQ 63 /* 8.4.31 */
401 /* 0 1 - - - - - - Location Services messages: */
402 #define RSL_MSG_LOC_INF 65 /* 8.7.1 */
404 /* Vendor-Specific messages of ip.access nanoBTS. There is no public documentation
405 * about those extensions, all information in this dissector is based on lawful
406 * protocol reverse enginering by Harald Welte <laforge@gnumonks.org> */
407 #define RSL_MSG_TYPE_IPAC_MEAS_PP_DEF 0x60
408 #define RSL_MSG_TYPE_IPAC_HO_CAND_INQ 0x61
409 #define RSL_MSG_TYPE_IPAC_HO_CAND_RESP 0x62
411 #define RSL_MSG_TYPE_IPAC_PDCH_ACT 0x48
412 #define RSL_MSG_TYPE_IPAC_PDCH_ACT_ACK 0x49
413 #define RSL_MSG_TYPE_IPAC_PDCH_ACT_NACK 0x4a
414 #define RSL_MSG_TYPE_IPAC_PDCH_DEACT 0x4b
415 #define RSL_MSG_TYPE_IPAC_PDCH_DEACT_ACK 0x4c
416 #define RSL_MSG_TYPE_IPAC_PDCH_DEACT_NACK 0x4d
418 #define RSL_MSG_TYPE_IPAC_CRCX 0x70
419 #define RSL_MSG_TYPE_IPAC_CRCX_ACK 0x71
420 #define RSL_MSG_TYPE_IPAC_CRCX_NACK 0x72
421 #define RSL_MSG_TYPE_IPAC_MDCX 0x73
422 #define RSL_MSG_TYPE_IPAC_MDCX_ACK 0x74
423 #define RSL_MSG_TYPE_IPAC_MDCX_NACK 0x75
424 #define RSL_MSG_TYPE_IPAC_DLCX_IND 0x76
425 #define RSL_MSG_TYPE_IPAC_DLCX 0x77
426 #define RSL_MSG_TYPE_IPAC_DLCX_ACK 0x78
427 #define RSL_MSG_TYPE_IPAC_DLCX_NACK 0x79
428 #define RSL_MSG_TYPE_OSMO_ETWS_CMD 0x7f
430 #define RSL_IE_IPAC_SRTP_CONFIG 0xe0
431 #define RSL_IE_IPAC_PROXY_UDP 0xe1
432 #define RSL_IE_IPAC_BSCMPL_TOUT 0xe2
433 #define RSL_IE_IPAC_REMOTE_IP 0xf0
434 #define RSL_IE_IPAC_REMOTE_PORT 0xf1
435 #define RSL_IE_IPAC_RTP_PAYLOAD 0xf2
436 #define RSL_IE_IPAC_LOCAL_PORT 0xf3
437 #define RSL_IE_IPAC_SPEECH_MODE 0xf4
438 #define RSL_IE_IPAC_LOCAL_IP 0xf5
439 #define RSL_IE_IPAC_CONN_STAT 0xf6
440 #define RSL_IE_IPAC_HO_C_PARMS 0xf7
441 #define RSL_IE_IPAC_CONN_ID 0xf8
442 #define RSL_IE_IPAC_RTP_CSD_FMT 0xf9
443 #define RSL_IE_IPAC_RTP_JIT_BUF 0xfa
444 #define RSL_IE_IPAC_RTP_COMPR 0xfb
445 #define RSL_IE_IPAC_RTP_PAYLOAD2 0xfc
446 #define RSL_IE_IPAC_RTP_MPLEX 0xfd
447 #define RSL_IE_IPAC_RTP_MPLEX_ID 0xfe
449 /* Osmocom specific RSL IEs */
450 #define RSL_IE_OSMO_REP_ACCH_CAP 0x60
451 #define RSL_IE_OSMO_TRAINING_SEQUENCE 0x61
452 #define RSL_IE_OSMO_TOP_ACCH_CAP 0x62
453 #define RSL_IE_OSMO_OSMUX_CID 0x63
455 static const value_string rsl_msg_type_vals[] = {
456 /* 0 0 0 0 - - - - Radio Link Layer Management messages: */
457 /* 0x01 */ { RSL_MSG_TYPE_DATA_REQ, "DATA REQuest" }, /* 8.3.1 */
458 /* 0x02 */ { RSL_MSG_TYPE_DATA_IND, "DATA INDication" }, /* 8.3.2 */
459 /* 0x03 */ { RSL_MSG_TYPE_ERROR_IND, "ERROR INDication" }, /* 8.3.3 */
460 /* 0x04 */ { RSL_MSG_TYPE_EST_REQ, "ESTablish REQuest" }, /* 8.3.4 */
461 /* 0x05 */ { RSL_MSG_TYPE_EST_CONF, "ESTablish CONFirm" }, /* 8.3.5 */
462 /* 0x06 */ { RSL_MSG_EST_IND, "ESTablish INDication" }, /* 8.3.6 */
463 /* 0x07 */ { RSL_MSG_REL_REQ, "RELease REQuest" }, /* 8.3.7 */
464 /* 0x08 */ { RSL_MSG_REL_CONF, "RELease CONFirm" }, /* 8.3.8 */
465 /* 0x09 */ { RSL_MSG_REL_IND, "RELease INDication" }, /* 8.3.9 */
466 /* 0x0a */ { RSL_MSG_UNIT_DATA_REQ, "UNIT DATA REQuest" }, /* 8.3.10 */
467 /* 0x0b */ { RSL_MSG_UNIT_DATA_IND, "UNIT DATA INDication" }, /* 8.3.11 */
468 /* 0 0 0 1 - - - - Common Channel Management/TRX Management messages: */
469 /* 0x11 */ { RSL_MSG_BCCH_INFO, "BCCH INFOrmation" }, /* 8.5.1 */
470 /* 0x12 */ { RSL_MSG_CCCH_LOAD_IND, "CCCH LOAD INDication" }, /* 8.5.2 */
471 /* 0x13 */ { RSL_MSG_CHANRQD, "CHANnel ReQuireD" }, /* 8.5.3 */
472 /* 0x14 */ { RSL_MSG_DELETE_IND, "DELETE INDication" }, /* 8.5.4 */
473 /* 0x15 */ { RSL_MSG_PAGING_CMD, "PAGING CoMmanD" }, /* 8.5.5 */
474 /* 0x16 */ { RSL_MSG_IMM_ASS_CMD, "IMMEDIATE ASSIGN COMMAND" }, /* 8.5.6 */
475 /* 0x17 */ { RSL_MSG_SMS_BC_REQ, "SMS BroadCast REQuest" }, /* 8.5.7 */
477 /* Encapsulating paging messages into a packet EP2192796 - proprietor Huawei */
478 /* 0x18 */ { RSL_MSG_TYPE_PAGING, "PAGING Huawei extension" },
480 /* 0x19 */ { RSL_MSG_RF_RES_IND, "RF RESource INDication" }, /* 8.6.1 */
481 /* 0x1a */ { RSL_MSG_SACCH_FILL, "SACCH FILLing" }, /* 8.6.2 */
482 /* 0x1b */ { RSL_MSG_OVERLOAD, "OVERLOAD" }, /* 8.6.3 */
483 /* 0x1c */ { RSL_MSG_ERROR_REPORT, "ERROR REPORT" }, /* 8.6.4 */
484 /* 0x1d */ { RSL_MSG_SMS_BC_CMD, "SMS BroadCast CoMmanD" }, /* 8.5.8 */
485 /* 0x1e */ { RSL_MSG_CBCH_LOAD_IND, "CBCH LOAD INDication" }, /* 8.5.9 */
486 /* 0x1f */ { RSL_MSG_NOT_CMD, "NOTification CoMmanD" }, /* 8.5.10 */
488 /* 0 0 1 - - - - - Dedicated Channel Management messages: */
489 /* 0x21 */ { RSL_MSG_CHAN_ACTIV, "CHANnel ACTIVation" }, /* 8.4.1 */
490 /* 0x22 */ { RSL_MSG_CHAN_ACTIV_ACK, "CHANnel ACTIVation ACKnowledge" }, /* 8.4.2 */
491 /* 0x23 */ { RSL_MSG_CHAN_ACTIV_N_ACK, "CHANnel ACTIVation Negative ACK" }, /* 8.4.3 */
492 /* 0x24 */ { RSL_MSG_CONN_FAIL, "CONNection FAILure" }, /* 8.4.4 */
493 /* 0x25 */ { RSL_MSG_DEACTIVATE_SACCH, "DEACTIVATE SACCH" }, /* 8.4.5 */
494 /* 0x26 */ { RSL_MSG_ENCR_CMD, "ENCRyption CoMmanD" }, /* 8.4.6 */
495 /* 0x27 */ { RSL_MSG_HANDODET, "HANDOver DETection" }, /* 8.4.7 */
496 /* 0x28 */ { RSL_MSG_MEAS_RES, "MEASurement RESult" }, /* 8.4.8 */
497 /* 0x29 */ { RSL_MSG_MODE_MODIFY_REQ, "MODE MODIFY REQuest" }, /* 8.4.9 */
498 /* 0x2a */ { RSL_MSG_MODE_MODIFY_ACK, "MODE MODIFY ACKnowledge" }, /* 8.4.10 */
499 /* 0x2v */ { RSL_MSG_MODE_MODIFY_NACK, "MODE MODIFY Negative ACKnowledge" }, /* 8.4.11 */
500 /* 0x2b */ { RSL_MSG_PHY_CONTEXT_REQ, "PHYsical CONTEXT REQuest" }, /* 8.4.12 */
501 /* 0x2d */ { RSL_MSG_PHY_CONTEXT_CONF, "PHYsical CONTEXT CONFirm" }, /* 8.4.13 */
502 /* 0x2e */ { RSL_MSG_RF_CHAN_REL, "RF CHANnel RELease" }, /* 8.4.14 */
503 /* 0x2f */ { RSL_MSG_MS_POWER_CONTROL, "MS POWER CONTROL" }, /* 8.4.15 */
504 /* 0x30 */ { RSL_MSG_BS_POWER_CONTROL, "BS POWER CONTROL" }, /* 8.4.16 */
505 /* 0x31 */ { RSL_MSG_PREPROC_CONFIG, "PREPROCess CONFIGure" }, /* 8.4.17 */
506 /* 0x32 */ { RSL_MSG_PREPROC_MEAS_RES, "PREPROCessed MEASurement RESult" }, /* 8.4.18 */
507 /* 0x33 */ { RSL_MSG_RF_CHAN_REL_ACK, "RF CHANnel RELease ACKnowledge" }, /* 8.4.19 */
508 /* 0x34 */ { RSL_MSG_SACCH_INFO_MODIFY, "SACCH INFO MODIFY" }, /* 8.4.20 */
509 /* 0x35 */ { RSL_MSG_TALKER_DET, "TALKER DETection" }, /* 8.4.21 */
510 /* 0x36 */ { RSL_MSG_LISTENER_DET, "LISTENER DETection" }, /* 8.4.22 */
511 /* 0x37 */ { RSL_MSG_REMOTE_CODEC_CONF_REP, "REMOTE CODEC CONFiguration REPort" }, /* 8.4.23 */
512 /* 0x38 */ { RSL_MSG_R_T_D_REP, "Round Trip Delay REPort" }, /* 8.4.24 */
513 /* 0x39 */ { RSL_MSG_PRE_HANDO_NOTIF, "PRE-HANDOver NOTIFication" }, /* 8.4.25 */
514 /* 0x3a */ { RSL_MSG_MR_CODEC_MOD_REQ, "MultiRate CODEC MODification REQuest" }, /* 8.4.26 */
515 /* 0x3b */ { RSL_MSG_MR_CODEC_MOD_ACK, "MultiRate CODEC MOD ACKnowledge" }, /* 8.4.27 */
516 /* 0x3c */ { RSL_MSG_MR_CODEC_MOD_NACK, "MultiRate CODEC MOD Negative ACKnowledge" }, /* 8.4.28 */
517 /* 0x3d */ { RSL_MSG_MR_CODEC_MOD_PER, "MultiRate CODEC MOD PERformed" }, /* 8.4.29 */
518 /* 0x3e */ { RSL_MSG_TFO_REP, "TFO REPort" }, /* 8.4.30 */
519 /* 0x3f */ { RSL_MSG_TFO_MOD_REQ, "TFO MODification REQuest" }, /* 8.4.31 */
520 /* 0 1 - - - - - - Location Services messages: */
521 /* 0x41 */ { 0x41, "Location Information" }, /* 8.7.1 */
522 /* ip.access */
523 /* 0x48 */ { RSL_MSG_TYPE_IPAC_PDCH_ACT, "ip.access PDCH ACTIVATION" },
524 /* 0x49 */ { RSL_MSG_TYPE_IPAC_PDCH_ACT_ACK, "ip.access PDCH ACTIVATION ACK" },
525 /* 0x4a */ { RSL_MSG_TYPE_IPAC_PDCH_ACT_NACK, "ip.access PDCH ACTIVATION NACK" },
526 /* 0x4b */ { RSL_MSG_TYPE_IPAC_PDCH_DEACT, "ip.access PDCH DEACTIVATION" },
527 /* 0x4c */ { RSL_MSG_TYPE_IPAC_PDCH_DEACT_ACK, "ip.access PDCH DEACTIVATION ACK" },
528 /* 0x4d */ { RSL_MSG_TYPE_IPAC_PDCH_DEACT_NACK,"ip.access PDCH DEACTIVATION NACK" },
529 /* 0x60 */ { RSL_MSG_TYPE_IPAC_MEAS_PP_DEF, "ip.access MEASurement PREPROCessing DeFauLT" },
530 /* 0x61 */ { RSL_MSG_TYPE_IPAC_HO_CAND_INQ, "ip.access HANDOover CANDidate ENQuiry" },
531 /* 0x62 */ { RSL_MSG_TYPE_IPAC_HO_CAND_RESP, "ip.access HANDOover CANDidate RESPonse" },
532 /* 0x70 */ { RSL_MSG_TYPE_IPAC_CRCX, "ip.access CRCX" },
533 /* 0x71 */ { RSL_MSG_TYPE_IPAC_CRCX_ACK, "ip.access CRCX ACK" },
534 /* 0x72 */ { RSL_MSG_TYPE_IPAC_CRCX_NACK, "ip.access CRCX NACK" },
535 /* 0x73 */ { RSL_MSG_TYPE_IPAC_MDCX, "ip.access MDCX" },
536 /* 0x74 */ { RSL_MSG_TYPE_IPAC_MDCX_ACK, "ip.access MDCX ACK" },
537 /* 0x75 */ { RSL_MSG_TYPE_IPAC_MDCX_NACK, "ip.access MDCX NACK" },
538 /* 0x76 */ { RSL_MSG_TYPE_IPAC_DLCX_IND, "ip.access DLCX INDication" },
539 /* 0x77 */ { RSL_MSG_TYPE_IPAC_DLCX, "ip.access DLCX" },
540 /* 0x78 */ { RSL_MSG_TYPE_IPAC_DLCX_ACK, "ip.access DLCX ACK" },
541 /* 0x79 */ { RSL_MSG_TYPE_IPAC_DLCX_NACK, "ip.access DLCX NACK" },
542 /* 0x7f */ { RSL_MSG_TYPE_OSMO_ETWS_CMD, "Osmocom PRIMARY ETWS CMD" },
543 /* 0x48 */ { 0, NULL }
545 static value_string_ext rsl_msg_type_vals_ext = VALUE_STRING_EXT_INIT(rsl_msg_type_vals);
547 #define RSL_IE_CH_NO 1
548 #define RSL_IE_LINK_ID 2
549 #define RSL_IE_ACT_TYPE 3
550 #define RSL_IE_BS_POW 4
551 #define RSL_IE_CH_ID 5
553 #define RSL_IE_CH_MODE 6
554 #define RSL_IE_ENC_INF 7
555 #define RSL_IE_FRAME_NO 8
556 #define RSL_IE_HO_REF 9
557 #define RSL_IE_L1_INF 10
559 #define RSL_IE_L3_INF 11
560 #define RSL_IE_MS_ID 12
561 #define RSL_IE_MS_POW 13
562 #define RSL_IE_PAGING_GRP 14
563 #define RSL_IE_PAGING_LOAD 15
565 #define RSL_IE_PHY_CTX 16
566 #define RSL_IE_ACCESS_DELAY 17
567 #define RSL_IE_RACH_LOAD 18
568 #define RSL_IE_REQ_REF 19
569 #define RSL_IE_REL_MODE 20
571 #define RSL_IE_RESOURCE_INF 21
572 #define RSL_IE_RLM_CAUSE 22
573 #define RSL_IE_STARTING_TIME 23
574 #define RSL_IE_TIMING_ADV 24
576 #define RSL_IE_UPLINK_MEAS 25
577 #define RSL_IE_CAUSE 26
578 #define RSL_IE_MEAS_RES_NO 27
579 #define RSL_IE_MESSAGE_ID 28
581 #define RSL_IE_SYS_INFO_TYPE 30
582 #define RSL_IE_MS_POWER_PARAM 31
583 #define RSL_IE_BS_POWER_PARAM 32
584 #define RSL_IE_PREPROC_PARAM 33
585 #define RSL_IE_PREPROC_MEAS 34
587 #define RSL_IE_FULL_IMM_ASS_INF 35
588 #define RSL_IE_SMSCB_INF 36
589 #define RSL_IE_FULL_MS_TIMING_OFFSET 37
590 #define RSL_IE_ERR_MSG 38
591 #define RSL_IE_FULL_BCCH_INF 39
593 #define RSL_IE_CH_NEEDED 40
594 #define RSL_IE_CB_CMD_TYPE 41
595 #define RSL_IE_SMSCB_MESS 42
596 #define RSL_IE_CBCH_LOAD_INF 43
599 #define RSL_IE_SMSCB_CH_IND 46
600 #define RSL_IE_GRP_CALL_REF 47
601 #define RSL_IE_CH_DESC 48
602 #define RSL_IE_NCH_DRX_INF 49
604 #define RSL_IE_CMD_IND 50
605 #define RSL_IE_EMLPP_PRIO 51
606 #define RSL_IE_UIC 52
607 #define RSL_IE_MAIN_CH_REF 53
608 #define RSL_IE_MULTIRATE_CONF 54
610 #define RSL_IE_MULTIRATE_CNTRL 55
611 #define RSL_IE_SUP_CODEC_TYPES 56
612 #define RSL_IE_CODEC_CONF 57
613 #define RSL_IE_RTD 58
614 #define RSL_IE_TFO_STATUS 59
616 #define RSL_IE_LLP_APDU 60
617 #define RSL_IE_TFO_TRANSP_CONT 61
619 static const value_string rsl_ie_type_vals[] = {
620 /* 0x01 */ { RSL_IE_CH_NO, "Channel Number" }, /* 9.3.1 */
621 /* 0x02 */ { RSL_IE_LINK_ID, "Link Identifier" }, /* 9.3.2 */
622 /* 0x03 */ { RSL_IE_ACT_TYPE, "Activation Type" }, /* 9.3.3 */
623 /* 0x04 */ { RSL_IE_BS_POW, "BS Power" }, /* 9.3.4 */
624 /* 0x05 */ { RSL_IE_CH_ID, "Channel Identification" }, /* 9.3.5 */
625 /* 0x06 */ { RSL_IE_CH_MODE, "Channel Mode" }, /* 9.3.6 */
626 /* 0x07 */ { RSL_IE_ENC_INF, "Encryption Information" }, /* 9.3.7 */
627 /* 0x08 */ { RSL_IE_FRAME_NO, "Frame Number" }, /* 9.3.8 */
628 /* 0x09 */ { RSL_IE_HO_REF, "Handover Reference" }, /* 9.3.9 */
629 /* 0x0a */ { RSL_IE_L1_INF, "L1 Information" }, /* 9.3.10 */
630 /* 0x0b */ { RSL_IE_L3_INF, "L3 Information" }, /* 9.3.11 */
631 /* 0x0c */ { RSL_IE_MS_ID, "MS Identity" }, /* 9.3.12 */
632 /* 0x0d */ { RSL_IE_MS_POW, "MS Power" }, /* 9.3.13 */
633 /* 0x0e */ { RSL_IE_PAGING_GRP, "Paging Group" }, /* 9.3.14 */
634 /* 0x0f */ { RSL_IE_PAGING_LOAD, "Paging Load" }, /* 9.3.15 */
635 /* 0x10 */ { RSL_IE_PHY_CTX, "Physical Context" }, /* 9.3.16 */
636 /* 0x11 */ { RSL_IE_ACCESS_DELAY, "Access Delay" }, /* 9.3.17 */
637 /* 0x12 */ { RSL_IE_RACH_LOAD, "RACH Load" }, /* 9.3.18 */
638 /* 0x12 */ { RSL_IE_REQ_REF, "Request Reference" }, /* 9.3.19 */
639 /* 0x14 */ { RSL_IE_REL_MODE, "Release Mode" }, /* 9.3.20 */
640 /* 0x15 */ { RSL_IE_RESOURCE_INF, "Resource Information" }, /* 9.3.21 */
641 /* 0x16 */ { RSL_IE_RLM_CAUSE, "RLM Cause" }, /* 9.3.22 */
642 /* 0x17 */ { RSL_IE_STARTING_TIME, "Starting Time" }, /* 9.3.23 */
643 /* 0x18 */ { RSL_IE_TIMING_ADV, "Timing Advance" }, /* 9.3.24 */
644 /* 0x19 */ { RSL_IE_UPLINK_MEAS, "Uplink Measurements" }, /* 9.3.25 */
645 /* 0x1a */ { RSL_IE_CAUSE, "Cause" }, /* 9.3.26 */
646 /* 0x1b */ { RSL_IE_MEAS_RES_NO, "Measurement Result Number" }, /* 9.3.27 */
647 /* 0x1c */ { RSL_IE_MESSAGE_ID, "Message Identifier" }, /* 9.3.28 */
648 /* 0x1d */ { 0x1d, "reserved" }, /* */
649 /* 0x1e */ { RSL_IE_SYS_INFO_TYPE, "System Info Type" }, /* 9.3.30 */
650 /* 0x1f */ { RSL_IE_MS_POWER_PARAM, "MS Power Parameters" }, /* 9.3.31 */
651 /* 0x20 */ { RSL_IE_BS_POWER_PARAM, "BS Power Parameters" }, /* 9.3.32 */
652 /* 0x21 */ { RSL_IE_PREPROC_PARAM, "Pre-processing Parameters" }, /* 9.3.33 */
653 /* 0x22 */ { RSL_IE_PREPROC_MEAS, "Pre-processed Measurements" }, /* 9.3.34 */
654 /* 0x23 */ { 0x23, "reserved" }, /* */
655 /* 0x24 */ { RSL_IE_SMSCB_INF, "SMSCB Information" }, /* 9.3.36 */
656 /* 0x25 */ { RSL_IE_FULL_MS_TIMING_OFFSET, "MS Timing Offset" }, /* 9.3.37 */
657 /* 0x26 */ { RSL_IE_ERR_MSG, "Erroneous Message" }, /* 9.3.38 */
658 /* 0x27 */ { RSL_IE_FULL_BCCH_INF, "Full BCCH Information" }, /* 9.3.39 */
659 /* 0x28 */ { RSL_IE_CH_NEEDED, "Channel Needed" }, /* 9.3.40 */
660 /* 0x29 */ { RSL_IE_CB_CMD_TYPE, "CB Command type" }, /* 9.3.41 */
661 /* 0x2a */ { RSL_IE_SMSCB_MESS, "SMSCB Message" }, /* 9.3.42 */
662 /* 0x2b */ { RSL_IE_CBCH_LOAD_INF, "Full Immediate Assign Info" }, /* 9.3.35 */
663 /* 0x2c */ { 0x2c, "SACCH Information" }, /* 9.3.29 */
664 /* 0x2d */ { 0x2d, "CBCH Load Information" }, /* 9.3.43 */
665 /* 0x2e */ { RSL_IE_SMSCB_CH_IND, "SMSCB Channel Indicator" }, /* 9.3.44 */
666 /* 0x2f */ { RSL_IE_GRP_CALL_REF, "Group Call Reference" }, /* 9.3.45 */
667 /* 0x30 */ { RSL_IE_CH_DESC, "Channel Description" }, /* 9.3.46 */
668 /* 0x31 */ { RSL_IE_NCH_DRX_INF, "NCH DRX Information" }, /* 9.3.47 */
669 /* 0x32 */ { RSL_IE_CMD_IND, "Command Indicator" }, /* 9.3.48 */
670 /* 0x33 */ { RSL_IE_EMLPP_PRIO, "eMLPP Priority" }, /* 9.3.49 */
671 /* 0x34 */ { RSL_IE_UIC, "UIC" }, /* 9.3.50 */
672 /* 0x35 */ { RSL_IE_MAIN_CH_REF, "Main Channel Reference" }, /* 9.3.51 */
673 /* 0x36 */ { RSL_IE_MULTIRATE_CONF, "MultiRate Configuration" }, /* 9.3.52 */
674 /* 0x37 */ { RSL_IE_MULTIRATE_CNTRL, "MultiRate Control" }, /* 9.3.53 */
675 /* 0x38 */ { RSL_IE_SUP_CODEC_TYPES, "Supported Codec Types" }, /* 9.3.54 */
676 /* 0x39 */ { RSL_IE_CODEC_CONF, "Codec Configuration" }, /* 9.3.55 */
677 /* 0x3a */ { RSL_IE_RTD, "Round Trip Delay" }, /* 9.3.56 */
678 /* 0x3b */ { RSL_IE_TFO_STATUS, "TFO Status" }, /* 9.3.57 */
679 /* 0x3c */ { RSL_IE_LLP_APDU, "LLP APDU" }, /* 9.3.58 */
680 /* 0x3d */ { RSL_IE_TFO_TRANSP_CONT, "TFO Transparent Container" }, /* 9.3.59 */
682 0 0 1 1 1 1 1 0
684 1 1 1 0 1 1 1 1
685 Reserved for future use
687 1 1 1 1 0 0 0 0
689 1 1 1 1 1 1 1 1
690 Not used
693 /* 0x60 */ { RSL_IE_OSMO_REP_ACCH_CAP, "Repeated ACCH Capabilities" },
694 /* 0x61 */ { RSL_IE_OSMO_TRAINING_SEQUENCE, "Training Sequence Code/Set" },
695 /* 0x62 */ { RSL_IE_OSMO_TOP_ACCH_CAP, "Temporary ACCH Overpower Capabilities" },
696 /* 0x63 */ { RSL_IE_OSMO_OSMUX_CID, "Osmux CID" },
697 /* 0xe0 */ { RSL_IE_IPAC_SRTP_CONFIG,"SRTP Configuration" },
698 /* 0xe1 */ { RSL_IE_IPAC_PROXY_UDP, "BSC Proxy UDP Port" },
699 /* 0xe2 */ { RSL_IE_IPAC_BSCMPL_TOUT,"BSC Multiplex Timeout" },
700 /* 0xf0 */ { RSL_IE_IPAC_REMOTE_IP, "Remote IP Address" },
701 /* 0xf1 */ { RSL_IE_IPAC_REMOTE_PORT,"Remote RTP Port" },
702 /* 0xf2 */ { RSL_IE_IPAC_RTP_PAYLOAD,"RTP Payload Type" },
703 /* 0xf3 */ { RSL_IE_IPAC_LOCAL_PORT, "Local RTP Port" },
704 /* 0xf4 */ { RSL_IE_IPAC_SPEECH_MODE,"Speech Mode" },
705 /* 0xf5 */ { RSL_IE_IPAC_LOCAL_IP, "Local IP Address" },
706 /* 0xf6 */ { RSL_IE_IPAC_CONN_STAT, "Connection Statistics" },
707 /* 0xf7 */ { RSL_IE_IPAC_HO_C_PARMS, "Handover C Parameters" },
708 /* 0xf8 */ { RSL_IE_IPAC_CONN_ID, "Connection Identifier" },
709 /* 0xf9 */ { RSL_IE_IPAC_RTP_CSD_FMT,"RTP CSD Format" },
710 /* 0xfa */ { RSL_IE_IPAC_RTP_JIT_BUF,"RTP Jitter Buffer" },
711 /* 0xfb */ { RSL_IE_IPAC_RTP_COMPR, "RTP Compression" },
712 /* 0xfc */ { RSL_IE_IPAC_RTP_PAYLOAD2,"RTP Payload Type 2" },
713 /* 0xfd */ { RSL_IE_IPAC_RTP_MPLEX, "RTP Multiplex" },
714 /* 0xfe */ { RSL_IE_IPAC_RTP_MPLEX_ID,"RTP Multiplex Identifier" },
715 { 0, NULL }
717 static value_string_ext rsl_ie_type_vals_ext = VALUE_STRING_EXT_INIT(rsl_ie_type_vals);
721 C5 C4 C3 C2 C1
722 0 0 0 0 1 Bm + ACCH's
723 0 0 0 1 T Lm + ACCH's
724 0 0 1 T T SDCCH/4 + ACCH
725 0 1 T T T SDCCH/8 + ACCH
726 1 0 0 0 0 BCCH
727 1 0 0 0 1 Uplink CCCH (RACH)
728 1 0 0 1 0 Downlink CCCH (PCH + AGCH)
730 static const value_string rsl_ch_no_Cbits_vals[] = {
731 { 0x01, "Bm + ACCH" },
732 { 0x02, "Lm + ACCH (sub-chan 0)" },
733 { 0x03, "Lm + ACCH (sub-chan 1)" },
734 { 0x04, "SDCCH/4 + ACCH (sub-chan 0)" },
735 { 0x05, "SDCCH/4 + ACCH (sub-chan 1)" },
736 { 0x06, "SDCCH/4 + ACCH (sub-chan 2)" },
737 { 0x07, "SDCCH/4 + ACCH (sub-chan 3)" },
738 { 0x08, "SDCCH/8 + ACCH (sub-chan 0)" },
739 { 0x09, "SDCCH/8 + ACCH (sub-chan 1)" },
740 { 0x0a, "SDCCH/8 + ACCH (sub-chan 2)" },
741 { 0x0b, "SDCCH/8 + ACCH (sub-chan 3)" },
742 { 0x0c, "SDCCH/8 + ACCH (sub-chan 4)" },
743 { 0x0d, "SDCCH/8 + ACCH (sub-chan 5)" },
744 { 0x0e, "SDCCH/8 + ACCH (sub-chan 6)" },
745 { 0x0f, "SDCCH/8 + ACCH (sub-chan 7)" },
746 { 0x10, "BCCH" },
747 { 0x11, "Uplink CCCH (RACH)" },
748 { 0x12, "Downlink CCCH (PCH + AGCH)" },
749 /* used by Osmocom and Ericsson */
750 { 0x18, "PDCH" },
751 { 0, NULL }
753 static value_string_ext rsl_ch_no_Cbits_vals_ext = VALUE_STRING_EXT_INIT(rsl_ch_no_Cbits_vals);
755 #define RSL_PHY_CTX_IE_EXT_RAND_ACCES 0x42
756 #define RSL_PHY_CTX_IE_AB_RX_LEVEL_ERR_BITS 0x43
757 #define RSL_PHY_CTX_IE_RX_LEVEL_EXT 0x45
759 /* Physical Context IE vals*/
760 static const value_string rsl_phy_con_ie_vals[] = {
761 { RSL_PHY_CTX_IE_EXT_RAND_ACCES, "Ext RandAccess" },
762 { RSL_PHY_CTX_IE_AB_RX_LEVEL_ERR_BITS, "AB RxLevel&ErrBits" },
763 { RSL_PHY_CTX_IE_RX_LEVEL_EXT, "RxLevel Ext" },
764 { 0, NULL }
766 static value_string_ext rsl_phy_con_ie_vals_ext = VALUE_STRING_EXT_INIT(rsl_phy_con_ie_vals);
768 /* Section 9.3.41 CB Command Type; bits 5 to 8 */
769 static const value_string rsl_cb_cmd_type_vals[] = {
770 { 0x0, "Normal Message Broadcast" },
771 { 0x8, "Schedule Message Broadcast" },
772 { 0xE, "Default Message Broadcast" },
773 { 0xF, "Null Message Broadcast" },
774 { 0, NULL }
777 /* Section 9.3.41 CB Command Type; bit 4 */
778 static const value_string rsl_cb_cmd_type_def_bcast_vals[] = {
779 { 0x0, "Normal Message" },
780 { 0x1, "Null Message" },
781 { 0, NULL }
784 /* Section 9.3.41 CB Command Type; bits 1 and 2 */
785 static const value_string rsl_cb_cmd_type_last_block_vals[] = {
786 { 0x0, "Block 4/4" },
787 { 0x1, "Block 1/4" },
788 { 0x2, "Block 2/4" },
789 { 0x3, "Block 3/4" },
790 { 0, NULL }
794 /* From openbsc/include/openbsc/tlv.h */
795 enum tlv_type {
796 TLV_TYPE_UNKNOWN,
797 TLV_TYPE_FIXED,
798 TLV_TYPE_T,
799 TLV_TYPE_TV,
800 TLV_TYPE_TLV,
801 TLV_TYPE_TL16V
804 struct tlv_def {
805 enum tlv_type type;
806 uint8_t fixed_len;
809 struct tlv_definition {
810 struct tlv_def def[0x100];
813 /* This structure is initialized in proto_register_rsl() */
814 static struct tlv_definition rsl_att_tlvdef;
816 /* 9.3.1 Channel number 9.3.1 M TV 2 */
817 static int
818 dissect_rsl_ie_ch_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
820 proto_tree *ie_tree;
821 uint8_t ie_id;
823 if (is_mandatory == false) {
824 ie_id = tvb_get_uint8(tvb, offset);
825 if (ie_id != RSL_IE_CH_NO)
826 return offset;
829 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_ch_no, NULL, "Channel number IE ");
831 /* Element identifier */
832 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
833 offset++;
834 /* C-bits */
835 proto_tree_add_item(ie_tree, hf_rsl_ch_no_Cbits, tvb, offset, 1, ENC_BIG_ENDIAN);
836 /* TN is time slot number, binary represented as in 3GPP TS 45.002.
837 * 3 Bits
839 proto_tree_add_item(ie_tree, hf_rsl_ch_no_TN, tvb, offset, 1, ENC_BIG_ENDIAN);
840 offset++;
841 return offset;
844 static const value_string rsl_ch_type_vals[] = {
845 { 0x00, "Main signalling channel (FACCH or SDCCH)" },
846 { 0x01, "SACCH" },
847 { 0, NULL }
850 static const value_string rsl_prio_vals[] = {
851 { 0x00, "Normal Priority" },
852 { 0x01, "High Priority" },
853 { 0x02, "Low Priority" },
854 { 0, NULL }
858 * 9.3.2 Link Identifier M TV 2
860 static int
861 dissect_rsl_ie_link_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
863 proto_tree *ie_tree;
864 uint8_t octet;
865 uint8_t ie_id;
867 if (is_mandatory == false) {
868 ie_id = tvb_get_uint8(tvb, offset);
869 if (ie_id != RSL_IE_LINK_ID)
870 return offset;
873 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_link_id, NULL, "Link Identifier IE ");
875 /* Element identifier */
876 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
877 offset++;
879 octet = tvb_get_uint8(tvb, offset);
881 if ((octet & 0x20) == 0x20) {
882 /* Not applicable */
883 proto_tree_add_item(ie_tree, hf_rsl_na, tvb, offset, 1, ENC_BIG_ENDIAN);
884 offset++;
885 return offset;
887 /* channel type */
888 proto_tree_add_item(ie_tree, hf_rsl_ch_type, tvb, offset, 1, ENC_BIG_ENDIAN);
889 /* NA - Not applicable */
890 proto_tree_add_item(ie_tree, hf_rsl_na, tvb, offset, 1, ENC_BIG_ENDIAN);
891 /* Priority */
892 proto_tree_add_item(ie_tree, hf_rsl_prio, tvb, offset, 1, ENC_BIG_ENDIAN);
893 /* SAPI
894 * The SAPI field contains the SAPI value as defined in 3GPP TS 44.005.
896 proto_tree_add_item(ie_tree, hf_rsl_sapi, tvb, offset, 1, ENC_BIG_ENDIAN);
897 offset++;
899 return offset;
903 * 9.3.3 Activation Type
905 static const true_false_string rsl_rbit_vals = {
906 "Reactivation",
907 "Initial activation"
910 static const value_string rsl_a3a2_vals[] = {
911 { 0x00, "Activation related to intra-cell channel change" },
912 { 0x01, "Activation related to inter-cell channel change (handover)" },
913 { 0x02, "Activation related to secondary channels" },
914 /* non-standard value used by Ericsson */
915 { 0x03, "Activation related to packet data channel" },
916 { 0, NULL }
919 static const true_false_string rsl_a1_0_vals = {
920 "related to normal assignment procedure",
921 "related to immediate assignment procedure"
924 static const true_false_string rsl_a1_1_vals = {
925 "related to synchronous handover procedure",
926 "related to asynchronous handover procedure"
929 static const true_false_string rsl_a1_2_vals = {
930 "related to multislot configuration",
931 "related to additional assignment procedure"
934 static int
935 dissect_rsl_ie_act_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
937 proto_tree *ie_tree;
938 uint8_t ie_id;
939 unsigned octet;
941 if (is_mandatory == false) {
942 ie_id = tvb_get_uint8(tvb, offset);
943 if (ie_id != RSL_IE_ACT_TYPE)
944 return offset;
947 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_act_type, NULL, "Activation Type IE ");
949 /* Element identifier */
950 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
951 offset++;
953 /* The R bit indicates if the procedure is an initial activation or a reactivation. */
954 proto_tree_add_item(ie_tree, hf_rsl_rbit, tvb, offset, 1, ENC_BIG_ENDIAN);
956 /* The A-bits indicate the type of activation, which defines the access procedure
957 * and the operation of the data link layer
959 octet = (tvb_get_uint8(tvb, offset) & 0x06) >> 1;
960 proto_tree_add_item(ie_tree, hf_rsl_a3a2, tvb, offset, 1, ENC_BIG_ENDIAN);
961 switch (octet) {
962 case 0:
963 /* Activation related to intra-cell channel change */
964 proto_tree_add_item(ie_tree, hf_rsl_a1_0, tvb, offset, 1, ENC_BIG_ENDIAN);
965 break;
966 case 1:
967 /* Activation related to inter-cell channel change (handover) */
968 proto_tree_add_item(ie_tree, hf_rsl_a1_1, tvb, offset, 1, ENC_BIG_ENDIAN);
969 break;
970 case 2:
971 /* Activation related to secondary channels */
972 proto_tree_add_item(ie_tree, hf_rsl_a1_2, tvb, offset, 1, ENC_BIG_ENDIAN);
973 break;
974 default:
975 break;
977 offset++;
979 return offset;
982 * 9.3.4 BS Power
985 static const true_false_string rsl_epc_mode_vals = {
986 "Channel in EPC mode",
987 "Channel not in EPC mode"
990 static const true_false_string rsl_fpc_epc_mode_vals = {
991 "Fast Power Control in use",
992 "Fast Power Control not in use"
995 static const value_string rsl_rlm_bs_power_vals[] = {
996 { 0x00, "Pn" },
997 { 0x01, "Pn - 2 dB" },
998 { 0x02, "Pn - 4 dB" },
999 { 0x03, "Pn - 6 dB" },
1000 { 0x04, "Pn - 8 dB" },
1001 { 0x05, "Pn - 10 dB" },
1002 { 0x06, "Pn - 12 dB" },
1003 { 0x07, "Pn - 14 dB" },
1004 { 0x08, "Pn - 16 dB" },
1005 { 0x09, "Pn - 18 dB" },
1006 { 0x0a, "Pn - 20 dB" },
1007 { 0x0b, "Pn - 22 dB" },
1008 { 0x0c, "Pn - 24 dB" },
1009 { 0x0d, "Pn - 26 dB" },
1010 { 0x0e, "Pn - 28 dB" },
1011 { 0x0f, "Pn - 30 dB" },
1012 { 0, NULL }
1014 static value_string_ext rsl_rlm_bs_power_vals_ext = VALUE_STRING_EXT_INIT(rsl_rlm_bs_power_vals);
1016 static int
1017 dissect_rsl_ie_bs_power(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1019 proto_tree *ie_tree;
1020 uint8_t ie_id;
1022 if (is_mandatory == false) {
1023 ie_id = tvb_get_uint8(tvb, offset);
1024 if (ie_id != RSL_IE_BS_POW)
1025 return offset;
1028 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_bs_power, NULL, "BS Power IE");
1030 /* Element identifier */
1031 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1032 offset++;
1034 /* EPC mode */
1035 proto_tree_add_item(ie_tree, hf_rsl_epc_mode, tvb, offset, 1, ENC_BIG_ENDIAN);
1036 /* FPC_EPC mode */
1037 proto_tree_add_item(ie_tree, hf_rsl_bs_fpc_epc_mode, tvb, offset, 1, ENC_BIG_ENDIAN);
1039 /* The Power Level field (octet 2) indicates the number of 2 dB steps by
1040 * which the power shall be reduced from its nominal value, Pn,
1041 * set by the network operator to adjust the coverage.
1042 * Thus the Power Level values correspond to the following powers (relative to Pn):
1044 proto_tree_add_item(ie_tree, hf_rsl_bs_power, tvb, offset, 1, ENC_BIG_ENDIAN);
1045 offset++;
1047 return offset;
1050 * 9.3.5 Channel Identification
1052 static int
1053 dissect_rsl_ie_ch_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1055 proto_item *ti;
1056 proto_tree *ie_tree;
1057 uint32_t ma_length;
1058 uint8_t length;
1059 int ie_offset;
1060 uint8_t ie_id;
1062 if (is_mandatory == false) {
1063 ie_id = tvb_get_uint8(tvb, offset);
1064 if (ie_id != RSL_IE_CH_ID)
1065 return offset;
1068 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_ch_id, &ti, "Channel Identification IE");
1070 /* Element identifier */
1071 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1072 offset++;
1073 /* Length */
1074 length = tvb_get_uint8(tvb, offset);
1075 proto_item_set_len(ti, length+2);
1076 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1077 offset++;
1079 ie_offset = offset;
1081 /* 3GPP TS 44.018 "Channel Description"
1082 * the whole of the 3GPP TS 44.018 element including the element identifier and
1083 * length should be included.
1084 * XXX Hmm a type 3 IE (TV).
1086 proto_tree_add_item(ie_tree, hf_rsl_channel_description_tag, tvb, offset, 1, ENC_NA);
1087 de_rr_ch_dsc(tvb, ie_tree, pinfo, offset+1, length, NULL, 0);
1088 offset += 4;
1090 /* 3GPP TS 48.058 (version 15.0.0), section 9.3.5 "Channel Identification" states
1091 * that the 3GPP TS 44.018 "Mobile Allocation" IE shall for compatibility reasons
1092 * be included but empty, i.e. the length shall be zero. Decode it anyway. */
1093 proto_tree_add_item(ie_tree, hf_rsl_mobile_allocation_tag, tvb, offset++, 1, ENC_NA);
1094 proto_tree_add_item_ret_uint(ie_tree, hf_rsl_mobile_allocation_len,
1095 tvb, offset++, 1, ENC_NA, &ma_length);
1096 if (ma_length > 0) {
1097 de_rr_mob_all(tvb, ie_tree, pinfo, offset, ma_length, NULL, 0);
1098 proto_tree_add_expert(ie_tree, pinfo, &ei_rsl_mobile_allocation_deprecated,
1099 tvb, offset, ma_length);
1102 return ie_offset + length;
1105 * 9.3.6 Channel Mode
1108 static const true_false_string rsl_dtx_vals = {
1109 "DTX is applied",
1110 "DTX is not applied"
1112 static const value_string rsl_speech_or_data_vals[] = {
1113 { 0x01, "Speech" },
1114 { 0x02, "Data" },
1115 { 0x03, "Signalling" },
1116 { 0, NULL }
1118 static const value_string rsl_ch_rate_and_type_vals[] = {
1119 { 0x01, "SDCCH" },
1120 { 0x08, "Full rate TCH channel Bm" },
1121 { 0x09, "Half rate TCH channel Lm" },
1122 { 0x0a, "Full rate TCH channel bi-directional Bm, Multislot configuration" },
1123 { 0x18, "Full rate TCH channel Bm Group call channel" },
1124 { 0x19, "Half rate TCH channel Lm Group call channel" },
1125 { 0x1a, "Full rate TCH channel uni-directional downlink Bm, Multislot configuration" },
1126 { 0x28, "Full rate TCH channel Bm Broadcast call channel" },
1127 { 0x29, "PHalf rate TCH channel Lm Broadcast call channel" },
1128 /* Osmocom specific extensions: */
1129 { 0x88, "Full rate TCH channel Bm in VAMOS mode" },
1130 { 0x89, "Half rate TCH channel Lm in VAMOS mode" },
1131 { 0, NULL }
1133 static value_string_ext rsl_ch_rate_and_type_vals_ext = VALUE_STRING_EXT_INIT(rsl_ch_rate_and_type_vals);
1135 static const value_string rsl_speech_coding_alg_vals[] = {
1136 { 0x01, "GSM speech coding algorithm version 1: GSM FR or GSM HR" },
1137 { 0x11, "GSM speech coding algorithm version 2: GSM EFR (half rate not defined in this version of the protocol)" },
1138 { 0x21, "GSM speech coding algorithm version 3: FR AMR or HR AMR" },
1139 { 0x31, "GSM speech coding algorithm version 4: OFR AMR-WB or OHR AMR-WB" },
1140 { 0x09, "GSM speech coding algorithm version 5: FR AMR-WB" },
1141 { 0x0d, "GSM speech coding algorithm version 6: OHR AMR" },
1142 { 0, NULL }
1145 static const true_false_string t_nt_bit_vals = {
1146 "Non-transparent service",
1147 "Transparent service"
1150 static const value_string rsl_ra_if_data_rte_vals[] = {
1151 { 0x21, "asymmetric 43.5 kbit/s (downlink) + 14.5 kbit/s (uplink)" },
1152 { 0x22, "asymmetric 29.0 kbit/s (downlink) + 14.5 kbit/s (uplink)" },
1153 { 0x23, "asymmetric 43.5 kbit/s (downlink) + 29.0 kbit/s (uplink)" },
1154 { 0x29, "asymmetric 14.5 kbit/s (downlink) + 43.5 kbit/s (uplink)" },
1155 { 0x2a, "asymmetric 14.5 kbit/s (downlink) + 29.0 kbit/s (uplink)" },
1156 { 0x2b, "asymmetric 29.0 kbit/s (downlink) + 43.5 kbit/s (uplink)" },
1157 { 0x34, "43.5 kbit/s" },
1158 { 0x31, "28.8 kbit/s" },
1159 { 0x18, "14.5 kbit/s" },
1160 { 0x10, "12 kbit/s" },
1161 { 0x11, "6 kbit/s" },
1162 { 0, NULL }
1165 static const value_string rsl_data_rte_vals[] = {
1166 { 0x38, "32 kbit/s" },
1167 { 0x39, "29 kbit/s" },
1168 { 0x18, "14.4 kbit/s" },
1169 { 0x10, "9.6 kbit/s" },
1170 { 0x11, "4.8 kbit/s" },
1171 { 0x12, "2.4 kbit/s" },
1172 { 0x13, "1.2 kbit/s" },
1173 { 0x14, "600 bit/s" },
1174 { 0x15, "1 200/75 bit/s (1 200 network-to-MS, 75 MS-to-network)" },
1175 { 0, NULL }
1178 static int
1179 dissect_rsl_ie_ch_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1181 proto_item *ti;
1182 proto_tree *ie_tree;
1183 uint8_t length;
1184 int ie_offset;
1185 uint8_t ie_id;
1186 uint8_t octet;
1188 if (is_mandatory == false) {
1189 ie_id = tvb_get_uint8(tvb, offset);
1190 if (ie_id != RSL_IE_CH_MODE)
1191 return offset;
1194 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_ch_mode, &ti, "Channel Mode IE");
1196 /* Element identifier */
1197 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1198 offset++;
1199 /* Length */
1200 length = tvb_get_uint8(tvb, offset);
1201 proto_item_set_len(ti, length+2);
1202 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1203 offset++;
1204 ie_offset = offset;
1206 /* The DTX bits of octet 3 indicate whether DTX is applied
1207 * DTXd indicates use of DTX in the downlink direction (BTS to MS) and
1208 * DTXu indicates use of DTX in the uplink direction (MS to BTS).
1210 proto_tree_add_item(ie_tree, hf_rsl_cm_dtxd, tvb, offset, 1, ENC_BIG_ENDIAN);
1211 proto_tree_add_item(ie_tree, hf_rsl_cm_dtxu, tvb, offset, 1, ENC_BIG_ENDIAN);
1212 offset++;
1213 /* The "Speech or data indicator" field (octet 4) */
1214 proto_tree_add_item(ie_tree, hf_rsl_speech_or_data, tvb, offset, 1, ENC_BIG_ENDIAN);
1215 octet = tvb_get_uint8(tvb, offset);
1216 offset++;
1217 /* Channel rate and type */
1218 proto_tree_add_item(ie_tree, hf_rsl_ch_rate_and_type, tvb, offset, 1, ENC_BIG_ENDIAN);
1219 offset++;
1220 /* Speech coding algor./data rate + transp ind */
1221 switch (octet) {
1222 case 1:
1223 /* Speech */
1224 proto_tree_add_item(ie_tree, hf_rsl_speech_coding_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
1225 break;
1226 case 2:
1227 /* Data */
1228 proto_tree_add_item(ie_tree, hf_rsl_extension_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
1229 proto_tree_add_item(ie_tree, hf_rsl_t_nt_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
1230 octet = tvb_get_uint8(tvb, offset);
1231 if ((octet & 0x40) == 0x40) {
1232 /* Non-transparent service */
1233 /* For the non-transparent service, bits 6 to 1 indicate the radio interface data rate:*/
1234 proto_tree_add_item(ie_tree, hf_rsl_ra_if_data_rte, tvb, offset, 1, ENC_BIG_ENDIAN);
1235 }else{
1236 /* For the transparent service, bits 6-1 indicate the data rate: */
1237 proto_tree_add_item(ie_tree, hf_rsl_data_rte, tvb, offset, 1, ENC_BIG_ENDIAN);
1239 break;
1240 case 3:
1241 /* Signalling
1242 * If octet 4 indicates signalling then octet 6 is coded as follows:
1243 * 0000 0000 No resources required
1245 proto_tree_add_item(ie_tree, hf_rsl_no_resources_required, tvb, offset, 1, ENC_NA);
1246 break;
1247 default:
1248 /* Should not happen */
1249 proto_tree_add_expert(ie_tree, pinfo, &ei_rsl_speech_or_data_indicator, tvb, offset, 1);
1250 break;
1253 offset++;
1255 return ie_offset + length;
1259 * 9.3.7 Encryption information
1262 /* The Algorithm Identifier field (octet 3) indicates the relevant ciphering algorithm. It is coded as: */
1263 static const value_string rsl_algorithm_id_vals[] = {
1264 { 0x00, "Reserved" },
1265 { 0x01, "No encryption shall be used" },
1266 { 0x02, "GSM encryption algorithm version 1 (A5/1)" },
1267 { 0x03, "GSM A5/2" },
1268 { 0x04, "GSM A5/3" },
1269 { 0x05, "GSM A5/4" },
1270 { 0x06, "GSM A5/5" },
1271 { 0x07, "GSM A5/6" },
1272 { 0x08, "GSM A5/7" },
1273 { 0, NULL }
1276 static int
1277 dissect_rsl_ie_enc_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1279 proto_item *ti;
1280 proto_tree *ie_tree;
1281 uint8_t length;
1282 uint8_t ie_id;
1284 if (is_mandatory == false) {
1285 ie_id = tvb_get_uint8(tvb, offset);
1286 if (ie_id != RSL_IE_ENC_INF)
1287 return offset;
1290 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_enc_inf, &ti, "Encryption information IE");
1292 /* Element identifier */
1293 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1294 offset++;
1295 /* Length */
1296 length = tvb_get_uint8(tvb, offset);
1297 proto_item_set_len(ti, length+2);
1298 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1299 offset++;
1301 /* Algorithm Identifier field (octet 3) */
1302 proto_tree_add_item(ie_tree, hf_rsl_alg_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1304 /* key */
1305 proto_tree_add_item(ie_tree, hf_rsl_key, tvb, offset+1, length -1, ENC_NA);
1307 return offset + length;
1311 * 9.3.8 Frame Number
1313 static int
1314 dissect_rsl_ie_frame_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1316 proto_tree *ie_tree;
1317 proto_item *ti;
1318 uint8_t ie_id;
1319 uint16_t rfn;
1321 if (is_mandatory == false) {
1322 ie_id = tvb_get_uint8(tvb, offset);
1323 if (ie_id != RSL_IE_FRAME_NO)
1324 return offset;
1327 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_ie_frame_no, NULL, "Frame Number IE");
1329 /* Element identifier */
1330 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1331 offset++;
1333 rfn = parse_reduced_frame_number(tvb, offset);
1334 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T1prim, tvb, offset, 1, ENC_BIG_ENDIAN);
1335 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T3, tvb, offset, 2, ENC_BIG_ENDIAN);
1336 offset++;
1337 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T2, tvb, offset, 1, ENC_BIG_ENDIAN);
1338 offset++;
1339 ti = proto_tree_add_uint(ie_tree, hf_rsl_req_ref_rfn, tvb, offset - 2, 2, rfn);
1340 proto_item_set_generated(ti);
1342 return offset;
1346 * 9.3.9 Handover reference
1348 static int
1349 dissect_rsl_ie_ho_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1351 proto_tree *ie_tree;
1352 uint8_t ie_id;
1354 if (is_mandatory == false) {
1355 ie_id = tvb_get_uint8(tvb, offset);
1356 if (ie_id != RSL_IE_HO_REF)
1357 return offset;
1360 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_ho_ref, NULL, "Handover reference IE");
1362 /* Element identifier */
1363 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1364 offset++;
1366 /* Hand-over reference */
1367 proto_tree_add_item(ie_tree, hf_rsl_ho_ref, tvb, offset, 1, ENC_BIG_ENDIAN);
1368 offset++;
1370 return offset;
1374 * 9.3.10 L1 Information
1377 static int
1378 dissect_rsl_ie_l1_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1380 proto_tree *ie_tree;
1381 uint8_t ie_id;
1383 if (is_mandatory == false) {
1384 ie_id = tvb_get_uint8(tvb, offset);
1385 if (ie_id != RSL_IE_L1_INF)
1386 return offset;
1389 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_ie_l1_inf, NULL, "L1 Information IE");
1391 /* Element identifier */
1392 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1393 offset++;
1395 /* Octets 2-3 contain the L1 header information of SACCH blocks.
1396 * The information fields and codings are as defined in 3GPP TS 44.004.
1398 /* Power level */
1399 proto_tree_add_item(ie_tree, hf_rsl_l1inf_power_lev, tvb, offset, 1, ENC_BIG_ENDIAN);
1400 /* FPC */
1401 proto_tree_add_item(ie_tree, hf_rsl_l1inf_fpc, tvb, offset, 1, ENC_BIG_ENDIAN);
1402 /* SRR (SACCH Repetition Request) bit */
1403 proto_tree_add_item(ie_tree, hf_rsl_l1inf_srr, tvb, offset, 1, ENC_BIG_ENDIAN);
1404 offset++;
1405 /* Actual Timing Advance */
1406 proto_tree_add_item(ie_tree, hf_rsl_act_timing_adv, tvb, offset, 1, ENC_BIG_ENDIAN);
1407 offset++;
1409 return offset;
1412 typedef enum
1414 L3_INF_CCCH,
1415 L3_INF_SACCH,
1416 L3_INF_OTHER
1417 }l3_inf_t;
1419 * 9.3.11 L3 Information 9.3.11 M TLV >=3
1421 * This element contains a link layer service data unit (L3 message).
1422 * It is used to forward a complete L3 message as specified in
1423 * 3GPP TS 24.008 or 3GPP TS 44.018 between BTS and BSC.
1425 static int
1426 dissect_rsl_ie_L3_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool is_mandatory, l3_inf_t type)
1428 proto_item *ti;
1429 proto_tree *ie_tree;
1430 tvbuff_t *next_tvb;
1431 uint16_t length;
1432 uint8_t ie_id;
1434 if (is_mandatory == false) {
1435 ie_id = tvb_get_uint8(tvb, offset);
1436 if (ie_id != RSL_IE_L3_INF)
1437 return offset;
1440 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_L3_inf, &ti, "L3 Information IE");
1442 /* Element identifier */
1443 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1444 offset++;
1445 /* Length */
1446 length = tvb_get_ntohs(tvb, offset);
1447 proto_item_set_len(ti, length+3);
1448 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 2, ENC_BIG_ENDIAN);
1449 offset= offset+2;
1451 if (type == L3_INF_CCCH)
1453 /* L3 PDUs carried on CCCH have L2 PSEUDO LENGTH octet or are RR Short PD format */
1454 proto_tree_add_item(ie_tree, hf_rsl_llsdu_ccch, tvb, offset, length, ENC_NA);
1455 next_tvb = tvb_new_subset_length(tvb, offset, length);
1456 /* The gsm_a_ccch dissector is the only one handling messages with L2 pseudo-length,
1457 * so we pass it also downlink SACCH (SI5/SI6 and related) */
1458 call_dissector(gsm_a_ccch_handle, next_tvb, pinfo, top_tree);
1460 else if (type == L3_INF_SACCH)
1462 /* L3 PDUs carried on SACCH are normal format or are RR Short PD format */
1463 proto_tree_add_item(ie_tree, hf_rsl_llsdu_sacch, tvb, offset, length, ENC_NA);
1464 next_tvb = tvb_new_subset_length(tvb, offset, length);
1465 call_dissector(gsm_a_sacch_handle, next_tvb, pinfo, top_tree);
1467 else
1469 /* Link Layer Service Data Unit (i.e. a layer 3 message
1470 * as defined in 3GPP TS 24.008 or 3GPP TS 44.018)
1472 proto_tree_add_item(ie_tree, hf_rsl_llsdu, tvb, offset, length, ENC_NA);
1473 next_tvb = tvb_new_subset_length(tvb, offset, length);
1474 call_dissector(gsm_a_dtap_handle, next_tvb, pinfo, top_tree);
1477 offset = offset + length;
1479 return offset;
1483 * 9.3.12 MS Identity
1485 static int
1486 dissect_rsl_ie_ms_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool is_mandatory)
1488 proto_item *ti;
1489 proto_tree *ie_tree;
1490 unsigned length;
1491 uint8_t ie_id;
1493 if (is_mandatory == false) {
1494 ie_id = tvb_get_uint8(tvb, offset);
1495 if (ie_id != RSL_IE_MS_ID)
1496 return offset;
1498 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_ms_id, &ti, "MS Identity IE");
1500 /* Element identifier */
1501 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1502 offset++;
1503 /* Length */
1504 length = tvb_get_uint8(tvb, offset);
1505 proto_item_set_len(ti, length+2);
1506 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1507 offset++;
1509 de_mid(tvb, ie_tree, pinfo, offset, length, NULL, 0);
1511 offset = offset + length;
1513 return offset;
1518 * 9.3.13 MS Power
1520 static int
1521 dissect_rsl_ie_ms_pow(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1523 proto_tree *ie_tree;
1524 uint8_t ie_id;
1526 if (is_mandatory == false) {
1527 ie_id = tvb_get_uint8(tvb, offset);
1528 if (ie_id != RSL_IE_MS_POW)
1529 return offset;
1532 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_ms_pow, NULL, "MS Power IE");
1534 /* Element identifier */
1535 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1536 offset++;
1538 /* MS power level */
1539 proto_tree_add_item(ie_tree, hf_rsl_ms_power_lev, tvb, offset, 1, ENC_BIG_ENDIAN);
1540 /* FPC */
1541 proto_tree_add_item(ie_tree, hf_rsl_ms_fpc, tvb, offset, 1, ENC_BIG_ENDIAN);
1542 /* Reserved */
1543 offset++;
1545 return offset;
1549 * 9.3.14 Paging Group M TV 2 2
1551 static int
1552 dissect_rsl_ie_paging_grp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1554 proto_tree *ie_tree;
1555 uint8_t ie_id;
1557 if (is_mandatory == false) {
1558 ie_id = tvb_get_uint8(tvb, offset);
1559 if (ie_id != RSL_IE_PAGING_GRP)
1560 return offset;
1562 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_paging_grp, NULL, "Paging Group IE");
1564 /* Element identifier */
1565 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1566 offset++;
1568 /* The Paging Group field (octet 2) contains the binary representation of the paging
1569 * group as defined in 3GPP TS 45.002.
1571 proto_tree_add_item(ie_tree, hf_rsl_paging_grp, tvb, offset, 1, ENC_BIG_ENDIAN);
1572 offset++;
1574 return offset;
1579 * 9.3.15 Paging Load
1581 static int
1582 dissect_rsl_ie_paging_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1584 proto_tree *ie_tree;
1585 uint8_t ie_id;
1587 if (is_mandatory == false) {
1588 ie_id = tvb_get_uint8(tvb, offset);
1589 if (ie_id != RSL_IE_PAGING_LOAD)
1590 return offset;
1592 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_ie_paging_load, NULL, "Paging Load IE");
1594 /* Element identifier */
1595 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1596 offset++;
1599 * Paging Buffer Space.
1601 proto_tree_add_item(ie_tree, hf_rsl_paging_load, tvb, offset, 2, ENC_BIG_ENDIAN);
1602 offset = offset + 2;
1604 return offset;
1608 /* Physical Context dissection *
1609 * Rx Level Ext *
1612 static int
1613 dissect_rsl_phy_ctx_rx_lvl_ext(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
1615 proto_tree *rxlvl_ext_tree;
1616 proto_item *ti;
1617 int length;
1619 rxlvl_ext_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_phy_ctx_rxlvl_ext, &ti, "RxLevel Rxt (called in Pre-processed Measurements)");
1621 /* Phy Ctx Element Identifier */
1622 proto_tree_add_item(rxlvl_ext_tree, hf_rsl_phy_ctx_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1623 offset++;
1624 /* Length */
1625 length = tvb_get_uint8(tvb, offset);
1626 proto_item_set_len(ti, length + 2);
1627 proto_tree_add_item(rxlvl_ext_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1628 offset++;
1629 /* Rx Level Ext */
1630 proto_tree_add_item(rxlvl_ext_tree, hf_rsl_phy_ctx_rx_lvl_ext, tvb, offset, 1, ENC_BIG_ENDIAN);
1631 offset++;
1633 return offset;
1635 /* Physical Context dissection*
1636 * AB RxLevel&ErrBits *
1639 static int
1640 dissect_rsl_phy_ctx_ab_rx_lvl_err_bits(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
1642 proto_tree *ab_tree;
1643 proto_tree *ti;
1644 int length;
1646 ab_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_phy_ctx_ab_rx_lvl_err_bits, &ti, "AB RxLevel&ErrBits IE");
1648 /* Phy Ctx Element Identifier */
1649 proto_tree_add_item(ab_tree, hf_rsl_phy_ctx_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1650 offset++;
1651 /* Length */
1652 length = tvb_get_uint8(tvb, offset);
1653 proto_item_set_len(ti, length + 2);
1654 proto_tree_add_item(ab_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1655 offset++;
1656 /* AB Rx Level */
1657 proto_tree_add_item(ab_tree, hf_rsl_phy_ctx_ab_rx_lvl, tvb, offset, 1, ENC_BIG_ENDIAN);
1658 offset++;
1659 /* Traning Err Bits */
1660 proto_tree_add_item(ab_tree, hf_rsl_phy_ctx_ab_err_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
1661 offset++;
1662 return offset;
1664 /* Physcial Context dissection*
1665 * Ext RandAccess *
1668 static int
1669 dissect_rsl_phy_ctx_ext_rand_access(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
1671 proto_tree *ext_rand_access_tree;
1672 proto_item *ti;
1673 unsigned length;
1675 ext_rand_access_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_phy_ctx_ie_ext_rand_access, &ti, "Ext RandAccess IE");
1676 /* Phy Ctx Element identifier */
1677 proto_tree_add_item(ext_rand_access_tree, hf_rsl_phy_ctx_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1678 offset++;
1679 /* Length */
1680 length = tvb_get_uint8(tvb, offset);
1681 proto_item_set_len(ti, length+2);
1682 proto_tree_add_item(ext_rand_access_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1683 offset++;
1685 proto_tree_add_item(ext_rand_access_tree, hf_rsl_phy_ctx_ext_rand_access, tvb, offset, length, ENC_NA);
1686 offset = offset + length;
1687 return offset;
1689 /* Physical Context IE dissection
1692 static int
1693 dissect_phy_ctx_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint8_t length)
1695 proto_tree *phy_ctx_tree;
1696 uint8_t phy_ctx_ie_type;
1698 phy_ctx_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_phy_ctx_ie, NULL, "Physical Context dissection");
1699 phy_ctx_ie_type = tvb_get_uint8(tvb, offset);
1701 switch (phy_ctx_ie_type) {
1702 /* Ext RandAccess */
1703 case RSL_PHY_CTX_IE_EXT_RAND_ACCES:
1704 /* Ext RandAccess */
1705 offset = dissect_rsl_phy_ctx_ext_rand_access(tvb, pinfo, phy_ctx_tree, offset);
1706 /* AB Rx Level */
1707 offset = dissect_rsl_phy_ctx_ab_rx_lvl_err_bits(tvb, pinfo, phy_ctx_tree, offset);
1708 /* Rx Level Ext */
1709 offset = dissect_rsl_phy_ctx_rx_lvl_ext(tvb, pinfo, phy_ctx_tree, offset);
1710 break;
1711 /* AB RxLevel&ErrBits */
1712 case RSL_PHY_CTX_IE_AB_RX_LEVEL_ERR_BITS:
1713 /* AB Rx Level */
1714 offset = dissect_rsl_phy_ctx_ab_rx_lvl_err_bits(tvb, pinfo, phy_ctx_tree, offset);
1715 /* Rx Level Ext */
1716 offset = dissect_rsl_phy_ctx_rx_lvl_ext(tvb, pinfo, phy_ctx_tree, offset);
1717 break;
1718 /* RXLevelExt */
1719 case RSL_PHY_CTX_IE_RX_LEVEL_EXT:
1720 /* Rx Level Ext */
1721 offset = dissect_rsl_phy_ctx_rx_lvl_ext(tvb, pinfo, phy_ctx_tree, offset);
1722 break;
1723 default:
1724 break;
1727 return offset;
1731 * 9.3.16 Physical Context TLV
1733 static int
1734 dissect_rsl_ie_phy_ctx(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1736 proto_item *ti;
1737 proto_tree *ie_tree;
1738 unsigned length;
1739 uint8_t ie_id;
1741 if (is_mandatory == false) {
1742 ie_id = tvb_get_uint8(tvb, offset);
1743 if (ie_id != RSL_IE_PHY_CTX)
1744 return offset;
1747 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_phy_ctx, &ti, "Physical Context IE ");
1749 /* Element identifier */
1750 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1751 offset++;
1752 /* Length */
1753 length = tvb_get_uint8(tvb, offset);
1754 proto_item_set_len(ti, length+2);
1755 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1756 offset++;
1759 * Physical Context Information:
1760 * The Physical Context Information field is not specified.
1761 * This information should not be analysed by BSC, but merely
1762 * forwarded from one TRX/channel to another.
1764 if(global_rsl_dissect_phy_ctx_inf){
1765 offset = dissect_phy_ctx_ie(tvb, pinfo, ie_tree, offset, length);
1766 }else{
1767 proto_tree_add_item(ie_tree, hf_rsl_phy_ctx, tvb, offset, length, ENC_NA);
1768 offset = offset + length;
1771 return offset;
1774 * 9.3.17 Access Delay M TV 2
1776 static int
1777 dissect_rsl_ie_access_delay(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1779 proto_tree *ie_tree;
1780 uint8_t ie_id;
1782 if (is_mandatory == false) {
1783 ie_id = tvb_get_uint8(tvb, offset);
1784 if (ie_id != RSL_IE_ACCESS_DELAY)
1785 return offset;
1788 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_access_delay, NULL, "Access Delay IE ");
1790 /* Element identifier */
1791 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1792 offset++;
1793 proto_tree_add_item(ie_tree, hf_rsl_acc_delay, tvb, offset, 1, ENC_BIG_ENDIAN);
1794 offset++;
1795 return offset;
1799 * 9.3.18 RACH Load
1802 static int
1803 dissect_rsl_ie_rach_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1805 proto_item *ti;
1806 proto_tree *ie_tree;
1807 unsigned length;
1808 uint8_t ie_id;
1809 int ie_offset;
1811 if (is_mandatory == false) {
1812 ie_id = tvb_get_uint8(tvb, offset);
1813 if (ie_id != RSL_IE_RACH_LOAD)
1814 return offset;
1817 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_rach_load, &ti, "RACH Load IE ");
1819 /* Element identifier */
1820 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1821 offset++;
1822 /* Length */
1823 length = tvb_get_uint8(tvb, offset);
1824 proto_item_set_len(ti, length+2);
1825 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1826 offset++;
1827 ie_offset = offset;
1830 * This element is used to carry information on the load of the RACH (Random Access Channel)
1831 * associated with this CCCH timeslot. It is of variable length.
1833 /* RACH Slot Count */
1834 proto_tree_add_item(ie_tree, hf_rsl_rach_slot_cnt, tvb, offset, 2, ENC_BIG_ENDIAN);
1835 offset = offset +2;
1836 length = length -2;
1837 /* RACH Busy Count */
1838 proto_tree_add_item(ie_tree, hf_rsl_rach_busy_cnt, tvb, offset, 2, ENC_BIG_ENDIAN);
1839 offset = offset +2;
1840 length = length -2;
1842 /* RACH Access Count */
1843 proto_tree_add_item(ie_tree, hf_rsl_rach_acc_cnt, tvb, offset, 2, ENC_BIG_ENDIAN);
1844 offset = offset +2;
1845 length = length -2;
1847 /* Supplementary Information */
1848 if ( length > 0) {
1849 proto_tree_add_item(ie_tree, hf_rsl_rach_supplementary_information, tvb, offset, length, ENC_NA);
1851 offset = ie_offset + length;
1853 return offset;
1857 * 9.3.19 Request Reference M TV 4
1859 static int
1860 dissect_rsl_ie_req_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1862 proto_tree *ie_tree, *ra_tree;
1863 uint8_t ie_id;
1864 uint16_t rfn;
1865 proto_item *ti;
1867 if (is_mandatory == false) {
1868 ie_id = tvb_get_uint8(tvb, offset);
1869 if (ie_id != RSL_IE_REQ_REF)
1870 return offset;
1873 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_ie_req_ref, NULL, "Request Reference IE ");
1875 /* Element identifier */
1876 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1877 offset++;
1878 ti = proto_tree_add_item(ie_tree, hf_rsl_req_ref_ra, tvb, offset, 1, ENC_BIG_ENDIAN);
1879 ra_tree = proto_item_add_subtree(ti, ett_ie_req_ref_ra);
1880 proto_tree_add_item(ra_tree, hf_rsl_req_ref_ra_est_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
1881 offset++;
1882 rfn = parse_reduced_frame_number(tvb, offset);
1883 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T1prim, tvb, offset, 1, ENC_BIG_ENDIAN);
1884 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T3, tvb, offset, 2, ENC_BIG_ENDIAN);
1885 offset++;
1886 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T2, tvb, offset, 1, ENC_BIG_ENDIAN);
1887 offset++;
1888 ti = proto_tree_add_uint(ie_tree, hf_rsl_req_ref_rfn, tvb, offset - 2, 2, rfn);
1889 proto_item_set_generated(ti);
1890 return offset;
1893 static const value_string rel_mode_vals[] = {
1894 { 0x00, "Normal Release" },
1895 { 0x01, "Local End Release" },
1896 { 0, NULL }
1900 * 9.3.20 Release Mode 9.3.20 M TV 2
1902 static int
1903 dissect_rsl_ie_rel_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1905 proto_tree *ie_tree;
1906 uint8_t ie_id;
1908 if (is_mandatory == false) {
1909 ie_id = tvb_get_uint8(tvb, offset);
1910 if (ie_id != RSL_IE_REL_MODE)
1911 return offset;
1914 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_rel_mode, NULL, "Release Mode IE ");
1916 /* Element identifier */
1917 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1918 offset++;
1920 /* The M bit is coded as follows:
1921 * 0 normal release
1922 * 1 local end release
1924 proto_tree_add_item(ie_tree, hf_rsl_rel_mode, tvb, offset, 1, ENC_BIG_ENDIAN);
1926 offset++;
1927 return offset;
1930 static const value_string rsl_rlm_cause_vals[] = {
1931 { 0x00, "reserved" },
1932 { 0x01, "timer T200 expired (N200+1) times" },
1933 { 0x02, "re-establishment request" },
1934 { 0x03, "unsolicited UA response" },
1935 { 0x04, "unsolicited DM response" },
1936 { 0x05, "unsolicited DM response, multiple frame established state" },
1937 { 0x06, "unsolicited supervisory response" },
1938 { 0x07, "sequence error" },
1939 { 0x08, "U-frame with incorrect parameters" },
1940 { 0x09, "S-frame with incorrect parameters" },
1941 { 0x0a, "I-frame with incorrect use of M bit" },
1942 { 0x0b, "I-frame with incorrect length" },
1943 { 0x0c, "frame not implemented" },
1944 { 0x0d, "SABM command, multiple frame established state" },
1945 { 0x0e, "SABM frame with information not allowed in this state" },
1946 { 0, NULL }
1948 static value_string_ext rsl_rlm_cause_vals_ext = VALUE_STRING_EXT_INIT(rsl_rlm_cause_vals);
1951 * 9.3.21 Resource Information
1953 static int
1954 dissect_rsl_ie_resource_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
1956 proto_item *ti;
1957 proto_tree *ie_tree;
1958 uint8_t ie_id;
1959 unsigned length;
1960 int ie_offset;
1962 if (is_mandatory == false) {
1963 ie_id = tvb_get_uint8(tvb, offset);
1964 if (ie_id != RSL_IE_RESOURCE_INF)
1965 return offset;
1968 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_resource_inf, &ti, "Resource Information IE");
1970 /* Element identifier */
1971 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
1972 offset++;
1974 /* Length */
1975 length = tvb_get_uint8(tvb, offset);
1976 proto_item_set_len(ti, length+2);
1978 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
1979 offset++;
1981 ie_offset = offset;
1983 while (length > 0) {
1984 proto_tree_add_item(ie_tree, hf_rsl_ch_no_Cbits, tvb, offset, 1, ENC_BIG_ENDIAN);
1985 /* TN is time slot number, binary represented as in 3GPP TS 45.002.
1986 * 3 Bits
1988 proto_tree_add_item(ie_tree, hf_rsl_ch_no_TN, tvb, offset, 1, ENC_BIG_ENDIAN);
1989 offset++;
1991 /* Interference level (1) */
1992 /* Interf Band */
1993 proto_tree_add_item(ie_tree, hf_rsl_interf_band, tvb, offset, 1, ENC_BIG_ENDIAN);
1994 /* Interf Band reserved bits */
1995 proto_tree_add_item(ie_tree, hf_rsl_interf_band_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
1996 offset++;
1997 length = length - 2;
1999 return ie_offset + length;
2003 * 9.3.22 RLM Cause 9.3.22 M TLV 2-4
2005 static int
2006 dissect_rsl_ie_rlm_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2008 proto_item *ti;
2009 proto_tree *ie_tree;
2011 unsigned length;
2012 /* uint8_t octet; */
2013 uint8_t ie_id;
2015 if (is_mandatory == false) {
2016 ie_id = tvb_get_uint8(tvb, offset);
2017 if (ie_id != RSL_IE_RLM_CAUSE)
2018 return offset;
2021 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_rlm_cause, &ti, "RLM Cause IE ");
2023 /* Element identifier */
2024 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2025 offset++;
2026 /* Length */
2027 length = tvb_get_uint8(tvb, offset);
2028 proto_item_set_len(ti, length+2);
2030 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2031 offset++;
2033 if (length == 0)
2034 return offset;
2036 /* The Cause Value is a one octet field if the extension bit is set to 0.
2037 * If the extension bit is set to 1, the Cause Value is a two octet field.
2039 /* XXX: Code doesn't reflect the comment above ?? */
2040 /* octet = tvb_get_uint8(tvb, offset); */
2041 proto_tree_add_item(tree, hf_rsl_extension_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
2042 proto_tree_add_item(ie_tree, hf_rsl_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
2043 offset++;
2045 return offset;
2049 * 9.3.23 Starting Time
2051 static int
2052 dissect_rsl_ie_starting_time(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2054 proto_tree *ie_tree;
2055 uint8_t ie_id;
2057 if (is_mandatory == false) {
2058 ie_id = tvb_get_uint8(tvb, offset);
2059 if (ie_id != RSL_IE_STARTING_TIME)
2060 return offset;
2063 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_ie_staring_time, NULL, "Starting Time IE");
2065 /* Element identifier */
2066 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2067 offset++;
2069 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T1prim, tvb, offset, 1, ENC_BIG_ENDIAN);
2070 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T3, tvb, offset, 2, ENC_BIG_ENDIAN);
2071 offset++;
2072 proto_tree_add_item(ie_tree, hf_rsl_req_ref_T2, tvb, offset, 1, ENC_BIG_ENDIAN);
2073 offset++;
2075 return offset;
2079 * 9.3.24 Timing Advance
2081 static int
2082 dissect_rsl_ie_timing_adv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2084 proto_tree *ie_tree;
2085 uint8_t ie_id;
2087 if (is_mandatory == false) {
2088 ie_id = tvb_get_uint8(tvb, offset);
2089 if (ie_id != RSL_IE_TIMING_ADV)
2090 return offset;
2093 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_timing_adv, NULL, "Timing Advance IE");
2095 /* Element identifier */
2096 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2097 offset++;
2099 proto_tree_add_item(ie_tree, hf_rsl_timing_adv, tvb, offset, 1, ENC_BIG_ENDIAN);
2100 offset++;
2102 return offset;
2106 * 9.3.25 Uplink Measurements
2108 static const true_false_string rsl_dtxd_vals = {
2109 "Employed",
2110 "Not employed"
2113 static int
2114 dissect_rsl_ie_uplik_meas(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2116 proto_item *ti;
2117 proto_tree *ie_tree;
2118 unsigned length;
2119 int ie_offset;
2120 uint8_t ie_id;
2122 if (is_mandatory == false) {
2123 ie_id = tvb_get_uint8(tvb, offset);
2124 if (ie_id != RSL_IE_UPLINK_MEAS)
2125 return offset;
2128 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_uplink_meas, &ti, "Uplink Measurements IE");
2130 /* Element identifier */
2131 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2132 offset++;
2134 /* Length */
2135 length = tvb_get_uint8(tvb, offset);
2136 proto_item_set_len(ti, length+2);
2138 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2139 offset++;
2140 ie_offset = offset;
2142 /* Octet 3
2143 * 8 7 6 5 4 3 2 1
2144 * rfu DTXd | RXLEV.FULL.up
2146 proto_tree_add_item(ie_tree, hf_rsl_dtxd, tvb, offset, 1, ENC_BIG_ENDIAN);
2147 proto_tree_add_item(ie_tree, hf_rsl_rxlev_full_up, tvb, offset, 1, ENC_BIG_ENDIAN);
2148 offset++;
2150 /* Octet4
2151 * 8 7 6 5 4 3 2 1
2152 * Reserved | RXLEV.SUB.up 4
2154 proto_tree_add_item(ie_tree, hf_rsl_rxlev_sub_up, tvb, offset, 1, ENC_BIG_ENDIAN);
2155 offset++;
2156 /* Octet 5
2157 * 8 7 6 5 4 3 2 1
2158 * Reserved | RXQUAL.FULL.up | RXQUAL.SUB.up
2160 proto_tree_add_item(ie_tree, hf_rsl_rxqual_full_up, tvb, offset, 1, ENC_BIG_ENDIAN);
2161 proto_tree_add_item(ie_tree, hf_rsl_rxqual_sub_up, tvb, offset, 1, ENC_BIG_ENDIAN);
2162 offset++;
2163 /* Octet 6 - N
2164 * Supplementary Measurement Information
2166 return ie_offset+length;
2170 * 9.3.26 Cause
2172 static const value_string rsl_class_vals[] = {
2173 { 0x00, "Normal event" },
2174 { 0x01, "Normal event" },
2175 { 0x02, "Resource unavailable" },
2176 { 0x03, "Service or option not available" },
2177 { 0x04, "Service or option not implemented" },
2178 { 0x05, "Invalid message (e.g. parameter out of range)" },
2179 { 0x06, "Protocol error" },
2180 { 0x07, "Interworking" },
2181 { 0, NULL }
2184 static const value_string rsl_cause_value_vals[] = {
2185 { 0x00, "radio interface failure" },
2186 { 0x01, "radio link failure" },
2187 { 0x02, "handover access failure" },
2188 /* 0x03..0x06: "reserved for international use" */
2189 { 0x07, "O&M intervention" },
2190 /* 0x08..0x0e: "reserved for international use" */
2191 { 0x0f, "normal event, unspecified" },
2192 /* 0x10..0x17: "reserved for international use" */
2193 /* 0x18..0x1f: "reserved for national use" */
2194 { 0x20, "equipment failure" },
2195 { 0x21, "radio resource not available" },
2196 { 0x22, "terrestrial channel failure" },
2197 { 0x23, "CCCH overload" },
2198 { 0x24, "ACCH overload" },
2199 { 0x25, "processor overload" },
2200 /* 0x26: "reserved for international use" */
2201 { 0x27, "BTS not equipped" },
2202 { 0x28, "remote transcoder issue" },
2203 /* 0x29..0x2b: "reserved for international use" */
2204 /* 0x2c..0x2e: "reserved for national use" */
2205 { 0x2f, "resource not available, unspecified" },
2206 { 0x30, "requested transcoding/rate adaption not available" },
2207 /* 0x31..0x37: "reserved for international use" */
2208 /* 0x38..0x3e: "reserved for national use" */
2209 { 0x3f, "service or option not implemented, unspecified" },
2210 { 0x40, "encryption algorithm not implemented" },
2211 /* 0x41..0x47: "reserved for international use" */
2212 /* 0x48..0x4e: "reserved for national use" */
2213 { 0x4f, "service or option not implemented, unspecified" },
2214 { 0x50, "radio channel already activated/allocated" },
2215 /* 0x51..0x57: "reserved for international use" */
2216 /* 0x58..0x5e: "reserved for national use" */
2217 { 0x5f, "invalid message, unspecified" },
2218 { 0x60, "message discriminator error" },
2219 { 0x61, "message type error" },
2220 { 0x62, "message sequence error" },
2221 { 0x63, "general information element error" },
2222 { 0x64, "mandatory information element error" },
2223 { 0x65, "optional information element error" },
2224 { 0x66, "information element non-existent" },
2225 { 0x67, "information element length error" },
2226 { 0x68, "invalid information element contents" },
2227 /* 0x69..0x6b: "reserved for international use" */
2228 /* 0x6c..0x6e: "reserved for national use" */
2229 { 0x6f, "protocol error, unspecified" },
2230 /* 0x70..0x77: "reserved for international use" */
2231 /* 0x78..0x7e: "reserved for international use" */
2232 { 0x7f, "interworking, unspecified" },
2233 { 0, NULL }
2235 static value_string_ext rsl_cause_value_vals_ext = VALUE_STRING_EXT_INIT(rsl_cause_value_vals);
2237 static int
2238 dissect_rsl_ie_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2240 proto_item *ti;
2241 proto_tree *ie_tree;
2242 unsigned length;
2243 uint8_t octet;
2244 int ie_offset;
2245 uint8_t ie_id;
2247 if (is_mandatory == false) {
2248 ie_id = tvb_get_uint8(tvb, offset);
2249 if (ie_id != RSL_IE_CAUSE)
2250 return offset;
2253 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_cause, &ti, "Cause IE");
2255 /* Element identifier */
2256 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2257 offset++;
2258 /* Length */
2259 length = tvb_get_uint8(tvb, offset);
2260 proto_item_set_len(ti, length+2);
2261 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2262 offset++;
2263 ie_offset = offset;
2265 /* Cause Value */
2266 octet = tvb_get_uint8(tvb, offset);
2267 proto_tree_add_item(ie_tree, hf_rsl_extension_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
2268 proto_tree_add_item(ie_tree, hf_rsl_class, tvb, offset, 1, ENC_BIG_ENDIAN);
2269 if ((octet & 0x80) != 0x80) {
2270 proto_tree_add_item(ie_tree, hf_rsl_cause_value, tvb, offset, 1, ENC_BIG_ENDIAN);
2271 } else {
2272 /* TODO: Cause Extension*/
2273 offset++;
2275 offset++;
2277 /* TODO: Diagnostic(s) if any */
2278 return ie_offset+length;
2281 * 9.3.27 Measurement result number
2284 static int
2285 dissect_rsl_ie_meas_res_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2287 proto_tree *ie_tree;
2288 uint8_t ie_id;
2290 if (is_mandatory == false) {
2291 ie_id = tvb_get_uint8(tvb, offset);
2292 if (ie_id != RSL_IE_MEAS_RES_NO)
2293 return offset;
2296 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_meas_res_no, NULL, "Measurement result number IE");
2298 /* Element identifier */
2299 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2300 offset++;
2302 /* Measurement result number */
2303 proto_tree_add_item(ie_tree, hf_rsl_meas_res_no, tvb, offset, 1, ENC_BIG_ENDIAN);
2304 offset++;
2306 return offset;
2309 * 9.3.28 Message Identifier
2311 static int
2312 dissect_rsl_ie_message_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2314 proto_tree *ie_tree;
2315 uint8_t ie_id;
2317 if (is_mandatory == false) {
2318 ie_id = tvb_get_uint8(tvb, offset);
2319 if (ie_id != RSL_IE_MESSAGE_ID)
2320 return offset;
2323 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_message_id, NULL, "Message Identifier IE");
2325 /* Element identifier */
2326 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2327 offset++;
2328 /* Message Type */
2329 proto_tree_add_item(ie_tree, hf_rsl_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2330 offset++;
2331 return offset;
2334 * 9.3.30 System Info Type
2336 static const value_string rsl_sys_info_type_vals[] = {
2337 { 0x00, "SYSTEM INFORMATION 8" },
2338 { 0x01, "SYSTEM INFORMATION 1" },
2339 { 0x02, "SYSTEM INFORMATION 2" },
2340 { 0x03, "SYSTEM INFORMATION 3" },
2341 { 0x04, "SYSTEM INFORMATION 4" },
2342 { 0x05, "SYSTEM INFORMATION 5" },
2343 { 0x06, "SYSTEM INFORMATION 6" },
2344 { 0x07, "SYSTEM INFORMATION 7" },
2345 { 0x08, "SYSTEM INFORMATION 16" },
2346 { 0x09, "SYSTEM INFORMATION 17" },
2347 { 0x0a, "SYSTEM INFORMATION 2bis" },
2348 { 0x0b, "SYSTEM INFORMATION 2ter" },
2349 { 0x0d, "SYSTEM INFORMATION 5bis" },
2350 { 0x0e, "SYSTEM INFORMATION 5ter" },
2351 { 0x0f, "SYSTEM INFORMATION 10" },
2352 { 0x28, "SYSTEM INFORMATION 13" },
2353 { 0x29, "SYSTEM INFORMATION 2quater" },
2354 { 0x2a, "SYSTEM INFORMATION 9" },
2355 { 0x2b, "SYSTEM INFORMATION 18" },
2356 { 0x2c, "SYSTEM INFORMATION 19" },
2357 { 0x2d, "SYSTEM INFORMATION 20" },
2358 { 0x47, "EXTENDED MEASUREMENT ORDER" },
2359 { 0x48, "MEASUREMENT INFORMATION" },
2360 { 0, NULL }
2362 static value_string_ext rsl_sys_info_type_vals_ext = VALUE_STRING_EXT_INIT(rsl_sys_info_type_vals);
2365 static int
2366 dissect_rsl_ie_sys_info_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset,
2367 bool is_mandatory, uint8_t *sys_info_type)
2369 proto_tree *ie_tree;
2370 uint8_t ie_id;
2372 if (is_mandatory == false) {
2373 ie_id = tvb_get_uint8(tvb, offset);
2374 if (ie_id != RSL_IE_SYS_INFO_TYPE) {
2375 *sys_info_type = 0xff;
2376 return offset;
2380 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_sys_info_type, NULL, "System Info Type IE");
2382 /* Element identifier */
2383 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2384 offset++;
2385 /* Message Type */
2386 *sys_info_type = tvb_get_uint8(tvb, offset);
2387 proto_tree_add_item(tree, hf_rsl_sys_info_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2388 offset++;
2390 return offset;
2394 * 9.3.31 MS Power Parameters
2396 static int
2397 dissect_rsl_ie_ms_pow_params(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2399 proto_item *ti;
2400 proto_tree *ie_tree;
2401 uint8_t ie_id;
2403 unsigned length;
2405 if (is_mandatory == false) {
2406 ie_id = tvb_get_uint8(tvb, offset);
2407 if (ie_id != RSL_IE_MS_POWER_PARAM)
2408 return offset;
2411 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_ms_pow_params, &ti, "MS Power Parameters IE");
2413 /* Element identifier */
2414 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2415 offset++;
2416 /* Length */
2417 length = tvb_get_uint8(tvb, offset);
2418 proto_item_set_len(ti, length+2);
2419 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2420 offset++;
2422 return offset+length;
2426 * 9.3.32 BS Power Parameters
2428 static int
2429 dissect_rsl_ie_bs_power_params(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2431 proto_item *ti;
2432 proto_tree *ie_tree;
2433 uint8_t ie_id;
2435 unsigned length;
2437 if (is_mandatory == false) {
2438 ie_id = tvb_get_uint8(tvb, offset);
2439 if (ie_id != RSL_IE_BS_POWER_PARAM)
2440 return offset;
2443 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_bs_power_params, &ti, "BS Power Parameters IE");
2445 /* Element identifier */
2446 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2447 offset++;
2448 /* Length */
2449 length = tvb_get_uint8(tvb, offset);
2450 proto_item_set_len(ti, length+2);
2451 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2452 offset++;
2454 return offset+length;
2458 * 9.3.35 Full Immediate Assign Info TLV 25
2460 static int
2461 dissect_rsl_ie_full_imm_ass_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool is_mandatory)
2463 proto_item *ti;
2464 proto_tree *ie_tree;
2466 unsigned length;
2467 tvbuff_t *next_tvb;
2468 uint8_t ie_id;
2470 if (is_mandatory == false) {
2471 ie_id = tvb_get_uint8(tvb, offset);
2472 if (ie_id != RSL_IE_FULL_IMM_ASS_INF)
2473 return offset;
2476 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_full_imm_ass_inf, &ti, "Full Immediate Assign Info IE ");
2478 /* Element identifier */
2479 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2480 offset++;
2481 /* Length */
2482 length = tvb_get_uint8(tvb, offset);
2483 proto_item_set_len(ti, length+2);
2485 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2486 offset++;
2487 /* The Full Immediate Assign Info field (octets 3-25)
2488 * contains a complete immediate assign message (IMMEDIATE ASSIGNMENT or
2489 * IMMEDIATE ASSIGNMENT EXTENDED or IMMEDIATE ASSIGNMENT REJECT)
2490 * as defined in 3GPP TS 44.018.
2492 proto_tree_add_item(ie_tree, hf_rsl_full_immediate_assign_info_field, tvb, offset, length, ENC_NA);
2493 next_tvb = tvb_new_subset_length(tvb, offset, length);
2494 call_dissector(gsm_a_ccch_handle, next_tvb, pinfo, top_tree);
2496 offset = offset + length;
2498 return offset;
2502 * 9.3.36 SMSCB Information
2504 * This element is used to convey a complete frame to be broadcast on the CBCH
2505 * including the Layer 2 header for the radio path.
2507 static int
2508 dissect_rsl_ie_smscb_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2510 proto_item *ti;
2511 proto_tree *ie_tree;
2512 tvbuff_t *next_tvb;
2514 unsigned length;
2515 uint8_t ie_id;
2517 if (is_mandatory == false) {
2518 ie_id = tvb_get_uint8(tvb, offset);
2519 if (ie_id != RSL_IE_SMSCB_INF)
2520 return offset;
2523 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_smscb_inf, &ti, "SMSCB Information IE ");
2525 /* Element identifier */
2526 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2527 offset++;
2528 /* Length */
2529 length = tvb_get_uint8(tvb, offset);
2530 proto_item_set_len(ti, length+2);
2532 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2533 offset++;
2535 * SMSCB frame
2537 next_tvb = tvb_new_subset_length(tvb, offset, length);
2538 call_dissector(gsm_cbch_handle, next_tvb, pinfo, top_tree);
2540 offset = offset + length;
2542 return offset;
2546 * 9.3.37 MS Timing Offset
2549 static int
2550 dissect_rsl_ie_ms_timing_offset(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2552 proto_tree *ie_tree;
2553 uint8_t ie_id;
2555 if (is_mandatory == false) {
2556 ie_id = tvb_get_uint8(tvb, offset);
2557 if (ie_id != RSL_IE_FULL_MS_TIMING_OFFSET)
2558 return offset;
2561 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_ms_timing_offset, NULL, "MS Timing Offset IE");
2563 /* Element identifier */
2564 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2565 offset++;
2567 /* Timing Offset
2568 * The meaning of the MS Timing Offset is as defined in 3GPP TS 45.010.
2569 * The value of MS Timing Offset is the binary value of the 8-bit Timing Offset field (octet 2) - 63.
2570 * The range of MS Timing Offset is therefore -63 to 192.
2572 proto_tree_add_item(ie_tree, hf_rsl_timing_offset, tvb, offset, 1, ENC_BIG_ENDIAN);
2573 offset++;
2575 return offset;
2579 * 9.3.38 Erroneous Message
2580 * This information element is used to carry a complete A-bis interface message
2581 * which was considered erroneous at reception.
2583 static int
2584 // NOLINTNEXTLINE(misc-no-recursion)
2585 dissect_rsl_ie_err_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool is_mandatory)
2587 proto_item *ti;
2588 proto_tree *ie_tree;
2590 unsigned length;
2591 uint8_t ie_id;
2592 if (is_mandatory == false) {
2593 ie_id = tvb_get_uint8(tvb, offset);
2594 if (ie_id != RSL_IE_ERR_MSG)
2595 return offset;
2598 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_err_msg, &ti, "Erroneous Message IE ");
2600 /* Element identifier */
2601 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2602 offset++;
2603 /* Length */
2604 length = tvb_get_uint8(tvb, offset);
2605 proto_item_set_len(ti, length+2);
2607 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2608 offset++;
2610 /* Received Message */
2611 offset = dissct_rsl_msg(tvb, pinfo, ie_tree, offset);
2613 return offset;
2617 * 9.3.39 Full BCCH Information (message name)
2619 static int
2620 dissect_rsl_ie_full_bcch_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2622 proto_item *ti;
2623 proto_tree *ie_tree;
2624 tvbuff_t *next_tvb;
2625 uint16_t length;
2626 uint8_t ie_id;
2628 if (is_mandatory == false) {
2629 ie_id = tvb_get_uint8(tvb, offset);
2630 if (ie_id != RSL_IE_FULL_BCCH_INF)
2631 return offset;
2634 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_full_bcch_inf, &ti, "Full BCCH Information IE");
2636 /* Element identifier */
2637 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2638 offset++;
2639 /* Length */
2640 length = tvb_get_uint8(tvb, offset);
2641 proto_item_set_len(ti, length+2);
2642 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2643 offset++;
2646 * Octets 3-25 contain the complete L3 message as defined in 3GPP TS 44.018.
2649 proto_tree_add_item(ie_tree, hf_rsl_layer_3_message, tvb, offset, length, ENC_NA);
2650 next_tvb = tvb_new_subset_length(tvb, offset, length);
2651 call_dissector(gsm_a_ccch_handle, next_tvb, pinfo, top_tree);
2653 offset = offset + length;
2655 return offset;
2659 * 9.3.40 Channel Needed
2661 static const value_string rsl_ch_needed_vals[] = {
2662 { 0x00, "Any Channel" },
2663 { 0x01, "SDCCH" },
2664 { 0x02, "TCH/F (Full rate)" },
2665 { 0x03, "TCH/F or TCH/H (Dual rate)" },
2666 { 0, NULL }
2669 static int
2670 dissect_rsl_ie_ch_needed(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2672 proto_tree *ie_tree;
2673 uint8_t ie_id;
2675 if (is_mandatory == false) {
2676 ie_id = tvb_get_uint8(tvb, offset);
2677 if (ie_id != RSL_IE_CH_NEEDED)
2678 return offset;
2682 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_ch_needed, NULL, "Channel Needed IE");
2684 /* Element identifier */
2685 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2686 offset++;
2688 /* Channel */
2689 proto_tree_add_item(ie_tree, hf_rsl_ch_needed, tvb, offset, 1, ENC_BIG_ENDIAN);
2690 offset++;
2692 return offset;
2695 * 9.3.41 CB Command type
2697 static int
2698 dissect_rsl_ie_cb_cmd_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2700 proto_tree *ie_tree;
2701 uint8_t ie_id;
2703 if (is_mandatory == false) {
2704 ie_id = tvb_get_uint8(tvb, offset);
2705 if (ie_id != RSL_IE_CB_CMD_TYPE)
2706 return offset;
2709 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_cb_cmd_type, NULL, "CB Command type IE");
2711 /* Element identifier */
2712 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2713 offset++;
2715 proto_tree_add_item(ie_tree, hf_rsl_cb_cmd_type, tvb, offset, 1, ENC_NA);
2716 proto_tree_add_item(ie_tree, hf_rsl_cb_def_bcast, tvb, offset, 1, ENC_NA);
2717 proto_tree_add_item(ie_tree, hf_rsl_cb_last_block, tvb, offset, 1, ENC_NA);
2718 offset++;
2720 return offset;
2724 * 9.3.42 SMSCB Message
2726 static int
2727 dissect_rsl_ie_smscb_mess(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2729 proto_item *ti;
2730 proto_tree *ie_tree;
2731 tvbuff_t *next_tvb;
2732 unsigned length;
2733 uint8_t ie_id;
2734 int ie_offset;
2736 if (is_mandatory == false) {
2737 ie_id = tvb_get_uint8(tvb, offset);
2738 if (ie_id != RSL_IE_SMSCB_MESS)
2739 return offset;
2741 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_smscb_mess, &ti, "SMSCB Message IE");
2743 /* Element identifier */
2744 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2745 offset++;
2746 /* Length */
2747 length = tvb_get_uint8(tvb, offset);
2748 proto_item_set_len(ti, length+2);
2749 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2750 offset++;
2751 ie_offset = offset;
2754 * SMSCB Message
2757 next_tvb = tvb_new_subset_length(tvb, offset, length);
2758 call_dissector(gsm_cbs_handle, next_tvb, pinfo, top_tree);
2760 offset = ie_offset + length;
2762 return offset;
2765 static int
2766 dissect_rsl_ie_etws_pn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
2768 proto_item *ti;
2769 proto_tree *ie_tree;
2770 unsigned length;
2771 int ie_offset;
2773 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_smscb_mess, &ti, "SMSCB Message IE");
2775 /* Element identifier */
2776 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2777 offset++;
2778 /* Length */
2779 length = tvb_get_uint8(tvb, offset);
2780 proto_item_set_len(ti, length+2);
2781 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2782 offset++;
2783 ie_offset = offset;
2786 * ETWS Primary Notification
2789 proto_tree_add_item(ie_tree, hf_rsl_etws_pn, tvb, offset, length, ENC_NA);
2791 offset = ie_offset + length;
2793 return offset;
2797 * 9.3.43 CBCH Load Information
2800 static const true_false_string rsl_cbch_load_type_vals = {
2801 "Overflow",
2802 "Underflow"
2805 static int
2806 dissect_rsl_ie_cbch_load_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2808 proto_item *item;
2809 proto_tree *ie_tree;
2810 uint8_t ie_id;
2811 uint8_t octet;
2813 if (is_mandatory == false) {
2814 ie_id = tvb_get_uint8(tvb, offset);
2815 if (ie_id != RSL_IE_CBCH_LOAD_INF)
2816 return offset;
2819 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_cbch_load_inf, NULL, "CBCH Load Information IE");
2821 /* Element identifier */
2822 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2823 offset++;
2825 octet = tvb_get_uint8(tvb, offset);
2826 /* CBCH Load Type */
2827 proto_tree_add_item(ie_tree, hf_rsl_cbch_load_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2829 /* Message Slot Count */
2830 item = proto_tree_add_item(ie_tree, hf_rsl_msg_slt_cnt, tvb, offset, 1, ENC_BIG_ENDIAN);
2831 if ((octet & 0x80) == 0x80) {
2832 proto_item_append_text(item, "The amount of SMSCB messages (1 to 15) that are needed immediately by BTS");
2833 }else{
2834 proto_item_append_text(item, "The amount of delay in message slots (1 to 15) that is needed immediately by BTS");
2836 offset++;
2838 return offset;
2842 * 9.3.44 SMSCB Channel Indicator
2845 static const value_string rsl_ch_ind_vals[] = {
2846 { 0x00, "Basic CBCH" },
2847 { 0x01, "Extended CBCH (supporting the extended CBCH by the network or MSs is optional)" },
2848 { 0, NULL }
2851 static int
2852 dissect_rsl_ie_smscb_ch_ind(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2854 proto_tree *ie_tree;
2855 uint8_t ie_id;
2857 if (is_mandatory == false) {
2858 ie_id = tvb_get_uint8(tvb, offset);
2859 if (ie_id != RSL_IE_SMSCB_CH_IND)
2860 return offset;
2863 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_smscb_ch_ind, NULL, "SMSCB Channel Indicator IE");
2865 /* Element identifier */
2866 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2867 offset++;
2869 /* Channel Ind */
2870 proto_tree_add_item(ie_tree, hf_rsl_ch_ind, tvb, offset, 1, ENC_BIG_ENDIAN);
2871 offset++;
2873 return offset;
2877 * 9.3.45 Group call reference
2879 static int
2880 dissect_rsl_ie_grp_call_ref(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool is_mandatory)
2882 proto_item *ti;
2883 proto_tree *ie_tree;
2884 unsigned length;
2885 uint8_t ie_id;
2887 if (is_mandatory == false) {
2888 ie_id = tvb_get_uint8(tvb, offset);
2889 if (ie_id != RSL_IE_GRP_CALL_REF)
2890 return offset;
2892 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_grp_call_ref, &ti, "Group call reference IE");
2894 /* Element identifier */
2895 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2896 offset++;
2897 /* Length */
2898 length = tvb_get_uint8(tvb, offset);
2899 proto_item_set_len(ti, length+2);
2900 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2901 offset++;
2903 proto_tree_add_item(ie_tree, hf_rsl_descriptive_group_or_broadcast_call_reference, tvb, offset, length, ENC_NA);
2905 /* The octets 3 to 7 are coded in the same way as the octets 2 to 6
2906 * in the Descriptive group or broadcast call reference
2907 * information element as defined in 3GPP TS 24.008.
2909 de_d_gb_call_ref(tvb, ie_tree, pinfo, offset, length, NULL, 0);
2911 offset = offset + length;
2913 return offset;
2916 * 9.3.46 Channel description
2918 static int
2919 dissect_rsl_ie_ch_desc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2921 proto_item *ti;
2922 proto_tree *ie_tree;
2923 unsigned length;
2924 uint8_t ie_id;
2926 if (is_mandatory == false) {
2927 ie_id = tvb_get_uint8(tvb, offset);
2928 if (ie_id != RSL_IE_CH_DESC)
2929 return offset;
2931 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_ch_desc, &ti, "Channel description IE");
2933 /* Element identifier */
2934 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2935 offset++;
2936 /* Length */
2937 length = tvb_get_uint8(tvb, offset);
2938 proto_item_set_len(ti, length+2);
2939 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2940 offset++;
2942 proto_tree_add_item(ie_tree, hf_rsl_group_channel_description, tvb, offset, length, ENC_NA);
2944 /* Octet j (j = 3, 4, ..., n) is the unchanged octet j-2 of a radio interface Group Channel description
2945 * information element as defined in 3GPP TS 44.018, n-2 is equal to the length of the radio interface
2946 * Group channel description information element
2949 offset = offset + length;
2951 return offset;
2954 * 9.3.47 NCH DRX information
2955 * This is a variable length element used to pass a radio interface information element
2956 * from BSC to BTS.
2958 static int
2959 dissect_rsl_ie_nch_drx(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2961 proto_tree *ie_tree;
2962 uint8_t ie_id;
2964 if (is_mandatory == false) {
2965 ie_id = tvb_get_uint8(tvb, offset);
2966 if (ie_id != RSL_IE_NCH_DRX_INF)
2967 return offset;
2970 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_nch_drx, NULL, "NCH DRX information IE");
2972 /* Element identifier */
2973 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
2974 offset++;
2975 /* NCH DRX information */
2976 /* Octet 3 bits 7 and 8 are spare and set to zero. */
2977 /* Octet 3 bit 6 is the NLN status parameter as defined in 3GPP TS 44.018.*/
2978 /* Octet 3 bits 3, 4 and 5 are bits 1, 2 and 3 of the radio interface
2979 * eMLPP priority as defined in 3GPP TS 44.018.
2981 /* Octet 3 bits 1 and 2 are bits 1 and 2 of the radio interface NLN
2982 * as defined in 3GPP TS 44.018.
2985 offset++;
2987 return offset;
2990 * 9.3.48 Command indicator
2993 static int
2994 dissect_rsl_ie_cmd_ind(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
2996 proto_item *ti;
2997 proto_tree *ie_tree;
2998 unsigned length;
2999 uint8_t ie_id;
3000 bool ext;
3002 if (is_mandatory == false) {
3003 ie_id = tvb_get_uint8(tvb, offset);
3004 if (ie_id != RSL_IE_CMD_IND)
3005 return offset;
3008 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_ie_cmd_ind, &ti, "Command indicator IE");
3010 /* Element identifier */
3011 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3012 offset++;
3013 /* Length */
3014 length = tvb_get_uint8(tvb, offset);
3015 proto_item_set_len(ti, length + 2);
3016 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
3017 offset++;
3019 /* Extension bit */
3020 proto_tree_add_item_ret_boolean(ie_tree, hf_rsl_extension_bit, tvb,
3021 offset, 1, ENC_BIG_ENDIAN, &ext);
3022 if (ext) {
3023 /* If the extension bit E (bit 8) is set to 1 then the Command value
3024 * is a 2 octet field (octets 3 and 3a) */
3025 proto_tree_add_item(ie_tree, hf_rsl_command_ext, tvb, offset, 2, ENC_BIG_ENDIAN);
3026 offset += 2;
3027 } else {
3028 proto_item *pi;
3029 uint32_t value;
3031 pi = proto_tree_add_item_ret_uint(ie_tree, hf_rsl_command, tvb,
3032 offset, 1, ENC_BIG_ENDIAN, &value);
3033 offset++;
3035 if (value == 0x00) /* 0b0000000 */
3036 proto_item_append_text(pi, " (Start)");
3037 else if (value == 0x01) /* 0b0000001 */
3038 proto_item_append_text(pi, " (Stop)");
3039 else if (value <= 0x40) /* 0b0000010 .. 0b1000000 */
3040 proto_item_append_text(pi, " (reserved for international use)");
3041 else /* 0b1000001 .. 0b1111111 */
3042 proto_item_append_text(pi, " (reserved for national use)");
3045 return offset;
3048 * 9.3.49 eMLPP Priority
3050 static const value_string rsl_emlpp_prio_vals[] = {
3051 { 0x00, "no priority applied" },
3052 { 0x01, "call priority level 4" },
3053 { 0x02, "call priority level 3" },
3054 { 0x03, "call priority level 2" },
3055 { 0x04, "call priority level 1" },
3056 { 0x05, "call priority level 0" },
3057 { 0x06, "call priority level B" },
3058 { 0x07, "call priority level A" },
3059 { 0, NULL }
3062 static int
3063 dissect_rsl_ie_emlpp_prio(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3065 proto_tree *ie_tree;
3066 uint8_t ie_id;
3068 if (is_mandatory == false) {
3069 ie_id = tvb_get_uint8(tvb, offset);
3070 if (ie_id != RSL_IE_EMLPP_PRIO)
3071 return offset;
3074 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_emlpp_prio, NULL, "eMLPP Priority IE");
3076 /* Element identifier */
3077 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3078 offset++;
3080 /* The call priority field (bit 3 to 1 of octet 2) is coded in the same way
3081 * as the call priority field (bit 3 to 1 of octet 5) in the
3082 * Descriptive group or broadcast call reference information element
3083 * as defined in 3GPP TS 24.008.
3085 proto_tree_add_item(ie_tree, hf_rsl_emlpp_prio, tvb, offset, 1, ENC_BIG_ENDIAN);
3086 offset++;
3088 return offset;
3092 * 9.3.50 UIC
3094 static int
3095 dissect_rsl_ie_uic(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3097 proto_tree *ie_tree;
3098 uint8_t ie_id;
3100 if (is_mandatory == false) {
3101 ie_id = tvb_get_uint8(tvb, offset);
3102 if (ie_id != RSL_IE_UIC)
3103 return offset;
3106 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_uic, NULL, "UIC IE");
3108 /* Element identifier */
3109 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3110 offset++;
3112 /* Octet 3 bits 1 to 6 contain the radio interface octet 2 bits 3 to 8 of the
3113 * UIC information element as defined in 3GPP TS 44.018.
3115 proto_tree_add_item(ie_tree, hf_rsl_uic, tvb, offset, 1, ENC_NA);
3116 offset++;
3118 return offset;
3122 * 9.3.51 Main channel reference
3125 static int
3126 dissect_rsl_ie_main_ch_ref(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3128 proto_tree *ie_tree;
3129 uint8_t ie_id;
3131 if (is_mandatory == false) {
3132 ie_id = tvb_get_uint8(tvb, offset);
3133 if (ie_id != RSL_IE_MAIN_CH_REF)
3134 return offset;
3137 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_main_ch_ref, NULL, "Main channel reference IE");
3139 /* Element identifier */
3140 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3141 offset++;
3143 /* TN is time slot number, binary represented as in 3GPP TS 45.002.
3144 * 3 Bits
3146 proto_tree_add_item(ie_tree, hf_rsl_ch_no_TN, tvb, offset, 1, ENC_BIG_ENDIAN);
3147 offset++;
3148 return offset;
3152 * 9.3.52 MultiRate configuration
3155 static int
3156 dissect_rsl_ie_multirate_conf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, bool is_mandatory)
3158 proto_item *ti;
3159 proto_tree *ie_tree;
3160 unsigned length;
3161 uint8_t ie_id;
3163 if (is_mandatory == false) {
3164 ie_id = tvb_get_uint8(tvb, offset);
3165 if (ie_id != RSL_IE_MULTIRATE_CONF)
3166 return offset;
3168 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_multirate_conf, &ti, "MultiRate configuration IE");
3170 /* Element identifier */
3171 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3172 offset++;
3173 /* Length */
3174 length = tvb_get_uint8(tvb, offset);
3175 proto_item_set_len(ti, length+2);
3176 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
3177 offset++;
3179 /* Rest of element coded as in 3GPP TS 44.018 not including
3180 * 3GPP TS 44.018 element identifier or 3GPP TS 44.018 octet length value
3183 de_rr_multirate_conf(tvb, ie_tree, pinfo, offset, length, NULL, 0);
3185 offset = offset + length;
3187 return offset;
3191 * 9.3.53 MultiRate Control
3193 static int
3194 dissect_rsl_ie_multirate_cntrl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3196 proto_tree *ie_tree;
3197 uint8_t ie_id;
3199 if (is_mandatory == false) {
3200 ie_id = tvb_get_uint8(tvb, offset);
3201 if (ie_id != RSL_IE_MULTIRATE_CNTRL)
3202 return offset;
3204 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_ie_multirate_cntrl, NULL, "MultiRate Control IE");
3206 /* Element identifier */
3207 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3208 offset++;
3210 /* Bit 8 -5 Spare */
3211 /* The OD field (bit 5 of octet 3) indicates if the BSC expects distant parameters or
3212 * TFO Decision algorithm result from the BTS
3214 /* The PRE field (bit 4 of octet 3) indicates if an handover is to be expected soon or not. */
3215 /* The RAE field (bits 2-3, octet 3) defines whether the RATSCCH mechanism is enabled or not.*/
3216 offset++;
3218 return offset;
3222 * 9.3.54 Supported Codec Types
3223 * This element indicates the codec types supported by the BSS or remote BSS.
3225 static int
3226 dissect_rsl_ie_sup_codec_types(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3228 proto_item *ti;
3229 proto_tree *ie_tree;
3230 unsigned length;
3231 uint8_t ie_id;
3233 if (is_mandatory == false) {
3234 ie_id = tvb_get_uint8(tvb, offset);
3235 if (ie_id != RSL_IE_SUP_CODEC_TYPES)
3236 return offset;
3238 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_sup_codec_types, &ti, "Supported Codec Types IE");
3240 /* Element identifier */
3241 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3242 offset++;
3243 /* Length */
3244 length = tvb_get_uint8(tvb, offset);
3245 proto_item_set_len(ti, length+2);
3246 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
3247 offset++;
3249 proto_tree_add_item(tree, hf_rsl_codec_list, tvb, offset, length, ENC_NA);
3251 /* The Codec List field (octet 4) lists the codec types that are supported
3252 * by the BSS and Transcoder, and are therefore potential candidates for TFO
3253 * establishment.
3255 /* The Codec List extension 1 field (octet 5) lists additional codec types
3256 * that are supported by the BSS and Transcoder, and are therefore potential
3257 * candidates for TFO establishment. When no codec from this list is supported,
3258 * then this field shall not be sent, and the extension bit of octet 4 shall
3259 * be set to 0.
3261 /* If bit 4 of the Codec List field (octet 4) indicates that FR AMR is supported
3262 * or if bit 5 of the Codec List field (octet 4) indicates that HR AMR is supported
3263 * and bit 8 is set to 0, or if bit 6 of the Codec List field (octet 4) indicates
3264 * that UMTS AMR is supported, or if bit 7 of the Codec List field (octet 4)
3265 * indicates that UMTS AMR 2 is supported, or if bit 1, 3, 4 or 5 of the Codec List
3266 * extension 1 field (octet 5) indicates that AMR WB is supported, the following
3267 * two octets (after the Codec List field and its extensions) is present
3270 return offset + length;
3274 * 9.3.55 Codec Configuration
3276 /* The Active Codec Type field (bits 1-8, octet 3) indicates the type of codec in use. It is coded as follows: */
3278 0 0 0 0 . 0 0 0 0: Full Rate Codec in use
3279 0 0 0 0 . 0 0 0 1: Half Rate Codec in use
3280 0 0 0 0 . 0 0 1 0: Enhanced Full Rate Codec in use
3281 0 0 0 0 . 0 0 1 1: FR Adaptive Multi Rate Codec in use
3282 0 0 0 0 . 0 1 0 0: HR Adaptive Multi Rate Codec in use
3283 0 0 0 0 . 0 1 0 1: UMTS Adaptive Multi Rate Codec in use
3284 0 0 0 0 . 0 1 1 0: UMTS Adaptive Multi Rate 2 Codec in use
3285 0 0 0 0 . 1 0 0 1: Full Rate Adaptive Multi-Rate WideBand Codec in use
3286 0 0 0 0 1 0 1 0 UMTS Adaptive Multi-Rate WideBand Codec in use
3287 0 0 0 0 1 0 1 1 8PSK Half Rate Adaptive Multi-Rate Codec in use
3288 0 0 0 0 1 1 0 0 8PSK Full Rate Adaptive Multi-Rate WideBand Codec in use
3289 0 0 0 0 1 1 0 1 8PSK Half Rate Adaptive Multi-Rate WideBand Codec in use
3290 All other values are reserved for future use
3292 static int
3293 dissect_rsl_ie_codec_conf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3295 proto_item *ti;
3296 proto_tree *ie_tree;
3297 unsigned length;
3298 uint8_t ie_id;
3300 if (is_mandatory == false) {
3301 ie_id = tvb_get_uint8(tvb, offset);
3302 if (ie_id != RSL_IE_CODEC_CONF)
3303 return offset;
3305 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_codec_conf, &ti, "Codec Configuration IE");
3307 /* Element identifier */
3308 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3309 offset++;
3310 /* Length */
3311 length = tvb_get_uint8(tvb, offset);
3312 proto_item_set_len(ti, length+2);
3313 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
3314 offset++;
3316 /* Active Codec Type */
3318 return offset + length;
3322 * 9.3.56 Round Trip Delay
3323 * This element indicates the value of the calculated round trip delay between the BTS
3324 * and the transcoder, or between the BTS and the remote BTS, if TFO is established.
3327 static const value_string rsl_delay_ind_vals[] = {
3328 { 0x00, "The RTD field contains the BTS-Transcoder round trip delay" },
3329 { 0x01, "The RTD field contains the BTS-Remote BTS round trip delay" },
3330 { 0, NULL }
3332 static int
3333 dissect_rsl_ie_rtd(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3335 proto_item *rtd_item;
3336 proto_tree *ie_tree;
3337 uint8_t ie_id;
3338 uint8_t rtd;
3340 if (is_mandatory == false) {
3341 ie_id = tvb_get_uint8(tvb, offset);
3342 if (ie_id != RSL_IE_RTD)
3343 return offset;
3346 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_rtd, NULL, "Round Trip Delay IE");
3348 /* Element identifier */
3349 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3350 offset++;
3352 /* The RTD field is the binary representation of the value of the
3353 * round trip delay in 20 ms increments.
3355 rtd = (tvb_get_uint8(tvb, offset)>>1)*20;
3356 rtd_item = proto_tree_add_uint(tree, hf_rsl_rtd, tvb, offset, 1, rtd);
3357 proto_item_append_text(rtd_item, " ms");
3359 /* The Delay IND field indicates if the delay corresponds to a BTS
3360 * to transcoder delay or to a BTS to remote BTS delay.
3362 proto_tree_add_item(ie_tree, hf_rsl_delay_ind, tvb, offset, 1, ENC_BIG_ENDIAN);
3363 offset++;
3365 return offset;
3368 * 9.3.57 TFO Status
3369 * This element indicates if TFO is established. It is coded in 2 octets
3372 static const true_false_string rsl_tfo_vals = {
3373 "TFO is established",
3374 "TFO is not established"
3377 static int
3378 dissect_rsl_ie_tfo_status(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3380 proto_tree *ie_tree;
3381 uint8_t ie_id;
3383 if (is_mandatory == false) {
3384 ie_id = tvb_get_uint8(tvb, offset);
3385 if (ie_id != RSL_IE_TFO_STATUS)
3386 return offset;
3389 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_tfo_status, NULL, "TFO Status IE");
3391 /* Element identifier */
3392 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3393 offset++;
3395 proto_tree_add_item(ie_tree, hf_rsl_tfo, tvb, offset, 1, ENC_BIG_ENDIAN);
3396 offset++;
3397 return offset;
3400 * 9.3.58 LLP APDU
3403 static int
3404 dissect_rsl_ie_llp_apdu(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3406 proto_item *ti;
3407 proto_tree *ie_tree;
3408 uint8_t length;
3409 int ie_offset;
3410 uint8_t ie_id;
3412 if (is_mandatory == false) {
3413 ie_id = tvb_get_uint8(tvb, offset);
3414 if (ie_id != RSL_IE_LLP_APDU)
3415 return offset;
3418 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_llp_apdu, &ti, "LLP APDU IE");
3420 /* Element identifier */
3421 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3422 offset++;
3423 /* Length */
3424 length = tvb_get_uint8(tvb, offset);
3425 proto_item_set_len(ti, length+2);
3426 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
3427 offset++;
3429 ie_offset = offset;
3431 /* The rest of the information element contains the embedded message
3432 * that contains a Facility Information Element as defined in
3433 * 3GPP TS 44.071 excluding the Facility IEI and length of Facility IEI
3434 * octets defined in 3GPP TS 44.071.
3436 /* TODO: Given traces with LLP data this IE could be further dissected */
3437 proto_tree_add_expert(tree, pinfo, &ei_rsl_facility_information_element_3gpp_ts_44071, tvb, offset, length);
3438 return ie_offset + length;
3441 * 9.3.59 TFO transparent container
3442 * This is a variable length element that conveys a message associated with TFO protocol,
3443 * as defined in 3GPP TS 28.062. This element can be sent from the BSC to the BTS or
3444 * from the BTS to the BSC. The BTS shall retrieve the information it is able to understand,
3445 * and forward transparently the complete information to the BSC or to the TRAU.
3447 static int
3448 dissect_rsl_ie_tfo_transp_cont(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, bool is_mandatory)
3450 proto_item *ti;
3451 proto_tree *ie_tree;
3452 uint8_t length;
3453 int ie_offset;
3454 uint8_t ie_id;
3456 if (is_mandatory == false) {
3457 ie_id = tvb_get_uint8(tvb, offset);
3458 if (ie_id != RSL_IE_TFO_TRANSP_CONT)
3459 return offset;
3462 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_ie_tfo_transp_cont, &ti, "TFO transparent container IE");
3464 /* Element identifier */
3465 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3466 offset++;
3467 /* Length */
3468 length = tvb_get_uint8(tvb, offset);
3469 proto_item_set_len(ti, length+2);
3470 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, ENC_BIG_ENDIAN);
3471 offset++;
3473 ie_offset = offset;
3475 /* The rest of the information element contains the embedded message
3476 * that contains a Facility Information Element as defined in
3477 * 3GPP TS 44.071 excluding the Facility IEI and length of Facility IEI
3478 * octets defined in 3GPP TS 44.071.
3480 proto_tree_add_expert(tree, pinfo, &ei_rsl_embedded_message_tfo_configuration, tvb, offset, length);
3481 return ie_offset + length;
3484 /* Encapsulating paging messages into a packet EP2192796 - proprietor Huawei */
3485 static const true_false_string rsl_paging_type_vals = {
3486 "Packet Switched (PS)",
3487 "Circuit Switched (CS)"
3490 static int
3491 dissect_rsl_paging_group_paras(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
3493 proto_tree *ie_tree;
3494 uint8_t paging_type, i, length;
3496 /* Paging Type */
3497 paging_type = (tvb_get_uint8(tvb, offset) & 0x80) >> 7;
3498 /* Calculating whole length of Paging Package Info */
3499 if(paging_type == 0){
3500 length = 2; /* length of Paging Group Paras if it is CS type (2 byte Cs Paging Group Para) */
3501 }else{
3502 length = 5; /* length of Paging Group Paras if it is PS type (1 byte spare, 4x 1 byte of PS Paging Group Para */
3505 ie_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ie_paging_group_paras, NULL, "Paging Group Paras");
3507 /* Paging Type */
3508 proto_tree_add_item(ie_tree, hf_rsl_paging_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3509 /* CS Paging Group */
3510 if(paging_type == 0){
3511 proto_tree_add_item(ie_tree, hf_rsl_paging_group_cs, tvb, offset, 1, ENC_BIG_ENDIAN);
3512 offset++;
3513 proto_tree_add_item(ie_tree, hf_rsl_paging_group_empty_package, tvb, offset, 1, ENC_BIG_ENDIAN);
3514 offset++; /* move over empty (0x00) packet */
3516 /* PS Paging Group */
3517 else
3519 proto_tree_add_item(ie_tree, hf_rsl_paging_group_ps_spare, tvb, offset, 1, ENC_BIG_ENDIAN);
3520 offset++;
3521 for(i = 1; i <= 4; i++){
3522 proto_tree_add_item(ie_tree, hf_rsl_paging_grp, tvb, offset, 1, ENC_BIG_ENDIAN);
3523 offset++;
3527 return offset;
3529 /* Paging Package Channel And eMLPP. REF: EP2192786B1 *
3530 * Channel Needed *
3531 * in REF values from 9.3.40 used but "Channel Needed" is optional, and 0 is filled when invalid. *
3532 * eMLPP Priority *
3533 * in REf values from 9.3.49 used but "eMLPP Priority" is optional, and 0 is filled when invalid. *
3535 static const value_string rsl_paging_ch_needed_vals[] = {
3536 { 0x00, "Invalid Channel" },
3537 { 0x01, "SDCCH" },
3538 { 0x02, "TCH/F (Full rate)" },
3539 { 0x03, "TCH/F or TCH/H (Dual rate)" },
3540 { 0, NULL }
3543 static const value_string rsl_paging_emlpp_prio_vals[] = {
3544 { 0x00, "invalid call priority" },
3545 { 0x01, "call priority level 4" },
3546 { 0x02, "call priority level 3" },
3547 { 0x03, "call priority level 2" },
3548 { 0x04, "call priority level 1" },
3549 { 0x05, "call priority level 0" },
3550 { 0x06, "call priority level B" },
3551 { 0x07, "call priority level A" },
3552 { 0, NULL }
3555 static int
3556 dissect_rsl_paging_package_channel_and_emlpp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
3558 proto_tree *ie_tree;
3560 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_ie_paging_package_ch_a_emlpp, NULL, "Channel and eMLPP");
3562 /* Channel Number */
3563 proto_tree_add_item(ie_tree, hf_rsl_paging_package_ch_no, tvb, offset, 1, ENC_BIG_ENDIAN);
3564 /* Channel Needed */
3565 proto_tree_add_item(ie_tree, hf_rsl_paging_package_ch_needed, tvb, offset, 1, ENC_BIG_ENDIAN);
3566 /* eMLPP Priority */
3567 proto_tree_add_item(ie_tree, hf_rsl_paging_emlpp_prio, tvb, offset, 1, ENC_BIG_ENDIAN);
3568 offset++;
3570 return offset;
3572 /* Paging Package dissection. REF: EP2192796B1
3575 static int
3576 dissect_rsl_paging_package(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, uint8_t package_number)
3578 proto_tree *ie_tree;
3579 uint8_t i, length, paging_type;
3581 for(i = 1; i <= package_number; i++){
3582 /* Calculating whole length of Paging Package Info */
3583 length = (tvb_get_uint8(tvb, offset+2) + 3);
3584 paging_type = (tvb_get_uint8(tvb, offset + length) & 0x80) >> 7;
3585 if(paging_type == 0){
3586 length = length + 2; /* length of Paging Group Paras if it is CS type (2 byte Cs Paging Group Para) */
3587 }else{
3588 length = length + 5; /* length of Paging Group Paras if it is PS type (1 byte spare, 4x 1 byte of PS Paging Group Para */
3591 ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_ie_paging_package, NULL, "Paging Package Info %u", i);
3593 offset = dissect_rsl_paging_package_channel_and_emlpp(tvb, pinfo, ie_tree, offset);
3594 offset = dissect_rsl_ie_ms_id(tvb, pinfo, ie_tree, offset, true);
3596 offset = dissect_rsl_paging_group_paras(tvb, pinfo, ie_tree, offset);
3599 return offset;
3601 /* Paging Package Number dissection. REF: EP2192796B1
3604 static int
3605 dissect_rsl_paging_package_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int *offset)
3607 proto_tree *ie_tree;
3608 uint8_t package_number;
3610 ie_tree = proto_tree_add_subtree(tree, tvb, *offset, 1, ett_ie_paging_package_number, NULL, "Paging Package Number");
3612 /* SPARE */
3613 proto_tree_add_item(ie_tree, hf_rsl_paging_spare, tvb, *offset, 1, ENC_BIG_ENDIAN);
3614 /* Paging Msg Number */
3615 package_number = tvb_get_uint8(tvb, *offset) & 0x0f;
3616 proto_tree_add_item(ie_tree, hf_rsl_paging_msg_no, tvb, *offset, 1, ENC_BIG_ENDIAN);
3617 *offset += 1;
3618 return package_number;
3621 static int
3622 dissect_rsl_ie_osmo_rep_acch_cap(tvbuff_t *tvb, packet_info *pinfo _U_,
3623 proto_tree *tree, int offset,
3624 bool is_mandatory)
3626 proto_item *ti;
3627 proto_tree *ie_tree;
3628 uint32_t length;
3629 uint8_t ie_id;
3631 if (is_mandatory == false) {
3632 ie_id = tvb_get_uint8(tvb, offset);
3633 if (ie_id != RSL_IE_OSMO_REP_ACCH_CAP)
3634 return offset;
3636 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
3637 ett_ie_osmo_rep_acch_cap, &ti,
3638 "Osmocom Repeated ACCH Capabilities IE");
3640 /* Element identifier */
3641 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset++, 1, ENC_NA);
3642 /* Length */
3643 proto_tree_add_item_ret_uint(ie_tree, hf_rsl_ie_length, tvb, offset++, 1, ENC_NA, &length);
3644 proto_item_set_len(ti, length + 2);
3646 proto_tree_add_item(ie_tree, hf_rsl_osmo_rep_acch_rxqual, tvb, offset, 1, ENC_NA);
3647 proto_tree_add_item(ie_tree, hf_rsl_osmo_rep_acch_ul_sacch, tvb, offset, 1, ENC_NA);
3648 proto_tree_add_item(ie_tree, hf_rsl_osmo_rep_acch_dl_sacch, tvb, offset, 1, ENC_NA);
3649 proto_tree_add_item(ie_tree, hf_rsl_osmo_rep_acch_dl_facch_all, tvb, offset, 1, ENC_NA);
3650 proto_tree_add_item(ie_tree, hf_rsl_osmo_rep_acch_dl_facch_cmd, tvb, offset, 1, ENC_NA);
3651 offset++;
3653 return offset;
3656 static int
3657 dissect_rsl_ie_osmo_top_acch_cap(tvbuff_t *tvb, packet_info *pinfo _U_,
3658 proto_tree *tree, int offset,
3659 bool is_mandatory)
3661 proto_item *ti;
3662 proto_tree *ie_tree;
3663 uint32_t length;
3664 uint8_t ie_id;
3666 if (is_mandatory == false) {
3667 ie_id = tvb_get_uint8(tvb, offset);
3668 if (ie_id != RSL_IE_OSMO_TOP_ACCH_CAP)
3669 return offset;
3671 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
3672 ett_ie_osmo_top_acch_cap, &ti,
3673 "Osmocom Temporary ACCH Overpower Capabilities IE");
3675 /* Element identifier */
3676 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset++, 1, ENC_NA);
3677 /* Length */
3678 proto_tree_add_item_ret_uint(ie_tree, hf_rsl_ie_length, tvb, offset++, 1, ENC_NA, &length);
3679 proto_item_set_len(ti, length + 2);
3681 proto_tree_add_item(ie_tree, hf_rsl_osmo_top_acch_sacch, tvb, offset, 1, ENC_NA);
3682 proto_tree_add_item(ie_tree, hf_rsl_osmo_top_acch_facch, tvb, offset, 1, ENC_NA);
3683 proto_tree_add_item(ie_tree, hf_rsl_osmo_top_acch_rxqual, tvb, offset, 1, ENC_NA);
3684 proto_tree_add_item(ie_tree, hf_rsl_osmo_top_acch_val, tvb, offset, 1, ENC_NA);
3685 offset++;
3687 return offset;
3690 static const value_string rsl_osmo_tsc_set_vals[] = {
3691 { 0, "TSC Set 1" },
3692 { 1, "TSC Set 2" },
3693 { 2, "TSC Set 3" },
3694 { 3, "TSC Set 4" },
3695 { 0, NULL }
3698 static int
3699 dissect_rsl_ie_osmo_training_seq(tvbuff_t *tvb, packet_info *pinfo _U_,
3700 proto_tree *tree, int offset,
3701 bool is_mandatory)
3703 proto_item *ti;
3704 proto_tree *ie_tree;
3705 uint32_t length;
3706 uint8_t ie_id;
3708 if (is_mandatory == false) {
3709 ie_id = tvb_get_uint8(tvb, offset);
3710 if (ie_id != RSL_IE_OSMO_TRAINING_SEQUENCE)
3711 return offset;
3713 ie_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
3714 ett_ie_osmo_training_seq, &ti,
3715 "Osmocom Training Sequence IE");
3717 /* Element identifier */
3718 proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset++, 1, ENC_NA);
3719 /* Length */
3720 proto_tree_add_item_ret_uint(ie_tree, hf_rsl_ie_length, tvb, offset++, 1, ENC_NA, &length);
3721 proto_item_set_len(ti, length + 2);
3723 proto_tree_add_item(ie_tree, hf_rsl_osmo_tsc_set, tvb, offset++, 1, ENC_NA);
3724 proto_tree_add_item(ie_tree, hf_rsl_osmo_tsc_val, tvb, offset++, 1, ENC_NA);
3726 return offset;
3729 struct dyn_pl_info_t {
3730 uint8_t rtp_codec;
3731 uint8_t rtp_pt;
3734 static int
3735 dissct_rsl_ipaccess_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
3737 uint8_t msg_type;
3738 uint32_t local_addr = 0;
3739 uint16_t local_port = 0;
3740 uint32_t rtp_codec = 255, rtp_pt = 0;
3741 address src_addr;
3742 rtp_dyn_payload_t *dyn_pl = NULL;
3743 struct dyn_pl_info_t *dyn_pl_info;
3744 conversation_t *conv;
3745 bool use_osmux = false;
3747 msg_type = tvb_get_uint8(tvb, offset) & 0x7f;
3748 offset++;
3750 /* parse TLV attributes */
3751 while (tvb_reported_length_remaining(tvb, offset) > 0) {
3752 uint8_t tag;
3753 unsigned int len, hlen;
3754 const struct tlv_def *tdef;
3755 proto_item *ti;
3756 proto_tree *ie_tree = NULL;
3758 tag = tvb_get_uint8(tvb, offset);
3759 tdef = &rsl_att_tlvdef.def[tag];
3761 switch (tdef->type) {
3762 case TLV_TYPE_FIXED:
3763 hlen = 1;
3764 len = tdef->fixed_len;
3765 break;
3766 case TLV_TYPE_T:
3767 hlen = 1;
3768 len = 0;
3769 break;
3770 case TLV_TYPE_TV:
3771 hlen = 1;
3772 len = 1;
3773 break;
3774 case TLV_TYPE_TLV:
3775 hlen = 2;
3776 len = tvb_get_uint8(tvb, offset+1);
3777 break;
3778 case TLV_TYPE_TL16V:
3779 hlen = 3;
3780 len = tvb_get_uint8(tvb, offset+1) << 8 |
3781 tvb_get_uint8(tvb, offset+2);
3782 break;
3783 case TLV_TYPE_UNKNOWN:
3784 default:
3785 return tvb_reported_length(tvb);
3789 switch (tag) {
3790 case RSL_IE_CH_NO:
3791 dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, false);
3792 break;
3793 case RSL_IE_FRAME_NO:
3794 dissect_rsl_ie_frame_no(tvb, pinfo, tree, offset, false);
3795 break;
3796 case RSL_IE_MS_POW:
3797 dissect_rsl_ie_ms_pow(tvb, pinfo, tree, offset, false);
3798 break;
3799 case RSL_IE_BS_POW:
3800 dissect_rsl_ie_bs_power(tvb, pinfo, tree, offset, false);
3801 break;
3802 case RSL_IE_MS_POWER_PARAM:
3803 dissect_rsl_ie_ms_pow_params(tvb, pinfo, tree, offset, false);
3804 break;
3805 case RSL_IE_BS_POWER_PARAM:
3806 dissect_rsl_ie_bs_power_params(tvb, pinfo, tree, offset, false);
3807 break;
3808 case RSL_IE_CAUSE:
3809 dissect_rsl_ie_cause(tvb, pinfo, tree, offset, false);
3810 break;
3811 default:
3812 ti = proto_tree_add_item(tree, hf_rsl_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN);
3813 ie_tree = proto_item_add_subtree(ti, ett_ie_local_port);
3816 offset += hlen;
3818 switch (tag) {
3819 case RSL_IE_IPAC_REMOTE_IP:
3820 proto_tree_add_item(ie_tree, hf_rsl_remote_ip, tvb,
3821 offset, len, ENC_BIG_ENDIAN);
3822 break;
3823 case RSL_IE_IPAC_REMOTE_PORT:
3824 proto_tree_add_item(ie_tree, hf_rsl_remote_port, tvb,
3825 offset, len, ENC_BIG_ENDIAN);
3826 break;
3827 case RSL_IE_IPAC_LOCAL_IP:
3828 proto_tree_add_item(ie_tree, hf_rsl_local_ip, tvb,
3829 offset, len, ENC_BIG_ENDIAN);
3830 local_addr = tvb_get_ipv4(tvb, offset);
3831 break;
3832 case RSL_IE_IPAC_LOCAL_PORT:
3833 proto_tree_add_item(ie_tree, hf_rsl_local_port, tvb,
3834 offset, len, ENC_BIG_ENDIAN);
3835 local_port = tvb_get_ntohs(tvb, offset);
3836 break;
3837 case RSL_IE_IPAC_SPEECH_MODE:
3838 proto_tree_add_item_ret_uint(ie_tree, hf_rsl_speech_mode_s, tvb,
3839 offset, len, ENC_BIG_ENDIAN, &rtp_codec);
3840 conv = find_or_create_conversation(pinfo);
3841 dyn_pl_info = (struct dyn_pl_info_t *)conversation_get_proto_data(conv, proto_rsl);
3842 if (!dyn_pl_info) {
3843 dyn_pl_info = (struct dyn_pl_info_t *)wmem_alloc0(wmem_file_scope(), sizeof(*dyn_pl_info));
3844 conversation_add_proto_data(conv, proto_rsl, (void *)dyn_pl_info);
3846 dyn_pl_info->rtp_codec = rtp_codec;
3848 proto_tree_add_item(ie_tree, hf_rsl_speech_mode_m, tvb,
3849 offset, len, ENC_BIG_ENDIAN);
3850 break;
3851 case RSL_IE_IPAC_RTP_PAYLOAD:
3852 case RSL_IE_IPAC_RTP_PAYLOAD2:
3853 /* Need to set pl here */
3854 proto_tree_add_item_ret_uint(ie_tree, hf_rsl_rtp_payload, tvb,
3855 offset, len, ENC_BIG_ENDIAN, &rtp_pt);
3856 conv = find_or_create_conversation(pinfo);
3857 dyn_pl_info = (struct dyn_pl_info_t *)conversation_get_proto_data(conv, proto_rsl);
3858 if (!dyn_pl_info) {
3859 dyn_pl_info = (struct dyn_pl_info_t *)wmem_alloc0(wmem_file_scope(), sizeof(*dyn_pl_info));
3860 conversation_add_proto_data(conv, proto_rsl, (void *)dyn_pl_info);
3861 dyn_pl_info->rtp_codec = rtp_codec;
3863 dyn_pl_info->rtp_pt = rtp_pt;
3865 break;
3866 case RSL_IE_IPAC_RTP_CSD_FMT:
3867 proto_tree_add_item(ie_tree, hf_rsl_rtp_csd_fmt_d, tvb,
3868 offset, len, ENC_BIG_ENDIAN);
3869 proto_tree_add_item(ie_tree, hf_rsl_rtp_csd_fmt_ir, tvb,
3870 offset, len, ENC_BIG_ENDIAN);
3871 break;
3872 case RSL_IE_IPAC_CONN_ID:
3873 proto_tree_add_item(ie_tree, hf_rsl_conn_id, tvb,
3874 offset, len, ENC_BIG_ENDIAN);
3875 break;
3876 case RSL_IE_IPAC_CONN_STAT:
3877 proto_tree_add_item(ie_tree, hf_rsl_cstat_tx_pkts, tvb,
3878 offset, 4, ENC_BIG_ENDIAN);
3879 proto_tree_add_item(ie_tree, hf_rsl_cstat_tx_octs, tvb,
3880 offset+4, 4, ENC_BIG_ENDIAN);
3881 proto_tree_add_item(ie_tree, hf_rsl_cstat_rx_pkts, tvb,
3882 offset+8, 4, ENC_BIG_ENDIAN);
3883 proto_tree_add_item(ie_tree, hf_rsl_cstat_rx_octs, tvb,
3884 offset+12, 4, ENC_BIG_ENDIAN);
3885 proto_tree_add_item(ie_tree, hf_rsl_cstat_lost_pkts, tvb,
3886 offset+16, 4, ENC_BIG_ENDIAN);
3887 proto_tree_add_item(ie_tree, hf_rsl_cstat_ia_jitter, tvb,
3888 offset+20, 4, ENC_BIG_ENDIAN);
3889 proto_tree_add_item(ie_tree, hf_rsl_cstat_avg_tx_dly, tvb,
3890 offset+24, 4, ENC_BIG_ENDIAN);
3891 break;
3892 case RSL_IE_OSMO_OSMUX_CID:
3893 if (global_rsl_use_osmo_bts) {
3894 proto_tree_add_item(ie_tree, hf_rsl_osmo_osmux_cid, tvb,
3895 offset, len, ENC_BIG_ENDIAN);
3896 use_osmux = true;
3898 break;
3900 offset += len;
3903 switch (msg_type) {
3904 case RSL_MSG_TYPE_IPAC_CRCX_ACK:
3905 if (!use_osmux) {
3906 /* Notify the RTP and RTCP dissectors about a new RTP stream */
3907 src_addr.type = AT_IPv4;
3908 src_addr.len = 4;
3909 src_addr.data = (uint8_t *)&local_addr;
3911 conv = find_or_create_conversation(pinfo);
3912 dyn_pl_info = (struct dyn_pl_info_t *)conversation_get_proto_data(conv, proto_rsl);
3913 if (dyn_pl_info && (dyn_pl_info->rtp_codec == 2 || dyn_pl_info->rtp_codec == 5)) {
3914 dyn_pl = rtp_dyn_payload_new();
3915 rtp_dyn_payload_insert(dyn_pl, dyn_pl_info->rtp_pt, "AMR", 8000, 1);
3917 conversation_delete_proto_data(conv, proto_rsl);
3918 wmem_free(wmem_file_scope(), dyn_pl_info);
3919 rtp_add_address(pinfo, PT_UDP, &src_addr, local_port, 0,
3920 "GSM A-bis/IP", pinfo->num, 0, dyn_pl);
3921 rtcp_add_address(pinfo, &src_addr, local_port+1, 0,
3922 "GSM A-bis/IP", pinfo->num);
3924 break;
3926 return offset;
3929 static int
3930 // NOLINTNEXTLINE(misc-no-recursion)
3931 dissct_rsl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
3933 uint8_t msg_disc, msg_type, sys_info_type;
3934 uint8_t paging_package_number;
3936 msg_disc = tvb_get_uint8(tvb, offset++) >> 1;
3937 msg_type = tvb_get_uint8(tvb, offset) & 0x7f;
3938 proto_tree_add_item(tree, hf_rsl_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3940 if (msg_disc == RSL_MSGDISC_IPACCESS) {
3941 offset = dissct_rsl_ipaccess_msg(tvb, pinfo, tree, offset);
3942 return offset;
3944 offset++;
3946 increment_dissection_depth(pinfo);
3947 switch (msg_type) {
3948 /* Radio Link Layer Management messages */
3949 /* 8.3.1 DATA REQUEST */
3950 case RSL_MSG_TYPE_DATA_REQ:
3951 /* Channel number 9.3.1 M TV 2 */
3952 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
3953 /* Link Identifier 9.3.2 M TV 2 */
3954 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
3955 /* L3 Information 9.3.11 M TLV >=3 */
3956 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, true, L3_INF_OTHER);
3957 break;
3958 /* 8.3.2 DATA INDICATION */
3959 case RSL_MSG_TYPE_DATA_IND:
3960 /* Channel number 9.3.1 M TV 2 */
3961 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
3962 /* Link Identifier 9.3.2 M TV 2 */
3963 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
3964 /* L3 Information 9.3.11 M TLV >=3 */
3965 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, true, L3_INF_OTHER);
3966 break;
3967 /* 8.3.3 ERROR INDICATION */
3968 case RSL_MSG_TYPE_ERROR_IND:
3969 /* Channel number 9.3.1 M TV 2 */
3970 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
3971 /* Link Identifier 9.3.2 M TV 2 */
3972 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
3973 /* RLM Cause 9.3.22 M TLV 2-4 */
3974 offset = dissect_rsl_ie_rlm_cause(tvb, pinfo, tree, offset, true);
3975 break;
3976 /* 8.3.4 ESTABLISH REQUEST */
3977 case RSL_MSG_TYPE_EST_REQ:
3978 /* Channel number 9.3.1 M TV 2 */
3979 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
3980 /* Link Identifier 9.3.2 M TV 2 */
3981 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
3982 break;
3983 /* 8.3.5 ESTABLISH CONFIRM */
3984 case RSL_MSG_TYPE_EST_CONF:
3985 /* Channel number 9.3.1 M TV 2 */
3986 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
3987 /* Link Identifier 9.3.2 M TV 2 */
3988 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
3989 break;
3990 /* 8.3.6 */
3991 case RSL_MSG_EST_IND:
3992 /* Channel number 9.3.1 M TV 2 */
3993 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
3994 /* Link Identifier 9.3.2 M TV 2 */
3995 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
3996 /* L3 Information 9.3.11 O (note 1) TLV 3-23 */
3997 if (tvb_reported_length_remaining(tvb, offset) >1)
3998 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, false, L3_INF_OTHER);
3999 break;
4000 /* 8.3.7 RELEASE REQUEST */
4001 case RSL_MSG_REL_REQ:
4002 /* Channel number 9.3.1 M TV 2 */
4003 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4004 /* Link Identifier 9.3.2 M TV 2 */
4005 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
4006 /* Release Mode 9.3.20 M TV 2 */
4007 offset = dissect_rsl_ie_rel_mode(tvb, pinfo, tree, offset, true);
4008 break;
4009 /* 8.3.8 RELEASE CONFIRM */
4010 case RSL_MSG_REL_CONF:
4011 /* Channel number 9.3.1 M TV 2 */
4012 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4013 /* Link Identifier 9.3.2 M TV 2 */
4014 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
4015 break;
4016 /* 8.3.9 RELEASE INDICATION */
4017 case RSL_MSG_REL_IND:
4018 /* Channel number 9.3.1 M TV 2 */
4019 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4020 /* Link Identifier 9.3.2 M TV 2 */
4021 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
4022 break;
4023 /* 8.3.10 UNIT DATA REQUEST 10 */
4024 case RSL_MSG_UNIT_DATA_REQ:
4025 /* Channel number 9.3.1 M TV 2 */
4026 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4027 /* Link Identifier 9.3.2 M TV 2 */
4028 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
4029 /* L3 Information 9.3.11 O (note 1) TLV 3-23 */
4030 if (tvb_reported_length_remaining(tvb, offset) > 0)
4031 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, false, L3_INF_OTHER);
4032 break;
4033 /* 8.3.11 UNIT DATA INDICATION */
4034 case RSL_MSG_UNIT_DATA_IND:
4035 /* Channel number 9.3.1 M TV 2 */
4036 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4037 /* Link Identifier 9.3.2 M TV 2 */
4038 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
4039 /* L3 Information 9.3.11 M TLV 3-25 */
4040 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, true, L3_INF_OTHER);
4041 break;
4042 /* Common Channel Management/TRX Management messages */
4043 /* 8.5.1 BCCH INFORMATION 17*/
4044 case RSL_MSG_BCCH_INFO:
4045 /* Channel number 9.3.1 M TV 2 */
4046 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4047 /* System Info Type 9.3.30 M TV 2 */
4048 offset = dissect_rsl_ie_sys_info_type(tvb, pinfo, tree, offset, true, &sys_info_type);
4049 /* Full BCCH Info (SYS INFO) 9.3.39 O 1) TLV 25 */
4050 if (tvb_reported_length_remaining(tvb, offset) > 0)
4051 offset = dissect_rsl_ie_full_bcch_inf(tvb, pinfo, tree, offset, false);
4052 /* Starting Time 9.3.23 O 2) TV 3 */
4053 if (tvb_reported_length_remaining(tvb, offset) > 0)
4054 offset = dissect_rsl_ie_starting_time(tvb, pinfo, tree, offset, false);
4055 break;
4056 /* 8.5.2 CCCH LOAD INDICATION 18*/
4057 case RSL_MSG_CCCH_LOAD_IND:
4058 /* Channel number (note) 9.3.1 M TV 2 */
4059 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4060 /* Either RACH Load or Paging Load present */
4061 /* RACH Load 9.3.18 C 1) TLV >=8 */
4062 offset = dissect_rsl_ie_rach_load(tvb, pinfo, tree, offset, false);
4063 /* Paging Load 9.3.15 C 2) TV 3 */
4064 if (tvb_reported_length_remaining(tvb, offset) > 0)
4065 offset = dissect_rsl_ie_paging_load(tvb, pinfo, tree, offset, false);
4066 break;
4067 /* 8.5.3 */
4068 case RSL_MSG_CHANRQD: /* 19 */
4069 /* Channel number 9.3.1 M TV 2 */
4070 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4071 /* Request Reference 9.3.19 M TV 4 */
4072 offset = dissect_rsl_ie_req_ref(tvb, pinfo, tree, offset, true);
4073 /* Access Delay 9.3.17 M TV 2 */
4074 offset = dissect_rsl_ie_access_delay(tvb, pinfo, tree, offset, true);
4075 /* Physical Context 9.3.16 O 1) TLV >=2 */
4076 if (tvb_reported_length_remaining(tvb, offset) > 0)
4077 offset = dissect_rsl_ie_phy_ctx(tvb, pinfo, tree, offset, false);
4078 break;
4079 /* 8.5.4 DELETE INDICATION */
4080 case RSL_MSG_DELETE_IND: /* 20 */
4081 /* Channel number 9.3.1 M TV 2 */
4082 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4083 /* Full Imm. Assign Info 9.3.35 M TLV 25 */
4084 offset = dissect_rsl_ie_full_imm_ass_inf(tvb, pinfo, tree, offset, true);
4085 break;
4086 case RSL_MSG_PAGING_CMD: /* 21 */
4087 /* Channel number 9.3.1 M TV 2 */
4088 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4089 /* Paging Group 9.3.14 M TV 2 2 */
4090 offset = dissect_rsl_ie_paging_grp(tvb, pinfo, tree, offset, true);
4091 /* MS Identity 9.3.12 M TLV 2-10 2 */
4092 offset = dissect_rsl_ie_ms_id(tvb, pinfo, tree, offset, true);
4093 /* Channel Needed 9.3.40 O 1) TV 2 2 */
4094 if (tvb_reported_length_remaining(tvb, offset) > 0)
4095 offset = dissect_rsl_ie_ch_needed(tvb, pinfo, tree, offset, false);
4096 /* eMLPP Priority 9.3.49 O 2) TV 2 2 */
4097 if (tvb_reported_length_remaining(tvb, offset) > 0)
4098 offset = dissect_rsl_ie_emlpp_prio(tvb, pinfo, tree, offset, false);
4099 break;
4100 /* 8.5.6 IMMEDIATE ASSIGN COMMAND */
4101 case RSL_MSG_IMM_ASS_CMD: /* 22 */
4102 /* Channel number 9.3.1 M TV 2 */
4103 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4104 /* Full Imm. Assign Info 9.3.35 M TLV 25 */
4105 offset = dissect_rsl_ie_full_imm_ass_inf(tvb, pinfo, tree, offset, true);
4106 break;
4107 /* 8.5.7 SMS BROADCAST REQUEST */
4108 case RSL_MSG_SMS_BC_REQ: /* 23 8.5.7 */
4109 /* Channel number 9.3.1 M TV 2 */
4110 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4111 /* SMSCB Information 9.3.36 M TV 24 */
4112 offset = dissect_rsl_ie_smscb_inf(tvb, pinfo, tree, offset, true);
4113 /* SMSCB Channel Indicator 9.3.44 O 1) TV 2 */
4114 if (tvb_reported_length_remaining(tvb, offset) > 0)
4115 offset = dissect_rsl_ie_smscb_ch_ind(tvb, pinfo, tree, offset, false);
4116 break;
4117 /* 8.6 TRX MANAGEMENT MESSAGES */
4118 /* 8.6.1 RF RESOURCE INDICATION */
4119 case RSL_MSG_RF_RES_IND: /* 24 8.6.1 */
4120 /* Resource Information 9.3.21 M TLV >=2 */
4121 offset = dissect_rsl_ie_resource_inf(tvb, pinfo, tree, offset, true);
4122 break;
4123 /* 8.6.2 SACCH FILLING */
4124 case RSL_MSG_SACCH_FILL: /* 25 8.6.2 */
4125 /* System Info Type 9.3.30 M TV 2 */
4126 offset = dissect_rsl_ie_sys_info_type(tvb, pinfo, tree, offset, true, &sys_info_type);
4127 /* L3 Info (SYS INFO) 9.3.11 O 1) TLV 22 */
4128 if (tvb_reported_length_remaining(tvb, offset) > 0)
4129 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, false,
4130 (sys_info_type == 0x48) ? L3_INF_SACCH : L3_INF_CCCH);
4131 /* Starting Time 9.3.23 O 2) TV 3 */
4132 if (tvb_reported_length_remaining(tvb, offset) > 0)
4133 offset = dissect_rsl_ie_starting_time(tvb, pinfo, tree, offset, false);
4134 break;
4135 case RSL_MSG_OVERLOAD: /* 27 8.6.3 */
4136 /* Cause 9.3.26 M TLV >=3 */
4137 offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, true);
4138 break;
4139 case RSL_MSG_ERROR_REPORT: /* 28 8.6.4 */
4140 /* Cause 9.3.26 M TLV >=3 */
4141 offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, true);
4142 /* Message Identifier 9.3.28 O 1) TV 2 */
4143 if (tvb_reported_length_remaining(tvb, offset) > 0)
4144 offset = dissect_rsl_ie_message_id(tvb, pinfo, tree, offset, false);
4145 /* Channel Number 9.3.1 O 2) TV 2 */
4146 if (tvb_reported_length_remaining(tvb, offset) > 0)
4147 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, false);
4148 /* Link identifier 9.3.2 O 3) TV 2 */
4149 if (tvb_reported_length_remaining(tvb, offset) > 0)
4150 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, false);
4151 /* Erroneous Message 9.3.38 O 4) TLV >=3 */
4152 if (tvb_reported_length_remaining(tvb, offset) > 0)
4153 offset = dissect_rsl_ie_err_msg(tvb, pinfo, tree, offset, false);
4154 break;
4155 /* 8.5.8 SMS BROADCAST COMMAND */
4156 case RSL_MSG_SMS_BC_CMD: /* 29 8.5.8 */
4157 /* Channel number 9.3.1 M TV 2 */
4158 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4159 /* CB Command type 9.3.41 M TV 2 */
4160 offset = dissect_rsl_ie_cb_cmd_type(tvb, pinfo, tree, offset, true);
4161 /* SMSCB message 9.3.42 M TLV 2-90 */
4162 offset = dissect_rsl_ie_smscb_mess(tvb, pinfo, tree, offset, true);
4163 /* SMSCB Channel Indicator 9.3.44 O 1) TV 2 */
4164 if (tvb_reported_length_remaining(tvb, offset) > 0)
4165 offset = dissect_rsl_ie_smscb_ch_ind(tvb, pinfo, tree, offset, false);
4166 break;
4167 case RSL_MSG_CBCH_LOAD_IND: /* 30 8.5.9 */
4168 /* Channel number 9.3.1 M TV 2 */
4169 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4170 /* CBCH Load Information 9.3.43 M TV 2 */
4171 offset = dissect_rsl_ie_cbch_load_inf(tvb, pinfo, tree, offset, true);
4172 /* SMSCB Channel Indicator 9.3.44 O 1) TV 2 */
4173 if (tvb_reported_length_remaining(tvb, offset) > 0)
4174 offset = dissect_rsl_ie_smscb_ch_ind(tvb, pinfo, tree, offset, false);
4175 break;
4176 case RSL_MSG_NOT_CMD: /* 31 8.5.10 */
4177 /* Channel number 9.3.1 M TV 2 */
4178 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4179 /* Command indicator 9.3.48 M 1) TLV 3-4 */
4180 offset = dissect_rsl_ie_cmd_ind(tvb, pinfo, tree, offset, true);
4181 /* Group call reference 9.3.45 O TLV 7 */
4182 if (tvb_reported_length_remaining(tvb, offset) > 0)
4183 offset = dissect_rsl_ie_grp_call_ref(tvb, pinfo, tree, offset, false);
4184 /* Channel Description 9.3.46 O TLV 3-n */
4185 if (tvb_reported_length_remaining(tvb, offset) > 0)
4186 offset = dissect_rsl_ie_ch_desc(tvb, pinfo, tree, offset, false);
4187 /* NCH DRX information 9.3.47 O TLV 3 */
4188 if (tvb_reported_length_remaining(tvb, offset) > 0)
4189 offset = dissect_rsl_ie_nch_drx(tvb, pinfo, tree, offset, false);
4190 break;
4192 /* Dedicated Channel Management messages: */
4193 /* 8.4.1 CHANNEL ACTIVATION 33*/
4194 case RSL_MSG_CHAN_ACTIV:
4195 /* Channel number 9.3.1 M TV 2 */
4196 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4197 /* Activation Type 9.3.3 M TV 2 */
4198 offset = dissect_rsl_ie_act_type(tvb, pinfo, tree, offset, true);
4199 /* Channel Mode 9.3.6 M TLV 8-9 */
4200 if (tvb_reported_length_remaining(tvb, offset) > 0)
4201 /* mandatory in 48.008, but not in Ericsson + Osmocom */
4202 offset = dissect_rsl_ie_ch_mode(tvb, pinfo, tree, offset, true);
4203 /* Channel Identification 9.3.5 O 7) TLV 8 */
4204 if (tvb_reported_length_remaining(tvb, offset) > 0)
4205 offset = dissect_rsl_ie_ch_id(tvb, pinfo, tree, offset, false);
4206 /* Encryption information 9.3.7 O 1) TLV >=3 */
4207 if (tvb_reported_length_remaining(tvb, offset) > 0)
4208 offset = dissect_rsl_ie_enc_inf(tvb, pinfo, tree, offset, false);
4209 /* Handover Reference 9.3.9 C 2) TV 2 */
4210 if (tvb_reported_length_remaining(tvb, offset) > 0)
4211 offset = dissect_rsl_ie_ho_ref(tvb, pinfo, tree, offset, false);
4212 /* BS Power 9.3.4 O 3) TV 2 */
4213 if (tvb_reported_length_remaining(tvb, offset) > 0)
4214 offset = dissect_rsl_ie_bs_power(tvb, pinfo, tree, offset, false);
4215 /* MS Power 9.3.13 O 3) TV 2 */
4216 if (tvb_reported_length_remaining(tvb, offset) > 0)
4217 offset = dissect_rsl_ie_ms_pow(tvb, pinfo, tree, offset, false);
4218 /* Timing Advance 9.3.24 C 3) 4) TV 2 */
4219 if (tvb_reported_length_remaining(tvb, offset) > 0)
4220 offset = dissect_rsl_ie_timing_adv(tvb, pinfo, tree, offset, false);
4221 /* BS Power Parameters 9.3.32 O 5) TLV >=2 */
4222 if (tvb_reported_length_remaining(tvb, offset) > 0)
4223 offset = dissect_rsl_ie_bs_power_params(tvb, pinfo, tree, offset, false);
4224 /* MS Power Parameters 9.3.31 O 5) TLV >=2 */
4225 if (tvb_reported_length_remaining(tvb, offset) > 0)
4226 offset = dissect_rsl_ie_ms_pow_params(tvb, pinfo, tree, offset, false);
4227 /* Physical Context 9.3.16 O 6) TLV >=2 */
4228 if (tvb_reported_length_remaining(tvb, offset) > 0)
4229 offset = dissect_rsl_ie_phy_ctx(tvb, pinfo, tree, offset, false);
4230 /* SACCH Information 9.3.29 O 8) TLV >=3 */
4231 /* UIC 9.3.50 O 9) TLV 3 */
4232 if (tvb_reported_length_remaining(tvb, offset) > 0)
4233 offset = dissect_rsl_ie_uic(tvb, pinfo, tree, offset, false);
4234 /* Main channel reference 9.3.51 O 10) TV 2 */
4235 if (tvb_reported_length_remaining(tvb, offset) > 0)
4236 offset = dissect_rsl_ie_main_ch_ref(tvb, pinfo, tree, offset, false);
4237 /* MultiRate configuration 9.3.52 O 11) TLV >=4 */
4238 if (tvb_reported_length_remaining(tvb, offset) > 0)
4239 offset = dissect_rsl_ie_multirate_conf(tvb, pinfo, tree, offset, false);
4240 /* MultiRate Control 9.3.53 O 12) TV 2 */
4241 if (tvb_reported_length_remaining(tvb, offset) > 0)
4242 offset = dissect_rsl_ie_multirate_cntrl(tvb, pinfo, tree, offset, false);
4243 /* Supported Codec Types 9.3.54 O 12) TLV >=5 */
4244 if (tvb_reported_length_remaining(tvb, offset) > 0)
4245 offset = dissect_rsl_ie_sup_codec_types(tvb, pinfo, tree, offset, false);
4246 /* TFO transparent container 9.3.59 O 12) TLV >=3 */
4247 if (tvb_reported_length_remaining(tvb, offset) > 0)
4248 offset = dissect_rsl_ie_tfo_transp_cont(tvb, pinfo, tree, offset, false);
4249 /* Osmocom specific IEs */
4250 if (global_rsl_use_osmo_bts) {
4251 /* Repeated ACCH Capabilities O TLV */
4252 if (tvb_reported_length_remaining(tvb, offset) > 0)
4253 offset = dissect_rsl_ie_osmo_rep_acch_cap(tvb, pinfo, tree, offset, false);
4254 /* Temporary ACCH Overpower Capabilities O TLV */
4255 if (tvb_reported_length_remaining(tvb, offset) > 0)
4256 offset = dissect_rsl_ie_osmo_top_acch_cap(tvb, pinfo, tree, offset, false);
4257 /* Training Sequence O TLV 2 */
4258 if (tvb_reported_length_remaining(tvb, offset) > 0)
4259 offset = dissect_rsl_ie_osmo_training_seq(tvb, pinfo, tree, offset, false);
4261 break;
4263 /* 8.4.2 CHANNEL ACTIVATION ACKNOWLEDGE 34*/
4264 case RSL_MSG_CHAN_ACTIV_ACK:
4265 /* Channel number 9.3.1 M TV 2 */
4266 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4267 /* Frame number 9.3.8 M TV 3 */
4268 offset = dissect_rsl_ie_frame_no(tvb, pinfo, tree, offset, true);
4269 break;
4270 case RSL_MSG_CHAN_ACTIV_N_ACK:
4271 /* 8.4.3 CHANNEL ACTIVATION NEGATIVE ACKNOWLEDGE */
4272 /* Channel number 9.3.1 M TV 2 */
4273 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4274 /* Cause 9.3.26 M TLV >=3 */
4275 offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, true);
4276 break;
4277 /* 8.4.4 CONNECTION FAILURE INDICATION */
4278 case RSL_MSG_CONN_FAIL:
4279 /* Channel number 9.3.1 M TV 2 */
4280 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4281 /* Cause 9.3.26 M TLV >=3 */
4282 offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, true);
4283 break;
4284 /* 8.4.5 DEACTIVATE SACCH */
4285 case RSL_MSG_DEACTIVATE_SACCH:
4286 /* Channel number 9.3.1 M TV 2 */
4287 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4288 break;
4289 /* 8.4.6 ENCRYPTION COMMAND */
4290 case RSL_MSG_ENCR_CMD: /* 38 8.4.6 */
4291 /* Channel number 9.3.1 M TV 2 */
4292 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4293 /* Encryption information 9.3.7 M TLV >=3 */
4294 offset = dissect_rsl_ie_enc_inf(tvb, pinfo, tree, offset, true);
4295 /* Link Identifier 9.3.2 M TV 2 */
4296 offset = dissect_rsl_ie_link_id(tvb, pinfo, tree, offset, true);
4297 /* L3 Info (CIPH MOD CMD) 9.3.11 M TLV 6 */
4298 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, true, L3_INF_OTHER);
4299 break;
4300 /* 8.4.7 HANDOVER DETECTION */
4301 case RSL_MSG_HANDODET: /* 39 8.4.7 */
4302 /* Channel number 9.3.1 M TV 2 */
4303 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4304 /* Access Delay 9.3.17 O 1) TV 2 */
4305 if (tvb_reported_length_remaining(tvb, offset) > 0)
4306 offset = dissect_rsl_ie_access_delay(tvb, pinfo, tree, offset, false);
4307 /* Osmocom specific IEs */
4308 if (global_rsl_use_osmo_bts) {
4309 /* Training Sequence O TLV 2 */
4310 if (tvb_reported_length_remaining(tvb, offset) > 0)
4311 offset = dissect_rsl_ie_osmo_training_seq(tvb, pinfo, tree, offset, false);
4313 break;
4314 /* 8.4.8 MEASUREMENT RESULT 40 */
4315 case RSL_MSG_MEAS_RES:
4316 /* Channel number 9.3.1 M TV 2 */
4317 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4318 /* Measurement result number 9.3.27 M TV 2 */
4319 offset = dissect_rsl_ie_meas_res_no(tvb, pinfo, tree, offset, true);
4320 /* Uplink Measurements 9.3.25 M TLV >=5 */
4321 offset = dissect_rsl_ie_uplik_meas(tvb, pinfo, tree, offset, true);
4322 /* BS Power 9.3.4 M TV 2 */
4323 offset = dissect_rsl_ie_bs_power(tvb, pinfo, tree, offset, true);
4324 /* L1 Information 9.3.10 O 1) TV 3 */
4325 if (tvb_reported_length_remaining(tvb, offset) > 0)
4326 offset = dissect_rsl_ie_l1_inf(tvb, pinfo, tree, offset, false);
4327 /* L3 Info (MEAS REP, EXT MEAS REP or ENH MEAS REP) 9.3.11 O 1) TLV 21 */
4328 if (tvb_reported_length_remaining(tvb, offset) > 3){
4329 /* Try to figure out of we have (MEAS REP, EXT MEAS REP or ENH MEAS REP) */
4330 if ( ( tvb_get_uint8(tvb, offset+3) & 0xFE ) == 0x10 ) {
4331 /* ENH MEAS REP */
4332 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, false, L3_INF_SACCH);
4333 }else{
4334 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, false, L3_INF_OTHER);
4337 /* MS Timing Offset 9.3.37 O 2) TV 2 */
4338 if (tvb_reported_length_remaining(tvb, offset) > 0)
4339 offset = dissect_rsl_ie_ms_timing_offset(tvb, pinfo, tree, offset, false);
4340 break;
4341 /* 8.4.9 MODE MODIFY */
4342 case RSL_MSG_MODE_MODIFY_REQ: /* 41 8.4.9 */
4343 /* Channel number 9.3.1 M TV 2 */
4344 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4345 /* Channel Mode 9.3.6 M TLV 8-9 */
4346 offset = dissect_rsl_ie_ch_mode(tvb, pinfo, tree, offset, true);
4347 /* Encryption information 9.3.7 O 1) TLV >=3 */
4348 if (tvb_reported_length_remaining(tvb, offset) > 0)
4349 offset = dissect_rsl_ie_enc_inf(tvb, pinfo, tree, offset, false);
4350 /* Main channel reference 9.3.45 O 2) TV 2 */
4351 if (tvb_reported_length_remaining(tvb, offset) > 0)
4352 offset = dissect_rsl_ie_main_ch_ref(tvb, pinfo, tree, offset, false);
4353 /* MultiRate configuration 9.3.52 O 3) TLV >=3 */
4354 if (tvb_reported_length_remaining(tvb, offset) > 0)
4355 offset = dissect_rsl_ie_multirate_conf(tvb, pinfo, tree, offset, false);
4356 /* Multirate Control 9.3.53 O 4) TV 2 */
4357 if (tvb_reported_length_remaining(tvb, offset) > 0)
4358 offset = dissect_rsl_ie_multirate_cntrl(tvb, pinfo, tree, offset, false);
4359 /* Supported Codec Types 9.3.54 O 4) TLV >=5 */
4360 if (tvb_reported_length_remaining(tvb, offset) > 0)
4361 offset = dissect_rsl_ie_sup_codec_types(tvb, pinfo, tree, offset, false);
4362 /* TFO transparent container 9.3.59 O 4) TLV */
4363 if (tvb_reported_length_remaining(tvb, offset) > 0)
4364 offset = dissect_rsl_ie_tfo_transp_cont(tvb, pinfo, tree, offset, false);
4365 /* Osmocom specific IEs */
4366 if (global_rsl_use_osmo_bts) {
4367 /* Repeated ACCH Capabilities O TLV */
4368 if (tvb_reported_length_remaining(tvb, offset) > 0)
4369 offset = dissect_rsl_ie_osmo_rep_acch_cap(tvb, pinfo, tree, offset, false);
4370 /* Temporary ACCH Overpower Capabilities O TLV */
4371 if (tvb_reported_length_remaining(tvb, offset) > 0)
4372 offset = dissect_rsl_ie_osmo_top_acch_cap(tvb, pinfo, tree, offset, false);
4373 /* Training Sequence O TLV 2 */
4374 if (tvb_reported_length_remaining(tvb, offset) > 0)
4375 offset = dissect_rsl_ie_osmo_training_seq(tvb, pinfo, tree, offset, false);
4377 break;
4378 /* 8.4.10 MODE MODIFY ACKNOWLEDGE */
4379 case RSL_MSG_MODE_MODIFY_ACK: /* 42 8.4.10 */
4380 /* Channel number 9.3.1 M TV 2 */
4381 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4382 break;
4383 /* 8.4.11 MODE MODIFY NEGATIVE ACKNOWLEDGE */
4384 case RSL_MSG_MODE_MODIFY_NACK: /* 43 8.4.11 */
4385 /* Channel number 9.3.1 M TV 2 */
4386 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4387 /* Cause 9.3.26 M TLV >=3 */
4388 offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, true);
4389 break;
4390 /* 8.4.12 PHYSICAL CONTEXT REQUEST */
4391 case RSL_MSG_PHY_CONTEXT_REQ: /* 44 8.4.12 */
4392 /* Channel number 9.3.1 M TV 2 */
4393 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4394 break;
4395 /* 8.4.13 PHYSICAL CONTEXT CONFIRM */
4396 case RSL_MSG_PHY_CONTEXT_CONF: /* 45 8.4.13 */
4397 /* Channel number 9.3.1 M TV 2 */
4398 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4399 /* BS Power 9.3.4 M TV 2 */
4400 offset = dissect_rsl_ie_bs_power(tvb, pinfo, tree, offset, true);
4401 /* MS Power 9.3.13 M TV 2 */
4402 offset = dissect_rsl_ie_ms_pow(tvb, pinfo, tree, offset, true);
4403 /* Timing Advance 9.3.24 M TV 2 */
4404 offset = dissect_rsl_ie_timing_adv(tvb, pinfo, tree, offset, true);
4405 /* Physical Context 9.3.16 O 1) TLV */
4406 if (tvb_reported_length_remaining(tvb, offset) > 0)
4407 offset = dissect_rsl_ie_phy_ctx(tvb, pinfo, tree, offset, false);
4408 break;
4409 /* 8.4.14 RF CHANNEL RELEASE */
4410 case RSL_MSG_RF_CHAN_REL: /* 46 8.4.14 */
4411 /* Channel number 9.3.1 M TV 2 */
4412 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4413 break;
4414 /* 8.4.15 MS POWER CONTROL */
4415 case RSL_MSG_MS_POWER_CONTROL: /* 47 8.4.15 */
4416 /* Channel number 9.3.1 M TV 2 */
4417 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4418 /* MS Power 9.3.13 M TV 2 */
4419 if (tvb_reported_length_remaining(tvb, offset) > 0)
4420 offset = dissect_rsl_ie_ms_pow(tvb, pinfo, tree, offset, false);
4421 /* MS Power Parameters 9.3.31 O 1) TLV >=2 */
4422 if (tvb_reported_length_remaining(tvb, offset) > 0)
4423 offset = dissect_rsl_ie_ms_pow_params(tvb, pinfo, tree, offset, false);
4424 break;
4425 /* 8.4.16 BS POWER CONTROL */
4426 case RSL_MSG_BS_POWER_CONTROL: /* 48 8.4.16 */
4427 /* Channel number 9.3.1 M TV 2 */
4428 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4429 /* BS Power 9.3.4 M TV 2 */
4430 offset = dissect_rsl_ie_bs_power(tvb, pinfo, tree, offset, true);
4431 /* BS Power Parameters 9.3.32 O 1) TLV >=2 */
4432 if (tvb_reported_length_remaining(tvb, offset) > 0)
4433 offset = dissect_rsl_ie_bs_power_params(tvb, pinfo, tree, offset, false);
4434 break;
4435 /* 8.4.17 PREPROCESS CONFIGURE */
4436 case RSL_MSG_PREPROC_CONFIG: /* 49 8.4.17 */
4437 /* Channel number 9.3.1 M TV 2 */
4438 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4439 /* Preproc. Parameters 9.3.33 M TLV >=3 */
4440 break;
4441 /* 8.4.18 PREPROCESSED MEASUREMENT RESULT */
4442 case RSL_MSG_PREPROC_MEAS_RES: /* 50 8.4.18 */
4443 /* Channel number 9.3.1 M TV 2 */
4444 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4445 /* Preproc. Measurements 9.3.34 M TLV >=2 */
4446 break;
4447 /* 8.4.19 RF CHANNEL RELEASE ACKNOWLEDGE */
4448 case RSL_MSG_RF_CHAN_REL_ACK: /* 51 8.4.19 */
4449 /* Channel number 9.3.1 M TV 2 */
4450 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4451 break;
4452 /* 8.4.20 SACCH INFO MODIFY */
4453 case RSL_MSG_SACCH_INFO_MODIFY: /* 52 8.4.20 */
4454 /* Channel number 9.3.1 M TV 2 */
4455 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4456 /* System Info Type 9.3.30 M TV 2 */
4457 offset = dissect_rsl_ie_sys_info_type(tvb, pinfo, tree, offset, true, &sys_info_type);
4458 /* L3 Info 9.3.11 O 1) TLV 22 */
4459 if (tvb_reported_length_remaining(tvb, offset) > 0)
4460 offset = dissect_rsl_ie_L3_inf(tvb, pinfo, tree, offset, false,
4461 (sys_info_type == 0x48) ? L3_INF_SACCH : L3_INF_CCCH);
4462 /* Starting Time 9.3.23 O 2) TV 3 */
4463 if (tvb_reported_length_remaining(tvb, offset) > 0)
4464 offset = dissect_rsl_ie_starting_time(tvb, pinfo, tree, offset, false);
4465 break;
4466 /* 8.4.21 TALKER DETECTION */
4467 case RSL_MSG_TALKER_DET: /* 53 8.4.21 */
4468 /* Channel number 9.3.1 M TV 2 */
4469 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4470 /* Access Delay 9.3.17 O 1) TV 2 */
4471 if (tvb_reported_length_remaining(tvb, offset) > 0)
4472 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, false);
4473 break;
4474 /* 8.4.22 LISTENER DETECTION */
4475 case RSL_MSG_LISTENER_DET: /* 54 8.4.22 */
4476 /* Channel number 9.3.1 M TV 2 */
4477 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4478 /* Access Delay 9.3.17 O 1) TV 2 */
4479 if (tvb_reported_length_remaining(tvb, offset) > 0)
4480 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, false);
4481 break;
4482 /* 8.4.23 REMOTE CODEC CONFIGURATION REPORT */
4483 case RSL_MSG_REMOTE_CODEC_CONF_REP:/* 55 8.4.23 */
4484 /* Channel number 9.3.1 M TV 2 */
4485 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4486 /* Codec Configuration 9.3.55 M TLV >=3 */
4487 offset = dissect_rsl_ie_codec_conf(tvb, pinfo, tree, offset, true);
4488 /* Supported Codec Types 9.3.54 M TLV >=5 */
4489 if (tvb_reported_length_remaining(tvb, offset) > 0)
4490 offset = dissect_rsl_ie_sup_codec_types(tvb, pinfo, tree, offset, false);
4491 /* TFO transparent container 9.3.59 O 4) TLV >=3 */
4492 if (tvb_reported_length_remaining(tvb, offset) > 0)
4493 offset = dissect_rsl_ie_tfo_transp_cont(tvb, pinfo, tree, offset, false);
4494 break;
4495 /* 8.4.24 ROUND TRIP DELAY REPORT */
4496 case RSL_MSG_R_T_D_REP: /* 56 8.4.24 */
4497 /* Channel number 9.3.1 M TV 2 */
4498 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4499 /* Round Trip Delay 9.3.56 M TV 2 */
4500 offset = dissect_rsl_ie_rtd(tvb, pinfo, tree, offset, true);
4501 break;
4502 /* 8.4.25 PRE-HANDOVER NOTIFICATION */
4503 case RSL_MSG_PRE_HANDO_NOTIF: /* 57 8.4.25 */
4504 /* Channel number 9.3.1 M TV 2 */
4505 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4506 /* MultiRateControl 9.3.53 M TV 2 */
4507 offset = dissect_rsl_ie_multirate_cntrl(tvb, pinfo, tree, offset, true);
4508 /* Codec Configuration 9.3.55 M TLV >=3 */
4509 offset = dissect_rsl_ie_codec_conf(tvb, pinfo, tree, offset, true);
4510 /* TFO transparent container 9.3.59 O 4) TLV >=3 */
4511 if (tvb_reported_length_remaining(tvb, offset) > 0)
4512 offset = dissect_rsl_ie_tfo_transp_cont(tvb, pinfo, tree, offset, false);
4513 break;
4514 /* 8.4.26 MULTIRATE CODEC MODIFICATION REQUEST */
4515 case RSL_MSG_MR_CODEC_MOD_REQ: /* 58 8.4.26 */
4516 /* Channel number 9.3.1 M TV 2 */
4517 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4518 /* MultiRate Configuration 9.3.52 O 1) TLV >=4 */
4519 if (tvb_reported_length_remaining(tvb, offset) > 0)
4520 offset = dissect_rsl_ie_multirate_conf(tvb, pinfo, tree, offset, false);
4521 break;
4522 /* 8.4.27 MULTIRATE CODEC MODIFICATION ACKNOWLEDGE */
4523 case RSL_MSG_MR_CODEC_MOD_ACK: /* 59 8.4.27 */
4524 /* Channel number 9.3.1 M TV 2 */
4525 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4526 /* MultiRate Configuration 9.3.52 O 1) TLV >=4 */
4527 if (tvb_reported_length_remaining(tvb, offset) > 0)
4528 offset = dissect_rsl_ie_multirate_conf(tvb, pinfo, tree, offset, false);
4529 break;
4530 /* 8.4.28 MULTIRATE CODEC MODIFICATION NEGATIVE ACKNOWLEDGE */
4531 case RSL_MSG_MR_CODEC_MOD_NACK: /* 60 8.4.28 */
4532 /* Channel number 9.3.1 M TV 2 */
4533 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4534 /* Cause 9.3.26 M TLV >=3 */
4535 offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, true);
4536 break;
4537 /* 8.4.29 MULTIRATE CODEC MODIFICATION PERFORMED */
4538 case RSL_MSG_MR_CODEC_MOD_PER: /* 61 8.4.29 */
4539 /* Channel number 9.3.1 M TV 2 */
4540 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4541 /* MultiRate Configuration 9.3.52 M TLV >=4 */
4542 offset = dissect_rsl_ie_multirate_conf(tvb, pinfo, tree, offset, true);
4543 break;
4544 /* 8.4.30 TFO REPORT */
4545 case RSL_MSG_TFO_REP: /* 62 8.4.30 */
4546 /* Channel number 9.3.1 M TV 2 */
4547 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4548 /* TFO Status 9.3.57 M TV 1 */
4549 offset = dissect_rsl_ie_tfo_status(tvb, pinfo, tree, offset, true);
4550 break;
4551 /* 8.4.31 TFO MODIFICATION REQUEST */
4552 case RSL_MSG_TFO_MOD_REQ: /* 63 8.4.31 */
4553 /* Channel number 9.3.1 M TV 2 */
4554 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4555 /* MultiRateControl 9.3.53 M TV 2 */
4556 offset = dissect_rsl_ie_multirate_cntrl(tvb, pinfo, tree, offset, true);
4557 /* Supported Codec Type 9.3.54 O 1) TLV >=5 */
4558 if (tvb_reported_length_remaining(tvb, offset) > 0)
4559 offset = dissect_rsl_ie_sup_codec_types(tvb, pinfo, tree, offset, false);
4560 /* TFO transparent container 9.3.59 O 4) TLV >=3 */
4561 if (tvb_reported_length_remaining(tvb, offset) > 0)
4562 offset = dissect_rsl_ie_tfo_transp_cont(tvb, pinfo, tree, offset, false);
4563 break;
4564 /* 0 1 - - - - - - Location Services messages: */
4565 /* 8.7.1 LOCATION INFORMATION */
4566 case RSL_MSG_LOC_INF: /* 65 8.7.1 */
4567 /* LLP APDU 9.3.58 M LV 2-N */
4568 offset = dissect_rsl_ie_llp_apdu(tvb, pinfo, tree, offset, true);
4569 break;
4570 /* Encapsulating paging messages into a packet EP2192796 - proprietor Huawei */
4571 case RSL_MSG_TYPE_PAGING:
4572 paging_package_number = dissect_rsl_paging_package_number(tvb, pinfo, tree, &offset);
4573 offset = dissect_rsl_paging_package(tvb, pinfo, tree, offset, paging_package_number);
4574 break;
4575 case RSL_MSG_TYPE_OSMO_ETWS_CMD:
4576 /* See http://ftp.osmocom.org/docs/latest/osmobts-abis.pdf Section 5.5 on ETWS */
4577 /* Channel number 9.3.1 M TV 2 */
4578 offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, true);
4579 /* ETWS PN (Osmocom) Osmo 5.6.17 M TLV 2-58 */
4580 offset = dissect_rsl_ie_etws_pn(tvb, pinfo, tree, offset);
4581 break;
4582 /* the following messages are ip.access specific but sent without
4583 * ip.access memssage discriminator */
4584 case RSL_MSG_TYPE_IPAC_MEAS_PP_DEF:
4585 case RSL_MSG_TYPE_IPAC_HO_CAND_INQ:
4586 case RSL_MSG_TYPE_IPAC_HO_CAND_RESP:
4587 case RSL_MSG_TYPE_IPAC_PDCH_ACT:
4588 case RSL_MSG_TYPE_IPAC_PDCH_ACT_ACK:
4589 case RSL_MSG_TYPE_IPAC_PDCH_ACT_NACK:
4590 case RSL_MSG_TYPE_IPAC_PDCH_DEACT:
4591 case RSL_MSG_TYPE_IPAC_PDCH_DEACT_ACK:
4592 case RSL_MSG_TYPE_IPAC_PDCH_DEACT_NACK:
4593 if (global_rsl_use_nano_bts)
4594 offset = dissct_rsl_ipaccess_msg(tvb, pinfo, tree, offset-1);
4595 default:
4596 break;
4598 decrement_dissection_depth(pinfo);
4600 return offset;
4604 static const value_string rsl_ipacc_spm_s_vals[] = {
4605 { 0, "GSM FR codec (GSM type 1, FS)" },
4606 { 1, "GSM EFR codec (GSM type 2, FS)" },
4607 { 2, "GSM AMR/FR codec (GSM type 3, FS)" },
4608 { 3, "GSM HR codec (GSM type 1, HS)" },
4609 { 5, "GSM AMR/HR codec (GSM type 3, HS)" },
4610 { 0xf, "As specified by RTP Payload Type IE" },
4611 { 0, NULL }
4614 static const value_string rsl_ipacc_spm_m_vals[] = {
4615 { 0, "Send and Receive" },
4616 { 1, "Receive Only" },
4617 { 2, "Send Only" },
4618 { 0, NULL }
4621 static const value_string rsl_ipacc_rtp_csd_fmt_d_vals[] = {
4622 { 0, "External TRAU format" },
4623 { 1, "Non-TRAU Packed format" },
4624 { 2, "TRAU within the BTS" },
4625 { 3, "IWF-Free BTS-BTS Data" },
4626 { 0, NULL }
4629 static const value_string rsl_ipacc_rtp_csd_fmt_ir_vals[] = {
4630 { 0, "8kb/s" },
4631 { 1, "16kb/s" },
4632 { 2, "32kb/s" },
4633 { 3, "64kb/s" },
4634 { 0, NULL }
4637 /* GSM 04.08 9.1.8 Channel request, ESTABLISHMENT CAUSE */
4638 static void
4639 req_ref_ra_est_cause_convert(char *result, uint32_t ra)
4641 char *str;
4643 switch (ra & 0xe0) { /* 3 bit Establishment Cause codes */
4644 case 0x00:
4645 str = "Location updating and the network does not set NECI bit to 1";
4646 goto found;
4647 case 0x80:
4648 str = "Answer to paging: 'Any Channel', or ('TCH/F' or 'TCH/H or TCH/F') if MS is 'Full rate only'";
4649 goto found;
4650 case 0xa0:
4651 str = "Emergency call";
4652 goto found;
4653 case 0xc0:
4654 str = "Call re-establishment; TCH/F was in use, or TCH/H was in use but the network does not set NECI bit to 1";
4655 goto found;
4656 case 0xe0:
4657 str = "Originating call and TCH/F is needed, or originating call and the network does not set NECI bit to 1,"
4658 " or procedures that can be completed with a SDCCH and the network does not set NECI bit to 1";
4659 goto found;
4662 switch (ra & 0xf0) { /* 4 bit Establishment Cause codes */
4663 case 0x00:
4664 str = "Location updating and the network sets NECI bit to 1";
4665 goto found;
4666 case 0x10:
4667 str = "Answer to paging: 'SDCCH' / Other procedures which can be completed with an SDCCH and the network sets NECI bit to 1";
4668 goto found;
4669 case 0x20:
4670 str = "Answer to paging: MS is dual rate capable and requests 'TCH/F' only";
4671 goto found;
4672 case 0x30:
4673 str = "Answer to paging: MS is dual rate capable and requests 'TCH/H or TCH/F'";
4674 goto found;
4675 case 0x40:
4676 str = "Originating speech call from dual-rate mobile station when TCH/H is sufficient and the network sets NECI bit to 1";
4677 goto found;
4678 case 0x50:
4679 str = "Originating data call from dual-rate mobile station when TCH/H is sufficient and the network sets NECI bit to 1";
4680 goto found;
4681 case 0x70:
4682 str = "Reserved for future use. An SDCCH may be allocated";
4683 goto found;
4686 switch (ra & 0xf8) { /* 5 bit Establishment Cause codes */
4687 case 0x60:
4688 str = "Reserved for future use. An SDCCH may be allocated";
4689 goto found;
4692 switch (ra & 0xfc) { /* 6 bit Establishment Cause codes */
4693 case 0x68:
4694 str = "Call re-establishment; TCH/H was in use and the network sets NECI bit to 1";
4695 goto found;
4696 case 0x6c:
4697 str = "Call re-establishment; TCH/H + TCH/H was in use and the network sets NECI bit to 1";
4698 goto found;
4701 snprintf(result, ITEM_LABEL_LENGTH, "unknown ra %u", ra);
4702 return;
4704 found:
4705 snprintf(result, ITEM_LABEL_LENGTH, "%s", str);
4708 static int
4709 dissect_rsl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
4711 proto_item *ti;
4712 proto_tree *rsl_tree;
4713 uint8_t msg_type;
4716 int offset = 0;
4718 col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSL");
4719 col_clear(pinfo->cinfo, COL_INFO);
4721 msg_type = tvb_get_uint8(tvb, offset+1) & 0x7f;
4723 col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str_ext(msg_type, &rsl_msg_type_vals_ext, "unknown %u"));
4725 top_tree = tree;
4726 ti = proto_tree_add_item(tree, proto_rsl, tvb, 0, -1, ENC_NA);
4728 /* if nanoBTS specific vendor messages are not enabled, skip */
4729 if (!global_rsl_use_nano_bts) {
4730 uint8_t msg_disc = tvb_get_uint8(tvb, offset) >> 1;
4732 if (msg_disc == RSL_MSGDISC_IPACCESS)
4733 return 0;
4735 rsl_tree = proto_item_add_subtree(ti, ett_rsl);
4737 /* 9.1 Message discriminator */
4738 proto_tree_add_item(rsl_tree, hf_rsl_msg_dsc, tvb, offset, 1, ENC_BIG_ENDIAN);
4739 proto_tree_add_item(rsl_tree, hf_rsl_T_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
4741 offset = dissct_rsl_msg(tvb, pinfo, rsl_tree, offset);
4743 return offset;
4746 /* Register the protocol with Wireshark */
4747 void proto_register_rsl(void)
4749 /* Setup list of header fields */
4750 static hf_register_info hf[] = {
4751 { &hf_rsl_msg_dsc,
4752 { "Message discriminator", "gsm_abis_rsl.msg_dsc",
4753 FT_UINT8, BASE_DEC, VALS(rsl_msg_disc_vals), 0xfe,
4754 NULL, HFILL }
4756 { &hf_rsl_T_bit,
4757 { "T bit", "gsm_abis_rsl.T_bit",
4758 FT_BOOLEAN, 8, TFS(&rsl_t_bit_vals), 0x01,
4759 NULL, HFILL }
4761 { &hf_rsl_msg_type,
4762 { "Message type", "gsm_abis_rsl.msg_type",
4763 FT_UINT8, BASE_HEX_DEC|BASE_EXT_STRING, &rsl_msg_type_vals_ext, 0x7f,
4764 NULL, HFILL }
4766 { &hf_rsl_ie_id,
4767 { "Element identifier", "gsm_abis_rsl.ie_id",
4768 FT_UINT8, BASE_HEX_DEC|BASE_EXT_STRING, &rsl_ie_type_vals_ext, 0x0,
4769 NULL, HFILL }
4771 { &hf_rsl_ie_length,
4772 { "Length", "gsm_abis_rsl.ie_length",
4773 FT_UINT16, BASE_DEC, NULL, 0x0,
4774 NULL, HFILL }
4776 { &hf_rsl_ch_no_Cbits,
4777 { "C-bits", "gsm_abis_rsl.ch_no_Cbits",
4778 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsl_ch_no_Cbits_vals_ext, 0xf8,
4779 NULL, HFILL }
4781 { &hf_rsl_ch_no_TN,
4782 { "Time slot number (TN)", "gsm_abis_rsl.ch_no_TN",
4783 FT_UINT8, BASE_DEC, NULL, 0x07,
4784 NULL, HFILL }
4786 { &hf_rsl_rtd,
4787 { "Round Trip Delay (RTD)", "gsm_abis_rsl.rtd",
4788 FT_UINT8, BASE_DEC, NULL, 0xfe,
4789 NULL, HFILL }
4791 { &hf_rsl_delay_ind,
4792 { "Delay IND", "gsm_abis_rsl.delay_ind",
4793 FT_UINT8, BASE_DEC, VALS(rsl_delay_ind_vals), 0x01,
4794 NULL, HFILL }
4796 { &hf_rsl_tfo,
4797 { "TFO", "gsm_abis_rsl.tfo",
4798 FT_BOOLEAN, 8, TFS(&rsl_tfo_vals), 0x01,
4799 NULL, HFILL }
4801 { &hf_rsl_req_ref_ra,
4802 { "Random Access Information (RA)", "gsm_abis_rsl.req_ref_ra",
4803 FT_UINT8, BASE_DEC, NULL, 0x0,
4804 NULL, HFILL }
4806 { &hf_rsl_req_ref_ra_est_cause,
4807 { "Channel Request Establishment Cause", "gsm_abis_rsl.req_ref_ra.est_cause",
4808 FT_UINT8, BASE_CUSTOM, CF_FUNC(req_ref_ra_est_cause_convert), 0x0,
4809 NULL, HFILL }
4811 { &hf_rsl_req_ref_T1prim,
4812 { "T1'", "gsm_abis_rsl.req_ref_T1prim",
4813 FT_UINT8, BASE_DEC, NULL, 0xf8,
4814 NULL, HFILL }
4816 { &hf_rsl_req_ref_T3,
4817 { "T3", "gsm_abis_rsl.req_ref_T3",
4818 FT_UINT16, BASE_DEC, NULL, 0x07e0,
4819 NULL, HFILL }
4821 { &hf_rsl_req_ref_T2,
4822 { "T2", "gsm_abis_rsl.req_ref_T2",
4823 FT_UINT8, BASE_DEC, NULL, 0x1f,
4824 NULL, HFILL }
4826 { &hf_rsl_req_ref_rfn,
4827 { "RFN", "gsm_abis_rsl.req_ref_rfn",
4828 FT_UINT16, BASE_DEC, NULL, 0x0,
4829 "Reduced Frame Number", HFILL }
4831 { &hf_rsl_timing_adv,
4832 { "Timing Advance", "gsm_abis_rsl.timing_adv",
4833 FT_UINT8, BASE_DEC, NULL, 0x0,
4834 NULL, HFILL }
4836 { &hf_rsl_ho_ref,
4837 { "Hand-over reference", "gsm_abis_rsl.ho_ref",
4838 FT_UINT8, BASE_DEC, NULL, 0x0,
4839 NULL, HFILL }
4841 { &hf_rsl_l1inf_power_lev,
4842 { "MS power level", "gsm_abis_rsl.ms_power_lev",
4843 FT_UINT8, BASE_DEC, NULL, 0xf8,
4844 NULL, HFILL }
4846 { &hf_rsl_l1inf_fpc,
4847 { "FPC/EPC", "gsm_abis_rsl.ms_fpc",
4848 FT_BOOLEAN, 8, TFS(&tfs_inuse_not_inuse), 0x04,
4849 NULL, HFILL }
4851 { &hf_rsl_l1inf_srr,
4852 { "SRR (SACCH Repetition)", "gsm_abis_rsl.srr",
4853 FT_BOOLEAN, 8, TFS(&tfs_required_not_required), 0x02,
4854 NULL, HFILL }
4856 { &hf_rsl_ms_power_lev,
4857 { "MS power level", "gsm_abis_rsl.ms_power_lev",
4858 FT_UINT8, BASE_DEC, NULL, 0x1f,
4859 NULL, HFILL }
4861 { &hf_rsl_ms_fpc,
4862 { "FPC/EPC", "gsm_abis_rsl.ms_fpc",
4863 FT_BOOLEAN, 8, TFS(&tfs_inuse_not_inuse), 0x20,
4864 NULL, HFILL }
4866 { &hf_rsl_act_timing_adv,
4867 { "Actual Timing Advance", "gsm_abis_rsl.act_timing_adv",
4868 FT_UINT8, BASE_DEC, NULL, 0x0,
4869 NULL, HFILL }
4871 { &hf_rsl_dtxd,
4872 { "DTXd", "gsm_abis_rsl.dtxd",
4873 FT_BOOLEAN, 8, TFS(&rsl_dtxd_vals), 0x40,
4874 NULL, HFILL }
4876 { &hf_rsl_rxlev_full_up,
4877 { "RXLEV.FULL.up", "gsm_abis_rsl.rxlev_full_up",
4878 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gsm_a_rr_rxlev_vals_ext, 0x3f,
4879 NULL, HFILL }
4881 { &hf_rsl_rxlev_sub_up,
4882 { "RXLEV.SUB.up", "gsm_abis_rsl.rxlev_sub_up",
4883 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gsm_a_rr_rxlev_vals_ext, 0x3f,
4884 NULL, HFILL }
4886 { &hf_rsl_rxqual_full_up,
4887 { "RXQUAL.FULL.up", "gsm_abis_rsl.rxqual_full_up",
4888 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x38,
4889 NULL, HFILL }
4891 { &hf_rsl_rxqual_sub_up,
4892 { "RXQUAL.SUB.up", "gsm_abis_rsl.rxqual_sub_up",
4893 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x07,
4894 NULL, HFILL }
4896 { &hf_rsl_acc_delay,
4897 { "Access Delay", "gsm_abis_rsl.acc_del",
4898 FT_UINT8, BASE_DEC, NULL, 0x0,
4899 NULL, HFILL }
4901 { &hf_rsl_rach_slot_cnt,
4902 { "RACH Slot Count", "gsm_abis_rsl.rach_slot_cnt",
4903 FT_UINT16, BASE_DEC, NULL, 0x0,
4904 NULL, HFILL }
4906 { &hf_rsl_rach_busy_cnt,
4907 { "RACH Busy Count", "gsm_abis_rsl.rach_busy_cnt",
4908 FT_UINT16, BASE_DEC, NULL, 0x0,
4909 NULL, HFILL }
4911 { &hf_rsl_rach_acc_cnt,
4912 { "RACH Access Count", "gsm_abis_rsl.rach_acc_cnt",
4913 FT_UINT16, BASE_DEC, NULL, 0x0,
4914 NULL, HFILL }
4916 { &hf_rsl_phy_ctx,
4917 { "Physical Context", "gsm_abis_rsl.phy_ctx",
4918 FT_BYTES, BASE_NONE, NULL, 0x0,
4919 NULL, HFILL }
4921 { &hf_rsl_na,
4922 { "Not applicable (NA)", "gsm_abis_rsl.na",
4923 FT_BOOLEAN, 8, TFS(&rsl_na_vals), 0x20,
4924 NULL, HFILL }
4926 { &hf_rsl_ch_type,
4927 { "channel type", "gsm_abis_rsl.ch_type",
4928 FT_UINT8, BASE_DEC, VALS(rsl_ch_type_vals), 0xc0,
4929 NULL, HFILL }
4931 { &hf_rsl_prio,
4932 { "Priority", "gsm_abis_rsl.prio",
4933 FT_UINT8, BASE_DEC, VALS(rsl_prio_vals), 0x18,
4934 NULL, HFILL }
4936 { &hf_rsl_sapi,
4937 { "SAPI", "gsm_abis_rsl.sapi",
4938 FT_UINT8, BASE_DEC, NULL, 0x07,
4939 NULL, HFILL }
4941 { &hf_rsl_rbit,
4942 { "R", "gsm_abis_rsl.rbit",
4943 FT_BOOLEAN, 8, TFS(&rsl_rbit_vals), 0x80,
4944 NULL, HFILL }
4946 { &hf_rsl_a3a2,
4947 { "A3A2", "gsm_abis_rsl.a3a2",
4948 FT_UINT8, BASE_DEC, VALS(rsl_a3a2_vals), 0x06,
4949 NULL, HFILL }
4951 { &hf_rsl_a1_0,
4952 { "A1", "gsm_abis_rsl.a1_0",
4953 FT_BOOLEAN, 8, TFS(&rsl_a1_0_vals), 0x01,
4954 NULL, HFILL }
4956 { &hf_rsl_a1_1,
4957 { "A1", "gsm_abis_rsl.a1_1",
4958 FT_BOOLEAN, 8, TFS(&rsl_a1_1_vals), 0x01,
4959 NULL, HFILL }
4961 { &hf_rsl_a1_2,
4962 { "A1", "gsm_abis_rsl.a2_0",
4963 FT_BOOLEAN, 8, TFS(&rsl_a1_2_vals), 0x01,
4964 NULL, HFILL }
4966 { &hf_rsl_epc_mode,
4967 { "EPC mode", "gsm_abis_rsl.epc_mode",
4968 FT_BOOLEAN, 8, TFS(&rsl_epc_mode_vals), 0x20,
4969 NULL, HFILL }
4971 { &hf_rsl_bs_fpc_epc_mode,
4972 { "FPC-EPC mode", "gsm_abis_rsl.fpc_epc_mode",
4973 FT_BOOLEAN, 8, TFS(&rsl_fpc_epc_mode_vals), 0x10,
4974 NULL, HFILL }
4976 { &hf_rsl_bs_power,
4977 { "Power Level", "gsm_abis_rsl.bs_power",
4978 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsl_rlm_bs_power_vals_ext, 0x0f,
4979 NULL, HFILL }
4981 { &hf_rsl_cm_dtxd,
4982 { "DTXd", "gsm_abis_rsl.cm_dtxd",
4983 FT_BOOLEAN, 8, TFS(&rsl_dtx_vals), 0x02,
4984 NULL, HFILL }
4986 { &hf_rsl_cm_dtxu,
4987 { "DTXu", "gsm_abis_rsl.cm_dtxu",
4988 FT_BOOLEAN, 8, TFS(&rsl_dtx_vals), 0x01,
4989 NULL, HFILL }
4991 { &hf_rsl_speech_or_data,
4992 { "Speech or data indicator", "gsm_abis_rsl.speech_or_data",
4993 FT_UINT8, BASE_DEC, VALS(rsl_speech_or_data_vals), 0x0,
4994 NULL, HFILL }
4996 { &hf_rsl_ch_rate_and_type,
4997 { "Channel rate and type", "gsm_abis_rsl.ch_rate_and_type",
4998 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsl_ch_rate_and_type_vals_ext, 0x0,
4999 NULL, HFILL }
5001 { &hf_rsl_speech_coding_alg,
5002 { "Speech coding algorithm", "gsm_abis_rsl.speech_coding_alg",
5003 FT_UINT8, BASE_DEC, VALS(rsl_speech_coding_alg_vals), 0x0,
5004 NULL, HFILL }
5006 { &hf_rsl_t_nt_bit,
5007 { "Transparent indication", "gsm_abis_rsl.t_nt_bit",
5008 FT_BOOLEAN, 8, TFS(&t_nt_bit_vals), 0x40,
5009 NULL, HFILL }
5011 { &hf_rsl_ra_if_data_rte,
5012 { "Radio interface data rate", "gsm_abis_rsl.ra_if_data_rte",
5013 FT_UINT8, BASE_DEC, VALS(rsl_ra_if_data_rte_vals), 0x3f,
5014 NULL, HFILL }
5016 { &hf_rsl_data_rte,
5017 { "Data rate", "gsm_abis_rsl.data_rte",
5018 FT_UINT8, BASE_DEC, VALS(rsl_data_rte_vals), 0x3f,
5019 NULL, HFILL }
5021 { &hf_rsl_alg_id,
5022 { "Algorithm Identifier", "gsm_abis_rsl.alg_id",
5023 FT_UINT8, BASE_DEC, VALS(rsl_algorithm_id_vals), 0x0,
5024 NULL, HFILL }
5026 { &hf_rsl_key,
5027 { "KEY", "gsm_abis_rsl.key",
5028 FT_BYTES, BASE_NONE, NULL, 0x0,
5029 NULL, HFILL }
5031 { &hf_rsl_cause,
5032 { "Cause", "gsm_abis_rsl.cause",
5033 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsl_rlm_cause_vals_ext, 0x7f,
5034 NULL, HFILL }
5036 { &hf_rsl_rel_mode,
5037 { "Release Mode", "gsm_abis_rsl.rel_mode",
5038 FT_UINT8, BASE_DEC, VALS(rel_mode_vals), 0x01,
5039 NULL, HFILL }
5041 { &hf_rsl_interf_band,
5042 { "Interf Band", "gsm_abis_rsl.interf_band",
5043 FT_UINT8, BASE_DEC, NULL, 0xe0,
5044 NULL, HFILL }
5046 { &hf_rsl_interf_band_reserved,
5047 { "Interf Band reserved bits", "gsm_abis_rsl.interf_band_reserved",
5048 FT_UINT8, BASE_DEC, NULL, 0x1f,
5049 NULL, HFILL }
5051 { &hf_rsl_meas_res_no,
5052 { "Measurement result number", "gsm_abis_rsl.meas_res_no",
5053 FT_UINT8, BASE_DEC, NULL, 0x0,
5054 NULL, HFILL }
5056 { &hf_rsl_extension_bit,
5057 { "Extension", "gsm_abis_rsl.extension_bit",
5058 FT_BOOLEAN, 8, TFS(&rsl_extension_bit_value), 0x80,
5059 NULL, HFILL }},
5060 { &hf_rsl_class,
5061 { "Class", "gsm_abis_rsl.class",
5062 FT_UINT8, BASE_DEC, VALS(rsl_class_vals), 0x70,
5063 NULL, HFILL }
5065 { &hf_rsl_cause_value,
5066 { "Cause Value", "gsm_abis_rsl.cause_value",
5067 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsl_cause_value_vals_ext, 0x7f,
5068 NULL, HFILL }
5070 { &hf_rsl_paging_grp,
5071 { "Paging Group", "gsm_abis_rsl.paging_grp",
5072 FT_UINT8, BASE_DEC, NULL, 0x0,
5073 NULL, HFILL }
5075 { &hf_rsl_paging_load,
5076 { "Paging Buffer Space", "gsm_abis_rsl.paging_load",
5077 FT_UINT16, BASE_DEC, NULL, 0x0,
5078 NULL, HFILL }
5080 { &hf_rsl_sys_info_type,
5081 { "System Info Type", "gsm_abis_rsl.sys_info_type",
5082 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsl_sys_info_type_vals_ext, 0x0,
5083 NULL, HFILL }
5085 { &hf_rsl_timing_offset,
5086 { "Timing Offset", "gsm_abis_rsl.timing_offset",
5087 FT_UINT8, BASE_DEC, NULL, 0x0,
5088 NULL, HFILL }
5090 { &hf_rsl_ch_needed,
5091 { "Channel Needed", "gsm_abis_rsl.ch_needed",
5092 FT_UINT8, BASE_DEC, VALS(rsl_ch_needed_vals), 0x03,
5093 NULL, HFILL }
5095 { &hf_rsl_cbch_load_type,
5096 { "CBCH Load Type", "gsm_abis_rsl.cbch_load_type",
5097 FT_BOOLEAN, 8, TFS(&rsl_cbch_load_type_vals), 0x80,
5098 NULL, HFILL }
5100 { &hf_rsl_msg_slt_cnt,
5101 { "Message Slot Count", "gsm_abis_rsl.sg_slt_cnt",
5102 FT_UINT8, BASE_DEC, NULL, 0x0f,
5103 NULL, HFILL }
5105 { &hf_rsl_ch_ind,
5106 { "Channel Ind", "gsm_abis_rsl.ch_ind",
5107 FT_UINT8, BASE_DEC, VALS(rsl_ch_ind_vals), 0x0f,
5108 NULL, HFILL }
5110 { &hf_rsl_command,
5111 { "Command", "gsm_abis_rsl.cmd",
5112 FT_UINT8, BASE_DEC, NULL, 0x7f,
5113 NULL, HFILL }
5115 { &hf_rsl_command_ext,
5116 { "Command (extended)", "gsm_abis_rsl.cmd_ext",
5117 FT_UINT16, BASE_DEC, NULL, 0x7fff,
5118 NULL, HFILL }
5120 { &hf_rsl_emlpp_prio,
5121 { "eMLPP Priority", "gsm_abis_rsl.emlpp_prio",
5122 FT_UINT8, BASE_DEC, VALS(rsl_emlpp_prio_vals), 0x07,
5123 NULL, HFILL }
5125 { &hf_rsl_speech_mode_s,
5126 { "ip.access Speech Mode S", "gsm_abis_rsl.ipacc.speech_mode_s",
5127 FT_UINT8, BASE_HEX, VALS(rsl_ipacc_spm_s_vals),
5128 0xf, NULL, HFILL }
5130 { &hf_rsl_speech_mode_m,
5131 { "ip.access Speech Mode M", "gsm_abis_rsl.ipacc.speech_mode_m",
5132 FT_UINT8, BASE_HEX, VALS(rsl_ipacc_spm_m_vals),
5133 0xf0, NULL, HFILL }
5135 { &hf_rsl_conn_id,
5136 { "ip.access Connection ID", "gsm_abis_rsl.ipacc.conn_id",
5137 FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }
5139 { &hf_rsl_rtp_payload,
5140 { "ip.access RTP Payload Type", "gsm_abis_rsl.ipacc.rtp_payload",
5141 FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }
5143 { &hf_rsl_rtp_csd_fmt_d,
5144 { "ip.access RTP CSD Format D", "gsm_abis_rsl.ipacc.rtp_csd_fmt_d",
5145 FT_UINT8, BASE_HEX, VALS(rsl_ipacc_rtp_csd_fmt_d_vals),
5146 0x0f, NULL, HFILL },
5148 { &hf_rsl_rtp_csd_fmt_ir,
5149 { "ip.access RTP CSD Format IR", "gsm_abis_rsl.ipacc.rtp_csd_fmt_ir",
5150 FT_UINT8, BASE_HEX, VALS(rsl_ipacc_rtp_csd_fmt_ir_vals),
5151 0xf0, NULL, HFILL },
5153 { &hf_rsl_local_port,
5154 { "ip.access Local RTP Port", "gsm_abis_rsl.ipacc.local_port",
5155 FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL },
5157 { &hf_rsl_remote_port,
5158 { "ip.access Remote RTP Port", "gsm_abis_rsl.ipacc.remote_port",
5159 FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL },
5161 { &hf_rsl_local_ip,
5162 { "ip.access Local IP Address", "gsm_abis_rsl.ipacc.local_ip",
5163 FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL },
5165 { &hf_rsl_remote_ip,
5166 { "ip.access Remote IP Address", "gsm_abis_rsl.ipacc.remote_ip",
5167 FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL },
5169 { &hf_rsl_cstat_tx_pkts,
5170 { "Packets Sent", "gsm_abis_rsl.ipacc.cstat.tx_pkts",
5171 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5173 { &hf_rsl_cstat_tx_octs,
5174 { "Octets Sent", "gsm_abis_rsl.ipacc.cstat.tx_octets",
5175 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5177 { &hf_rsl_cstat_rx_pkts,
5178 { "Packets Received", "gsm_abis_rsl.ipacc.cstat.rx_pkts",
5179 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5181 { &hf_rsl_cstat_rx_octs,
5182 { "Octets Received", "gsm_abis_rsl.ipacc.cstat.rx_octets",
5183 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5185 { &hf_rsl_cstat_lost_pkts,
5186 { "Packets Lost", "gsm_abis_rsl.ipacc.cstat.lost_pkts",
5187 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5189 { &hf_rsl_cstat_ia_jitter,
5190 { "Inter-arrival Jitter", "gsm_abis_rsl.ipacc.cstat.ia_jitter",
5191 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5193 { &hf_rsl_cstat_avg_tx_dly,
5194 { "Average Tx Delay", "gsm_abis_rsl.ipacc.cstat.avg_tx_delay",
5195 FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
5197 /* Encapsulating paging messages into a packet EP2192796 - proprietor Huawei */
5198 { &hf_rsl_paging_spare,
5199 { "SPARE", "gsm_abis_rsl.paging_spare",
5200 FT_UINT8, BASE_DEC, NULL, 0xf0,
5201 NULL, HFILL }
5203 { &hf_rsl_paging_msg_no,
5204 { "Paging Msg Number", "gsm_abis_rsl.paging_msg_no",
5205 FT_UINT8, BASE_DEC, NULL, 0x0f,
5206 NULL, HFILL }
5208 { &hf_rsl_paging_package_ch_no,
5209 { "Channel Number Downlink CCCH (PCH + AGCH)", "gsm_abis_rsl.paging_package_ch_no",
5210 FT_UINT8, BASE_DEC, NULL, 0xe0,
5211 NULL, HFILL }
5213 { &hf_rsl_paging_package_ch_needed,
5214 { "Channel Needed", "gsm_abis_rsl.paging_package_ch_needed",
5215 FT_UINT8, BASE_DEC, VALS(rsl_paging_ch_needed_vals), 0x18,
5216 NULL, HFILL }
5218 { &hf_rsl_paging_emlpp_prio,
5219 { "eMLPP Priority", "gsm_abis_rsl.paging_emlpp_prio",
5220 FT_UINT8, BASE_DEC, VALS(rsl_paging_emlpp_prio_vals), 0x07,
5221 NULL, HFILL }
5223 { &hf_rsl_paging_type,
5224 { "Paging Type", "gsm_abis_rsl.paging_type",
5225 FT_BOOLEAN, 8, TFS(&rsl_paging_type_vals), 0x80,
5226 NULL, HFILL }
5228 { &hf_rsl_paging_group_cs,
5229 { "Paging Group", "gsm_abis_rsl.paging_group_cs",
5230 FT_UINT8, BASE_DEC, NULL, 0x7f,
5231 NULL, HFILL }
5233 { &hf_rsl_paging_group_empty_package,
5234 { "Empty package Paging Group", "gsm_abis_rsl.paging_group_empty_package",
5235 FT_UINT8, BASE_HEX, NULL, 0xff,
5236 NULL, HFILL }
5238 { &hf_rsl_paging_group_ps_spare,
5239 { "PS Paging Group SPARE", "gsm_abis_rsl.paging_group_ps_spare",
5240 FT_UINT8, BASE_DEC, NULL, 0x7f,
5241 NULL, HFILL }
5243 /* Physical Context */
5244 { &hf_rsl_phy_ctx_ie_id,
5245 { "Element identifier", "gsm_abis_rsl.phy_ctx_ie_id",
5246 FT_UINT8, BASE_HEX_DEC|BASE_EXT_STRING, &rsl_phy_con_ie_vals_ext, 0x0,
5247 NULL, HFILL }
5249 { &hf_rsl_phy_ctx_ext_rand_access,
5250 { "RandRef11bit", "gsm_abis_rsl.phy_ctx_ext_rand_access",
5251 FT_BYTES, BASE_NONE, NULL, 0x0,
5252 NULL, HFILL }
5254 { &hf_rsl_phy_ctx_ab_rx_lvl,
5255 { "AB Rx Level", "gsm_abis_rsl.phy_ctx_ab_rx_lvl",
5256 FT_UINT8, BASE_HEX_DEC, NULL, 0xff,
5257 NULL, HFILL }
5259 { &hf_rsl_phy_ctx_ab_err_bits,
5260 { "Training Err Bits", "gsm_abis_rsl.phy_ctx_ab_err_bits",
5261 FT_UINT8, BASE_HEX, NULL, 0xff,
5262 NULL, HFILL }
5264 { &hf_rsl_phy_ctx_rx_lvl_ext,
5265 { "Rx Level Ext", "gsm_abis_rsl.phy_ctx_rx_lvl_ext",
5266 FT_UINT8, BASE_HEX_DEC, NULL, 0xff,
5267 NULL, HFILL }
5269 { &hf_rsl_cb_cmd_type,
5270 { "CB Command", "gsm_abis_rsl.cb_cmd_type.command",
5271 FT_UINT8, BASE_HEX, VALS(rsl_cb_cmd_type_vals), 0xf0,
5272 NULL, HFILL }
5274 { &hf_rsl_cb_def_bcast,
5275 { "CB Default Broadcast", "gsm_abis_rsl.cb_cmd_type.def_bcast",
5276 FT_UINT8, BASE_HEX, VALS(rsl_cb_cmd_type_def_bcast_vals), 0x08,
5277 NULL, HFILL }
5279 { &hf_rsl_cb_last_block,
5280 { "CB Last Block", "gsm_abis_rsl.cb_cmd_type.last_block",
5281 FT_UINT8, BASE_HEX, VALS(rsl_cb_cmd_type_last_block_vals), 0x03,
5282 NULL, HFILL }
5284 { &hf_rsl_etws_pn,
5285 { "ETWS Primary Notification", "gsm_abis_rsl.etws_pn",
5286 FT_BYTES, BASE_NONE, NULL, 0,
5287 NULL, HFILL }
5289 { &hf_rsl_osmo_rep_acch_rxqual,
5290 { "RxQual Threshold", "gsm_abis_rsl.osmo_rep_acch.rxqual",
5291 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x70,
5292 NULL, HFILL }
5294 { &hf_rsl_osmo_rep_acch_ul_sacch,
5295 { "Uplink SACCH", "gsm_abis_rsl.osmo_rep_acch.ul_sacch",
5296 FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
5297 NULL, HFILL }
5299 { &hf_rsl_osmo_rep_acch_dl_sacch,
5300 { "Downlink SACCH", "gsm_abis_rsl.osmo_rep_acch.dl_sacch",
5301 FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
5302 NULL, HFILL }
5304 { &hf_rsl_osmo_rep_acch_dl_facch_all,
5305 { "Downlink FACCH (all LDPDm message types)",
5306 "gsm_abis_rsl.osmo_rep_acch.dl_facch_all",
5307 FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
5308 NULL, HFILL }
5310 { &hf_rsl_osmo_rep_acch_dl_facch_cmd,
5311 { "Downlink FACCH (LAPDm commands only)",
5312 "gsm_abis_rsl.osmo_rep_acch.dl_facch_cmd",
5313 FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
5314 NULL, HFILL }
5316 { &hf_rsl_osmo_top_acch_val,
5317 { "Overpower value", "gsm_abis_rsl.osmo_top_acch.val",
5318 FT_UINT8, BASE_DEC | BASE_UNIT_STRING, UNS(&units_decibels), 0x07,
5319 NULL, HFILL }
5321 { &hf_rsl_osmo_top_acch_rxqual,
5322 { "Uplink RxQual threshold", "gsm_abis_rsl.osmo_top_acch.rxqual",
5323 FT_UINT8, BASE_DEC, VALS(gsm_a_rr_rxqual_vals), 0x38,
5324 NULL, HFILL }
5326 { &hf_rsl_osmo_top_acch_facch,
5327 { "FACCH Overpower", "gsm_abis_rsl.osmo_top_acch.facch",
5328 FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x40,
5329 NULL, HFILL }
5331 { &hf_rsl_osmo_top_acch_sacch,
5332 { "SACCH Overpower", "gsm_abis_rsl.osmo_top_acch.sacch",
5333 FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
5334 NULL, HFILL }
5336 { &hf_rsl_osmo_tsc_set,
5337 { "Training Sequence Set", "gsm_abis_rsl.osmo_tsc_set",
5338 FT_UINT8, BASE_DEC, VALS(rsl_osmo_tsc_set_vals), 0,
5339 NULL, HFILL }
5341 { &hf_rsl_osmo_tsc_val,
5342 { "Training Sequence Code", "gsm_abis_rsl.osmo_tsc_val",
5343 FT_UINT8, BASE_DEC, NULL, 0,
5344 NULL, HFILL }
5346 { &hf_rsl_osmo_osmux_cid,
5347 { "Osmux CID", "gsm_abis_rsl.osmo_osmux_cid",
5348 FT_UINT8, BASE_DEC, NULL, 0,
5349 NULL, HFILL }
5351 /* Generated from convert_proto_tree_add_text.pl */
5352 { &hf_rsl_channel_description_tag, { "Channel Description Tag", "gsm_abis_rsl.channel_description_tag", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5353 { &hf_rsl_mobile_allocation_tag, { "Mobile Allocation Tag", "gsm_abis_rsl.mobile_allocation_tag", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
5354 { &hf_rsl_mobile_allocation_len, { "Mobile Allocation Length", "gsm_abis_rsl.mobile_allocation_len", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
5355 { &hf_rsl_no_resources_required, { "0 No resources required(All other values are reserved)", "gsm_abis_rsl.no_resources_required", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5356 { &hf_rsl_llsdu_ccch, { "Link Layer Service Data Unit (L3 Message)(CCCH)", "gsm_abis_rsl.llsdu.ccch", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5357 { &hf_rsl_llsdu_sacch, { "Link Layer Service Data Unit (L3 Message)(SACCH)", "gsm_abis_rsl.llsdu.sacch", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5358 { &hf_rsl_llsdu, { "Link Layer Service Data Unit (L3 Message)", "gsm_abis_rsl.llsdu", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5359 { &hf_rsl_rach_supplementary_information, { "Supplementary Information", "gsm_abis_rsl.supplementary_information", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5360 { &hf_rsl_full_immediate_assign_info_field, { "Full Immediate Assign Info field", "gsm_abis_rsl.full_immediate_assign_info_field", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5361 { &hf_rsl_layer_3_message, { "Layer 3 message", "gsm_abis_rsl.layer_3_message", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5362 { &hf_rsl_descriptive_group_or_broadcast_call_reference, { "Descriptive group or broadcast call reference", "gsm_abis_rsl.descriptive_group_or_broadcast_call_reference", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5363 { &hf_rsl_group_channel_description, { "Group Channel Description", "gsm_abis_rsl.group_channel_description", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5364 { &hf_rsl_uic, { "UIC", "gsm_abis_rsl.uic", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5365 { &hf_rsl_codec_list, { "Codec List", "gsm_abis_rsl.codec_list", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
5367 static int *ett[] = {
5368 &ett_rsl,
5369 &ett_ie_link_id,
5370 &ett_ie_act_type,
5371 &ett_ie_bs_power,
5372 &ett_ie_bs_power_params,
5373 &ett_ie_ch_id,
5374 &ett_ie_ch_mode,
5375 &ett_ie_enc_inf,
5376 &ett_ie_ch_no,
5377 &ett_ie_frame_no,
5378 &ett_ie_ho_ref,
5379 &ett_ie_l1_inf,
5380 &ett_ie_L3_inf,
5381 &ett_ie_ms_id,
5382 &ett_ie_ms_pow,
5383 &ett_ie_ms_pow_params,
5384 &ett_ie_phy_ctx,
5385 &ett_ie_paging_grp,
5386 &ett_ie_paging_load,
5387 &ett_ie_access_delay,
5388 &ett_ie_rach_load,
5389 &ett_ie_req_ref,
5390 &ett_ie_req_ref_ra,
5391 &ett_ie_rel_mode,
5392 &ett_ie_resource_inf,
5393 &ett_ie_rlm_cause,
5394 &ett_ie_staring_time,
5395 &ett_ie_timing_adv,
5396 &ett_ie_uplink_meas,
5397 &ett_ie_full_imm_ass_inf,
5398 &ett_ie_smscb_inf,
5399 &ett_ie_ms_timing_offset,
5400 &ett_ie_err_msg,
5401 &ett_ie_full_bcch_inf,
5402 &ett_ie_ch_needed,
5403 &ett_ie_cb_cmd_type,
5404 &ett_ie_smscb_mess,
5405 &ett_ie_cbch_load_inf,
5406 &ett_ie_smscb_ch_ind,
5407 &ett_ie_grp_call_ref,
5408 &ett_ie_ch_desc,
5409 &ett_ie_nch_drx,
5410 &ett_ie_cmd_ind,
5411 &ett_ie_emlpp_prio,
5412 &ett_ie_uic,
5413 &ett_ie_main_ch_ref,
5414 &ett_ie_multirate_conf,
5415 &ett_ie_multirate_cntrl,
5416 &ett_ie_sup_codec_types,
5417 &ett_ie_codec_conf,
5418 &ett_ie_rtd,
5419 &ett_ie_tfo_status,
5420 &ett_ie_llp_apdu,
5421 &ett_ie_tfo_transp_cont,
5422 &ett_ie_cause,
5423 &ett_ie_meas_res_no,
5424 &ett_ie_message_id,
5425 &ett_ie_sys_info_type,
5426 &ett_ie_speech_mode,
5427 &ett_ie_conn_id,
5428 &ett_ie_remote_ip,
5429 &ett_ie_remote_port,
5430 &ett_ie_local_port,
5431 &ett_ie_local_ip,
5432 &ett_ie_rtp_payload,
5433 &ett_ie_paging_package,
5434 &ett_ie_paging_package_number,
5435 &ett_ie_paging_package_info,
5436 &ett_ie_paging_package_ch_a_emlpp,
5437 &ett_ie_paging_group_paras,
5438 &ett_phy_ctx_ie,
5439 &ett_phy_ctx_ie_ext_rand_access,
5440 &ett_phy_ctx_ab_rx_lvl_err_bits,
5441 &ett_phy_ctx_rxlvl_ext,
5442 &ett_ie_etws_pn,
5443 &ett_ie_osmo_rep_acch_cap,
5444 &ett_ie_osmo_top_acch_cap,
5445 &ett_ie_osmo_training_seq,
5447 static ei_register_info ei[] = {
5448 /* Generated from convert_proto_tree_add_text.pl */
5449 { &ei_rsl_speech_or_data_indicator, { "gsm_abis_rsl.speech_or_data_indicator.bad", PI_PROTOCOL, PI_WARN, "Speech or data indicator != 1,2 or 3", EXPFILL }},
5450 { &ei_rsl_facility_information_element_3gpp_ts_44071, { "gsm_abis_rsl.facility_information_element_3gpp_ts_44071", PI_PROTOCOL, PI_NOTE, "Facility Information Element as defined in 3GPP TS 44.071", EXPFILL }},
5451 { &ei_rsl_embedded_message_tfo_configuration, { "gsm_abis_rsl.embedded_message_tfo_configuration", PI_PROTOCOL, PI_NOTE, "Embedded message that contains the TFO configuration", EXPFILL }},
5452 { &ei_rsl_mobile_allocation_deprecated, { "gsm_abis_rsl.mobile_allocation_deprecated", PI_PROTOCOL, PI_NOTE,
5453 "3GPP TS 24.008 Mobile Allocation IE shall for compatibility reasons "
5454 "be included but empty (see 3GPP TS 48.058, section 9.3.5)", EXPFILL }},
5457 module_t *rsl_module;
5458 expert_module_t *expert_rsl;
5460 #define RSL_ATT_TLVDEF(_attr, _type, _fixed_len) \
5461 rsl_att_tlvdef.def[_attr].type = _type; \
5462 rsl_att_tlvdef.def[_attr].fixed_len = _fixed_len; \
5464 /* We register even the standard RSL IE TVLs here, not just the
5465 * ip.access vendor specific elements. This is due to the fact that we
5466 * don't have any formal specification for the ip.access RSL dialect,
5467 * and this way any standard elements will be 'known' to the TLV
5468 * parser, which can then gracefully skip over such elements and
5469 * continue decoding the message. This will work even if the switch
5470 * statement in dissct_rsl_ipaccess_msg() doesn't contain explicit code
5471 * to decode them (yet?).
5473 RSL_ATT_TLVDEF(RSL_IE_CH_NO, TLV_TYPE_TV, 0);
5474 RSL_ATT_TLVDEF(RSL_IE_LINK_ID, TLV_TYPE_TV, 0);
5475 RSL_ATT_TLVDEF(RSL_IE_ACT_TYPE, TLV_TYPE_TV, 0);
5476 RSL_ATT_TLVDEF(RSL_IE_BS_POW, TLV_TYPE_TV, 0);
5477 RSL_ATT_TLVDEF(RSL_IE_CH_ID, TLV_TYPE_TLV, 0);
5478 RSL_ATT_TLVDEF(RSL_IE_CH_MODE, TLV_TYPE_TLV, 0);
5479 RSL_ATT_TLVDEF(RSL_IE_ENC_INF, TLV_TYPE_TLV, 0);
5480 RSL_ATT_TLVDEF(RSL_IE_FRAME_NO, TLV_TYPE_FIXED, 2);
5481 RSL_ATT_TLVDEF(RSL_IE_HO_REF, TLV_TYPE_TV, 0);
5482 RSL_ATT_TLVDEF(RSL_IE_L1_INF, TLV_TYPE_FIXED, 2);
5483 RSL_ATT_TLVDEF(RSL_IE_L3_INF, TLV_TYPE_TL16V, 0);
5484 RSL_ATT_TLVDEF(RSL_IE_MS_ID, TLV_TYPE_TLV, 0);
5485 RSL_ATT_TLVDEF(RSL_IE_MS_POW, TLV_TYPE_TV, 0);
5486 RSL_ATT_TLVDEF(RSL_IE_PAGING_GRP, TLV_TYPE_TV, 0);
5487 RSL_ATT_TLVDEF(RSL_IE_PAGING_LOAD, TLV_TYPE_FIXED, 2);
5488 RSL_ATT_TLVDEF(RSL_IE_PHY_CTX, TLV_TYPE_TLV, 0);
5489 RSL_ATT_TLVDEF(RSL_IE_ACCESS_DELAY, TLV_TYPE_TV, 0);
5490 RSL_ATT_TLVDEF(RSL_IE_RACH_LOAD, TLV_TYPE_TLV, 0);
5491 RSL_ATT_TLVDEF(RSL_IE_REQ_REF, TLV_TYPE_FIXED, 3);
5492 RSL_ATT_TLVDEF(RSL_IE_REL_MODE, TLV_TYPE_TV, 0);
5493 RSL_ATT_TLVDEF(RSL_IE_RESOURCE_INF, TLV_TYPE_TLV, 0);
5494 RSL_ATT_TLVDEF(RSL_IE_RLM_CAUSE, TLV_TYPE_TLV, 0);
5495 RSL_ATT_TLVDEF(RSL_IE_STARTING_TIME, TLV_TYPE_FIXED, 2);
5496 RSL_ATT_TLVDEF(RSL_IE_TIMING_ADV, TLV_TYPE_TV, 0);
5497 RSL_ATT_TLVDEF(RSL_IE_UPLINK_MEAS, TLV_TYPE_TLV, 0);
5498 RSL_ATT_TLVDEF(RSL_IE_CAUSE, TLV_TYPE_TLV, 0);
5499 RSL_ATT_TLVDEF(RSL_IE_MEAS_RES_NO, TLV_TYPE_TV, 0);
5500 RSL_ATT_TLVDEF(RSL_IE_MESSAGE_ID, TLV_TYPE_TV, 0);
5501 RSL_ATT_TLVDEF(RSL_IE_SYS_INFO_TYPE, TLV_TYPE_TV, 0);
5502 RSL_ATT_TLVDEF(RSL_IE_MS_POWER_PARAM, TLV_TYPE_TLV, 0);
5503 RSL_ATT_TLVDEF(RSL_IE_BS_POWER_PARAM, TLV_TYPE_TLV, 0);
5504 RSL_ATT_TLVDEF(RSL_IE_PREPROC_PARAM, TLV_TYPE_TLV, 0);
5505 RSL_ATT_TLVDEF(RSL_IE_PREPROC_MEAS, TLV_TYPE_TLV, 0);
5506 RSL_ATT_TLVDEF(RSL_IE_ERR_MSG, TLV_TYPE_TLV, 0);
5507 RSL_ATT_TLVDEF(RSL_IE_FULL_BCCH_INF, TLV_TYPE_TLV, 0);
5508 RSL_ATT_TLVDEF(RSL_IE_CH_NEEDED, TLV_TYPE_TV, 0);
5509 RSL_ATT_TLVDEF(RSL_IE_CB_CMD_TYPE, TLV_TYPE_TV, 0);
5510 RSL_ATT_TLVDEF(RSL_IE_SMSCB_MESS, TLV_TYPE_TLV, 0);
5511 RSL_ATT_TLVDEF(RSL_IE_FULL_IMM_ASS_INF, TLV_TYPE_TLV, 0);
5512 RSL_ATT_TLVDEF(RSL_IE_CBCH_LOAD_INF, TLV_TYPE_TV, 0);
5513 RSL_ATT_TLVDEF(RSL_IE_SMSCB_CH_IND, TLV_TYPE_TV, 0);
5514 RSL_ATT_TLVDEF(RSL_IE_GRP_CALL_REF, TLV_TYPE_TLV, 0);
5515 RSL_ATT_TLVDEF(RSL_IE_CH_DESC, TLV_TYPE_TLV, 0);
5516 RSL_ATT_TLVDEF(RSL_IE_NCH_DRX_INF, TLV_TYPE_TLV, 0);
5517 RSL_ATT_TLVDEF(RSL_IE_CMD_IND, TLV_TYPE_TLV, 0);
5518 RSL_ATT_TLVDEF(RSL_IE_EMLPP_PRIO, TLV_TYPE_TV, 0);
5519 RSL_ATT_TLVDEF(RSL_IE_UIC, TLV_TYPE_TLV, 0);
5520 RSL_ATT_TLVDEF(RSL_IE_MAIN_CH_REF, TLV_TYPE_TV, 0);
5521 RSL_ATT_TLVDEF(RSL_IE_MULTIRATE_CONF, TLV_TYPE_TLV, 0);
5522 RSL_ATT_TLVDEF(RSL_IE_MULTIRATE_CNTRL, TLV_TYPE_TV, 0);
5523 RSL_ATT_TLVDEF(RSL_IE_SUP_CODEC_TYPES, TLV_TYPE_TLV, 0);
5524 RSL_ATT_TLVDEF(RSL_IE_CODEC_CONF, TLV_TYPE_TLV, 0);
5525 RSL_ATT_TLVDEF(RSL_IE_RTD, TLV_TYPE_TV, 0);
5526 RSL_ATT_TLVDEF(RSL_IE_TFO_STATUS, TLV_TYPE_TV, 0);
5527 RSL_ATT_TLVDEF(RSL_IE_LLP_APDU, TLV_TYPE_TLV, 0);
5528 RSL_ATT_TLVDEF(RSL_IE_IPAC_REMOTE_IP, TLV_TYPE_FIXED, 4);
5529 RSL_ATT_TLVDEF(RSL_IE_IPAC_REMOTE_PORT, TLV_TYPE_FIXED, 2);
5530 RSL_ATT_TLVDEF(RSL_IE_IPAC_LOCAL_IP, TLV_TYPE_FIXED, 4);
5531 RSL_ATT_TLVDEF(RSL_IE_IPAC_CONN_STAT, TLV_TYPE_TLV, 0);
5532 RSL_ATT_TLVDEF(RSL_IE_IPAC_LOCAL_PORT, TLV_TYPE_FIXED, 2);
5533 RSL_ATT_TLVDEF(RSL_IE_IPAC_SPEECH_MODE, TLV_TYPE_TV, 0);
5534 RSL_ATT_TLVDEF(RSL_IE_IPAC_CONN_ID, TLV_TYPE_FIXED, 2);
5535 RSL_ATT_TLVDEF(RSL_IE_IPAC_RTP_PAYLOAD2, TLV_TYPE_TV, 0);
5536 RSL_ATT_TLVDEF(RSL_IE_IPAC_RTP_PAYLOAD, TLV_TYPE_TV, 0);
5537 RSL_ATT_TLVDEF(RSL_IE_IPAC_RTP_CSD_FMT, TLV_TYPE_TV, 0);
5538 RSL_ATT_TLVDEF(RSL_IE_OSMO_TRAINING_SEQUENCE, TLV_TYPE_TLV, 0);
5539 RSL_ATT_TLVDEF(RSL_IE_OSMO_OSMUX_CID, TLV_TYPE_TLV, 0);
5541 /* Register the protocol name and description */
5542 proto_rsl = proto_register_protocol("Radio Signalling Link (RSL)", "RSL", "gsm_abis_rsl");
5544 proto_register_field_array(proto_rsl, hf, array_length(hf));
5545 proto_register_subtree_array(ett, array_length(ett));
5546 expert_rsl = expert_register_protocol(proto_rsl);
5547 expert_register_field_array(expert_rsl, ei, array_length(ei));
5549 rsl_handle = register_dissector("gsm_abis_rsl", dissect_rsl, proto_rsl);
5551 rsl_module = prefs_register_protocol(proto_rsl, NULL);
5552 prefs_register_bool_preference(rsl_module, "use_ipaccess_rsl",
5553 "Use nanoBTS definitions",
5554 "Use ipaccess nanoBTS specific definitions for RSL",
5555 &global_rsl_use_nano_bts);
5556 prefs_register_bool_preference(rsl_module, "use_osmocom_rsl",
5557 "Use Osmocom definitions",
5558 "Use Osmocom specific definitions for RSL",
5559 &global_rsl_use_osmo_bts);
5560 prefs_register_bool_preference(rsl_module, "dissect_phy_ctx_inf",
5561 "Decode Physical Context Information field",
5562 "The Physical Context Information field is not specified "
5563 "This information should be not be analysed by BSC, but merely "
5564 "forwarded from one TRX/channel to another.",
5565 &global_rsl_dissect_phy_ctx_inf);
5568 void
5569 proto_reg_handoff_rsl(void)
5571 dissector_add_uint("lapd.gsm.sapi", LAPD_GSM_SAPI_RA_SIG_PROC, rsl_handle);
5573 gsm_cbch_handle = find_dissector_add_dependency("gsm_cbch", proto_rsl);
5574 gsm_cbs_handle = find_dissector_add_dependency("gsm_cbs", proto_rsl);
5575 gsm_a_ccch_handle = find_dissector_add_dependency("gsm_a_ccch", proto_rsl);
5576 gsm_a_dtap_handle = find_dissector_add_dependency("gsm_a_dtap", proto_rsl);
5577 gsm_a_sacch_handle = find_dissector_add_dependency("gsm_a_sacch", proto_rsl);
5581 * Editor modelines - https://www.wireshark.org/tools/modelines.html
5583 * Local variables:
5584 * c-basic-offset: 4
5585 * tab-width: 8
5586 * indent-tabs-mode: nil
5587 * End:
5589 * vi: set shiftwidth=4 tabstop=8 expandtab:
5590 * :indentSize=4:tabSize=8:noTabs=true: