MSWSP: fix dissect_mswsp_smb()
[wireshark-wip.git] / epan / dissectors / packet-gsm_a_gm.c
blob201820136b82333b740f49cb60287b1715b148c0
1 /* packet-gsm_a_gm.c
2 * Routines for GSM A Interface GPRS Mobility Management and GPRS Session Management
4 * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
5 * In association with Telos Technology Inc.
7 * Added the GPRS Mobility Management Protocol and
8 * the GPRS Session Management Protocol
9 * Copyright 2004, Rene Pilz <rene.pilz [AT] ftw.com>
10 * In association with Telecommunications Research Center
11 * Vienna (ftw.)Betriebs-GmbH within the Project Metawin.
13 * Various updates, enhancements and fixes
14 * Copyright 2009, Gerasimos Dimitriadis <dimeg [AT] intracom.gr>
15 * In association with Intracom Telecom SA
17 * Title 3GPP Other
19 * Reference [7]
20 * Mobile radio interface Layer 3 specification;
21 * Core network protocols;
22 * Stage 3
23 * (3GPP TS 24.008 version 5.9.0 Release 5)
25 * Reference [8]
26 * Mobile radio interface Layer 3 specification;
27 * Core network protocols;
28 * Stage 3
29 * (3GPP TS 24.008 version 6.7.0 Release 6)
30 * (3GPP TS 24.008 version 6.8.0 Release 6)
32 * Reference [9]
33 * Mobile radio interface Layer 3 specification;
34 * Core network protocols;
35 * Stage 3
36 * (3GPP TS 24.008 version 9.6.0 Release 9)
38 * Reference [10]
39 * Mobile radio interface Layer 3 specification;
40 * Core network protocols;
41 * Stage 3
42 * (3GPP TS 24.008 version 10.6.1 Release 10)
44 * Reference [11]
45 * Mobile radio interface Layer 3 specification;
46 * Core network protocols;
47 * Stage 3
48 * (3GPP TS 24.008 version 11.7.0 Release 11)
50 * $Id$
52 * Wireshark - Network traffic analyzer
53 * By Gerald Combs <gerald@wireshark.org>
54 * Copyright 1998 Gerald Combs
56 * This program is free software; you can redistribute it and/or
57 * modify it under the terms of the GNU General Public License
58 * as published by the Free Software Foundation; either version 2
59 * of the License, or (at your option) any later version.
61 * This program is distributed in the hope that it will be useful,
62 * but WITHOUT ANY WARRANTY; without even the implied warranty of
63 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
64 * GNU General Public License for more details.
66 * You should have received a copy of the GNU General Public License
67 * along with this program; if not, write to the Free Software
68 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
71 #include "config.h"
73 #include <string.h>
75 #include <epan/packet.h>
76 #include <epan/expert.h>
77 #include <epan/prefs.h>
78 #include <epan/tap.h>
79 #include <epan/asn1.h>
80 #include <epan/wmem/wmem.h>
82 #include "packet-bssap.h"
83 #include "packet-sccp.h"
84 #include "packet-ber.h"
85 #include "packet-q931.h"
86 #include "packet-gsm_a_common.h"
87 #include "packet-e212.h"
88 #include "packet-ppp.h"
89 #include "ipproto.h"
91 /* PROTOTYPES/FORWARDS */
93 const value_string gsm_a_dtap_msg_gmm_strings[] = {
94 { 0x01, "Attach Request" },
95 { 0x02, "Attach Accept" },
96 { 0x03, "Attach Complete" },
97 { 0x04, "Attach Reject" },
98 { 0x05, "Detach Request" },
99 { 0x06, "Detach Accept" },
100 { 0x08, "Routing Area Update Request" },
101 { 0x09, "Routing Area Update Accept" },
102 { 0x0a, "Routing Area Update Complete" },
103 { 0x0b, "Routing Area Update Reject" },
104 { 0x0c, "Service Request" },
105 { 0x0d, "Service Accept" },
106 { 0x0e, "Service Reject" },
107 { 0x10, "P-TMSI Reallocation Command" },
108 { 0x11, "P-TMSI Reallocation Complete" },
109 { 0x12, "Authentication and Ciphering Req" },
110 { 0x13, "Authentication and Ciphering Resp" },
111 { 0x14, "Authentication and Ciphering Rej" },
112 { 0x1c, "Authentication and Ciphering Failure" },
113 { 0x15, "Identity Request" },
114 { 0x16, "Identity Response" },
115 { 0x20, "GMM Status" },
116 { 0x21, "GMM Information" },
117 { 0, NULL }
120 const value_string gsm_a_dtap_msg_sm_strings[] = {
121 { 0x41, "Activate PDP Context Request" },
122 { 0x42, "Activate PDP Context Accept" },
123 { 0x43, "Activate PDP Context Reject" },
124 { 0x44, "Request PDP Context Activation" },
125 { 0x45, "Request PDP Context Activation rej." },
126 { 0x46, "Deactivate PDP Context Request" },
127 { 0x47, "Deactivate PDP Context Accept" },
128 { 0x48, "Modify PDP Context Request(Network to MS direction)" },
129 { 0x49, "Modify PDP Context Accept (MS to network direction)" },
130 { 0x4a, "Modify PDP Context Request(MS to network direction)" },
131 { 0x4b, "Modify PDP Context Accept (Network to MS direction)" },
132 { 0x4c, "Modify PDP Context Reject" },
133 { 0x4d, "Activate Secondary PDP Context Request" },
134 { 0x4e, "Activate Secondary PDP Context Accept" },
135 { 0x4f, "Activate Secondary PDP Context Reject" },
136 { 0x50, "Reserved: was allocated in earlier phases of the protocol" },
137 { 0x51, "Reserved: was allocated in earlier phases of the protocol" },
138 { 0x52, "Reserved: was allocated in earlier phases of the protocol" },
139 { 0x53, "Reserved: was allocated in earlier phases of the protocol" },
140 { 0x54, "Reserved: was allocated in earlier phases of the protocol" },
141 { 0x55, "SM Status" },
142 { 0x56, "Activate MBMS Context Request" },
143 { 0x57, "Activate MBMS Context Accept" },
144 { 0x58, "Activate MBMS Context Reject" },
145 { 0x59, "Request MBMS Context Activation" },
146 { 0x5a, "Request MBMS Context Activation Reject" },
147 { 0x5b, "Request Secondary PDP Context Activation" },
148 { 0x5c, "Request Secondary PDP Context Activation Reject" },
149 { 0x5d, "Notification" },
150 { 0, NULL }
153 static const value_string gsm_gm_elem_strings[] = {
154 /* GPRS Mobility Management Information Elements 10.5.5 */
155 { DE_ADD_UPD_TYPE, "Additional Update Type" },
156 { DE_ATTACH_RES, "Attach Result" },
157 { DE_ATTACH_TYPE, "Attach Type" },
158 { DE_CIPH_ALG, "Cipher Algorithm" },
159 { DE_TMSI_STAT, "TMSI Status" },
160 { DE_DETACH_TYPE, "Detach Type" },
161 { DE_DRX_PARAM, "DRX Parameter" },
162 { DE_FORCE_TO_STAND, "Force to Standby" },
163 { DE_FORCE_TO_STAND_H, "Force to Standby" },
164 { DE_P_TMSI_SIG, "P-TMSI Signature" },
165 { DE_P_TMSI_SIG_2, "P-TMSI Signature 2" },
166 { DE_ID_TYPE_2, "Identity Type 2" },
167 { DE_IMEISV_REQ, "IMEISV Request" },
168 { DE_REC_N_PDU_NUM_LIST, "Receive N-PDU Numbers List" },
169 { DE_MS_NET_CAP, "MS Network Capability" },
170 { DE_MS_RAD_ACC_CAP, "MS Radio Access Capability" },
171 { DE_GMM_CAUSE, "GMM Cause" },
172 { DE_RAI, "Routing Area Identification" },
173 { DE_RAI_2, "Routing Area Identification 2" },
174 { DE_UPD_RES, "Update Result" },
175 { DE_UPD_TYPE, "Update Type" },
176 { DE_AC_REF_NUM, "A&C Reference Number" },
177 { DE_AC_REF_NUM_H, "A&C Reference Number" },
178 { DE_SRVC_TYPE, "Service Type" },
179 { DE_CELL_NOT, "Cell Notification" },
180 { DE_PS_LCS_CAP, "PS LCS Capability" },
181 { DE_NET_FEAT_SUP, "Network Feature Support" },
182 { DE_ADD_NET_FEAT_SUP, "Additional Network Feature Support" },
183 { DE_RAT_INFO_CONTAINER, "Inter RAT information container" },
184 { DE_REQ_MS_INFO, "Requested MS information" },
185 { DE_UE_NETWORK_CAP, "UE network capability" },
186 { DE_EUTRAN_IRAT_INFO_CONTAINER, "E-UTRAN inter RAT information container" },
187 { DE_VOICE_DOMAIN_PREF, "Voice domain preference and UE's usage setting" },
188 { DE_PTMSI_TYPE, "P-TMSI type" },
189 { DE_LAI_2, "Location Area Identification 2" },
190 { DE_NET_RES_ID_CONT, "Network resource identifier container" },
191 /* Session Management Information Elements 10.5.6 */
192 { DE_ACC_POINT_NAME, "Access Point Name" },
193 { DE_NET_SAPI, "Network Service Access Point Identifier" },
194 { DE_PRO_CONF_OPT, "Protocol Configuration Options" },
195 { DE_PD_PRO_ADDR, "Packet Data Protocol Address" },
196 { DE_QOS, "Quality Of Service" },
197 { DE_SM_CAUSE, "SM Cause" },
198 { DE_SM_CAUSE_2, "SM Cause 2" },
199 { DE_LINKED_TI, "Linked TI" },
200 { DE_LLC_SAPI, "LLC Service Access Point Identifier" },
201 { DE_TEAR_DOWN_IND, "Tear Down Indicator" },
202 { DE_PACKET_FLOW_ID, "Packet Flow Identifier" },
203 { DE_TRAFFIC_FLOW_TEMPLATE, "Traffic Flow Template" },
204 { DE_TMGI, "Temporary Mobile Group Identity (TMGI)" },
205 { DE_MBMS_BEARER_CAP, "MBMS bearer capabilities" },
206 { DE_MBMS_PROT_CONF_OPT, "MBMS protocol configuration options" },
207 { DE_ENH_NSAPI, "Enhanced network service access point identifier" },
208 { DE_REQ_TYPE, "Request type" },
209 { DE_SM_NOTIF_IND, "Notification indicator" },
210 { DE_SM_CONNECTIVITY_TYPE, "Connectivity type" },
211 /* GPRS Common Information Elements 10.5.7 */
212 { DE_PDP_CONTEXT_STAT, "PDP Context Status" },
213 { DE_RAD_PRIO, "Radio Priority" },
214 { DE_GPRS_TIMER, "GPRS Timer" },
215 { DE_GPRS_TIMER_2, "GPRS Timer 2" },
216 { DE_GPRS_TIMER_3, "GPRS Timer 3" },
217 { DE_RAD_PRIO_2, "Radio Priority 2"},
218 { DE_MBMS_CTX_STATUS, "MBMS context status"},
219 { DE_UPLINK_DATA_STATUS, "Uplink data status"},
220 { DE_DEVICE_PROPERTIES, "Device properties"},
221 { 0, NULL }
223 value_string_ext gsm_gm_elem_strings_ext = VALUE_STRING_EXT_INIT(gsm_gm_elem_strings);
225 #define DTAP_GMM_IEI_MASK 0xff
226 #define DTAP_SM_IEI_MASK 0xff
228 /* Initialize the protocol and registered fields */
229 static int proto_a_gm = -1;
231 static int hf_gsm_a_dtap_msg_gmm_type = -1;
232 static int hf_gsm_a_dtap_msg_sm_type = -1;
233 int hf_gsm_a_gm_elem_id = -1;
234 static int hf_gsm_a_sm_qos_delay_cls = -1;
235 static int hf_gsm_a_sm_qos_reliability_cls = -1;
236 static int hf_gsm_a_sm_qos_traffic_cls = -1;
237 static int hf_gsm_a_sm_qos_del_order = -1;
238 static int hf_gsm_a_sm_qos_del_of_err_sdu = -1;
239 static int hf_gsm_a_sm_qos_ber = -1;
240 static int hf_gsm_a_sm_qos_sdu_err_rat = -1;
241 static int hf_gsm_a_sm_qos_traff_hdl_pri = -1;
243 static int hf_gsm_a_gmm_split_pg_cycle_code = -1;
244 static int hf_gsm_a_gmm_split_on_ccch = -1;
245 static int hf_gsm_a_gmm_non_drx_timer = -1;
246 static int hf_gsm_a_gmm_cn_spec_drx_cycle_len_coef = -1;
248 static int hf_gsm_a_gmm_ptmsi_sig =-1;
249 static int hf_gsm_a_gmm_ptmsi_sig2 =-1;
251 static int hf_gsm_a_sm_tft_op_code = -1;
252 static int hf_gsm_a_sm_tft_e_bit = -1;
253 static int hf_gsm_a_sm_tft_pkt_flt = -1;
254 static int hf_gsm_a_sm_tft_pkt_flt_id = -1;
255 static int hf_gsm_a_sm_tft_pkt_flt_dir = -1;
256 static int hf_gsm_a_sm_ip4_address = -1;
257 static int hf_gsm_a_sm_ip4_mask = -1;
258 static int hf_gsm_a_sm_ip6_address = -1;
259 static int hf_gsm_a_sm_ip6_mask = -1;
260 static int hf_gsm_a_sm_ip6_prefix_length = -1;
261 static int hf_gsm_a_sm_tft_protocol_header = -1;
262 static int hf_gsm_a_sm_tft_port = -1;
263 static int hf_gsm_a_sm_tft_port_low = -1;
264 static int hf_gsm_a_sm_tft_port_high = -1;
265 static int hf_gsm_a_sm_tft_security = -1;
266 static int hf_gsm_a_sm_tft_traffic_class = -1;
267 static int hf_gsm_a_sm_tft_traffic_mask = -1;
268 static int hf_gsm_a_sm_tft_flow_label_type = -1;
269 static int hf_gsm_a_sm_tft_param_id = -1;
270 static int hf_gsm_a_gm_acc_tech_type = -1;
271 static int hf_gsm_a_gm_acc_cap_struct_len = -1;
272 static int hf_gsm_a_gm_sms_value = -1;
273 static int hf_gsm_a_gm_sm_value = -1;
274 static int hf_gsm_a_gm_link_dir = -1;
275 static int hf_gsm_a_gm_cause = -1;
277 static int hf_gsm_a_gm_add_upd_type = -1;
278 static int hf_gsm_a_gm_fop = -1;
279 static int hf_gsm_a_gm_res_of_attach = -1;
280 static int hf_gsm_a_gm_type_of_ciph_alg = -1;
281 static int hf_gsm_a_gm_imeisv_req = -1;
282 static int hf_gsm_a_gm_ac_ref_nr = -1;
283 static int hf_gsm_a_gm_force_to_standby = -1;
284 static int hf_gsm_a_gm_serv_type = -1;
285 static int hf_gsm_a_gm_for = -1;
286 static int hf_gsm_a_gm_type_of_attach = -1;
287 static int hf_gsm_a_gm_tmsi_flag = -1;
288 static int hf_gsm_a_gm_power_off = -1;
289 static int hf_gsm_a_gm_type_of_detach_mo = -1;
290 static int hf_gsm_a_gm_type_of_detach_mt = -1;
291 static int hf_gsm_a_gm_update_type = -1;
292 static int hf_gsm_a_gm_gprs_timer_unit = -1;
293 static int hf_gsm_a_gm_gprs_timer_value = -1;
294 static int hf_gsm_a_gm_gprs_timer2_unit = -1;
295 static int hf_gsm_a_gm_gprs_timer2_value = -1;
296 static int hf_gsm_a_gm_gprs_timer3_unit = -1;
297 static int hf_gsm_a_gm_gprs_timer3_value = -1;
298 static int hf_gsm_a_gm_nsapi_5_ul_stat = -1;
299 static int hf_gsm_a_gm_nsapi_6_ul_stat = -1;
300 static int hf_gsm_a_gm_nsapi_7_ul_stat = -1;
301 static int hf_gsm_a_gm_nsapi_8_ul_stat = -1;
302 static int hf_gsm_a_gm_nsapi_9_ul_stat = -1;
303 static int hf_gsm_a_gm_nsapi_10_ul_stat = -1;
304 static int hf_gsm_a_gm_nsapi_11_ul_stat = -1;
305 static int hf_gsm_a_gm_nsapi_12_ul_stat = -1;
306 static int hf_gsm_a_gm_nsapi_13_ul_stat = -1;
307 static int hf_gsm_a_gm_nsapi_14_ul_stat = -1;
308 static int hf_gsm_a_gm_nsapi_15_ul_stat = -1;
309 static int hf_gsm_a_gm_device_prop_low_prio = -1;
310 static int hf_gsm_a_gm_apn = -1;
311 static int hf_gsm_a_gm_pco_pid = -1;
312 static int hf_gsm_a_gm_pco_app_spec_info = -1;
313 static int hf_gsm_a_gm_type_of_identity = -1;
314 int hf_gsm_a_gm_rac = -1;
315 static int hf_gsm_a_gm_apc = -1;
316 static int hf_gsm_a_gm_otd_a = -1;
317 static int hf_gsm_a_gm_otd_b = -1;
318 static int hf_gsm_a_gm_gps_a = -1;
319 static int hf_gsm_a_gm_gps_b = -1;
320 static int hf_gsm_a_gm_gps_c = -1;
321 static int hf_gsm_a_gm_lcs_molr = -1;
322 static int hf_gsm_a_gm_mbms = -1;
323 static int hf_gsm_a_gm_ims_vops = -1;
324 static int hf_gsm_a_gm_emc_bs = -1;
325 static int hf_gsm_a_gm_gprs_sms = -1;
326 static int hf_gsm_a_gm_req_ms_info_irat = -1;
327 static int hf_gsm_a_gm_req_ms_info_irat2 = -1;
328 static int hf_gsm_a_gm_ue_usage_setting = -1;
329 static int hf_gsm_a_gm_voice_domain_pref_for_eutran = -1;
330 static int hf_gsm_a_gm_ptmsi_type = -1;
331 static int hf_gsm_a_gm_nri_cont = -1;
332 static int hf_gsm_a_sm_pdp_type_org = -1;
333 static int hf_gsm_a_sm_qos_mean_thr = -1;
334 static int hf_gsm_a_sm_qos_peak_thr = -1;
335 static int hf_gsm_a_sm_qos_prec_class = -1;
336 static int hf_gsm_a_sm_qos_trans_delay = -1;
337 static int hf_gsm_a_sm_qos_signalling_ind = -1;
338 static int hf_gsm_a_sm_qos_source_stat_desc = -1;
339 static int hf_gsm_a_sm_qos_max_bitrate_upl = -1;
340 static int hf_gsm_a_sm_qos_max_bitrate_downl = -1;
341 static int hf_gsm_a_sm_qos_guar_bitrate_upl = -1;
342 static int hf_gsm_a_sm_qos_guar_bitrate_downl = -1;
343 static int hf_gsm_a_sm_qos_max_bitrate_upl_ext = -1;
344 static int hf_gsm_a_sm_qos_max_bitrate_downl_ext = -1;
345 static int hf_gsm_a_sm_qos_guar_bitrate_upl_ext = -1;
346 static int hf_gsm_a_sm_qos_guar_bitrate_downl_ext = -1;
347 static int hf_gsm_a_sm_qos_max_bitrate_upl_ext2 = -1;
348 static int hf_gsm_a_sm_qos_max_bitrate_downl_ext2 = -1;
349 static int hf_gsm_a_sm_qos_guar_bitrate_upl_ext2 = -1;
350 static int hf_gsm_a_sm_qos_guar_bitrate_downl_ext2 = -1;
351 static int hf_gsm_a_sm_cause = -1;
352 static int hf_gsm_a_sm_cause_2 = -1;
353 static int hf_gsm_a_sm_llc_sapi = -1;
354 static int hf_gsm_a_sm_tdi = -1;
355 static int hf_gsm_a_sm_packet_flow_id = -1;
356 static int hf_gsm_a_sm_tmgi = -1;
357 static int hf_gsm_a_sm_enh_nsapi = -1;
358 static int hf_gsm_a_sm_req_type = -1;
359 static int hf_gsm_a_sm_notif_ind = -1;
360 static int hf_gsm_a_sm_connectivity_type = -1;
361 static int hf_gsm_a_gm_rac_ctrled_early_cm_sending = -1;
362 static int hf_gsm_a_gm_rac_pseudo_sync = -1;
363 static int hf_gsm_a_gm_rac_vgcs = -1;
364 static int hf_gsm_a_gm_rac_vbs = -1;
365 static int hf_gsm_a_gm_rac_multislot_capability = -1;
366 static int hf_gsm_a_gm_rac_hscsd_multi_slot_class = -1;
367 static int hf_gsm_a_gm_rac_gprs_multi_slot_class = -1;
368 static int hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap = -1;
369 static int hf_gsm_a_gm_rac_ecsd_multi_slot_class = -1;
370 static int hf_gsm_a_gm_rac_egprs_multi_slot_class = -1;
371 static int hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap = -1;
372 static int hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class = -1;
373 static int hf_gsm_a_gm_rac_single_slt_dtm = -1;
374 static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres = -1;
375 static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class = -1;
376 static int hf_gsm_a_gm_rac_8psk_pow_cap_pres = -1;
377 static int hf_gsm_a_gm_rac_comp_int_meas_cap = -1;
378 static int hf_gsm_a_gm_rel_lev_ind = -1;
379 static int hf_gsm_a_gm_rac_geran_feat_pkg = -1;
380 static int hf_gsm_a_gm_rac_umts_fdd_cap = -1;
381 static int hf_gsm_a_gm_rac_umts_384_tdd_ra_cap = -1;
382 static int hf_gsm_a_gm_rac_cdma2000_cap = -1;
383 static int hf_gsm_a_gm_rac_umts_128_tdd_ra_cap = -1;
384 static int hf_gsm_a_gm_rac_mod_based_multi_slot_class_support = -1;
385 static int hf_gsm_a_gm_rac_geran_iu_mode_cap = -1;
386 static int hf_gsm_a_gm_rac_flo_iu_cap = -1;
387 static int hf_gsm_a_gm_rac_mult_tbf_cap = -1;
388 static int hf_gsm_a_gm_rac_down_adv_rec_perf = -1;
389 static int hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap = -1;
390 static int hf_gsm_a_gm_rac_dtm_enh_cap = -1;
391 static int hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class = -1;
392 static int hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class = -1;
393 static int hf_gsm_a_gm_rac_ps_ho_cap = -1;
394 static int hf_gsm_a_gm_rac_dtm_ho_cap = -1;
395 static int hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier = -1;
396 static int hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap = -1;
397 static int hf_gsm_a_gm_rac_flex_ts_assign = -1;
398 static int hf_gsm_a_gm_rac_gan_ps_ho_cap = -1;
399 static int hf_gsm_a_gm_rac_rlc_non_pers_mode = -1;
400 static int hf_gsm_a_gm_rac_reduced_lat_cap = -1;
401 static int hf_gsm_a_gm_rac_ul_egprs2 = -1;
402 static int hf_gsm_a_gm_rac_dl_egprs2 = -1;
403 static int hf_gsm_a_gm_rac_eutra_fdd_support = -1;
404 static int hf_gsm_a_gm_rac_eutra_tdd_support = -1;
405 static int hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm = -1;
406 static int hf_gsm_a_gm_rac_prio_based_resel_support = -1;
407 static int hf_gsm_a_gm_rac_alt_efta_multi_slot_class = -1;
408 static int hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier = -1;
409 static int hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um = -1;
410 static int hf_gsm_a_gm_rac_emst_cap = -1;
411 static int hf_gsm_a_gm_rac_mtti_cap = -1;
412 static int hf_gsm_a_gm_rac_utra_csg_cell_report = -1;
413 static int hf_gsm_a_gm_rac_eutra_csg_cell_report = -1;
414 static int hf_gsm_a_gm_rac_dtr_cap = -1;
415 static int hf_gsm_a_gm_rac_emsr_cap = -1;
416 static int hf_gsm_a_gm_rac_fast_down_freq_switch_cap = -1;
417 static int hf_gsm_a_gm_rac_tighter_cap = -1;
418 static int hf_gsm_a_gm_rac_fanr_cap = -1;
419 static int hf_gsm_a_gm_rac_ipa_cap = -1;
420 static int hf_gsm_a_gm_rac_geran_nw_sharing_support = -1;
421 static int hf_gsm_a_sm_ti_flag = -1;
422 static int hf_gsm_a_sm_ext = -1;
424 static int hf_gsm_a_gmm_net_cap_gea1 = -1;
425 static int hf_gsm_a_gmm_net_cap_smdch = -1;
426 static int hf_gsm_a_gmm_net_cap_smgprs = -1;
427 static int hf_gsm_a_gmm_net_cap_ucs2 = -1;
428 static int hf_gsm_a_gmm_net_cap_ss_scr_ind = -1;
429 static int hf_gsm_a_gmm_net_cap_solsa = -1;
430 static int hf_gsm_a_gmm_net_cap_rev = -1;
431 static int hf_gsm_a_gmm_net_cap_pfc = -1;
432 static int hf_gsm_a_gmm_net_cap_ext_gea_bits = -1;
433 static int hf_gsm_a_gmm_net_cap_gea2 = -1;
434 static int hf_gsm_a_gmm_net_cap_gea3 = -1;
435 static int hf_gsm_a_gmm_net_cap_gea4 = -1;
436 static int hf_gsm_a_gmm_net_cap_gea5 = -1;
437 static int hf_gsm_a_gmm_net_cap_gea6 = -1;
438 static int hf_gsm_a_gmm_net_cap_gea7 = -1;
439 static int hf_gsm_a_gmm_net_cap_lcs = -1;
440 static int hf_gsm_a_gmm_net_cap_ps_irat_iu = -1;
441 static int hf_gsm_a_gmm_net_cap_ps_irat_s1 = -1;
442 static int hf_gsm_a_gmm_net_cap_comb_proc = -1;
443 static int hf_gsm_a_gmm_net_cap_isr = -1;
444 static int hf_gsm_a_gmm_net_cap_srvcc_to_geran = -1;
445 static int hf_gsm_a_gmm_net_cap_epc = -1;
446 static int hf_gsm_a_gmm_net_cap_nf = -1;
447 static int hf_gsm_a_gmm_net_geran_net_sharing = -1;
449 /* Initialize the subtree pointers */
450 static gint ett_gmm_radio_cap = -1;
451 static gint ett_gmm_network_cap = -1;
452 static gint ett_gsm_a_gm_msrac_multislot_capability = -1;
453 static gint ett_gmm_rai = -1;
454 static gint ett_gmm_gprs_timer = -1;
456 static gint ett_sm_tft = -1;
457 static gint ett_sm_pco = -1;
459 static expert_field ei_gsm_a_gm_extraneous_data = EI_INIT;
461 static dissector_handle_t data_handle;
462 static dissector_handle_t rrc_irat_ho_info_handle;
463 static dissector_handle_t lte_rrc_ue_eutra_cap_handle;
465 static dissector_table_t gprs_sm_pco_subdissector_table; /* GPRS SM PCO PPP Protocols */
467 #define NUM_GSM_GM_ELEM (sizeof(gsm_gm_elem_strings)/sizeof(value_string))
468 gint ett_gsm_gm_elem[NUM_GSM_GM_ELEM];
470 static const gchar *pdp_str[2]={ "PDP-INACTIVE", "PDP-ACTIVE" };
473 * [9] 10.5.5.0 Additional Update Type
475 static const true_false_string gsm_a_gm_add_upd_type_value = {
476 "SMS only",
477 "No additional information (shall be interpreted as request for combined attach or combined tracking area updating)"
479 static guint16
480 de_gmm_add_upd_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
482 guint32 curr_offset, bit_offset;
484 curr_offset = offset;
485 bit_offset = (curr_offset<<3)+4;
487 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
488 bit_offset += 3;
489 proto_tree_add_bits_item(tree, hf_gsm_a_gm_add_upd_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
490 curr_offset++;
492 return (curr_offset - offset);
496 * [9] 10.5.5.1 Attach result
498 static const value_string gsm_a_gm_res_of_attach_vals[] = {
499 { 0x01, "GPRS only attached" },
500 { 0x03, "Combined GPRS/IMSI attached" },
501 { 0, NULL }
504 static guint16
505 de_gmm_attach_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
507 proto_tree_add_item(tree, hf_gsm_a_gm_fop, tvb, offset, 1, ENC_BIG_ENDIAN);
508 proto_tree_add_item(tree, hf_gsm_a_gm_res_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
510 /* no length check possible */
511 return (1);
515 * [9] 10.5.5.2 Attach type
517 static const value_string gsm_a_gm_type_of_attach_vals[] = {
518 { 0x01, "GPRS attach" },
519 { 0x02, "Not used (In earlier versions: GPRS attach while IMSI attached)" },
520 { 0x03, "Combined GPRS/IMSI attached" },
521 { 0, NULL }
524 static guint16
525 de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
527 proto_tree_add_item(tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
528 proto_tree_add_item(tree, hf_gsm_a_gm_type_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
530 /* no length check possible */
531 return (1);
535 * [9] 10.5.5.3 Ciphering algorithm
537 const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
538 { 0x00, "ciphering not used" },
539 { 0x01, "GPRS Encryption Algorithm GEA/1" },
540 { 0x02, "GPRS Encryption Algorithm GEA/2" },
541 { 0x03, "GPRS Encryption Algorithm GEA/3" },
542 { 0x04, "GPRS Encryption Algorithm GEA/4" },
543 { 0x05, "GPRS Encryption Algorithm GEA/5" },
544 { 0x06, "GPRS Encryption Algorithm GEA/6" },
545 { 0x07, "GPRS Encryption Algorithm GEA/7" },
546 { 0, NULL }
549 static guint16
550 de_gmm_ciph_alg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
552 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
553 proto_tree_add_item(tree, hf_gsm_a_gm_type_of_ciph_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
555 /* no length check possible */
556 return (1);
560 * [9] 10.5.5.4 TMSI status
562 const true_false_string gsm_a_gm_tmsi_flag_value = {
563 "valid TMSI available",
564 "no valid TMSI available"
567 static guint16
568 de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
570 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
571 proto_tree_add_item(tree, hf_gsm_a_gm_tmsi_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
573 /* no length check possible */
574 return (1);
578 * [7] 10.5.5.5
580 const true_false_string gsm_a_gm_power_off_value = {
581 "power switched off",
582 "normal detach"
585 const value_string gsm_a_gm_type_of_detach_mo_vals[] = {
586 { 0x01, "GPRS detach" },
587 { 0x02, "IMSI detach" },
588 { 0x03, "Combined GPRS/IMSI detach" },
589 { 0, NULL }
592 const value_string gsm_a_gm_type_of_detach_mt_vals[] = {
593 { 0x01, "re-attach required" },
594 { 0x02, "re-attach not required" },
595 { 0x03, "IMSI detach (after VLR failure)" },
596 { 0, NULL }
599 static guint16
600 de_gmm_detach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
602 guint32 curr_offset;
604 curr_offset = offset;
606 if (pinfo->p2p_dir == P2P_DIR_RECV) {
607 proto_tree_add_item(tree, hf_gsm_a_gm_power_off, tvb, offset, 1, ENC_BIG_ENDIAN);
608 proto_tree_add_item(tree, hf_gsm_a_gm_type_of_detach_mo, tvb, offset, 1, ENC_BIG_ENDIAN);
609 } else {
610 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
611 proto_tree_add_item(tree, hf_gsm_a_gm_type_of_detach_mt, tvb, offset, 1, ENC_BIG_ENDIAN);
614 curr_offset++;
616 /* no length check possible */
618 return (curr_offset - offset);
622 * [7] 10.5.5.6
625 /* SPLIT PG CYCLE CODE, octet 2 */
626 static const value_string gsm_a_gmm_split_pg_cycle_code_strings[] = {
627 { 0, "704 (equivalent to no DRX)" },
628 { 1, "1" },
629 { 2, "2" },
630 { 3, "3" },
631 { 4, "4" },
632 { 5, "5" },
633 { 6, "6" },
634 { 7, "7" },
635 { 8, "8" },
636 { 9, "9" },
637 { 10, "10" },
638 { 11, "11" },
639 { 12, "12" },
640 { 13, "13" },
641 { 14, "14" },
642 { 15, "15" },
643 { 16, "16" },
644 { 17, "17" },
645 { 18, "18" },
646 { 19, "19" },
647 { 20, "20" },
648 { 21, "21" },
649 { 22, "22" },
650 { 23, "23" },
651 { 24, "24" },
652 { 25, "25" },
653 { 26, "26" },
654 { 27, "27" },
655 { 28, "28" },
656 { 29, "29" },
657 { 30, "30" },
658 { 31, "31" },
659 { 32, "32" },
660 { 33, "33" },
661 { 34, "34" },
662 { 35, "35" },
663 { 36, "36" },
664 { 37, "37" },
665 { 38, "38" },
666 { 39, "39" },
667 { 40, "40" },
668 { 41, "41" },
669 { 42, "42" },
670 { 43, "43" },
671 { 44, "44" },
672 { 45, "45" },
673 { 46, "46" },
674 { 47, "47" },
675 { 48, "48" },
676 { 49, "49" },
677 { 50, "50" },
678 { 51, "51" },
679 { 52, "52" },
680 { 53, "53" },
681 { 54, "54" },
682 { 55, "55" },
683 { 56, "56" },
684 { 57, "57" },
685 { 58, "58" },
686 { 59, "59" },
687 { 60, "60" },
688 { 61, "61" },
689 { 62, "62" },
690 { 63, "63" },
691 { 64, "64" },
692 { 65, "71" },
693 { 66, "72" },
694 { 67, "74" },
695 { 68, "75" },
696 { 69, "77" },
697 { 70, "79" },
698 { 71, "80" },
699 { 72, "83" },
700 { 73, "86" },
701 { 74, "88" },
702 { 75, "90" },
703 { 76, "92" },
704 { 77, "96" },
705 { 78, "101" },
706 { 79, "103" },
707 { 80, "107" },
708 { 81, "112" },
709 { 82, "116" },
710 { 83, "118" },
711 { 84, "128" },
712 { 85, "141" },
713 { 86, "144" },
714 { 87, "150" },
715 { 88, "160" },
716 { 89, "171" },
717 { 90, "176" },
718 { 91, "192" },
719 { 92, "214" },
720 { 93, "224" },
721 { 94, "235" },
722 { 95, "256" },
723 { 96, "288" },
724 { 97, "320" },
725 { 98, "352" },
726 { 0, NULL }
728 static value_string_ext gsm_a_gmm_split_pg_cycle_code_strings_ext = VALUE_STRING_EXT_INIT(gsm_a_gmm_split_pg_cycle_code_strings);
730 /* SPLIT on CCCH, octet 3 (bit 4)
731 * 0 Split pg cycle on CCCH is not supported by the mobile station
732 * 1 Split pg cycle on CCCH is supported by the mobile station
734 static const true_false_string gsm_a_gmm_split_on_ccch_value = {
735 "Split pg cycle on CCCH is supported by the mobile station",
736 "Split pg cycle on CCCH is not supported by the mobile station"
739 /* non-DRX timer, octet 3
740 * bit
741 * 3 2 1
743 static const value_string gsm_a_gmm_non_drx_timer_strings[] = {
744 { 0x00, "no non-DRX mode after transfer state" },
745 { 0x01, "max. 1 sec non-DRX mode after transfer state" },
746 { 0x02, "max. 2 sec non-DRX mode after transfer state" },
747 { 0x03, "max. 4 sec non-DRX mode after transfer state" },
748 { 0x04, "max. 8 sec non-DRX mode after transfer state" },
749 { 0x05, "max. 16 sec non-DRX mode after transfer state" },
750 { 0x06, "max. 32 sec non-DRX mode after transfer state" },
751 { 0x07, "max. 64 sec non-DRX mode after transfer state" },
752 { 0, NULL },
755 * CN Specific DRX cycle length coefficient, octet 3
756 * bit
757 * 8 7 6 5 Iu and S1 mode specific
758 * 0 0 0 0 For Iu mode, CN Specific DRX cycle length coefficient not specified by the MS, ie. the
759 * system information value 'CN domain specific DRX cycle length' is used.
760 * For S1 mode, DRX value not specified by the MS.
761 * (Ref 3GPP TS 25.331 and 36.304)
762 * 0 1 1 0 CN Specific DRX cycle length coefficient 6 and T = 32
763 * 0 1 1 1 CN Specific DRX cycle length coefficient 7 and T = 64
764 * 1 0 0 0 CN Specific DRX cycle length coefficient 8 and T = 128
765 * 1 0 0 1 CN Specific DRX cycle length coefficient 9 and T = 256
766 * All other values shall be interpreted as "CN Specific DRX cycle length coefficient not
767 * specified by the MS" and "DRX value not specified by the MS" by this version of the protocol.
768 * NOTE: For Iu mode and S1 mode, this field (octet 3 bits 8 to 5) is used, but was spare in earlier
769 * versions of this protocol.
771 static const range_string gsm_a_gmm_cn_spec_drx_cycle_len_coef_strings[] = {
772 { 0x00, 0x05, "CN Specific DRX cycle length coefficient / value not specified by the MS" },
773 { 0x06, 0x06, "CN Specific DRX cycle length coefficient 6 and T = 32" },
774 { 0x07, 0x07, "CN Specific DRX cycle length coefficient 7 and T = 64" },
775 { 0x08, 0x08, "CN Specific DRX cycle length coefficient 8 and T = 128" },
776 { 0x09, 0x09, "CN Specific DRX cycle length coefficient 9 and T = 256" },
777 { 0x0a, 0x0f, "CN Specific DRX cycle length coefficient / value not specified by the MS" },
778 { 0, 0, NULL },
780 guint16
781 de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
783 guint32 curr_offset;
785 curr_offset = offset;
787 proto_tree_add_item(tree, hf_gsm_a_gmm_split_pg_cycle_code, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
788 curr_offset++;
789 proto_tree_add_item(tree, hf_gsm_a_gmm_cn_spec_drx_cycle_len_coef, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
790 proto_tree_add_item(tree, hf_gsm_a_gmm_split_on_ccch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
791 proto_tree_add_item(tree, hf_gsm_a_gmm_non_drx_timer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
793 curr_offset++;
795 /* no length check possible */
797 return (curr_offset - offset);
801 * [9] 10.5.5.7 Force to standby (lower nibble)
803 static const range_string gsm_a_gm_force_to_standby_vals[] = {
804 { 0x00, 0x00, "Force to standby not indicated" },
805 { 0x01, 0x01, "Force to standby indicated" },
806 { 0x02, 0x07, "Unknown, interpreted as Force to standby not indicated" },
807 { 0, 0, NULL }
810 static guint16
811 de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
813 guint32 bit_offset;
815 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
816 bit_offset = (offset << 3) + 4;
817 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
818 proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
820 /* no length check possible */
821 return (1);
825 * [9] 10.5.5.7 Force to standby (higher nibble)
827 static guint16
828 de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
830 guint32 bit_offset;
832 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
833 bit_offset = offset << 3;
834 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
835 proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
837 /* no length check possible */
838 return (1);
842 * [7] 10.5.5.8
844 static guint16
845 de_gmm_ptmsi_sig(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
847 guint32 curr_offset;
848 proto_item *curr_item;
850 curr_offset = offset;
852 curr_item= proto_tree_add_item(tree, hf_gsm_a_gmm_ptmsi_sig, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
853 proto_item_append_text(curr_item, "%s", add_string ? add_string : "");
855 curr_offset += 3;
857 /* no length check possible */
859 return (curr_offset - offset);
863 * [7] 10.5.5.8a
865 static guint16
866 de_gmm_ptmsi_sig2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len _U_)
868 guint32 curr_offset;
869 proto_item *curr_item;
871 curr_offset = offset;
873 curr_item= proto_tree_add_item(tree, hf_gsm_a_gmm_ptmsi_sig2, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
874 proto_item_append_text(curr_item, "%s", add_string ? add_string : "");
875 curr_offset += 3;
877 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
879 return (curr_offset - offset);
883 * [9] 10.5.5.9 Identity type 2
885 static const value_string gsm_a_gm_type_of_identity_vals[] = {
886 { 0x01, "IMSI" },
887 { 0x02, "IMEI" },
888 { 0x03, "IMEISV" },
889 { 0x04, "TMSI" },
890 { 0, NULL }
893 static guint16
894 de_gmm_ident_type2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
896 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
897 proto_tree_add_item(tree, hf_gsm_a_gm_type_of_identity, tvb, offset, 1, ENC_BIG_ENDIAN);
899 /* no length check possible */
900 return (1);
904 * [9] 10.5.5.10 IMEISV request
906 static const range_string gsm_a_gm_imeisv_req_vals[] = {
907 { 0x00, 0x00, "IMEISV not requested" },
908 { 0x01, 0x01, "IMEISV requested" },
909 { 0x02, 0x07, "Unknown, interpreted as IMEISV not requested" },
910 { 0, 0, NULL }
913 static guint16
914 de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
916 guint32 bit_offset;
918 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
919 bit_offset = offset << 3;
920 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
921 proto_tree_add_bits_item(tree, hf_gsm_a_gm_imeisv_req, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
923 /* no length check possible */
924 return (1);
928 * [7] 10.5.5.11
930 static guint16
931 de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
933 guint32 curr_offset;
934 guint curr_len;
936 curr_len = len;
937 curr_offset = offset;
939 if (len == 0) return 0;
943 guint32 oct;
944 oct = tvb_get_guint8(tvb, curr_offset);
945 oct <<= 8;
946 oct |= tvb_get_guint8(tvb, curr_offset+1);
947 curr_len -= 2;
948 oct <<= 8;
950 proto_tree_add_text(tree,
951 tvb, curr_offset, 2,
952 "NSAPI %d: 0x%02x (%u)",
953 oct>>20,
954 (oct>>12)&0xff,
955 (oct>>12)&0xff);
956 curr_offset += 2;
958 if (curr_len > 2)
960 oct |= tvb_get_guint8(tvb, curr_offset+2);
961 curr_len--;
962 oct <<= 12;
964 proto_tree_add_text(tree,
965 tvb, curr_offset-1, 2,
966 "NSAPI %d: 0x%02x (%u)",
967 oct>>20,
968 (oct>>12)&0xff,
969 (oct>>12)&0xff);
970 curr_offset++;
973 } while (curr_len > 1);
975 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
977 return (curr_offset - offset);
981 * [9] 10.5.5.12 MS network capability
983 static const true_false_string gsm_a_gmm_net_cap_gea_vals = {
984 "Encryption algorithm available",
985 "Encryption algorithm not available"
988 static const true_false_string gsm_a_gmm_net_cap_smdch_vals = {
989 "Mobile station supports mobile terminated point to point SMS via dedicated signalling channels",
990 "Mobile station does not support mobile terminated point to point SMS via dedicated signalling channels"
993 static const true_false_string gsm_a_gmm_net_cap_smgprs_vals = {
994 "Mobile station supports mobile terminated point to point SMS via GPRS packet data channels",
995 "Mobile station does not support mobile terminated point to point SMS via GPRS packet data channels"
998 static const true_false_string gsm_a_gmm_net_cap_ucs2_vals = {
999 "The ME has no preference between the use of the default alphabet and the use of UCS2",
1000 "The ME has a preference for the default alphabet (defined in 3GPP TS 23.038 [8b]) over UCS2"
1003 static const value_string gsm_a_gmm_net_cap_ss_scr_ind_vals[]={
1004 { 0x00, "Default value of phase 1" },
1005 { 0x01, "capability of handling of ellipsis notation and phase 2 error handling" },
1006 { 0x02, "For future use, interpreted as Capability of handling of ellipsis notation and phase 2 error handling" },
1007 { 0x03, "For future use, interpreted as Capability of handling of ellipsis notation and phase 2 error handling" },
1008 { 0x00, NULL }
1011 static const true_false_string gsm_a_gmm_net_cap_solsa_vals = {
1012 "The ME supports SoLSA",
1013 "The ME does not support SoLSA"
1016 static const true_false_string gsm_a_gmm_net_cap_rev_vals = {
1017 "Used by a mobile station supporting R99 or later versions of the protocol",
1018 "Used by a mobile station not supporting R99 or later versions of the protocol"
1021 static const true_false_string gsm_a_gmm_net_cap_pfc_vals = {
1022 "Mobile station does support BSS packet flow procedures",
1023 "Mobile station does not support BSS packet flow procedures"
1026 static const true_false_string gsm_a_gmm_net_cap_lcs_vals = {
1027 "LCS value added location request notification capability supported",
1028 "LCS value added location request notification capability not supported"
1031 static const true_false_string gsm_a_gmm_net_cap_ps_irat_iu_vals = {
1032 "PS inter-RAT HO to UTRAN Iu mode supported",
1033 "PS inter-RAT HO to UTRAN Iu mode not supported"
1036 static const true_false_string gsm_a_gmm_net_cap_ps_irat_s1_vals = {
1037 "PS inter-RAT HO to E-UTRAN S1 mode supported",
1038 "PS inter-RAT HO to E-UTRAN S1 mode not supported"
1041 static const true_false_string gsm_a_gmm_net_cap_comb_proc_vals = {
1042 "Mobile station supports EMM combined procedures",
1043 "Mobile station does not support EMM combined procedures"
1046 static const true_false_string gsm_a_gmm_net_cap_isr_vals = {
1047 "The mobile station supports ISR",
1048 "The mobile station does not support ISR"
1051 static const true_false_string gsm_a_gmm_net_cap_srvcc_to_geran_vals = {
1052 "SRVCC from UTRAN HSPA or E-UTRAN to GERAN/UTRAN supported",
1053 "SRVCC from UTRAN HSPA or E-UTRAN to GERAN/UTRAN not supported"
1056 static const true_false_string gsm_a_gmm_net_cap_epc_vals = {
1057 "EPC supported",
1058 "EPC not supported"
1061 static const true_false_string gsm_a_gmm_net_cap_nf_vals = {
1062 "Mobile station supports the notification procedure",
1063 "Mobile station does not support the notification procedure"
1066 static const true_false_string gsm_a_gmm_net_geran_net_vals = {
1067 "Mobile station supports GERAN network sharing",
1068 "Mobile station does not support GERAN network sharing"
1071 guint16
1072 de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1074 guint32 curr_offset;
1075 proto_tree *subtree;
1076 proto_item *item;
1078 curr_offset = offset;
1080 /* bit 8: GEA1 */
1081 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1083 /* bit 7: SM capabilities via dedicated channels */
1084 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1086 /* bit 6: SM capabilities via GPRS channels */
1087 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1089 /* bit 5: UCS2 support */
1090 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1092 /* bits 4 3: SS Screening Indicator */
1093 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1095 /* bit 2: SoLSA Capability */
1096 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1098 /* bit 1 */
1099 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1101 curr_offset++;
1102 NO_MORE_DATA_CHECK(len);
1104 /* bit 8: PFC feature mode */
1105 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1107 /* bits 7 6 5 4 3 2: Extended GEA bits */
1108 item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1109 subtree = proto_item_add_subtree(item, ett_gmm_network_cap);
1110 proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1111 proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1112 proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1113 proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1114 proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1115 proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1117 /* bit 1: LCS VA capability */
1118 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1120 curr_offset++;
1121 NO_MORE_DATA_CHECK(len);
1123 /* bit 8: PS inter-RAT HO from GERAN to UTRAN Iu mode capability */
1124 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1126 /* bit 7: PS inter-RAT HO from GERAN to E-UTRAN S1 mode capability */
1127 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1129 /* bit 6: EMM Combined procedures capability */
1130 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_comb_proc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1132 /* bit 5: ISR support */
1133 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1135 /* bit 4: SRVCC to GERAN/UTRAN capability */
1136 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1138 /* bit 3: EPC capability */
1139 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1141 /* bit 2: NF capability */
1142 proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_nf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1144 /* bits 1: GERAN network sharing capability */
1145 proto_tree_add_item(tree, hf_gsm_a_gmm_net_geran_net_sharing, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1147 curr_offset++;
1148 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
1150 return (curr_offset - offset);
1154 * [7] 10.5.5.12a
1156 #define GET_DATA /* check if we have enough bits left */ \
1157 if (curr_bits_length < bits_needed) \
1158 continue; \
1159 /* check if oct has enough bits */ \
1160 if (bits_in_oct < bits_needed) \
1162 guint32 tmp_oct; \
1163 if (curr_len == 0) \
1165 proto_tree_add_text(tf_tree, \
1166 tvb, curr_offset, 1, \
1167 "Not enough data available"); \
1169 tmp_oct = tvb_get_guint8(tvb, curr_offset); \
1170 oct |= tmp_oct<<(32-8-bits_in_oct); \
1171 curr_len--; \
1172 curr_offset++; \
1173 if (bits_in_oct != 0) \
1174 add_octets = 1; \
1175 else \
1176 add_octets = 0; \
1177 bits_in_oct += 8; \
1179 else \
1180 add_octets = 0;
1182 /* Access Technology Type */
1184 static const value_string gsm_a_gm_acc_tech_type_vals[] = {
1185 { 0x00, "GSM P" },
1186 { 0x01, "GSM E --note that GSM E covers GSM P" },
1187 { 0x02, "GSM R --note that GSM R covers GSM E and GSM P" },
1188 { 0x03, "GSM 1800" },
1189 { 0x04, "GSM 1900" },
1190 { 0x05, "GSM 450" },
1191 { 0x06, "GSM 480" },
1192 { 0x07, "GSM 850" },
1193 { 0x08, "GSM 750" },
1194 { 0x09, "GSM T 380" },
1195 { 0x0a, "GSM T 410" },
1196 { 0x0b, "GSM T 900" },
1197 { 0x0c, "GSM 710" },
1198 { 0x0d, "GSM T 810" },
1199 { 0x0f, "Indicates the presence of a list of Additional access technologies" },
1200 { 0, NULL }
1203 static const true_false_string gsm_a_gm_vgcs = {
1204 "VGCS capability and notifications wanted",
1205 "no VGCS capability or no notifications wanted"
1208 static const true_false_string gsm_a_gm_vbs = {
1209 "VBS capability and notifications wanted",
1210 "no VBS capability or no notifications wanted"
1213 static const value_string gsm_a_gm_multi_slot_vals[] = {
1214 { 0x00, "Not specified" },
1215 { 0x01, "Max Rx-Slot/TDMA:1 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:2 Tta:3 Ttb:2 Tra:4 Trb:2 Type:1" },
1216 { 0x02, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1" },
1217 { 0x03, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1" },
1218 { 0x04, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
1219 { 0x05, "Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
1220 { 0x06, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
1221 { 0x07, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:4 Tta:3 Ttb:1 Tra:3 Trb:1 Type:1" },
1222 { 0x08, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
1223 { 0x09, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
1224 { 0x0a, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
1225 { 0x0b, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:5 Tta:3 Ttb:1 Tra:2 Trb:1 Type:1" },
1226 { 0x0c, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1" },
1227 { 0x0d, "Max Rx-Slot/TDMA:3 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
1228 { 0x0e, "Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
1229 { 0x0f, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:3 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
1230 { 0x10, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:2 Trb:a) Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
1231 { 0x11, "Max Rx-Slot/TDMA:7 Max Tx-Slot/TDMA:7 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:a) Tra:1 Trb:0 Type:2 (a: 1 with frequency hopping, 0 otherwise)" },
1232 { 0x12, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:NA Ttb:0 Tra:0 Trb:0 Type:2" },
1233 { 0x13, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1234 { 0x14, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1235 { 0x15, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1236 { 0x16, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1237 { 0x17, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1238 { 0x18, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1239 { 0x19, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1240 { 0x1a, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1241 { 0x1b, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1242 { 0x1c, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1243 { 0x1d, "Max Rx-Slot/TDMA:8 Max Tx-Slot/TDMA:8 Max-Sum-Slot/TDMA:NA Tta:3 Ttb:b) Tra:2 Trb:c) Type:1 (b: 1 with frequency hopping or change from Rx to Tx, 0 otherwise; c: 1 with frequency hopping or change from Tx to Rx, 0 otherwise" },
1244 { 0x1e, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
1245 { 0x1f, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
1246 { 0x20, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
1247 { 0x21, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
1248 { 0x22, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1 Trb:1 Type:1" },
1249 { 0x23, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1250 { 0x24, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1251 { 0x25, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1252 { 0x26, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1253 { 0x27, "Max Rx-Slot/TDMA:5 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:6 Tta:2 Ttb:1 Tra:1+to Trb:1 Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1254 { 0x28, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:1 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1255 { 0x29, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1256 { 0x2a, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:3 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1257 { 0x2b, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1258 { 0x2c, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:5 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1259 { 0x2d, "Max Rx-Slot/TDMA:6 Max Tx-Slot/TDMA:6 Max-Sum-Slot/TDMA:7 Tta:1 Ttb:1 Tra:1 Trb:to Type:1 (to: to = 31 symbol periods (this can be provided by a TA offset, i.e. a minimum TA value))" },
1260 { 0, NULL }
1263 static const value_string gsm_a_gm_dtm_gprs_multi_slot_class_vals[] = {
1264 { 0x00, "Unused. If received, the network shall interpret this as Multislot class 5" },
1265 { 0x01, "Multislot class 5 supported" },
1266 { 0x02, "Multislot class 9 supported" },
1267 { 0x03, "Multislot class 11 supported" },
1268 { 0, NULL }
1271 static const true_false_string gsm_a_gm_revision_level_indicator = {
1272 "The ME is Release '99 onwards",
1273 "The ME is Release '98 or older"
1276 static const value_string gsm_a_gm_down_adv_rec_perf_vals[] = {
1277 { 0x00, "Downlink Advanced Receiver Performance not supported" },
1278 { 0x01, "Downlink Advanced Receiver Performance - phase I supported" },
1279 { 0x02, "Downlink Advanced Receiver Performance - phase II supported" },
1280 { 0, NULL }
1283 static const true_false_string gsm_a_gm_dtm_enh_cap = {
1284 "The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures",
1285 "The mobile station does not support enhanced DTM CS establishment and enhanced DTM CS release procedures"
1288 static const value_string gsm_a_gm_dtm_gprs_high_multi_slot_class_vals[] = {
1289 { 0x00, "Unused. If received, the network shall interpret this as 'Multislot class 31 or 36 supported'" },
1290 { 0x01, "Multislot class 31 or 36 supported" },
1291 { 0x02, "Multislot class 32 or 37 supported" },
1292 { 0x03, "Multislot class 33 or 38 supported" },
1293 { 0x04, "Multislot class 41 supported" },
1294 { 0x05, "Multislot class 42 supported" },
1295 { 0x06, "Multislot class 43 supported" },
1296 { 0x07, "Multislot class 44 supported" },
1297 { 0, NULL }
1300 static const value_string gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals[] = {
1301 { 0x00, "No reduction" },
1302 { 0x01, "The MS supports 1 timeslot fewer than the maximum number of receive timeslots" },
1303 { 0x02, "The MS supports 2 timeslots fewer than the maximum number of receive timeslots" },
1304 { 0x03, "The MS supports 3 timeslots fewer than the maximum number of receive timeslots" },
1305 { 0x04, "The MS supports 4 timeslots fewer than the maximum number of receive timeslots" },
1306 { 0x05, "The MS supports 5 timeslots fewer than the maximum number of receive timeslots" },
1307 { 0x06, "The MS supports 6 timeslots fewer than the maximum number of receive timeslots" },
1308 { 0x07, "Reserved for future use" },
1309 { 0, NULL }
1312 static const value_string gsm_a_gm_ul_egprs2_vals[] = {
1313 { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the uplink" },
1314 { 0x01, "The mobile station supports EGPRS2-A in the uplink" },
1315 { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink" },
1316 { 0x03, "This value is not used in this release/version of the specifications. If received it shall be interpreted as 'The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink'" },
1317 { 0, NULL }
1320 static const value_string gsm_a_gm_dl_egprs2_vals[] = {
1321 { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the downlink" },
1322 { 0x01, "The mobile station supports EGPRS2-A in the downlink" },
1323 { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink" },
1324 { 0x03, "This value is not used in this release/version of the specifications. If received it shall be interpreted as 'The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink'" },
1325 { 0, NULL }
1328 static const value_string gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals[] = {
1329 { 0x00, "None" },
1330 { 0x01, "E-UTRAN Neighbour Cell measurements and MS autonomous cell reselection to E-UTRAN supported" },
1331 { 0x02, "CCN towards E-UTRAN, E-UTRAN Neighbour Cell measurement reporting and Network controlled cell reselection to E-UTRAN supported in addition to capabilities indicated by '01'" },
1332 { 0x03, "PS Handover to E-UTRAN supported in addition to capabilities indicated by '01' and '10'" },
1333 { 0, NULL }
1336 static const value_string gsm_a_gm_alt_efta_multi_slot_class_vals[] = {
1337 { 0x00, "No Alternative EFTA multislot class is indicated. Use (DTM) EGPRS (high) multislot class only" },
1338 { 0x01, "Alternative EFTA multislot class 1" },
1339 { 0x02, "Alternative EFTA multislot class 2" },
1340 { 0x03, "Alternative EFTA multislot class 3" },
1341 { 0x04, "Unused" },
1342 { 0x05, "Unused" },
1343 { 0x06, "Unused" },
1344 { 0x07, "Unused" },
1345 { 0x08, "Unused" },
1346 { 0x09, "Unused" },
1347 { 0x0a, "Unused" },
1348 { 0x0b, "Unused" },
1349 { 0x0c, "Unused" },
1350 { 0x0d, "Unused" },
1351 { 0x0e, "Unused" },
1352 { 0x0f, "Unused" },
1353 { 0, NULL }
1356 guint16
1357 de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
1359 guint32 curr_offset;
1360 guint curr_len;
1361 int bit_offset;
1362 proto_item *tf = NULL, *mc_item = NULL;
1363 proto_tree *tf_tree = NULL, *mc_tree = NULL;
1364 guint32 oct;
1365 guchar bits_in_oct;
1366 guchar bits_needed;
1367 guint bits_length;
1368 guint add_octets; /* octets which are covered by one element -1 */
1369 guint curr_bits_length;
1370 guchar acc_type;
1371 guint value;
1372 const gchar *str;
1373 guint indx = 0;
1375 guchar dtm_gprs_mslot = 0;
1376 guchar dtm_egprs_mslot = 4;
1377 gboolean finished = TRUE;
1379 curr_len = len;
1380 curr_offset = offset;
1381 bit_offset = offset<<3;
1383 bits_in_oct = 0;
1384 oct = 0;
1389 /* check for a new round */
1390 if ((curr_len*8 + bits_in_oct) < 11)
1391 break;
1393 /* now read the first 11 bits */
1394 curr_bits_length = 11;
1398 if (curr_len != len)
1400 bits_needed = 1;
1401 GET_DATA;
1403 if ((oct>>(32-bits_needed)) != 1)
1405 break;
1407 oct <<= bits_needed;
1408 bits_in_oct -= bits_needed;
1409 bit_offset++;
1411 if ((curr_len*8 + bits_in_oct) < 11)
1412 break;
1413 curr_bits_length = 11;
1416 indx++;
1417 tf = proto_tree_add_text(tree,
1418 tvb, curr_offset, 1,
1419 "MS RA capability %d", indx);
1421 tf_tree = proto_item_add_subtree(tf, ett_gmm_radio_cap);
1424 * Access Technology
1426 bits_needed = 4;
1427 GET_DATA;
1429 acc_type = oct>>(32-bits_needed);
1431 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
1432 bit_offset += 4;
1434 curr_bits_length -= bits_needed;
1435 oct <<= bits_needed;
1436 bits_in_oct -= bits_needed;
1438 /* < Access capabilities struct > ::= */
1440 * get bits_length
1442 bits_needed = 7;
1443 GET_DATA;
1445 bits_length = curr_bits_length = oct>>(32-bits_needed);
1447 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
1448 proto_item_set_len(tf, (bits_length>>3)+1);
1449 /* This is already done - length doesn't contain this field
1450 curr_bits_length -= bits_needed;
1452 bit_offset += 7;
1453 oct <<= bits_needed;
1454 bits_in_oct -= bits_needed;
1456 if (acc_type == 0x0f)
1461 * Additional access technologies:
1463 finished = TRUE; /* Break out of the loop unless proven unfinished */
1466 * Presence bit
1468 bits_needed = 1;
1469 GET_DATA;
1471 /* analyse bits */
1472 switch (oct>>(32-bits_needed))
1474 case 0x00: str = "Not Present"; finished = TRUE; break;
1475 case 0x01: str = "Present"; finished = FALSE; break;
1476 default: str = "This should not happen";
1479 proto_tree_add_text(tf_tree,
1480 tvb, curr_offset-1-add_octets, 1+add_octets,
1481 "Presence: %s (%u)", str, oct>>(32-bits_needed));
1482 bit_offset++;
1483 curr_bits_length -= bits_needed;
1484 oct <<= bits_needed;
1485 bits_in_oct -= bits_needed;
1487 if (finished)
1490 * No more valid data, get spare bits if any
1492 while (curr_bits_length > 0)
1494 if (curr_bits_length > 8)
1495 bits_needed = 8;
1496 else
1497 bits_needed = curr_bits_length;
1498 GET_DATA;
1499 curr_bits_length -= bits_needed;
1500 oct <<= bits_needed;
1501 bits_in_oct -= bits_needed;
1502 bit_offset += bits_needed;
1504 continue;
1508 * Access Technology
1510 bits_needed = 4;
1511 GET_DATA;
1513 acc_type = oct>>(32-bits_needed);
1515 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
1516 bit_offset += 4;
1518 curr_bits_length -= bits_needed;
1519 oct <<= bits_needed;
1520 bits_in_oct -= bits_needed;
1523 * RF Power
1525 bits_needed = 3;
1526 GET_DATA;
1528 value = tvb_get_bits8(tvb, bit_offset, 3);
1529 /* analyse bits */
1530 if (acc_type == 0x04) /* GSM 1900 */
1532 switch (value)
1534 case 0x01: str = "1 W (30 dBm)"; break;
1535 case 0x02: str = "0,25 W (24 dBm)"; break;
1536 case 0x03: str = "2 W (33 dBm)"; break;
1537 default: str = "Not specified";
1540 else if (acc_type == 0x03)
1543 * 3 GSM 1800
1545 switch (value)
1547 case 0x01: str = "1 W (30 dBm)"; break;
1548 case 0x02: str = "0,25 W (24 dBm)"; break;
1549 case 0x03: str = "4 W (36 dBm)"; break;
1550 default: str = "Not specified";
1553 else if (acc_type <= 0x08)
1555 /* 0 GSM P
1556 * 1 GSM E
1557 * 2 GSM R
1558 * 5 GSM 450
1559 * 6 GSM 480
1560 * 7 GSM 850
1563 switch (value)
1565 case 0x02: str = "8 W (39 dBm)"; break;
1566 case 0x03: str = "5 W (37 dBm)"; break;
1567 case 0x04: str = "2 W (33 dBm)"; break;
1568 case 0x05: str = "0,8 W (29 dBm)"; break;
1569 default: str = "Not specified";
1572 else
1573 str = "Not specified??";
1575 /* decode_bits_in_field(gint bit_offset, gint no_of_bits, guint64 value)*/
1576 proto_tree_add_text(tf_tree,
1577 tvb, curr_offset-1-add_octets, 1+add_octets,
1578 "%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(bit_offset, 3, value), str, value);
1579 bit_offset += 3;
1580 curr_bits_length -= bits_needed;
1581 oct <<= bits_needed;
1582 bits_in_oct -= bits_needed;
1585 * 8PSK Power Class
1587 bits_needed = 2;
1588 GET_DATA;
1590 value = tvb_get_bits8(tvb, bit_offset, 2);
1591 /* analyse bits */
1592 switch (value)
1594 case 0x00: str = "8PSK modulation not supported for uplink"; break;
1595 case 0x01: str = "Power class E1"; break;
1596 case 0x02: str = "Power class E2"; break;
1597 case 0x03: str = "Power class E3"; break;
1598 default: str = "This should not happen";
1601 proto_tree_add_text(tf_tree,
1602 tvb, curr_offset-1-add_octets, 1+add_octets,
1603 "8PSK Power Class: %s (%u)", str, value);
1604 bit_offset += 2;
1605 curr_bits_length -= bits_needed;
1606 oct <<= bits_needed;
1607 bits_in_oct -= bits_needed;
1609 } while (!finished);
1611 /* goto next one */
1612 continue;
1615 * RF Power
1617 bits_needed = 3;
1618 GET_DATA;
1620 value = tvb_get_bits8(tvb, bit_offset, 3);
1621 /* analyse bits */
1622 if (acc_type == 0x04) /* GSM 1900 */
1624 switch (value)
1626 case 0x01: str = "1 W (30 dBm)"; break;
1627 case 0x02: str = "0,25 W (24 dBm)"; break;
1628 case 0x03: str = "2 W (33 dBm)"; break;
1629 default: str = "Not specified";
1632 else if (acc_type == 0x03)
1634 switch (value)
1636 case 0x01: str = "1 W (30 dBm)"; break;
1637 case 0x02: str = "0,25 W (24 dBm)"; break;
1638 case 0x03: str = "4 W (36 dBm)"; break;
1639 default: str = "Not specified";
1642 else if (acc_type <= 0x08)
1644 switch (value)
1646 case 0x02: str = "8 W (39 dBm)"; break;
1647 case 0x03: str = "5 W (37 dBm)"; break;
1648 case 0x04: str = "2 W (33 dBm)"; break;
1649 case 0x05: str = "0,8 W (29 dBm)"; break;
1650 default: str = "Not specified";
1653 else
1654 str = "Not specified??";
1656 proto_tree_add_text(tf_tree,
1657 tvb, curr_offset-1-add_octets, 1+add_octets,
1658 "%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(bit_offset, 3, value), str, value);
1660 bit_offset += 3;
1661 curr_bits_length -= bits_needed;
1662 oct <<= bits_needed;
1663 bits_in_oct -= bits_needed;
1666 * A5 Bits?
1668 bits_needed = 1;
1669 GET_DATA;
1671 /* analyse bits */
1672 if ((oct>>(32-bits_needed)) == 0)
1674 proto_tree_add_text(tf_tree,
1675 tvb, curr_offset-1-add_octets, 1+add_octets,
1676 "A5 Bits: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (%u)",
1677 oct>>(32-bits_needed));
1678 bit_offset++;
1679 curr_bits_length -= bits_needed;
1680 oct <<= bits_needed;
1681 bits_in_oct -= bits_needed;
1683 else
1685 int i;
1687 proto_tree_add_text(tf_tree,
1688 tvb, curr_offset-1-add_octets, 1+add_octets,
1689 "A5 Bits: A5 bits follow (%u)", oct>>(32-bits_needed));
1691 bit_offset++;
1692 curr_bits_length -= bits_needed;
1693 oct <<= bits_needed;
1694 bits_in_oct -= bits_needed;
1696 for (i=1; i<=7 ; i++)
1699 * A5 Bits decoding
1701 bits_needed = 1;
1702 GET_DATA;
1704 /* analyse bits */
1705 switch (oct>>(32-bits_needed))
1707 case 0x00: str = "encryption algorithm not available"; break;
1708 case 0x01: str = "encryption algorithm available"; break;
1709 default: str = "This should not happen";
1712 proto_tree_add_text(tf_tree,
1713 tvb, curr_offset-1-add_octets, 1+add_octets,
1714 "A5/%d: %s (%u)", i, str, oct>>(32-bits_needed));
1715 bit_offset++;
1716 curr_bits_length -= bits_needed;
1717 oct <<= bits_needed;
1718 bits_in_oct -= bits_needed;
1723 * ES IND
1725 bits_needed = 1;
1726 GET_DATA;
1728 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ctrled_early_cm_sending, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1729 bit_offset++;
1730 curr_bits_length -= bits_needed;
1731 oct <<= bits_needed;
1732 bits_in_oct -= bits_needed;
1735 * PS
1737 bits_needed = 1;
1738 GET_DATA;
1740 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_pseudo_sync, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1741 bit_offset++;
1742 curr_bits_length -= bits_needed;
1743 oct <<= bits_needed;
1744 bits_in_oct -= bits_needed;
1747 * VGCS
1749 bits_needed = 1;
1750 GET_DATA;
1752 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vgcs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1753 bit_offset++;
1754 curr_bits_length -= bits_needed;
1755 oct <<= bits_needed;
1756 bits_in_oct -= bits_needed;
1759 * VBS
1761 bits_needed = 1;
1762 GET_DATA;
1764 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vbs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1765 bit_offset++;
1766 curr_bits_length -= bits_needed;
1767 oct <<= bits_needed;
1768 bits_in_oct -= bits_needed;
1771 * Multislot capability?
1773 bits_needed = 1;
1774 GET_DATA;
1776 value = oct>>(32-bits_needed);
1778 mc_item = proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multislot_capability, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1779 bit_offset++;
1781 curr_bits_length -= bits_needed;
1782 oct <<= bits_needed;
1783 bits_in_oct -= bits_needed;
1785 /* analyse bits */
1786 if (value == 1)
1788 mc_tree = proto_item_add_subtree(mc_item, ett_gsm_a_gm_msrac_multislot_capability);
1790 * HSCSD multislot class?
1792 bits_needed = 1;
1793 GET_DATA;
1795 /* analyse bits */
1796 if ((oct>>(32-bits_needed)) == 0)
1798 proto_tree_add_text(mc_tree,
1799 tvb, curr_offset-1-add_octets, 1+add_octets,
1800 "HSCSD multislot class: Bits are not available (%u)", oct>>(32-bits_needed));
1801 bit_offset++;
1802 curr_bits_length -= bits_needed;
1803 oct <<= bits_needed;
1804 bits_in_oct -= bits_needed;
1806 else
1808 curr_bits_length -= bits_needed;
1809 oct <<= bits_needed;
1810 bits_in_oct -= bits_needed;
1811 bit_offset++;
1814 * HSCSD multislot class
1816 bits_needed = 5;
1817 GET_DATA;
1819 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_hscsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
1820 bit_offset += 5;
1821 curr_bits_length -= bits_needed;
1822 oct <<= bits_needed;
1823 bits_in_oct -= bits_needed;
1827 * GPRS multislot class?
1829 bits_needed = 1;
1830 GET_DATA;
1832 /* analyse bits */
1833 if ((oct>>(32-bits_needed)) == 0)
1835 proto_tree_add_text(mc_tree,
1836 tvb, curr_offset-1-add_octets, 1+add_octets,
1837 "GPRS multislot class: Bits are not available (%u)", oct>>(32-bits_needed));
1838 bit_offset++;
1839 curr_bits_length -= bits_needed;
1840 oct <<= bits_needed;
1841 bits_in_oct -= bits_needed;
1843 else
1845 curr_bits_length -= bits_needed;
1846 oct <<= bits_needed;
1847 bits_in_oct -= bits_needed;
1848 bit_offset++;
1851 * GPRS multislot class
1853 bits_needed = 5;
1854 GET_DATA;
1856 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
1857 bit_offset += 5;
1858 curr_bits_length -= bits_needed;
1859 oct <<= bits_needed;
1860 bits_in_oct -= bits_needed;
1863 * GPRS Extended Dynamic Allocation Capability
1865 bits_needed = 1;
1866 GET_DATA;
1868 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1869 bit_offset++;
1870 curr_bits_length -= bits_needed;
1871 oct <<= bits_needed;
1872 bits_in_oct -= bits_needed;
1876 * SMS/SM values
1878 bits_needed = 1;
1879 GET_DATA;
1881 /* analyse bits */
1882 if ((oct>>(32-bits_needed)) == 0)
1884 proto_tree_add_text(mc_tree,
1885 tvb, curr_offset-1-add_octets, 1+add_octets,
1886 "SMS/SM values: Bits are not available (%u)", oct>>(32-bits_needed));
1887 bit_offset++;
1888 curr_bits_length -= bits_needed;
1889 oct <<= bits_needed;
1890 bits_in_oct -= bits_needed;
1892 else
1894 curr_bits_length -= bits_needed;
1895 oct <<= bits_needed;
1896 bits_in_oct -= bits_needed;
1897 bit_offset++;
1900 * Switch-Measure-Switch value
1902 bits_needed = 4;
1903 GET_DATA;
1905 /* analyse bits */
1906 proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sms_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
1907 bit_offset += 4;
1908 curr_bits_length -= bits_needed;
1909 oct <<= bits_needed;
1910 bits_in_oct -= bits_needed;
1913 * Switch-Measure value
1915 bits_needed = 4;
1916 GET_DATA;
1918 /* analyse bits */
1919 proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sm_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
1920 bit_offset += 4;
1921 curr_bits_length -= bits_needed;
1922 oct <<= bits_needed;
1923 bits_in_oct -= bits_needed;
1927 * ECSD multislot class?
1929 bits_needed = 1;
1930 GET_DATA;
1932 /* analyse bits */
1933 if ((oct>>(32-bits_needed)) == 0)
1935 proto_tree_add_text(mc_tree,
1936 tvb, curr_offset-1-add_octets, 1+add_octets,
1937 "ECSD multislot class: Bits are not available (%u)", oct>>(32-bits_needed));
1938 bit_offset++;
1939 curr_bits_length -= bits_needed;
1940 oct <<= bits_needed;
1941 bits_in_oct -= bits_needed;
1943 else
1945 curr_bits_length -= bits_needed;
1946 oct <<= bits_needed;
1947 bits_in_oct -= bits_needed;
1948 bit_offset++;
1951 * ECSD multislot class
1953 bits_needed = 5;
1954 GET_DATA;
1956 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ecsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
1957 bit_offset += 5;
1958 curr_bits_length -= bits_needed;
1959 oct <<= bits_needed;
1960 bits_in_oct -= bits_needed;
1964 * EGPRS multislot class?
1966 bits_needed = 1;
1967 GET_DATA;
1969 /* analyse bits */
1970 if ((oct>>(32-bits_needed)) == 0)
1972 proto_tree_add_text(mc_tree,
1973 tvb, curr_offset-1-add_octets, 1+add_octets,
1974 "EGPRS multislot class: Bits are not available (%u)", oct>>(32-bits_needed));
1975 curr_bits_length -= bits_needed;
1976 oct <<= bits_needed;
1977 bits_in_oct -= bits_needed;
1978 bit_offset++;
1980 else
1982 curr_bits_length -= bits_needed;
1983 oct <<= bits_needed;
1984 bits_in_oct -= bits_needed;
1985 bit_offset++;
1988 * EGPRS multislot class
1990 bits_needed = 5;
1991 GET_DATA;
1993 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
1994 bit_offset += 5;
1995 curr_bits_length -= bits_needed;
1996 oct <<= bits_needed;
1997 bits_in_oct -= bits_needed;
2000 * EGPRS Extended Dynamic Allocation Capability
2002 bits_needed = 1;
2003 GET_DATA;
2005 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2006 bit_offset++;
2007 curr_bits_length -= bits_needed;
2008 oct <<= bits_needed;
2009 bits_in_oct -= bits_needed;
2013 * DTM GPRS Multi Slot Class ?
2015 bits_needed = 1;
2016 GET_DATA;
2018 /* analyse bits */
2019 if ((oct>>(32-bits_needed)) == 0)
2021 proto_tree_add_text(mc_tree,
2022 tvb, curr_offset-1-add_octets, 1+add_octets,
2023 "DTM GPRS Multi Slot Class: Bits are not available (%u)", oct>>(32-bits_needed));
2024 bit_offset++;
2025 curr_bits_length -= bits_needed;
2026 oct <<= bits_needed;
2027 bits_in_oct -= bits_needed;
2029 else
2031 curr_bits_length -= bits_needed;
2032 oct <<= bits_needed;
2033 bits_in_oct -= bits_needed;
2034 bit_offset++;
2037 * DTM GPRS Multi Slot Class
2039 bits_needed = 2;
2040 GET_DATA;
2042 /* analyse bits */
2043 dtm_gprs_mslot = oct>>(32-bits_needed);
2045 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2046 bit_offset += 2;
2047 curr_bits_length -= bits_needed;
2048 oct <<= bits_needed;
2049 bits_in_oct -= bits_needed;
2052 * Single Slot DTM
2054 bits_needed = 1;
2055 GET_DATA;
2057 proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_single_slt_dtm, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2058 bit_offset++;
2059 curr_bits_length -= bits_needed;
2060 oct <<= bits_needed;
2061 bits_in_oct -= bits_needed;
2064 * DTM EGPRS Multi Slot Class ?
2066 bits_needed = 1;
2067 GET_DATA;
2069 /* analyse bits */
2070 dtm_egprs_mslot = oct>>(32-bits_needed);
2071 proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2072 bit_offset++;
2073 curr_bits_length -= bits_needed;
2074 oct <<= bits_needed;
2075 bits_in_oct -= bits_needed;
2077 if ((oct>>(32-bits_needed)) == 1)
2080 * DTM EGPRS Multi Slot Class
2082 bits_needed = 2;
2083 GET_DATA;
2085 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2086 bit_offset += 2;
2087 curr_bits_length -= bits_needed;
2088 oct <<= bits_needed;
2089 bits_in_oct -= bits_needed;
2095 * 8PSK Power Capability?
2097 bits_needed = 1;
2098 GET_DATA;
2100 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_8psk_pow_cap_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2101 bit_offset++;
2102 curr_bits_length -= bits_needed;
2103 oct <<= bits_needed;
2104 bits_in_oct -= bits_needed;
2106 /* analyse bits */
2107 if ((oct>>(32-bits_needed)) == 1)
2110 * 8PSK Power Capability
2112 bits_needed = 2;
2113 GET_DATA;
2115 /* analyse bits */
2116 switch (oct>>(32-bits_needed))
2118 case 0x00: str = "Reserved"; break;
2119 case 0x01: str = "Power class E1"; break;
2120 case 0x02: str = "Power class E2"; break;
2121 case 0x03: str = "Power class E3"; break;
2122 default: str = "This should not happen";
2125 proto_tree_add_text(tf_tree,
2126 tvb, curr_offset-1-add_octets, 1+add_octets,
2127 "8PSK Power Capability: %s (%u)", str, oct>>(32-bits_needed));
2128 bit_offset += 2;
2129 curr_bits_length -= bits_needed;
2130 oct <<= bits_needed;
2131 bits_in_oct -= bits_needed;
2135 * COMPACT Interference Measurement Capability
2137 bits_needed = 1;
2138 GET_DATA;
2140 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_comp_int_meas_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2141 bit_offset++;
2142 curr_bits_length -= bits_needed;
2143 oct <<= bits_needed;
2144 bits_in_oct -= bits_needed;
2147 * Revision Level Indicator
2149 bits_needed = 1;
2150 GET_DATA;
2152 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rel_lev_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2153 bit_offset++;
2154 curr_bits_length -= bits_needed;
2155 oct <<= bits_needed;
2156 bits_in_oct -= bits_needed;
2159 * UMTS FDD Radio Access Technology Capability
2161 bits_needed = 1;
2162 GET_DATA;
2164 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_fdd_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2165 bit_offset++;
2166 curr_bits_length -= bits_needed;
2167 oct <<= bits_needed;
2168 bits_in_oct -= bits_needed;
2171 * UMTS 3.84 Mcps TDD Radio Access Technology Capability
2173 bits_needed = 1;
2174 GET_DATA;
2176 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_384_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2177 bit_offset++;
2178 curr_bits_length -= bits_needed;
2179 oct <<= bits_needed;
2180 bits_in_oct -= bits_needed;
2183 * CDMA 2000 Radio Access Technology Capability
2185 bits_needed = 1;
2186 GET_DATA;
2188 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_cdma2000_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2189 bit_offset++;
2190 curr_bits_length -= bits_needed;
2191 oct <<= bits_needed;
2192 bits_in_oct -= bits_needed;
2195 * UMTS 1.28 Mcps TDD Radio Access Technology Capability
2197 bits_needed = 1;
2198 GET_DATA;
2200 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_128_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2201 bit_offset++;
2202 curr_bits_length -= bits_needed;
2203 oct <<= bits_needed;
2204 bits_in_oct -= bits_needed;
2207 * GERAN Feature Package 1
2209 bits_needed = 1;
2210 GET_DATA;
2212 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_feat_pkg, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2213 bit_offset++;
2214 curr_bits_length -= bits_needed;
2215 oct <<= bits_needed;
2216 bits_in_oct -= bits_needed;
2219 * Extended DTM (E)GPRS Multi Slot Class
2222 bits_needed = 1;
2223 GET_DATA;
2225 /* analyse bits */
2226 if ((oct>>(32-bits_needed)) == 0)
2228 proto_tree_add_text(tf_tree,
2229 tvb, curr_offset-1-add_octets, 1+add_octets,
2230 "Extended DTM (E)GPRS Multi Slot Class: Bits are not available (%u)", oct>>(32-bits_needed));
2231 curr_bits_length -= bits_needed;
2232 oct <<= bits_needed;
2233 bits_in_oct -= bits_needed;
2234 bit_offset++;
2236 else
2238 curr_bits_length -= bits_needed;
2239 oct <<= bits_needed;
2240 bits_in_oct -= bits_needed;
2241 bit_offset++;
2244 * Extended DTM GPRS Multi Slot Class
2246 bits_needed = 2;
2247 GET_DATA;
2249 /* analyse bits */
2250 switch ((oct>>(32-bits_needed))|(dtm_gprs_mslot<<4))
2252 case 0x00: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2253 case 0x01: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2254 case 0x02: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2255 case 0x03: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2256 case 0x10: str = "Multislot class 5 supported"; break;
2257 case 0x11: str = "Multislot class 6 supported"; break;
2258 case 0x12: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2259 case 0x13: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2260 case 0x20: str = "Multislot class 9 supported"; break;
2261 case 0x21: str = "Multislot class 10 supported"; break;
2262 case 0x22: str = "Unused. If received, it shall be interpreted as Multislot class 9 supported"; break;
2263 case 0x23: str = "Unused. If received, it shall be interpreted as Multislot class 9 supported"; break;
2264 case 0x30: str = "Multislot class 11 supported"; break;
2265 case 0x31: str = "Unused. If received, it shall be interpreted as Multislot class 11 supported"; break;
2266 case 0x32: str = "Unused. If received, it shall be interpreted as Multislot class 11 supported"; break;
2267 case 0x33: str = "Unused. If received, it shall be interpreted as Multislot class 11 supported"; break;
2268 default: str = "This should not happen";
2271 proto_tree_add_text(tf_tree,
2272 tvb, curr_offset-1-add_octets, 1+add_octets,
2273 "Extended DTM GPRS Multi Slot Class: %s (%u)", str, oct>>(32-bits_needed));
2274 bit_offset += 2;
2275 curr_bits_length -= bits_needed;
2276 oct <<= bits_needed;
2277 bits_in_oct -= bits_needed;
2279 if (dtm_egprs_mslot <= 3)
2282 * Extended DTM EGPRS Multi Slot Class
2284 bits_needed = 2;
2285 GET_DATA;
2287 /* analyse bits */
2288 switch ((oct>>(32-bits_needed))|(dtm_egprs_mslot<<4) )
2290 case 0x00: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2291 case 0x01: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2292 case 0x02: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2293 case 0x03: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2294 case 0x10: str = "Multislot class 5 supported"; break;
2295 case 0x11: str = "Multislot class 6 supported"; break;
2296 case 0x12: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2297 case 0x13: str = "Unused. If received, it shall be interpreted as Multislot class 5 supported"; break;
2298 case 0x20: str = "Multislot class 9 supported"; break;
2299 case 0x21: str = "Multislot class 10 supported"; break;
2300 case 0x22: str = "Unused. If received, it shall be interpreted as Multislot class 9 supported"; break;
2301 case 0x23: str = "Unused. If received, it shall be interpreted as Multislot class 9 supported"; break;
2302 case 0x30: str = "Multislot class 11 supported"; break;
2303 case 0x31: str = "Unused. If received, it shall be interpreted as Multislot class 11 supported"; break;
2304 case 0x32: str = "Unused. If received, it shall be interpreted as Multislot class 11 supported"; break;
2305 case 0x33: str = "Unused. If received, it shall be interpreted as Multislot class 11 supported"; break;
2306 default: str = "This should not happen";
2309 proto_tree_add_text(tf_tree,
2310 tvb, curr_offset-1-add_octets, 1+add_octets,
2311 "Extended DTM EGPRS Multi Slot Class: %s (%u)", str, oct>>(32-bits_needed));
2312 bit_offset += 2;
2313 curr_bits_length -= bits_needed;
2314 oct <<= bits_needed;
2315 bits_in_oct -= bits_needed;
2320 * Modulation based multislot class support
2322 bits_needed = 1;
2323 GET_DATA;
2325 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mod_based_multi_slot_class_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2326 bit_offset++;
2327 curr_bits_length -= bits_needed;
2328 oct <<= bits_needed;
2329 bits_in_oct -= bits_needed;
2332 * High Multislot Capability
2334 bits_needed = 1;
2335 GET_DATA;
2337 /* analyse bits */
2338 if ((oct>>(32-bits_needed)) == 0)
2340 proto_tree_add_text(tf_tree,
2341 tvb, curr_offset-1-add_octets, 1+add_octets,
2342 "High Multislot Capability: Bits are not available (%u)", oct>>(32-bits_needed));
2343 bit_offset++;
2344 curr_bits_length -= bits_needed;
2345 oct <<= bits_needed;
2346 bits_in_oct -= bits_needed;
2348 else
2350 curr_bits_length -= bits_needed;
2351 oct <<= bits_needed;
2352 bits_in_oct -= bits_needed;
2353 bit_offset++;
2356 * High Multislot Capability
2358 bits_needed = 2;
2359 GET_DATA;
2361 /* analyse bits */
2362 proto_tree_add_text(tf_tree,
2363 tvb, curr_offset-1-add_octets, 1+add_octets,
2364 "High Multislot Capability: 0x%02x (%u)"
2365 " - This field effect all other multislot fields."
2366 " To understand the value please read TS 24.008 5.6.0"
2367 " Release 5 Chap 10.5.5.12 Page 406",
2368 oct>>(32-bits_needed),
2369 oct>>(32-bits_needed));
2370 bit_offset += 2;
2371 curr_bits_length -= bits_needed;
2372 oct <<= bits_needed;
2373 bits_in_oct -= bits_needed;
2377 * GERAN Iu Mode Capability
2379 bits_needed = 1;
2380 GET_DATA;
2382 value = tvb_get_bits8(tvb, bit_offset, 1);
2383 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_iu_mode_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2384 bit_offset += bits_needed;
2385 curr_bits_length -= bits_needed;
2386 oct <<= bits_needed;
2387 bits_in_oct -= bits_needed;
2388 if (value)
2390 /* GERAN Iu Mode Capabilities struct present */
2391 bits_needed = 4;
2392 GET_DATA;
2393 value = tvb_get_bits8(tvb, bit_offset, 4);
2394 bit_offset += bits_needed;
2395 curr_bits_length -= bits_needed;
2396 oct <<= bits_needed;
2397 bits_in_oct -= bits_needed;
2398 if (value)
2401 * FLO Iu Capability
2403 bits_needed = 1;
2404 GET_DATA;
2405 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flo_iu_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2406 bit_offset += bits_needed;
2407 curr_bits_length -= bits_needed;
2408 oct <<= bits_needed;
2409 bits_in_oct -= bits_needed;
2410 value--;
2412 /* skip spare bits */
2413 bit_offset += value;
2414 curr_bits_length -= value;
2415 oct <<= value;
2416 bits_in_oct -= value;
2421 * GMSK Multislot Power Profile
2423 bits_needed = 2;
2424 GET_DATA;
2426 /* analyse bits */
2427 switch (oct>>(32-bits_needed) )
2429 case 0x00: str = "GMSK_MULTISLOT_POWER_PROFILE 0"; break;
2430 case 0x01: str = "GMSK_MULTISLOT_POWER_PROFILE 1"; break;
2431 case 0x02: str = "GMSK_MULTISLOT_POWER_PROFILE 2"; break;
2432 case 0x03: str = "GMSK_MULTISLOT_POWER_PROFILE 3"; break;
2433 default: str = "This should not happen";
2436 proto_tree_add_text(tf_tree,
2437 tvb, curr_offset-1-add_octets, 1+add_octets,
2438 "GMSK Multislot Power Profile: %s (%u)", str, oct>>(32-bits_needed));
2439 bit_offset += 2;
2440 curr_bits_length -= bits_needed;
2441 oct <<= bits_needed;
2442 bits_in_oct -= bits_needed;
2445 * 8-PSK Multislot Power Profile
2447 bits_needed = 2;
2448 GET_DATA;
2450 /* analyse bits */
2451 switch (oct>>(32-bits_needed) )
2453 case 0x00: str = "8-PSK_MULTISLOT_POWER_PROFILE 0"; break;
2454 case 0x01: str = "8-PSK_MULTISLOT_POWER_PROFILE 1"; break;
2455 case 0x02: str = "8-PSK_MULTISLOT_POWER_PROFILE 2"; break;
2456 case 0x03: str = "8-PSK_MULTISLOT_POWER_PROFILE 3"; break;
2457 default: str = "This should not happen";
2460 proto_tree_add_text(tf_tree, tvb, curr_offset-1-add_octets, 1+add_octets,
2461 "8-PSK Multislot Power Profile: %s (%u)", str, oct>>(32-bits_needed));
2462 bit_offset += 2;
2463 curr_bits_length -= bits_needed;
2464 oct <<= bits_needed;
2465 bits_in_oct -= bits_needed;
2468 * Release 6
2472 * Multiple TBF Capability
2474 bits_needed = 1;
2475 GET_DATA;
2476 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mult_tbf_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2477 bit_offset += bits_needed;
2478 curr_bits_length -= bits_needed;
2479 oct <<= bits_needed;
2480 bits_in_oct -= bits_needed;
2483 * Downlink Advanced Receiver Performance
2485 bits_needed = 2;
2486 GET_DATA;
2487 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_adv_rec_perf, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2488 bit_offset += bits_needed;
2489 curr_bits_length -= bits_needed;
2490 oct <<= bits_needed;
2491 bits_in_oct -= bits_needed;
2494 * Extended RLC/MAC Control Message Segmentation Capability
2496 bits_needed = 1;
2497 GET_DATA;
2498 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2499 bit_offset += bits_needed;
2500 curr_bits_length -= bits_needed;
2501 oct <<= bits_needed;
2502 bits_in_oct -= bits_needed;
2505 * DTM Enhancements Capability
2507 bits_needed = 1;
2508 GET_DATA;
2509 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_enh_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2510 bit_offset += bits_needed;
2511 curr_bits_length -= bits_needed;
2512 oct <<= bits_needed;
2513 bits_in_oct -= bits_needed;
2516 * DTM GPRS High Multi Slot Class & DTM EGPRS High Multi Slot Class
2518 bits_needed = 1;
2519 GET_DATA;
2520 if ((oct>>(32-bits_needed)) == 0)
2522 bit_offset += bits_needed;
2523 curr_bits_length -= bits_needed;
2524 oct <<= bits_needed;
2525 bits_in_oct -= bits_needed;
2527 else
2529 bit_offset += bits_needed;
2530 curr_bits_length -= bits_needed;
2531 oct <<= bits_needed;
2532 bits_in_oct -= bits_needed;
2535 * DTM GPRS High Multi Slot Class
2537 bits_needed = 3;
2538 GET_DATA;
2539 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
2540 bit_offset += bits_needed;
2541 curr_bits_length -= bits_needed;
2542 oct <<= bits_needed;
2543 bits_in_oct -= bits_needed;
2545 bits_needed = 1;
2546 GET_DATA;
2547 if ((oct>>(32-bits_needed)) == 0)
2549 bit_offset += bits_needed;
2550 curr_bits_length -= bits_needed;
2551 oct <<= bits_needed;
2552 bits_in_oct -= bits_needed;
2554 else
2556 bit_offset += bits_needed;
2557 curr_bits_length -= bits_needed;
2558 oct <<= bits_needed;
2559 bits_in_oct -= bits_needed;
2562 * DTM EGPRS High Multi Slot Class
2564 bits_needed = 3;
2565 GET_DATA;
2566 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
2567 bit_offset += bits_needed;
2568 curr_bits_length -= bits_needed;
2569 oct <<= bits_needed;
2570 bits_in_oct -= bits_needed;
2575 * PS Handover Capability
2577 bits_needed = 1;
2578 GET_DATA;
2579 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ps_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2580 bit_offset += bits_needed;
2581 curr_bits_length -= bits_needed;
2582 oct <<= bits_needed;
2583 bits_in_oct -= bits_needed;
2586 * Release 7
2590 * DTM Handover Capability
2592 bits_needed = 1;
2593 GET_DATA;
2594 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2595 bit_offset += bits_needed;
2596 curr_bits_length -= bits_needed;
2597 oct <<= bits_needed;
2598 bits_in_oct -= bits_needed;
2601 * Multislot Capability Reduction for Downlink Dual Carrier & Downlink Dual Carrier for DTM Capability
2604 bits_needed = 1;
2605 GET_DATA;
2606 if ((oct>>(32-bits_needed)) == 0)
2608 bit_offset += bits_needed;
2609 curr_bits_length -= bits_needed;
2610 oct <<= bits_needed;
2611 bits_in_oct -= bits_needed;
2613 else
2615 bit_offset += bits_needed;
2616 curr_bits_length -= bits_needed;
2617 oct <<= bits_needed;
2618 bits_in_oct -= bits_needed;
2621 * Multislot Capability Reduction for Downlink Dual Carrier
2623 bits_needed = 3;
2624 GET_DATA;
2625 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
2626 bit_offset += bits_needed;
2627 curr_bits_length -= bits_needed;
2628 oct <<= bits_needed;
2629 bits_in_oct -= bits_needed;
2632 * Downlink Dual Carrier for DTM Capability
2634 bits_needed = 1;
2635 GET_DATA;
2636 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2637 bit_offset += bits_needed;
2638 curr_bits_length -= bits_needed;
2639 oct <<= bits_needed;
2640 bits_in_oct -= bits_needed;
2644 * Flexible Timeslot Assignment
2646 bits_needed = 1;
2647 GET_DATA;
2648 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flex_ts_assign, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2649 bit_offset += bits_needed;
2650 curr_bits_length -= bits_needed;
2651 oct <<= bits_needed;
2652 bits_in_oct -= bits_needed;
2655 * GAN PS Handover Capability
2657 bits_needed = 1;
2658 GET_DATA;
2659 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gan_ps_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2660 bit_offset += bits_needed;
2661 curr_bits_length -= bits_needed;
2662 oct <<= bits_needed;
2663 bits_in_oct -= bits_needed;
2666 * RLC Non-persistent Mode
2668 bits_needed = 1;
2669 GET_DATA;
2670 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_rlc_non_pers_mode, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2671 bit_offset += bits_needed;
2672 curr_bits_length -= bits_needed;
2673 oct <<= bits_needed;
2674 bits_in_oct -= bits_needed;
2677 * Reduced Latency Capability
2679 bits_needed = 1;
2680 GET_DATA;
2681 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_reduced_lat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2682 bit_offset += bits_needed;
2683 curr_bits_length -= bits_needed;
2684 oct <<= bits_needed;
2685 bits_in_oct -= bits_needed;
2688 * Uplink EGPRS2
2690 bits_needed = 2;
2691 GET_DATA;
2692 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ul_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2693 bit_offset += bits_needed;
2694 curr_bits_length -= bits_needed;
2695 oct <<= bits_needed;
2696 bits_in_oct -= bits_needed;
2699 * Downlink EGPRS2
2701 bits_needed = 2;
2702 GET_DATA;
2703 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dl_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2704 bit_offset += bits_needed;
2705 curr_bits_length -= bits_needed;
2706 oct <<= bits_needed;
2707 bits_in_oct -= bits_needed;
2710 * Release 8
2714 * E-UTRA FDD support
2716 bits_needed = 1;
2717 GET_DATA;
2718 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_fdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2719 bit_offset += bits_needed;
2720 curr_bits_length -= bits_needed;
2721 oct <<= bits_needed;
2722 bits_in_oct -= bits_needed;
2725 * E-UTRA TDD support
2727 bits_needed = 1;
2728 GET_DATA;
2729 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_tdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2730 bit_offset += bits_needed;
2731 curr_bits_length -= bits_needed;
2732 oct <<= bits_needed;
2733 bits_in_oct -= bits_needed;
2736 * GERAN to E-UTRA support in GERAN packet transfer mode
2738 bits_needed = 2;
2739 GET_DATA;
2740 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2741 bit_offset += bits_needed;
2742 curr_bits_length -= bits_needed;
2743 oct <<= bits_needed;
2744 bits_in_oct -= bits_needed;
2747 * Priority-based reselection support
2749 bits_needed = 1;
2750 GET_DATA;
2751 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_prio_based_resel_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2752 bit_offset += bits_needed;
2753 curr_bits_length -= bits_needed;
2754 oct <<= bits_needed;
2755 bits_in_oct -= bits_needed;
2758 * Release 9
2762 * Enhanced Flexible Timeslot Assignment
2764 bits_needed = 1;
2765 GET_DATA;
2766 if ((oct>>(32-bits_needed)) == 0)
2768 bit_offset += bits_needed;
2769 curr_bits_length -= bits_needed;
2770 oct <<= bits_needed;
2771 bits_in_oct -= bits_needed;
2773 else
2775 bit_offset += bits_needed;
2776 curr_bits_length -= bits_needed;
2777 oct <<= bits_needed;
2778 bits_in_oct -= bits_needed;
2781 * Alternative EFTA Multislot Class
2783 bits_needed = 4;
2784 GET_DATA;
2785 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_alt_efta_multi_slot_class, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
2786 bit_offset += bits_needed;
2787 curr_bits_length -= bits_needed;
2788 oct <<= bits_needed;
2789 bits_in_oct -= bits_needed;
2792 * EFTA Multislot Capability Reduction for Downlink Dual Carrier
2794 bits_needed = 3;
2795 GET_DATA;
2796 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
2797 bit_offset += bits_needed;
2798 curr_bits_length -= bits_needed;
2799 oct <<= bits_needed;
2800 bits_in_oct -= bits_needed;
2804 * Indication of Upper Layer PDU Start Capability for RLC UM
2806 bits_needed = 1;
2807 GET_DATA;
2808 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2809 bit_offset += bits_needed;
2810 curr_bits_length -= bits_needed;
2811 oct <<= bits_needed;
2812 bits_in_oct -= bits_needed;
2815 * EMST Capability
2817 bits_needed = 1;
2818 GET_DATA;
2819 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emst_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2820 bit_offset += bits_needed;
2821 curr_bits_length -= bits_needed;
2822 oct <<= bits_needed;
2823 bits_in_oct -= bits_needed;
2826 * MTTI Capability
2828 bits_needed = 1;
2829 GET_DATA;
2830 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mtti_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2831 bit_offset += bits_needed;
2832 curr_bits_length -= bits_needed;
2833 oct <<= bits_needed;
2834 bits_in_oct -= bits_needed;
2837 * UTRA CSG Cells Reporting
2839 bits_needed = 1;
2840 GET_DATA;
2841 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_utra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2842 bit_offset += bits_needed;
2843 curr_bits_length -= bits_needed;
2844 oct <<= bits_needed;
2845 bits_in_oct -= bits_needed;
2848 * E-UTRA CSG Cells Reporting
2850 bits_needed = 1;
2851 GET_DATA;
2852 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2853 bit_offset += bits_needed;
2854 curr_bits_length -= bits_needed;
2855 oct <<= bits_needed;
2856 bits_in_oct -= bits_needed;
2859 * Release 10
2863 * DTR Capability
2865 bits_needed = 1;
2866 GET_DATA;
2867 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2868 bit_offset += bits_needed;
2869 curr_bits_length -= bits_needed;
2870 oct <<= bits_needed;
2871 bits_in_oct -= bits_needed;
2874 * EMSR Capability
2876 bits_needed = 1;
2877 GET_DATA;
2878 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emsr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2879 bit_offset += bits_needed;
2880 curr_bits_length -= bits_needed;
2881 oct <<= bits_needed;
2882 bits_in_oct -= bits_needed;
2885 * Fast Downlink Frequency Switching Capability
2887 bits_needed = 1;
2888 GET_DATA;
2889 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_fast_down_freq_switch_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2890 bit_offset += bits_needed;
2891 curr_bits_length -= bits_needed;
2892 oct <<= bits_needed;
2893 bits_in_oct -= bits_needed;
2896 * TIGHTER Capability
2898 bits_needed = 2;
2899 GET_DATA;
2900 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_tighter_cap, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2901 bit_offset += bits_needed;
2902 curr_bits_length -= bits_needed;
2903 oct <<= bits_needed;
2904 bits_in_oct -= bits_needed;
2907 * Release 11
2911 * FANR Capability
2913 bits_needed = 1;
2914 GET_DATA;
2915 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_fanr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2916 bit_offset += bits_needed;
2917 curr_bits_length -= bits_needed;
2918 oct <<= bits_needed;
2919 bits_in_oct -= bits_needed;
2922 * IPA Capability
2924 bits_needed = 1;
2925 GET_DATA;
2926 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ipa_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2927 bit_offset += bits_needed;
2928 curr_bits_length -= bits_needed;
2929 oct <<= bits_needed;
2930 bits_in_oct -= bits_needed;
2933 * GERAN Network Sharing support
2935 bits_needed = 1;
2936 GET_DATA;
2937 proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_nw_sharing_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2938 bit_offset += bits_needed;
2939 curr_bits_length -= bits_needed;
2940 oct <<= bits_needed;
2941 bits_in_oct -= bits_needed;
2944 * we are too long ... so jump over it
2946 while (curr_bits_length > 0)
2948 if (curr_bits_length > 8)
2949 bits_needed = 8;
2950 else
2951 bits_needed = curr_bits_length;
2952 GET_DATA;
2953 curr_bits_length -= bits_needed;
2954 oct <<= bits_needed;
2955 bits_in_oct -= bits_needed;
2959 } while (1);
2961 curr_offset += curr_len;
2963 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
2965 return (curr_offset - offset);
2969 * [9] 10.5.5.14
2971 static const range_string gmm_cause_vals[] = {
2972 { 0x00, 0x01, "Protocol error, unspecified"},
2973 { 0x02, 0x02, "IMSI unknown in HLR"},
2974 { 0x03, 0x03, "Illegal MS"},
2975 { 0x04, 0x04, "IMSI unknown in VLR"}, /* Annex G.1 */
2976 { 0x05, 0x05, "IMEI not accepted"}, /* Annex G.1 */
2977 { 0x06, 0x06, "Illegal ME"},
2978 { 0x07, 0x07, "GPRS services not allowed"},
2979 { 0x08, 0x08, "GPRS services and non-GPRS services not allowed"},
2980 { 0x09, 0x09, "MS identity cannot be derived by the network"},
2981 { 0x0a, 0x0a, "Implicitly detached"},
2982 { 0x0b, 0x0b, "PLMN not allowed"},
2983 { 0x0c, 0x0c, "Location Area not allowed"},
2984 { 0x0d, 0x0d, "Roaming not allowed in this location area"},
2985 { 0x0e, 0x0e, "GPRS services not allowed in this PLMN"},
2986 { 0x0f, 0x0f, "No Suitable Cells In Location Area"},
2987 { 0x10, 0x10, "MSC temporarily not reachable"},
2988 { 0x11, 0x11, "Network failure"},
2989 { 0x12, 0x13, "Protocol error, unspecified"},
2990 { 0x14, 0x14, "MAC failure"},
2991 { 0x15, 0x15, "Synch failure"},
2992 { 0x16, 0x16, "Congestion"},
2993 { 0x17, 0x17, "GSM authentication unacceptable"},
2994 { 0x18, 0x18, "Protocol error, unspecified"},
2995 { 0x19, 0x19, "Not authorized for this CSG"},
2996 { 0x1c, 0x1c, "SMS provided via GPRS in this routing area"},
2997 { 0x20, 0x20, "Service option not supported"}, /* Annex G.4 */
2998 { 0x21, 0x21, "Requested service option not subscribed"}, /* Annex G.4 */
2999 { 0x22, 0x22, "Service option temporarily out of order"}, /* Annex G.4 */
3000 { 0x23, 0x25, "Protocol error, unspecified"},
3001 { 0x26, 0x26, "Call cannot be identified(non-GPRS services only)"}, /* Annex G.4 */
3002 { 0x27, 0x27, "Protocol error, unspecified"},
3003 { 0x28, 0x28, "No PDP context activated"},
3004 { 0x29, 0x2f, "Protocol error, unspecified"},
3005 { 0x30, 0x3f, "Retry upon entry into a new cell"},
3006 { 0x40, 0x5e, "Protocol error, unspecified"},
3007 { 0x5f, 0x5f, "Semantically incorrect message"},
3008 { 0x60, 0x60, "Invalid mandatory information"},
3009 { 0x61, 0x61, "Message type non-existent or not implemented"},
3010 { 0x62, 0x62, "Message type not compatible with the protocol state"},
3011 { 0x63, 0x63, "Information element non-existent or not implemented"},
3012 { 0x64, 0x64, "Conditional IE error"},
3013 { 0x65, 0x65, "Message not compatible with the protocol state"},
3014 { 0x66, 0x6e, "Protocol error, unspecified"},
3015 { 0x6f, 0x6f, "Protocol error, unspecified"},
3016 { 0x70, 0xff, "Protocol error, unspecified"},
3017 { 0, 0, NULL }
3019 /* NOTE 1 TS 124 008 V8.6.0 (2009-07)
3020 "Any other value received by the mobile station shall be treated as 0110 1111, "Protocol
3021 error, unspecified". Any other value received by the network shall be treated as
3022 0110 1111, "Protocol error, unspecified".
3025 /* NOTE: The listed reject cause values are defined in annex G. */
3027 static guint16
3028 de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3030 guint32 curr_offset;
3032 curr_offset = offset;
3034 proto_tree_add_item(tree, hf_gsm_a_gm_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3036 curr_offset++;
3038 /* no length check possible */
3040 return (curr_offset - offset);
3044 * [7] 10.5.5.15 Routing area identification
3046 guint16
3047 de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3049 proto_tree *subtree;
3050 proto_item *item;
3051 guint32 mcc;
3052 guint32 mnc;
3053 guint32 lac;
3054 guint32 rac;
3055 guint32 curr_offset;
3057 curr_offset = offset;
3059 mcc = (tvb_get_guint8(tvb, curr_offset) & 0x0f) <<8;
3060 mcc |= (tvb_get_guint8(tvb, curr_offset) & 0xf0);
3061 mcc |= (tvb_get_guint8(tvb, curr_offset+1) & 0x0f);
3062 mnc = (tvb_get_guint8(tvb, curr_offset+2) & 0x0f) <<8;
3063 mnc |= (tvb_get_guint8(tvb, curr_offset+2) & 0xf0);
3064 mnc |= (tvb_get_guint8(tvb, curr_offset+1) & 0xf0) >>4;
3065 if ((mnc&0x000f) == 0x000f)
3066 mnc = mnc>>4;
3068 lac = tvb_get_ntohs(tvb, curr_offset+3);
3069 rac = tvb_get_guint8(tvb, curr_offset+5);
3071 item = proto_tree_add_text(tree,
3072 tvb, curr_offset, 6,
3073 "Routing area identification: %x-%x-%u-%u",
3074 mcc, mnc, lac, rac);
3076 subtree = proto_item_add_subtree(item, ett_gmm_rai);
3077 dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, TRUE);
3079 proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, ENC_BIG_ENDIAN);
3080 proto_tree_add_item(subtree, hf_gsm_a_gm_rac, tvb, curr_offset+5, 1, ENC_BIG_ENDIAN);
3082 curr_offset += 6;
3083 if (add_string)
3085 if (add_string[0] == '\0')
3087 g_snprintf(add_string, string_len, " - RAI: %x-%x-%u-%u", mcc, mnc, lac, rac);
3092 /* no length check possible */
3094 return (curr_offset - offset);
3098 * [7] 10.5.5.15a Routing area identification 2
3100 static guint16
3101 de_gmm_rai2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3103 /* The routing area identification 2 value is coded as octet 2 to 7 of the Routing area identification information element. */
3104 return de_gmm_rai(tvb, tree, pinfo, offset, len, add_string, string_len);
3108 * [7] 10.5.5.17
3110 static guint16
3111 de_gmm_update_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3113 guint8 oct;
3114 guint32 curr_offset;
3115 const gchar *str;
3117 curr_offset = offset;
3119 oct = tvb_get_guint8(tvb, curr_offset);
3121 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
3122 oct >>= 4;
3124 switch (oct&7)
3126 case 0: str = "RA updated"; break;
3127 case 1: str = "combined RA/LA updated"; break;
3128 default: str = "reserved";
3131 proto_tree_add_text(tree,
3132 tvb, curr_offset, 1,
3133 "Update Result: %s (%u)",
3134 str,
3135 oct&7);
3137 curr_offset++;
3139 /* no length check possible */
3141 return (curr_offset - offset);
3145 * [9] 10.5.5.18 Update Type
3147 static const value_string gsm_a_gm_update_type_vals[] = {
3148 { 0x00, "RA updating" },
3149 { 0x01, "combined RA/LA updating" },
3150 { 0x02, "combined RA/LA updating with IMSI attach" },
3151 { 0x03, "Periodic updating" },
3152 { 0, NULL }
3155 static guint16
3156 de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3158 proto_tree_add_item(tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
3159 proto_tree_add_item(tree, hf_gsm_a_gm_update_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3161 /* no length check possible */
3162 return (1);
3166 * [9] 10.5.5.19 A&C reference number (lower nibble)
3168 static guint16
3169 de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3171 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
3172 proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, (offset << 3) + 4, 4, ENC_BIG_ENDIAN);
3174 /* no length check possible */
3175 return (1);
3179 * [9] 10.5.5.19 A&C reference number (higher nibble)
3181 static guint16
3182 de_gmm_ac_ref_nr_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3184 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
3185 proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
3187 /* no length check possible */
3188 return (1);
3192 * [9] 10.5.5.20 Service type
3194 static const value_string gsm_a_gm_serv_type_vals[] = {
3195 { 0x00, "Signalling" },
3196 { 0x01, "Data" },
3197 { 0x02, "Paging response" },
3198 { 0x03, "MBMS Multicast Service Reception" },
3199 { 0x04, "MBMS Broadcast Service Reception" },
3200 { 0, NULL }
3203 static guint16
3204 de_gmm_service_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3206 guint32 bit_offset;
3208 bit_offset = offset << 3;
3209 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3210 bit_offset += 1;
3211 proto_tree_add_bits_item(tree, hf_gsm_a_gm_serv_type, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3212 /*bit_offset += 3;*/
3214 /* no length check possible */
3215 return (1);
3219 * [9] 10.5.5.21 Cell Notification
3220 * No data
3224 * [9] 10.5.5.22 PS LCS Capability
3226 static const true_false_string gsm_a_gm_apc_vals = {
3227 "Additional Positioning Capabilities which can be retrieved by RRLP are supported",
3228 "Additional Positioning Capabilities which can be retrieved by RRLP are not supported"
3231 static const true_false_string gsm_a_gm_otd_a_vals = {
3232 "MS assisted E-OTD supported",
3233 "MS assisted E-OTD not supported"
3236 static const true_false_string gsm_a_gm_otd_b_vals = {
3237 "MS based E-OTD supported",
3238 "MS based E-OTD not supported"
3241 static const true_false_string gsm_a_gm_gps_a_vals = {
3242 "MS assisted GPS supported",
3243 "MS assisted GPS not supported"
3246 static const true_false_string gsm_a_gm_gps_b_vals = {
3247 "MS based GPS supported",
3248 "MS based GPS not supported"
3251 static const true_false_string gsm_a_gm_gps_c_vals = {
3252 "Conventional GPS supported",
3253 "Conventional GPS not supported"
3256 static guint16
3257 de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3259 guint32 curr_offset;
3261 curr_offset = offset;
3262 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 2, ENC_BIG_ENDIAN);
3263 proto_tree_add_item(tree, hf_gsm_a_gm_apc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3264 proto_tree_add_item(tree, hf_gsm_a_gm_otd_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3265 proto_tree_add_item(tree, hf_gsm_a_gm_otd_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3266 proto_tree_add_item(tree, hf_gsm_a_gm_gps_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3267 proto_tree_add_item(tree, hf_gsm_a_gm_gps_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3268 proto_tree_add_item(tree, hf_gsm_a_gm_gps_c, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3270 curr_offset++;
3272 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
3274 return (curr_offset - offset);
3278 * [7] 10.5.5.23
3280 static const true_false_string gsm_a_gm_lcs_molr_value = {
3281 "LCS-MOLR via PS domain supported",
3282 "LCS-MOLR via PS domain not supported"
3284 static const true_false_string gsm_a_gm_ims_vops_value = {
3285 "IMS voice over PS session supported in Iu mode, but not supported in A/Gb mode",
3286 "IMS voice over PS session in Iu mode and A/Gb mode not supported"
3288 static const true_false_string gsm_a_gm_emc_bs_value = {
3289 "Emergency bearer services supported in Iu mode, but not supported in A/Gb mode",
3290 "Emergency bearer services in Iu mode and A/Gb mode not supported"
3292 static guint16
3293 de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3295 guint32 curr_offset;
3297 curr_offset = offset;
3299 proto_tree_add_item(tree, hf_gsm_a_gm_lcs_molr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3300 proto_tree_add_item(tree, hf_gsm_a_gm_mbms, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3301 proto_tree_add_item(tree, hf_gsm_a_gm_ims_vops, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3302 proto_tree_add_item(tree, hf_gsm_a_gm_emc_bs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3303 curr_offset++;
3305 return (curr_offset - offset);
3309 * [7] 10.5.5.23a Additional network feature support
3311 static const true_false_string gsm_a_gm_gprs_sms_value = {
3312 "SMS via GPRS not supported",
3313 "SMS via GPRS supported"
3315 static guint16
3316 de_gmm_add_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3318 guint32 curr_offset;
3320 curr_offset = offset;
3322 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 7, ENC_BIG_ENDIAN);
3323 proto_tree_add_item(tree, hf_gsm_a_gm_gprs_sms, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3324 curr_offset++;
3326 return (curr_offset - offset);
3329 /* [7] 10.5.5.24 Inter RAT information container */
3330 static guint16
3331 de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3333 guint32 curr_offset;
3334 tvbuff_t *rrc_irat_ho_info_tvb;
3336 curr_offset = offset;
3338 /* The value part of the Inter RAT information container information element is the INTER RAT HANDOVER INFO as
3339 defined in 3GPP TS 25.331 [23c]. If this field includes padding bits, they are defined in 3GPP TS 25.331 [23c].*/
3340 rrc_irat_ho_info_tvb = tvb_new_subset(tvb, curr_offset, len, len);
3341 if (rrc_irat_ho_info_handle)
3342 call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, pinfo, tree);
3343 else
3344 proto_tree_add_text(tree, tvb, curr_offset, len, "INTER RAT HANDOVER INFO - Not decoded");
3346 return len;
3350 /* [7] 10.5.5.25 Requested MS information */
3351 static const true_false_string gsm_a_gm_req_ms_info_irat_vals = {
3352 "Inter RAT information container IE requested",
3353 "Inter RAT information container IE not requested"
3355 static const true_false_string gsm_a_gm_req_ms_info_irat2_vals = {
3356 "E-UTRAN inter RAT information container IE requested",
3357 "E-UTRAN inter RAT information container IE not requested"
3360 static guint16
3361 de_gmm_req_ms_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3363 guint32 curr_offset;
3364 guint32 bit_offset;
3366 curr_offset = offset;
3367 bit_offset = (curr_offset<<3)+4;
3369 proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3370 bit_offset++;
3371 proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3372 bit_offset++;
3373 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3374 /*bit_offset += 2;
3375 curr_offset++;*/
3377 return len;
3380 /* [7] 10.5.5.26 UE network capability
3381 * See subclause 9.9.3.x in 3GPP TS 24.301 [120].
3384 /* [7] 10.5.5.27 E-UTRAN inter RAT information container */
3385 static guint16
3386 de_gmm_eutran_irat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3388 guint32 curr_offset;
3389 tvbuff_t *lte_rrc_ue_eutra_cap_tvb;
3391 curr_offset = offset;
3393 /* The value part of the E-UTRAN inter RAT information container information element
3394 is formatted and coded according to the UE-EUTRA-Capability IE defined in 3GPP TS 36.331 [129]*/
3395 lte_rrc_ue_eutra_cap_tvb = tvb_new_subset(tvb, curr_offset, len, len);
3396 if (lte_rrc_ue_eutra_cap_handle)
3397 call_dissector(lte_rrc_ue_eutra_cap_handle, lte_rrc_ue_eutra_cap_tvb, pinfo, tree);
3398 else
3399 proto_tree_add_text(tree, tvb, curr_offset, len, "E-UTRAN Inter RAT information container - Not decoded");
3401 return len;
3404 /* [7] 10.5.5.28 Voice domain preference and UE's usage setting */
3405 static const true_false_string gsm_a_gm_ue_usage_setting_vals = {
3406 "Data centric",
3407 "Voice centric"
3409 static const value_string gsm_a_gm_voice_domain_pref_for_eutran_vals[] = {
3410 {0x0, "CS Voice only"},
3411 {0x1, "IMS PS Voice only"},
3412 {0x2, "CS voice preferred, IMS PS Voice as secondary"},
3413 {0x3, "IMS PS voice preferred, CS Voice as secondary"},
3414 { 0, NULL }
3417 guint16
3418 de_gmm_voice_domain_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3420 guint32 curr_offset;
3421 guint32 bit_offset;
3423 curr_offset = offset;
3424 bit_offset = curr_offset<<3;
3426 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3427 bit_offset += 5;
3428 proto_tree_add_bits_item(tree, hf_gsm_a_gm_ue_usage_setting, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3429 bit_offset++;
3430 proto_tree_add_bits_item(tree, hf_gsm_a_gm_voice_domain_pref_for_eutran, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3431 /*bit_offset += 2;
3432 curr_offset++;*/
3434 return len;
3437 /* [10] 10.5.5.29 P-TMSI type */
3438 static const true_false_string gsm_a_gm_ptmsi_type_value = {
3439 "Mapped P-TMSI",
3440 "Native P-TMSI"
3443 static guint16
3444 de_gmm_ptmsi_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3446 guint32 curr_offset, bit_offset;
3448 curr_offset = offset;
3449 bit_offset = (curr_offset<<3)+4;
3451 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3452 bit_offset += 3;
3453 proto_tree_add_bits_item(tree, hf_gsm_a_gm_ptmsi_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3454 curr_offset++;
3456 return (curr_offset - offset);
3459 /* [10] 10.5.5.30 Location Area Identification 2 */
3460 static guint16
3461 de_gmm_lai_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string, int string_len)
3463 /* The Location Area Identification 2 value is coded as octet 2 to 6 of the */
3464 /* Location Area Identification information element */
3465 return de_lai(tvb, tree, pinfo, offset, len, add_string, string_len);
3468 /* [11] 10.5.5.31 Network resource identifier container */
3469 static guint16
3470 de_gmm_net_res_id_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3472 guint32 curr_offset;
3473 guint32 bit_offset;
3475 curr_offset = offset;
3476 bit_offset = curr_offset<<3;
3478 proto_tree_add_item(tree, hf_gsm_a_gm_nri_cont, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
3479 bit_offset += 10;
3480 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3482 return len;
3486 * [7] 10.5.7.1
3488 static guint16
3489 de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3491 guint8 oct;
3492 guint16 pdp_nr;
3493 guint32 curr_offset;
3495 curr_offset = offset;
3497 oct = tvb_get_guint8(tvb, curr_offset);
3499 for (pdp_nr=0; pdp_nr<16; pdp_nr++)
3501 if (pdp_nr == 8)
3503 curr_offset++;
3504 oct = tvb_get_guint8(tvb, curr_offset);
3506 proto_tree_add_text(tree,
3507 tvb, curr_offset, 1,
3508 "NSAPI %d: %s (%u)", pdp_nr,
3509 pdp_str[oct&1],
3510 oct&1);
3511 oct>>=1;
3514 curr_offset++;
3516 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
3518 return (curr_offset - offset);
3522 * [7] 10.5.7.2
3524 static guint16
3525 de_gc_radio_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3527 guint8 oct;
3528 guint32 curr_offset;
3529 const gchar *str;
3531 curr_offset = offset;
3533 oct = tvb_get_guint8(tvb, curr_offset);
3535 switch (oct&7)
3537 case 1: str = "priority level 1 (highest)"; break;
3538 case 2: str = "priority level 2"; break;
3539 case 3: str = "priority level 3"; break;
3540 case 4: str = "priority level 4 (lowest)"; break;
3541 default: str = "priority level 4 (lowest)";
3544 proto_tree_add_text(tree,
3545 tvb, curr_offset, 1,
3546 "Radio Priority (PDP or SMS): %s (%u)",
3547 str,
3548 oct&7);
3550 curr_offset++;
3552 return (curr_offset - offset);
3556 * [9] 10.5.7.3 GPRS Timer
3558 static const value_string gsm_a_gm_gprs_timer_unit_vals[] = {
3559 { 0x00, "value is incremented in multiples of 2 seconds" },
3560 { 0x01, "value is incremented in multiples of 1 minute" },
3561 { 0x02, "value is incremented in multiples of decihours" },
3562 { 0x07, "value indicates that the timer is deactivated" },
3563 { 0, NULL }
3566 static guint16
3567 de_gc_timer(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3569 guint8 oct;
3570 guint16 val;
3571 const gchar *str;
3572 proto_tree *subtree;
3573 proto_item *item = NULL;
3575 oct = tvb_get_guint8(tvb, offset);
3576 val = oct&0x1f;
3578 switch (oct>>5)
3580 case 0: str = "sec"; val*=2; break;
3581 case 1: str = "min"; break;
3582 case 2: str = "min"; val*=6; break;
3583 case 7: str = "";
3584 item = proto_tree_add_text(tree, tvb, offset, 1,
3585 "GPRS Timer: timer is deactivated");
3586 break;
3587 default: str = "min";
3590 if (item == NULL) {
3591 item = proto_tree_add_text(tree, tvb, offset, 1,
3592 "GPRS Timer: %u %s", val, str);
3595 subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
3596 proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
3597 proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN);
3599 /* no length check possible */
3600 return (1);
3604 * [7] 10.5.7.4
3606 static guint16
3607 de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
3609 guint8 oct;
3610 guint16 val;
3611 guint32 curr_offset;
3612 const gchar *str = NULL;
3613 proto_tree *subtree;
3614 proto_item *item = NULL;
3616 curr_offset = offset;
3618 oct = tvb_get_guint8(tvb, curr_offset);
3620 val = oct&0x1f;
3622 switch (oct>>5)
3624 case 0: str = "sec"; val*=2; break;
3625 case 1: str = "min"; break;
3626 case 2: str = "min"; val*=6; break;
3627 case 7:
3628 item = proto_tree_add_text(tree, tvb, curr_offset, 1,
3629 "GPRS Timer: timer is deactivated");
3630 break;
3631 default: str = "min";
3634 if (item == NULL) {
3635 item = proto_tree_add_text(tree, tvb, curr_offset, 1,
3636 "GPRS Timer: %u %s %s",
3637 val, str, add_string ? add_string : "");
3640 subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
3641 proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer2_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
3642 proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer2_value, tvb, offset, 1, ENC_BIG_ENDIAN);
3643 curr_offset++;
3645 return (curr_offset - offset);
3649 * [10] 10.5.7.4a
3651 static const value_string gsm_a_gm_gprs_timer3_unit_vals[] = {
3652 { 0x00, "value is incremented in multiples of 10 minutes" },
3653 { 0x01, "value is incremented in multiples of 1 hour" },
3654 { 0x02, "value is incremented in multiples of 10 hours" },
3655 { 0x03, "value is incremented in multiples of 2 seconds" },
3656 { 0x04, "value is incremented in multiples of 30 seconds" },
3657 { 0x05, "value is incremented in multiples of 1 minute" },
3658 { 0x07, "value indicates that the timer is deactivated" },
3659 { 0, NULL }
3662 static guint16
3663 de_gc_timer3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3665 guint8 oct;
3666 guint16 val;
3667 guint32 curr_offset;
3668 const gchar *str = NULL;
3669 proto_tree *subtree;
3670 proto_item *item = NULL;
3672 curr_offset = offset;
3674 oct = tvb_get_guint8(tvb, curr_offset);
3676 val = oct&0x1f;
3678 switch (oct>>5)
3680 case 0: str = "min"; val*=10; break;
3681 case 1: str = "hr"; break;
3682 case 2: str = "hr"; val*=10; break;
3683 case 3: str = "sec"; val*=2; break;
3684 case 4: str = "sec"; val*=30; break;
3685 case 5: str = "min"; break;
3686 case 7:
3687 item = proto_tree_add_text(tree, tvb, curr_offset, 1,
3688 "GPRS Timer: timer is deactivated");
3689 break;
3690 default: str = "hr";
3693 if (item == NULL) {
3694 item = proto_tree_add_text(tree, tvb, curr_offset, 1,
3695 "GPRS Timer: %u %s", val, str);
3698 subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
3699 proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer3_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
3700 proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer3_value, tvb, offset, 1, ENC_BIG_ENDIAN);
3701 curr_offset++;
3703 return (curr_offset - offset);
3707 * [7] 10.5.7.5
3709 static guint16
3710 de_gc_radio_prio2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3712 guint8 oct;
3713 guint32 curr_offset;
3714 const gchar *str;
3716 curr_offset = offset;
3718 oct = tvb_get_guint8(tvb, curr_offset);
3720 /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
3721 oct >>= 4;
3723 switch (oct&7)
3725 case 1: str = "priority level 1 (highest)"; break;
3726 case 2: str = "priority level 2"; break;
3727 case 3: str = "priority level 3"; break;
3728 case 4: str = "priority level 4 (lowest)"; break;
3729 default: str = "priority level 4 (lowest)";
3732 proto_tree_add_text(tree,
3733 tvb, curr_offset, 1,
3734 "Radio Priority (TOM8): %s (%u)",
3735 str,
3736 oct&7);
3738 curr_offset++;
3740 return (curr_offset - offset);
3744 * [8] 10.5.7.6 MBMS context status
3746 static guint16
3747 de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3749 guint32 curr_offset;
3750 guint i;
3751 guint8 oct, j;
3753 curr_offset = offset;
3755 for (i=0; i<len; i++)
3757 oct = tvb_get_guint8(tvb, curr_offset);
3759 for (j=0; j<8; j++)
3761 proto_tree_add_text(tree,
3762 tvb, curr_offset, 1,
3763 "NSAPI %d: %s (%u)", 128+i*8+j,
3764 pdp_str[oct&1],
3765 oct&1);
3766 oct>>=1;
3768 curr_offset++;
3771 return (len);
3775 * [8] 10.5.7.7 Uplink data status
3777 static const true_false_string gsm_a_gm_nsapi_ul_stat_vals = {
3778 "uplink data are pending for the preserved PDP context",
3779 "no uplink data are pending for the preserved PDP context or the PDP context is PDP-INACTIVE or is PDP-ACTIVE with a RAB already established"
3782 static guint16
3783 de_gc_uplink_data_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3785 guint32 curr_offset;
3786 guint32 bit_offset;
3788 curr_offset = offset;
3789 bit_offset = curr_offset<<3;
3791 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_7_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3792 bit_offset++;
3793 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_6_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3794 bit_offset++;
3795 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_5_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3796 bit_offset++;
3797 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3798 bit_offset += 5;
3799 curr_offset++;
3800 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_15_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3801 bit_offset++;
3802 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_14_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3803 bit_offset++;
3804 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_13_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3805 bit_offset++;
3806 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_12_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3807 bit_offset++;
3808 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_11_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3809 bit_offset++;
3810 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_10_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3811 bit_offset++;
3812 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_9_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3813 bit_offset++;
3814 proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_8_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3816 bit_offset++;
3817 curr_offset++;
3819 return (len);
3823 * [8] 10.5.7.8 Device properties
3825 static const true_false_string gsm_a_gm_device_prop_low_prio_value = {
3826 "MS is configured for NAS signalling low priority",
3827 "MS is not configured for NAS signalling low priority"
3830 static guint16
3831 de_gc_device_properties(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
3833 guint32 curr_offset;
3834 guint32 bit_offset;
3836 curr_offset = offset;
3837 bit_offset = (curr_offset<<3)+4;
3839 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3840 bit_offset += 3;
3841 proto_tree_add_bits_item(tree, hf_gsm_a_gm_device_prop_low_prio, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3842 curr_offset++;
3844 return (curr_offset - offset);
3848 * [7] 10.5.6.1
3850 #define MAX_APN_LENGTH 100
3852 guint16
3853 de_sm_apn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3855 guint32 curr_offset;
3856 guint curr_len;
3857 guint8 str[MAX_APN_LENGTH+1];
3859 curr_offset = offset;
3861 /* init buffer and copy it */
3862 memset(str, 0, MAX_APN_LENGTH);
3863 tvb_memcpy(tvb, str, offset, len<MAX_APN_LENGTH?len:MAX_APN_LENGTH);
3865 curr_len = 0;
3866 while ((curr_len < len) && (curr_len < MAX_APN_LENGTH))
3868 guint step = str[curr_len];
3869 str[curr_len] = '.';
3870 curr_len += step+1;
3873 /* High light bytes including the first lenght byte */
3874 proto_tree_add_string(tree, hf_gsm_a_gm_apn, tvb, curr_offset, len, str+1);
3875 curr_offset += len;
3877 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
3879 return (curr_offset - offset);
3883 * [7] 10.5.6.2
3885 static guint16
3886 de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string, int string_len _U_)
3888 guint8 oct;
3889 guint32 curr_offset;
3891 curr_offset = offset;
3893 oct = tvb_get_guint8(tvb, curr_offset);
3895 proto_tree_add_text(tree,
3896 tvb, curr_offset, 1,
3897 "NSAPI: 0x%02x (%u) %s",
3898 oct&0x0f, oct&0x0f, add_string ? add_string : "");
3900 curr_offset++;
3902 return (curr_offset - offset);
3906 * [7] 10.5.6.3 Protocol configuration options
3908 static const range_string gsm_a_sm_pco_ms2net_prot_vals[] = {
3909 { 0x0001, 0x0001, "P-CSCF IPv6 Address Request" },
3910 { 0x0002, 0x0002, "IM CN Subsystem Signalling Flag" },
3911 { 0x0003, 0x0003, "DNS Server IPv6 Address Request" },
3912 { 0x0004, 0x0004, "Not Supported" },
3913 { 0x0005, 0x0005, "MS Support of Network Requested Bearer Control indicator" },
3914 { 0x0006, 0x0006, "Reserved" },
3915 { 0x0007, 0x0007, "DSMIPv6 Home Agent Address Request" },
3916 { 0x0008, 0x0008, "DSMIPv6 Home Network Prefix Request" },
3917 { 0x0009, 0x0009, "DSMIPv6 IPv4 Home Agent Address Request" },
3918 { 0x000a, 0x000a, "IP address allocation via NAS signalling" },
3919 { 0x000b, 0x000b, "IPv4 address allocation via DHCPv4" },
3920 { 0x000c, 0x000c, "P-CSCF IPv4 Address Request" },
3921 { 0x000d, 0x000d, "DNS Server IPv4 Address Request" },
3922 { 0x000e, 0x000e, "MSISDN Request" },
3923 { 0x000f, 0x000f, "IFOM-Support-Request" },
3924 { 0x0010, 0x0010, "IPv4 Link MTU Request" },
3925 { 0x0011, 0x0011, "MS support of Local address in TFT indicator" },
3926 { 0xff00, 0xffff, "Operator Specific Use" },
3927 { 0, 0, NULL }
3929 static const range_string gsm_a_sm_pco_net2ms_prot_vals[] = {
3930 { 0x0001, 0x0001, "P-CSCF IPv6 Address" },
3931 { 0x0002, 0x0002, "IM CN Subsystem Signalling Flag" },
3932 { 0x0003, 0x0003, "DNS Server IPv6 Address" },
3933 { 0x0004, 0x0004, "Policy Control rejection code" },
3934 { 0x0005, 0x0005, "Selected Bearer Control Mode" },
3935 { 0x0006, 0x0006, "Reserved" },
3936 { 0x0007, 0x0007, "DSMIPv6 Home Agent Address" },
3937 { 0x0008, 0x0008, "DSMIPv6 Home Network Prefix" },
3938 { 0x0009, 0x0009, "DSMIPv6 IPv4 Home Agent Address" },
3939 { 0x000a, 0x000a, "Reserved" },
3940 { 0x000b, 0x000b, "Reserved" },
3941 { 0x000c, 0x000c, "P-CSCF IPv4 Address" },
3942 { 0x000d, 0x000d, "DNS Server IPv4 Address" },
3943 { 0x000e, 0x000e, "MSISDN" },
3944 { 0x000f, 0x000f, "IFOM-Support" },
3945 { 0x0010, 0x0010, "IPv4 Link MTU" },
3946 { 0x0011, 0x0011, "Network support of Local address in TFT indicator" },
3947 { 0xff00, 0xffff, "Operator Specific Use" },
3948 { 0, 0, NULL }
3951 static const value_string gsm_a_gm_link_dir_vals[] = {
3952 { -1, "Unknown" },
3953 { 0x0, "MS to network" },
3954 { 0x1, "Network to MS" },
3955 { 0, NULL }
3958 guint16
3959 de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
3961 proto_item *generated_item;
3962 guint32 curr_offset;
3963 guint curr_len;
3964 guchar oct;
3965 struct e_in6_addr ipv6_addrx;
3966 int link_dir;
3967 guint32 ipv4_addrx;
3968 proto_item *pco_item;
3969 proto_tree *pco_tree;
3971 curr_len = len;
3972 curr_offset = offset;
3974 oct = tvb_get_guint8(tvb, curr_offset);
3976 link_dir = pinfo->link_dir;
3977 generated_item = proto_tree_add_int(tree, hf_gsm_a_gm_link_dir, tvb, curr_offset, 0, link_dir);
3978 PROTO_ITEM_SET_GENERATED(generated_item);
3981 /* 1 ext 0 0 0 0 Spare Configuration protocol */
3982 proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3983 /* Configuration protocol (octet 3)
3984 * Bits
3985 * 3 2 1
3986 * 0 0 0 PPP for use with IP PDP type or IP PDN type (see 3GPP TS 24.301 [120])
3988 * All other values are interpreted as PPP in this version of the protocol.
3989 * (3GPP TS 24.008 version 9.4.0 Release 9)
3991 proto_tree_add_text(tree, tvb, curr_offset, 1, "Configuration Protocol: PPP for use with IP PDP type or IP PDN type (%u)", oct&0x07);
3992 curr_len--;
3993 curr_offset++;
3995 while (curr_len > 0)
3997 guchar e_len;
3998 guint16 prot;
3999 tvbuff_t *l3_tvb;
4001 /* Protocol ID 1 octet 4
4002 * octet 5
4003 * Length of protocol ID 1 contents octet 6
4004 * Protocol ID 1 contents octet 7
4007 prot = tvb_get_ntohs(tvb, curr_offset);
4008 pco_item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_pco_pid, tvb, curr_offset, 2, (guint32)prot,
4009 "%s (0x%04x)",
4010 link_dir ?
4011 rval_to_str((guint32)prot, gsm_a_sm_pco_net2ms_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")) :
4012 rval_to_str((guint32)prot, gsm_a_sm_pco_ms2net_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")),
4013 (guint32)prot);
4014 pco_tree = proto_item_add_subtree(pco_item, ett_sm_pco);
4016 curr_len -= 2;
4017 curr_offset += 2;
4018 e_len = tvb_get_guint8(tvb, curr_offset);
4019 proto_tree_add_text(pco_tree, tvb, curr_offset, 1, "Length: 0x%02x (%u)", e_len, e_len);
4020 curr_len -= 1;
4021 curr_offset += 1;
4023 switch (prot)
4025 case 0x0001:
4026 case 0x0003:
4027 case 0x0007:
4028 if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4029 tvb_get_ipv6(tvb, curr_offset, &ipv6_addrx);
4030 proto_tree_add_text(pco_tree, tvb, curr_offset, 16, "IPv6: %s", ip6_to_str(&ipv6_addrx));
4032 break;
4033 case 0x0002:
4034 case 0x0006:
4035 case 0x000A:
4036 case 0x000B:
4037 case 0x000F:
4038 case 0x0011:
4039 break;
4040 case 0x0004:
4041 if ((link_dir == P2P_DIR_DL) && (e_len == 1)) {
4042 oct = tvb_get_guint8(tvb, curr_offset);
4043 proto_tree_add_text(pco_tree, tvb, curr_offset, 1, "Reject Code: 0x%02x (%u)", oct, oct);
4045 break;
4046 case 0x0005:
4047 if ((link_dir == P2P_DIR_DL) && (e_len == 1)) {
4048 oct = tvb_get_guint8(tvb, curr_offset);
4049 proto_tree_add_text(pco_tree, tvb, curr_offset, 1, "%s", (oct == 1) ? "MS only" :
4050 ((oct == 2) ? "MS/NW" : "Unknown"));
4052 break;
4053 case 0x0008:
4054 if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4055 tvb_get_ipv6(tvb, curr_offset, &ipv6_addrx);
4056 proto_tree_add_text(pco_tree, tvb, curr_offset, 16, "IPv6: %s", ip6_to_str(&ipv6_addrx));
4057 oct = tvb_get_guint8(tvb, curr_offset+16);
4058 proto_tree_add_text(pco_tree, tvb, curr_offset+16, 1, "Prefix length: %u", oct);
4060 break;
4061 case 0x0009:
4062 case 0x000C:
4063 case 0x000D:
4064 if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4065 ipv4_addrx = tvb_get_ipv4(tvb, curr_offset);
4066 proto_tree_add_text(pco_tree, tvb, curr_offset, 4, "IPv4: %s",
4067 ip_to_str((guint8 *)&ipv4_addrx));
4069 break;
4070 case 0x0010:
4071 if ((link_dir == P2P_DIR_DL) && (e_len == 2)) {
4072 guint16 word = tvb_get_ntohs(tvb, curr_offset);
4073 proto_tree_add_text(pco_tree, tvb, curr_offset, 2, "IPv4 link MTU size: %u octets", word);
4075 break;
4076 default:
4078 if (e_len > 0) {
4079 if (prot >= 0xff00) {
4080 dissect_e212_mcc_mnc(tvb, pinfo, pco_tree, curr_offset, TRUE);
4081 if ((e_len - 3) > 0) {
4082 proto_tree_add_item(pco_tree, hf_gsm_a_gm_pco_app_spec_info, tvb, curr_offset+3, e_len-3, ENC_NA);
4084 } else {
4085 dissector_handle_t handle;
4086 handle = dissector_get_uint_handle (gprs_sm_pco_subdissector_table, prot);
4087 if (handle != NULL)
4090 * dissect the embedded message
4092 l3_tvb = tvb_new_subset(tvb, curr_offset, e_len, e_len);
4093 /* In this case we do not want the columns updated */
4094 col_set_writable(pinfo->cinfo, FALSE);
4095 call_dissector(handle, l3_tvb, pinfo, pco_tree);
4096 col_set_writable(pinfo->cinfo, TRUE);
4098 else
4101 * dissect the embedded DATA message
4103 l3_tvb = tvb_new_subset(tvb, curr_offset, e_len, e_len);
4104 call_dissector(data_handle, l3_tvb, pinfo, pco_tree);
4111 curr_len -= e_len;
4112 curr_offset += e_len;
4114 curr_offset += curr_len;
4116 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4118 return (curr_offset - offset);
4122 * [9] 10.5.6.4 Packet data protocol address
4124 static const value_string gsm_a_sm_pdp_type_org_vals[] = {
4125 { 0x00, "ETSI allocated address" },
4126 { 0x01, "IETF allocated address" },
4127 { 0x0f, "Empty PDP type" },
4128 { 0, NULL }
4131 static guint16
4132 de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
4134 guint32 curr_offset;
4135 const gchar *str;
4136 guchar pdp_type_org, pdp_type_num;
4138 curr_offset = offset;
4140 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, ENC_BIG_ENDIAN);
4141 proto_tree_add_item(tree, hf_gsm_a_sm_pdp_type_org, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4143 pdp_type_org = tvb_get_guint8(tvb, curr_offset) & 0x0f;
4144 curr_offset += 1;
4145 pdp_type_num = tvb_get_guint8(tvb, curr_offset);
4147 if (pdp_type_org == 0)
4149 /* ETSI allocated address */
4150 switch (pdp_type_num)
4152 case 0x00: str = "Reserved, used in earlier version of this protocol"; break;
4153 case 0x01: str = "PDP-type PPP"; break;
4154 default: str = "reserved";
4157 else if (pdp_type_org == 1)
4159 /* IETF allocated address */
4160 switch (pdp_type_num)
4162 case 0x21: str = "IPv4 address"; break;
4163 case 0x57: str = "IPv6 address"; break;
4164 case 0x8d: str = "IPv4v6 address"; break;
4165 default: str = "Unknown, interpreted as IPv4 address";
4168 else if ((pdp_type_num == 0) && (pdp_type_org == 0x0f))
4169 str = "Empty";
4170 else
4171 str = "Not specified";
4173 proto_tree_add_text(tree,
4174 tvb, curr_offset, 1,
4175 "PDP type number: %s (%u)", str, pdp_type_num);
4177 if ((len == 2) && ((pdp_type_num == 0x21) || (pdp_type_num == 0x57) || (pdp_type_num == 0x8d)))
4179 proto_tree_add_text(tree,
4180 tvb, curr_offset, 1,
4181 "Dynamic addressing");
4182 curr_offset += 1;
4183 return (curr_offset - offset);
4185 else if (len == 2)
4187 proto_tree_add_text(tree,
4188 tvb, curr_offset, 1,
4189 "No PDP address is included");
4190 curr_offset += 1;
4191 return (curr_offset - offset);
4194 curr_offset += 1;
4195 if (pdp_type_org == 1)
4196 switch (pdp_type_num)
4198 case 0x57:
4199 proto_tree_add_item(tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
4200 curr_offset += 16;
4201 break;
4203 case 0x8d:
4204 proto_tree_add_item(tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
4205 curr_offset += 4;
4206 proto_tree_add_item(tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
4207 curr_offset += 16;
4208 break;
4210 default:
4211 proto_tree_add_item(tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
4212 curr_offset += 4;
4215 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4217 return (curr_offset - offset);
4221 * [9] 10.5.6.5 Quality of service
4223 static const value_string gsm_a_sm_qos_delay_cls_vals[] = {
4224 { 0x00, "Subscribed delay class (in MS to network direction)" },
4225 { 0x01, "Delay class 1" },
4226 { 0x02, "Delay class 2" },
4227 { 0x03, "Delay class 3" },
4228 { 0x04, "Delay class 4 (best effort)" },
4229 { 0x07, "Reserved" },
4230 { 0, NULL }
4233 static const value_string gsm_a_sm_qos_reliability_vals[] = {
4234 { 0x00, "Subscribed reliability class (in MS to network direction)" },
4235 { 0x01, "Acknowledged GTP, LLC, and RLC; Protected data" },
4236 { 0x02, "Unacknowledged GTP, Ack LLC/RLC, Protected data" },
4237 { 0x03, "Unacknowledged GTP/LLC, Ack RLC, Protected data" },
4238 { 0x04, "Unacknowledged GTP/LLC/RLC, Protected data" },
4239 { 0x05, "Unacknowledged GTP/LLC/RLC, Unprotected data" },
4240 { 0x07, "Reserved" },
4241 { 0, NULL }
4243 /* Delivery of erroneous SDUs, octet 6 (see 3GPP TS 23.107) Bits 3 2 1 */
4244 const value_string gsm_a_sm_qos_del_of_err_sdu_vals[] = {
4245 { 0, "Subscribed delivery of erroneous SDUs/Reserved" },
4246 { 1, "No detect('-')" },
4247 { 2, "Erroneous SDUs are delivered('yes')" },
4248 { 3, "Erroneous SDUs are not delivered('No')" },
4249 { 7, "Reserved" },
4250 { 0, NULL }
4253 /* Delivery order, octet 6 (see 3GPP TS 23.107) Bits 5 4 */
4254 const value_string gsm_a_sm_qos_del_order_vals[] = {
4255 { 0, "Subscribed delivery order/Reserved" },
4256 { 1, "With delivery order ('yes')" },
4257 { 2, "Without delivery order ('no')" },
4258 { 3, "Reserved" },
4259 { 0, NULL }
4261 /* Traffic class, octet 6 (see 3GPP TS 23.107) Bits 8 7 6 */
4262 const value_string gsm_a_sm_qos_traffic_cls_vals[] = {
4263 { 0, "Subscribed traffic class/Reserved" },
4264 { 1, "Conversational class" },
4265 { 2, "Streaming class" },
4266 { 3, "Interactive class" },
4267 { 4, "Background class" },
4268 { 7, "Reserved" },
4269 { 0, NULL }
4272 /* Residual Bit Error Rate (BER), octet 10 (see 3GPP TS 23.107) Bits 8 7 6 5 */
4273 const value_string gsm_a_sm_qos_ber_vals[] = {
4274 { 0, "Subscribed residual BER/Reserved" },
4275 { 1, "5*10-2" },
4276 { 2, "1*10-2" },
4277 { 3, "5*10-3" },
4278 { 4, "4*10-3" },
4279 { 5, "1*10-3" },
4280 { 6, "1*10-4" },
4281 { 7, "1*10-5" },
4282 { 8, "1*10-6" },
4283 { 9, "6*10-8" },
4284 { 10, "Reserved" },
4285 { 0, NULL }
4288 /* SDU error ratio, octet 10 (see 3GPP TS 23.107) Bits 4 3 2 1 */
4289 const value_string gsm_a_sm_qos_sdu_err_rat_vals[] = {
4290 { 0, "Subscribed SDU error ratio/Reserved" },
4291 { 1, "1*10-2" },
4292 { 2, "7*10-3" },
4293 { 3, "1*10-3" },
4294 { 4, "1*10-4" },
4295 { 5, "1*10-5" },
4296 { 6, "1*10-6" },
4297 { 7, "1*10-1" },
4298 { 15, "Reserved" },
4299 { 0, NULL }
4302 /* Traffic handling priority, octet 11 (see 3GPP TS 23.107) Bits 2 1 */
4303 const value_string gsm_a_sm_qos_traff_hdl_pri_vals[] = {
4304 { 0, "Subscribed traffic handling priority/Reserved" },
4305 { 1, "Priority level 1" },
4306 { 2, "Priority level 2" },
4307 { 3, "Priority level 3" },
4308 { 0, NULL }
4311 const range_string gsm_a_sm_qos_peak_thr_vals[] = {
4312 { 0x00, 0x00, "Subscribed peak throughput/reserved" },
4313 { 0x01, 0x01, "Up to 1 000 octet/s" },
4314 { 0x02, 0x02, "Up to 2 000 octet/s" },
4315 { 0x03, 0x03, "Up to 4 000 octet/s" },
4316 { 0x04, 0x04, "Up to 8 000 octet/s" },
4317 { 0x05, 0x05, "Up to 16 000 octet/s" },
4318 { 0x06, 0x06, "Up to 32 000 octet/s" },
4319 { 0x07, 0x07, "Up to 64 000 octet/s" },
4320 { 0x08, 0x08, "Up to 128 000 octet/s" },
4321 { 0x09, 0x09, "Up to 256 000 octet/s" },
4322 { 0x0a, 0x0e, "Interpreted as Up to 1 000 octet/s" },
4323 { 0x0f, 0x0f, "Reserved" },
4324 { 0, 0, NULL }
4327 const range_string gsm_a_sm_qos_mean_thr_vals[] = {
4328 { 0x00, 0x00, "Subscribed peak throughput/reserved" },
4329 { 0x01, 0x01, "100 octet/h" },
4330 { 0x02, 0x02, "200 octet/h" },
4331 { 0x03, 0x03, "500 octet/h" },
4332 { 0x04, 0x04, "1 000 octet/h" },
4333 { 0x05, 0x05, "2 000 octet/h" },
4334 { 0x06, 0x06, "5 000 octet/h" },
4335 { 0x07, 0x07, "10 000 octet/h" },
4336 { 0x08, 0x08, "20 000 octet/h" },
4337 { 0x09, 0x09, "50 000 octet/h" },
4338 { 0x0a, 0x0a, "100 000 octet/h" },
4339 { 0x0b, 0x0b, "200 000 octet/h" },
4340 { 0x0c, 0x0c, "500 000 octet/h" },
4341 { 0x0d, 0x0d, "1 000 000 octet/h" },
4342 { 0x0e, 0x0e, "2 000 000 octet/h" },
4343 { 0x0f, 0x0f, "5 000 000 octet/h" },
4344 { 0x10, 0x10, "10 000 000 octet/h" },
4345 { 0x11, 0x11, "20 000 000 octet/h" },
4346 { 0x12, 0x12, "50 000 000 octet/h" },
4347 { 0x13, 0x1d, "Interpreted as Best effort" },
4348 { 0x1e, 0x1e, "Reserved" },
4349 { 0x1f, 0x1f, "Best effort" },
4350 { 0, 0, NULL }
4353 const range_string gsm_a_sm_qos_prec_class_vals[] = {
4354 { 0x00, 0x00, "Subscribed precedence/reserved" },
4355 { 0x01, 0x01, "High priority" },
4356 { 0x02, 0x02, "Normal priority" },
4357 { 0x03, 0x03, "Low priority" },
4358 { 0x04, 0x06, "Interpreted as Normal priority" },
4359 { 0x07, 0x07, "Reserved" },
4360 { 0, 0, NULL }
4363 const true_false_string gsm_a_sm_qos_signalling_ind_value = {
4364 "Optimised for signalling traffic",
4365 "Not optimised for signalling traffic"
4368 /* Helper function returning the main bitrates in kbps */
4369 static guint32
4370 qos_calc_bitrate(guint8 oct)
4372 if (oct <= 0x3f)
4373 return oct;
4374 if (oct <= 0x7f)
4375 return 64 + (oct-0x40) * 8;
4377 return 576 + (oct-0x80) * 64;
4380 /* Helper function returning the extended bitrates in kbps */
4381 static guint32
4382 qos_calc_ext_bitrate(guint8 oct)
4384 if (oct <= 0x4a)
4385 return 8600 + oct * 100;
4386 if (oct <= 0xba)
4387 return 16000 + (oct-0x4a) * 1000;
4389 return 128000 + (oct - 0xba) * 2000;
4392 static guint32
4393 qos_calc_ext2_bitrate(guint8 oct)
4395 if (oct <= 0x3d)
4396 return (256 + oct * 4);
4397 if (oct <= 0xa1)
4398 return (500 + (oct-0x3d) * 10);
4399 if (oct <= 0xf6)
4400 return (1500 + (oct-0xa1) * 100);
4402 return 10000;
4406 * 10.5.6.5 Quality of service
4408 guint16
4409 de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
4411 guint32 curr_offset;
4412 guchar oct, tmp_oct;
4413 const gchar *str;
4414 guint32 temp32;
4416 curr_offset = offset;
4418 /* Octet 3 */
4419 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, ENC_BIG_ENDIAN);
4420 proto_tree_add_item(tree, hf_gsm_a_sm_qos_delay_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4421 proto_tree_add_item(tree, hf_gsm_a_sm_qos_reliability_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4422 curr_offset += 1;
4424 /* Octet 4 */
4425 proto_tree_add_item(tree, hf_gsm_a_sm_qos_peak_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4426 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, ENC_BIG_ENDIAN);
4427 proto_tree_add_item(tree, hf_gsm_a_sm_qos_prec_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4428 curr_offset += 1;
4430 /* Octet 5 */
4431 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
4432 proto_tree_add_item(tree, hf_gsm_a_sm_qos_mean_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4433 curr_offset += 1;
4435 NO_MORE_DATA_CHECK(len);
4437 /* Octet 6 */
4438 proto_tree_add_item(tree, hf_gsm_a_sm_qos_traffic_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4439 proto_tree_add_item(tree, hf_gsm_a_sm_qos_del_order, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4440 proto_tree_add_item(tree, hf_gsm_a_sm_qos_del_of_err_sdu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4441 curr_offset += 1;
4443 NO_MORE_DATA_CHECK(len);
4445 /* Octet 7 */
4446 oct = tvb_get_guint8(tvb, curr_offset);
4448 switch (oct)
4450 case 0x00: str = "Subscribed maximum SDU size/reserved"; break;
4451 case 0x97: str = "1502 octets"; break;
4452 case 0x98: str = "1510 octets"; break;
4453 case 0x99: str = "1520 octets"; break;
4454 case 0xff: str = "Reserved"; break;
4455 default: str = "Unspecified";
4458 if ((oct >= 1) && (oct <= 0x96))
4459 proto_tree_add_text(tree,
4460 tvb, curr_offset, 1,
4461 "Maximum SDU size: %u octets (%u)", oct*10, oct);
4462 else
4463 proto_tree_add_text(tree,
4464 tvb, curr_offset, 1,
4465 "Maximum SDU size: %s (%u)", str, oct);
4467 curr_offset += 1;
4469 NO_MORE_DATA_CHECK(len);
4471 /* Octet 8 */
4472 oct = tvb_get_guint8(tvb, curr_offset);
4474 switch (oct)
4476 case 0x00: str = "Subscribed maximum bit rate for uplink/reserved"; break;
4477 case 0xff: str = "0 kbps"; break;
4478 default: str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", qos_calc_bitrate(oct));
4481 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_upl, tvb,
4482 curr_offset, 1, oct, "%s (%u)", str, oct);
4483 curr_offset += 1;
4485 NO_MORE_DATA_CHECK(len);
4487 /* Octet 9 */
4488 oct = tvb_get_guint8(tvb, curr_offset);
4490 switch (oct)
4492 case 0x00: str = "Subscribed maximum bit rate for downlink/reserved"; break;
4493 case 0xff: str = "0 kbps"; break;
4494 default: str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", qos_calc_bitrate(oct));
4497 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl, tvb,
4498 curr_offset, 1, oct, "%s (%u)", str, oct);
4499 curr_offset += 1;
4501 NO_MORE_DATA_CHECK(len);
4503 /* Octet 10 */
4504 proto_tree_add_item(tree, hf_gsm_a_sm_qos_ber, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4505 proto_tree_add_item(tree, hf_gsm_a_sm_qos_sdu_err_rat, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4507 curr_offset += 1;
4508 NO_MORE_DATA_CHECK(len);
4510 /* Octet 11 */
4511 oct = tvb_get_guint8(tvb, curr_offset);
4513 tmp_oct = oct>>2;
4514 switch (tmp_oct)
4516 case 0x00: str = "Subscribed transfer delay/reserved"; break;
4517 case 0x3f: str = "Reserved"; break;
4518 default:
4519 if (tmp_oct <= 0x0f)
4520 temp32 = tmp_oct * 10;
4521 else if (tmp_oct <= 0x1f)
4522 temp32 = (tmp_oct - 0x10) * 50 + 200;
4523 else
4524 temp32 = (tmp_oct - 0x20) * 100 + 1000;
4525 str = wmem_strdup_printf(wmem_packet_scope(), "%u ms", temp32);
4528 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_trans_delay, tvb,
4529 curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
4531 proto_tree_add_item(tree, hf_gsm_a_sm_qos_traff_hdl_pri, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4533 curr_offset += 1;
4534 NO_MORE_DATA_CHECK(len);
4536 /* Octet 12 */
4537 oct = tvb_get_guint8(tvb, curr_offset);
4539 switch (oct)
4541 case 0x00: str = "Subscribed guaranteed bit rate for uplink/reserved"; break;
4542 case 0xff: str = "0 kbps"; break;
4543 default: str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", qos_calc_bitrate(oct));
4546 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_upl, tvb,
4547 curr_offset, 1, oct, "%s (%u)", str, oct);
4549 curr_offset += 1;
4550 NO_MORE_DATA_CHECK(len);
4552 /* Octet 13 */
4553 oct = tvb_get_guint8(tvb, curr_offset);
4555 switch (oct)
4557 case 0x00: str = "Subscribed guaranteed bit rate for downlink/reserved"; break;
4558 case 0xff: str = "0 kbps"; break;
4559 default: str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", qos_calc_bitrate(oct));
4562 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_downl, tvb,
4563 curr_offset, 1, oct, "%s (%u)", str, oct);
4565 curr_offset += 1;
4566 NO_MORE_DATA_CHECK(len);
4568 /* Ocet 14 */
4569 oct = tvb_get_guint8(tvb, curr_offset);
4570 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
4571 proto_tree_add_item(tree, hf_gsm_a_sm_qos_signalling_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4573 tmp_oct = oct & 7;
4574 if (tmp_oct == 0x01)
4575 str = "speech";
4576 else
4577 str = "unknown";
4579 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_source_stat_desc, tvb,
4580 curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
4582 curr_offset += 1;
4583 NO_MORE_DATA_CHECK(len);
4585 /* Octet 15 */
4586 oct = tvb_get_guint8(tvb, curr_offset);
4588 if (oct == 0x00)
4589 str = "Use the value indicated by the Maximum bit rate for downlink";
4590 else
4592 temp32 = qos_calc_ext_bitrate(oct);
4593 if (temp32 % 1000 == 0)
4594 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32 / 1000);
4595 else
4596 str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", temp32);
4598 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl_ext, tvb,
4599 curr_offset, 1, oct, "%s (%u)", str, oct);
4601 curr_offset += 1;
4602 NO_MORE_DATA_CHECK(len);
4604 /* Octet 16 */
4605 oct = tvb_get_guint8(tvb, curr_offset);
4607 if (oct == 0x00)
4608 str = "Use the value indicated by the Guaranteed bit rate for downlink";
4609 else
4611 temp32 = qos_calc_ext_bitrate(oct);
4612 if (temp32 % 1000 == 0)
4613 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32 / 1000);
4614 else
4615 str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", temp32);
4617 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_downl_ext, tvb,
4618 curr_offset, 1, oct, "%s (%u)", str, oct);
4620 curr_offset += 1;
4621 NO_MORE_DATA_CHECK(len);
4623 /* Maximum bit rate for uplink (extended) Octet 17 */
4624 oct = tvb_get_guint8(tvb, curr_offset);
4626 if (oct == 0x00)
4627 str = "Use the value indicated by the Maximum bit rate for uplink";
4628 else
4630 temp32 = qos_calc_ext_bitrate(oct);
4631 if (temp32 % 1000 == 0)
4632 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32 / 1000);
4633 else
4634 str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", temp32);
4636 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_upl_ext, tvb,
4637 curr_offset, 1, oct, "%s (%u)", str, oct);
4639 curr_offset += 1;
4640 NO_MORE_DATA_CHECK(len);
4642 /* Guaranteed bit rate for uplink (extended) Octet 18 */
4643 oct = tvb_get_guint8(tvb, curr_offset);
4645 if (oct == 0x00)
4646 str = "Use the value indicated by the Guaranteed bit rate for uplink";
4647 else
4649 temp32 = qos_calc_ext_bitrate(oct);
4650 if (temp32 % 1000 == 0)
4651 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32 / 1000);
4652 else
4653 str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", temp32);
4655 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_upl_ext, tvb,
4656 curr_offset, 1, oct, "%s (%u)", str, oct);
4658 curr_offset += 1;
4659 NO_MORE_DATA_CHECK(len);
4661 /* Maximum bit rate for downlink (extended-2) Octet 19 */
4662 oct = tvb_get_guint8(tvb, curr_offset);
4664 if (oct == 0x00)
4665 str = "Use the value indicated by the Maximum bit rate for downlink";
4666 else
4668 temp32 = qos_calc_ext2_bitrate(oct);
4669 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32);
4671 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl_ext2, tvb,
4672 curr_offset, 1, oct, "%s (%u)", str, oct);
4674 curr_offset += 1;
4675 NO_MORE_DATA_CHECK(len);
4677 /* Guaranteed bit rate for downlink (extended-2) Octet 20 */
4678 oct = tvb_get_guint8(tvb, curr_offset);
4680 if (oct == 0x00)
4681 str = "Use the value indicated by the Guaranteed bit rate for downlink";
4682 else
4684 temp32 = qos_calc_ext2_bitrate(oct);
4685 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32);
4687 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_downl_ext2, tvb,
4688 curr_offset, 1, oct, "%s (%u)", str, oct);
4690 curr_offset += 1;
4691 NO_MORE_DATA_CHECK(len);
4693 /* Maximum bit rate for uplink (extended-2) Octet 21 */
4694 oct = tvb_get_guint8(tvb, curr_offset);
4696 if (oct == 0x00)
4697 str = "Use the value indicated by the Maximum bit rate for uplink";
4698 else
4700 temp32 = qos_calc_ext2_bitrate(oct);
4701 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32);
4703 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_upl_ext2, tvb,
4704 curr_offset, 1, oct, "%s (%u)", str, oct);
4706 curr_offset += 1;
4707 NO_MORE_DATA_CHECK(len);
4709 /* Guaranteed bit rate for uplink (extended-2) Octet 22 */
4710 oct = tvb_get_guint8(tvb, curr_offset);
4712 if (oct == 0x00)
4713 str = "Use the value indicated by the Guaranteed bit rate for uplink";
4714 else
4716 temp32 = qos_calc_ext2_bitrate(oct);
4717 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32);
4719 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_upl_ext2, tvb,
4720 curr_offset, 1, oct, "%s (%u)", str, oct);
4722 curr_offset += 1;
4724 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4726 return (curr_offset - offset);
4730 * [9] 10.5.6.6 SM cause
4732 static const value_string gsm_a_sm_cause_vals[] = {
4733 { 0x08, "Operator Determined Barring" },
4734 { 0x18, "MBMS bearer capabilities insufficient for the service" },
4735 { 0x19, "LLC or SNDCP failure(A/Gb only)" },
4736 { 0x1a, "Insufficient resources" },
4737 { 0x1b, "Missing or unknown APN" },
4738 { 0x1c, "Unknown PDP address or PDP type" },
4739 { 0x1d, "User authentication failed" },
4740 { 0x1e, "Activation rejected by GGSN, Serving GW or PDN GW" },
4741 { 0x1f, "Activation rejected, unspecified" },
4742 { 0x20, "Service option not supported" },
4743 { 0x21, "Requested service option not subscribed" },
4744 { 0x22, "Service option temporarily out of order" },
4745 { 0x23, "NSAPI already used (not sent)" },
4746 { 0x24, "Regular deactivation" },
4747 { 0x25, "QoS not accepted" },
4748 { 0x26, "Network failure" },
4749 { 0x27, "Reactivation requested" },
4750 { 0x28, "Feature not supported" },
4751 { 0x29, "Semantic error in the TFT operation" },
4752 { 0x2a, "Syntactical error in the TFT operation" },
4753 { 0x2b, "Unknown PDP context" },
4754 { 0x2c, "Semantic errors in packet filter(s)" },
4755 { 0x2d, "Syntactical errors in packet filter(s)" },
4756 { 0x2e, "PDP context without TFT already activated" },
4757 { 0x2f, "Multicast group membership time-out" },
4758 { 0x30, "Request rejected, BCM violation" },
4759 { 0x32, "PDP type IPv4 only allowed" },
4760 { 0x33, "PDP type IPv6 only allowed" },
4761 { 0x34, "Single address bearers only allowed" },
4762 { 0x38, "Collision with network initiated request" },
4763 { 0x3c, "Bearer handling not supported" },
4764 { 0x41, "Maximum number of PDP contexts reached" },
4765 { 0x42, "Requested APN not supported in current RAT and PLMN combination" },
4766 { 0x51, "Invalid transaction identifier value" },
4767 { 0x5f, "Semantically incorrect message" },
4768 { 0x60, "Invalid mandatory information" },
4769 { 0x61, "Message type non-existent or not implemented" },
4770 { 0x62, "Message type not compatible with the protocol state" },
4771 { 0x63, "Information element non-existent or not implemented" },
4772 { 0x64, "Conditional IE error" },
4773 { 0x65, "Message not compatible with the protocol state" },
4774 { 0x6f, "Protocol error, unspecified" },
4775 { 0x70, "APN restriction value incompatible with active PDP context" },
4776 { 0, NULL }
4778 static value_string_ext gsm_a_sm_cause_vals_ext = VALUE_STRING_EXT_INIT(gsm_a_sm_cause_vals);
4780 static guint16
4781 de_sm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4783 guint8 oct;
4784 const gchar *str;
4786 oct = tvb_get_guint8(tvb, offset);
4788 /* SM Cause can be sent in both directions */
4789 str = val_to_str_ext_const(oct, &gsm_a_sm_cause_vals_ext,
4790 "Protocol error, unspecified / Service option temporarily out of order");
4792 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb,
4793 offset, 1, oct, "%s (%u)", str, oct);
4795 /* no length check possible */
4796 return (1);
4800 * [9] 10.5.6.6a SM cause 2
4802 static guint16
4803 de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4805 guint8 oct;
4806 const gchar *str;
4808 oct = tvb_get_guint8(tvb, offset);
4810 /* SM Cause 2 is sent only in the Network-to-MS direction */
4811 str = val_to_str_ext_const(oct, &gsm_a_sm_cause_vals_ext,
4812 "Service option temporarily out of order");
4814 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause_2, tvb,
4815 offset, 1, oct, "%s (%u)", str, oct);
4817 /* no length check possible */
4818 return (1);
4821 * [7] 10.5.6.7
4824 static const true_false_string gsm_a_sm_ti_flag_vals = {
4825 "The message is sent to the side that originates the TI",
4826 "The message is sent from the side that originates the TI"
4829 static guint16
4830 de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
4832 guint32 curr_offset;
4833 guint curr_len;
4834 gchar oct;
4836 curr_len = len;
4837 curr_offset = offset;
4839 oct = tvb_get_guint8(tvb, curr_offset);
4841 proto_tree_add_item(tree, hf_gsm_a_sm_ti_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
4843 /* The TI value and the TI flag occupy bits 5 - 7 and bit 8 of the first octet respectively.
4844 * The extended TI shall not be used unless TI values of 7 or greater are needed.
4845 * Where the extended TI is used, the TI IE includes a second octet. The TI value in the first octet is ignored, and the TI
4846 * value is encoded in bits 7-1 of the second octet.
4849 if (curr_len > 1)
4851 curr_offset++;
4852 oct = tvb_get_guint8(tvb, curr_offset);
4854 proto_tree_add_text(tree,
4855 tvb, curr_offset, 1,
4856 "TI value: 0x%02x (%u)", oct&0x7f, oct&0x7f);
4858 proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, offset, 1, ENC_BIG_ENDIAN);
4860 curr_offset++;
4862 else
4864 proto_tree_add_text(tree,
4865 tvb, curr_offset, 1,
4866 "TI value: 0x%02x (%u)", (oct>>4)&7, (oct>>4)&7);
4867 curr_offset++;
4871 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4873 return (curr_offset - offset);
4877 * [9] 10.5.6.9 LLC service access point identifier
4879 static const value_string gsm_a_sm_llc_sapi_vals[] = {
4880 { 0, "LLC SAPI not assigned" },
4881 { 3, "SAPI 3" },
4882 { 5, "SAPI 5" },
4883 { 9, "SAPI 9" },
4884 { 11, "SAPI 11" },
4885 { 0, NULL }
4888 static guint16
4889 de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4891 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
4892 proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, ENC_BIG_ENDIAN);
4894 /* no length check possible */
4895 return (1);
4899 * [9] 10.5.6.10 Tear down indicator
4901 const true_false_string gsm_a_sm_tdi_value = {
4902 "Tear down requested",
4903 "Tear down not requested"
4906 static guint16
4907 de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
4909 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
4910 proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, ENC_BIG_ENDIAN);
4912 /* no length check possible */
4913 return (1);
4917 * [9] 10.5.6.11 Packet Flow Identifier
4919 static const range_string gsm_a_sm_packet_flow_id_vals[] = {
4920 { 0x00, 0x00, "Best Effort"},
4921 { 0x01, 0x01, "Signalling"},
4922 { 0x02, 0x02, "SMS"},
4923 { 0x03, 0x03, "TOM8"},
4924 { 0x04, 0x07, "Reserved"},
4925 { 0x08, 0x7f, "Dynamically assigned"},
4926 { 0x00, 0x00, NULL }
4929 guint16
4930 de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
4932 guint32 curr_offset;
4933 guint value;
4935 curr_offset = offset;
4936 value = tvb_get_guint8(tvb, curr_offset);
4937 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 1, ENC_BIG_ENDIAN);
4938 proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4939 curr_offset++;
4941 if (add_string)
4942 g_snprintf(add_string, string_len, " - %s", rval_to_str(value, gsm_a_sm_packet_flow_id_vals, "Unknown"));
4944 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4946 return (curr_offset - offset);
4950 * [7] 10.5.6.12 TFT - Traffic Flow Template
4952 /* TFT operation code (octet 3) */
4953 static const value_string gsm_a_sm_tft_op_code_vals[] = {
4954 { 0, "Spare"},
4955 { 1, "Create new TFT"},
4956 { 2, "Delete existing TFT"},
4957 { 3, "Add packet filters to existing TFT"},
4958 { 4, "Replace packet filters in existing TFT"},
4959 { 5, "Delete packet filters from existing TFT"},
4960 { 6, "No TFT operation"},
4961 { 7, "Reserved"},
4962 { 0, NULL }
4965 static const true_false_string gsm_a_sm_tft_e_bit = {
4966 "Parameters list is included",
4967 "Parameters list is not included"
4970 static const value_string gsm_a_sm_tft_pkt_flt_dir_vals[] = {
4971 { 0, "Pre Rel-7 TFT filter"},
4972 { 1, "Downlink only"},
4973 { 2, "Uplink only"},
4974 { 3, "Bidirectional"},
4975 { 0, NULL }
4978 static const value_string gsm_a_sm_tft_param_id_vals[] = {
4979 { 1, "Authorization Token"},
4980 { 2, "Flow Identifier"},
4981 { 3, "Packet Filter Identifier"},
4982 { 0, NULL }
4985 guint16
4986 de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
4988 guint32 curr_offset;
4989 guint curr_len;
4990 guint8 op_code;
4991 guint8 pkt_fil_count;
4992 guint8 e_bit;
4993 const gchar *str;
4994 guint8 count;
4995 guint8 oct;
4996 gint pf_length;
4997 gint i;
4998 gint pack_component_type;
4999 gint param;
5001 curr_len = len;
5002 curr_offset = offset;
5005 * parse first octet. It contain TFT operation code, E bit and Number of packet filters
5007 oct = tvb_get_guint8(tvb, curr_offset);
5009 op_code = oct>>5;
5010 pkt_fil_count = oct&0x0f;
5011 e_bit = (oct>>4)&1;
5013 proto_tree_add_item(tree, hf_gsm_a_sm_tft_op_code, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5014 proto_tree_add_item(tree, hf_gsm_a_sm_tft_e_bit, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5015 proto_tree_add_item(tree, hf_gsm_a_sm_tft_pkt_flt, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5017 curr_offset++;
5018 curr_len--;
5020 /* Packet filter list dissect */
5022 count = 0;
5023 if (op_code == 2) /* delete TFT contains no packet filters. so we will jump over it */
5024 count = pkt_fil_count;
5025 while (count < pkt_fil_count)
5027 proto_item *tf;
5028 proto_tree *tf_tree;
5029 tf = proto_tree_add_text(tree,
5030 tvb, curr_offset, 1,
5031 "Packet filter %d", count); /* 0-> 7 */
5033 tf_tree = proto_item_add_subtree(tf, ett_sm_tft);
5035 if (op_code == 5) /* Delete packet filters from existing TFT - just a list of identifiers */
5037 if ((curr_offset-offset)<1) {
5038 proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Not enough data");
5039 return (len);
5041 proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
5042 oct = tvb_get_guint8(tvb, curr_offset) & 0x0f;
5043 proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_sm_tft_pkt_flt_id, tvb, curr_offset, 1, oct, "%d (%d)", oct+1, oct);
5044 curr_offset++;
5045 curr_len--;
5046 count++;
5048 else /* create new, Add packet filters or Replace packet filters */
5051 if ((curr_offset-offset)<1) {
5052 proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Not enough data");
5053 return (len);
5055 proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 2, ENC_BIG_ENDIAN);
5056 proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_pkt_flt_dir, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5057 oct = tvb_get_guint8(tvb, curr_offset) & 0x0f;
5058 proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_sm_tft_pkt_flt_id, tvb, curr_offset, 1, oct, "%d (%d)", oct+1, oct);
5059 curr_offset++;
5060 curr_len--;
5062 if ((curr_offset-offset) < 1) {
5063 proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Not enough data");
5064 return (len);
5066 oct = tvb_get_guint8(tvb, curr_offset);
5067 curr_offset++;
5068 curr_len--;
5070 proto_tree_add_text(tf_tree,
5071 tvb, curr_offset-1, 1,
5072 "Packet evaluation precedence: 0x%02x (%u)", oct, oct);
5074 if ((curr_offset-offset)<1) { proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Not enough data"); return (len);}
5075 pf_length = tvb_get_guint8(tvb, curr_offset);
5076 curr_offset++;
5077 curr_len--;
5079 proto_tree_add_text(tf_tree,
5080 tvb, curr_offset-1, 1,
5081 "Packet filter length: 0x%02x (%u)", pf_length, pf_length);
5082 /* New tree for component */
5084 /* Dissect Packet filter Component */
5085 /* while (filter_len > 1) */
5086 /* packet filter component type identifier: */
5088 while (pf_length > 0) {
5089 proto_tree *comp_tree;
5090 if ((curr_offset-offset) < 1) {
5091 proto_tree_add_text(tf_tree, tvb, curr_offset, 1, "Not enough data");
5092 return (len);
5094 pack_component_type = tvb_get_guint8(tvb, curr_offset);
5095 curr_offset++;
5096 curr_len--;
5097 pf_length--;
5099 tf = proto_tree_add_text(tf_tree, tvb, curr_offset-1, 1, "Packet filter component type identifier: ");
5100 comp_tree = proto_item_add_subtree(tf, ett_sm_tft);
5102 switch (pack_component_type) {
5104 case 0x10:
5105 str = "IPv4 remote address type";
5106 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5107 curr_offset += 4;
5108 curr_len -= 4;
5109 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_mask, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5110 curr_offset += 4;
5111 curr_len -= 4;
5112 pf_length -= 8;
5113 break;
5115 case 0x11:
5116 str = "IPv4 local address type";
5117 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5118 curr_offset += 4;
5119 curr_len -= 4;
5120 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_mask, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5121 curr_offset += 4;
5122 curr_len -= 4;
5123 pf_length -= 8;
5124 break;
5126 case 0x20:
5127 str = "IPv6 remote address type";
5128 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
5129 curr_offset += 16;
5130 curr_len -= 16;
5131 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_mask, tvb, curr_offset, 16, ENC_NA);
5132 curr_offset += 16;
5133 curr_len -= 16;
5134 pf_length -= 32;
5135 break;
5137 case 0x21:
5138 str = "IPv6 remote address/prefix length type";
5139 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
5140 curr_offset += 16;
5141 curr_len -= 16;
5142 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_prefix_length, tvb, curr_offset, 1, ENC_NA);
5143 curr_offset += 1;
5144 curr_len -= 1;
5145 pf_length -= 17;
5146 break;
5148 case 0x23:
5149 str = "IPv6 local address/prefix length type";
5150 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
5151 curr_offset += 16;
5152 curr_len -= 16;
5153 proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_prefix_length, tvb, curr_offset, 1, ENC_NA);
5154 curr_offset += 1;
5155 curr_len -= 1;
5156 pf_length -= 17;
5157 break;
5159 case 0x30:
5160 str = "Protocol identifier/Next header type";
5161 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_protocol_header, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5162 curr_offset += 1;
5163 curr_len -= 1;
5164 pf_length -= 1;
5165 break;
5167 case 0x40:
5168 str = "Single local port type";
5169 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
5170 curr_offset += 2;
5171 curr_len -= 2;
5172 pf_length -= 2;
5173 break;
5175 case 0x41:
5176 str = "Local port range type";
5177 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_low, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
5178 curr_offset += 2;
5179 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_high, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
5180 curr_offset += 2;
5181 curr_len -= 4;
5182 pf_length -= 4;
5183 break;
5185 case 0x50:
5186 str = "Single remote port type";
5187 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
5188 curr_offset += 2;
5189 curr_len -= 2;
5190 pf_length -= 2;
5191 break;
5193 case 0x51:
5194 str = "Remote port range type";
5195 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_low, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
5196 curr_offset += 2;
5197 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_high, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
5198 curr_offset += 2;
5199 curr_len -= 4;
5200 pf_length -= 4;
5201 break;
5203 case 0x60:
5204 str = "Security parameter index type";
5205 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_security, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5206 curr_offset += 4;
5207 curr_len -= 4;
5208 pf_length -= 4;
5209 break;
5212 case 0x70:
5213 str = "Type of service/Traffic class type";
5214 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_traffic_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5215 curr_offset++;
5216 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_traffic_mask, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5217 curr_offset++;
5218 curr_len-=2;
5219 pf_length-=2;
5220 break;
5222 case 0x80:
5223 str = "Flow label type";
5224 proto_tree_add_bits_item(comp_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
5225 proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_flow_label_type, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
5226 curr_offset += 3;
5227 curr_len -= 3;
5228 pf_length -= 3;
5229 break;
5231 default:
5232 str = "not specified";
5233 curr_offset += pf_length;
5234 curr_len -= pf_length;
5235 pf_length = 0;
5237 proto_item_append_text(tf, "%s (%u)", str, pack_component_type);
5239 count++;
5243 /* The parameters list contains a variable number of parameters that might need to be
5244 * transferred in addition to the packet filters. If the parameters list is included, the E
5245 * bit is set to 1; otherwise, the E bit is set to 0.
5247 if ((e_bit == 1) && curr_len) {
5248 count = 0;
5249 while (curr_len) {
5250 proto_item *tf;
5251 proto_tree *tf_tree;
5252 pf_length = tvb_get_guint8(tvb, curr_offset+1);
5253 tf = proto_tree_add_text(tree, tvb, curr_offset, pf_length+2, "Parameter %d", count);
5254 tf_tree = proto_item_add_subtree(tf, ett_sm_tft);
5255 param = tvb_get_guint8(tvb, curr_offset);
5256 proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5257 curr_offset += 2;
5258 curr_len -= 2;
5259 switch (param) {
5260 case 0x01:
5261 proto_tree_add_text(tf_tree, tvb, curr_offset, pf_length, "Authorization token value: 0x%s",
5262 tvb_bytes_to_str(tvb, curr_offset, pf_length));
5263 break;
5265 case 0x02:
5266 proto_tree_add_text(tf_tree, tvb, curr_offset, 2, "Media Component number value: 0x%x",
5267 tvb_get_bits16(tvb, curr_offset<<3, 16, ENC_BIG_ENDIAN));
5268 proto_tree_add_text(tf_tree, tvb, curr_offset+2, 2, "IP flow number: 0x%x",
5269 tvb_get_bits16(tvb, (curr_offset+2)<<3, 16, ENC_BIG_ENDIAN));
5270 break;
5272 case 0x03:
5273 for (i=0; i<pf_length; i++) {
5274 oct = tvb_get_guint8(tvb, curr_offset+i) & 0x0f;
5275 proto_tree_add_text(tf_tree, tvb, curr_offset+i, 1, "Packet filter identifier %d: %d (%d)",
5276 i, oct+1, oct);
5278 break;
5280 default:
5281 proto_tree_add_text(tf_tree, tvb, curr_offset, pf_length, "Parameter content: 0x%s",
5282 tvb_bytes_to_str(tvb, curr_offset, pf_length));
5283 break;
5285 curr_offset += pf_length;
5286 curr_len -= pf_length;
5287 count++;
5291 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5293 return (len);
5297 * [9] 10.5.6.13 Temporary Mobile Group Identity (TMGI)
5299 static guint16
5300 de_sm_tmgi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
5302 guint32 curr_offset;
5304 curr_offset = offset;
5306 proto_tree_add_item(tree, hf_gsm_a_sm_tmgi, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
5307 curr_offset += 3;
5309 NO_MORE_DATA_CHECK(len);
5310 curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, TRUE);
5312 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5314 return (curr_offset - offset);
5318 * [9] 10.5.6.14 MBMS bearer capabilities
5320 static guint16
5321 de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
5323 guint32 curr_offset, temp32;
5324 guint8 oct;
5325 const gchar *str;
5327 curr_offset = offset;
5329 oct = tvb_get_guint8(tvb, curr_offset);
5331 switch (oct)
5333 case 0x00: str = "Subscribed maximum bit rate for downlink/reserved"; break;
5334 case 0xff: str = "0 kbps"; break;
5335 default: str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", qos_calc_bitrate(oct));
5338 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl, tvb,
5339 curr_offset, 1, oct, "%s (%u)", str, oct);
5340 curr_offset += 1;
5342 NO_MORE_DATA_CHECK(len);
5344 oct = tvb_get_guint8(tvb, curr_offset);
5346 if (oct == 0x00)
5347 str = "Use the value indicated by the Maximum bit rate for downlink";
5348 else
5350 temp32 = qos_calc_ext_bitrate(oct);
5351 if (temp32 % 1000 == 0)
5352 str = wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32 / 1000);
5353 else
5354 str = wmem_strdup_printf(wmem_packet_scope(), "%u kbps", temp32);
5356 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl_ext, tvb,
5357 curr_offset, 1, oct, "%s (%u)", str, oct);
5359 curr_offset += 1;
5361 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5363 return (curr_offset - offset);
5367 * [9] 10.5.6.15 MBMS protocol configuration options
5369 static guint16
5370 de_sm_mbms_prot_conf_opt(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
5372 guint32 curr_offset;
5374 curr_offset = offset;
5375 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 8, ENC_BIG_ENDIAN);
5376 curr_offset++;
5378 EXTRANEOUS_DATA_CHECK_EXPERT(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5380 return (curr_offset - offset);
5384 * [9] 10.5.6.16 Enhanced network service access point identifier
5386 static guint16
5387 de_sm_enh_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
5389 guint8 oct;
5390 const gchar *str;
5392 oct = tvb_get_guint8(tvb, offset);
5394 if(oct < 0x80)
5395 str = "Reserved";
5396 else if (oct < 0xff)
5397 str = wmem_strdup_printf(wmem_packet_scope(), "NSAPI %u for Multimedia Broadcast/Multicast Service (MBMS) Multicast mode", oct);
5398 else
5399 str = "Reserved for use by lower layers in the p2p radio bearer allocation message for MBMS Broadcast mode";
5402 proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_enh_nsapi, tvb,
5403 offset, 1, oct, "%s (%u)", str, oct);
5405 /* no length check possible */
5406 return (1);
5410 * [9] 10.5.6.17 Request type
5412 static const value_string gsm_a_sm_req_type_vals[] = {
5413 { 0x01, "Initial request" },
5414 { 0x02, "Handover" },
5415 { 0x03, "Unused. If received, the network shall interpret this as \"Initial request\"." },
5416 { 0x04, "Emergency" },
5417 { 0, NULL }
5420 static guint16
5421 de_sm_req_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
5423 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset<<3) + 4, 1, ENC_BIG_ENDIAN);
5424 proto_tree_add_item(tree, hf_gsm_a_sm_req_type, tvb, offset, 1, ENC_BIG_ENDIAN);
5426 /* no length check possible */
5427 return (1);
5431 * [9] 10.5.6.18 Notification indicator
5433 static const value_string gsm_a_sm_notif_ind_vals[] = {
5434 { 0x0, "Reserved"},
5435 { 0x1, "SRVCC handover cancelled, IMS session re-establishment required"},
5436 { 0, NULL }
5439 static guint16
5440 de_sm_notif_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
5442 guint32 curr_offset;
5444 curr_offset = offset;
5446 proto_tree_add_item(tree, hf_gsm_a_sm_notif_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5448 return (len);
5452 * [10] 10.5.6.19 Connectivity type
5454 static const range_string gsm_a_sm_connectivity_type_vals[] = {
5455 { 0x0, 0x0, "The PDN connection type is not indicated"},
5456 { 0x1, 0x1, "The PDN connection is considered a LIPA PDN connection"},
5457 { 0x2, 0xF, "The PDN connection type is not indicated"},
5458 { 0, 0, NULL }
5461 static guint16
5462 de_sm_connectivity_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
5464 guint32 curr_offset;
5466 curr_offset = offset;
5468 proto_tree_add_item(tree, hf_gsm_a_sm_connectivity_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5470 return (len);
5474 guint16 (*gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string, int string_len) = {
5475 /* GPRS Mobility Management Information Elements 10.5.5 */
5476 de_gmm_add_upd_type, /* Additional Update Type */
5477 de_gmm_attach_res, /* Attach Result */
5478 de_gmm_attach_type, /* Attach Type */
5479 de_gmm_ciph_alg, /* Cipher Algorithm */
5480 de_gmm_tmsi_stat, /* TMSI Status */
5481 de_gmm_detach_type, /* Detach Type */
5482 de_gmm_drx_param, /* DRX Parameter */
5483 de_gmm_ftostby, /* Force to Standby */
5484 de_gmm_ftostby_h, /* Force to Standby - Info is in the high nibble */
5485 de_gmm_ptmsi_sig, /* P-TMSI Signature */
5486 de_gmm_ptmsi_sig2, /* P-TMSI Signature 2 */
5487 de_gmm_ident_type2, /* Identity Type 2 */
5488 de_gmm_imeisv_req, /* IMEISV Request */
5489 de_gmm_rec_npdu_lst, /* Receive N-PDU Numbers List */
5490 de_gmm_ms_net_cap, /* MS Network Capability */
5491 de_gmm_ms_radio_acc_cap, /* MS Radio Access Capability */
5492 de_gmm_cause, /* GMM Cause */
5493 de_gmm_rai, /* Routing Area Identification */
5494 de_gmm_rai2, /* Routing Area Identification 2 */
5495 de_gmm_update_res, /* Update Result */
5496 de_gmm_update_type, /* Update Type */
5497 de_gmm_ac_ref_nr, /* A&C Reference Number */
5498 de_gmm_ac_ref_nr_h, /* A&C Reference Number - Info is in the high nibble */
5499 de_gmm_service_type, /* Service Type */
5500 NULL /* no associated data */, /* Cell Notification */
5501 de_gmm_ps_lcs_cap, /* PS LCS Capability */
5502 de_gmm_net_feat_supp, /* Network Feature Support */
5503 de_gmm_add_net_feat_supp, /* Network Feature Support */
5504 de_gmm_rat_info_container, /* Inter RAT information container */
5505 de_gmm_req_ms_info, /* Requested MS information */
5506 NULL, /* UE network capability */
5507 de_gmm_eutran_irat_info_container, /* E-UTRAN inter RAT information container */
5508 de_gmm_voice_domain_pref, /* Voice domain preference and UE's usage setting */
5509 de_gmm_ptmsi_type, /* P-TMSI type */
5510 de_gmm_lai_2, /* Location Area Identification 2 */
5511 de_gmm_net_res_id_cont, /* Network resource identifier container */
5512 /* Session Management Information Elements 10.5.6 */
5513 de_sm_apn, /* Access Point Name */
5514 de_sm_nsapi, /* Network Service Access Point Identifier */
5515 de_sm_pco, /* Protocol Configuration Options */
5516 de_sm_pdp_addr, /* Packet Data Protocol Address */
5517 de_sm_qos, /* Quality Of Service */
5518 de_sm_cause, /* SM Cause */
5519 de_sm_cause_2, /* SM Cause 2 */
5520 de_sm_linked_ti, /* Linked TI */
5521 de_sm_sapi, /* LLC Service Access Point Identifier */
5522 de_sm_tear_down, /* Tear Down Indicator */
5523 de_sm_pflow_id, /* Packet Flow Identifier */
5524 de_sm_tflow_temp, /* Traffic Flow Template */
5525 de_sm_tmgi, /* Temporary Mobile Group Identity (TMGI) */
5526 de_sm_mbms_bearer_cap, /* MBMS bearer capabilities */
5527 de_sm_mbms_prot_conf_opt, /* MBMS protocol configuration options */
5528 de_sm_enh_nsapi, /* Enhanced network service access point identifier */
5529 de_sm_req_type, /* Request type */
5530 de_sm_notif_ind, /* Notification indicator */
5531 de_sm_connectivity_type, /* Connectivity type */
5532 /* GPRS Common Information Elements 10.5.7 */
5533 de_gc_context_stat, /* PDP Context Status */
5534 de_gc_radio_prio, /* Radio Priority */
5535 de_gc_timer, /* GPRS Timer */
5536 de_gc_timer2, /* GPRS Timer 2 */
5537 de_gc_timer3, /* GPRS Timer 3 */
5538 de_gc_radio_prio2, /* Radio Priority 2 */
5539 de_gc_mbms_context_stat, /* 10.5.7.6 MBMS context status */
5540 de_gc_uplink_data_stat, /* 10.5.7.7 Uplink data status */
5541 de_gc_device_properties, /* 10.5.7.8 Device properties */
5542 NULL, /* NONE */
5545 /* MESSAGE FUNCTIONS */
5548 * [7] 9.4.1
5550 static void
5551 dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5553 guint32 curr_offset;
5554 guint32 consumed;
5555 guint curr_len;
5557 curr_offset = offset;
5558 curr_len = len;
5560 pinfo->p2p_dir = P2P_DIR_RECV;
5562 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, NULL);
5564 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_ATTACH_TYPE, GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM);
5566 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL);
5568 ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
5570 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
5572 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL);
5574 ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, " - Old P-TMSI Signature");
5576 ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Ready Timer");
5578 ELEM_OPT_TV_SHORT( 0x90, GSM_A_PDU_TYPE_GM, DE_TMSI_STAT, NULL);
5580 ELEM_OPT_TLV( 0x33, GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP, NULL);
5582 ELEM_OPT_TLV( 0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
5584 ELEM_OPT_TLV( 0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
5586 ELEM_OPT_TLV( 0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
5588 ELEM_OPT_TLV( 0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
5590 ELEM_OPT_TLV( 0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
5592 ELEM_OPT_TLV( 0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
5594 ELEM_OPT_TLV( 0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
5596 ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
5598 ELEM_OPT_TV_SHORT(0xE0, GSM_A_PDU_TYPE_GM, DE_PTMSI_TYPE, NULL);
5600 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL);
5602 ELEM_OPT_TLV(0x14, GSM_A_PDU_TYPE_GM, DE_LAI_2, " - Old location area identification");
5604 ELEM_OPT_TV_SHORT(0xF0, GSM_A_PDU_TYPE_GM, DE_ADD_UPD_TYPE, NULL);
5606 ELEM_OPT_TLV(0x10, GSM_A_PDU_TYPE_GM, DE_NET_RES_ID_CONT, " - TMSI based NRI container");
5608 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5612 * [7] 9.4.2
5614 static void
5615 dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5617 guint32 curr_offset;
5618 guint32 consumed;
5619 guint curr_len;
5621 curr_offset = offset;
5622 curr_len = len;
5624 pinfo->p2p_dir = P2P_DIR_SENT;
5626 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_ATTACH_RES, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H);
5628 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, NULL);
5630 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO_2, " - Radio priority for TOM8");
5631 curr_len++;
5632 curr_offset--;
5634 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, " - Radio priority for SMS");
5636 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
5638 ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, NULL);
5640 ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Negotiated Ready Timer");
5642 ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Allocated P-TMSI");
5644 ELEM_OPT_TLV( 0x23, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
5646 ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
5648 ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value");
5650 ELEM_OPT_T( 0x8C, GSM_A_PDU_TYPE_GM, DE_CELL_NOT, NULL);
5652 ELEM_OPT_TLV( 0x4A, GSM_A_PDU_TYPE_COMMON, DE_PLMN_LIST, NULL);
5654 ELEM_OPT_TV_SHORT( 0xB0, GSM_A_PDU_TYPE_GM, DE_NET_FEAT_SUP, NULL);
5656 ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST, NULL);
5658 ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_MS_INFO, NULL);
5660 ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319 value");
5662 ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323 value" );
5664 ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value");
5666 ELEM_OPT_TLV(0x66, GSM_A_PDU_TYPE_GM, DE_ADD_NET_FEAT_SUP, NULL);
5668 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5672 * [7] 9.4.3
5674 static void
5675 dtap_gmm_attach_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5678 guint32 curr_offset;
5679 guint32 consumed;
5680 guint curr_len;
5682 curr_offset = offset;
5683 curr_len = len;
5685 pinfo->p2p_dir = P2P_DIR_RECV;
5687 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
5689 ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
5691 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5695 * [7] 9.4.4
5697 static void
5698 dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5700 guint32 curr_offset;
5701 guint32 consumed;
5702 guint curr_len;
5704 curr_offset = offset;
5705 curr_len = len;
5707 pinfo->p2p_dir = P2P_DIR_SENT;
5709 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
5711 ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value" );
5713 ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value");
5715 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5719 * [7] 9.4.5
5721 static void
5722 dtap_gmm_detach_req_MT(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5724 guint32 curr_offset;
5725 guint32 consumed;
5726 guint curr_len;
5728 curr_offset = offset;
5729 curr_len = len;
5731 pinfo->p2p_dir = P2P_DIR_SENT;
5733 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H);
5735 ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
5737 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5740 static void
5741 dtap_gmm_detach_req_MO(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5743 guint32 curr_offset;
5744 guint32 consumed;
5745 guint curr_len;
5747 curr_offset = offset;
5748 curr_len = len;
5750 pinfo->p2p_dir = P2P_DIR_RECV;
5752 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
5754 ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
5756 ELEM_OPT_TLV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG_2, NULL);
5758 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5761 static void
5762 dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5764 if (pinfo->link_dir == P2P_DIR_UL) {
5765 dtap_gmm_detach_req_MO(tvb, tree, pinfo, offset, len);
5766 return;
5767 }else if (pinfo->link_dir == P2P_DIR_DL) {
5768 dtap_gmm_detach_req_MT(tvb, tree, pinfo, offset, len);
5769 return;
5770 } else {
5771 /* Unknown direction. Try heuristics based on message length. */
5772 if (len > 5) {
5773 dtap_gmm_detach_req_MO(tvb, tree, pinfo, offset, len);
5774 } else {
5775 dtap_gmm_detach_req_MT(tvb, tree, pinfo, offset, len);
5781 * [7] 9.4.6
5783 static void
5784 dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5786 guint32 curr_offset;
5787 guint curr_len;
5789 curr_offset = offset;
5790 curr_len = len;
5792 pinfo->p2p_dir = P2P_DIR_RECV;
5794 if (curr_len == 0) {
5795 return;
5798 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
5800 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5804 * [7] 9.4.7
5806 static void
5807 dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5809 guint32 curr_offset;
5810 guint32 consumed;
5811 guint curr_len;
5813 curr_offset = offset;
5814 curr_len = len;
5816 pinfo->p2p_dir = P2P_DIR_SENT;
5818 ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, " - Allocated P-TMSI" );
5820 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
5822 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
5824 ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, " - P-TMSI Signature" );
5826 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5830 * [7] 9.4.8
5832 static void
5833 dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5835 guint32 curr_offset;
5836 /* guint32 consumed; */
5837 guint curr_len;
5839 curr_offset = offset;
5840 curr_len = len;
5842 pinfo->p2p_dir = P2P_DIR_RECV;
5844 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5848 * [7] 9.4.9
5850 static void
5851 dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5853 guint32 curr_offset;
5854 guint32 consumed;
5855 guint curr_len;
5857 curr_offset = offset;
5858 curr_len = len;
5860 pinfo->p2p_dir = P2P_DIR_SENT;
5862 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_CIPH_ALG, GSM_A_PDU_TYPE_GM, DE_IMEISV_REQ);
5864 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM_H);
5866 ELEM_OPT_TV( 0x21, GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_RAND, NULL);
5868 ELEM_OPT_TV_SHORT( 0x80, GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
5870 ELEM_OPT_TLV( 0x28, GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_AUTN, NULL);
5872 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5876 * [7] 9.4.10
5878 static void
5879 dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5881 guint32 curr_offset;
5882 guint32 consumed;
5883 guint curr_len;
5885 curr_offset = offset;
5886 curr_len = len;
5888 pinfo->p2p_dir = P2P_DIR_RECV;
5890 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
5892 ELEM_OPT_TV( 0x22, GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM, NULL);
5894 ELEM_OPT_TLV( 0x23, GSM_A_PDU_TYPE_COMMON, DE_MID, " - IMEISV" );
5896 ELEM_OPT_TLV( 0x29, GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM_EXT, NULL);
5898 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5902 * [7] 9.4.11
5904 static void
5905 dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5907 guint32 curr_offset;
5908 guint curr_len;
5910 curr_offset = offset;
5911 curr_len = len;
5913 pinfo->p2p_dir = P2P_DIR_SENT;
5915 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5919 * [7] 9.4.10a
5921 static void
5922 dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5924 guint32 curr_offset;
5925 guint32 consumed;
5926 guint curr_len;
5928 curr_offset = offset;
5929 curr_len = len;
5931 pinfo->p2p_dir = P2P_DIR_RECV;
5933 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
5935 ELEM_OPT_TLV( 0x30, GSM_A_PDU_TYPE_DTAP, DE_AUTH_FAIL_PARAM, NULL);
5937 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5941 * [7] 9.4.12
5943 static void
5944 dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5946 guint32 curr_offset;
5947 guint curr_len;
5949 curr_offset = offset;
5950 curr_len = len;
5952 pinfo->p2p_dir = P2P_DIR_SENT;
5954 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H);
5956 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5960 * [7] 9.4.13
5962 static void
5963 dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5965 guint32 curr_offset;
5966 guint32 consumed;
5967 guint curr_len;
5969 curr_offset = offset;
5970 curr_len = len;
5972 pinfo->p2p_dir = P2P_DIR_RECV;
5974 ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
5976 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
5980 * [7] 9.4.14
5982 static void
5983 dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
5985 guint32 curr_offset;
5986 guint32 consumed;
5987 guint curr_len;
5989 curr_offset = offset;
5990 curr_len = len;
5992 pinfo->p2p_dir = P2P_DIR_RECV;
5994 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_UPD_TYPE, GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM);
5996 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
5998 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL);
6000 ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, " - Old P-TMSI Signature" );
6002 ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Requested Ready Timer" );
6004 ELEM_OPT_TV( 0x27, GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL);
6006 ELEM_OPT_TV_SHORT( 0x90, GSM_A_PDU_TYPE_GM, DE_TMSI_STAT, NULL);
6008 ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, " - P-TMSI" );
6010 ELEM_OPT_TLV( 0x31, GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, NULL);
6012 ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
6014 ELEM_OPT_TLV( 0x33, GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP, NULL);
6016 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
6018 ELEM_OPT_TLV( 0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
6020 ELEM_OPT_TLV( 0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
6022 ELEM_OPT_TLV( 0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
6024 ELEM_OPT_TLV( 0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
6026 ELEM_OPT_TLV( 0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
6028 ELEM_OPT_TLV( 0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
6030 ELEM_OPT_TLV( 0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
6032 ELEM_OPT_TV_SHORT(0xE0, GSM_A_PDU_TYPE_GM, DE_PTMSI_TYPE, NULL);
6034 ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6036 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL);
6038 ELEM_OPT_TLV(0x14, GSM_A_PDU_TYPE_GM, DE_LAI_2, " - Old location area identification");
6040 ELEM_OPT_TV_SHORT(0xF0, GSM_A_PDU_TYPE_GM, DE_ADD_UPD_TYPE, NULL);
6042 ELEM_OPT_TLV(0x10, GSM_A_PDU_TYPE_GM, DE_NET_RES_ID_CONT, " - TMSI based NRI container");
6044 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6048 * [7] 9.4.15
6050 static void
6051 dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6053 guint32 curr_offset;
6054 guint32 consumed;
6055 guint curr_len;
6057 curr_offset = offset;
6058 curr_len = len;
6060 pinfo->p2p_dir = P2P_DIR_SENT;
6062 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_GM, DE_UPD_RES);
6064 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Periodic RA update timer");
6066 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
6068 ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, NULL);
6070 ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Allocated P-TMSI");
6072 ELEM_OPT_TLV( 0x23, GSM_A_PDU_TYPE_COMMON, DE_MID, " - MS identity");
6074 ELEM_OPT_TLV( 0x26, GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST, NULL);
6076 ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Negotiated Ready Timer" );
6078 ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
6080 ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value" );
6082 ELEM_OPT_T( 0x8C, GSM_A_PDU_TYPE_GM, DE_CELL_NOT, NULL);
6084 ELEM_OPT_TLV( 0x4A, GSM_A_PDU_TYPE_COMMON, DE_PLMN_LIST, NULL);
6086 ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
6088 ELEM_OPT_TV_SHORT( 0xB0, GSM_A_PDU_TYPE_GM, DE_NET_FEAT_SUP, NULL);
6090 ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST, NULL);
6092 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
6094 ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_MS_INFO, NULL);
6096 ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319 value");
6098 ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323 value");
6100 ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value");
6102 ELEM_OPT_TLV(0x66, GSM_A_PDU_TYPE_GM, DE_ADD_NET_FEAT_SUP, NULL);
6104 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6108 * [7] 9.4.16
6110 static void
6111 dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6113 guint32 curr_offset;
6114 guint32 consumed;
6115 guint curr_len;
6117 curr_offset = offset;
6118 curr_len = len;
6120 pinfo->p2p_dir = P2P_DIR_RECV;
6121 /* [7] 10.5.5.11 */
6122 ELEM_OPT_TLV( 0x26, GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST, NULL);
6123 /* Inter RAT information container 10.5.5.24 TS 24.008 version 6.8.0 Release 6 */
6124 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
6126 ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
6128 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6132 * [7] 9.4.17
6134 static void
6135 dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6137 guint32 curr_offset;
6138 guint32 consumed;
6139 guint curr_len;
6141 curr_offset = offset;
6142 curr_len = len;
6144 pinfo->p2p_dir = P2P_DIR_SENT;
6146 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
6148 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE);
6150 ELEM_OPT_TLV(0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value");
6152 ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value");
6154 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6158 * [7] 9.4.18
6160 static void
6161 dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6163 guint32 curr_offset;
6164 guint32 consumed;
6165 guint curr_len;
6167 curr_offset = offset;
6168 curr_len = len;
6170 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6172 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
6174 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6178 * [8] 9.4.19 GMM Information
6180 static void
6181 dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6183 guint32 curr_offset;
6184 guint32 consumed;
6185 guint curr_len;
6187 curr_offset = offset;
6188 curr_len = len;
6190 pinfo->p2p_dir = P2P_DIR_SENT;
6192 ELEM_OPT_TLV( 0x43, GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME, " - Full Name" );
6194 ELEM_OPT_TLV( 0x45, GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME, " - Short Name" );
6196 ELEM_OPT_TV( 0x46, GSM_A_PDU_TYPE_DTAP, DE_TIME_ZONE, NULL);
6198 ELEM_OPT_TV( 0x47, GSM_A_PDU_TYPE_DTAP, DE_TIME_ZONE_TIME, NULL);
6200 ELEM_OPT_TLV( 0x48, GSM_A_PDU_TYPE_DTAP, DE_LSA_ID, NULL);
6202 ELEM_OPT_TLV( 0x49, GSM_A_PDU_TYPE_DTAP, DE_DAY_SAVING_TIME, NULL);
6204 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6208 * [7] 9.4.20
6210 static void
6211 dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6213 guint32 curr_offset;
6214 guint32 consumed;
6215 guint curr_len;
6217 curr_offset = offset;
6218 curr_len = len;
6220 pinfo->p2p_dir = P2P_DIR_RECV;
6222 ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, GSM_A_PDU_TYPE_GM, DE_SRVC_TYPE);
6224 /* P-TMSI Mobile station identity 10.5.1.4 M LV 6 */
6225 ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
6227 ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
6229 /* MBMS context status 10.5.7.6 TLV 2 - 18 */
6230 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
6232 ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_UPLINK_DATA_STATUS, NULL);
6234 ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6236 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6240 * [7] 9.4.21
6242 static void
6243 dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6245 guint32 curr_offset;
6246 guint32 consumed;
6247 guint curr_len;
6249 curr_offset = offset;
6250 curr_len = len;
6252 pinfo->p2p_dir = P2P_DIR_SENT;
6254 ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
6256 /* MBMS context status 10.5.7.6 TLV 2 - 18 */
6257 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
6259 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6263 * [7] 9.4.22
6265 static void
6266 dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6268 guint32 curr_offset;
6269 guint32 consumed;
6270 guint curr_len;
6272 curr_offset = offset;
6273 curr_len = len;
6275 pinfo->p2p_dir = P2P_DIR_SENT;
6277 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
6279 ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value");
6281 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6285 * [8] 9.5.1 Activate PDP context request
6286 * Direction: MS to network
6288 static void
6289 dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6291 guint32 curr_offset;
6292 guint32 consumed;
6293 guint curr_len;
6295 curr_offset = offset;
6296 curr_len = len;
6298 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6299 /* MS to network */
6300 pinfo->link_dir = P2P_DIR_UL;
6302 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI");
6304 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
6306 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Requested QoS" );
6308 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Requested PDP address" );
6310 ELEM_OPT_TLV( 0x28, GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL);
6312 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6314 ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_TYPE, NULL);
6316 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6318 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6322 * [9] 9.5.2 Activate PDP context accept
6323 * Direction: network to MS
6325 static void
6326 dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6328 guint32 curr_offset;
6329 guint32 consumed;
6330 guint curr_len;
6332 curr_offset = offset;
6333 curr_len = len;
6335 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6336 /* Network to MS*/
6337 pinfo->link_dir = P2P_DIR_DL;
6339 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
6341 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Negotiated QoS" );
6343 #if 0
6344 /* This is done automatically */
6345 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
6346 curr_offset--;
6347 curr_len++;
6348 #endif
6350 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
6352 ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - PDP address");
6354 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6356 ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
6358 ELEM_OPT_TLV( 0x39, GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause");
6360 ELEM_OPT_TV_SHORT(0xB0 , GSM_A_PDU_TYPE_GM, DE_SM_CONNECTIVITY_TYPE, NULL);
6362 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6366 * [8] 9.5.3 Activate PDP context reject
6367 * Direction: network to MS
6369 static void
6370 dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6372 guint32 curr_offset;
6373 guint32 consumed;
6374 guint curr_len;
6376 curr_offset = offset;
6377 curr_len = len;
6379 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6380 /* Network to MS*/
6381 pinfo->link_dir = P2P_DIR_DL;
6383 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6385 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6387 ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
6389 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6393 * [8] 9.5.4 Activate Secondary PDP Context Request
6394 * Direction: MS to network
6396 static void
6397 dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6399 guint32 curr_offset;
6400 guint32 consumed;
6401 guint curr_len;
6403 curr_offset = offset;
6404 curr_len = len;
6406 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6407 /* MS to Network */
6408 pinfo->link_dir = P2P_DIR_UL;
6410 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI");
6412 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
6414 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Requested QoS" );
6416 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_LINKED_TI, NULL);
6418 /* 3GPP TS 24.008 version 6.8.0 Release 6, 36 TFT Traffic Flow Template 10.5.6.12 O TLV 3-257 */
6419 ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
6421 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6423 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6425 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6429 * [7] 9.5.5 Activate Secondary PDP Context Accept
6430 * Direction: network to MS
6432 static void
6433 dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6435 guint32 curr_offset;
6436 guint32 consumed;
6437 guint curr_len;
6439 curr_offset = offset;
6440 curr_len = len;
6442 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6443 /* Network to MS*/
6444 pinfo->link_dir = P2P_DIR_DL;
6446 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
6448 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Negotiated QoS" );
6450 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
6452 #if 0
6453 /* This is done automatically */
6454 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
6455 curr_offset--;
6456 curr_len++;
6457 #endif
6459 ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
6461 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6463 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6467 * [8] 9.5.6 Activate Secondary PDP Context Reject
6468 * Direction: network to MS
6470 static void
6471 dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6473 guint32 curr_offset;
6474 guint32 consumed;
6475 guint curr_len;
6477 curr_offset = offset;
6478 curr_len = len;
6480 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6481 /* Network to MS*/
6482 pinfo->link_dir = P2P_DIR_DL;
6484 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6486 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6488 ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
6490 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6494 * [8] 9.5.7 Request PDP context activation
6495 * Direction: network to MS
6497 static void
6498 dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6500 guint32 curr_offset;
6501 guint32 consumed;
6502 guint curr_len;
6504 curr_offset = offset;
6505 curr_len = len;
6507 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6508 /* Network to MS*/
6509 pinfo->link_dir = P2P_DIR_DL;
6511 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Offered PDP address" );
6513 ELEM_OPT_TLV( 0x28, GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL);
6515 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6517 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6521 * [8] 9.5.8 Request PDP context activation reject
6522 * Direction: MS to network
6524 static void
6525 dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6527 guint32 curr_offset;
6528 guint32 consumed;
6529 guint curr_len;
6531 curr_offset = offset;
6532 curr_len = len;
6534 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6535 /* MS to Network */
6536 pinfo->link_dir = P2P_DIR_UL;
6538 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6540 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6542 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6546 * [8] 9.5.9 Modify PDP context request (Network to MS direction)
6547 * Direction: network to MS
6549 static void
6550 dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6552 guint32 curr_offset;
6553 guint32 consumed;
6554 guint curr_len;
6556 curr_offset = offset;
6557 curr_len = len;
6559 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6560 /* Network to MS */
6561 pinfo->link_dir = P2P_DIR_DL;
6563 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL);
6564 #if 0
6565 /* This is done automatically */
6566 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SPARE, NULL);
6567 curr_offset--;
6568 curr_len++;
6569 #endif
6571 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
6573 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - New QoS" );
6575 ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - PDP address");
6577 ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
6579 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6581 ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
6583 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6587 * [8] 9.5.10 Modify PDP context request (MS to network direction)
6588 * Direction: MS to network
6590 static void
6591 dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6593 guint32 curr_offset;
6594 guint32 consumed;
6595 guint curr_len;
6597 curr_offset = offset;
6598 curr_len = len;
6600 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6601 /* MS to Network */
6602 pinfo->link_dir = P2P_DIR_UL;
6604 ELEM_OPT_TV( 0x32, GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI" );
6606 ELEM_OPT_TLV( 0x30, GSM_A_PDU_TYPE_GM, DE_QOS, " - Requested new QoS" );
6608 ELEM_OPT_TLV( 0x31, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, " - New TFT" );
6610 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6612 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6614 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6618 * [8] 9.5.11 Modify PDP context accept (MS to network direction)
6619 * Direction: MS to network
6621 static void
6622 dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6624 guint32 curr_offset;
6625 guint32 consumed;
6626 guint curr_len;
6628 curr_offset = offset;
6629 curr_len = len;
6631 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6632 /* MS to Network */
6633 pinfo->link_dir = P2P_DIR_UL;
6635 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6637 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6641 * [8] 9.5.12 Modify PDP context accept (Network to MS direction)
6642 * Direction: Network to MS
6644 static void
6645 dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6647 guint32 curr_offset;
6648 guint32 consumed;
6649 guint curr_len;
6651 curr_offset = offset;
6652 curr_len = len;
6654 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6655 /* Network to MS */
6656 pinfo->link_dir = P2P_DIR_DL;
6658 ELEM_OPT_TLV( 0x30, GSM_A_PDU_TYPE_GM, DE_QOS, " - Negotiated QoS" );
6660 ELEM_OPT_TV( 0x32, GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI" );
6662 ELEM_OPT_TV_SHORT ( 0x80, GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, " - New radio priority" );
6664 ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
6666 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6668 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6672 * [8] 9.5.13 Modify PDP Context Reject
6673 * Direction: both
6675 static void
6676 dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6678 guint32 curr_offset;
6679 guint32 consumed;
6680 guint curr_len;
6682 curr_offset = offset;
6683 curr_len = len;
6685 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6686 /* Network or the MS */
6687 pinfo->link_dir = LINK_DIR_UNKNOWN;
6690 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6692 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6694 ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
6696 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6700 * [8] 9.5.14 Deactivate PDP context request
6701 * Direction: both
6703 static void
6704 dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6706 guint32 curr_offset;
6707 guint32 consumed;
6708 guint curr_len;
6710 curr_offset = offset;
6711 curr_len = len;
6713 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6714 pinfo->link_dir = LINK_DIR_UNKNOWN;
6716 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6718 ELEM_OPT_TV_SHORT( 0x90, GSM_A_PDU_TYPE_GM, DE_TEAR_DOWN_IND, NULL);
6720 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6722 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6724 ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
6726 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6730 * [8] 9.5.15 Deactivate PDP context accept
6731 * Direction: both
6733 static void
6734 dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6736 guint32 curr_offset;
6737 guint32 consumed;
6738 guint curr_len;
6740 curr_offset = offset;
6741 curr_len = len;
6743 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6744 pinfo->link_dir = LINK_DIR_UNKNOWN;
6746 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6748 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6750 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6754 * [8] 9.5.15a Request Secondary PDP Context Activation
6755 * Direction: network to MS
6757 static void
6758 dtap_sm_req_sec_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6760 guint32 curr_offset;
6761 guint32 consumed;
6762 guint curr_len;
6764 curr_offset = offset;
6765 curr_len = len;
6767 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6768 pinfo->link_dir = P2P_DIR_DL;
6770 /* Required QoS Quality of service 10.5.6.5 M LV 13-17 */
6771 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Required QoS");
6773 /* Linked TI Linked TI 10.5.6.7 M LV 2-3 */
6774 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_LINKED_TI, NULL);
6776 /* 36 TFT Traffic Flow Template 10.5.6.12 O TLV 3-257 */
6777 ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
6779 /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
6780 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6782 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6786 * [8] 9.5.15b Request Secondary PDP Context Activation Reject
6787 * Direction: MS to network
6789 static void
6790 dtap_sm_req_sec_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6792 guint32 curr_offset;
6793 guint32 consumed;
6794 guint curr_len;
6796 curr_offset = offset;
6797 curr_len = len;
6799 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6800 pinfo->link_dir = P2P_DIR_UL;
6802 /* SM cause SM cause 10.5.6.6 M V 1 */
6803 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6805 /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
6806 ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
6808 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6812 * [8] 9.5.16a Notification
6813 * Direction: network to MS
6815 static void
6816 dtap_sm_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6818 guint32 curr_offset;
6819 guint32 consumed;
6820 guint curr_len;
6822 curr_offset = offset;
6823 curr_len = len;
6825 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6826 pinfo->link_dir = P2P_DIR_DL;
6828 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_SM_NOTIF_IND, NULL);
6830 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6834 * [8] 9.5.21 SM Status
6835 * Direction: both
6837 static void
6838 dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6840 guint32 curr_offset;
6841 guint32 consumed;
6842 guint curr_len;
6844 curr_offset = offset;
6845 curr_len = len;
6847 pinfo->p2p_dir = P2P_DIR_UNKNOWN;
6848 pinfo->link_dir = LINK_DIR_UNKNOWN;
6850 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6852 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6856 * [9] 9.5.22 Activate MBMS Context Request
6857 * Direction: MS to network
6859 static void
6860 dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6862 guint32 curr_offset;
6863 guint32 consumed;
6864 guint curr_len;
6866 curr_offset = offset;
6867 curr_len = len;
6869 pinfo->p2p_dir = P2P_DIR_RECV;
6871 /* Requested MBMS NSAPI Enhanced Network service access point identifier 10.5.6.16 M V */
6872 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_ENH_NSAPI, " - Requested MBMS NSAPI");
6874 /* Requested LLC SAPI LLC service access point identifier 10.5.6.9 M V 1 */
6875 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI");
6877 /* Supported MBMS bearer capabilities MBMS bearer capabilities 10.5.6.14 M LV 2 - 3 */
6878 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MBMS_BEARER_CAP, NULL );
6880 /* Requested multicast address Packet data protocol address 10.5.6.4 M LV 3 - 19 */
6881 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Requested multicast address" );
6883 /* Access point name Access point name 10.5.6.1 M LV 2 - 101 */
6884 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL );
6886 /* 35 MBMS protocol configuration options MBMS protocol configuration options 10.5.6.15 O TLV 3 - 253 */
6887 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6889 ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6891 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6895 * [9] 9.5.23 Activate MBMS Context Accept
6896 * Direction: network to MS
6898 static void
6899 dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6901 guint32 curr_offset;
6902 guint32 consumed;
6903 guint curr_len;
6905 curr_offset = offset;
6906 curr_len = len;
6908 pinfo->p2p_dir = P2P_DIR_SENT;
6910 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_TMGI, NULL);
6912 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI");
6914 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6916 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6920 * [9] 9.5.24 Activate MBMS Context Reject
6921 * Direction: network to MS
6923 static void
6924 dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6926 guint32 curr_offset;
6927 guint32 consumed;
6928 guint curr_len;
6930 curr_offset = offset;
6931 curr_len = len;
6933 pinfo->p2p_dir = P2P_DIR_SENT;
6935 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6937 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6939 ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
6941 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6945 * [9] 9.5.25 Request MBMS Context Activation
6946 * Direction: network to MS
6948 static void
6949 dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6951 guint32 curr_offset;
6952 guint32 consumed;
6953 guint curr_len;
6955 curr_offset = offset;
6956 curr_len = len;
6958 pinfo->p2p_dir = P2P_DIR_SENT;
6960 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Linked NSAPI");
6962 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Offered multicast address" );
6964 ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL );
6966 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6968 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6972 * [8] 9.5.26 Request MBMS Context Activation Reject
6973 * Direction: MS to network
6975 static void
6976 dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len)
6978 guint32 curr_offset;
6979 guint32 consumed;
6980 guint curr_len;
6982 curr_offset = offset;
6983 curr_len = len;
6985 pinfo->p2p_dir = P2P_DIR_RECV;
6987 ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL);
6989 ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
6991 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6994 #define NUM_GSM_DTAP_MSG_GMM (sizeof(gsm_a_dtap_msg_gmm_strings)/sizeof(value_string))
6995 static gint ett_gsm_dtap_msg_gmm[NUM_GSM_DTAP_MSG_GMM];
6996 static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
6997 dtap_gmm_attach_req, /* Attach Request */
6998 dtap_gmm_attach_acc, /* Attach Accept */
6999 dtap_gmm_attach_com, /* Attach Complete */
7000 dtap_gmm_attach_rej, /* Attach Reject */
7001 dtap_gmm_detach_req, /* Detach Request */
7002 dtap_gmm_detach_acc, /* Detach Accept */
7003 dtap_gmm_rau_req, /* Routing Area Update Request */
7004 dtap_gmm_rau_acc, /* Routing Area Update Accept */
7005 dtap_gmm_rau_com, /* Routing Area Update Complete */
7006 dtap_gmm_rau_rej, /* Routing Area Update Reject */
7007 dtap_gmm_service_req, /* Service Request */
7008 dtap_gmm_service_acc, /* Service Accept */
7009 dtap_gmm_service_rej, /* Service Reject */
7010 dtap_gmm_ptmsi_realloc_cmd, /* P-TMSI Reallocation Command */
7011 dtap_gmm_ptmsi_realloc_com, /* P-TMSI Reallocation Complete */
7012 dtap_gmm_auth_ciph_req, /* Authentication and Ciphering Req */
7013 dtap_gmm_auth_ciph_resp, /* Authentication and Ciphering Resp */
7014 dtap_gmm_auth_ciph_rej, /* Authentication and Ciphering Rej */
7015 dtap_gmm_auth_ciph_fail, /* Authentication and Ciphering Failure */
7016 dtap_gmm_ident_req, /* Identity Request */
7017 dtap_gmm_ident_res, /* Identity Response */
7018 dtap_gmm_status, /* GMM Status */
7019 dtap_gmm_information, /* GMM Information */
7020 NULL, /* NONE */
7023 #define NUM_GSM_DTAP_MSG_SM (sizeof(gsm_a_dtap_msg_sm_strings)/sizeof(value_string))
7024 static gint ett_gsm_dtap_msg_sm[NUM_GSM_DTAP_MSG_SM];
7025 static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len) = {
7026 dtap_sm_act_pdp_req, /* Activate PDP Context Request */
7027 dtap_sm_act_pdp_acc, /* Activate PDP Context Accept */
7028 dtap_sm_act_pdp_rej, /* Activate PDP Context Reject */
7029 dtap_sm_req_pdp_act, /* Request PDP Context Activation */
7030 dtap_sm_req_pdp_act_rej, /* Request PDP Context Activation rej. */
7031 dtap_sm_deact_pdp_req, /* Deactivate PDP Context Request */
7032 dtap_sm_deact_pdp_acc, /* Deactivate PDP Context Accept */
7033 dtap_sm_mod_pdp_req_net, /* Modify PDP Context Request(Network to MS direction) */
7034 dtap_sm_mod_pdp_acc_ms, /* Modify PDP Context Accept (MS to network direction) */
7035 dtap_sm_mod_pdp_req_ms, /* Modify PDP Context Request(MS to network direction) */
7036 dtap_sm_mod_pdp_acc_net, /* Modify PDP Context Accept (Network to MS direction) */
7037 dtap_sm_mod_pdp_rej, /* Modify PDP Context Reject */
7038 dtap_sm_act_sec_pdp_req, /* Activate Secondary PDP Context Request */
7039 dtap_sm_act_sec_pdp_acc, /* Activate Secondary PDP Context Accept */
7040 dtap_sm_act_sec_pdp_rej, /* Activate Secondary PDP Context Reject */
7041 NULL, /* Reserved: was allocated in earlier phases of the protocol */
7042 NULL, /* Reserved: was allocated in earlier phases of the protocol */
7043 NULL, /* Reserved: was allocated in earlier phases of the protocol */
7044 NULL, /* Reserved: was allocated in earlier phases of the protocol */
7045 NULL, /* Reserved: was allocated in earlier phases of the protocol */
7046 dtap_sm_status, /* SM Status */
7047 dtap_sm_act_mbms_req, /* Activate MBMS Context Request */
7048 dtap_sm_act_mbms_acc, /* Activate MBMS Context Accept */
7049 dtap_sm_act_mbms_rej, /* Activate MBMS Context Reject */
7050 dtap_sm_req_mbms_act, /* Request MBMS Context Activation */
7051 dtap_sm_req_mbms_rej, /* Request MBMS Context Activation Reject */
7052 dtap_sm_req_sec_pdp_act, /* Request Secondary PDP Context Activation */
7053 dtap_sm_req_sec_pdp_act_rej, /* Request Secondary PDP Context Activation Reject */
7054 dtap_sm_notif, /* Notification */
7055 NULL, /* NONE */
7058 void
7059 get_gmm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *dtap_msg_fcn)
7061 gint idx;
7063 *msg_str = try_val_to_str_idx((guint32) (oct & DTAP_GMM_IEI_MASK), gsm_a_dtap_msg_gmm_strings, &idx);
7064 *hf_idx = hf_gsm_a_dtap_msg_gmm_type;
7065 if (*msg_str != NULL) {
7066 *ett_tree = ett_gsm_dtap_msg_gmm[idx];
7067 *dtap_msg_fcn = dtap_msg_gmm_fcn[idx];
7070 return;
7073 void
7074 get_sm_msg_params(guint8 oct, const gchar **msg_str, int *ett_tree, int *hf_idx, msg_fcn *dtap_msg_fcn)
7076 gint idx;
7078 *msg_str = try_val_to_str_idx((guint32) (oct & DTAP_SM_IEI_MASK), gsm_a_dtap_msg_sm_strings, &idx);
7079 *hf_idx = hf_gsm_a_dtap_msg_sm_type;
7080 if (*msg_str != NULL) {
7081 *ett_tree = ett_gsm_dtap_msg_sm[idx];
7082 *dtap_msg_fcn = dtap_msg_sm_fcn[idx];
7085 return;
7088 /* Register the protocol with Wireshark */
7089 void
7090 proto_register_gsm_a_gm(void)
7092 guint i;
7093 guint last_offset;
7095 /* Setup list of header fields */
7097 static hf_register_info hf[] = {
7098 { &hf_gsm_a_dtap_msg_gmm_type,
7099 { "DTAP GPRS Mobility Management Message Type", "gsm_a.dtap.msg_gmm_type",
7100 FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_gmm_strings), 0x0,
7101 NULL, HFILL }
7103 { &hf_gsm_a_dtap_msg_sm_type,
7104 { "DTAP GPRS Session Management Message Type", "gsm_a.dtap.msg_sm_type",
7105 FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_sm_strings), 0x0,
7106 NULL, HFILL }
7108 { &hf_gsm_a_gm_elem_id,
7109 { "Element ID", "gsm_a.gm.elem_id",
7110 FT_UINT8, BASE_HEX, NULL, 0,
7111 NULL, HFILL }
7113 { &hf_gsm_a_sm_qos_delay_cls,
7114 { "Quality of Service Delay class", "gsm_a.gm.sm.qos.delay_cls",
7115 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_delay_cls_vals), 0x38,
7116 NULL, HFILL }
7118 { &hf_gsm_a_sm_qos_reliability_cls,
7119 { "Reliability class", "gsm_a.gm.sm.qos.reliability_cls",
7120 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_reliability_vals), 0x07,
7121 NULL, HFILL }
7123 { &hf_gsm_a_sm_qos_traffic_cls,
7124 { "Traffic class", "gsm_a.gm.sm.qos.traffic_cls",
7125 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traffic_cls_vals), 0xe0,
7126 NULL, HFILL }
7128 { &hf_gsm_a_sm_qos_del_order,
7129 { "Delivery order", "gsm_a.gm.sm.qos.del_order",
7130 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_del_order_vals), 0x18,
7131 NULL, HFILL }
7133 { &hf_gsm_a_sm_qos_del_of_err_sdu,
7134 { "Delivery of erroneous SDUs", "gsm_a.gm.sm.qos.del_of_err_sdu",
7135 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_del_of_err_sdu_vals), 0x07,
7136 NULL, HFILL }
7138 { &hf_gsm_a_sm_qos_ber,
7139 { "Residual Bit Error Rate (BER)", "gsm_a.gm.sm.qos.ber",
7140 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_ber_vals), 0xf0,
7141 NULL, HFILL }
7143 { &hf_gsm_a_sm_qos_sdu_err_rat,
7144 { "SDU error ratio", "gsm_a.gm.sm.qos.sdu_err_rat",
7145 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_sdu_err_rat_vals), 0x0f,
7146 NULL, HFILL }
7148 { &hf_gsm_a_sm_qos_traff_hdl_pri,
7149 { "Traffic handling priority", "gsm_a.gm.sm.qos.traff_hdl_pri",
7150 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traff_hdl_pri_vals), 0x03,
7151 NULL, HFILL }
7153 { &hf_gsm_a_gmm_split_pg_cycle_code,
7154 { "SPLIT PG CYCLE CODE", "gsm_a.gm.gmm.split_pg_cycle_code",
7155 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gsm_a_gmm_split_pg_cycle_code_strings_ext, 0x00,
7156 NULL, HFILL }
7158 { &hf_gsm_a_gmm_split_on_ccch,
7159 { "SPLIT on CCCH", "gsm_a.gm.gmm.split_on_ccch",
7160 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_split_on_ccch_value), 0x08,
7161 NULL, HFILL }
7163 { &hf_gsm_a_gmm_non_drx_timer,
7164 { "Non-DRX timer", "gsm_a.gm.gmm.non_drx_timer",
7165 FT_UINT8, BASE_DEC, VALS(gsm_a_gmm_non_drx_timer_strings), 0x07,
7166 NULL, HFILL }
7168 { &hf_gsm_a_gmm_cn_spec_drx_cycle_len_coef,
7169 { "CN Specific DRX cycle length coefficient", "gsm_a.gm.gmm.cn_spec_drx_cycle_len_coef",
7170 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_gmm_cn_spec_drx_cycle_len_coef_strings), 0xf0,
7171 NULL, HFILL }
7173 { &hf_gsm_a_sm_tft_op_code,
7174 { "TFT operation code", "gsm_a.gm.sm.tft.op_code",
7175 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_tft_op_code_vals), 0xe0,
7176 NULL, HFILL }
7178 { &hf_gsm_a_sm_tft_e_bit,
7179 { "E bit", "gsm_a.gm.sm.tft.e_bit",
7180 FT_BOOLEAN, 8, TFS(&gsm_a_sm_tft_e_bit), 0x10,
7181 NULL, HFILL }
7183 { &hf_gsm_a_sm_tft_pkt_flt,
7184 { "Number of packet filters", "gsm_a.gm.sm.tft.pkt_flt",
7185 FT_UINT8, BASE_DEC, NULL, 0x0f,
7186 NULL, HFILL }
7188 { &hf_gsm_a_sm_tft_pkt_flt_dir,
7189 { "Packet filter direction", "gsm_a.gm.sm.tft.pkt_flt_dir",
7190 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_tft_pkt_flt_dir_vals), 0x30,
7191 NULL, HFILL }
7193 { &hf_gsm_a_sm_tft_pkt_flt_id,
7194 { "Packet filter identifier", "gsm_a.gm.sm.tft.pkt_flt_id",
7195 FT_UINT8, BASE_DEC, NULL, 0x0f,
7196 NULL, HFILL }
7198 { &hf_gsm_a_sm_ip4_address,
7199 { "IPv4 address", "gsm_a.gm.sm.ip4_address",
7200 FT_IPv4, BASE_NONE, NULL, 0x0,
7201 NULL, HFILL }
7203 { &hf_gsm_a_sm_ip4_mask,
7204 { "IPv4 address mask", "gsm_a.gm.sm.ip4_mask",
7205 FT_IPv4, BASE_NONE, NULL, 0x0,
7206 NULL, HFILL }
7208 { &hf_gsm_a_sm_ip6_address,
7209 { "IPv6 address", "gsm_a.gm.sm.ip6_address",
7210 FT_IPv6, BASE_NONE, NULL, 0x0,
7211 NULL, HFILL }
7213 { &hf_gsm_a_sm_ip6_mask,
7214 { "IPv6 address mask", "gsm_a.gm.sm.ip6_mask",
7215 FT_IPv6, BASE_NONE, NULL, 0x0,
7216 NULL, HFILL }
7218 { &hf_gsm_a_sm_ip6_prefix_length,
7219 { "IPv6 prefix length", "gsm_a.gm.sm.ip6_prefix_length",
7220 FT_UINT8, BASE_DEC, NULL, 0x0,
7221 NULL, HFILL }
7223 { &hf_gsm_a_sm_tft_protocol_header,
7224 { "Protocol/header", "gsm_a.gm.sm.tft.protocol_header",
7225 FT_UINT8, BASE_HEX|BASE_EXT_STRING, (&ipproto_val_ext), 0x0,
7226 NULL, HFILL }
7228 { &hf_gsm_a_sm_tft_port,
7229 { "Port", "gsm_a.gm.sm.tft.port",
7230 FT_UINT16, BASE_DEC, NULL, 0x0,
7231 NULL, HFILL }
7233 { &hf_gsm_a_sm_tft_port_low,
7234 { "Low limit port", "gsm_a.gm.sm.tft.port_low",
7235 FT_UINT16, BASE_DEC, NULL, 0x0,
7236 NULL, HFILL }
7238 { &hf_gsm_a_sm_tft_port_high,
7239 { "High limit port", "gsm_a.gm.sm.tft.port_high",
7240 FT_UINT16, BASE_DEC, NULL, 0x0,
7241 NULL, HFILL }
7243 { &hf_gsm_a_sm_tft_security,
7244 { "IPSec security parameter index", "gsm_a.gm.sm.tft.security",
7245 FT_UINT32, BASE_HEX, NULL, 0x0,
7246 NULL, HFILL }
7248 { &hf_gsm_a_sm_tft_traffic_class,
7249 { "Type of service/Traffic class field", "gsm_a.gm.sm.tft.traffic_class",
7250 FT_UINT8, BASE_HEX, NULL, 0x0,
7251 NULL, HFILL }
7253 { &hf_gsm_a_sm_tft_traffic_mask,
7254 { "Mask field", "gsm_a.gm.sm.tft.traffic_mask",
7255 FT_UINT8, BASE_HEX, NULL, 0x0,
7256 NULL, HFILL }
7258 { &hf_gsm_a_sm_tft_flow_label_type,
7259 { "Flow Label Type", "gsm_a.gm.sm.tft.flow_label_type",
7260 FT_UINT24, BASE_HEX, NULL, 0x0FFFFF,
7261 NULL, HFILL }
7263 { &hf_gsm_a_sm_tft_param_id,
7264 { "Parameter identifier", "gsm_a.gm.sm.tft.param_id",
7265 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_tft_param_id_vals), 0x0,
7266 NULL, HFILL }
7268 { &hf_gsm_a_gmm_ptmsi_sig,
7269 { "P-TMSI Signature", "gsm_a.gm.gmm.ptmsi_sig",
7270 FT_UINT24, BASE_HEX, NULL, 0x0,
7271 NULL, HFILL }
7273 { &hf_gsm_a_gmm_ptmsi_sig2,
7274 { "P-TMSI Signature 2", "gsm_a.gm.gmm.ptmsi_sig2",
7275 FT_UINT24, BASE_HEX, NULL, 0x0,
7276 NULL, HFILL }
7278 { &hf_gsm_a_gm_acc_tech_type,
7279 { "Access Technology Type", "gsm_a.gm.gmm.acc_tech_type",
7280 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_acc_tech_type_vals), 0x0,
7281 NULL, HFILL }
7283 { &hf_gsm_a_gm_acc_cap_struct_len,
7284 { "Length in bits", "gsm_a.gm.gmm.acc_cap_struct_len",
7285 FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
7286 NULL, HFILL }
7288 { &hf_gsm_a_gm_sms_value,
7289 { "SMS_VALUE (Switch-Measure-Switch)", "gsm_a.gm.gmm.sms",
7290 FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0,
7291 NULL, HFILL }
7293 { &hf_gsm_a_gm_sm_value,
7294 { "(SM_VALUE) Switch-Measure", "gsm_a.gm.gmm.sm",
7295 FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0,
7296 NULL, HFILL }
7298 { &hf_gsm_a_gm_link_dir,
7299 { "Link direction", "gsm_a.gm.sm.link_dir",
7300 FT_INT32, BASE_DEC, VALS(gsm_a_gm_link_dir_vals), 0x0,
7301 NULL, HFILL }
7303 { &hf_gsm_a_gm_cause,
7304 { "GMM Cause", "gsm_a.gm.gmm.cause",
7305 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmm_cause_vals), 0x0,
7306 NULL, HFILL }
7308 { &hf_gsm_a_gm_add_upd_type,
7309 { "Additional update type", "gsm_a.gm.gmm.add_upd_type",
7310 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_add_upd_type_value), 0x0,
7311 NULL, HFILL }
7313 { &hf_gsm_a_gm_fop,
7314 { "Follow-on proceed", "gsm_a.gm.gmm.fop",
7315 FT_BOOLEAN, 8, NULL, 0x08,
7316 NULL, HFILL }
7318 { &hf_gsm_a_gm_res_of_attach,
7319 { "Result of attach", "gsm_a.gm.gmm.res_of_attach",
7320 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_res_of_attach_vals), 0x07,
7321 NULL, HFILL }
7323 { &hf_gsm_a_gm_type_of_ciph_alg,
7324 { "Type of ciphering algorithm", "gsm_a.gm.gmm.type_of_ciph_alg",
7325 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_ciph_alg_vals), 0x07,
7326 NULL, HFILL }
7328 { &hf_gsm_a_gm_imeisv_req,
7329 { "IMEISV request", "gsm_a.gm.gmm.imeisv_req",
7330 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_gm_imeisv_req_vals), 0x00,
7331 NULL, HFILL }
7333 { &hf_gsm_a_gm_ac_ref_nr,
7334 { "A&C reference number", "gsm_a.gm.gmm.ac_ref_nr",
7335 FT_UINT8, BASE_DEC, NULL, 0x0,
7336 NULL, HFILL }
7338 { &hf_gsm_a_gm_force_to_standby,
7339 { "Force to standby", "gsm_a.gm.gmm.force_to_standby",
7340 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_gm_force_to_standby_vals), 0x00,
7341 NULL, HFILL }
7343 { &hf_gsm_a_gm_serv_type,
7344 { "Service type", "gsm_a.gm.gmm.serv_type",
7345 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_serv_type_vals), 0x00,
7346 NULL, HFILL }
7348 { &hf_gsm_a_gm_for,
7349 { "Follow-on request pending", "gsm_a.gm.gmm.for",
7350 FT_BOOLEAN, 8, NULL, 0x08,
7351 NULL, HFILL }
7353 { &hf_gsm_a_gm_type_of_attach,
7354 { "Type of attach", "gsm_a.gm.gmm.type_of_attach",
7355 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_attach_vals), 0x07,
7356 NULL, HFILL }
7358 { &hf_gsm_a_gm_tmsi_flag,
7359 { "TMSI flag", "gsm_a.gm.gmm.tmsi_flag",
7360 FT_BOOLEAN, 8, TFS(&gsm_a_gm_tmsi_flag_value), 0x01,
7361 NULL, HFILL }
7363 { &hf_gsm_a_gm_power_off,
7364 { "Power off", "gsm_a.gm.gmm.power_off",
7365 FT_BOOLEAN, 8, TFS(&gsm_a_gm_power_off_value), 0x08,
7366 NULL, HFILL }
7368 { &hf_gsm_a_gm_type_of_detach_mo,
7369 { "Type of detach", "gsm_a.gm.gmm.type_of_detach",
7370 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_detach_mo_vals), 0x07,
7371 NULL, HFILL }
7373 { &hf_gsm_a_gm_type_of_detach_mt,
7374 { "Type of detach", "gsm_a.gm.gmm.type_of_detach",
7375 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_detach_mt_vals), 0x07,
7376 NULL, HFILL }
7378 { &hf_gsm_a_gm_update_type,
7379 { "Update type", "gsm_a.gm.gmm.update_type",
7380 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_update_type_vals), 0x07,
7381 NULL, HFILL }
7383 { &hf_gsm_a_gm_gprs_timer_unit,
7384 { "Unit", "gsm_a.gm.gmm.gprs_timer_unit",
7385 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gprs_timer_unit_vals), 0xe0,
7386 NULL, HFILL }
7388 { &hf_gsm_a_gm_gprs_timer_value,
7389 { "Timer value", "gsm_a.gm.gmm.gprs_timer_value",
7390 FT_UINT8, BASE_DEC, NULL, 0x1f,
7391 NULL, HFILL }
7393 { &hf_gsm_a_gm_gprs_timer2_unit,
7394 { "Unit", "gsm_a.gm.gmm.gprs_timer2_unit",
7395 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gprs_timer_unit_vals), 0xe0,
7396 NULL, HFILL }
7398 { &hf_gsm_a_gm_gprs_timer2_value,
7399 { "Timer value", "gsm_a.gm.gmm.gprs_timer2_value",
7400 FT_UINT8, BASE_DEC, NULL, 0x1f,
7401 NULL, HFILL }
7403 { &hf_gsm_a_gm_gprs_timer3_unit,
7404 { "Unit", "gsm_a.gm.gmm.gprs_timer3_unit",
7405 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gprs_timer3_unit_vals), 0xe0,
7406 NULL, HFILL }
7408 { &hf_gsm_a_gm_gprs_timer3_value,
7409 { "Timer value", "gsm_a.gm.gmm.gprs_timer3_value",
7410 FT_UINT8, BASE_DEC, NULL, 0x1f,
7411 NULL, HFILL }
7413 { &hf_gsm_a_gm_nsapi_5_ul_stat,
7414 { "NSAPI(5) uplink status", "gsm_a.gm.gmm.nsapi_5_ul_stat",
7415 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7416 NULL, HFILL }
7418 { &hf_gsm_a_gm_nsapi_6_ul_stat,
7419 { "NSAPI(6) uplink status", "gsm_a.gm.gmm.nsapi_6_ul_stat",
7420 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7421 NULL, HFILL }
7423 { &hf_gsm_a_gm_nsapi_7_ul_stat,
7424 { "NSAPI(7) uplink status", "gsm_a.gm.gmm.nsapi_7_ul_stat",
7425 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7426 NULL, HFILL }
7428 { &hf_gsm_a_gm_nsapi_8_ul_stat,
7429 { "NSAPI(8) uplink status", "gsm_a.gm.gmm.nsapi_8_ul_stat",
7430 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7431 NULL, HFILL }
7433 { &hf_gsm_a_gm_nsapi_9_ul_stat,
7434 { "NSAPI(9) uplink status", "gsm_a.gm.gmm.nsapi_9_ul_stat",
7435 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7436 NULL, HFILL }
7438 { &hf_gsm_a_gm_nsapi_10_ul_stat,
7439 { "NSAPI(10) uplink status", "gsm_a.gm.gmm.nsapi_10_ul_stat",
7440 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7441 NULL, HFILL }
7443 { &hf_gsm_a_gm_nsapi_11_ul_stat,
7444 { "NSAPI(11) uplink status", "gsm_a.gm.gmm.nsapi_11_ul_stat",
7445 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7446 NULL, HFILL }
7448 { &hf_gsm_a_gm_nsapi_12_ul_stat,
7449 { "NSAPI(12) uplink status", "gsm_a.gm.gmm.nsapi_12_ul_stat",
7450 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7451 NULL, HFILL }
7453 { &hf_gsm_a_gm_nsapi_13_ul_stat,
7454 { "NSAPI(13) uplink status", "gsm_a.gm.gmm.nsapi_13_ul_stat",
7455 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7456 NULL, HFILL }
7458 { &hf_gsm_a_gm_nsapi_14_ul_stat,
7459 { "NSAPI(14) uplink status", "gsm_a.gm.gmm.nsapi_14_ul_stat",
7460 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7461 NULL, HFILL }
7463 { &hf_gsm_a_gm_nsapi_15_ul_stat,
7464 { "NSAPI(15) uplink status", "gsm_a.gm.gmm.nsapi_15_ul_stat",
7465 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
7466 NULL, HFILL }
7468 { &hf_gsm_a_gm_device_prop_low_prio,
7469 { "Low priority", "gsm_a.gm.gmm.device_prop_low_prio",
7470 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_device_prop_low_prio_value), 0x0,
7471 NULL, HFILL }
7473 { &hf_gsm_a_gm_apn,
7474 { "APN", "gsm_a.gm.sm.apn",
7475 FT_STRING,BASE_NONE, NULL,0x0,
7476 NULL, HFILL }
7478 { &hf_gsm_a_gm_pco_pid,
7479 { "Protocol or Container ID", "gsm_a.gm.sm.pco_pid",
7480 FT_UINT16, BASE_DEC, NULL, 0x0,
7481 NULL, HFILL }
7483 { &hf_gsm_a_gm_pco_app_spec_info,
7484 { "Application specific information", "gsm_a.gm.sm.app_spec_info",
7485 FT_BYTES, BASE_NONE, NULL, 0x0,
7486 NULL, HFILL }
7488 { &hf_gsm_a_gm_type_of_identity,
7489 { "Type of identity", "gsm_a.gm.gmm.type_of_identity",
7490 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_identity_vals), 0x07,
7491 NULL, HFILL }
7493 { &hf_gsm_a_gm_rac,
7494 { "Routing Area Code (RAC)", "gsm_a.gm.gmm.rac",
7495 FT_UINT8, BASE_HEX_DEC, NULL, 0x00,
7496 NULL, HFILL }
7498 { &hf_gsm_a_gm_apc,
7499 { "APC", "gsm_a.gm.gmm.apc",
7500 FT_BOOLEAN, 8, TFS(&gsm_a_gm_apc_vals), 0x20,
7501 NULL, HFILL }
7503 { &hf_gsm_a_gm_otd_a,
7504 { "OTD-A", "gsm_a.gm.gmm.otd_a",
7505 FT_BOOLEAN, 8, TFS(&gsm_a_gm_otd_a_vals), 0x10,
7506 NULL, HFILL }
7508 { &hf_gsm_a_gm_otd_b,
7509 { "OTD-B", "gsm_a.gm.gmm.otd_b",
7510 FT_BOOLEAN, 8, TFS(&gsm_a_gm_otd_b_vals), 0x08,
7511 NULL, HFILL }
7513 { &hf_gsm_a_gm_gps_a,
7514 { "GPS-A", "gsm_a.gm.gmm.gps_a",
7515 FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_a_vals), 0x04,
7516 NULL, HFILL }
7518 { &hf_gsm_a_gm_gps_b,
7519 { "GPS-B", "gsm_a.gm.gmm.gps_b",
7520 FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_b_vals), 0x02,
7521 NULL, HFILL }
7523 { &hf_gsm_a_gm_gps_c,
7524 { "GPS-C", "gsm_a.gm.gmm.gps_c",
7525 FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_c_vals), 0x01,
7526 NULL, HFILL }
7528 { &hf_gsm_a_gm_lcs_molr,
7529 { "LCS-MOLR", "gsm_a.gm.gmm.lcs_molr",
7530 FT_BOOLEAN, 8, TFS(&gsm_a_gm_lcs_molr_value), 0x08,
7531 NULL, HFILL }
7533 { &hf_gsm_a_gm_mbms,
7534 { "MBMS", "gsm_a.gm.gmm.mbms",
7535 FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
7536 NULL, HFILL }
7538 { &hf_gsm_a_gm_ims_vops,
7539 { "IMS VoPS", "gsm_a.gm.gmm.ims_vops",
7540 FT_BOOLEAN, 8, TFS(&gsm_a_gm_ims_vops_value), 0x02,
7541 "IMS voice over PS session indicator", HFILL }
7543 { &hf_gsm_a_gm_emc_bs,
7544 { "EMC BS", "gsm_a.gm.gmm.emc_bs",
7545 FT_BOOLEAN, 8, TFS(&gsm_a_gm_emc_bs_value), 0x01,
7546 "Emergency bearer services indicator", HFILL }
7548 { &hf_gsm_a_gm_gprs_sms,
7549 { "GPRS-SMS", "gsm_a.gm.gmm.gprs_sms",
7550 FT_BOOLEAN, 8, TFS(&gsm_a_gm_gprs_sms_value), 0x01,
7551 NULL, HFILL }
7553 { &hf_gsm_a_gm_req_ms_info_irat,
7554 { "I-RAT", "gsm_a.gm.gmm.req_ms_info_irat",
7555 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_req_ms_info_irat_vals), 0x0,
7556 NULL, HFILL }
7558 { &hf_gsm_a_gm_req_ms_info_irat2,
7559 { "I-RAT2", "gsm_a.gm.gmm.req_ms_info_irat2",
7560 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_req_ms_info_irat2_vals), 0x0,
7561 NULL, HFILL }
7563 { &hf_gsm_a_gm_ue_usage_setting,
7564 { "UE's usage setting", "gsm_a.gm.gmm.ue_usage_setting",
7565 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_ue_usage_setting_vals), 0x0,
7566 NULL, HFILL }
7568 { &hf_gsm_a_gm_voice_domain_pref_for_eutran,
7569 { "Voice domain preference for E-UTRAN", "gsm_a.gm.gmm.voice_domain_pref_for_eutran",
7570 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_voice_domain_pref_for_eutran_vals), 0x0,
7571 NULL, HFILL }
7573 { &hf_gsm_a_gm_ptmsi_type,
7574 { "P-TMSI type", "gsm_a.gm.gmm.ptmsi_type",
7575 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_ptmsi_type_value), 0x0,
7576 NULL, HFILL }
7578 { &hf_gsm_a_gm_nri_cont,
7579 { "NRI container value", "gsm_a.gm.gmm.nri_cont_value",
7580 FT_UINT16, BASE_HEX, NULL, 0xffc0,
7581 NULL, HFILL }
7583 { &hf_gsm_a_sm_pdp_type_org,
7584 { "PDP type organization", "gsm_a.gm.sm.pdp_type_org",
7585 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_pdp_type_org_vals), 0x0f,
7586 NULL, HFILL }
7588 { &hf_gsm_a_sm_qos_mean_thr,
7589 { "Mean throughput", "gsm_a.gm.sm.qos.mean_throughput",
7590 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_qos_mean_thr_vals), 0x1f,
7591 NULL, HFILL }
7593 { &hf_gsm_a_sm_qos_peak_thr,
7594 { "Peak throughput", "gsm_a.gm.sm.qos.peak_throughput",
7595 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_qos_peak_thr_vals), 0xf0,
7596 NULL, HFILL }
7598 { &hf_gsm_a_sm_qos_prec_class,
7599 { "Precedence class", "gsm_a.gm.sm.qos.prec_class",
7600 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_qos_prec_class_vals), 0x07,
7601 NULL, HFILL }
7603 { &hf_gsm_a_sm_qos_trans_delay,
7604 { "Transfer delay", "gsm_a.gm.sm.qos.trans_delay",
7605 FT_UINT8, BASE_DEC, NULL, 0xfc,
7606 NULL, HFILL }
7608 { &hf_gsm_a_sm_qos_signalling_ind,
7609 { "Signalling indication", "gsm_a.gm.sm.qos.signalling_ind",
7610 FT_BOOLEAN, 8, TFS(&gsm_a_sm_qos_signalling_ind_value), 0x10,
7611 NULL, HFILL }
7613 { &hf_gsm_a_sm_qos_source_stat_desc,
7614 { "Source statistics description", "gsm_a.gm.sm.qos.source_stat_desc",
7615 FT_UINT8, BASE_DEC, NULL, 0x0f,
7616 NULL, HFILL }
7618 { &hf_gsm_a_sm_qos_max_bitrate_upl,
7619 { "Maximum bitrate for uplink", "gsm_a.gm.sm.qos.max_bitrate_upl",
7620 FT_UINT8, BASE_DEC, NULL, 0x0,
7621 NULL, HFILL }
7623 { &hf_gsm_a_sm_qos_max_bitrate_downl,
7624 { "Maximum bitrate for downlink", "gsm_a.gm.sm.qos.max_bitrate_downl",
7625 FT_UINT8, BASE_DEC, NULL, 0x0,
7626 NULL, HFILL }
7628 { &hf_gsm_a_sm_qos_guar_bitrate_upl,
7629 { "Guaranteed bitrate for uplink", "gsm_a.gm.sm.qos.guar_bitrate_upl",
7630 FT_UINT8, BASE_DEC, NULL, 0x0,
7631 NULL, HFILL }
7633 { &hf_gsm_a_sm_qos_guar_bitrate_downl,
7634 { "Guaranteed bitrate for downlink", "gsm_a.gm.sm.qos.guar_bitrate_downl",
7635 FT_UINT8, BASE_DEC, NULL, 0x0,
7636 NULL, HFILL }
7638 { &hf_gsm_a_sm_qos_max_bitrate_upl_ext,
7639 { "Maximum bitrate for uplink (extended)", "gsm_a.gm.sm.qos.max_bitrate_upl_ext",
7640 FT_UINT8, BASE_DEC, NULL, 0x0,
7641 NULL, HFILL }
7643 { &hf_gsm_a_sm_qos_max_bitrate_downl_ext,
7644 { "Maximum bitrate for downlink (extended)", "gsm_a.gm.sm.qos.max_bitrate_downl_ext",
7645 FT_UINT8, BASE_DEC, NULL, 0x0,
7646 NULL, HFILL }
7648 { &hf_gsm_a_sm_qos_guar_bitrate_upl_ext,
7649 { "Guaranteed bitrate for uplink (extended)", "gsm_a.gm.sm.qos.guar_bitrate_upl_ext",
7650 FT_UINT8, BASE_DEC, NULL, 0x0,
7651 NULL, HFILL }
7653 { &hf_gsm_a_sm_qos_guar_bitrate_downl_ext,
7654 { "Guaranteed bitrate for downlink (extended)", "gsm_a.gm.sm.qos.guar_bitrate_downl_ext",
7655 FT_UINT8, BASE_DEC, NULL, 0x0,
7656 NULL, HFILL }
7658 { &hf_gsm_a_sm_qos_max_bitrate_upl_ext2,
7659 { "Maximum bitrate for uplink (extended-2)", "gsm_a.gm.sm.qos.max_bitrate_upl_ext2",
7660 FT_UINT8, BASE_DEC, NULL, 0x0,
7661 NULL, HFILL }
7663 { &hf_gsm_a_sm_qos_max_bitrate_downl_ext2,
7664 { "Maximum bitrate for downlink (extended-2)", "gsm_a.gm.sm.qos.max_bitrate_downl_ext2",
7665 FT_UINT8, BASE_DEC, NULL, 0x0,
7666 NULL, HFILL }
7668 { &hf_gsm_a_sm_qos_guar_bitrate_upl_ext2,
7669 { "Guaranteed bitrate for uplink (extended-2)", "gsm_a.gm.sm.qos.guar_bitrate_upl_ext2",
7670 FT_UINT8, BASE_DEC, NULL, 0x0,
7671 NULL, HFILL }
7673 { &hf_gsm_a_sm_qos_guar_bitrate_downl_ext2,
7674 { "Guaranteed bitrate for downlink (extended-2)", "gsm_a.gm.sm.qos.guar_bitrate_downl_ext2",
7675 FT_UINT8, BASE_DEC, NULL, 0x0,
7676 NULL, HFILL }
7678 { &hf_gsm_a_sm_cause,
7679 { "SM Cause", "gsm_a.gm.sm.cause",
7680 FT_UINT8, BASE_DEC, NULL, 0x0,
7681 NULL, HFILL }
7683 { &hf_gsm_a_sm_cause_2,
7684 { "SM Cause 2", "gsm_a.gm.sm.cause_2",
7685 FT_UINT8, BASE_DEC, NULL, 0x0,
7686 NULL, HFILL }
7688 { &hf_gsm_a_sm_llc_sapi,
7689 { "LLC SAPI", "gsm_a.gm.sm.llc_sapi",
7690 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_llc_sapi_vals), 0x0f,
7691 NULL, HFILL }
7693 { &hf_gsm_a_sm_tdi,
7694 { "Tear Down Indicator (TDI)", "gsm_a.gm.sm.tdi",
7695 FT_BOOLEAN, 8, TFS(&gsm_a_sm_tdi_value), 0x01,
7696 NULL, HFILL }
7698 { &hf_gsm_a_sm_packet_flow_id,
7699 { "Packet Flow Identifier (PFI)", "gsm_a.gm.sm.packet_flow_id",
7700 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_packet_flow_id_vals), 0x7f,
7701 NULL, HFILL }
7703 { &hf_gsm_a_gmm_net_cap_gea1,
7704 { "GEA/1", "gsm_a.gm.gmm.net_cap.gea1",
7705 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x80,
7706 NULL, HFILL }
7708 { &hf_gsm_a_gmm_net_cap_smdch,
7709 { "SM capabilities via dedicated channels", "gsm_a.gm.gmm.net_cap.smdch",
7710 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smdch_vals), 0x40,
7711 NULL, HFILL }
7713 { &hf_gsm_a_gmm_net_cap_smgprs,
7714 { "SM capabilities via GPRS channels", "gsm_a.gm.gmm.net_cap.smgprs",
7715 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smgprs_vals), 0x20,
7716 NULL, HFILL }
7718 { &hf_gsm_a_gmm_net_cap_ucs2,
7719 { "UCS2 support", "gsm_a.gm.gmm.net_cap.ucs2",
7720 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ucs2_vals), 0x10,
7721 NULL, HFILL }
7723 { &hf_gsm_a_gmm_net_cap_ss_scr_ind,
7724 { "SS Screening Indicator", "gsm_a.gm.gmm.net_cap.ss_scr_ind",
7725 FT_UINT8, BASE_HEX, VALS(gsm_a_gmm_net_cap_ss_scr_ind_vals), 0x0c,
7726 NULL, HFILL }
7728 { &hf_gsm_a_gmm_net_cap_solsa,
7729 { "SoLSA Capability", "gsm_a.gm.gmm.net_cap.solsa",
7730 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_solsa_vals), 0x02,
7731 NULL, HFILL }
7733 { &hf_gsm_a_gmm_net_cap_rev,
7734 { "Revision level indicator", "gsm_a.gm.gmm.net_cap.rev",
7735 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_rev_vals), 0x01,
7736 NULL, HFILL }
7738 { &hf_gsm_a_gmm_net_cap_pfc,
7739 { "PFC feature mode", "gsm_a.gm.gmm.net_cap.pfc",
7740 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_pfc_vals), 0x80,
7741 NULL, HFILL }
7743 { &hf_gsm_a_gmm_net_cap_ext_gea_bits,
7744 { "Extended GEA bits", "gsm_a.gm.gmm.net_cap.ext_gea_bits",
7745 FT_UINT8, BASE_HEX, NULL, 0x7e,
7746 NULL, HFILL }
7748 { &hf_gsm_a_gmm_net_cap_gea2,
7749 { "GEA/2", "gsm_a.gm.gmm.net_cap.gea2",
7750 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x40,
7751 NULL, HFILL }
7753 { &hf_gsm_a_gmm_net_cap_gea3,
7754 { "GEA/3", "gsm_a.gm.gmm.net_cap.gea3",
7755 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x20,
7756 NULL, HFILL }
7758 { &hf_gsm_a_gmm_net_cap_gea4,
7759 { "GEA/4", "gsm_a.gm.gmm.net_cap.gea4",
7760 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x10,
7761 NULL, HFILL }
7763 { &hf_gsm_a_gmm_net_cap_gea5,
7764 { "GEA/5", "gsm_a.gm.gmm.net_cap.gea5",
7765 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x08,
7766 NULL, HFILL }
7768 { &hf_gsm_a_gmm_net_cap_gea6,
7769 { "GEA/6", "gsm_a.gm.gmm.net_cap.gea6",
7770 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x04,
7771 NULL, HFILL }
7773 { &hf_gsm_a_gmm_net_cap_gea7,
7774 { "GEA/7", "gsm_a.gm.gmm.net_cap.gea7",
7775 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x02,
7776 NULL, HFILL }
7778 { &hf_gsm_a_gmm_net_cap_lcs,
7779 { "LCS VA capability", "gsm_a.gm.gmm.net_cap.lcs",
7780 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_lcs_vals), 0x01,
7781 NULL, HFILL }
7783 { &hf_gsm_a_gmm_net_cap_ps_irat_iu,
7784 { "PS inter-RAT HO from GERAN to UTRAN Iu mode capability", "gsm_a.gm.gmm.net_cap.ps_irat_iu",
7785 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_iu_vals), 0x80,
7786 NULL, HFILL }
7788 { &hf_gsm_a_gmm_net_cap_ps_irat_s1,
7789 { "PS inter-RAT HO from GERAN to E-UTRAN S1 mode capability", "gsm_a.gm.gmm.net_cap.ps_irat_s1",
7790 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40,
7791 NULL, HFILL }
7793 { &hf_gsm_a_gmm_net_cap_comb_proc,
7794 { "EMM Combined procedures capability", "gsm_a.gm.gmm.net_cap.comb_proc",
7795 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_comb_proc_vals), 0x20,
7796 NULL, HFILL }
7798 { &hf_gsm_a_gmm_net_cap_isr,
7799 { "ISR support", "gsm_a.gm.gmm.net_cap.isr",
7800 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_isr_vals), 0x10,
7801 NULL, HFILL }
7803 { &hf_gsm_a_gmm_net_cap_srvcc_to_geran,
7804 { "SRVCC to GERAN/UTRAN capability", "gsm_a.gm.gmm.net_cap.srvcc_to_geran",
7805 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_srvcc_to_geran_vals), 0x08,
7806 NULL, HFILL }
7808 { &hf_gsm_a_gmm_net_cap_epc,
7809 { "EPC capability", "gsm_a.gm.gmm.net_cap.epc",
7810 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_epc_vals), 0x04,
7811 NULL, HFILL }
7813 { &hf_gsm_a_gmm_net_cap_nf,
7814 { "NF capability", "gsm_a.gm.gmm.net_cap.nf",
7815 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_nf_vals), 0x02,
7816 NULL, HFILL }
7818 { &hf_gsm_a_gmm_net_geran_net_sharing,
7819 { "GERAN network sharing capability", "gsm_a.gm.gmm.net_cap.geran_net_sharing",
7820 FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_geran_net_vals), 0x01,
7821 NULL, HFILL }
7823 { &hf_gsm_a_sm_tmgi,
7824 { "Temporary Mobile Group Identity (TMGI)", "gsm_a.gm.sm.tmgi",
7825 FT_UINT24, BASE_HEX, NULL, 0x0,
7826 NULL, HFILL }
7828 { &hf_gsm_a_sm_enh_nsapi,
7829 { "Enhanced NSAPI", "gsm_a.gm.sm.enh_nsapi",
7830 FT_UINT8, BASE_DEC, NULL, 0x0,
7831 NULL, HFILL }
7833 { &hf_gsm_a_sm_req_type,
7834 { "Request type", "gsm_a.gm.sm.req_type",
7835 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_req_type_vals), 0x07,
7836 NULL, HFILL }
7838 { &hf_gsm_a_sm_notif_ind,
7839 { "Notification indicator value", "gsm_a.gm.sm.notif_ind",
7840 FT_UINT8, BASE_DEC, VALS(gsm_a_sm_notif_ind_vals), 0x0,
7841 NULL, HFILL }
7843 { &hf_gsm_a_sm_connectivity_type,
7844 { "Connectivity type value", "gsm_a.gm.sm.connectivity_type",
7845 FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_connectivity_type_vals), 0x0F,
7846 NULL, HFILL }
7848 { &hf_gsm_a_gm_rac_ctrled_early_cm_sending,
7849 { "Controlled early Classmark Sending", "gsm_a.gm.gmm.rac.ctrled_early_cm_sending",
7850 FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
7851 NULL, HFILL }
7853 { &hf_gsm_a_gm_rac_pseudo_sync,
7854 { "Pseudo Synchronisation", "gsm_a.gm.gmm.rac.pseudo_sync",
7855 FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
7856 NULL, HFILL }
7858 { &hf_gsm_a_gm_rac_vgcs,
7859 { "Voice Group Call Service", "gsm_a.gm.gmm.rac.vgcs",
7860 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_vgcs), 0x0,
7861 NULL, HFILL }
7863 { &hf_gsm_a_gm_rac_vbs,
7864 { "Voice Broadcast Service", "gsm_a.gm.gmm.rac.vbs",
7865 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_vbs), 0x0,
7866 NULL, HFILL }
7868 { &hf_gsm_a_gm_rac_multislot_capability,
7869 { "Multislot capability struct", "gsm_a.gm.gmm.rac.multislot_capability",
7870 FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
7871 NULL, HFILL }
7873 { &hf_gsm_a_gm_rac_hscsd_multi_slot_class,
7874 { "HSCSD multislot class", "gsm_a.gm.gmm.rac.hscsd_multi_slot_class",
7875 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
7876 NULL, HFILL }
7878 { &hf_gsm_a_gm_rac_gprs_multi_slot_class,
7879 { "GPRS multislot class", "gsm_a.gm.gmm.rac.gprs_multi_slot_class",
7880 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
7881 NULL, HFILL }
7883 { &hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap,
7884 { "GPRS Extended Dynamic Allocation Capability", "gsm_a.gm.gmm.rac.gprs_ext_dyn_alloc_cap",
7885 FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
7886 NULL, HFILL }
7888 { &hf_gsm_a_gm_rac_ecsd_multi_slot_class,
7889 { "ECSD multislot class", "gsm_a.gm.gmm.rac.ecsd_multi_slot_class",
7890 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
7891 NULL, HFILL }
7893 { &hf_gsm_a_gm_rac_egprs_multi_slot_class,
7894 { "EGPRS multislot class", "gsm_a.gm.gmm.rac.egprs_multi_slot_class",
7895 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
7896 NULL, HFILL }
7898 { &hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap,
7899 { "EGPRS Extended Dynamic Allocation Capability", "gsm_a.gm.gmm.rac.egprs_ext_dyn_alloc_cap",
7900 FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
7901 NULL, HFILL }
7903 { &hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class,
7904 { "DTM GPRS Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_gprs_multi_slot_class",
7905 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
7906 NULL, HFILL }
7908 { &hf_gsm_a_gm_rac_single_slt_dtm,
7909 { "Single Slot DTM", "gsm_a.gm.gmm.rac.single_slt_dtm",
7910 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7911 NULL, HFILL }
7913 { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres,
7914 { "DTM EGPRS Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_egprs_multi_slot_cls_pres",
7915 FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
7916 NULL, HFILL }
7918 { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class,
7919 { "DTM EGPRS Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_egprs_multi_slot_class",
7920 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
7921 NULL, HFILL }
7923 { &hf_gsm_a_gm_rac_8psk_pow_cap_pres,
7924 { "8PSK Power Capability Bits", "gsm_a.gm.gmm.rac.8psk_pow_cap_pres",
7925 FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
7926 NULL, HFILL }
7928 { &hf_gsm_a_gm_rac_comp_int_meas_cap,
7929 { "COMPACT Interference Measurement Capability", "gsm_a.gm.gmm.rac.comp_int_meas_cap",
7930 FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
7931 NULL, HFILL }
7933 { &hf_gsm_a_gm_rel_lev_ind,
7934 { "Revision Level Indicator", "gsm_a.gm.gmm.rel_lev_ind",
7935 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_revision_level_indicator), 0x0,
7936 NULL, HFILL }
7938 { &hf_gsm_a_gm_rac_umts_fdd_cap,
7939 { "UMTS FDD Radio Access Technology Capability", "gsm_a.gm.gmm.rac.umts_fdd_cap",
7940 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7941 NULL, HFILL }
7943 { &hf_gsm_a_gm_rac_umts_384_tdd_ra_cap,
7944 { "UMTS 3.84 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.gmm.rac.umts_384_tdd_ra_cap",
7945 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7946 NULL, HFILL }
7948 { &hf_gsm_a_gm_rac_cdma2000_cap,
7949 { "CDMA 2000 Radio Access Technology Capability", "gsm_a.gm.gmm.rac.cdma2000_cap",
7950 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7951 NULL, HFILL }
7953 { &hf_gsm_a_gm_rac_umts_128_tdd_ra_cap,
7954 { "UMTS 1.28 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.gmm.rac.umts_128_tdd_ra_cap",
7955 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7956 NULL, HFILL }
7958 { &hf_gsm_a_gm_rac_geran_feat_pkg,
7959 { "GERAN Feature Package 1", "gsm_a.gm.gmm.rac.geran_feat_pkg",
7960 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7961 NULL, HFILL }
7963 { &hf_gsm_a_gm_rac_mod_based_multi_slot_class_support,
7964 { "Modulation based multislot class support", "gsm_a.gm.gmm.rac.mod_based_multi_slot_class_support",
7965 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7966 NULL, HFILL }
7968 { &hf_gsm_a_gm_rac_geran_iu_mode_cap,
7969 { "GERAN Iu mode", "gsm_a.gm.gmm.rac.geran_iu_mode_cap",
7970 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7971 NULL, HFILL }
7973 { &hf_gsm_a_gm_rac_flo_iu_cap,
7974 { "FLO Iu Capability", "gsm_a.gm.gmm.rac.flo_iu_cap",
7975 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7976 NULL, HFILL }
7978 { &hf_gsm_a_gm_rac_mult_tbf_cap,
7979 { "Multiple TBF Capability", "gsm_a.gm.gmm.rac.mult_tbf_cap",
7980 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7981 NULL, HFILL }
7983 { &hf_gsm_a_gm_rac_down_adv_rec_perf,
7984 { "Downlink Advanced Receiver Performance", "gsm_a.gm.gmm.rac.down_adv_rec_perf",
7985 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_down_adv_rec_perf_vals), 0x0,
7986 NULL, HFILL }
7988 { &hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap,
7989 { "Extended RLC/MAC Control Message Segmentation Capability", "gsm_a.gm.gmm.rac.ext_rlc_mac_ctrl_msg_seg_cap",
7990 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
7991 NULL, HFILL }
7993 { &hf_gsm_a_gm_rac_dtm_enh_cap,
7994 { "DTM Enhancements Capability", "gsm_a.gm.gmm.rac.dtm_enh_cap",
7995 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_dtm_enh_cap), 0x0,
7996 NULL, HFILL }
7998 { &hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class,
7999 { "DTM GPRS High Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_gprs_high_multi_slot_class",
8000 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
8001 NULL, HFILL }
8003 { &hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class,
8004 { "DTM EGPRS High Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_egprs_high_multi_slot_class",
8005 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
8006 NULL, HFILL }
8008 { &hf_gsm_a_gm_rac_ps_ho_cap,
8009 { "PS Handover Capability", "gsm_a.gm.gmm.rac.ps_ho_cap",
8010 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8011 NULL, HFILL }
8013 { &hf_gsm_a_gm_rac_dtm_ho_cap,
8014 { "DTM Handover Capability", "gsm_a.gm.gmm.rac.dtm_ho_cap",
8015 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8016 NULL, HFILL }
8018 { &hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier,
8019 { "Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.gmm.rac.multi_slot_cap_red_down_dual_carrier",
8020 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
8021 NULL, HFILL }
8023 { &hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap,
8024 { "Downlink Dual Carrier for DTM Capability", "gsm_a.gm.gmm.rac.down_dual_carrier_dtm_cap",
8025 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8026 NULL, HFILL }
8028 { &hf_gsm_a_gm_rac_flex_ts_assign,
8029 { "Flexible Timeslot Assignment", "gsm_a.gm.gmm.rac.flex_ts_assign",
8030 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8031 NULL, HFILL }
8033 { &hf_gsm_a_gm_rac_gan_ps_ho_cap,
8034 { "GAN PS Handover Capability", "gsm_a.gm.gmm.rac.gan_ps_ho_cap",
8035 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8036 NULL, HFILL }
8038 { &hf_gsm_a_gm_rac_rlc_non_pers_mode,
8039 { "RLC Non-persistent Mode", "gsm_a.gm.gmm.rac.rlc_non_pers_mode",
8040 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8041 NULL, HFILL }
8043 { &hf_gsm_a_gm_rac_reduced_lat_cap,
8044 { "Reduced Latency Capability", "gsm_a.gm.gmm.rac.reduced_lat_cap",
8045 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8046 NULL, HFILL }
8048 { &hf_gsm_a_gm_rac_ul_egprs2,
8049 { "Uplink EGPRS2", "gsm_a.gm.gmm.rac.ul_egprs2",
8050 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_ul_egprs2_vals), 0x0,
8051 NULL, HFILL }
8053 { &hf_gsm_a_gm_rac_dl_egprs2,
8054 { "Downlink EGPRS2", "gsm_a.gm.gmm.rac.dl_egprs2",
8055 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dl_egprs2_vals), 0x0,
8056 NULL, HFILL }
8058 { &hf_gsm_a_gm_rac_eutra_fdd_support,
8059 { "E-UTRA FDD support", "gsm_a.gm.gmm.rac.eutra_fdd_support",
8060 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8061 NULL, HFILL }
8063 { &hf_gsm_a_gm_rac_eutra_tdd_support,
8064 { "E-UTRA TDD support", "gsm_a.gm.gmm.rac.eutra_tdd_support",
8065 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8066 NULL, HFILL }
8068 { &hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm,
8069 { "GERAN to E-UTRA support in GERAN packet transfer mode", "gsm_a.gm.gmm.rac.geran_to_eutra_support_in_geran_ptm",
8070 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals), 0x0,
8071 NULL, HFILL }
8073 { &hf_gsm_a_gm_rac_prio_based_resel_support,
8074 { "Priority-based reselection support", "gsm_a.gm.gmm.rac.prio_based_resel_support",
8075 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8076 NULL, HFILL }
8078 { &hf_gsm_a_gm_rac_alt_efta_multi_slot_class,
8079 { "Alternative EFTA Multislot Class", "gsm_a.gm.gmm.rac.alt_efta_multi_slot_class",
8080 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_alt_efta_multi_slot_class_vals), 0x0,
8081 NULL, HFILL }
8083 { &hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier,
8084 { "EFTA Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.gmm.rac.efta_multi_slot_cap_red_down_dual_carrier",
8085 FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
8086 NULL, HFILL }
8088 { &hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um,
8089 { "Indication of Upper Layer PDU Start Capability for RLC UM", "gsm_a.gm.gmm.rac.ind_up_layer_pdu_start_cap_for_rlc_um",
8090 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8091 NULL, HFILL }
8093 { &hf_gsm_a_gm_rac_emst_cap,
8094 { "Enhanced Multiplexing for Single TBF Capability", "gsm_a.gm.gmm.rac.emst_cap",
8095 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8096 NULL, HFILL }
8098 { &hf_gsm_a_gm_rac_mtti_cap,
8099 { "Multiple TTI Capability", "gsm_a.gm.gmm.rac.mtti_cap",
8100 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8101 NULL, HFILL }
8103 { &hf_gsm_a_gm_rac_utra_csg_cell_report,
8104 { "Reporting of UTRAN CSG cells in packet transfer mode", "gsm_a.gm.gmm.rac.utra_csg_cell_report",
8105 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8106 NULL, HFILL }
8108 { &hf_gsm_a_gm_rac_eutra_csg_cell_report,
8109 { "Reporting of E-UTRAN CSG cells in packet transfer mode", "gsm_a.gm.gmm.rac.eutra_csg_cell_report",
8110 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8111 NULL, HFILL }
8113 { &hf_gsm_a_gm_rac_dtr_cap,
8114 { "Dynamic Timeslot Reduction Capability", "gsm_a.gm.gmm.rac.dtr_cap",
8115 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8116 NULL, HFILL }
8118 { &hf_gsm_a_gm_rac_emsr_cap,
8119 { "Enhanced Multiplexing for Single RLC Entity Capability", "gsm_a.gm.gmm.rac.emsr_cap",
8120 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8121 NULL, HFILL }
8123 { &hf_gsm_a_gm_rac_fast_down_freq_switch_cap,
8124 { "Fast Downlink Frequency Switching Capability", "gsm_a.gm.gmm.rac.fast_down_freq_switch_cap",
8125 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8126 NULL, HFILL }
8128 { &hf_gsm_a_gm_rac_tighter_cap,
8129 { "TIGHTER Capability", "gsm_a.gm.gmm.rac.tighter_cap",
8130 FT_UINT8, BASE_DEC, VALS(tighter_cap_level_vals), 0x0,
8131 NULL, HFILL }
8133 { &hf_gsm_a_gm_rac_fanr_cap,
8134 { "Fast Ack/Nack Reporting Capability", "gsm_a.gm.gmm.rac.fanr_cap",
8135 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8136 NULL, HFILL }
8138 { &hf_gsm_a_gm_rac_ipa_cap,
8139 { "Immediate Packet Assignment Capability", "gsm_a.gm.gmm.rac.ipa_cap",
8140 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8141 NULL, HFILL }
8143 { &hf_gsm_a_gm_rac_geran_nw_sharing_support,
8144 { "GERAN Network Sharing support", "gsm_a.gm.gmm.rac.geran_nw_sharing_support",
8145 FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
8146 NULL, HFILL }
8148 { &hf_gsm_a_sm_ti_flag,
8149 { "TI Flag", "gsm_a.gm.sm.ti_flag",
8150 FT_BOOLEAN, 8, TFS(&gsm_a_sm_ti_flag_vals), 0x80,
8151 NULL, HFILL }
8153 { &hf_gsm_a_sm_ext,
8154 { "Extension", "gsm_a.gm.sm.ext",
8155 FT_BOOLEAN, 8, NULL, 0x80,
8156 NULL, HFILL }
8160 static ei_register_info ei[] = {
8161 { &ei_gsm_a_gm_extraneous_data, { "gsm_a.gm.extraneous_data", PI_PROTOCOL, PI_NOTE, "Extraneous Data, dissector bug or later version spec(report to wireshark.org)", EXPFILL }},
8164 expert_module_t* expert_gsm_a_gm;
8166 /* Setup protocol subtree array */
8167 #define NUM_INDIVIDUAL_ELEMS 7
8168 gint *ett[NUM_INDIVIDUAL_ELEMS +
8169 NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SM +
8170 NUM_GSM_GM_ELEM];
8172 ett[0] = &ett_gmm_radio_cap;
8173 ett[1] = &ett_gmm_rai;
8174 ett[2] = &ett_sm_tft;
8175 ett[3] = &ett_gmm_gprs_timer;
8176 ett[4] = &ett_gmm_network_cap;
8177 ett[5] = &ett_gsm_a_gm_msrac_multislot_capability;
8178 ett[6] = &ett_sm_pco;
8180 last_offset = NUM_INDIVIDUAL_ELEMS;
8182 for (i=0; i<NUM_GSM_DTAP_MSG_GMM; i++, last_offset++)
8184 ett_gsm_dtap_msg_gmm[i] = -1;
8185 ett[last_offset] = &ett_gsm_dtap_msg_gmm[i];
8188 for (i=0; i<NUM_GSM_DTAP_MSG_SM; i++, last_offset++)
8190 ett_gsm_dtap_msg_sm[i] = -1;
8191 ett[last_offset] = &ett_gsm_dtap_msg_sm[i];
8194 for (i=0; i<NUM_GSM_GM_ELEM; i++, last_offset++)
8196 ett_gsm_gm_elem[i] = -1;
8197 ett[last_offset] = &ett_gsm_gm_elem[i];
8200 proto_a_gm =
8201 proto_register_protocol("GSM A-I/F GPRS Mobility and Session Management", "GSM Management", "gsm_a.gm");
8203 proto_register_field_array(proto_a_gm, hf, array_length(hf));
8205 proto_register_subtree_array(ett, array_length(ett));
8206 expert_gsm_a_gm = expert_register_protocol(proto_a_gm);
8207 expert_register_field_array(expert_gsm_a_gm, ei, array_length(ei));
8209 /* subdissector code */
8210 gprs_sm_pco_subdissector_table = register_dissector_table("sm_pco.protocol",
8211 "GPRS SM PCO PPP protocol", FT_UINT16, BASE_HEX);
8214 void
8215 proto_reg_handoff_gsm_a_gm(void)
8217 data_handle = find_dissector("data");
8218 rrc_irat_ho_info_handle = find_dissector("rrc.irat.irat_ho_info");
8219 lte_rrc_ue_eutra_cap_handle = find_dissector("lte-rrc.ue_eutra_cap");