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
20 * Mobile radio interface Layer 3 specification;
21 * Core network protocols;
23 * (3GPP TS 24.008 version 5.9.0 Release 5)
26 * Mobile radio interface Layer 3 specification;
27 * Core network protocols;
29 * (3GPP TS 24.008 version 6.7.0 Release 6)
30 * (3GPP TS 24.008 version 6.8.0 Release 6)
33 * Mobile radio interface Layer 3 specification;
34 * Core network protocols;
36 * (3GPP TS 24.008 version 9.6.0 Release 9)
39 * Mobile radio interface Layer 3 specification;
40 * Core network protocols;
42 * (3GPP TS 24.008 version 10.6.1 Release 10)
45 * Mobile radio interface Layer 3 specification;
46 * Core network protocols;
48 * (3GPP TS 24.008 version 11.7.0 Release 11)
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.
75 #include <epan/packet.h>
76 #include <epan/expert.h>
77 #include <epan/prefs.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"
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" },
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" },
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"},
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
= {
477 "No additional information (shall be interpreted as request for combined attach or combined tracking area updating)"
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
);
489 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_add_upd_type
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
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" },
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 */
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" },
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 */
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" },
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 */
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"
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 */
580 const true_false_string gsm_a_gm_power_off_value
= {
581 "power switched off",
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" },
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)" },
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_
)
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
);
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
);
616 /* no length check possible */
618 return (curr_offset
- offset
);
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)" },
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
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" },
755 * CN Specific DRX cycle length coefficient, octet 3
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" },
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_
)
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
);
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
);
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" },
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_
)
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 */
825 * [9] 10.5.5.7 Force to standby (higher nibble)
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_
)
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 */
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_
)
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
: "");
857 /* no length check possible */
859 return (curr_offset
- offset
);
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_
)
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
: "");
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
[] = {
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 */
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" },
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_
)
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 */
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_
)
937 curr_offset
= offset
;
939 if (len
== 0) return 0;
944 oct
= tvb_get_guint8(tvb
, curr_offset
);
946 oct
|= tvb_get_guint8(tvb
, curr_offset
+1);
950 proto_tree_add_text(tree
,
952 "NSAPI %d: 0x%02x (%u)",
960 oct
|= tvb_get_guint8(tvb
, curr_offset
+2);
964 proto_tree_add_text(tree
,
965 tvb
, curr_offset
-1, 2,
966 "NSAPI %d: 0x%02x (%u)",
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" },
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
= {
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"
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
;
1078 curr_offset
= offset
;
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
);
1099 proto_tree_add_item(tree
, hf_gsm_a_gmm_net_cap_rev
, tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
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
);
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
);
1148 EXTRANEOUS_DATA_CHECK_EXPERT(len
, curr_offset
- offset
, pinfo
, &ei_gsm_a_gm_extraneous_data
);
1150 return (curr_offset
- offset
);
1156 #define GET_DATA /* check if we have enough bits left */ \
1157 if (curr_bits_length < bits_needed) \
1159 /* check if oct has enough bits */ \
1160 if (bits_in_oct < bits_needed) \
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); \
1173 if (bits_in_oct != 0) \
1182 /* Access Technology Type */
1184 static const value_string gsm_a_gm_acc_tech_type_vals
[] = {
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" },
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))" },
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" },
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" },
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" },
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" },
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'" },
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'" },
1328 static const value_string gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals
[] = {
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'" },
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" },
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
;
1362 proto_item
*tf
= NULL
, *mc_item
= NULL
;
1363 proto_tree
*tf_tree
= NULL
, *mc_tree
= NULL
;
1368 guint add_octets
; /* octets which are covered by one element -1 */
1369 guint curr_bits_length
;
1375 guchar dtm_gprs_mslot
= 0;
1376 guchar dtm_egprs_mslot
= 4;
1377 gboolean finished
= TRUE
;
1380 curr_offset
= offset
;
1381 bit_offset
= offset
<<3;
1389 /* check for a new round */
1390 if ((curr_len
*8 + bits_in_oct
) < 11)
1393 /* now read the first 11 bits */
1394 curr_bits_length
= 11;
1398 if (curr_len
!= len
)
1403 if ((oct
>>(32-bits_needed
)) != 1)
1407 oct
<<= bits_needed
;
1408 bits_in_oct
-= bits_needed
;
1411 if ((curr_len
*8 + bits_in_oct
) < 11)
1413 curr_bits_length
= 11;
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
);
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
);
1434 curr_bits_length
-= bits_needed
;
1435 oct
<<= bits_needed
;
1436 bits_in_oct
-= bits_needed
;
1438 /* < Access capabilities struct > ::= */
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;
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 */
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
));
1483 curr_bits_length
-= bits_needed
;
1484 oct
<<= bits_needed
;
1485 bits_in_oct
-= bits_needed
;
1490 * No more valid data, get spare bits if any
1492 while (curr_bits_length
> 0)
1494 if (curr_bits_length
> 8)
1497 bits_needed
= curr_bits_length
;
1499 curr_bits_length
-= bits_needed
;
1500 oct
<<= bits_needed
;
1501 bits_in_oct
-= bits_needed
;
1502 bit_offset
+= bits_needed
;
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
);
1518 curr_bits_length
-= bits_needed
;
1519 oct
<<= bits_needed
;
1520 bits_in_oct
-= bits_needed
;
1528 value
= tvb_get_bits8(tvb
, bit_offset
, 3);
1530 if (acc_type
== 0x04) /* GSM 1900 */
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)
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)
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";
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
);
1580 curr_bits_length
-= bits_needed
;
1581 oct
<<= bits_needed
;
1582 bits_in_oct
-= bits_needed
;
1590 value
= tvb_get_bits8(tvb
, bit_offset
, 2);
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
);
1605 curr_bits_length
-= bits_needed
;
1606 oct
<<= bits_needed
;
1607 bits_in_oct
-= bits_needed
;
1609 } while (!finished
);
1620 value
= tvb_get_bits8(tvb
, bit_offset
, 3);
1622 if (acc_type
== 0x04) /* GSM 1900 */
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)
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)
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";
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
);
1661 curr_bits_length
-= bits_needed
;
1662 oct
<<= bits_needed
;
1663 bits_in_oct
-= bits_needed
;
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
));
1679 curr_bits_length
-= bits_needed
;
1680 oct
<<= bits_needed
;
1681 bits_in_oct
-= bits_needed
;
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
));
1692 curr_bits_length
-= bits_needed
;
1693 oct
<<= bits_needed
;
1694 bits_in_oct
-= bits_needed
;
1696 for (i
=1; i
<=7 ; i
++)
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
));
1716 curr_bits_length
-= bits_needed
;
1717 oct
<<= bits_needed
;
1718 bits_in_oct
-= bits_needed
;
1728 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_ctrled_early_cm_sending
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
1730 curr_bits_length
-= bits_needed
;
1731 oct
<<= bits_needed
;
1732 bits_in_oct
-= bits_needed
;
1740 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_pseudo_sync
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
1742 curr_bits_length
-= bits_needed
;
1743 oct
<<= bits_needed
;
1744 bits_in_oct
-= bits_needed
;
1752 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_vgcs
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
1754 curr_bits_length
-= bits_needed
;
1755 oct
<<= bits_needed
;
1756 bits_in_oct
-= bits_needed
;
1764 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_vbs
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
1766 curr_bits_length
-= bits_needed
;
1767 oct
<<= bits_needed
;
1768 bits_in_oct
-= bits_needed
;
1771 * Multislot capability?
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
);
1781 curr_bits_length
-= bits_needed
;
1782 oct
<<= bits_needed
;
1783 bits_in_oct
-= bits_needed
;
1788 mc_tree
= proto_item_add_subtree(mc_item
, ett_gsm_a_gm_msrac_multislot_capability
);
1790 * HSCSD multislot class?
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
));
1802 curr_bits_length
-= bits_needed
;
1803 oct
<<= bits_needed
;
1804 bits_in_oct
-= bits_needed
;
1808 curr_bits_length
-= bits_needed
;
1809 oct
<<= bits_needed
;
1810 bits_in_oct
-= bits_needed
;
1814 * HSCSD multislot class
1819 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_hscsd_multi_slot_class
, tvb
, bit_offset
, 5, ENC_BIG_ENDIAN
);
1821 curr_bits_length
-= bits_needed
;
1822 oct
<<= bits_needed
;
1823 bits_in_oct
-= bits_needed
;
1827 * GPRS multislot class?
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
));
1839 curr_bits_length
-= bits_needed
;
1840 oct
<<= bits_needed
;
1841 bits_in_oct
-= bits_needed
;
1845 curr_bits_length
-= bits_needed
;
1846 oct
<<= bits_needed
;
1847 bits_in_oct
-= bits_needed
;
1851 * GPRS multislot class
1856 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_gprs_multi_slot_class
, tvb
, bit_offset
, 5, ENC_BIG_ENDIAN
);
1858 curr_bits_length
-= bits_needed
;
1859 oct
<<= bits_needed
;
1860 bits_in_oct
-= bits_needed
;
1863 * GPRS Extended Dynamic Allocation Capability
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
);
1870 curr_bits_length
-= bits_needed
;
1871 oct
<<= bits_needed
;
1872 bits_in_oct
-= bits_needed
;
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
));
1888 curr_bits_length
-= bits_needed
;
1889 oct
<<= bits_needed
;
1890 bits_in_oct
-= bits_needed
;
1894 curr_bits_length
-= bits_needed
;
1895 oct
<<= bits_needed
;
1896 bits_in_oct
-= bits_needed
;
1900 * Switch-Measure-Switch value
1906 proto_tree_add_bits_item(mc_tree
, hf_gsm_a_gm_sms_value
, tvb
, bit_offset
, 4, ENC_BIG_ENDIAN
);
1908 curr_bits_length
-= bits_needed
;
1909 oct
<<= bits_needed
;
1910 bits_in_oct
-= bits_needed
;
1913 * Switch-Measure value
1919 proto_tree_add_bits_item(mc_tree
, hf_gsm_a_gm_sm_value
, tvb
, bit_offset
, 4, ENC_BIG_ENDIAN
);
1921 curr_bits_length
-= bits_needed
;
1922 oct
<<= bits_needed
;
1923 bits_in_oct
-= bits_needed
;
1927 * ECSD multislot class?
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
));
1939 curr_bits_length
-= bits_needed
;
1940 oct
<<= bits_needed
;
1941 bits_in_oct
-= bits_needed
;
1945 curr_bits_length
-= bits_needed
;
1946 oct
<<= bits_needed
;
1947 bits_in_oct
-= bits_needed
;
1951 * ECSD multislot class
1956 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_ecsd_multi_slot_class
, tvb
, bit_offset
, 5, ENC_BIG_ENDIAN
);
1958 curr_bits_length
-= bits_needed
;
1959 oct
<<= bits_needed
;
1960 bits_in_oct
-= bits_needed
;
1964 * EGPRS multislot class?
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
;
1982 curr_bits_length
-= bits_needed
;
1983 oct
<<= bits_needed
;
1984 bits_in_oct
-= bits_needed
;
1988 * EGPRS multislot class
1993 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_egprs_multi_slot_class
, tvb
, bit_offset
, 5, ENC_BIG_ENDIAN
);
1995 curr_bits_length
-= bits_needed
;
1996 oct
<<= bits_needed
;
1997 bits_in_oct
-= bits_needed
;
2000 * EGPRS Extended Dynamic Allocation Capability
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
);
2007 curr_bits_length
-= bits_needed
;
2008 oct
<<= bits_needed
;
2009 bits_in_oct
-= bits_needed
;
2013 * DTM GPRS Multi Slot Class ?
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
));
2025 curr_bits_length
-= bits_needed
;
2026 oct
<<= bits_needed
;
2027 bits_in_oct
-= bits_needed
;
2031 curr_bits_length
-= bits_needed
;
2032 oct
<<= bits_needed
;
2033 bits_in_oct
-= bits_needed
;
2037 * DTM GPRS Multi Slot Class
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
);
2047 curr_bits_length
-= bits_needed
;
2048 oct
<<= bits_needed
;
2049 bits_in_oct
-= bits_needed
;
2057 proto_tree_add_bits_item(mc_tree
, hf_gsm_a_gm_rac_single_slt_dtm
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
2059 curr_bits_length
-= bits_needed
;
2060 oct
<<= bits_needed
;
2061 bits_in_oct
-= bits_needed
;
2064 * DTM EGPRS Multi Slot Class ?
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
);
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
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
);
2087 curr_bits_length
-= bits_needed
;
2088 oct
<<= bits_needed
;
2089 bits_in_oct
-= bits_needed
;
2095 * 8PSK Power Capability?
2100 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_8psk_pow_cap_pres
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
2102 curr_bits_length
-= bits_needed
;
2103 oct
<<= bits_needed
;
2104 bits_in_oct
-= bits_needed
;
2107 if ((oct
>>(32-bits_needed
)) == 1)
2110 * 8PSK Power Capability
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
));
2129 curr_bits_length
-= bits_needed
;
2130 oct
<<= bits_needed
;
2131 bits_in_oct
-= bits_needed
;
2135 * COMPACT Interference Measurement Capability
2140 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_comp_int_meas_cap
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
2142 curr_bits_length
-= bits_needed
;
2143 oct
<<= bits_needed
;
2144 bits_in_oct
-= bits_needed
;
2147 * Revision Level Indicator
2152 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rel_lev_ind
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
2154 curr_bits_length
-= bits_needed
;
2155 oct
<<= bits_needed
;
2156 bits_in_oct
-= bits_needed
;
2159 * UMTS FDD Radio Access Technology Capability
2164 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_umts_fdd_cap
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
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
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
);
2178 curr_bits_length
-= bits_needed
;
2179 oct
<<= bits_needed
;
2180 bits_in_oct
-= bits_needed
;
2183 * CDMA 2000 Radio Access Technology Capability
2188 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_cdma2000_cap
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
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
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
);
2202 curr_bits_length
-= bits_needed
;
2203 oct
<<= bits_needed
;
2204 bits_in_oct
-= bits_needed
;
2207 * GERAN Feature Package 1
2212 proto_tree_add_bits_item(tf_tree
, hf_gsm_a_gm_rac_geran_feat_pkg
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
2214 curr_bits_length
-= bits_needed
;
2215 oct
<<= bits_needed
;
2216 bits_in_oct
-= bits_needed
;
2219 * Extended DTM (E)GPRS Multi Slot Class
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
;
2238 curr_bits_length
-= bits_needed
;
2239 oct
<<= bits_needed
;
2240 bits_in_oct
-= bits_needed
;
2244 * Extended DTM GPRS Multi Slot Class
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
));
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
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
));
2313 curr_bits_length
-= bits_needed
;
2314 oct
<<= bits_needed
;
2315 bits_in_oct
-= bits_needed
;
2320 * Modulation based multislot class support
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
);
2327 curr_bits_length
-= bits_needed
;
2328 oct
<<= bits_needed
;
2329 bits_in_oct
-= bits_needed
;
2332 * High Multislot Capability
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
));
2344 curr_bits_length
-= bits_needed
;
2345 oct
<<= bits_needed
;
2346 bits_in_oct
-= bits_needed
;
2350 curr_bits_length
-= bits_needed
;
2351 oct
<<= bits_needed
;
2352 bits_in_oct
-= bits_needed
;
2356 * High Multislot Capability
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
));
2371 curr_bits_length
-= bits_needed
;
2372 oct
<<= bits_needed
;
2373 bits_in_oct
-= bits_needed
;
2377 * GERAN Iu Mode Capability
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
;
2390 /* GERAN Iu Mode Capabilities struct present */
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
;
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
;
2412 /* skip spare bits */
2413 bit_offset
+= value
;
2414 curr_bits_length
-= value
;
2416 bits_in_oct
-= value
;
2421 * GMSK Multislot Power Profile
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
));
2440 curr_bits_length
-= bits_needed
;
2441 oct
<<= bits_needed
;
2442 bits_in_oct
-= bits_needed
;
2445 * 8-PSK Multislot Power Profile
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
));
2463 curr_bits_length
-= bits_needed
;
2464 oct
<<= bits_needed
;
2465 bits_in_oct
-= bits_needed
;
2472 * Multiple TBF Capability
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
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
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
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
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
;
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
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
;
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
;
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
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
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
;
2590 * DTM Handover Capability
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
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
;
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
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
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
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
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
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
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
;
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
;
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
;
2714 * E-UTRA FDD support
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
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
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
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
;
2762 * Enhanced Flexible Timeslot Assignment
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
;
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
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
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
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
;
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
;
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
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
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
;
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
;
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
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
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
;
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
;
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
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)
2951 bits_needed
= curr_bits_length
;
2953 curr_bits_length
-= bits_needed
;
2954 oct
<<= bits_needed
;
2955 bits_in_oct
-= bits_needed
;
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
);
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"},
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. */
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
);
3038 /* no length check possible */
3040 return (curr_offset
- offset
);
3044 * [7] 10.5.5.15 Routing area identification
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
;
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)
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
);
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
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
);
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_
)
3114 guint32 curr_offset
;
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 */
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)",
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" },
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 */
3166 * [9] 10.5.5.19 A&C reference number (lower nibble)
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 */
3179 * [9] 10.5.5.19 A&C reference number (higher nibble)
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 */
3192 * [9] 10.5.5.20 Service type
3194 static const value_string gsm_a_gm_serv_type_vals
[] = {
3195 { 0x00, "Signalling" },
3197 { 0x02, "Paging response" },
3198 { 0x03, "MBMS Multicast Service Reception" },
3199 { 0x04, "MBMS Broadcast Service Reception" },
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_
)
3208 bit_offset
= offset
<< 3;
3209 proto_tree_add_bits_item(tree
, hf_gsm_a_spare_bits
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
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 */
3219 * [9] 10.5.5.21 Cell Notification
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"
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
);
3272 EXTRANEOUS_DATA_CHECK_EXPERT(len
, curr_offset
- offset
, pinfo
, &ei_gsm_a_gm_extraneous_data
);
3274 return (curr_offset
- offset
);
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"
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
);
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"
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
);
3326 return (curr_offset
- offset
);
3329 /* [7] 10.5.5.24 Inter RAT information container */
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
);
3344 proto_tree_add_text(tree
, tvb
, curr_offset
, len
, "INTER RAT HANDOVER INFO - Not decoded");
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"
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
;
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
);
3371 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_req_ms_info_irat2
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3373 proto_tree_add_bits_item(tree
, hf_gsm_a_spare_bits
, tvb
, bit_offset
, 2, ENC_BIG_ENDIAN
);
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 */
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
);
3399 proto_tree_add_text(tree
, tvb
, curr_offset
, len
, "E-UTRAN Inter RAT information container - Not decoded");
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
= {
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"},
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
;
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
);
3428 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_ue_usage_setting
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3430 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_voice_domain_pref_for_eutran
, tvb
, bit_offset
, 2, ENC_BIG_ENDIAN
);
3437 /* [10] 10.5.5.29 P-TMSI type */
3438 static const true_false_string gsm_a_gm_ptmsi_type_value
= {
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
);
3453 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_ptmsi_type
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3456 return (curr_offset
- offset
);
3459 /* [10] 10.5.5.30 Location Area Identification 2 */
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 */
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
;
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
);
3480 proto_tree_add_bits_item(tree
, hf_gsm_a_spare_bits
, tvb
, bit_offset
, 6, ENC_BIG_ENDIAN
);
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_
)
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
++)
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
,
3516 EXTRANEOUS_DATA_CHECK_EXPERT(len
, curr_offset
- offset
, pinfo
, &ei_gsm_a_gm_extraneous_data
);
3518 return (curr_offset
- offset
);
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_
)
3528 guint32 curr_offset
;
3531 curr_offset
= offset
;
3533 oct
= tvb_get_guint8(tvb
, curr_offset
);
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)",
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" },
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_
)
3572 proto_tree
*subtree
;
3573 proto_item
*item
= NULL
;
3575 oct
= tvb_get_guint8(tvb
, offset
);
3580 case 0: str
= "sec"; val
*=2; break;
3581 case 1: str
= "min"; break;
3582 case 2: str
= "min"; val
*=6; break;
3584 item
= proto_tree_add_text(tree
, tvb
, offset
, 1,
3585 "GPRS Timer: timer is deactivated");
3587 default: str
= "min";
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 */
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_
)
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
);
3624 case 0: str
= "sec"; val
*=2; break;
3625 case 1: str
= "min"; break;
3626 case 2: str
= "min"; val
*=6; break;
3628 item
= proto_tree_add_text(tree
, tvb
, curr_offset
, 1,
3629 "GPRS Timer: timer is deactivated");
3631 default: str
= "min";
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
);
3645 return (curr_offset
- offset
);
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" },
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_
)
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
);
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;
3687 item
= proto_tree_add_text(tree
, tvb
, curr_offset
, 1,
3688 "GPRS Timer: timer is deactivated");
3690 default: str
= "hr";
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
);
3703 return (curr_offset
- offset
);
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_
)
3713 guint32 curr_offset
;
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 */
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)",
3740 return (curr_offset
- offset
);
3744 * [8] 10.5.7.6 MBMS context status
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
;
3753 curr_offset
= offset
;
3755 for (i
=0; i
<len
; i
++)
3757 oct
= tvb_get_guint8(tvb
, curr_offset
);
3761 proto_tree_add_text(tree
,
3762 tvb
, curr_offset
, 1,
3763 "NSAPI %d: %s (%u)", 128+i
*8+j
,
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"
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
;
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
);
3793 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_6_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3795 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_5_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3797 proto_tree_add_bits_item(tree
, hf_gsm_a_spare_bits
, tvb
, bit_offset
, 5, ENC_BIG_ENDIAN
);
3800 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_15_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3802 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_14_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3804 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_13_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3806 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_12_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3808 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_11_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3810 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_10_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3812 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_9_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3814 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_nsapi_8_ul_stat
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
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"
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
;
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
);
3841 proto_tree_add_bits_item(tree
, hf_gsm_a_gm_device_prop_low_prio
, tvb
, bit_offset
, 1, ENC_BIG_ENDIAN
);
3844 return (curr_offset
- offset
);
3850 #define MAX_APN_LENGTH 100
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
;
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
);
3866 while ((curr_len
< len
) && (curr_len
< MAX_APN_LENGTH
))
3868 guint step
= str
[curr_len
];
3869 str
[curr_len
] = '.';
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);
3877 EXTRANEOUS_DATA_CHECK_EXPERT(len
, curr_offset
- offset
, pinfo
, &ei_gsm_a_gm_extraneous_data
);
3879 return (curr_offset
- offset
);
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_
)
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
: "");
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" },
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" },
3951 static const value_string gsm_a_gm_link_dir_vals
[] = {
3953 { 0x0, "MS to network" },
3954 { 0x1, "Network to MS" },
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
;
3965 struct e_in6_addr ipv6_addrx
;
3968 proto_item
*pco_item
;
3969 proto_tree
*pco_tree
;
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)
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);
3995 while (curr_len
> 0)
4001 /* Protocol ID 1 octet 4
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
,
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")),
4014 pco_tree
= proto_item_add_subtree(pco_item
, ett_sm_pco
);
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
);
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
));
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
);
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"));
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
);
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
));
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
);
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
);
4085 dissector_handle_t handle
;
4086 handle
= dissector_get_uint_handle (gprs_sm_pco_subdissector_table
, prot
);
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
);
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
);
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" },
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
;
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;
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))
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");
4183 return (curr_offset
- offset
);
4187 proto_tree_add_text(tree
,
4188 tvb
, curr_offset
, 1,
4189 "No PDP address is included");
4191 return (curr_offset
- offset
);
4195 if (pdp_type_org
== 1)
4196 switch (pdp_type_num
)
4199 proto_tree_add_item(tree
, hf_gsm_a_sm_ip6_address
, tvb
, curr_offset
, 16, ENC_NA
);
4204 proto_tree_add_item(tree
, hf_gsm_a_sm_ip4_address
, tvb
, curr_offset
, 4, ENC_BIG_ENDIAN
);
4206 proto_tree_add_item(tree
, hf_gsm_a_sm_ip6_address
, tvb
, curr_offset
, 16, ENC_NA
);
4211 proto_tree_add_item(tree
, hf_gsm_a_sm_ip4_address
, tvb
, curr_offset
, 4, ENC_BIG_ENDIAN
);
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" },
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" },
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')" },
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')" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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 */
4370 qos_calc_bitrate(guint8 oct
)
4375 return 64 + (oct
-0x40) * 8;
4377 return 576 + (oct
-0x80) * 64;
4380 /* Helper function returning the extended bitrates in kbps */
4382 qos_calc_ext_bitrate(guint8 oct
)
4385 return 8600 + oct
* 100;
4387 return 16000 + (oct
-0x4a) * 1000;
4389 return 128000 + (oct
- 0xba) * 2000;
4393 qos_calc_ext2_bitrate(guint8 oct
)
4396 return (256 + oct
* 4);
4398 return (500 + (oct
-0x3d) * 10);
4400 return (1500 + (oct
-0xa1) * 100);
4406 * 10.5.6.5 Quality of service
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
;
4416 curr_offset
= offset
;
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
);
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
);
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
);
4435 NO_MORE_DATA_CHECK(len
);
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
);
4443 NO_MORE_DATA_CHECK(len
);
4446 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
4463 proto_tree_add_text(tree
,
4464 tvb
, curr_offset
, 1,
4465 "Maximum SDU size: %s (%u)", str
, oct
);
4469 NO_MORE_DATA_CHECK(len
);
4472 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
4485 NO_MORE_DATA_CHECK(len
);
4488 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
4501 NO_MORE_DATA_CHECK(len
);
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
);
4508 NO_MORE_DATA_CHECK(len
);
4511 oct
= tvb_get_guint8(tvb
, curr_offset
);
4516 case 0x00: str
= "Subscribed transfer delay/reserved"; break;
4517 case 0x3f: str
= "Reserved"; break;
4519 if (tmp_oct
<= 0x0f)
4520 temp32
= tmp_oct
* 10;
4521 else if (tmp_oct
<= 0x1f)
4522 temp32
= (tmp_oct
- 0x10) * 50 + 200;
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
);
4534 NO_MORE_DATA_CHECK(len
);
4537 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
4550 NO_MORE_DATA_CHECK(len
);
4553 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
4566 NO_MORE_DATA_CHECK(len
);
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
);
4574 if (tmp_oct
== 0x01)
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
);
4583 NO_MORE_DATA_CHECK(len
);
4586 oct
= tvb_get_guint8(tvb
, curr_offset
);
4589 str
= "Use the value indicated by the Maximum bit rate for downlink";
4592 temp32
= qos_calc_ext_bitrate(oct
);
4593 if (temp32
% 1000 == 0)
4594 str
= wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32
/ 1000);
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
);
4602 NO_MORE_DATA_CHECK(len
);
4605 oct
= tvb_get_guint8(tvb
, curr_offset
);
4608 str
= "Use the value indicated by the Guaranteed bit rate for downlink";
4611 temp32
= qos_calc_ext_bitrate(oct
);
4612 if (temp32
% 1000 == 0)
4613 str
= wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32
/ 1000);
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
);
4621 NO_MORE_DATA_CHECK(len
);
4623 /* Maximum bit rate for uplink (extended) Octet 17 */
4624 oct
= tvb_get_guint8(tvb
, curr_offset
);
4627 str
= "Use the value indicated by the Maximum bit rate for uplink";
4630 temp32
= qos_calc_ext_bitrate(oct
);
4631 if (temp32
% 1000 == 0)
4632 str
= wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32
/ 1000);
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
);
4640 NO_MORE_DATA_CHECK(len
);
4642 /* Guaranteed bit rate for uplink (extended) Octet 18 */
4643 oct
= tvb_get_guint8(tvb
, curr_offset
);
4646 str
= "Use the value indicated by the Guaranteed bit rate for uplink";
4649 temp32
= qos_calc_ext_bitrate(oct
);
4650 if (temp32
% 1000 == 0)
4651 str
= wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32
/ 1000);
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
);
4659 NO_MORE_DATA_CHECK(len
);
4661 /* Maximum bit rate for downlink (extended-2) Octet 19 */
4662 oct
= tvb_get_guint8(tvb
, curr_offset
);
4665 str
= "Use the value indicated by the Maximum bit rate for downlink";
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
);
4675 NO_MORE_DATA_CHECK(len
);
4677 /* Guaranteed bit rate for downlink (extended-2) Octet 20 */
4678 oct
= tvb_get_guint8(tvb
, curr_offset
);
4681 str
= "Use the value indicated by the Guaranteed bit rate for downlink";
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
);
4691 NO_MORE_DATA_CHECK(len
);
4693 /* Maximum bit rate for uplink (extended-2) Octet 21 */
4694 oct
= tvb_get_guint8(tvb
, curr_offset
);
4697 str
= "Use the value indicated by the Maximum bit rate for uplink";
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
);
4707 NO_MORE_DATA_CHECK(len
);
4709 /* Guaranteed bit rate for uplink (extended-2) Octet 22 */
4710 oct
= tvb_get_guint8(tvb
, curr_offset
);
4713 str
= "Use the value indicated by the Guaranteed bit rate for uplink";
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
);
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" },
4778 static value_string_ext gsm_a_sm_cause_vals_ext
= VALUE_STRING_EXT_INIT(gsm_a_sm_cause_vals
);
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_
)
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 */
4800 * [9] 10.5.6.6a SM cause 2
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_
)
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 */
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"
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
;
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.
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
);
4864 proto_tree_add_text(tree
,
4865 tvb
, curr_offset
, 1,
4866 "TI value: 0x%02x (%u)", (oct
>>4)&7, (oct
>>4)&7);
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" },
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 */
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"
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 */
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
}
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
;
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
);
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
[] = {
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"},
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"},
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"},
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
;
4991 guint8 pkt_fil_count
;
4998 gint pack_component_type
;
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
);
5010 pkt_fil_count
= oct
&0x0f;
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
);
5020 /* Packet filter list dissect */
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
)
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");
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
);
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");
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
);
5062 if ((curr_offset
-offset
) < 1) {
5063 proto_tree_add_text(tf_tree
, tvb
, curr_offset
, 1, "Not enough data");
5066 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
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");
5094 pack_component_type
= tvb_get_guint8(tvb
, curr_offset
);
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
) {
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
);
5109 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_ip4_mask
, tvb
, curr_offset
, 4, ENC_BIG_ENDIAN
);
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
);
5120 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_ip4_mask
, tvb
, curr_offset
, 4, ENC_BIG_ENDIAN
);
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
);
5131 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_ip6_mask
, tvb
, curr_offset
, 16, ENC_NA
);
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
);
5142 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_ip6_prefix_length
, tvb
, curr_offset
, 1, ENC_NA
);
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
);
5153 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_ip6_prefix_length
, tvb
, curr_offset
, 1, ENC_NA
);
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
);
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
);
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
);
5179 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_tft_port_high
, tvb
, curr_offset
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
5197 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_tft_port_high
, tvb
, curr_offset
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
5216 proto_tree_add_item(comp_tree
, hf_gsm_a_sm_tft_traffic_mask
, tvb
, curr_offset
, 1, ENC_BIG_ENDIAN
);
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
);
5232 str
= "not specified";
5233 curr_offset
+= pf_length
;
5234 curr_len
-= pf_length
;
5237 proto_item_append_text(tf
, "%s (%u)", str
, pack_component_type
);
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
) {
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
);
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
));
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
));
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)",
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
));
5285 curr_offset
+= pf_length
;
5286 curr_len
-= pf_length
;
5291 EXTRANEOUS_DATA_CHECK_EXPERT(len
, curr_offset
- offset
, pinfo
, &ei_gsm_a_gm_extraneous_data
);
5297 * [9] 10.5.6.13 Temporary Mobile Group Identity (TMGI)
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
);
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
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
;
5327 curr_offset
= offset
;
5329 oct
= tvb_get_guint8(tvb
, curr_offset
);
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
);
5342 NO_MORE_DATA_CHECK(len
);
5344 oct
= tvb_get_guint8(tvb
, curr_offset
);
5347 str
= "Use the value indicated by the Maximum bit rate for downlink";
5350 temp32
= qos_calc_ext_bitrate(oct
);
5351 if (temp32
% 1000 == 0)
5352 str
= wmem_strdup_printf(wmem_packet_scope(), "%u Mbps", temp32
/ 1000);
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
);
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
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
);
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
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_
)
5392 oct
= tvb_get_guint8(tvb
, offset
);
5396 else if (oct
< 0xff)
5397 str
= wmem_strdup_printf(wmem_packet_scope(), "NSAPI %u for Multimedia Broadcast/Multicast Service (MBMS) Multicast mode", oct
);
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 */
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" },
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 */
5431 * [9] 10.5.6.18 Notification indicator
5433 static const value_string gsm_a_sm_notif_ind_vals
[] = {
5435 { 0x1, "SRVCC handover cancelled, IMS session re-establishment required"},
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
);
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"},
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
);
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 */
5545 /* MESSAGE FUNCTIONS */
5551 dtap_gmm_attach_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5553 guint32 curr_offset
;
5557 curr_offset
= offset
;
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
);
5615 dtap_gmm_attach_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5617 guint32 curr_offset
;
5621 curr_offset
= offset
;
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");
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
);
5675 dtap_gmm_attach_com(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5678 guint32 curr_offset
;
5682 curr_offset
= offset
;
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
);
5698 dtap_gmm_attach_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5700 guint32 curr_offset
;
5704 curr_offset
= offset
;
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
);
5722 dtap_gmm_detach_req_MT(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5724 guint32 curr_offset
;
5728 curr_offset
= offset
;
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
);
5741 dtap_gmm_detach_req_MO(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5743 guint32 curr_offset
;
5747 curr_offset
= offset
;
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
);
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
);
5767 }else if (pinfo
->link_dir
== P2P_DIR_DL
) {
5768 dtap_gmm_detach_req_MT(tvb
, tree
, pinfo
, offset
, len
);
5771 /* Unknown direction. Try heuristics based on message length. */
5773 dtap_gmm_detach_req_MO(tvb
, tree
, pinfo
, offset
, len
);
5775 dtap_gmm_detach_req_MT(tvb
, tree
, pinfo
, offset
, len
);
5784 dtap_gmm_detach_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5786 guint32 curr_offset
;
5789 curr_offset
= offset
;
5792 pinfo
->p2p_dir
= P2P_DIR_RECV
;
5794 if (curr_len
== 0) {
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
);
5807 dtap_gmm_ptmsi_realloc_cmd(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5809 guint32 curr_offset
;
5813 curr_offset
= offset
;
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
);
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; */
5839 curr_offset
= offset
;
5842 pinfo
->p2p_dir
= P2P_DIR_RECV
;
5844 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len
, 0, pinfo
, &ei_gsm_a_gm_extraneous_data
);
5851 dtap_gmm_auth_ciph_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5853 guint32 curr_offset
;
5857 curr_offset
= offset
;
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
);
5879 dtap_gmm_auth_ciph_resp(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5881 guint32 curr_offset
;
5885 curr_offset
= offset
;
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
);
5905 dtap_gmm_auth_ciph_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5907 guint32 curr_offset
;
5910 curr_offset
= offset
;
5913 pinfo
->p2p_dir
= P2P_DIR_SENT
;
5915 EXTRANEOUS_DATA_CHECK_EXPERT(curr_len
, 0, pinfo
, &ei_gsm_a_gm_extraneous_data
);
5922 dtap_gmm_auth_ciph_fail(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5924 guint32 curr_offset
;
5928 curr_offset
= offset
;
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
);
5944 dtap_gmm_ident_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5946 guint32 curr_offset
;
5949 curr_offset
= offset
;
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
);
5963 dtap_gmm_ident_res(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5965 guint32 curr_offset
;
5969 curr_offset
= offset
;
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
);
5983 dtap_gmm_rau_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
5985 guint32 curr_offset
;
5989 curr_offset
= offset
;
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
);
6051 dtap_gmm_rau_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6053 guint32 curr_offset
;
6057 curr_offset
= offset
;
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
);
6111 dtap_gmm_rau_com(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6113 guint32 curr_offset
;
6117 curr_offset
= offset
;
6120 pinfo
->p2p_dir
= P2P_DIR_RECV
;
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
);
6135 dtap_gmm_rau_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6137 guint32 curr_offset
;
6141 curr_offset
= offset
;
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
);
6161 dtap_gmm_status(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6163 guint32 curr_offset
;
6167 curr_offset
= offset
;
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
6181 dtap_gmm_information(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6183 guint32 curr_offset
;
6187 curr_offset
= offset
;
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
);
6211 dtap_gmm_service_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6213 guint32 curr_offset
;
6217 curr_offset
= offset
;
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
);
6243 dtap_gmm_service_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6245 guint32 curr_offset
;
6249 curr_offset
= offset
;
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
);
6266 dtap_gmm_service_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6268 guint32 curr_offset
;
6272 curr_offset
= offset
;
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
6289 dtap_sm_act_pdp_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6291 guint32 curr_offset
;
6295 curr_offset
= offset
;
6298 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6326 dtap_sm_act_pdp_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6328 guint32 curr_offset
;
6332 curr_offset
= offset
;
6335 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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" );
6344 /* This is done automatically */
6345 ELEM_MAND_V( GSM_A_PDU_TYPE_GM
, DE_SPARE
, NULL
);
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
6370 dtap_sm_act_pdp_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6372 guint32 curr_offset
;
6376 curr_offset
= offset
;
6379 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6397 dtap_sm_act_sec_pdp_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6399 guint32 curr_offset
;
6403 curr_offset
= offset
;
6406 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6433 dtap_sm_act_sec_pdp_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6435 guint32 curr_offset
;
6439 curr_offset
= offset
;
6442 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
);
6453 /* This is done automatically */
6454 ELEM_MAND_V( GSM_A_PDU_TYPE_GM
, DE_SPARE
, NULL
);
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
6471 dtap_sm_act_sec_pdp_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6473 guint32 curr_offset
;
6477 curr_offset
= offset
;
6480 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6498 dtap_sm_req_pdp_act(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6500 guint32 curr_offset
;
6504 curr_offset
= offset
;
6507 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6525 dtap_sm_req_pdp_act_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6527 guint32 curr_offset
;
6531 curr_offset
= offset
;
6534 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6550 dtap_sm_mod_pdp_req_net(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6552 guint32 curr_offset
;
6556 curr_offset
= offset
;
6559 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
6561 pinfo
->link_dir
= P2P_DIR_DL
;
6563 ELEM_MAND_V( GSM_A_PDU_TYPE_GM
, DE_RAD_PRIO
, NULL
);
6565 /* This is done automatically */
6566 ELEM_MAND_V( GSM_A_PDU_TYPE_GM
, DE_SPARE
, NULL
);
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
6591 dtap_sm_mod_pdp_req_ms(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6593 guint32 curr_offset
;
6597 curr_offset
= offset
;
6600 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6622 dtap_sm_mod_pdp_acc_ms(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6624 guint32 curr_offset
;
6628 curr_offset
= offset
;
6631 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6645 dtap_sm_mod_pdp_acc_net(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6647 guint32 curr_offset
;
6651 curr_offset
= offset
;
6654 pinfo
->p2p_dir
= P2P_DIR_UNKNOWN
;
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
6676 dtap_sm_mod_pdp_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6678 guint32 curr_offset
;
6682 curr_offset
= offset
;
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
6704 dtap_sm_deact_pdp_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6706 guint32 curr_offset
;
6710 curr_offset
= offset
;
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
6734 dtap_sm_deact_pdp_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6736 guint32 curr_offset
;
6740 curr_offset
= offset
;
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
6758 dtap_sm_req_sec_pdp_act(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6760 guint32 curr_offset
;
6764 curr_offset
= offset
;
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
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
;
6796 curr_offset
= offset
;
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
6816 dtap_sm_notif(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6818 guint32 curr_offset
;
6822 curr_offset
= offset
;
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
6838 dtap_sm_status(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6840 guint32 curr_offset
;
6844 curr_offset
= offset
;
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
6860 dtap_sm_act_mbms_req(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6862 guint32 curr_offset
;
6866 curr_offset
= offset
;
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
6899 dtap_sm_act_mbms_acc(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6901 guint32 curr_offset
;
6905 curr_offset
= offset
;
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
6924 dtap_sm_act_mbms_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6926 guint32 curr_offset
;
6930 curr_offset
= offset
;
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
6949 dtap_sm_req_mbms_act(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6951 guint32 curr_offset
;
6955 curr_offset
= offset
;
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
6976 dtap_sm_req_mbms_rej(tvbuff_t
*tvb
, proto_tree
*tree
, packet_info
*pinfo
, guint32 offset
, guint len
)
6978 guint32 curr_offset
;
6982 curr_offset
= offset
;
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 */
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 */
7059 get_gmm_msg_params(guint8 oct
, const gchar
**msg_str
, int *ett_tree
, int *hf_idx
, msg_fcn
*dtap_msg_fcn
)
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
];
7074 get_sm_msg_params(guint8 oct
, const gchar
**msg_str
, int *ett_tree
, int *hf_idx
, msg_fcn
*dtap_msg_fcn
)
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
];
7088 /* Register the protocol with Wireshark */
7090 proto_register_gsm_a_gm(void)
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,
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,
7108 { &hf_gsm_a_gm_elem_id
,
7109 { "Element ID", "gsm_a.gm.elem_id",
7110 FT_UINT8
, BASE_HEX
, NULL
, 0,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
7198 { &hf_gsm_a_sm_ip4_address
,
7199 { "IPv4 address", "gsm_a.gm.sm.ip4_address",
7200 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
7203 { &hf_gsm_a_sm_ip4_mask
,
7204 { "IPv4 address mask", "gsm_a.gm.sm.ip4_mask",
7205 FT_IPv4
, BASE_NONE
, NULL
, 0x0,
7208 { &hf_gsm_a_sm_ip6_address
,
7209 { "IPv6 address", "gsm_a.gm.sm.ip6_address",
7210 FT_IPv6
, BASE_NONE
, NULL
, 0x0,
7213 { &hf_gsm_a_sm_ip6_mask
,
7214 { "IPv6 address mask", "gsm_a.gm.sm.ip6_mask",
7215 FT_IPv6
, BASE_NONE
, NULL
, 0x0,
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,
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,
7228 { &hf_gsm_a_sm_tft_port
,
7229 { "Port", "gsm_a.gm.sm.tft.port",
7230 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
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,
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,
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,
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,
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,
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,
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,
7268 { &hf_gsm_a_gmm_ptmsi_sig
,
7269 { "P-TMSI Signature", "gsm_a.gm.gmm.ptmsi_sig",
7270 FT_UINT24
, BASE_HEX
, NULL
, 0x0,
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,
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,
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,
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,
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,
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,
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,
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,
7314 { "Follow-on proceed", "gsm_a.gm.gmm.fop",
7315 FT_BOOLEAN
, 8, NULL
, 0x08,
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,
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,
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,
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,
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,
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,
7349 { "Follow-on request pending", "gsm_a.gm.gmm.for",
7350 FT_BOOLEAN
, 8, NULL
, 0x08,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
7474 { "APN", "gsm_a.gm.sm.apn",
7475 FT_STRING
,BASE_NONE
, NULL
,0x0,
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,
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,
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,
7494 { "Routing Area Code (RAC)", "gsm_a.gm.gmm.rac",
7495 FT_UINT8
, BASE_HEX_DEC
, NULL
, 0x00,
7499 { "APC", "gsm_a.gm.gmm.apc",
7500 FT_BOOLEAN
, 8, TFS(&gsm_a_gm_apc_vals
), 0x20,
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,
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,
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,
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,
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,
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,
7533 { &hf_gsm_a_gm_mbms
,
7534 { "MBMS", "gsm_a.gm.gmm.mbms",
7535 FT_BOOLEAN
, 8, TFS(&tfs_supported_not_supported
), 0x04,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
7678 { &hf_gsm_a_sm_cause
,
7679 { "SM Cause", "gsm_a.gm.sm.cause",
7680 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
7683 { &hf_gsm_a_sm_cause_2
,
7684 { "SM Cause 2", "gsm_a.gm.sm.cause_2",
7685 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
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,
7694 { "Tear Down Indicator (TDI)", "gsm_a.gm.sm.tdi",
7695 FT_BOOLEAN
, 8, TFS(&gsm_a_sm_tdi_value
), 0x01,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
7823 { &hf_gsm_a_sm_tmgi
,
7824 { "Temporary Mobile Group Identity (TMGI)", "gsm_a.gm.sm.tmgi",
7825 FT_UINT24
, BASE_HEX
, NULL
, 0x0,
7828 { &hf_gsm_a_sm_enh_nsapi
,
7829 { "Enhanced NSAPI", "gsm_a.gm.sm.enh_nsapi",
7830 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
8154 { "Extension", "gsm_a.gm.sm.ext",
8155 FT_BOOLEAN
, 8, NULL
, 0x80,
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
+
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
];
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
);
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");