Coverage Report

Created: 2026-06-30 07:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-gsm_a_gm.c
Line
Count
Source
1
/* packet-gsm_a_gm.c
2
 * Routines for GSM A Interface GPRS Mobility Management and GPRS Session Management
3
 *
4
 * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
5
 * In association with Telos Technology Inc.
6
 *
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.
12
 *
13
 * Various updates, enhancements and fixes
14
 * Copyright 2009, Gerasimos Dimitriadis <dimeg [AT] intracom.gr>
15
 * In association with Intracom Telecom SA
16
 *
17
 * Title    3GPP      Other
18
 *
19
 *   Reference [7]
20
 *   Mobile radio interface Layer 3 specification;
21
 *   Core network protocols;
22
 *   Stage 3
23
 *   (3GPP TS 24.008 version 5.9.0 Release 5)
24
 *
25
 *   Reference [8]
26
 *   Mobile radio interface Layer 3 specification;
27
 *   Core network protocols;
28
 *   Stage 3
29
 *   (3GPP TS 24.008 version 6.7.0 Release 6)
30
 *   (3GPP TS 24.008 version 6.8.0 Release 6)
31
 *
32
 *   Reference [9]
33
 *   Mobile radio interface Layer 3 specification;
34
 *   Core network protocols;
35
 *   Stage 3
36
 *   (3GPP TS 24.008 version 9.6.0 Release 9)
37
 *
38
 *   Reference [10]
39
 *   Mobile radio interface Layer 3 specification;
40
 *   Core network protocols;
41
 *   Stage 3
42
 *   (3GPP TS 24.008 version 10.6.1 Release 10)
43
 *
44
 *   Reference [11]
45
 *   Mobile radio interface Layer 3 specification;
46
 *   Core network protocols;
47
 *   Stage 3
48
 *   (3GPP TS 24.008 version 11.7.0 Release 11)
49
 *
50
 *   Reference [12]
51
 *   Mobile radio interface Layer 3 specification;
52
 *   Core network protocols;
53
 *   Stage 3
54
 *   (3GPP TS 24.008 version 12.10.0 Release 12)
55
 *
56
 *   Reference [13]
57
 *   Mobile radio interface Layer 3 specification;
58
 *   Core network protocols;
59
 *   Stage 3
60
 *   (3GPP TS 24.008 version 13.8.0 Release 13)
61
 *
62
 *   Reference [14]
63
 *   Mobile radio interface Layer 3 specification;
64
 *   Core network protocols;
65
 *   Stage 3
66
 *   (3GPP TS 24.008 version 14.6.0 Release 14)
67
 *
68
 *   Reference [15]
69
 *   Mobile radio interface Layer 3 specification;
70
 *   Core network protocols;
71
 *   Stage 3
72
 *   (3GPP TS 24.008 version 15.6.0 Release 15)
73
 *
74
 *   Reference [16]
75
 *   Mobile radio interface Layer 3 specification;
76
 *   Core network protocols;
77
 *   Stage 3
78
 *   (3GPP TS 24.008 version 16.6.0 Release 16)
79
 *
80
 *   Reference [17]
81
 *   Mobile radio interface Layer 3 specification;
82
 *   Core network protocols;
83
 *   Stage 3
84
 *   (3GPP TS 24.008 version 17.8.0 Release 17)
85
 *
86
 *   Reference [18]
87
 *   Mobile radio interface Layer 3 specification;
88
 *   Core network protocols;
89
 *   Stage 3
90
 *   (3GPP TS 24.008 version 18.8.0 Release 18)
91
 *
92
 *   Reference [19]
93
 *   Mobile radio interface Layer 3 specification;
94
 *   Core network protocols;
95
 *   Stage 3
96
 *   (3GPP TS 24.008 version 19.5.0 Release 19)
97
 *
98
 * Wireshark - Network traffic analyzer
99
 * By Gerald Combs <gerald@wireshark.org>
100
 * Copyright 1998 Gerald Combs
101
 *
102
 * SPDX-License-Identifier: GPL-2.0-or-later
103
 */
104
105
#include "config.h"
106
107
108
#include <epan/packet.h>
109
#include <epan/expert.h>
110
#include <epan/etypes.h>
111
#include <epan/tfs.h>
112
#include <epan/unit_strings.h>
113
#include <epan/iana-info.h>
114
#include <wsutil/array.h>
115
#include "packet-ber.h"
116
#include "packet-gsm_a_common.h"
117
#include "packet-e212.h"
118
#include "packet-ppp.h"
119
#include "packet-e164.h"
120
121
void proto_register_gsm_a_gm(void);
122
void proto_reg_handoff_gsm_a_gm(void);
123
124
/* PROTOTYPES/FORWARDS */
125
126
const value_string gsm_a_dtap_msg_gmm_strings[] = {
127
  { 0x01, "Attach Request" },
128
  { 0x02, "Attach Accept" },
129
  { 0x03, "Attach Complete" },
130
  { 0x04, "Attach Reject" },
131
  { 0x05, "Detach Request" },
132
  { 0x06, "Detach Accept" },
133
  { 0x08, "Routing Area Update Request" },
134
  { 0x09, "Routing Area Update Accept" },
135
  { 0x0a, "Routing Area Update Complete" },
136
  { 0x0b, "Routing Area Update Reject" },
137
  { 0x0c, "Service Request" },
138
  { 0x0d, "Service Accept" },
139
  { 0x0e, "Service Reject" },
140
  { 0x10, "P-TMSI Reallocation Command" },
141
  { 0x11, "P-TMSI Reallocation Complete" },
142
  { 0x12, "Authentication and Ciphering Req" },
143
  { 0x13, "Authentication and Ciphering Resp" },
144
  { 0x14, "Authentication and Ciphering Rej" },
145
  { 0x15, "Identity Request" },
146
  { 0x16, "Identity Response" },
147
  { 0x1c, "Authentication and Ciphering Failure" },
148
  { 0x20, "GMM Status" },
149
  { 0x21, "GMM Information" },
150
  { 0, NULL }
151
};
152
static value_string_ext gsm_a_dtap_msg_gmm_strings_ext = VALUE_STRING_EXT_INIT(gsm_a_dtap_msg_gmm_strings);
153
154
155
const value_string gsm_a_dtap_msg_sm_strings[] = {
156
  { 0x41, "Activate PDP Context Request" },
157
  { 0x42, "Activate PDP Context Accept" },
158
  { 0x43, "Activate PDP Context Reject" },
159
  { 0x44, "Request PDP Context Activation" },
160
  { 0x45, "Request PDP Context Activation rej." },
161
  { 0x46, "Deactivate PDP Context Request" },
162
  { 0x47, "Deactivate PDP Context Accept" },
163
  { 0x48, "Modify PDP Context Request(Network to MS direction)" },
164
  { 0x49, "Modify PDP Context Accept (MS to network direction)" },
165
  { 0x4a, "Modify PDP Context Request(MS to network direction)" },
166
  { 0x4b, "Modify PDP Context Accept (Network to MS direction)" },
167
  { 0x4c, "Modify PDP Context Reject" },
168
  { 0x4d, "Activate Secondary PDP Context Request" },
169
  { 0x4e, "Activate Secondary PDP Context Accept" },
170
  { 0x4f, "Activate Secondary PDP Context Reject" },
171
  { 0x50, "Reserved: was allocated in earlier phases of the protocol" },
172
  { 0x51, "Reserved: was allocated in earlier phases of the protocol" },
173
  { 0x52, "Reserved: was allocated in earlier phases of the protocol" },
174
  { 0x53, "Reserved: was allocated in earlier phases of the protocol" },
175
  { 0x54, "Reserved: was allocated in earlier phases of the protocol" },
176
  { 0x55, "SM Status" },
177
  { 0x56, "Activate MBMS Context Request" },
178
  { 0x57, "Activate MBMS Context Accept" },
179
  { 0x58, "Activate MBMS Context Reject" },
180
  { 0x59, "Request MBMS Context Activation" },
181
  { 0x5a, "Request MBMS Context Activation Reject" },
182
  { 0x5b, "Request Secondary PDP Context Activation" },
183
  { 0x5c, "Request Secondary PDP Context Activation Reject" },
184
  { 0x5d, "Notification" },
185
  { 0, NULL }
186
};
187
static value_string_ext gsm_a_dtap_msg_sm_strings_ext = VALUE_STRING_EXT_INIT(gsm_a_dtap_msg_sm_strings);
188
189
190
static const value_string gsm_gm_elem_strings[] = {
191
  /* GPRS Mobility Management Information Elements 10.5.5 */
192
  { DE_ADD_UPD_TYPE,     "Additional Update Type" },
193
  { DE_ATTACH_RES,     "Attach Result" },
194
  { DE_ATTACH_TYPE,    "Attach Type" },
195
  { DE_CIPH_ALG,       "Ciphering Algorithm" },
196
  { DE_INTEG_ALG,      "Integrity Algorithm" },
197
  { DE_TMSI_STAT,      "TMSI Status" },
198
  { DE_DETACH_TYPE,    "Detach Type" },
199
  { DE_DRX_PARAM,      "DRX Parameter" },
200
  { DE_FORCE_TO_STAND,     "Force to Standby" },
201
  { DE_FORCE_TO_STAND_H,     "Force to Standby" },
202
  { DE_P_TMSI_SIG,     "P-TMSI Signature" },
203
  { DE_P_TMSI_SIG_2,     "P-TMSI Signature 2" },
204
  { DE_ID_TYPE_2,      "Identity Type 2" },
205
  { DE_IMEISV_REQ,     "IMEISV Request" },
206
  { DE_REC_N_PDU_NUM_LIST,   "Receive N-PDU Numbers List" },
207
  { DE_MS_NET_CAP,     "MS Network Capability" },
208
  { DE_MS_RAD_ACC_CAP,     "MS Radio Access Capability" },
209
  { DE_GMM_CAUSE,      "GMM Cause" },
210
  { DE_RAI,      "Routing Area Identification" },
211
  { DE_RAI_2,      "Routing Area Identification 2" },
212
  { DE_UPD_RES,      "Update Result" },
213
  { DE_UPD_TYPE,       "Update Type" },
214
  { DE_AC_REF_NUM,     "A&C Reference Number" },
215
  { DE_AC_REF_NUM_H,     "A&C Reference Number" },
216
  { DE_SRVC_TYPE,      "Service Type" },
217
  { DE_CELL_NOT,       "Cell Notification" },
218
  { DE_PS_LCS_CAP,     "PS LCS Capability" },
219
  { DE_NET_FEAT_SUP,     "Network Feature Support" },
220
  { DE_ADD_NET_FEAT_SUP,     "Additional Network Feature Support" },
221
  { DE_RAT_INFO_CONTAINER,   "Inter RAT Information Container" },
222
  { DE_REQ_MS_INFO,    "Requested MS Information" },
223
  { DE_UE_NETWORK_CAP,     "UE Network Capability" },
224
  { DE_EUTRAN_IRAT_INFO_CONTAINER, "E-UTRAN Inter RAT Information Container" },
225
  { DE_VOICE_DOMAIN_PREF,    "Voice Domain Preference and UE's Usage Setting" },
226
  { DE_PTMSI_TYPE,     "P-TMSI Type" },
227
  { DE_LAI_2,      "Location Area Identification 2" },
228
  { DE_NET_RES_ID_CONT,    "Network Resource Identifier Container" },
229
  { DE_EXT_DRX_PARAMS,     "Extended DRX Parameters" },
230
  { DE_MAC,      "Message Authentication Code" },
231
  { DE_UP_INTEG_IND,     "User Plane Integrity Indicator" },
232
  { DE_DCN_ID,       "DCN-ID"},
233
  { DE_PLMN_ID_CN_OPERATOR,  "PLMN identity of the CN operator"},
234
  { DE_NON_3GPP_NW_PROV_POL,   "Non-3GPP NW provided policies"},
235
  /* Session Management Information Elements 10.5.6 */
236
  { DE_ACC_POINT_NAME,     "Access Point Name" },
237
  { DE_NET_SAPI,       "Network Service Access Point Identifier" },
238
  { DE_PRO_CONF_OPT,     "Protocol Configuration Options" },
239
  { DE_EXT_PRO_CONF_OPT,     "Extended Protocol Configuration Options" },
240
  { DE_PD_PRO_ADDR,    "Packet Data Protocol Address" },
241
  { DE_QOS,      "Quality Of Service" },
242
  { DE_RE_ATTEMPT_IND,     "Re-attempt Indicator" },
243
  { DE_EXT_QOS,      "Extended Quality Of Service" },
244
  { DE_SM_CAUSE,       "SM Cause" },
245
  { DE_SM_CAUSE_2,     "SM Cause 2" },
246
  { DE_LINKED_TI,      "Linked TI" },
247
  { DE_LLC_SAPI,       "LLC Service Access Point Identifier" },
248
  { DE_TEAR_DOWN_IND,    "Tear Down Indicator" },
249
  { DE_PACKET_FLOW_ID,     "Packet Flow Identifier" },
250
  { DE_TRAFFIC_FLOW_TEMPLATE,  "Traffic Flow Template" },
251
  { DE_TMGI,       "Temporary Mobile Group Identity (TMGI)" },
252
  { DE_MBMS_BEARER_CAP,    "MBMS bearer capabilities" },
253
  { DE_MBMS_PROT_CONF_OPT,   "MBMS protocol configuration options" },
254
  { DE_ENH_NSAPI,      "Enhanced network service access point identifier" },
255
  { DE_REQ_TYPE,       "Request type" },
256
  { DE_SM_NOTIF_IND,     "Notification indicator" },
257
  { DE_SM_CONNECTIVITY_TYPE,   "Connectivity type" },
258
  { DE_SM_WLAN_OFFLOAD_ACCEPT,   "WLAN offload acceptability" },
259
  { DE_NBIFOM_CONT,    "NBIFOM container" },
260
  /* GPRS Common Information Elements 10.5.7 */
261
  { DE_PDP_CONTEXT_STAT,     "PDP Context Status" },
262
  { DE_RAD_PRIO,       "Radio Priority" },
263
  { DE_GPRS_TIMER,     "GPRS Timer" },
264
  { DE_GPRS_TIMER_2,     "GPRS Timer 2" },
265
  { DE_GPRS_TIMER_3,     "GPRS Timer 3" },
266
  { DE_RAD_PRIO_2,     "Radio Priority 2"},
267
  { DE_MBMS_CTX_STATUS,    "MBMS context status"},
268
  { DE_UPLINK_DATA_STATUS,   "Uplink data status"},
269
  { DE_DEVICE_PROPERTIES,    "Device properties"},
270
  { 0, NULL }
271
};
272
value_string_ext gsm_gm_elem_strings_ext = VALUE_STRING_EXT_INIT(gsm_gm_elem_strings);
273
274
541
#define DTAP_GMM_IEI_MASK 0xff
275
130
#define DTAP_SM_IEI_MASK  0xff
276
277
/* Initialize the protocol and registered fields */
278
static int proto_a_gm;
279
280
static int hf_gsm_a_dtap_msg_gmm_type;
281
static int hf_gsm_a_dtap_msg_sm_type;
282
int hf_gsm_a_gm_elem_id;
283
static int hf_gsm_a_sm_qos_delay_cls;
284
static int hf_gsm_a_sm_qos_reliability_cls;
285
static int hf_gsm_a_sm_qos_traffic_cls;
286
static int hf_gsm_a_sm_qos_del_order;
287
static int hf_gsm_a_sm_qos_del_of_err_sdu;
288
static int hf_gsm_a_sm_qos_ber;
289
static int hf_gsm_a_sm_qos_sdu_err_rat;
290
static int hf_gsm_a_sm_qos_traff_hdl_pri;
291
292
static int hf_gsm_a_gmm_split_pg_cycle_code;
293
static int hf_gsm_a_gmm_split_on_ccch;
294
static int hf_gsm_a_gmm_non_drx_timer;
295
static int hf_gsm_a_gmm_cn_spec_drx_cycle_len_coef;
296
297
static int hf_gsm_a_gmm_ptmsi_sig;
298
static int hf_gsm_a_gmm_ptmsi_sig2;
299
300
static int hf_gsm_a_sm_tft_op_code;
301
static int hf_gsm_a_sm_tft_e_bit;
302
static int hf_gsm_a_sm_tft_pkt_flt;
303
static int hf_gsm_a_sm_tft_pkt_flt_id;
304
static int hf_gsm_a_sm_tft_pkt_flt_dir;
305
static int hf_gsm_a_sm_ip4_address;
306
static int hf_gsm_a_sm_ip4_mask;
307
static int hf_gsm_a_sm_ip6_address;
308
static int hf_gsm_a_sm_ip6_mask;
309
static int hf_gsm_a_sm_ip6_prefix_length;
310
static int hf_gsm_a_sm_tft_protocol_header;
311
static int hf_gsm_a_sm_tft_port;
312
static int hf_gsm_a_sm_tft_port_low;
313
static int hf_gsm_a_sm_tft_port_high;
314
static int hf_gsm_a_sm_tft_security;
315
static int hf_gsm_a_sm_tft_traffic_class;
316
static int hf_gsm_a_sm_tft_traffic_mask;
317
static int hf_gsm_a_sm_tft_flow_label_type;
318
static int hf_gsm_a_sm_tft_param_id;
319
static int hf_gsm_a_sm_tft_packet_filter;
320
static int hf_gsm_a_sm_tft_packet_evaluation_precedence;
321
static int hf_gsm_a_sm_tft_packet_filter_length;
322
static int hf_gsm_a_sm_tft_authorization_token_value;
323
static int hf_gsm_a_sm_tft_media_component_number_value;
324
static int hf_gsm_a_sm_tft_ip_flow_number;
325
static int hf_gsm_a_sm_tft_packet_filter_identifier;
326
static int hf_gsm_a_sm_tft_parameter_content;
327
static int hf_gsm_a_sm_tft_packet_filter_component_type_id;
328
static int hf_gsm_a_sm_tft_mac_addr;
329
static int hf_gsm_a_sm_tft_vlan_tag_vid;
330
static int hf_gsm_a_sm_tft_vlan_tag_pcp;
331
static int hf_gsm_a_sm_tft_vlan_tag_dei;
332
static int hf_gsm_a_sm_tft_ethertype;
333
static int hf_gsm_a_gm_acc_tech_type;
334
static int hf_gsm_a_gm_acc_cap_struct_len;
335
static int hf_gsm_a_gm_sms_value;
336
static int hf_gsm_a_gm_sm_value;
337
static int hf_gsm_a_gm_link_dir;
338
static int hf_gsm_a_gm_cause;
339
340
static int hf_gsm_a_gm_add_upd_type;
341
static int hf_gsm_a_gm_fop;
342
static int hf_gsm_a_gm_res_of_attach;
343
static int hf_gsm_a_gm_type_of_ciph_alg;
344
static int hf_gsm_a_gm_type_of_integ_alg;
345
static int hf_gsm_a_gm_imeisv_req;
346
static int hf_gsm_a_gm_nsapi;
347
static int hf_gsm_a_gm_ac_ref_nr;
348
static int hf_gsm_a_gm_force_to_standby;
349
static int hf_gsm_a_gm_serv_type;
350
static int hf_gsm_a_gm_for;
351
static int hf_gsm_a_gm_type_of_attach;
352
static int hf_gsm_a_gm_tmsi_flag;
353
static int hf_gsm_a_gm_power_off;
354
static int hf_gsm_a_gm_type_of_detach_mo;
355
static int hf_gsm_a_gm_type_of_detach_mt;
356
static int hf_gsm_a_gm_update_type;
357
static int hf_gsm_a_gm_gprs_timer;
358
static int hf_gsm_a_gm_gprs_timer_unit;
359
static int hf_gsm_a_gm_gprs_timer_value;
360
static int hf_gsm_a_gm_gprs_timer2;
361
static int hf_gsm_a_gm_gprs_timer2_unit;
362
static int hf_gsm_a_gm_gprs_timer2_value;
363
static int hf_gsm_a_gm_gprs_timer3;
364
static int hf_gsm_a_gm_gprs_timer3_unit;
365
static int hf_gsm_a_gm_gprs_timer3_value;
366
static int hf_gsm_a_gm_nsapi_5_ul_stat;
367
static int hf_gsm_a_gm_nsapi_6_ul_stat;
368
static int hf_gsm_a_gm_nsapi_7_ul_stat;
369
static int hf_gsm_a_gm_nsapi_8_ul_stat;
370
static int hf_gsm_a_gm_nsapi_9_ul_stat;
371
static int hf_gsm_a_gm_nsapi_10_ul_stat;
372
static int hf_gsm_a_gm_nsapi_11_ul_stat;
373
static int hf_gsm_a_gm_nsapi_12_ul_stat;
374
static int hf_gsm_a_gm_nsapi_13_ul_stat;
375
static int hf_gsm_a_gm_nsapi_14_ul_stat;
376
static int hf_gsm_a_gm_nsapi_15_ul_stat;
377
static int hf_gsm_a_gm_device_prop_low_prio;
378
static int hf_gsm_a_gm_apn;
379
static int hf_gsm_a_gm_pco_pid;
380
static int hf_gsm_a_gm_pco_app_spec_info;
381
static int hf_gsm_a_gm_type_of_identity;
382
int hf_gsm_a_gm_rac;
383
static int hf_gsm_a_gm_mta_e;
384
static int hf_gsm_a_gm_mta_r;
385
static int hf_gsm_a_gm_apc;
386
static int hf_gsm_a_gm_otd_a;
387
static int hf_gsm_a_gm_otd_b;
388
static int hf_gsm_a_gm_gps_a;
389
static int hf_gsm_a_gm_gps_b;
390
static int hf_gsm_a_gm_gps_c;
391
static int hf_gsm_a_gm_motd;
392
static int hf_gsm_a_gm_mta_a;
393
static int hf_gsm_a_gm_lcs_molr;
394
static int hf_gsm_a_gm_mbms;
395
static int hf_gsm_a_gm_ims_vops;
396
static int hf_gsm_a_gm_emc_bs;
397
static int hf_gsm_a_gm_epco;
398
static int hf_gsm_a_gm_restrict_ec;
399
static int hf_gsm_a_gm_gprs_sms;
400
static int hf_gsm_a_gm_req_ms_info_irat;
401
static int hf_gsm_a_gm_req_ms_info_irat2;
402
static int hf_gsm_a_gm_ue_usage_setting;
403
static int hf_gsm_a_gm_voice_domain_pref_for_eutran;
404
static int hf_gsm_a_gm_ptmsi_type;
405
static int hf_gsm_a_gm_nri_cont;
406
static int hf_gsm_a_gm_paging_time_window;
407
static int hf_gsm_a_gm_edrx_value;
408
static int hf_gsm_a_gm_ext_paging_time_window;
409
static int hf_gsm_a_gm_mac;
410
static int hf_gsm_a_gm_up_integ_ind;
411
static int hf_gsm_a_gm_dcn_id;
412
static int hf_gsm_a_gm_n3en_ind;
413
static int hf_gsm_a_sm_pdp_type_org;
414
static int hf_gsm_a_sm_qos_mean_thr;
415
static int hf_gsm_a_sm_qos_peak_thr;
416
static int hf_gsm_a_sm_qos_prec_class;
417
static int hf_gsm_a_sm_qos_trans_delay;
418
static int hf_gsm_a_sm_qos_signalling_ind;
419
static int hf_gsm_a_sm_qos_source_stat_desc;
420
static int hf_gsm_a_sm_qos_max_bitrate_upl;
421
static int hf_gsm_a_sm_qos_max_bitrate_downl;
422
static int hf_gsm_a_sm_qos_guar_bitrate_upl;
423
static int hf_gsm_a_sm_qos_guar_bitrate_downl;
424
static int hf_gsm_a_sm_qos_max_bitrate_upl_ext;
425
static int hf_gsm_a_sm_qos_max_bitrate_downl_ext;
426
static int hf_gsm_a_sm_qos_guar_bitrate_upl_ext;
427
static int hf_gsm_a_sm_qos_guar_bitrate_downl_ext;
428
static int hf_gsm_a_sm_qos_max_bitrate_upl_ext2;
429
static int hf_gsm_a_sm_qos_max_bitrate_downl_ext2;
430
static int hf_gsm_a_sm_qos_guar_bitrate_upl_ext2;
431
static int hf_gsm_a_sm_qos_guar_bitrate_downl_ext2;
432
static int hf_gsm_a_sm_qos_maximum_sdu_size;
433
static int hf_gsm_a_sm_eplmnc;
434
static int hf_gsm_a_sm_ratc;
435
static int hf_gsm_a_sm_cause;
436
static int hf_gsm_a_sm_cause_2;
437
static int hf_gsm_a_sm_llc_sapi;
438
static int hf_gsm_a_sm_tdi;
439
static int hf_gsm_a_sm_packet_flow_id;
440
static int hf_gsm_a_sm_tmgi;
441
static int hf_gsm_a_sm_enh_nsapi;
442
static int hf_gsm_a_sm_req_type;
443
static int hf_gsm_a_sm_notif_ind;
444
static int hf_gsm_a_sm_connectivity_type;
445
static int hf_gsm_a_sm_wlan_utran_offload_accept;
446
static int hf_gsm_a_sm_wlan_eutran_offload_accept;
447
static int hf_gsm_a_sm_nbifom_cont;
448
static int hf_gsm_a_gm_rac_ctrled_early_cm_sending;
449
static int hf_gsm_a_gm_rac_pseudo_sync;
450
static int hf_gsm_a_gm_rac_vgcs;
451
static int hf_gsm_a_gm_rac_vbs;
452
static int hf_gsm_a_gm_rac_multislot_capability;
453
static int hf_gsm_a_gm_rac_hscsd_multi_slot_class;
454
static int hf_gsm_a_gm_rac_gprs_multi_slot_class;
455
static int hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap;
456
static int hf_gsm_a_gm_rac_ecsd_multi_slot_class;
457
static int hf_gsm_a_gm_rac_egprs_multi_slot_class;
458
static int hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap;
459
static int hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class;
460
static int hf_gsm_a_gm_rac_single_slt_dtm;
461
static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres;
462
static int hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class;
463
static int hf_gsm_a_gm_rac_8psk_pow_cap_pres;
464
static int hf_gsm_a_gm_rac_comp_int_meas_cap;
465
static int hf_gsm_a_gm_rel_lev_ind;
466
static int hf_gsm_a_gm_rac_geran_feat_pkg;
467
static int hf_gsm_a_gm_rac_umts_fdd_cap;
468
static int hf_gsm_a_gm_rac_umts_384_tdd_ra_cap;
469
static int hf_gsm_a_gm_rac_cdma2000_cap;
470
static int hf_gsm_a_gm_rac_umts_128_tdd_ra_cap;
471
static int hf_gsm_a_gm_rac_mod_based_multi_slot_class_support;
472
static int hf_gsm_a_gm_rac_geran_iu_mode_cap;
473
static int hf_gsm_a_gm_rac_flo_iu_cap;
474
static int hf_gsm_a_gm_rac_mult_tbf_cap;
475
static int hf_gsm_a_gm_rac_down_adv_rec_perf;
476
static int hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap;
477
static int hf_gsm_a_gm_rac_dtm_enh_cap;
478
static int hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class;
479
static int hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class;
480
static int hf_gsm_a_gm_rac_ps_ho_cap;
481
static int hf_gsm_a_gm_rac_dtm_ho_cap;
482
static int hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier;
483
static int hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap;
484
static int hf_gsm_a_gm_rac_flex_ts_assign;
485
static int hf_gsm_a_gm_rac_gan_ps_ho_cap;
486
static int hf_gsm_a_gm_rac_rlc_non_pers_mode;
487
static int hf_gsm_a_gm_rac_reduced_lat_cap;
488
static int hf_gsm_a_gm_rac_ul_egprs2;
489
static int hf_gsm_a_gm_rac_dl_egprs2;
490
static int hf_gsm_a_gm_rac_eutra_fdd_support;
491
static int hf_gsm_a_gm_rac_eutra_tdd_support;
492
static int hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm;
493
static int hf_gsm_a_gm_rac_prio_based_resel_support;
494
static int hf_gsm_a_gm_rac_alt_efta_multi_slot_class;
495
static int hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier;
496
static int hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um;
497
static int hf_gsm_a_gm_rac_emst_cap;
498
static int hf_gsm_a_gm_rac_mtti_cap;
499
static int hf_gsm_a_gm_rac_utra_csg_cell_report;
500
static int hf_gsm_a_gm_rac_eutra_csg_cell_report;
501
static int hf_gsm_a_gm_rac_dtr_cap;
502
static int hf_gsm_a_gm_rac_emsr_cap;
503
static int hf_gsm_a_gm_rac_fast_down_freq_switch_cap;
504
static int hf_gsm_a_gm_rac_tighter_cap;
505
static int hf_gsm_a_gm_rac_fanr_cap;
506
static int hf_gsm_a_gm_rac_ipa_cap;
507
static int hf_gsm_a_gm_rac_geran_nw_sharing_support;
508
static int hf_gsm_a_gm_rac_eutra_wb_rsrq_support;
509
static int hf_gsm_a_gm_rac_utra_mfbi_support;
510
static int hf_gsm_a_gm_rac_eutra_mfbi_support;
511
static int hf_gsm_a_gm_rac_dlmc_non_contig_intra_band_recep;
512
static int hf_gsm_a_gm_rac_dlmc_inter_band_recep;
513
static int hf_gsm_a_gm_rac_dlmc_max_bandwidth;
514
static int hf_gsm_a_gm_rac_dlmc_max_nb_dl_ts;
515
static int hf_gsm_a_gm_rac_dlmc_max_nb_dl_carriers;
516
static int hf_gsm_a_gm_rac_ext_tsc_set_cap_support;
517
static int hf_gsm_a_gm_rac_ext_earfcn_value_range;
518
static int hf_gsm_a_gm_rac_ec_pch_mon_support;
519
static int hf_gsm_a_gm_rac_ms_sync_accuracy;
520
static int hf_gsm_a_gm_rac_ec_ul_cov_enh_support;
521
static int hf_gsm_a_gm_rac_mta_access_sec_support;
522
static int hf_gsm_a_gm_rac_ec_paging_ind_chan_mon_support;
523
static int hf_gsm_a_sm_ti_flag;
524
static int hf_gsm_a_sm_ext;
525
526
static int hf_gsm_a_gmm_net_cap_gea1;
527
static int hf_gsm_a_gmm_net_cap_smdch;
528
static int hf_gsm_a_gmm_net_cap_smgprs;
529
static int hf_gsm_a_gmm_net_cap_ucs2;
530
static int hf_gsm_a_gmm_net_cap_ss_scr_ind;
531
static int hf_gsm_a_gmm_net_cap_solsa;
532
static int hf_gsm_a_gmm_net_cap_rev;
533
static int hf_gsm_a_gmm_net_cap_pfc;
534
static int hf_gsm_a_gmm_net_cap_ext_gea_bits;
535
static int hf_gsm_a_gmm_net_cap_gea2;
536
static int hf_gsm_a_gmm_net_cap_gea3;
537
static int hf_gsm_a_gmm_net_cap_gea4;
538
static int hf_gsm_a_gmm_net_cap_gea5;
539
static int hf_gsm_a_gmm_net_cap_gea6;
540
static int hf_gsm_a_gmm_net_cap_gea7;
541
static int hf_gsm_a_gmm_net_cap_lcs;
542
static int hf_gsm_a_gmm_net_cap_ps_irat_iu;
543
static int hf_gsm_a_gmm_net_cap_ps_irat_s1;
544
static int hf_gsm_a_gmm_net_cap_comb_proc;
545
static int hf_gsm_a_gmm_net_cap_isr;
546
static int hf_gsm_a_gmm_net_cap_srvcc_to_geran;
547
static int hf_gsm_a_gmm_net_cap_epc;
548
static int hf_gsm_a_gmm_net_cap_nf;
549
static int hf_gsm_a_gmm_net_geran_net_sharing;
550
static int hf_gsm_a_gmm_net_cap_up_int_prot;
551
static int hf_gsm_a_gmm_net_cap_up_gia4;
552
static int hf_gsm_a_gmm_net_cap_up_gia5;
553
static int hf_gsm_a_gmm_net_cap_up_gia6;
554
static int hf_gsm_a_gmm_net_cap_up_gia7;
555
static int hf_gsm_a_gmm_net_cap_epco_ie_ind;
556
static int hf_gsm_a_gmm_net_cap_restrict_use_enh_cov;
557
static int hf_gsm_a_gmm_net_cap_dc_eutra_nr_cap;
558
559
/* Generated from convert_proto_tree_add_text.pl */
560
static int hf_gsm_a_gm_presence;
561
static int hf_gsm_a_gm_8psk_power_class;
562
static int hf_gsm_a_gm_rf_power_capability;
563
static int hf_gsm_a_gm_a5_bits;
564
static int hf_gsm_a_gm_8psk_power_capability;
565
static int hf_gsm_a_gm_extended_dtm_gprs_multi_slot_class;
566
static int hf_gsm_a_gm_extended_dtm_egprs_multi_slot_class;
567
static int hf_gsm_a_gm_high_multislot_capability;
568
static int hf_gsm_a_gm_gmsk_multislot_power_profile;
569
static int hf_gsm_a_gm_8psk_multislot_power_profile;
570
static int hf_gsm_a_gm_update_result;
571
static int hf_gsm_a_gm_radio_priority_pdp;
572
static int hf_gsm_a_gm_radio_priority_tom8;
573
static int hf_gsm_a_gm_configuration_protocol;
574
static int hf_gsm_a_gm_sm_pco_length;
575
static int hf_gsm_a_gm_sm_pco_length2;
576
static int hf_gsm_a_gm_sm_pco_pcscf_ipv6;
577
static int hf_gsm_a_gm_sm_pco_dns_ipv6;
578
static int hf_gsm_a_gm_sm_pco_dsmipv6_home_agent_ipv6;
579
static int hf_gsm_a_gm_sm_pco_dsmipv6_home_network_ipv6;
580
static int hf_gsm_a_gm_sm_pco_reject_code;
581
static int hf_gsm_a_gm_sm_pco_dsmipv6_home_network_prefix_length;
582
static int hf_gsm_a_gm_sm_pco_dsmipv6_home_agent_ipv4;
583
static int hf_gsm_a_gm_sm_pco_pcscf_ipv4;
584
static int hf_gsm_a_gm_sm_pco_dns_ipv4;
585
static int hf_gsm_a_gm_sm_pco_ipv4_link_mtu_size;
586
static int hf_gsm_a_gm_sm_pco_nbifom_mode;
587
static int hf_gsm_a_gm_sm_pco_non_ip_link_mtu_size;
588
static int hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_aer;
589
static int hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_ul_time_unit;
590
static int hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_max_ul_rate;
591
static int hf_gsm_a_gm_sm_pco_3gpp_data_off_ue_status;
592
static int hf_gsm_a_gm_sm_pco_sel_bearer_ctrl_mode;
593
static int hf_gsm_a_gm_sm_pco_add_apn_rate_ctrl_params_ul_time_unit;
594
static int hf_gsm_a_gm_sm_pco_add_apn_rate_ctrl_params_max_ul_rate;
595
static int hf_gsm_a_gm_sm_pco_pdu_session_id;
596
static int hf_gsm_a_gm_sm_pco_pdu_session_address_lifetime;
597
static int hf_gsm_a_gm_sm_pco_eth_frame_payload_mtu;
598
static int hf_gsm_a_gm_sm_pco_unstruct_link_mtu;
599
static int hf_gsm_a_gm_sm_pco_5gsm_cause;
600
static int hf_gsm_a_gm_sm_pco_acs_info;
601
static int hf_gsm_a_gm_sm_pco_init_small_data_rate_ctrl_params_max_ul_rate_allowed;
602
static int hf_gsm_a_gm_sm_pco_init_small_data_rate_ctrl_params_termination_timestamp;
603
static int hf_gsm_a_gm_sm_pco_atsss_response;
604
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_type;
605
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_sec_proto_type;
606
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_port_number;
607
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_auth_domain_name;
608
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_spki_pin_set;
609
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_root_certificate;
610
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_raw_public_key;
611
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_info_value_part;
612
static int hf_gsm_a_gm_sm_pco_ecs_addr_type;
613
static int hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_type;
614
static int hf_gsm_a_gm_sm_pco_ecs_addr_ipv4;
615
static int hf_gsm_a_gm_sm_pco_ecs_addr_ipv6;
616
static int hf_gsm_a_gm_sm_pco_ecs_addr_fqdn_len;
617
static int hf_gsm_a_gm_sm_pco_ecs_addr_fqdn;
618
static int hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_cont_len;
619
static int hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_cont;
620
static int hf_gsm_a_gm_sm_pco_ecs_addr_espili;
621
static int hf_gsm_a_gm_sm_pco_ecs_addr_eami;
622
static int hf_gsm_a_gm_sm_pco_ecs_addr_tlsgi;
623
static int hf_gsm_a_gm_sm_pco_ecs_addr_tlsai;
624
static int hf_gsm_a_gm_sm_pco_ecs_addr_tlscsci;
625
static int hf_gsm_a_gm_sm_pco_ecs_addr_supported_plmns_info_list_cont_len;
626
static int hf_gsm_a_gm_sm_pco_ecs_addr_supported_plmns_info_list_cont;
627
static int hf_gsm_a_gm_sm_pco_ecsp_id;
628
static int hf_gsm_a_gm_sm_pco_pvs_ipv4;
629
static int hf_gsm_a_gm_sm_pco_pvs_ipv6;
630
static int hf_gsm_a_gm_sm_pco_pvs_name_len;
631
static int hf_gsm_a_gm_sm_pco_pvs_name;
632
static int hf_gsm_a_gm_sm_pco_pvs_s_nssai_ind;
633
static int hf_gsm_a_gm_sm_pco_pvs_dnn_ind;
634
static int hf_gsm_a_gm_sm_pco_pvs_dnn_len;
635
static int hf_gsm_a_gm_sm_pco_pvs_s_nssai_len;
636
static int hf_gsm_a_gm_sm_pco_dns_serv_sec_prot_support;
637
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_fqdn;
638
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_ipv6;
639
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_ipv4;
640
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv4_range_low;
641
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv4_range_high;
642
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv6_range_low;
643
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv6_range_high;
644
static int hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_fqdn;
645
static int hf_gsm_a_gm_sm_pco_sdnaepc_dn_specific_id;
646
static int hf_gsm_a_gm_sm_pco_s_nssai_sel_by_ms_s_nssai_len;
647
static int hf_gsm_a_sm_pdp_type_number;
648
static int hf_gsm_a_sm_pdp_address;
649
static int hf_gsm_a_gm_ti_value;
650
651
/* Initialize the subtree pointers */
652
static int ett_gmm_radio_cap;
653
static int ett_gmm_network_cap;
654
static int ett_gsm_a_gm_msrac_multislot_capability;
655
static int ett_gmm_rai;
656
static int ett_gmm_gprs_timer;
657
658
static int ett_sm_tft;
659
static int ett_sm_pco;
660
661
static expert_field ei_gsm_a_gm_extraneous_data;
662
static expert_field ei_gsm_a_gm_not_enough_data;
663
static expert_field ei_gsm_a_gm_undecoded;
664
static expert_field ei_gsm_a_gm_missing_mandatory_element;
665
666
static dissector_handle_t rrc_irat_ho_info_handle;
667
static dissector_handle_t lte_rrc_ue_eutra_cap_handle;
668
static dissector_handle_t nbifom_handle;
669
static dissector_handle_t eap_handle;
670
671
static dissector_table_t gprs_sm_pco_subdissector_table; /* GPRS SM PCO PPP Protocols */
672
673
static const unit_name_string units_message_messages = { " message", " messages" };
674
675
1.09k
#define NUM_GSM_GM_ELEM array_length(gsm_gm_elem_strings)
676
int ett_gsm_gm_elem[NUM_GSM_GM_ELEM];
677
678
static const char *pdp_str[2]={ "PDP-INACTIVE", "PDP-ACTIVE" };
679
680
/*
681
 * [9] 10.5.5.0 Additional Update Type
682
 */
683
static const true_false_string gsm_a_gm_add_upd_type_value = {
684
  "SMS only",
685
  "No additional information (shall be interpreted as request for combined attach or combined tracking area updating)"
686
};
687
static uint16_t
688
de_gmm_add_upd_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
689
47
{
690
47
  uint32_t curr_offset, bit_offset;
691
692
47
  curr_offset = offset;
693
47
  bit_offset  = (curr_offset<<3)+4;
694
695
47
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
696
47
  bit_offset += 3;
697
47
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_add_upd_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
698
47
  curr_offset++;
699
700
47
  return (curr_offset - offset);
701
47
}
702
703
 /*
704
 * [9] 10.5.5.1 Attach result
705
 */
706
static const value_string gsm_a_gm_res_of_attach_vals[] = {
707
  { 0x01, "GPRS only attached" },
708
  { 0x03, "Combined GPRS/IMSI attached" },
709
  { 0, NULL }
710
};
711
712
static uint16_t
713
de_gmm_attach_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
714
20
{
715
20
  proto_tree_add_item(tree, hf_gsm_a_gm_fop, tvb, offset, 1, ENC_BIG_ENDIAN);
716
20
  proto_tree_add_item(tree, hf_gsm_a_gm_res_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
717
718
  /* no length check possible */
719
20
  return 1;
720
20
}
721
722
/*
723
 * [9] 10.5.5.2 Attach type
724
 */
725
static const value_string gsm_a_gm_type_of_attach_vals[] = {
726
  { 0x01, "GPRS attach" },
727
  { 0x02, "Not used (In earlier versions: GPRS attach while IMSI attached)" },
728
  { 0x03, "Combined GPRS/IMSI attached" },
729
  { 0, NULL }
730
};
731
732
static uint16_t
733
de_gmm_attach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
734
102
{
735
102
  proto_tree_add_item(tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
736
102
  proto_tree_add_item(tree, hf_gsm_a_gm_type_of_attach, tvb, offset, 1, ENC_BIG_ENDIAN);
737
738
  /* no length check possible */
739
102
  return 1;
740
102
}
741
742
/*
743
 * [9] 10.5.5.3 Ciphering algorithm
744
 */
745
const value_string gsm_a_gm_type_of_ciph_alg_vals[] = {
746
  { 0x00, "ciphering not used" },
747
  { 0x01, "GPRS Encryption Algorithm GEA/1" },
748
  { 0x02, "GPRS Encryption Algorithm GEA/2" },
749
  { 0x03, "GPRS Encryption Algorithm GEA/3" },
750
  { 0x04, "GPRS Encryption Algorithm GEA/4" },
751
  { 0x05, "GPRS Encryption Algorithm GEA/5" },
752
  { 0x06, "GPRS Encryption Algorithm GEA/6" },
753
  { 0x07, "GPRS Encryption Algorithm GEA/7" },
754
  { 0, NULL }
755
};
756
757
static uint16_t
758
de_gmm_ciph_alg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
759
0
{
760
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
761
0
  proto_tree_add_item(tree, hf_gsm_a_gm_type_of_ciph_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
762
763
  /* no length check possible */
764
0
  return 1;
765
0
}
766
767
/*
768
 * [13] 10.5.5.3a Integrity protection algorithm
769
 */
770
static const value_string gsm_a_gm_type_of_integ_alg_vals[] = {
771
  { 0x00, "GPRS Integrity Algorithm GIA/4" },
772
  { 0x01, "GPRS Integrity Algorithm GIA/5" },
773
  { 0x02, "GPRS Integrity Algorithm GIA/6" },
774
  { 0x03, "GPRS Integrity Algorithm GIA/7" },
775
  { 0, NULL }
776
};
777
778
static uint16_t
779
de_gmm_integ_alg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
780
0
{
781
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
782
0
  proto_tree_add_item(tree, hf_gsm_a_gm_type_of_integ_alg, tvb, offset, 1, ENC_BIG_ENDIAN);
783
784
  /* no length check possible */
785
0
  return 1;
786
0
}
787
788
/*
789
 * [9] 10.5.5.4 TMSI status
790
 */
791
static const true_false_string gsm_a_gm_tmsi_flag_value = {
792
  "valid TMSI available",
793
  "no valid TMSI available"
794
};
795
796
static uint16_t
797
de_gmm_tmsi_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
798
16
{
799
16
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
800
16
  proto_tree_add_item(tree, hf_gsm_a_gm_tmsi_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
801
802
  /* no length check possible */
803
16
  return 1;
804
16
}
805
806
/*
807
 * [7] 10.5.5.5
808
 */
809
static const true_false_string gsm_a_gm_power_off_value = {
810
  "power switched off",
811
  "normal detach"
812
};
813
814
static const value_string gsm_a_gm_type_of_detach_mo_vals[] = {
815
  { 0x01, "GPRS detach" },
816
  { 0x02, "IMSI detach" },
817
  { 0x03, "Combined GPRS/IMSI detach" },
818
  { 0, NULL }
819
};
820
821
static const value_string gsm_a_gm_type_of_detach_mt_vals[] = {
822
  { 0x01, "re-attach required" },
823
  { 0x02, "re-attach not required" },
824
  { 0x03, "IMSI detach (after VLR failure)" },
825
  { 0, NULL }
826
};
827
828
static uint16_t
829
de_gmm_detach_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
830
0
{
831
0
  uint32_t curr_offset;
832
833
0
  curr_offset = offset;
834
835
0
  if (pinfo->p2p_dir == P2P_DIR_RECV) {
836
0
    proto_tree_add_item(tree, hf_gsm_a_gm_power_off, tvb, offset, 1, ENC_BIG_ENDIAN);
837
0
    proto_tree_add_item(tree, hf_gsm_a_gm_type_of_detach_mo, tvb, offset, 1, ENC_BIG_ENDIAN);
838
0
  } else {
839
0
    proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
840
0
    proto_tree_add_item(tree, hf_gsm_a_gm_type_of_detach_mt, tvb, offset, 1, ENC_BIG_ENDIAN);
841
0
  }
842
843
0
  curr_offset++;
844
845
  /* no length check possible */
846
847
0
  return (curr_offset - offset);
848
0
}
849
850
/*
851
 * [7] 10.5.5.6
852
 */
853
854
/* SPLIT PG CYCLE CODE, octet 2 */
855
static const value_string gsm_a_gmm_split_pg_cycle_code_strings[] = {
856
  {  0, "704 (equivalent to no DRX)" },
857
  {  1, "1" },
858
  {  2, "2" },
859
  {  3, "3" },
860
  {  4, "4" },
861
  {  5, "5" },
862
  {  6, "6" },
863
  {  7, "7" },
864
  {  8, "8" },
865
  {  9, "9" },
866
  { 10, "10" },
867
  { 11, "11" },
868
  { 12, "12" },
869
  { 13, "13" },
870
  { 14, "14" },
871
  { 15, "15" },
872
  { 16, "16" },
873
  { 17, "17" },
874
  { 18, "18" },
875
  { 19, "19" },
876
  { 20, "20" },
877
  { 21, "21" },
878
  { 22, "22" },
879
  { 23, "23" },
880
  { 24, "24" },
881
  { 25, "25" },
882
  { 26, "26" },
883
  { 27, "27" },
884
  { 28, "28" },
885
  { 29, "29" },
886
  { 30, "30" },
887
  { 31, "31" },
888
  { 32, "32" },
889
  { 33, "33" },
890
  { 34, "34" },
891
  { 35, "35" },
892
  { 36, "36" },
893
  { 37, "37" },
894
  { 38, "38" },
895
  { 39, "39" },
896
  { 40, "40" },
897
  { 41, "41" },
898
  { 42, "42" },
899
  { 43, "43" },
900
  { 44, "44" },
901
  { 45, "45" },
902
  { 46, "46" },
903
  { 47, "47" },
904
  { 48, "48" },
905
  { 49, "49" },
906
  { 50, "50" },
907
  { 51, "51" },
908
  { 52, "52" },
909
  { 53, "53" },
910
  { 54, "54" },
911
  { 55, "55" },
912
  { 56, "56" },
913
  { 57, "57" },
914
  { 58, "58" },
915
  { 59, "59" },
916
  { 60, "60" },
917
  { 61, "61" },
918
  { 62, "62" },
919
  { 63, "63" },
920
  { 64, "64" },
921
  { 65, "71" },
922
  { 66, "72" },
923
  { 67, "74" },
924
  { 68, "75" },
925
  { 69, "77" },
926
  { 70, "79" },
927
  { 71, "80" },
928
  { 72, "83" },
929
  { 73, "86" },
930
  { 74, "88" },
931
  { 75, "90" },
932
  { 76, "92" },
933
  { 77, "96" },
934
  { 78, "101" },
935
  { 79, "103" },
936
  { 80, "107" },
937
  { 81, "112" },
938
  { 82, "116" },
939
  { 83, "118" },
940
  { 84, "128" },
941
  { 85, "141" },
942
  { 86, "144" },
943
  { 87, "150" },
944
  { 88, "160" },
945
  { 89, "171" },
946
  { 90, "176" },
947
  { 91, "192" },
948
  { 92, "214" },
949
  { 93, "224" },
950
  { 94, "235" },
951
  { 95, "256" },
952
  { 96, "288" },
953
  { 97, "320" },
954
  { 98, "352" },
955
  { 0, NULL }
956
};
957
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);
958
959
/* SPLIT on CCCH, octet 3 (bit 4)
960
 * 0 Split pg cycle on CCCH is not supported by the mobile station
961
 * 1 Split pg cycle on CCCH is supported by the mobile station
962
 */
963
static const true_false_string gsm_a_gmm_split_on_ccch_value = {
964
  "Split pg cycle on CCCH is supported by the mobile station",
965
  "Split pg cycle on CCCH is not supported by the mobile station"
966
};
967
968
/* non-DRX timer, octet 3
969
 * bit
970
 * 3 2 1
971
 */
972
static const value_string gsm_a_gmm_non_drx_timer_strings[] = {
973
  { 0x00, "no non-DRX mode after transfer state" },
974
  { 0x01, "max. 1 sec non-DRX mode after transfer state" },
975
  { 0x02, "max. 2 sec non-DRX mode after transfer state" },
976
  { 0x03, "max. 4 sec non-DRX mode after transfer state" },
977
  { 0x04, "max. 8 sec non-DRX mode after transfer state" },
978
  { 0x05, "max. 16 sec non-DRX mode after transfer state" },
979
  { 0x06, "max. 32 sec non-DRX mode after transfer state" },
980
  { 0x07, "max. 64 sec non-DRX mode after transfer state" },
981
  { 0, NULL },
982
};
983
/*
984
 * CN Specific DRX cycle length coefficient, octet 3
985
 * bit
986
 * 8 7 6 5 Iu and S1 mode specific
987
 * 0 0 0 0 For Iu mode, CN Specific DRX cycle length coefficient not specified by the MS, ie. the
988
 * system information value 'CN domain specific DRX cycle length' is used.
989
 * For S1 mode, DRX value not specified by the MS.
990
 * (Ref 3GPP TS 25.331 and 36.304)
991
 * 0 1 1 0 CN Specific DRX cycle length coefficient 6 and T = 32
992
 * 0 1 1 1 CN Specific DRX cycle length coefficient 7 and T = 64
993
 * 1 0 0 0 CN Specific DRX cycle length coefficient 8 and T = 128
994
 * 1 0 0 1 CN Specific DRX cycle length coefficient 9 and T = 256
995
 * All other values shall be interpreted as "CN Specific DRX cycle length coefficient not
996
 * specified by the MS" and "DRX value not specified by the MS" by this version of the protocol.
997
 * NOTE: For Iu mode and S1 mode, this field (octet 3 bits 8 to 5) is used, but was spare in earlier
998
 * versions of this protocol.
999
 */
1000
static const range_string gsm_a_gmm_cn_spec_drx_cycle_len_coef_strings[] = {
1001
  { 0x00, 0x05, "CN Specific DRX cycle length coefficient / value not specified by the MS" },
1002
  { 0x06, 0x06, "CN Specific DRX cycle length coefficient 6 and T = 32" },
1003
  { 0x07, 0x07, "CN Specific DRX cycle length coefficient 7 and T = 64" },
1004
  { 0x08, 0x08, "CN Specific DRX cycle length coefficient 8 and T = 128" },
1005
  { 0x09, 0x09, "CN Specific DRX cycle length coefficient 9 and T = 256" },
1006
  { 0x0a, 0x0f, "CN Specific DRX cycle length coefficient / value not specified by the MS" },
1007
  { 0, 0, NULL },
1008
};
1009
uint16_t
1010
de_gmm_drx_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1011
118
{
1012
118
  uint32_t curr_offset;
1013
1014
118
  curr_offset = offset;
1015
1016
118
  proto_tree_add_item(tree, hf_gsm_a_gmm_split_pg_cycle_code, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1017
118
  curr_offset++;
1018
118
  proto_tree_add_item(tree, hf_gsm_a_gmm_cn_spec_drx_cycle_len_coef, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1019
118
  proto_tree_add_item(tree, hf_gsm_a_gmm_split_on_ccch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1020
118
  proto_tree_add_item(tree, hf_gsm_a_gmm_non_drx_timer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1021
1022
118
  curr_offset++;
1023
1024
  /* no length check possible */
1025
1026
118
  return (curr_offset - offset);
1027
118
}
1028
1029
/*
1030
 * [9] 10.5.5.7 Force to standby (lower nibble)
1031
 */
1032
static const range_string gsm_a_gm_force_to_standby_vals[] = {
1033
  { 0x00, 0x00, "Force to standby not indicated" },
1034
  { 0x01, 0x01, "Force to standby indicated" },
1035
  { 0x02, 0x07, "Unknown, interpreted as Force to standby not indicated" },
1036
  { 0, 0, NULL }
1037
};
1038
1039
static uint16_t
1040
de_gmm_ftostby(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1041
14
{
1042
14
  uint32_t  bit_offset;
1043
1044
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
1045
14
  bit_offset = (offset << 3) + 4;
1046
14
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1047
14
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
1048
1049
  /* no length check possible */
1050
14
  return 1;
1051
14
}
1052
1053
/*
1054
 * [9] 10.5.5.7 Force to standby (higher nibble)
1055
 */
1056
static uint16_t
1057
de_gmm_ftostby_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1058
20
{
1059
20
  uint32_t  bit_offset;
1060
1061
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
1062
20
  bit_offset = offset << 3;
1063
20
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1064
20
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_force_to_standby, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
1065
1066
  /* no length check possible */
1067
20
  return 1;
1068
20
}
1069
1070
/*
1071
 * [7] 10.5.5.8
1072
 */
1073
static uint16_t
1074
de_gmm_ptmsi_sig(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1075
7
{
1076
7
  uint32_t    curr_offset;
1077
7
  proto_item *curr_item;
1078
1079
7
  curr_offset = offset;
1080
1081
7
  curr_item= proto_tree_add_item(tree, hf_gsm_a_gmm_ptmsi_sig, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
1082
7
  proto_item_append_text(curr_item, "%s", add_string ? add_string : "");
1083
1084
7
  curr_offset += 3;
1085
1086
  /* no length check possible */
1087
1088
7
  return (curr_offset - offset);
1089
7
}
1090
1091
/*
1092
 * [7] 10.5.5.8a
1093
 */
1094
static uint16_t
1095
de_gmm_ptmsi_sig2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len _U_)
1096
0
{
1097
0
  uint32_t    curr_offset;
1098
0
  proto_item *curr_item;
1099
1100
0
  curr_offset = offset;
1101
1102
0
  curr_item= proto_tree_add_item(tree, hf_gsm_a_gmm_ptmsi_sig2, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
1103
0
  proto_item_append_text(curr_item, "%s", add_string ? add_string : "");
1104
0
  curr_offset += 3;
1105
1106
0
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
1107
1108
0
  return (curr_offset - offset);
1109
0
}
1110
1111
/*
1112
 * [9] 10.5.5.9 Identity type 2
1113
 */
1114
static const value_string gsm_a_gm_type_of_identity_vals[] = {
1115
  { 0x01, "IMSI" },
1116
  { 0x02, "IMEI" },
1117
  { 0x03, "IMEISV" },
1118
  { 0x04, "TMSI" },
1119
  { 0, NULL }
1120
};
1121
1122
static uint16_t
1123
de_gmm_ident_type2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1124
0
{
1125
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 1, ENC_BIG_ENDIAN);
1126
0
  proto_tree_add_item(tree, hf_gsm_a_gm_type_of_identity, tvb, offset, 1, ENC_BIG_ENDIAN);
1127
1128
  /* no length check possible */
1129
0
  return 1;
1130
0
}
1131
1132
/*
1133
 * [9] 10.5.5.10 IMEISV request
1134
 */
1135
static const range_string gsm_a_gm_imeisv_req_vals[] = {
1136
  { 0x00, 0x00, "IMEISV not requested" },
1137
  { 0x01, 0x01, "IMEISV requested" },
1138
  { 0x02, 0x07, "Unknown, interpreted as IMEISV not requested" },
1139
  { 0, 0, NULL }
1140
};
1141
1142
static uint16_t
1143
de_gmm_imeisv_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1144
0
{
1145
0
  uint32_t  bit_offset;
1146
1147
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
1148
0
  bit_offset = offset << 3;
1149
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
1150
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_imeisv_req, tvb, bit_offset + 1, 3, ENC_BIG_ENDIAN);
1151
1152
  /* no length check possible */
1153
0
  return 1;
1154
0
}
1155
1156
/*
1157
 * [7] 10.5.5.11
1158
 */
1159
static uint16_t
1160
de_gmm_rec_npdu_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1161
0
{
1162
0
  uint32_t  curr_offset;
1163
0
  unsigned  curr_len;
1164
1165
0
  curr_len    = len;
1166
0
  curr_offset = offset;
1167
1168
0
  if (len == 0) return 0;
1169
1170
0
  do
1171
0
  {
1172
0
    uint32_t  oct;
1173
0
    oct = tvb_get_uint8(tvb, curr_offset);
1174
0
    oct <<= 8;
1175
0
    oct |= tvb_get_uint8(tvb, curr_offset+1);
1176
0
    curr_len -= 2;
1177
0
    oct <<= 8;
1178
1179
0
    proto_tree_add_uint_format(tree, hf_gsm_a_gm_nsapi, tvb, curr_offset, 2, (oct>>12)&0xff, "NSAPI %d: 0x%02x (%u)", oct>>20, (oct>>12)&0xff, (oct>>12)&0xff);
1180
0
    curr_offset +=  2;
1181
1182
0
    if (curr_len > 2)
1183
0
    {
1184
0
      oct |= tvb_get_uint8(tvb, curr_offset+2);
1185
0
      curr_len--;
1186
0
      oct <<= 12;
1187
1188
0
      proto_tree_add_uint_format(tree, hf_gsm_a_gm_nsapi, tvb, curr_offset-1, 2, (oct>>12)&0xff, "NSAPI %d: 0x%02x (%u)", oct>>20, (oct>>12)&0xff, (oct>>12)&0xff);
1189
0
      curr_offset++;
1190
0
    }
1191
1192
0
  } while (curr_len > 1);
1193
1194
0
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
1195
1196
0
  return (curr_offset - offset);
1197
0
}
1198
1199
/*
1200
 * [9] 10.5.5.12 MS network capability
1201
 */
1202
static const true_false_string gsm_a_gmm_net_cap_gea_vals = {
1203
  "Encryption algorithm available",
1204
  "Encryption algorithm not available"
1205
};
1206
1207
static const true_false_string gsm_a_gmm_net_cap_smdch_vals = {
1208
  "Mobile station supports mobile terminated point to point SMS via dedicated signalling channels",
1209
  "Mobile station does not support mobile terminated point to point SMS via dedicated signalling channels"
1210
};
1211
1212
static const true_false_string gsm_a_gmm_net_cap_smgprs_vals = {
1213
  "Mobile station supports mobile terminated point to point SMS via GPRS packet data channels",
1214
  "Mobile station does not support mobile terminated point to point SMS via GPRS packet data channels"
1215
};
1216
1217
static const true_false_string gsm_a_gmm_net_cap_ucs2_vals = {
1218
  "The ME has no preference between the use of the default alphabet and the use of UCS2",
1219
  "The ME has a preference for the default alphabet (defined in 3GPP TS 23.038 [8b]) over UCS2"
1220
};
1221
1222
static const value_string gsm_a_gmm_net_cap_ss_scr_ind_vals[]={
1223
  { 0x00, "Default value of phase 1" },
1224
  { 0x01, "capability of handling of ellipsis notation and phase 2 error handling" },
1225
  { 0x02, "For future use, interpreted as Capability of handling of ellipsis notation and phase 2 error handling" },
1226
  { 0x03, "For future use, interpreted as Capability of handling of ellipsis notation and phase 2 error handling" },
1227
  { 0x00, NULL }
1228
};
1229
1230
static const true_false_string gsm_a_gmm_net_cap_solsa_vals = {
1231
  "The ME supports SoLSA",
1232
  "The ME does not support SoLSA"
1233
};
1234
1235
static const true_false_string gsm_a_gmm_net_cap_rev_vals = {
1236
  "Used by a mobile station supporting R99 or later versions of the protocol",
1237
  "Used by a mobile station not supporting R99 or later versions of the protocol"
1238
};
1239
1240
static const true_false_string gsm_a_gmm_net_cap_pfc_vals = {
1241
  "Mobile station does support BSS packet flow procedures",
1242
  "Mobile station does not support BSS packet flow procedures"
1243
};
1244
1245
static const true_false_string gsm_a_gmm_net_cap_lcs_vals = {
1246
  "LCS value added location request notification capability supported",
1247
  "LCS value added location request notification capability not supported"
1248
};
1249
1250
static const true_false_string gsm_a_gmm_net_cap_ps_irat_iu_vals = {
1251
  "PS inter-RAT HO to UTRAN Iu mode supported",
1252
  "PS inter-RAT HO to UTRAN Iu mode not supported"
1253
};
1254
1255
static const true_false_string gsm_a_gmm_net_cap_ps_irat_s1_vals = {
1256
  "PS inter-RAT HO to E-UTRAN S1 mode supported",
1257
  "PS inter-RAT HO to E-UTRAN S1 mode not supported"
1258
};
1259
1260
static const true_false_string gsm_a_gmm_net_cap_comb_proc_vals = {
1261
  "Mobile station supports EMM combined procedures",
1262
  "Mobile station does not support EMM combined procedures"
1263
};
1264
1265
static const true_false_string gsm_a_gmm_net_cap_isr_vals = {
1266
  "The mobile station supports ISR",
1267
  "The mobile station does not support ISR"
1268
};
1269
1270
static const true_false_string gsm_a_gmm_net_cap_srvcc_to_geran_vals = {
1271
  "SRVCC from UTRAN HSPA or E-UTRAN to GERAN/UTRAN supported",
1272
  "SRVCC from UTRAN HSPA or E-UTRAN to GERAN/UTRAN not supported"
1273
};
1274
1275
static const true_false_string gsm_a_gmm_net_cap_epc_vals = {
1276
  "EPC supported",
1277
  "EPC not supported"
1278
};
1279
1280
static const true_false_string gsm_a_gmm_net_cap_nf_vals = {
1281
  "Mobile station supports the notification procedure",
1282
  "Mobile station does not support the notification procedure"
1283
};
1284
1285
static const true_false_string gsm_a_gmm_net_geran_net_vals = {
1286
  "Mobile station supports GERAN network sharing",
1287
  "Mobile station does not support GERAN network sharing"
1288
};
1289
1290
static const true_false_string gsm_a_gmm_net_cap_gia_vals = {
1291
  "Integrity algorithm available",
1292
  "Integrity algorithm not available"
1293
};
1294
1295
static const true_false_string gsm_a_gmm_net_cap_epco_ie_ind_vals = {
1296
  "Used by a mobile station supporting extended protocol configuration options IE",
1297
  "Used by a mobile station not supporting extended protocol configuration options IE"
1298
};
1299
1300
static const true_false_string gsm_a_gmm_net_cap_restrict_use_enh_cov_vals = {
1301
  "Mobile station supports restriction on use of enhanced coverage",
1302
  "Mobile station does not support restriction on use of enhanced coverage"
1303
};
1304
1305
static const true_false_string gsm_a_gmm_net_cap_dc_eutra_nr_cap_vals = {
1306
  "Mobile station supports dual connectivity of E-UTRA with NR",
1307
  "Mobile station does not support dual connectivity of E-UTRA with NR"
1308
};
1309
1310
uint16_t
1311
de_gmm_ms_net_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1312
87
{
1313
87
  uint32_t    curr_offset;
1314
87
  proto_tree *subtree;
1315
87
  proto_item *item;
1316
1317
87
  curr_offset = offset;
1318
1319
  /* bit 8: GEA1 */
1320
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_gea1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1321
1322
  /* bit 7: SM capabilities via dedicated channels */
1323
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smdch, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1324
1325
  /* bit 6: SM capabilities via GPRS channels */
1326
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_smgprs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1327
1328
  /* bit 5: UCS2 support */
1329
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ucs2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1330
1331
  /* bits 4 3: SS Screening Indicator */
1332
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ss_scr_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1333
1334
  /* bit 2: SoLSA Capability */
1335
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_solsa, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1336
1337
  /* bit 1 */
1338
87
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1339
1340
87
  curr_offset++;
1341
87
  NO_MORE_DATA_CHECK(len);
1342
1343
  /* bit 8: PFC feature mode */
1344
79
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1345
1346
  /* bits 7 6 5 4 3 2: Extended GEA bits */
1347
79
  item = proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ext_gea_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1348
79
  subtree = proto_item_add_subtree(item, ett_gmm_network_cap);
1349
79
  proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea2, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1350
79
  proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea3, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1351
79
  proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1352
79
  proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1353
79
  proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1354
79
  proto_tree_add_item(subtree, hf_gsm_a_gmm_net_cap_gea7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1355
1356
  /* bit 1: LCS VA capability */
1357
79
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_lcs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1358
1359
79
  curr_offset++;
1360
79
  NO_MORE_DATA_CHECK(len);
1361
1362
  /* bit 8: PS inter-RAT HO from GERAN to UTRAN Iu mode capability */
1363
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_iu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1364
1365
  /* bit 7: PS inter-RAT HO from GERAN to E-UTRAN S1 mode capability */
1366
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_ps_irat_s1, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1367
1368
  /* bit 6: EMM Combined procedures capability */
1369
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_comb_proc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1370
1371
  /* bit 5: ISR support */
1372
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_isr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1373
1374
  /* bit 4: SRVCC to GERAN/UTRAN capability */
1375
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_srvcc_to_geran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1376
1377
  /* bit 3: EPC capability */
1378
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1379
1380
  /* bit 2: NF capability */
1381
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_nf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1382
1383
  /* bits 1: GERAN network sharing capability */
1384
77
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_geran_net_sharing, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1385
1386
77
  curr_offset++;
1387
77
  NO_MORE_DATA_CHECK(len);
1388
1389
  /* bit 8: User plane integrity protection support */
1390
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_up_int_prot, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1391
1392
  /* bit 7: GIA/4 */
1393
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_up_gia4, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1394
1395
  /* bit 6: GIA/5 */
1396
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_up_gia5, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1397
1398
  /* bit 5: GIA/6 */
1399
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_up_gia6, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1400
1401
  /* bit 4: GIA/7 */
1402
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_up_gia7, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1403
1404
  /* bit 3: ePCO IE indicator */
1405
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_epco_ie_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1406
1407
  /* bit 2: Restriction on use of enhanced coverage capability */
1408
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_restrict_use_enh_cov, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1409
1410
  /* bit 1: Dual connectivity of E-UTRA with NR capability */
1411
75
  proto_tree_add_item(tree, hf_gsm_a_gmm_net_cap_dc_eutra_nr_cap, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1412
1413
75
  curr_offset++;
1414
75
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
1415
1416
75
  return (curr_offset - offset);
1417
77
}
1418
1419
/*
1420
 * [7] 10.5.5.12a
1421
 */
1422
#define GET_DATA        /* check if we have enough bits left */ \
1423
303k
  if (curr_bits_length < bits_needed) \
1424
303k
    continue; \
1425
303k
  /* check if oct has enough bits */ \
1426
303k
  if (bits_in_oct < bits_needed) \
1427
295k
  { \
1428
65.7k
    uint32_t tmp_oct; \
1429
65.7k
    if (curr_len == 0) \
1430
65.7k
    { \
1431
351
      proto_tree_add_expert(tf_tree, pinfo, &ei_gsm_a_gm_not_enough_data, tvb, curr_offset, 1); \
1432
351
    } \
1433
65.7k
    tmp_oct = tvb_get_uint8(tvb, curr_offset); \
1434
65.7k
    oct |= tmp_oct<<(32-8-bits_in_oct); \
1435
65.7k
    curr_len--; \
1436
65.7k
    curr_offset++; \
1437
65.7k
    if (bits_in_oct != 0) \
1438
65.7k
      add_octets = 1; \
1439
65.7k
    else \
1440
65.7k
      add_octets = 0; \
1441
65.7k
    bits_in_oct += 8; \
1442
65.7k
  } \
1443
295k
  else \
1444
295k
    add_octets = 0;
1445
1446
/* Access Technology Type */
1447
1448
static const value_string gsm_a_gm_acc_tech_type_vals[] = {
1449
  { 0x00, "GSM P" },
1450
  { 0x01, "GSM E --note that GSM E covers GSM P" },
1451
  { 0x02, "GSM R --note that GSM R covers GSM E and GSM P" },
1452
  { 0x03, "GSM 1800" },
1453
  { 0x04, "GSM 1900" },
1454
  { 0x05, "GSM 450" },
1455
  { 0x06, "GSM 480" },
1456
  { 0x07, "GSM 850" },
1457
  { 0x08, "GSM 750" },
1458
  { 0x09, "GSM T 380" },
1459
  { 0x0a, "GSM T 410" },
1460
  { 0x0b, "GSM T 900" },
1461
  { 0x0c, "GSM 710" },
1462
  { 0x0d, "GSM T 810" },
1463
  { 0x0f, "Indicates the presence of a list of Additional access technologies" },
1464
  { 0, NULL }
1465
};
1466
1467
static const true_false_string gsm_a_gm_vgcs = {
1468
  "VGCS capability and notifications wanted",
1469
  "no VGCS capability or no notifications wanted"
1470
};
1471
1472
static const true_false_string gsm_a_gm_vbs = {
1473
  "VBS capability and notifications wanted",
1474
  "no VBS capability or no notifications wanted"
1475
};
1476
1477
static const value_string gsm_a_gm_multi_slot_vals[] = {
1478
  { 0x00, "Not specified" },
1479
  { 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" },
1480
  { 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" },
1481
  { 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" },
1482
  { 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" },
1483
  { 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" },
1484
  { 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" },
1485
  { 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" },
1486
  { 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" },
1487
  { 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" },
1488
  { 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" },
1489
  { 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" },
1490
  { 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" },
1491
  { 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)" },
1492
  { 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)" },
1493
  { 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)" },
1494
  { 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)" },
1495
  { 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)" },
1496
  { 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" },
1497
  { 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" },
1498
  { 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" },
1499
  { 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" },
1500
  { 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" },
1501
  { 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" },
1502
  { 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" },
1503
  { 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" },
1504
  { 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" },
1505
  { 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" },
1506
  { 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" },
1507
  { 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" },
1508
  { 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" },
1509
  { 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" },
1510
  { 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" },
1511
  { 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" },
1512
  { 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" },
1513
  { 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))" },
1514
  { 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))" },
1515
  { 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))" },
1516
  { 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))" },
1517
  { 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))" },
1518
  { 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))" },
1519
  { 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))" },
1520
  { 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))" },
1521
  { 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))" },
1522
  { 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))" },
1523
  { 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))" },
1524
  { 0, NULL }
1525
};
1526
1527
static const value_string gsm_a_gm_dtm_gprs_multi_slot_class_vals[] = {
1528
  { 0x00, "Unused. If received, the network shall interpret this as Multislot class 5" },
1529
  { 0x01, "Multislot class 5 supported" },
1530
  { 0x02, "Multislot class 9 supported" },
1531
  { 0x03, "Multislot class 11 supported" },
1532
  { 0, NULL }
1533
};
1534
1535
static const true_false_string gsm_a_gm_revision_level_indicator = {
1536
  "The ME is Release '99 onwards",
1537
  "The ME is Release '98 or older"
1538
};
1539
1540
static const value_string gsm_a_gm_down_adv_rec_perf_vals[] = {
1541
  { 0x00, "Downlink Advanced Receiver Performance not supported" },
1542
  { 0x01, "Downlink Advanced Receiver Performance - phase I supported" },
1543
  { 0x02, "Downlink Advanced Receiver Performance - phase II supported" },
1544
  { 0, NULL }
1545
};
1546
1547
static const true_false_string gsm_a_gm_dtm_enh_cap = {
1548
  "The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures",
1549
  "The mobile station does not support enhanced DTM CS establishment and enhanced DTM CS release procedures"
1550
};
1551
1552
static const value_string gsm_a_gm_dtm_gprs_high_multi_slot_class_vals[] = {
1553
  { 0x00, "Unused. If received, the network shall interpret this as 'Multislot class 31 or 36 supported'" },
1554
  { 0x01, "Multislot class 31 or 36 supported" },
1555
  { 0x02, "Multislot class 32 or 37 supported" },
1556
  { 0x03, "Multislot class 33 or 38 supported" },
1557
  { 0x04, "Multislot class 41 supported" },
1558
  { 0x05, "Multislot class 42 supported" },
1559
  { 0x06, "Multislot class 43 supported" },
1560
  { 0x07, "Multislot class 44 supported" },
1561
  { 0, NULL }
1562
};
1563
1564
static const value_string gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals[] = {
1565
  { 0x00, "No reduction" },
1566
  { 0x01, "The MS supports 1 timeslot fewer than the maximum number of receive timeslots" },
1567
  { 0x02, "The MS supports 2 timeslots fewer than the maximum number of receive timeslots" },
1568
  { 0x03, "The MS supports 3 timeslots fewer than the maximum number of receive timeslots" },
1569
  { 0x04, "The MS supports 4 timeslots fewer than the maximum number of receive timeslots" },
1570
  { 0x05, "The MS supports 5 timeslots fewer than the maximum number of receive timeslots" },
1571
  { 0x06, "The MS supports 6 timeslots fewer than the maximum number of receive timeslots" },
1572
  { 0x07, "Reserved for future use" },
1573
  { 0, NULL }
1574
};
1575
1576
static const value_string gsm_a_gm_ul_egprs2_vals[] = {
1577
  { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the uplink" },
1578
  { 0x01, "The mobile station supports EGPRS2-A in the uplink" },
1579
  { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink" },
1580
  { 0x03, "The mobile station supports both EGPRS2-A and EGPRS2-B in the uplink" },
1581
  { 0, NULL }
1582
};
1583
1584
static const value_string gsm_a_gm_dl_egprs2_vals[] = {
1585
  { 0x00, "The mobile station does not support either EGPRS2-A or EGPRS2-B in the downlink" },
1586
  { 0x01, "The mobile station supports EGPRS2-A in the downlink" },
1587
  { 0x02, "The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink" },
1588
  { 0x03, "The mobile station supports both EGPRS2-A and EGPRS2-B in the downlink" },
1589
  { 0, NULL }
1590
};
1591
1592
static const value_string gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals[] = {
1593
  { 0x00, "None" },
1594
  { 0x01, "E-UTRAN neighbour cell measurements and MS autonomous cell reselection to E-UTRAN supported" },
1595
  { 0x02, "E-UTRAN neighbour cell meas and report, MS autonomous cell resel, CCN and network controlled cell reselection to E-UTRAN" },
1596
  { 0x03, "E-UTRAN neighbour cell meas and report, MS autonomous cell resel, CCN, network controlled cell reselection and PS Handover to E-UTRAN" },
1597
  { 0, NULL }
1598
};
1599
1600
static const value_string gsm_a_gm_alt_efta_multi_slot_class_vals[] = {
1601
  { 0x00, "No Alternative EFTA multislot class is indicated. Use (DTM) EGPRS (high) multislot class only" },
1602
  { 0x01, "Alternative EFTA multislot class 1" },
1603
  { 0x02, "Alternative EFTA multislot class 2" },
1604
  { 0x03, "Alternative EFTA multislot class 3" },
1605
  { 0x04, "Unused" },
1606
  { 0x05, "Unused" },
1607
  { 0x06, "Unused" },
1608
  { 0x07, "Unused" },
1609
  { 0x08, "Unused" },
1610
  { 0x09, "Unused" },
1611
  { 0x0a, "Unused" },
1612
  { 0x0b, "Unused" },
1613
  { 0x0c, "Unused" },
1614
  { 0x0d, "Unused" },
1615
  { 0x0e, "Unused" },
1616
  { 0x0f, "Unused" },
1617
  { 0, NULL }
1618
};
1619
1620
static const value_string gsm_a_gm_dlmc_non_contig_intra_band_recep_vals[] = {
1621
  { 0x00, "Not supported" },
1622
  { 0x01, "Supported in band E-GSM or GSM850" },
1623
  { 0x02, "Supported in band DCS1800 or PCS1900" },
1624
  { 0x03, "Supported in band E-GSM, or GSM850, or DCS1800 or PCS1900" },
1625
  { 0, NULL }
1626
};
1627
1628
static const true_false_string gsm_a_gm_dlmc_inter_band_recep_val = {
1629
  "Supported in band combination (E-GSM, DCS1800), or band combination (GSM850, PCS1900)",
1630
  "Not supported"
1631
};
1632
1633
static const value_string gsm_a_gm_dlmc_max_bandwidth_vals[] = {
1634
  { 0x00, "5 MHz" },
1635
  { 0x01, "10 MHz" },
1636
  { 0x02, "15 MHz" },
1637
  { 0x03, "20 MHz" },
1638
  { 0, NULL }
1639
};
1640
1641
static void
1642
gsm_a_gm_dlmc_max_nb_dl_ts_fmt(char *s, uint32_t v)
1643
440
{
1644
440
  if (v < 0x3E)
1645
440
    snprintf(s, ITEM_LABEL_LENGTH, "%u TS supported (%u)",
1646
440
               2*v + 6, v);
1647
79
  else
1648
440
    snprintf(s, ITEM_LABEL_LENGTH, "Reserved (%u)", v);
1649
440
}
1650
1651
static const value_string gsm_a_gm_dlmc_max_nb_dl_carriers_vals[] = {
1652
  { 0x00, "2 carriers supported" },
1653
  { 0x01, "4 carriers supported" },
1654
  { 0x02, "6 carriers supported" },
1655
  { 0x03, "8 carriers supported" },
1656
  { 0x04, "10 carriers supported" },
1657
  { 0x05, "12 carriers supported" },
1658
  { 0x06, "14 carriers supported" },
1659
  { 0x07, "16 carriers supported" },
1660
  { 0, NULL }
1661
};
1662
1663
static const value_string gsm_a_gm_8psk_power_class_vals[] = {
1664
  {0x00, "8PSK modulation not supported for uplink" },
1665
  {0x01, "Power class E1"},
1666
  {0x02, "Power class E2"},
1667
  {0x03, "Power class E3"},
1668
  {0, NULL},
1669
};
1670
1671
1672
static const value_string gsm_a_gm_8psk_power_cap_vals[] = {
1673
  {0x00, "Reserved" },
1674
  {0x01, "Power class E1"},
1675
  {0x02, "Power class E2"},
1676
  {0x03, "Power class E3"},
1677
  {0, NULL},
1678
};
1679
1680
static const value_string gsm_a_gm_extended_dtm_gprs_multi_slot_class_vals[] = {
1681
  {0x00,  "Unused. If received, it shall be interpreted as Multislot class 5 supported" },
1682
  {0x01,  "Unused. If received, it shall be interpreted as Multislot class 5 supported"},
1683
  {0x02,  "Unused. If received, it shall be interpreted as Multislot class 5 supported"},
1684
  {0x03,  "Unused. If received, it shall be interpreted as Multislot class 5 supported"},
1685
  {0x10,  "Multislot class 5 supported"},
1686
  {0x11,  "Multislot class 6 supported"},
1687
  {0x12,  "Unused. If received, it shall be interpreted as Multislot class 5 supported"},
1688
  {0x13,  "Unused. If received, it shall be interpreted as Multislot class 5 supported"},
1689
  {0x20,  "Multislot class 9 supported"},
1690
  {0x21,  "Multislot class 10 supported"},
1691
  {0x22,  "Unused. If received, it shall be interpreted as Multislot class 9 supported"},
1692
  {0x23,  "Unused. If received, it shall be interpreted as Multislot class 9 supported"},
1693
  {0x30,  "Multislot class 11 supported"},
1694
  {0x31,  "Unused. If received, it shall be interpreted as Multislot class 11 supported"},
1695
  {0x32,  "Unused. If received, it shall be interpreted as Multislot class 11 supported"},
1696
  {0x33,  "Unused. If received, it shall be interpreted as Multislot class 11 supported"},
1697
  {0, NULL}
1698
};
1699
1700
static const value_string gsm_a_gm_gmsk_multislot_power_profile_vals[] = {
1701
  {0x00,  "GMSK_MULTISLOT_POWER_PROFILE 0" },
1702
  {0x01,  "GMSK_MULTISLOT_POWER_PROFILE 1"},
1703
  {0x02,  "GMSK_MULTISLOT_POWER_PROFILE 2"},
1704
  {0x03,  "GMSK_MULTISLOT_POWER_PROFILE 3"},
1705
  {0, NULL}
1706
};
1707
1708
static const value_string gsm_a_gm_8psk_multislot_power_profile_vals[] = {
1709
  {0x00,  "8-PSK_MULTISLOT_POWER_PROFILE 0" },
1710
  {0x01,  "8-PSK_MULTISLOT_POWER_PROFILE 1"},
1711
  {0x02,  "8-PSK_MULTISLOT_POWER_PROFILE 2"},
1712
  {0x03,  "8-PSK_MULTISLOT_POWER_PROFILE 3"},
1713
  {0, NULL}
1714
};
1715
1716
static const value_string gsm_a_gm_ec_pch_mon_support_vals[] = {
1717
  {0x00, "PCH supported"},
1718
  {0x01, "EC-PCH supported"},
1719
  {0x02, "PCH and EC-PCH supported"},
1720
  {0x03, "Reserved"},
1721
  {0, NULL}
1722
};
1723
1724
uint16_t
1725
de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1726
1.04k
{
1727
1.04k
  uint32_t     curr_offset;
1728
1.04k
  unsigned     curr_len;
1729
1.04k
  int          bit_offset;
1730
1.04k
  proto_item  *tf = NULL, *mc_item = NULL, *ti;
1731
1.04k
  proto_tree  *tf_tree = NULL, *mc_tree = NULL;
1732
1.04k
  uint32_t     oct;
1733
1.04k
  unsigned char       bits_in_oct;
1734
1.04k
  unsigned char       bits_needed;
1735
1.04k
  unsigned     bits_length;
1736
1.04k
  unsigned     add_octets;  /* octets which are covered by one element -1 */
1737
1.04k
  unsigned     curr_bits_length;
1738
1.04k
  unsigned char       acc_type;
1739
1.04k
  unsigned     value;
1740
1.04k
  const char *str;
1741
1.04k
  unsigned indx = 0;
1742
1743
1.04k
  unsigned char   dtm_gprs_mslot  = 0;
1744
1.04k
  unsigned char   dtm_egprs_mslot = 4;
1745
1.04k
  bool finished = true;
1746
1747
1.04k
  curr_len    = len;
1748
1.04k
  curr_offset = offset;
1749
1.04k
  bit_offset  = offset<<3;
1750
1751
1.04k
  bits_in_oct = 0;
1752
1.04k
  oct = 0;
1753
1754
1755
1.04k
  do
1756
8.27k
  {
1757
    /* check for a new round */
1758
8.27k
    if ((curr_len*8 + bits_in_oct) < 11)
1759
25
      break;
1760
1761
    /* now read the first 11 bits */
1762
8.25k
    curr_bits_length = 11;
1763
    /*
1764
     *
1765
     */
1766
8.25k
    if (curr_len != len)
1767
7.20k
    {
1768
7.20k
      bits_needed = 1;
1769
7.20k
      GET_DATA;
1770
1771
7.20k
      if ((oct>>(32-bits_needed)) != 1)
1772
745
      {
1773
745
        break;
1774
745
      }
1775
6.46k
      oct     <<= bits_needed;
1776
6.46k
      bits_in_oct  -= bits_needed;
1777
6.46k
      bit_offset++;
1778
1779
6.46k
      if ((curr_len*8 + bits_in_oct) < 11)
1780
1
        break;
1781
6.46k
      curr_bits_length = 11;
1782
6.46k
    }
1783
1784
7.50k
    indx++;
1785
7.50k
    tf_tree = proto_tree_add_subtree_format(tree,
1786
7.50k
        tvb, curr_offset, 1,
1787
7.50k
        ett_gmm_radio_cap, &tf, "MS RA capability %d", indx);
1788
1789
    /*
1790
     * Access Technology
1791
     */
1792
7.50k
    bits_needed = 4;
1793
7.50k
    GET_DATA;
1794
1795
7.50k
    acc_type = oct>>(32-bits_needed);
1796
1797
7.50k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
1798
7.50k
    bit_offset += 4;
1799
1800
7.50k
    curr_bits_length  -= bits_needed;
1801
7.50k
    oct    <<= bits_needed;
1802
7.50k
    bits_in_oct   -= bits_needed;
1803
1804
    /* < Access capabilities struct > ::= */
1805
    /*
1806
     * get bits_length
1807
     */
1808
7.50k
    bits_needed = 7;
1809
7.50k
    GET_DATA;
1810
1811
7.50k
    bits_length = curr_bits_length = oct>>(32-bits_needed);
1812
1813
7.50k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_cap_struct_len, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
1814
7.50k
    proto_item_set_len(tf, (bits_length>>3)+1);
1815
    /* This is already done - length doesn't contain this field
1816
     curr_bits_length -= bits_needed;
1817
    */
1818
7.50k
    bit_offset   += 7;
1819
7.50k
    oct     <<= bits_needed;
1820
7.50k
    bits_in_oct  -= bits_needed;
1821
1822
7.50k
    if (acc_type == 0x0f)
1823
1.18k
    {
1824
1.18k
      do
1825
11.4k
      {
1826
        /*
1827
         * Additional access technologies:
1828
         */
1829
11.4k
        finished = true; /* Break out of the loop unless proven unfinished */
1830
1831
        /*
1832
         * Presence bit
1833
         */
1834
11.4k
        bits_needed = 1;
1835
11.4k
        GET_DATA;
1836
1837
        /* analyse bits */
1838
10.9k
        switch (oct>>(32-bits_needed))
1839
10.9k
        {
1840
660
          case 0x00: str = "Not Present"; finished = true; break;
1841
10.2k
          case 0x01: str = "Present"; finished = false;    break;
1842
0
          default:   str = "This should not happen";
1843
10.9k
        }
1844
1845
10.9k
        proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_gm_presence, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed), "%s (%u)", str, oct>>(32-bits_needed));
1846
10.9k
        bit_offset++;
1847
10.9k
        curr_bits_length  -= bits_needed;
1848
10.9k
        oct    <<= bits_needed;
1849
10.9k
        bits_in_oct   -= bits_needed;
1850
1851
10.9k
        if (finished)
1852
660
        {
1853
          /*
1854
           * No more valid data, get spare bits if any
1855
           */
1856
6.06k
          while (curr_bits_length > 0)
1857
5.40k
          {
1858
5.40k
            if (curr_bits_length > 8)
1859
4.79k
              bits_needed = 8;
1860
602
            else
1861
602
              bits_needed = curr_bits_length;
1862
5.40k
            GET_DATA;
1863
5.40k
            curr_bits_length  -= bits_needed;
1864
5.40k
            oct    <<= bits_needed;
1865
5.40k
            bits_in_oct   -= bits_needed;
1866
5.40k
            bit_offset    += bits_needed;
1867
5.40k
          }
1868
660
          continue;
1869
660
        }
1870
1871
        /*
1872
         * Access Technology
1873
         */
1874
10.2k
        bits_needed = 4;
1875
10.2k
        GET_DATA;
1876
1877
9.25k
        acc_type = oct>>(32-bits_needed);
1878
1879
9.25k
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_acc_tech_type, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
1880
9.25k
        bit_offset += 4;
1881
1882
9.25k
        curr_bits_length  -= bits_needed;
1883
9.25k
        oct    <<= bits_needed;
1884
9.25k
        bits_in_oct   -= bits_needed;
1885
1886
        /*
1887
         * RF Power
1888
         */
1889
9.25k
        bits_needed = 3;
1890
9.25k
        GET_DATA;
1891
1892
8.72k
        value = tvb_get_bits8(tvb, bit_offset, 3);
1893
        /* analyse bits */
1894
8.72k
        if (acc_type == 0x04)  /* GSM 1900 */
1895
44
        {
1896
44
          switch (value)
1897
44
          {
1898
4
            case 0x01: str = "1 W (30 dBm)";    break;
1899
6
            case 0x02: str = "0,25 W (24 dBm)"; break;
1900
11
            case 0x03: str = "2 W (33 dBm)";    break;
1901
23
            default:   str = "Not specified";
1902
44
          }
1903
44
        }
1904
8.68k
        else if (acc_type == 0x03)
1905
76
        {
1906
          /*
1907
           * 3 GSM 1800
1908
           */
1909
76
          switch (value)
1910
76
          {
1911
6
            case 0x01: str = "1 W (30 dBm)";    break;
1912
2
            case 0x02: str = "0,25 W (24 dBm)"; break;
1913
5
            case 0x03: str = "4 W (36 dBm)";    break;
1914
63
            default:   str = "Not specified";
1915
76
          }
1916
76
        }
1917
8.60k
        else if (acc_type <= 0x08)
1918
395
        {
1919
          /* 0 GSM P
1920
           * 1 GSM E
1921
           * 2 GSM R
1922
           * 5 GSM 450
1923
           * 6 GSM 480
1924
           * 7 GSM 850
1925
           */
1926
1927
395
          switch (value)
1928
395
          {
1929
92
            case 0x02: str = "8 W (39 dBm)";   break;
1930
29
            case 0x03: str = "5 W (37 dBm)";   break;
1931
32
            case 0x04: str = "2 W (33 dBm)";   break;
1932
29
            case 0x05: str = "0,8 W (29 dBm)"; break;
1933
213
            default:   str = "Not specified";
1934
395
          }
1935
395
        }
1936
8.21k
        else
1937
8.21k
          str = "Not specified??";
1938
1939
        /* decode_bits_in_field(int bit_offset, int no_of_bits, uint64_t value)*/
1940
8.72k
        proto_tree_add_uint_format(tf_tree, hf_gsm_a_gm_rf_power_capability, tvb, curr_offset-1-add_octets, 1+add_octets, value,
1941
8.72k
                        "%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(pinfo->pool, bit_offset, 3, value, ENC_BIG_ENDIAN), str, value);
1942
8.72k
        bit_offset    += 3;
1943
8.72k
        curr_bits_length  -= bits_needed;
1944
8.72k
        oct    <<= bits_needed;
1945
8.72k
        bits_in_oct   -= bits_needed;
1946
1947
        /*
1948
         * 8PSK Power Class
1949
         */
1950
8.72k
        bits_needed = 2;
1951
8.72k
        GET_DATA;
1952
1953
8.71k
        value = tvb_get_bits8(tvb, bit_offset, 2);
1954
        /* analyse bits */
1955
8.71k
        proto_tree_add_uint(tf_tree, hf_gsm_a_gm_8psk_power_class, tvb, curr_offset-1-add_octets, 1+add_octets, value);
1956
8.71k
        bit_offset    += 2;
1957
8.71k
        curr_bits_length  -= bits_needed;
1958
8.71k
        oct    <<= bits_needed;
1959
8.71k
        bits_in_oct   -= bits_needed;
1960
1961
11.4k
      } while (!finished);
1962
1963
      /* goto next one */
1964
1.18k
      continue;
1965
1.18k
    }
1966
    /*
1967
     * RF Power
1968
     */
1969
6.31k
    bits_needed = 3;
1970
6.31k
    GET_DATA;
1971
1972
6.19k
    value = tvb_get_bits8(tvb, bit_offset, 3);
1973
    /* analyse bits */
1974
6.19k
    if (acc_type == 0x04)  /* GSM 1900 */
1975
106
    {
1976
106
      switch (value)
1977
106
      {
1978
20
        case 0x01: str = "1 W (30 dBm)";    break;
1979
24
        case 0x02: str = "0,25 W (24 dBm)"; break;
1980
21
        case 0x03: str = "2 W (33 dBm)";    break;
1981
41
        default:   str = "Not specified";
1982
106
      }
1983
106
    }
1984
6.08k
    else if (acc_type == 0x03)
1985
336
    {
1986
336
      switch (value)
1987
336
      {
1988
19
        case 0x01: str = "1 W (30 dBm)";    break;
1989
12
        case 0x02: str = "0,25 W (24 dBm)"; break;
1990
20
        case 0x03: str = "4 W (36 dBm)";    break;
1991
285
        default:   str = "Not specified";
1992
336
      }
1993
336
    }
1994
5.75k
    else if (acc_type <= 0x08)
1995
2.69k
    {
1996
2.69k
      switch (value)
1997
2.69k
      {
1998
198
        case 0x02: str = "8 W (39 dBm)";   break;
1999
282
        case 0x03: str = "5 W (37 dBm)";   break;
2000
498
        case 0x04: str = "2 W (33 dBm)";   break;
2001
420
        case 0x05: str = "0,8 W (29 dBm)"; break;
2002
1.29k
        default:   str = "Not specified";
2003
2.69k
      }
2004
2.69k
    }
2005
3.05k
    else
2006
3.05k
      str = "Not specified??";
2007
2008
6.19k
    proto_tree_add_uint_format(tf_tree, hf_gsm_a_gm_rf_power_capability, tvb, curr_offset-1-add_octets, 1+add_octets, value,
2009
6.19k
            "%s RF Power Capability, GMSK Power Class: %s (%u)", decode_bits_in_field(pinfo->pool, bit_offset, 3, value, ENC_BIG_ENDIAN), str, value);
2010
2011
6.19k
    bit_offset    += 3;
2012
6.19k
    curr_bits_length  -= bits_needed;
2013
6.19k
    oct    <<= bits_needed;
2014
6.19k
    bits_in_oct   -= bits_needed;
2015
2016
    /*
2017
     * A5 Bits?
2018
     */
2019
6.19k
    bits_needed = 1;
2020
6.19k
    GET_DATA;
2021
2022
    /* analyse bits */
2023
6.17k
    if ((oct>>(32-bits_needed)) == 0)
2024
2.62k
    {
2025
2.62k
      proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_gm_a5_bits, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed),
2026
2.62k
            "Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (%u)",
2027
2.62k
            oct>>(32-bits_needed));
2028
2.62k
      bit_offset++;
2029
2.62k
      curr_bits_length  -= bits_needed;
2030
2.62k
      oct    <<= bits_needed;
2031
2.62k
      bits_in_oct   -= bits_needed;
2032
2.62k
    }
2033
3.55k
    else
2034
3.55k
    {
2035
3.55k
      int i;
2036
2037
3.55k
      proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_gm_a5_bits, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed), "A5 bits follow (%u)", oct>>(32-bits_needed));
2038
2039
3.55k
      bit_offset++;
2040
3.55k
      curr_bits_length  -= bits_needed;
2041
3.55k
      oct    <<= bits_needed;
2042
3.55k
      bits_in_oct   -= bits_needed;
2043
2044
28.1k
      for (i=1; i<=7 ; i++)
2045
24.6k
      {
2046
        /*
2047
         * A5 Bits decoding
2048
         */
2049
24.6k
        bits_needed = 1;
2050
24.6k
        GET_DATA;
2051
2052
        /* analyse bits */
2053
24.4k
        switch (oct>>(32-bits_needed))
2054
24.4k
        {
2055
11.8k
          case 0x00: str = "encryption algorithm not available"; break;
2056
12.6k
          case 0x01: str = "encryption algorithm available";     break;
2057
0
          default:   str = "This should not happen";
2058
24.4k
        }
2059
2060
24.4k
        proto_tree_add_uint_format(tf_tree, hf_gsm_a_gm_a5_bits, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed), "A5/%d: %s (%u)", i, str, oct>>(32-bits_needed));
2061
24.4k
        bit_offset++;
2062
24.4k
        curr_bits_length  -= bits_needed;
2063
24.4k
        oct    <<= bits_needed;
2064
24.4k
        bits_in_oct   -= bits_needed;
2065
24.4k
      }
2066
3.55k
    }
2067
2068
    /*
2069
     * ES IND
2070
     */
2071
6.17k
    bits_needed = 1;
2072
6.17k
    GET_DATA;
2073
2074
6.12k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ctrled_early_cm_sending, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2075
6.12k
    bit_offset++;
2076
6.12k
    curr_bits_length  -= bits_needed;
2077
6.12k
    oct    <<= bits_needed;
2078
6.12k
    bits_in_oct   -= bits_needed;
2079
2080
    /*
2081
     * PS
2082
     */
2083
6.12k
    bits_needed = 1;
2084
6.12k
    GET_DATA;
2085
2086
6.10k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_pseudo_sync, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2087
6.10k
    bit_offset++;
2088
6.10k
    curr_bits_length  -= bits_needed;
2089
6.10k
    oct    <<= bits_needed;
2090
6.10k
    bits_in_oct   -= bits_needed;
2091
2092
    /*
2093
     * VGCS
2094
     */
2095
6.10k
    bits_needed = 1;
2096
6.10k
    GET_DATA;
2097
2098
6.08k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vgcs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2099
6.08k
    bit_offset++;
2100
6.08k
    curr_bits_length  -= bits_needed;
2101
6.08k
    oct    <<= bits_needed;
2102
6.08k
    bits_in_oct   -= bits_needed;
2103
2104
    /*
2105
     * VBS
2106
     */
2107
6.08k
    bits_needed = 1;
2108
6.08k
    GET_DATA;
2109
2110
6.07k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_vbs, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2111
6.07k
    bit_offset++;
2112
6.07k
    curr_bits_length  -= bits_needed;
2113
6.07k
    oct    <<= bits_needed;
2114
6.07k
    bits_in_oct   -= bits_needed;
2115
2116
    /*
2117
     * Multislot capability?
2118
     */
2119
6.07k
    bits_needed = 1;
2120
6.07k
    GET_DATA;
2121
2122
5.67k
    value = oct>>(32-bits_needed);
2123
2124
5.67k
    mc_item = proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_multislot_capability, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2125
5.67k
    bit_offset++;
2126
2127
5.67k
    curr_bits_length  -= bits_needed;
2128
5.67k
    oct    <<= bits_needed;
2129
5.67k
    bits_in_oct   -= bits_needed;
2130
2131
    /* analyse bits */
2132
5.67k
    if (value == 1)
2133
3.38k
    {
2134
3.38k
      mc_tree = proto_item_add_subtree(mc_item, ett_gsm_a_gm_msrac_multislot_capability);
2135
      /*
2136
       * HSCSD multislot class?
2137
       */
2138
3.38k
      bits_needed = 1;
2139
3.38k
      GET_DATA;
2140
2141
      /* analyse bits */
2142
3.37k
      if ((oct>>(32-bits_needed)) == 0)
2143
2.18k
      {
2144
2.18k
        proto_tree_add_uint_format_value(mc_tree, hf_gsm_a_gm_rac_hscsd_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF,
2145
2.18k
                         "Bits are not available (%u)", oct>>(32-bits_needed));
2146
2.18k
        bit_offset++;
2147
2.18k
        curr_bits_length  -= bits_needed;
2148
2.18k
        oct    <<= bits_needed;
2149
2.18k
        bits_in_oct   -= bits_needed;
2150
2.18k
      }
2151
1.18k
      else
2152
1.18k
      {
2153
1.18k
        curr_bits_length  -= bits_needed;
2154
1.18k
        oct    <<= bits_needed;
2155
1.18k
        bits_in_oct   -= bits_needed;
2156
1.18k
        bit_offset++;
2157
2158
        /*
2159
         * HSCSD multislot class
2160
         */
2161
1.18k
        bits_needed = 5;
2162
1.18k
        GET_DATA;
2163
2164
1.15k
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_hscsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
2165
1.15k
        bit_offset    += 5;
2166
1.15k
        curr_bits_length  -= bits_needed;
2167
1.15k
        oct    <<= bits_needed;
2168
1.15k
        bits_in_oct   -= bits_needed;
2169
1.15k
      }
2170
2171
      /*
2172
       * GPRS multislot class?
2173
       */
2174
3.34k
      bits_needed = 1;
2175
3.34k
      GET_DATA;
2176
2177
      /* analyse bits */
2178
3.33k
      if ((oct>>(32-bits_needed)) == 0)
2179
2.38k
      {
2180
2.38k
        proto_tree_add_uint_format_value(mc_tree, hf_gsm_a_gm_rac_gprs_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF,
2181
2.38k
                        "Bits are not available (%u)", oct>>(32-bits_needed));
2182
2.38k
        bit_offset++;
2183
2.38k
        curr_bits_length  -= bits_needed;
2184
2.38k
        oct    <<= bits_needed;
2185
2.38k
        bits_in_oct   -= bits_needed;
2186
2.38k
      }
2187
946
      else
2188
946
      {
2189
946
        curr_bits_length  -= bits_needed;
2190
946
        oct    <<= bits_needed;
2191
946
        bits_in_oct   -= bits_needed;
2192
946
        bit_offset++;
2193
2194
        /*
2195
         * GPRS multislot class
2196
         */
2197
946
        bits_needed = 5;
2198
946
        GET_DATA;
2199
2200
891
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
2201
891
        bit_offset    += 5;
2202
891
        curr_bits_length  -= bits_needed;
2203
891
        oct    <<= bits_needed;
2204
891
        bits_in_oct   -= bits_needed;
2205
2206
        /*
2207
         * GPRS Extended Dynamic Allocation Capability
2208
         */
2209
891
        bits_needed = 1;
2210
891
        GET_DATA;
2211
2212
884
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2213
884
        bit_offset++;
2214
884
        curr_bits_length  -= bits_needed;
2215
884
        oct    <<= bits_needed;
2216
884
        bits_in_oct   -= bits_needed;
2217
884
      }
2218
2219
      /*
2220
       * SMS/SM values
2221
       */
2222
3.27k
      bits_needed = 1;
2223
3.27k
      GET_DATA;
2224
2225
      /* analyse bits */
2226
3.25k
      if ((oct>>(32-bits_needed)) == 0)
2227
1.89k
      {
2228
1.89k
        proto_tree_add_uint_format_value(mc_tree, hf_gsm_a_gm_sms_value, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF,
2229
1.89k
                        "Bits are not available (%u)", oct>>(32-bits_needed));
2230
1.89k
        bit_offset++;
2231
1.89k
        curr_bits_length  -= bits_needed;
2232
1.89k
        oct    <<= bits_needed;
2233
1.89k
        bits_in_oct   -= bits_needed;
2234
1.89k
      }
2235
1.35k
      else
2236
1.35k
      {
2237
1.35k
        curr_bits_length  -= bits_needed;
2238
1.35k
        oct    <<= bits_needed;
2239
1.35k
        bits_in_oct   -= bits_needed;
2240
1.35k
        bit_offset++;
2241
2242
        /*
2243
         * Switch-Measure-Switch value
2244
         */
2245
1.35k
        bits_needed = 4;
2246
1.35k
        GET_DATA;
2247
2248
        /* analyse bits */
2249
1.15k
        proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sms_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
2250
1.15k
        bit_offset    += 4;
2251
1.15k
        curr_bits_length  -= bits_needed;
2252
1.15k
        oct    <<= bits_needed;
2253
1.15k
        bits_in_oct   -= bits_needed;
2254
2255
        /*
2256
         * Switch-Measure value
2257
         */
2258
1.15k
        bits_needed = 4;
2259
1.15k
        GET_DATA;
2260
2261
        /* analyse bits */
2262
928
        proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_sm_value, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
2263
928
        bit_offset    += 4;
2264
928
        curr_bits_length  -= bits_needed;
2265
928
        oct    <<= bits_needed;
2266
928
        bits_in_oct   -= bits_needed;
2267
928
      }
2268
2269
      /*
2270
       * ECSD multislot class?
2271
       */
2272
2.82k
      bits_needed = 1;
2273
2.82k
      GET_DATA;
2274
2275
      /* analyse bits */
2276
2.60k
      if ((oct>>(32-bits_needed)) == 0)
2277
324
      {
2278
324
        proto_tree_add_uint_format_value(mc_tree, hf_gsm_a_gm_rac_ecsd_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF,
2279
324
                        "Bits are not available (%u)", oct>>(32-bits_needed));
2280
324
        bit_offset++;
2281
324
        curr_bits_length  -= bits_needed;
2282
324
        oct    <<= bits_needed;
2283
324
        bits_in_oct   -= bits_needed;
2284
324
      }
2285
2.27k
      else
2286
2.27k
      {
2287
2.27k
        curr_bits_length  -= bits_needed;
2288
2.27k
        oct    <<= bits_needed;
2289
2.27k
        bits_in_oct   -= bits_needed;
2290
2.27k
        bit_offset++;
2291
2292
        /*
2293
         * ECSD multislot class
2294
         */
2295
2.27k
        bits_needed = 5;
2296
2.27k
        GET_DATA;
2297
2298
1.94k
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ecsd_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
2299
1.94k
        bit_offset    += 5;
2300
1.94k
        curr_bits_length  -= bits_needed;
2301
1.94k
        oct    <<= bits_needed;
2302
1.94k
        bits_in_oct   -= bits_needed;
2303
1.94k
      }
2304
2305
      /*
2306
       * EGPRS multislot class?
2307
       */
2308
2.26k
      bits_needed = 1;
2309
2.26k
      GET_DATA;
2310
2311
      /* analyse bits */
2312
2.24k
      if ((oct>>(32-bits_needed)) == 0)
2313
1.42k
      {
2314
1.42k
        proto_tree_add_uint_format_value(mc_tree, hf_gsm_a_gm_rac_egprs_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF,
2315
1.42k
                        "Bits are not available (%u)", oct>>(32-bits_needed));
2316
1.42k
        curr_bits_length  -= bits_needed;
2317
1.42k
        oct    <<= bits_needed;
2318
1.42k
        bits_in_oct   -= bits_needed;
2319
1.42k
        bit_offset++;
2320
1.42k
      }
2321
821
      else
2322
821
      {
2323
821
        curr_bits_length  -= bits_needed;
2324
821
        oct    <<= bits_needed;
2325
821
        bits_in_oct   -= bits_needed;
2326
821
        bit_offset++;
2327
2328
        /*
2329
         * EGPRS multislot class
2330
         */
2331
821
        bits_needed = 5;
2332
821
        GET_DATA;
2333
2334
774
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_multi_slot_class, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
2335
774
        bit_offset    += 5;
2336
774
        curr_bits_length  -= bits_needed;
2337
774
        oct    <<= bits_needed;
2338
774
        bits_in_oct   -= bits_needed;
2339
2340
        /*
2341
         * EGPRS Extended Dynamic Allocation Capability
2342
         */
2343
774
        bits_needed = 1;
2344
774
        GET_DATA;
2345
2346
760
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2347
760
        bit_offset++;
2348
760
        curr_bits_length  -= bits_needed;
2349
760
        oct    <<= bits_needed;
2350
760
        bits_in_oct   -= bits_needed;
2351
760
      }
2352
2353
      /*
2354
       * DTM GPRS Multi Slot Class ?
2355
      */
2356
2.18k
      bits_needed = 1;
2357
2.18k
      GET_DATA;
2358
2359
      /* analyse bits */
2360
2.17k
      if ((oct>>(32-bits_needed)) == 0)
2361
1.28k
      {
2362
1.28k
        proto_tree_add_uint_format_value(mc_tree, hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF,
2363
1.28k
                        "Bits are not available (%u)", oct>>(32-bits_needed));
2364
1.28k
        bit_offset++;
2365
1.28k
        curr_bits_length  -= bits_needed;
2366
1.28k
        oct    <<= bits_needed;
2367
1.28k
        bits_in_oct   -= bits_needed;
2368
1.28k
      }
2369
885
      else
2370
885
      {
2371
885
        curr_bits_length  -= bits_needed;
2372
885
        oct    <<= bits_needed;
2373
885
        bits_in_oct   -= bits_needed;
2374
885
        bit_offset++;
2375
2376
        /*
2377
         * DTM GPRS Multi Slot Class
2378
         */
2379
885
        bits_needed = 2;
2380
885
        GET_DATA;
2381
2382
        /* analyse bits */
2383
856
        dtm_gprs_mslot = oct>>(32-bits_needed);
2384
2385
856
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2386
856
        bit_offset    += 2;
2387
856
        curr_bits_length  -= bits_needed;
2388
856
        oct    <<= bits_needed;
2389
856
        bits_in_oct   -= bits_needed;
2390
2391
        /*
2392
         * Single Slot DTM
2393
         */
2394
856
        bits_needed = 1;
2395
856
        GET_DATA;
2396
2397
851
        proto_tree_add_bits_item(mc_tree, hf_gsm_a_gm_rac_single_slt_dtm, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2398
851
        bit_offset++;
2399
851
        curr_bits_length  -= bits_needed;
2400
851
        oct    <<= bits_needed;
2401
851
        bits_in_oct   -= bits_needed;
2402
2403
        /*
2404
         * DTM EGPRS Multi Slot Class ?
2405
        */
2406
851
        bits_needed = 1;
2407
851
        GET_DATA;
2408
2409
        /* analyse bits */
2410
846
        dtm_egprs_mslot    = oct>>(32-bits_needed);
2411
846
        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);
2412
846
        bit_offset++;
2413
846
        curr_bits_length  -= bits_needed;
2414
846
        oct    <<= bits_needed;
2415
846
        bits_in_oct   -= bits_needed;
2416
2417
846
        if ((oct>>(32-bits_needed)) == 1)
2418
658
        {
2419
          /*
2420
           * DTM EGPRS Multi Slot Class
2421
           */
2422
658
          bits_needed = 2;
2423
658
          GET_DATA;
2424
2425
647
          proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2426
647
          bit_offset    += 2;
2427
647
          curr_bits_length  -= bits_needed;
2428
647
          oct    <<= bits_needed;
2429
647
          bits_in_oct   -= bits_needed;
2430
647
        }
2431
846
      }
2432
2.17k
    }
2433
2434
    /*
2435
     * 8PSK Power Capability?
2436
     */
2437
4.41k
    bits_needed = 1;
2438
4.41k
    GET_DATA;
2439
4.15k
    value = oct>>(32-bits_needed);
2440
2441
4.15k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_8psk_pow_cap_pres, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2442
4.15k
    bit_offset++;
2443
4.15k
    curr_bits_length  -= bits_needed;
2444
4.15k
    oct    <<= bits_needed;
2445
4.15k
    bits_in_oct   -= bits_needed;
2446
2447
    /* analyse bits */
2448
4.15k
    if (value == 1)
2449
2.04k
    {
2450
      /*
2451
       * 8PSK Power Capability
2452
       */
2453
2.04k
      bits_needed = 2;
2454
2.04k
      GET_DATA;
2455
2456
2457
1.78k
      proto_tree_add_uint(tf_tree, hf_gsm_a_gm_8psk_power_capability, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed));
2458
1.78k
      bit_offset    += 2;
2459
1.78k
      curr_bits_length  -= bits_needed;
2460
1.78k
      oct    <<= bits_needed;
2461
1.78k
      bits_in_oct   -= bits_needed;
2462
1.78k
    }
2463
2464
    /*
2465
     * COMPACT Interference Measurement Capability
2466
     */
2467
3.89k
    bits_needed = 1;
2468
3.89k
    GET_DATA;
2469
2470
3.87k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_comp_int_meas_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2471
3.87k
    bit_offset++;
2472
3.87k
    curr_bits_length  -= bits_needed;
2473
3.87k
    oct    <<= bits_needed;
2474
3.87k
    bits_in_oct   -= bits_needed;
2475
2476
    /*
2477
     * Revision Level Indicator
2478
     */
2479
3.87k
    bits_needed = 1;
2480
3.87k
    GET_DATA;
2481
2482
3.83k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rel_lev_ind, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2483
3.83k
    bit_offset++;
2484
3.83k
    curr_bits_length  -= bits_needed;
2485
3.83k
    oct    <<= bits_needed;
2486
3.83k
    bits_in_oct   -= bits_needed;
2487
2488
    /*
2489
     * UMTS FDD Radio Access Technology Capability
2490
     */
2491
3.83k
    bits_needed = 1;
2492
3.83k
    GET_DATA;
2493
2494
3.71k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_fdd_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2495
3.71k
    bit_offset++;
2496
3.71k
    curr_bits_length  -= bits_needed;
2497
3.71k
    oct    <<= bits_needed;
2498
3.71k
    bits_in_oct   -= bits_needed;
2499
2500
    /*
2501
     * UMTS 3.84 Mcps TDD Radio Access Technology Capability
2502
     */
2503
3.71k
    bits_needed = 1;
2504
3.71k
    GET_DATA;
2505
2506
3.68k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_384_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2507
3.68k
    bit_offset++;
2508
3.68k
    curr_bits_length  -= bits_needed;
2509
3.68k
    oct    <<= bits_needed;
2510
3.68k
    bits_in_oct   -= bits_needed;
2511
2512
    /*
2513
     * CDMA 2000 Radio Access Technology Capability
2514
     */
2515
3.68k
    bits_needed = 1;
2516
3.68k
    GET_DATA;
2517
2518
3.67k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_cdma2000_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2519
3.67k
    bit_offset++;
2520
3.67k
    curr_bits_length  -= bits_needed;
2521
3.67k
    oct    <<= bits_needed;
2522
3.67k
    bits_in_oct   -= bits_needed;
2523
2524
    /*
2525
     * UMTS 1.28 Mcps TDD Radio Access Technology Capability
2526
     */
2527
3.67k
    bits_needed = 1;
2528
3.67k
    GET_DATA;
2529
2530
3.64k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_umts_128_tdd_ra_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2531
3.64k
    bit_offset++;
2532
3.64k
    curr_bits_length  -= bits_needed;
2533
3.64k
    oct    <<= bits_needed;
2534
3.64k
    bits_in_oct   -= bits_needed;
2535
2536
    /*
2537
     * GERAN Feature Package 1
2538
     */
2539
3.64k
    bits_needed = 1;
2540
3.64k
    GET_DATA;
2541
2542
3.61k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_feat_pkg, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2543
3.61k
    bit_offset++;
2544
3.61k
    curr_bits_length  -= bits_needed;
2545
3.61k
    oct    <<= bits_needed;
2546
3.61k
    bits_in_oct   -= bits_needed;
2547
2548
    /*
2549
     * Extended DTM (E)GPRS Multi Slot Class
2550
     */
2551
2552
3.61k
    bits_needed = 1;
2553
3.61k
    GET_DATA;
2554
2555
    /* analyse bits */
2556
3.40k
    if ((oct>>(32-bits_needed)) == 0)
2557
2.45k
    {
2558
2.45k
      proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_gm_extended_dtm_egprs_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF, "Bits are not available (%u)", oct>>(32-bits_needed));
2559
2.45k
      curr_bits_length  -= bits_needed;
2560
2.45k
      oct    <<= bits_needed;
2561
2.45k
      bits_in_oct   -= bits_needed;
2562
2.45k
      bit_offset++;
2563
2.45k
    }
2564
952
    else
2565
952
    {
2566
952
      curr_bits_length  -= bits_needed;
2567
952
      oct    <<= bits_needed;
2568
952
      bits_in_oct   -= bits_needed;
2569
952
      bit_offset++;
2570
2571
      /*
2572
       * Extended DTM GPRS Multi Slot Class
2573
       */
2574
952
      bits_needed = 2;
2575
952
      GET_DATA;
2576
2577
      /* analyse bits */
2578
918
      proto_tree_add_uint(tf_tree, hf_gsm_a_gm_extended_dtm_gprs_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, (oct>>(32-bits_needed))|(dtm_gprs_mslot<<4));
2579
918
      bit_offset    += 2;
2580
918
      curr_bits_length  -= bits_needed;
2581
918
      oct    <<= bits_needed;
2582
918
      bits_in_oct   -= bits_needed;
2583
2584
918
      if (dtm_egprs_mslot <= 3)
2585
215
      {
2586
        /*
2587
         * Extended DTM EGPRS Multi Slot Class
2588
         */
2589
215
        bits_needed = 2;
2590
215
        GET_DATA;
2591
2592
        /* analyse bits */
2593
200
        proto_tree_add_uint(tf_tree, hf_gsm_a_gm_extended_dtm_egprs_multi_slot_class, tvb, curr_offset-1-add_octets, 1+add_octets, (oct>>(32-bits_needed))|(dtm_egprs_mslot<<4));
2594
200
        bit_offset    += 2;
2595
200
        curr_bits_length  -= bits_needed;
2596
200
        oct    <<= bits_needed;
2597
200
        bits_in_oct   -= bits_needed;
2598
200
      }
2599
918
    }
2600
2601
    /*
2602
     * Modulation based multislot class support
2603
     */
2604
3.35k
    bits_needed = 1;
2605
3.35k
    GET_DATA;
2606
2607
3.33k
    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);
2608
3.33k
    bit_offset++;
2609
3.33k
    curr_bits_length  -= bits_needed;
2610
3.33k
    oct    <<= bits_needed;
2611
3.33k
    bits_in_oct   -= bits_needed;
2612
2613
    /*
2614
     * High Multislot Capability
2615
     */
2616
3.33k
    bits_needed = 1;
2617
3.33k
    GET_DATA;
2618
2619
    /* analyse bits */
2620
3.11k
    if ((oct>>(32-bits_needed)) == 0)
2621
1.19k
    {
2622
1.19k
      proto_tree_add_uint_format_value(tf_tree, hf_gsm_a_gm_high_multislot_capability, tvb, curr_offset-1-add_octets, 1+add_octets, 0xFF, "Bits are not available (%u)", oct>>(32-bits_needed));
2623
1.19k
      bit_offset++;
2624
1.19k
      curr_bits_length  -= bits_needed;
2625
1.19k
      oct    <<= bits_needed;
2626
1.19k
      bits_in_oct   -= bits_needed;
2627
1.19k
    }
2628
1.91k
    else
2629
1.91k
    {
2630
1.91k
      curr_bits_length  -= bits_needed;
2631
1.91k
      oct    <<= bits_needed;
2632
1.91k
      bits_in_oct   -= bits_needed;
2633
1.91k
      bit_offset++;
2634
2635
      /*
2636
       * High Multislot Capability
2637
       */
2638
1.91k
      bits_needed = 2;
2639
1.91k
      GET_DATA;
2640
2641
      /* analyse bits */
2642
1.86k
      ti = proto_tree_add_uint(tf_tree, hf_gsm_a_gm_high_multislot_capability, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed));
2643
1.86k
      proto_item_append_text(ti, " - This field effect all other multislot fields."
2644
1.86k
                      " To understand the value please read TS 24.008 5.6.0"
2645
1.86k
                      " Release 5 Chap 10.5.5.12 Page 406");
2646
1.86k
      bit_offset    += 2;
2647
1.86k
      curr_bits_length  -= bits_needed;
2648
1.86k
      oct    <<= bits_needed;
2649
1.86k
      bits_in_oct   -= bits_needed;
2650
1.86k
    }
2651
2652
    /*
2653
     * GERAN Iu Mode Capability
2654
     */
2655
3.05k
    bits_needed = 1;
2656
3.05k
    GET_DATA;
2657
2658
3.04k
    value      = tvb_get_bits8(tvb, bit_offset, 1);
2659
3.04k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_iu_mode_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2660
3.04k
    bit_offset    += bits_needed;
2661
3.04k
    curr_bits_length  -= bits_needed;
2662
3.04k
    oct    <<= bits_needed;
2663
3.04k
    bits_in_oct   -= bits_needed;
2664
3.04k
    if (value)
2665
866
    {
2666
      /* GERAN Iu Mode Capabilities struct present */
2667
866
      bits_needed    = 4;
2668
866
      GET_DATA;
2669
532
      value      = tvb_get_bits8(tvb, bit_offset, 4);
2670
532
      bit_offset    += bits_needed;
2671
532
      curr_bits_length  -= bits_needed;
2672
532
      oct    <<= bits_needed;
2673
532
      bits_in_oct   -= bits_needed;
2674
532
      if (value)
2675
432
      {
2676
        /*
2677
         * FLO Iu Capability
2678
         */
2679
432
        bits_needed    = 1;
2680
432
        GET_DATA;
2681
400
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flo_iu_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2682
400
        bit_offset    += bits_needed;
2683
400
        curr_bits_length  -= bits_needed;
2684
400
        oct    <<= bits_needed;
2685
400
        bits_in_oct   -= bits_needed;
2686
400
        value--;
2687
2688
        /* skip spare bits */
2689
400
        bit_offset    += value;
2690
400
        curr_bits_length  -= value;
2691
400
        oct    <<= value;
2692
400
        bits_in_oct   -= value;
2693
400
      }
2694
532
    }
2695
2696
    /*
2697
     * GMSK Multislot Power Profile
2698
     */
2699
2.67k
    bits_needed = 2;
2700
2.67k
    GET_DATA;
2701
2702
    /* analyse bits */
2703
2.59k
    proto_tree_add_uint(tf_tree, hf_gsm_a_gm_gmsk_multislot_power_profile, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed));
2704
2.59k
    bit_offset    += 2;
2705
2.59k
    curr_bits_length  -= bits_needed;
2706
2.59k
    oct    <<= bits_needed;
2707
2.59k
    bits_in_oct   -= bits_needed;
2708
2709
    /*
2710
     * 8-PSK Multislot Power Profile
2711
     */
2712
2.59k
    bits_needed = 2;
2713
2.59k
    GET_DATA;
2714
2715
    /* analyse bits */
2716
2.57k
    proto_tree_add_uint(tf_tree, hf_gsm_a_gm_8psk_multislot_power_profile, tvb, curr_offset-1-add_octets, 1+add_octets, oct>>(32-bits_needed));
2717
2.57k
    bit_offset    += 2;
2718
2.57k
    curr_bits_length  -= bits_needed;
2719
2.57k
    oct    <<= bits_needed;
2720
2.57k
    bits_in_oct   -= bits_needed;
2721
2722
    /*
2723
     * Release 6
2724
     */
2725
2726
    /*
2727
     * Multiple TBF Capability
2728
     */
2729
2.57k
    bits_needed    = 1;
2730
2.57k
    GET_DATA;
2731
2.53k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mult_tbf_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2732
2.53k
    bit_offset    += bits_needed;
2733
2.53k
    curr_bits_length  -= bits_needed;
2734
2.53k
    oct    <<= bits_needed;
2735
2.53k
    bits_in_oct   -= bits_needed;
2736
2737
    /*
2738
     * Downlink Advanced Receiver Performance
2739
     */
2740
2.53k
    bits_needed    = 2;
2741
2.53k
    GET_DATA;
2742
2.27k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_adv_rec_perf, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2743
2.27k
    bit_offset    += bits_needed;
2744
2.27k
    curr_bits_length  -= bits_needed;
2745
2.27k
    oct    <<= bits_needed;
2746
2.27k
    bits_in_oct   -= bits_needed;
2747
2748
    /*
2749
     * Extended RLC/MAC Control Message Segmentation Capability
2750
     */
2751
2.27k
    bits_needed    = 1;
2752
2.27k
    GET_DATA;
2753
2.27k
    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);
2754
2.27k
    bit_offset    += bits_needed;
2755
2.27k
    curr_bits_length  -= bits_needed;
2756
2.27k
    oct    <<= bits_needed;
2757
2.27k
    bits_in_oct   -= bits_needed;
2758
2759
    /*
2760
     * DTM Enhancements Capability
2761
     */
2762
2.27k
    bits_needed    = 1;
2763
2.27k
    GET_DATA;
2764
2.24k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_enh_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2765
2.24k
    bit_offset    += bits_needed;
2766
2.24k
    curr_bits_length  -= bits_needed;
2767
2.24k
    oct    <<= bits_needed;
2768
2.24k
    bits_in_oct   -= bits_needed;
2769
2770
    /*
2771
     * DTM GPRS High Multi Slot Class & DTM EGPRS High Multi Slot Class
2772
     */
2773
2.24k
    bits_needed = 1;
2774
2.24k
    GET_DATA;
2775
2.22k
    if ((oct>>(32-bits_needed)) == 0)
2776
1.09k
    {
2777
1.09k
      bit_offset    += bits_needed;
2778
1.09k
      curr_bits_length  -= bits_needed;
2779
1.09k
      oct    <<= bits_needed;
2780
1.09k
      bits_in_oct   -= bits_needed;
2781
1.09k
    }
2782
1.13k
    else
2783
1.13k
    {
2784
1.13k
      bit_offset    += bits_needed;
2785
1.13k
      curr_bits_length  -= bits_needed;
2786
1.13k
      oct    <<= bits_needed;
2787
1.13k
      bits_in_oct   -= bits_needed;
2788
2789
      /*
2790
       * DTM GPRS High Multi Slot Class
2791
       */
2792
1.13k
      bits_needed    = 3;
2793
1.13k
      GET_DATA;
2794
1.12k
      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);
2795
1.12k
      bit_offset    += bits_needed;
2796
1.12k
      curr_bits_length  -= bits_needed;
2797
1.12k
      oct    <<= bits_needed;
2798
1.12k
      bits_in_oct   -= bits_needed;
2799
2800
1.12k
      bits_needed = 1;
2801
1.12k
      GET_DATA;
2802
1.10k
      if ((oct>>(32-bits_needed)) == 0)
2803
499
      {
2804
499
        bit_offset    += bits_needed;
2805
499
        curr_bits_length  -= bits_needed;
2806
499
        oct    <<= bits_needed;
2807
499
        bits_in_oct   -= bits_needed;
2808
499
      }
2809
608
      else
2810
608
      {
2811
608
        bit_offset    += bits_needed;
2812
608
        curr_bits_length  -= bits_needed;
2813
608
        oct    <<= bits_needed;
2814
608
        bits_in_oct   -= bits_needed;
2815
2816
        /*
2817
         * DTM EGPRS High Multi Slot Class
2818
         */
2819
608
        bits_needed    = 3;
2820
608
        GET_DATA;
2821
598
        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);
2822
598
        bit_offset    += bits_needed;
2823
598
        curr_bits_length  -= bits_needed;
2824
598
        oct    <<= bits_needed;
2825
598
        bits_in_oct   -= bits_needed;
2826
598
      }
2827
1.10k
    }
2828
2829
    /*
2830
     * PS Handover Capability
2831
     */
2832
2.19k
    bits_needed    = 1;
2833
2.19k
    GET_DATA;
2834
2.17k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ps_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2835
2.17k
    bit_offset    += bits_needed;
2836
2.17k
    curr_bits_length  -= bits_needed;
2837
2.17k
    oct    <<= bits_needed;
2838
2.17k
    bits_in_oct   -= bits_needed;
2839
2840
    /*
2841
     * Release 7
2842
     */
2843
2844
    /*
2845
     * DTM Handover Capability
2846
     */
2847
2.17k
    bits_needed    = 1;
2848
2.17k
    GET_DATA;
2849
2.16k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtm_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2850
2.16k
    bit_offset    += bits_needed;
2851
2.16k
    curr_bits_length  -= bits_needed;
2852
2.16k
    oct    <<= bits_needed;
2853
2.16k
    bits_in_oct   -= bits_needed;
2854
2855
    /*
2856
     * Multislot Capability Reduction for Downlink Dual Carrier & Downlink Dual Carrier for DTM Capability
2857
     */
2858
2859
2.16k
    bits_needed = 1;
2860
2.16k
    GET_DATA;
2861
2.14k
    if ((oct>>(32-bits_needed)) == 0)
2862
865
    {
2863
865
      bit_offset    += bits_needed;
2864
865
      curr_bits_length  -= bits_needed;
2865
865
      oct    <<= bits_needed;
2866
865
      bits_in_oct   -= bits_needed;
2867
865
    }
2868
1.27k
    else
2869
1.27k
    {
2870
1.27k
      bit_offset    += bits_needed;
2871
1.27k
      curr_bits_length  -= bits_needed;
2872
1.27k
      oct    <<= bits_needed;
2873
1.27k
      bits_in_oct   -= bits_needed;
2874
2875
      /*
2876
       * Multislot Capability Reduction for Downlink Dual Carrier
2877
       */
2878
1.27k
      bits_needed    = 3;
2879
1.27k
      GET_DATA;
2880
1.24k
      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);
2881
1.24k
      bit_offset    += bits_needed;
2882
1.24k
      curr_bits_length  -= bits_needed;
2883
1.24k
      oct    <<= bits_needed;
2884
1.24k
      bits_in_oct   -= bits_needed;
2885
2886
      /*
2887
       * Downlink Dual Carrier for DTM Capability
2888
       */
2889
1.24k
      bits_needed    = 1;
2890
1.24k
      GET_DATA;
2891
1.23k
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2892
1.23k
      bit_offset    += bits_needed;
2893
1.23k
      curr_bits_length  -= bits_needed;
2894
1.23k
      oct    <<= bits_needed;
2895
1.23k
      bits_in_oct   -= bits_needed;
2896
1.23k
    }
2897
2898
    /*
2899
     * Flexible Timeslot Assignment
2900
     */
2901
2.10k
    bits_needed    = 1;
2902
2.10k
    GET_DATA;
2903
2.09k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_flex_ts_assign, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2904
2.09k
    bit_offset    += bits_needed;
2905
2.09k
    curr_bits_length  -= bits_needed;
2906
2.09k
    oct    <<= bits_needed;
2907
2.09k
    bits_in_oct   -= bits_needed;
2908
2909
    /*
2910
     * GAN PS Handover Capability
2911
     */
2912
2.09k
    bits_needed    = 1;
2913
2.09k
    GET_DATA;
2914
2.08k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_gan_ps_ho_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2915
2.08k
    bit_offset    += bits_needed;
2916
2.08k
    curr_bits_length  -= bits_needed;
2917
2.08k
    oct    <<= bits_needed;
2918
2.08k
    bits_in_oct   -= bits_needed;
2919
2920
    /*
2921
     * RLC Non-persistent Mode
2922
     */
2923
2.08k
    bits_needed    = 1;
2924
2.08k
    GET_DATA;
2925
2.03k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_rlc_non_pers_mode, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2926
2.03k
    bit_offset    += bits_needed;
2927
2.03k
    curr_bits_length  -= bits_needed;
2928
2.03k
    oct    <<= bits_needed;
2929
2.03k
    bits_in_oct   -= bits_needed;
2930
2931
    /*
2932
     * Reduced Latency Capability
2933
     */
2934
2.03k
    bits_needed    = 1;
2935
2.03k
    GET_DATA;
2936
1.92k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_reduced_lat_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2937
1.92k
    bit_offset    += bits_needed;
2938
1.92k
    curr_bits_length  -= bits_needed;
2939
1.92k
    oct    <<= bits_needed;
2940
1.92k
    bits_in_oct   -= bits_needed;
2941
2942
    /*
2943
     * Uplink EGPRS2
2944
     */
2945
1.92k
    bits_needed    = 2;
2946
1.92k
    GET_DATA;
2947
1.88k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ul_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2948
1.88k
    bit_offset    += bits_needed;
2949
1.88k
    curr_bits_length  -= bits_needed;
2950
1.88k
    oct    <<= bits_needed;
2951
1.88k
    bits_in_oct   -= bits_needed;
2952
2953
    /*
2954
     * Downlink EGPRS2
2955
     */
2956
1.88k
    bits_needed    = 2;
2957
1.88k
    GET_DATA;
2958
1.82k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dl_egprs2, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
2959
1.82k
    bit_offset    += bits_needed;
2960
1.82k
    curr_bits_length  -= bits_needed;
2961
1.82k
    oct    <<= bits_needed;
2962
1.82k
    bits_in_oct   -= bits_needed;
2963
2964
    /*
2965
     * Release 8
2966
     */
2967
2968
    /*
2969
     * E-UTRA FDD support
2970
     */
2971
1.82k
    bits_needed    = 1;
2972
1.82k
    GET_DATA;
2973
1.81k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_fdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2974
1.81k
    bit_offset    += bits_needed;
2975
1.81k
    curr_bits_length  -= bits_needed;
2976
1.81k
    oct    <<= bits_needed;
2977
1.81k
    bits_in_oct   -= bits_needed;
2978
2979
    /*
2980
     * E-UTRA TDD support
2981
     */
2982
1.81k
    bits_needed    = 1;
2983
1.81k
    GET_DATA;
2984
1.78k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_tdd_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2985
1.78k
    bit_offset    += bits_needed;
2986
1.78k
    curr_bits_length  -= bits_needed;
2987
1.78k
    oct    <<= bits_needed;
2988
1.78k
    bits_in_oct   -= bits_needed;
2989
2990
    /*
2991
     * GERAN to E-UTRA support in GERAN packet transfer mode
2992
     */
2993
1.78k
    bits_needed    = 2;
2994
1.78k
    GET_DATA;
2995
1.72k
    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);
2996
1.72k
    bit_offset    += bits_needed;
2997
1.72k
    curr_bits_length  -= bits_needed;
2998
1.72k
    oct    <<= bits_needed;
2999
1.72k
    bits_in_oct   -= bits_needed;
3000
3001
    /*
3002
     * Priority-based reselection support
3003
     */
3004
1.72k
    bits_needed    = 1;
3005
1.72k
    GET_DATA;
3006
1.69k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_prio_based_resel_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3007
1.69k
    bit_offset    += bits_needed;
3008
1.69k
    curr_bits_length  -= bits_needed;
3009
1.69k
    oct    <<= bits_needed;
3010
1.69k
    bits_in_oct   -= bits_needed;
3011
3012
    /*
3013
     * Release 9
3014
     */
3015
3016
    /*
3017
     * Enhanced Flexible Timeslot Assignment
3018
     */
3019
1.69k
    bits_needed = 1;
3020
1.69k
    GET_DATA;
3021
1.64k
    if ((oct>>(32-bits_needed)) == 0)
3022
703
    {
3023
703
      bit_offset    += bits_needed;
3024
703
      curr_bits_length  -= bits_needed;
3025
703
      oct    <<= bits_needed;
3026
703
      bits_in_oct   -= bits_needed;
3027
703
    }
3028
945
    else
3029
945
    {
3030
945
      bit_offset    += bits_needed;
3031
945
      curr_bits_length  -= bits_needed;
3032
945
      oct    <<= bits_needed;
3033
945
      bits_in_oct   -= bits_needed;
3034
3035
      /*
3036
       * Alternative EFTA Multislot Class
3037
       */
3038
945
      bits_needed    = 4;
3039
945
      GET_DATA;
3040
920
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_alt_efta_multi_slot_class, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3041
920
      bit_offset    += bits_needed;
3042
920
      curr_bits_length  -= bits_needed;
3043
920
      oct    <<= bits_needed;
3044
920
      bits_in_oct   -= bits_needed;
3045
3046
      /*
3047
       * EFTA Multislot Capability Reduction for Downlink Dual Carrier
3048
       */
3049
920
      bits_needed    = 3;
3050
920
      GET_DATA;
3051
853
      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);
3052
853
      bit_offset    += bits_needed;
3053
853
      curr_bits_length  -= bits_needed;
3054
853
      oct    <<= bits_needed;
3055
853
      bits_in_oct   -= bits_needed;
3056
853
    }
3057
3058
    /*
3059
     * Indication of Upper Layer PDU Start Capability for RLC UM
3060
     */
3061
1.55k
    bits_needed = 1;
3062
1.55k
    GET_DATA;
3063
1.54k
    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);
3064
1.54k
    bit_offset    += bits_needed;
3065
1.54k
    curr_bits_length  -= bits_needed;
3066
1.54k
    oct    <<= bits_needed;
3067
1.54k
    bits_in_oct   -= bits_needed;
3068
3069
    /*
3070
     * EMST Capability
3071
     */
3072
1.54k
    bits_needed       = 1;
3073
1.54k
    GET_DATA;
3074
1.52k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emst_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3075
1.52k
    bit_offset    += bits_needed;
3076
1.52k
    curr_bits_length  -= bits_needed;
3077
1.52k
    oct    <<= bits_needed;
3078
1.52k
    bits_in_oct   -= bits_needed;
3079
3080
    /*
3081
     * MTTI Capability
3082
     */
3083
1.52k
    bits_needed    = 1;
3084
1.52k
    GET_DATA;
3085
1.51k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mtti_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3086
1.51k
    bit_offset    += bits_needed;
3087
1.51k
    curr_bits_length  -= bits_needed;
3088
1.51k
    oct    <<= bits_needed;
3089
1.51k
    bits_in_oct   -= bits_needed;
3090
3091
    /*
3092
     * UTRA CSG Cells Reporting
3093
     */
3094
1.51k
    bits_needed    = 1;
3095
1.51k
    GET_DATA;
3096
1.50k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_utra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3097
1.50k
    bit_offset    += bits_needed;
3098
1.50k
    curr_bits_length  -= bits_needed;
3099
1.50k
    oct    <<= bits_needed;
3100
1.50k
    bits_in_oct   -= bits_needed;
3101
3102
    /*
3103
     * E-UTRA CSG Cells Reporting
3104
     */
3105
1.50k
    bits_needed    = 1;
3106
1.50k
    GET_DATA;
3107
1.48k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_csg_cell_report, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3108
1.48k
    bit_offset    += bits_needed;
3109
1.48k
    curr_bits_length  -= bits_needed;
3110
1.48k
    oct    <<= bits_needed;
3111
1.48k
    bits_in_oct   -= bits_needed;
3112
3113
    /*
3114
     * Release 10
3115
     */
3116
3117
     /*
3118
     * DTR Capability
3119
     */
3120
1.48k
    bits_needed = 1;
3121
1.48k
    GET_DATA;
3122
1.46k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dtr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3123
1.46k
    bit_offset += bits_needed;
3124
1.46k
    curr_bits_length -= bits_needed;
3125
1.46k
    oct <<= bits_needed;
3126
1.46k
    bits_in_oct -= bits_needed;
3127
3128
     /*
3129
     * EMSR Capability
3130
     */
3131
1.46k
    bits_needed = 1;
3132
1.46k
    GET_DATA;
3133
1.46k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_emsr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3134
1.46k
    bit_offset += bits_needed;
3135
1.46k
    curr_bits_length -= bits_needed;
3136
1.46k
    oct <<= bits_needed;
3137
1.46k
    bits_in_oct -= bits_needed;
3138
3139
     /*
3140
     * Fast Downlink Frequency Switching Capability
3141
     */
3142
1.46k
    bits_needed = 1;
3143
1.46k
    GET_DATA;
3144
1.45k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_fast_down_freq_switch_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3145
1.45k
    bit_offset += bits_needed;
3146
1.45k
    curr_bits_length -= bits_needed;
3147
1.45k
    oct <<= bits_needed;
3148
1.45k
    bits_in_oct -= bits_needed;
3149
3150
     /*
3151
     * TIGHTER Capability
3152
     */
3153
1.45k
    bits_needed = 2;
3154
1.45k
    GET_DATA;
3155
1.41k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_tighter_cap, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3156
1.41k
    bit_offset += bits_needed;
3157
1.41k
    curr_bits_length -= bits_needed;
3158
1.41k
    oct <<= bits_needed;
3159
1.41k
    bits_in_oct -= bits_needed;
3160
3161
    /*
3162
     * Release 11
3163
     */
3164
3165
     /*
3166
     * FANR Capability
3167
     */
3168
1.41k
    bits_needed = 1;
3169
1.41k
    GET_DATA;
3170
1.40k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_fanr_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3171
1.40k
    bit_offset += bits_needed;
3172
1.40k
    curr_bits_length -= bits_needed;
3173
1.40k
    oct <<= bits_needed;
3174
1.40k
    bits_in_oct -= bits_needed;
3175
3176
     /*
3177
     * IPA Capability
3178
     */
3179
1.40k
    bits_needed = 1;
3180
1.40k
    GET_DATA;
3181
1.38k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ipa_cap, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3182
1.38k
    bit_offset += bits_needed;
3183
1.38k
    curr_bits_length -= bits_needed;
3184
1.38k
    oct <<= bits_needed;
3185
1.38k
    bits_in_oct -= bits_needed;
3186
3187
     /*
3188
     * GERAN Network Sharing support
3189
     */
3190
1.38k
    bits_needed = 1;
3191
1.38k
    GET_DATA;
3192
1.33k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_geran_nw_sharing_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3193
1.33k
    bit_offset += bits_needed;
3194
1.33k
    curr_bits_length -= bits_needed;
3195
1.33k
    oct <<= bits_needed;
3196
1.33k
    bits_in_oct -= bits_needed;
3197
3198
     /*
3199
     * E-UTRA Wideband RSRQ measurements support
3200
     */
3201
1.33k
    bits_needed = 1;
3202
1.33k
    GET_DATA;
3203
1.30k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_wb_rsrq_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3204
1.30k
    bit_offset += bits_needed;
3205
1.30k
    curr_bits_length -= bits_needed;
3206
1.30k
    oct <<= bits_needed;
3207
1.30k
    bits_in_oct -= bits_needed;
3208
3209
    /*
3210
     * Release 12
3211
     */
3212
3213
     /*
3214
     * UTRA Multiple Frequency Band Indicators support
3215
     */
3216
1.30k
    bits_needed = 1;
3217
1.30k
    GET_DATA;
3218
1.28k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_utra_mfbi_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3219
1.28k
    bit_offset += bits_needed;
3220
1.28k
    curr_bits_length -= bits_needed;
3221
1.28k
    oct <<= bits_needed;
3222
1.28k
    bits_in_oct -= bits_needed;
3223
3224
     /*
3225
     * E-UTRA Multiple Frequency Band Indicators support
3226
     */
3227
1.28k
    bits_needed = 1;
3228
1.28k
    GET_DATA;
3229
1.18k
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_eutra_mfbi_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3230
1.18k
    bit_offset += bits_needed;
3231
1.18k
    curr_bits_length -= bits_needed;
3232
1.18k
    oct <<= bits_needed;
3233
1.18k
    bits_in_oct -= bits_needed;
3234
3235
     /*
3236
     * DLMC Capability
3237
     */
3238
1.18k
    bits_needed = 1;
3239
1.18k
    GET_DATA;
3240
1.16k
    if ((oct>>(32-bits_needed)) == 0)
3241
395
    {
3242
395
      bit_offset += bits_needed;
3243
395
      curr_bits_length -= bits_needed;
3244
395
      oct <<= bits_needed;
3245
395
      bits_in_oct -= bits_needed;
3246
395
    }
3247
768
    else
3248
768
    {
3249
768
      bit_offset += bits_needed;
3250
768
      curr_bits_length -= bits_needed;
3251
768
      oct  <<= bits_needed;
3252
768
      bits_in_oct -= bits_needed;
3253
3254
768
      bits_needed = 1;
3255
768
      GET_DATA;
3256
742
      if ((oct>>(32-bits_needed)) == 0)
3257
150
      {
3258
150
        bit_offset += bits_needed;
3259
150
        curr_bits_length -= bits_needed;
3260
150
        oct <<= bits_needed;
3261
150
        bits_in_oct -= bits_needed;
3262
150
      }
3263
592
      else
3264
592
      {
3265
592
        bit_offset += bits_needed;
3266
592
        curr_bits_length -= bits_needed;
3267
592
        oct <<= bits_needed;
3268
592
        bits_in_oct -= bits_needed;
3269
3270
        /*
3271
         * DLMC - Non-contiguous intra-band reception
3272
        */
3273
592
        bits_needed = 2;
3274
592
        GET_DATA;
3275
586
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dlmc_non_contig_intra_band_recep, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3276
586
        bit_offset += bits_needed;
3277
586
        curr_bits_length -= bits_needed;
3278
586
        oct <<= bits_needed;
3279
586
        bits_in_oct -= bits_needed;
3280
3281
        /*
3282
         * DLMC - Inter-band reception
3283
        */
3284
586
        bits_needed = 1;
3285
586
        GET_DATA;
3286
580
        proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dlmc_inter_band_recep, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3287
580
        bit_offset += bits_needed;
3288
580
        curr_bits_length -= bits_needed;
3289
580
        oct <<= bits_needed;
3290
580
        bits_in_oct -= bits_needed;
3291
580
      }
3292
3293
      /*
3294
       * DLMC - Maximum Bandwidth
3295
      */
3296
730
      bits_needed = 2;
3297
730
      GET_DATA;
3298
693
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dlmc_max_bandwidth, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3299
693
      bit_offset += bits_needed;
3300
693
      curr_bits_length -= bits_needed;
3301
693
      oct <<= bits_needed;
3302
693
      bits_in_oct -= bits_needed;
3303
3304
      /*
3305
       * DLMC - Maximum Number of Downlink Timeslots
3306
      */
3307
693
      bits_needed = 6;
3308
693
      GET_DATA;
3309
619
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dlmc_max_nb_dl_ts, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3310
619
      bit_offset += bits_needed;
3311
619
      curr_bits_length -= bits_needed;
3312
619
      oct <<= bits_needed;
3313
619
      bits_in_oct -= bits_needed;
3314
3315
      /*
3316
       * DLMC - Maximum Number of Downlink Carriers
3317
      */
3318
619
      bits_needed = 3;
3319
619
      GET_DATA;
3320
590
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_dlmc_max_nb_dl_carriers, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3321
590
      bit_offset += bits_needed;
3322
590
      curr_bits_length -= bits_needed;
3323
590
      oct <<= bits_needed;
3324
590
      bits_in_oct -= bits_needed;
3325
590
    }
3326
3327
    /*
3328
     * Extended TSC Set Capability support
3329
     */
3330
985
    bits_needed = 1;
3331
985
    GET_DATA;
3332
972
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ext_tsc_set_cap_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3333
972
    bit_offset += bits_needed;
3334
972
    curr_bits_length -= bits_needed;
3335
972
    oct <<= bits_needed;
3336
972
    bits_in_oct -= bits_needed;
3337
3338
    /*
3339
     * Extended EARFCN value range
3340
     */
3341
972
    bits_needed = 1;
3342
972
    GET_DATA;
3343
956
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ext_earfcn_value_range, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3344
956
    bit_offset += bits_needed;
3345
956
    curr_bits_length -= bits_needed;
3346
956
    oct <<= bits_needed;
3347
956
    bits_in_oct -= bits_needed;
3348
3349
    /*
3350
     * Release 13
3351
     */
3352
3353
    /*
3354
     * (EC-)PCH monitoring support
3355
     */
3356
956
    bits_needed = 2;
3357
956
    GET_DATA;
3358
932
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ec_pch_mon_support, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3359
932
    bit_offset += bits_needed;
3360
932
    curr_bits_length -= bits_needed;
3361
932
    oct <<= bits_needed;
3362
932
    bits_in_oct -= bits_needed;
3363
3364
    /*
3365
     * Release 14
3366
     */
3367
3368
    /*
3369
     * MS Sync Accuracy
3370
     */
3371
932
    bits_needed = 1;
3372
932
    GET_DATA;
3373
910
    if ((oct>>(32-bits_needed)) == 0)
3374
460
    {
3375
460
      bit_offset += bits_needed;
3376
460
      curr_bits_length -= bits_needed;
3377
460
      oct <<= bits_needed;
3378
460
      bits_in_oct -= bits_needed;
3379
460
    }
3380
450
    else
3381
450
    {
3382
450
      bits_needed = 4;
3383
450
      GET_DATA;
3384
418
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ms_sync_accuracy, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3385
418
      bit_offset += bits_needed;
3386
418
      curr_bits_length -= bits_needed;
3387
418
      oct <<= bits_needed;
3388
418
      bits_in_oct -= bits_needed;
3389
418
    }
3390
3391
    /*
3392
     * EC uplink coverage enhancement support
3393
     */
3394
878
    bits_needed = 1;
3395
878
    GET_DATA;
3396
840
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ec_ul_cov_enh_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3397
840
    bit_offset += bits_needed;
3398
840
    curr_bits_length -= bits_needed;
3399
840
    oct <<= bits_needed;
3400
840
    bits_in_oct -= bits_needed;
3401
3402
    /*
3403
     * Release 15
3404
     */
3405
3406
    /*
3407
     * MTA Access Security support
3408
     */
3409
840
    bits_needed = 1;
3410
840
    GET_DATA;
3411
810
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_mta_access_sec_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3412
810
    bit_offset += bits_needed;
3413
810
    curr_bits_length -= bits_needed;
3414
810
    oct <<= bits_needed;
3415
810
    bits_in_oct -= bits_needed;
3416
3417
    /*
3418
     * EC paging indication channel monitoring support
3419
     */
3420
810
    bits_needed = 1;
3421
810
    GET_DATA;
3422
788
    proto_tree_add_bits_item(tf_tree, hf_gsm_a_gm_rac_ec_paging_ind_chan_mon_support, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3423
788
    bit_offset += bits_needed;
3424
788
    curr_bits_length -= bits_needed;
3425
788
    oct <<= bits_needed;
3426
788
    bits_in_oct -= bits_needed;
3427
3428
     /*
3429
     * we are too long ... so jump over it
3430
     */
3431
3.38k
    while (curr_bits_length > 0)
3432
2.59k
    {
3433
2.59k
      if (curr_bits_length > 8)
3434
2.05k
        bits_needed = 8;
3435
539
      else
3436
539
        bits_needed = curr_bits_length;
3437
2.59k
      GET_DATA;
3438
2.59k
      curr_bits_length  -= bits_needed;
3439
2.59k
      oct    <<= bits_needed;
3440
2.59k
      bits_in_oct   -= bits_needed;
3441
2.59k
    }
3442
3443
3444
7.49k
  } while (1);
3445
3446
1.04k
  curr_offset += curr_len;
3447
3448
1.04k
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
3449
3450
1.04k
  return (curr_offset - offset);
3451
1.04k
}
3452
3453
/*
3454
 * [9] 10.5.5.14
3455
 */
3456
static const range_string gmm_cause_vals[] = {
3457
  { 0x00, 0x01, "Protocol error, unspecified"},
3458
  { 0x02, 0x02, "IMSI unknown in HLR"},
3459
  { 0x03, 0x03, "Illegal MS"},
3460
  { 0x04, 0x04, "IMSI unknown in VLR"}, /* Annex G.1 */
3461
  { 0x05, 0x05, "IMEI not accepted"}, /* Annex G.1 */
3462
  { 0x06, 0x06, "Illegal ME"},
3463
  { 0x07, 0x07, "GPRS services not allowed"},
3464
  { 0x08, 0x08, "GPRS services and non-GPRS services not allowed"},
3465
  { 0x09, 0x09, "MS identity cannot be derived by the network"},
3466
  { 0x0a, 0x0a, "Implicitly detached"},
3467
  { 0x0b, 0x0b, "PLMN not allowed"},
3468
  { 0x0c, 0x0c, "Location Area not allowed"},
3469
  { 0x0d, 0x0d, "Roaming not allowed in this location area"},
3470
  { 0x0e, 0x0e, "GPRS services not allowed in this PLMN"},
3471
  { 0x0f, 0x0f, "No Suitable Cells In Location Area"},
3472
  { 0x10, 0x10, "MSC temporarily not reachable"},
3473
  { 0x11, 0x11, "Network failure"},
3474
  { 0x12, 0x13, "Protocol error, unspecified"},
3475
  { 0x14, 0x14, "MAC failure"},
3476
  { 0x15, 0x15, "Synch failure"},
3477
  { 0x16, 0x16, "Congestion"},
3478
  { 0x17, 0x17, "GSM authentication unacceptable"},
3479
  { 0x18, 0x18, "Protocol error, unspecified"},
3480
  { 0x19, 0x19, "Not authorized for this CSG"},
3481
  { 0x1c, 0x1c, "SMS provided via GPRS in this routing area"},
3482
  { 0x20, 0x20, "Service option not supported"},            /* Annex G.4 */
3483
  { 0x21, 0x21, "Requested service option not subscribed"},     /* Annex G.4 */
3484
  { 0x22, 0x22, "Service option temporarily out of order"},     /* Annex G.4 */
3485
  { 0x23, 0x25, "Protocol error, unspecified"},
3486
  { 0x26, 0x26, "Call cannot be identified(non-GPRS services only)"}, /* Annex G.4 */
3487
  { 0x27, 0x27, "Protocol error, unspecified"},
3488
  { 0x28, 0x28, "No PDP context activated"},
3489
  { 0x29, 0x2f, "Protocol error, unspecified"},
3490
  { 0x30, 0x3f, "Retry upon entry into a new cell"},
3491
  { 0x40, 0x5e, "Protocol error, unspecified"},
3492
  { 0x5f, 0x5f, "Semantically incorrect message"},
3493
  { 0x60, 0x60, "Invalid mandatory information"},
3494
  { 0x61, 0x61, "Message type non-existent or not implemented"},
3495
  { 0x62, 0x62, "Message type not compatible with the protocol state"},
3496
  { 0x63, 0x63, "Information element non-existent or not implemented"},
3497
  { 0x64, 0x64, "Conditional IE error"},
3498
  { 0x65, 0x65, "Message not compatible with the protocol state"},
3499
  { 0x66, 0x6e, "Protocol error, unspecified"},
3500
  { 0x6f, 0x6f, "Protocol error, unspecified"},
3501
  { 0x70, 0xff, "Protocol error, unspecified"},
3502
  { 0, 0, NULL }
3503
};
3504
/* NOTE 1 TS 124 008 V8.6.0 (2009-07)
3505
  "Any other value received by the mobile station shall be treated as 0110 1111, "Protocol
3506
  error, unspecified". Any other value received by the network shall be treated as
3507
  0110 1111, "Protocol error, unspecified".
3508
 */
3509
3510
/* NOTE: The listed reject cause values are defined in annex G. */
3511
3512
static uint16_t
3513
de_gmm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3514
5
{
3515
5
  uint32_t curr_offset;
3516
3517
5
  curr_offset = offset;
3518
3519
5
  proto_tree_add_item(tree, hf_gsm_a_gm_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3520
3521
5
  curr_offset++;
3522
3523
  /* no length check possible */
3524
3525
5
  return (curr_offset - offset);
3526
5
}
3527
3528
/*
3529
 * [7] 10.5.5.15 Routing area identification
3530
 */
3531
uint16_t
3532
de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3533
688
{
3534
688
  proto_tree *subtree;
3535
688
  uint32_t      mcc;
3536
688
  uint32_t      mnc;
3537
688
  uint32_t      lac;
3538
688
  uint32_t      rac;
3539
688
  uint32_t      curr_offset;
3540
3541
688
  curr_offset = offset;
3542
3543
688
  mcc = (tvb_get_uint8(tvb, curr_offset) & 0x0f) <<8;
3544
688
  mcc |= (tvb_get_uint8(tvb, curr_offset) & 0xf0);
3545
688
  mcc |= (tvb_get_uint8(tvb, curr_offset+1) & 0x0f);
3546
688
  mnc = (tvb_get_uint8(tvb, curr_offset+2) & 0x0f) <<8;
3547
688
  mnc |= (tvb_get_uint8(tvb, curr_offset+2) & 0xf0);
3548
688
  mnc |= (tvb_get_uint8(tvb, curr_offset+1) & 0xf0) >>4;
3549
688
  if ((mnc&0x000f) == 0x000f)
3550
108
     mnc = mnc>>4;
3551
3552
688
  lac = tvb_get_ntohs(tvb, curr_offset+3);
3553
688
  rac = tvb_get_uint8(tvb, curr_offset+5);
3554
3555
688
  subtree = proto_tree_add_subtree_format(tree,
3556
688
    tvb, curr_offset, 6, ett_gmm_rai, NULL,
3557
688
    "Routing area identification: %x-%x-%u-%u",
3558
688
    mcc, mnc, lac, rac);
3559
3560
688
  dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, E212_RAI, true);
3561
3562
688
  proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, ENC_BIG_ENDIAN);
3563
688
  proto_tree_add_item(subtree, hf_gsm_a_gm_rac, tvb, curr_offset+5, 1, ENC_BIG_ENDIAN);
3564
3565
688
  curr_offset += 6;
3566
688
  if (add_string)
3567
655
  {
3568
655
    if (add_string[0] == '\0')
3569
655
    {
3570
655
      snprintf(add_string, string_len, " - RAI: %x-%x-%u-%u", mcc, mnc, lac, rac);
3571
655
    }
3572
655
  }
3573
3574
3575
  /* no length check possible */
3576
3577
688
  return (curr_offset - offset);
3578
688
}
3579
3580
/*
3581
 * [7] 10.5.5.15a Routing area identification 2
3582
 */
3583
static uint16_t
3584
de_gmm_rai2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3585
3
{
3586
  /* The routing area identification 2 value is coded as octet 2 to 7 of the Routing area identification information element. */
3587
3
  return de_gmm_rai(tvb, tree, pinfo, offset, len, add_string, string_len);
3588
3
}
3589
3590
/*
3591
 * [7] 10.5.5.17
3592
 */
3593
static const value_string gsm_a_gm_update_res_vals[] = {
3594
  {0,  "RA updated" },
3595
  {1,  "Combined RA/LA updated"},
3596
  {2,  "Reserved"},
3597
  {3,  "Reserved"},
3598
  {4,  "Reserved"},
3599
  {5,  "Reserved"},
3600
  {6,  "Reserved"},
3601
  {7,  "Reserved"},
3602
  {0, NULL}
3603
};
3604
3605
3606
static uint16_t
3607
de_gmm_update_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3608
10
{
3609
10
  uint32_t     curr_offset = offset;
3610
3611
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
3612
10
  proto_tree_add_item(tree, hf_gsm_a_gm_update_result, tvb, curr_offset, 1, ENC_NA);
3613
3614
10
  curr_offset++;
3615
3616
  /* no length check possible */
3617
3618
10
  return (curr_offset - offset);
3619
10
}
3620
3621
/*
3622
 * [9] 10.5.5.18 Update Type
3623
 */
3624
static const value_string gsm_a_gm_update_type_vals[] = {
3625
  { 0x00, "RA updating" },
3626
  { 0x01, "combined RA/LA updating" },
3627
  { 0x02, "combined RA/LA updating with IMSI attach" },
3628
  { 0x03, "Periodic updating" },
3629
  { 0, NULL }
3630
};
3631
3632
static uint16_t
3633
de_gmm_update_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3634
347
{
3635
347
  proto_tree_add_item(tree, hf_gsm_a_gm_for, tvb, offset, 1, ENC_BIG_ENDIAN);
3636
347
  proto_tree_add_item(tree, hf_gsm_a_gm_update_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3637
3638
  /* no length check possible */
3639
347
  return 1;
3640
347
}
3641
3642
/*
3643
 * [9] 10.5.5.19 A&C reference number (lower nibble)
3644
 */
3645
static uint16_t
3646
de_gmm_ac_ref_nr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3647
2
{
3648
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE LOWER NIBBLE */
3649
2
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, (offset << 3) + 4, 4, ENC_BIG_ENDIAN);
3650
3651
  /* no length check possible */
3652
2
  return 1;
3653
2
}
3654
3655
/*
3656
 * [9] 10.5.5.19 A&C reference number (higher nibble)
3657
 */
3658
static uint16_t
3659
de_gmm_ac_ref_nr_h(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3660
0
{
3661
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
3662
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_ac_ref_nr, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
3663
3664
  /* no length check possible */
3665
0
  return 1;
3666
0
}
3667
3668
/*
3669
 * [9] 10.5.5.20 Service type
3670
 */
3671
static const value_string gsm_a_gm_serv_type_vals[] = {
3672
  { 0x00, "Signalling" },
3673
  { 0x01, "Data" },
3674
  { 0x02, "Paging response" },
3675
  { 0x03, "MBMS Multicast Service Reception" },
3676
  { 0x04, "MBMS Broadcast Service Reception" },
3677
  { 0, NULL }
3678
};
3679
3680
static uint16_t
3681
de_gmm_service_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3682
3
{
3683
3
  uint32_t  bit_offset;
3684
3685
3
  bit_offset = offset << 3;
3686
3
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3687
3
  bit_offset  +=  1;
3688
3
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_serv_type, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3689
  /*bit_offset  +=  3;*/
3690
3691
  /* no length check possible */
3692
3
  return 1;
3693
3
}
3694
3695
/*
3696
 * [9] 10.5.5.21 Cell Notification
3697
 * No data
3698
 */
3699
3700
/*
3701
 * [9] 10.5.5.22 PS LCS Capability
3702
 */
3703
static const true_false_string gsm_a_gm_mta_e_vals = {
3704
  "Multilateration Timing Advance using Extended Access Burst method supported",
3705
  "Multilateration Timing Advance using Extended Access Burst method not supported"
3706
};
3707
3708
static const true_false_string gsm_a_gm_mta_r_vals = {
3709
  "Multilateration Timing Advance using RLC data block method supported",
3710
  "Multilateration Timing Advance using RLC data block method not supported"
3711
};
3712
3713
static const true_false_string gsm_a_gm_apc_vals = {
3714
  "Additional Positioning Capabilities which can be retrieved by RRLP are supported",
3715
  "Additional Positioning Capabilities which can be retrieved by RRLP are not supported"
3716
};
3717
3718
static const true_false_string gsm_a_gm_otd_a_vals = {
3719
  "MS assisted E-OTD supported",
3720
  "MS assisted E-OTD not supported"
3721
};
3722
3723
static const true_false_string gsm_a_gm_otd_b_vals = {
3724
  "MS based E-OTD supported",
3725
  "MS based E-OTD not supported"
3726
};
3727
3728
static const true_false_string gsm_a_gm_gps_a_vals = {
3729
  "MS assisted GPS supported",
3730
  "MS assisted GPS not supported"
3731
};
3732
3733
static const true_false_string gsm_a_gm_gps_b_vals = {
3734
  "MS based GPS supported",
3735
  "MS based GPS not supported"
3736
};
3737
3738
static const true_false_string gsm_a_gm_gps_c_vals = {
3739
  "Conventional GPS supported",
3740
  "Conventional GPS not supported"
3741
};
3742
3743
static const true_false_string gsm_a_gm_motd_vals = {
3744
  "Multilateration Observed Time Difference supported",
3745
  "Multilateration Observed Time Difference not supported"
3746
};
3747
3748
static const true_false_string gsm_a_gm_mta_a_vals = {
3749
  "Multilateration Timing Advance using Access Burst method supported",
3750
  "Multilateration Timing Advance using Access Burst method not supported"
3751
};
3752
3753
static uint16_t
3754
de_gmm_ps_lcs_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3755
7
{
3756
7
  uint32_t  curr_offset;
3757
3758
7
  curr_offset = offset;
3759
7
  proto_tree_add_item(tree, hf_gsm_a_gm_mta_e, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3760
7
  proto_tree_add_item(tree, hf_gsm_a_gm_mta_r, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3761
7
  proto_tree_add_item(tree, hf_gsm_a_gm_apc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3762
7
  proto_tree_add_item(tree, hf_gsm_a_gm_otd_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3763
7
  proto_tree_add_item(tree, hf_gsm_a_gm_otd_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3764
7
  proto_tree_add_item(tree, hf_gsm_a_gm_gps_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3765
7
  proto_tree_add_item(tree, hf_gsm_a_gm_gps_b, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3766
7
  proto_tree_add_item(tree, hf_gsm_a_gm_gps_c, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3767
3768
7
  curr_offset++;
3769
3770
7
  if (len > 2) {
3771
4
    proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 6, ENC_BIG_ENDIAN);
3772
4
    proto_tree_add_item(tree, hf_gsm_a_gm_motd, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3773
4
    proto_tree_add_item(tree, hf_gsm_a_gm_mta_a, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3774
4
  }
3775
3776
7
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
3777
3778
7
  return (curr_offset - offset);
3779
7
}
3780
3781
/*
3782
 * [7] 10.5.5.23
3783
 */
3784
static const true_false_string gsm_a_gm_lcs_molr_value = {
3785
  "LCS-MOLR via PS domain supported",
3786
  "LCS-MOLR via PS domain not supported"
3787
};
3788
static const true_false_string gsm_a_gm_ims_vops_value = {
3789
  "IMS voice over PS session supported in Iu mode, but not supported in A/Gb mode",
3790
  "IMS voice over PS session in Iu mode and A/Gb mode not supported"
3791
};
3792
static const true_false_string gsm_a_gm_emc_bs_value = {
3793
  "Emergency bearer services supported in Iu mode, but not supported in A/Gb mode",
3794
  "Emergency bearer services in Iu mode and A/Gb mode not supported"
3795
};
3796
static uint16_t
3797
de_gmm_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3798
0
{
3799
0
  uint32_t curr_offset;
3800
3801
0
  curr_offset = offset;
3802
3803
0
  proto_tree_add_item(tree, hf_gsm_a_gm_lcs_molr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3804
0
  proto_tree_add_item(tree, hf_gsm_a_gm_mbms, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3805
0
  proto_tree_add_item(tree, hf_gsm_a_gm_ims_vops, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3806
0
  proto_tree_add_item(tree, hf_gsm_a_gm_emc_bs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3807
0
  curr_offset++;
3808
3809
0
  return (curr_offset - offset);
3810
0
}
3811
3812
/*
3813
 * [7] 10.5.5.23a Additional network feature support
3814
 */
3815
static const true_false_string gsm_a_gm_epco_value = {
3816
  "Extended protocol configuration options IE supported",
3817
  "Extended protocol configuration options IE not supported"
3818
};
3819
static const true_false_string gsm_a_gm_restrict_ec_value = {
3820
  "Enhanced coverage restricted",
3821
  "Enhanced coverage not restricted"
3822
};
3823
static const true_false_string gsm_a_gm_gprs_sms_value = {
3824
  "SMS via GPRS not supported",
3825
  "SMS via GPRS supported"
3826
};
3827
static uint16_t
3828
de_gmm_add_net_feat_supp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3829
0
{
3830
0
  uint32_t curr_offset;
3831
3832
0
  curr_offset = offset;
3833
3834
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 5, ENC_BIG_ENDIAN);
3835
0
  proto_tree_add_item(tree, hf_gsm_a_gm_epco, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3836
0
  proto_tree_add_item(tree, hf_gsm_a_gm_restrict_ec, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3837
0
  proto_tree_add_item(tree, hf_gsm_a_gm_gprs_sms, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3838
0
  curr_offset++;
3839
3840
0
  return (curr_offset - offset);
3841
0
}
3842
3843
/* [7] 10.5.5.24 Inter RAT information container */
3844
static uint16_t
3845
de_gmm_rat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3846
0
{
3847
0
  uint32_t  curr_offset;
3848
0
  tvbuff_t *rrc_irat_ho_info_tvb;
3849
3850
0
  curr_offset = offset;
3851
3852
/* The value part of the Inter RAT information container information element is the INTER RAT HANDOVER INFO as
3853
defined in 3GPP TS 25.331 [23c]. If this field includes padding bits, they are defined in 3GPP TS 25.331 [23c].*/
3854
0
  rrc_irat_ho_info_tvb = tvb_new_subset_length(tvb, curr_offset, len);
3855
0
  if (rrc_irat_ho_info_handle)
3856
0
    call_dissector(rrc_irat_ho_info_handle, rrc_irat_ho_info_tvb, pinfo, tree);
3857
0
  else
3858
0
    proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_gm_undecoded, tvb, curr_offset, len, "INTER RAT HANDOVER INFO - Not decoded");
3859
3860
0
  return len;
3861
3862
0
}
3863
3864
/* [7] 10.5.5.25 Requested MS information */
3865
static const true_false_string gsm_a_gm_req_ms_info_irat_vals = {
3866
  "Inter RAT information container IE requested",
3867
  "Inter RAT information container IE not requested"
3868
};
3869
static const true_false_string gsm_a_gm_req_ms_info_irat2_vals = {
3870
  "E-UTRAN inter RAT information container IE requested",
3871
  "E-UTRAN inter RAT information container IE not requested"
3872
};
3873
3874
static uint16_t
3875
de_gmm_req_ms_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3876
2
{
3877
2
  uint32_t  curr_offset;
3878
2
  uint32_t bit_offset;
3879
3880
2
  curr_offset = offset;
3881
2
  bit_offset  = (curr_offset<<3)+4;
3882
3883
2
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3884
2
  bit_offset++;
3885
2
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_req_ms_info_irat2, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3886
2
  bit_offset++;
3887
2
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3888
  /*bit_offset += 2;
3889
  curr_offset++;*/
3890
3891
2
  return len;
3892
2
}
3893
3894
/* [7] 10.5.5.26 UE network capability
3895
 * See subclause 9.9.3.x in 3GPP TS 24.301 [120].
3896
 */
3897
3898
/* [7] 10.5.5.27 E-UTRAN inter RAT information container */
3899
static uint16_t
3900
de_gmm_eutran_irat_info_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3901
0
{
3902
0
  uint32_t  curr_offset;
3903
0
  tvbuff_t *lte_rrc_ue_eutra_cap_tvb;
3904
3905
0
  curr_offset = offset;
3906
3907
/* The value part of the E-UTRAN inter RAT information container information element
3908
   is formatted and coded according to the UE-EUTRA-Capability IE defined in 3GPP TS 36.331 [129]*/
3909
0
  lte_rrc_ue_eutra_cap_tvb = tvb_new_subset_length(tvb, curr_offset, len);
3910
0
  if (lte_rrc_ue_eutra_cap_handle)
3911
0
    call_dissector(lte_rrc_ue_eutra_cap_handle, lte_rrc_ue_eutra_cap_tvb, pinfo, tree);
3912
0
  else
3913
0
    proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_gm_undecoded, tvb, curr_offset, len, "E-UTRAN Inter RAT information container - Not decoded");
3914
3915
0
  return len;
3916
0
}
3917
3918
/* [7] 10.5.5.28 Voice domain preference and UE's usage setting */
3919
static const true_false_string gsm_a_gm_ue_usage_setting_vals = {
3920
  "Data centric",
3921
  "Voice centric"
3922
};
3923
static const value_string gsm_a_gm_voice_domain_pref_for_eutran_vals[] = {
3924
  {0x0, "CS Voice only"},
3925
  {0x1, "IMS PS Voice only"},
3926
  {0x2, "CS voice preferred, IMS PS Voice as secondary"},
3927
  {0x3, "IMS PS voice preferred, CS Voice as secondary"},
3928
  {  0, NULL }
3929
};
3930
3931
uint16_t
3932
de_gmm_voice_domain_pref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3933
2
{
3934
2
  uint32_t  curr_offset;
3935
2
  uint32_t bit_offset;
3936
3937
2
  curr_offset = offset;
3938
2
  bit_offset  = curr_offset<<3;
3939
3940
2
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3941
2
  bit_offset += 5;
3942
2
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_ue_usage_setting, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3943
2
  bit_offset++;
3944
2
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_voice_domain_pref_for_eutran, tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3945
  /*bit_offset += 2;
3946
  curr_offset++;*/
3947
3948
2
  return len;
3949
2
}
3950
3951
/* [10] 10.5.5.29 P-TMSI type */
3952
static const true_false_string gsm_a_gm_ptmsi_type_value = {
3953
  "Mapped P-TMSI",
3954
  "Native P-TMSI"
3955
};
3956
3957
static uint16_t
3958
de_gmm_ptmsi_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3959
7
{
3960
7
  uint32_t curr_offset, bit_offset;
3961
3962
7
  curr_offset = offset;
3963
7
  bit_offset  = (curr_offset<<3)+4;
3964
3965
7
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3966
7
  bit_offset += 3;
3967
7
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_ptmsi_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3968
7
  curr_offset++;
3969
3970
7
  return (curr_offset - offset);
3971
7
}
3972
3973
/* [10] 10.5.5.30 Location Area Identification 2 */
3974
static uint16_t
3975
de_gmm_lai_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
3976
2
{
3977
  /* The Location Area Identification 2 value is coded as octet 2 to 6 of the */
3978
  /* Location Area Identification information element */
3979
2
  return de_lai(tvb, tree, pinfo, offset, len, add_string, string_len);
3980
2
}
3981
3982
/* [11] 10.5.5.31 Network resource identifier container */
3983
static uint16_t
3984
de_gmm_net_res_id_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3985
3
{
3986
3
  uint32_t  curr_offset;
3987
3
  uint32_t bit_offset;
3988
3989
3
  curr_offset = offset;
3990
3
  bit_offset  = curr_offset<<3;
3991
3992
3
  proto_tree_add_item(tree, hf_gsm_a_gm_nri_cont, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
3993
3
  bit_offset += 10;
3994
3
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3995
3996
3
  return len;
3997
3
}
3998
3999
/* [13] 10.5.5.32 Extended DRX parameters */
4000
static const value_string gsm_a_gm_paging_time_window_vals[] = {
4001
  {0x0, "Iu: 0 s / WB-S1/WB-N1: 1.28 s / NB-S1/NB-N1: 2.56 s"},
4002
  {0x1, "Iu: 1 s / WB-S1/WB-N1: 2.56 s / NB-S1/NB-N1: 5.12 s"},
4003
  {0x2, "Iu: 2 s / WB-S1/WB-N1: 3.84 s / NB-S1/NB-N1: 7.68 s"},
4004
  {0x3, "Iu: 3 s / WB-S1/WB-N1: 5.12 s / NB-S1/NB-N1: 10.24 s"},
4005
  {0x4, "Iu: 4 s / WB-S1/WB-N1: 6.4 s / NB-S1/NB-N1: 12.8 s"},
4006
  {0x5, "Iu: 5 s / WB-S1/WB-N1: 7.68 s / NB-S1/NB-N1: 15.36 s"},
4007
  {0x6, "Iu: 6 s / WB-S1/WB-N1: 8.96 s / NB-S1/NB-N1: 17.92 s"},
4008
  {0x7, "Iu: 7 s / WB-S1/WB-N1: 10.24 s / NB-S1/NB-N1: 20.48 s"},
4009
  {0x8, "Iu: 8 s / WB-S1/WB-N1: 11.52 s / NB-S1/NB-N1: 23.04 s"},
4010
  {0x9, "Iu: 9 s / WB-S1/WB-N1: 12.8 s / NB-S1/NB-N1: 25.6 s"},
4011
  {0xa, "Iu: 10 s / WB-S1/WB-N1: 14.08 s / NB-S1/NB-N1: 28.16 s"},
4012
  {0xb, "Iu: 12 s / WB-S1/WB-N1: 15.36 s / NB-S1/NB-N1: 30.72 s"},
4013
  {0xc, "Iu: 14 s / WB-S1/WB-N1: 16.64 s / NB-S1/NB-N1: 33.28 s"},
4014
  {0xd, "Iu: 16 s / WB-S1/WB-N1: 17.92 s / NB-S1/NB-N1: 35.84 s"},
4015
  {0xe, "Iu: 18 s / WB-S1/WB-N1: 19.2 s / NB-S1/NB-N1: 38.4 s"},
4016
  {0xf, "Iu: 20 s / WB-S1/WB-N1: 20.48 s / NB-S1/NB-N1: 40.96 s"},
4017
  {  0, NULL }
4018
};
4019
4020
static const value_string gsm_a_gm_edrx_vals[] = {
4021
  {0x0, "GERAN: 1.88 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 5.12 s / NR-5GCN: 2.56 s"},
4022
  {0x1, "GERAN: 3.76 s / UTRAN: 20.48 s / S1,NB-N1,WB-N1: 10.24 s / NR-5GCN: 5.12 s"},
4023
  {0x2, "GERAN: 7.53 s / UTRAN: 40.96 s / S1,NB-N1,WB-N1: 20.48 s / NR-5GCN: 10.24 s"},
4024
  {0x3, "GERAN: 12.24 s / UTRAN: 81.92 s / S1,NB-N1,WB-N1: 40.96 s / NR-5GCN: 20,48 s"},
4025
  {0x4, "GERAN: 24.48 s / UTRAN: 163.84 s / S1,NB-N1,WB-N1: 61.44 s / NR-5GCN: 40.96 s"},
4026
  {0x5, "GERAN: 48.96 s / UTRAN: 327.68 s / S1,NB-N1,WB-N1: 81.92 s / NR-5GCN: 81.92 s"},
4027
  {0x6, "GERAN: 97.92 s / UTRAN: 655.36 s / S1,NB-N1,WB-N1: 102.4 s / NR-5GCN: 163.84 s"},
4028
  {0x7, "GERAN: 195.84 s / UTRAN: 1310.72 s / S1,NB-N1,WB-N1: 122.88 s / NR-5GCN: 327.68 s"},
4029
  {0x8, "GERAN: 391.68 s / UTRAN: 1966.08 s / S1,NB-N1,WB-N1: 143.36 s / NR-5GCN: 655.36 s"},
4030
  {0x9, "GERAN: 783.36 s / UTRAN: 2621.44 s / S1,NB-N1,WB-N1: 163.84 s / NR-5GCN: 1310.72 s"},
4031
  {0xa, "GERAN: 1566.72 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 327.68 s / NR-5GCN: 2621.44 s"},
4032
  {0xb, "GERAN: 3133.44 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 655.36 s / NR-5GCN: 5242.88 s"},
4033
  {0xc, "GERAN: 1.88 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 1310.72 s / NR-5GCN: 10485.76 s"},
4034
  {0xd, "GERAN: 1.88 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 2621.44 s / NR-5GCN: 2.56 s"},
4035
  {0xe, "GERAN: 1.88 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 5242.88 s / NR-5GCN: 2.56 s"},
4036
  {0xf, "GERAN: 1.88 s / UTRAN: 10.24 s / S1,NB-N1,WB-N1: 10485.76 s / NR-5GCN: 2.56 s"},
4037
  {  0, NULL }
4038
};
4039
4040
static const value_string gsm_a_gm_paging_time_window_nr_5gcn_vals[] = {
4041
  {0x00,  "NR-5GCN: 1.28 s"},
4042
  {0x01,  "NR-5GCN: 2.56 s"},
4043
  {0x02,  "NR-5GCN: 3.84 s"},
4044
  {0x03,  "NR-5GCN: 5.12 s"},
4045
  {0x04,  "NR-5GCN: 6.4 s"},
4046
  {0x05,  "NR-5GCN: 7.68 s"},
4047
  {0x06,  "NR-5GCN: 8.96 s"},
4048
  {0x07,  "NR-5GCN: 10.24 s"},
4049
  {0x08,  "NR-5GCN: 11.52 s"},
4050
  {0x09,  "NR-5GCN: 12.8 s"},
4051
  {0x0a,  "NR-5GCN: 14.08 s"},
4052
  {0x0b,  "NR-5GCN: 15.36 s"},
4053
  {0x0c,  "NR-5GCN: 16.64 s"},
4054
  {0x0d,  "NR-5GCN: 17.92 s"},
4055
  {0x0e,  "NR-5GCN: 19.2 s"},
4056
  {0x0f,  "NR-5GCN: 20.48 s"},
4057
  {0x10,  "NR-5GCN: 21.76 s"},
4058
  {0x11,  "NR-5GCN: 23.04 s"},
4059
  {0x12,  "NR-5GCN: 24.32 s"},
4060
  {0x13,  "NR-5GCN: 25.6 s"},
4061
  {0x14,  "NR-5GCN: 26.88 s"},
4062
  {0x15,  "NR-5GCN: 28.16 s"},
4063
  {0x16,  "NR-5GCN: 29.44 s"},
4064
  {0x17,  "NR-5GCN: 30.72 s"},
4065
  {0x18,  "NR-5GCN: 32 s"},
4066
  {0x19,  "NR-5GCN: 33.28 s"},
4067
  {0x1a,  "NR-5GCN: 34.56 s"},
4068
  {0x1b,  "NR-5GCN: 35.84 s"},
4069
  {0x1c,  "NR-5GCN: 37.12 s"},
4070
  {0x1d,  "NR-5GCN: 38.4 s"},
4071
  {0x1e,  "NR-5GCN: 39.68 s"},
4072
  {0x1f,  "NR-5GCN: 40.96 s"},
4073
  {  0, NULL }
4074
};
4075
4076
static uint16_t
4077
de_gmm_ext_drx_params(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4078
1
{
4079
1
  uint32_t  curr_offset;
4080
4081
1
  curr_offset = offset;
4082
4083
1
  proto_tree_add_item(tree, hf_gsm_a_gm_paging_time_window, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4084
1
  proto_tree_add_item(tree, hf_gsm_a_gm_edrx_value, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4085
1
  curr_offset++;
4086
4087
1
  if ((curr_offset - offset) >= len)
4088
0
    return len;
4089
4090
1
  proto_tree_add_item(tree, hf_gsm_a_gm_ext_paging_time_window, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4091
4092
1
  return len;
4093
1
}
4094
4095
/* [13] 10.5.5.33 Message authentication code */
4096
static uint16_t
4097
de_gmm_mac(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4098
0
{
4099
0
  proto_tree_add_item(tree, hf_gsm_a_gm_mac, tvb, offset, 4, ENC_BIG_ENDIAN);
4100
4101
0
  return len;
4102
0
}
4103
4104
/* [13] 10.5.5.34 User Plane integrity indicator */
4105
static const true_false_string gsm_a_gm_up_integ_ind_value = {
4106
  "MS shall enable integrity protection of user plane data in LLC layer",
4107
  "MS shall disable integrity protection of user plane data in LLC layer"
4108
};
4109
4110
static uint16_t
4111
de_gmm_up_integ_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4112
2
{
4113
2
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
4114
2
  proto_tree_add_item(tree, hf_gsm_a_gm_up_integ_ind, tvb, offset, 1, ENC_BIG_ENDIAN);
4115
4116
  /* no length check possible */
4117
2
  return 1;
4118
2
}
4119
4120
/* [14] 10.5.5.35 DCN-ID */
4121
static uint16_t
4122
de_gmm_dcn_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4123
0
{
4124
0
  proto_tree_add_item(tree, hf_gsm_a_gm_dcn_id, tvb, offset, 2, ENC_BIG_ENDIAN);
4125
4126
0
  return 2;
4127
0
}
4128
4129
/* [14] 10.5.5.36 PLMN identity of the CN operator */
4130
static uint16_t
4131
de_gmm_plmn_id_cn_operator(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4132
0
{
4133
0
  dissect_e212_mcc_mnc(tvb, pinfo, tree, offset, E212_NONE, true);
4134
4135
0
  return 3;
4136
0
}
4137
4138
/* [14] 10.5.5.37 Non-3GPP NW provided policies */
4139
static const true_false_string gsm_a_gm_n3en_ind_value = {
4140
  "Use of non-3GPP emergency numbers permitted",
4141
  "Use of non-3GPP emergency numbers not permitted"
4142
};
4143
4144
static uint16_t
4145
de_gmm_non_3gpp_nw_prov_pol(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4146
2
{
4147
2
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
4148
2
  proto_tree_add_item(tree, hf_gsm_a_gm_n3en_ind, tvb, offset, 1, ENC_BIG_ENDIAN);
4149
4150
  /* no length check possible */
4151
2
  return 1;
4152
2
}
4153
4154
/*
4155
 * [7] 10.5.7.1
4156
 */
4157
static uint16_t
4158
de_gc_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4159
4
{
4160
4
  uint8_t     oct;
4161
4
  uint16_t    pdp_nr;
4162
4
  uint32_t    curr_offset;
4163
4164
4
  curr_offset = offset;
4165
4166
4
  oct = tvb_get_uint8(tvb, curr_offset);
4167
4168
68
  for (pdp_nr=0; pdp_nr<16; pdp_nr++)
4169
64
  {
4170
64
    if (pdp_nr == 8)
4171
4
    {
4172
4
      curr_offset++;
4173
4
      oct = tvb_get_uint8(tvb, curr_offset);
4174
4
    }
4175
64
    proto_tree_add_uint_format(tree, hf_gsm_a_gm_nsapi, tvb, curr_offset, 1, oct&1, "NSAPI %d: %s (%u)", pdp_nr, pdp_str[oct&1], oct&1);
4176
64
    oct>>=1;
4177
64
  }
4178
4179
4
  curr_offset++;
4180
4181
4
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4182
4183
4
  return (curr_offset - offset);
4184
4
}
4185
4186
/*
4187
 * [7] 10.5.7.2
4188
 */
4189
static const value_string gsm_a_gm_radio_prio_vals[] = {
4190
  {0,  "priority level 4 (lowest)" },
4191
  {1,  "priority level 1 (highest)"},
4192
  {2,  "priority level 2"},
4193
  {3,  "priority level 3"},
4194
  {4,  "priority level 4 (lowest)"},
4195
  {5,  "priority level 4 (lowest)"},
4196
  {6,  "priority level 4 (lowest)"},
4197
  {7,  "priority level 4 (lowest)"},
4198
  {0, NULL}
4199
};
4200
4201
static uint16_t
4202
de_gc_radio_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4203
55
{
4204
55
  uint32_t     curr_offset = offset;
4205
4206
55
  proto_tree_add_item(tree, hf_gsm_a_gm_radio_priority_pdp, tvb, curr_offset, 1, ENC_NA);
4207
4208
55
  curr_offset++;
4209
4210
55
  return (curr_offset - offset);
4211
55
}
4212
4213
/*
4214
 * [9] 10.5.7.3 GPRS Timer
4215
 */
4216
static const value_string gsm_a_gm_gprs_timer_unit_vals[] = {
4217
  { 0x00, "value is incremented in multiples of 2 seconds" },
4218
  { 0x01, "value is incremented in multiples of 1 minute" },
4219
  { 0x02, "value is incremented in multiples of decihours" },
4220
  { 0x07, "value indicates that the timer is deactivated" },
4221
  { 0, NULL }
4222
};
4223
4224
uint16_t
4225
de_gc_timer(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4226
33
{
4227
33
  uint8_t      oct;
4228
33
  uint16_t     val;
4229
33
  const char *str;
4230
33
  proto_item  *item = NULL;
4231
33
  proto_tree  *subtree;
4232
4233
33
  oct = tvb_get_uint8(tvb, offset);
4234
33
  val = oct&0x1f;
4235
4236
33
  switch (oct>>5)
4237
33
  {
4238
10
    case 0:
4239
10
      str = "sec";
4240
10
      val *= 2;
4241
10
      break;
4242
2
    case 1:
4243
2
      str = "min";
4244
2
      break;
4245
4
    case 2:
4246
4
      str = "min";
4247
4
      val *= 6;
4248
4
      break;
4249
2
    case 7:
4250
2
      str = "";
4251
2
      item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_gprs_timer, tvb, offset, 1, val, "timer is deactivated");
4252
2
      break;
4253
15
    default:
4254
15
      str = "min";
4255
15
      break;
4256
33
  }
4257
4258
33
  if (item == NULL) {
4259
31
    item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_gprs_timer, tvb, offset, 1, val, "%u %s", val, str);
4260
31
  }
4261
4262
33
  subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
4263
33
  proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4264
33
  proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN);
4265
4266
  /* no length check possible */
4267
33
  return 1;
4268
33
}
4269
4270
/*
4271
 * [7] 10.5.7.4
4272
 */
4273
static uint16_t
4274
de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string, int string_len _U_)
4275
6
{
4276
6
  uint8_t      oct;
4277
6
  uint16_t     val;
4278
6
  uint32_t     curr_offset;
4279
6
  const char *str = NULL;
4280
6
  proto_tree  *subtree;
4281
6
  proto_item  *item = NULL;
4282
4283
6
  curr_offset = offset;
4284
4285
6
  oct = tvb_get_uint8(tvb, curr_offset);
4286
4287
6
  val = oct&0x1f;
4288
4289
6
  switch (oct>>5)
4290
6
  {
4291
1
    case 0:
4292
1
      str = "sec";
4293
1
      val *= 2;
4294
1
      break;
4295
3
    case 1:
4296
3
      str = "min";
4297
3
      break;
4298
1
    case 2:
4299
1
      str = "min";
4300
1
      val *= 6;
4301
1
      break;
4302
0
    case 7:
4303
0
      item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_gprs_timer2, tvb, curr_offset, 1, val, "timer is deactivated");
4304
0
      break;
4305
1
    default:
4306
1
      str = "min";
4307
1
      break;
4308
6
  }
4309
4310
6
  if (item == NULL) {
4311
6
    item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_gprs_timer2, tvb, curr_offset, 1, val, "%u %s %s", val, str, add_string ? add_string : "");
4312
6
  }
4313
4314
6
  subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
4315
6
  proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer2_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4316
6
  proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer2_value, tvb, offset, 1, ENC_BIG_ENDIAN);
4317
6
  curr_offset++;
4318
4319
6
  return (curr_offset - offset);
4320
6
}
4321
4322
/*
4323
 * [10] 10.5.7.4a
4324
 */
4325
static const value_string gsm_a_gm_gprs_timer3_unit_vals[] = {
4326
  { 0x00, "value is incremented in multiples of 10 minutes" },
4327
  { 0x01, "value is incremented in multiples of 1 hour" },
4328
  { 0x02, "value is incremented in multiples of 10 hours" },
4329
  { 0x03, "value is incremented in multiples of 2 seconds" },
4330
  { 0x04, "value is incremented in multiples of 30 seconds" },
4331
  { 0x05, "value is incremented in multiples of 1 minute" },
4332
  { 0x06, "value is incremented in multiples of 320 hours (for T3312/T3412 extended), 1 hour otherwise" },
4333
  { 0x07, "value indicates that the timer is deactivated" },
4334
  { 0, NULL }
4335
};
4336
4337
uint16_t
4338
de_gc_timer3(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4339
6
{
4340
6
  uint8_t      oct;
4341
6
  uint16_t     val;
4342
6
  uint32_t     curr_offset;
4343
6
  const char *str = NULL;
4344
6
  proto_tree  *subtree;
4345
6
  proto_item  *item = NULL;
4346
4347
6
  curr_offset = offset;
4348
4349
6
  oct = tvb_get_uint8(tvb, curr_offset);
4350
4351
6
  val = oct&0x1f;
4352
4353
6
  switch (oct>>5)
4354
6
  {
4355
1
    case 0:
4356
1
      str = "min";
4357
1
      val *= 10;
4358
1
      break;
4359
1
    case 1:
4360
1
      if (val == 1) {
4361
0
        str = "hour";
4362
1
      } else {
4363
1
        str = "hours";
4364
1
      }
4365
1
      break;
4366
1
    case 2:
4367
1
      str = "hours";
4368
1
      val *= 10;
4369
1
      break;
4370
0
    case 3:
4371
0
      str = "sec";
4372
0
      val *= 2;
4373
0
      break;
4374
0
    case 4:
4375
0
      str = "sec";
4376
0
      val *= 30;
4377
0
      break;
4378
1
    case 5:
4379
1
      str = "min";
4380
1
      break;
4381
1
    case 6:
4382
1
      str = "hours";
4383
1
      val *= 320;
4384
1
      break;
4385
1
    case 7:
4386
1
      item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_gprs_timer3, tvb, curr_offset, 1, val, "timer is deactivated");
4387
1
      break;
4388
6
  }
4389
4390
6
  if (item == NULL) {
4391
5
    item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_gprs_timer3, tvb, curr_offset, 1, val, "%u %s", val, str);
4392
5
  }
4393
4394
6
  subtree = proto_item_add_subtree(item, ett_gmm_gprs_timer);
4395
6
  proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer3_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
4396
6
  proto_tree_add_item(subtree, hf_gsm_a_gm_gprs_timer3_value, tvb, offset, 1, ENC_BIG_ENDIAN);
4397
6
  curr_offset++;
4398
4399
6
  return (curr_offset - offset);
4400
6
}
4401
4402
/*
4403
 * [7] 10.5.7.5
4404
 */
4405
static uint16_t
4406
de_gc_radio_prio2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4407
19
{
4408
19
  uint32_t     curr_offset = offset;
4409
4410
  /* IMPORTANT - IT'S ASSUMED THAT THE INFORMATION IS IN THE HIGHER NIBBLE */
4411
19
  proto_tree_add_item(tree, hf_gsm_a_gm_radio_priority_tom8, tvb, curr_offset, 1, ENC_NA);
4412
4413
19
  curr_offset++;
4414
4415
19
  return (curr_offset - offset);
4416
19
}
4417
4418
/*
4419
 * [8] 10.5.7.6 MBMS context status
4420
 */
4421
static uint16_t
4422
de_gc_mbms_context_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4423
7
{
4424
7
  uint32_t    curr_offset;
4425
7
  unsigned    i;
4426
7
  uint8_t     oct, j;
4427
4428
7
  curr_offset = offset;
4429
4430
249
  for (i=0; i<len; i++)
4431
242
  {
4432
242
    oct = tvb_get_uint8(tvb, curr_offset);
4433
4434
2.16k
    for (j=0; j<8; j++)
4435
1.92k
    {
4436
1.92k
      proto_tree_add_uint_format(tree, hf_gsm_a_gm_nsapi, tvb, curr_offset, 1, oct&1, "NSAPI %d: %s (%u)", 128+i*8+j, pdp_str[oct&1], oct&1);
4437
1.92k
      oct>>=1;
4438
1.92k
    }
4439
242
    curr_offset++;
4440
242
  }
4441
4442
7
  return (len);
4443
7
}
4444
4445
/*
4446
 * [8] 10.5.7.7 Uplink data status
4447
 */
4448
static const true_false_string gsm_a_gm_nsapi_ul_stat_vals = {
4449
  "uplink data are pending for the preserved PDP context",
4450
  "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"
4451
};
4452
4453
static uint16_t
4454
de_gc_uplink_data_stat(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4455
0
{
4456
0
  uint32_t  curr_offset;
4457
0
  uint32_t bit_offset;
4458
4459
0
  curr_offset = offset;
4460
0
  bit_offset  = curr_offset<<3;
4461
4462
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_7_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4463
0
  bit_offset++;
4464
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_6_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4465
0
  bit_offset++;
4466
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_5_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4467
0
  bit_offset++;
4468
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 5, ENC_BIG_ENDIAN);
4469
0
  bit_offset += 5;
4470
0
  curr_offset++;
4471
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_15_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4472
0
  bit_offset++;
4473
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_14_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4474
0
  bit_offset++;
4475
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_13_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4476
0
  bit_offset++;
4477
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_12_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4478
0
  bit_offset++;
4479
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_11_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4480
0
  bit_offset++;
4481
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_10_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4482
0
  bit_offset++;
4483
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_9_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4484
0
  bit_offset++;
4485
0
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_nsapi_8_ul_stat, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4486
/*
4487
  bit_offset++;
4488
  curr_offset++;
4489
*/
4490
0
  return (len);
4491
0
}
4492
4493
/*
4494
 * [8] 10.5.7.8 Device properties
4495
 */
4496
static const true_false_string gsm_a_gm_device_prop_low_prio_value = {
4497
  "MS is configured for NAS signalling low priority",
4498
  "MS is not configured for NAS signalling low priority"
4499
};
4500
4501
static uint16_t
4502
de_gc_device_properties(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
4503
9
{
4504
9
  uint32_t  curr_offset;
4505
9
  uint32_t bit_offset;
4506
4507
9
  curr_offset = offset;
4508
9
  bit_offset  = (curr_offset<<3)+4;
4509
4510
9
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
4511
9
  bit_offset += 3;
4512
9
  proto_tree_add_bits_item(tree, hf_gsm_a_gm_device_prop_low_prio, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
4513
9
  curr_offset++;
4514
4515
9
  return (curr_offset - offset);
4516
9
}
4517
4518
/*
4519
 * [7] 10.5.6.1
4520
 */
4521
uint16_t
4522
de_sm_apn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4523
8
{
4524
8
  uint32_t    curr_offset;
4525
4526
8
  curr_offset = offset;
4527
4528
8
  proto_tree_add_item(tree, hf_gsm_a_gm_apn, tvb, curr_offset, len, ENC_APN_STR);
4529
8
  curr_offset += len;
4530
4531
8
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
4532
4533
8
  return (curr_offset - offset);
4534
8
}
4535
4536
/*
4537
 * [7] 10.5.6.2
4538
 */
4539
static uint16_t
4540
de_sm_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string, int string_len _U_)
4541
17
{
4542
17
  uint8_t oct;
4543
17
  uint32_t  curr_offset;
4544
4545
17
  curr_offset = offset;
4546
4547
17
  oct = tvb_get_uint8(tvb, curr_offset);
4548
4549
17
  proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_nsapi, tvb, curr_offset, 1, oct&0x0f, "0x%02x (%u) %s", oct&0x0f, oct&0x0f, add_string ? add_string : "");
4550
4551
17
  curr_offset++;
4552
4553
17
  return (curr_offset - offset);
4554
17
}
4555
4556
/*
4557
 * [7] 10.5.6.3 Protocol configuration options
4558
 */
4559
static const range_string gsm_a_sm_pco_ms2net_prot_vals[] = {
4560
  { 0x0001, 0x0001, "P-CSCF IPv6 Address Request" },
4561
  { 0x0002, 0x0002, "IM CN Subsystem Signaling Flag" },
4562
  { 0x0003, 0x0003, "DNS Server IPv6 Address Request" },
4563
  { 0x0004, 0x0004, "Not Supported" },
4564
  { 0x0005, 0x0005, "MS Support of Network Requested Bearer Control indicator" },
4565
  { 0x0006, 0x0006, "Reserved" },
4566
  { 0x0007, 0x0007, "DSMIPv6 Home Agent Address Request" },
4567
  { 0x0008, 0x0008, "DSMIPv6 Home Network Prefix Request" },
4568
  { 0x0009, 0x0009, "DSMIPv6 IPv4 Home Agent Address Request" },
4569
  { 0x000a, 0x000a, "IP address allocation via NAS signalling" },
4570
  { 0x000b, 0x000b, "IPv4 address allocation via DHCPv4" },
4571
  { 0x000c, 0x000c, "P-CSCF IPv4 Address Request" },
4572
  { 0x000d, 0x000d, "DNS Server IPv4 Address Request" },
4573
  { 0x000e, 0x000e, "MSISDN Request" },
4574
  { 0x000f, 0x000f, "IFOM-Support-Request" },
4575
  { 0x0010, 0x0010, "IPv4 Link MTU Request" },
4576
  { 0x0011, 0x0011, "MS support of Local address in TFT indicator" },
4577
  { 0x0012, 0x0012, "P-CSCF Re-selection support" },
4578
  { 0x0013, 0x0013, "NBIFOM request indicator" },
4579
  { 0x0014, 0x0014, "NBIFOM mode" },
4580
  { 0x0015, 0x0015, "Non-IP Link MTU Request" },
4581
  { 0x0016, 0x0016, "APN rate control support indicator" },
4582
  { 0x0017, 0x0017, "3GPP PS data off UE status" },
4583
  { 0x0018, 0x0018, "Reliable Data Service request indicator" },
4584
  { 0x0019, 0x0019, "Additional APN rate control for exception data support indicator" },
4585
  { 0x001a, 0x001a, "PDU session ID" },
4586
  { 0x001b, 0x001f, "Reserved" },
4587
  { 0x0020, 0x0020, "Ethernet Frame Payload MTU Request" },
4588
  { 0x0021, 0x0021, "Unstructured Link MTU Request" },
4589
  { 0x0022, 0x0022, "5GSM cause value" },
4590
  { 0x0023, 0x0023, "QoS rules with the length of two octets support indicator" },
4591
  { 0x0024, 0x0024, "QoS flow descriptions with the length of two octets support indicator" },
4592
  { 0x0027, 0x0027, "ACS information request" },
4593
  { 0x0030, 0x0030, "ATSSS request" },
4594
  { 0x0031, 0x0031, "DNS server security information indicator" },
4595
  { 0x0032, 0x0032, "ECS configuration information provisioning support indicator" },
4596
  { 0x0036, 0x0036, "PVS information request" },
4597
  { 0x0039, 0x0039, "DNS server security protocol support" },
4598
  { 0x003a, 0x003a, "EAS rediscovery support indication" },
4599
  { 0x0041, 0x0041, "Service-level-AA container with the length of two octets" },
4600
  { 0x0047, 0x0047, "EDC support indicator" },
4601
  { 0x004a, 0x004a, "MS support of MAC address range in 5GS indicator" },
4602
  { 0x0050, 0x0050, "SDNAEPC support indicator" },
4603
  { 0x0051, 0x0051, "SDNAEPC EAP message with the length of two octets" },
4604
  { 0x0052, 0x0052, "SDNAEPC DN-specific identity" },
4605
  { 0x0056, 0x0056, "UE policy container with the length of two octets" },
4606
  { 0x0057, 0x0057, "URSP provisioning in EPS support indicator" },
4607
  { 0x0058, 0x0058, "S-NSSAI selected by MS" },
4608
  { 0xff00, 0xffff, "Operator Specific Use" },
4609
  { 0, 0, NULL }
4610
};
4611
static const range_string gsm_a_sm_pco_net2ms_prot_vals[] = {
4612
  { 0x0001, 0x0001, "P-CSCF IPv6 Address" },
4613
  { 0x0002, 0x0002, "IM CN Subsystem Signaling Flag" },
4614
  { 0x0003, 0x0003, "DNS Server IPv6 Address" },
4615
  { 0x0004, 0x0004, "Policy Control rejection code" },
4616
  { 0x0005, 0x0005, "Selected Bearer Control Mode" },
4617
  { 0x0006, 0x0006, "Reserved" },
4618
  { 0x0007, 0x0007, "DSMIPv6 Home Agent Address" },
4619
  { 0x0008, 0x0008, "DSMIPv6 Home Network Prefix" },
4620
  { 0x0009, 0x0009, "DSMIPv6 IPv4 Home Agent Address" },
4621
  { 0x000a, 0x000a, "Reserved" },
4622
  { 0x000b, 0x000b, "Reserved" },
4623
  { 0x000c, 0x000c, "P-CSCF IPv4 Address" },
4624
  { 0x000d, 0x000d, "DNS Server IPv4 Address" },
4625
  { 0x000e, 0x000e, "MSISDN" },
4626
  { 0x000f, 0x000f, "IFOM-Support" },
4627
  { 0x0010, 0x0010, "IPv4 Link MTU" },
4628
  { 0x0011, 0x0011, "Network support of Local address in TFT indicator" },
4629
  { 0x0012, 0x0012, "Reserved" },
4630
  { 0x0013, 0x0013, "NBIFOM accepted indicator" },
4631
  { 0x0014, 0x0014, "NBIFOM mode" },
4632
  { 0x0015, 0x0015, "Non-IP Link MTU" },
4633
  { 0x0016, 0x0016, "APN rate control parameters" },
4634
  { 0x0017, 0x0017, "3GPP PS data off support indication" },
4635
  { 0x0018, 0x0018, "Reliable Data Service accepted indicator" },
4636
  { 0x0019, 0x0019, "Additional APN rate control for exception data parameters" },
4637
  { 0x001a, 0x001a, "Reserved" },
4638
  { 0x001b, 0x001b, "S-NSSAI" },
4639
  { 0x001c, 0x001c, "QoS rules" },
4640
  { 0x001d, 0x001d, "Session-AMBR" },
4641
  { 0x001e, 0x001e, "PDU session address lifetime" },
4642
  { 0x001f, 0x001f, "QoS flow descriptions" },
4643
  { 0x0020, 0x0020, "Ethernet Frame Payload MTU" },
4644
  { 0x0021, 0x0021, "Unstructured Link MTU" },
4645
  { 0x0022, 0x0022, "Reserved" },
4646
  { 0x0023, 0x0023, "QoS rules with the length of two octets" },
4647
  { 0x0024, 0x0024, "QoS flow descriptions with the length of two octets" },
4648
  { 0x0025, 0x0025, "Small data rate control parameters" },
4649
  { 0x0026, 0x0026, "Additional small data rate control for exception data parameters" },
4650
  { 0x0027, 0x0027, "ACS information" },
4651
  { 0x0028, 0x0028, "Initial small data rate control parameters" },
4652
  { 0x0029, 0x0029, "Initial additional small data rate control for exception data parameters" },
4653
  { 0x002a, 0x002a, "Initial APN rate control parameters" },
4654
  { 0x002b, 0x002b, "Initial additional APN rate control for exception data parameters" },
4655
  { 0x0030, 0x0030, "ATSSS response with the length of two octets" },
4656
  { 0x0031, 0x0031, "DNS server security information with length of two octets" },
4657
  { 0x0032, 0x0032, "ECS address with the length of two octets" },
4658
  { 0x0035, 0x0035, "ECSP identifier" },
4659
  { 0x0036, 0x0036, "PVS IPv4 Address" },
4660
  { 0x0037, 0x0037, "PVS IPv6 Address" },
4661
  { 0x0038, 0x0038, "PVS name" },
4662
  { 0x003a, 0x003a, "EAS rediscovery indication without indicated impact" },
4663
  { 0x003b, 0x003b, "EAS rediscovery indication with impacted EAS IPv4 address range" },
4664
  { 0x003c, 0x003c, "EAS rediscovery indication with impacted EAS IPv6 address range" },
4665
  { 0x003d, 0x003d, "EAS rediscovery indication with impacted EAS FQDN" },
4666
  { 0x003e, 0x003e, "Uplink data not allowed" },
4667
  { 0x003f, 0x003f, "Uplink data allowed" },
4668
  { 0x0040, 0x0040, "UAS services not allowed indication" },
4669
  { 0x0041, 0x0041, "Service-level-AA container with the length of two octets" },
4670
  { 0x0048, 0x0048, "EDC usage allowed indicator" },
4671
  { 0x0049, 0x0049, "EDC usage required indicator" },
4672
  { 0x004a, 0x004a, "Network support of MAC address range in 5GS indicator" },
4673
  { 0x0051, 0x0051, "SDNAEPC EAP message with the length of two octets" },
4674
  { 0x0056, 0x0056, "UE policy container with the length of two octets" },
4675
  { 0x0057, 0x0057, "URSP provisioning in EPS support indicator" },
4676
  { 0xff00, 0xffff, "Operator Specific Use" },
4677
  { 0, 0, NULL }
4678
};
4679
4680
static const value_string gsm_a_gm_link_dir_vals[] = {
4681
  { -1, "Unknown" },
4682
  { 0x0, "MS to network" },
4683
  { 0x1, "Network to MS" },
4684
  { 0, NULL }
4685
};
4686
4687
static const value_string gsm_a_gm_sel_bearer_ctrl_mode_vals[] = {
4688
  { 1, "MS only" },
4689
  { 2, "MS/NW" },
4690
  { 0, NULL }
4691
};
4692
4693
static const value_string gsm_a_gm_nbifom_mode_vals[] = {
4694
  { 0, "UE-initiated" },
4695
  { 1, "Network-initiated" },
4696
  { 0, NULL }
4697
};
4698
4699
static const true_false_string gsm_a_gm_apn_rate_ctrl_params_aer_value = {
4700
  "Additional exception reports at maximum rate reached are allowed",
4701
  "Additional exception reports at maximum rate reached are not allowed"
4702
};
4703
4704
static const value_string gsm_a_gm_apn_rate_ctrl_ul_time_unit_vals[] = {
4705
  { 0, "Unrestricted" },
4706
  { 1, "Minute" },
4707
  { 2, "Hour" },
4708
  { 3, "Day" },
4709
  { 4, "Week" },
4710
  { 0, NULL }
4711
};
4712
4713
static const value_string gsm_a_gm_sm_pco_3gpp_data_off_ue_status_vals[] = {
4714
  { 1, "Deactivated"},
4715
  { 2, "Activated"},
4716
  { 0, NULL}
4717
};
4718
4719
static const value_string gsm_a_gm_sm_pco_dns_serv_sec_info_type_vals[] = {
4720
  { 0, "Security protocol type"},
4721
  { 1, "Port number"},
4722
  { 2, "Authentication domain name"},
4723
  { 3, "SPKI pin set"},
4724
  { 4, "Root certificate"},
4725
  { 5, "Raw public key"},
4726
  { 0, NULL}
4727
};
4728
4729
static const value_string gsm_a_gm_sm_pco_dns_serv_sec_info_sec_proto_vals[] = {
4730
  { 0, "TLS"},
4731
  { 1, "DTLS"},
4732
  { 0, NULL}
4733
};
4734
4735
static const value_string gsm_a_gm_sm_pco_ecs_addr_type_vals[] = {
4736
  { 0, "IPv4"},
4737
  { 1, "IPv6"},
4738
  { 2, "FQDN"},
4739
  { 0, NULL}
4740
};
4741
4742
static const value_string gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_type_vals[] = {
4743
  { 0, "No spatial validity condition"},
4744
  { 1, "Geographical service area"},
4745
  { 2, "Tracking area"},
4746
  { 3, "Country-wide"},
4747
  { 0, NULL}
4748
};
4749
4750
static const value_string gsm_a_gm_sm_pco_dns_serv_sec_prot_support_vals[] = {
4751
  { 1, "TLS"},
4752
  { 2, "DTLS"},
4753
  { 0, NULL}
4754
};
4755
4756
uint16_t
4757
de_sm_pco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4758
452
{
4759
452
  proto_item        *generated_item;
4760
452
  uint32_t           curr_offset;
4761
452
  int                curr_len;
4762
452
  unsigned char      oct;
4763
452
  int                link_dir;
4764
452
  proto_item        *pco_item;
4765
452
  proto_tree        *pco_tree;
4766
4767
452
  curr_len    = (int)len; /* length field is only 1 or 2 bytes long */
4768
452
  curr_offset = offset;
4769
4770
452
  oct = tvb_get_uint8(tvb, curr_offset);
4771
4772
452
  link_dir = pinfo->link_dir;
4773
452
  generated_item = proto_tree_add_int(tree, hf_gsm_a_gm_link_dir, tvb, curr_offset, 0, link_dir);
4774
452
  proto_item_set_generated(generated_item);
4775
4776
4777
  /* 1 ext 0 0 0 0 Spare  Configuration protocol */
4778
452
  proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4779
  /* Configuration protocol (octet 3)
4780
   * Bits
4781
   * 3 2 1
4782
   * 0 0 0 PPP for use with IP PDP type or IP PDN type (see 3GPP TS 24.301 [120])
4783
   *
4784
   * All other values are interpreted as PPP in this version of the protocol.
4785
   * (3GPP TS 24.008 version 9.4.0 Release 9)
4786
   */
4787
452
  proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_configuration_protocol, tvb, curr_offset, 1, oct&0x07, "PPP for use with IP PDP type or IP PDN type (%u)", oct&0x07);
4788
452
  curr_len--;
4789
452
  curr_offset++;
4790
4791
6.60k
  while (curr_len >= 3) /* 2 bytes protocol/container ID + 1 byte length */
4792
6.55k
  {
4793
6.55k
    uint32_t e_len;
4794
6.55k
    uint16_t prot;
4795
6.55k
    tvbuff_t *l3_tvb;
4796
4797
    /* Protocol ID 1                    octet 4
4798
     *                                  octet 5
4799
     * Length of protocol ID 1 contents octet 6
4800
     * Protocol ID 1 contents           octet 7
4801
     */
4802
4803
6.55k
    prot = tvb_get_ntohs(tvb, curr_offset);
4804
6.55k
    pco_item = proto_tree_add_uint_format_value(tree, hf_gsm_a_gm_pco_pid, tvb, curr_offset, 2, (uint32_t)prot,
4805
6.55k
        "%s (0x%04x)",
4806
6.55k
        link_dir ?
4807
5.70k
          rval_to_str_const((uint32_t)prot, gsm_a_sm_pco_net2ms_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")) :
4808
6.55k
          rval_to_str_const((uint32_t)prot, gsm_a_sm_pco_ms2net_prot_vals, val_to_str_ext_const(prot, &ppp_vals_ext, "Unknown")),
4809
6.55k
        (uint32_t)prot);
4810
6.55k
    pco_tree = proto_item_add_subtree(pco_item, ett_sm_pco);
4811
4812
6.55k
    curr_len    -= 2;
4813
6.55k
    curr_offset += 2;
4814
6.55k
    if ((link_dir == P2P_DIR_DL && (prot == 0x0023 || prot == 0x0024 || prot == 0x0030 || prot == 0x0031 ||
4815
3.71k
                                    prot == 0x0032 || prot == 0x0041 || prot == 0x0051 || prot == 0x0056)) ||
4816
6.17k
        (link_dir == P2P_DIR_UL && (prot == 0x0041 || prot == 0x0051 || prot == 0x0056))) {
4817
196
      proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_length2, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &e_len);
4818
196
      curr_len    -= 2;
4819
196
      curr_offset += 2;
4820
6.35k
    } else {
4821
6.35k
      proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_length, tvb, curr_offset, 1, ENC_NA, &e_len);
4822
6.35k
      curr_len    -= 1;
4823
6.35k
      curr_offset += 1;
4824
6.35k
    }
4825
4826
6.55k
    switch (prot)
4827
6.55k
    {
4828
48
      case 0x0001:
4829
48
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4830
18
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pcscf_ipv6, tvb, curr_offset, 16, ENC_NA);
4831
18
        }
4832
48
        break;
4833
21
      case 0x0003:
4834
21
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4835
8
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_ipv6, tvb, curr_offset, 16, ENC_NA);
4836
8
        }
4837
21
        break;
4838
8
      case 0x0007:
4839
8
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4840
2
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dsmipv6_home_agent_ipv6, tvb, curr_offset, 16, ENC_NA);
4841
2
        }
4842
8
        break;
4843
42
      case 0x0002:
4844
43
      case 0x0006:
4845
49
      case 0x000A:
4846
55
      case 0x000B:
4847
70
      case 0x000F:
4848
80
      case 0x0011:
4849
82
      case 0x0012:
4850
84
      case 0x0013:
4851
91
      case 0x0018:
4852
95
      case 0x003e:
4853
101
      case 0x003f:
4854
106
      case 0x0040:
4855
108
      case 0x0047:
4856
109
      case 0x0048:
4857
109
      case 0x0049:
4858
115
      case 0x004a:
4859
117
      case 0x0050:
4860
117
        break;
4861
17
      case 0x0004:
4862
17
        if ((link_dir == P2P_DIR_DL) && (e_len == 1)) {
4863
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_reject_code, tvb, curr_offset, 1, ENC_NA);
4864
0
        }
4865
17
        break;
4866
15
      case 0x0005:
4867
15
        if ((link_dir == P2P_DIR_DL) && (e_len == 1)) {
4868
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_sel_bearer_ctrl_mode, tvb, curr_offset, 1, ENC_NA);
4869
0
        }
4870
15
        break;
4871
32
      case 0x0008:
4872
32
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4873
12
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dsmipv6_home_network_ipv6, tvb, curr_offset, 16, ENC_NA);
4874
12
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dsmipv6_home_network_prefix_length, tvb, curr_offset+16, 1, ENC_NA);
4875
12
        }
4876
32
        break;
4877
13
      case 0x0009:
4878
13
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4879
6
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dsmipv6_home_agent_ipv4, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
4880
6
        }
4881
13
        break;
4882
8
      case 0x000C:
4883
8
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4884
2
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pcscf_ipv4, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
4885
2
        }
4886
8
        break;
4887
15
      case 0x000D:
4888
15
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4889
6
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_ipv4, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
4890
6
        }
4891
15
        break;
4892
9
      case 0x000E:
4893
9
        if ((link_dir == P2P_DIR_DL) && (e_len > 0)) {
4894
3
          dissect_e164_msisdn(tvb, pinfo, pco_tree, curr_offset, e_len, E164_ENC_BCD);
4895
3
        }
4896
9
        break;
4897
13
      case 0x0010:
4898
13
        if ((link_dir == P2P_DIR_DL) && (e_len == 2)) {
4899
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ipv4_link_mtu_size, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4900
0
        }
4901
13
        break;
4902
14
      case 0x0014:
4903
14
        if (e_len == 1) {
4904
5
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_nbifom_mode, tvb, curr_offset, 1, ENC_NA);
4905
5
        }
4906
14
        break;
4907
5
      case 0x0015:
4908
5
        if ((link_dir == P2P_DIR_DL) && (e_len == 2)) {
4909
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_non_ip_link_mtu_size, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4910
0
        }
4911
5
        break;
4912
5
      case 0x0016:
4913
7
      case 0x0025:
4914
7
        if (link_dir == P2P_DIR_DL) {
4915
7
          proto_tree_add_bits_item(pco_tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, ENC_BIG_ENDIAN);
4916
7
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_aer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4917
7
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_ul_time_unit, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4918
7
          if (e_len >= 4) {
4919
5
            proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_max_ul_rate, tvb, curr_offset+1, 3, ENC_BIG_ENDIAN);
4920
5
          }
4921
7
        }
4922
7
        break;
4923
8
      case 0x0017:
4924
8
        if (link_dir == P2P_DIR_UL && e_len >= 1) {
4925
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_3gpp_data_off_ue_status, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4926
0
        }
4927
8
        break;
4928
6
      case 0x0019:
4929
14
      case 0x0026:
4930
14
        if (link_dir == P2P_DIR_DL) {
4931
11
          proto_tree_add_bits_item(pco_tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 5, ENC_BIG_ENDIAN);
4932
11
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_add_apn_rate_ctrl_params_ul_time_unit, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4933
11
          if (e_len >= 3) {
4934
7
            proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_add_apn_rate_ctrl_params_max_ul_rate, tvb, curr_offset+1, 2, ENC_BIG_ENDIAN);
4935
7
          }
4936
11
        }
4937
14
        break;
4938
4
      case 0x001a:
4939
4
        if (link_dir == P2P_DIR_UL) {
4940
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pdu_session_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4941
0
        }
4942
4
        break;
4943
18
      case 0x001b:
4944
18
        if (link_dir == P2P_DIR_DL && e_len >= 4) {
4945
10
          de_nas_5gs_cmn_s_nssai(tvb, pco_tree, pinfo, curr_offset, e_len - 3, NULL, 0);
4946
10
          dissect_e212_mcc_mnc(tvb, pinfo, pco_tree, curr_offset + e_len - 3, E212_NONE, true);
4947
10
        }
4948
18
        break;
4949
5
      case 0x001c:
4950
127
      case 0x0023:
4951
127
        if (link_dir == P2P_DIR_DL) {
4952
122
          de_nas_5gs_sm_qos_rules(tvb, pco_tree, pinfo, curr_offset, e_len, NULL, 0);
4953
122
        }
4954
127
        break;
4955
6
      case 0x001d:
4956
6
        if (link_dir == P2P_DIR_DL) {
4957
          /* Network to MS direction */
4958
5
          de_nas_5gs_sm_session_ambr(tvb, pco_tree, pinfo, curr_offset, e_len, NULL, 0);
4959
5
        }
4960
6
        break;
4961
9
      case 0x001e:
4962
9
        if (link_dir == P2P_DIR_DL && e_len == 2) {
4963
          /* When the container identifier indicates PDU session address lifetime,
4964
           * the length of container identifier contents indicates a length equal to two.
4965
           * The container identifier contents field contains the binary coded representation
4966
           * of how long the network is willing to maintain the PDU session in units of seconds.
4967
           * ...If the length of container identifier contents is different from two octets,
4968
           * then it shall be ignored by the receiver
4969
           */
4970
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pdu_session_address_lifetime, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4971
0
        }
4972
9
        break;
4973
26
      case 0x001f:
4974
60
      case 0x0024:
4975
60
        if (link_dir == P2P_DIR_DL && e_len > 0) {
4976
49
          de_nas_5gs_sm_qos_flow_des(tvb, pco_tree, pinfo, curr_offset, e_len, NULL, 0);
4977
49
        }
4978
60
        break;
4979
16
      case 0x0020:
4980
16
        if (link_dir == P2P_DIR_DL && e_len == 2) {
4981
1
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_eth_frame_payload_mtu, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4982
1
        }
4983
16
        break;
4984
7
      case 0x0021:
4985
7
        if (link_dir == P2P_DIR_DL && e_len == 2) {
4986
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_unstruct_link_mtu, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
4987
0
        }
4988
7
        break;
4989
4
      case 0x0022:
4990
4
        if (link_dir == P2P_DIR_UL && e_len == 1) {
4991
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_5gsm_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
4992
0
        }
4993
4
        break;
4994
6
      case 0x0027:
4995
6
        if (link_dir == P2P_DIR_DL && e_len > 0) {
4996
2
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_acs_info, tvb, curr_offset, e_len, ENC_UTF_8);
4997
2
        }
4998
6
        break;
4999
5
      case 0x0028:
5000
11
      case 0x0029:
5001
22
      case 0x002a:
5002
25
      case 0x002b:
5003
25
        if (link_dir == P2P_DIR_DL && e_len == 7) {
5004
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_init_small_data_rate_ctrl_params_max_ul_rate_allowed, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
5005
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_init_small_data_rate_ctrl_params_termination_timestamp, tvb, curr_offset+4, 4, ENC_TIME_SECS_NTP|ENC_BIG_ENDIAN);
5006
0
        }
5007
25
        break;
5008
6
      case 0x0030:
5009
6
        if (link_dir == P2P_DIR_DL && e_len > 0) {
5010
1
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_atsss_response, tvb, curr_offset, e_len, ENC_NA);
5011
1
        }
5012
6
        break;
5013
20
      case 0x0031:
5014
20
        if (link_dir == P2P_DIR_DL && e_len > 1) {
5015
5
          uint32_t type;
5016
5017
5
          proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &type);
5018
5
          switch (type) {
5019
1
            case 0:
5020
1
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_sec_proto_type, tvb, curr_offset+1, 1, ENC_BIG_ENDIAN);
5021
1
              break;
5022
1
            case 1:
5023
1
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_port_number, tvb, curr_offset+1, 2, ENC_BIG_ENDIAN);
5024
1
              break;
5025
1
            case 2:
5026
1
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_auth_domain_name, tvb, curr_offset+1, e_len-1, ENC_APN_STR);
5027
1
              break;
5028
0
            case 3:
5029
0
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_spki_pin_set, tvb, curr_offset+1, e_len-1, ENC_NA);
5030
0
              break;
5031
0
            case 4:
5032
0
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_root_certificate, tvb, curr_offset+1, e_len-1, ENC_NA);
5033
0
              break;
5034
1
            case 5:
5035
1
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_raw_public_key, tvb, curr_offset+1, e_len-1, ENC_NA);
5036
1
              break;
5037
1
            default:
5038
1
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_info_value_part, tvb, curr_offset+1, e_len-1, ENC_NA);
5039
1
              break;
5040
5
          }
5041
5
        }
5042
17
        break;
5043
17
      case 0x0032:
5044
5
        if (link_dir == P2P_DIR_DL && e_len > 1) {
5045
1
          uint32_t ecs_addr_type, ie_offset, fqdn_len;
5046
5047
1
          ie_offset = curr_offset;
5048
1
          proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_type, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &ecs_addr_type);
5049
1
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_type, tvb, ie_offset, 1, ENC_BIG_ENDIAN);
5050
1
          ie_offset++;
5051
1
          switch (ecs_addr_type) {
5052
1
            case 0:
5053
1
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_ipv4, tvb, ie_offset, 4, ENC_BIG_ENDIAN);
5054
1
              ie_offset += 4;
5055
1
              break;
5056
0
            case 1:
5057
0
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_ipv6, tvb, ie_offset, 16, ENC_NA);
5058
0
              ie_offset += 16;
5059
0
              break;
5060
0
            case 2:
5061
0
              proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_fqdn_len, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &fqdn_len);
5062
0
              ie_offset++;
5063
0
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_fqdn, tvb, ie_offset, fqdn_len, ENC_APN_STR);
5064
0
              ie_offset += fqdn_len;
5065
0
              break;
5066
0
            default:
5067
0
              goto skip_ecs_addr;
5068
1
          }
5069
1
          if ((ie_offset - curr_offset) < e_len) {
5070
1
            uint32_t cont_len;
5071
5072
1
            proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_cont_len, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &cont_len);
5073
1
            ie_offset++;
5074
1
            proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_cont, tvb, ie_offset, cont_len, ENC_NA);
5075
1
            ie_offset += cont_len;
5076
1
            if ((ie_offset - curr_offset) < e_len) {
5077
1
              uint64_t flags;
5078
1
              static int* const ecs_flags[] = {
5079
1
                &hf_gsm_a_gm_sm_pco_ecs_addr_espili,
5080
1
                &hf_gsm_a_gm_sm_pco_ecs_addr_eami,
5081
1
                NULL
5082
1
              };
5083
5084
1
              proto_tree_add_bitmask_list_ret_uint64(pco_tree, tvb, ie_offset, 1, ecs_flags, ENC_BIG_ENDIAN, &flags);
5085
1
              ie_offset++;
5086
1
              if (flags & 0x01) {
5087
1
                static int* const ecs_auth_meth[] = {
5088
1
                  &hf_gsm_a_gm_sm_pco_ecs_addr_tlsgi,
5089
1
                  &hf_gsm_a_gm_sm_pco_ecs_addr_tlsai,
5090
1
                  &hf_gsm_a_gm_sm_pco_ecs_addr_tlscsci,
5091
1
                  NULL
5092
1
                };
5093
1
                proto_tree_add_bitmask_list(pco_tree, tvb, ie_offset, 1, ecs_auth_meth, ENC_BIG_ENDIAN);
5094
1
                ie_offset++;
5095
1
              }
5096
1
              if (flags & 0x02) {
5097
0
                proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_supported_plmns_info_list_cont_len, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &cont_len);
5098
0
                ie_offset++;
5099
0
                proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecs_addr_supported_plmns_info_list_cont, tvb, ie_offset, cont_len, ENC_NA);
5100
0
              }
5101
1
            }
5102
1
          }
5103
1
          skip_ecs_addr:;
5104
1
        }
5105
5
        break;
5106
5
      case 0x0035:
5107
5
        if (link_dir == P2P_DIR_DL && e_len > 1) {
5108
1
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_ecsp_id, tvb, curr_offset, e_len, ENC_UTF_8);
5109
1
        }
5110
5
        break;
5111
4
      case 0x0036:
5112
15
      case 0x0037:
5113
23
      case 0x0038:
5114
23
        if (link_dir == P2P_DIR_DL) {
5115
19
          uint64_t flags;
5116
19
          uint32_t field_len, ie_offset = curr_offset;
5117
19
          static int* const ind[] = {
5118
19
            &hf_gsm_a_gm_sm_pco_pvs_s_nssai_ind,
5119
19
            &hf_gsm_a_gm_sm_pco_pvs_dnn_ind,
5120
19
            NULL
5121
19
          };
5122
5123
19
          if (prot == 0x0036) {
5124
4
            proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pvs_ipv4, tvb, ie_offset, 4, ENC_BIG_ENDIAN);
5125
4
            ie_offset += 4;
5126
15
          } else if (prot == 0x0037) {
5127
8
            proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pvs_ipv6, tvb, ie_offset, 16, ENC_NA);
5128
8
            ie_offset += 16;
5129
8
          } else {
5130
7
            proto_tree_add_item_ret_uint(pco_tree, hf_gsm_a_gm_sm_pco_pvs_name_len, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &field_len);
5131
7
            ie_offset++;
5132
7
            proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_pvs_name, tvb, ie_offset, field_len, ENC_APN_STR);
5133
7
            ie_offset += field_len;
5134
7
          }
5135
19
          proto_tree_add_bitmask_list_ret_uint64(pco_tree, tvb, ie_offset, 1, ind, ENC_BIG_ENDIAN, &flags);
5136
19
          ie_offset++;
5137
19
          if (flags & 0x01) {
5138
8
            proto_tree_add_item_ret_uint(tree, hf_gsm_a_gm_sm_pco_pvs_dnn_len, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &field_len);
5139
8
            ie_offset++;
5140
8
            ie_offset += de_nas_5gs_cmn_dnn(tvb, pco_tree, pinfo, ie_offset, field_len, NULL, 0);
5141
8
          }
5142
19
          if (flags & 0x02) {
5143
9
            proto_tree_add_item_ret_uint(tree, hf_gsm_a_gm_sm_pco_pvs_s_nssai_len, tvb, ie_offset, 1, ENC_BIG_ENDIAN, &field_len);
5144
9
            ie_offset++;
5145
9
            de_nas_5gs_cmn_s_nssai(tvb, pco_tree, pinfo, ie_offset, field_len, NULL, 0);
5146
9
          }
5147
19
        }
5148
23
        break;
5149
8
      case 0x0039:
5150
8
        if (link_dir == P2P_DIR_UL && e_len == 1) {
5151
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_dns_serv_sec_prot_support, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5152
0
        }
5153
8
        break;
5154
5
      case 0x003a:
5155
5
        if (link_dir == P2P_DIR_UL && e_len > 0) {
5156
0
          static int* const oct1_flags[] = {
5157
0
            &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_fqdn,
5158
0
            &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_ipv6,
5159
0
            &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_ipv4,
5160
0
            NULL
5161
0
          };
5162
0
          proto_tree_add_bitmask_list(pco_tree, tvb, curr_offset, 1, oct1_flags, ENC_BIG_ENDIAN);
5163
0
        }
5164
5
        break;
5165
2
      case 0x003b:
5166
2
        if (link_dir == P2P_DIR_DL && e_len == 8) {
5167
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv4_range_low, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5168
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv4_range_high, tvb, curr_offset+4, 4, ENC_BIG_ENDIAN);
5169
0
        }
5170
2
        break;
5171
5
      case 0x003c:
5172
5
        if (link_dir == P2P_DIR_DL && e_len == 32) {
5173
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv6_range_low, tvb, curr_offset, 16, ENC_NA);
5174
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv6_range_high, tvb, curr_offset+16, 16, ENC_NA);
5175
0
        }
5176
5
        break;
5177
10
      case 0x003d:
5178
10
        if (link_dir == P2P_DIR_DL && e_len > 0) {
5179
1
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_fqdn, tvb, curr_offset, e_len, ENC_APN_STR);
5180
1
        }
5181
10
        break;
5182
30
       case 0x0041:
5183
30
        de_nas_5gs_cmn_service_level_aa_cont(tvb, pco_tree, pinfo, curr_offset, e_len, NULL, 0);
5184
30
        break;
5185
2
      case 0x0051:
5186
2
        if (eap_handle) {
5187
2
          col_append_str(pinfo->cinfo, COL_PROTOCOL, "/");
5188
2
          col_set_fence(pinfo->cinfo, COL_PROTOCOL);
5189
2
          col_append_str(pinfo->cinfo, COL_INFO, ", ");
5190
2
          col_set_fence(pinfo->cinfo, COL_INFO);
5191
2
          call_dissector(eap_handle, tvb_new_subset_length(tvb, curr_offset, e_len), pinfo, pco_tree);
5192
2
        } else {
5193
0
          call_data_dissector(tvb_new_subset_length(tvb, curr_offset, e_len), pinfo, pco_tree);
5194
0
        }
5195
2
        break;
5196
10
      case 0x0052:
5197
10
        if (link_dir == P2P_DIR_UL && e_len > 0) {
5198
0
          proto_tree_add_item(pco_tree, hf_gsm_a_gm_sm_pco_sdnaepc_dn_specific_id, tvb, curr_offset, e_len, ENC_UTF_8);
5199
0
        }
5200
10
        break;
5201
3
      case 0x0056:
5202
3
        if (e_len > 0) {
5203
3
          dissect_nas_5gs_updp(tvb_new_subset_length(tvb, curr_offset, e_len), pinfo, pco_tree);
5204
3
        }
5205
3
        break;
5206
4
      case 0x0058:
5207
4
        if (link_dir == P2P_DIR_UL && e_len >= 2) {
5208
0
          uint8_t field_len;
5209
5210
0
          proto_tree_add_item_ret_uint8(tree, hf_gsm_a_gm_sm_pco_pvs_s_nssai_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &field_len);
5211
0
          de_nas_5gs_cmn_s_nssai(tvb, pco_tree, pinfo, curr_offset + 1, field_len, NULL, 0);
5212
0
        }
5213
4
        break;
5214
5.57k
      default:
5215
5.57k
      {
5216
5.57k
        if (e_len > 0) {
5217
1.61k
          if (prot >= 0xff00) {
5218
75
            dissect_e212_mcc_mnc(tvb, pinfo, pco_tree, curr_offset, E212_NONE, true);
5219
75
            if ((e_len - 3) > 0) {
5220
69
              proto_tree_add_item(pco_tree, hf_gsm_a_gm_pco_app_spec_info, tvb, curr_offset+3, e_len-3, ENC_NA);
5221
69
            }
5222
1.53k
          } else {
5223
1.53k
            dissector_handle_t handle;
5224
1.53k
            handle = dissector_get_uint_handle (gprs_sm_pco_subdissector_table, prot);
5225
1.53k
            l3_tvb = tvb_new_subset_length(tvb, curr_offset, e_len);
5226
1.53k
            if (handle != NULL)
5227
1
            {
5228
              /*
5229
               * dissect the embedded message
5230
              */
5231
              /* In this case we do not want the columns updated */
5232
1
              col_set_writable(pinfo->cinfo, -1, false);
5233
1
              call_dissector(handle, l3_tvb, pinfo, pco_tree);
5234
1
              col_set_writable(pinfo->cinfo, -1, true);
5235
1
            }
5236
1.53k
            else
5237
1.53k
            {
5238
              /*
5239
              * dissect the embedded DATA message
5240
              */
5241
1.53k
              call_data_dissector(l3_tvb, pinfo, pco_tree);
5242
1.53k
            }
5243
1.53k
          }
5244
1.61k
        }
5245
5.57k
      }
5246
6.55k
    }
5247
6.15k
    curr_len    -= e_len;
5248
6.15k
    curr_offset += e_len;
5249
6.15k
  }
5250
5251
54
  if (curr_len < 0) {
5252
43
    proto_tree_add_expert(tree, pinfo, &ei_gsm_a_gm_not_enough_data, tvb, offset, len);
5253
43
  } else {
5254
11
    EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5255
11
  }
5256
5257
54
  return len;
5258
452
}
5259
5260
/*
5261
 * [9] 10.5.6.4 Packet data protocol address
5262
 */
5263
static const value_string gsm_a_sm_pdp_type_org_vals[] = {
5264
  { 0x00, "ETSI allocated address" },
5265
  { 0x01, "IETF allocated address" },
5266
  { 0x0f, "Empty PDP type" },
5267
  { 0, NULL }
5268
};
5269
5270
uint16_t
5271
de_sm_pdp_addr(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
5272
10
{
5273
10
  uint32_t     curr_offset;
5274
10
  const char *str;
5275
10
  unsigned char pdp_type_org, pdp_type_num;
5276
5277
10
  curr_offset = offset;
5278
5279
10
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 4, ENC_BIG_ENDIAN);
5280
10
  proto_tree_add_item_ret_uint8(tree, hf_gsm_a_sm_pdp_type_org, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &pdp_type_org);
5281
10
  curr_offset += 1;
5282
10
  pdp_type_num = tvb_get_uint8(tvb, curr_offset);
5283
5284
10
  if (pdp_type_org == 0)
5285
5
  {
5286
    /* ETSI allocated address */
5287
5
    switch (pdp_type_num)
5288
5
    {
5289
2
      case 0x00: str = "Reserved, used in earlier version of this protocol"; break;
5290
0
      case 0x01: str = "PDP-type PPP"; break;
5291
0
      case 0x02: str = "non IP"; break;
5292
3
      default:   str = "reserved";
5293
5
    }
5294
5
  }
5295
5
  else if (pdp_type_org == 1)
5296
0
  {
5297
    /* IETF allocated address */
5298
0
    switch (pdp_type_num)
5299
0
    {
5300
0
      case 0x21: str = "IPv4 address"; break;
5301
0
      case 0x57: str = "IPv6 address"; break;
5302
0
      case 0x8d: str = "IPv4v6 address"; break;
5303
0
      default:   str = "Unknown, interpreted as IPv4 address";
5304
0
    }
5305
0
  }
5306
5
  else if ((pdp_type_num == 0) && (pdp_type_org == 0x0f))
5307
0
    str = "Empty";
5308
5
  else
5309
5
    str = "Not specified";
5310
5311
10
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_pdp_type_number, tvb, curr_offset, 1, pdp_type_num, "%s (%u)", str, pdp_type_num);
5312
5313
10
  if ((len == 2) && ((pdp_type_num == 0x21) || (pdp_type_num == 0x57) || (pdp_type_num == 0x8d)))
5314
0
  {
5315
0
    proto_tree_add_uint_format(tree, hf_gsm_a_sm_pdp_address, tvb, curr_offset, 1, pdp_type_num, "Dynamic addressing");
5316
0
    curr_offset += 1;
5317
0
    return (curr_offset - offset);
5318
0
  }
5319
10
  else if (len == 2)
5320
0
  {
5321
0
    proto_tree_add_uint_format(tree, hf_gsm_a_sm_pdp_address, tvb, curr_offset, 1, 0, "No PDP address is included");
5322
0
    curr_offset += 1;
5323
0
    return (curr_offset - offset);
5324
0
  }
5325
5326
10
  curr_offset += 1;
5327
10
  if (pdp_type_org == 1)
5328
0
  switch (pdp_type_num)
5329
0
  {
5330
0
    case 0x57:
5331
0
      proto_tree_add_item(tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
5332
0
      curr_offset += 16;
5333
0
      break;
5334
5335
0
    case 0x8d:
5336
0
      proto_tree_add_item(tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5337
0
      curr_offset += 4;
5338
0
      proto_tree_add_item(tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
5339
0
      curr_offset += 16;
5340
0
      break;
5341
5342
0
    default:
5343
0
      proto_tree_add_item(tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
5344
0
      curr_offset += 4;
5345
0
  }
5346
5347
10
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5348
5349
10
  return (curr_offset - offset);
5350
10
}
5351
5352
/*
5353
 * [9] 10.5.6.5 Quality of service
5354
 */
5355
static const value_string gsm_a_sm_qos_delay_cls_vals[] = {
5356
  { 0x00, "Subscribed delay class (in MS to network direction)" },
5357
  { 0x01, "Delay class 1" },
5358
  { 0x02, "Delay class 2" },
5359
  { 0x03, "Delay class 3" },
5360
  { 0x04, "Delay class 4 (best effort)" },
5361
  { 0x07, "Reserved" },
5362
  { 0, NULL }
5363
};
5364
5365
static const value_string gsm_a_sm_qos_reliability_vals[] = {
5366
  { 0x00, "Subscribed reliability class (in MS to network direction)" },
5367
  { 0x01, "Acknowledged GTP, LLC, and RLC; Protected data" },
5368
  { 0x02, "Unacknowledged GTP, Ack LLC/RLC, Protected data" },
5369
  { 0x03, "Unacknowledged GTP/LLC, Ack RLC, Protected data" },
5370
  { 0x04, "Unacknowledged GTP/LLC/RLC, Protected data" },
5371
  { 0x05, "Unacknowledged GTP/LLC/RLC, Unprotected data" },
5372
  { 0x07, "Reserved" },
5373
  { 0, NULL }
5374
};
5375
 /* Delivery of erroneous SDUs, octet 6 (see 3GPP TS 23.107) Bits 3 2 1 */
5376
const value_string gsm_a_sm_qos_del_of_err_sdu_vals[] = {
5377
  { 0, "Subscribed delivery of erroneous SDUs/Reserved" },
5378
  { 1, "No detect('-')" },
5379
  { 2, "Erroneous SDUs are delivered('yes')" },
5380
  { 3, "Erroneous SDUs are not delivered('No')" },
5381
  { 7, "Reserved" },
5382
  { 0, NULL }
5383
};
5384
5385
 /* Delivery order, octet 6 (see 3GPP TS 23.107) Bits 5 4 */
5386
static const value_string gsm_a_sm_qos_del_order_vals[] = {
5387
  { 0, "Subscribed delivery order/Reserved" },
5388
  { 1, "With delivery order ('yes')" },
5389
  { 2, "Without delivery order ('no')" },
5390
  { 3, "Reserved" },
5391
  { 0, NULL }
5392
};
5393
/* Traffic class, octet 6 (see 3GPP TS 23.107) Bits 8 7 6 */
5394
const value_string gsm_a_sm_qos_traffic_cls_vals[] = {
5395
  { 0, "Subscribed traffic class/Reserved" },
5396
  { 1, "Conversational class" },
5397
  { 2, "Streaming class" },
5398
  { 3, "Interactive class" },
5399
  { 4, "Background class" },
5400
  { 7, "Reserved" },
5401
  { 0, NULL }
5402
};
5403
5404
/* Residual Bit Error Rate (BER), octet 10 (see 3GPP TS 23.107) Bits 8 7 6 5 */
5405
const value_string gsm_a_sm_qos_ber_vals[] = {
5406
  { 0, "Subscribed residual BER/Reserved" },
5407
  { 1, "5*10-2" },
5408
  { 2, "1*10-2" },
5409
  { 3, "5*10-3" },
5410
  { 4, "4*10-3" },
5411
  { 5, "1*10-3" },
5412
  { 6, "1*10-4" },
5413
  { 7, "1*10-5" },
5414
  { 8, "1*10-6" },
5415
  { 9, "6*10-8" },
5416
  { 10, "Reserved" },
5417
  { 0, NULL }
5418
};
5419
5420
/* SDU error ratio, octet 10 (see 3GPP TS 23.107) Bits 4 3 2 1 */
5421
const value_string gsm_a_sm_qos_sdu_err_rat_vals[] = {
5422
  { 0, "Subscribed SDU error ratio/Reserved" },
5423
  { 1, "1*10-2" },
5424
  { 2, "7*10-3" },
5425
  { 3, "1*10-3" },
5426
  { 4, "1*10-4" },
5427
  { 5, "1*10-5" },
5428
  { 6, "1*10-6" },
5429
  { 7, "1*10-1" },
5430
  { 15, "Reserved" },
5431
  { 0, NULL }
5432
};
5433
5434
/* Traffic handling priority, octet 11 (see 3GPP TS 23.107) Bits 2 1 */
5435
const value_string gsm_a_sm_qos_traff_hdl_pri_vals[] = {
5436
  { 0, "Subscribed traffic handling priority/Reserved" },
5437
  { 1, "Priority level 1" },
5438
  { 2, "Priority level 2" },
5439
  { 3, "Priority level 3" },
5440
  { 0, NULL }
5441
};
5442
5443
static const range_string gsm_a_sm_qos_peak_thr_vals[] = {
5444
  { 0x00, 0x00, "Subscribed peak throughput/reserved" },
5445
  { 0x01, 0x01, "Up to 1 000 octet/s" },
5446
  { 0x02, 0x02, "Up to 2 000 octet/s" },
5447
  { 0x03, 0x03, "Up to 4 000 octet/s" },
5448
  { 0x04, 0x04, "Up to 8 000 octet/s" },
5449
  { 0x05, 0x05, "Up to 16 000 octet/s" },
5450
  { 0x06, 0x06, "Up to 32 000 octet/s" },
5451
  { 0x07, 0x07, "Up to 64 000 octet/s" },
5452
  { 0x08, 0x08, "Up to 128 000 octet/s" },
5453
  { 0x09, 0x09, "Up to 256 000 octet/s" },
5454
  { 0x0a, 0x0e, "Interpreted as Up to 1 000 octet/s" },
5455
  { 0x0f, 0x0f, "Reserved" },
5456
  { 0, 0, NULL }
5457
};
5458
5459
static const range_string gsm_a_sm_qos_mean_thr_vals[] = {
5460
  { 0x00, 0x00, "Subscribed peak throughput/reserved" },
5461
  { 0x01, 0x01, "100 octet/h" },
5462
  { 0x02, 0x02, "200 octet/h" },
5463
  { 0x03, 0x03, "500 octet/h" },
5464
  { 0x04, 0x04, "1 000 octet/h" },
5465
  { 0x05, 0x05, "2 000 octet/h" },
5466
  { 0x06, 0x06, "5 000 octet/h" },
5467
  { 0x07, 0x07, "10 000 octet/h" },
5468
  { 0x08, 0x08, "20 000 octet/h" },
5469
  { 0x09, 0x09, "50 000 octet/h" },
5470
  { 0x0a, 0x0a, "100 000 octet/h" },
5471
  { 0x0b, 0x0b, "200 000 octet/h" },
5472
  { 0x0c, 0x0c, "500 000 octet/h" },
5473
  { 0x0d, 0x0d, "1 000 000 octet/h" },
5474
  { 0x0e, 0x0e, "2 000 000 octet/h" },
5475
  { 0x0f, 0x0f, "5 000 000 octet/h" },
5476
  { 0x10, 0x10, "10 000 000 octet/h" },
5477
  { 0x11, 0x11, "20 000 000 octet/h" },
5478
  { 0x12, 0x12, "50 000 000 octet/h" },
5479
  { 0x13, 0x1d, "Interpreted as Best effort" },
5480
  { 0x1e, 0x1e, "Reserved" },
5481
  { 0x1f, 0x1f, "Best effort" },
5482
  { 0, 0, NULL }
5483
};
5484
5485
static const range_string gsm_a_sm_qos_prec_class_vals[] = {
5486
  { 0x00, 0x00, "Subscribed precedence/reserved" },
5487
  { 0x01, 0x01, "High priority" },
5488
  { 0x02, 0x02, "Normal priority" },
5489
  { 0x03, 0x03, "Low priority" },
5490
  { 0x04, 0x06, "Interpreted as Normal priority" },
5491
  { 0x07, 0x07, "Reserved" },
5492
  { 0, 0, NULL }
5493
};
5494
5495
static const true_false_string gsm_a_sm_qos_signalling_ind_value = {
5496
  "Optimised for signalling traffic",
5497
  "Not optimised for signalling traffic"
5498
};
5499
5500
/* Helper function returning the main bitrates in kbps */
5501
static uint32_t
5502
qos_calc_bitrate(uint8_t oct)
5503
1.31k
{
5504
1.31k
  if (oct <= 0x3f)
5505
356
    return oct;
5506
956
  if (oct <= 0x7f)
5507
464
    return 64 + (oct-0x40) * 8;
5508
5509
492
  return 576 + (oct-0x80) * 64;
5510
956
}
5511
5512
/* Helper function returning the extended bitrates in kbps */
5513
static uint32_t
5514
qos_calc_ext_bitrate(uint8_t oct)
5515
1.62k
{
5516
1.62k
  if (oct <= 0x4a)
5517
558
    return 8600 + oct * 100;
5518
1.06k
  if (oct <= 0xba)
5519
478
    return 16000 + (oct-0x4a) * 1000;
5520
5521
588
  return 128000 + (oct - 0xba) * 2000;
5522
1.06k
}
5523
5524
static uint32_t
5525
qos_calc_ext2_bitrate(uint8_t oct)
5526
161
{
5527
161
  if (oct <= 0x3d)
5528
18
    return (256 + oct * 4);
5529
143
  if (oct <= 0xa1)
5530
27
    return (500 + (oct-0x3d) * 10);
5531
116
  if (oct <= 0xf6)
5532
47
    return (1500 + (oct-0xa1) * 100);
5533
5534
69
  return 10000;
5535
116
}
5536
5537
/*
5538
 * 10.5.6.5 Quality of service
5539
 */
5540
uint16_t
5541
de_sm_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
5542
521
{
5543
521
  uint32_t     curr_offset;
5544
521
  unsigned char       oct, tmp_oct;
5545
521
  const char *str;
5546
521
  uint32_t     temp32;
5547
5548
521
  curr_offset = offset;
5549
5550
  /* Octet 3 */
5551
521
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 2, ENC_BIG_ENDIAN);
5552
521
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_delay_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5553
521
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_reliability_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5554
521
  curr_offset += 1;
5555
5556
  /* Octet 4 */
5557
521
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_peak_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5558
521
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3) + 4, 1, ENC_BIG_ENDIAN);
5559
521
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_prec_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5560
521
  curr_offset += 1;
5561
5562
  /* Octet 5 */
5563
521
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
5564
521
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_mean_thr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5565
521
  curr_offset += 1;
5566
5567
521
  NO_MORE_DATA_CHECK(len);
5568
5569
  /* Octet 6 */
5570
520
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_traffic_cls, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5571
520
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_del_order, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5572
520
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_del_of_err_sdu, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5573
520
  curr_offset += 1;
5574
5575
520
  NO_MORE_DATA_CHECK(len);
5576
5577
  /* Octet 7 */
5578
520
  oct = tvb_get_uint8(tvb, curr_offset);
5579
5580
520
  switch (oct)
5581
520
  {
5582
76
    case 0x00: str = "Subscribed maximum SDU size/reserved"; break;
5583
19
    case 0x97: str = "1502 octets"; break;
5584
6
    case 0x98: str = "1510 octets"; break;
5585
3
    case 0x99: str = "1520 octets"; break;
5586
90
    case 0xff: str = "Reserved"; break;
5587
312
    default:   str = "Unspecified";
5588
520
  }
5589
5590
506
  if ((oct >= 1) && (oct <= 0x96))
5591
247
    proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_maximum_sdu_size, tvb, curr_offset, 1, oct, "%u octets (%u)", oct*10, oct);
5592
259
  else
5593
259
    proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_maximum_sdu_size, tvb, curr_offset, 1, oct, "%s (%u)", str, oct);
5594
5595
506
  curr_offset += 1;
5596
5597
506
  NO_MORE_DATA_CHECK(len);
5598
5599
  /* Octet 8 */
5600
506
  oct = tvb_get_uint8(tvb, curr_offset);
5601
5602
506
  switch (oct)
5603
506
  {
5604
102
    case 0x00: str = "Subscribed maximum bit rate for uplink/reserved"; break;
5605
86
    case 0xff: str = "0 kbps"; break;
5606
315
    default:   str = wmem_strdup_printf(pinfo->pool, "%u kbps", qos_calc_bitrate(oct));
5607
506
  }
5608
5609
503
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_upl, tvb,
5610
503
    curr_offset, 1, oct, "%s (%u)", str, oct);
5611
503
  curr_offset += 1;
5612
5613
503
  NO_MORE_DATA_CHECK(len);
5614
5615
  /* Octet 9 */
5616
503
  oct = tvb_get_uint8(tvb, curr_offset);
5617
5618
503
  switch (oct)
5619
503
  {
5620
71
    case 0x00: str = "Subscribed maximum bit rate for downlink/reserved"; break;
5621
83
    case 0xff: str = "0 kbps"; break;
5622
346
    default:   str = wmem_strdup_printf(pinfo->pool, "%u kbps", qos_calc_bitrate(oct));
5623
503
  }
5624
5625
500
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl, tvb,
5626
500
    curr_offset, 1, oct, "%s (%u)", str, oct);
5627
500
  curr_offset += 1;
5628
5629
500
  NO_MORE_DATA_CHECK(len);
5630
5631
  /* Octet 10 */
5632
500
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_ber, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5633
500
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_sdu_err_rat, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5634
5635
500
  curr_offset += 1;
5636
500
  NO_MORE_DATA_CHECK(len);
5637
5638
  /* Octet 11 */
5639
500
  oct = tvb_get_uint8(tvb, curr_offset);
5640
5641
500
  tmp_oct = oct>>2;
5642
500
  switch (tmp_oct)
5643
500
  {
5644
71
    case 0x00: str = "Subscribed transfer delay/reserved"; break;
5645
96
    case 0x3f: str = "Reserved"; break;
5646
329
    default:
5647
329
      if (tmp_oct <= 0x0f)
5648
79
        temp32 = tmp_oct * 10;
5649
250
      else if (tmp_oct <= 0x1f)
5650
124
        temp32 = (tmp_oct - 0x10) * 50 + 200;
5651
126
      else
5652
126
        temp32 = (tmp_oct - 0x20) * 100 + 1000;
5653
329
      str = wmem_strdup_printf(pinfo->pool, "%u ms", temp32);
5654
500
  }
5655
5656
496
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_trans_delay, tvb,
5657
496
    curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
5658
5659
496
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_traff_hdl_pri, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5660
5661
496
  curr_offset += 1;
5662
496
  NO_MORE_DATA_CHECK(len);
5663
5664
  /* Octet 12 */
5665
496
  oct = tvb_get_uint8(tvb, curr_offset);
5666
5667
496
  switch (oct)
5668
496
  {
5669
80
    case 0x00: str = "Subscribed guaranteed bit rate for uplink/reserved"; break;
5670
90
    case 0xff: str = "0 kbps"; break;
5671
324
    default:   str = wmem_strdup_printf(pinfo->pool, "%u kbps", qos_calc_bitrate(oct));
5672
496
  }
5673
5674
494
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_upl, tvb,
5675
494
    curr_offset, 1, oct, "%s (%u)", str, oct);
5676
5677
494
  curr_offset += 1;
5678
494
  NO_MORE_DATA_CHECK(len);
5679
5680
  /* Octet 13 */
5681
493
  oct = tvb_get_uint8(tvb, curr_offset);
5682
5683
493
  switch (oct)
5684
493
  {
5685
82
    case 0x00: str = "Subscribed guaranteed bit rate for downlink/reserved"; break;
5686
86
    case 0xff: str = "0 kbps"; break;
5687
321
    default:   str = wmem_strdup_printf(pinfo->pool, "%u kbps", qos_calc_bitrate(oct));
5688
493
  }
5689
5690
489
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_downl, tvb,
5691
489
    curr_offset, 1, oct, "%s (%u)", str, oct);
5692
5693
489
  curr_offset += 1;
5694
489
  NO_MORE_DATA_CHECK(len);
5695
5696
  /* Ocet 14 */
5697
489
  oct = tvb_get_uint8(tvb, curr_offset);
5698
489
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset << 3), 3, ENC_BIG_ENDIAN);
5699
489
  proto_tree_add_item(tree, hf_gsm_a_sm_qos_signalling_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
5700
5701
489
  tmp_oct = oct & 7;
5702
489
  if (tmp_oct == 0x01)
5703
39
    str = "speech";
5704
450
  else
5705
450
    str = "unknown";
5706
5707
489
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_source_stat_desc, tvb,
5708
489
    curr_offset, 1, oct, "%s (%u)", str, tmp_oct);
5709
5710
489
  curr_offset += 1;
5711
489
  NO_MORE_DATA_CHECK(len);
5712
5713
  /* Octet 15 */
5714
489
  oct = tvb_get_uint8(tvb, curr_offset);
5715
5716
489
  if (oct == 0x00)
5717
85
    str = "Use the value indicated by the Maximum bit rate for downlink";
5718
404
  else
5719
404
  {
5720
404
    temp32 = qos_calc_ext_bitrate(oct);
5721
404
    if (temp32 % 1000 == 0)
5722
286
      str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
5723
118
    else
5724
118
      str = wmem_strdup_printf(pinfo->pool, "%u kbps", temp32);
5725
404
  }
5726
489
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl_ext, tvb,
5727
489
    curr_offset, 1, oct, "%s (%u)", str, oct);
5728
5729
489
  curr_offset += 1;
5730
489
  NO_MORE_DATA_CHECK(len);
5731
5732
  /* Octet 16 */
5733
489
  oct = tvb_get_uint8(tvb, curr_offset);
5734
5735
489
  if (oct == 0x00)
5736
92
    str = "Use the value indicated by the Guaranteed bit rate for downlink";
5737
397
  else
5738
397
  {
5739
397
    temp32 = qos_calc_ext_bitrate(oct);
5740
397
    if (temp32 % 1000 == 0)
5741
264
      str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
5742
133
    else
5743
133
      str = wmem_strdup_printf(pinfo->pool, "%u kbps", temp32);
5744
397
  }
5745
489
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_downl_ext, tvb,
5746
489
    curr_offset, 1, oct, "%s (%u)", str, oct);
5747
5748
489
  curr_offset += 1;
5749
489
  NO_MORE_DATA_CHECK(len);
5750
5751
  /* Maximum bit rate for uplink (extended) Octet 17 */
5752
488
  oct = tvb_get_uint8(tvb, curr_offset);
5753
5754
488
  if (oct == 0x00)
5755
67
    str = "Use the value indicated by the Maximum bit rate for uplink";
5756
421
  else
5757
421
  {
5758
421
    temp32 = qos_calc_ext_bitrate(oct);
5759
421
    if (temp32 % 1000 == 0)
5760
265
      str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
5761
156
    else
5762
156
      str = wmem_strdup_printf(pinfo->pool, "%u kbps", temp32);
5763
421
  }
5764
488
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_upl_ext, tvb,
5765
488
    curr_offset, 1, oct, "%s (%u)", str, oct);
5766
5767
488
  curr_offset += 1;
5768
488
  NO_MORE_DATA_CHECK(len);
5769
5770
  /* Guaranteed bit rate for uplink (extended) Octet 18 */
5771
488
  oct = tvb_get_uint8(tvb, curr_offset);
5772
5773
488
  if (oct == 0x00)
5774
60
    str = "Use the value indicated by the Guaranteed bit rate for uplink";
5775
428
  else
5776
428
  {
5777
428
    temp32 = qos_calc_ext_bitrate(oct);
5778
428
    if (temp32 % 1000 == 0)
5779
281
      str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
5780
147
    else
5781
147
      str = wmem_strdup_printf(pinfo->pool, "%u kbps", temp32);
5782
428
  }
5783
488
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_upl_ext, tvb,
5784
488
    curr_offset, 1, oct, "%s (%u)", str, oct);
5785
5786
488
  curr_offset += 1;
5787
488
  NO_MORE_DATA_CHECK(len);
5788
5789
  /* Maximum bit rate for downlink (extended-2) Octet 19 */
5790
64
  oct = tvb_get_uint8(tvb, curr_offset);
5791
5792
64
  if (oct == 0x00)
5793
8
    str = "Use the value indicated by the Maximum bit rate for downlink";
5794
56
  else
5795
56
  {
5796
56
    temp32 = qos_calc_ext2_bitrate(oct);
5797
56
    str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32);
5798
56
  }
5799
64
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl_ext2, tvb,
5800
64
    curr_offset, 1, oct, "%s (%u)", str, oct);
5801
5802
64
  curr_offset += 1;
5803
64
  NO_MORE_DATA_CHECK(len);
5804
5805
  /* Guaranteed bit rate for downlink (extended-2) Octet 20 */
5806
64
  oct = tvb_get_uint8(tvb, curr_offset);
5807
5808
64
  if (oct == 0x00)
5809
16
    str = "Use the value indicated by the Guaranteed bit rate for downlink";
5810
48
  else
5811
48
  {
5812
48
    temp32 = qos_calc_ext2_bitrate(oct);
5813
48
    str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32);
5814
48
  }
5815
64
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_downl_ext2, tvb,
5816
64
    curr_offset, 1, oct, "%s (%u)", str, oct);
5817
5818
64
  curr_offset += 1;
5819
64
  NO_MORE_DATA_CHECK(len);
5820
5821
  /* Maximum bit rate for uplink (extended-2) Octet 21 */
5822
64
  oct = tvb_get_uint8(tvb, curr_offset);
5823
5824
64
  if (oct == 0x00)
5825
8
    str = "Use the value indicated by the Maximum bit rate for uplink";
5826
56
  else
5827
56
  {
5828
56
    temp32 = qos_calc_ext2_bitrate(oct);
5829
56
    str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32);
5830
56
  }
5831
64
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_upl_ext2, tvb,
5832
64
    curr_offset, 1, oct, "%s (%u)", str, oct);
5833
5834
64
  curr_offset += 1;
5835
64
  NO_MORE_DATA_CHECK(len);
5836
5837
  /* Guaranteed bit rate for uplink (extended-2) Octet 22 */
5838
64
  oct = tvb_get_uint8(tvb, curr_offset);
5839
5840
64
  if (oct == 0x00)
5841
6
    str = "Use the value indicated by the Guaranteed bit rate for uplink";
5842
58
  else
5843
58
  {
5844
58
    temp32 = qos_calc_ext2_bitrate(oct);
5845
58
    str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32);
5846
58
  }
5847
64
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_guar_bitrate_upl_ext2, tvb,
5848
64
    curr_offset, 1, oct, "%s (%u)", str, oct);
5849
5850
64
  curr_offset += 1;
5851
5852
64
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5853
5854
64
  return (curr_offset - offset);
5855
64
}
5856
5857
/*
5858
 * [12] 10.5.6.5a Re-attempt indicator
5859
 */
5860
static const true_false_string gsm_a_gm_eplmnc_value = {
5861
  "MS is not allowed to re-attempt the procedure in an equivalent PLMN",
5862
  "MS is allowed to re-attempt the procedure in an equivalent PLMN"
5863
};
5864
5865
static const true_false_string gsm_a_gm_ratc_value = {
5866
  "MS is not allowed to re-attempt the procedure in S1 mode",
5867
  "MS is allowed to re-attempt the procedure in S1 mode"
5868
};
5869
5870
static uint16_t
5871
de_sm_re_attempt_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
5872
0
{
5873
0
  uint32_t curr_offset;
5874
5875
0
  curr_offset = offset;
5876
5877
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 6, ENC_BIG_ENDIAN);
5878
0
  proto_tree_add_item(tree, hf_gsm_a_sm_eplmnc, tvb, offset, 1, ENC_BIG_ENDIAN);
5879
0
  proto_tree_add_item(tree, hf_gsm_a_sm_ratc, tvb, offset, 1, ENC_BIG_ENDIAN);
5880
0
  curr_offset++;
5881
5882
0
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5883
5884
0
  return len;
5885
0
}
5886
5887
/*
5888
 * [15] 10.5.6.5b Extended quality of service
5889
 */
5890
static uint16_t
5891
de_sm_ext_qos(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
5892
1
{
5893
1
  uint32_t curr_offset;
5894
5895
1
  curr_offset = offset;
5896
5897
1
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
5898
5899
1
  return len;
5900
1
}
5901
5902
/*
5903
 * [9] 10.5.6.6 SM cause
5904
 */
5905
static const value_string gsm_a_sm_cause_vals[] = {
5906
  { 0x08, "Operator Determined Barring" },
5907
  { 0x18, "MBMS bearer capabilities insufficient for the service" },
5908
  { 0x19, "LLC or SNDCP failure(A/Gb only)" },
5909
  { 0x1a, "Insufficient resources" },
5910
  { 0x1b, "Missing or unknown APN" },
5911
  { 0x1c, "Unknown PDP address or PDP type" },
5912
  { 0x1d, "User authentication failed" },
5913
  { 0x1e, "Activation rejected by GGSN, Serving GW or PDN GW" },
5914
  { 0x1f, "Activation rejected, unspecified" },
5915
  { 0x20, "Service option not supported" },
5916
  { 0x21, "Requested service option not subscribed" },
5917
  { 0x22, "Service option temporarily out of order" },
5918
  { 0x23, "NSAPI already used (not sent)" },
5919
  { 0x24, "Regular deactivation" },
5920
  { 0x25, "QoS not accepted" },
5921
  { 0x26, "Network failure" },
5922
  { 0x27, "Reactivation requested" },
5923
  { 0x28, "Feature not supported" },
5924
  { 0x29, "Semantic error in the TFT operation" },
5925
  { 0x2a, "Syntactical error in the TFT operation" },
5926
  { 0x2b, "Unknown PDP context" },
5927
  { 0x2c, "Semantic errors in packet filter(s)" },
5928
  { 0x2d, "Syntactical errors in packet filter(s)" },
5929
  { 0x2e, "PDP context without TFT already activated" },
5930
  { 0x2f, "Multicast group membership time-out" },
5931
  { 0x30, "Request rejected, BCM violation" },
5932
  { 0x32, "PDP type IPv4 only allowed" },
5933
  { 0x33, "PDP type IPv6 only allowed" },
5934
  { 0x34, "Single address bearers only allowed" },
5935
  { 0x38, "Collision with network initiated request" },
5936
  { 0x39, "PDP type IPv4v6 only allowed" },
5937
  { 0x3a, "PDP type non IP only allowed" },
5938
  { 0x3c, "Bearer handling not supported" },
5939
  { 0x41, "Maximum number of PDP contexts reached" },
5940
  { 0x42, "Requested APN not supported in current RAT and PLMN combination" },
5941
  { 0x51, "Invalid transaction identifier value" },
5942
  { 0x5f, "Semantically incorrect message" },
5943
  { 0x60, "Invalid mandatory information" },
5944
  { 0x61, "Message type non-existent or not implemented" },
5945
  { 0x62, "Message type not compatible with the protocol state" },
5946
  { 0x63, "Information element non-existent or not implemented" },
5947
  { 0x64, "Conditional IE error" },
5948
  { 0x65, "Message not compatible with the protocol state" },
5949
  { 0x6f, "Protocol error, unspecified" },
5950
  { 0x70, "APN restriction value incompatible with active PDP context" },
5951
  { 0x71, "Multiple accesses to a PDN connection not allowed" },
5952
  { 0, NULL }
5953
};
5954
static value_string_ext gsm_a_sm_cause_vals_ext = VALUE_STRING_EXT_INIT(gsm_a_sm_cause_vals);
5955
5956
uint16_t
5957
de_sm_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
5958
12
{
5959
12
  uint8_t      oct;
5960
12
  const char *str;
5961
5962
12
  oct = tvb_get_uint8(tvb, offset);
5963
5964
  /* SM Cause can be sent in both directions */
5965
12
  str = val_to_str_ext_const(oct, &gsm_a_sm_cause_vals_ext,
5966
12
             "Protocol error, unspecified / Service option temporarily out of order");
5967
5968
12
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause, tvb,
5969
12
        offset, 1, oct, "%s (%u)", str, oct);
5970
5971
  /* no length check possible */
5972
12
  return 1;
5973
12
}
5974
5975
/*
5976
 * [9] 10.5.6.6a SM cause 2
5977
 */
5978
static uint16_t
5979
de_sm_cause_2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
5980
0
{
5981
0
  uint8_t      oct;
5982
0
  const char *str;
5983
5984
0
  oct = tvb_get_uint8(tvb, offset);
5985
5986
  /* SM Cause 2 is sent only in the Network-to-MS direction */
5987
0
  str = val_to_str_ext_const(oct, &gsm_a_sm_cause_vals_ext,
5988
0
             "Service option temporarily out of order");
5989
5990
0
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_cause_2, tvb,
5991
0
        offset, 1, oct, "%s (%u)", str, oct);
5992
5993
  /* no length check possible */
5994
0
  return 1;
5995
0
}
5996
/*
5997
 * [7] 10.5.6.7
5998
 */
5999
6000
static const true_false_string gsm_a_sm_ti_flag_vals = {
6001
  "The message is sent to the side that originates the TI",
6002
  "The message is sent from the side that originates the TI"
6003
};
6004
6005
static uint16_t
6006
de_sm_linked_ti(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6007
9
{
6008
9
  uint32_t  curr_offset;
6009
9
  unsigned  curr_len;
6010
9
  char  oct;
6011
6012
9
  curr_len    = len;
6013
9
  curr_offset = offset;
6014
6015
9
  oct = tvb_get_uint8(tvb, curr_offset);
6016
6017
9
  proto_tree_add_item(tree, hf_gsm_a_sm_ti_flag, tvb, offset, 1, ENC_BIG_ENDIAN);
6018
6019
  /* The TI value and the TI flag occupy bits 5 - 7 and bit 8 of the first octet respectively.
6020
   * The extended TI shall not be used unless TI values of 7 or greater are needed.
6021
   * 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
6022
   * value is encoded in bits 7-1 of the second octet.
6023
   */
6024
6025
9
  if (curr_len > 1)
6026
8
  {
6027
8
    curr_offset++;
6028
8
    oct = tvb_get_uint8(tvb, curr_offset);
6029
6030
8
    proto_tree_add_uint(tree, hf_gsm_a_gm_ti_value, tvb, curr_offset, 1, oct&0x7f);
6031
6032
8
    proto_tree_add_item(tree, hf_gsm_a_sm_ext, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6033
6034
8
    curr_offset++;
6035
8
  }
6036
1
  else
6037
1
  {
6038
1
    proto_tree_add_uint(tree, hf_gsm_a_gm_ti_value, tvb, curr_offset, 1, (oct>>4)&7);
6039
1
    curr_offset++;
6040
1
  }
6041
6042
6043
9
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
6044
6045
9
  return (curr_offset - offset);
6046
9
}
6047
6048
/*
6049
 * [9] 10.5.6.9 LLC service access point identifier
6050
 */
6051
static const value_string gsm_a_sm_llc_sapi_vals[] = {
6052
  { 0, "LLC SAPI not assigned" },
6053
  { 3, "SAPI 3" },
6054
  { 5, "SAPI 5" },
6055
  { 9, "SAPI 9" },
6056
  { 11, "SAPI 11" },
6057
  { 0, NULL }
6058
};
6059
6060
static uint16_t
6061
de_sm_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
6062
67
{
6063
67
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
6064
67
  proto_tree_add_item(tree, hf_gsm_a_sm_llc_sapi, tvb, offset, 1, ENC_BIG_ENDIAN);
6065
6066
  /* no length check possible */
6067
67
  return 1;
6068
67
}
6069
6070
/*
6071
 * [9] 10.5.6.10 Tear down indicator
6072
 */
6073
static const true_false_string gsm_a_sm_tdi_value = {
6074
  "Tear down requested",
6075
  "Tear down not requested"
6076
};
6077
6078
static uint16_t
6079
de_sm_tear_down(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
6080
0
{
6081
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset << 3) + 4, 3, ENC_BIG_ENDIAN);
6082
0
  proto_tree_add_item(tree, hf_gsm_a_sm_tdi, tvb, offset, 1, ENC_BIG_ENDIAN);
6083
6084
  /* no length check possible */
6085
0
  return 1;
6086
0
}
6087
6088
/*
6089
 * [9] 10.5.6.11 Packet Flow Identifier
6090
 */
6091
static const range_string gsm_a_sm_packet_flow_id_vals[] = {
6092
  { 0x00, 0x00, "Best Effort"},
6093
  { 0x01, 0x01, "Signalling"},
6094
  { 0x02, 0x02, "SMS"},
6095
  { 0x03, 0x03, "TOM8"},
6096
  { 0x04, 0x07, "Reserved"},
6097
  { 0x08, 0x7f, "Dynamically assigned"},
6098
  { 0x00, 0x00, NULL }
6099
};
6100
6101
uint16_t
6102
de_sm_pflow_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6103
503
{
6104
503
  uint32_t  curr_offset;
6105
503
  unsigned   value;
6106
6107
503
  curr_offset = offset;
6108
503
  value = tvb_get_uint8(tvb, curr_offset);
6109
503
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset << 3, 1, ENC_BIG_ENDIAN);
6110
503
  proto_tree_add_item(tree, hf_gsm_a_sm_packet_flow_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6111
503
  curr_offset++;
6112
6113
503
  if (add_string)
6114
503
    snprintf(add_string, string_len, " - %s", rval_to_str_const(value, gsm_a_sm_packet_flow_id_vals, "Unknown"));
6115
6116
503
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
6117
6118
503
  return (curr_offset - offset);
6119
503
}
6120
6121
/*
6122
 * [7] 10.5.6.12     TFT - Traffic Flow Template
6123
 */
6124
/* TFT operation code (octet 3) */
6125
static const value_string gsm_a_sm_tft_op_code_vals[] = {
6126
  { 0,    "Ignore this IE"},
6127
  { 1,    "Create new TFT"},
6128
  { 2,    "Delete existing TFT"},
6129
  { 3,    "Add packet filters to existing TFT"},
6130
  { 4,    "Replace packet filters in existing TFT"},
6131
  { 5,    "Delete packet filters from existing TFT"},
6132
  { 6,    "No TFT operation"},
6133
  { 7,    "Reserved"},
6134
  { 0,  NULL }
6135
};
6136
6137
static const true_false_string gsm_a_sm_tft_e_bit  = {
6138
  "Parameters list is included",
6139
  "Parameters list is not included"
6140
};
6141
6142
static const value_string gsm_a_sm_tft_pkt_flt_dir_vals[] = {
6143
  { 0,  "Pre Rel-7 TFT filter"},
6144
  { 1,  "Downlink only"},
6145
  { 2,  "Uplink only"},
6146
  { 3,  "Bidirectional"},
6147
  { 0,  NULL }
6148
};
6149
6150
static const value_string gsm_a_sm_tft_param_id_vals[] = {
6151
  { 1,  "Authorization Token"},
6152
  { 2,  "Flow Identifier"},
6153
  { 3,  "Packet Filter Identifier"},
6154
  { 0,  NULL }
6155
};
6156
6157
static const value_string packet_filter_component_type_vals[] = {
6158
  {0x10,  "IPv4 remote address type" },
6159
  {0x11,  "IPv4 local address type"},
6160
  {0x20,  "IPv6 remote address type"},
6161
  {0x21,  "IPv6 remote address/prefix length type"},
6162
  {0x23,  "IPv6 local address/prefix length type"},
6163
  {0x30,  "Protocol identifier/Next header type"},
6164
  {0x40,  "Single local port type"},
6165
  {0x41,  "Local port range type"},
6166
  {0x50,  "Single remote port type"},
6167
  {0x51,  "Remote port range type"},
6168
  {0x60,  "Security parameter index type"},
6169
  {0x70,  "Type of service/Traffic class type"},
6170
  {0x80,  "Flow label type"},
6171
  {0x81,  "Destination MAC address type" },
6172
  {0x82,  "Source MAC address type" },
6173
  {0x83,  "802.1Q C-TAG VID type" },
6174
  {0x84,  "802.1Q S-TAG VID type" },
6175
  {0x85,  "802.1Q C-TAG PCP/DEI type" },
6176
  {0x86,  "802.1Q S-TAG PCP/DEI type" },
6177
  {0x87,  "Ethertype type" },
6178
  {0, NULL}
6179
};
6180
6181
uint16_t
6182
de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6183
149
{
6184
149
  uint32_t        curr_offset, prev_offset;
6185
149
  unsigned        curr_len;
6186
149
  uint8_t       op_code;
6187
149
  uint8_t       pkt_fil_count;
6188
149
  uint8_t       e_bit;
6189
149
  uint8_t       count;
6190
149
  uint8_t       oct;
6191
149
  int           pf_length;
6192
149
  int           i;
6193
149
  int           pack_component_type;
6194
149
  int           param;
6195
6196
149
  curr_len    = len;
6197
149
  curr_offset = offset;
6198
6199
  /*
6200
   * parse first octet. It contain TFT operation code, E bit and Number of packet filters
6201
   */
6202
149
  oct = tvb_get_uint8(tvb, curr_offset);
6203
6204
149
  op_code = oct>>5;
6205
149
  pkt_fil_count = oct&0x0f;
6206
149
  e_bit = (oct>>4)&1;
6207
6208
149
  proto_tree_add_item(tree, hf_gsm_a_sm_tft_op_code, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6209
149
  proto_tree_add_item(tree, hf_gsm_a_sm_tft_e_bit,   tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6210
149
  proto_tree_add_item(tree, hf_gsm_a_sm_tft_pkt_flt, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6211
6212
149
  curr_offset++;
6213
149
  curr_len--;
6214
6215
  /* Packet filter list dissect */
6216
6217
149
  count = 0;
6218
149
  if (op_code == 2)      /* delete TFT contains no packet filters. so we will jump over it */
6219
3
    count = pkt_fil_count;
6220
900
  while (count < pkt_fil_count)
6221
760
  {
6222
760
    proto_item *tf_pf;
6223
760
    proto_tree *tf_tree;
6224
760
    prev_offset = curr_offset;
6225
760
    tf_pf = proto_tree_add_uint(tree, hf_gsm_a_sm_tft_packet_filter, tvb, curr_offset, 1, count);   /* 0-> 7 */
6226
6227
760
    tf_tree = proto_item_add_subtree(tf_pf, ett_sm_tft);
6228
6229
760
    if ((curr_offset-offset)<1) {
6230
0
      proto_tree_add_expert(tf_tree, pinfo, &ei_gsm_a_gm_not_enough_data, tvb, curr_offset, 1);
6231
0
      return (len);
6232
0
    }
6233
6234
760
    if (op_code == 5)  /* Delete packet filters from existing TFT - just a list of identifiers */
6235
26
    {
6236
26
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
6237
26
      oct = tvb_get_uint8(tvb, curr_offset) & 0x0f;
6238
26
      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);
6239
26
      curr_offset++;
6240
26
      curr_len--;
6241
26
      count++;
6242
26
    }
6243
734
    else        /* create new, Add packet filters or Replace packet filters */
6244
734
    {
6245
734
      proto_tree_add_bits_item(tf_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 2, ENC_BIG_ENDIAN);
6246
734
      proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_pkt_flt_dir, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6247
734
      oct = tvb_get_uint8(tvb, curr_offset) & 0x0f;
6248
734
      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);
6249
734
      curr_offset++;
6250
734
      curr_len--;
6251
6252
734
      if ((curr_offset-offset) < 1) {
6253
0
        proto_tree_add_expert(tf_tree, pinfo, &ei_gsm_a_gm_not_enough_data, tvb, curr_offset, 1);
6254
0
        return (len);
6255
0
      }
6256
734
      proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_packet_evaluation_precedence, tvb, curr_offset, 1, ENC_NA);
6257
734
      curr_offset++;
6258
734
      curr_len--;
6259
6260
734
      if ((curr_offset-offset)<1) {
6261
0
        proto_tree_add_expert(tf_tree, pinfo, &ei_gsm_a_gm_not_enough_data, tvb, curr_offset, 1);
6262
0
        return (len);
6263
0
      }
6264
734
      pf_length = tvb_get_uint8(tvb, curr_offset);
6265
734
      proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_packet_filter_length, tvb, curr_offset, 1, ENC_NA);
6266
734
      curr_offset++;
6267
734
      curr_len--;
6268
6269
      /* New tree for component */
6270
6271
      /* Dissect Packet filter Component */
6272
      /* while (filter_len > 1) */
6273
      /* packet filter component type identifier: */
6274
6275
2.17k
      while (pf_length > 0) {
6276
1.44k
        proto_item *tf;
6277
1.44k
        proto_tree *comp_tree;
6278
1.44k
        if ((curr_offset-offset) < 1) {
6279
0
          proto_tree_add_expert(tf_tree, pinfo, &ei_gsm_a_gm_not_enough_data, tvb, curr_offset, 1);
6280
0
          return (len);
6281
0
        }
6282
1.44k
        pack_component_type = tvb_get_uint8(tvb, curr_offset);
6283
1.44k
        tf = proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_packet_filter_component_type_id, tvb, curr_offset, 1, ENC_NA);
6284
1.44k
        comp_tree = proto_item_add_subtree(tf, ett_sm_tft);
6285
6286
1.44k
        curr_offset++;
6287
1.44k
        curr_len--;
6288
1.44k
        pf_length--;
6289
6290
1.44k
        switch (pack_component_type) {
6291
6292
22
        case 0x10:
6293
22
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
6294
22
          curr_offset += 4;
6295
22
          curr_len    -= 4;
6296
22
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_mask, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
6297
22
          curr_offset += 4;
6298
22
          curr_len    -= 4;
6299
22
          pf_length   -= 8;
6300
22
          break;
6301
6302
16
        case 0x11:
6303
16
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_address, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
6304
16
          curr_offset += 4;
6305
16
          curr_len    -= 4;
6306
16
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip4_mask, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
6307
16
          curr_offset += 4;
6308
16
          curr_len    -= 4;
6309
16
          pf_length   -= 8;
6310
16
          break;
6311
6312
14
        case 0x20:
6313
14
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
6314
14
          curr_offset += 16;
6315
14
          curr_len    -= 16;
6316
14
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_mask, tvb, curr_offset, 16, ENC_NA);
6317
14
          curr_offset += 16;
6318
14
          curr_len    -= 16;
6319
14
          pf_length   -= 32;
6320
14
          break;
6321
6322
15
        case 0x21:
6323
15
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
6324
15
          curr_offset += 16;
6325
15
          curr_len    -= 16;
6326
15
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_prefix_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6327
15
          curr_offset += 1;
6328
15
          curr_len    -= 1;
6329
15
          pf_length   -= 17;
6330
15
          break;
6331
6332
18
        case 0x23:
6333
18
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_address, tvb, curr_offset, 16, ENC_NA);
6334
18
          curr_offset += 16;
6335
18
          curr_len    -= 16;
6336
18
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_ip6_prefix_length, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6337
18
          curr_offset += 1;
6338
18
          curr_len    -= 1;
6339
18
          pf_length   -= 17;
6340
18
          break;
6341
6342
77
        case 0x30:
6343
77
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_protocol_header, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6344
77
          curr_offset += 1;
6345
77
          curr_len    -= 1;
6346
77
          pf_length   -= 1;
6347
77
          break;
6348
6349
43
        case 0x40:
6350
43
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6351
43
          curr_offset += 2;
6352
43
          curr_len    -= 2;
6353
43
          pf_length   -= 2;
6354
43
          break;
6355
6356
8
        case 0x41:
6357
8
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_low, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6358
8
          curr_offset += 2;
6359
8
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_high, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6360
8
          curr_offset += 2;
6361
8
          curr_len    -= 4;
6362
8
          pf_length   -= 4;
6363
8
          break;
6364
6365
39
        case 0x50:
6366
39
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6367
39
          curr_offset += 2;
6368
39
          curr_len    -= 2;
6369
39
          pf_length   -= 2;
6370
39
          break;
6371
6372
109
        case 0x51:
6373
109
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_low, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6374
109
          curr_offset += 2;
6375
109
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_port_high, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6376
109
          curr_offset += 2;
6377
109
          curr_len    -= 4;
6378
109
          pf_length   -= 4;
6379
109
          break;
6380
6381
69
        case 0x60:
6382
69
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_security, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
6383
69
          curr_offset += 4;
6384
69
          curr_len    -= 4;
6385
69
          pf_length   -= 4;
6386
69
          break;
6387
6388
6389
211
        case 0x70:
6390
211
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_traffic_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6391
211
          curr_offset++;
6392
211
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_traffic_mask, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6393
211
          curr_offset++;
6394
211
          curr_len-=2;
6395
211
          pf_length-=2;
6396
211
          break;
6397
6398
28
        case 0x80:
6399
28
          proto_tree_add_bits_item(comp_tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 4, ENC_BIG_ENDIAN);
6400
28
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_flow_label_type, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
6401
28
          curr_offset += 3;
6402
28
          curr_len    -= 3;
6403
28
          pf_length   -= 3;
6404
28
          break;
6405
6406
18
        case 0x81:
6407
28
        case 0x82:
6408
28
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_mac_addr, tvb, curr_offset, 6, ENC_NA);
6409
28
          curr_offset += 6;
6410
28
          curr_len    -= 6;
6411
28
          pf_length   -= 6;
6412
28
          break;
6413
6414
23
        case 0x83:
6415
114
        case 0x84:
6416
114
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_vlan_tag_vid, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6417
114
          curr_offset += 2;
6418
114
          curr_len    -= 2;
6419
114
          pf_length   -= 2;
6420
114
          break;
6421
6422
56
        case 0x85:
6423
105
        case 0x86:
6424
105
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_vlan_tag_pcp, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6425
105
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_vlan_tag_dei, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6426
105
          curr_offset += 1;
6427
105
          curr_len    -= 1;
6428
105
          pf_length   -= 1;
6429
105
          break;
6430
6431
117
        case 0x87:
6432
117
          proto_tree_add_item(comp_tree, hf_gsm_a_sm_tft_ethertype, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6433
117
          curr_offset += 2;
6434
117
          curr_len    -= 2;
6435
117
          pf_length   -= 2;
6436
117
          break;
6437
6438
411
        default:
6439
411
          curr_offset += pf_length;
6440
411
          curr_len    -= pf_length;
6441
411
          pf_length    = 0;
6442
1.44k
        }
6443
1.44k
      }
6444
725
      count++;
6445
725
    }
6446
751
    proto_item_set_len(tf_pf, curr_offset - prev_offset);
6447
751
  }
6448
6449
  /* The parameters list contains a variable number of parameters that might need to be
6450
   * transferred in addition to the packet filters. If the parameters list is included, the E
6451
   * bit is set to 1; otherwise, the E bit is set to 0.
6452
   */
6453
140
  if ((e_bit == 1) && curr_len) {
6454
45
    count = 0;
6455
975
    while (curr_len) {
6456
975
      proto_tree *tf_tree;
6457
975
      pf_length = tvb_get_uint8(tvb, curr_offset+1);
6458
975
      tf_tree   = proto_tree_add_subtree_format(tree, tvb, curr_offset, pf_length+2, ett_sm_tft, NULL, "Parameter %d", count);
6459
975
      param     = tvb_get_uint8(tvb, curr_offset);
6460
975
      proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6461
975
      curr_offset += 2;
6462
975
      curr_len    -= 2;
6463
975
      switch (param) {
6464
15
      case 0x01:
6465
15
        proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_authorization_token_value, tvb, curr_offset, pf_length, ENC_NA);
6466
15
        break;
6467
6468
15
      case 0x02:
6469
15
        proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_media_component_number_value, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
6470
15
        proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_ip_flow_number, tvb, curr_offset+2, 2, ENC_BIG_ENDIAN);
6471
15
        break;
6472
6473
69
      case 0x03:
6474
620
        for (i=0; i<pf_length; i++) {
6475
551
          oct = tvb_get_uint8(tvb, curr_offset+i) & 0x0f;
6476
551
          proto_tree_add_uint_format(tf_tree, hf_gsm_a_sm_tft_packet_filter_identifier, tvb, curr_offset+i, 1, oct+1, "Packet filter identifier %d: %d (%d)", i, oct+1, oct);
6477
551
        }
6478
69
        break;
6479
6480
870
      default:
6481
870
        proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_parameter_content, tvb, curr_offset, pf_length, ENC_NA);
6482
870
        break;
6483
975
      }
6484
930
      curr_offset += pf_length;
6485
930
      curr_len    -= pf_length;
6486
930
      count++;
6487
930
    }
6488
45
  }
6489
6490
95
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
6491
6492
95
  return (len);
6493
140
}
6494
6495
/*
6496
 * [9] 10.5.6.13 Temporary Mobile Group Identity (TMGI)
6497
 */
6498
uint16_t
6499
de_sm_tmgi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6500
3
{
6501
3
  uint32_t  curr_offset;
6502
6503
3
  curr_offset = offset;
6504
6505
3
  proto_tree_add_item(tree, hf_gsm_a_sm_tmgi, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
6506
3
  curr_offset += 3;
6507
6508
3
  NO_MORE_DATA_CHECK(len);
6509
3
  curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, E212_NONE, true);
6510
6511
3
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
6512
6513
3
  return (curr_offset - offset);
6514
3
}
6515
6516
/*
6517
 * [9] 10.5.6.14 MBMS bearer capabilities
6518
 */
6519
static uint16_t
6520
de_sm_mbms_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6521
11
{
6522
11
  uint32_t     curr_offset, temp32;
6523
11
  uint8_t      oct;
6524
11
  const char *str;
6525
6526
11
  curr_offset = offset;
6527
6528
11
  oct = tvb_get_uint8(tvb, curr_offset);
6529
6530
11
  switch (oct)
6531
11
  {
6532
3
    case 0x00: str = "Subscribed maximum bit rate for downlink/reserved"; break;
6533
2
    case 0xff: str = "0 kbps"; break;
6534
6
    default:   str = wmem_strdup_printf(pinfo->pool, "%u kbps", qos_calc_bitrate(oct));
6535
11
  }
6536
6537
11
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl, tvb,
6538
11
    curr_offset, 1, oct, "%s (%u)", str, oct);
6539
11
  curr_offset += 1;
6540
6541
11
  NO_MORE_DATA_CHECK(len);
6542
6543
9
  oct = tvb_get_uint8(tvb, curr_offset);
6544
6545
9
  if (oct == 0x00)
6546
2
    str = "Use the value indicated by the Maximum bit rate for downlink";
6547
7
  else
6548
7
  {
6549
7
    temp32 = qos_calc_ext_bitrate(oct);
6550
7
    if (temp32 % 1000 == 0)
6551
5
      str = wmem_strdup_printf(pinfo->pool, "%u Mbps", temp32 / 1000);
6552
2
    else
6553
2
      str = wmem_strdup_printf(pinfo->pool, "%u kbps", temp32);
6554
7
  }
6555
9
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_qos_max_bitrate_downl_ext, tvb,
6556
9
    curr_offset, 1, oct, "%s (%u)", str, oct);
6557
6558
9
  curr_offset += 1;
6559
6560
9
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
6561
6562
9
  return (curr_offset - offset);
6563
11
}
6564
6565
/*
6566
 * [9] 10.5.6.15 MBMS protocol configuration options
6567
 */
6568
uint16_t
6569
de_sm_mbms_prot_conf_opt(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6570
3
{
6571
3
  uint32_t  curr_offset;
6572
6573
3
  curr_offset = offset;
6574
3
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3), 8, ENC_BIG_ENDIAN);
6575
3
  curr_offset++;
6576
6577
3
  EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_gm_extraneous_data);
6578
6579
3
  return (curr_offset - offset);
6580
3
}
6581
6582
/*
6583
 * [9] 10.5.6.16 Enhanced network service access point identifier
6584
 */
6585
static uint16_t
6586
de_sm_enh_nsapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
6587
11
{
6588
11
  uint8_t      oct;
6589
11
  const char *str;
6590
6591
11
  oct = tvb_get_uint8(tvb, offset);
6592
6593
11
  if(oct < 0x80)
6594
5
    str = "Reserved";
6595
6
  else if (oct < 0xff)
6596
5
      str = wmem_strdup_printf(pinfo->pool, "NSAPI %u for Multimedia Broadcast/Multicast Service (MBMS) Multicast mode", oct);
6597
1
    else
6598
1
      str = "Reserved for use by lower layers in the p2p radio bearer allocation message for MBMS Broadcast mode";
6599
6600
6601
11
  proto_tree_add_uint_format_value(tree, hf_gsm_a_sm_enh_nsapi, tvb,
6602
11
    offset, 1, oct, "%s (%u)", str, oct);
6603
6604
  /* no length check possible */
6605
11
  return 1;
6606
11
}
6607
6608
/*
6609
 * [9] 10.5.6.17 Request type
6610
 */
6611
static const value_string gsm_a_sm_req_type_vals[] = {
6612
  { 0x01, "Initial request" },
6613
  { 0x02, "Handover" },
6614
  { 0x03, "RLOS" },
6615
  { 0x04, "Emergency" },
6616
  { 0x06, "Handover of emergency bearer services" },
6617
  { 0, NULL }
6618
};
6619
6620
static uint16_t
6621
de_sm_req_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
6622
0
{
6623
0
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset<<3) + 4, 1, ENC_BIG_ENDIAN);
6624
0
  proto_tree_add_item(tree, hf_gsm_a_sm_req_type, tvb, offset, 1, ENC_BIG_ENDIAN);
6625
6626
  /* no length check possible */
6627
0
  return 1;
6628
0
}
6629
6630
/*
6631
 * [9] 10.5.6.18 Notification indicator
6632
 */
6633
static const value_string gsm_a_sm_notif_ind_vals[] = {
6634
  { 0x0,  "Reserved"},
6635
  { 0x1,  "SRVCC handover cancelled, IMS session re-establishment required"},
6636
  { 0, NULL }
6637
};
6638
6639
static uint16_t
6640
de_sm_notif_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6641
1
{
6642
1
  uint32_t  curr_offset;
6643
6644
1
  curr_offset = offset;
6645
6646
1
  proto_tree_add_item(tree, hf_gsm_a_sm_notif_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
6647
6648
1
  return (len);
6649
1
}
6650
6651
/*
6652
 * [10] 10.5.6.19 Connectivity type
6653
 */
6654
static const range_string gsm_a_sm_connectivity_type_vals[] = {
6655
  { 0x0,  0x0, "The PDN connection type is not indicated"},
6656
  { 0x1,  0x1, "The PDN connection is considered a LIPA PDN connection"},
6657
  { 0x2,  0xF, "The PDN connection type is not indicated"},
6658
  { 0, 0, NULL }
6659
};
6660
6661
static uint16_t
6662
de_sm_connectivity_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6663
0
{
6664
0
  proto_tree_add_item(tree, hf_gsm_a_sm_connectivity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
6665
6666
0
  return (len);
6667
0
}
6668
6669
/*
6670
 * [12] 10.5.6.20 WLAN offload acceptability
6671
 */
6672
static const true_false_string gsm_a_sm_wlan_utran_offload_accept_value = {
6673
  "Offloading the traffic of the PDN connection via a WLAN when in Iu mode is acceptable",
6674
  "Offloading the traffic of the PDN connection via a WLAN when in Iu mode is not acceptable"
6675
};
6676
6677
static const true_false_string gsm_a_sm_wlan_eutran_offload_accept_value = {
6678
  "Offloading the traffic of the PDN connection via a WLAN when in S1 mode is acceptable",
6679
  "Offloading the traffic of the PDN connection via a WLAN when in S1 mode is not acceptable"
6680
};
6681
6682
static uint16_t
6683
de_sm_wlan_offload_accept(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6684
3
{
6685
3
  proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, (offset<<3)+4, 2, ENC_BIG_ENDIAN);
6686
3
  proto_tree_add_bits_item(tree, hf_gsm_a_sm_wlan_utran_offload_accept, tvb, (offset<<3)+6, 1, ENC_BIG_ENDIAN);
6687
3
  proto_tree_add_bits_item(tree, hf_gsm_a_sm_wlan_eutran_offload_accept, tvb, (offset<<3)+7, 1, ENC_BIG_ENDIAN);
6688
6689
3
  return (len);
6690
3
}
6691
6692
/*
6693
 * [13] 10.5.6.21 NBIFOM container
6694
 */
6695
static uint16_t
6696
de_sm_nbifom_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
6697
26
{
6698
26
  if (nbifom_handle) {
6699
26
    tvbuff_t *nbifom_tvb = tvb_new_subset_length(tvb, offset, len);
6700
6701
26
    call_dissector(nbifom_handle, nbifom_tvb, pinfo, tree);
6702
26
  } else {
6703
0
    proto_tree_add_item(tree, hf_gsm_a_sm_nbifom_cont, tvb, offset, len, ENC_NA);
6704
0
  }
6705
6706
26
  return len;
6707
26
}
6708
6709
uint16_t (* const gm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string, int string_len) = {
6710
  /* GPRS Mobility Management Information Elements 10.5.5 */
6711
  de_gmm_add_upd_type,               /* Additional Update Type */
6712
  de_gmm_attach_res,                 /* Attach Result */
6713
  de_gmm_attach_type,                /* Attach Type */
6714
  de_gmm_ciph_alg,                   /* Ciphering Algorithm */
6715
  de_gmm_integ_alg,                  /* Integrity Algorithm */
6716
  de_gmm_tmsi_stat,                  /* TMSI Status */
6717
  de_gmm_detach_type,                /* Detach Type */
6718
  de_gmm_drx_param,                  /* DRX Parameter */
6719
  de_gmm_ftostby,                    /* Force to Standby */
6720
  de_gmm_ftostby_h,                  /* Force to Standby - Info is in the high nibble */
6721
  de_gmm_ptmsi_sig,                  /* P-TMSI Signature */
6722
  de_gmm_ptmsi_sig2,                 /* P-TMSI Signature 2 */
6723
  de_gmm_ident_type2,                /* Identity Type 2 */
6724
  de_gmm_imeisv_req,                 /* IMEISV Request */
6725
  de_gmm_rec_npdu_lst,               /* Receive N-PDU Numbers List */
6726
  de_gmm_ms_net_cap,                 /* MS Network Capability */
6727
  de_gmm_ms_radio_acc_cap,           /* MS Radio Access Capability */
6728
  de_gmm_cause,                      /* GMM Cause */
6729
  de_gmm_rai,                        /* Routing Area Identification */
6730
  de_gmm_rai2,                       /* Routing Area Identification 2 */
6731
  de_gmm_update_res,                 /* Update Result */
6732
  de_gmm_update_type,                /* Update Type */
6733
  de_gmm_ac_ref_nr,                  /* A&C Reference Number */
6734
  de_gmm_ac_ref_nr_h,                /* A&C Reference Number - Info is in the high nibble */
6735
  de_gmm_service_type,               /* Service Type */
6736
  NULL  /* no associated data */,    /* Cell Notification */
6737
  de_gmm_ps_lcs_cap,                 /* PS LCS Capability */
6738
  de_gmm_net_feat_supp,              /* Network Feature Support */
6739
  de_gmm_add_net_feat_supp,          /* Network Feature Support */
6740
  de_gmm_rat_info_container,         /* Inter RAT information container */
6741
  de_gmm_req_ms_info,                /* Requested MS information */
6742
  NULL,                              /* UE network capability */
6743
  de_gmm_eutran_irat_info_container, /* E-UTRAN inter RAT information container */
6744
  de_gmm_voice_domain_pref,          /* Voice domain preference and UE's usage setting */
6745
  de_gmm_ptmsi_type,                 /* P-TMSI type */
6746
  de_gmm_lai_2,                      /* Location Area Identification 2 */
6747
  de_gmm_net_res_id_cont,            /* Network resource identifier container */
6748
  de_gmm_ext_drx_params,             /* Extended DRX parameters */
6749
  de_gmm_mac,                        /* Message authentication code */
6750
  de_gmm_up_integ_ind,               /* User Plane integrity indicator */
6751
  de_gmm_dcn_id,                     /* DCN-ID */
6752
  de_gmm_plmn_id_cn_operator,        /* PLMN identity of the CN operator */
6753
  de_gmm_non_3gpp_nw_prov_pol,       /* Non-3GPP NW provided policies */
6754
  /* Session Management Information Elements 10.5.6 */
6755
  de_sm_apn,                         /* Access Point Name */
6756
  de_sm_nsapi,                       /* Network Service Access Point Identifier */
6757
  de_sm_pco,                         /* Protocol Configuration Options */
6758
  de_sm_pco,                         /* Extended Protocol Configuration Options */
6759
  de_sm_pdp_addr,                    /* Packet Data Protocol Address */
6760
  de_sm_qos,                         /* Quality Of Service */
6761
  de_sm_re_attempt_ind,              /* Re-attempt indicator */
6762
  de_sm_ext_qos,                     /* Extended quality of service */
6763
  de_sm_cause,                       /* SM Cause */
6764
  de_sm_cause_2,                     /* SM Cause 2 */
6765
  de_sm_linked_ti,                   /* Linked TI */
6766
  de_sm_sapi,                        /* LLC Service Access Point Identifier */
6767
  de_sm_tear_down,                   /* Tear Down Indicator */
6768
  de_sm_pflow_id,                    /* Packet Flow Identifier */
6769
  de_sm_tflow_temp,                  /* Traffic Flow Template */
6770
  de_sm_tmgi,                        /* Temporary Mobile Group Identity (TMGI) */
6771
  de_sm_mbms_bearer_cap,             /* MBMS bearer capabilities */
6772
  de_sm_mbms_prot_conf_opt,          /* MBMS protocol configuration options */
6773
  de_sm_enh_nsapi,                   /* Enhanced network service access point identifier */
6774
  de_sm_req_type,                    /* Request type */
6775
  de_sm_notif_ind,                   /* Notification indicator */
6776
  de_sm_connectivity_type,           /* Connectivity type */
6777
  de_sm_wlan_offload_accept,         /* WLAN offload acceptability */
6778
  de_sm_nbifom_cont,                 /* NBIFOM container */
6779
  /* GPRS Common Information Elements 10.5.7 */
6780
  de_gc_context_stat,                /* PDP Context Status */
6781
  de_gc_radio_prio,                  /* Radio Priority */
6782
  de_gc_timer,                       /* GPRS Timer */
6783
  de_gc_timer2,                      /* GPRS Timer 2 */
6784
  de_gc_timer3,                      /* GPRS Timer 3 */
6785
  de_gc_radio_prio2,                 /* Radio Priority 2 */
6786
  de_gc_mbms_context_stat,           /* 10.5.7.6 MBMS context status */
6787
  de_gc_uplink_data_stat,            /* 10.5.7.7 Uplink data status */
6788
  de_gc_device_properties,           /* 10.5.7.8 Device properties */
6789
  NULL, /* NONE */
6790
};
6791
6792
/* MESSAGE FUNCTIONS */
6793
6794
/*
6795
 * [7] 9.4.1
6796
 */
6797
static void
6798
dtap_gmm_attach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6799
103
{
6800
103
  uint32_t  curr_offset;
6801
103
  uint32_t  consumed;
6802
103
  unsigned  curr_len;
6803
6804
103
  curr_offset = offset;
6805
103
  curr_len    = len;
6806
6807
103
  pinfo->p2p_dir = P2P_DIR_RECV;
6808
6809
103
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, NULL, ei_gsm_a_gm_missing_mandatory_element);
6810
6811
103
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_ATTACH_TYPE, GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, ei_gsm_a_gm_missing_mandatory_element);
6812
6813
103
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL, ei_gsm_a_gm_missing_mandatory_element);
6814
6815
103
  ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, NULL, ei_gsm_a_gm_missing_mandatory_element);
6816
6817
103
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification", ei_gsm_a_gm_missing_mandatory_element);
6818
6819
103
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL, ei_gsm_a_gm_missing_mandatory_element);
6820
6821
103
  ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, " - Old P-TMSI Signature");
6822
6823
96
  ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Ready Timer");
6824
6825
96
  ELEM_OPT_TV_SHORT( 0x90, GSM_A_PDU_TYPE_GM, DE_TMSI_STAT, NULL);
6826
6827
96
  ELEM_OPT_TLV( 0x33, GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP, NULL);
6828
6829
96
  ELEM_OPT_TLV( 0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
6830
6831
96
  ELEM_OPT_TLV( 0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
6832
6833
96
  ELEM_OPT_TLV( 0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
6834
6835
96
  ELEM_OPT_TLV( 0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
6836
6837
96
  ELEM_OPT_TLV( 0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
6838
6839
96
  ELEM_OPT_TLV( 0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
6840
6841
95
  ELEM_OPT_TLV( 0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
6842
6843
95
  ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
6844
6845
94
  ELEM_OPT_TV_SHORT(0xE0, GSM_A_PDU_TYPE_GM, DE_PTMSI_TYPE, NULL);
6846
6847
94
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL);
6848
6849
93
  ELEM_OPT_TLV(0x14, GSM_A_PDU_TYPE_GM, DE_LAI_2, " - Old location area identification");
6850
6851
93
  ELEM_OPT_TV_SHORT(0xF0, GSM_A_PDU_TYPE_GM, DE_ADD_UPD_TYPE, NULL);
6852
6853
93
  ELEM_OPT_TLV(0x10, GSM_A_PDU_TYPE_GM, DE_NET_RES_ID_CONT, " - TMSI based NRI container");
6854
6855
92
  ELEM_OPT_TLV(0x6A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3324 value");
6856
6857
92
  ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value");
6858
6859
92
  ELEM_OPT_TLV(0x6E, GSM_A_PDU_TYPE_GM, DE_EXT_DRX_PARAMS, NULL);
6860
6861
92
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6862
92
}
6863
6864
/*
6865
 * [7] 9.4.2
6866
 */
6867
static void
6868
dtap_gmm_attach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6869
20
{
6870
20
  uint32_t  curr_offset;
6871
20
  uint32_t  consumed;
6872
20
  unsigned  curr_len;
6873
6874
20
  curr_offset = offset;
6875
20
  curr_len    = len;
6876
6877
20
  pinfo->p2p_dir = P2P_DIR_SENT;
6878
6879
20
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_ATTACH_RES, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, ei_gsm_a_gm_missing_mandatory_element);
6880
6881
20
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, NULL, ei_gsm_a_gm_missing_mandatory_element);
6882
6883
20
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO_2, " - Radio priority for TOM8", ei_gsm_a_gm_missing_mandatory_element);
6884
20
  curr_len++;
6885
20
  curr_offset--;
6886
6887
20
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, " - Radio priority for SMS", ei_gsm_a_gm_missing_mandatory_element);
6888
6889
20
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_gsm_a_gm_missing_mandatory_element);
6890
6891
20
  ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, NULL);
6892
6893
19
  ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Negotiated Ready Timer");
6894
6895
19
  ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Allocated P-TMSI");
6896
6897
19
  ELEM_OPT_TLV( 0x23, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
6898
6899
19
  ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
6900
6901
19
  ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value");
6902
6903
19
  ELEM_OPT_T( 0x8C, GSM_A_PDU_TYPE_GM, DE_CELL_NOT, NULL);
6904
6905
19
  ELEM_OPT_TLV( 0x4A, GSM_A_PDU_TYPE_COMMON, DE_PLMN_LIST, NULL);
6906
6907
19
  ELEM_OPT_TV_SHORT( 0xB0, GSM_A_PDU_TYPE_GM, DE_NET_FEAT_SUP, NULL);
6908
6909
19
  ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST, NULL);
6910
6911
19
  ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_MS_INFO, NULL);
6912
6913
19
  ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319 value");
6914
6915
19
  ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323 value" );
6916
6917
19
  ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value");
6918
6919
19
  ELEM_OPT_TLV(0x66, GSM_A_PDU_TYPE_GM, DE_ADD_NET_FEAT_SUP, NULL);
6920
6921
19
  ELEM_OPT_TLV(0x6A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3324 value");
6922
6923
19
  ELEM_OPT_TLV(0x6E, GSM_A_PDU_TYPE_GM, DE_EXT_DRX_PARAMS, NULL);
6924
6925
19
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_UP_INTEG_IND, NULL);
6926
6927
19
  ELEM_OPT_TLV(0x31, GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, " - Replayed MS network capability");
6928
6929
19
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, " - Replayed MS Radio Access capability");
6930
6931
19
  ELEM_OPT_TLV(0x65, GSM_A_PDU_TYPE_GM, DE_DCN_ID, NULL);
6932
6933
18
  ELEM_OPT_TLV(0x63, GSM_A_PDU_TYPE_GM, DE_PLMN_ID_CN_OPERATOR, NULL);
6934
6935
18
  ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_NON_3GPP_NW_PROV_POL, NULL);
6936
6937
18
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6938
18
}
6939
6940
/*
6941
 * [7] 9.4.3
6942
 */
6943
static void
6944
dtap_gmm_attach_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6945
23
{
6946
6947
23
  uint32_t  curr_offset;
6948
23
  uint32_t  consumed;
6949
23
  unsigned  curr_len;
6950
6951
23
  curr_offset = offset;
6952
23
  curr_len    = len;
6953
6954
23
  pinfo->p2p_dir = P2P_DIR_RECV;
6955
6956
23
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
6957
6958
23
  ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
6959
6960
23
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6961
23
}
6962
6963
/*
6964
 * [7] 9.4.4
6965
 */
6966
static void
6967
dtap_gmm_attach_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6968
1
{
6969
1
  uint32_t  curr_offset;
6970
1
  uint32_t  consumed;
6971
1
  unsigned  curr_len;
6972
6973
1
  curr_offset = offset;
6974
1
  curr_len    = len;
6975
6976
1
  pinfo->p2p_dir = P2P_DIR_SENT;
6977
6978
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
6979
6980
1
  ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value" );
6981
6982
1
  ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value");
6983
6984
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
6985
1
}
6986
6987
/*
6988
 * [7] 9.4.5
6989
 */
6990
static void
6991
dtap_gmm_detach_req_MT(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6992
0
{
6993
0
  uint32_t  curr_offset;
6994
0
  uint32_t  consumed;
6995
0
  unsigned  curr_len;
6996
6997
0
  curr_offset = offset;
6998
0
  curr_len    = len;
6999
7000
0
  pinfo->p2p_dir = P2P_DIR_SENT;
7001
7002
0
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, ei_gsm_a_gm_missing_mandatory_element);
7003
7004
0
  ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
7005
7006
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7007
0
}
7008
7009
static void
7010
dtap_gmm_detach_req_MO(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7011
0
{
7012
0
  uint32_t  curr_offset;
7013
0
  uint32_t  consumed;
7014
0
  unsigned  curr_len;
7015
7016
0
  curr_offset = offset;
7017
0
  curr_len    = len;
7018
7019
0
  pinfo->p2p_dir = P2P_DIR_RECV;
7020
7021
0
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_DETACH_TYPE, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, ei_gsm_a_gm_missing_mandatory_element);
7022
7023
0
  ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
7024
7025
0
  ELEM_OPT_TLV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG_2, NULL);
7026
7027
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7028
0
}
7029
7030
static void
7031
dtap_gmm_detach_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7032
0
{
7033
0
  if (pinfo->link_dir == P2P_DIR_UL) {
7034
0
    dtap_gmm_detach_req_MO(tvb, tree, pinfo, offset, len);
7035
0
    return;
7036
0
  }else if (pinfo->link_dir == P2P_DIR_DL) {
7037
0
    dtap_gmm_detach_req_MT(tvb, tree, pinfo, offset, len);
7038
0
    return;
7039
0
  } else {
7040
    /* Unknown direction. Try heuristics based on message length. */
7041
0
    if (len > 5) {
7042
0
      dtap_gmm_detach_req_MO(tvb, tree, pinfo, offset, len);
7043
0
    } else {
7044
0
      dtap_gmm_detach_req_MT(tvb, tree, pinfo, offset, len);
7045
0
    }
7046
0
  }
7047
0
}
7048
7049
/*
7050
 * [7] 9.4.6
7051
 */
7052
static void
7053
dtap_gmm_detach_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7054
3
{
7055
3
  uint32_t  curr_offset;
7056
3
  unsigned  curr_len;
7057
7058
3
  curr_offset = offset;
7059
3
  curr_len    = len;
7060
7061
3
  pinfo->p2p_dir = P2P_DIR_RECV;
7062
7063
3
  if (curr_len == 0) {
7064
1
    return;
7065
1
  }
7066
7067
2
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, ei_gsm_a_gm_missing_mandatory_element);
7068
7069
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7070
2
}
7071
7072
/*
7073
 * [7] 9.4.7
7074
 */
7075
static void
7076
dtap_gmm_ptmsi_realloc_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7077
5
{
7078
5
  uint32_t  curr_offset;
7079
5
  uint32_t  consumed;
7080
5
  unsigned  curr_len;
7081
7082
5
  curr_offset = offset;
7083
5
  curr_len    = len;
7084
7085
5
  pinfo->p2p_dir = P2P_DIR_SENT;
7086
7087
5
  ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, " - Allocated P-TMSI", ei_gsm_a_gm_missing_mandatory_element);
7088
7089
5
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_gsm_a_gm_missing_mandatory_element);
7090
7091
5
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, ei_gsm_a_gm_missing_mandatory_element);
7092
7093
5
  ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, " - P-TMSI Signature" );
7094
7095
4
  ELEM_OPT_TLV(0x65, GSM_A_PDU_TYPE_GM, DE_DCN_ID, NULL);
7096
7097
4
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7098
4
}
7099
7100
/*
7101
 * [7] 9.4.8
7102
 */
7103
static void
7104
dtap_gmm_ptmsi_realloc_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7105
1
{
7106
1
  uint32_t  curr_offset;
7107
/*    uint32_t  consumed; */
7108
1
  unsigned  curr_len;
7109
7110
1
  curr_offset = offset;
7111
1
  curr_len    = len;
7112
7113
1
  pinfo->p2p_dir = P2P_DIR_RECV;
7114
7115
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7116
1
}
7117
7118
/*
7119
 * [7] 9.4.9
7120
 */
7121
static void
7122
dtap_gmm_auth_ciph_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7123
0
{
7124
0
  uint32_t  curr_offset;
7125
0
  uint32_t  consumed;
7126
0
  unsigned   curr_len;
7127
7128
0
  curr_offset = offset;
7129
0
  curr_len    = len;
7130
7131
0
  pinfo->p2p_dir = P2P_DIR_SENT;
7132
7133
0
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_CIPH_ALG, GSM_A_PDU_TYPE_GM, DE_IMEISV_REQ, ei_gsm_a_gm_missing_mandatory_element);
7134
7135
0
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM_H, ei_gsm_a_gm_missing_mandatory_element);
7136
7137
0
  ELEM_OPT_TV(0x21, GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_RAND, NULL);
7138
7139
0
  ELEM_OPT_TV_SHORT(0x80, GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, NULL);
7140
7141
0
  ELEM_OPT_TLV(0x28, GSM_A_PDU_TYPE_DTAP, DE_AUTH_PARAM_AUTN, NULL);
7142
7143
0
  ELEM_OPT_TLV(0x31, GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, " - Replayed MS network capability");
7144
7145
0
  ELEM_OPT_TLV(0x42, GSM_A_PDU_TYPE_GM, DE_INTEG_ALG, NULL);
7146
7147
0
  ELEM_OPT_TLV(0x43, GSM_A_PDU_TYPE_GM, DE_MAC, NULL);
7148
7149
0
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, " - Replayed MS Radio Access capability");
7150
7151
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7152
0
}
7153
7154
/*
7155
 * [7] 9.4.10
7156
 */
7157
static void
7158
dtap_gmm_auth_ciph_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7159
2
{
7160
2
  uint32_t  curr_offset;
7161
2
  uint32_t  consumed;
7162
2
  unsigned  curr_len;
7163
7164
2
  curr_offset = offset;
7165
2
  curr_len    = len;
7166
7167
2
  pinfo->p2p_dir = P2P_DIR_RECV;
7168
7169
2
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_AC_REF_NUM, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, ei_gsm_a_gm_missing_mandatory_element);
7170
7171
2
  ELEM_OPT_TV(0x22, GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM, NULL);
7172
7173
2
  ELEM_OPT_TLV(0x23, GSM_A_PDU_TYPE_COMMON, DE_MID, " - IMEISV" );
7174
7175
2
  ELEM_OPT_TLV(0x29, GSM_A_PDU_TYPE_DTAP, DE_AUTH_RESP_PARAM_EXT, NULL);
7176
7177
2
  ELEM_OPT_TLV(0x43, GSM_A_PDU_TYPE_GM, DE_MAC, NULL);
7178
7179
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7180
2
}
7181
7182
/*
7183
 * [7] 9.4.11
7184
 */
7185
static void
7186
dtap_gmm_auth_ciph_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7187
1
{
7188
1
  uint32_t  curr_offset;
7189
1
  unsigned  curr_len;
7190
7191
1
  curr_offset = offset;
7192
1
  curr_len    = len;
7193
7194
1
  pinfo->p2p_dir = P2P_DIR_SENT;
7195
7196
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7197
1
}
7198
7199
/*
7200
 * [7] 9.4.10a
7201
 */
7202
static void
7203
dtap_gmm_auth_ciph_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7204
1
{
7205
1
  uint32_t  curr_offset;
7206
1
  uint32_t  consumed;
7207
1
  unsigned  curr_len;
7208
7209
1
  curr_offset = offset;
7210
1
  curr_len    = len;
7211
7212
1
  pinfo->p2p_dir = P2P_DIR_RECV;
7213
7214
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7215
7216
1
  ELEM_OPT_TLV( 0x30, GSM_A_PDU_TYPE_DTAP, DE_AUTH_FAIL_PARAM, NULL);
7217
7218
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7219
1
}
7220
7221
/*
7222
 * [7] 9.4.12
7223
 */
7224
static void
7225
dtap_gmm_ident_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7226
0
{
7227
0
  uint32_t  curr_offset;
7228
0
  unsigned  curr_len;
7229
7230
0
  curr_offset = offset;
7231
0
  curr_len    = len;
7232
7233
0
  pinfo->p2p_dir = P2P_DIR_SENT;
7234
7235
0
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_ID_TYPE_2, GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND_H, ei_gsm_a_gm_missing_mandatory_element);
7236
7237
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7238
0
}
7239
7240
/*
7241
 * [7] 9.4.13
7242
 */
7243
static void
7244
dtap_gmm_ident_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7245
2
{
7246
2
  uint32_t  curr_offset;
7247
2
  uint32_t  consumed;
7248
2
  unsigned  curr_len;
7249
7250
2
  curr_offset = offset;
7251
2
  curr_len    = len;
7252
7253
2
  pinfo->p2p_dir = P2P_DIR_RECV;
7254
7255
2
  ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, NULL, ei_gsm_a_gm_missing_mandatory_element);
7256
7257
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7258
2
}
7259
7260
/*
7261
 * [7] 9.4.14
7262
 */
7263
static void
7264
dtap_gmm_rau_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7265
347
{
7266
347
  uint32_t  curr_offset;
7267
347
  uint32_t  consumed;
7268
347
  unsigned  curr_len;
7269
7270
347
  curr_offset = offset;
7271
347
  curr_len    = len;
7272
7273
347
  pinfo->p2p_dir = P2P_DIR_RECV;
7274
7275
347
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_UPD_TYPE, GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, ei_gsm_a_gm_missing_mandatory_element);
7276
7277
347
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification", ei_gsm_a_gm_missing_mandatory_element);
7278
7279
347
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL, ei_gsm_a_gm_missing_mandatory_element);
7280
7281
347
  ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, " - Old P-TMSI Signature" );
7282
7283
334
  ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Requested Ready Timer" );
7284
7285
333
  ELEM_OPT_TV( 0x27, GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL);
7286
7287
333
  ELEM_OPT_TV_SHORT( 0x90, GSM_A_PDU_TYPE_GM, DE_TMSI_STAT, NULL);
7288
7289
333
  ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, " - P-TMSI" );
7290
7291
333
  ELEM_OPT_TLV( 0x31, GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, NULL);
7292
7293
332
  ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
7294
7295
332
  ELEM_OPT_TLV( 0x33, GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP, NULL);
7296
7297
332
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
7298
7299
332
  ELEM_OPT_TLV( 0x58, NAS_PDU_TYPE_EMM, DE_EMM_UE_NET_CAP, NULL);
7300
7301
332
  ELEM_OPT_TLV( 0x1A, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Additional mobile identity");
7302
7303
332
  ELEM_OPT_TLV( 0x1B, GSM_A_PDU_TYPE_GM, DE_RAI_2, " - Additional old routing area identification");
7304
7305
332
  ELEM_OPT_TLV( 0x11, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_2, NULL);
7306
7307
332
  ELEM_OPT_TLV( 0x20, GSM_A_PDU_TYPE_COMMON, DE_MS_CM_3, NULL);
7308
7309
332
  ELEM_OPT_TLV( 0x40, GSM_A_PDU_TYPE_DTAP, DE_SUP_CODEC_LIST, NULL);
7310
7311
332
  ELEM_OPT_TLV( 0x5D, GSM_A_PDU_TYPE_GM, DE_VOICE_DOMAIN_PREF, NULL);
7312
7313
332
  ELEM_OPT_TV_SHORT(0xE0, GSM_A_PDU_TYPE_GM, DE_PTMSI_TYPE, NULL);
7314
7315
332
  ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
7316
7317
331
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_COMMON, DE_MS_NET_FEAT_SUP, NULL);
7318
7319
331
  ELEM_OPT_TLV(0x14, GSM_A_PDU_TYPE_GM, DE_LAI_2, " - Old location area identification");
7320
7321
331
  ELEM_OPT_TV_SHORT(0xF0, GSM_A_PDU_TYPE_GM, DE_ADD_UPD_TYPE, NULL);
7322
7323
331
  ELEM_OPT_TLV(0x10, GSM_A_PDU_TYPE_GM, DE_NET_RES_ID_CONT, " - TMSI based NRI container");
7324
7325
330
  ELEM_OPT_TLV(0x6A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3324 value");
7326
7327
330
  ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value");
7328
7329
330
  ELEM_OPT_TLV(0x6E, GSM_A_PDU_TYPE_GM, DE_EXT_DRX_PARAMS, NULL);
7330
7331
330
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7332
330
}
7333
7334
/*
7335
 * [7] 9.4.15
7336
 */
7337
static void
7338
dtap_gmm_rau_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7339
10
{
7340
10
  uint32_t  curr_offset;
7341
10
  uint32_t  consumed;
7342
10
  unsigned  curr_len;
7343
7344
10
  curr_offset = offset;
7345
10
  curr_len    = len;
7346
7347
10
  pinfo->p2p_dir = P2P_DIR_SENT;
7348
7349
10
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_GM, DE_UPD_RES, ei_gsm_a_gm_missing_mandatory_element);
7350
7351
10
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Periodic RA update timer", ei_gsm_a_gm_missing_mandatory_element);
7352
7353
10
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_gsm_a_gm_missing_mandatory_element);
7354
7355
10
  ELEM_OPT_TV( 0x19, GSM_A_PDU_TYPE_GM, DE_P_TMSI_SIG, NULL);
7356
7357
9
  ELEM_OPT_TLV( 0x18, GSM_A_PDU_TYPE_COMMON, DE_MID, " - Allocated P-TMSI");
7358
7359
9
  ELEM_OPT_TLV( 0x23, GSM_A_PDU_TYPE_COMMON, DE_MID, " - MS identity");
7360
7361
9
  ELEM_OPT_TLV( 0x26, GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST, NULL);
7362
7363
9
  ELEM_OPT_TV( 0x17, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER, " - Negotiated Ready Timer" );
7364
7365
9
  ELEM_OPT_TV( 0x25, GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL);
7366
7367
9
  ELEM_OPT_TLV( 0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value" );
7368
7369
9
  ELEM_OPT_T( 0x8C, GSM_A_PDU_TYPE_GM, DE_CELL_NOT, NULL);
7370
7371
9
  ELEM_OPT_TLV( 0x4A, GSM_A_PDU_TYPE_COMMON, DE_PLMN_LIST, NULL);
7372
7373
9
  ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
7374
7375
9
  ELEM_OPT_TV_SHORT( 0xB0, GSM_A_PDU_TYPE_GM, DE_NET_FEAT_SUP, NULL);
7376
7377
9
  ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_DTAP, DE_EMERGENCY_NUM_LIST, NULL);
7378
7379
9
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
7380
7381
9
  ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_MS_INFO, NULL);
7382
7383
9
  ELEM_OPT_TLV( 0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3319 value");
7384
7385
9
  ELEM_OPT_TLV( 0x38, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3323 value");
7386
7387
9
  ELEM_OPT_TLV(0x39, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3312 extended value");
7388
7389
9
  ELEM_OPT_TLV(0x66, GSM_A_PDU_TYPE_GM, DE_ADD_NET_FEAT_SUP, NULL);
7390
7391
9
  ELEM_OPT_TLV(0x6A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3324 value");
7392
7393
9
  ELEM_OPT_TLV(0x6E, GSM_A_PDU_TYPE_GM, DE_EXT_DRX_PARAMS, NULL);
7394
7395
9
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_UP_INTEG_IND, NULL);
7396
7397
9
  ELEM_OPT_TLV(0x31, GSM_A_PDU_TYPE_GM, DE_MS_NET_CAP, " - Replayed MS network capability");
7398
7399
9
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, " - Replayed MS Radio Access capability");
7400
7401
9
  ELEM_OPT_TLV(0x65, GSM_A_PDU_TYPE_GM, DE_DCN_ID, NULL);
7402
7403
9
  ELEM_OPT_TLV(0x63, GSM_A_PDU_TYPE_GM, DE_PLMN_ID_CN_OPERATOR, NULL);
7404
7405
9
  ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_NON_3GPP_NW_PROV_POL, NULL);
7406
7407
9
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7408
9
}
7409
7410
/*
7411
 * [7] 9.4.16
7412
 */
7413
static void
7414
dtap_gmm_rau_com(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7415
0
{
7416
0
  uint32_t  curr_offset;
7417
0
  uint32_t  consumed;
7418
0
  unsigned  curr_len;
7419
7420
0
  curr_offset = offset;
7421
0
  curr_len    = len;
7422
7423
0
  pinfo->p2p_dir = P2P_DIR_RECV;
7424
  /* [7] 10.5.5.11 */
7425
0
  ELEM_OPT_TLV( 0x26, GSM_A_PDU_TYPE_GM, DE_REC_N_PDU_NUM_LIST, NULL);
7426
  /* Inter RAT information container 10.5.5.24 TS 24.008 version 6.8.0 Release 6 */
7427
0
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_RAT_INFO_CONTAINER, " - Inter RAT handover information");
7428
7429
0
  ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_EUTRAN_IRAT_INFO_CONTAINER, " - E-UTRAN inter RAT handover information");
7430
7431
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7432
0
}
7433
7434
/*
7435
 * [7] 9.4.17
7436
 */
7437
static void
7438
dtap_gmm_rau_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7439
1
{
7440
1
  uint32_t  curr_offset;
7441
1
  uint32_t  consumed;
7442
1
  unsigned  curr_len;
7443
7444
1
  curr_offset = offset;
7445
1
  curr_len    = len;
7446
7447
1
  pinfo->p2p_dir = P2P_DIR_SENT;
7448
7449
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7450
7451
1
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_GM, DE_FORCE_TO_STAND, GSM_A_PDU_TYPE_COMMON, DE_SPARE_NIBBLE, ei_gsm_a_gm_missing_mandatory_element);
7452
7453
1
  ELEM_OPT_TLV(0x2A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3302 value");
7454
7455
1
  ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value");
7456
7457
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7458
1
}
7459
7460
/*
7461
 * [7] 9.4.18
7462
 */
7463
static void
7464
dtap_gmm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7465
2
{
7466
2
  uint32_t  curr_offset;
7467
2
  uint32_t  consumed;
7468
2
  unsigned  curr_len;
7469
7470
2
  curr_offset = offset;
7471
2
  curr_len    = len;
7472
7473
2
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7474
7475
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7476
7477
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7478
2
}
7479
7480
/*
7481
 * [8] 9.4.19 GMM Information
7482
 */
7483
static void
7484
dtap_gmm_information(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7485
0
{
7486
0
  uint32_t  curr_offset;
7487
0
  uint32_t  consumed;
7488
0
  unsigned  curr_len;
7489
7490
0
  curr_offset = offset;
7491
0
  curr_len    = len;
7492
7493
0
  pinfo->p2p_dir = P2P_DIR_SENT;
7494
7495
0
  ELEM_OPT_TLV( 0x43, GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME, " - Full Name" );
7496
7497
0
  ELEM_OPT_TLV( 0x45, GSM_A_PDU_TYPE_DTAP, DE_NETWORK_NAME, " - Short Name" );
7498
7499
0
  ELEM_OPT_TV( 0x46, GSM_A_PDU_TYPE_DTAP, DE_TIME_ZONE, NULL);
7500
7501
0
  ELEM_OPT_TV( 0x47, GSM_A_PDU_TYPE_DTAP, DE_TIME_ZONE_TIME, NULL);
7502
7503
0
  ELEM_OPT_TLV( 0x48, GSM_A_PDU_TYPE_DTAP, DE_LSA_ID, NULL);
7504
7505
0
  ELEM_OPT_TLV( 0x49, GSM_A_PDU_TYPE_DTAP, DE_DAY_SAVING_TIME, NULL);
7506
7507
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7508
0
}
7509
7510
/*
7511
 * [7] 9.4.20
7512
 */
7513
static void
7514
dtap_gmm_service_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7515
3
{
7516
3
  uint32_t  curr_offset;
7517
3
  uint32_t  consumed;
7518
3
  unsigned  curr_len;
7519
7520
3
  curr_offset = offset;
7521
3
  curr_len    = len;
7522
7523
3
  pinfo->p2p_dir = P2P_DIR_RECV;
7524
7525
3
  ELEM_MAND_VV_SHORT(GSM_A_PDU_TYPE_COMMON, DE_CIPH_KEY_SEQ_NUM, GSM_A_PDU_TYPE_GM, DE_SRVC_TYPE, ei_gsm_a_gm_missing_mandatory_element);
7526
7527
  /* P-TMSI Mobile station identity 10.5.1.4 M LV 6 */
7528
3
  ELEM_MAND_LV( GSM_A_PDU_TYPE_COMMON, DE_MID, NULL, ei_gsm_a_gm_missing_mandatory_element);
7529
7530
3
  ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
7531
7532
  /* MBMS context status 10.5.7.6 TLV 2 - 18 */
7533
3
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
7534
7535
3
  ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_UPLINK_DATA_STATUS, NULL);
7536
7537
3
  ELEM_OPT_TV_SHORT(0xD0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
7538
7539
3
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7540
3
}
7541
7542
/*
7543
 * [7] 9.4.21
7544
 */
7545
static void
7546
dtap_gmm_service_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7547
2
{
7548
2
  uint32_t  curr_offset;
7549
2
  uint32_t  consumed;
7550
2
  unsigned  curr_len;
7551
7552
2
  curr_offset = offset;
7553
2
  curr_len    = len;
7554
7555
2
  pinfo->p2p_dir = P2P_DIR_SENT;
7556
7557
2
  ELEM_OPT_TLV( 0x32, GSM_A_PDU_TYPE_GM, DE_PDP_CONTEXT_STAT, NULL);
7558
7559
  /* MBMS context status 10.5.7.6 TLV 2 - 18 */
7560
2
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_CTX_STATUS, NULL);
7561
7562
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7563
2
}
7564
7565
/*
7566
 * [7] 9.4.22
7567
 */
7568
static void
7569
dtap_gmm_service_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7570
0
{
7571
0
  uint32_t  curr_offset;
7572
0
  uint32_t  consumed;
7573
0
  unsigned  curr_len;
7574
7575
0
  curr_offset = offset;
7576
0
  curr_len    = len;
7577
7578
0
  pinfo->p2p_dir = P2P_DIR_SENT;
7579
7580
0
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_GMM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7581
7582
0
  ELEM_OPT_TLV(0x3A, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_2, " - T3346 value");
7583
7584
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7585
0
}
7586
7587
/*
7588
 * [8] 9.5.1 Activate PDP context request
7589
 * Direction:     MS to network
7590
 */
7591
static void
7592
dtap_sm_act_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7593
5
{
7594
5
  uint32_t  curr_offset;
7595
5
  uint32_t  consumed;
7596
5
  unsigned  curr_len;
7597
7598
5
  curr_offset = offset;
7599
5
  curr_len    = len;
7600
7601
5
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7602
  /* MS to network */
7603
5
  pinfo->link_dir = P2P_DIR_UL;
7604
7605
5
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI", ei_gsm_a_gm_missing_mandatory_element);
7606
7607
5
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
7608
7609
5
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Requested QoS", ei_gsm_a_gm_missing_mandatory_element);
7610
7611
5
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Requested PDP address", ei_gsm_a_gm_missing_mandatory_element);
7612
7613
5
  ELEM_OPT_TLV( 0x28, GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL);
7614
7615
4
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7616
7617
4
  ELEM_OPT_TV_SHORT( 0xA0, GSM_A_PDU_TYPE_GM, DE_REQ_TYPE, NULL);
7618
7619
4
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
7620
7621
4
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7622
7623
4
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7624
7625
4
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
7626
7627
4
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7628
4
}
7629
7630
/*
7631
 * [9] 9.5.2 Activate PDP context accept
7632
 * Direction:     network to MS
7633
 */
7634
static void
7635
dtap_sm_act_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7636
2
{
7637
2
  uint32_t  curr_offset;
7638
2
  uint32_t  consumed;
7639
2
  unsigned  curr_len;
7640
7641
2
  curr_offset = offset;
7642
2
  curr_len    = len;
7643
7644
2
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7645
  /* Network to MS*/
7646
2
  pinfo->link_dir = P2P_DIR_DL;
7647
7648
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
7649
7650
2
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Negotiated QoS", ei_gsm_a_gm_missing_mandatory_element);
7651
7652
#if 0
7653
  /* This is done automatically */
7654
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SPARE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7655
  curr_offset--;
7656
  curr_len++;
7657
#endif
7658
7659
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL, ei_gsm_a_gm_missing_mandatory_element);
7660
7661
2
  ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - PDP address");
7662
7663
2
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7664
7665
2
  ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
7666
7667
2
  ELEM_OPT_TLV( 0x39, GSM_A_PDU_TYPE_GM, DE_SM_CAUSE_2, " - SM cause");
7668
7669
2
  ELEM_OPT_TV_SHORT(0xB0 , GSM_A_PDU_TYPE_GM, DE_SM_CONNECTIVITY_TYPE, NULL);
7670
7671
2
  ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
7672
7673
2
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7674
7675
2
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7676
7677
2
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
7678
7679
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7680
2
}
7681
7682
/*
7683
 * [8] 9.5.3 Activate PDP context reject
7684
 * Direction:     network to MS
7685
 */
7686
static void
7687
dtap_sm_act_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7688
2
{
7689
2
  uint32_t  curr_offset;
7690
2
  uint32_t  consumed;
7691
2
  unsigned  curr_len;
7692
7693
2
  curr_offset = offset;
7694
2
  curr_len    = len;
7695
7696
2
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7697
  /* Network to MS*/
7698
2
  pinfo->link_dir = P2P_DIR_DL;
7699
7700
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7701
7702
2
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7703
7704
2
  ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value");
7705
7706
2
  ELEM_OPT_TLV(0x6B, GSM_A_PDU_TYPE_GM, DE_RE_ATTEMPT_IND, NULL);
7707
7708
2
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7709
7710
2
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7711
7712
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7713
2
}
7714
7715
/*
7716
 * [8] 9.5.4 Activate Secondary PDP Context Request
7717
 * Direction:     MS to network
7718
 */
7719
static void
7720
dtap_sm_act_sec_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7721
12
{
7722
12
  uint32_t  curr_offset;
7723
12
  uint32_t  consumed;
7724
12
  unsigned  curr_len;
7725
7726
12
  curr_offset = offset;
7727
12
  curr_len    = len;
7728
7729
12
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7730
  /* MS to Network */
7731
12
  pinfo->link_dir = P2P_DIR_UL;
7732
7733
12
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Requested NSAPI", ei_gsm_a_gm_missing_mandatory_element);
7734
7735
12
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
7736
7737
12
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Requested QoS", ei_gsm_a_gm_missing_mandatory_element);
7738
7739
12
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_LINKED_TI, NULL, ei_gsm_a_gm_missing_mandatory_element);
7740
7741
  /* 3GPP TS 24.008 version 6.8.0 Release 6, 36 TFT Traffic Flow Template 10.5.6.12 O TLV 3-257 */
7742
12
  ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
7743
7744
11
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7745
7746
11
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
7747
7748
11
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7749
7750
11
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7751
7752
11
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
7753
7754
11
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7755
11
}
7756
7757
/*
7758
 * [7] 9.5.5  Activate Secondary PDP Context Accept
7759
 * Direction:     network to MS
7760
 */
7761
static void
7762
dtap_sm_act_sec_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7763
2
{
7764
2
  uint32_t  curr_offset;
7765
2
  uint32_t  consumed;
7766
2
  unsigned  curr_len;
7767
7768
2
  curr_offset = offset;
7769
2
  curr_len    = len;
7770
7771
2
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7772
  /* Network to MS*/
7773
2
  pinfo->link_dir = P2P_DIR_DL;
7774
7775
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
7776
7777
2
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Negotiated QoS", ei_gsm_a_gm_missing_mandatory_element);
7778
7779
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL, ei_gsm_a_gm_missing_mandatory_element);
7780
7781
#if 0
7782
  /* This is done automatically */
7783
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SPARE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7784
  curr_offset--;
7785
  curr_len++;
7786
#endif
7787
7788
2
  ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
7789
7790
1
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7791
7792
1
  ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
7793
7794
1
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7795
7796
1
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7797
7798
1
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
7799
7800
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7801
1
}
7802
7803
/*
7804
 * [8] 9.5.6 Activate Secondary PDP Context Reject
7805
 * Direction:     network to MS
7806
 */
7807
static void
7808
dtap_sm_act_sec_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7809
1
{
7810
1
  uint32_t  curr_offset;
7811
1
  uint32_t  consumed;
7812
1
  unsigned  curr_len;
7813
7814
1
  curr_offset = offset;
7815
1
  curr_len    = len;
7816
7817
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7818
  /* Network to MS*/
7819
1
  pinfo->link_dir = P2P_DIR_DL;
7820
7821
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7822
7823
1
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7824
7825
1
  ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value");
7826
7827
1
  ELEM_OPT_TLV(0x6B, GSM_A_PDU_TYPE_GM, DE_RE_ATTEMPT_IND, NULL);
7828
7829
1
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7830
7831
1
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7832
7833
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7834
1
}
7835
7836
/*
7837
 * [8] 9.5.7 Request PDP context activation
7838
 * Direction:     network to MS
7839
 */
7840
static void
7841
dtap_sm_req_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7842
0
{
7843
0
  uint32_t  curr_offset;
7844
0
  uint32_t  consumed;
7845
0
  unsigned  curr_len;
7846
7847
0
  curr_offset = offset;
7848
0
  curr_len    = len;
7849
7850
0
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7851
  /* Network to MS*/
7852
0
  pinfo->link_dir = P2P_DIR_DL;
7853
7854
0
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Offered PDP address", ei_gsm_a_gm_missing_mandatory_element);
7855
7856
0
  ELEM_OPT_TLV( 0x28, GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL);
7857
7858
0
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7859
7860
0
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7861
7862
0
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7863
7864
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7865
0
}
7866
7867
/*
7868
 * [8] 9.5.8 Request PDP context activation reject
7869
 * Direction:     MS to network
7870
 */
7871
static void
7872
dtap_sm_req_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7873
1
{
7874
1
  uint32_t  curr_offset;
7875
1
  uint32_t  consumed;
7876
1
  unsigned  curr_len;
7877
7878
1
  curr_offset = offset;
7879
1
  curr_len    = len;
7880
7881
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7882
  /* MS to  Network */
7883
1
  pinfo->link_dir = P2P_DIR_UL;
7884
7885
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7886
7887
1
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7888
7889
1
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7890
7891
1
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7892
7893
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7894
1
}
7895
7896
/*
7897
 * [8] 9.5.9 Modify PDP context request (Network to MS direction)
7898
 * Direction:     network to MS
7899
 */
7900
static void
7901
dtap_sm_mod_pdp_req_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7902
33
{
7903
33
  uint32_t  curr_offset;
7904
33
  uint32_t  consumed;
7905
33
  unsigned  curr_len;
7906
7907
33
  curr_offset = offset;
7908
33
  curr_len    = len;
7909
7910
33
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7911
  /* Network to MS */
7912
33
  pinfo->link_dir = P2P_DIR_DL;
7913
7914
33
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, NULL, ei_gsm_a_gm_missing_mandatory_element);
7915
#if 0
7916
  /* This is done automatically */
7917
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SPARE, NULL, ei_gsm_a_gm_missing_mandatory_element);
7918
  curr_offset--;
7919
  curr_len++;
7920
#endif
7921
7922
33
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
7923
7924
33
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - New QoS", ei_gsm_a_gm_missing_mandatory_element);
7925
7926
33
  ELEM_OPT_TLV( 0x2B, GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - PDP address");
7927
7928
33
  ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
7929
7930
33
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7931
7932
33
  ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
7933
7934
33
  ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
7935
7936
33
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7937
7938
33
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7939
7940
33
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
7941
7942
33
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7943
33
}
7944
7945
/*
7946
 * [8] 9.5.10 Modify PDP context request (MS to network direction)
7947
 * Direction:     MS to network
7948
 */
7949
static void
7950
dtap_sm_mod_pdp_req_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7951
0
{
7952
0
  uint32_t  curr_offset;
7953
0
  uint32_t  consumed;
7954
0
  unsigned  curr_len;
7955
7956
0
  curr_offset = offset;
7957
0
  curr_len    = len;
7958
7959
0
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7960
  /* MS to Network */
7961
0
  pinfo->link_dir = P2P_DIR_UL;
7962
7963
0
  ELEM_OPT_TV( 0x32, GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI" );
7964
7965
0
  ELEM_OPT_TLV( 0x30, GSM_A_PDU_TYPE_GM, DE_QOS, " - Requested new QoS" );
7966
7967
0
  ELEM_OPT_TLV( 0x31, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, " - New TFT" );
7968
7969
0
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
7970
7971
0
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
7972
7973
0
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
7974
7975
0
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
7976
7977
0
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
7978
7979
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
7980
0
}
7981
7982
/*
7983
 * [8] 9.5.11 Modify PDP context accept (MS to network direction)
7984
 * Direction:     MS to network
7985
 */
7986
static void
7987
dtap_sm_mod_pdp_acc_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7988
1
{
7989
1
  uint32_t  curr_offset;
7990
1
  uint32_t  consumed;
7991
1
  unsigned  curr_len;
7992
7993
1
  curr_offset = offset;
7994
1
  curr_len    = len;
7995
7996
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
7997
  /* MS to Network */
7998
1
  pinfo->link_dir = P2P_DIR_UL;
7999
8000
1
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8001
8002
1
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
8003
8004
1
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8005
8006
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8007
1
}
8008
8009
/*
8010
 * [8] 9.5.12 Modify PDP context accept (Network to MS direction)
8011
 * Direction:     Network to MS
8012
 */
8013
static void
8014
dtap_sm_mod_pdp_acc_net(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8015
1
{
8016
1
  uint32_t  curr_offset;
8017
1
  uint32_t  consumed;
8018
1
  unsigned  curr_len;
8019
8020
1
  curr_offset = offset;
8021
1
  curr_len    = len;
8022
8023
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8024
  /* Network to MS */
8025
1
  pinfo->link_dir = P2P_DIR_DL;
8026
8027
1
  ELEM_OPT_TLV( 0x30, GSM_A_PDU_TYPE_GM, DE_QOS, " - Negotiated QoS" );
8028
8029
1
  ELEM_OPT_TV( 0x32, GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI" );
8030
8031
1
  ELEM_OPT_TV_SHORT ( 0x80, GSM_A_PDU_TYPE_GM, DE_RAD_PRIO, " - New radio priority" );
8032
8033
1
  ELEM_OPT_TLV( 0x34, GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL);
8034
8035
1
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8036
8037
1
  ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
8038
8039
1
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
8040
8041
1
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8042
8043
1
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
8044
8045
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8046
1
}
8047
8048
/*
8049
 * [8] 9.5.13 Modify PDP Context Reject
8050
 * Direction:     both
8051
 */
8052
static void
8053
dtap_sm_mod_pdp_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8054
1
{
8055
1
  uint32_t  curr_offset;
8056
1
  uint32_t  consumed;
8057
1
  unsigned  curr_len;
8058
8059
1
  curr_offset = offset;
8060
1
  curr_len    = len;
8061
8062
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8063
  /* Network or the MS; do not reset link_dir in case it was set by lower layers */
8064
  /* pinfo->link_dir = LINK_DIR_UNKNOWN; */
8065
8066
8067
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
8068
8069
1
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8070
8071
1
  ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - Back-off timer value");
8072
8073
1
  ELEM_OPT_TLV(0x6B, GSM_A_PDU_TYPE_GM, DE_RE_ATTEMPT_IND, NULL);
8074
8075
1
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
8076
8077
1
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8078
8079
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8080
1
}
8081
8082
/*
8083
 * [8] 9.5.14 Deactivate PDP context request
8084
 * Direction:     both
8085
 */
8086
static void
8087
dtap_sm_deact_pdp_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8088
0
{
8089
0
  uint32_t  curr_offset;
8090
0
  uint32_t  consumed;
8091
0
  unsigned  curr_len;
8092
8093
0
  curr_offset = offset;
8094
0
  curr_len    = len;
8095
8096
0
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8097
0
  pinfo->link_dir = LINK_DIR_UNKNOWN;
8098
8099
0
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
8100
8101
0
  ELEM_OPT_TV_SHORT( 0x90, GSM_A_PDU_TYPE_GM, DE_TEAR_DOWN_IND, NULL);
8102
8103
0
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8104
8105
0
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8106
8107
0
  ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
8108
8109
0
  ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
8110
8111
0
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8112
8113
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8114
0
}
8115
8116
/*
8117
 * [8] 9.5.15 Deactivate PDP context accept
8118
 * Direction:     both
8119
 */
8120
static void
8121
dtap_sm_deact_pdp_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8122
0
{
8123
0
  uint32_t  curr_offset;
8124
0
  uint32_t  consumed;
8125
0
  unsigned  curr_len;
8126
8127
0
  curr_offset = offset;
8128
0
  curr_len    = len;
8129
8130
0
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8131
0
  pinfo->link_dir = LINK_DIR_UNKNOWN;
8132
8133
0
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8134
8135
0
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8136
8137
0
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8138
8139
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8140
0
}
8141
8142
/*
8143
 * [8] 9.5.15a Request Secondary PDP Context Activation
8144
 * Direction:     network to MS
8145
 */
8146
static void
8147
dtap_sm_req_sec_pdp_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8148
4
{
8149
4
  uint32_t  curr_offset;
8150
4
  uint32_t  consumed;
8151
4
  unsigned  curr_len;
8152
8153
4
  curr_offset = offset;
8154
4
  curr_len    = len;
8155
8156
4
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8157
4
  pinfo->link_dir = P2P_DIR_DL;
8158
8159
  /* Required QoS Quality of service 10.5.6.5 M LV 13-17 */
8160
4
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_QOS, " - Required QoS", ei_gsm_a_gm_missing_mandatory_element);
8161
8162
  /* Linked TI Linked TI 10.5.6.7 M LV 2-3 */
8163
4
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_LINKED_TI, NULL, ei_gsm_a_gm_missing_mandatory_element);
8164
8165
  /* 36 TFT Traffic Flow Template 10.5.6.12 O TLV 3-257 */
8166
4
  ELEM_OPT_TLV( 0x36, GSM_A_PDU_TYPE_GM, DE_TRAFFIC_FLOW_TEMPLATE, NULL);
8167
8168
  /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
8169
3
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8170
8171
  /* C- WLAN offload acceptability 10.5.6.20 O TV 1 */
8172
3
  ELEM_OPT_TV_SHORT(0xC0 , GSM_A_PDU_TYPE_GM, DE_SM_WLAN_OFFLOAD_ACCEPT, " - WLAN offload indication");
8173
8174
3
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
8175
8176
3
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8177
8178
3
  ELEM_OPT_TLV(0x5C, GSM_A_PDU_TYPE_GM, DE_EXT_QOS, NULL);
8179
8180
3
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8181
3
}
8182
8183
/*
8184
 * [8] 9.5.15b Request Secondary PDP Context Activation Reject
8185
 * Direction:     MS to network
8186
 */
8187
static void
8188
dtap_sm_req_sec_pdp_act_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8189
0
{
8190
0
  uint32_t  curr_offset;
8191
0
  uint32_t  consumed;
8192
0
  unsigned  curr_len;
8193
8194
0
  curr_offset = offset;
8195
0
  curr_len    = len;
8196
8197
0
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8198
0
  pinfo->link_dir = P2P_DIR_UL;
8199
8200
  /* SM cause SM cause 10.5.6.6 M V 1 */
8201
0
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
8202
8203
  /* 27 Protocol configuration options Protocol configuration options 10.5.6.3 O TLV 3 - 253 */
8204
0
  ELEM_OPT_TLV( 0x27, GSM_A_PDU_TYPE_GM, DE_PRO_CONF_OPT, NULL);
8205
8206
0
  ELEM_OPT_TLV(0x33, GSM_A_PDU_TYPE_GM, DE_NBIFOM_CONT, NULL);
8207
8208
0
  ELEM_OPT_TLV_E(0x7B, GSM_A_PDU_TYPE_GM, DE_EXT_PRO_CONF_OPT, NULL);
8209
8210
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8211
0
}
8212
8213
/*
8214
 * [8] 9.5.16a Notification
8215
 * Direction:     network to MS
8216
 */
8217
static void
8218
dtap_sm_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8219
1
{
8220
1
  uint32_t  curr_offset;
8221
1
  uint32_t  consumed;
8222
1
  unsigned  curr_len;
8223
8224
1
  curr_offset = offset;
8225
1
  curr_len    = len;
8226
8227
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8228
1
  pinfo->link_dir = P2P_DIR_DL;
8229
8230
1
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_SM_NOTIF_IND, NULL, ei_gsm_a_gm_missing_mandatory_element);
8231
8232
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8233
1
}
8234
8235
/*
8236
 * [8] 9.5.21 SM Status
8237
 * Direction:     both
8238
 */
8239
static void
8240
dtap_sm_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8241
1
{
8242
1
  uint32_t  curr_offset;
8243
1
  uint32_t  consumed;
8244
1
  unsigned  curr_len;
8245
8246
1
  curr_offset = offset;
8247
1
  curr_len    = len;
8248
8249
1
  pinfo->p2p_dir = P2P_DIR_UNKNOWN;
8250
1
  pinfo->link_dir = LINK_DIR_UNKNOWN;
8251
8252
1
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
8253
8254
1
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8255
1
}
8256
8257
/*
8258
 * [9] 9.5.22 Activate MBMS Context Request
8259
 * Direction:     MS to network
8260
 */
8261
static void
8262
dtap_sm_act_mbms_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8263
11
{
8264
11
  uint32_t  curr_offset;
8265
11
  uint32_t  consumed;
8266
11
  unsigned  curr_len;
8267
8268
11
  curr_offset = offset;
8269
11
  curr_len    = len;
8270
8271
11
  pinfo->p2p_dir = P2P_DIR_RECV;
8272
8273
  /* Requested MBMS NSAPI Enhanced Network service access point identifier 10.5.6.16 M V */
8274
11
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_ENH_NSAPI, " - Requested MBMS NSAPI", ei_gsm_a_gm_missing_mandatory_element);
8275
8276
  /* Requested LLC SAPI LLC service access point identifier 10.5.6.9 M V 1 */
8277
11
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Requested LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
8278
8279
  /* Supported MBMS bearer capabilities MBMS bearer capabilities 10.5.6.14 M LV 2 - 3 */
8280
11
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_MBMS_BEARER_CAP, NULL, ei_gsm_a_gm_missing_mandatory_element);
8281
8282
  /* Requested multicast address Packet data protocol address 10.5.6.4 M LV 3 - 19 */
8283
11
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Requested multicast address", ei_gsm_a_gm_missing_mandatory_element);
8284
8285
  /* Access point name Access point name 10.5.6.1 M LV 2 - 101 */
8286
11
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL, ei_gsm_a_gm_missing_mandatory_element);
8287
8288
  /* 35 MBMS protocol configuration options MBMS protocol configuration options 10.5.6.15 O TLV 3 - 253 */
8289
11
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8290
8291
11
  ELEM_OPT_TV_SHORT(0xC0, GSM_A_PDU_TYPE_GM, DE_DEVICE_PROPERTIES, NULL);
8292
8293
11
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8294
11
}
8295
8296
/*
8297
 * [9] 9.5.23 Activate MBMS Context Accept
8298
 * Direction:     network to MS
8299
 */
8300
static void
8301
dtap_sm_act_mbms_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8302
3
{
8303
3
  uint32_t  curr_offset;
8304
3
  uint32_t  consumed;
8305
3
  unsigned  curr_len;
8306
8307
3
  curr_offset = offset;
8308
3
  curr_len    = len;
8309
8310
3
  pinfo->p2p_dir = P2P_DIR_SENT;
8311
8312
3
  ELEM_MAND_LV(  GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_gsm_a_gm_missing_mandatory_element);
8313
8314
3
  ELEM_MAND_V(  GSM_A_PDU_TYPE_GM, DE_LLC_SAPI, " - Negotiated LLC SAPI", ei_gsm_a_gm_missing_mandatory_element);
8315
8316
3
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8317
8318
3
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8319
3
}
8320
8321
/*
8322
 * [9] 9.5.24 Activate MBMS Context Reject
8323
 * Direction:     network to MS
8324
 */
8325
static void
8326
dtap_sm_act_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8327
2
{
8328
2
  uint32_t  curr_offset;
8329
2
  uint32_t  consumed;
8330
2
  unsigned  curr_len;
8331
8332
2
  curr_offset = offset;
8333
2
  curr_len    = len;
8334
8335
2
  pinfo->p2p_dir = P2P_DIR_SENT;
8336
8337
2
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
8338
8339
2
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8340
8341
2
  ELEM_OPT_TLV(0x37, GSM_A_PDU_TYPE_GM, DE_GPRS_TIMER_3, " - T3396 value");
8342
8343
2
  ELEM_OPT_TLV(0x6B, GSM_A_PDU_TYPE_GM, DE_RE_ATTEMPT_IND, NULL);
8344
8345
2
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8346
2
}
8347
8348
/*
8349
 * [9] 9.5.25 Request MBMS Context Activation
8350
 * Direction:     network to MS
8351
 */
8352
static void
8353
dtap_sm_req_mbms_act(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8354
0
{
8355
0
  uint32_t  curr_offset;
8356
0
  uint32_t  consumed;
8357
0
  unsigned  curr_len;
8358
8359
0
  curr_offset = offset;
8360
0
  curr_len    = len;
8361
8362
0
  pinfo->p2p_dir = P2P_DIR_SENT;
8363
8364
0
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_NET_SAPI, " - Linked NSAPI", ei_gsm_a_gm_missing_mandatory_element);
8365
8366
0
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_PD_PRO_ADDR, " - Offered multicast address", ei_gsm_a_gm_missing_mandatory_element);
8367
8368
0
  ELEM_MAND_LV( GSM_A_PDU_TYPE_GM, DE_ACC_POINT_NAME, NULL, ei_gsm_a_gm_missing_mandatory_element);
8369
8370
0
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8371
8372
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8373
0
}
8374
8375
/*
8376
 * [8] 9.5.26 Request MBMS Context Activation Reject
8377
 * Direction:     MS to network
8378
 */
8379
static void
8380
dtap_sm_req_mbms_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
8381
0
{
8382
0
  uint32_t  curr_offset;
8383
0
  uint32_t  consumed;
8384
0
  unsigned  curr_len;
8385
8386
0
  curr_offset = offset;
8387
0
  curr_len    = len;
8388
8389
0
  pinfo->p2p_dir = P2P_DIR_RECV;
8390
8391
0
  ELEM_MAND_V( GSM_A_PDU_TYPE_GM, DE_SM_CAUSE, NULL, ei_gsm_a_gm_missing_mandatory_element);
8392
8393
0
  ELEM_OPT_TLV( 0x35, GSM_A_PDU_TYPE_GM, DE_MBMS_PROT_CONF_OPT, NULL);
8394
8395
0
  EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_gm_extraneous_data);
8396
0
}
8397
8398
350
#define NUM_GSM_DTAP_MSG_GMM array_length(gsm_a_dtap_msg_gmm_strings)
8399
static int ett_gsm_dtap_msg_gmm[NUM_GSM_DTAP_MSG_GMM];
8400
static void (* const dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len) = {
8401
  dtap_gmm_attach_req,    /* Attach Request */
8402
  dtap_gmm_attach_acc,    /* Attach Accept */
8403
  dtap_gmm_attach_com,    /* Attach Complete */
8404
  dtap_gmm_attach_rej,    /* Attach Reject */
8405
  dtap_gmm_detach_req,    /* Detach Request */
8406
  dtap_gmm_detach_acc,    /* Detach Accept */
8407
  dtap_gmm_rau_req,   /* Routing Area Update Request */
8408
  dtap_gmm_rau_acc,   /* Routing Area Update Accept */
8409
  dtap_gmm_rau_com,   /* Routing Area Update Complete */
8410
  dtap_gmm_rau_rej,   /* Routing Area Update Reject */
8411
  dtap_gmm_service_req,   /* Service Request */
8412
  dtap_gmm_service_acc,   /* Service Accept */
8413
  dtap_gmm_service_rej,   /* Service Reject */
8414
  dtap_gmm_ptmsi_realloc_cmd, /* P-TMSI Reallocation Command */
8415
  dtap_gmm_ptmsi_realloc_com, /* P-TMSI Reallocation Complete */
8416
  dtap_gmm_auth_ciph_req,   /* Authentication and Ciphering Req */
8417
  dtap_gmm_auth_ciph_resp,  /* Authentication and Ciphering Resp */
8418
  dtap_gmm_auth_ciph_rej,   /* Authentication and Ciphering Rej */
8419
  dtap_gmm_ident_req,   /* Identity Request */
8420
  dtap_gmm_ident_res,   /* Identity Response */
8421
  dtap_gmm_auth_ciph_fail,  /* Authentication and Ciphering Failure */
8422
  dtap_gmm_status,    /* GMM Status */
8423
  dtap_gmm_information,   /* GMM Information */
8424
  NULL, /* NONE */
8425
};
8426
8427
434
#define NUM_GSM_DTAP_MSG_SM array_length(gsm_a_dtap_msg_sm_strings)
8428
static int ett_gsm_dtap_msg_sm[NUM_GSM_DTAP_MSG_SM];
8429
static void (* const dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len) = {
8430
  dtap_sm_act_pdp_req,    /* Activate PDP Context Request */
8431
  dtap_sm_act_pdp_acc,    /* Activate PDP Context Accept */
8432
  dtap_sm_act_pdp_rej,    /* Activate PDP Context Reject */
8433
  dtap_sm_req_pdp_act,    /* Request PDP Context Activation */
8434
  dtap_sm_req_pdp_act_rej,  /* Request PDP Context Activation rej. */
8435
  dtap_sm_deact_pdp_req,    /* Deactivate PDP Context Request */
8436
  dtap_sm_deact_pdp_acc,    /* Deactivate PDP Context Accept */
8437
  dtap_sm_mod_pdp_req_net,  /* Modify PDP Context Request(Network to MS direction) */
8438
  dtap_sm_mod_pdp_acc_ms,   /* Modify PDP Context Accept (MS to network direction) */
8439
  dtap_sm_mod_pdp_req_ms,   /* Modify PDP Context Request(MS to network direction) */
8440
  dtap_sm_mod_pdp_acc_net,  /* Modify PDP Context Accept (Network to MS direction) */
8441
  dtap_sm_mod_pdp_rej,    /* Modify PDP Context Reject */
8442
  dtap_sm_act_sec_pdp_req,  /* Activate Secondary PDP Context Request */
8443
  dtap_sm_act_sec_pdp_acc,  /* Activate Secondary PDP Context Accept */
8444
  dtap_sm_act_sec_pdp_rej,  /* Activate Secondary PDP Context Reject */
8445
  NULL,       /* Reserved: was allocated in earlier phases of the protocol */
8446
  NULL,       /* Reserved: was allocated in earlier phases of the protocol */
8447
  NULL,       /* Reserved: was allocated in earlier phases of the protocol */
8448
  NULL,       /* Reserved: was allocated in earlier phases of the protocol */
8449
  NULL,       /* Reserved: was allocated in earlier phases of the protocol */
8450
  dtap_sm_status,     /* SM Status */
8451
  dtap_sm_act_mbms_req,   /* Activate MBMS Context Request */
8452
  dtap_sm_act_mbms_acc,   /* Activate MBMS Context Accept */
8453
  dtap_sm_act_mbms_rej,   /* Activate MBMS Context Reject */
8454
  dtap_sm_req_mbms_act,   /* Request MBMS Context Activation */
8455
  dtap_sm_req_mbms_rej,   /* Request MBMS Context Activation Reject */
8456
  dtap_sm_req_sec_pdp_act,  /* Request Secondary PDP Context Activation */
8457
  dtap_sm_req_sec_pdp_act_rej,  /* Request Secondary PDP Context Activation Reject */
8458
  dtap_sm_notif,                /* Notification */
8459
  NULL, /* NONE */
8460
};
8461
8462
void
8463
get_gmm_msg_params(uint8_t oct, const char **msg_str, int *ett_tree, int *hf_idx, msg_fcn *dtap_msg_fcn)
8464
541
{
8465
541
  int idx;
8466
8467
541
  *msg_str      = try_val_to_str_idx_ext((uint32_t) (oct & DTAP_GMM_IEI_MASK), &gsm_a_dtap_msg_gmm_strings_ext, &idx);
8468
541
  *hf_idx       = hf_gsm_a_dtap_msg_gmm_type;
8469
541
  if (*msg_str != NULL) {
8470
527
    *ett_tree     = ett_gsm_dtap_msg_gmm[idx];
8471
527
    *dtap_msg_fcn = dtap_msg_gmm_fcn[idx];
8472
527
  }
8473
8474
541
  return;
8475
541
}
8476
8477
void
8478
get_sm_msg_params(uint8_t oct, const char **msg_str, int *ett_tree, int *hf_idx, msg_fcn *dtap_msg_fcn)
8479
130
{
8480
130
  int idx;
8481
8482
130
  *msg_str      = try_val_to_str_idx_ext((uint32_t) (oct & DTAP_SM_IEI_MASK), &gsm_a_dtap_msg_sm_strings_ext, &idx);
8483
130
  *hf_idx       = hf_gsm_a_dtap_msg_sm_type;
8484
130
  if (*msg_str != NULL) {
8485
83
    *ett_tree     = ett_gsm_dtap_msg_sm[idx];
8486
83
    *dtap_msg_fcn = dtap_msg_sm_fcn[idx];
8487
83
  }
8488
8489
130
  return;
8490
130
}
8491
8492
/* Register the protocol with Wireshark */
8493
void
8494
proto_register_gsm_a_gm(void)
8495
14
{
8496
14
  unsigned i;
8497
14
  unsigned last_offset;
8498
8499
  /* Setup list of header fields */
8500
8501
14
  static hf_register_info hf[] = {
8502
14
    { &hf_gsm_a_dtap_msg_gmm_type,
8503
14
      { "DTAP GPRS Mobility Management Message Type", "gsm_a.dtap.msg_gmm_type",
8504
14
        FT_UINT8, BASE_HEX | BASE_EXT_STRING, &gsm_a_dtap_msg_gmm_strings_ext, 0x0,
8505
14
        NULL, HFILL }
8506
14
    },
8507
14
    { &hf_gsm_a_dtap_msg_sm_type,
8508
14
      { "DTAP GPRS Session Management Message Type",  "gsm_a.dtap.msg_sm_type",
8509
14
        FT_UINT8, BASE_HEX | BASE_EXT_STRING, &gsm_a_dtap_msg_sm_strings_ext, 0x0,
8510
14
        NULL, HFILL }
8511
14
    },
8512
14
    { &hf_gsm_a_gm_elem_id,
8513
14
      { "Element ID", "gsm_a.gm.elem_id",
8514
14
        FT_UINT8, BASE_HEX, NULL, 0,
8515
14
        NULL, HFILL }
8516
14
    },
8517
14
    { &hf_gsm_a_sm_qos_delay_cls,
8518
14
      { "Quality of Service Delay class", "gsm_a.gm.sm.qos.delay_cls",
8519
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_delay_cls_vals), 0x38,
8520
14
        NULL, HFILL }
8521
14
    },
8522
14
    { &hf_gsm_a_sm_qos_reliability_cls,
8523
14
      { "Reliability class", "gsm_a.gm.sm.qos.reliability_cls",
8524
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_reliability_vals), 0x07,
8525
14
        NULL, HFILL }
8526
14
    },
8527
14
    { &hf_gsm_a_sm_qos_traffic_cls,
8528
14
      { "Traffic class", "gsm_a.gm.sm.qos.traffic_cls",
8529
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traffic_cls_vals), 0xe0,
8530
14
        NULL, HFILL }
8531
14
    },
8532
14
    { &hf_gsm_a_sm_qos_del_order,
8533
14
      { "Delivery order", "gsm_a.gm.sm.qos.del_order",
8534
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_del_order_vals), 0x18,
8535
14
        NULL, HFILL }
8536
14
    },
8537
14
    { &hf_gsm_a_sm_qos_del_of_err_sdu,
8538
14
      { "Delivery of erroneous SDUs", "gsm_a.gm.sm.qos.del_of_err_sdu",
8539
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_del_of_err_sdu_vals), 0x07,
8540
14
        NULL, HFILL }
8541
14
    },
8542
14
    { &hf_gsm_a_sm_qos_ber,
8543
14
      { "Residual Bit Error Rate (BER)", "gsm_a.gm.sm.qos.ber",
8544
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_ber_vals), 0xf0,
8545
14
        NULL, HFILL }
8546
14
    },
8547
14
    { &hf_gsm_a_sm_qos_sdu_err_rat,
8548
14
      { "SDU error ratio", "gsm_a.gm.sm.qos.sdu_err_rat",
8549
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_sdu_err_rat_vals), 0x0f,
8550
14
        NULL, HFILL }
8551
14
    },
8552
14
    { &hf_gsm_a_sm_qos_traff_hdl_pri,
8553
14
      { "Traffic handling priority", "gsm_a.gm.sm.qos.traff_hdl_pri",
8554
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_qos_traff_hdl_pri_vals), 0x03,
8555
14
        NULL, HFILL }
8556
14
    },
8557
14
    { &hf_gsm_a_gmm_split_pg_cycle_code,
8558
14
      { "SPLIT PG CYCLE CODE", "gsm_a.gm.gmm.split_pg_cycle_code",
8559
14
        FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gsm_a_gmm_split_pg_cycle_code_strings_ext, 0x00,
8560
14
        NULL, HFILL }
8561
14
    },
8562
14
    { &hf_gsm_a_gmm_split_on_ccch,
8563
14
      { "SPLIT on CCCH", "gsm_a.gm.gmm.split_on_ccch",
8564
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_split_on_ccch_value), 0x08,
8565
14
        NULL, HFILL }
8566
14
    },
8567
14
    { &hf_gsm_a_gmm_non_drx_timer,
8568
14
      { "Non-DRX timer", "gsm_a.gm.gmm.non_drx_timer",
8569
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gmm_non_drx_timer_strings), 0x07,
8570
14
        NULL, HFILL }
8571
14
    },
8572
14
    { &hf_gsm_a_gmm_cn_spec_drx_cycle_len_coef,
8573
14
      { "CN Specific DRX cycle length coefficient", "gsm_a.gm.gmm.cn_spec_drx_cycle_len_coef",
8574
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_gmm_cn_spec_drx_cycle_len_coef_strings), 0xf0,
8575
14
        NULL, HFILL }
8576
14
    },
8577
14
    { &hf_gsm_a_sm_tft_op_code,
8578
14
      { "TFT operation code", "gsm_a.gm.sm.tft.op_code",
8579
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_tft_op_code_vals), 0xe0,
8580
14
        NULL, HFILL }
8581
14
    },
8582
14
    { &hf_gsm_a_sm_tft_e_bit,
8583
14
      { "E bit", "gsm_a.gm.sm.tft.e_bit",
8584
14
        FT_BOOLEAN, 8, TFS(&gsm_a_sm_tft_e_bit), 0x10,
8585
14
        NULL, HFILL }
8586
14
    },
8587
14
    { &hf_gsm_a_sm_tft_pkt_flt,
8588
14
      { "Number of packet filters", "gsm_a.gm.sm.tft.pkt_flt",
8589
14
        FT_UINT8, BASE_DEC, NULL, 0x0f,
8590
14
        NULL, HFILL }
8591
14
    },
8592
14
    { &hf_gsm_a_sm_tft_pkt_flt_dir,
8593
14
      { "Packet filter direction", "gsm_a.gm.sm.tft.pkt_flt_dir",
8594
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_tft_pkt_flt_dir_vals), 0x30,
8595
14
        NULL, HFILL }
8596
14
    },
8597
14
    { &hf_gsm_a_sm_tft_pkt_flt_id,
8598
14
      { "Packet filter identifier", "gsm_a.gm.sm.tft.pkt_flt_id",
8599
14
        FT_UINT8, BASE_DEC, NULL, 0x0f,
8600
14
        NULL, HFILL }
8601
14
    },
8602
14
    { &hf_gsm_a_sm_ip4_address,
8603
14
      { "IPv4 address", "gsm_a.gm.sm.ip4_address",
8604
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
8605
14
        NULL, HFILL }
8606
14
    },
8607
14
    { &hf_gsm_a_sm_ip4_mask,
8608
14
      { "IPv4 address mask", "gsm_a.gm.sm.ip4_mask",
8609
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
8610
14
        NULL, HFILL }
8611
14
    },
8612
14
    { &hf_gsm_a_sm_ip6_address,
8613
14
      { "IPv6 address", "gsm_a.gm.sm.ip6_address",
8614
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
8615
14
        NULL, HFILL }
8616
14
    },
8617
14
    { &hf_gsm_a_sm_ip6_mask,
8618
14
      { "IPv6 address mask", "gsm_a.gm.sm.ip6_mask",
8619
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
8620
14
        NULL, HFILL }
8621
14
    },
8622
14
    { &hf_gsm_a_sm_ip6_prefix_length,
8623
14
      { "IPv6 prefix length", "gsm_a.gm.sm.ip6_prefix_length",
8624
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
8625
14
        NULL, HFILL }
8626
14
    },
8627
14
    { &hf_gsm_a_sm_tft_protocol_header,
8628
14
      { "Protocol/header", "gsm_a.gm.sm.tft.protocol_header",
8629
14
        FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ipproto_val_ext, 0x0,
8630
14
        NULL, HFILL }
8631
14
    },
8632
14
    { &hf_gsm_a_sm_tft_port,
8633
14
      { "Port", "gsm_a.gm.sm.tft.port",
8634
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
8635
14
        NULL, HFILL }
8636
14
    },
8637
14
    { &hf_gsm_a_sm_tft_port_low,
8638
14
      { "Low limit port", "gsm_a.gm.sm.tft.port_low",
8639
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
8640
14
        NULL, HFILL }
8641
14
    },
8642
14
    { &hf_gsm_a_sm_tft_port_high,
8643
14
      { "High limit port", "gsm_a.gm.sm.tft.port_high",
8644
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
8645
14
        NULL, HFILL }
8646
14
    },
8647
14
    { &hf_gsm_a_sm_tft_security,
8648
14
      { "IPSec security parameter index", "gsm_a.gm.sm.tft.security",
8649
14
        FT_UINT32, BASE_HEX, NULL, 0x0,
8650
14
        NULL, HFILL }
8651
14
    },
8652
14
    { &hf_gsm_a_sm_tft_traffic_class,
8653
14
      { "Type of service/Traffic class field", "gsm_a.gm.sm.tft.traffic_class",
8654
14
        FT_UINT8, BASE_HEX, NULL, 0x0,
8655
14
        NULL, HFILL }
8656
14
    },
8657
14
    { &hf_gsm_a_sm_tft_traffic_mask,
8658
14
      { "Mask field", "gsm_a.gm.sm.tft.traffic_mask",
8659
14
        FT_UINT8, BASE_HEX, NULL, 0x0,
8660
14
        NULL, HFILL }
8661
14
    },
8662
14
    { &hf_gsm_a_sm_tft_flow_label_type,
8663
14
      { "Flow Label Type", "gsm_a.gm.sm.tft.flow_label_type",
8664
14
        FT_UINT24, BASE_HEX, NULL, 0x0FFFFF,
8665
14
        NULL, HFILL }
8666
14
    },
8667
14
    { &hf_gsm_a_sm_tft_param_id,
8668
14
      { "Parameter identifier", "gsm_a.gm.sm.tft.param_id",
8669
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_tft_param_id_vals), 0x0,
8670
14
        NULL, HFILL }
8671
14
    },
8672
14
    { &hf_gsm_a_sm_tft_mac_addr,
8673
14
      { "MAC address", "gsm_a.gm.sm.tft.mac_addr",
8674
14
        FT_ETHER, BASE_NONE, NULL, 0x0,
8675
14
        NULL, HFILL }
8676
14
    },
8677
14
    { &hf_gsm_a_sm_tft_vlan_tag_vid,
8678
14
      { "VID", "gsm_a.gm.sm.tft.vlan_tag_vid",
8679
14
        FT_UINT16, BASE_HEX, NULL, 0x0fff,
8680
14
        NULL, HFILL }
8681
14
    },
8682
14
    { &hf_gsm_a_sm_tft_vlan_tag_pcp,
8683
14
      { "PCP", "gsm_a.gm.sm.tft.vlan_tag_pcp",
8684
14
        FT_UINT8, BASE_HEX, NULL, 0x0e,
8685
14
        NULL, HFILL }
8686
14
    },
8687
14
    { &hf_gsm_a_sm_tft_vlan_tag_dei,
8688
14
      { "DEI", "gsm_a.gm.sm.tft.vlan_tag_dei",
8689
14
        FT_UINT8, BASE_HEX, NULL, 0x01,
8690
14
        NULL, HFILL }
8691
14
    },
8692
14
    { &hf_gsm_a_sm_tft_ethertype,
8693
14
      { "Ethertype", "gsm_a.gm.sm.tft.ethertype",
8694
14
        FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0,
8695
14
        NULL, HFILL }
8696
14
    },
8697
8698
14
    { &hf_gsm_a_gmm_ptmsi_sig,
8699
14
      { "P-TMSI Signature", "gsm_a.gm.gmm.ptmsi_sig",
8700
14
        FT_UINT24, BASE_HEX, NULL, 0x0,
8701
14
        NULL, HFILL }
8702
14
    },
8703
14
    { &hf_gsm_a_gmm_ptmsi_sig2,
8704
14
      { "P-TMSI Signature 2", "gsm_a.gm.gmm.ptmsi_sig2",
8705
14
        FT_UINT24, BASE_HEX, NULL, 0x0,
8706
14
        NULL, HFILL }
8707
14
    },
8708
14
    { &hf_gsm_a_gm_acc_tech_type,
8709
14
      { "Access Technology Type", "gsm_a.gm.gmm.acc_tech_type",
8710
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_acc_tech_type_vals), 0x0,
8711
14
        NULL, HFILL }
8712
14
    },
8713
14
    { &hf_gsm_a_gm_acc_cap_struct_len,
8714
14
      { "Length in bits", "gsm_a.gm.gmm.acc_cap_struct_len",
8715
14
        FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
8716
14
        NULL, HFILL }
8717
14
    },
8718
14
    { &hf_gsm_a_gm_sms_value,
8719
14
      { "SMS_VALUE (Switch-Measure-Switch)", "gsm_a.gm.gmm.sms",
8720
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0,
8721
14
        NULL, HFILL }
8722
14
    },
8723
14
    { &hf_gsm_a_gm_sm_value,
8724
14
      { "(SM_VALUE) Switch-Measure", "gsm_a.gm.gmm.sm",
8725
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sms_vals), 0x0,
8726
14
        NULL, HFILL }
8727
14
    },
8728
14
    { &hf_gsm_a_gm_link_dir,
8729
14
      { "Link direction", "gsm_a.gm.sm.link_dir",
8730
14
        FT_INT32, BASE_DEC, VALS(gsm_a_gm_link_dir_vals), 0x0,
8731
14
        NULL, HFILL }
8732
14
    },
8733
14
    { &hf_gsm_a_gm_cause,
8734
14
      { "GMM Cause", "gsm_a.gm.gmm.cause",
8735
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmm_cause_vals), 0x0,
8736
14
        NULL, HFILL }
8737
14
    },
8738
14
    { &hf_gsm_a_gm_add_upd_type,
8739
14
      { "Additional update type", "gsm_a.gm.gmm.add_upd_type",
8740
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_add_upd_type_value), 0x0,
8741
14
        NULL, HFILL }
8742
14
    },
8743
14
    { &hf_gsm_a_gm_fop,
8744
14
      { "Follow-on proceed", "gsm_a.gm.gmm.fop",
8745
14
        FT_BOOLEAN, 8, NULL, 0x08,
8746
14
        NULL, HFILL }
8747
14
    },
8748
14
    { &hf_gsm_a_gm_res_of_attach,
8749
14
      { "Result of attach", "gsm_a.gm.gmm.res_of_attach",
8750
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_res_of_attach_vals), 0x07,
8751
14
        NULL, HFILL }
8752
14
    },
8753
14
    { &hf_gsm_a_gm_type_of_ciph_alg,
8754
14
      { "Type of ciphering algorithm", "gsm_a.gm.gmm.type_of_ciph_alg",
8755
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_ciph_alg_vals), 0x07,
8756
14
        NULL, HFILL }
8757
14
    },
8758
14
    { &hf_gsm_a_gm_type_of_integ_alg,
8759
14
      { "Type of integrity algorithm", "gsm_a.gm.gmm.type_of_integ_alg",
8760
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_integ_alg_vals), 0x07,
8761
14
        NULL, HFILL }
8762
14
    },
8763
14
    { &hf_gsm_a_gm_imeisv_req,
8764
14
      { "IMEISV request", "gsm_a.gm.gmm.imeisv_req",
8765
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_gm_imeisv_req_vals), 0x00,
8766
14
        NULL, HFILL }
8767
14
    },
8768
14
    { &hf_gsm_a_gm_nsapi,
8769
14
      { "NSAPI", "gsm_a.gm.gmm.nsapi",
8770
14
        FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
8771
14
        NULL, HFILL }
8772
14
    },
8773
14
    { &hf_gsm_a_gm_ac_ref_nr,
8774
14
      { "A&C reference number", "gsm_a.gm.gmm.ac_ref_nr",
8775
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
8776
14
        NULL, HFILL }
8777
14
    },
8778
14
    { &hf_gsm_a_gm_force_to_standby,
8779
14
      { "Force to standby", "gsm_a.gm.gmm.force_to_standby",
8780
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_gm_force_to_standby_vals), 0x00,
8781
14
        NULL, HFILL }
8782
14
    },
8783
14
    { &hf_gsm_a_gm_serv_type,
8784
14
      { "Service type", "gsm_a.gm.gmm.serv_type",
8785
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_serv_type_vals), 0x00,
8786
14
        NULL, HFILL }
8787
14
    },
8788
14
    { &hf_gsm_a_gm_for,
8789
14
      { "Follow-on request pending", "gsm_a.gm.gmm.for",
8790
14
        FT_BOOLEAN, 8, NULL, 0x08,
8791
14
        NULL, HFILL }
8792
14
    },
8793
14
    { &hf_gsm_a_gm_type_of_attach,
8794
14
      { "Type of attach", "gsm_a.gm.gmm.type_of_attach",
8795
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_attach_vals), 0x07,
8796
14
        NULL, HFILL }
8797
14
    },
8798
14
    { &hf_gsm_a_gm_tmsi_flag,
8799
14
      { "TMSI flag", "gsm_a.gm.gmm.tmsi_flag",
8800
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_tmsi_flag_value), 0x01,
8801
14
        NULL, HFILL }
8802
14
    },
8803
14
    { &hf_gsm_a_gm_power_off,
8804
14
      { "Power off", "gsm_a.gm.gmm.power_off",
8805
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_power_off_value), 0x08,
8806
14
        NULL, HFILL }
8807
14
    },
8808
14
    { &hf_gsm_a_gm_type_of_detach_mo,
8809
14
      { "Type of detach", "gsm_a.gm.gmm.type_of_detach",
8810
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_detach_mo_vals), 0x07,
8811
14
        NULL, HFILL }
8812
14
    },
8813
14
    { &hf_gsm_a_gm_type_of_detach_mt,
8814
14
      { "Type of detach", "gsm_a.gm.gmm.type_of_detach",
8815
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_detach_mt_vals), 0x07,
8816
14
        NULL, HFILL }
8817
14
    },
8818
14
    { &hf_gsm_a_gm_update_type,
8819
14
      { "Update type", "gsm_a.gm.gmm.update_type",
8820
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_update_type_vals), 0x07,
8821
14
        NULL, HFILL }
8822
14
    },
8823
14
    { &hf_gsm_a_gm_gprs_timer,
8824
14
      { "GPRS Timer", "gsm_a.gm.gmm.gprs_timer",
8825
14
        FT_UINT8, BASE_HEX, NULL, 0x0,
8826
14
        NULL, HFILL }
8827
14
    },
8828
14
    { &hf_gsm_a_gm_gprs_timer_unit,
8829
14
      { "Unit", "gsm_a.gm.gmm.gprs_timer_unit",
8830
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gprs_timer_unit_vals), 0xe0,
8831
14
        NULL, HFILL }
8832
14
    },
8833
14
    { &hf_gsm_a_gm_gprs_timer_value,
8834
14
      { "Timer value", "gsm_a.gm.gmm.gprs_timer_value",
8835
14
        FT_UINT8, BASE_DEC, NULL, 0x1f,
8836
14
        NULL, HFILL }
8837
14
    },
8838
14
    { &hf_gsm_a_gm_gprs_timer2,
8839
14
      { "GPRS Timer", "gsm_a.gm.gmm.gprs_timer2",
8840
14
        FT_UINT8, BASE_HEX, NULL, 0x0,
8841
14
        NULL, HFILL }
8842
14
    },
8843
14
    { &hf_gsm_a_gm_gprs_timer2_unit,
8844
14
      { "Unit", "gsm_a.gm.gmm.gprs_timer2_unit",
8845
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gprs_timer_unit_vals), 0xe0,
8846
14
        NULL, HFILL }
8847
14
    },
8848
14
    { &hf_gsm_a_gm_gprs_timer2_value,
8849
14
      { "Timer value", "gsm_a.gm.gmm.gprs_timer2_value",
8850
14
        FT_UINT8, BASE_DEC, NULL, 0x1f,
8851
14
        NULL, HFILL }
8852
14
    },
8853
14
    { &hf_gsm_a_gm_gprs_timer3,
8854
14
      { "GPRS Timer", "gsm_a.gm.gmm.gprs_timer3",
8855
14
        FT_UINT8, BASE_HEX, NULL, 0x0,
8856
14
        NULL, HFILL }
8857
14
    },
8858
14
    { &hf_gsm_a_gm_gprs_timer3_unit,
8859
14
      { "Unit", "gsm_a.gm.gmm.gprs_timer3_unit",
8860
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gprs_timer3_unit_vals), 0xe0,
8861
14
        NULL, HFILL }
8862
14
    },
8863
14
    { &hf_gsm_a_gm_gprs_timer3_value,
8864
14
      { "Timer value", "gsm_a.gm.gmm.gprs_timer3_value",
8865
14
        FT_UINT8, BASE_DEC, NULL, 0x1f,
8866
14
        NULL, HFILL }
8867
14
    },
8868
14
    { &hf_gsm_a_gm_nsapi_5_ul_stat,
8869
14
      { "NSAPI(5) uplink status", "gsm_a.gm.gmm.nsapi_5_ul_stat",
8870
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8871
14
        NULL, HFILL }
8872
14
    },
8873
14
    { &hf_gsm_a_gm_nsapi_6_ul_stat,
8874
14
      { "NSAPI(6) uplink status", "gsm_a.gm.gmm.nsapi_6_ul_stat",
8875
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8876
14
        NULL, HFILL }
8877
14
    },
8878
14
    { &hf_gsm_a_gm_nsapi_7_ul_stat,
8879
14
      { "NSAPI(7) uplink status", "gsm_a.gm.gmm.nsapi_7_ul_stat",
8880
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8881
14
        NULL, HFILL }
8882
14
    },
8883
14
    { &hf_gsm_a_gm_nsapi_8_ul_stat,
8884
14
      { "NSAPI(8) uplink status", "gsm_a.gm.gmm.nsapi_8_ul_stat",
8885
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8886
14
        NULL, HFILL }
8887
14
    },
8888
14
    { &hf_gsm_a_gm_nsapi_9_ul_stat,
8889
14
      { "NSAPI(9) uplink status", "gsm_a.gm.gmm.nsapi_9_ul_stat",
8890
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8891
14
        NULL, HFILL }
8892
14
    },
8893
14
    { &hf_gsm_a_gm_nsapi_10_ul_stat,
8894
14
      { "NSAPI(10) uplink status", "gsm_a.gm.gmm.nsapi_10_ul_stat",
8895
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8896
14
        NULL, HFILL }
8897
14
    },
8898
14
    { &hf_gsm_a_gm_nsapi_11_ul_stat,
8899
14
      { "NSAPI(11) uplink status", "gsm_a.gm.gmm.nsapi_11_ul_stat",
8900
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8901
14
        NULL, HFILL }
8902
14
    },
8903
14
    { &hf_gsm_a_gm_nsapi_12_ul_stat,
8904
14
      { "NSAPI(12) uplink status", "gsm_a.gm.gmm.nsapi_12_ul_stat",
8905
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8906
14
        NULL, HFILL }
8907
14
    },
8908
14
    { &hf_gsm_a_gm_nsapi_13_ul_stat,
8909
14
      { "NSAPI(13) uplink status", "gsm_a.gm.gmm.nsapi_13_ul_stat",
8910
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8911
14
        NULL, HFILL }
8912
14
    },
8913
14
    { &hf_gsm_a_gm_nsapi_14_ul_stat,
8914
14
      { "NSAPI(14) uplink status", "gsm_a.gm.gmm.nsapi_14_ul_stat",
8915
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8916
14
        NULL, HFILL }
8917
14
    },
8918
14
    { &hf_gsm_a_gm_nsapi_15_ul_stat,
8919
14
      { "NSAPI(15) uplink status", "gsm_a.gm.gmm.nsapi_15_ul_stat",
8920
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_nsapi_ul_stat_vals), 0x0,
8921
14
        NULL, HFILL }
8922
14
    },
8923
14
    { &hf_gsm_a_gm_device_prop_low_prio,
8924
14
      { "Low priority", "gsm_a.gm.gmm.device_prop_low_prio",
8925
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_device_prop_low_prio_value), 0x0,
8926
14
        NULL, HFILL }
8927
14
    },
8928
14
    { &hf_gsm_a_gm_apn,
8929
14
      { "APN", "gsm_a.gm.sm.apn",
8930
14
        FT_STRING,BASE_NONE, NULL,0x0,
8931
14
        NULL, HFILL }
8932
14
    },
8933
14
    { &hf_gsm_a_gm_pco_pid,
8934
14
      { "Protocol or Container ID", "gsm_a.gm.sm.pco_pid",
8935
14
        FT_UINT16, BASE_HEX, NULL, 0x0,
8936
14
        NULL, HFILL }
8937
14
    },
8938
14
    { &hf_gsm_a_gm_pco_app_spec_info,
8939
14
      { "Application specific information", "gsm_a.gm.sm.app_spec_info",
8940
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
8941
14
        NULL, HFILL }
8942
14
    },
8943
14
    { &hf_gsm_a_gm_type_of_identity,
8944
14
      { "Type of identity", "gsm_a.gm.gmm.type_of_identity",
8945
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_type_of_identity_vals), 0x07,
8946
14
        NULL, HFILL }
8947
14
    },
8948
14
    { &hf_gsm_a_gm_rac,
8949
14
      { "Routing Area Code (RAC)", "gsm_a.gm.gmm.rac",
8950
14
        FT_UINT8, BASE_HEX_DEC, NULL, 0x00,
8951
14
        NULL, HFILL }
8952
14
    },
8953
14
    { &hf_gsm_a_gm_mta_e,
8954
14
      { "MTA-E", "gsm_a.gm.gmm.mta_e",
8955
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_mta_e_vals), 0x80,
8956
14
        NULL, HFILL }
8957
14
    },
8958
14
    { &hf_gsm_a_gm_mta_r,
8959
14
      { "MTA-R", "gsm_a.gm.gmm.mta_r",
8960
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_mta_r_vals), 0x40,
8961
14
        NULL, HFILL }
8962
14
    },
8963
14
    { &hf_gsm_a_gm_apc,
8964
14
      { "APC", "gsm_a.gm.gmm.apc",
8965
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_apc_vals), 0x20,
8966
14
        NULL, HFILL }
8967
14
    },
8968
14
    { &hf_gsm_a_gm_otd_a,
8969
14
      { "OTD-A", "gsm_a.gm.gmm.otd_a",
8970
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_otd_a_vals), 0x10,
8971
14
        NULL, HFILL }
8972
14
    },
8973
14
    { &hf_gsm_a_gm_otd_b,
8974
14
      { "OTD-B", "gsm_a.gm.gmm.otd_b",
8975
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_otd_b_vals), 0x08,
8976
14
        NULL, HFILL }
8977
14
    },
8978
14
    { &hf_gsm_a_gm_gps_a,
8979
14
      { "GPS-A", "gsm_a.gm.gmm.gps_a",
8980
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_a_vals), 0x04,
8981
14
        NULL, HFILL }
8982
14
    },
8983
14
    { &hf_gsm_a_gm_gps_b,
8984
14
      { "GPS-B", "gsm_a.gm.gmm.gps_b",
8985
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_b_vals), 0x02,
8986
14
        NULL, HFILL }
8987
14
    },
8988
14
    { &hf_gsm_a_gm_gps_c,
8989
14
      { "GPS-C", "gsm_a.gm.gmm.gps_c",
8990
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_gps_c_vals), 0x01,
8991
14
        NULL, HFILL }
8992
14
    },
8993
14
    { &hf_gsm_a_gm_motd,
8994
14
      { "MOTD", "gsm_a.gm.gmm.motd",
8995
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_motd_vals), 0x02,
8996
14
        NULL, HFILL }
8997
14
    },
8998
14
    { &hf_gsm_a_gm_mta_a,
8999
14
      { "MTA-A", "gsm_a.gm.gmm.mta_a",
9000
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_mta_a_vals), 0x01,
9001
14
        NULL, HFILL }
9002
14
    },
9003
14
    { &hf_gsm_a_gm_lcs_molr,
9004
14
      { "LCS-MOLR", "gsm_a.gm.gmm.lcs_molr",
9005
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_lcs_molr_value), 0x08,
9006
14
        NULL, HFILL }
9007
14
    },
9008
14
    { &hf_gsm_a_gm_mbms,
9009
14
      { "MBMS", "gsm_a.gm.gmm.mbms",
9010
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
9011
14
        NULL, HFILL }
9012
14
    },
9013
14
    { &hf_gsm_a_gm_ims_vops,
9014
14
      { "IMS VoPS", "gsm_a.gm.gmm.ims_vops",
9015
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_ims_vops_value), 0x02,
9016
14
        "IMS voice over PS session indicator", HFILL }
9017
14
    },
9018
14
    { &hf_gsm_a_gm_emc_bs,
9019
14
      { "EMC BS", "gsm_a.gm.gmm.emc_bs",
9020
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_emc_bs_value), 0x01,
9021
14
        "Emergency bearer services indicator", HFILL }
9022
14
    },
9023
14
    { &hf_gsm_a_gm_epco,
9024
14
      { "ePCO", "gsm_a.gm.gmm.epco",
9025
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_epco_value), 0x04,
9026
14
        NULL, HFILL }
9027
14
    },
9028
14
    { &hf_gsm_a_gm_restrict_ec,
9029
14
      { "RestrictEC", "gsm_a.gm.gmm.restrict_ec",
9030
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_restrict_ec_value), 0x02,
9031
14
        NULL, HFILL }
9032
14
    },
9033
14
    { &hf_gsm_a_gm_gprs_sms,
9034
14
      { "GPRS-SMS", "gsm_a.gm.gmm.gprs_sms",
9035
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_gprs_sms_value), 0x01,
9036
14
        NULL, HFILL }
9037
14
    },
9038
14
    { &hf_gsm_a_gm_req_ms_info_irat,
9039
14
      { "I-RAT", "gsm_a.gm.gmm.req_ms_info_irat",
9040
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_req_ms_info_irat_vals), 0x0,
9041
14
        NULL, HFILL }
9042
14
    },
9043
14
    { &hf_gsm_a_gm_req_ms_info_irat2,
9044
14
      { "I-RAT2", "gsm_a.gm.gmm.req_ms_info_irat2",
9045
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_req_ms_info_irat2_vals), 0x0,
9046
14
        NULL, HFILL }
9047
14
    },
9048
14
    { &hf_gsm_a_gm_ue_usage_setting,
9049
14
      { "UE's usage setting", "gsm_a.gm.gmm.ue_usage_setting",
9050
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_ue_usage_setting_vals), 0x0,
9051
14
        NULL, HFILL }
9052
14
    },
9053
14
    { &hf_gsm_a_gm_voice_domain_pref_for_eutran,
9054
14
      { "Voice domain preference for E-UTRAN", "gsm_a.gm.gmm.voice_domain_pref_for_eutran",
9055
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_voice_domain_pref_for_eutran_vals), 0x0,
9056
14
        NULL, HFILL }
9057
14
    },
9058
14
    { &hf_gsm_a_gm_ptmsi_type,
9059
14
      { "P-TMSI type", "gsm_a.gm.gmm.ptmsi_type",
9060
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_ptmsi_type_value), 0x0,
9061
14
        NULL, HFILL }
9062
14
    },
9063
14
    { &hf_gsm_a_gm_nri_cont,
9064
14
      { "NRI container value", "gsm_a.gm.gmm.nri_cont_value",
9065
14
        FT_UINT16, BASE_HEX, NULL, 0xffc0,
9066
14
        NULL, HFILL }
9067
14
    },
9068
14
    { &hf_gsm_a_gm_paging_time_window,
9069
14
      { "Paging Time Window", "gsm_a.gm.gmm.paging_time_window",
9070
14
        FT_UINT8, BASE_HEX, VALS(gsm_a_gm_paging_time_window_vals), 0xf0,
9071
14
        NULL, HFILL }
9072
14
    },
9073
14
    { &hf_gsm_a_gm_edrx_value,
9074
14
      { "eDRX value", "gsm_a.gm.gmm.edrx_value",
9075
14
        FT_UINT8, BASE_HEX, VALS(gsm_a_gm_edrx_vals), 0x0f,
9076
14
        NULL, HFILL }
9077
14
    },
9078
14
    { &hf_gsm_a_gm_ext_paging_time_window,
9079
14
      { "Extended Paging Time Window", "gsm_a.gm.gmm.extended_paging_time_window",
9080
14
        FT_UINT8, BASE_HEX, VALS(gsm_a_gm_paging_time_window_nr_5gcn_vals), 0x0,
9081
14
        NULL, HFILL }
9082
14
    },
9083
14
    { &hf_gsm_a_gm_mac,
9084
14
      { "Message authentication code value", "gsm_a.gm.gmm.mac",
9085
14
        FT_UINT32, BASE_HEX, NULL, 0x0,
9086
14
        NULL, HFILL }
9087
14
    },
9088
14
    { &hf_gsm_a_gm_up_integ_ind,
9089
14
      { "Integrity indicator", "gsm_a.gm.gmm.up_integ_ind",
9090
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_up_integ_ind_value), 0x01,
9091
14
        NULL, HFILL }
9092
14
    },
9093
14
    { &hf_gsm_a_gm_dcn_id,
9094
14
      { "DCN-ID", "gsm_a.gm.gmm.dcn_id",
9095
14
        FT_UINT16, BASE_HEX, NULL, 0x0,
9096
14
        NULL, HFILL }
9097
14
    },
9098
14
    { &hf_gsm_a_gm_n3en_ind,
9099
14
      { "N3EN indicator", "gsm_a.gm.gmm.n3en_ind",
9100
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_n3en_ind_value), 0x01,
9101
14
        NULL, HFILL }
9102
14
    },
9103
14
    { &hf_gsm_a_sm_pdp_type_org,
9104
14
      { "PDP type organization", "gsm_a.gm.sm.pdp_type_org",
9105
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_pdp_type_org_vals), 0x0f,
9106
14
        NULL, HFILL }
9107
14
    },
9108
14
    { &hf_gsm_a_sm_qos_mean_thr,
9109
14
      { "Mean throughput", "gsm_a.gm.sm.qos.mean_throughput",
9110
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_qos_mean_thr_vals), 0x1f,
9111
14
        NULL, HFILL }
9112
14
    },
9113
14
    { &hf_gsm_a_sm_qos_peak_thr,
9114
14
      { "Peak throughput", "gsm_a.gm.sm.qos.peak_throughput",
9115
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_qos_peak_thr_vals), 0xf0,
9116
14
        NULL, HFILL }
9117
14
    },
9118
14
    { &hf_gsm_a_sm_qos_prec_class,
9119
14
      { "Precedence class", "gsm_a.gm.sm.qos.prec_class",
9120
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_qos_prec_class_vals), 0x07,
9121
14
        NULL, HFILL }
9122
14
    },
9123
14
    { &hf_gsm_a_sm_qos_trans_delay,
9124
14
      { "Transfer delay", "gsm_a.gm.sm.qos.trans_delay",
9125
14
        FT_UINT8, BASE_DEC, NULL, 0xfc,
9126
14
        NULL, HFILL }
9127
14
    },
9128
14
    { &hf_gsm_a_sm_qos_signalling_ind,
9129
14
      { "Signalling indication", "gsm_a.gm.sm.qos.signalling_ind",
9130
14
        FT_BOOLEAN, 8, TFS(&gsm_a_sm_qos_signalling_ind_value), 0x10,
9131
14
        NULL, HFILL }
9132
14
    },
9133
14
    { &hf_gsm_a_sm_qos_source_stat_desc,
9134
14
      { "Source statistics description", "gsm_a.gm.sm.qos.source_stat_desc",
9135
14
        FT_UINT8, BASE_DEC, NULL, 0x0f,
9136
14
        NULL, HFILL }
9137
14
    },
9138
14
    { &hf_gsm_a_sm_qos_max_bitrate_upl,
9139
14
      { "Maximum bitrate for uplink", "gsm_a.gm.sm.qos.max_bitrate_upl",
9140
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9141
14
        NULL, HFILL }
9142
14
    },
9143
14
    { &hf_gsm_a_sm_qos_max_bitrate_downl,
9144
14
      { "Maximum bitrate for downlink", "gsm_a.gm.sm.qos.max_bitrate_downl",
9145
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9146
14
        NULL, HFILL }
9147
14
    },
9148
14
    { &hf_gsm_a_sm_qos_guar_bitrate_upl,
9149
14
      { "Guaranteed bitrate for uplink", "gsm_a.gm.sm.qos.guar_bitrate_upl",
9150
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9151
14
        NULL, HFILL }
9152
14
    },
9153
14
    { &hf_gsm_a_sm_qos_guar_bitrate_downl,
9154
14
      { "Guaranteed bitrate for downlink", "gsm_a.gm.sm.qos.guar_bitrate_downl",
9155
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9156
14
        NULL, HFILL }
9157
14
    },
9158
14
    { &hf_gsm_a_sm_qos_max_bitrate_upl_ext,
9159
14
      { "Maximum bitrate for uplink (extended)", "gsm_a.gm.sm.qos.max_bitrate_upl_ext",
9160
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9161
14
        NULL, HFILL }
9162
14
    },
9163
14
    { &hf_gsm_a_sm_qos_max_bitrate_downl_ext,
9164
14
      { "Maximum bitrate for downlink (extended)", "gsm_a.gm.sm.qos.max_bitrate_downl_ext",
9165
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9166
14
        NULL, HFILL }
9167
14
    },
9168
14
    { &hf_gsm_a_sm_qos_guar_bitrate_upl_ext,
9169
14
      { "Guaranteed bitrate for uplink (extended)", "gsm_a.gm.sm.qos.guar_bitrate_upl_ext",
9170
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9171
14
        NULL, HFILL }
9172
14
    },
9173
14
    { &hf_gsm_a_sm_qos_guar_bitrate_downl_ext,
9174
14
      { "Guaranteed bitrate for downlink (extended)", "gsm_a.gm.sm.qos.guar_bitrate_downl_ext",
9175
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9176
14
        NULL, HFILL }
9177
14
    },
9178
14
    { &hf_gsm_a_sm_qos_max_bitrate_upl_ext2,
9179
14
      { "Maximum bitrate for uplink (extended-2)", "gsm_a.gm.sm.qos.max_bitrate_upl_ext2",
9180
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9181
14
        NULL, HFILL }
9182
14
    },
9183
14
    { &hf_gsm_a_sm_qos_max_bitrate_downl_ext2,
9184
14
      { "Maximum bitrate for downlink (extended-2)", "gsm_a.gm.sm.qos.max_bitrate_downl_ext2",
9185
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9186
14
        NULL, HFILL }
9187
14
    },
9188
14
    { &hf_gsm_a_sm_qos_guar_bitrate_upl_ext2,
9189
14
      { "Guaranteed bitrate for uplink (extended-2)", "gsm_a.gm.sm.qos.guar_bitrate_upl_ext2",
9190
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9191
14
        NULL, HFILL }
9192
14
    },
9193
14
    { &hf_gsm_a_sm_qos_guar_bitrate_downl_ext2,
9194
14
      { "Guaranteed bitrate for downlink (extended-2)", "gsm_a.gm.sm.qos.guar_bitrate_downl_ext2",
9195
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9196
14
        NULL, HFILL }
9197
14
    },
9198
14
    { &hf_gsm_a_sm_eplmnc,
9199
14
      { "EPLMNC", "gsm_a.gm.sm.re_attempt_ind.eplmnc",
9200
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_eplmnc_value), 0x02,
9201
14
        NULL, HFILL }
9202
14
    },
9203
14
    { &hf_gsm_a_sm_ratc,
9204
14
      { "RATC", "gsm_a.gm.sm.re_attempt_ind.ratc",
9205
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_ratc_value), 0x01,
9206
14
        NULL, HFILL }
9207
14
    },
9208
14
    { &hf_gsm_a_sm_cause,
9209
14
      { "SM Cause", "gsm_a.gm.sm.cause",
9210
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9211
14
        NULL, HFILL }
9212
14
    },
9213
14
    { &hf_gsm_a_sm_cause_2,
9214
14
      { "SM Cause 2", "gsm_a.gm.sm.cause_2",
9215
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9216
14
        NULL, HFILL }
9217
14
    },
9218
14
    { &hf_gsm_a_sm_llc_sapi,
9219
14
      { "LLC SAPI", "gsm_a.gm.sm.llc_sapi",
9220
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_llc_sapi_vals), 0x0f,
9221
14
        NULL, HFILL }
9222
14
    },
9223
14
    { &hf_gsm_a_sm_tdi,
9224
14
      { "Tear Down Indicator (TDI)", "gsm_a.gm.sm.tdi",
9225
14
        FT_BOOLEAN, 8, TFS(&gsm_a_sm_tdi_value), 0x01,
9226
14
        NULL, HFILL }
9227
14
    },
9228
14
    { &hf_gsm_a_sm_packet_flow_id,
9229
14
      { "Packet Flow Identifier (PFI)", "gsm_a.gm.sm.packet_flow_id",
9230
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_packet_flow_id_vals), 0x7f,
9231
14
        NULL, HFILL }
9232
14
    },
9233
14
    { &hf_gsm_a_gmm_net_cap_gea1,
9234
14
      { "GEA/1", "gsm_a.gm.gmm.net_cap.gea1",
9235
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x80,
9236
14
        NULL, HFILL }
9237
14
    },
9238
14
    { &hf_gsm_a_gmm_net_cap_smdch,
9239
14
      { "SM capabilities via dedicated channels", "gsm_a.gm.gmm.net_cap.smdch",
9240
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smdch_vals), 0x40,
9241
14
        NULL, HFILL }
9242
14
    },
9243
14
    { &hf_gsm_a_gmm_net_cap_smgprs,
9244
14
      { "SM capabilities via GPRS channels", "gsm_a.gm.gmm.net_cap.smgprs",
9245
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_smgprs_vals), 0x20,
9246
14
        NULL, HFILL }
9247
14
    },
9248
14
    { &hf_gsm_a_gmm_net_cap_ucs2,
9249
14
      { "UCS2 support", "gsm_a.gm.gmm.net_cap.ucs2",
9250
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ucs2_vals), 0x10,
9251
14
        NULL, HFILL }
9252
14
    },
9253
14
    { &hf_gsm_a_gmm_net_cap_ss_scr_ind,
9254
14
      { "SS Screening Indicator", "gsm_a.gm.gmm.net_cap.ss_scr_ind",
9255
14
        FT_UINT8, BASE_HEX, VALS(gsm_a_gmm_net_cap_ss_scr_ind_vals), 0x0c,
9256
14
        NULL, HFILL }
9257
14
    },
9258
14
    { &hf_gsm_a_gmm_net_cap_solsa,
9259
14
      { "SoLSA Capability", "gsm_a.gm.gmm.net_cap.solsa",
9260
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_solsa_vals), 0x02,
9261
14
        NULL, HFILL }
9262
14
    },
9263
14
    { &hf_gsm_a_gmm_net_cap_rev,
9264
14
      { "Revision level indicator", "gsm_a.gm.gmm.net_cap.rev",
9265
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_rev_vals), 0x01,
9266
14
        NULL, HFILL }
9267
14
    },
9268
14
    { &hf_gsm_a_gmm_net_cap_pfc,
9269
14
      { "PFC feature mode", "gsm_a.gm.gmm.net_cap.pfc",
9270
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_pfc_vals), 0x80,
9271
14
        NULL, HFILL }
9272
14
    },
9273
14
    { &hf_gsm_a_gmm_net_cap_ext_gea_bits,
9274
14
      { "Extended GEA bits", "gsm_a.gm.gmm.net_cap.ext_gea_bits",
9275
14
        FT_UINT8, BASE_HEX, NULL, 0x7e,
9276
14
        NULL, HFILL }
9277
14
    },
9278
14
    { &hf_gsm_a_gmm_net_cap_gea2,
9279
14
      { "GEA/2", "gsm_a.gm.gmm.net_cap.gea2",
9280
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x40,
9281
14
        NULL, HFILL }
9282
14
    },
9283
14
    { &hf_gsm_a_gmm_net_cap_gea3,
9284
14
      { "GEA/3", "gsm_a.gm.gmm.net_cap.gea3",
9285
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x20,
9286
14
        NULL, HFILL }
9287
14
    },
9288
14
    { &hf_gsm_a_gmm_net_cap_gea4,
9289
14
      { "GEA/4", "gsm_a.gm.gmm.net_cap.gea4",
9290
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x10,
9291
14
        NULL, HFILL }
9292
14
    },
9293
14
    { &hf_gsm_a_gmm_net_cap_gea5,
9294
14
      { "GEA/5", "gsm_a.gm.gmm.net_cap.gea5",
9295
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x08,
9296
14
        NULL, HFILL }
9297
14
    },
9298
14
    { &hf_gsm_a_gmm_net_cap_gea6,
9299
14
      { "GEA/6", "gsm_a.gm.gmm.net_cap.gea6",
9300
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x04,
9301
14
        NULL, HFILL }
9302
14
    },
9303
14
    { &hf_gsm_a_gmm_net_cap_gea7,
9304
14
      { "GEA/7", "gsm_a.gm.gmm.net_cap.gea7",
9305
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gea_vals), 0x02,
9306
14
        NULL, HFILL }
9307
14
    },
9308
14
    { &hf_gsm_a_gmm_net_cap_lcs,
9309
14
      { "LCS VA capability", "gsm_a.gm.gmm.net_cap.lcs",
9310
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_lcs_vals), 0x01,
9311
14
        NULL, HFILL }
9312
14
    },
9313
14
    { &hf_gsm_a_gmm_net_cap_ps_irat_iu,
9314
14
      { "PS inter-RAT HO from GERAN to UTRAN Iu mode capability", "gsm_a.gm.gmm.net_cap.ps_irat_iu",
9315
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_iu_vals), 0x80,
9316
14
        NULL, HFILL }
9317
14
    },
9318
14
    { &hf_gsm_a_gmm_net_cap_ps_irat_s1,
9319
14
      { "PS inter-RAT HO from GERAN to E-UTRAN S1 mode capability", "gsm_a.gm.gmm.net_cap.ps_irat_s1",
9320
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_ps_irat_s1_vals), 0x40,
9321
14
        NULL, HFILL }
9322
14
    },
9323
14
    { &hf_gsm_a_gmm_net_cap_comb_proc,
9324
14
      { "EMM Combined procedures capability", "gsm_a.gm.gmm.net_cap.comb_proc",
9325
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_comb_proc_vals), 0x20,
9326
14
        NULL, HFILL }
9327
14
    },
9328
14
    { &hf_gsm_a_gmm_net_cap_isr,
9329
14
      { "ISR support", "gsm_a.gm.gmm.net_cap.isr",
9330
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_isr_vals), 0x10,
9331
14
        NULL, HFILL }
9332
14
    },
9333
14
    { &hf_gsm_a_gmm_net_cap_srvcc_to_geran,
9334
14
      { "SRVCC to GERAN/UTRAN capability", "gsm_a.gm.gmm.net_cap.srvcc_to_geran",
9335
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_srvcc_to_geran_vals), 0x08,
9336
14
        NULL, HFILL }
9337
14
    },
9338
14
    { &hf_gsm_a_gmm_net_cap_epc,
9339
14
      { "EPC capability", "gsm_a.gm.gmm.net_cap.epc",
9340
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_epc_vals), 0x04,
9341
14
        NULL, HFILL }
9342
14
    },
9343
14
    { &hf_gsm_a_gmm_net_cap_nf,
9344
14
      { "NF capability", "gsm_a.gm.gmm.net_cap.nf",
9345
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_nf_vals), 0x02,
9346
14
        NULL, HFILL }
9347
14
    },
9348
14
    { &hf_gsm_a_gmm_net_geran_net_sharing,
9349
14
      { "GERAN network sharing capability", "gsm_a.gm.gmm.net_cap.geran_net_sharing",
9350
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_geran_net_vals), 0x01,
9351
14
        NULL, HFILL }
9352
14
    },
9353
14
    { &hf_gsm_a_gmm_net_cap_up_int_prot,
9354
14
      { "User plane integrity protection support", "gsm_a.gm.gmm.net_cap.up_int_prot",
9355
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
9356
14
        NULL, HFILL }
9357
14
    },
9358
14
    { &hf_gsm_a_gmm_net_cap_up_gia4,
9359
14
      { "GIA/4", "gsm_a.gm.gmm.net_cap.gia4",
9360
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gia_vals), 0x40,
9361
14
        NULL, HFILL }
9362
14
    },
9363
14
    { &hf_gsm_a_gmm_net_cap_up_gia5,
9364
14
      { "GIA/5", "gsm_a.gm.gmm.net_cap.gia5",
9365
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gia_vals), 0x20,
9366
14
        NULL, HFILL }
9367
14
    },
9368
14
    { &hf_gsm_a_gmm_net_cap_up_gia6,
9369
14
      { "GIA/6", "gsm_a.gm.gmm.net_cap.gia6",
9370
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gia_vals), 0x10,
9371
14
        NULL, HFILL }
9372
14
    },
9373
14
    { &hf_gsm_a_gmm_net_cap_up_gia7,
9374
14
      { "GIA/7", "gsm_a.gm.gmm.net_cap.gia7",
9375
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_gia_vals), 0x08,
9376
14
        NULL, HFILL }
9377
14
    },
9378
14
    { &hf_gsm_a_gmm_net_cap_epco_ie_ind,
9379
14
      { "ePCO IE indicator", "gsm_a.gm.gmm.net_cap.epco_ie_ind",
9380
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_epco_ie_ind_vals), 0x04,
9381
14
        NULL, HFILL }
9382
14
    },
9383
14
    { &hf_gsm_a_gmm_net_cap_restrict_use_enh_cov,
9384
14
      { "Restriction on use of enhanced coverage capability", "gsm_a.gm.gmm.net_cap.restrict_use_enh_cov",
9385
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_restrict_use_enh_cov_vals), 0x02,
9386
14
        NULL, HFILL }
9387
14
    },
9388
14
    { &hf_gsm_a_gmm_net_cap_dc_eutra_nr_cap,
9389
14
      { "Dual connectivity of E-UTRA with NR capability", "gsm_a.gm.gmm.net_cap.dc_eutra_nr_cap",
9390
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gmm_net_cap_dc_eutra_nr_cap_vals), 0x01,
9391
14
        NULL, HFILL }
9392
14
    },
9393
14
    { &hf_gsm_a_sm_tmgi,
9394
14
      { "Temporary Mobile Group Identity (TMGI)", "gsm_a.gm.sm.tmgi",
9395
14
        FT_UINT24, BASE_HEX, NULL, 0x0,
9396
14
        NULL, HFILL }
9397
14
    },
9398
14
    { &hf_gsm_a_sm_enh_nsapi,
9399
14
      { "Enhanced NSAPI", "gsm_a.gm.sm.enh_nsapi",
9400
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9401
14
        NULL, HFILL }
9402
14
    },
9403
14
    { &hf_gsm_a_sm_req_type,
9404
14
      { "Request type", "gsm_a.gm.sm.req_type",
9405
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_req_type_vals), 0x07,
9406
14
        NULL, HFILL }
9407
14
    },
9408
14
    { &hf_gsm_a_sm_notif_ind,
9409
14
      { "Notification indicator", "gsm_a.gm.sm.notif_ind",
9410
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_sm_notif_ind_vals), 0x0,
9411
14
        NULL, HFILL }
9412
14
    },
9413
14
    { &hf_gsm_a_sm_connectivity_type,
9414
14
      { "Connectivity type", "gsm_a.gm.sm.connectivity_type",
9415
14
        FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gsm_a_sm_connectivity_type_vals), 0x0F,
9416
14
        NULL, HFILL }
9417
14
    },
9418
14
    { &hf_gsm_a_sm_wlan_utran_offload_accept,
9419
14
      { "WLAN UTRAN offload acceptability", "gsm_a.gm.sm.wlan_utran_offload_accept",
9420
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_sm_wlan_utran_offload_accept_value), 0x0,
9421
14
        NULL, HFILL }
9422
14
    },
9423
14
    { &hf_gsm_a_sm_wlan_eutran_offload_accept,
9424
14
      { "WLAN E-UTRAN offload acceptability", "gsm_a.gm.sm.wlan_eutran_offload_accept",
9425
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_sm_wlan_eutran_offload_accept_value), 0x0,
9426
14
        NULL, HFILL }
9427
14
    },
9428
14
    { &hf_gsm_a_sm_nbifom_cont,
9429
14
      { "NBIFOM container content", "gsm_a.gm.sm.nbifom_cont",
9430
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9431
14
        NULL, HFILL }
9432
14
    },
9433
14
    { &hf_gsm_a_gm_rac_ctrled_early_cm_sending,
9434
14
      { "Controlled early Classmark Sending", "gsm_a.gm.gmm.rac.ctrled_early_cm_sending",
9435
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
9436
14
        NULL, HFILL }
9437
14
    },
9438
14
    { &hf_gsm_a_gm_rac_pseudo_sync,
9439
14
      { "Pseudo Synchronisation", "gsm_a.gm.gmm.rac.pseudo_sync",
9440
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
9441
14
        NULL, HFILL }
9442
14
    },
9443
14
    { &hf_gsm_a_gm_rac_vgcs,
9444
14
      { "Voice Group Call Service", "gsm_a.gm.gmm.rac.vgcs",
9445
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_vgcs), 0x0,
9446
14
        NULL, HFILL }
9447
14
    },
9448
14
    { &hf_gsm_a_gm_rac_vbs,
9449
14
      { "Voice Broadcast Service", "gsm_a.gm.gmm.rac.vbs",
9450
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_vbs), 0x0,
9451
14
        NULL, HFILL }
9452
14
    },
9453
14
    { &hf_gsm_a_gm_rac_multislot_capability,
9454
14
      { "Multislot capability struct", "gsm_a.gm.gmm.rac.multislot_capability",
9455
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
9456
14
        NULL, HFILL }
9457
14
    },
9458
14
    { &hf_gsm_a_gm_rac_hscsd_multi_slot_class,
9459
14
      { "HSCSD multislot class", "gsm_a.gm.gmm.rac.hscsd_multi_slot_class",
9460
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
9461
14
        NULL, HFILL }
9462
14
    },
9463
14
    { &hf_gsm_a_gm_rac_gprs_multi_slot_class,
9464
14
      { "GPRS multislot class", "gsm_a.gm.gmm.rac.gprs_multi_slot_class",
9465
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
9466
14
        NULL, HFILL }
9467
14
    },
9468
14
    { &hf_gsm_a_gm_rac_gprs_ext_dyn_alloc_cap,
9469
14
      { "GPRS Extended Dynamic Allocation Capability", "gsm_a.gm.gmm.rac.gprs_ext_dyn_alloc_cap",
9470
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
9471
14
        NULL, HFILL }
9472
14
    },
9473
14
    { &hf_gsm_a_gm_rac_ecsd_multi_slot_class,
9474
14
      { "ECSD multislot class", "gsm_a.gm.gmm.rac.ecsd_multi_slot_class",
9475
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
9476
14
        NULL, HFILL }
9477
14
    },
9478
14
    { &hf_gsm_a_gm_rac_egprs_multi_slot_class,
9479
14
      { "EGPRS multislot class", "gsm_a.gm.gmm.rac.egprs_multi_slot_class",
9480
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_vals), 0x0,
9481
14
        NULL, HFILL }
9482
14
    },
9483
14
    { &hf_gsm_a_gm_rac_egprs_ext_dyn_alloc_cap,
9484
14
      { "EGPRS Extended Dynamic Allocation Capability", "gsm_a.gm.gmm.rac.egprs_ext_dyn_alloc_cap",
9485
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
9486
14
        NULL, HFILL }
9487
14
    },
9488
14
    { &hf_gsm_a_gm_rac_dtm_gprs_multi_slot_class,
9489
14
      { "DTM GPRS Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_gprs_multi_slot_class",
9490
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
9491
14
        NULL, HFILL }
9492
14
    },
9493
14
    { &hf_gsm_a_gm_rac_single_slt_dtm,
9494
14
      { "Single Slot DTM", "gsm_a.gm.gmm.rac.single_slt_dtm",
9495
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9496
14
        NULL, HFILL }
9497
14
    },
9498
14
    { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_cls_pres,
9499
14
      { "DTM EGPRS Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_egprs_multi_slot_cls_pres",
9500
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
9501
14
        NULL, HFILL }
9502
14
    },
9503
14
    { &hf_gsm_a_gm_rac_dtm_egprs_multi_slot_class,
9504
14
      { "DTM EGPRS Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_egprs_multi_slot_class",
9505
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_multi_slot_class_vals), 0x0,
9506
14
        NULL, HFILL }
9507
14
    },
9508
14
    { &hf_gsm_a_gm_rac_8psk_pow_cap_pres,
9509
14
      { "8PSK Power Capability Bits", "gsm_a.gm.gmm.rac.8psk_pow_cap_pres",
9510
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_present_not_present), 0x0,
9511
14
        NULL, HFILL }
9512
14
    },
9513
14
    { &hf_gsm_a_gm_rac_comp_int_meas_cap,
9514
14
      { "COMPACT Interference Measurement Capability", "gsm_a.gm.gmm.rac.comp_int_meas_cap",
9515
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_implemented_not_implemented), 0x0,
9516
14
        NULL, HFILL }
9517
14
    },
9518
14
    { &hf_gsm_a_gm_rel_lev_ind,
9519
14
      { "Revision Level Indicator", "gsm_a.gm.gmm.rel_lev_ind",
9520
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_revision_level_indicator), 0x0,
9521
14
        NULL, HFILL }
9522
14
    },
9523
14
    { &hf_gsm_a_gm_rac_umts_fdd_cap,
9524
14
      { "UMTS FDD Radio Access Technology Capability", "gsm_a.gm.gmm.rac.umts_fdd_cap",
9525
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9526
14
        NULL, HFILL }
9527
14
    },
9528
14
    { &hf_gsm_a_gm_rac_umts_384_tdd_ra_cap,
9529
14
      { "UMTS 3.84 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.gmm.rac.umts_384_tdd_ra_cap",
9530
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9531
14
        NULL, HFILL }
9532
14
    },
9533
14
    { &hf_gsm_a_gm_rac_cdma2000_cap,
9534
14
      { "CDMA 2000 Radio Access Technology Capability", "gsm_a.gm.gmm.rac.cdma2000_cap",
9535
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9536
14
        NULL, HFILL }
9537
14
    },
9538
14
    { &hf_gsm_a_gm_rac_umts_128_tdd_ra_cap,
9539
14
      { "UMTS 1.28 Mcps TDD Radio Access Technology Capability", "gsm_a.gm.gmm.rac.umts_128_tdd_ra_cap",
9540
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9541
14
        NULL, HFILL }
9542
14
    },
9543
14
    { &hf_gsm_a_gm_rac_geran_feat_pkg,
9544
14
      { "GERAN Feature Package 1", "gsm_a.gm.gmm.rac.geran_feat_pkg",
9545
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9546
14
        NULL, HFILL }
9547
14
    },
9548
14
    { &hf_gsm_a_gm_rac_mod_based_multi_slot_class_support,
9549
14
      { "Modulation based multislot class support", "gsm_a.gm.gmm.rac.mod_based_multi_slot_class_support",
9550
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9551
14
        NULL, HFILL }
9552
14
    },
9553
14
    { &hf_gsm_a_gm_rac_geran_iu_mode_cap,
9554
14
      { "GERAN Iu mode", "gsm_a.gm.gmm.rac.geran_iu_mode_cap",
9555
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9556
14
        NULL, HFILL }
9557
14
    },
9558
14
    { &hf_gsm_a_gm_rac_flo_iu_cap,
9559
14
      { "FLO Iu Capability", "gsm_a.gm.gmm.rac.flo_iu_cap",
9560
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9561
14
        NULL, HFILL }
9562
14
    },
9563
14
    { &hf_gsm_a_gm_rac_mult_tbf_cap,
9564
14
      { "Multiple TBF Capability", "gsm_a.gm.gmm.rac.mult_tbf_cap",
9565
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9566
14
        NULL, HFILL }
9567
14
    },
9568
14
    { &hf_gsm_a_gm_rac_down_adv_rec_perf,
9569
14
      { "Downlink Advanced Receiver Performance", "gsm_a.gm.gmm.rac.down_adv_rec_perf",
9570
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_down_adv_rec_perf_vals), 0x0,
9571
14
        NULL, HFILL }
9572
14
    },
9573
14
    { &hf_gsm_a_gm_rac_ext_rlc_mac_ctrl_msg_seg_cap,
9574
14
      { "Extended RLC/MAC Control Message Segmentation Capability", "gsm_a.gm.gmm.rac.ext_rlc_mac_ctrl_msg_seg_cap",
9575
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9576
14
        NULL, HFILL }
9577
14
    },
9578
14
    { &hf_gsm_a_gm_rac_dtm_enh_cap,
9579
14
      { "DTM Enhancements Capability", "gsm_a.gm.gmm.rac.dtm_enh_cap",
9580
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_dtm_enh_cap), 0x0,
9581
14
        NULL, HFILL }
9582
14
    },
9583
14
    { &hf_gsm_a_gm_rac_dtm_gprs_high_multi_slot_class,
9584
14
      { "DTM GPRS High Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_gprs_high_multi_slot_class",
9585
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
9586
14
        NULL, HFILL }
9587
14
    },
9588
14
    { &hf_gsm_a_gm_rac_dtm_egprs_high_multi_slot_class,
9589
14
      { "DTM EGPRS High Multi Slot Class", "gsm_a.gm.gmm.rac.dtm_egprs_high_multi_slot_class",
9590
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dtm_gprs_high_multi_slot_class_vals), 0x0,
9591
14
        NULL, HFILL }
9592
14
    },
9593
14
    { &hf_gsm_a_gm_rac_ps_ho_cap,
9594
14
      { "PS Handover Capability", "gsm_a.gm.gmm.rac.ps_ho_cap",
9595
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9596
14
        NULL, HFILL }
9597
14
    },
9598
14
    { &hf_gsm_a_gm_rac_dtm_ho_cap,
9599
14
      { "DTM Handover Capability", "gsm_a.gm.gmm.rac.dtm_ho_cap",
9600
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9601
14
        NULL, HFILL }
9602
14
    },
9603
14
    { &hf_gsm_a_gm_rac_multi_slot_cap_red_down_dual_carrier,
9604
14
      { "Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.gmm.rac.multi_slot_cap_red_down_dual_carrier",
9605
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
9606
14
        NULL, HFILL }
9607
14
    },
9608
14
    { &hf_gsm_a_gm_rac_down_dual_carrier_dtm_cap,
9609
14
      { "Downlink Dual Carrier for DTM Capability", "gsm_a.gm.gmm.rac.down_dual_carrier_dtm_cap",
9610
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9611
14
        NULL, HFILL }
9612
14
    },
9613
14
    { &hf_gsm_a_gm_rac_flex_ts_assign,
9614
14
      { "Flexible Timeslot Assignment", "gsm_a.gm.gmm.rac.flex_ts_assign",
9615
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9616
14
        NULL, HFILL }
9617
14
    },
9618
14
    { &hf_gsm_a_gm_rac_gan_ps_ho_cap,
9619
14
      { "GAN PS Handover Capability", "gsm_a.gm.gmm.rac.gan_ps_ho_cap",
9620
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9621
14
        NULL, HFILL }
9622
14
    },
9623
14
    { &hf_gsm_a_gm_rac_rlc_non_pers_mode,
9624
14
      { "RLC Non-persistent Mode", "gsm_a.gm.gmm.rac.rlc_non_pers_mode",
9625
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9626
14
        NULL, HFILL }
9627
14
    },
9628
14
    { &hf_gsm_a_gm_rac_reduced_lat_cap,
9629
14
      { "Reduced Latency Capability", "gsm_a.gm.gmm.rac.reduced_lat_cap",
9630
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9631
14
        NULL, HFILL }
9632
14
    },
9633
14
    { &hf_gsm_a_gm_rac_ul_egprs2,
9634
14
      { "Uplink EGPRS2", "gsm_a.gm.gmm.rac.ul_egprs2",
9635
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_ul_egprs2_vals), 0x0,
9636
14
        NULL, HFILL }
9637
14
    },
9638
14
    { &hf_gsm_a_gm_rac_dl_egprs2,
9639
14
      { "Downlink EGPRS2", "gsm_a.gm.gmm.rac.dl_egprs2",
9640
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dl_egprs2_vals), 0x0,
9641
14
        NULL, HFILL }
9642
14
    },
9643
14
    { &hf_gsm_a_gm_rac_eutra_fdd_support,
9644
14
      { "E-UTRA FDD support", "gsm_a.gm.gmm.rac.eutra_fdd_support",
9645
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9646
14
        NULL, HFILL }
9647
14
    },
9648
14
    { &hf_gsm_a_gm_rac_eutra_tdd_support,
9649
14
      { "E-UTRA TDD support", "gsm_a.gm.gmm.rac.eutra_tdd_support",
9650
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9651
14
        NULL, HFILL }
9652
14
    },
9653
14
    { &hf_gsm_a_gm_rac_geran_to_eutra_support_in_geran_ptm,
9654
14
      { "GERAN to E-UTRA support in GERAN packet transfer mode", "gsm_a.gm.gmm.rac.geran_to_eutra_support_in_geran_ptm",
9655
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_geran_to_eutra_support_in_geran_ptm_vals), 0x0,
9656
14
        NULL, HFILL }
9657
14
    },
9658
14
    { &hf_gsm_a_gm_rac_prio_based_resel_support,
9659
14
      { "Priority-based reselection support", "gsm_a.gm.gmm.rac.prio_based_resel_support",
9660
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9661
14
        NULL, HFILL }
9662
14
    },
9663
14
    { &hf_gsm_a_gm_rac_alt_efta_multi_slot_class,
9664
14
      { "Alternative EFTA Multislot Class", "gsm_a.gm.gmm.rac.alt_efta_multi_slot_class",
9665
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_alt_efta_multi_slot_class_vals), 0x0,
9666
14
        NULL, HFILL }
9667
14
    },
9668
14
    { &hf_gsm_a_gm_rac_efta_multi_slot_cap_red_down_dual_carrier,
9669
14
      { "EFTA Multislot Capability Reduction for Downlink Dual Carrier", "gsm_a.gm.gmm.rac.efta_multi_slot_cap_red_down_dual_carrier",
9670
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_multi_slot_cap_red_down_dual_carrier_vals), 0x0,
9671
14
        NULL, HFILL }
9672
14
    },
9673
14
    { &hf_gsm_a_gm_rac_ind_up_layer_pdu_start_cap_for_rlc_um,
9674
14
      { "Indication of Upper Layer PDU Start Capability for RLC UM", "gsm_a.gm.gmm.rac.ind_up_layer_pdu_start_cap_for_rlc_um",
9675
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9676
14
        NULL, HFILL }
9677
14
    },
9678
14
    { &hf_gsm_a_gm_rac_emst_cap,
9679
14
      { "Enhanced Multiplexing for Single TBF Capability", "gsm_a.gm.gmm.rac.emst_cap",
9680
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9681
14
        NULL, HFILL }
9682
14
    },
9683
14
    { &hf_gsm_a_gm_rac_mtti_cap,
9684
14
      { "Multiple TTI Capability", "gsm_a.gm.gmm.rac.mtti_cap",
9685
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9686
14
        NULL, HFILL }
9687
14
    },
9688
14
    { &hf_gsm_a_gm_rac_utra_csg_cell_report,
9689
14
      { "Reporting of UTRAN CSG cells in packet transfer mode", "gsm_a.gm.gmm.rac.utra_csg_cell_report",
9690
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9691
14
        NULL, HFILL }
9692
14
    },
9693
14
    { &hf_gsm_a_gm_rac_eutra_csg_cell_report,
9694
14
      { "Reporting of E-UTRAN CSG cells in packet transfer mode", "gsm_a.gm.gmm.rac.eutra_csg_cell_report",
9695
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9696
14
        NULL, HFILL }
9697
14
    },
9698
14
    { &hf_gsm_a_gm_rac_dtr_cap,
9699
14
      { "Dynamic Timeslot Reduction Capability", "gsm_a.gm.gmm.rac.dtr_cap",
9700
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9701
14
        NULL, HFILL }
9702
14
    },
9703
14
    { &hf_gsm_a_gm_rac_emsr_cap,
9704
14
      { "Enhanced Multiplexing for Single RLC Entity Capability", "gsm_a.gm.gmm.rac.emsr_cap",
9705
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9706
14
        NULL, HFILL }
9707
14
    },
9708
14
    { &hf_gsm_a_gm_rac_fast_down_freq_switch_cap,
9709
14
      { "Fast Downlink Frequency Switching Capability", "gsm_a.gm.gmm.rac.fast_down_freq_switch_cap",
9710
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9711
14
        NULL, HFILL }
9712
14
    },
9713
14
    { &hf_gsm_a_gm_rac_tighter_cap,
9714
14
      { "TIGHTER Capability", "gsm_a.gm.gmm.rac.tighter_cap",
9715
14
        FT_UINT8, BASE_DEC, VALS(tighter_cap_level_vals), 0x0,
9716
14
        NULL, HFILL }
9717
14
    },
9718
14
    { &hf_gsm_a_gm_rac_fanr_cap,
9719
14
      { "Fast Ack/Nack Reporting Capability", "gsm_a.gm.gmm.rac.fanr_cap",
9720
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9721
14
        NULL, HFILL }
9722
14
    },
9723
14
    { &hf_gsm_a_gm_rac_ipa_cap,
9724
14
      { "Immediate Packet Assignment Capability", "gsm_a.gm.gmm.rac.ipa_cap",
9725
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9726
14
        NULL, HFILL }
9727
14
    },
9728
14
    { &hf_gsm_a_gm_rac_geran_nw_sharing_support,
9729
14
      { "GERAN Network Sharing support", "gsm_a.gm.gmm.rac.geran_nw_sharing_support",
9730
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9731
14
        NULL, HFILL }
9732
14
    },
9733
14
    { &hf_gsm_a_gm_rac_eutra_wb_rsrq_support,
9734
14
      { "E-UTRA Wideband RSRQ measurements support", "gsm_a.gm.gmm.rac.eutra_wb_rsrq_support",
9735
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9736
14
        NULL, HFILL }
9737
14
    },
9738
14
    { &hf_gsm_a_gm_rac_utra_mfbi_support,
9739
14
      { "UTRA Multiple Frequency Band Indicators support", "gsm_a.gm.gmm.rac.utra_mfbi_support",
9740
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9741
14
        NULL, HFILL }
9742
14
    },
9743
14
    { &hf_gsm_a_gm_rac_eutra_mfbi_support,
9744
14
      { "E-UTRA Multiple Frequency Band Indicators support", "gsm_a.gm.gmm.rac.eutra_mfbi_support",
9745
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9746
14
        NULL, HFILL }
9747
14
    },
9748
14
    { &hf_gsm_a_gm_rac_dlmc_non_contig_intra_band_recep,
9749
14
      { "DLMC - Non-contiguous intra-band reception", "gsm_a.gm.gmm.rac.dlmc.non_contig_intra_band_recep",
9750
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dlmc_non_contig_intra_band_recep_vals), 0x0,
9751
14
        NULL, HFILL }
9752
14
    },
9753
14
    { &hf_gsm_a_gm_rac_dlmc_inter_band_recep,
9754
14
      { "DLMC - Inter-band reception", "gsm_a.gm.gmm.rac.dlmc.inter_band_recep",
9755
14
        FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_gm_dlmc_inter_band_recep_val), 0x0,
9756
14
        NULL, HFILL }
9757
14
    },
9758
14
    { &hf_gsm_a_gm_rac_dlmc_max_bandwidth,
9759
14
      { "DLMC - Maximum Bandwidth", "gsm_a.gm.gmm.rac.dlmc.max_bandwidth",
9760
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dlmc_max_bandwidth_vals), 0x0,
9761
14
        NULL, HFILL }
9762
14
    },
9763
14
    { &hf_gsm_a_gm_rac_dlmc_max_nb_dl_ts,
9764
14
      { "DLMC - Maximum Number of Downlink Timeslots", "gsm_a.gm.gmm.rac.dlmc.max_nb_dl_ts",
9765
14
        FT_UINT8, BASE_CUSTOM, CF_FUNC(gsm_a_gm_dlmc_max_nb_dl_ts_fmt), 0x0,
9766
14
        NULL, HFILL }
9767
14
    },
9768
14
    { &hf_gsm_a_gm_rac_dlmc_max_nb_dl_carriers,
9769
14
      { "DLMC - Maximum Number of Downlink Carriers", "gsm_a.gm.gmm.rac.dlmc.max_nb_dl_carriers",
9770
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_dlmc_max_nb_dl_carriers_vals), 0x0,
9771
14
        NULL, HFILL }
9772
14
    },
9773
14
    { &hf_gsm_a_gm_rac_ext_tsc_set_cap_support,
9774
14
      { "Extended TSC Set Capability support", "gsm_a.gm.gmm.rac.ext_tsc_set_cap_support",
9775
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0x0,
9776
14
        NULL, HFILL }
9777
14
    },
9778
14
    { &hf_gsm_a_gm_rac_ext_earfcn_value_range,
9779
14
      { "Extended EARFCN value range", "gsm_a.gm.gmm.rac.ext_earfcn_value_range",
9780
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9781
14
        NULL, HFILL }
9782
14
    },
9783
14
    { &hf_gsm_a_gm_rac_ec_pch_mon_support,
9784
14
      { "(EC-)PCH monitoring support", "gsm_a.gm.gmm.rac.ec_pch_mon_support",
9785
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_ec_pch_mon_support_vals), 0x0,
9786
14
        NULL, HFILL }
9787
14
    },
9788
14
    { &hf_gsm_a_gm_rac_ms_sync_accuracy,
9789
14
      { "MS Sync Accuracy", "gsm_a.gm.gmm.rac.ms_sync_accuracy",
9790
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9791
14
        NULL, HFILL }
9792
14
    },
9793
14
    { &hf_gsm_a_gm_rac_ec_ul_cov_enh_support,
9794
14
      { "EC uplink coverage enhancement support", "gsm_a.gm.gmm.rac.ec_ul_cov_enh_support",
9795
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9796
14
        NULL, HFILL }
9797
14
    },
9798
14
    { &hf_gsm_a_gm_rac_mta_access_sec_support,
9799
14
      { "MTA Access Security support", "gsm_a.gm.gmm.rac.mta_access_sec_support",
9800
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9801
14
        NULL, HFILL }
9802
14
    },
9803
14
    { &hf_gsm_a_gm_rac_ec_paging_ind_chan_mon_support,
9804
14
      { "EC paging indication channel monitoring support", "gsm_a.gm.gmm.rac.ec_paging_ind_chan_mon_support",
9805
14
        FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0,
9806
14
        NULL, HFILL }
9807
14
    },
9808
14
    { &hf_gsm_a_sm_ti_flag,
9809
14
      { "TI Flag", "gsm_a.gm.sm.ti_flag",
9810
14
        FT_BOOLEAN, 8, TFS(&gsm_a_sm_ti_flag_vals), 0x80,
9811
14
        NULL, HFILL }
9812
14
    },
9813
14
    { &hf_gsm_a_sm_ext,
9814
14
      { "Extension", "gsm_a.gm.sm.ext",
9815
14
        FT_BOOLEAN, 8, NULL, 0x80,
9816
14
        NULL, HFILL }
9817
14
    },
9818
14
    { &hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_aer,
9819
14
      { "AER", "gsm_a.gm.sm.pco.apn_rate_ctrl_params.aer",
9820
14
        FT_BOOLEAN, 8, TFS(&gsm_a_gm_apn_rate_ctrl_params_aer_value), 0x08,
9821
14
        NULL, HFILL }
9822
14
    },
9823
14
    { &hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_ul_time_unit,
9824
14
      { "Uplink time unit", "gsm_a.gm.sm.pco.apn_rate_ctrl_params.ul_time_unit",
9825
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_apn_rate_ctrl_ul_time_unit_vals), 0x07,
9826
14
        NULL, HFILL }
9827
14
    },
9828
14
    { &hf_gsm_a_gm_sm_pco_apn_rate_ctrl_params_max_ul_rate,
9829
14
      { "Maximum uplink rate", "gsm_a.gm.sm.pco.apn_rate_ctrl_params.max_ul_rate",
9830
14
        FT_UINT24, BASE_DEC|BASE_UNIT_STRING, UNS(&units_message_messages), 0x0,
9831
14
        NULL, HFILL }
9832
14
    },
9833
14
    { &hf_gsm_a_gm_sm_pco_3gpp_data_off_ue_status,
9834
14
      { "3GPP PS data off UE status", "gsm_a.gm.sm.pco.3gpp_data_off_ue_status",
9835
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sm_pco_3gpp_data_off_ue_status_vals), 0x0,
9836
14
        NULL, HFILL }
9837
14
    },
9838
14
    { &hf_gsm_a_gm_sm_pco_add_apn_rate_ctrl_params_ul_time_unit,
9839
14
      { "Uplink time unit", "gsm_a.gm.sm.pco.add_apn_rate_ctrl_params.ul_time_unit",
9840
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_apn_rate_ctrl_ul_time_unit_vals), 0x07,
9841
14
        NULL, HFILL }
9842
14
    },
9843
14
    { &hf_gsm_a_gm_sm_pco_add_apn_rate_ctrl_params_max_ul_rate,
9844
14
      { "Additional uplink rate for exception data", "gsm_a.gm.sm.pco.add_apn_rate_ctrl_params.max_ul_rate",
9845
14
        FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_message_messages), 0x0,
9846
14
        NULL, HFILL }
9847
14
    },
9848
14
    { &hf_gsm_a_gm_sm_pco_pdu_session_id,
9849
14
      { "PDU session identity", "gsm_a.gm.sm.pco.pdu_session_id",
9850
14
        FT_UINT8, BASE_DEC, VALS(nas_5gs_pdu_session_id_vals), 0x0,
9851
14
        NULL, HFILL }
9852
14
    },
9853
14
    { &hf_gsm_a_gm_sm_pco_pdu_session_address_lifetime,
9854
14
      { "PDU session address lifetime", "gsm_a.gm.sm.pco.pdu_session_address_lifetime",
9855
14
        FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_second_seconds), 0x0,
9856
14
        NULL, HFILL }
9857
14
    },
9858
14
    { &hf_gsm_a_gm_sm_pco_eth_frame_payload_mtu,
9859
14
      { "Ethernet Frame Payload MTU", "gsm_a.gm.sm.pco.eth_frame_payload_mtu",
9860
14
        FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_octet_octets), 0x0,
9861
14
        NULL, HFILL }
9862
14
    },
9863
14
    { &hf_gsm_a_gm_sm_pco_unstruct_link_mtu,
9864
14
      { "Unstructured Link MTU", "gsm_a.gm.sm.pco.unstruct_link_mtu",
9865
14
        FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_octet_octets), 0x0,
9866
14
        NULL, HFILL }
9867
14
    },
9868
14
    { &hf_gsm_a_gm_sm_pco_5gsm_cause,
9869
14
      { "5GSM cause", "gsm_a.gm.sm.pco.5gsm_cause",
9870
14
        FT_UINT8, BASE_DEC, VALS(nas_5gs_sm_cause_vals), 0x0,
9871
14
        NULL, HFILL }
9872
14
    },
9873
14
    { &hf_gsm_a_gm_sm_pco_acs_info,
9874
14
      { "ACS information", "gsm_a.gm.sm.pco.acs_info",
9875
14
        FT_STRING, BASE_NONE, NULL, 0x0,
9876
14
        NULL, HFILL }
9877
14
    },
9878
14
    { &hf_gsm_a_gm_sm_pco_init_small_data_rate_ctrl_params_max_ul_rate_allowed,
9879
14
      { "Maximum uplink rate allowed", "gsm_a.gm.sm.pco.init_small_data_rate_ctrl_params.max_ul_rate_allowed",
9880
14
        FT_UINT24, BASE_DEC, NULL, 0x0,
9881
14
        NULL, HFILL }
9882
14
    },
9883
14
    { &hf_gsm_a_gm_sm_pco_init_small_data_rate_ctrl_params_termination_timestamp,
9884
14
      { "Termination timestamp", "gsm_a.gm.sm.pco.init_small_data_rate_ctrl_params.termination_timestamp",
9885
14
        FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
9886
14
        NULL, HFILL }
9887
14
    },
9888
14
    { &hf_gsm_a_gm_sm_pco_atsss_response,
9889
14
      { "ATSSS response", "gsm_a.gm.sm.pco.atsss_response",
9890
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9891
14
        NULL, HFILL }
9892
14
    },
9893
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_type,
9894
14
      { "Type", "gsm_a.gm.sm.pco.dns_serv_sec_info.type",
9895
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sm_pco_dns_serv_sec_info_type_vals), 0x0,
9896
14
        NULL, HFILL }
9897
14
    },
9898
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_sec_proto_type,
9899
14
      { "Security protocol type", "gsm_a.gm.sm.pco.dns_serv_sec_info.sec_proto_type",
9900
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sm_pco_dns_serv_sec_info_sec_proto_vals), 0x0,
9901
14
        NULL, HFILL }
9902
14
    },
9903
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_port_number,
9904
14
      { "Port number", "gsm_a.gm.sm.pco.dns_serv_sec_info.port_number",
9905
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
9906
14
        NULL, HFILL }
9907
14
    },
9908
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_auth_domain_name,
9909
14
      { "Authentication domain name", "gsm_a.gm.sm.pco.dns_serv_sec_info.auth_domain_name",
9910
14
        FT_STRING, BASE_NONE, NULL, 0x0,
9911
14
        NULL, HFILL }
9912
14
    },
9913
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_spki_pin_set,
9914
14
      { "SPKI pin set", "gsm_a.gm.sm.pco.dns_serv_sec_info.spki_pin_set",
9915
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9916
14
        NULL, HFILL }
9917
14
    },
9918
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_root_certificate,
9919
14
      { "Root certificate", "gsm_a.gm.sm.pco.dns_serv_sec_info.root_certificate",
9920
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9921
14
        NULL, HFILL }
9922
14
    },
9923
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_raw_public_key,
9924
14
      { "Raw public key", "gsm_a.gm.sm.pco.dns_serv_sec_info.raw_public_key",
9925
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9926
14
        NULL, HFILL }
9927
14
    },
9928
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_info_value_part,
9929
14
      { "Value part", "gsm_a.gm.sm.pco.dns_serv_sec_info.value_part",
9930
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9931
14
        NULL, HFILL }
9932
14
    },
9933
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_type,
9934
14
      { "Type of ECS address", "gsm_a.gm.sm.pco.ecs_addr.type",
9935
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sm_pco_ecs_addr_type_vals), 0xf0,
9936
14
        NULL, HFILL }
9937
14
    },
9938
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_type,
9939
14
      { "Type of spatial validity condition", "gsm_a.gm.sm.pco.ecs_addr.spatial_valid_cond_type",
9940
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_type_vals), 0x0f,
9941
14
        NULL, HFILL }
9942
14
    },
9943
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_ipv4,
9944
14
      { "ECS IPv4 address", "gsm_a.gm.sm.pco.ecs_addr.ipv4",
9945
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
9946
14
        NULL, HFILL }
9947
14
    },
9948
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_ipv6,
9949
14
      { "ECS IPv6 address", "gsm_a.gm.sm.pco.ecs_addr.ipv6",
9950
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
9951
14
        NULL, HFILL }
9952
14
    },
9953
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_fqdn_len,
9954
14
      { "ECS FQDN address length", "gsm_a.gm.sm.pco.ecs_addr.fqdn.len",
9955
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9956
14
        NULL, HFILL }
9957
14
    },
9958
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_fqdn,
9959
14
      { "ECS FQDN address", "gsm_a.gm.sm.pco.ecs_addr.fqdn",
9960
14
        FT_STRING, BASE_NONE, NULL, 0x0,
9961
14
        NULL, HFILL }
9962
14
    },
9963
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_cont_len,
9964
14
      { "Spatial validity condition contents length", "gsm_a.gm.sm.pco.ecs_addr.spatial_valid_cond_cont_len",
9965
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
9966
14
        NULL, HFILL }
9967
14
    },
9968
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_spatial_valid_cond_cont,
9969
14
      { "Spatial validity condition contents", "gsm_a.gm.sm.pco.ecs_addr.spatial_valid_cond_cont",
9970
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
9971
14
        NULL, HFILL }
9972
14
    },
9973
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_espili,
9974
14
      { "ESPILI", "gsm_a.gm.sm.pco.ecs_addr.espili",
9975
14
        FT_BOOLEAN, 8, TFS(&tfs_included_not_included), 0x02,
9976
14
        NULL, HFILL }
9977
14
    },
9978
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_eami,
9979
14
      { "EAMI", "gsm_a.gm.sm.pco.ecs_addr.eami",
9980
14
        FT_BOOLEAN, 8, TFS(&tfs_included_not_included), 0x01,
9981
14
        NULL, HFILL }
9982
14
    },
9983
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_tlsgi,
9984
14
      { "TLSGI", "gsm_a.gm.sm.pco.ecs_addr.tlsgi",
9985
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
9986
14
        NULL, HFILL }
9987
14
    },
9988
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_tlsai,
9989
14
      { "TLSAI", "gsm_a.gm.sm.pco.ecs_addr.tlsai",
9990
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
9991
14
        NULL, HFILL }
9992
14
    },
9993
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_tlscsci,
9994
14
      { "TLSCSCI", "gsm_a.gm.sm.pco.ecs_addr.tlscsci",
9995
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
9996
14
        NULL, HFILL }
9997
14
    },
9998
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_supported_plmns_info_list_cont_len,
9999
14
      { "ECS supported PLMNs information list length", "gsm_a.gm.sm.pco.ecs_addr.supported_plmns_info_list_cont_len",
10000
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
10001
14
        NULL, HFILL }
10002
14
    },
10003
14
    { &hf_gsm_a_gm_sm_pco_ecs_addr_supported_plmns_info_list_cont,
10004
14
      { "ECS supported PLMNs information list", "gsm_a.gm.sm.pco.ecs_addr.supported_plmns_info_list_cont",
10005
14
        FT_BYTES, BASE_NONE, NULL, 0x0,
10006
14
        NULL, HFILL }
10007
14
    },
10008
14
    { &hf_gsm_a_gm_sm_pco_ecsp_id,
10009
14
      { "ECSP identifier", "gsm_a.gm.sm.pco.ecsp_id",
10010
14
        FT_STRING, BASE_NONE, NULL, 0x0,
10011
14
        NULL, HFILL }
10012
14
    },
10013
14
    { &hf_gsm_a_gm_sm_pco_pvs_ipv4,
10014
14
      { "PVS IPv4 address", "gsm_a.gm.sm.pco.pvs.ipv4",
10015
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
10016
14
        NULL, HFILL }
10017
14
    },
10018
14
    { &hf_gsm_a_gm_sm_pco_pvs_ipv6,
10019
14
      { "PVS IPv6 address", "gsm_a.gm.sm.pco.pvs.ipv6",
10020
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
10021
14
        NULL, HFILL }
10022
14
    },
10023
14
    { &hf_gsm_a_gm_sm_pco_pvs_name_len,
10024
14
      { "PVS name length", "gsm_a.gm.sm.pco.pvs.name.len",
10025
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
10026
14
        NULL, HFILL }
10027
14
    },
10028
14
    { &hf_gsm_a_gm_sm_pco_pvs_name,
10029
14
      { "PVS name", "gsm_a.gm.sm.pco.pvs.name",
10030
14
        FT_STRING, BASE_NONE, NULL, 0x0,
10031
14
        NULL, HFILL }
10032
14
    },
10033
14
    { &hf_gsm_a_gm_sm_pco_pvs_s_nssai_ind,
10034
14
      { "S-NSSAI indicator", "gsm_a.gm.sm.pco.pvs.s_nssai_ind",
10035
14
        FT_BOOLEAN, 8, TFS(&tfs_present_absent), 0x02,
10036
14
        NULL, HFILL }
10037
14
    },
10038
14
    { &hf_gsm_a_gm_sm_pco_pvs_dnn_ind,
10039
14
      { "DNN indicator", "gsm_a.gm.sm.pco.pvs.dnn_ind",
10040
14
        FT_BOOLEAN, 8, TFS(&tfs_present_absent), 0x01,
10041
14
        NULL, HFILL }
10042
14
    },
10043
14
    { &hf_gsm_a_gm_sm_pco_pvs_dnn_len,
10044
14
      { "DNN length", "gsm_a.gm.sm.pco.pvs.dnn_len",
10045
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
10046
14
        NULL, HFILL }
10047
14
    },
10048
14
    { &hf_gsm_a_gm_sm_pco_pvs_s_nssai_len,
10049
14
      { "S-NSSAI length", "gsm_a.gm.sm.pco.pvs.s_nssai_len",
10050
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
10051
14
        NULL, HFILL }
10052
14
    },
10053
14
    { &hf_gsm_a_gm_sm_pco_dns_serv_sec_prot_support,
10054
14
      { "DNS server security protocol type", "gsm_a.gm.sm.pco.dns_serv_sec_prot_support",
10055
14
        FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sm_pco_dns_serv_sec_prot_support_vals), 0x0,
10056
14
        NULL, HFILL }
10057
14
    },
10058
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_fqdn,
10059
14
      { "With impacted EAS FQDN address range", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind.fqdn",
10060
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
10061
14
        NULL, HFILL }
10062
14
    },
10063
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_ipv6,
10064
14
      { "With impacted EAS IPv6 address range", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind.ipv6",
10065
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
10066
14
        NULL, HFILL }
10067
14
    },
10068
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_ipv4,
10069
14
      { "With impacted EAS IPv4 address range", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind.ipv4",
10070
14
        FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
10071
14
        NULL, HFILL }
10072
14
    },
10073
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv4_range_low,
10074
14
      { "With impacted EAS IPv4 address range low", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind_with_impacted_eas_ipv4_range.low",
10075
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
10076
14
        NULL, HFILL }
10077
14
    },
10078
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv4_range_high,
10079
14
      { "With impacted EAS IPv4 address range high", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind_with_impacted_eas_ipv4_range.high",
10080
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
10081
14
        NULL, HFILL }
10082
14
    },
10083
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv6_range_low,
10084
14
      { "With impacted EAS IPv6 address range low", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind_with_impacted_eas_ipv6_range.low",
10085
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
10086
14
        NULL, HFILL }
10087
14
    },
10088
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_ipv6_range_high,
10089
14
      { "With impacted EAS IPv6 address range high", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind_with_impacted_eas_ipv6_range.high",
10090
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
10091
14
        NULL, HFILL }
10092
14
    },
10093
14
    { &hf_gsm_a_gm_sm_pco_eas_rediscovery_support_ind_with_impacted_eas_fqdn,
10094
14
      { "With impacted EAS FQDN", "gsm_a.gm.sm.pco.eas_rediscovery_support_ind_with_impacted_eas_fqdn",
10095
14
        FT_STRING, BASE_NONE, NULL, 0x0,
10096
14
        NULL, HFILL }
10097
14
    },
10098
14
    { &hf_gsm_a_gm_sm_pco_sdnaepc_dn_specific_id,
10099
14
      { "SDNAEPC DN-specific identity", "gsm_a.gm.sm.pco.sdnaepc_dn_specific_id",
10100
14
        FT_STRING, BASE_NONE, NULL, 0x0,
10101
14
        NULL, HFILL }
10102
14
    },
10103
14
    { &hf_gsm_a_gm_sm_pco_s_nssai_sel_by_ms_s_nssai_len,
10104
14
      { "S-NSSAI length", "gsm_a.gm.sm.pco.s_nssai_sel_by_ms.s_nssai_len",
10105
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
10106
14
        NULL, HFILL }
10107
14
    },
10108
    /* Generated from convert_proto_tree_add_text.pl */
10109
14
    { &hf_gsm_a_gm_presence, { "Presence", "gsm_a.gm.gmm.presence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10110
14
    { &hf_gsm_a_gm_8psk_power_class, { "8PSK Power Class", "gsm_a.gm.8psk_power_class", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_8psk_power_class_vals), 0x0, NULL, HFILL }},
10111
14
    { &hf_gsm_a_gm_rf_power_capability, { "RF Power Capability", "gsm_a.gm.rf_power_capability", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10112
14
    { &hf_gsm_a_gm_a5_bits, { "A5 Bits", "gsm_a.gm.a5_bits", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10113
14
    { &hf_gsm_a_gm_8psk_power_capability, { "8PSK Power Capability", "gsm_a.gm.8psk_power_capability", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_8psk_power_cap_vals), 0x0, NULL, HFILL }},
10114
14
    { &hf_gsm_a_gm_extended_dtm_gprs_multi_slot_class, { "Extended DTM GPRS Multi Slot Class", "gsm_a.gm.extended_dtm_gprs_multi_slot_class", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_extended_dtm_gprs_multi_slot_class_vals), 0x0, NULL, HFILL }},
10115
14
    { &hf_gsm_a_gm_extended_dtm_egprs_multi_slot_class, { "Extended DTM EGPRS Multi Slot Class", "gsm_a.gm.extended_dtm_egprs_multi_slot_class", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_extended_dtm_gprs_multi_slot_class_vals), 0x0, NULL, HFILL }},
10116
14
    { &hf_gsm_a_gm_high_multislot_capability, { "High Multislot Capability", "gsm_a.gm.high_multislot_capability", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10117
14
    { &hf_gsm_a_gm_gmsk_multislot_power_profile, { "GMSK Multislot Power Profile", "gsm_a.gm.gmsk_multislot_power_profile", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_gmsk_multislot_power_profile_vals), 0x0, NULL, HFILL }},
10118
14
    { &hf_gsm_a_gm_8psk_multislot_power_profile, { "8-PSK Multislot Power Profile", "gsm_a.gm.8psk_multislot_power_profile", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_8psk_multislot_power_profile_vals), 0x0, NULL, HFILL }},
10119
14
    { &hf_gsm_a_gm_update_result, { "Update Result", "gsm_a.gm.gmm.update_result", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_update_res_vals), 0x70, NULL, HFILL }},
10120
14
    { &hf_gsm_a_gm_radio_priority_pdp, { "Radio Priority (PDP or SMS)", "gsm_a.gm.radio_priority_pdp", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_radio_prio_vals), 0x07, NULL, HFILL }},
10121
14
    { &hf_gsm_a_gm_radio_priority_tom8, { "Radio Priority (TOM8)", "gsm_a.gm.radio_priority_tom8", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_radio_prio_vals), 0x70, NULL, HFILL }},
10122
14
    { &hf_gsm_a_gm_configuration_protocol, { "Configuration Protocol", "gsm_a.gm.configuration_protocol", FT_UINT8, BASE_DEC, NULL, 0x7, NULL, HFILL }},
10123
14
    { &hf_gsm_a_gm_sm_pco_length, { "Length", "gsm_a.gm.sm.pco.length", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10124
14
    { &hf_gsm_a_gm_sm_pco_length2, { "Length", "gsm_a.gm.sm.pco.length", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10125
14
    { &hf_gsm_a_gm_sm_pco_pcscf_ipv6, { "IPv6", "gsm_a.gm.sm.pco.pcscf.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10126
14
    { &hf_gsm_a_gm_sm_pco_dns_ipv6, { "IPv6", "gsm_a.gm.sm.pco.dns.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10127
14
    { &hf_gsm_a_gm_sm_pco_dsmipv6_home_agent_ipv6, { "IPv6", "gsm_a.gm.sm.pco.dsmipv6_home_agent.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10128
14
    { &hf_gsm_a_gm_sm_pco_dsmipv6_home_network_ipv6, { "IPv6", "gsm_a.gm.sm.pco.dsmipv6_home_network.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10129
14
    { &hf_gsm_a_gm_sm_pco_dsmipv6_home_network_prefix_length, { "Prefix length", "gsm_a.gm.sm.pco.dsmipv6_home_network.ipv6_prefix_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10130
14
    { &hf_gsm_a_gm_sm_pco_reject_code, { "Reject Code", "gsm_a.gm.sm.pco.reject_code", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10131
14
    { &hf_gsm_a_gm_sm_pco_dsmipv6_home_agent_ipv4, { "IPv4", "gsm_a.gm.sm.pco.dsmipv6_home_agent.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10132
14
    { &hf_gsm_a_gm_sm_pco_pcscf_ipv4, { "IPv4", "gsm_a.gm.sm.pco.pcscf.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10133
14
    { &hf_gsm_a_gm_sm_pco_dns_ipv4, { "IPv4", "gsm_a.gm.sm.pco.dns.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10134
14
    { &hf_gsm_a_gm_sm_pco_ipv4_link_mtu_size, { "IPv4 link MTU size", "gsm_a.gm.sm.pco.ipv4_link_mtu_size", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_octet_octets), 0x0, NULL, HFILL }},
10135
14
    { &hf_gsm_a_gm_sm_pco_nbifom_mode, { "NBIFOM mode", "gsm_a.gm.sm.pco.nbifom_mode", FT_UINT8, BASE_HEX, VALS(gsm_a_gm_nbifom_mode_vals), 0x0, NULL, HFILL }},
10136
14
    { &hf_gsm_a_gm_sm_pco_non_ip_link_mtu_size, { "Non-IP link MTU size", "gsm_a.gm.sm.pco.non_ip_link_mtu_size", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_octet_octets), 0x0, NULL, HFILL }},
10137
14
    { &hf_gsm_a_gm_sm_pco_sel_bearer_ctrl_mode, { "Selected Bearer Control Mode", "gsm_a.gm.sm.pco.sel_bearer_ctrl_mode", FT_UINT8, BASE_DEC, VALS(gsm_a_gm_sel_bearer_ctrl_mode_vals), 0x0, NULL, HFILL }},
10138
14
    { &hf_gsm_a_sm_pdp_type_number, { "PDP type number", "gsm_a.gm.sm.pdp_type_number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10139
14
    { &hf_gsm_a_sm_pdp_address, { "PDP address", "gsm_a.gm.sm.pdp_address", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10140
14
    { &hf_gsm_a_sm_qos_maximum_sdu_size, { "Maximum SDU size", "gsm_a.gm.sm.qos.maximum_sdu_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10141
14
    { &hf_gsm_a_gm_ti_value, { "TI value", "gsm_a.gm.ti_value", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10142
14
    { &hf_gsm_a_sm_tft_packet_filter, { "Packet filter", "gsm_a.gm.sm.tft.packet_filter", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10143
14
    { &hf_gsm_a_sm_tft_packet_evaluation_precedence, { "Packet evaluation precedence", "gsm_a.gm.sm.tft.packet_evaluation_precedence", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10144
14
    { &hf_gsm_a_sm_tft_packet_filter_length, { "Packet filter length", "gsm_a.gm.sm.tft.packet_filter_length", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
10145
14
    { &hf_gsm_a_sm_tft_authorization_token_value, { "Authorization token value", "gsm_a.gm.sm.tft.authorization_token_value", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10146
14
    { &hf_gsm_a_sm_tft_media_component_number_value, { "Media Component number value", "gsm_a.gm.sm.tft.media_component_number_value", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10147
14
    { &hf_gsm_a_sm_tft_ip_flow_number, { "IP flow number", "gsm_a.gm.sm.tft.ip_flow_number", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10148
14
    { &hf_gsm_a_sm_tft_packet_filter_identifier, { "Packet filter identifier", "gsm_a.gm.sm.tft.packet_filter_identifier", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10149
14
    { &hf_gsm_a_sm_tft_parameter_content, { "Parameter content", "gsm_a.gm.sm.tft.parameter_content", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10150
14
    { &hf_gsm_a_sm_tft_packet_filter_component_type_id, { "Packet filter component type identifier", "gsm_a.gm.sm.tft.packet_filter_component_type_id", FT_UINT8, BASE_DEC, VALS(packet_filter_component_type_vals), 0x0, NULL, HFILL }},
10151
14
  };
10152
10153
14
  static ei_register_info ei[] = {
10154
14
    { &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 }},
10155
14
    { &ei_gsm_a_gm_not_enough_data, { "gsm_a.gm.not_enough_data", PI_PROTOCOL, PI_WARN, "Not enough data", EXPFILL }},
10156
14
    { &ei_gsm_a_gm_undecoded, { "gsm_a.gm.undecoded", PI_UNDECODED, PI_WARN, "Not decoded", EXPFILL }},
10157
14
    { &ei_gsm_a_gm_missing_mandatory_element, { "gsm_a.gm.missing_mandatory_element", PI_PROTOCOL, PI_ERROR, "Missing Mandatory element, rest of dissection is suspect", EXPFILL }},
10158
14
  };
10159
10160
14
  expert_module_t* expert_gsm_a_gm;
10161
10162
  /* Setup protocol subtree array */
10163
14
#define NUM_INDIVIDUAL_ELEMS  7
10164
14
  int *ett[NUM_INDIVIDUAL_ELEMS +
10165
14
      NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SM +
10166
14
      NUM_GSM_GM_ELEM];
10167
10168
14
  ett[0]  = &ett_gmm_radio_cap;
10169
14
  ett[1]  = &ett_gmm_rai;
10170
14
  ett[2]  = &ett_sm_tft;
10171
14
  ett[3]  = &ett_gmm_gprs_timer;
10172
14
  ett[4]  = &ett_gmm_network_cap;
10173
14
  ett[5]  = &ett_gsm_a_gm_msrac_multislot_capability;
10174
14
  ett[6]  = &ett_sm_pco;
10175
10176
14
  last_offset = NUM_INDIVIDUAL_ELEMS;
10177
10178
350
  for (i=0; i<NUM_GSM_DTAP_MSG_GMM; i++, last_offset++)
10179
336
  {
10180
336
    ett[last_offset] = &ett_gsm_dtap_msg_gmm[i];
10181
336
  }
10182
10183
434
  for (i=0; i<NUM_GSM_DTAP_MSG_SM; i++, last_offset++)
10184
420
  {
10185
420
    ett[last_offset] = &ett_gsm_dtap_msg_sm[i];
10186
420
  }
10187
10188
1.09k
  for (i=0; i<NUM_GSM_GM_ELEM; i++, last_offset++)
10189
1.07k
  {
10190
1.07k
    ett[last_offset] = &ett_gsm_gm_elem[i];
10191
1.07k
  }
10192
10193
14
  proto_a_gm =
10194
14
    proto_register_protocol("GSM A-I/F GPRS Mobility and Session Management", "GSM Management", "gsm_a.gm");
10195
10196
14
  proto_register_field_array(proto_a_gm, hf, array_length(hf));
10197
10198
14
  proto_register_subtree_array(ett, array_length(ett));
10199
14
  expert_gsm_a_gm = expert_register_protocol(proto_a_gm);
10200
14
  expert_register_field_array(expert_gsm_a_gm, ei, array_length(ei));
10201
10202
  /* subdissector code */
10203
14
  gprs_sm_pco_subdissector_table = register_dissector_table("sm_pco.protocol",
10204
14
    "GPRS SM PCO PPP protocol", proto_a_gm, FT_UINT16, BASE_HEX);
10205
10206
14
  register_external_value_string("gsm_a_bssmap_msg_strings", gsm_a_bssmap_msg_strings);
10207
14
  register_external_value_string("gsm_a_dtap_msg_mm_strings", gsm_a_dtap_msg_mm_strings);
10208
14
  register_external_value_string("gsm_a_dtap_msg_rr_strings", gsm_a_dtap_msg_rr_strings);
10209
14
  register_external_value_string("gsm_a_dtap_msg_cc_strings", gsm_a_dtap_msg_cc_strings);
10210
14
  register_external_value_string("gsm_a_dtap_msg_gmm_strings", gsm_a_dtap_msg_gmm_strings);
10211
14
  register_external_value_string("gsm_a_dtap_msg_sms_strings", gsm_a_dtap_msg_sms_strings);
10212
14
  register_external_value_string("gsm_a_dtap_msg_sm_strings", gsm_a_dtap_msg_sm_strings);
10213
14
  register_external_value_string("gsm_a_dtap_msg_ss_strings", gsm_a_dtap_msg_ss_strings);
10214
14
  register_external_value_string("gsm_a_dtap_msg_tp_strings", gsm_a_dtap_msg_tp_strings);
10215
14
  register_external_value_string("gsm_a_rr_short_pd_msg_strings", gsm_a_rr_short_pd_msg_strings);
10216
14
}
10217
10218
void
10219
proto_reg_handoff_gsm_a_gm(void)
10220
14
{
10221
14
  rrc_irat_ho_info_handle = find_dissector_add_dependency("rrc.irat.irat_ho_info", proto_a_gm);
10222
14
  lte_rrc_ue_eutra_cap_handle = find_dissector_add_dependency("lte-rrc.ue_eutra_cap", proto_a_gm);
10223
14
  nbifom_handle = find_dissector_add_dependency("nbifom", proto_a_gm);
10224
14
  eap_handle = find_dissector_add_dependency("eap", proto_a_gm);
10225
14
}
10226
10227
/*
10228
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
10229
 *
10230
 * Local variables:
10231
 * c-basic-offset: 8
10232
 * tab-width: 8
10233
 * indent-tabs-mode: t
10234
 * End:
10235
 *
10236
 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
10237
 * :indentSize=8:tabSize=8:noTabs=false:
10238
 */