Coverage Report

Created: 2026-08-14 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-bssgp.c
Line
Count
Source
1
/* packet-bssgp.c
2
 * Routines for Base Station Subsystem GPRS Protocol dissection
3
 * Copyright 2000, Susanne Edlund <susanne.edlund@ericsson.com>
4
 * Copyright 2017, Anders Broman <anders.broman@ericsson.com>
5
 *
6
 * Wireshark - Network traffic analyzer
7
 * By Gerald Combs <gerald@wireshark.org>
8
 * Copyright 1998 Gerald Combs
9
 *
10
 * SPDX-License-Identifier: GPL-2.0-or-later
11
 */
12
13
/* 3GPP TS 48.018 V 6.5.0 (2004-07) Release 6 */
14
15
#include "config.h"
16
17
#include <epan/packet.h>
18
#include <epan/expert.h>
19
#include <epan/prefs.h>
20
#include <epan/asn1.h>
21
#include <epan/tfs.h>
22
#include <wsutil/array.h>
23
24
#include "packet-bssgp.h"
25
#include "packet-e212.h"
26
#include "packet-gsm_a_common.h"
27
#include "packet-ranap.h"
28
#include "packet-rrc.h"
29
#include "packet-lte-rrc.h"
30
#include "packet-s1ap.h"
31
32
/* #define BSSGP_DEBUG */
33
/*
34
 * TS 48.018 V6.6.0 (2004-11) says, of information elements:
35
 *
36
 *    Refer to General Structure Of The Information Elements/3GPP TS 48.016.
37
 *
38
 * TS 48.016 V9.0.0 (2010-02), in that section, says, of information elements:
39
 *
40
 *    When a field extends over more than one octet, the order of bit
41
 *    values progressively decreases as the octet number increases.
42
 *    The least significant bit of the field is represented by the
43
 *    lowest numbered bit of the highest numbered octet of the field.
44
 *
45
 * which sure sounds little-endian.
46
 *
47
 * [
48
 * Later comment:
49
 * Actually: To me. the above reads as being BIG_ENDIAN.
50
 *  IOW: if bytes are numbered from 0 to n, then the n'th byte
51
 *       ("highest numbered octet") has the least significant bit.
52
 * ]
53
 *
54
 * However, for some not-entirely-obvious reason, BSSGP_LITTLE_ENDIAN, which
55
 * was passed to proto_tree_add_item() as the byte-order argument, was
56
 * defined as false - which meant big-endian.
57
 *
58
 * For now, we'll use ENC_BIG_ENDIAN, now that we have ENC_BIG_ENDIAN and
59
 * REP_LITTLE_ENDIAN definitions.
60
 */
61
62
0
#define BSSGP_SEP ", "
63
64
void proto_register_bssgp(void);
65
void proto_reg_handoff_bssgp(void);
66
67
static uint8_t g_pdu_type, g_rim_application_identity;
68
static uint32_t g_bssgp_ran_inf_pdu_t_ext_c;
69
static proto_tree *gparent_tree;
70
static dissector_handle_t llc_handle;
71
static dissector_handle_t rrlp_handle;
72
static dissector_handle_t rrc_sys_info_cont_handle;
73
74
static module_t *bssgp_module;
75
static dissector_table_t diameter_3gpp_avp_dissector_table;
76
77
/* Initialize the protocol and registered fields */
78
static int proto_bssgp;
79
static int hf_bssgp_msg_type;
80
int hf_bssgp_elem_id;
81
static int hf_bssgp_ci;
82
static int hf_bssgp_flush_action;
83
static int hf_bssgp_llc_frames_disc;
84
static int hf_bssgp_ra_discriminator;
85
static int hf_bssgp_rim_app_id;
86
static int hf_bssgp_rim_seq_no;
87
static int hf_bssgp_rat_discriminator;
88
static int hf_bssgp_nacc_cause;
89
static int hf_bssgp_si3_cause;
90
static int hf_bssgp_mbms_data_ch_cause;
91
static int hf_bssgp_utra_si_cause;
92
static int hf_bssgp_num_si_psi;
93
static int hf_bssgp_si_psi_type;
94
static int hf_bssgp_ran_inf_req_pdu_t_ext_c;
95
static int hf_bssgp_ran_inf_pdu_t_ext_c;
96
static int hf_bssgp_rim_pdu_ind_ack;
97
static int hf_bssgp_rim_proto_ver_no;
98
static int hf_bssgp_bss_area_ind;
99
static int hf_bssgp_bvci;
100
static int hf_bssgp_bmax;
101
static int hf_bssgp_r;
102
static int hf_bssgp_r_pfc;
103
static int hf_bssgp_bucket_size;
104
static int hf_bssgp_bmax_pfc;
105
static int hf_bssgp_omc_id;
106
static int hf_bssgp_nsei;
107
static int hf_bssgp_rrlp_flag1;
108
109
static int hf_bssgp_delay_val;
110
static int hf_bssgp_cause;
111
static int hf_bssgp_peak_rate_gran;
112
static int hf_bssgp_cr_bit;
113
static int hf_bssgp_t_bit;
114
static int hf_bssgp_a_bit;
115
static int hf_bssgp_ra_cause;
116
static int hf_bssgp_ra_cap_upd_cause;
117
static int hf_bssgp_r_default_ms;
118
static int hf_bssgp_suspend_ref_no;
119
static int hf_bssgp_tag;
120
static int hf_bssgp_trace_ref;
121
static int hf_bssgp_trigger_id;
122
static int hf_bssgp_transaction_id;
123
static int hf_bssgp_no_of_oct;
124
static int hf_bssgp_unit_val;
125
static int hf_bssgp_gprs_timer;
126
static int hf_bssgp_mbms;
127
static int hf_bssgp_EnhancedRadioStatus;
128
static int hf_bssgp_pfcfc;
129
static int hf_bssgp_rim;
130
static int hf_bssgp_lcs;
131
static int hf_bssgp_inr;
132
static int hf_bssgp_cbl;
133
static int hf_bssgp_pfc;
134
static int hf_bssgp_bucket_full_ratio;
135
static int hf_bssgp_b_pfc;
136
137
static int hf_bssgp_precedence;
138
static int hf_bssgp_serv_utran_cco;
139
static int hf_bssgp_mbms_session_id;
140
static int hf_bssgp_mbms_cause;
141
static int hf_bssgp_mbms_stop_cause;
142
static int hf_bssgp_mbms_num_ra_ids;
143
static int hf_bssgp_session_inf;
144
static int hf_bssgp_ec_gsm_iot;
145
static int hf_bssgp_mocn;
146
static int hf_bssgp_csps_coord;
147
static int hf_bssgp_eDRX;
148
static int hf_bssgp_dcn;
149
static int hf_bssgp_gb_if;
150
static int hf_bssgp_ps_ho;
151
static int hf_bssgp_src_to_trg_transp_cont;
152
static int hf_bssgp_trg_to_src_transp_cont;
153
static int hf_bssgp_rnc_id;
154
static int hf_bssgp_page_mode;
155
static int hf_bssgp_container_id;
156
static int hf_bssgp_global_tfi;
157
static int hf_bssgp_ul_tfi;
158
static int hf_bssgp_dl_tfi;
159
static int hf_bssgp_time_to_MBMS_data_tran;
160
static int hf_bssgp_mbms_session_rep_no;
161
static int hf_bssgp_ps_ho_cmd;
162
static int hf_bssgp_sipsi;
163
static int hf_bssgp_type;
164
static int hf_bssgp_cs_indication;
165
static int hf_bssgp_flow_control_gran;
166
static int hf_bssgp_serv_eutran_cco;
167
static int hf_bssgp_sub_prof_id_f_rat_freq_prio;
168
static int hf_bssgp_eutran_irat_ho_inf_req;
169
static int hf_bssgp_irat_ho_inf_req;
170
171
static int hf_bssgp_rel_int_rat_ho_inf_ind;
172
static int hf_bssgp_csg_id;
173
static int hf_bssgp_cell_acc_mode;
174
static int hf_bssgp_redir_complete_outcome;
175
static int hf_bssgp_redir_indication_reroute_reject_cause;
176
static int hf_bssgp_unconfirm_send_state_var;
177
static int hf_bssgp_Global_ENB_ID_PDU;
178
static int hf_bssgp_SONtransferRequestContainer_PDU;
179
static int hf_bssgp_plmn_id;
180
static int hf_bssgp_num_pfc;
181
static int hf_bssgp_llc_data;
182
static int hf_bssgp_pdu_data;
183
static int hf_bssgp_rrlp_apdu;
184
static int hf_bssgp_dtm_handover_command_data;
185
static int hf_bssgp_message_elements;
186
static int hf_bssgp_spare;
187
static int hf_bssgp_si;
188
static int hf_bssgp_psi;
189
static int hf_bssgp_peak_bit_rate;
190
static int hf_bssgp_sys_info_type3_msg;
191
static int hf_bssgp_trace_type_data;
192
static int hf_bssgp_si_item;
193
static int hf_bssgp_sci;
194
static int hf_bssgp_ggsn_pgw_location;
195
static int hf_bssgp_edrx_cycle_value;
196
static int hf_bssgp_tunpo_minutes;
197
static int hf_bssgp_tunpo_seconds;
198
static int hf_bssgp_ec_dl_coverage_class;
199
static int hf_bssgp_ec_ul_coverage_class;
200
static int hf_bssgp_pei;
201
static int hf_bssgp_paging_attempt_count;
202
static int hf_bssgp_intended_num_of_pag_attempts;
203
static int hf_bssgp_extended_feature_bitmap;
204
static int hf_bssgp_prio_class_ind;
205
static int hf_bssgp_prio_class_flag_b0;
206
207
/* Initialize the subtree pointers */
208
static int ett_bssgp;
209
static int ett_bssgp_new;
210
static int ett_bssgp_pfcs_to_be_set_up_list;
211
static int ett_bssgp_pfcs_to_be_set_up_list_pft;
212
static int ett_bssgp_pfcs_to_be_set_up_list_abqp;
213
static int ett_bssgp_pfcs_to_be_set_up_list_arp;
214
static int ett_bssgp_pfcs_to_be_set_up_list_t10;
215
static int ett_bssgp_list_of_setup_pfcs;
216
static int ett_bssgp_pfc_flow_control_parameters_pfc;
217
static int ett_bssgp_ra_id;
218
static int ett_bssgp_extended_feature_bitmap;
219
static int ett_bssgp_prio_class_ind;
220
221
static expert_field ei_bssgp_extraneous_data;
222
static expert_field ei_bssgp_missing_mandatory_element;
223
static expert_field ei_bssgp_not_dissected_yet;
224
static expert_field ei_bssgp_erroneous_app_container;
225
static expert_field ei_bssgp_si_item;
226
static expert_field ei_bssgp_unknown_rim_app_id_data;
227
static expert_field ei_bssgp_unknown_app_container;
228
static expert_field ei_bssgp_ra_discriminator;
229
static expert_field ei_bssgp_unknown_rim_app_id;
230
static expert_field ei_bssgp_msg_type;
231
static expert_field ei_bssgp_ran_inf_app_cont_utra_si;
232
233
/* PDU type coding, v6.5.0, table 11.3.26, p 80 */
234
#define BSSGP_PDU_DL_UNITDATA                  0x00
235
#define BSSGP_PDU_UL_UNITDATA                  0x01
236
#define BSSGP_PDU_RA_CAPABILITY                0x02
237
#define BSSGP_PDU_PTM_UNITDATA                 0x03
238
#define BSSGP_PDU_DL_MBMS_UNITDATA             0x04
239
#define BSSGP_PDU_UL_MBMS_UNITDATA             0x05
240
#define BSSGP_PDU_PAGING_PS                    0x06
241
#define BSSGP_PDU_PAGING_CS                    0x07
242
#define BSSGP_PDU_RA_CAPABILITY_UPDATE         0x08
243
#define BSSGP_PDU_RA_CAPABILITY_UPDATE_ACK     0x09
244
#define BSSGP_PDU_RADIO_STATUS                 0x0a
245
#define BSSGP_PDU_SUSPEND                      0x0b
246
#define BSSGP_PDU_SUSPEND_ACK                  0x0c
247
#define BSSGP_PDU_SUSPEND_NACK                 0x0d
248
#define BSSGP_PDU_RESUME                       0x0e
249
#define BSSGP_PDU_RESUME_ACK                   0x0f
250
#define BSSGP_PDU_RESUME_NACK                  0x10
251
#define BSSGP_PDU_PAGING_PS_REJECT             0x11
252
#define BSSGP_PDU_DUMMY_PAGING_PS              0x12
253
#define BSSGP_PDU_DUMMY_PAGING_PS_RESPONSE     0x13
254
255
#define BSSGP_PDU_MS_REG_ENQ                   0x14
256
#define BSSGP_PDU_MS_REG_ENQ_RESP              0x15
257
#define BSSGP_PDU_RESERVED_0X16                0x16
258
#define BSSGP_PDU_RESERVED_0X17                0x17
259
#define BSSGP_PDU_RESERVED_0X18                0x18
260
#define BSSGP_PDU_RESERVED_0X19                0x19
261
#define BSSGP_PDU_RESERVED_0X1A                0x1a
262
#define BSSGP_PDU_RESERVED_0X1B                0x1b
263
#define BSSGP_PDU_RESERVED_0X1C                0x1c
264
#define BSSGP_PDU_RESERVED_0X1D                0x1d
265
#define BSSGP_PDU_RESERVED_0X1E                0x1e
266
#define BSSGP_PDU_RESERVED_0X1F                0x1f
267
268
#define BSSGP_PDU_BVC_BLOCK                    0x20
269
#define BSSGP_PDU_BVC_BLOCK_ACK                0x21
270
#define BSSGP_PDU_BVC_RESET                    0x22
271
#define BSSGP_PDU_BVC_RESET_ACK                0x23
272
#define BSSGP_PDU_BVC_UNBLOCK                  0x24
273
#define BSSGP_PDU_BVC_UNBLOCK_ACK              0x25
274
#define BSSGP_PDU_FLOW_CONTROL_BVC             0x26
275
#define BSSGP_PDU_FLOW_CONTROL_BVC_ACK         0x27
276
#define BSSGP_PDU_FLOW_CONTROL_MS              0x28
277
#define BSSGP_PDU_FLOW_CONTROL_MS_ACK          0x29
278
#define BSSGP_PDU_FLUSH_LL                     0x2a
279
#define BSSGP_PDU_FLUSH_LL_ACK                 0x2b
280
#define BSSGP_PDU_LLC_DISCARDED                0x2c
281
#define BSSGP_PDU_FLOW_CONTROL_PFC             0x2d
282
#define BSSGP_PDU_FLOW_CONTROL_PFC_ACK         0x2e
283
284
#define BSSGP_PDU_RESERVED_0X2F                0x2f
285
#define BSSGP_PDU_RESERVED_0X30                0x30
286
#define BSSGP_PDU_RESERVED_0X31                0x31
287
#define BSSGP_PDU_RESERVED_0X32                0x32
288
#define BSSGP_PDU_RESERVED_0X33                0x33
289
#define BSSGP_PDU_RESERVED_0X34                0x34
290
#define BSSGP_PDU_RESERVED_0X35                0x35
291
#define BSSGP_PDU_RESERVED_0X36                0x36
292
#define BSSGP_PDU_RESERVED_0X37                0x37
293
#define BSSGP_PDU_RESERVED_0X38                0x38
294
#define BSSGP_PDU_RESERVED_0X39                0x39
295
#define BSSGP_PDU_RESERVED_0X3A                0x3a
296
#define BSSGP_PDU_RESERVED_0X3B                0x3b
297
#define BSSGP_PDU_RESERVED_0X3C                0x3c
298
#define BSSGP_PDU_RESERVED_0X3D                0x3d
299
#define BSSGP_PDU_RESERVED_0X3E                0x3e
300
#define BSSGP_PDU_RESERVED_0X3F                0x3f
301
302
#define BSSGP_PDU_SGSN_INVOKE_TRACE            0x40
303
#define BSSGP_PDU_STATUS                       0x41
304
#define BSSGP_PDU_OVERLOAD                     0x42
305
306
#define BSSGP_PDU_RESERVED_0X43                0x43
307
#define BSSGP_PDU_RESERVED_0X44                0x44
308
#define BSSGP_PDU_RESERVED_0X45                0x45
309
#define BSSGP_PDU_RESERVED_0X46                0x46
310
#define BSSGP_PDU_RESERVED_0X47                0x47
311
#define BSSGP_PDU_RESERVED_0X48                0x48
312
#define BSSGP_PDU_RESERVED_0X49                0x49
313
#define BSSGP_PDU_RESERVED_0X4A                0x4a
314
#define BSSGP_PDU_RESERVED_0X4B                0x4b
315
#define BSSGP_PDU_RESERVED_0X4C                0x4c
316
#define BSSGP_PDU_RESERVED_0X4D                0x4d
317
#define BSSGP_PDU_RESERVED_0X4E                0x4e
318
#define BSSGP_PDU_RESERVED_0X4F                0x4f
319
320
#define BSSGP_PDU_DOWNLOAD_BSS_PFC             0x50
321
#define BSSGP_PDU_CREATE_BSS_PFC               0x51
322
#define BSSGP_PDU_CREATE_BSS_PFC_ACK           0x52
323
#define BSSGP_PDU_CREATE_BSS_PFC_NACK          0x53
324
#define BSSGP_PDU_MODIFY_BSS_PFC               0x54
325
#define BSSGP_PDU_MODIFY_BSS_PFC_ACK           0x55
326
#define BSSGP_PDU_DELETE_BSS_PFC               0x56
327
#define BSSGP_PDU_DELETE_BSS_PFC_ACK           0x57
328
#define BSSGP_PDU_DELETE_BSS_PFC_REQ           0x58
329
#define BSSGP_PDU_PS_HANDOVER_REQUIRED         0x59
330
#define BSSGP_PDU_PS_HANDOVER_REQUIRED_ACK     0x5a
331
#define BSSGP_PDU_PS_HANDOVER_REQUIRED_NACK    0x5b
332
#define BSSGP_PDU_PS_HANDOVER_REQUEST          0x5c
333
#define BSSGP_PDU_PS_HANDOVER_REQUEST_ACK      0x5d
334
#define BSSGP_PDU_PS_HANDOVER_REQUEST_NACK     0x5e
335
336
#define BSSGP_PDU_RESERVED_0X5F                0x5f
337
338
#define BSSGP_PDU_PERFORM_LOCATION_REQUEST     0x60
339
#define BSSGP_PDU_PERFORM_LOCATION_RESPONSE    0x61
340
#define BSSGP_PDU_PERFORM_LOCATION_ABORT       0x62
341
#define BSSGP_PDU_POSITION_COMMAND             0x63
342
#define BSSGP_PDU_POSITION_RESPONSE            0x64
343
344
#define BSSGP_PDU_RESERVED_0X65                0x65
345
#define BSSGP_PDU_RESERVED_0X66                0x66
346
#define BSSGP_PDU_RESERVED_0X67                0x67
347
#define BSSGP_PDU_RESERVED_0X68                0x68
348
#define BSSGP_PDU_RESERVED_0X69                0x69
349
#define BSSGP_PDU_RESERVED_0X6A                0x6a
350
#define BSSGP_PDU_RESERVED_0X6B                0x6b
351
#define BSSGP_PDU_RESERVED_0X6C                0x6c
352
#define BSSGP_PDU_RESERVED_0X6D                0x6d
353
#define BSSGP_PDU_RESERVED_0X6E                0x6e
354
#define BSSGP_PDU_RESERVED_0X6F                0x6f
355
356
0
#define BSSGP_PDU_RAN_INFORMATION              0x70
357
3
#define BSSGP_PDU_RAN_INFORMATION_REQUEST      0x71
358
#define BSSGP_PDU_RAN_INFORMATION_ACK          0x72
359
#define BSSGP_PDU_RAN_INFORMATION_ERROR        0x73
360
0
#define BSSGP_PDU_RAN_INFORMATION_APP_ERROR    0x74
361
362
#define BSSGP_PDU_RESERVED_0X75                0x75
363
#define BSSGP_PDU_RESERVED_0X76                0x76
364
#define BSSGP_PDU_RESERVED_0X77                0x77
365
#define BSSGP_PDU_RESERVED_0X78                0x78
366
#define BSSGP_PDU_RESERVED_0X79                0x79
367
#define BSSGP_PDU_RESERVED_0X7A                0x7a
368
#define BSSGP_PDU_RESERVED_0X7B                0x7b
369
#define BSSGP_PDU_RESERVED_0X7C                0x7c
370
#define BSSGP_PDU_RESERVED_0X7D                0x7d
371
#define BSSGP_PDU_RESERVED_0X7E                0x7e
372
#define BSSGP_PDU_RESERVED_0X7F                0x7f
373
374
#define BSSGP_PDU_MBMS_SESSION_START_REQ       0x80
375
#define BSSGP_PDU_MBMS_SESSION_START_RESP      0x81
376
#define BSSGP_PDU_MBMS_SESSION_STOP_REQ        0x82
377
#define BSSGP_PDU_MBMS_SESSION_STOP_RESP       0x83
378
#define BSSGP_PDU_MBMS_SESSION_UPDATE_REQ      0x84
379
#define BSSGP_PDU_MBMS_SESSION_UPDATE_RESP     0x85
380
381
#define BSSGP_PDU_RESERVED_0X86                0x86
382
#define BSSGP_PDU_RESERVED_0X87                0x87
383
#define BSSGP_PDU_RESERVED_0X88                0x88
384
#define BSSGP_PDU_RESERVED_0X89                0x89
385
#define BSSGP_PDU_RESERVED_0X8A                0x8a
386
#define BSSGP_PDU_RESERVED_0X8B                0x8b
387
#define BSSGP_PDU_RESERVED_0X8C                0x8c
388
#define BSSGP_PDU_RESERVED_0X8D                0x8d
389
#define BSSGP_PDU_RESERVED_0X8E                0x8e
390
#define BSSGP_PDU_RESERVED_0X8F                0x8f
391
392
#define BSSGP_PDU_RESERVED_0X90                0x90
393
#define BSSGP_PDU_PS_HANDOVER_COMPLETE         0x91
394
#define BSSGP_PDU_PS_HANDOVER_CANCEL           0x92
395
#define BSSGP_PDU_PS_HANDOVER_COMPLETE_ACK     0x93
396
397
/* Information element coding, v 6.5.0, table 11.3, p 72 */
398
#define BSSGP_IEI_ALIGNMENT_OCTETS                         0x00
399
#define BSSGP_IEI_BMAX_DEFAULT_MS                          0x01
400
#define BSSGP_IEI_BSS_AREA_INDICATION                      0x02
401
#define BSSGP_IEI_BUCKET_LEAK_RATE                         0x03
402
#define BSSGP_IEI_BVCI                                     0x04
403
#define BSSGP_IEI_BVC_BUCKET_SIZE                          0x05
404
#define BSSGP_IEI_BVC_MEASUREMENT                          0x06
405
#define BSSGP_IEI_CAUSE                                    0x07
406
#define BSSGP_IEI_CELL_IDENTIFIER                          0x08
407
#define BSSGP_IEI_CHANNEL_NEEDED                           0x09
408
#define BSSGP_IEI_DRX_PARAMETERS                           0x0a
409
#define BSSGP_IEI_EMLPP_PRIORITY                           0x0b
410
#define BSSGP_IEI_FLUSH_ACTION                             0x0c
411
#define BSSGP_IEI_IMSI                                     0x0d
412
#define BSSGP_IEI_LLC_PDU                                  0x0e
413
#define BSSGP_IEI_LLC_FRAMES_DISCARDED                     0x0f
414
#define BSSGP_IEI_LOCATION_AREA                            0x10
415
#define BSSGP_IEI_MOBILE_ID                                0x11
416
#define BSSGP_IEI_MS_BUCKET_SIZE                           0x12
417
#define BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY               0x13
418
#define BSSGP_IEI_OMC_ID                                   0x14
419
#define BSSGP_IEI_PDU_IN_ERROR                             0x15
420
#define BSSGP_IEI_PDU_LIFETIME                             0x16
421
#define BSSGP_IEI_PRIORITY                                 0x17
422
#define BSSGP_IEI_QOS_PROFILE                              0x18
423
#define BSSGP_IEI_RADIO_CAUSE                              0x19
424
#define BSSGP_IEI_RA_CAP_UPD_CAUSE                         0x1a
425
#define BSSGP_IEI_ROUTING_AREA                             0x1b
426
#define BSSGP_IEI_R_DEFAULT_MS                             0x1c
427
#define BSSGP_IEI_SUSPEND_REFERENCE_NUMBER                 0x1d
428
#define BSSGP_IEI_TAG                                      0x1e
429
#define BSSGP_IEI_TLLI                                     0x1f
430
#define BSSGP_IEI_TMSI                                     0x20
431
#define BSSGP_IEI_TRACE_REFERENCE                          0x21
432
#define BSSGP_IEI_TRACE_TYPE                               0x22
433
#define BSSGP_IEI_TRANSACTION_ID                           0x23
434
#define BSSGP_IEI_TRIGGER_ID                               0x24
435
#define BSSGP_IEI_NUMBER_OF_OCTETS_AFFECTED                0x25
436
#define BSSGP_IEI_LSA_IDENTIFIER_LIST                      0x26
437
#define BSSGP_IEI_LSA_INFORMATION                          0x27
438
#define BSSGP_IEI_PFI                                      0x28
439
#define BSSGP_IEI_GPRS_TIMER                               0x29
440
#define BSSGP_IEI_ABQP                                     0x3a
441
#define BSSGP_IEI_FEATURE_BITMAP                           0x3b
442
#define BSSGP_IEI_BUCKET_FULL_RATIO                        0x3c
443
#define BSSGP_IEI_SERVICE_UTRAN_CCO                        0x3d
444
#define BSSGP_IEI_NSEI                                     0x3e
445
#define BSSGP_IEI_RRLP_APDU                                0x3f
446
#define BSSGP_IEI_LCS_QOS                                  0x40
447
#define BSSGP_IEI_LCS_CLIENT_TYPE                          0x41
448
#define BSSGP_IEI_REQUESTED_GPS_ASSISTANCE_DATA            0x42
449
#define BSSGP_IEI_LOCATION_TYPE                            0x43
450
#define BSSGP_IEI_LOCATION_ESTIMATE                        0x44
451
#define BSSGP_IEI_POSITIONING_DATA                         0x45
452
#define BSSGP_IEI_DECIPHERING_KEYS                         0x46
453
#define BSSGP_IEI_LCS_PRIORITY                             0x47
454
#define BSSGP_IEI_LCS_CAUSE                                0x48
455
#define BSSGP_IEI_LCS_CAPABILITY                           0x49
456
#define BSSGP_IEI_RRLP_FLAGS                               0x4a
457
#define BSSGP_IEI_RIM_APP_ID                               0x4b
458
#define BSSGP_IEI_RIM_SEQUENCE_NUMBER                      0x4c
459
#define BSSGP_IEI_RAN_INF_REQUEST_APP_CONTAINER            0x4d
460
#define BSSGP_IEI_RAN_INF_APP_CONTAINER                    0x4e
461
#define BSSGP_IEI_RIM_PDU_INDICATIONS                      0x4f
462
#define BSSGP_IEI_NUMBER_OF_CONTAINER_UNITS                0x50
463
/* x51 This value should not be used, as it has been used in earlier versions of
464
this protocol. */
465
#define BSSGP_IEI_PFC_FLOW_CONTROL_PARAMETERS              0x52
466
#define BSSGP_IEI_GLOBAL_CN_ID                             0x53
467
#define BSSGP_IEI_RIM_ROUTING_INFORMATION                  0x54
468
#define BSSGP_IEI_RIM_PROTOCOL_VERSION                     0x55
469
#define BSSGP_IEI_APPLICATION_ERROR_CONTAINER              0x56
470
#define BSSGP_IEI_RAN_INF_REQUEST_RIM_CONTAINER            0x57
471
#define BSSGP_IEI_RAN_INF_RIM_CONTAINER                    0x58
472
#define BSSGP_IEI_RAN_INF_APP_ERROR_RIM_CONTAINER          0x59
473
#define BSSGP_IEI_RAN_INF_ACK_RIM_CONTAINER                0x5a
474
#define BSSGP_IEI_RAN_INF_ERROR_RIM_CONTAINER              0x5b
475
476
/*
477
x5c TMGI
478
x5d MBMS Session Identity
479
x5e MBMS Session Duration
480
x5f MBMS Service Area Identity List
481
x60 MBMS Response
482
x61 MBMS Routing Area List
483
x62 MBMS Session Information
484
x63 MBMS Stop Cause
485
x64 Source BSS to Target BSS Transparent Container
486
x65 Target BSS to Source BSS Transparent Container
487
x66 NAS container for PS Handover
488
x67 PFCs to be set-up list
489
x68 List of set-up PFCs
490
x69 Extended Feature Bitmap
491
x6a Source RNC to Target RNC Transparent Container
492
x6b Target RNC to Source RNC Transparent Container
493
x6c RNC Identifier
494
x6d Page Mode
495
x6e Container ID
496
x6f Global TFI
497
x70 IMEI
498
x71 Time to MBMS Data Transfer
499
x72 MBMS Session Repetition Number
500
x73 Inter RAT Handover Info
501
x74 PS Handover Command
502
x75 PS Handover Indications
503
x76 SI/PSI Container
504
x77 Active PFCs List
505
x78 Velocity Data
506
x79 DTM Handover Command
507
x7a CS Indication
508
x7b Requested GANSS Assistance Data
509
x7c GANSS Location Type
510
x7d GANSS Positioning Data
511
x7e Flow Control Granularity
512
x7f eNB Identifier
513
x80 E-UTRAN Inter RAT Handover Info
514
x81 Subscriber Profile ID for RAT/Frequency priority
515
x82 Request for Inter RAT Handover Info
516
x83 Reliable Inter RAT Handover Info
517
x84 SON Transfer Application Identity
518
x85 CSG Identifier
519
x86 TAC
520
*/
521
522
#define BSSGP_IEI_REDIR_ATTEMP_FLG                         0x87
523
#define BSSGP_IEI_REDIR_INDICATION                         0x88
524
#define BSSGP_IEI_REDIR_COMPLETE                           0x89
525
#define BSSGP_IEI_UNCONFIRM_SEND_STATE_VAR                 0x8a
526
#define BSSGP_IEI_SCI                                      0x8c
527
#define BSSGP_IEI_GGSN_PGW_LOCATION                        0x8d
528
#define BSSGP_IEI_SELECTED_PLMN_ID                         0x8e
529
#define BSSGP_IEI_PRIORITY_CLASS_INDICATOR                 0x8f
530
531
/*
532
x90     Source Cell ID
533
x91     IRAT Measurement Configuration (extended E-ARFCNs)
534
*/
535
#define BSSGP_IEI_EDRX_PARAMETERS                          0x92
536
#define BSSGP_IEI_TUNPO                                    0x93
537
#define BSSGP_IEI_COVERAGE_CLASS                           0x98
538
#define BSSGP_IEI_PAG_ATTEMPT_INFO                         0x99
539
#define BSSGP_IEI_EXCEPTION_REPORT_FLAG                    0x9a
540
#define BSSGP_IEI_OLD_RA_IDENTIFICATION                    0x9b
541
#define BSSGP_IEI_ATTACH_INDIC                             0x9c
542
#define BSSGP_IEI_PLMN_ID                                  0x9d
543
/*
544
x9e     MME Query
545
x9f     SGSN Group Identity
546
xa0     Additional P-TMSI
547
xa1     UE Usage Type
548
xa2     Multilateration Timer
549
xa3     Multilateration Timing Advance
550
xa4     MS Sync Accuracy
551
xa5     BTS Reception Accuracy Level
552
xa6     Timing Advance Request
553
554
*/
555
556
/* Macros */
557
/* Defined locally here without the check of curr_len wrapping, that will be taken care of when this IEI dissection finishes */
558
1.01k
#define ELEM_IN_ELEM_MAND_TELV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
559
1.01k
{\
560
1.01k
    if ((consumed = elem_telv(tvb, tree, pinfo, (uint8_t) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
561
1.01k
    { \
562
37
        curr_offset += consumed; \
563
37
        curr_len -= consumed; \
564
37
    } \
565
1.01k
    else \
566
1.01k
    { \
567
974
        proto_tree_add_expert_format(tree, pinfo, &ei_bssgp_missing_mandatory_element,\
568
974
            tvb, curr_offset, 0, \
569
974
            "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect", \
570
974
            EMT_iei, \
571
974
            get_gsm_a_msg_string(pinfo->pool, EMT_pdu_type, EMT_elem_idx), \
572
974
            (EMT_elem_name_addition == NULL) ? "" : EMT_elem_name_addition \
573
974
            ); \
574
974
    } \
575
1.01k
}
576
577
5.97k
#define ELEM_IN_ELEM_OPT_TELV(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
578
5.97k
{\
579
5.97k
    if (curr_len != 0){\
580
5.85k
        if ((consumed = elem_telv(tvb, tree, pinfo, (uint8_t) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, curr_len, EOT_elem_name_addition)) > 0) \
581
5.85k
        { \
582
188
            curr_offset += consumed; \
583
188
            curr_len -= consumed; \
584
188
        } \
585
5.85k
    } \
586
5.97k
}
587
588
/* Forward declarations */
589
static uint16_t de_bssgp_ran_inf_request_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_);
590
static uint16_t de_bssgp_ran_inf_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_);
591
static uint16_t de_bssgp_ran_inf_ack_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_);
592
static uint16_t de_bssgp_ran_inf_error_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_);
593
static uint16_t de_bssgp_ran_inf_app_error_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_);
594
595
596
#if 0
597
static const value_string tab_nacc_cause[]={
598
    { 0x00,           "Other unspecified error" },
599
    { 0x01,           "Syntax error in the Application Container" },
600
    { 0x02,           "Reporting Cell Identifier does not match with the Destination Cell Identifier or with the Source Cell Identifier" },
601
    { 0x03,           "SI/PSI type error" },
602
    { 0x04,           "Inconsistent length of a SI/PSI message" },
603
    { 0x05,           "Inconsistent set of messages" },
604
    { 0,              NULL },
605
606
};
607
#endif
608
609
610
/*
611
 * 11.3 Information Element Identifier (IEI)
612
 */
613
614
/*
615
 * 11.3.1   Alignment octets
616
 */
617
static uint16_t
618
de_bssgp_aligment_octets(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
619
20
{
620
20
    uint32_t curr_offset;
621
622
20
    curr_offset = offset;
623
624
20
    proto_tree_add_item(tree, hf_bssgp_spare, tvb, curr_offset, len, ENC_NA);
625
626
20
    return len;
627
20
}
628
629
/*
630
 * 11.3.2   Bmax default MS
631
 */
632
static uint16_t
633
de_bssgp_bmax_default_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
634
1
{
635
1
    uint32_t curr_offset;
636
637
1
    curr_offset = offset;
638
639
1
    proto_tree_add_item(tree, hf_bssgp_bmax, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
640
1
    curr_offset+=2;
641
642
1
    return curr_offset-offset;
643
1
}
644
/*
645
 * 11.3.3   BSS Area Indication
646
 */
647
static uint16_t
648
de_bssgp_bss_area_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_)
649
8
{
650
8
    uint32_t curr_offset;
651
652
8
    curr_offset = offset;
653
654
8
    proto_tree_add_item(tree, hf_bssgp_bss_area_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
655
8
    curr_offset++;
656
657
8
    return curr_offset-offset;
658
8
}
659
/*
660
 * 11.3.4   Bucket Leak Rate (R)
661
 */
662
static uint16_t
663
de_bssgp_bucket_leak_rate(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
664
3
{
665
3
    uint32_t curr_offset;
666
667
3
    curr_offset = offset;
668
669
3
    proto_tree_add_item(tree, hf_bssgp_r, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
670
3
    curr_offset+=2;
671
672
3
    return curr_offset-offset;
673
3
}
674
/*
675
 * 11.3.5   BVC Bucket Size
676
 */
677
static uint16_t
678
de_bssgp_bvc_bucket_size(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
679
0
{
680
0
    uint32_t curr_offset;
681
682
0
    curr_offset = offset;
683
684
0
    proto_tree_add_item(tree, hf_bssgp_bucket_size, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
685
0
    curr_offset+=2;
686
687
0
    return curr_offset-offset;
688
0
}
689
/*
690
 * 11.3.6   BVCI (BSSGP Virtual Connection Identifier)
691
 */
692
static uint16_t
693
de_bssgp_bvci(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string, int string_len)
694
34
{
695
34
    uint32_t curr_offset;
696
34
    uint16_t bvci;
697
698
34
    curr_offset = offset;
699
700
    /* octet 3-4 Unstructured value */
701
34
    proto_tree_add_item_ret_uint16(tree, hf_bssgp_bvci, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &bvci);
702
34
    curr_offset+=2;
703
704
34
    if (add_string)
705
34
        snprintf(add_string, string_len, " - 0x%x", bvci);
706
707
708
34
    return curr_offset-offset;
709
34
}
710
/*
711
 * 11.3.7   BVC Measurement
712
 */
713
static uint16_t
714
de_bssgp_bvc_meas(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
715
1
{
716
1
    uint32_t curr_offset;
717
718
1
    curr_offset = offset;
719
720
    /*  The Delay Value field is coded as a 16-bit integer value in units of centi-seconds (one hundredth of a second). This
721
     * coding provides a range of over 10 minutes in increments of 10 ms. As a special case, the hexadecimal value 0xFFFF
722
     *(decimal 65 535) shall be interpreted as "infinite delay".
723
     */
724
1
    proto_tree_add_item(tree, hf_bssgp_delay_val, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
725
1
    curr_offset+=2;
726
727
1
    return curr_offset-offset;
728
1
}
729
/*
730
 * 11.3.8   Cause
731
 */
732
static const value_string bssgp_cause_vals[] = {
733
    { 0x00, "Processor overload" },
734
    { 0x01, "Equipment failure" },
735
    { 0x02, "Transit network service failure" },
736
    { 0x03, "Network service transmission capacity modified from zero kbps to greater than zero kbps" },
737
    { 0x04, "Unknown MS" },
738
    { 0x05, "BVCI unknown" },
739
    { 0x06, "Cell traffic congestion" },
740
    { 0x07, "SGSN congestion" },
741
    { 0x08, "O&M intervention" },
742
    { 0x09, "BVCI blocked" },
743
    { 0x0a, "PFC create failure" },
744
    { 0x0b, "PFC preempted" },
745
    { 0x0c, "ABQP no more supported" },
746
747
    { 0x0d, "Undefined - protocol error - unspecified" },
748
    { 0x0e, "Undefined - protocol error - unspecified" },
749
    { 0x0f, "Undefined - protocol error - unspecified" },
750
    { 0x10, "Undefined - protocol error - unspecified" },
751
    { 0x11, "Undefined - protocol error - unspecified" },
752
    { 0x12, "Undefined - protocol error - unspecified" },
753
    { 0x13, "Undefined - protocol error - unspecified" },
754
    { 0x14, "Undefined - protocol error - unspecified" },
755
    { 0x15, "Undefined - protocol error - unspecified" },
756
    { 0x16, "Undefined - protocol error - unspecified" },
757
    { 0x17, "Undefined - protocol error - unspecified" },
758
    { 0x18, "Undefined - protocol error - unspecified" },
759
    { 0x19, "Undefined - protocol error - unspecified" },
760
    { 0x1a, "Undefined - protocol error - unspecified" },
761
    { 0x1b, "Undefined - protocol error - unspecified" },
762
    { 0x1c, "Undefined - protocol error - unspecified" },
763
    { 0x1d, "Undefined - protocol error - unspecified" },
764
    { 0x1e, "Undefined - protocol error - unspecified" },
765
    { 0x1f, "Undefined - protocol error - unspecified" },
766
767
    { 0x20, "Semantically incorrect PDU" },
768
    { 0x21, "Invalid mandatory information" },
769
    { 0x22, "Missing mandatory IE" },
770
    { 0x23, "Missing conditional IE" },
771
    { 0x24, "Unexpected conditional IE" },
772
    { 0x25, "Conditional IE error" },
773
    { 0x26, "PDU not compatible with the protocol state" },
774
    { 0x27, "Protocol error - unspecified" },
775
    { 0x28, "PDU not compatible with the feature set" },
776
    { 0x29, "Requested information not available" },
777
    { 0x2a, "Unknown destination address" },
778
    { 0x2b, "Unknown RIM application identity" },
779
    { 0x2c, "Invalid container unit information" },
780
    { 0x2d, "PFC queuing" },
781
    { 0x2e, "PFC created successfully" },
782
    { 0x2f, "T12 expiry" },
783
    { 0x30, "MS under PS Handover treatment" },
784
    { 0x31, "Uplink quality" },
785
    { 0x32, "Uplink strength" },
786
    { 0x33, "Downlink quality" },
787
    { 0x34, "Downlink strength" },
788
    { 0x35, "Distance" },
789
    { 0x36, "Better cell" },
790
    { 0x37, "Traffic" },
791
    { 0x38, "Radio contact lost with MS" },
792
    { 0x39, "MS back on old channel" },
793
    { 0x3a, "T13 expiry" },
794
    { 0x3b, "T14 expiry" },
795
    { 0x3c, "Not all requested PFCs created" },
796
    { 0x3d, "CS cause" },
797
    { 0x3e, "Requested ciphering and/or integrity protection algorithms not supported" },
798
    { 0x3f, "Relocation failure in target system" },
799
    { 0x40, "Directed Retry" },
800
    { 0x41, "Time critical relocation" },
801
    { 0x42, "PS Handover Target not allowed" },
802
    { 0x43, "PS Handover not Supported in Target BSS or Target System" },
803
    { 0x44, "Incoming relocation not supported due to PUESBINE feature" },
804
    { 0x45, "DTM Handover - No CS resource" },
805
    { 0x46, "DTM Handover - PS Allocation failure" },
806
    { 0x47, "DTM Handover - T24 expiry" },
807
    { 0x48, "DTM Handover - Invalid CS Indication IE" },
808
    { 0x49, "DTM Handover - T23 expiry" },
809
    { 0x4a, "DTM Handover - MSC Error" },
810
    { 0x4b, "Invalid CSG cell" },
811
    { 0,    NULL },
812
};
813
814
value_string_ext bssgp_cause_vals_ext = VALUE_STRING_EXT_INIT(bssgp_cause_vals);
815
816
static uint16_t
817
de_bssgp_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_)
818
10
{
819
10
    uint32_t curr_offset;
820
821
10
    curr_offset = offset;
822
823
    /*  The Delay Value field is coded as a 16-bit integer value in units of centi-seconds (one hundredth of a second). This
824
     * coding provides a range of over 10 minutes in increments of 10 ms. As a special case, the hexadecimal value 0xFFFF
825
     *(decimal 65 535) shall be interpreted as "infinite delay".
826
     */
827
10
    proto_tree_add_item(tree, hf_bssgp_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
828
10
    curr_offset+=1;
829
830
10
    return curr_offset-offset;
831
10
}
832
/*
833
 * 11.3.9   Cell Identifier
834
 */
835
/*
836
 * octets 3-8 Octets 3 to 8 contain the value part (starting with octet 2) of the
837
 * Routing Area Identification IE defined in 3GPP TS 24.008, not
838
 * including 3GPP TS 24.008 IEI
839
 * Octets 9 and 10 contain the value part (starting with octet 2) of the
840
 * Cell Identity IE defined in 3GPP TS 24.008, not including
841
 * 3GPP TS 24.008 IEI (10.5.1.1)
842
 */
843
844
uint16_t
845
de_bssgp_cell_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string, int string_len)
846
14
{
847
14
    uint32_t curr_offset;
848
14
    uint16_t ci;
849
850
14
    curr_offset = offset;
851
852
14
    curr_offset = curr_offset + de_gmm_rai(tvb, tree, pinfo, curr_offset, 6, add_string, string_len);
853
    /*Why doesn't this work? ( add_string will not contain RAI + CI )
854
     * curr_offset = curr_offset + de_cell_id(tvb, tree, curr_offset , 2, add_string, string_len);
855
     */
856
14
    proto_tree_add_item_ret_uint16(tree, hf_bssgp_ci, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &ci);
857
14
    curr_offset+=2;
858
14
    if (add_string) {
859
11
        char *str = ws_strdup_printf("%s, CI %u", add_string, ci);
860
11
        (void) g_strlcpy(add_string, str, string_len);
861
11
        g_free(str);
862
11
    }
863
864
14
    return curr_offset-offset;
865
14
}
866
/*
867
 * 11.3.10  Channel needed
868
 */
869
/* Rest of element coded as the value part of the Channel Needed
870
 * PDU defined in 3GPP TS 29.018, not including 3GPP TS 29.018
871
 * IEI and 3GPP TS 29.018 length indicator
872
 * TS 29.018
873
 * The rest of the information element is coded as the IEI part and the
874
 * value part of the Channel Needed IE defined in 3GPP TS 44.018.
875
 */
876
static uint16_t
877
de_bssgp_chnl_needed(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
878
1
{
879
1
    uint32_t curr_offset;
880
881
1
    curr_offset = offset;
882
883
1
    curr_offset = de_rr_chnl_needed(tvb, tree, pinfo, curr_offset, len , NULL, 0);
884
885
1
    return curr_offset-offset;
886
1
}
887
888
/*
889
 * 11.3.11  DRX Parameters
890
 */
891
/*
892
 * Rest of element coded as the value part defined in
893
 * 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and
894
 * 3GPP TS 24.008 octet length indicator
895
 */
896
/*
897
 * 11.3.12  eMLPP-Priority
898
 */
899
/*
900
 * Rest of element coded as the value part of the eMLPP-Priority IE
901
 * defined in 3GPP TS 48.008, not including 3GPP TS 48.008 IEI and
902
 * 3GPP TS 48.008 length indicator
903
 */
904
/*
905
 * 11.3.13  Flush Action
906
 */
907
static const value_string bssgp_flush_action_vals[] = {
908
    { 0x00, "LLC-PDU(s) deleted" },
909
    { 0x01, "LLC-PDU(s) transferred" },
910
    { 0,    NULL },
911
    /* Otherwise "Reserved" */
912
};
913
914
static uint16_t
915
de_bssgp_flush_action(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string, int string_len)
916
1
{
917
1
    uint32_t curr_offset;
918
1
    uint8_t oct;
919
920
1
    curr_offset = offset;
921
922
    /* Action value */
923
1
    oct = tvb_get_uint8(tvb,curr_offset);
924
1
    proto_tree_add_item(tree, hf_bssgp_flush_action, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
925
1
    curr_offset+=1;
926
1
    if (add_string)
927
1
        snprintf(add_string, string_len, " - %s", val_to_str_const(oct, bssgp_flush_action_vals, "Reserved"));
928
929
930
1
    return curr_offset-offset;
931
1
}
932
/*
933
 * 11.3.14  IMSI
934
 */
935
/* Octets 3-n contain an IMSI coded as the value part of the Mobile
936
 * Identity IE defined in 3GPP TS 24.008
937
 * (NOTE 1)
938
 * NOTE 1: The Type of identity field in the Mobile Identity IE shall be ignored by
939
 * the receiver.
940
 */
941
/*
942
 * 11.3.15  LLC-PDU
943
 */
944
945
static uint16_t
946
de_bssgp_llc_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
947
207
{
948
207
    tvbuff_t *next_tvb=NULL;
949
207
    uint32_t curr_offset;
950
951
207
    curr_offset = offset;
952
953
207
    if(len > 0){
954
207
        next_tvb = tvb_new_subset_length(tvb, curr_offset, len);
955
207
        proto_tree_add_bytes_format(tree, hf_bssgp_llc_data, tvb, curr_offset, len, NULL, "LLC Data");
956
207
    }
957
958
207
    if(next_tvb){
959
205
        if (llc_handle) {
960
205
            call_dissector(llc_handle, next_tvb, pinfo, gparent_tree);
961
205
        } else {
962
0
            call_data_dissector(next_tvb, pinfo, gparent_tree);
963
0
        }
964
205
    }
965
966
207
    return len;
967
207
}
968
/*
969
 * 11.3.16  LLC Frames Discarded
970
 */
971
static uint16_t
972
de_bssgp_llc_frames_disc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string, int string_len)
973
0
{
974
0
    uint32_t curr_offset;
975
0
    uint8_t oct;
976
977
0
    curr_offset = offset;
978
979
    /* Action value */
980
0
    oct = tvb_get_uint8(tvb,curr_offset);
981
0
    proto_tree_add_item(tree, hf_bssgp_llc_frames_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
982
0
    curr_offset+=1;
983
984
0
    if (add_string)
985
0
        snprintf(add_string, string_len, " - %u Frames", oct);
986
987
0
    return curr_offset-offset;
988
0
}
989
/*
990
 * 11.3.17  Location Area
991
 */
992
/* Octets 3 to 7 contain the value part (starting with octet 2) of the
993
 * Location Area Identification IE defined in 3GPP TS 24.008, not
994
 * including 3GPP TS 24.008 IEI
995
 */
996
997
/*
998
 * 11.3.18  LSA Identifier List
999
 */
1000
/* Rest of element coded as in 3GPP TS 48.008, not including
1001
 * 3GPP TS 48.008 IEI and 3GPP TS 48.008 length indicator
1002
 */
1003
/*
1004
 * 11.3.19  LSA Information
1005
 */
1006
/* Rest of element coded as in 3GPP TS 48.008, not including
1007
 * 3GPP TS 48.008 IEI and 3GPP TS 48.008 length indicator
1008
 */
1009
/*
1010
 * 11.3.20  Mobile Id
1011
 */
1012
/* Octets 3-n contain either the IMSI, IMEISV or IMEI coded as the
1013
 * value part (starting with octet 3) of the Mobile Identity IE defined in
1014
 * 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and
1015
 * 3GPP TS 24.008 length indicator
1016
 */
1017
/*
1018
 * 11.3.21  MS Bucket Size
1019
 */
1020
1021
static uint16_t
1022
de_bssgp_ms_bucket_size(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1023
0
{
1024
0
    uint32_t curr_offset;
1025
1026
0
    curr_offset = offset;
1027
1028
    /* The Bmax field is coded as Bmax of BVC Bucket Size, see sub-clause 11.3.5. */
1029
0
    proto_tree_add_item(tree, hf_bssgp_bucket_size, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1030
0
    curr_offset+=2;
1031
1032
0
    return curr_offset-offset;
1033
0
}
1034
/*
1035
 * 11.3.22  MS Radio Access Capability
1036
 */
1037
/* Rest of element coded as the value part defined in
1038
 * 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and
1039
 * 3GPP TS 24.008 octet length indicator.
1040
 */
1041
/*
1042
 * 11.3.23  OMC Id
1043
 */
1044
static uint16_t
1045
de_bssgp_omc_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1046
0
{
1047
0
    uint32_t curr_offset;
1048
1049
0
    curr_offset = offset;
1050
1051
    /* octet 3-22 For the OMC identity, see 3GPP TS 12.20 */
1052
0
    proto_tree_add_item(tree, hf_bssgp_omc_id, tvb, curr_offset, len, ENC_NA);
1053
1054
0
    return len;
1055
0
}
1056
/*
1057
 * 11.3.24  PDU In Error
1058
 */
1059
static uint16_t
1060
de_bssgp_pdu_in_error(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1061
0
{
1062
0
    uint32_t curr_offset;
1063
1064
0
    curr_offset = offset;
1065
1066
    /* octet 3-? Erroneous BSSGP PDU */
1067
0
     proto_tree_add_item(tree, hf_bssgp_msg_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1068
0
     curr_offset++;
1069
1070
0
     proto_tree_add_item(tree, hf_bssgp_pdu_data, tvb, curr_offset, len-1, ENC_NA);
1071
1072
0
    return len;
1073
0
}
1074
/*
1075
 * 11.3.25 PDU Lifetime
1076
 */
1077
static uint16_t
1078
de_bssgp_pdu_lifetime(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1079
2
{
1080
2
    uint32_t curr_offset;
1081
1082
2
    curr_offset = offset;
1083
1084
2
    proto_tree_add_item(tree, hf_bssgp_delay_val, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1085
2
    curr_offset+=2;
1086
1087
2
    return curr_offset-offset;
1088
2
}
1089
1090
/*
1091
The Delay Value field is coded as a 16-bit integer value in units of centi-seconds (one hundredth of a second). This
1092
coding provides a range of over 10 minutes in increments of 10 ms. As a special case, the hexadecimal value 0xFFFF
1093
(decimal 65 535) shall be interpreted as "infinite delay".
1094
*/
1095
/*
1096
 * 11.3.26  PDU Type
1097
 */
1098
/*
1099
 * 11.3.27  Priority
1100
 */
1101
/* Rest of element coded as the value part of the Priority IE defined in
1102
 * 3GPP TS 48.008, not including 3GPP TS 48.008 IEI and
1103
 * 3GPP TS 48.008 length indicator
1104
 */
1105
/*
1106
 * 11.3.28  QoS Profile
1107
 */
1108
static const true_false_string  bssgp_a_bit_vals = {
1109
    "Radio interface uses RLC/MAC-UNITDATA functionality",
1110
    "Radio interface uses RLC/MAC ARQ functionality"
1111
};
1112
1113
static const true_false_string  bssgp_t_bit_vals = {
1114
    "The SDU contains data",
1115
    "The SDU contains signalling"
1116
};
1117
1118
static const true_false_string  bssgp_cr_bit_vals = {
1119
    "The SDU does not contain a LLC ACK or SACK command/response frame type",
1120
    "The SDU contains a LLC ACK or SACK command/response frame type"
1121
};
1122
1123
#if 0
1124
static const value_string bssgp_peak_rate_gran_vals[] = {
1125
    { 0x0, "100 bits/s increments" },
1126
    { 0x1, "1000 bits/s increments" },
1127
    { 0x2, "10000 bits/s increments" },
1128
    { 0x3, "100000 bits/s increments" },
1129
    { 0, NULL }
1130
};
1131
#endif
1132
1133
static const value_string bssgp_precedence_ul[] = {
1134
    { 0,   "High priority" },
1135
    { 1,   "Normal priority" },
1136
    { 2,   "Low priority" },
1137
    { 0,   NULL },
1138
};
1139
1140
static const value_string bssgp_precedence_dl[] = {
1141
    { 0,   "Radio priority 1" },
1142
    { 1,   "Radio priority 2" },
1143
    { 2,   "Radio priority 3" },
1144
    { 3,   "Radio priority 4" },
1145
    { 4,   "Radio priority unknown" },
1146
    { 0,   NULL },
1147
};
1148
1149
static uint16_t
1150
de_bssgp_qos_profile(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1151
436
{
1152
436
    proto_item *pre_item;
1153
436
    uint32_t curr_offset;
1154
436
    uint16_t peak_bit_rate;
1155
436
    uint8_t rate_gran, precedence;
1156
436
    int     link_dir;
1157
1158
436
    curr_offset = offset;
1159
1160
    /* octet 3-4 Peak bit rate provided by the network (note)
1161
     * NOTE: The bit rate 0 (zero) shall mean "best effort" in this IE.
1162
     */
1163
436
    link_dir = pinfo->link_dir;
1164
1165
436
    peak_bit_rate = tvb_get_ntohs(tvb, curr_offset);
1166
436
    if (peak_bit_rate == 0) {
1167
45
        proto_tree_add_uint_format_value(tree, hf_bssgp_peak_bit_rate, tvb, curr_offset, 2, peak_bit_rate, "Best effort");
1168
391
    }else{
1169
391
        rate_gran = tvb_get_uint8(tvb, curr_offset+2)&0xc0;
1170
391
        switch(rate_gran){
1171
267
            case 0:
1172
                /* 100 bits/s increments */
1173
267
                proto_tree_add_uint_format_value(tree, hf_bssgp_peak_bit_rate, tvb, curr_offset, 2, peak_bit_rate,
1174
267
                                                 "%u bits/s", peak_bit_rate * 100);
1175
267
                break;
1176
0
            case 1:
1177
                /* 1000 bits/s increments */
1178
0
                proto_tree_add_uint_format_value(tree, hf_bssgp_peak_bit_rate, tvb, curr_offset, 2, peak_bit_rate,
1179
0
                                                 "%u kbits/s", peak_bit_rate);
1180
0
                break;
1181
0
            case 2:
1182
                /* 10000 bits/s increments */
1183
0
                proto_tree_add_uint_format_value(tree, hf_bssgp_peak_bit_rate, tvb, curr_offset, 2, peak_bit_rate,
1184
0
                                                 "%u kbits/s", peak_bit_rate * 10);
1185
0
                break;
1186
0
            case 3:
1187
                /* 100000 bits/s increments */
1188
0
                proto_tree_add_uint_format_value(tree, hf_bssgp_peak_bit_rate, tvb, curr_offset, 2, peak_bit_rate,
1189
0
                                                 "%u kbits/s", peak_bit_rate * 100);
1190
0
                break;
1191
122
            default:
1192
122
                break;
1193
391
        }
1194
391
    }
1195
434
    curr_offset+=2;
1196
1197
    /* octet 5 Peak Bit Rate Granularity C/R T A Precedence */
1198
    /* If the Gigabit Interface feature has not been negotiated, the "Peak bit rate"
1199
     * field is the binary encoding of the peak bit rate information expressed in 100 bits/s
1200
     * increments, starting from 0 x 100 bits/s until 65 535 x 100 bits/s (6 Mbps).
1201
     *
1202
     * If the Gigabit Interface feature has been negotiated, the "Peak bit rate" field is the
1203
     * binary encoding of the peak bit rate information expressed in increments as defined by
1204
     * the Peak Bit Rate Granularity field.
1205
     */
1206
434
    proto_tree_add_item(tree, hf_bssgp_peak_rate_gran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1207
434
    proto_tree_add_item(tree, hf_bssgp_cr_bit, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1208
434
    proto_tree_add_item(tree, hf_bssgp_t_bit, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1209
434
    proto_tree_add_item(tree, hf_bssgp_a_bit, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1210
434
    pre_item = proto_tree_add_item_ret_uint8(tree, hf_bssgp_precedence, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &precedence);
1211
434
    if(link_dir == P2P_DIR_DL){
1212
385
        proto_item_append_text(pre_item, " %s", val_to_str_const((uint32_t)precedence, bssgp_precedence_dl, "Radio Priority Unknown(Radio priority 3)"));
1213
385
    }else{
1214
49
        proto_item_append_text(pre_item, " %s", val_to_str_const((uint32_t)precedence, bssgp_precedence_ul, "Priority Unknown(Low priority)"));
1215
49
    }
1216
1217
434
    curr_offset++;
1218
1219
434
    return curr_offset-offset;
1220
436
}
1221
/*
1222
 * 11.3.29  Radio Cause
1223
 */
1224
static const value_string bssgp_radio_cause_vals[] = {
1225
    { 0x00, "Radio contact lost with the MS" },
1226
    { 0x01, "Radio link quality insufficient to continue communication" },
1227
    { 0x02, "Cell reselection ordered" },
1228
    { 0x03, "Cell reselection prepare" },
1229
    { 0x04, "Cell reselection failure" },
1230
    { 0,    NULL },
1231
    /* Otherwise "Reserved (Radio contact lost with the MS)" */
1232
};
1233
1234
static uint16_t
1235
de_bssgp_ra_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_)
1236
1
{
1237
1
    uint32_t curr_offset;
1238
1239
1
    curr_offset = offset;
1240
1241
1
    proto_tree_add_item(tree, hf_bssgp_ra_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1242
1
    curr_offset++;
1243
1244
1
    return curr_offset-offset;
1245
1
}
1246
1247
/*
1248
 * 11.3.30  RA-Cap-UPD-Cause
1249
 */
1250
static const value_string bssgp_ra_cap_upd_cause_vals[] = {
1251
    { 0x00, "OK, RA capability IE present" },
1252
    { 0x01, "TLLI unknown in SGSN" },
1253
    { 0x02, "No RA capabilities or IMSI available for this MS" },
1254
    { 0,    NULL },
1255
    /* Otherwise "Reserved (TLLI unknown in SGSN)" */
1256
};
1257
1258
static uint16_t
1259
de_bssgp_ra_cap_upd_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_)
1260
1
{
1261
1
    uint32_t curr_offset;
1262
1263
1
    curr_offset = offset;
1264
1265
1
    proto_tree_add_item(tree, hf_bssgp_ra_cap_upd_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1266
1
    curr_offset++;
1267
1268
1
    return curr_offset-offset;
1269
1
}
1270
1271
/*
1272
 * 11.3.31  Routeing Area
1273
 */
1274
/* Octets 3 to 8 contain the value part (starting with octet 2) of the
1275
 * Routing Area Identification IE defined in 3GPP TS 24.008, not
1276
 * including 3GPP TS 24.008 IEI
1277
 */
1278
/*
1279
 * 11.3.32  R_default_MS
1280
 */
1281
static uint16_t
1282
de_bssgp_r_default_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1283
0
{
1284
0
    uint32_t curr_offset;
1285
1286
0
    curr_offset = offset;
1287
1288
0
    proto_tree_add_item(tree, hf_bssgp_r_default_ms, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1289
0
    curr_offset+=2;
1290
1291
0
    return curr_offset-offset;
1292
0
}
1293
1294
/*
1295
 * 11.3.33  Suspend Reference Number
1296
 */
1297
static uint16_t
1298
de_bssgp_suspend_ref_no(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1299
0
{
1300
0
    uint32_t curr_offset;
1301
1302
0
    curr_offset = offset;
1303
1304
    /* Unstructured value */
1305
0
    proto_tree_add_item(tree, hf_bssgp_suspend_ref_no, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1306
1307
0
    curr_offset++;
1308
1309
0
    return curr_offset-offset;
1310
0
}
1311
/*
1312
 * 11.3.34  Tag
1313
 */
1314
1315
static uint16_t
1316
de_bssgp_tag(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1317
4
{
1318
4
    uint32_t curr_offset;
1319
1320
4
    curr_offset = offset;
1321
1322
    /* Unstructured value */
1323
4
    proto_tree_add_item(tree, hf_bssgp_tag, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1324
1325
4
    curr_offset++;
1326
1327
4
    return curr_offset-offset;
1328
4
}
1329
1330
/*
1331
 * 11.3.35  Temporary logical link Identity (TLLI)
1332
 * Rest of element coded as the value part of the TLLI information
1333
 * element in 3GPP TS 44.018, not including 3GPP TS 44.018 IEI.
1334
 */
1335
/*
1336
 * 11.3.36  Temporary Mobile Subscriber Identity (TMSI)
1337
 */
1338
/* Rest of element coded as the value part of the TMSI/P-TMSI
1339
 * information element in 3GPP TS 24.008, not including
1340
 * 3GPP TS 24.008 IEI.
1341
 */
1342
/*
1343
 * 11.3.37  Trace Reference
1344
 */
1345
static uint16_t
1346
de_bssgp_trace_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1347
1
{
1348
1
    uint32_t curr_offset;
1349
1350
1
    curr_offset = offset;
1351
1352
    /* octet 3-4 Trace Reference */
1353
1
    proto_tree_add_item(tree, hf_bssgp_trace_ref, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1354
1355
1
    curr_offset+=2;
1356
1357
1
    return curr_offset-offset;
1358
1
}
1359
1360
/*
1361
 * 11.3.38  Trace Type
1362
 */
1363
/* This is coded as specified in Technical Specification
1364
 * 3GPP TS 32.008
1365
 * XXX: Coding unknown (Specification withdrawn) 3GPP TS 32.008
1366
 */
1367
static uint16_t
1368
de_bssgp_trace_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1369
3
{
1370
3
    uint32_t curr_offset = offset;
1371
1372
3
    proto_tree_add_item(tree, hf_bssgp_trace_type_data, tvb, curr_offset, len, ENC_NA);
1373
1374
3
    return len;
1375
3
}
1376
/*
1377
 * 11.3.39  Transaction Id
1378
 */
1379
static uint16_t
1380
de_bssgp_transaction_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_)
1381
0
{
1382
0
    uint32_t curr_offset;
1383
1384
0
    curr_offset = offset;
1385
1386
0
    proto_tree_add_item(tree, hf_bssgp_transaction_id, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1387
1388
0
    return curr_offset-offset;
1389
0
}
1390
/*
1391
 * 11.3.40  Trigger Id
1392
 */
1393
static uint16_t
1394
de_bssgp_trigger_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1395
0
{
1396
0
    uint32_t curr_offset;
1397
1398
0
    curr_offset = offset;
1399
1400
0
    proto_tree_add_item(tree, hf_bssgp_trigger_id, tvb, curr_offset, len, ENC_NA);
1401
1402
0
    return len;
1403
0
}
1404
/*
1405
 * 11.3.41  Number of octets affected
1406
 */
1407
static uint16_t
1408
de_bssgp_no_of_oct_affected(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string, int string_len)
1409
3
{
1410
3
    uint32_t curr_offset;
1411
3
    uint32_t no_of_oct;
1412
1413
3
    curr_offset = offset;
1414
1415
    /* octet 3-5 number of octets transferred or deleted */
1416
3
    no_of_oct = tvb_get_ntoh24(tvb,curr_offset);
1417
3
    proto_tree_add_item(tree, hf_bssgp_no_of_oct, tvb, curr_offset, 3, ENC_BIG_ENDIAN);
1418
1419
3
    curr_offset+=3;
1420
1421
3
    if (add_string)
1422
3
        snprintf(add_string, string_len, " - %u", no_of_oct);
1423
1424
3
    return curr_offset-offset;
1425
3
}
1426
/*
1427
 * 11.3.42  Packet Flow Identifier (PFI)
1428
 */
1429
/* Rest of element coded as the value part of the Packet Flow
1430
 * Identifier information element in 3GPP TS 24.008, not including
1431
 * 3GPP TS 24.008 IEI
1432
 */
1433
/*
1434
 * 11.3.42a (void)
1435
 */
1436
/*
1437
 * 11.3.43  Aggregate BSS QoS Profile
1438
 */
1439
/* Rest of element coded as the value part of the QoS information
1440
 * element in 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and
1441
 * length indicator. The shorter 3-byte form of QoS information is not
1442
 * allowed in BSSGP PDUs.
1443
 * 10.5.6.5
1444
 */
1445
/*
1446
 * 11.3.44  GPRS Timer
1447
 */
1448
static const value_string bssgp_unit_vals[] = {
1449
    { 0, "incremented in multiples of 2 s" },
1450
    { 1, "incremented in multiples of 1 minute" },
1451
    { 2, "incremented in multiples of decihours" },
1452
    { 3, "incremented in multiples of 500 msec" },
1453
    { 4, "incremented in multiples of 1 minute(Undefined)" },
1454
    { 5, "incremented in multiples of 1 minute(Undefined)" },
1455
    { 6, "incremented in multiples of 1 minute(Undefined)" },
1456
    { 7, "the timer does not expire" },
1457
    { 0, NULL},
1458
    /* Otherwise "incremented in multiples of 1 minute" */
1459
};
1460
1461
static uint16_t
1462
de_bssgp_gprs_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_)
1463
3
{
1464
3
    uint32_t curr_offset;
1465
1466
3
    curr_offset = offset;
1467
1468
    /*octet 3 Unit Value Timer value */
1469
3
    proto_tree_add_item(tree, hf_bssgp_unit_val, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1470
3
    proto_tree_add_item(tree, hf_bssgp_gprs_timer, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1471
1472
3
    curr_offset++;
1473
1474
3
    return curr_offset-offset;
1475
3
}
1476
/*
1477
 * 11.3.45  Feature Bitmap
1478
 */
1479
static uint16_t
1480
de_bssgp_feature_bitmap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1481
1
{
1482
1
    uint32_t curr_offset;
1483
1484
1
    curr_offset = offset;
1485
    /* MBMS */
1486
1
    proto_tree_add_item(tree, hf_bssgp_mbms, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1487
    /* EnhancedRadioStatus */
1488
1
    proto_tree_add_item(tree, hf_bssgp_EnhancedRadioStatus, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1489
    /* PFCFC */
1490
1
    proto_tree_add_item(tree, hf_bssgp_pfcfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1491
    /* RIM */
1492
1
    proto_tree_add_item(tree, hf_bssgp_rim, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1493
    /* LCS */
1494
1
    proto_tree_add_item(tree, hf_bssgp_lcs, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1495
    /* INR */
1496
1
    proto_tree_add_item(tree, hf_bssgp_inr, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1497
    /* CBL */
1498
1
    proto_tree_add_item(tree, hf_bssgp_cbl, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1499
    /* PFC */
1500
1
    proto_tree_add_item(tree, hf_bssgp_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1501
1502
1
    curr_offset++;
1503
1504
1
    return curr_offset-offset;
1505
1
}
1506
/*
1507
 * 11.3.46  Bucket Full Ratio
1508
 */
1509
static uint16_t
1510
de_bssgp_bucket_full_ratio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1511
3
{
1512
3
    uint32_t curr_offset;
1513
1514
3
    curr_offset = offset;
1515
1516
    /* Ratio of the bucket that is filled up with data */
1517
3
    proto_tree_add_item(tree, hf_bssgp_bucket_full_ratio, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1518
1519
3
    curr_offset++;
1520
1521
3
    return curr_offset-offset;
1522
3
}
1523
/*
1524
 * 11.3.47  Service UTRAN CCO
1525
 */
1526
static const value_string bssgp_service_utran_cco_vals[] = {
1527
    { 0, "Network initiated cell change order procedure to UTRAN should be performed" },
1528
    { 1, "Network initiated cell change order procedure to UTRAN should not be performed" },
1529
    { 2, "Network initiated cell change order procedure to UTRAN shall not be performed" },
1530
    { 3, "If received, shall be interpreted as no information available (bits 4-5 valid)" },
1531
    { 0,    NULL },
1532
    /* Otherwise "No information available" */
1533
};
1534
1535
static const value_string bssgp_service_eutran_cco_vals[] = {
1536
    { 0, "If received, shall be interpreted as no information available" },
1537
    { 1, "Network initiated cell change order to E-UTRAN or PS handover to E-UTRAN procedure should be performed" },
1538
    { 2, "Network initiated cell change order to E-UTRAN or PS handover to E-UTRAN procedure should not be performed" },
1539
    { 3, "Network initiated cell change order to E-UTRAN or PS handover to E-UTRAN procedure shall not be performed" },
1540
    { 0,    NULL },
1541
    /* Otherwise "No information available" */
1542
};
1543
1544
static uint16_t
1545
de_bssgp_serv_utran_cco(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1546
6
{
1547
6
    uint32_t curr_offset;
1548
1549
6
    curr_offset = offset;
1550
1551
    /* Service EUTRAN CCO Value part */
1552
6
    proto_tree_add_item(tree, hf_bssgp_serv_eutran_cco, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1553
    /* Service UTRAN CCO Value part */
1554
6
    proto_tree_add_item(tree, hf_bssgp_serv_utran_cco, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1555
6
    curr_offset++;
1556
1557
6
    return curr_offset-offset;
1558
6
}
1559
1560
/*
1561
 * 11.3.48  NSEI (Network Service Entity Identifier)
1562
 */
1563
static uint16_t
1564
de_bssgp_nsei(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1565
0
{
1566
0
    uint32_t curr_offset;
1567
0
    uint16_t nsei;
1568
1569
0
    curr_offset = offset;
1570
1571
0
    proto_tree_add_item_ret_uint16(tree, hf_bssgp_nsei, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &nsei);
1572
0
    curr_offset+=2;
1573
1574
0
    col_append_sep_fstr(pinfo->cinfo, COL_INFO, BSSGP_SEP, "NSEI %u", nsei);
1575
1576
1577
0
    return curr_offset-offset;
1578
0
}
1579
/*
1580
 * 11.3.49  RRLP APDU
1581
 */
1582
static uint16_t
1583
de_bssgp_rrlp_apdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
1584
455
{
1585
455
    tvbuff_t *next_tvb=NULL;
1586
455
    uint32_t curr_offset;
1587
1588
455
    curr_offset = offset;
1589
1590
    /* The rest of the information element contains an embedded RRLP
1591
     * message whose content and encoding are defined according to the
1592
     * 3GPP TS 44.031. The RRLP protocol is not octet aligned.
1593
     * Therefore, the unused bits in the last octet are padded with zeroes
1594
     */
1595
1596
455
    if(len > 0){
1597
455
        next_tvb = tvb_new_subset_remaining(tvb, curr_offset);
1598
455
        proto_tree_add_bytes_format(tree, hf_bssgp_rrlp_apdu, tvb, curr_offset, len, NULL, "RRLP APDU");
1599
455
    }
1600
1601
455
    if(next_tvb){
1602
454
        if (rrlp_handle) {
1603
454
            call_dissector(rrlp_handle, next_tvb, pinfo, gparent_tree);
1604
454
        } else {
1605
0
            call_data_dissector(next_tvb, pinfo, gparent_tree);
1606
0
        }
1607
454
    }
1608
455
    return len;
1609
455
}
1610
1611
/*
1612
 * 11.3.50  LCS QoS
1613
 */
1614
/* Rest of element coded as the value part defined in
1615
 * 3GPP TS 48.008, not including 3GPP TS 48.008 IEI and
1616
 * 3GPP TS 48.008 octet length indicator
1617
 */
1618
/*
1619
 * 11.3.51  LCS Client Type
1620
 */
1621
/* Rest of element coded as the value part defined in
1622
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1623
 * 3GPP TS 49.031 octet length indicator
1624
 */
1625
/*
1626
 * 11.3.52  Requested GPS Assistance Data
1627
 */
1628
/* Rest of element coded as the value part defined in
1629
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1630
 * 3GPP TS 49.031 octet length indicator
1631
 */
1632
/*
1633
 * 11.3.53  Location Type
1634
 */
1635
/* Rest of element coded as the value part defined in
1636
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1637
 * 3GPP TS 49.031 octet length indicator
1638
 */
1639
/*
1640
 * 11.3.54  Location Estimate
1641
 */
1642
/* Rest of element coded as the value part defined in
1643
 * 3GPP TS 48.008, not including 3GPP TS 48.008 IEI and
1644
 * 3GPP TS 48.008 octet length indicator
1645
 */
1646
/*
1647
 * 11.3.55  Positioning Data
1648
 */
1649
/* Rest of element coded as the value part defined in
1650
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1651
 * 3GPP TS 49.031 octet length indicator
1652
 */
1653
/*
1654
 * 11.3.56  Deciphering Keys
1655
 */
1656
/* Rest of element coded as the value part defined in
1657
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1658
 * 3GPP TS 49.031 octet length indicator
1659
 */
1660
/*
1661
 * 11.3.57  LCS Priority
1662
 */
1663
/* Rest of element coded as the value part defined in
1664
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1665
 * 3GPP TS 49.031 octet length indicator
1666
 */
1667
/*
1668
 * 11.3.58  LCS Cause
1669
 */
1670
/* Rest of element coded as the value part defined in
1671
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
1672
 * 3GPP TS 49.031 octet length indicator
1673
 */
1674
/*
1675
 * 11.3.59  LCS Capability
1676
 */
1677
/* Rest of element coded as the value part of the PS LCS Capability
1678
 * IE defined in 3GPP TS 24.008, not including 3GPP TS 24.008 IEI
1679
 * and length indicator
1680
 */
1681
/*
1682
 * 11.3.60  RRLP Flags
1683
 */
1684
1685
static const true_false_string  bssgp_rrlp_flg1_vals = {
1686
    "Not a Positioning Command or final response",
1687
    "Position Command (BSS to SGSN) or final response (SGSN to BSS)"
1688
};
1689
1690
static uint16_t
1691
de_bssgp_rrlp_flags(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1692
2
{
1693
2
    uint32_t curr_offset;
1694
1695
2
    curr_offset = offset;
1696
1697
    /* Flag 1 (Octet 3, bit 1): */
1698
2
    proto_tree_add_item(tree, hf_bssgp_rrlp_flag1, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1699
1700
2
    return curr_offset-offset;
1701
2
}
1702
1703
/*
1704
 * 11.3.61  RIM Application Identity
1705
 */
1706
1707
static const value_string bssgp_rim_appid_vals[] = {
1708
    { 0, "Reserved" },
1709
    { 1, "Network Assisted Cell Change (NACC)" },
1710
    { 2, "System Information 3 (SI3)" },
1711
    { 3, "MBMS data channel" },
1712
    { 4, "SON Transfer" },
1713
    { 5, "UTRA System Information (UTRA SI)" },
1714
    { 0,    NULL },
1715
};
1716
1717
static uint16_t
1718
de_bssgp_rim_app_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_)
1719
5
{
1720
5
    uint32_t curr_offset;
1721
1722
5
    curr_offset = offset;
1723
1724
    /* RIM Application Identity */
1725
5
    g_rim_application_identity = tvb_get_uint8(tvb, curr_offset);
1726
5
    proto_tree_add_item(tree, hf_bssgp_rim_app_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1727
5
    curr_offset++;
1728
1729
5
    return curr_offset-offset;
1730
5
}
1731
1732
/*
1733
 * 11.3.62  RIM Sequence Number
1734
 */
1735
static uint16_t
1736
de_bssgp_rim_seq_no(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
1737
1
{
1738
1
    uint32_t curr_offset;
1739
1740
1
    curr_offset = offset;
1741
1742
    /* RIM Sequence Number */
1743
1
    proto_tree_add_item(tree, hf_bssgp_rim_seq_no, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
1744
1
    curr_offset+=4;
1745
1746
1
    return curr_offset-offset;
1747
1
}
1748
/*
1749
 * 11.3.62a RIM Container
1750
 * 11.3.62a.0   General
1751
 * 11.3.62a.1   RAN-INFORMATION-REQUEST RIM Container
1752
 */
1753
/* Dissection moved */
1754
/*
1755
 * 11.3.62a.2   RAN-INFORMATION RIM Container
1756
 * 11.3.62a.3   RAN-INFORMATION-ACK RIM Container
1757
 * 11.3.62a.4   RAN-INFORMATION-ERROR RIM Container
1758
 * 11.3.62a.5   RAN-INFORMATION-APPLICATION-ERROR RIM Container
1759
 */
1760
/*
1761
 * 11.3.63  Application Container
1762
 * 11.3.63.1    RAN-INFORMATION-REQUEST Application Container
1763
 * 11.3.63.1.0  General
1764
 */
1765
1766
1767
1768
static uint16_t
1769
de_bssgp_ran_information_request_app_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
1770
1
{
1771
1
    tvbuff_t *new_tvb = NULL;
1772
1
    int curr_offset, bit_offset;
1773
1774
1
    curr_offset = offset;
1775
1776
1
    switch(g_rim_application_identity){
1777
0
        case 1:
1778
            /* 11.3.63.1.1  RAN-INFORMATION-REQUEST Application Container for the NACC Application */
1779
            /* Reporting Cell Identifier */
1780
0
            curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo,curr_offset, len, add_string, string_len);
1781
0
            break;
1782
0
        case 2:
1783
            /* 11.3.63.1.2  RAN-INFORMATION-REQUEST Application Container for the SI3 Application */
1784
            /* Reporting Cell Identifier */
1785
0
            curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
1786
0
            break;
1787
0
        case 3:
1788
            /* 11.3.63.1.3  RAN-INFORMATION-REQUEST Application Container for the MBMS data channel Application */
1789
            /* Reporting Cell Identifier */
1790
0
            curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
1791
0
            break;
1792
0
        case 4:
1793
0
            {
1794
0
            asn1_ctx_t asn1_ctx;
1795
1796
0
            asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1797
            /* 11.3.63.1.4  RAN-INFORMATION-REQUEST Application Container for the SON Transfer Application */
1798
            /* Reporting Cell Identifier */
1799
            /* convert to bit offset */
1800
0
            bit_offset = curr_offset<<3;
1801
0
            bit_offset = dissect_s1ap_Global_ENB_ID(tvb, bit_offset, &asn1_ctx, tree, hf_bssgp_Global_ENB_ID_PDU);
1802
0
            /*bit_offset = */dissect_s1ap_SONtransferRequestContainer(tvb, bit_offset, &asn1_ctx, tree, hf_bssgp_SONtransferRequestContainer_PDU);
1803
0
            curr_offset += 7; curr_offset >>= 3;
1804
0
            }
1805
0
            break;
1806
0
        case 5:
1807
            /* 11.3.63.1.5 RAN-INFORMATION Application Container for the UTRA SI Application */
1808
            /* Octet 3-m Reporting Cell Identifier
1809
             * This field is encoded as the Source Cell Identifier IE (UTRAN Source Cell ID) as defined in
1810
             * 3GPP TS 25.413
1811
             */
1812
0
            new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
1813
0
            curr_offset = curr_offset + dissect_ranap_SourceCellID_PDU(new_tvb, pinfo, tree, NULL);
1814
0
            break;
1815
1
        default :
1816
1
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_unknown_rim_app_id, tvb, curr_offset, len);
1817
1
            curr_offset+=len;
1818
1
            break;
1819
1
    }
1820
1821
1822
1
    return curr_offset-offset;
1823
1
}
1824
1825
/*
1826
 * 11.3.63.2    RAN-INFORMATION Application Container Unit
1827
 * 11.3.63.2.0  General
1828
 */
1829
static const true_false_string  bssgp_si_psi_type_vals = {
1830
    "PSI messages as specified for PBCCH (3GPP TS 44.060) follow",
1831
    "SI messages as specified for BCCH (3GPP TS 44.018) follow"
1832
};
1833
1834
static const value_string bssgp_rat_discriminator_vals[] = {
1835
    { 0, "The reporting RAT is GERAN" },
1836
    { 1, "The reporting RAT is UTRAN" },
1837
    { 2, "The reporting RAT is E-UTRAN" },
1838
    { 0,    NULL },
1839
};
1840
static uint16_t
1841
de_bssgp_ran_information_app_cont_unit(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
1842
0
{
1843
0
    tvbuff_t *new_tvb = NULL;
1844
0
    uint32_t curr_offset;
1845
0
    uint8_t type, num_items, rat_type, oct;
1846
0
    int i;
1847
1848
0
    curr_offset = offset;
1849
1850
0
    switch(g_rim_application_identity){
1851
0
        case 1:
1852
            /* 11.3.63.2.1 RAN-INFORMATION Application Container for the NACC Application */
1853
            /* Reporting Cell Identifier */
1854
0
            curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
1855
            /* Number of SI/PSI */
1856
0
            num_items = tvb_get_uint8(tvb,curr_offset)>>1;
1857
0
            proto_tree_add_item(tree, hf_bssgp_num_si_psi, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1858
            /* Type */
1859
0
            type = tvb_get_uint8(tvb,curr_offset)&0x01;
1860
0
            proto_tree_add_item(tree, hf_bssgp_si_psi_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1861
0
            curr_offset++;
1862
            /* Octet 12-n SI/PSI */
1863
0
            if(type==1){
1864
                /* If the Type field indicates that "PSI messages as specified for PBCCH (3GPP TS 44.060) follow" then the SI/PSI
1865
                 * field contains Packet System Information message instances encoded for PBCCH as specified in
1866
                 * 3GPP TS 44.060. Each Packet System Information message contains the MESSAGE_TYPE field followed by the
1867
                 * PSI message content. Each message is 22 octets long.
1868
                 */
1869
0
                for (i=0; i < num_items; i++){
1870
0
                    proto_tree_add_expert_format(tree, pinfo, &ei_bssgp_not_dissected_yet, tvb, curr_offset, 22, "PSI item %u - not dissected yet",i+1);
1871
0
                    curr_offset+=22;
1872
0
                }
1873
0
            }else{
1874
                /* If the Type field indicates that "SI messages as specified for BCCH (3GPP TS 44.018) follow" then the SI/PSI
1875
                 * field contains System Information message instances encoded for BCCH as specified in 3GPP TS 44.018. Each
1876
                 * System Information message contains the Message type octet followed by all the IEs composing the message
1877
                 * payload. Each message is 21 octets long.
1878
                 */
1879
0
                void            (*msg_fcn_p)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len) = NULL;
1880
0
                int             ett_tree = -1;
1881
0
                int             hf_idx;
1882
0
                const char      *msg_str;
1883
0
                proto_item      *si_item, *si_item2;
1884
0
                proto_tree      *si_tree;
1885
1886
0
                for (i=0; i < num_items; i++){
1887
0
                    oct = tvb_get_uint8(tvb,curr_offset);
1888
0
                    get_rr_msg_params(oct, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p);
1889
0
                    si_item2 = proto_tree_add_bytes_format(tree, hf_bssgp_si_item, tvb, curr_offset, 21, NULL, "SI item %u ",i+1);
1890
0
                    si_item = proto_tree_add_item(tree, hf_idx, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1891
0
                    si_tree = proto_item_add_subtree(si_item, ett_tree);
1892
0
                    if (msg_fcn_p == NULL){
1893
0
                        expert_add_info(pinfo, si_item2, &ei_bssgp_si_item);
1894
0
                    }else{
1895
0
                        (*msg_fcn_p)(tvb, si_tree, pinfo, curr_offset+1, 20);
1896
0
                    }
1897
0
                    curr_offset+=21;
1898
0
                }
1899
0
            }
1900
0
            break;
1901
0
        case 2:
1902
            /* 11.3.63.2.2 RAN-INFORMATION Application Container for the SI3 Application */
1903
            /* Octet 3-10 Reporting Cell Identifier */
1904
            /* Reporting Cell Identifier: The parameter is encoded as the value part of the Cell Identifier IE
1905
             * defined in sub-clause 11.3.9, not including IEI and Length Indicator.
1906
             */
1907
0
            curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
1908
            /* Octet 11-31 SI3 */
1909
            /* SI3: contains the SYSTEM INFORMATION type 3 message encoded for BCCH as specified in 3GPP TS 44.018 ch 9.1.35
1910
             * It contains the Message type octet followed by all the IEs composing the message payload.
1911
             * The message is 21 octets long.
1912
             * dtap_rr_sys_info_3(tvb, tree, curr_offset, len-7)
1913
             */
1914
0
            proto_tree_add_item(tree, hf_bssgp_sys_info_type3_msg, tvb, curr_offset, 1, ENC_NA);
1915
0
            curr_offset++;
1916
0
            break;
1917
0
        case 3:
1918
            /* 11.3.63.2.3 RAN-INFORMATION Application Container for the MBMS data channel Application */
1919
            /* Octet 3-10 Reporting Cell Identifier */
1920
0
            curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
1921
            /* Octet 11-n MBMS data channel report */
1922
0
            proto_tree_add_expert_format(tree, pinfo, &ei_bssgp_not_dissected_yet, tvb, curr_offset, len-6, "MBMS data channel report - not dissected yet");
1923
0
            break;
1924
0
        case 4:
1925
            /* 11.3.63.2.4 RAN-INFORMATION Application Container for the SON Transfer Application */
1926
            /* Octet 3 Spare RAT discriminator */
1927
0
            rat_type = tvb_get_uint8(tvb,curr_offset) & 0x0f;
1928
0
            proto_tree_add_item(tree, hf_bssgp_rat_discriminator, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
1929
0
            curr_offset++;
1930
            /* Octet 4-m Reporting Cell Identifier */
1931
0
            switch(rat_type){
1932
0
                case 0:
1933
                    /* If the RAT discriminator field indicates GERAN, this field is encoded as the value part of the Cell Identifier IE
1934
                     * defined in sub-clause 11.3.9, not including IEI and Length Indicator.
1935
                     */
1936
0
                    curr_offset = curr_offset + de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
1937
0
                    break;
1938
0
                case 1:
1939
                    /* If the RAT discriminator field indicates UTRAN, this field is encoded as the Source Cell Identifier IE (UTRAN
1940
                     * Source Cell ID) as defined in 3GPP TS 25.413
1941
                     */
1942
0
                    new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
1943
0
                    curr_offset = curr_offset + dissect_ranap_SourceCellID_PDU(new_tvb, pinfo, tree, NULL);
1944
0
                    break;
1945
0
                case 2:
1946
                    /* If the RAT discriminator field indicates E-UTRAN, this field is encoded as the E-UTRAN CGI IE as
1947
                     * defined in 3GPP TS 36.413
1948
                     */
1949
0
                    new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
1950
0
                    curr_offset = curr_offset + dissect_s1ap_Global_ENB_ID_PDU(new_tvb, pinfo, tree, NULL);
1951
0
                    break;
1952
0
                default:
1953
0
                    break;
1954
0
            }
1955
1956
0
            break;
1957
0
        case 5:
1958
            /* 11.3.63.2.5 RAN-INFORMATION Application Container for the UTRA SI Application */
1959
            /* Octet 3-m Reporting Cell Identifier
1960
             * Reporting Cell Identifier: This field is encoded as the Source Cell Identifier IE
1961
             * (UTRAN Source Cell ID) as defined in 3GPP TS 25.413
1962
             */
1963
0
            new_tvb = tvb_new_subset_length(tvb, curr_offset, len);
1964
0
            curr_offset = curr_offset + dissect_ranap_SourceCellID_PDU(new_tvb, pinfo, tree, NULL);
1965
            /* Octet (m+1)-n UTRA SI Container
1966
             * UTRA SI Container: This field contains System Information Container valid for the reporting cell
1967
             * encoded as defined in TS 25.331
1968
             * The Application Container IE included in the RIM container IE of a RAN-INFORMATION/End PDU or of a
1969
             * RAN-INFORMATION/Stop PDU shall contain only the identity of the reporting cell.
1970
             */
1971
0
            if (curr_offset >= len - 1) {
1972
0
                switch (g_bssgp_ran_inf_pdu_t_ext_c) {
1973
0
                case 0:
1974
                    /* RAN-INFORMATION/Stop PDU */
1975
                    /*Falltrough */
1976
0
                case 4:
1977
                    /* RAN-INFORMATION/End PDU*/
1978
0
                    return curr_offset-offset;
1979
0
                default:
1980
0
                    break;
1981
0
                }
1982
0
                proto_tree_add_expert_format(tree, pinfo, &ei_bssgp_ran_inf_app_cont_utra_si, tvb, curr_offset-1, 1, "UTRA SI Container - not present");
1983
0
                return curr_offset-offset;
1984
0
            }
1985
0
            new_tvb = tvb_new_subset_length(tvb, curr_offset, (len - (curr_offset - offset)));
1986
0
            call_dissector_only(rrc_sys_info_cont_handle, new_tvb, pinfo, tree, NULL);
1987
0
            curr_offset = curr_offset + (len - (curr_offset - offset));
1988
0
            break;
1989
1990
0
        default :
1991
0
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_unknown_rim_app_id_data, tvb, curr_offset, len);
1992
0
            curr_offset+=len;
1993
0
            break;
1994
0
    }
1995
1996
1997
0
    return curr_offset-offset;
1998
0
}
1999
/*
2000
 * 11.3.64  Application Error Container
2001
 */
2002
static const value_string bssgp_nacc_cause_vals[] = {
2003
    { 0, "Other unspecified error" },
2004
    { 1, "Syntax error in the Application Container" },
2005
    { 2, "Reporting Cell Identifier does not match with the Destination Cell Identifier or with the Source Cell Identifier" },
2006
    { 3, "SI/PSI type error" },
2007
    { 4, "Inconsistent length of a SI/PSI message" },
2008
    { 5, "Inconsistent set of messages" },
2009
    { 0,    NULL },
2010
};
2011
2012
static const value_string bssgp_si3_cause_vals[] = {
2013
    { 0, "Other unspecified error" },
2014
    { 1, "Syntax error in the Application Container" },
2015
    { 2, "Reporting Cell Identifier does not match with the Destination Cell Identifier or with the Source Cell Identifier" },
2016
    { 3, "Inconsistent length of a SI3 message" },
2017
    { 4, "Inconsistent set of messages" },
2018
    { 0,    NULL },
2019
};
2020
2021
static const value_string bssgp_mbms_data_ch_cause_vals[] = {
2022
    { 0, "Other unspecified error" },
2023
    { 1, "Syntax error in the Application Container" },
2024
    { 2, "Reporting Cell Identifier does not match with the Destination Cell Identifier or with the Source Cell Identifier" },
2025
    { 3, "RAN-INFORMATION/Initial Multiple Report or RANINFORMATION/Single Report PDU exceeds the maximum supported length" },
2026
    { 4, "Inconsistent MBMS data channel description" },
2027
    { 0,    NULL },
2028
};
2029
2030
static const value_string bssgp_utra_si_cause_vals[] = {
2031
    { 0, "Other unspecified error" },
2032
    { 1, "Syntax error in the Application Container" },
2033
    { 2, "Inconsistent Reporting Cell Identifier" },
2034
    { 0,    NULL },
2035
};
2036
2037
static uint16_t
2038
de_bssgp_ran_app_error_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2039
3
{
2040
3
    tvbuff_t *new_tvb = NULL;
2041
3
    uint32_t curr_offset;
2042
2043
3
    curr_offset = offset;
2044
2045
3
    switch(g_rim_application_identity){
2046
1
        case 1:
2047
            /*
2048
             * 11.3.64.1    Application Error Container layout for the NACC application
2049
             */
2050
            /* Octet 3 NACC Cause */
2051
1
            proto_tree_add_item(tree, hf_bssgp_nacc_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2052
1
            curr_offset++;
2053
            /* Erroneous Application Container including IEI and LI */
2054
1
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_erroneous_app_container, tvb, curr_offset, len-(curr_offset-offset));
2055
1
            break;
2056
1
        case 2:
2057
            /*
2058
             * 11.3.64.2    Application Error Container for the SI3 application
2059
             */
2060
            /* Octet 3 SI3 Cause */
2061
1
            proto_tree_add_item(tree, hf_bssgp_si3_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2062
1
            curr_offset++;
2063
            /* Erroneous Application Container including IEI and LI */
2064
1
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_erroneous_app_container, tvb, curr_offset, len-(curr_offset-offset));
2065
1
            break;
2066
1
        case 3:
2067
            /*
2068
             * 11.3.64.3    Application Error Container for the MBMS data channel application
2069
             */
2070
            /* Octet 3 MBMS data channel Cause */
2071
1
            proto_tree_add_item(tree, hf_bssgp_mbms_data_ch_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2072
1
            curr_offset++;
2073
            /* Erroneous Application Container including IEI and LI */
2074
1
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_erroneous_app_container, tvb, curr_offset, len-(curr_offset-offset));
2075
1
            break;
2076
0
        case 4:
2077
            /*
2078
             * 11.3.64.4    Application Error Container for the SON Transfer Application
2079
             */
2080
            /* SON Transfer Cause: This field indicates the cause why the Application Error Container IE is sent.
2081
             * The "SON Transfer Cause" field is encoded as the SON Transfer Cause IE as defined in 3GPP TS 36.413
2082
             */
2083
0
            new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
2084
0
            curr_offset = curr_offset + dissect_s1ap_SONtransferCause_PDU(new_tvb, pinfo, tree, NULL);
2085
            /* Erroneous Application Container including IEI and LI */
2086
0
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_erroneous_app_container, tvb, curr_offset, len-(curr_offset-offset));
2087
0
            break;
2088
0
        case 5:
2089
            /* 11.3.64.5 Application Error Container for the UTRA SI Application*/
2090
            /* Octet 3 UTRA SI Cause */
2091
0
            proto_tree_add_item(tree, hf_bssgp_utra_si_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2092
0
            break;
2093
0
        default :
2094
0
            proto_tree_add_expert(tree, pinfo, &ei_bssgp_unknown_app_container, tvb, curr_offset, len);
2095
0
            break;
2096
3
    }
2097
0
    return len;
2098
3
}
2099
2100
/*
2101
 * 11.3.65  RIM PDU Indications
2102
 */
2103
static const value_string bssgp_ran_inf_req_pdu_t_ext_c_vals[] = {
2104
    { 0, "RAN-INFORMATION-REQUEST/Stop PDU" },
2105
    { 1, "RAN-INFORMATION-REQUEST/Single Report PDU" },
2106
    { 2, "RAN-INFORMATION-REQUEST/Multiple Report PDU" },
2107
    { 3, "Reserved" },
2108
    { 4, "Reserved" },
2109
    { 5, "Reserved" },
2110
    { 6, "Reserved" },
2111
    { 7, "Reserved" },
2112
    { 0,    NULL },
2113
};
2114
2115
static const value_string bssgp_ran_inf_pdu_t_ext_c_vals[] = {
2116
    { 0, "RAN-INFORMATION/Stop PDU" },
2117
    { 1, "RAN-INFORMATION/Single Report PDU" },
2118
    { 2, "RAN-INFORMATION/Initial Multiple Report PDU" },
2119
    { 3, "RAN-INFORMATION/Multiple Report PDU" },
2120
    { 4, "RAN-INFORMATION/End PDU" },
2121
    { 5, "Reserved" },
2122
    { 6, "Reserved" },
2123
    { 7, "Reserved" },
2124
    { 0,    NULL },
2125
};
2126
2127
static const true_false_string  bssgp_rim_pdu_ind_ack_vals = {
2128
    "ACK requested",
2129
    "No ACK requested"
2130
};
2131
2132
static uint16_t
2133
de_bssgp_rim_pdu_indications(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2134
3
{
2135
3
    uint32_t curr_offset;
2136
2137
3
    curr_offset = offset;
2138
2139
3
    switch(g_pdu_type){
2140
3
        case BSSGP_PDU_RAN_INFORMATION_REQUEST:
2141
            /* 11.3.65.1 RAN-INFORMATION-REQUEST RIM PDU Indications */
2142
            /* Table 11.3.65.1: RAN-INFORMATION-REQUEST PDU Type Extension coding */
2143
3
            proto_tree_add_item(tree, hf_bssgp_ran_inf_req_pdu_t_ext_c, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2144
            /* The ACK field is not used and shall be considered as spare */
2145
3
            curr_offset++;
2146
3
            break;
2147
0
        case BSSGP_PDU_RAN_INFORMATION:
2148
            /* 11.3.65.2 RAN-INFORMATION RIM PDU Indications */
2149
            /* Table 11.3.65.2: RAN-INFORMATION PDU Type Extension coding */
2150
0
            proto_tree_add_item_ret_uint(tree, hf_bssgp_ran_inf_pdu_t_ext_c, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &g_bssgp_ran_inf_pdu_t_ext_c);
2151
0
            proto_tree_add_item(tree, hf_bssgp_rim_pdu_ind_ack, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2152
0
            curr_offset++;
2153
0
            break;
2154
0
        case BSSGP_PDU_RAN_INFORMATION_APP_ERROR:
2155
            /* 11.3.65.3 RAN-INFORMATION-APPLICATION-ERROR RIM PDU Indications */
2156
0
            proto_tree_add_item(tree, hf_bssgp_rim_pdu_ind_ack, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2157
            /* The PDU Type Extension field is not used and shall be considered as spare */
2158
0
            curr_offset++;
2159
0
            break;
2160
0
        default:
2161
0
            break;
2162
3
    }
2163
2164
3
    return curr_offset-offset;
2165
3
}
2166
2167
/*
2168
 * 11.3.65.0    General
2169
 * 11.3.65.1    RAN-INFORMATION-REQUEST RIM PDU Indications
2170
 * 11.3.65.2    RAN-INFORMATION RIM PDU Indications
2171
 * 11.3.65.3    RAN-INFORMATION-APPLICATION-ERROR RIM PDU Indications
2172
 * 11.3.66  (void)
2173
 */
2174
/*
2175
 * 11.3.67  RIM Protocol Version Number
2176
 */
2177
static const value_string bssgp_rim_proto_ver_no_vals[] = {
2178
    { 0, "Reserved" },
2179
    { 1, "Version 1" },
2180
    { 0,    NULL },
2181
};
2182
2183
static uint16_t
2184
de_bssgp_rim_proto_ver_no(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2185
2
{
2186
2
    uint32_t curr_offset;
2187
2188
2
    curr_offset = offset;
2189
2190
    /* Octet 3 RIM Protocol Version Number */
2191
2
    proto_tree_add_item(tree, hf_bssgp_rim_proto_ver_no, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2192
2
    curr_offset++;
2193
2194
2
    return curr_offset-offset;
2195
2
}
2196
2197
/*
2198
 * 11.3.68  PFC Flow Control parameters
2199
 */
2200
2201
static uint16_t
2202
de_bssgp_pfc_flow_ctrl(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2203
2
{
2204
2
    proto_tree *pfc_tree;
2205
2206
2
    uint32_t curr_offset;
2207
2
    uint8_t num_pfc, i, pfc_len;
2208
2
    bool b_pfc_included;
2209
2210
2
    curr_offset = offset;
2211
2212
2
    num_pfc = tvb_get_uint8(tvb, curr_offset);
2213
2
    if (num_pfc < 12) {
2214
1
        proto_tree_add_uint(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc);
2215
1
    }else {
2216
1
        proto_tree_add_uint_format_value(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc, "Reserved");
2217
1
        return (curr_offset-offset);
2218
1
    }
2219
1
    curr_offset++;
2220
1
    if (num_pfc == 0)
2221
1
        return (curr_offset-offset);
2222
2223
0
    pfc_len = (len - 1) / num_pfc;
2224
0
    b_pfc_included = (pfc_len == 6);
2225
2226
0
    for (i = 0; i < num_pfc; i++) {
2227
0
        pfc_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, pfc_len,
2228
0
                      ett_bssgp_pfc_flow_control_parameters_pfc, NULL, "PFC (%u)", i + 1);
2229
2230
        /* PFI: Packet Flow Identifier.
2231
         * Coded as the value part of the Packet Flow Identifier information element in
2232
         * 3GPP TS 24.008, not including 3GPP TS 24.008 IEI
2233
         */
2234
0
        de_sm_pflow_id(tvb, pfc_tree, pinfo, curr_offset, 1, NULL, 0);
2235
0
        curr_offset++;
2236
2237
        /* Bmax_PFC: Bucket size of the PFC. Coded like the value part of BVC Bucket Size, see sub-clause 11.3.5. */
2238
0
        proto_tree_add_item(tree, hf_bssgp_bmax_pfc, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
2239
0
        curr_offset += 2;
2240
2241
        /* R_PFC: Bucket Leak Rate of the PFC. Coded as the value part of Bucket Leak Rate (R), see sub-clause 11.3.4. */
2242
0
        proto_tree_add_item(tree, hf_bssgp_r_pfc, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
2243
0
        curr_offset += 2;
2244
2245
0
        if (b_pfc_included) {
2246
            /* B_PFC: Bucket Full Ratio of the PFC. This field is only present if the Current Bucket Level (CBL) feature is
2247
             * negotiated. Otherwise, the flow control parameters for the next PFC, if any, are provided instead. This field if coded as
2248
             * the value part of the Bucket Full Ratio, see sub-clause 11.3.46.
2249
             */
2250
0
            proto_tree_add_item(tree, hf_bssgp_b_pfc, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2251
0
            curr_offset++;
2252
0
        }
2253
0
    }
2254
0
    return curr_offset-offset;
2255
1
}
2256
/*
2257
 * 11.3.69  Global CN-Id
2258
 */
2259
/* Coded as octets 3 to 7 of the Global CN-Id IE, defined in
2260
 * 3GPP TS 29.018
2261
 */
2262
/*
2263
 * 11.3.70  RIM Routing Information
2264
 */
2265
static const value_string bssgp_ra_discriminator_vals[] = {
2266
    { 0, "A Cell Identifier is used to identify a GERAN cell" },
2267
    { 1, "A Global RNC-ID is used to identify a UTRAN RNC" },
2268
    { 2, "An eNB identifier is used to identify an E-UTRAN eNodeB or HeNB" },
2269
    { 0, NULL },
2270
};
2271
2272
static uint16_t
2273
de_bssgp_rim_routing_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
2274
26
{
2275
26
    uint8_t oct;
2276
26
    uint16_t rnc_id;
2277
26
    tvbuff_t *new_tvb = NULL;
2278
26
    uint32_t curr_offset;
2279
26
    proto_item* ti;
2280
2281
26
    curr_offset = offset;
2282
2283
    /* This information element uniquely identifies either a cell within a
2284
     * GERAN BSS, a UTRAN RNC or an E-UTRAN eNodeB.
2285
     */
2286
2287
    /* RIM Routing Address discriminator */
2288
26
    oct  = tvb_get_uint8(tvb,curr_offset);
2289
26
    ti = proto_tree_add_item(tree, hf_bssgp_ra_discriminator, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2290
26
    curr_offset++;
2291
26
    switch(oct){
2292
6
        case 0:
2293
            /* RIM Routing Address discriminator = 0000:
2294
             * The RIM Routing Address field contains a Cell Identifier
2295
             * and is coded as the value part (octet 3 to octet 10) of the
2296
             * Cell Identifier information element specified in sub-clause 11.3.9.
2297
             */
2298
6
            de_bssgp_cell_id(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
2299
6
            break;
2300
1
        case 1:
2301
            /* RIM Routing Address discriminator = 0001:
2302
             * The RIM Routing Address field contains an RNC identifier and is coded as follows:
2303
             * Octets 4 to 9 contain the value part (starting with octet 2) of the Routing Area Identification IE
2304
             * defined in 3GPP TS 24.008, not including 3GPP TS 24.008 IEI
2305
             */
2306
1
            curr_offset = curr_offset + de_gmm_rai(tvb, tree, pinfo, curr_offset , 6, add_string, string_len);
2307
            /* Octet 10 - 11 RNC-ID (or Extended RNC-ID) */
2308
1
            proto_tree_add_item_ret_uint16(tree, hf_bssgp_rnc_id, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &rnc_id);
2309
2310
1
            if (add_string) {
2311
1
                char *str = ws_strdup_printf(" %s, RNC-ID %u", add_string, rnc_id);
2312
1
                (void) g_strlcpy(add_string, str, string_len);
2313
1
                g_free(str);
2314
1
            }
2315
1
            break;
2316
1
        case 2:
2317
            /* RIM Routing Address discriminator = 0010:
2318
             * The RIM Routing Address field contains an eNB identifier and is coded as follows:
2319
             * Octets 4 to 8 contain the value part (starting with octet 2) of the
2320
             * Tracking Area Identity IE defined in 3GPP TS 24.301 [37], not including 3GPP TS 24.301 IEI
2321
             */
2322
1
            curr_offset = curr_offset+ de_emm_trac_area_id(tvb, tree, pinfo, curr_offset, 5, add_string, string_len);
2323
            /* Octets 9-n contain the Global eNB ID (see 3GPP TS 36.413 [36]) of the eNodeB. */
2324
1
            new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
2325
1
            dissect_s1ap_Global_ENB_ID_PDU(new_tvb, pinfo, tree, NULL);
2326
1
            break;
2327
18
        default:
2328
18
            expert_add_info(pinfo, ti, &ei_bssgp_ra_discriminator);
2329
18
            return len;
2330
26
    }
2331
2332
2333
7
    return len;
2334
26
}
2335
2336
/*
2337
 * 11.3.71  MBMS Session Identity
2338
 */
2339
/* MBMS-Session-Identity AVP encoded as in 3GPP TS 29.061 [31],
2340
 * excluding AVP Header fields as defined in IETF RFC 3588 [33].
2341
 * TS 29.061
2342
 * 17.7.11 MBMS-Session-Identity AVP
2343
 * The MBMS-Session-Identity AVP (AVP code 908) is of type OctetString. Its length is one octet. It is allocated by the
2344
 * BM-SC. Together with TMGI it identifies a transmission of a specific MBMS session. The initial transmission and
2345
 * subsequent retransmissions of the MBMS session will use the same values of these parameters. This AVP is optional
2346
 * within the Gmb interface.
2347
 */
2348
static uint16_t
2349
de_bssgp_mbms_session_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_)
2350
9
{
2351
9
    uint32_t curr_offset;
2352
2353
9
    curr_offset = offset;
2354
2355
    /* MBMS Session Identity */
2356
9
    proto_tree_add_item(tree, hf_bssgp_mbms_session_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2357
9
    curr_offset++;
2358
2359
9
    return curr_offset-offset;
2360
9
}
2361
/*
2362
 * 11.3.72  MBMS Session Duration
2363
 */
2364
static uint16_t
2365
de_bssgp_mbms_session_dur(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2366
2
{
2367
2
    tvbuff_t *new_tvb;
2368
2
    uint32_t curr_offset;
2369
2370
2
    curr_offset = offset;
2371
2372
    /* AVP Code: 904 MBMS-Session-Duration Registered by packet-gtp.c */
2373
2
    new_tvb =tvb_new_subset_length(tvb, offset, len);
2374
2
    dissector_try_uint(diameter_3gpp_avp_dissector_table, 904, new_tvb, pinfo, tree);
2375
2376
2
    return curr_offset-offset;
2377
2
}
2378
/*
2379
 * 11.3.73  MBMS Service Area Identity List
2380
 * octet 3 - 514
2381
 * MBMS-Service-Area AVP encoded as in 3GPP TS 29.061,
2382
 * excluding AVP Header fields (as defined in IETF RFC 3588 [33]).
2383
 *
2384
 */
2385
static uint16_t
2386
de_bssgp_mbms_sai_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2387
2
{
2388
2
    tvbuff_t *new_tvb;
2389
2
    uint32_t curr_offset;
2390
2391
2
    curr_offset = offset;
2392
2393
    /* AVP Code: 903 MBMS-Service-Area Registered by packet-gtp.c */
2394
2
    new_tvb =tvb_new_subset_length(tvb, offset, len);
2395
2
    dissector_try_uint(diameter_3gpp_avp_dissector_table, 903, new_tvb, pinfo, tree);
2396
2397
2
    return curr_offset-offset;
2398
2
}
2399
/*
2400
 * 11.3.74  MBMS Response
2401
 */
2402
2403
static const value_string bssgp_mbms_cause_vals[] = {
2404
    { 0, "Acknowledge" },
2405
    { 1, "Acknowledge, initiate data transfer" },
2406
    { 2, "Acknowledge, data transfer initiated from other SGSN" },
2407
    { 3, "Reject - Congestion" },
2408
    { 4, "Reject - None of the listed MBMS Service Areas are supported by BSS" },
2409
    { 5, "Reject - MBMS Service Context is released due to interrupted data flow" },
2410
2411
    { 6, "Unspecified in this version of the protocol" },
2412
    { 7, "Unspecified in this version of the protocol" },
2413
    { 8, "Unspecified in this version of the protocol" },
2414
    { 9, "Unspecified in this version of the protocol" },
2415
    { 10, "Unspecified in this version of the protocol" },
2416
    { 11, "Unspecified in this version of the protocol" },
2417
    { 12, "Unspecified in this version of the protocol" },
2418
    { 13, "Unspecified in this version of the protocol" },
2419
    { 14, "Unspecified in this version of the protocol" },
2420
    { 15, "Unspecified in this version of the protocol" },
2421
    { 0, NULL },
2422
};
2423
static value_string_ext bssgp_mbms_cause_vals_ext = VALUE_STRING_EXT_INIT(bssgp_mbms_cause_vals);
2424
2425
static uint16_t
2426
de_bssgp_mbms_response(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2427
1
{
2428
1
    uint32_t curr_offset;
2429
2430
1
    curr_offset = offset;
2431
2432
    /* MBMS Session Identity */
2433
1
    proto_tree_add_item(tree, hf_bssgp_mbms_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2434
1
    curr_offset++;
2435
2436
1
    return curr_offset-offset;
2437
1
}
2438
/*
2439
 * 11.3.75  MBMS Routing Area List
2440
 */
2441
/* Number of Routing Areas (octet 3) */
2442
static const value_string bssgp_mbms_num_ra_ids_vals[] = {
2443
    { 0, "Notification shall not be sent to any Routing Areas in the BSS" },
2444
    { 1, "'1' Routing Area Identities" },
2445
    { 2, "'2' Routing Area Identities" },
2446
    { 3, "'3' Routing Area Identities" },
2447
    { 4, "'4' Routing Area Identities" },
2448
    { 5, "'5' Routing Area Identities" },
2449
    { 6, "'6' Routing Area Identities" },
2450
    { 7, "'7' Routing Area Identities" },
2451
    { 8, "'8' Routing Area Identities" },
2452
    { 9, "'9' Routing Area Identities" },
2453
    { 10, "'10' Routing Area Identities" },
2454
    { 11, "'11' Routing Area Identities" },
2455
    { 12, "'12' Routing Area Identities" },
2456
    { 13, "'13' Routing Area Identities" },
2457
    { 14, "'14' Routing Area Identities" },
2458
    { 15, "Notification shall be sent in all Routing Areas in the BSS" },
2459
    { 0, NULL },
2460
};
2461
static value_string_ext bssgp_mbms_num_ra_ids_vals_ext = VALUE_STRING_EXT_INIT(bssgp_mbms_num_ra_ids_vals);
2462
2463
static uint16_t
2464
de_bssgp_mbms_ra_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2465
2
{
2466
2
    proto_tree *rai_tree;
2467
2
    uint32_t curr_offset;
2468
2
    uint8_t num_ra_ids;
2469
2
    int i;
2470
2471
2
    curr_offset = offset;
2472
2473
    /* octet 3 Number of Routing Area Identifications Spare Spare Spare Spare */
2474
2
    proto_tree_add_item_ret_uint8(tree, hf_bssgp_mbms_num_ra_ids, tvb, curr_offset, 1, ENC_BIG_ENDIAN, &num_ra_ids);
2475
2476
    /* octet 4 - 11 Routing Area Identification 1 (etc)*/
2477
5
    for (i = 0; i < num_ra_ids; i++) {
2478
3
        rai_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 8,
2479
3
                    ett_bssgp_ra_id, NULL, "Routing Area Identification (%u)", i + 1);
2480
2481
        /* The element is coded as the Routing Area Identification information element in
2482
         * 3GPP TS 24.008, not including 3GPP TS 24.008 IEI and 3GPP TS 24.008 length indicator.
2483
         */
2484
3
        de_gmm_rai(tvb, rai_tree, pinfo, curr_offset , 6, NULL, 0);
2485
2486
3
        curr_offset+=8;
2487
3
    }
2488
2489
2
    return curr_offset-offset;
2490
2
}
2491
2492
/*
2493
 * 11.3.76  MBMS Session Information
2494
 */
2495
2496
static const true_false_string  tfs_bssgp_bc_mc = {
2497
    "Multicast Session",
2498
    "Broadcast Session"
2499
};
2500
static uint16_t
2501
de_bssgp_mbms_session_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2502
0
{
2503
0
    uint32_t curr_offset;
2504
2505
0
    curr_offset = offset;
2506
2507
    /* MBMS Session Identity */
2508
0
    proto_tree_add_item(tree, hf_bssgp_session_inf, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2509
0
    curr_offset++;
2510
2511
0
    return curr_offset-offset;
2512
0
}
2513
/*
2514
 * 11.3.77  TMGI (Temporary Mobile Group Identity)
2515
 */
2516
/* Rest of element coded as in 3GPP TS 24.008, not including 3GPP
2517
 * TS 24.008 IEI and 3GPP TS 24.008 length indicator.
2518
 */
2519
/*
2520
 * 11.3.78  MBMS Stop Cause
2521
 */
2522
static const value_string bssgp_mbms_stop_cause_vals[] = {
2523
    { 0, "MBMS Session terminated by upstream node" },
2524
    { 1, "MBMS Session terminated by SGSN" },
2525
2526
    { 2, "Unspecified in this version of the protocol" },
2527
    { 3, "Unspecified in this version of the protocol" },
2528
    { 4, "Unspecified in this version of the protocol" },
2529
    { 5, "Unspecified in this version of the protocol" },
2530
    { 6, "Unspecified in this version of the protocol" },
2531
    { 7, "Unspecified in this version of the protocol" },
2532
    { 8, "Unspecified in this version of the protocol" },
2533
    { 9, "Unspecified in this version of the protocol" },
2534
    { 10, "Unspecified in this version of the protocol" },
2535
    { 11, "Unspecified in this version of the protocol" },
2536
    { 12, "Unspecified in this version of the protocol" },
2537
    { 13, "Unspecified in this version of the protocol" },
2538
    { 14, "Unspecified in this version of the protocol" },
2539
    { 15, "Unspecified in this version of the protocol" },
2540
    { 0, NULL },
2541
};
2542
static value_string_ext bssgp_mbms_stop_cause_vals_ext = VALUE_STRING_EXT_INIT(bssgp_mbms_stop_cause_vals);
2543
2544
static uint16_t
2545
de_bssgp_mbms_stop_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_)
2546
0
{
2547
0
    uint32_t curr_offset;
2548
2549
0
    curr_offset = offset;
2550
2551
    /* MBMS Session Identity */
2552
0
    proto_tree_add_item(tree, hf_bssgp_mbms_stop_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2553
0
    curr_offset++;
2554
2555
0
    return curr_offset-offset;
2556
0
}
2557
/*
2558
 * 11.3.79  Source BSS to Target BSS Transparent Container
2559
 */
2560
/* The actual function moved to after defining the enums */
2561
2562
/*
2563
 * 11.3.80  Target BSS to Source BSS Transparent Container
2564
 */
2565
/*
2566
 * 11.3.81  NAS container for PS Handover
2567
 */
2568
/*
2569
 * 11.3.82  PFCs to be set-up list
2570
 */
2571
static uint16_t
2572
de_bssgp_pfcs_to_be_set_up_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2573
143
{
2574
143
    proto_tree *pfc_tree, *pft_tree, *abqp_tree, *arp_tree, *t10_tree;
2575
2576
143
    uint32_t curr_offset;
2577
143
    uint8_t num_pfc, i, pfc_len;
2578
2579
143
    curr_offset = offset;
2580
2581
143
    num_pfc = tvb_get_uint8(tvb, curr_offset);
2582
143
    if (num_pfc < 12) {
2583
133
        proto_tree_add_uint(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc);
2584
133
    }else {
2585
10
        proto_tree_add_uint_format_value(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc, "Reserved");
2586
10
        return (len);
2587
10
    }
2588
133
    curr_offset++;
2589
133
    if (num_pfc == 0)
2590
3
        return (curr_offset-offset);
2591
2592
130
    pfc_len = (len - 1) / num_pfc;
2593
2594
834
    for (i = 0; i < num_pfc; i++) {
2595
704
        pfc_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, pfc_len,
2596
704
                      ett_bssgp_pfcs_to_be_set_up_list, NULL, "PFC (%u)", i + 1);
2597
2598
704
        de_sm_pflow_id(tvb, pfc_tree, pinfo, curr_offset, 1, NULL, 0);
2599
704
        curr_offset++;
2600
2601
        /* PFT: Packet Flow Timer. Coded as the GPRS Timer information element,
2602
         * see sub-clause 11.3.44.
2603
         */
2604
704
        pft_tree = proto_tree_add_subtree(pfc_tree, tvb, curr_offset, 3,
2605
704
                    ett_bssgp_pfcs_to_be_set_up_list_pft, NULL, "Packet Flow Timer(PFT)");
2606
704
        proto_tree_add_item(pft_tree, hf_bssgp_unit_val, tvb, curr_offset+2, 1, ENC_BIG_ENDIAN);
2607
704
        proto_tree_add_item(pft_tree, hf_bssgp_gprs_timer, tvb, curr_offset+2, 1, ENC_BIG_ENDIAN);
2608
704
        curr_offset += 3;
2609
2610
        /* ABQP: Aggregate BSS QoS Profile.
2611
         * Coded as the Aggregate BSS QoS Profile information element, see sub-clause 11.3.43.
2612
         */
2613
704
        abqp_tree = proto_tree_add_subtree(pfc_tree, tvb, curr_offset, 3,
2614
704
            ett_bssgp_pfcs_to_be_set_up_list_abqp, NULL, "Aggregate BSS QoS Profile(ABQP)");
2615
        /* Unsure about length 16 */
2616
704
        curr_offset = curr_offset + de_sm_qos(tvb, abqp_tree, pinfo, curr_offset, 16, NULL, 0);
2617
2618
        /* Allocation/Retention Priority: Allocation Retention Priority.
2619
         * Coded as the Priority information element, see subclause 11.3.27.
2620
         * This information element is optionally included.
2621
         */
2622
704
        if(pfc_len>17){
2623
93
            arp_tree = proto_tree_add_subtree(pfc_tree, tvb, curr_offset, 3,
2624
93
                ett_bssgp_pfcs_to_be_set_up_list_arp, NULL, "Allocation/Retention Priority");
2625
93
            curr_offset = curr_offset + be_prio(tvb, arp_tree, pinfo, curr_offset, 1, NULL, 0);
2626
93
        }
2627
        /* T10: T10.
2628
         * Coded as the GPRS Timer information element, see sub-clause 11.3.44.
2629
         * This information element shall be present for a PFC if the Allocation/Retention Priority
2630
         * is present and if queuing is allowed for the PFC.
2631
         */
2632
704
        if(pfc_len>18){
2633
93
            t10_tree = proto_tree_add_subtree(pfc_tree, tvb, curr_offset, 3,
2634
93
                    ett_bssgp_pfcs_to_be_set_up_list_t10, NULL, "T10");
2635
93
            proto_tree_add_item(t10_tree, hf_bssgp_unit_val, tvb, curr_offset+2, 1, ENC_BIG_ENDIAN);
2636
93
            proto_tree_add_item(t10_tree, hf_bssgp_gprs_timer, tvb, curr_offset+2, 1, ENC_BIG_ENDIAN);
2637
93
            curr_offset += 3;
2638
93
        }
2639
704
    }
2640
130
    return curr_offset-offset;
2641
133
}
2642
/*
2643
 * 11.3.83  List of set-up PFCs
2644
 */
2645
uint16_t
2646
de_bssgp_list_of_setup_pfcs(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2647
13
{
2648
13
    proto_tree *pfc_tree;
2649
2650
13
    uint32_t curr_offset;
2651
13
    uint8_t num_pfc, i;
2652
2653
13
    curr_offset = offset;
2654
2655
13
    num_pfc = tvb_get_uint8(tvb, curr_offset);
2656
13
    if (num_pfc < 12) {
2657
9
        proto_tree_add_uint(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc);
2658
9
    }else {
2659
4
        proto_tree_add_uint_format_value(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc, "Reserved");
2660
4
        return (curr_offset-offset);
2661
4
    }
2662
9
    curr_offset++;
2663
9
    if (num_pfc == 0)
2664
2
        return (curr_offset-offset);
2665
2666
41
    for (i = 0; i < num_pfc; i++) {
2667
34
        pfc_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1,
2668
34
                      ett_bssgp_list_of_setup_pfcs, NULL, "PFC (%u)", i + 1);
2669
2670
34
        de_sm_pflow_id(tvb, pfc_tree, pinfo, curr_offset, 1, NULL, 0);
2671
34
        curr_offset++;
2672
2673
34
    }
2674
2675
7
    return curr_offset-offset;
2676
9
}
2677
/*
2678
 * 11.3.84  Extended Feature Bitmap
2679
 */
2680
static int * const bssgp_ext_feature_bitmap_fields[] = {
2681
    &hf_bssgp_eDRX,
2682
    &hf_bssgp_dcn,
2683
    &hf_bssgp_ec_gsm_iot,
2684
    &hf_bssgp_csps_coord,
2685
    &hf_bssgp_mocn,
2686
    &hf_bssgp_gb_if,
2687
    &hf_bssgp_ps_ho,
2688
    NULL
2689
};
2690
static uint16_t
2691
de_bssgp_ext_feature_bitmap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2692
2
{
2693
2
    uint32_t curr_offset;
2694
2695
2
    curr_offset = offset;
2696
2697
2
    proto_tree_add_item(tree, hf_bssgp_ps_ho, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2698
2
    proto_tree_add_bitmask_with_flags(tree, tvb, curr_offset, hf_bssgp_extended_feature_bitmap,
2699
2
        ett_bssgp_extended_feature_bitmap, bssgp_ext_feature_bitmap_fields, ENC_BIG_ENDIAN, BMT_NO_APPEND);
2700
2
    curr_offset++;
2701
2702
2
    return curr_offset-offset;
2703
2
}
2704
/*
2705
 * 11.3.85  Source to Target Transparent Container
2706
 */
2707
static uint16_t
2708
de_bssgp_src_to_trg_transp_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2709
3
{
2710
3
    uint32_t curr_offset;
2711
2712
3
    curr_offset = offset;
2713
2714
    /* Octets 3-? Source to Target Transparent Container content coded as
2715
     * specified in 3GPP TS 25.413 or 3GPP TS 36.413.
2716
     * In inter-RAT handovers ... RANAP specification 3GPP TS 25.413, excluding RANAP tag.
2717
     * In inter-RAT handover to E-UTRAN ... encoding is defined in 3GPP TS 36.413
2718
     */
2719
3
    proto_tree_add_item(tree, hf_bssgp_src_to_trg_transp_cont, tvb, curr_offset, len, ENC_NA);
2720
2721
3
    return len;
2722
3
}
2723
2724
/*
2725
 * 11.3.86  Target to Source Transparent Container
2726
 */
2727
static uint16_t
2728
de_bssgp_trg_to_src_transp_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2729
0
{
2730
0
    uint32_t curr_offset;
2731
2732
0
    curr_offset = offset;
2733
2734
    /* Rest of element coded as either a complete Handover to UTRAN
2735
     * Command radio interface message (as defined in 3GPP TS
2736
     * 25.331) or a complete Radio Bearer Reconfiguration radio
2737
     * interface message (as defined in 3GPP TS 44.118) or a complete
2738
     * DL-DCCH-Message including a complete
2739
     * RRCConnectionReconfiguration radio interface message (as
2740
     * defined in 3GPP TS 36.331)
2741
     */
2742
0
    proto_tree_add_item(tree, hf_bssgp_trg_to_src_transp_cont, tvb, curr_offset, len, ENC_NA);
2743
2744
0
    return len;
2745
0
}
2746
2747
/*
2748
 * 11.3.87  RNC Identifier
2749
 */
2750
uint16_t
2751
de_bssgp_rnc_identifier(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string, int string_len)
2752
4
{
2753
4
    uint32_t curr_offset;
2754
4
    uint16_t rnc_id;
2755
2756
4
    curr_offset = offset;
2757
    /* Octets 3-8 Octets 3 to 8 contain the value part (starting with octet 2) of the
2758
     * Routing Area Identification IE defined in 3GPP TS 24.008, not including 3GPP TS 24.008 IEI
2759
     */
2760
4
    curr_offset = curr_offset + de_gmm_rai(tvb, tree, pinfo, curr_offset, 6, add_string, string_len);
2761
    /* Octet 9 - 10 RNC ID (or Extended RNC-ID or Corresponding RNC-ID) */
2762
4
    proto_tree_add_item_ret_uint16(tree, hf_bssgp_rnc_id, tvb, curr_offset, 2, ENC_BIG_ENDIAN, &rnc_id);
2763
4
    curr_offset+=2;
2764
2765
4
    if (add_string) {
2766
3
        char *str = ws_strdup_printf(" %s, RNC-ID %u", add_string, rnc_id);
2767
3
        (void) g_strlcpy(add_string, str, string_len);
2768
3
        g_free(str);
2769
3
    }
2770
2771
4
    return curr_offset-offset;
2772
2773
4
}
2774
/*
2775
 * 11.3.88  Page Mode
2776
 */
2777
/* PAGE_MODE (2 bit field) */
2778
2779
static const value_string bssgp_page_mode_vals[] = {
2780
    { 0, "Normal Paging" },
2781
    { 1, "Extended Paging" },
2782
    { 2, "Paging Reorganization" },
2783
    { 3, "Same as before" },
2784
    { 0,    NULL },
2785
};
2786
static uint16_t
2787
de_bssgp_page_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2788
2
{
2789
2
    uint32_t curr_offset;
2790
2791
2
    curr_offset = offset;
2792
2793
2
    proto_tree_add_item(tree, hf_bssgp_page_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2794
2
    curr_offset++;
2795
2796
2
    return curr_offset-offset;
2797
2
}
2798
/*
2799
 * 11.3.89  Container ID
2800
 */
2801
static uint16_t
2802
de_bssgp_container_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_)
2803
2
{
2804
2
    uint32_t curr_offset;
2805
2806
2
    curr_offset = offset;
2807
2808
2
    proto_tree_add_item(tree, hf_bssgp_container_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2809
2
    curr_offset++;
2810
2811
2
    return curr_offset-offset;
2812
2
}
2813
2814
/*
2815
 * 11.3.90  Global TFI
2816
 */
2817
static const value_string bssgp_global_tfi_vals[] = {
2818
    { 0, "UPLINK_TFI" },
2819
    { 1, "DOWNLINK_TFI" },
2820
    { 0,    NULL },
2821
};
2822
2823
static uint16_t
2824
de_bssgp_global_tfi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2825
4
{
2826
4
    uint32_t curr_offset;
2827
4
    uint32_t bit_offset;
2828
4
    uint8_t gtfi;
2829
2830
4
    curr_offset = offset;
2831
2832
    /* Bits 6 - 1 Global TFI coded as specified in 3GPP TS 44.060 */
2833
4
    bit_offset = (curr_offset << 3) +3;
2834
4
    gtfi = tvb_get_bits8(tvb,bit_offset,1);
2835
4
    proto_tree_add_bits_item(tree, hf_bssgp_global_tfi, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2836
4
    bit_offset++;
2837
    /* < Global TFI IE > ::=
2838
     *    { 0 < UPLINK_TFI : bit (5) >
2839
     *    | 1 < DOWNLINK_TFI : bit (5) > } ;
2840
     */
2841
4
    if(gtfi == 0){
2842
        /* UPLINK_TFI (5 bit field)
2843
         * This field identifies an uplink TBF. This field is coded the same as the
2844
         * TFI field defined in sub-clause 12.15.
2845
         * This field is encoded as a binary number. Range 0 to 31
2846
         */
2847
2
        proto_tree_add_bits_item(tree, hf_bssgp_ul_tfi, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2848
2
    }else{
2849
        /* DOWNLINK_TFI (5 bit field)
2850
         * This field identifies an uplink TBF. This field is coded the same as the
2851
         * TFI field defined in sub-clause 12.15.
2852
         * This field is encoded as a binary number. Range 0 to 31
2853
         */
2854
2
        proto_tree_add_bits_item(tree, hf_bssgp_dl_tfi, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
2855
2
    }
2856
4
    curr_offset++;
2857
2858
4
    return curr_offset-offset;
2859
4
}
2860
/*
2861
 * 11.3.91  IMEI
2862
 */
2863
/* Octets 3-10 contain the IMEI coded as the value part of the Mobile
2864
 * Identity IE defined in 3GPP TS 24.008
2865
 * (NOTE 1)
2866
 */
2867
/*
2868
 * 11.3.92  Time to MBMS Data Transfer
2869
 */
2870
static uint16_t
2871
de_bssgp_time_to_MBMS_data_tran(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2872
10
{
2873
10
    uint32_t curr_offset;
2874
10
    uint8_t value;
2875
2876
10
    curr_offset = offset;
2877
2878
    /* 0 = 1s etc */
2879
10
    value = tvb_get_uint8(tvb,curr_offset) + 1;
2880
10
    proto_tree_add_uint(tree, hf_bssgp_time_to_MBMS_data_tran, tvb, curr_offset, 1, value);
2881
2882
10
    return len;
2883
10
}
2884
/*
2885
 * 11.3.93  MBMS Session Repetition Number
2886
 */
2887
static uint16_t
2888
de_bssgp_mbms_session_rep_no(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2889
14
{
2890
14
    uint32_t curr_offset;
2891
2892
14
    curr_offset = offset;
2893
2894
14
    proto_tree_add_item(tree, hf_bssgp_mbms_session_rep_no, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2895
14
    curr_offset++;
2896
2897
14
    return len;
2898
14
}
2899
/*
2900
 * 11.3.94  Inter RAT Handover Info
2901
 */
2902
static uint16_t
2903
de_bssgp_inter_rat_ho_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2904
26
{
2905
26
    tvbuff_t    *new_tvb;
2906
26
    uint32_t curr_offset;
2907
2908
26
    curr_offset = offset;
2909
2910
26
    new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
2911
    /*
2912
     * Inter RAT Handover Information coded as specified in 3GPP
2913
     * Technical Specification 25.331
2914
     */
2915
26
    dissect_rrc_InterRATHandoverInfo_PDU(new_tvb, pinfo, tree, NULL);
2916
2917
26
    return len;
2918
26
}
2919
/*
2920
 * 11.3.95  PS Handover Command
2921
 */
2922
static uint16_t
2923
de_bssgp_ps_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
2924
0
{
2925
0
    uint32_t curr_offset;
2926
2927
0
    curr_offset = offset;
2928
2929
    /* Octet 3-? Rest of element coded as a complete PS Handover Command
2930
    * radio interface message as defined in 3GPP TS 44.060 (carrying
2931
    * the PS Handover to A/Gb Mode Payload)
2932
    */
2933
0
    proto_tree_add_item(tree, hf_bssgp_ps_ho_cmd, tvb, curr_offset, len, ENC_NA);
2934
2935
2936
0
    return len;
2937
0
}
2938
2939
/*
2940
 * 11.3.95a PS Handover Indications
2941
 */
2942
static uint16_t
2943
de_bssgp_ps_ho_indications(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2944
0
{
2945
0
    uint32_t curr_offset;
2946
2947
0
    curr_offset = offset;
2948
2949
    /* SI/PSI */
2950
0
    proto_tree_add_item(tree, hf_bssgp_sipsi, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2951
0
    curr_offset++;
2952
2953
0
    return curr_offset-offset;
2954
0
}
2955
2956
/*
2957
 * 11.3.95b SI/PSI Container
2958
 */
2959
2960
static const value_string type_vals[] = {
2961
    { 0, "SI messages as specified for BCCH (3GPP TS 44.018) follow" },
2962
    { 1, "PSI messages as specified for PBCCH (3GPP TS 44.060) follow" },
2963
    { 0,    NULL },
2964
};
2965
static uint16_t
2966
de_bssgp_sipsi_container(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
2967
0
{
2968
0
    uint32_t curr_offset;
2969
0
    uint8_t oct,num, type, i;
2970
2971
0
    curr_offset = offset;
2972
2973
0
    oct = tvb_get_uint8(tvb, curr_offset);
2974
0
    num = oct >>1;
2975
0
    type = oct & 1;
2976
0
    proto_tree_add_item(tree, hf_bssgp_num_si_psi, tvb, curr_offset, 1, ENC_NA);
2977
2978
    /* Type */
2979
0
    proto_tree_add_item(tree, hf_bssgp_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
2980
0
    curr_offset++;
2981
0
    if (type==0){
2982
        /* BCCH (3GPP TS 44.018) */
2983
0
        for (i = 0; i < num; i++) {
2984
0
            proto_tree_add_bytes_format(tree, hf_bssgp_si, tvb, curr_offset, 21, NULL, "SI (%u)", i + 1);
2985
0
            curr_offset+=21;
2986
0
        }
2987
0
    }else{
2988
        /* PBCCH (3GPP TS 44.060) */
2989
0
        for (i = 0; i < num; i++) {
2990
0
            proto_tree_add_bytes_format(tree, hf_bssgp_psi, tvb, curr_offset, 22, NULL, "PSI (%u)", i + 1);
2991
0
            curr_offset+=22;
2992
0
        }
2993
0
    }
2994
2995
0
    return curr_offset-offset;
2996
0
}
2997
/*
2998
 * 11.3.95c Active PFCs List
2999
 */
3000
static uint16_t
3001
de_bssgp_active_pfcs_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3002
7
{
3003
7
    proto_tree *pfc_tree;
3004
3005
7
    uint32_t curr_offset;
3006
7
    uint8_t num_pfc, i;
3007
3008
7
    curr_offset = offset;
3009
3010
7
    num_pfc = tvb_get_uint8(tvb, curr_offset);
3011
7
    if (num_pfc < 12) {
3012
3
        proto_tree_add_uint(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc);
3013
4
    }else {
3014
4
        proto_tree_add_uint_format_value(tree, hf_bssgp_num_pfc, tvb, curr_offset, 1, num_pfc, "Reserved");
3015
4
        return (curr_offset-offset);
3016
4
    }
3017
3
    curr_offset++;
3018
3
    if (num_pfc == 0)
3019
1
        return (curr_offset-offset);
3020
3021
12
    for (i = 0; i < num_pfc; i++) {
3022
10
        pfc_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1,
3023
10
            ett_bssgp_pfc_flow_control_parameters_pfc, NULL, "PFC (%u)", i + 1);
3024
3025
10
        de_sm_pflow_id(tvb, pfc_tree, pinfo, curr_offset, 1, NULL, 0);
3026
10
        curr_offset++;
3027
3028
10
    }
3029
3030
2
    return curr_offset-offset;
3031
3
}
3032
/*
3033
 * 11.3.96  Velocity Data
3034
 */
3035
static uint16_t
3036
de_bssgp_velocity_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
3037
0
{
3038
0
    uint32_t curr_offset;
3039
3040
0
    curr_offset = offset;
3041
3042
    /* The rest of the information element contains an octet sequence
3043
     * identical to that for Description of Velocity defined in 3GPP TS
3044
     * 23.032.
3045
     */
3046
0
    curr_offset = dissect_description_of_velocity(tvb, tree, pinfo, curr_offset, len, add_string, string_len);
3047
3048
0
    return curr_offset-offset;
3049
0
}
3050
/*
3051
 * 11.3.97  DTM Handover Command
3052
 */
3053
static uint16_t
3054
de_bssgp_dtm_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3055
0
{
3056
0
    uint32_t curr_offset;
3057
3058
0
    curr_offset = offset;
3059
3060
    /* Rest of element coded as a complete DTM Handover Command
3061
     * radio interface message as defined in 3GPP TS 44.060 (carrying
3062
     * the DTM Handover to A/Gb Mode Payload)
3063
     */
3064
0
    proto_tree_add_item(tree, hf_bssgp_dtm_handover_command_data, tvb, curr_offset, len, ENC_NA);
3065
3066
0
    return len;
3067
0
}
3068
/*
3069
 * 11.3.98  CS Indication
3070
 */
3071
static uint16_t
3072
de_bssgp_cs_indication(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3073
1
{
3074
1
    uint32_t curr_offset;
3075
3076
1
    curr_offset = offset;
3077
3078
    /* CS Indication Contents
3079
     * CS Indication Contents: This identifies a particular handover attempt for this MS. This shall be identical to the PS
3080
     * Indication Contents value in the corresponding PS Indication IE included in the Old BSS to New BSS Information IE
3081
     * (see 3GPP TS 48.008). The choice of the value of this field is implementation specific, with the requirement that
3082
     * consecutive handover attempts for the same mobile station shall not have the same CS Indication Contents value.
3083
     */
3084
1
    proto_tree_add_item(tree, hf_bssgp_cs_indication, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3085
1
    curr_offset++;
3086
3087
1
    return curr_offset-offset;
3088
1
}
3089
/*
3090
 * 11.3.99  Requested GANSS Assistance Data
3091
 */
3092
/* Rest of element coded as the value part defined in
3093
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
3094
 * 3GPP TS 49.031 octet length indicator
3095
 */
3096
/*
3097
 * 11.3.100     GANSS Location Type
3098
 */
3099
/* Rest of element coded as the value part defined in
3100
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
3101
 * 3GPP TS 49.031 octet length indicator
3102
 */
3103
/*
3104
 * 11.3.101     GANSS Positioning Data
3105
 */
3106
/* Rest of element coded as the value part defined in
3107
 * 3GPP TS 49.031, not including 3GPP TS 49.031 IEI and
3108
 * 3GPP TS 49.031 octet length indicator
3109
 */
3110
/*
3111
 * 11.3.102     Flow Control Granularity
3112
 */
3113
static const value_string bssgp_flow_control_gran_vals[] = {
3114
    { 0, "100 octets or bits/s increments" },
3115
    { 1, "1000 octets or bits/s increments" },
3116
    { 2, "10000 octets or bits/s increments" },
3117
    { 3, "100000 octets or bits/s increments" },
3118
    { 0,    NULL },
3119
};
3120
3121
3122
static uint16_t
3123
de_bssgp_flow_control_gran(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3124
6
{
3125
6
    uint32_t curr_offset;
3126
3127
6
    curr_offset = offset;
3128
3129
    /* Granularity */
3130
6
    proto_tree_add_item(tree, hf_bssgp_flow_control_gran, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3131
6
    curr_offset++;
3132
3133
6
    return curr_offset-offset;
3134
6
}
3135
/*
3136
 * 11.3.103     eNB Identifier
3137
 */
3138
uint16_t
3139
de_bssgp_enb_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
3140
11
{
3141
11
    tvbuff_t    *new_tvb;
3142
11
    uint32_t curr_offset;
3143
3144
11
    curr_offset = offset;
3145
3146
    /* Octets 3 to 7 contain the value part (starting with octet 2) of the
3147
     * Tracking Area Identity IE defined in 3GPP TS 24.301 [37], not
3148
     * including 3GPP TS 24.301 IEI [37]
3149
    */
3150
11
    curr_offset = curr_offset+ de_emm_trac_area_id(tvb, tree, pinfo, curr_offset, 5, add_string, string_len);
3151
3152
    /* Octets 8-n contain the Global eNB ID (see 3GPP TS 36.413) of the eNodeB. */
3153
11
    new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
3154
11
    dissect_s1ap_Global_ENB_ID_PDU(new_tvb, pinfo, tree, NULL);
3155
3156
11
    return len;
3157
11
}
3158
/*
3159
 * 11.3.104     E-UTRAN Inter RAT Handover Info
3160
 */
3161
static uint16_t
3162
de_bssgp_e_utran_inter_rat_ho_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3163
1.70k
{
3164
1.70k
    tvbuff_t    *new_tvb;
3165
1.70k
    uint32_t curr_offset;
3166
3167
1.70k
    curr_offset = offset;
3168
3169
1.70k
    new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
3170
    /*
3171
     * Formatted and coded according to the UE-EUTRA-Capability IE
3172
     * defined in 3GPP Technical Specification 36.331. The most
3173
     * significant bit of the first octet of the octet string contains bit 8 of
3174
     * the first octet of the IE.
3175
     */
3176
1.70k
    dissect_lte_rrc_UE_EUTRA_Capability_PDU(new_tvb, pinfo, tree, NULL);
3177
3178
1.70k
    return len;
3179
1.70k
}
3180
/*
3181
 * 11.3.105     Subscriber Profile ID for RAT/Frequency priority
3182
 */
3183
3184
static uint16_t
3185
de_bssgp_sub_prof_id_f_rat_freq_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_)
3186
7
{
3187
7
    uint32_t curr_offset;
3188
7
    uint8_t value;
3189
3190
7
    curr_offset = offset;
3191
3192
    /* Octet 3 contains a number in binary representation ranging from 0 to 255.
3193
     * The Subscriber Profile ID for RAT/Frequency priority is given by
3194
     * the indicated value +1.
3195
     */
3196
7
    value = tvb_get_uint8(tvb,curr_offset) + 1;
3197
7
    proto_tree_add_uint(tree, hf_bssgp_sub_prof_id_f_rat_freq_prio, tvb, curr_offset, 1, value);
3198
7
    curr_offset++;
3199
3200
7
    return curr_offset-offset;
3201
7
}
3202
/*
3203
 * 11.3.106     Request for Inter-RAT Handover Info
3204
 */
3205
static uint16_t
3206
de_bssgp_req_for_inter_rat_ho_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3207
1
{
3208
1
    uint32_t curr_offset;
3209
3210
1
    curr_offset = offset;
3211
3212
    /*octet 3 Spare E-UTRAN Inter RAT Handover Info Req Inter RAT Handover Info Req */
3213
1
    proto_tree_add_item(tree, hf_bssgp_eutran_irat_ho_inf_req, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3214
1
    proto_tree_add_item(tree, hf_bssgp_irat_ho_inf_req, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3215
1
    curr_offset++;
3216
3217
1
    return curr_offset-offset;
3218
1
}
3219
/*
3220
 * 11.3.107     Reliable Inter-RAT Handover Info
3221
 */
3222
static uint16_t
3223
de_bssgp_reliable_inter_rat_ho_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3224
2
{
3225
2
    uint32_t curr_offset;
3226
3227
2
    curr_offset = offset;
3228
3229
    /* Reliable Inter RAT Handover Info Indicator */
3230
2
    proto_tree_add_item(tree, hf_bssgp_rel_int_rat_ho_inf_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3231
2
    curr_offset++;
3232
3233
2
    return curr_offset-offset;
3234
2
}
3235
/*
3236
 * 11.3.108     SON Transfer Application Identity
3237
 */
3238
static uint16_t
3239
de_bssgp_son_transfer_app_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
3240
9
{
3241
9
    tvbuff_t *next_tvb;
3242
3243
    /* SON Transfer Application Identity: This field is encoded as the SON Transfer Application Identity IE
3244
     * as defined in 3GPP TS 36.413
3245
     */
3246
9
    if(len > 0){
3247
9
        next_tvb = tvb_new_subset_length(tvb, offset, len);
3248
9
        dissect_s1ap_SONtransferApplicationIdentity_PDU(next_tvb, pinfo, tree, NULL);
3249
9
    }
3250
3251
9
    return len;
3252
9
}
3253
/*
3254
 * 11.3.109     CSG Identifier
3255
 */
3256
3257
/* Cell Access Mode (bit 1 of octet 7) */
3258
static const value_string bssgp_cell_access_mode_vals[] = {
3259
    { 0, "CSG cell" },
3260
    { 1, "Hybrid cell" },
3261
    { 0,    NULL },
3262
};
3263
3264
static uint16_t
3265
de_bssgp_csg_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_)
3266
0
{
3267
0
    uint32_t curr_offset;
3268
3269
0
    curr_offset = offset;
3270
3271
    /* Octets 3 to 6 contain the CSG Identity (CSG-ID) of the cell (defined in
3272
     * 3GPP TS 23.003) as reported by the mobile station (see 3GPP TS
3273
     * 44.060). Bits 4 to 8 of octet 6 are spare and set to zero.
3274
     */
3275
0
    proto_tree_add_item(tree, hf_bssgp_csg_id, tvb, curr_offset, 4, ENC_BIG_ENDIAN);
3276
0
    curr_offset+=4;
3277
    /* Cell Access Mode */
3278
0
    proto_tree_add_item(tree, hf_bssgp_cell_acc_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3279
0
    curr_offset++;
3280
3281
0
    return curr_offset-offset;
3282
0
}
3283
/*
3284
 * 11.3.110     Tracking Area Code
3285
 */
3286
/*
3287
 * Octets 3 to 5 contain the value part (starting with octet 2) of the TAC
3288
 * IE defined in 3GPP TS 24.301.
3289
 */
3290
3291
/*
3292
 * 11.3.111     Redirect Attempt Flag
3293
 */
3294
 static uint16_t
3295
de_bssgp_redir_attempt_flg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3296
2
{
3297
2
    uint32_t curr_offset;
3298
3299
2
    curr_offset = offset;
3300
3301
2
    proto_tree_add_item(tree, hf_bssgp_spare, tvb, curr_offset, 1, ENC_NA);
3302
2
    curr_offset += 1;
3303
3304
2
    return curr_offset-offset;
3305
2
}
3306
3307
/*
3308
 * 11.3.112     Redirection Indication
3309
*/
3310
static const value_string bssgp_redir_indication_reroute_reject_cause_vals[] = {
3311
    {0x00, "Reserved"},
3312
    {0x01, "Reserved"},
3313
    {0x02, "Reserved"},
3314
    {0x03, "Reserved"},
3315
    {0x04, "Reserved"},
3316
    {0x05, "Reserved"},
3317
    {0x06, "Reserved"},
3318
    {0x07, "Reserved"},
3319
    {0x08, "Reserved"},
3320
    {0x09, "Reserved"},
3321
    {0x0A, "Reserved"},
3322
    {0x0B, "PLMN not allowed"},
3323
    {0x0C, "Location area not allowed"},
3324
    {0x0D, "Roaming not allowed in this location area"},
3325
    {0x0E, "GPRS services not allowed in this PLMN"},
3326
    {0x0F, "No suitable cell in location area"},
3327
    {0x10, "CS/PS domain registration coordination required"},
3328
    {0x11, "Network failure" },
3329
    {0x12, "Rerouting to a DCN required" },
3330
/* {0x13~0xFF, "Reserved"} */
3331
    { 0,    NULL },
3332
};
3333
3334
static uint16_t
3335
de_bssgp_redir_indication(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3336
1
{
3337
1
    uint32_t curr_offset;
3338
3339
1
    curr_offset = offset;
3340
3341
1
    proto_tree_add_item(tree, hf_bssgp_redir_indication_reroute_reject_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3342
1
    curr_offset += 1;
3343
3344
1
    return curr_offset-offset;
3345
1
}
3346
3347
/*
3348
 * 11.3.113     Redirection Completed
3349
 */
3350
static const value_string bssgp_redir_complete_outcome_vals[] = {
3351
    {0x00, "Reserved"},
3352
    {0x01, "MS is accepted"},
3353
    {0x02, "MS is not accepted"},
3354
    {0x03, "MS is already registered"},
3355
    /* {0x04~0xFF, "Reserved"} */
3356
    { 0,    NULL },
3357
};
3358
3359
static uint16_t
3360
de_bssgp_redir_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3361
4
{
3362
4
    uint32_t curr_offset;
3363
3364
4
    curr_offset = offset;
3365
3366
4
    proto_tree_add_item(tree, hf_bssgp_redir_complete_outcome, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3367
4
    curr_offset += 1;
3368
3369
4
    return curr_offset-offset;
3370
4
}
3371
3372
/*
3373
 * 11.3.114     Unconfirmed send state variable
3374
 */
3375
static uint16_t
3376
de_bssgp_unconfirm_send_state_var(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3377
4
{
3378
4
    proto_tree_add_item(tree, hf_bssgp_unconfirm_send_state_var, tvb, offset, 2, ENC_BIG_ENDIAN);
3379
4
    return 2;
3380
4
}
3381
3382
/*
3383
 * 11.3.15 LLC-PDU
3384
 */
3385
/*
3386
 * 11.3.116 SCI
3387
 */
3388
static uint16_t
3389
de_bssgp_sci(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3390
2
{
3391
2
    uint32_t curr_offset;
3392
3393
2
    curr_offset = offset;
3394
3395
2
    proto_tree_add_item(tree, hf_bssgp_sci, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3396
2
    curr_offset++;
3397
3398
2
    return curr_offset-offset;
3399
2
}
3400
3401
/*
3402
 * 11.3.117 GGSN/P-GW location
3403
 */
3404
    static const value_string bssgp_ggsn_pgw_location_vals[] = {
3405
    { 0x0, "HPLMN" },
3406
    { 0x1, "VPLMN" },
3407
    { 0x2, "Operator Group GGSN" },
3408
    { 0x3, "Unknown" },
3409
    { 0x4, "For future use(treat as VPLMN)" },
3410
    { 0x5, "For future use(treat as VPLMN)" },
3411
    { 0x6, "For future use(treat as VPLMN)" },
3412
    { 0x7, "For future use(treat as VPLMN)" },
3413
    { 0, NULL }
3414
};
3415
3416
static uint16_t
3417
de_bssgp_ggsn_pgw_location(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3418
3
{
3419
3
    uint32_t curr_offset;
3420
3421
3
    curr_offset = offset;
3422
3423
3
    proto_tree_add_item(tree, hf_bssgp_ggsn_pgw_location, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3424
3
    curr_offset++;
3425
3426
3
    return curr_offset-offset;
3427
3
}
3428
3429
/*
3430
 * 11.3.118 Selected PLMN ID
3431
 */
3432
/* See PLMN ID */
3433
3434
/*
3435
 * 11.3.119 Priority Class Indicator
3436
 */
3437
static uint16_t
3438
de_bssgp_pri_class_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_)
3439
0
{
3440
0
    uint32_t curr_offset;
3441
0
    static int* const bssgp_prio_class_flags[] = {
3442
0
        &hf_bssgp_prio_class_flag_b0,
3443
0
        NULL
3444
0
    };
3445
0
    curr_offset = offset;
3446
3447
0
    proto_tree_add_bitmask(tree, tvb, curr_offset, hf_bssgp_prio_class_ind, ett_bssgp_prio_class_ind, bssgp_prio_class_flags, ENC_BIG_ENDIAN);
3448
0
    curr_offset++;
3449
3450
0
    return curr_offset-offset;
3451
0
}
3452
/*
3453
 * 11.3.122 Extended DRX parameters
3454
 */
3455
static const value_string bssgp_edrx_cycle_vals[] = {
3456
    { 0x0, "GERAN: 1.88 s / UTRAN: 10.24 s / E-UTRAN: 5.12 s" },
3457
    { 0x1, "GERAN: 3.76 s / UTRAN: 20.48 s / E-UTRAN: 10.24 s" },
3458
    { 0x2, "GERAN: 7.53 s / UTRAN: 40.96 s / E-UTRAN: 20.48 s" },
3459
    { 0x3, "GERAN: 12.24 s / UTRAN: 81.92 s / E-UTRAN: 40.96 s" },
3460
    { 0x4, "GERAN: 24.48 s / UTRAN: 163.84 s / E-UTRAN: 81.92 s" },
3461
    { 0x5, "GERAN: 48.96 s / UTRAN: 327.68 s / E-UTRAN: 163.84 s" },
3462
    { 0x6, "GERAN: 97.92 s / UTRAN: 655.36 s / E-UTRAN: 327.68 s" },
3463
    { 0x7, "GERAN: 195.84 s / UTRAN: 1310.72 s / E-UTRAN: 655.36 s" },
3464
    { 0x8, "GERAN: 391.68 s / UTRAN: 1966.08 s / E-UTRAN: 1310.72 s" },
3465
    { 0x9, "GERAN: 783.36 s / UTRAN: 2621.44 s / E-UTRAN: 2621.44 s" },
3466
    { 0xa, "GERAN: 1566.72 s / UTRAN: reserved / E-UTRAN: reserved" },
3467
    { 0xb, "GERAN: 3133.44 s / UTRAN: reserved / E-UTRAN: reserved" },
3468
    { 0, NULL }
3469
};
3470
3471
static uint16_t
3472
de_bssgp_edrx_params(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3473
4
{
3474
4
    uint32_t curr_offset;
3475
3476
4
    curr_offset = offset;
3477
3478
4
    proto_tree_add_item(tree, hf_bssgp_edrx_cycle_value, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3479
4
    curr_offset++;
3480
3481
4
    return curr_offset-offset;
3482
4
}
3483
3484
/*
3485
 * 11.3.123 Time Until Next Paging Occasion
3486
 */
3487
static uint16_t
3488
de_bssgp_tunpo(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3489
1
{
3490
1
    uint32_t curr_offset;
3491
3492
1
    curr_offset = offset;
3493
3494
1
    proto_tree_add_item(tree, hf_bssgp_tunpo_minutes, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3495
1
    curr_offset++;
3496
1
    proto_tree_add_item(tree, hf_bssgp_tunpo_seconds, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3497
1
    curr_offset++;
3498
3499
1
    return curr_offset-offset;
3500
1
}
3501
3502
/*
3503
 * 11.3.124   Coverage Class
3504
 */
3505
static const value_string bssgp_ec_dl_coverage_class_vals[] = {
3506
    { 0x0, "reserved" },
3507
    { 0x1, "DL Coverage Class 1" },
3508
    { 0x2, "DL Coverage Class 2" },
3509
    { 0x3, "DL Coverage Class 3" },
3510
    { 0x4, "DL Coverage Class 4" },
3511
    { 0, NULL }
3512
};
3513
3514
static const value_string bssgp_ec_ul_coverage_class_vals[] = {
3515
    { 0x0, "reserved" },
3516
    { 0x1, "UL Coverage Class 1" },
3517
    { 0x2, "UL Coverage Class 2" },
3518
    { 0x3, "UL Coverage Class 3" },
3519
    { 0x4, "UL Coverage Class 4" },
3520
    { 0, NULL }
3521
};
3522
3523
static uint16_t
3524
de_bssgp_coverage_class(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3525
7
{
3526
7
    uint32_t  curr_offset;
3527
3528
7
    curr_offset = offset;
3529
3530
7
    proto_tree_add_item(tree, hf_bssgp_ec_dl_coverage_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3531
7
    proto_tree_add_item(tree, hf_bssgp_ec_ul_coverage_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3532
7
    curr_offset++;
3533
3534
7
   return curr_offset-offset;
3535
3536
7
}
3537
3538
/*
3539
 * 11.3.125 Paging Attempt Information
3540
 */
3541
static const value_string bssgp_pei_vals[] = {
3542
    { 0x0, "Positioning event not triggered" },
3543
    { 0x1, "Positioning event triggered" },
3544
    { 0, NULL }
3545
3546
};
3547
static const value_string bssgp_paging_attempt_count_vals[] = {
3548
    { 0x0, "1st paging attempt" },
3549
    { 0x1, "2nd paging attempt" },
3550
    { 0x2, "3rd paging attempt" },
3551
    { 0x3, "4th paging attempt" },
3552
    { 0x4, "5th paging attempt" },
3553
    { 0x5, "6th paging attempt" },
3554
    { 0x6, "7th paging attempt" },
3555
    { 0x7, "8th paging attempt" },
3556
    { 0, NULL }
3557
3558
};
3559
3560
static const value_string bssgp_intended_num_of_pag_attempts_vals[] = {
3561
    { 0x0, "Information not available" },
3562
    { 0x1, "1 page attempt" },
3563
    { 0x2, "2 page attempts" },
3564
    { 0x3, "3 page attempts" },
3565
    { 0x4, "4 page attempts" },
3566
    { 0x5, "5 page attempts" },
3567
    { 0x6, "6 page attempts" },
3568
    { 0x7, "7 page attempts" },
3569
    { 0x8, "8 page attempts" },
3570
    { 0, NULL }
3571
};
3572
3573
3574
static uint16_t
3575
de_bssgp_pag_attempt_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3576
1
{
3577
1
    uint32_t curr_offset;
3578
3579
1
    curr_offset = offset;
3580
3581
1
    proto_tree_add_item(tree, hf_bssgp_pei, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3582
1
    proto_tree_add_item(tree, hf_bssgp_intended_num_of_pag_attempts, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3583
1
    proto_tree_add_item(tree, hf_bssgp_paging_attempt_count, tvb, curr_offset, 1, ENC_BIG_ENDIAN);
3584
1
    curr_offset++;
3585
3586
1
    return curr_offset-offset;
3587
1
}
3588
3589
/*
3590
 * 11.3.129 PLMN ID
3591
 */
3592
static uint16_t
3593
de_bssgp_plmn_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U_, char *add_string _U_, int string_len _U_)
3594
4
{
3595
4
    proto_tree_add_string(tree, hf_bssgp_plmn_id, tvb, offset, 3, dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_NONE, true));
3596
4
    return 3;
3597
4
}
3598
3599
typedef enum
3600
{
3601
    DE_BSSGP_ALIGNMENT_OCTETS,                                  /* 11.3.1   0x00 Alignment octets */
3602
    DE_BSSGP_BMAX_DEFAULT_MS,                                   /* 11.3.2   0x01 Bmax default MS  */
3603
    DE_BSSGP_BSS_AREA_IND,                                      /* 11.3.3   0x02 BSS Area Indication */
3604
    DE_BSSGP_BUCKET_LEAK_RATE,                                  /* 11.3.4   0x03 Bucket Leak Rate (R) */
3605
    DE_BSSGP_BVCI,                                              /* 11.3.6   0x04 BVCI (BSSGP Virtual Connection Identifier)  */
3606
    DE_BSSGP_BVC_BUCKET_SIZE,                                   /* 11.3.5   0x05 BVC Bucket Size */
3607
    DE_BSSGP_BVC_MEAS,                                          /* 11.3.7   0x06 BVC Measurement */
3608
    DE_BSSGP_CAUSE,                                             /* 11.3.8   0x07 Cause */
3609
    DE_BSSGP_CELL_ID,                                           /* 11.3.9   0x08 Cell Identifier */
3610
    DE_BSSGP_CHLN_NEEDED,                                       /* 11.3.10  0x09 Channel needed */
3611
    DE_BSSGP_DRX_PARAM,                                         /* 11.3.11  0x0a DRX Parameters GSM_A_PDU_TYPE_GM, DE_DRX_PARAM */
3612
    DE_BSSGP_EMLPP_PRIO,                                        /* 11.3.12  0x0b eMLPP-Priority GSM_A_PDU_TYPE_BSSMAP, BE_EMLPP_PRIO*/
3613
    DE_BSSGP_FLUSH_ACTION,                                      /* 11.3.13  0x0c Flush Action */
3614
    DE_BSSGP_IMSI,                                              /* 11.3.14  0x0d IMSI */
3615
    DE_BSSGP_LLC_PDU,                                           /* 11.3.15  0x0e LLC-PDU */
3616
    DE_BSSGP_LLC_FRAMES_DISC,                                   /* 11.3.16  0x0f LLC Frames Discarded  */
3617
    DE_BSSGP_LAI    ,                                           /* 11.3.17  0x10 Location Area  GSM_A_PDU_TYPE_COMMON, DE_LAI*/
3618
    DE_BSSGP_MID,                                               /* 11.3.20  0x11 Mobile Id GSM_A_PDU_TYPE_COMMON, DE_MID*/
3619
    DE_BSSGP_MS_BUCKET_SIZE,                                    /* 11.3.21  0x12 MS Bucket Size */
3620
    DE_BSSGP_MS_RAD_ACC_CAP,                                    /* 11.3.22  0x13 MS Radio Access Capability GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP*/
3621
    DE_BSSGP_OMC_ID,                                            /* 11.3.23  0x14 OMC Id */
3622
    DE_BSSGP_PDU_IN_ERROR,                                      /* 11.3.24  0x15 PDU In Error */
3623
    DE_BSSGP_PDU_LIFETIME,                                      /* 11.3.25  0x16 PDU Lifetime */
3624
    DE_BSSP_PRIORITY,                                           /* 11.3.27  0x17    Priority */
3625
    DE_BSSGP_QOS_PROFILE,                                       /* 11.3.28  0x18 QoS Profile */
3626
    DE_BSSGP_RA_CAUSE,                                          /* 11.3.29  0x19 Radio Cause */
3627
    DE_BSSGP_RA_CAP_UPD_CAUSE,                                  /* 11.3.30  0x1a RA-Cap-UPD-Cause */
3628
    DE_BSSGP_RAI,                                               /* 11.3.31  0x1b Routeing Area GSM_A_PDU_TYPE_GM, DE_RAI*/
3629
    DE_BSSGP_R_DEFAULT_MS,                                      /* 11.3.32  0x1c R_default_MS */
3630
    DE_BSSGP_SUSPEND_REF_NO,                                    /* 11.3.33  0x1d Suspend Reference Number */
3631
    DE_BSSGP_TAG,                                               /* 11.3.34  0x1e Tag */
3632
    DE_BSSGP_TLLI,                                              /* 11.3.35  0x1f Temporary logical link Identity (TLLI) GSM_A_PDU_TYPE_RR, DE_RR_TLLI*/
3633
    DE_BSSGP_TMSI_PTMSI,                                        /* 11.3.36  0x20 Temporary Mobile Subscriber Identity (TMSI) GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI*/
3634
    DE_BSSGP_TRACE_REF,                                         /* 11.3.37  0x21 Trace Reference */
3635
    DE_BSSGP_TRACE_TYPE,                                        /* 11.3.38  0x22 Trace Type */
3636
    DE_BSSGP_TRANSACTION_ID,                                    /* 11.3.39  0x23 Transaction Id */
3637
    DE_BSSGP_TRIGGER_ID,                                        /* 11.3.40  0x24 Trigger Id */
3638
    DE_BSSGP_NO_OF_OCT_AFFECTED,                                /* 11.3.41  0x25 Number of octets affected */
3639
    DE_BSSGP_LSA_ID_LIST,                                       /* 11.3.18  0x26 LSA Identifier List GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID_LIST*/
3640
    DE_BSSGP_LSA_INFO,                                          /* 11.3.19  0x27 LSA Information GSM_A_PDU_TYPE_BSSMAP, BE_LSA_INFO */
3641
    DE_BSSGP_ACKET_FLOW_ID,                                     /* 11.3.42  0x28 Packet Flow Identifier (PFI)  GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID*/
3642
    DE_BSSGP_GPRS_TIMER,                                        /* 11.3.44  0x29 GPRS Timer */
3643
    DE_BSSGP_QOS,                                               /* 11.3.43  0x3a Aggregate BSS QoS Profile GSM_A_PDU_TYPE_GM, DE_QOS*/
3644
    DE_BSSGP_FEATURE_BITMAP,                                    /* 11.3.45  0x3b Feature Bitmap */
3645
    DE_BSSGP_BUCKET_FULL_RATIO,                                 /* 11.3.46  0x3c Bucket Full Ratio */
3646
    DE_BSSGP_SERV_UTRAN_CCO,                                    /* 11.3.47  0x3d Service UTRAN CCO */
3647
    DE_BSSGP_NSEI,                                              /* 11.3.48  0x3e NSEI (Network Service Entity Identifier) */
3648
    DE_BSSGP_RRLP_APDU,                                         /* 11.3.49  0x3f RRLP APDU */
3649
3650
    DE_BSSGP_RRLP_FLAGS,                                        /* 11.3.60  0x4a RRLP Flags */
3651
    DE_BSSGP_RIM_APP_ID,                                        /* 11.3.61  0x4b RIM Application Identity */
3652
    DE_BSSGP_RIM_SEQ_NO,                                        /* 11.3.62  0x4c RIM Sequence Number */
3653
3654
    DE_BSSGP_RAN_INF_REQUEST_RIM_CONT,                          /* 11.3.62a.1   0x57 RAN-INFORMATION-REQUEST RIM Container */
3655
    DE_BSSGP_RAN_INF_RIM_CONT,                                  /* 11.3.62a.2   RAN-INFORMATION RIM Container */
3656
    DE_BSSGP_RAN_INFORMATION_ACK_RIM_CONT,                      /* 11.3.62a.3   RAN-INFORMATION-ACK RIM Container */
3657
    DE_BSSGP_RAN_INFORMATION_ERROR_RIM_CONT,                    /* 11.3.62a.4   RAN-INFORMATION-ERROR RIM Container */
3658
    DE_BSSGP_RAN_INF_APP_ERROR_RIM_CONT,                        /* 11.3.62a.5   RAN-INFORMATION-APPLICATION-ERROR RIM Container */
3659
    DE_BSSGP_RAN_INFORMATION_REQUEST_APP_CONT,                  /* 11.3.63.1    RAN-INFORMATION-REQUEST Application Container */
3660
    DE_BSSGP_RAN_INFORMATION_APP_CONT_UNIT,                     /* 11.3.63.2    RAN-INFORMATION Application Container Unit */
3661
    DE_BSSGP_RAN_APP_ERROR_CONT,                                /* 11.3.64  Application Error Container */
3662
    DE_BSSGP_RIM_PDU_INDICATIONS,                               /* 11.3.65  RIM PDU Indications */
3663
    DE_BSSGP_RIM_PROTO_VER_NO,                                  /* 11.3.67  RIM Protocol Version Number */
3664
3665
    DE_BSSGP_PFC_FLOW_CTRL,                                     /* 11.3.68  PFC Flow Control parameters */
3666
    DE_BSSGP_RIM_ROUTING_INF,                                   /* 11.3.70  RIM Routing Information */
3667
3668
    DE_BSSGP_MBMS_SESSION_ID,                                   /* 11.3.71  MBMS Session Identity */
3669
    DE_BSSGP_MBMS_SESSION_DUR,                                  /* 11.3.72  MBMS Session Duration */
3670
    DE_BSSGP_MBMS_SAI_LIST,                                     /* 11.3.73  MBMS Service Area Identity List */
3671
    DE_BSSGP_MBMS_RESPONSE,                                     /* 11.3.74  MBMS Response */
3672
    DE_BSSGP_MBMS_RA_LIST,                                      /* 11.3.75  MBMS Routing Area List */
3673
    DE_BSSGP_MBMS_SESSION_INF,                                  /* 11.3.76  MBMS Session Information */
3674
    DE_BSSGP_TMGI,                                              /* 11.3.77  TMGI (Temporary Mobile Group Identity) GSM_A_PDU_TYPE_GM, DE_TMGI*/
3675
3676
    DE_BSSGP_MBMS_STOP_CAUSE,                                   /* 11.3.78  MBMS Stop Cause */
3677
    DE_BSSGP_SOURCE_BSS_TO_TARGET_BSS_TRANSP_CONT,              /* 11.3.79  Source BSS to Target BSS Transparent Container */
3678
    DE_BSSGP_TARGET_BSS_TO_SOURCE_BSS_TRANSP_CONT,              /* 11.3.80  Target BSS to Source BSS Transparent Container */
3679
    DE_BSSGP_PFCS_TO_BE_SET_UP_LIST,                            /* 11.3.82  PFCs to be set-up list */
3680
    DE_BSSGP_LIST_OF_SETUP_PFCS,                                /* 11.3.83  List of set-up PFCs */
3681
    DE_BSSGP_EXT_FEATURE_BITMAP,                                /* 11.3.84  Extended Feature Bitmap */
3682
    DE_BSSGP_SRC_TO_TRG_TRANSP_CONT,                            /* 11.3.85  Source to Target Transparent Container */
3683
    DE_BSSGP_TRG_TO_SRC_TRANSP_CONT,                            /* 11.3.86  Target to Source Transparent Container */
3684
    BE_BSSGP_RNC_ID,                                            /* 11.3.87  RNC Identifier */
3685
    DE_BSSGP_PAGE_MODE,                                         /* 11.3.88  Page Mode */
3686
    DE_BSSGP_CONTAINER_ID,                                      /* 11.3.89  Container ID */
3687
    DE_BSSGP_GLOBAL_TFI,                                        /* 11.3.90  Global TFI */
3688
    DE_BSSGP_TIME_TO_MBMS_DATA_TRAN,                            /* 11.3.92  Time to MBMS Data Transfer */
3689
    DE_BSSGP_MBMS_SESSION_REP_NO,                               /* 11.3.93  MBMS Session Repetition Number */
3690
3691
    DE_BSSGP_INTER_RAT_HO_INFO,                                 /* 11.3.94  Inter RAT Handover Info */
3692
    DE_BSSGP_PS_HO_CMD,                                         /* 11.3.95  PS Handover Command */
3693
    DE_BSSGP_PS_HO_INDICATIONS,                                 /* 11.3.95a PS Handover Indications */
3694
    DE_BSSGP_SIPSI_CONTAINER,                                   /* 11.3.95b SI/PSI Container */
3695
    DE_BSSGP_ACTIVE_PFCS_LIST,                                  /* 11.3.95c Active PFCs List */
3696
    DE_BSSGP_VELOCITY_DATA,                                     /* 11.3.96  Velocity Data */
3697
    DE_BSSGP_DTM_HO_CMD,                                        /* 11.3.97  DTM Handover Command */
3698
    DE_BSSGP_CS_INDICATION,                                     /* 11.3.98  CS Indication */
3699
    DE_BSSGP_FLOW_CONTROL_GRAN,                                 /* 11.3.102 Flow Control Granularity */
3700
    DE_BSSGP_ENB_ID,                                            /* 11.3.103     eNB Identifier */
3701
    DE_BSSGP_E_UTRAN_INTER_RAT_HO_INFO,                         /* 11.3.104 E-UTRAN Inter RAT Handover Info */
3702
    DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO,                        /* 11.3.105 Subscriber Profile ID for RAT/Frequency priority */
3703
    DE_BSSGP_REQ_FOR_INTER_RAT_HO_INFO,                         /* 11.3.106 Request for Inter-RAT Handover Info */
3704
    DE_BSSGP_RELIABLE_INTER_RAT_HO_INF,                         /* 11.3.107 Reliable Inter-RAT Handover Info */
3705
    DE_BSSGP_SON_TRANSFER_APP_ID,                               /* 11.3.108 SON Transfer Application Identity */
3706
    DE_BSSGP_CSG_ID,                                            /* 11.3.109 CSG Identifier */
3707
    DE_BSSGP_REDIR_ATTEMPT_FLG,                                 /* 11.3.111 Redirect Attempt Flag */
3708
    DE_BSSGP_REDIR_INDICATION,                                  /* 11.3.112 Redirection Indication */
3709
    DE_BSSGP_REDIR_COMPLETE,                                    /* 11.3.113 Redirection Completed */
3710
    DE_BSSGP_UNCONFIRM_SEND_STATE_VAR,                          /* 11.3.114 Unconfirmed send state variable */
3711
    DE_BSSGP_SCI,                                               /* 11.3.116 SCI */
3712
    DE_BSSGP_GGSN_PGW_LOCATION,                                 /* 11.3.117 GGSN/P-GW location */
3713
    DE_BSSGP_PRIORITY_CLASS_IND,                                /* 11.3.119 Priority Class Indicator */
3714
    DE_BSSGP_EDRX_PARAMS,                                       /* 11.3.122 eDRX Parameters */
3715
    DE_BSSGP_TUNPO,                                             /* 11.3.123 Time Until Next Paging Occasion */
3716
    DE_BSSGP_COVERAGE_CLASS,                                    /* 11.3.124 Coverage Class */
3717
    DE_BSSGP_PAG_ATTEMPT_INFO,                                  /* 11.3.125 Paging Attempt Information */
3718
    DE_BSSGP_EXCEPTION_REPORT_FLAG,                             /* 11.3.126 Exception Report Flag */
3719
    DE_BSSGP_OLD_RA_IDENTIFICATION,                             /* 11.3.127 Old Routing Area Identification */
3720
    DE_BSSGP_ATTACH_INDIC,                                      /* 11.3.128 Attach Indicator */
3721
    DE_BSSGP_PLMN_ID,                                           /* 11.3.129 PLMN Identity */
3722
        /*
3723
        x9e MME Query
3724
        x9f SGSN Group Identity
3725
        xa0 Additional P-TMSI
3726
        xa1 UE Usage Type */
3727
3728
    DE_BSSGP_NONE                                               /* NONE */
3729
}
3730
bssgp_elem_idx_t;
3731
3732
static const value_string bssgp_elem_strings[] = {
3733
    { DE_BSSGP_ALIGNMENT_OCTETS,                     "Alignment Octets" },                                   /* 11.3.1   Alignment octets */
3734
    { DE_BSSGP_BMAX_DEFAULT_MS,                      "Bmax default MS" },                                    /* 11.3.2   Bmax default MS  */
3735
    { DE_BSSGP_BSS_AREA_IND,                         "BSS Area Indication" },                                /* 11.3.3   BSS Area Indication  */
3736
    { DE_BSSGP_BUCKET_LEAK_RATE,                     "Bucket Leak Rate (R)" },                               /* 11.3.4   Bucket Leak Rate (R) */
3737
    { DE_BSSGP_BVCI,                                 "BVCI (BSSGP Virtual Connection Identifier)" },         /* 11.3.6   BVCI (BSSGP Virtual Connection Identifier)  */
3738
    { DE_BSSGP_BVC_BUCKET_SIZE,                      "BVC Bucket size" },                                    /* 11.3.5   BVC Bucket Size */
3739
    { DE_BSSGP_BVC_MEAS,                             "BVC Measurement" },                                    /* 11.3.7   BVC Measurement */
3740
    { DE_BSSGP_CAUSE,                                "Cause" },                                              /* 11.3.8   Cause */
3741
    { DE_BSSGP_CELL_ID,                              "Cell Identifier" },                                    /* 11.3.9   Cell Identifier */
3742
    { DE_BSSGP_CHLN_NEEDED,                          "Channel needed" },                                     /* 11.3.10  Channel needed */
3743
    { DE_BSSGP_DRX_PARAM,                            "DRX Parameters" },                                     /* 11.3.11  DRX Parameters */
3744
    { DE_BSSGP_EMLPP_PRIO,                           "eMLPP-Priority" },                                     /* 11.3.12  eMLPP-Priority */
3745
    { DE_BSSGP_FLUSH_ACTION,                         "Flush Action" },                                       /* 11.3.13  Flush Action */
3746
    { DE_BSSGP_IMSI,                                 "IMSI" },                                               /* 11.3.14  IMSI */
3747
    { DE_BSSGP_LLC_PDU,                              "LLC-PDU" },                                            /* 11.3.15  LLC-PDU */
3748
    { DE_BSSGP_LLC_FRAMES_DISC,                      "LLC Frames Discarded" },                               /* 11.3.16  LLC Frames Discarded  */
3749
    { DE_BSSGP_LAI,                                  "Location Area" },                                      /* 11.3.17  Location Area  */
3750
    { DE_BSSGP_MID,                                  "Mobile Id" },                                          /* 11.3.20  Mobile Id */
3751
    { DE_BSSGP_MS_BUCKET_SIZE,                       "MS Bucket Size" },                                     /* 11.3.21  MS Bucket Size */
3752
    { DE_BSSGP_MS_RAD_ACC_CAP,                       "MS Radio Access Capability" },                         /* 11.3.22  MS Radio Access Capability GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP */
3753
    { DE_BSSGP_OMC_ID,                               "OMC Id" },                                             /* 11.3.23  OMC Id */
3754
    { DE_BSSGP_PDU_IN_ERROR,                         "PDU In Error" },                                       /* 11.3.24  PDU In Error */
3755
    { DE_BSSGP_PDU_LIFETIME,                         "PDU Lifetime" },                                       /* 11.3.25  PDU Lifetime */
3756
    { DE_BSSP_PRIORITY,                              "Priority" },                                           /* 11.3.27  Priority */
3757
    { DE_BSSGP_QOS_PROFILE,                          "QoS Profile" },                                        /* 11.3.28  QoS Profile */
3758
    { DE_BSSGP_RA_CAUSE,                             "Radio Cause" },                                        /* 11.3.29  Radio Cause */
3759
    { DE_BSSGP_RA_CAP_UPD_CAUSE,                     "RA-Cap-UPD-Cause" },                                   /* 11.3.30  RA-Cap-UPD-Cause */
3760
    { DE_BSSGP_RAI,                                  "Routeing Area" },                                      /* 11.3.31  Routeing Area */
3761
    { DE_BSSGP_R_DEFAULT_MS,                         "R_default_MS" },                                       /* 11.3.32  R_default_MS */
3762
    { DE_BSSGP_SUSPEND_REF_NO,                       "Suspend Reference Number" },                           /* 11.3.33  Suspend Reference Number */
3763
    { DE_BSSGP_TAG,                                  "Tag" },                                                /* 11.3.34  Tag */
3764
    { DE_BSSGP_TLLI,                                 "Temporary logical link Identity (TLLI)" },             /* 11.3.35  Temporary logical link Identity (TLLI) GSM_A_PDU_TYPE_RR, DE_RR_TLLI*/
3765
    { DE_BSSGP_TMSI_PTMSI,                           "Temporary Mobile Subscriber Identity (TMSI)" },        /* 11.3.36  Temporary Mobile Subscriber Identity (TMSI)GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI */
3766
    { DE_BSSGP_TRACE_REF,                            "Trace Reference" },                                    /* 11.3.37  Trace Reference */
3767
    { DE_BSSGP_TRACE_TYPE,                           "Trace Type" },                                         /* 11.3.38  Trace Type */
3768
    { DE_BSSGP_TRANSACTION_ID,                       "Transaction Id" },                                     /* 11.3.39  Transaction Id */
3769
    { DE_BSSGP_TRIGGER_ID,                           "Trigger Id" },                                         /* 11.3.40  Trigger Id */
3770
    { DE_BSSGP_NO_OF_OCT_AFFECTED,                   "Number of octets affected" },                          /* 11.3.41  Number of octets affected */
3771
    { DE_BSSGP_LSA_ID_LIST,                          "LSA Identifier List" },                                /* 11.3.18  LSA Identifier List */
3772
    { DE_BSSGP_LSA_INFO,                             "LSA Information" },                                    /* 11.3.19  LSA Information */
3773
    { DE_BSSGP_ACKET_FLOW_ID,                        "Packet Flow Identifier (PFI)" },                       /* 11.3.42  Packet Flow Identifier (PFI) GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID*/
3774
    /* 11.3.42a (void) */
3775
    { DE_BSSGP_GPRS_TIMER,                           "GPRS Timer" },                                         /* 11.3.44  GPRS Timer */
3776
    { DE_BSSGP_QOS,                                  "Aggregate BSS QoS Profile" },                          /* 11.3.43  Aggregate BSS QoS Profile GSM_A_PDU_TYPE_GM, DE_QOS*/
3777
    { DE_BSSGP_FEATURE_BITMAP,                       "Feature Bitmap" },                                     /* 11.3.45  Feature Bitmap */
3778
    { DE_BSSGP_BUCKET_FULL_RATIO,                    "Bucket Full Ratio" },                                  /* 11.3.46  Bucket Full Ratio */
3779
    { DE_BSSGP_SERV_UTRAN_CCO,                       "Service UTRAN CCO" },                                  /* 11.3.47  Service UTRAN CCO */
3780
    { DE_BSSGP_NSEI,                                 "NSEI (Network Service Entity Identifier)" },           /* 11.3.48  NSEI (Network Service Entity Identifier) */
3781
    { DE_BSSGP_RRLP_APDU,                            "RRLP APDU" },                                          /* 11.3.49 RRLP APDU */
3782
    /* 11.3.50  LCS QoS BSSGP_IEI_LCS_QOS, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCSQOS*/
3783
    /* 11.3.51  LCS Client Type BSSGP_IEI_LCS_CLIENT_TYPE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CLIENT_TYPE*/
3784
    /* 11.3.52  Requested GPS Assistance Data BSSGP_IEI_REQUESTED_GPS_ASSISTANCE_DATA, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_REQ_GPS_ASSIST_D*/
3785
    /* 11.3.53  Location Type BSSGP_IEI_LOCATION_TYPE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_GANSS_LOC_TYPE*/
3786
    /* 11.3.54  Location Estimate BSSGP_IEI_LOCATION_ESTIMATE, GSM_A_PDU_TYPE_BSSMAP, BE_LOC_EST*/
3787
    /* 11.3.55  Positioning Data 0x7d, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_POS_DATA*/
3788
    /* 11.3.56  Deciphering Keys BSSGP_IEI_DECIPHERING_KEYS, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_DECIPH_KEYS */
3789
    /* 11.3.57  LCS Priority BSSGP_IEI_LCS_PRIORITY, GSM_A_PDU_TYPE_BSSMAP, BE_LCS_PRIO;*/
3790
    /* 11.3.58  LCS Cause BSSGP_IEI_LCS_CAUSE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CAUSE */
3791
    /* 11.3.59  LCS Capability 0x49 , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP*/
3792
    { DE_BSSGP_RRLP_FLAGS,                           "RRLP Flags" },                                         /* 11.3.60  RRLP Flags */
3793
    { DE_BSSGP_RIM_APP_ID,                           "RIM Application Identity" },                           /* 11.3.61  RIM Application Identity */
3794
    { DE_BSSGP_RIM_SEQ_NO,                           "RIM Sequence Number" },                                /* 11.3.62  RIM Sequence Number */
3795
    /* 11.3.62a    RIM Container */
3796
    /* 11.3.62a.0  General */
3797
    { DE_BSSGP_RAN_INF_REQUEST_RIM_CONT,             "RAN-INFORMATION-REQUEST RIM Container" },              /* 11.3.62a.1   RAN-INFORMATION-REQUEST RIM Container */
3798
    { DE_BSSGP_RAN_INF_RIM_CONT,                     "RAN-INFORMATION RIM Container" },                      /* 11.3.62a.2   RAN-INFORMATION RIM Container */
3799
    { DE_BSSGP_RAN_INFORMATION_ACK_RIM_CONT,         "RAN-INFORMATION-ACK RIM Container" },                  /* 11.3.62a.3   RAN-INFORMATION-ACK RIM Container */
3800
    { DE_BSSGP_RAN_INFORMATION_ERROR_RIM_CONT,       "RAN-INFORMATION-ERROR RIM Container" },                /* 11.3.62a.4   RAN-INFORMATION-ERROR RIM Container */
3801
    { DE_BSSGP_RAN_INF_APP_ERROR_RIM_CONT,           "RAN-INFORMATION-APPLICATION-ERROR RIM Container" },    /* 11.3.62a.5   RAN-INFORMATION-APPLICATION-ERROR RIM Container */
3802
    /* 11.3.63 Application Container */
3803
    { DE_BSSGP_RAN_INFORMATION_REQUEST_APP_CONT,     "RAN-INFORMATION-REQUEST Application Container" },      /* 11.3.63.1    RAN-INFORMATION-REQUEST Application Container */
3804
    /* 11.3.63.1.0 General */
3805
    /* 11.3.63.1.1 RAN-INFORMATION-REQUEST Application Container for the NACC Application */
3806
    /* 11.3.63.1.2 RAN-INFORMATION-REQUEST Application Container for the SI3 Application */
3807
    /* 11.3.63.1.3 RAN-INFORMATION-REQUEST Application Container for the MBMS data channel Application */
3808
    /* 11.3.63.1.4 RAN-INFORMATION-REQUEST Application Container for the SON Transfer Application */
3809
    { DE_BSSGP_RAN_INFORMATION_APP_CONT_UNIT,        "RAN-INFORMATION Application Container Unit" },         /* 11.3.63.2    RAN-INFORMATION Application Container Unit */
3810
    /* 11.3.63.2.0 General */
3811
    /* 11.3.63.2.1 RAN-INFORMATION Application Container for the NACC Application */
3812
    /* 11.3.63.2.2 RAN-INFORMATION Application Container for the SI3 Application */
3813
    /* 11.3.63.2.3 RAN-INFORMATION Application Container for the MBMS data channel Application */
3814
    /* 11.3.63.2.4 RAN-INFORMATION Application Container for the SON Transfer Application */
3815
    { DE_BSSGP_RAN_APP_ERROR_CONT,                   "Application Error Container" },                        /* 11.3.64  Application Error Container */
3816
    /* 11.3.64.1   Application Error Container layout for the NACC application */
3817
    /* 11.3.64.2   Application Error Container for the SI3 application */
3818
    /* 11.3.64.3   Application Error Container for the MBMS data channel application */
3819
    /* 11.3.64.4   Application Error Container for the SON Transfer Application */
3820
    { DE_BSSGP_RIM_PDU_INDICATIONS,                  "RIM PDU Indications" },                                /* 11.3.65  RIM PDU Indications */
3821
    /* 11.3.65.0   General */
3822
    /* 11.3.65.1   RAN-INFORMATION-REQUEST RIM PDU Indications */
3823
    /* 11.3.65.2   RAN-INFORMATION RIM PDU Indications */
3824
    /* 11.3.65.3   RAN-INFORMATION-APPLICATION-ERROR RIM PDU Indications */
3825
    /* 11.3.66 (void) */
3826
    { DE_BSSGP_RIM_PROTO_VER_NO,                     "RIM Protocol Version Number" },                        /* 11.3.67  RIM Protocol Version Number */
3827
    { DE_BSSGP_PFC_FLOW_CTRL,                        "PFC Flow Control parameters" },                        /* 11.3.68  PFC Flow Control parameters */
3828
    /* 0x53, SGSAP_PDU_TYPE, DE_SGSAP_GLOBAL_CN_ID */                  /* 11.3.69  Global CN-Id */
3829
    { DE_BSSGP_RIM_ROUTING_INF,                      "RIM Routing Information" },                            /* 11.3.70  RIM Routing Information */
3830
    { DE_BSSGP_MBMS_SESSION_ID,                      "MBMS Session Identity" },                              /* 11.3.71 MBMS Session Identity */
3831
    { DE_BSSGP_MBMS_SESSION_DUR,                     "MBMS Session Duration" },                              /* 11.3.72  MBMS Session Duration */
3832
    { DE_BSSGP_MBMS_SAI_LIST,                        "MBMS Service Area Identity List" },                    /* 11.3.73  MBMS Service Area Identity List */
3833
    { DE_BSSGP_MBMS_RESPONSE,                        "MBMS Response" },                                      /* 11.3.74  MBMS Response */
3834
    { DE_BSSGP_MBMS_RA_LIST,                         "MBMS Routing Area List" },                             /* 11.3.75  MBMS Routing Area List */
3835
    { DE_BSSGP_MBMS_SESSION_INF,                     "MBMS Session Information" },                           /* 11.3.76  MBMS Session Information */
3836
    { DE_BSSGP_TMGI,                                 "TMGI" },                                               /* 11.3.77  TMGI (Temporary Mobile Group Identity) */
3837
    { DE_BSSGP_MBMS_STOP_CAUSE,                      "MBMS Stop Cause" },                                    /* 11.3.78  MBMS Stop Cause */
3838
    { DE_BSSGP_SOURCE_BSS_TO_TARGET_BSS_TRANSP_CONT, "Source BSS to Target BSS Transparent Container" },     /* 11.3.79  Source BSS to Target BSS Transparent Container */
3839
    { DE_BSSGP_TARGET_BSS_TO_SOURCE_BSS_TRANSP_CONT, "Target BSS to Source BSS Transparent Container" },     /* 11.3.80  Target BSS to Source BSS Transparent Container */
3840
    /* 11.3.81 NAS container for PS Handover */
3841
    { DE_BSSGP_PFCS_TO_BE_SET_UP_LIST,               "PFCs to be set-up list" },                             /* 11.3.82  PFCs to be set-up list */
3842
    { DE_BSSGP_LIST_OF_SETUP_PFCS,                   "List of set-up PFCs" },                                /* 11.3.83  List of set-up PFCs */
3843
    { DE_BSSGP_EXT_FEATURE_BITMAP,                   "Extended Feature Bitmap" },                            /* 11.3.84  Extended Feature Bitmap */
3844
    { DE_BSSGP_SRC_TO_TRG_TRANSP_CONT,               "Source to Target Transparent Container" },             /* 11.3.85  Source to Target Transparent Container */
3845
    { DE_BSSGP_TRG_TO_SRC_TRANSP_CONT,               "Target to Source Transparent Container" },             /* 11.3.86  Target to Source Transparent Container */
3846
    { BE_BSSGP_RNC_ID,                               "RNC Identifier" },                                     /* 11.3.87  RNC Identifier */
3847
    { DE_BSSGP_PAGE_MODE,                            "Page Mode" },                                          /* 11.3.88  Page Mode */
3848
    { DE_BSSGP_CONTAINER_ID,                         "Container ID" },                                       /* 11.3.89  Container ID */
3849
    { DE_BSSGP_GLOBAL_TFI,                           "Global TFI" },                                         /* 11.3.90  Global TFI */
3850
    /* 11.3.91 IMEI */
3851
    { DE_BSSGP_TIME_TO_MBMS_DATA_TRAN,               "Time to MBMS Data Transfer" },                         /* 11.3.92  Time to MBMS Data Transfer */
3852
    { DE_BSSGP_MBMS_SESSION_REP_NO,                  "MBMS Session Repetition Number" },                     /* 11.3.93  MBMS Session Repetition Number */
3853
    { DE_BSSGP_INTER_RAT_HO_INFO,                    "Inter RAT Handover Info" },                            /* 11.3.94  Inter RAT Handover Info */
3854
    { DE_BSSGP_PS_HO_CMD,                            "PS Handover Command" },                                /* 11.3.95  PS Handover Command */
3855
    { DE_BSSGP_PS_HO_INDICATIONS,                    "PS Handover Indications" },                            /* 11.3.95a PS Handover Indications */
3856
    { DE_BSSGP_SIPSI_CONTAINER,                      "SI/PSI Container" },                                   /* 11.3.95b SI/PSI Container */
3857
    { DE_BSSGP_ACTIVE_PFCS_LIST,                     "Active PFCs List" },                                   /* 11.3.95c Active PFCs List */
3858
    { DE_BSSGP_VELOCITY_DATA,                        "Velocity Data" },                                      /* 11.3.96  Velocity Data */
3859
    { DE_BSSGP_DTM_HO_CMD,                           "DTM Handover Command" },                               /* 11.3.97  DTM Handover Command */
3860
    { DE_BSSGP_CS_INDICATION,                        "CS Indication" },                                      /* 11.3.98  CS Indication */
3861
    /* 11.3.99  Requested GANSS Assistance Data 0x7b, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_ASS_DTA*/
3862
    /* 11.3.100 GANSS Location Type 0x7c, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_LOC_TYP*/
3863
    /* 11.3.101 GANSS Positioning Data ENC_BIG_ENDIAN);*/
3864
    { DE_BSSGP_FLOW_CONTROL_GRAN,                    "Flow Control Granularity" },                           /* 11.3.102 Flow Control Granularity */
3865
    { DE_BSSGP_ENB_ID,                               "eNB Identifier" },                                     /* 11.3.103 eNB Identifier */
3866
    { DE_BSSGP_E_UTRAN_INTER_RAT_HO_INFO,            "E-UTRAN Inter RAT Handover Info" },                    /* 11.3.104 E-UTRAN Inter RAT Handover Info */
3867
    { DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO,           "Subscriber Profile ID for RAT/Frequency priority" },   /* 11.3.105 Subscriber Profile ID for RAT/Frequency priority */
3868
    { DE_BSSGP_REQ_FOR_INTER_RAT_HO_INFO,            "Request for Inter-RAT Handover Info" },                /* 11.3.106 Request for Inter-RAT Handover Info */
3869
    { DE_BSSGP_RELIABLE_INTER_RAT_HO_INF,            "Reliable Inter-RAT Handover Info" },                   /* 11.3.107 Reliable Inter-RAT Handover Info */
3870
    { DE_BSSGP_SON_TRANSFER_APP_ID,                  "Son transfer application identity" },                  /* 11.3.108 SON Transfer Application Identity */
3871
    { DE_BSSGP_CSG_ID,                               "CSG Identifier" },                                     /* 11.3.109 CSG Identifier */
3872
    /* 11.3.110 Tracking Area Code */
3873
    { DE_BSSGP_REDIR_ATTEMPT_FLG,                    "Redirect Attempt Flag"},                               /* 11.3.111 Redirect Attempt Flag */
3874
    { DE_BSSGP_REDIR_INDICATION,                     "Redirection Indication"},                              /* 11.3.112 Redirection Indication */
3875
    { DE_BSSGP_REDIR_COMPLETE,                       "Redirection Completed"},                               /* 11.3.113 Redirection Completed */
3876
    { DE_BSSGP_UNCONFIRM_SEND_STATE_VAR,             "Unconfirmed Send State Variable"},                     /* 11.3.114 Unconfirmed send state variable */
3877
    { DE_BSSGP_SCI,                                  "SCI" },                                                /* 11.3.116 SCI */
3878
    { DE_BSSGP_GGSN_PGW_LOCATION,                    "GGSN / P - GW location"},                              /* 11.3.117 GGSN/P-GW location */
3879
    /* 11.3.118 Selected PLMN ID */
3880
    { DE_BSSGP_PRIORITY_CLASS_IND,                   "Priority Class Indicator" },                           /* 11.3.119 Priority Class Indicator */
3881
    { DE_BSSGP_EDRX_PARAMS,                          "eDRX Parameters" },                                    /* 11.3.122 eDRX Parameters */
3882
    { DE_BSSGP_TUNPO,                                "Time Until Next Paging Occasion" },                    /* 11.3.123 Time Until Next Paging Occasion */
3883
    { DE_BSSGP_COVERAGE_CLASS,                       "Coverage Class" },                                     /* 11.3.124 Coverage Class */
3884
    { DE_BSSGP_PAG_ATTEMPT_INFO,                     "Paging Attempt Information" },                         /* 11.3.125 Paging Attempt Information */
3885
    { DE_BSSGP_EXCEPTION_REPORT_FLAG,                "Exception Report Flag" },                              /* 11.3.126 Exception Report Flag */
3886
    { DE_BSSGP_OLD_RA_IDENTIFICATION,                "Old Routing Area Identification" },                    /* 11.3.127 Old Routing Area Identification */
3887
    { DE_BSSGP_ATTACH_INDIC,                         "Attach Indicator" },                                   /* 11.3.128 Attach Indicator */
3888
    { DE_BSSGP_PLMN_ID,                              "PLMN Identity" },                                      /* 11.3.129 PLMN Identity */
3889
    { 0, NULL }
3890
};
3891
value_string_ext bssgp_elem_strings_ext = VALUE_STRING_EXT_INIT(bssgp_elem_strings);
3892
3893
1.87k
#define NUM_BSSGP_ELEM array_length(bssgp_elem_strings)
3894
int ett_bssgp_elem[NUM_BSSGP_ELEM];
3895
3896
3897
uint16_t (* const bssgp_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len) = {
3898
    de_bssgp_aligment_octets,                                   /* 11.3.1   0x00 Alignment octets */
3899
    de_bssgp_bmax_default_ms,                                   /* 11.3.2   0x01 Bmax default MS  */
3900
    de_bssgp_bss_area_ind,                                      /* 11.3.3   0x02 BSS Area Indication */
3901
    de_bssgp_bucket_leak_rate,                                  /* 11.3.4   0x03 Bucket Leak Rate (R) */
3902
    de_bssgp_bvci,                                              /* 11.3.6   0x04 BVCI (BSSGP Virtual Connection Identifier)  */
3903
    de_bssgp_bvc_bucket_size,                                   /* 11.3.5   0x05 BVC Bucket Size */
3904
    de_bssgp_bvc_meas,                                          /* 11.3.7   0x06 BVC Measurement */
3905
    de_bssgp_cause,                                             /* 11.3.8   0x07 Cause */
3906
    de_bssgp_cell_id,                                           /* 11.3.9   0x08 Cell Identifier */
3907
    de_bssgp_chnl_needed,                                       /* 11.3.10  0x09 Channel needed */
3908
    NULL,                                                       /* 11.3.11  0x0a DRX Parameters */
3909
    NULL,                                                       /* 11.3.12  0x0b eMLPP-Priority */
3910
    de_bssgp_flush_action,                                      /* 11.3.13  0x0c Flush Action */
3911
    de_mid,                                                     /* 11.3.14  0x0d IMSI */
3912
    de_bssgp_llc_pdu,                                           /* 11.3.15  0x0e LLC-PDU */
3913
    de_bssgp_llc_frames_disc,                                   /* 11.3.16  0x0f LLC Frames Discarded  */
3914
    NULL,                                                       /* 11.3.17  0x10 Location Area  */
3915
    NULL,                                                       /* 11.3.20  0x11 Mobile Id */
3916
    de_bssgp_ms_bucket_size,                                    /* 11.3.21  0x12 MS Bucket Size */
3917
    NULL,                                                       /* 11.3.22  0x13 MS Radio Access Capability */
3918
    de_bssgp_omc_id,                                            /* 11.3.23  0x14 OMC Id */
3919
    de_bssgp_pdu_in_error,                                      /* 11.3.24  0x15 PDU In Error */
3920
    de_bssgp_pdu_lifetime,                                      /* 11.3.25  0x16 PDU Lifetime */
3921
    NULL,                                                       /* 11.3.27  0x17    Priority */
3922
    de_bssgp_qos_profile,                                       /* 11.3.28  0x18 QoS Profile */
3923
    de_bssgp_ra_cause,                                          /* 11.3.29  0x19 Radio Cause */
3924
    de_bssgp_ra_cap_upd_cause,                                  /* 11.3.30  0x1a RA-Cap-UPD-Cause */
3925
    NULL,                                                       /* 11.3.31  0x1b Routeing Area */
3926
    de_bssgp_r_default_ms,                                      /* 11.3.32  0x1c R_default_MS */
3927
    de_bssgp_suspend_ref_no,                                    /* 11.3.33  0x1d Suspend Reference Number */
3928
    de_bssgp_tag,                                               /* 11.3.34  0x1e Tag */
3929
    NULL,                                                       /* 11.3.35  0x1f Temporary logical link Identity (TLLI) */
3930
    NULL,                                                       /* 11.3.36  0x20 Temporary Mobile Subscriber Identity (TMSI) */
3931
    de_bssgp_trace_ref,                                         /* 11.3.37  0x21 Trace Reference */
3932
    de_bssgp_trace_type,                                        /* 11.3.38  0x22 Trace Type */
3933
    de_bssgp_transaction_id,                                    /* 11.3.39  0x23 Transaction Id */
3934
    de_bssgp_trigger_id,                                        /* 11.3.40  0x24 Trigger Id */
3935
    de_bssgp_no_of_oct_affected,                                /* 11.3.41  0x25 Number of octets affected */
3936
    NULL,                                                       /* 11.3.18  0x26 LSA Identifier List GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID_LIST*/
3937
    NULL,                                                       /* 11.3.19  0x27 LSA Information */
3938
    NULL,                                                       /* 11.3.42  0x28 Packet Flow Identifier (PFI) */
3939
    de_bssgp_gprs_timer,                                        /* 11.3.44  0x29 GPRS Timer */
3940
    NULL,                                                       /* 11.3.43  0x3a Aggregate BSS QoS Profile */
3941
    de_bssgp_feature_bitmap,                                    /* 11.3.45  0x3b Feature Bitmap */
3942
    de_bssgp_bucket_full_ratio,                                 /* 11.3.46  0x3c Bucket Full Ratio */
3943
    de_bssgp_serv_utran_cco,                                    /* 11.3.47  0x3d Service UTRAN CCO */
3944
    de_bssgp_nsei,                                              /* 11.3.48  0x3e NSEI (Network Service Entity Identifier) */
3945
    de_bssgp_rrlp_apdu,                                         /* 11.3.49 RRLP APDU */
3946
    de_bssgp_rrlp_flags,                                        /* 11.3.60  RRLP Flags */
3947
    de_bssgp_rim_app_id,                                        /* 11.3.61  RIM Application Identity */
3948
    de_bssgp_rim_seq_no,                                        /* 11.3.62  RIM Sequence Number */
3949
    de_bssgp_ran_inf_request_rim_cont,                          /* 11.3.62a.1 RAN-INFORMATION-REQUEST RIM Container */
3950
    de_bssgp_ran_inf_rim_cont,                                  /* 11.3.62a.2 RAN-INFORMATION RIM Container */
3951
    de_bssgp_ran_inf_ack_rim_cont,                              /* 11.3.62a.3   RAN-INFORMATION-ACK RIM Container */
3952
    de_bssgp_ran_inf_error_rim_cont,                            /* 11.3.62a.4   RAN-INFORMATION-ERROR RIM Container */
3953
    de_bssgp_ran_inf_app_error_rim_cont,                        /* 11.3.62a.5   RAN-INFORMATION-APPLICATION-ERROR RIM Container */
3954
3955
    de_bssgp_ran_information_request_app_cont,                  /* 11.3.63.1 RAN-INFORMATION-REQUEST Application Container */
3956
    de_bssgp_ran_information_app_cont_unit,                     /* 11.3.63.2 RAN-INFORMATION Application Container Unit */
3957
    de_bssgp_ran_app_error_cont,                                /* 11.3.64  Application Error Container */
3958
    de_bssgp_rim_pdu_indications,                               /* 11.3.65  RIM PDU Indications */
3959
    de_bssgp_rim_proto_ver_no,                                  /* 11.3.67  RIM Protocol Version Number */
3960
3961
    de_bssgp_pfc_flow_ctrl,                                     /* 11.3.68  PFC Flow Control parameters */
3962
    de_bssgp_rim_routing_inf,                                   /* 11.3.70  RIM Routing Information */
3963
    de_bssgp_mbms_session_id,                                   /* 11.3.71  MBMS Session Identity */
3964
    de_bssgp_mbms_session_dur,                                  /* 11.3.72  MBMS Session Duration */
3965
    de_bssgp_mbms_sai_list,                                     /* 11.3.73  MBMS Service Area Identity List */
3966
    de_bssgp_mbms_response,                                     /* 11.3.74  MBMS Response */
3967
    de_bssgp_mbms_ra_list,                                      /* 11.3.75  MBMS Routing Area List */
3968
    de_bssgp_mbms_session_inf,                                  /* 11.3.76  MBMS Session Information */
3969
    NULL,                                                       /* 11.3.77  TMGI (Temporary Mobile Group Identity) */
3970
    de_bssgp_mbms_stop_cause,                                   /* 11.3.78  MBMS Stop Cause */
3971
    de_bssgp_source_BSS_to_target_BSS_transp_cont,              /* 11.3.79  Source BSS to Target BSS Transparent Container */
3972
    de_bssgp_target_BSS_to_source_BSS_transp_cont,              /* 11.3.80  Target BSS to Source BSS Transparent Container */
3973
    de_bssgp_pfcs_to_be_set_up_list,                            /* 11.3.82  PFCs to be set-up list */
3974
    de_bssgp_list_of_setup_pfcs,                                /* 11.3.83  List of set-up PFCs */
3975
    de_bssgp_ext_feature_bitmap,                                /* 11.3.84  Extended Feature Bitmap */
3976
    de_bssgp_src_to_trg_transp_cont,                            /* 11.3.85  Source to Target Transparent Container */
3977
    de_bssgp_trg_to_src_transp_cont,                            /* 11.3.86  Target to Source Transparent Container */
3978
    de_bssgp_rnc_identifier,                                    /* 11.3.87  RNC Identifier */
3979
    de_bssgp_page_mode,                                         /* 11.3.88  Page Mode */
3980
    de_bssgp_container_id,                                      /* 11.3.89  Container ID */
3981
    de_bssgp_global_tfi,                                        /* 11.3.90  Global TFI */
3982
    de_bssgp_time_to_MBMS_data_tran,                            /* 11.3.92  Time to MBMS Data Transfer */
3983
    de_bssgp_mbms_session_rep_no,                               /* 11.3.93  MBMS Session Repetition Number */
3984
    de_bssgp_inter_rat_ho_info,                                 /* 11.3.94  Inter RAT Handover Info */
3985
    de_bssgp_ps_ho_cmd,                                         /* 11.3.95  PS Handover Command */
3986
    de_bssgp_ps_ho_indications,                                 /* 11.3.95a PS Handover Indications */
3987
    de_bssgp_sipsi_container,                                   /* 11.3.95b SI/PSI Container */
3988
    de_bssgp_active_pfcs_list,                                  /* 11.3.95c Active PFCs List */
3989
    de_bssgp_velocity_data,                                     /* 11.3.96  Velocity Data */
3990
    de_bssgp_dtm_ho_cmd,                                        /* 11.3.97  DTM Handover Command */
3991
    de_bssgp_cs_indication,                                     /* 11.3.98  CS Indication */
3992
    de_bssgp_flow_control_gran,                                 /* 11.3.102 Flow Control Granularity */
3993
    de_bssgp_enb_id,                                            /* 11.3.103 eNB Identifier */
3994
    de_bssgp_e_utran_inter_rat_ho_info,                         /* 11.3.104 E-UTRAN Inter RAT Handover Info */
3995
    de_bssgp_sub_prof_id_f_rat_freq_prio,                       /* 11.3.105 Subscriber Profile ID for RAT/Frequency priority */
3996
    de_bssgp_req_for_inter_rat_ho_inf,                          /* 11.3.106 Request for Inter-RAT Handover Info */
3997
    de_bssgp_reliable_inter_rat_ho_inf,                         /* 11.3.107 Reliable Inter-RAT Handover Info */
3998
    de_bssgp_son_transfer_app_id,                               /* 11.3.108 SON Transfer Application Identity */
3999
    de_bssgp_csg_id,                                            /* 11.3.109 CSG Identifier */
4000
    de_bssgp_redir_attempt_flg,                                 /* 11.3.111 Redirect Attempt Flag */
4001
    de_bssgp_redir_indication,                                  /* 11.3.112 Redirection Indication */
4002
    de_bssgp_redir_complete,                                    /* 11.3.113 Redirection Completed */
4003
    de_bssgp_unconfirm_send_state_var,                          /* 11.3.114 Unconfirmed send state variable */
4004
    de_bssgp_sci,                                               /* 11.3.116 SCI */
4005
    de_bssgp_ggsn_pgw_location,                                 /* 11.3.117 GGSN/P-GW location */
4006
    de_bssgp_pri_class_ind,                                     /* 11.3.119 Priority Class Indicator */
4007
    de_bssgp_edrx_params,                                       /* 11.3.122 eDRX Parameters */
4008
    de_bssgp_tunpo,                                             /* 11.3.122 Time Until Next Paging Occasion */
4009
    de_bssgp_coverage_class,                                    /* 11.3.124 Coverage Class */
4010
    de_bssgp_pag_attempt_info,                                  /* 11.3.125 Paging Attempt Information */
4011
    NULL,                                                       /* 11.3.126 Exception Report Flag */
4012
    NULL,                                                       /* 11.3.127 Old Routing Area Identification */
4013
    NULL,                                                       /* 11.3.128 Attach Indicator */
4014
    de_bssgp_plmn_id,                                           /* 11.3.129 PLMN Identity */
4015
    NULL,   /* NONE */
4016
};
4017
4018
/*
4019
 * 11.3.62a RIM Container
4020
 * 11.3.62a.0   General
4021
 * 11.3.62a.1   RAN-INFORMATION-REQUEST RIM Container
4022
 */
4023
static uint16_t
4024
de_bssgp_ran_inf_request_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4025
4
{
4026
4
    uint32_t curr_offset;
4027
4
    uint32_t consumed;
4028
4
    unsigned   curr_len;
4029
4030
4
    curr_offset = offset;
4031
4
    curr_len = len;
4032
4033
    /* RAN-INFORMATION-REQUEST RIM Container Contents coded as
4034
     * defined in table 11.3.62a.1b
4035
     */
4036
    /* RIM Application Identity RIM Application Identity/11.3.61 M TLV 3 */
4037
4
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_APP_ID, BSSGP_PDU_TYPE, DE_BSSGP_RIM_APP_ID, NULL);
4038
    /* RIM Sequence Number RIM Sequence Number/11.3.62 M TLV 6 */
4039
4
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_SEQUENCE_NUMBER, BSSGP_PDU_TYPE, DE_BSSGP_RIM_SEQ_NO, NULL);
4040
    /* RIM PDU Indications RIM PDU Indications/11.3.65 M TLV 3 */
4041
4
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_PDU_INDICATIONS, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PDU_INDICATIONS, NULL);
4042
    /* RIM Protocol Version Number RIM Protocol Version Number/11.3.67 O TLV 3 */
4043
4
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RIM_PROTOCOL_VERSION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PROTO_VER_NO, NULL);
4044
    /* Application Container (note 1) RAN-INFORMATION-REQUEST Application Container/11.3.63.1 C TLV 4-? */
4045
4
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RAN_INF_REQUEST_APP_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INFORMATION_REQUEST_APP_CONT, NULL);
4046
    /* SON Transfer Application Identity (note 2) SON Transfer Application Identity/11.3.108 C TLV 3-m */
4047
4
    ELEM_IN_ELEM_OPT_TELV(0x84, BSSGP_PDU_TYPE, DE_BSSGP_SON_TRANSFER_APP_ID, NULL);
4048
4049
4
    return curr_offset-offset;
4050
4
}
4051
/*
4052
 * 11.3.62a.2   RAN-INFORMATION RIM Container
4053
 */
4054
static uint16_t
4055
de_bssgp_ran_inf_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4056
9
{
4057
9
    uint32_t curr_offset;
4058
9
    uint32_t consumed;
4059
9
    unsigned   curr_len;
4060
4061
9
    curr_offset = offset;
4062
9
    curr_len = len;
4063
4064
    /* RAN-INFORMATION RIM Container Contents coded as
4065
     * defined in table 11.3.62a.2b
4066
     */
4067
    /* RIM Application Identity RIM Application Identity /11.3.61 M TLV 3 */
4068
9
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_APP_ID, BSSGP_PDU_TYPE, DE_BSSGP_RIM_APP_ID, NULL);
4069
    /* RIM Sequence Number RIM Sequence Number /11.3.62 M TLV 6 */
4070
9
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_SEQUENCE_NUMBER, BSSGP_PDU_TYPE, DE_BSSGP_RIM_SEQ_NO, NULL);
4071
    /* RIM PDU Indications RIM PDU Indications /11.3.65. M TLV 3 */
4072
9
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_PDU_INDICATIONS, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PDU_INDICATIONS, NULL);
4073
    /* RIM Protocol Version Number RIM Protocol Version Number/11.3.67 O TLV 3 */
4074
9
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RIM_PROTOCOL_VERSION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PROTO_VER_NO, NULL);
4075
    /* Application Container (NOTE 1) RAN-INFORMATION Application Container /11.3.63.2 C (Note 1) TLV 4-? */
4076
9
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RAN_INF_APP_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INFORMATION_APP_CONT_UNIT, NULL);
4077
    /* Application Error Container (NOTE 1) Application Error Container/11.3.64 C (Note 1) TLV n */
4078
9
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_APPLICATION_ERROR_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_APP_ERROR_CONT, NULL);
4079
    /* SON Transfer Application Identity (note 2) SON Transfer Application Identity/11.3.108 C TLV 3-m */
4080
9
    ELEM_IN_ELEM_OPT_TELV(0x84, BSSGP_PDU_TYPE, DE_BSSGP_SON_TRANSFER_APP_ID, NULL);
4081
4082
9
    return curr_offset-offset;
4083
9
}
4084
4085
/*
4086
 * 11.3.62a.3   RAN-INFORMATION-ACK RIM Container
4087
 */
4088
static uint16_t
4089
de_bssgp_ran_inf_ack_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4090
7
{
4091
7
    uint32_t curr_offset;
4092
7
    uint32_t consumed;
4093
7
    unsigned   curr_len;
4094
4095
7
    curr_offset = offset;
4096
7
    curr_len = len;
4097
4098
    /* RAN-INFORMATION-ACK RIM Container Contents coded as
4099
     * defined in table 11.3.62a.3b
4100
     */
4101
    /* RIM Application Identity RIM Application Identity /11.3.61 M TLV 3 */
4102
7
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_APP_ID, BSSGP_PDU_TYPE, DE_BSSGP_RIM_APP_ID, NULL);
4103
    /* RIM Sequence Number RIM Sequence Number /11.3.62 M TLV 6 */
4104
7
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_SEQUENCE_NUMBER, BSSGP_PDU_TYPE, DE_BSSGP_RIM_SEQ_NO, NULL);
4105
    /* RIM Protocol Version Number RIM Protocol Version Number/11.3.67 O TLV 4 */
4106
7
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RIM_PROTOCOL_VERSION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PROTO_VER_NO, NULL);
4107
    /* SON Transfer Application Identity (note 1) SON Transfer Application Identity/11.3.108 C TLV 3-m */
4108
7
    ELEM_IN_ELEM_OPT_TELV(0x84, BSSGP_PDU_TYPE, DE_BSSGP_SON_TRANSFER_APP_ID, NULL);
4109
4110
7
    return curr_offset-offset;
4111
7
}
4112
/*
4113
 * 11.3.62a.4   RAN-INFORMATION-ERROR RIM Container
4114
 */
4115
static uint16_t
4116
de_bssgp_ran_inf_error_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4117
3
{
4118
3
    uint32_t curr_offset;
4119
3
    uint32_t consumed;
4120
3
    unsigned   curr_len;
4121
4122
3
    curr_offset = offset;
4123
3
    curr_len = len;
4124
4125
    /* RAN-INFORMATION-ERROR RIM Container Contents coded as
4126
     * defined in table 11.3.62a.4b
4127
     */
4128
    /* RIM Application Identity RIM Application Identity /11.3.61 M TLV 3 */
4129
3
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_APP_ID, BSSGP_PDU_TYPE, DE_BSSGP_RIM_APP_ID, NULL);
4130
    /* RIM Cause Cause/11.3.8 M TLV 3 */
4131
3
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, " - RIM");
4132
    /* RIM Protocol Version Number RIM Protocol Version Number/11.3.67 O TLV 3 */
4133
3
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RIM_PROTOCOL_VERSION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PROTO_VER_NO, NULL);
4134
    /* PDU in Error PDU in Error/11.3.24 M TLV 3-? */
4135
3
    ELEM_IN_ELEM_MAND_TELV(0x15, BSSGP_PDU_TYPE, DE_BSSGP_PDU_IN_ERROR , NULL);
4136
    /* SON Transfer Application Identity (note 1) SON Transfer Application Identity/11.3.108 C TLV 3-m */
4137
3
    ELEM_IN_ELEM_OPT_TELV(0x84, BSSGP_PDU_TYPE, DE_BSSGP_SON_TRANSFER_APP_ID, NULL);
4138
4139
3
    return curr_offset-offset;
4140
3
}
4141
/*
4142
 * 11.3.62a.5   RAN-INFORMATION-APPLICATION-ERROR RIM Container
4143
 */
4144
static uint16_t
4145
de_bssgp_ran_inf_app_error_rim_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4146
2
{
4147
2
    uint32_t curr_offset;
4148
2
    uint32_t consumed;
4149
2
    unsigned   curr_len;
4150
4151
2
    curr_offset = offset;
4152
2
    curr_len = len;
4153
4154
    /* RRAN-INFORMATION-APPLICATION-ERROR RIM Container
4155
     * Contents coded as defined in table 11.3.62a.5b
4156
     */
4157
    /* RIM Application Identity RIM Application Identity /11.3.61 M TLV 3 */
4158
2
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_APP_ID, BSSGP_PDU_TYPE, DE_BSSGP_RIM_APP_ID, NULL);
4159
    /* RIM Sequence Number RIM Sequence Number /11.3.62 M TLV 6 */
4160
2
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_SEQUENCE_NUMBER, BSSGP_PDU_TYPE, DE_BSSGP_RIM_SEQ_NO, NULL);
4161
    /* RIM PDU Indications RIM PDU Indications /11.3.65. M TLV 3 */
4162
2
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_RIM_PDU_INDICATIONS, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PDU_INDICATIONS, NULL);
4163
    /* RIM Protocol Version Number RIM Protocol Version Number/11.3.67 O TLV 3 */
4164
2
    ELEM_IN_ELEM_OPT_TELV(BSSGP_IEI_RIM_PROTOCOL_VERSION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_PROTO_VER_NO, NULL);
4165
    /* Application Error Container Application Error Container/11.3.64 M TLV n */
4166
2
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_APPLICATION_ERROR_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_APP_ERROR_CONT, NULL);
4167
    /* SON Transfer Application Identity (note 1) SON Transfer Application Identity/11.3.108 C TLV 3-m */
4168
2
    ELEM_IN_ELEM_OPT_TELV(0x84, BSSGP_PDU_TYPE, DE_BSSGP_SON_TRANSFER_APP_ID, NULL);
4169
4170
2
    return curr_offset-offset;
4171
2
}
4172
4173
/*
4174
 * 11.3.79  Source BSS to Target BSS Transparent Container
4175
 */
4176
uint16_t
4177
de_bssgp_source_BSS_to_target_BSS_transp_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4178
840
{
4179
840
    uint32_t curr_offset;
4180
840
    uint32_t consumed;
4181
840
    unsigned   curr_len;
4182
4183
840
    curr_offset = offset;
4184
840
    curr_len = len;
4185
4186
4187
    /* Octet 3-? Source BSS to Target BSS Transparent Container Contents coded
4188
     * as defined in table 11.3.79.b
4189
     */
4190
    /* MS Radio Access Capability MS Radio Access Capability/11.3.22 M TLV 7-? */
4191
840
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
4192
    /* Inter RAT Handover Info Inter RAT Handover Info/11.3.94 O (note 1) TLV 3-? */
4193
840
    ELEM_IN_ELEM_OPT_TELV(0x73, BSSGP_PDU_TYPE, DE_BSSGP_INTER_RAT_HO_INFO, NULL);
4194
    /* Page Mode Page Mode/11.3.88 O (note 2, note 3) TLV 3 */
4195
840
    ELEM_IN_ELEM_OPT_TELV(0x6d, BSSGP_PDU_TYPE, DE_BSSGP_PAGE_MODE, NULL);
4196
    /* Container ID Container ID/11.3.89 O (note 2) TLV 3 */
4197
840
    ELEM_IN_ELEM_OPT_TELV(0x6e, BSSGP_PDU_TYPE, DE_BSSGP_CONTAINER_ID, NULL);
4198
    /* Global TFI Global TFI/11.3.90 O (note 2, note 3) TLV 3 */
4199
840
    ELEM_IN_ELEM_OPT_TELV(0x6f, BSSGP_PDU_TYPE, DE_BSSGP_GLOBAL_TFI, NULL);
4200
    /* PS Handover Indications PS Handover Indications/11.3.95a O TLV 3 */
4201
840
    ELEM_IN_ELEM_OPT_TELV(0x75, BSSGP_PDU_TYPE, DE_BSSGP_PS_HO_INDICATIONS, NULL);
4202
    /* CS Indication CS Indication/11.3.98 O (note 3) TLV 3 */
4203
840
    ELEM_IN_ELEM_OPT_TELV(0x7a, BSSGP_PDU_TYPE, DE_BSSGP_CS_INDICATION, NULL);
4204
    /* E-UTRAN Inter RAT Handover Info E-UTRAN Inter RAT HandoverInfo/11.3.104 O (note 1) TLV 3-? */
4205
840
    ELEM_IN_ELEM_OPT_TELV(0x80, BSSGP_PDU_TYPE, DE_BSSGP_E_UTRAN_INTER_RAT_HO_INFO, NULL);
4206
4207
840
    return curr_offset-offset;
4208
840
}
4209
4210
/*
4211
 * 11.3.80 Target BSS to Source BSS Transparent Container
4212
 */
4213
uint16_t
4214
de_bssgp_target_BSS_to_source_BSS_transp_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U_, int string_len _U_)
4215
6
{
4216
6
    uint32_t curr_offset;
4217
6
    uint32_t consumed;
4218
6
    unsigned   curr_len;
4219
4220
6
    curr_offset = offset;
4221
6
    curr_len = len;
4222
4223
4224
    /* Octet 3-? Target BSS to Source BSS Transparent Container Contents coded
4225
     * as defined in table 11.3.80.b
4226
     */
4227
4228
    /* PS Handover Command PS Handover Command/11.3.95 O (Note 2) TLV 4-? */
4229
6
    ELEM_IN_ELEM_OPT_TELV(0x74, BSSGP_PDU_TYPE, DE_BSSGP_PS_HO_CMD, NULL);
4230
    /* SI/PSI Container SI/PSI Container/11.3.95b O (Note 1) TLV 3-? */
4231
6
    ELEM_IN_ELEM_OPT_TELV(0x76, BSSGP_PDU_TYPE, DE_BSSGP_SIPSI_CONTAINER, NULL);
4232
    /* DTM Handover Command DTM Handover Command/11.3.97 O (Note 2) TLV 22-? */
4233
6
    ELEM_IN_ELEM_OPT_TELV(0x79, BSSGP_PDU_TYPE, DE_BSSGP_DTM_HO_CMD, NULL);
4234
4235
6
    return curr_offset-offset;
4236
6
}
4237
4238
/* MESSAGE FUNCTIONS */
4239
4240
/*
4241
 * 10.2 PDU functional definitions and contents at RL and BSSGP SAPs
4242
 * 10.2.1 DL-UNITDATA
4243
 */
4244
static void
4245
bssgp_dl_unitdata(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4246
389
{
4247
389
    uint32_t curr_offset;
4248
389
    uint32_t consumed;
4249
389
    unsigned   curr_len;
4250
4251
389
    curr_offset = offset;
4252
389
    curr_len = len;
4253
4254
    /* This PDU is sent to the BSS to transfer an LLC-PDU across the radio interface to an MS. */
4255
389
    pinfo->link_dir = P2P_DIR_DL;
4256
4257
    /* TLLI (current) TLLI/11.3.35 M V 4 */
4258
389
    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TLLI, " - current", ei_bssgp_missing_mandatory_element);
4259
    /* QoS Profile (note 1) QoS Profile/11.3.28 M V 3 */
4260
389
    ELEM_MAND_V(BSSGP_PDU_TYPE, DE_BSSGP_QOS_PROFILE, NULL, ei_bssgp_missing_mandatory_element);
4261
4262
    /* PDU Lifetime PDU Lifetime/11.3.25 M TLV 4 */
4263
389
    ELEM_MAND_TELV(0x16, BSSGP_PDU_TYPE, DE_BSSGP_PDU_LIFETIME, NULL, ei_bssgp_missing_mandatory_element);
4264
    /* MS Radio Access Capability (note 2) MS Radio Access Capability/11.3.22 O TLV 7-? */
4265
389
    ELEM_OPT_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
4266
    /* Priority (note 3) Priority/11.3.27 O TLV 3 */
4267
383
    ELEM_OPT_TELV(0x17, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL);
4268
    /* DRX Parameters DRX Parameters/11.3.11 O TLV 4 */
4269
241
    ELEM_OPT_TELV(0x0a , GSM_A_PDU_TYPE_GM, DE_DRX_PARAM , NULL);
4270
    /* IMSI IMSI/11.3.14 O TLV 5-10 */
4271
240
    ELEM_OPT_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI , NULL);
4272
    /* TLLI (old) TLLI/11.3.35 O TLV 6 */
4273
239
    ELEM_OPT_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI , " - old");
4274
    /* PFI PFI/11.3.42 O TLV 3 */
4275
224
    ELEM_OPT_TELV( BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
4276
    /* LSA Information LSA Information/11.3.19 O TLV 7-? */
4277
223
    ELEM_OPT_TELV(0x27, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_INFO, NULL);
4278
    /* Service UTRAN CCO Service UTRAN CCO/11.3.47 O TLV 3 */
4279
223
    ELEM_OPT_TELV(BSSGP_IEI_SERVICE_UTRAN_CCO, BSSGP_PDU_TYPE, DE_BSSGP_SERV_UTRAN_CCO, NULL);
4280
4281
    /* Subscriber Profile ID for RAT/Frequency priority (note 5)
4282
     * Subscriber Profile ID for RAT/Frequency priority/11.3.105 O TLV 3
4283
     */
4284
222
    ELEM_OPT_TELV(0x81, BSSGP_PDU_TYPE, DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO, NULL);
4285
    /* Redirection Indication (note 6) Redirection Indication/11.3.112 O TLV 3 */
4286
221
    ELEM_OPT_TELV(BSSGP_IEI_REDIR_INDICATION, BSSGP_PDU_TYPE, DE_BSSGP_REDIR_INDICATION, NULL);
4287
    /* Redirection Completed (note 7) Redirection Completed/ 11.3.113 O TLV 3 */
4288
220
    ELEM_OPT_TELV(BSSGP_IEI_REDIR_COMPLETE, BSSGP_PDU_TYPE, DE_BSSGP_REDIR_COMPLETE, NULL);
4289
    /* Unconfirmed send state variable (note 9) Unconfirmed send state variable/11.3.114 C TLV 4 */
4290
220
    ELEM_OPT_TELV(BSSGP_IEI_UNCONFIRM_SEND_STATE_VAR, BSSGP_PDU_TYPE, DE_BSSGP_UNCONFIRM_SEND_STATE_VAR, NULL);
4291
    /* SCI (note 10) SCI/ 11.3.116 O TLV 3 */
4292
219
    ELEM_OPT_TELV(BSSGP_IEI_SCI, BSSGP_PDU_TYPE, DE_BSSGP_SCI, NULL);
4293
    /* GGSN/P-GW location (note 10) GGSN/P-GW location/11.3.117 O TLV 3 */
4294
219
    ELEM_OPT_TELV(BSSGP_IEI_GGSN_PGW_LOCATION, BSSGP_PDU_TYPE, DE_BSSGP_GGSN_PGW_LOCATION, NULL);
4295
    /* eDRX Parameters (note 11) eDRX Parameters/11.3.122 O TLV 3 */
4296
219
    ELEM_OPT_TELV(BSSGP_IEI_EDRX_PARAMETERS, BSSGP_PDU_TYPE, DE_BSSGP_EDRX_PARAMS, NULL);
4297
    /* Coverage Class Coverage Class/11.3.124 O TLV 3 */
4298
218
    ELEM_OPT_TELV(BSSGP_IEI_COVERAGE_CLASS, BSSGP_PDU_TYPE, DE_BSSGP_COVERAGE_CLASS, NULL);
4299
    /* Old Routing Area Identification (note 12) Old Routing Area Identification/11.3.127 O TLV 8 */
4300
217
    ELEM_OPT_TELV(BSSGP_IEI_OLD_RA_IDENTIFICATION, GSM_A_PDU_TYPE_GM, DE_RAI, " - Old routing area identification");
4301
    /* Attach Indicator(note 13) Attach Indicator / 11.3.128 O TLV 3 */
4302
216
    ELEM_OPT_TELV(BSSGP_IEI_ATTACH_INDIC, BSSGP_PDU_TYPE, DE_BSSGP_ATTACH_INDIC, NULL);
4303
4304
    /* SGSN Group Identity (note 15)  SGSN Group Identity/11.3.131    C   TLV 5 */
4305
    /* Additional P-TMSI (note 15)  Additional P-TMSI/11.3.132  C   TLV 6 */
4306
    /* UE Usage Type (note 15)  UE Usage Type/11.3.133  C   TLV 3 */
4307
4308
    /* Alignment octets Alignment octets/11.3.1 O TLV 2-5 */
4309
215
    ELEM_OPT_TELV(0x00, BSSGP_PDU_TYPE, DE_BSSGP_ALIGNMENT_OCTETS, NULL);
4310
    /* LLC-PDU (note 4) LLC-PDU/11.3.15 M TLV 2-? */
4311
215
    ELEM_MAND_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, NULL, ei_bssgp_missing_mandatory_element);
4312
    /* Initial LLC-PDU (note 8) LLC-PDU/11.3.15 O TLV 2-? */
4313
215
    ELEM_OPT_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, " - initial");
4314
    /* Timing Advance Request Timing Advance Request/11.3.140 O TLV 3 */
4315
211
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4316
211
}
4317
/*
4318
 * 10.2.2   UL-UNITDATA
4319
 * Updated to 3GPP TS 48.018 version 11.3.0 Release 11
4320
 */
4321
static void
4322
bssgp_ul_unitdata(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4323
53
{
4324
53
    uint32_t curr_offset;
4325
53
    uint32_t consumed;
4326
53
    unsigned   curr_len;
4327
4328
53
    curr_offset = offset;
4329
53
    curr_len = len;
4330
4331
    /* This PDU transfers an MS's LLC-PDU and its associated radio interface information across the Gb-interface.
4332
     * Direction: BSS to SGSN
4333
     */
4334
53
    pinfo->link_dir = P2P_DIR_UL;
4335
    /* TLLI TLLI/11.3.35 M V 4 */
4336
53
    ELEM_MAND_V(GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4337
    /* QoS Profile QoS Profile/11.3.28 M V 3 */
4338
53
    ELEM_MAND_V(BSSGP_PDU_TYPE, DE_BSSGP_QOS_PROFILE, NULL, ei_bssgp_missing_mandatory_element);
4339
    /* Cell Identifier Cell Identifier/11.3.9 M TLV 10 */
4340
53
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , NULL);
4341
    /* PFI PFI/11.3.42 O TLV 3 */
4342
49
    ELEM_OPT_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
4343
    /* LSA Identifier List LSA Identifier List/11.3.18 O TLV 3-?  */
4344
48
    ELEM_OPT_TELV(0x26, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID_LIST, NULL);
4345
    /* Redirect Attempt Flag (Note 3) Redirect Attempt Flag/11.3.111 O TLV 3 */
4346
48
    ELEM_OPT_TELV(BSSGP_IEI_REDIR_ATTEMP_FLG, BSSGP_PDU_TYPE, DE_BSSGP_REDIR_ATTEMPT_FLG, NULL);
4347
    /* IMSI (note 2) IMSI/11.3.14 O TLV 5-10 */
4348
48
    ELEM_OPT_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI , NULL);
4349
    /* Unconfirmed send state variable (note 4) Unconfirmed send state variable/11.3.114 O TLV 4 */
4350
48
    ELEM_OPT_TELV(BSSGP_IEI_UNCONFIRM_SEND_STATE_VAR, BSSGP_PDU_TYPE, DE_BSSGP_UNCONFIRM_SEND_STATE_VAR, NULL);
4351
    /* Selected PLMN ID (note 5) Selected PLMN ID/11.3.118 O TLV 5 */
4352
39
    ELEM_OPT_TELV(BSSGP_IEI_SELECTED_PLMN_ID, BSSGP_PDU_TYPE, DE_BSSGP_PLMN_ID, " - Selected PLMN ID");
4353
    /* Coverage Class Coverage Class/11.3.124 O TLV 3 */
4354
38
    ELEM_OPT_TELV(BSSGP_IEI_COVERAGE_CLASS, BSSGP_PDU_TYPE, DE_BSSGP_COVERAGE_CLASS, NULL);
4355
    /* Exception Report Flag(note 6) Exception Report Flag / 11.3.126 O TLV 3 */
4356
37
    ELEM_OPT_TELV(BSSGP_IEI_EXCEPTION_REPORT_FLAG, BSSGP_PDU_TYPE, DE_BSSGP_EXCEPTION_REPORT_FLAG, NULL);
4357
    /* Selected Operator(note 8, 9) PLMN Identity / 11.3.129 O TLV 5 */
4358
37
    ELEM_OPT_TELV(BSSGP_IEI_PLMN_ID, BSSGP_PDU_TYPE, DE_BSSGP_PLMN_ID, " - Selected Operator");
4359
    /* CS Registered Operator(note 8, 10) PLMN Identity / 11.3.129 O TLV 5 */
4360
37
    ELEM_OPT_TELV(BSSGP_IEI_PLMN_ID, BSSGP_PDU_TYPE, DE_BSSGP_PLMN_ID, " - CS Registered Operator");
4361
4362
    /* SGSN Group Identity (note 11)    SGSN Group Identity /11.3.131   O   TLV 5 */
4363
    /* UE Usage Type (note 11)  UE Usage Type/11.3.133  O   TLV 3 */
4364
4365
    /* Alignment octets Alignment octets/11.3.1 O TLV 2-5  */
4366
37
    ELEM_OPT_TELV(0x00, BSSGP_PDU_TYPE, DE_BSSGP_ALIGNMENT_OCTETS, NULL);
4367
    /* LLC-PDU (note) LLC-PDU/11.3.15 M TLV 2-?  */
4368
37
    ELEM_MAND_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, NULL, ei_bssgp_missing_mandatory_element);
4369
    /* MultilaterationTiming Advance (note 13)  MultilaterationTiming Advance/11.3.137  O   TLV 4 */
4370
    /* MS Sync Accuracy (note 13)   MS Sync Accuracy/11.3.138   O   TLV 3 */
4371
    /* BTS Reception Accuracy Level (note 13)   BTS Reception Accuracy Level/11.3.139   O   TLV 3 */
4372
37
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4373
37
}
4374
/*
4375
 * 10.2.3   RA-CAPABILITY
4376
 */
4377
static void
4378
bssgp_ra_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4379
223
{
4380
223
    uint32_t curr_offset;
4381
223
    uint32_t consumed;
4382
223
    unsigned   curr_len;
4383
4384
223
    curr_offset = offset;
4385
223
    curr_len = len;
4386
4387
    /* This PDU informs the BSS of the new Radio Access Capability of an MS. */
4388
223
    pinfo->link_dir = P2P_DIR_UL;
4389
4390
    /* TLLI TLLI/11.3.35 M TLV 6 */
4391
223
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4392
    /* MS Radio Access Capability MS Radio Access Capability/11.3.22 M TLV 7-? */
4393
223
    ELEM_MAND_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL, ei_bssgp_missing_mandatory_element);
4394
4395
223
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4396
223
}
4397
4398
/*
4399
 * 10.2.4   (void)
4400
 */
4401
/*
4402
 * 10.2.5   DL-MBMS-UNITDATA
4403
 */
4404
static void
4405
bssgp_dl_mbms_unitdata(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4406
183
{
4407
183
    uint32_t curr_offset;
4408
183
    uint32_t consumed;
4409
183
    unsigned   curr_len;
4410
4411
183
    curr_offset = offset;
4412
183
    curr_len = len;
4413
4414
    /* This PDU is sent to the BSS to transfer an LLC-PDU across the radio interface.
4415
     * Direction: SGSN to BSS
4416
     */
4417
183
    pinfo->link_dir = P2P_DIR_DL;
4418
4419
    /* PDU Lifetime PDU Lifetime/11.3.25 M TLV 4  */
4420
183
    ELEM_MAND_TELV(0x16, BSSGP_PDU_TYPE, DE_BSSGP_PDU_LIFETIME, NULL, ei_bssgp_missing_mandatory_element);
4421
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
4422
183
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
4423
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
4424
183
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
4425
    /* Alignment octets Alignment octets/11.3.1 O TLV 2-5 */
4426
182
    ELEM_OPT_TELV(0x00, BSSGP_PDU_TYPE, DE_BSSGP_ALIGNMENT_OCTETS, NULL);
4427
    /* LLC-PDU LLC-PDU/11.3.15 M TLV 3-? */
4428
181
    ELEM_MAND_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, NULL, ei_bssgp_missing_mandatory_element);
4429
4430
4431
181
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4432
181
}
4433
4434
/*
4435
 * 10.2.6   UL-MBMS-UNITDATA
4436
 */
4437
static void
4438
bssgp_ul_mbms_unitdata(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4439
41
{
4440
41
    uint32_t curr_offset;
4441
41
    uint32_t consumed;
4442
41
    unsigned   curr_len;
4443
4444
41
    curr_offset = offset;
4445
41
    curr_len = len;
4446
4447
    /* This PDU transfers an LLC-PDU for an MBMS session across the Gb-interface.
4448
     * Direction: BSS to SGSN */
4449
41
    pinfo->link_dir = P2P_DIR_UL;
4450
4451
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
4452
41
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
4453
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
4454
41
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
4455
    /* Alignment octets Alignment octets/11.3.1 O TLV 2-5 */
4456
39
    ELEM_OPT_TELV(0x00, BSSGP_PDU_TYPE, DE_BSSGP_ALIGNMENT_OCTETS, NULL);
4457
    /* LLC-PDU (note 1) LLC-PDU/11.3.15 M TLV 2-? */
4458
39
    ELEM_MAND_TELV(0x0e, BSSGP_PDU_TYPE, DE_BSSGP_LLC_PDU, NULL, ei_bssgp_missing_mandatory_element);
4459
4460
39
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4461
39
}
4462
4463
/*
4464
 * 10.3 PDU functional definitions and contents at GMM SAP
4465
 * 10.3.1   PAGING PS
4466
 */
4467
4468
static void
4469
bssgp_paging_ps(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4470
82
{
4471
82
    uint32_t curr_offset;
4472
82
    uint32_t consumed;
4473
82
    unsigned   curr_len;
4474
4475
82
    curr_offset = offset;
4476
82
    curr_len = len;
4477
    /* This PDU indicates that a BSS shall initiate the packet paging procedure for an MS within a group of cells.
4478
     * Direction: SGSN to BSS */
4479
82
    pinfo->link_dir = P2P_DIR_DL;
4480
4481
    /* IMSI IMSI/11.3.14 M TLV 5 -10 */
4482
82
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
4483
    /* DRX Parameters DRX Parameters/11.3.11 O TLV 4 */
4484
82
    ELEM_OPT_TELV(0x0a , GSM_A_PDU_TYPE_GM, DE_DRX_PARAM , NULL);
4485
    /* BVCI a) BVCI/11.3.6 C TLV 4 */
4486
75
    ELEM_OPT_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI , NULL);
4487
    /* Location Area (note) Location Area/11.3.17 C TLV 7 */
4488
75
    ELEM_OPT_TELV(0x10,GSM_A_PDU_TYPE_COMMON, DE_LAI, NULL);
4489
    /* Routeing Area (note) Routeing Area/11.3.31 C TLV 8 */
4490
74
    ELEM_OPT_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
4491
    /* BSS Area Indication (note) BSS Area Indication/11.3.3 C TLV 3 */
4492
73
    ELEM_OPT_TELV(0x02,BSSGP_PDU_TYPE, DE_BSSGP_BSS_AREA_IND, NULL);
4493
    /* PFI PFI/11.3.42 O TLV 3 */
4494
73
    ELEM_OPT_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
4495
    /* ABQP ABQP/11.3.43 O TLV 13-? */
4496
73
    ELEM_OPT_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS , NULL);
4497
    /* QoS Profile QoS Profile/11.3.28 M TLV 5 */
4498
73
    ELEM_MAND_TELV(0x18,BSSGP_PDU_TYPE, DE_BSSGP_QOS_PROFILE, NULL, ei_bssgp_missing_mandatory_element);
4499
    /* P-TMSI TMSI/11.3.36 O TLV 6 */
4500
73
    ELEM_OPT_TELV(BSSGP_IEI_TMSI,GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, NULL);
4501
    /* eDRX Parameters (note 11) eDRX Parameters/11.3.122 O TLV 3 */
4502
72
    ELEM_OPT_TELV(BSSGP_IEI_EDRX_PARAMETERS, BSSGP_PDU_TYPE, DE_BSSGP_EDRX_PARAMS, NULL);
4503
    /* Coverage Class Coverage Class/11.3.124 O TLV 3 */
4504
67
    ELEM_OPT_TELV(BSSGP_IEI_COVERAGE_CLASS, BSSGP_PDU_TYPE, DE_BSSGP_COVERAGE_CLASS, NULL);
4505
    /* Cell Identifier (note 4) Cell Identifier/11.3.9 O TLV 10 */
4506
66
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID, NULL);
4507
    /* MS Radio Access Capability (note 5) MS Radio Access Capability/11.3.22 O TLV 7-? */
4508
66
    ELEM_OPT_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL);
4509
    /* Paging Attempt Information (note 6)  Paging Attempt Information/11.3.125 O   TLV 3 */
4510
66
    ELEM_OPT_TELV(BSSGP_IEI_PAG_ATTEMPT_INFO, BSSGP_PDU_TYPE, DE_BSSGP_PAG_ATTEMPT_INFO, NULL);
4511
4512
55
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4513
55
}
4514
4515
/*
4516
 * 10.3.2   PAGING CS
4517
 */
4518
static void
4519
bssgp_paging_cs(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4520
25
{
4521
25
    uint32_t curr_offset;
4522
25
    uint32_t consumed;
4523
25
    unsigned   curr_len;
4524
4525
25
    curr_offset = offset;
4526
25
    curr_len = len;
4527
    /* This PDU indicates that a BSS shall initiate a circuit-switched paging procedure for an MS within a group of cells.
4528
     * Direction: SGSN to BSS
4529
     */
4530
25
    pinfo->link_dir = P2P_DIR_DL;
4531
    /* IMSI IMSI/11.3.14 M TLV 5 -10 */
4532
25
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
4533
    /* DRX Parameters DRX Parameters/11.3.11 M TLV 4 */
4534
25
    ELEM_MAND_TELV(0x0a , GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL, ei_bssgp_missing_mandatory_element);
4535
    /* BVCI a) BVCI/11.3.6 C TLV 4 */
4536
25
    ELEM_OPT_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI , NULL);
4537
    /* Location Area (note 1) Location Area/11.3.17 C TLV 7 */
4538
20
    ELEM_OPT_TELV(0x10,GSM_A_PDU_TYPE_COMMON, DE_LAI, NULL);
4539
    /* Routeing Area (note 1) Routeing Area/11.3.31 C TLV 8 */
4540
19
    ELEM_OPT_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
4541
    /* BSS Area Indication (note 1) BSS Area Indication/11.3.3 C TLV 3 */
4542
19
    ELEM_OPT_TELV(0x02,BSSGP_PDU_TYPE, DE_BSSGP_BSS_AREA_IND, NULL);
4543
    /* TLLI TLLI/11.3.35 O TLV 6 */
4544
18
    ELEM_OPT_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI , NULL);
4545
    /* Channel needed (note 2) Channel needed/11.3.10 O TLV 3 */
4546
18
    ELEM_OPT_TELV(0x09, BSSGP_PDU_TYPE, DE_BSSGP_CHLN_NEEDED , NULL);
4547
    /* eMLPP-Priority (note 2) eMLPP-Priority/11.3.12 O TLV 3 */
4548
17
    ELEM_OPT_TELV(0x0b, GSM_A_PDU_TYPE_BSSMAP, BE_EMLPP_PRIO, NULL);
4549
    /* TMSI (note 2) TMSI/11.3.36 O TLV 6 */
4550
17
    ELEM_OPT_TELV(BSSGP_IEI_TMSI,GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, NULL);
4551
    /* Global CN-Id (note 2) Global CN-Id/11.3.69 O TLV 7 */
4552
17
    ELEM_OPT_TELV(0x53, SGSAP_PDU_TYPE, DE_SGSAP_GLOBAL_CN_ID, NULL);
4553
4554
17
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4555
17
}
4556
4557
/*
4558
 * 10.3.3   RA-CAPABILITY-UPDATE
4559
 */
4560
static void
4561
bssgp_ra_cap_upd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4562
4
{
4563
4
    uint32_t curr_offset;
4564
4
    uint32_t consumed;
4565
4
    unsigned   curr_len;
4566
4567
4
    curr_offset = offset;
4568
4
    curr_len = len;
4569
    /* This PDU requests that the SGSN send an MS's current Radio Access capability or IMSI to the BSS. */
4570
    /* Direction: BSS to SGSN */
4571
4
    pinfo->link_dir = P2P_DIR_UL;
4572
4573
    /* TLLI TLLI/11.3.35 M TLV 6 */
4574
4
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4575
    /* Tag Tag/11.3.34 M TLV 3 */
4576
4
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
4577
4578
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4579
4
}
4580
4581
/*
4582
 * 10.3.4   RA-CAPABILITY-UPDATE-ACK
4583
 */
4584
4585
static void
4586
bssgp_ra_cap_upd_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4587
95
{
4588
95
    uint32_t curr_offset;
4589
95
    uint32_t consumed;
4590
95
    unsigned   curr_len;
4591
4592
95
    curr_offset = offset;
4593
95
    curr_len = len;
4594
    /* This PDU provides the BSS with an MS's current Radio Access capability and IMSI */
4595
    /* Direction: SGSN to BSS */
4596
95
    pinfo->link_dir = P2P_DIR_DL;
4597
4598
    /* TLLI TLLI/11.3.35 M TLV 6 */
4599
95
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4600
    /* Tag Tag/11.3.34 M TLV 3 */
4601
95
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
4602
    /* IMSI (note) IMSI/11.3.14 C TLV 5 -10 */
4603
95
    ELEM_OPT_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI , NULL);
4604
    /* RA-Cap-UPD-CAUSE RA-Cap-UPDCAUSE/11.3.30 M TLV 3 */
4605
93
    ELEM_OPT_TELV(BSSGP_IEI_RA_CAP_UPD_CAUSE, BSSGP_PDU_TYPE, DE_BSSGP_RA_CAP_UPD_CAUSE , NULL);
4606
    /* MS Radio Access Capability MS Radio Access Capability/11.3.22 C TLV 7-? */
4607
89
    ELEM_OPT_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
4608
4609
88
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4610
88
}
4611
4612
/*
4613
 * 10.3.5   RADIO-STATUS
4614
 */
4615
static void
4616
bssgp_ra_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4617
12
{
4618
12
    uint32_t curr_offset;
4619
12
    uint32_t consumed;
4620
12
    unsigned   curr_len;
4621
4622
12
    curr_offset = offset;
4623
12
    curr_len = len;
4624
4625
    /* This PDU indicates that an exception condition related to the radio interface has occurred. */
4626
    /* BSS to SGSN */
4627
12
    pinfo->link_dir = P2P_DIR_UL;
4628
4629
    /* TLLI (note) TLLI/11.3.35 C TLV 6 */
4630
12
    ELEM_OPT_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI , NULL);
4631
    /* TMSI (note) TMSI/11.3.36 C TLV 6 */
4632
11
    ELEM_OPT_TELV(BSSGP_IEI_TMSI,GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, NULL);
4633
    /* IMSI (note) IMSI/11.3.14 C TLV 5-10 */
4634
11
    ELEM_OPT_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI , NULL);
4635
    /* Radio Cause Radio Cause/11.3.29 M TLV 3 */
4636
11
    ELEM_MAND_TELV(BSSGP_IEI_RADIO_CAUSE, BSSGP_PDU_TYPE, DE_BSSGP_RA_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
4637
4638
11
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4639
11
}
4640
/*
4641
 * 10.3.6   SUSPEND
4642
 */
4643
static void
4644
bssgp_suspend(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4645
6
{
4646
6
    uint32_t curr_offset;
4647
6
    uint32_t consumed;
4648
6
    unsigned   curr_len;
4649
4650
6
    curr_offset = offset;
4651
6
    curr_len = len;
4652
4653
    /* This PDU indicates that an MS wishes to suspend its GPRS service. */
4654
    /* Direction: BSS to SGSN */
4655
6
    pinfo->link_dir = P2P_DIR_UL;
4656
4657
    /* TLLI TLLI/11.3.35 M TLV 6 */
4658
6
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4659
    /* Routeing Area Routeing Area/11.3.31 M TLV 8 */
4660
6
    ELEM_MAND_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_bssgp_missing_mandatory_element);
4661
4662
6
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4663
6
}
4664
/*
4665
 * 10.3.7   SUSPEND-ACK
4666
 */
4667
void
4668
bssgp_suspend_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4669
56
{
4670
56
    uint32_t curr_offset;
4671
56
    uint32_t consumed;
4672
56
    unsigned   curr_len;
4673
4674
56
    curr_offset = offset;
4675
56
    curr_len = len;
4676
4677
    /* This PDU positively acknowledges the reception of a SUSPEND PDU for an MS. */
4678
    /* Direction: SGSN to BSS */
4679
56
    pinfo->link_dir = P2P_DIR_DL;
4680
4681
    /* TLLI TLLI/11.3.35 M TLV 6 */
4682
56
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4683
    /* Routeing Area Routeing Area/11.3.31 M TLV 8 */
4684
56
    ELEM_MAND_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_bssgp_missing_mandatory_element);
4685
    /* Suspend Reference Number Suspend Reference Number/11.3.33 M TLV 3 */
4686
56
    ELEM_MAND_TELV(0x1d,BSSGP_PDU_TYPE, DE_BSSGP_SUSPEND_REF_NO, NULL, ei_bssgp_missing_mandatory_element);
4687
4688
4689
56
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4690
56
}
4691
/*
4692
 * 10.3.8   SUSPEND-NACK
4693
 */
4694
static void
4695
bssgp_suspend_nack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4696
5
{
4697
5
    uint32_t curr_offset;
4698
5
    uint32_t consumed;
4699
5
    unsigned   curr_len;
4700
4701
5
    curr_offset = offset;
4702
5
    curr_len = len;
4703
4704
4705
    /* This PDU negatively acknowledges the reception of a SUSPEND PDU for an MS. */
4706
    /* Direction: SGSN to BSS */
4707
5
    pinfo->link_dir = P2P_DIR_DL;
4708
4709
    /* TLLI TLLI/11.3.35 M TLV 6 */
4710
5
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4711
    /* Routeing Area Routeing Area/11.3.31 M TLV 8 */
4712
5
    ELEM_MAND_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_bssgp_missing_mandatory_element);
4713
    /* Cause Cause/11.3.8 O TLV 3 */
4714
5
    ELEM_OPT_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL);
4715
4716
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4717
4
}
4718
/*
4719
 * 10.3.9   RESUME
4720
 */
4721
static void
4722
bssgp_resume(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4723
5
{
4724
5
    uint32_t curr_offset;
4725
5
    uint32_t consumed;
4726
5
    unsigned   curr_len;
4727
4728
5
    curr_offset = offset;
4729
5
    curr_len = len;
4730
4731
    /* This PDU indicates that an MS wishes to RESUME its GPRS service. */
4732
    /* Direction: BSS to SGSN */
4733
5
    pinfo->link_dir = P2P_DIR_UL;
4734
4735
    /* TLLI TLLI/11.3.35 M TLV 6 */
4736
5
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4737
    /* Routeing Area Routeing Area/11.3.31 M TLV 8 */
4738
5
    ELEM_MAND_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_bssgp_missing_mandatory_element);
4739
    /* Suspend Reference Number Suspend Reference Number/11.3.33 M TLV 3 */
4740
5
    ELEM_MAND_TELV(0x1d,BSSGP_PDU_TYPE, DE_BSSGP_SUSPEND_REF_NO, NULL, ei_bssgp_missing_mandatory_element);
4741
4742
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4743
5
}
4744
/*
4745
 * 10.3.10  RESUME-ACK
4746
 */
4747
4748
static void
4749
bssgp_resume_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4750
2
{
4751
2
    uint32_t curr_offset;
4752
2
    uint32_t consumed;
4753
2
    unsigned   curr_len;
4754
4755
2
    curr_offset = offset;
4756
2
    curr_len = len;
4757
4758
    /* This PDU positively acknowledges the reception of a RESUME PDU for an MS. */
4759
    /* Direction: SGSN to BSS */
4760
2
    pinfo->link_dir = P2P_DIR_DL;
4761
4762
    /* TLLI TLLI/11.3.35 M TLV 6 */
4763
2
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4764
    /* Routeing Area Routeing Area/11.3.31 M TLV 8 */
4765
2
    ELEM_MAND_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_bssgp_missing_mandatory_element);
4766
4767
2
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4768
2
}
4769
/*
4770
 * 10.3.11  RESUME-NACK
4771
 */
4772
4773
static void
4774
bssgp_resume_nack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4775
6
{
4776
6
    uint32_t curr_offset;
4777
6
    uint32_t consumed;
4778
6
    unsigned   curr_len;
4779
4780
6
    curr_offset = offset;
4781
6
    curr_len = len;
4782
4783
    /* This PDU negatively acknowledges the reception of a RESUME PDU for an MS. */
4784
    /* Direction: SGSN to BSS */
4785
6
    pinfo->link_dir = P2P_DIR_DL;
4786
4787
    /* TLLI TLLI/11.3.35 M TLV 6 */
4788
6
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4789
    /* Routeing Area Routeing Area/11.3.31 M TLV 8 */
4790
6
    ELEM_MAND_TELV(0x1b,GSM_A_PDU_TYPE_GM, DE_RAI, NULL, ei_bssgp_missing_mandatory_element);
4791
    /* Cause Cause/11.3.8 O TLV 3 */
4792
6
    ELEM_OPT_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL);
4793
4794
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4795
5
}
4796
4797
4798
/*
4799
 * 10.3.12   DUMMY PAGING PS
4800
 */
4801
4802
static void
4803
bssgp_dummy_paging_ps(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4804
7
{
4805
7
    uint32_t curr_offset;
4806
7
    uint32_t consumed;
4807
7
    unsigned   curr_len;
4808
4809
7
    curr_offset = offset;
4810
7
    curr_len = len;
4811
    /* This PDU indicates that a BSS shall calculate the time until the next paging occasion for the MS indicated in the message.
4812
     * Direction: SGSN to BSS
4813
     */
4814
7
    pinfo->link_dir = P2P_DIR_DL;
4815
4816
    /* IMSI IMSI/11.3.14 M TLV 5 -10 */
4817
7
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
4818
    /* Routeing Area (note) Routeing Area/11.3.31 C TLV 8 */
4819
7
    ELEM_OPT_TELV(0x1b, GSM_A_PDU_TYPE_GM, DE_RAI, NULL);
4820
    /* eDRX Parameters (note 11) eDRX Parameters/11.3.122 O TLV 3 */
4821
4
    ELEM_OPT_TELV(BSSGP_IEI_EDRX_PARAMETERS, BSSGP_PDU_TYPE, DE_BSSGP_EDRX_PARAMS, NULL);
4822
4823
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4824
4
}
4825
4826
/*
4827
 * 10.3.13   DUMMY PAGING PS RESPONSE
4828
 */
4829
4830
static void
4831
bssgp_dummy_paging_ps_response(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4832
6
{
4833
6
    uint32_t curr_offset;
4834
6
    uint32_t consumed;
4835
6
    unsigned   curr_len;
4836
4837
6
    curr_offset = offset;
4838
6
    curr_len = len;
4839
    /* This PDU provides the SGSNwith the time until the next paging occasion for the MS indicated in the message.
4840
     * Direction: BSS to SGSN
4841
     */
4842
6
    pinfo->link_dir = P2P_DIR_UL;
4843
4844
    /* IMSI IMSI/11.3.14 M TLV 5-10 */
4845
6
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
4846
    /* Time Until Next Paging Occasion Time Until Next Paging Occasion/11.3.123 M TLV 3 */
4847
6
    ELEM_MAND_TELV(BSSGP_IEI_TUNPO, BSSGP_PDU_TYPE, DE_BSSGP_TUNPO, NULL, ei_bssgp_missing_mandatory_element);
4848
4849
6
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4850
6
}
4851
4852
/*
4853
* 10.3.14   PAGING PS REJECT
4854
*/
4855
4856
static void
4857
bssgp_paging_ps_reject(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4858
12
{
4859
12
    uint32_t curr_offset;
4860
12
    uint32_t consumed;
4861
12
    unsigned   curr_len;
4862
4863
12
    curr_offset = offset;
4864
12
    curr_len = len;
4865
    /* This PDU indicates that a BSS has determined the nominal paging group of the MS occurs too far into the future.
4866
    * Direction: BSS to SGSN
4867
    */
4868
4869
12
    pinfo->link_dir = P2P_DIR_UL;
4870
4871
    /* IMSI IMSI/11.3.14 M TLV 5 -10 */
4872
12
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
4873
    /* P-TMSI (note 1) TMSI/11.3.36 O TLV 6 */
4874
12
    ELEM_OPT_TELV(BSSGP_IEI_TMSI, GSM_A_PDU_TYPE_RR, DE_RR_TMSI_PTMSI, NULL);
4875
    /* Time Until Next Paging Occasion Time Until Next Paging Occasion/11.3.123 M TLV 3 */
4876
6
    ELEM_MAND_TELV(BSSGP_IEI_TUNPO, BSSGP_PDU_TYPE, DE_BSSGP_TUNPO, NULL, ei_bssgp_missing_mandatory_element);
4877
4878
6
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4879
6
}
4880
4881
/*
4882
 * 10.3.15  MS REGISTRATION ENQUIRY
4883
 */
4884
4885
    /* IMSI IMSI/11.3.14  M TLV 5-10 */
4886
    /* MME Query  MME Query/11.3.130  O TLV 3 */
4887
4888
/*
4889
 *10.3.16 MS REGISTRATION ENQUIRY RESPONSE
4890
 */
4891
4892
    /* IMSI IMSI/11.3.14  M TLV 5-10 */
4893
    /* PS Registered Operator (note 1)  PLMN Identity/11.3.129  O TLV 5 */
4894
/*
4895
 * 10.4 PDU functional definitions and contents at NM SAP
4896
 * 10.4.1   FLUSH-LL
4897
 */
4898
static void
4899
bssgp_flush_ll(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4900
7
{
4901
7
    uint32_t curr_offset;
4902
7
    uint32_t consumed;
4903
7
    unsigned   curr_len;
4904
4905
7
    curr_offset = offset;
4906
7
    curr_len = len;
4907
4908
    /* This PDU informs a BSS that an MS has moved from one cell to another. */
4909
    /* Direction: SGSN to BSS */
4910
7
    pinfo->link_dir = P2P_DIR_DL;
4911
4912
    /* TLLI TLLI/11.3.35 M TLV 6 */
4913
7
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4914
    /* BVCI (old) BVCI/11.3.6 M TLV 4 */
4915
7
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, " - Old", ei_bssgp_missing_mandatory_element);
4916
    /* BVCI (new) BVCI/11.3.6 O TLV 4 */
4917
7
    ELEM_OPT_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI , " - New");
4918
    /* NSEI (new) NSEI/11.3.48 O (note) TLV 4 */
4919
7
    ELEM_OPT_TELV(0x3e, GSM_A_PDU_TYPE_RR, DE_BSSGP_NSEI , " - New");
4920
4921
7
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4922
7
}
4923
/*
4924
 * 10.4.2   FLUSH-LL-ACK
4925
 */
4926
static void
4927
bssgp_flush_ll_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4928
8
{
4929
8
    uint32_t curr_offset;
4930
8
    uint32_t consumed;
4931
8
    unsigned   curr_len;
4932
4933
8
    curr_offset = offset;
4934
8
    curr_len = len;
4935
4936
    /* This PDU indicates that LLC-PDU(s) buffered for an MS in the old cell
4937
     * have been either deleted or transferred to the new cell within the routing area. */
4938
    /* Direction: BSS to SGSN */
4939
8
    pinfo->link_dir = P2P_DIR_UL;
4940
4941
    /* TLLI TLLI/11.3.35 M TLV 6 */
4942
8
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4943
    /* Flush Action Flush Action/11.3.13 M TLV 3 */
4944
8
    ELEM_MAND_TELV(0x0c, BSSGP_PDU_TYPE, DE_BSSGP_FLUSH_ACTION, NULL, ei_bssgp_missing_mandatory_element);
4945
    /* BVCI (new) BVCI/11.3.13 C (note 1) TLV 4 */
4946
8
    ELEM_OPT_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI , " - New");
4947
    /* Number of octets affected Number of octets affected/11.3.41 M TLV 5 */
4948
7
    ELEM_MAND_TELV(BSSGP_IEI_NUMBER_OF_OCTETS_AFFECTED, BSSGP_PDU_TYPE, DE_BSSGP_NO_OF_OCT_AFFECTED, NULL, ei_bssgp_missing_mandatory_element);
4949
    /* NSEI (new) NSEI/11.3.48 C (note 2) TLV 4 */
4950
7
    ELEM_OPT_TELV(0x3e, GSM_A_PDU_TYPE_RR, DE_BSSGP_NSEI , " - New");
4951
4952
4953
7
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4954
7
}
4955
/*
4956
 * 10.4.3   LLC-DISCARDED
4957
 */
4958
static void
4959
bssgp_llc_discarded(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4960
7
{
4961
7
    uint32_t curr_offset;
4962
7
    uint32_t consumed;
4963
7
    unsigned   curr_len;
4964
4965
7
    curr_offset = offset;
4966
7
    curr_len = len;
4967
4968
    /* Direction: BSS to SGSN */
4969
7
    pinfo->link_dir = P2P_DIR_UL;
4970
4971
    /* TLLI TLLI/11.3.35 M TLV 6 */
4972
7
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
4973
    /* LLC Frames Discarded LLC Frames Discarded/11.3.16 M TLV 3 */
4974
7
    ELEM_MAND_TELV(BSSGP_IEI_LLC_FRAMES_DISCARDED, BSSGP_PDU_TYPE, DE_BSSGP_LLC_FRAMES_DISC, NULL, ei_bssgp_missing_mandatory_element);
4975
    /* BVCI BVCI/11.3.6 M TLV 4 */
4976
7
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
4977
    /* Number of octets deleted Number of octets affected/11.3.41 M TLV 5 */
4978
7
    ELEM_MAND_TELV(BSSGP_IEI_NUMBER_OF_OCTETS_AFFECTED, BSSGP_PDU_TYPE, DE_BSSGP_NO_OF_OCT_AFFECTED, NULL, ei_bssgp_missing_mandatory_element);
4979
    /* PFI (note) PFI/11.3.42 O TLV 3 */
4980
7
    ELEM_OPT_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID , NULL);
4981
4982
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
4983
5
}
4984
4985
/*
4986
 * 10.4.4   FLOW-CONTROL-BVC
4987
 */
4988
static void
4989
bssgp_flow_control_bvc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
4990
9
{
4991
9
    uint32_t curr_offset;
4992
9
    uint32_t consumed;
4993
9
    unsigned   curr_len;
4994
4995
9
    curr_offset = offset;
4996
9
    curr_len = len;
4997
4998
    /* This PDU informs the flow control mechanism at an SGSN of the status of a
4999
     * BVC's maximum acceptable SGSN to BSS throughput on the Gb interface.
5000
     */
5001
    /* Direction: BSS to SGSN */
5002
9
    pinfo->link_dir = P2P_DIR_UL;
5003
5004
    /* Tag Tag/11.3.34 M TLV 3 */
5005
9
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
5006
    /* BVC Bucket Size BVC Bucket Size/11.3.5 M TLV 4 */
5007
9
    ELEM_MAND_TELV(0x05, BSSGP_PDU_TYPE, DE_BSSGP_BVC_BUCKET_SIZE, NULL, ei_bssgp_missing_mandatory_element);
5008
    /* Bucket Leak Rate Bucket Leak Rate/11.3.4 M TLV 4 */
5009
9
    ELEM_MAND_TELV(BSSGP_IEI_BUCKET_LEAK_RATE, BSSGP_PDU_TYPE, DE_BSSGP_BUCKET_LEAK_RATE, NULL, ei_bssgp_missing_mandatory_element);
5010
    /* Bmax default MS Bmax default MS/11.3.2 M TLV 4 */
5011
9
    ELEM_MAND_TELV(0x01, BSSGP_PDU_TYPE, DE_BSSGP_BMAX_DEFAULT_MS, NULL, ei_bssgp_missing_mandatory_element);
5012
    /* R_default_MS R_default_MS/11.3.32 M TLV 4 */
5013
9
    ELEM_MAND_TELV(0x1c, BSSGP_PDU_TYPE, DE_BSSGP_R_DEFAULT_MS, NULL, ei_bssgp_missing_mandatory_element);
5014
    /* Bucket_Full Ratio Bucket_Full Ratio/11.3.46 C TLV 3 */
5015
9
    ELEM_OPT_TELV(BSSGP_IEI_BUCKET_FULL_RATIO, BSSGP_PDU_TYPE, DE_BSSGP_BUCKET_FULL_RATIO , NULL);
5016
    /* BVC Measurement BVC Measurement/11.3.7 O TLV 4  */
5017
7
    ELEM_OPT_TELV(0x06, BSSGP_PDU_TYPE, DE_BSSGP_BVC_MEAS , NULL);
5018
    /* Flow Control Granularity (note) Flow Control Granularity/11.3.102 O TLV 3 */
5019
7
    ELEM_OPT_TELV(0x7e, BSSGP_PDU_TYPE, DE_BSSGP_FLOW_CONTROL_GRAN , NULL);
5020
5021
7
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5022
7
}
5023
5024
/*
5025
 * 10.4.5   FLOW-CONTROL-BVC-ACK
5026
 */
5027
static void
5028
bssgp_flow_control_bvc_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5029
4
{
5030
4
    uint32_t curr_offset;
5031
4
    uint32_t consumed;
5032
4
    unsigned   curr_len;
5033
5034
4
    curr_offset = offset;
5035
4
    curr_len = len;
5036
5037
    /* This PDU informs the flow control mechanism at the BSS that the SGSN has received
5038
     * the FLOW-CONTROL-BVC PDU indicated by the Tag.
5039
     */
5040
5041
    /* Direction: SGSN to BSS */
5042
4
    pinfo->link_dir = P2P_DIR_DL;
5043
5044
    /* Tag Tag/11.3.34 M TLV 3 */
5045
4
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
5046
5047
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5048
4
}
5049
5050
/*
5051
 * 10.4.6   FLOW-CONTROL-MS
5052
 */
5053
static void
5054
bssgp_flow_control_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5055
7
{
5056
7
    uint32_t curr_offset;
5057
7
    uint32_t consumed;
5058
7
    unsigned   curr_len;
5059
5060
7
    curr_offset = offset;
5061
7
    curr_len = len;
5062
5063
    /* This PDU informs the flow control mechanism at an SGSN of the status of an MS's
5064
     * maximum acceptable SGSN to BSS throughput on the Gb interface.
5065
     */
5066
5067
    /* Direction: BSS to SGSN */
5068
7
    pinfo->link_dir = P2P_DIR_UL;
5069
5070
    /* TLLI TLLI/11.3.35 M TLV 6 */
5071
7
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5072
    /* Tag Tag/11.3.34 M TLV 3 */
5073
7
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
5074
    /* MS Bucket Size MS Bucket Size/11.3.21 M TLV 4 */
5075
7
    ELEM_MAND_TELV(BSSGP_IEI_MS_BUCKET_SIZE, BSSGP_PDU_TYPE, DE_BSSGP_MS_BUCKET_SIZE, NULL, ei_bssgp_missing_mandatory_element);
5076
    /* Bucket Leak rate Bucket Leak rate/11.3.4 M TLV 4 */
5077
7
    ELEM_MAND_TELV(BSSGP_IEI_BUCKET_LEAK_RATE, BSSGP_PDU_TYPE, DE_BSSGP_BUCKET_LEAK_RATE, NULL, ei_bssgp_missing_mandatory_element);
5078
    /* Bucket_Full Ratio Bucket_Full Ratio/11.3.46 C TLV 3 */
5079
7
    ELEM_OPT_TELV(BSSGP_IEI_BUCKET_FULL_RATIO, BSSGP_PDU_TYPE, DE_BSSGP_BUCKET_FULL_RATIO , NULL);
5080
    /* Flow Control Granularity (note) Flow Control Granularity/11.3.102 O TLV 3 */
5081
7
    ELEM_OPT_TELV(0x7e, BSSGP_PDU_TYPE, DE_BSSGP_FLOW_CONTROL_GRAN , NULL);
5082
5083
6
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5084
6
}
5085
/*
5086
 * 10.4.7   FLOW-CONTROL-MS-ACK
5087
 */
5088
static void
5089
bssgp_flow_control_ms_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5090
5
{
5091
5
    uint32_t curr_offset;
5092
5
    uint32_t consumed;
5093
5
    unsigned   curr_len;
5094
5095
5
    curr_offset = offset;
5096
5
    curr_len = len;
5097
5098
    /* This PDU informs the flow control mechanism at the BSS that the SGSN has received
5099
     * the FLOW-CONTROL-MS PDU indicated by the TLLI and the Tag. */
5100
    /* Direction: SGSN to BSS */
5101
5
    pinfo->link_dir = P2P_DIR_DL;
5102
5103
    /* TLLI TLLI/11.3.35 M TLV 6  */
5104
5
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5105
    /* Tag Tag/11.3.34 M TLV 3 */
5106
5
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
5107
5108
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5109
5
}
5110
/*
5111
 * 10.4.8   BVC-BLOCK
5112
 */
5113
5114
static void
5115
bssgp_bvc_block(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5116
5
{
5117
5
    uint32_t curr_offset;
5118
5
    uint32_t consumed;
5119
5
    unsigned   curr_len;
5120
5121
5
    curr_offset = offset;
5122
5
    curr_len = len;
5123
5124
    /* This PDU indicates that the contained BVC shall be blocked at the recipient entity. */
5125
    /* BSS to SGSN */
5126
5
    pinfo->link_dir = P2P_DIR_UL;
5127
5128
    /* BVCI BVCI/11.3.6 M TLV 4 */
5129
5
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
5130
    /* Cause Cause/11.3.8 M TLV 3 */
5131
5
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5132
5133
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5134
5
}
5135
5136
/*
5137
 * 10.4.9   BVC-BLOCK-ACK
5138
 */
5139
static void
5140
bssgp_bvc_block_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5141
4
{
5142
4
    uint32_t curr_offset;
5143
4
    uint32_t consumed;
5144
4
    unsigned   curr_len;
5145
5146
4
    curr_offset = offset;
5147
4
    curr_len = len;
5148
5149
    /* This PDU acknowledges that a BVC has been blocked. */
5150
    /* SGSN to BSS */
5151
4
    pinfo->link_dir = P2P_DIR_DL;
5152
5153
    /* BVCI BVCI/11.3.6 M TLV 4 */
5154
4
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
5155
5156
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5157
4
}
5158
5159
/*
5160
 * 10.4.10  BVC-UNBLOCK
5161
 */
5162
static void
5163
bssgp_bvc_un_block(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5164
4
{
5165
4
    uint32_t curr_offset;
5166
4
    uint32_t consumed;
5167
4
    unsigned   curr_len;
5168
5169
4
    curr_offset = offset;
5170
4
    curr_len = len;
5171
5172
    /* This PDU indicates that the identified BVC shall be unblocked at the recipient entity. */
5173
    /* Direction: BSS to SGSN */
5174
4
    pinfo->link_dir = P2P_DIR_UL;
5175
5176
    /* BVCI BVCI/11.3.6 M TLV 4 */
5177
4
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
5178
5179
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5180
4
}
5181
/*
5182
 * 10.4.11  BVC-UNBLOCK-ACK
5183
 */
5184
5185
static void
5186
bssgp_bvc_un_block_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5187
5
{
5188
5
    uint32_t curr_offset;
5189
5
    uint32_t consumed;
5190
5
    unsigned   curr_len;
5191
5192
5
    curr_offset = offset;
5193
5
    curr_len = len;
5194
5195
    /* This PDU acknowledges that a BVC has been unblocked. */
5196
    /* Direction: SGSN to BSS */
5197
5
    pinfo->link_dir = P2P_DIR_DL;
5198
5199
    /* BVCI BVCI/11.3.6 M TLV 4 */
5200
5
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
5201
5202
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5203
5
}
5204
5205
/*
5206
 * 10.4.12  BVC-RESET
5207
 */
5208
5209
static void
5210
bssgp_bvc_reset(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5211
8
{
5212
8
    uint32_t curr_offset;
5213
8
    uint32_t consumed;
5214
8
    unsigned   curr_len;
5215
5216
8
    curr_offset = offset;
5217
8
    curr_len = len;
5218
5219
    /* This PDU indicates that BVC initialisation is required, e.g. because of a BVC failure. */
5220
    /* Direction: SGSN to BSS, BSS to SGSN */
5221
5222
    /* BVCI BVCI/11.3.6 M TLV 4 */
5223
8
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
5224
    /* Cause Cause/11.3.8 M TLV 3 */
5225
8
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5226
    /* Cell Identifier (note 1) C TLV 10 */
5227
8
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , NULL);
5228
    /* Feature bitmap (note 2) Feature bitmap/11.3.45 O TLV 3 */
5229
6
    ELEM_OPT_TELV(0x3b, BSSGP_PDU_TYPE, DE_BSSGP_FEATURE_BITMAP , NULL);
5230
    /* Extended Feature Bitmap (note 3) Extended Feature Bitmap/11.3.84 O TLV 3 */
5231
6
    ELEM_OPT_TELV(0x69, BSSGP_PDU_TYPE, DE_BSSGP_EXT_FEATURE_BITMAP , NULL);
5232
5233
6
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5234
6
}
5235
5236
/*
5237
 * 10.4.13  BVC-RESET-ACK
5238
 */
5239
5240
static void
5241
bssgp_bvc_reset_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5242
5
{
5243
5
    uint32_t curr_offset;
5244
5
    uint32_t consumed;
5245
5
    unsigned   curr_len;
5246
5247
5
    curr_offset = offset;
5248
5
    curr_len = len;
5249
5250
    /* This PDU indicates that BVC initialisation has been executed */
5251
    /* BSS to SGSN, SGSN to BSS */
5252
5253
    /* BVCI BVCI/11.3.6 M TLV 4 */
5254
5
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL, ei_bssgp_missing_mandatory_element);
5255
    /* Cell Identifier (note 1) C TLV 10 */
5256
5
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , NULL);
5257
    /* Feature bitmap (note 2) Feature bitmap/11.3.45 O TLV 3 */
5258
4
    ELEM_OPT_TELV(0x3b, BSSGP_PDU_TYPE, DE_BSSGP_FEATURE_BITMAP , NULL);
5259
    /* Extended Feature Bitmap (note 3) Extended Feature Bitmap/11.3.84 O TLV 3 */
5260
4
    ELEM_OPT_TELV(0x69, BSSGP_PDU_TYPE, DE_BSSGP_EXT_FEATURE_BITMAP , NULL);
5261
5262
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5263
4
}
5264
5265
/*
5266
 * 10.4.14  STATUS
5267
 */
5268
static void
5269
bssgp_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5270
6
{
5271
6
    uint32_t curr_offset;
5272
6
    uint32_t consumed;
5273
6
    unsigned   curr_len;
5274
5275
6
    curr_offset = offset;
5276
6
    curr_len = len;
5277
5278
    /* This PDU indicates that an exception condition occurred. */
5279
    /* Direction: SGSN to BSS, BSS to SGSN */
5280
5281
6
    pinfo->flags.in_error_pkt = true;
5282
5283
    /* Cause Cause/11.3.8 M TLV 3 */
5284
6
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5285
    /* BVCI BVCI/11.3.6 C TLV 4 */
5286
6
    ELEM_OPT_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, NULL);
5287
    /* PDU In Error (note) PDU In Error/11.3.24 O TLV 3-? */
5288
5
    ELEM_OPT_TELV(0x15, BSSGP_PDU_TYPE, DE_BSSGP_PDU_IN_ERROR, NULL);
5289
5290
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5291
5
}
5292
/*
5293
 * 10.4.15  SGSN-INVOKE-TRACE
5294
 */
5295
static void
5296
bssgp_sgsn_invoke_trace(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5297
22
{
5298
22
    uint32_t curr_offset;
5299
22
    uint32_t consumed;
5300
22
    unsigned   curr_len;
5301
5302
22
    curr_offset = offset;
5303
22
    curr_len = len;
5304
5305
    /* This PDU indicates that the BSS shall begin the production of a trace record for an MS. */
5306
    /* Direction: SGSN to BSS */
5307
5308
22
    pinfo->link_dir = P2P_DIR_UL;
5309
5310
    /* Trace Type Trace Type/11.3.38 M TLV 3 */
5311
22
    ELEM_MAND_TELV(0x22, BSSGP_PDU_TYPE, DE_BSSGP_TRACE_TYPE, NULL, ei_bssgp_missing_mandatory_element);
5312
    /* Trace Reference Trace Reference/11.3.37 M TLV 4 */
5313
22
    ELEM_MAND_TELV(0x21, BSSGP_PDU_TYPE, DE_BSSGP_TRACE_REF, NULL, ei_bssgp_missing_mandatory_element);
5314
    /* Trigger Id Trigger Id/11.3.40 O TLV 4-24 */
5315
22
    ELEM_OPT_TELV(0x24, BSSGP_PDU_TYPE, DE_BSSGP_TRIGGER_ID , NULL);
5316
    /* Mobile Id Mobile Id/11.3.20 O TLV 3-10 */
5317
19
    ELEM_OPT_TELV(0x11,GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
5318
    /* OMC Id OMC Id/11.3.23 O TLV 4-24 */
5319
19
    ELEM_OPT_TELV(0x14,GSM_A_PDU_TYPE_COMMON, DE_BSSGP_OMC_ID, NULL);
5320
    /* TransactionId TransactionId/11.3.39 O TLV 4 */
5321
10
    ELEM_OPT_TELV(0x23, BSSGP_PDU_TYPE, DE_BSSGP_TRANSACTION_ID , NULL);
5322
5323
10
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5324
10
}
5325
5326
/*
5327
 * 10.4.16  DOWNLOAD-BSS-PFC
5328
 */
5329
static void
5330
bssgp_download_bss_pfc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5331
4
{
5332
4
    uint32_t curr_offset;
5333
4
    uint32_t consumed;
5334
4
    unsigned   curr_len;
5335
5336
4
    curr_offset = offset;
5337
4
    curr_len = len;
5338
5339
    /* This PDU requests a SGSN to initiate a CREATE-BSS-PFC procedure. */
5340
    /* Direction: BSS to SGSN */
5341
4
    pinfo->link_dir = P2P_DIR_UL;
5342
5343
    /* TLLI TLLI/11.3.35 M TLV 6 */
5344
4
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5345
    /* PFI PFI/11.3.42 M TLV 3 */
5346
4
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5347
5348
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5349
4
}
5350
5351
/*
5352
 * 10.4.17  CREATE-BSS-PFC
5353
 */
5354
static void
5355
bssgp_create_bss_pfc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5356
46
{
5357
46
    uint32_t curr_offset;
5358
46
    uint32_t consumed;
5359
46
    unsigned   curr_len;
5360
5361
46
    curr_offset = offset;
5362
46
    curr_len = len;
5363
5364
    /* This PDU allows the SGSN to request that a BSS create or modify a BSS Packet Flow Context. */
5365
    /* Direction: SGSN to BSS */
5366
46
    pinfo->link_dir = P2P_DIR_DL;
5367
5368
    /* TLLI TLLI/11.3.35 M TLV 6 */
5369
46
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5370
    /* IMSI IMSI/11.3.14 O (note 4) TLV 5 -10 */
5371
46
    ELEM_OPT_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI , NULL);
5372
    /* PFI PFI/11.3.42 M TLV 3 */
5373
46
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5374
    /* PFT GPRS Timer/11.3.44 M TLV 3 */
5375
46
    ELEM_MAND_TELV(0x29, BSSGP_PDU_TYPE, DE_BSSGP_GPRS_TIMER, " - PFT", ei_bssgp_missing_mandatory_element);
5376
    /* ABQP ABQP/11.3.43 M TLV 13-? */
5377
46
    ELEM_MAND_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS, NULL, ei_bssgp_missing_mandatory_element);
5378
    /* Service UTRAN CCO Service UTRAN CCO/11.3.47 O TLV 3 */
5379
46
    ELEM_OPT_TELV(BSSGP_IEI_SERVICE_UTRAN_CCO, BSSGP_PDU_TYPE, DE_BSSGP_SERV_UTRAN_CCO, NULL);
5380
    /* MS Radio Access Capability MS Radio Access Capability/11.3.22 O (note 1) TLV 7-? */
5381
45
    ELEM_OPT_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP , NULL);
5382
    /* Allocation/Retention Priority Priority/11.3.27 O TLV 3 */
5383
45
    ELEM_OPT_TELV(0x17, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL);
5384
    /* T10 GPRS Timer/11.3.44 C (note 2) TLV 3 */
5385
34
    ELEM_OPT_TELV(BSSGP_IEI_GPRS_TIMER, BSSGP_PDU_TYPE, DE_BSSGP_GPRS_TIMER, " - T10");
5386
    /* Inter RAT Handover Info Inter RAT Handover Info/11.3.94 O (note 3) TLV 3-? */
5387
33
    ELEM_OPT_TELV(0x73, BSSGP_PDU_TYPE, DE_BSSGP_INTER_RAT_HO_INFO, NULL);
5388
    /* E-UTRAN Inter RAT Handover Info E-UTRAN Inter RAT Handover Info/11.3.104 O (note 3) TLV 3-? */
5389
32
    ELEM_OPT_TELV(0x80, BSSGP_PDU_TYPE, DE_BSSGP_E_UTRAN_INTER_RAT_HO_INFO, NULL);
5390
    /* Subscriber Profile ID for RAT/Frequency priority (note 5)
5391
     * Subscriber Profile ID for RAT/Frequency priority/11.3.105 O TLV 3
5392
     */
5393
29
    ELEM_OPT_TELV(0x81, BSSGP_PDU_TYPE, DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO, NULL);
5394
5395
26
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5396
26
}
5397
5398
/*
5399
 * 10.4.18  CREATE-BSS-PFC-ACK
5400
 */
5401
static void
5402
bssgp_create_bss_pfc_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5403
6
{
5404
6
    uint32_t curr_offset;
5405
6
    uint32_t consumed;
5406
6
    unsigned   curr_len;
5407
5408
6
    curr_offset = offset;
5409
6
    curr_len = len;
5410
5411
    /* This PDU allows the BSS to acknowledge a request from the SGSN for the creation
5412
     * or modification of a BSS Packet Flow Context.
5413
     */
5414
    /* Direction: BSS to SGSN */
5415
6
    pinfo->link_dir = P2P_DIR_UL;
5416
5417
    /* TLLI TLLI/11.3.35 M TLV 6 */
5418
6
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5419
    /* PFI PFI/11.3.42 M TLV 3 */
5420
6
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5421
    /* ABQP ABQP/11.3.43 M TLV 13-? */
5422
6
    ELEM_MAND_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS, NULL, ei_bssgp_missing_mandatory_element);
5423
    /* Cause Cause/11.3.8 O TLV 3 */
5424
6
    ELEM_OPT_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL);
5425
5426
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5427
5
}
5428
/*
5429
 * 10.4.19  CREATE-BSS-PFC-NACK
5430
 */
5431
static void
5432
bssgp_create_bss_pfc_nack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5433
2
{
5434
2
    uint32_t curr_offset;
5435
2
    uint32_t consumed;
5436
2
    unsigned   curr_len;
5437
5438
2
    curr_offset = offset;
5439
2
    curr_len = len;
5440
5441
    /* This PDU allows the BSS to Nack a request from the SGSN for the
5442
     * creation of a BSS Packet Flow Context
5443
     */
5444
    /* Direction: BSS to SGSN */
5445
2
    pinfo->link_dir = P2P_DIR_UL;
5446
5447
    /* TLLI TLLI/11.3.35 M TLV 6 */
5448
2
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5449
    /* PFI PFI/11.3.42 M TLV 3 */
5450
2
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5451
    /* Cause Cause/11.3.8 M TLV 3 */
5452
2
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5453
5454
2
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5455
2
}
5456
/*
5457
 * 10.4.20  MODIFY-BSS-PFC
5458
 */
5459
static void
5460
bssgp_modify_bss_pfc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5461
3
{
5462
3
    uint32_t curr_offset;
5463
3
    uint32_t consumed;
5464
3
    unsigned   curr_len;
5465
5466
3
    curr_offset = offset;
5467
3
    curr_len = len;
5468
5469
    /* This PDU allows the BSS to request a modification of a BSS Packet Flow Context. */
5470
    /* Direction: BSS to SGSN */
5471
3
    pinfo->link_dir = P2P_DIR_UL;
5472
5473
    /* TLLI TLLI/11.3.35 M TLV 6 */
5474
3
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5475
    /* PFI PFI/11.3.42 M TLV 3 */
5476
3
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5477
    /* ABQP ABQP/11.3.43 M TLV 13-? */
5478
3
    ELEM_MAND_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS, NULL, ei_bssgp_missing_mandatory_element);
5479
5480
3
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5481
3
}
5482
5483
/*
5484
 * 10.4.21  MODIFY-BSS-PFC-ACK
5485
 */
5486
static void
5487
bssgp_modify_bss_pfc_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5488
7
{
5489
7
    uint32_t curr_offset;
5490
7
    uint32_t consumed;
5491
7
    unsigned   curr_len;
5492
5493
7
    curr_offset = offset;
5494
7
    curr_len = len;
5495
5496
    /* This PDU allows the SGSN to acknowledge a modification to a BSS Packet Flow Context. */
5497
    /* Direction: SGSN to BSS */
5498
7
    pinfo->link_dir = P2P_DIR_DL;
5499
5500
    /* TLLI TLLI/11.3.35 M TLV 6 */
5501
7
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5502
    /* PFI PFI/11.3.42 M TLV 3 */
5503
7
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5504
    /* PFT GPRS Timer/11.3.44 M TLV 3 */
5505
7
    ELEM_MAND_TELV(BSSGP_IEI_GPRS_TIMER, BSSGP_PDU_TYPE, DE_BSSGP_GPRS_TIMER, " - PFT", ei_bssgp_missing_mandatory_element);
5506
    /* ABQP ABQP/11.3.43 M TLV 13-? */
5507
7
    ELEM_MAND_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS, NULL, ei_bssgp_missing_mandatory_element);
5508
5509
5510
7
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5511
7
}
5512
/*
5513
 * 10.4.22  DELETE-BSS-PFC
5514
 */
5515
static void
5516
bssgp_delete_bss_pfc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5517
3
{
5518
3
    uint32_t curr_offset;
5519
3
    uint32_t consumed;
5520
3
    unsigned   curr_len;
5521
5522
3
    curr_offset = offset;
5523
3
    curr_len = len;
5524
5525
    /* This PDU allows the SGSN to request that a BSS delete a BSS Packet Flow Context. */
5526
    /* Direction: SGSN to BSS */
5527
3
    pinfo->link_dir = P2P_DIR_DL;
5528
5529
    /* TLLI TLLI/11.3.35 M TLV 6 */
5530
3
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5531
    /* PFI PFI/11.3.42 M TLV 3 */
5532
3
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5533
5534
3
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5535
3
}
5536
/*
5537
 * 10.4.23  DELETE-BSS-PFC-ACK
5538
 */
5539
static void
5540
bssgp_delete_bss_pfc_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5541
2
{
5542
2
    uint32_t curr_offset;
5543
2
    uint32_t consumed;
5544
2
    unsigned   curr_len;
5545
5546
2
    curr_offset = offset;
5547
2
    curr_len = len;
5548
5549
    /* This PDU allows the BSS to acknowledge a request for the deletion of a BSS Packet Flow Context. */
5550
    /* Direction: BSS to SGSN */
5551
2
    pinfo->link_dir = P2P_DIR_UL;
5552
5553
    /* TLLI TLLI/11.3.35 M TLV 6 */
5554
2
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5555
    /* PFI PFI/11.3.42 M TLV 3 */
5556
2
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5557
5558
2
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5559
2
}
5560
/*
5561
 * 10.4.24  FLOW-CONTROL-PFC
5562
 */
5563
static void
5564
bssgp_flow_cntrl_pfc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5565
9
{
5566
9
    uint32_t curr_offset;
5567
9
    uint32_t consumed;
5568
9
    unsigned   curr_len;
5569
5570
9
    curr_offset = offset;
5571
9
    curr_len = len;
5572
5573
    /* This PDU provides the SGSN with flow control information regarding one or more PFC(s) of a given Mobile Station. */
5574
    /* Direction: BSS to SGSN */
5575
9
    pinfo->link_dir = P2P_DIR_UL;
5576
5577
    /* TLLI TLLI/11.3.35 M TLV 6 */
5578
9
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5579
    /* Tag Tag/11.3.34 M TLV 3 */
5580
9
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
5581
    /* MS Bucket Size MS Bucket Size/11.3.21 O TLV 4 */
5582
9
    ELEM_OPT_TELV(BSSGP_IEI_MS_BUCKET_SIZE, BSSGP_PDU_TYPE, DE_BSSGP_MS_BUCKET_SIZE , NULL);
5583
    /* Bucket Leak rate Bucket Leak rate/11.3.4 O TLV 4 */
5584
8
    ELEM_OPT_TELV(0x3b, BSSGP_PDU_TYPE, DE_BSSGP_FEATURE_BITMAP , NULL);
5585
    /* Bucket_Full Ratio Bucket_Full Ratio/11.3.46 O TLV 3 */
5586
8
    ELEM_OPT_TELV(BSSGP_IEI_BUCKET_FULL_RATIO, BSSGP_PDU_TYPE, DE_BSSGP_BUCKET_FULL_RATIO , NULL);
5587
    /* PFC flow control parameters PFC flow control parameters/11.3.68 M TLV */
5588
8
    ELEM_MAND_TELV(0x52, BSSGP_PDU_TYPE, DE_BSSGP_PFC_FLOW_CTRL, NULL, ei_bssgp_missing_mandatory_element);
5589
    /* Flow Control Granularity (note) Flow Control Granularity/11.3.102 O TLV 3 */
5590
8
    ELEM_OPT_TELV(0x7e, BSSGP_PDU_TYPE, DE_BSSGP_FLOW_CONTROL_GRAN , NULL);
5591
5592
8
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5593
8
}
5594
/*
5595
 * 10.4.25  FLOW-CONTROL-PFC-ACK
5596
 */
5597
static void
5598
bssgp_flow_cntrl_pfc_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5599
4
{
5600
4
    uint32_t curr_offset;
5601
4
    uint32_t consumed;
5602
4
    unsigned   curr_len;
5603
5604
4
    curr_offset = offset;
5605
4
    curr_len = len;
5606
5607
    /* This PDU informs the flow control mechanism at the BSS that the SGSN has received the FLOW-CONTROL-PFC
5608
     * PDU indicated by the TLLI and the Tag.
5609
     */
5610
    /* Direction: SGSN to BSS */
5611
4
    pinfo->link_dir = P2P_DIR_DL;
5612
5613
    /* TLLI TLLI/11.3.35 M TLV 6 */
5614
4
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5615
    /* Tag Tag/11.3.34 M TLV 3 */
5616
4
    ELEM_MAND_TELV(BSSGP_IEI_TAG, BSSGP_PDU_TYPE, DE_BSSGP_TAG, NULL, ei_bssgp_missing_mandatory_element);
5617
5618
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5619
4
}
5620
/*
5621
 * 10.4.26  DELETE-BSS-PFC-REQ
5622
 */
5623
static void
5624
bssgp_delete_bss_pfc_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5625
7
{
5626
7
    uint32_t curr_offset;
5627
7
    uint32_t consumed;
5628
7
    unsigned   curr_len;
5629
5630
7
    curr_offset = offset;
5631
7
    curr_len = len;
5632
5633
    /* This PDU allows the BSS to inform the SGSN that the BSS Packet Flow Context cannot be supported anymore */
5634
    /* Direction: BSS to SGSN */
5635
7
    pinfo->link_dir = P2P_DIR_UL;
5636
5637
    /* TLLI TLLI/11.3.35 M TLV 6 */
5638
7
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5639
    /* PFI PFI/11.3.42 M TLV 3 */
5640
7
    ELEM_MAND_TELV(BSSGP_IEI_PFI , GSM_A_PDU_TYPE_GM, DE_PACKET_FLOW_ID, NULL, ei_bssgp_missing_mandatory_element);
5641
    /* Cause Cause/11.3.8 M TLV 3 */
5642
7
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5643
5644
7
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5645
7
}
5646
/*
5647
 * 10.4.27  PS-HANDOVER-REQUIRED
5648
 */
5649
static void
5650
bssgp_ps_ho_required(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5651
32
{
5652
32
    uint32_t curr_offset;
5653
32
    uint32_t consumed;
5654
32
    unsigned   curr_len;
5655
5656
32
    curr_offset = offset;
5657
32
    curr_len = len;
5658
5659
    /* This PDU initiates the allocation of resources in the target system for an MS. */
5660
    /* Direction: BSS to SGSN */
5661
32
    pinfo->link_dir = P2P_DIR_UL;
5662
5663
    /* TLLI TLLI/11.3.35 M TLV 6 */
5664
32
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5665
    /* Cause Cause/11.3.8 M TLV 3 */
5666
32
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5667
    /* Source Cell Identifier Cell Identifier/11.3.9 M TLV 10 */
5668
32
    ELEM_MAND_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID, " - Source", ei_bssgp_missing_mandatory_element);
5669
    /* Target Cell Identifier (note 2) Cell Identifier/11.3.9 C TLV 10 */
5670
32
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , " - Target");
5671
    /* Source BSS to Target BSS Transparent Container (note 1)
5672
     * Source BSS to Target BSS Transparent Container/11.3.79 C TLV 10-?
5673
     */
5674
29
    ELEM_OPT_TELV(0x64,BSSGP_PDU_TYPE, DE_BSSGP_SOURCE_BSS_TO_TARGET_BSS_TRANSP_CONT, NULL);
5675
    /* Target RNC Identifier (note 2) (note 3) RNC Identifier/11.3.87 C TLV 10 */
5676
29
    ELEM_OPT_TELV(0x6c,BSSGP_PDU_TYPE, BE_BSSGP_RNC_ID, " - Target");
5677
    /* Source to Target Transparent Container (note 1)
5678
     * Source to Target Transparent Container/11.3.85 C TLV 3-?
5679
     */
5680
29
    ELEM_OPT_TELV(0x6a,BSSGP_PDU_TYPE, DE_BSSGP_SRC_TO_TRG_TRANSP_CONT, NULL);
5681
    /* Active PFCs List Active PFCs List/11.3.95c M TLV 3-? */
5682
28
    ELEM_OPT_TELV(0x77,BSSGP_PDU_TYPE, DE_BSSGP_ACTIVE_PFCS_LIST, NULL);
5683
    /* Target eNB identifier (note 2) (note 3) eNB Identifier/11.3.103 C TLV 3-n */
5684
27
    ELEM_OPT_TELV(0x7f,BSSGP_PDU_TYPE, DE_BSSGP_ENB_ID, " - Target");
5685
    /* Reliable Inter RAT Handover Info (note 4)
5686
     * Reliable Inter RAT Handover Info/11.3.107 C TLV 3
5687
     */
5688
26
    ELEM_OPT_TELV(0x83,BSSGP_PDU_TYPE, DE_BSSGP_RELIABLE_INTER_RAT_HO_INF, NULL);
5689
    /* CSG Identifier (note 5) CSG Identifier/11.3.109 C TLV 7 */
5690
23
    ELEM_OPT_TELV(0x85,BSSGP_PDU_TYPE, DE_BSSGP_CSG_ID, NULL);
5691
    /* TAC (note 6) Tracking Area Code/11.3.110 C TLV 5 */
5692
23
    ELEM_OPT_TELV(0x86, NAS_PDU_TYPE_EMM, DE_EMM_TRAC_AREA_ID, NULL);
5693
5694
23
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5695
23
}
5696
/*
5697
 * 10.4.28  PS-HANDOVER-REQUIRED-ACK
5698
 */
5699
static void
5700
bssgp_ps_ho_required_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5701
2
{
5702
2
    uint32_t curr_offset;
5703
2
    uint32_t consumed;
5704
2
    unsigned   curr_len;
5705
5706
2
    curr_offset = offset;
5707
2
    curr_len = len;
5708
5709
    /* This PDU indicates that resources have been allocated in the target system and
5710
     * that the BSS may initiate the channel change attempt for the corresponding MS.
5711
     */
5712
    /* Direction: SGSN to BSS */
5713
2
    pinfo->link_dir = P2P_DIR_DL;
5714
5715
    /* TLLI TLLI/11.3.35 M TLV 6 */
5716
2
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5717
    /* List of set-up PFCs List of set-up PFCs/11.3.83 M TLV 3-?S */
5718
2
    ELEM_MAND_TELV(0x68,BSSGP_PDU_TYPE, DE_BSSGP_LIST_OF_SETUP_PFCS, NULL, ei_bssgp_missing_mandatory_element);
5719
    /* Target BSS to Source BSS Transparent Container (note)
5720
     * Target BSS to Source BSS Transparent Container/11.3.80 C TLV 3-?
5721
     */
5722
2
    ELEM_OPT_TELV(0x65,BSSGP_PDU_TYPE, DE_BSSGP_TARGET_BSS_TO_SOURCE_BSS_TRANSP_CONT, NULL);
5723
    /* Target to Source Transparent Container (note)
5724
     * Target to Source Transparent Container/11.3.86 C TLV 3-?
5725
     */
5726
2
    ELEM_OPT_TELV(0x6b,BSSGP_PDU_TYPE, DE_BSSGP_TRG_TO_SRC_TRANSP_CONT, NULL);
5727
5728
2
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5729
2
}
5730
5731
/*
5732
 * 10.4.29  PS-HANDOVER-REQUIRED-NACK
5733
 */
5734
static void
5735
bssgp_ps_ho_required_nack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5736
5
{
5737
5
    uint32_t curr_offset;
5738
5
    uint32_t consumed;
5739
5
    unsigned   curr_len;
5740
5741
5
    curr_offset = offset;
5742
5
    curr_len = len;
5743
5744
    /* This PDU informs the source BSS about failed resource allocation in the target system. */
5745
    /* Direction: SGSN to BSS */
5746
5
    pinfo->link_dir = P2P_DIR_DL;
5747
5748
    /* TLLI TLLI/11.3.35 M TLV 6 */
5749
5
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5750
    /* Cause Cause/11.3.8 M TLV 3 */
5751
5
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5752
5753
5
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5754
5
}
5755
/*
5756
 * 10.4.30  PS-HANDOVER-REQUEST
5757
 */
5758
static void
5759
bssgp_ps_ho_request(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5760
157
{
5761
157
    uint32_t curr_offset;
5762
157
    uint32_t consumed;
5763
157
    unsigned   curr_len;
5764
5765
157
    curr_offset = offset;
5766
157
    curr_len = len;
5767
5768
    /* This PDU initiates the allocation of resources for one or more PFCs in the target BSS for an MS. */
5769
    /* Direction: SGSN to BSS */
5770
157
    pinfo->link_dir = P2P_DIR_DL;
5771
5772
    /* TLLI TLLI/11.3.35 M TLV 6 */
5773
157
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5774
    /* IMSI IMSI/11.3.14 M TLV 5-10 */
5775
157
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
5776
    /* Cause Cause/11.3.8 M TLV 3 */
5777
157
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5778
    /* Source Cell Identifier (note 1) Cell Identifier/11.3.9 C TLV 10 */
5779
157
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , " - Source");
5780
    /* Source RNC Identifier (note 1) RNC Identifier/11.3.87 C TLV 10 */
5781
154
    ELEM_OPT_TELV(0x6c,BSSGP_PDU_TYPE, BE_BSSGP_RNC_ID, " - Source");
5782
    /* Target Cell Identifier Cell Identifier/11.3.9 M TLV 10 */
5783
154
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , " - Target");
5784
    /* Source BSS to Target BSS Transparent Container Source BSS to Target BSS Transparent Container/11.3.79 M TLV 7-? */
5785
153
    ELEM_OPT_TELV(0x64,BSSGP_PDU_TYPE, DE_BSSGP_SOURCE_BSS_TO_TARGET_BSS_TRANSP_CONT, NULL);
5786
    /* PFCs to be set-up list PFCs to be set-up list/11.3.82 M TLV 22-? */
5787
153
    ELEM_OPT_TELV(0x67,BSSGP_PDU_TYPE, DE_BSSGP_PFCS_TO_BE_SET_UP_LIST, NULL);
5788
    /* NAS container for PS Handover NAS container for PS Handover/11.3.81 O TLV 3-? */
5789
153
    ELEM_OPT_TELV(0x66,GSM_A_PDU_TYPE_COMMON, DE_NAS_CONT_FOR_PS_HO, NULL);
5790
    /* Service UTRAN CCO Service UTRAN CCO/11.3.47 O TLV 3 */
5791
143
    ELEM_OPT_TELV(BSSGP_IEI_SERVICE_UTRAN_CCO, BSSGP_PDU_TYPE, DE_BSSGP_SERV_UTRAN_CCO, NULL);
5792
    /* Subscriber Profile ID for RAT/Frequency priority (note 2) Subscriber Profile ID for RAT/Frequency priority/11.3.105 O TLV 3 */
5793
143
    ELEM_OPT_TELV(0x81, BSSGP_PDU_TYPE, DE_BSSGP_SUB_PROF_ID_F_RAT_FRQ_PRIO, NULL);
5794
    /* Reliable Inter RAT Handover Info (note 3) Reliable Inter RAT Handover Info/11.3.107 C TLV 3 */
5795
143
    ELEM_OPT_TELV(0x83,BSSGP_PDU_TYPE, DE_BSSGP_RELIABLE_INTER_RAT_HO_INF, NULL);
5796
5797
142
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5798
142
}
5799
5800
/*
5801
 * 10.4.31  PS-HANDOVER-REQUEST-ACK
5802
 */
5803
static void
5804
bssgp_ps_ho_request_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5805
9
{
5806
9
    uint32_t curr_offset;
5807
9
    uint32_t consumed;
5808
9
    unsigned   curr_len;
5809
5810
9
    curr_offset = offset;
5811
9
    curr_len = len;
5812
5813
    /* This PDU acknowledges the successful allocation of resources in the target BSS. */
5814
    /* Direction: BSS to SGSN */
5815
9
    pinfo->link_dir = P2P_DIR_UL;
5816
5817
    /* TLLI TLLI/11.3.35 M TLV 6 */
5818
9
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5819
    /* List of set-up PFCs List of set-up PFCs/11.3.83 M TLV 3-? */
5820
9
    ELEM_MAND_TELV(0x68,BSSGP_PDU_TYPE, DE_BSSGP_LIST_OF_SETUP_PFCS, NULL, ei_bssgp_missing_mandatory_element);
5821
    /* Target BSS to Source BSS Transparent Container Target BSS to Source BSS Transparent Container/11.3.80 M TLV 3-? */
5822
9
    ELEM_MAND_TELV(0x65,BSSGP_PDU_TYPE, DE_BSSGP_TARGET_BSS_TO_SOURCE_BSS_TRANSP_CONT, NULL, ei_bssgp_missing_mandatory_element);
5823
5824
9
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5825
9
}
5826
/*
5827
 * 10.4.32  PS-HANDOVER-REQUEST-NACK
5828
 */
5829
static void
5830
bssgp_ps_ho_request_nack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5831
3
{
5832
3
    uint32_t curr_offset;
5833
3
    uint32_t consumed;
5834
3
    unsigned   curr_len;
5835
5836
3
    curr_offset = offset;
5837
3
    curr_len = len;
5838
5839
    /* This PDU informs the SGSN about failed resource allocation in the target BSS. */
5840
    /* BSS to SGSN */
5841
3
    pinfo->link_dir = P2P_DIR_UL;
5842
5843
    /* TLLI TLLI/11.3.35 M TLV 6 */
5844
3
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5845
    /* Cause Cause/11.3.8 M TLV 3 */
5846
3
    ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
5847
5848
3
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5849
3
}
5850
5851
/*
5852
 * 10.4.33  PS-HANDOVER-COMPLETE
5853
 */
5854
static void
5855
bssgp_ps_ho_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5856
13
{
5857
13
    uint32_t curr_offset;
5858
13
    uint32_t consumed;
5859
13
    unsigned   curr_len;
5860
5861
13
    curr_offset = offset;
5862
13
    curr_len = len;
5863
5864
    /* This PDU informs the SGSN about successful channel change for an MS. */
5865
    /* BSS to SGSN */
5866
13
    pinfo->link_dir = P2P_DIR_UL;
5867
5868
    /* TLLI TLLI/11.3.35 M TLV 6 */
5869
13
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5870
    /* IMSI IMSI/11.3.14 M TLV 5-10 */
5871
13
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
5872
    /* Target Cell Identifier (note 1) Cell Identifier/11.3.9 O TLV 10 */
5873
13
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , " - Target");
5874
    /* Request for Inter RAT Handover Info (note 2) Request for Inter RAT Handover Info/11.3.106 C TLV 3 */
5875
4
    ELEM_OPT_TELV(0x82, BSSGP_PDU_TYPE, DE_BSSGP_REQ_FOR_INTER_RAT_HO_INFO , NULL);
5876
5877
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5878
4
}
5879
/*
5880
 * 10.4.34  PS-HANDOVER-CANCEL
5881
 */
5882
static void
5883
bssgp_ps_ho_cancel(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5884
12
{
5885
12
    uint32_t curr_offset;
5886
12
    uint32_t consumed;
5887
12
    unsigned   curr_len;
5888
5889
12
    curr_offset = offset;
5890
12
    curr_len = len;
5891
5892
    /* This PDU cancels the handover for an MS. */
5893
    /* BSS to SGSN */
5894
12
    pinfo->link_dir = P2P_DIR_UL;
5895
5896
    /* TLLI TLLI/11.3.35 M TLV 6 */
5897
12
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5898
    /* Cause Cause/11.3.8 M TLV 3 */
5899
12
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_CAUSE,BSSGP_PDU_TYPE, DE_BSSGP_CAUSE, NULL);
5900
    /* Source Cell Identifier Cell Identifier/11.3.9 M TLV 10 */
5901
12
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , " - Source");
5902
    /* Target Cell Identifier (note 1) Cell Identifier/11.3.9 O TLV 10 */
5903
12
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , " - Target");
5904
    /* Target RNC Identifier (note 1) (note 2) RNC Identifier/11.3.87 C TLV 10 */
5905
12
    ELEM_OPT_TELV(0x6c,BSSGP_PDU_TYPE, BE_BSSGP_RNC_ID, " - Target");
5906
    /* Target eNB Identifier (note 1) (note 2) eNB Identifier/11.3.103 C TLV 3-n */
5907
12
    ELEM_OPT_TELV(0x7f,BSSGP_PDU_TYPE, DE_BSSGP_ENB_ID, " - Target");
5908
5909
11
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5910
11
}
5911
5912
/*
5913
 * 10.4.35  PS-HANDOVER-COMPLETE-ACK
5914
 */
5915
static void
5916
bssgp_ps_ho_complete_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5917
909
{
5918
909
    uint32_t curr_offset;
5919
909
    uint32_t consumed;
5920
909
    unsigned   curr_len;
5921
5922
909
    curr_offset = offset;
5923
909
    curr_len = len;
5924
5925
    /* This PDU provides to the BSS the Inter RAT Handover Info IE or
5926
     * E-UTRAN Inter RAT Handover Info IE or both. It is sent only if
5927
     * requested by the BSS and it shall contain at least one of the
5928
     * inter-RAT capabilities.
5929
     */
5930
5931
    /* SGSN to BSS */
5932
909
    pinfo->link_dir = P2P_DIR_DL;
5933
5934
    /* TLLI TLLI/11.3.35 M TLV 6 */
5935
909
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5936
    /* Inter RAT Handover Info Inter RAT Handover Info/11.3.94 C (note 1) TLV 3-? */
5937
909
    ELEM_OPT_TELV(0x73, BSSGP_PDU_TYPE, DE_BSSGP_INTER_RAT_HO_INFO, NULL);
5938
    /* E-UTRAN Inter RAT Handover Info E-UTRAN Inter RAT Handover Info/11.3.104 C (note 1) TLV 3-? */
5939
908
    ELEM_OPT_TELV(0x80, BSSGP_PDU_TYPE, DE_BSSGP_E_UTRAN_INTER_RAT_HO_INFO, NULL);
5940
5941
903
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5942
903
}
5943
5944
/*
5945
 * 10.4.36  OVERLOAD
5946
 */
5947
static void
5948
bssgp_overload(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5949
3
{
5950
3
    uint32_t curr_offset;
5951
3
    uint32_t consumed;
5952
3
    unsigned   curr_len;
5953
5954
3
    curr_offset = offset;
5955
3
    curr_len = len;
5956
5957
    /* Priority Class Indicator Priority Class Indicator/11.3.118   M   TLV 3 */
5958
3
    ELEM_OPT_TELV(BSSGP_IEI_PRIORITY_CLASS_INDICATOR, BSSGP_PDU_TYPE, DE_BSSGP_PRIORITY_CLASS_IND, NULL);
5959
5960
3
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
5961
3
}
5962
/*
5963
 * 10.5 PDU functional definitions and contents at LCS SAP
5964
 * 10.5.1   PERFORM-LOCATION-REQUEST
5965
 */
5966
static void
5967
bssgp_perform_loc_request(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5968
115
{
5969
115
    uint32_t curr_offset;
5970
115
    uint32_t consumed;
5971
115
    unsigned   curr_len;
5972
5973
115
    curr_offset = offset;
5974
115
    curr_len = len;
5975
5976
    /* This PDU informs the SGSN about failed resource allocation in the target BSS. */
5977
    /* BSS to SGSN */
5978
115
    pinfo->link_dir = P2P_DIR_UL;
5979
5980
    /* TLLI TLLI/11.3.35 M TLV 6 */
5981
115
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
5982
    /* IMSI IMSI/11.3.14 M TLV 5-10 */
5983
115
    ELEM_MAND_TELV(BSSGP_IEI_IMSI, BSSGP_PDU_TYPE, DE_BSSGP_IMSI, NULL, ei_bssgp_missing_mandatory_element);
5984
    /* DRX Parameters (note 1) DRX Parameters/11.3.11 O TLV 4 */
5985
115
    ELEM_OPT_TELV(0x0a, GSM_A_PDU_TYPE_GM, DE_DRX_PARAM, NULL);
5986
    /* BVCI (PCU-PTP) BVCI/11.3.6 M TLV 4 */
5987
107
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, " - (PCU-PTP)", ei_bssgp_missing_mandatory_element);
5988
    /* NSEI (PCU-PTP) NSEI/11.3.48 M TLV 4-? */
5989
107
    ELEM_MAND_TELV(BSSGP_IEI_NSEI, BSSGP_PDU_TYPE, DE_BSSGP_NSEI , " - (PCU-PTP)", ei_bssgp_missing_mandatory_element);
5990
    /* Location Type Location Type/11.3.53 M TLV 3-? */
5991
107
    ELEM_MAND_TELV(BSSGP_IEI_LOCATION_TYPE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LOC_TYPE, NULL, ei_bssgp_missing_mandatory_element);
5992
    /* Cell Identifier Cell Identifier/11.3.9 M TLV 10 */
5993
107
    ELEM_OPT_TELV(BSSGP_IEI_CELL_IDENTIFIER, BSSGP_PDU_TYPE, DE_BSSGP_CELL_ID , NULL);
5994
    /* LCS Capability (note 2) LCS Capability/11.3.59 O TLV 3-? */
5995
107
    ELEM_OPT_TELV( BSSGP_IEI_LCS_CAPABILITY , GSM_A_PDU_TYPE_GM, DE_PS_LCS_CAP , NULL);
5996
    /* LCS Priority LCS Priority/11.3.57 O TLV 3-? */
5997
107
    ELEM_OPT_TELV(BSSGP_IEI_LCS_PRIORITY, GSM_A_PDU_TYPE_BSSMAP, BE_LCS_PRIO, NULL);
5998
    /* LCS QoS LCS QoS/11.3.50 O TLV 3-? */
5999
106
    ELEM_OPT_TELV(BSSGP_IEI_LCS_QOS, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCSQOS, NULL);
6000
    /* LCS Client Type (note 3) LCS Client Type/11.3.51 C TLV 3-? */
6001
106
    ELEM_OPT_TELV(BSSGP_IEI_LCS_CLIENT_TYPE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CLIENT_TYPE, NULL);
6002
    /* Requested GPS Assistance Data (note 4) Requested GPS Assistance Data/11.3.52 O TLV 3-? */
6003
93
    ELEM_OPT_TELV(BSSGP_IEI_REQUESTED_GPS_ASSISTANCE_DATA, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_REQ_GPS_ASSIST_D, NULL);
6004
    /* IMEI (note 5) IMEI/11.3.91 O TLV 10 */
6005
92
    ELEM_OPT_TELV(0x70,GSM_A_PDU_TYPE_COMMON, DE_MID, NULL);
6006
    /* GANSS Location Type GANSS Location Type / 11.3.100 C TLV 3 */
6007
92
    ELEM_OPT_TELV(0x7c, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_LOC_TYP, NULL);
6008
    /* Requested GANSS Assistance Data (note 6) Requested GANSS Assistance Data/11.3.99 O TLV 3-? */
6009
89
    ELEM_OPT_TLV(0x7b, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_ASS_DTA, NULL);
6010
    /* eDRX Parameters (note 7) eDRX Parameters/11.3.122    O   TLV 3 */
6011
89
    ELEM_OPT_TELV(BSSGP_IEI_EDRX_PARAMETERS, BSSGP_PDU_TYPE, DE_BSSGP_EDRX_PARAMS, NULL);
6012
    /* Coverage Class   Coverage Class/11.3.124 O   TLV 3 */
6013
89
    ELEM_OPT_TELV(BSSGP_IEI_COVERAGE_CLASS, BSSGP_PDU_TYPE, DE_BSSGP_COVERAGE_CLASS, NULL);
6014
    /* MS Radio Access Capability (note 8)  MS Radio Access Capability/11.3.22  O   TLV 7   ? */
6015
89
    ELEM_IN_ELEM_MAND_TELV(BSSGP_IEI_MS_RADIO_ACCESS_CAPABILITY, GSM_A_PDU_TYPE_GM, DE_MS_RAD_ACC_CAP, NULL);
6016
    /* MultilaterationTiming Advance (note 9)   MultilaterationTiming Advance/11.3.137  O   TLV 4 */
6017
    /* MS Sync Accuracy (note 9)    MS Sync Accuracy/11.3.138   O   TLV 3 */
6018
    /* BTS Reception Accuracy Level (note 9)    BTS Reception Accuracy Level/11.3.139   O   TLV 3 */
6019
6020
89
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6021
89
}
6022
6023
/*
6024
 * 10.5.2   PERFORM-LOCATION-RESPONSE
6025
 */
6026
static void
6027
bssgp_perform_loc_response(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6028
22
{
6029
22
    uint32_t curr_offset;
6030
22
    uint32_t consumed;
6031
22
    unsigned   curr_len;
6032
6033
22
    curr_offset = offset;
6034
22
    curr_len = len;
6035
6036
    /*This PDU allows the BSS to respond to the SGSN after the completion of the location procedure. */
6037
    /* Direction: BSS to SGSN */
6038
22
    pinfo->link_dir = P2P_DIR_UL;
6039
6040
    /* TLLI TLLI/11.3.35 M TLV 6 */
6041
22
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
6042
    /* BVCI (PCU-PTP) BVCI/11.3.6 M TLV 4 */
6043
22
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, " - (PCU-PTP)", ei_bssgp_missing_mandatory_element);
6044
    /* Location Estimate (note 1) Location Estimate/11.3.54 C TLV 3-? */
6045
22
    ELEM_OPT_TELV(BSSGP_IEI_LOCATION_ESTIMATE, GSM_A_PDU_TYPE_BSSMAP, BE_LOC_EST, NULL);
6046
    /* Positioning Data Positioning Data/11.3.55 O TLV 3-? */
6047
21
    ELEM_OPT_TELV(BSSGP_IEI_POSITIONING_DATA, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_POS_DATA, NULL);
6048
    /* Deciphering Keys (note 2) Deciphering Keys/11.3.56 C TLV 3-? */
6049
17
    ELEM_OPT_TELV(BSSGP_IEI_DECIPHERING_KEYS, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_DECIPH_KEYS, NULL);
6050
    /* LCS Cause (note 3) LCS Cause/11.3.58 O TLV 3-? */
6051
11
    ELEM_OPT_TELV(BSSGP_IEI_LCS_CAUSE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CAUSE, NULL);
6052
    /* Velocity Data Velocity Data/11.3.96 O TLV 3-? */
6053
11
    ELEM_OPT_TELV(0x78, BSSGP_PDU_TYPE, DE_BSSGP_VELOCITY_DATA, NULL);
6054
    /* GANSS Positioning Data GANSS Positioning Data /11.3.101 O TLV 3-? */
6055
11
    ELEM_OPT_TELV(0x7d, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_POS_DTA, NULL);
6056
6057
11
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6058
11
}
6059
6060
/*
6061
 * 10.5.3   PERFORM-LOCATION-ABORT
6062
 */
6063
static void
6064
bssgp_perform_loc_response_abort(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6065
4
{
6066
4
    uint32_t curr_offset;
6067
4
    uint32_t consumed;
6068
4
    unsigned   curr_len;
6069
6070
4
    curr_offset = offset;
6071
4
    curr_len = len;
6072
6073
    /*This PDU allows the SGSN to request the BSS to ABORT the LCS procedure */
6074
    /* Direction: SGSN to BSS */
6075
4
    pinfo->link_dir = P2P_DIR_DL;
6076
6077
    /* TLLI TLLI/11.3.35 M TLV 6 */
6078
4
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
6079
    /* BVCI (PCU-PTP) BVCI/11.3.6 M TLV 4 */
6080
4
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, " - (PCU-PTP)", ei_bssgp_missing_mandatory_element);
6081
    /* LCS Cause LCS Cause/11.3.58 M TLV 3-? */
6082
4
    ELEM_MAND_TELV(BSSGP_IEI_LCS_CAUSE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CAUSE, NULL, ei_bssgp_missing_mandatory_element);
6083
6084
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6085
4
}
6086
6087
/*
6088
 * 10.5.4   POSITION-COMMAND
6089
 */
6090
static void
6091
bssgp_pos_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6092
462
{
6093
462
    uint32_t curr_offset;
6094
462
    uint32_t consumed;
6095
462
    unsigned   curr_len;
6096
6097
462
    curr_offset = offset;
6098
462
    curr_len = len;
6099
6100
    /* This PDU allows the BSS to request the SGSN to perform the position command procedure. */
6101
    /* Direction: BSS to SGSN */
6102
462
    pinfo->link_dir = P2P_DIR_UL;
6103
6104
    /* TLLI TLLI/11.3.35 M TLV 6 */
6105
462
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
6106
    /* BVCI (PCU-PTP) BVCI/11.3.6 M TLV 4 */
6107
462
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, " - (PCU-PTP)", ei_bssgp_missing_mandatory_element);
6108
    /* RRLP Flags RRLP Flags/11.3.60 M TLV 3 */
6109
462
    ELEM_MAND_TELV(BSSGP_IEI_RRLP_FLAGS, BSSGP_PDU_TYPE, DE_BSSGP_RRLP_FLAGS, NULL, ei_bssgp_missing_mandatory_element);
6110
    /* RRLP APDU RRLP APDU/11.3.49 M TLV 3-? */
6111
462
    ELEM_MAND_TELV(BSSGP_IEI_RRLP_APDU, BSSGP_PDU_TYPE, DE_BSSGP_RRLP_APDU, NULL, ei_bssgp_missing_mandatory_element);
6112
    /* Multilateration Timer    Multilateration Timer/11.3.136  O   TLV 3 */
6113
    /* Timing Advance Request   Timing Advance Request/11.3.140 O   TLV 3 */
6114
6115
462
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6116
462
}
6117
6118
/*
6119
 * 10.5.5   POSITION-RESPONSE
6120
 */
6121
static void
6122
bssgp_pos_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6123
7
{
6124
7
    uint32_t curr_offset;
6125
7
    uint32_t consumed;
6126
7
    unsigned   curr_len;
6127
6128
7
    curr_offset = offset;
6129
7
    curr_len = len;
6130
6131
    /* This PDU allows the SGSN to respond to the position command request procedure. */
6132
    /* Direction: SGSN to BSS */
6133
7
    pinfo->link_dir = P2P_DIR_DL;
6134
6135
    /* TLLI TLLI/11.3.35 M TLV 6 */
6136
7
    ELEM_MAND_TELV(BSSGP_IEI_TLLI, GSM_A_PDU_TYPE_RR, DE_RR_TLLI, NULL, ei_bssgp_missing_mandatory_element);
6137
    /* BVCI (PCU-PTP) BVCI/11.3.6 M TLV 4 */
6138
7
    ELEM_MAND_TELV(BSSGP_IEI_BVCI, BSSGP_PDU_TYPE, DE_BSSGP_BVCI, " - (PCU-PTP)", ei_bssgp_missing_mandatory_element);
6139
    /* RRLP Flags a) RRLP Flags/11.3.60 C TLV 3 */
6140
7
    ELEM_OPT_TELV(BSSGP_IEI_RRLP_FLAGS, BSSGP_PDU_TYPE, DE_BSSGP_RRLP_FLAGS , NULL);
6141
    /* RRLP APDU a) RRLP APDU/11.3.49 C TLV 3-? */
6142
6
    ELEM_OPT_TELV(BSSGP_IEI_RRLP_APDU, BSSGP_PDU_TYPE, DE_BSSGP_RRLP_APDU , NULL);
6143
    /* LCS Cause b) LCS Cause/11.3.58 O TLV 3-? */
6144
6
    ELEM_OPT_TELV(BSSGP_IEI_LCS_CAUSE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CAUSE, NULL);
6145
6146
6
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6147
6
}
6148
6149
/*
6150
 * 10.6 PDU functional definitions and contents at RIM SAP
6151
 * 10.6.1   RAN-INFORMATION-REQUEST
6152
 */
6153
static void
6154
bssgp_ran_inf_request(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6155
9
{
6156
9
    uint32_t curr_offset;
6157
9
    uint32_t consumed;
6158
9
    unsigned   curr_len;
6159
6160
9
    curr_offset = offset;
6161
9
    curr_len = len;
6162
6163
    /* The RAN-INFORMATION-REQUEST PDU allows a controlling BSS to request information from another BSS. */
6164
    /* Direction: BSS to SGSN - SGSN to BSS */
6165
6166
    /* Destination Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6167
9
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Destination Cell Identifier", ei_bssgp_missing_mandatory_element);
6168
    /* Source Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6169
9
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Source Cell Identifier", ei_bssgp_missing_mandatory_element);
6170
    /* RIM Container RAN-INFORMATION-REQUEST RIM Container/11.3.62a.1 M TLV 3-? */
6171
9
    ELEM_OPT_TELV(BSSGP_IEI_RAN_INF_REQUEST_RIM_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INF_REQUEST_RIM_CONT, NULL);
6172
6173
8
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6174
8
}
6175
6176
/*
6177
 * 10.6.2   RAN-INFORMATION
6178
 */
6179
static void
6180
bssgp_ran_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6181
13
{
6182
13
    uint32_t curr_offset;
6183
13
    uint32_t consumed;
6184
13
    unsigned   curr_len;
6185
6186
13
    curr_offset = offset;
6187
13
    curr_len = len;
6188
6189
    /* The RAN-INFORMATION PDU allows a serving BSS to send information to a controlling BSS. */
6190
    /* Direction: BSS to SGSN SGSN to BSS */
6191
6192
    /* Destination Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6193
13
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Destination Cell Identifier", ei_bssgp_missing_mandatory_element);
6194
    /* Source Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6195
13
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Source Cell Identifier", ei_bssgp_missing_mandatory_element);
6196
    /* RIM Container RAN-INFORMATION RIM Container/11.3.62a.2 M TLV 3-? */
6197
13
    ELEM_MAND_TELV(BSSGP_IEI_RAN_INF_RIM_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INF_RIM_CONT, " - Source Cell Identifier", ei_bssgp_missing_mandatory_element);
6198
6199
6200
13
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6201
13
}
6202
6203
/*
6204
 * 10.6.3   RAN-INFORMATION-ACK
6205
 */
6206
static void
6207
bssgp_ran_inf_request_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6208
10
{
6209
10
    uint32_t curr_offset;
6210
10
    uint32_t consumed;
6211
10
    unsigned   curr_len;
6212
6213
10
    curr_offset = offset;
6214
10
    curr_len = len;
6215
6216
    /* The RAN-INFORMATION-ACK PDU allows a controlling BSS to acknowledge the reception of a RANINFORMATION
6217
     * PDU and a serving BSS to acknowledge the reception of a RAN-INFORMATION-APPLICATIONERROR PDU.
6218
     */
6219
6220
    /* Direction: BSS to SGSN SGSN to BSS */
6221
6222
    /* Destination Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6223
10
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Destination Cell Identifier", ei_bssgp_missing_mandatory_element);
6224
    /* Source Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6225
10
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Source Cell Identifier", ei_bssgp_missing_mandatory_element);
6226
    /* RIM Container RAN-INFORMATION-ACK RIM Container/11.3.62a.3 M TLV 3-? */
6227
10
    ELEM_MAND_TELV(BSSGP_IEI_RAN_INF_ACK_RIM_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INFORMATION_ACK_RIM_CONT, NULL, ei_bssgp_missing_mandatory_element);
6228
6229
10
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6230
10
}
6231
6232
/*
6233
 * 10.6.4   RAN-INFORMATION-ERROR
6234
 */
6235
6236
static void
6237
bssgp_ran_inf_err(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6238
12
{
6239
12
    uint32_t curr_offset;
6240
12
    uint32_t consumed;
6241
12
    unsigned   curr_len;
6242
6243
12
    curr_offset = offset;
6244
12
    curr_len = len;
6245
6246
    /* The RAN-INFORMATION-ERROR PDU allows a BSS to send an error PDU back to an originating BSS as a response
6247
     * to a RAN-INFORMATION, a RAN-INFORMATION-REQUEST, a RAN-INFORMATION-ACK or a RANINFORMATION-APPLICATION-ERROR PDU.
6248
     */
6249
    /* Direction: BSS to SGSN SGSN to BSS */
6250
6251
12
    pinfo->flags.in_error_pkt = true;
6252
6253
    /* Destination Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6254
12
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Destination Cell Identifier", ei_bssgp_missing_mandatory_element);
6255
    /* Source Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6256
12
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Source Cell Identifier", ei_bssgp_missing_mandatory_element);
6257
    /* RIM Container RAN-INFORMATION-ERROR RIM Container/11.3.62a.4 M TLV 3-? */
6258
12
    ELEM_MAND_TELV(BSSGP_IEI_RAN_INF_ERROR_RIM_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INFORMATION_ERROR_RIM_CONT, NULL, ei_bssgp_missing_mandatory_element);
6259
6260
12
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6261
12
}
6262
/*
6263
 * 10.6.5   RAN-INFORMATION-APPLICATION-ERROR
6264
 */
6265
static void
6266
bssgp_ran_inf_app_err(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6267
19
{
6268
19
    uint32_t curr_offset;
6269
19
    uint32_t consumed;
6270
19
    unsigned   curr_len;
6271
6272
19
    curr_offset = offset;
6273
19
    curr_len = len;
6274
6275
    /* The RAN-INFORMATION-APPLICATION-ERROR PDU allows a controlling BSS to inform the serving BSS about
6276
     * erroneous application information in a previously received RAN-INFORMATION PDU.
6277
     */
6278
6279
    /* Direction: BSS to SGSN SGSN to BSS */
6280
6281
19
    pinfo->flags.in_error_pkt = true;
6282
6283
    /* Destination Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6284
19
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Destination Cell Identifier", ei_bssgp_missing_mandatory_element);
6285
    /* Source Cell Identifier RIM Routing Information/11.3.70 M TLV 3-? */
6286
19
    ELEM_MAND_TELV(BSSGP_IEI_RIM_ROUTING_INFORMATION, BSSGP_PDU_TYPE, DE_BSSGP_RIM_ROUTING_INF, " - Source Cell Identifier", ei_bssgp_missing_mandatory_element);
6287
    /* RIM Container RAN-INFORMATION-APPLICATION ERROR RIM Container/11.3.62a.5 M TLV 3-? */
6288
19
    ELEM_MAND_TELV(BSSGP_IEI_RAN_INF_APP_ERROR_RIM_CONTAINER, BSSGP_PDU_TYPE, DE_BSSGP_RAN_INF_APP_ERROR_RIM_CONT, NULL, ei_bssgp_missing_mandatory_element);
6289
6290
19
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6291
19
}
6292
6293
/*
6294
 * 10.7 PDU functional definitions and contents at MBMS SAP
6295
 * 10.7.1   MBMS-SESSION-START-REQUEST
6296
 */
6297
static void
6298
bssgp_mbms_session_start_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6299
25
{
6300
25
    uint32_t curr_offset;
6301
25
    uint32_t consumed;
6302
25
    unsigned   curr_len;
6303
6304
25
    curr_offset = offset;
6305
25
    curr_len = len;
6306
6307
    /* This PDU allows a SGSN to request BSS to start an MBMS session. */
6308
6309
    /* Direction: SGSN to BSS */
6310
25
    pinfo->link_dir = P2P_DIR_DL;
6311
6312
    /* TMGI TMGI/11.3.77 M TLV 3-8  */
6313
25
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
6314
    /* MBMS Session Identity MBMS Session Identity/11.3.71 O TLV 3 */
6315
25
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
6316
    /* ABQP ABQP/11.3.43 M TLV 13-? */
6317
23
    ELEM_MAND_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS, NULL, ei_bssgp_missing_mandatory_element);
6318
    /* MBMS Service Area Identity List MBMS Service Area Identity List/11.3.73 M TLV 4-? */
6319
23
    ELEM_MAND_TELV(0x5f, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SAI_LIST, NULL, ei_bssgp_missing_mandatory_element);
6320
    /* MBMS Routing Area List MBMS Routing Area List/11.3.75 M TLV 3-? */
6321
23
    ELEM_MAND_TELV(0x61, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_RA_LIST, NULL, ei_bssgp_missing_mandatory_element);
6322
    /* MBMS Session Duration MBMS Session Duration/11.3.72 M TLV 3-? */
6323
23
    ELEM_MAND_TELV(0x5e, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_DUR, NULL, ei_bssgp_missing_mandatory_element);
6324
    /* MBMS Session Information MBMS Session Information/11.3.76 M TLV 3 */
6325
23
    ELEM_MAND_TELV(0x62, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_INF, NULL, ei_bssgp_missing_mandatory_element);
6326
    /* Time to MBMS Data Transfer Time to MBMS Data Transfer/11.3.92 M TLV 3 */
6327
23
    ELEM_MAND_TELV(0x71, BSSGP_PDU_TYPE, DE_BSSGP_TIME_TO_MBMS_DATA_TRAN, NULL, ei_bssgp_missing_mandatory_element);
6328
    /* Allocation/Retention Priority Priority/11.3.27 O TLV 3 */
6329
23
    ELEM_OPT_TELV(0x17, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL);
6330
    /* MBMS Session Repetition Number MBMS Session Repetition Number/11.3.93 O TLV 3 */
6331
15
    ELEM_OPT_TELV(0x72, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_REP_NO, NULL);
6332
6333
6334
15
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6335
15
}
6336
/*
6337
 * 10.7.2   MBMS-SESSION-START-RESPONSE
6338
 */
6339
static void
6340
bssgp_mbms_session_start_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6341
3
{
6342
3
    uint32_t curr_offset;
6343
3
    uint32_t consumed;
6344
3
    unsigned   curr_len;
6345
6346
3
    curr_offset = offset;
6347
3
    curr_len = len;
6348
6349
    /* This PDU allows a BSS to acknowledge to SGSN that it will start an MBMS session or to indicate to SGSN why the
6350
     * MBMS Service Context cannot be created or is released by the BSS.
6351
     */
6352
6353
    /* Direction: BSS to SGSN */
6354
3
    pinfo->link_dir = P2P_DIR_UL;
6355
6356
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
6357
3
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
6358
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
6359
3
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
6360
    /* MBMS Response MBMS Response/ 11.3.74 M TLV 3 */
6361
2
    ELEM_OPT_TELV(0x60, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_RESPONSE, NULL);
6362
6363
2
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6364
2
}
6365
6366
/*
6367
 * 10.7.3   MBMS-SESSION-STOP-REQUEST
6368
 */
6369
static void
6370
bssgp_mbms_session_stop_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6371
3
{
6372
3
    uint32_t curr_offset;
6373
3
    uint32_t consumed;
6374
3
    unsigned   curr_len;
6375
6376
3
    curr_offset = offset;
6377
3
    curr_len = len;
6378
6379
    /* This PDU allows a SGSN to request BSS to stop an MBMS session. */
6380
6381
    /* Direction: SGSN to BSS */
6382
3
    pinfo->link_dir = P2P_DIR_DL;
6383
6384
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
6385
3
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
6386
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
6387
3
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
6388
    /* MBMS Stop Cause MBMS Stop Cause/11.3.78 M TLV 3 */
6389
1
    ELEM_OPT_TELV(0x63, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_STOP_CAUSE, NULL);
6390
6391
1
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6392
1
}
6393
/*
6394
 * 10.7.4   MBMS-SESSION-STOP-RESPONSE
6395
 */
6396
static void
6397
bssgp_mbms_session_stop_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6398
5
{
6399
5
    uint32_t curr_offset;
6400
5
    uint32_t consumed;
6401
5
    unsigned   curr_len;
6402
6403
5
    curr_offset = offset;
6404
5
    curr_len = len;
6405
6406
    /* This PDU allows a BSS to acknowledge to SGSN that it will stop an MBMS session. */
6407
6408
    /* Direction: BSS to SGSN */
6409
5
    pinfo->link_dir = P2P_DIR_UL;
6410
6411
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
6412
5
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
6413
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
6414
5
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
6415
    /* MBMS Response MBMS Response/ 11.3.74 M TLV 3 */
6416
4
    ELEM_OPT_TELV(0x60, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_RESPONSE, NULL);
6417
6418
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6419
4
}
6420
/*
6421
 * 10.7.5   MBMS-SESSION-UPDATE-REQUEST
6422
 */
6423
static void
6424
bssgp_mbms_session_update_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6425
21
{
6426
21
    uint32_t curr_offset;
6427
21
    uint32_t consumed;
6428
21
    unsigned   curr_len;
6429
6430
21
    curr_offset = offset;
6431
21
    curr_len = len;
6432
6433
    /* This PDU allows an SGSN to request BSS to update the MBMS service area list
6434
     * of an ongoing MBMS broadcast service session.
6435
     */
6436
6437
    /* Direction: BSS to SGSN */
6438
21
    pinfo->link_dir = P2P_DIR_UL;
6439
6440
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
6441
21
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
6442
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
6443
21
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
6444
    /* ABQP ABQP/11.3.43 M TLV 13-? */
6445
20
    ELEM_MAND_TELV(0x3a , GSM_A_PDU_TYPE_GM, DE_QOS, NULL, ei_bssgp_missing_mandatory_element);
6446
    /* MBMS Service Area Identity List MBMS Service Area Identity List/11.3.73 M TLV 4-? */
6447
20
    ELEM_MAND_TELV(0x5f, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SAI_LIST, NULL, ei_bssgp_missing_mandatory_element);
6448
    /* MBMS Routing Area List MBMS Routing Area List/11.3.75 M TLV 3-? */
6449
20
    ELEM_MAND_TELV(0x61, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_RA_LIST, NULL, ei_bssgp_missing_mandatory_element);
6450
    /* MBMS Session Duration MBMS Session Duration/11.3.72 M TLV 3-? */
6451
20
    ELEM_MAND_TELV(0x5e, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_DUR, NULL, ei_bssgp_missing_mandatory_element);
6452
    /* MBMS Session Information MBMS Session Information/11.3.76 M TLV 3 */
6453
20
    ELEM_MAND_TELV(0x62, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_INF, NULL, ei_bssgp_missing_mandatory_element);
6454
    /* Time to MBMS Data Transfer Time to MBMS Data Transfer/11.3.92 M TLV 3 */
6455
20
    ELEM_MAND_TELV(0x71, BSSGP_PDU_TYPE, DE_BSSGP_TIME_TO_MBMS_DATA_TRAN, NULL, ei_bssgp_missing_mandatory_element);
6456
    /* Allocation/Retention Priority Priority/11.3.27 O TLV 3 */
6457
20
    ELEM_OPT_TELV(0x17, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL);
6458
    /* MBMS Session Repetition Number MBMS Session Repetition Number/11.3.93 O TLV 3 */
6459
16
    ELEM_OPT_TELV(0x72, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_REP_NO, NULL);
6460
6461
16
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6462
16
}
6463
/*
6464
 * 10.7.6   MBMS-SESSION-UPDATE-RESPONSE
6465
 */
6466
static void
6467
bssgp_mbms_session_uptate_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6468
7
{
6469
7
    uint32_t curr_offset;
6470
7
    uint32_t consumed;
6471
7
    unsigned   curr_len;
6472
6473
7
    curr_offset = offset;
6474
7
    curr_len = len;
6475
6476
    /* This PDU allows a BSS to acknowledge to SGSN that it will update the MBMS service area list of an ongoing MBMS
6477
     * broadcast service session or to indicate to SGSN why the MBMS Service Context cannot be created or is released by the BSS.
6478
     */
6479
6480
    /* Direction: BSS to SGSN */
6481
7
    pinfo->link_dir = P2P_DIR_UL;
6482
6483
    /* TMGI TMGI/ 11.3.77 M TLV 3-8 */
6484
7
    ELEM_MAND_TELV(0x5c, GSM_A_PDU_TYPE_GM, DE_TMGI, NULL, ei_bssgp_missing_mandatory_element);
6485
    /* MBMS Session Identity MBMS Session Identity/ 11.3.71 O TLV 3 */
6486
7
    ELEM_OPT_TELV(0x5d, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_SESSION_ID, NULL);
6487
    /* MBMS Response MBMS Response/ 11.3.74 M TLV 3 */
6488
5
    ELEM_OPT_TELV(0x60, BSSGP_PDU_TYPE, DE_BSSGP_MBMS_RESPONSE, NULL);
6489
6490
4
    EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_bssgp_extraneous_data);
6491
4
}
6492
6493
static const value_string bssgp_msg_strings[] = {
6494
/* 0x00 */  { BSSGP_PDU_DL_UNITDATA,                  "DL-UNITDATA" },                  /* 10.2.1 DL-UNITDATA */
6495
/* 0x01 */  { BSSGP_PDU_UL_UNITDATA,                  "UL-UNITDATA" },                  /* 10.2.2 UL-UNITDATA */
6496
/* 0x02 */  { BSSGP_PDU_RA_CAPABILITY,                "RA-CAPABILITY" },                /* 10.2.3 RA-CAPABILITY */
6497
/* NOTE 1: This value was allocated in an earlier version of the protocol and shall not be used */
6498
/* 0x03 */  { BSSGP_PDU_PTM_UNITDATA,                 "Reserved" },                     /* 10.2.4 (void) */
6499
/* 0x04 */  { BSSGP_PDU_DL_MBMS_UNITDATA,             "DL-MBMS-UNITDATA" },             /* 10.2.5 DL-MBMS-UNITDATA */
6500
/* 0x05 */  { BSSGP_PDU_UL_MBMS_UNITDATA,             "UL-MBMS-UNITDATA" },             /* 10.2.6 UL-MBMS-UNITDATA */
6501
/* 0x06 */  { BSSGP_PDU_PAGING_PS,                    "PAGING-PS" },                    /* 10.3.1 PAGING PS */
6502
/* 0x07 */  { BSSGP_PDU_PAGING_CS,                    "PAGING-CS" },                    /* 10.3.2 PAGING CS */
6503
/* 0x08 */  { BSSGP_PDU_RA_CAPABILITY_UPDATE,         "RA-CAPABILITY-UPDATE" },         /* 10.3.3 RA-CAPABILITY-UPDATE */
6504
/* 0x09 */  { BSSGP_PDU_RA_CAPABILITY_UPDATE_ACK,     "RA-CAPABILITY-UPDATE-ACK" },     /* 10.3.4 RA-CAPABILITY-UPDATE-ACK */
6505
/* 0x0a */  { BSSGP_PDU_RADIO_STATUS,                 "RADIO-STATUS" },                 /* 10.3.5 RADIO-STATUS */
6506
/* 0x0b */  { BSSGP_PDU_SUSPEND,                      "SUSPEND" },                      /* 10.3.6 SUSPEND */
6507
/* 0x0c */  { BSSGP_PDU_SUSPEND_ACK,                  "SUSPEND-ACK" },                  /* 10.3.7 SUSPEND-ACK */
6508
/* 0x0d */  { BSSGP_PDU_SUSPEND_NACK,                 "SUSPEND-NACK" },                 /* 10.3.8 SUSPEND-NACK */
6509
/* 0x0e */  { BSSGP_PDU_RESUME,                       "RESUME" },                       /* 10.3.9 RESUME */
6510
/* 0x0f */  { BSSGP_PDU_RESUME_ACK,                   "RESUME-ACK" },                   /* 10.3.10 RESUME-ACK */
6511
/* 0x10 */  { BSSGP_PDU_RESUME_NACK,                  "RESUME-NACK" },                  /* 10.3.11 RESUME-NACK */
6512
/* 0x11 */  { BSSGP_PDU_PAGING_PS_REJECT,             "PAGING-PS-REJECT" },             /* 10.3.14 PAGING PS REJECT */
6513
/* 0x12 */  { BSSGP_PDU_DUMMY_PAGING_PS,              "DUMMY-PAGING-PS" },              /* 10.3.12 DUMMY PAGING PS */
6514
/* 0x13 */  { BSSGP_PDU_DUMMY_PAGING_PS_RESPONSE,     "DUMMY-PAGING-PS-RESPONSE" },     /* 10.3.13 DUMMY PAGING PS RESPONSE */
6515
6516
/* 0x14 to 0x1f Reserved */
6517
/* 0x14 */  { BSSGP_PDU_MS_REG_ENQ,                    "MS-REGISTRATION-ENQUIRY" },          /* 10.3.15 MS REGISTRATION ENQUIRY */
6518
/* 0x15 */  { BSSGP_PDU_MS_REG_ENQ_RESP,               "MS-REGISTRATION-ENQUIRY-RESPONSE" }, /* 10.3.16 MS REGISTRATION ENQUIRY RESPONSE */
6519
/* 0x16 */  { BSSGP_PDU_RESERVED_0X16,                 "Reserved" },                    /*  */
6520
/* 0x17 */  { BSSGP_PDU_RESERVED_0X17,                 "Reserved" },                    /*  */
6521
/* 0x18 */  { BSSGP_PDU_RESERVED_0X18,                 "Reserved" },                    /*  */
6522
/* 0x19 */  { BSSGP_PDU_RESERVED_0X19,                 "Reserved" },                    /*  */
6523
/* 0x1a */  { BSSGP_PDU_RESERVED_0X1A,                 "Reserved" },                    /*  */
6524
/* 0x1b */  { BSSGP_PDU_RESERVED_0X1B,                 "Reserved" },                    /*  */
6525
/* 0x1c */  { BSSGP_PDU_RESERVED_0X1C,                 "Reserved" },                    /*  */
6526
/* 0x1d */  { BSSGP_PDU_RESERVED_0X1D,                 "Reserved" },                    /*  */
6527
/* 0x1e */  { BSSGP_PDU_RESERVED_0X1E,                 "Reserved" },                    /*  */
6528
/* 0x1f */  { BSSGP_PDU_RESERVED_0X1F,                 "Reserved" },                    /*  */
6529
6530
/* 0x20 */  { BSSGP_PDU_BVC_BLOCK,                    "BVC-BLOCK" },                    /* 10.4.8 BVC-BLOCK */
6531
/* 0x21 */  { BSSGP_PDU_BVC_BLOCK_ACK,                "BVC-BLOCK-ACK" },                /* 10.4.9 BVC-BLOCK-ACK */
6532
/* 0x22 */  { BSSGP_PDU_BVC_RESET,                    "BVC-RESET" },                    /* 10.4.12 BVC-RESET */
6533
/* 0x23 */  { BSSGP_PDU_BVC_RESET_ACK,                "BVC-RESET-ACK" },                /* 10.4.13 BVC-RESET-ACK */
6534
/* 0x24 */  { BSSGP_PDU_BVC_UNBLOCK,                  "UNBLOCK" },                      /* 10.4.10 BVC-UNBLOCK */
6535
/* 0x25 */  { BSSGP_PDU_BVC_UNBLOCK_ACK,              "UNBLOCK-ACK" },                  /* 10.4.11 BVC-UNBLOCK-ACK */
6536
/* 0x26 */  { BSSGP_PDU_FLOW_CONTROL_BVC,             "FLOW-CONTROL-BVC" },             /* 10.4.4 FLOW-CONTROL-BVC */
6537
/* 0x27 */  { BSSGP_PDU_FLOW_CONTROL_BVC_ACK,         "FLOW-CONTROL-BVC-ACK" },         /* 10.4.5 FLOW-CONTROL-BVC-ACK */
6538
/* 0x28 */  { BSSGP_PDU_FLOW_CONTROL_MS,              "FLOW-CONTROL-MS" },              /* 10.4.6 FLOW-CONTROL-MS */
6539
/* 0x29 */  { BSSGP_PDU_FLOW_CONTROL_MS_ACK,          "FLOW-CONTROL-MS-ACK" },          /* 10.4.7 FLOW-CONTROL-MS-ACK */
6540
/* 0x2a */  { BSSGP_PDU_FLUSH_LL,                     "FLUSH-LL" },                     /* 10.4.1 FLUSH-LL */
6541
/* 0x2b */  { BSSGP_PDU_FLUSH_LL_ACK,                 "FLUSH_LL_ACK" },                 /* 10.4.2 FLUSH-LL-ACK */
6542
/* 0x2c */  { BSSGP_PDU_LLC_DISCARDED,                "LLC-DISCARDED" },                /* 10.4.3 LLC-DISCARDED */
6543
/* 0x2d */  { BSSGP_PDU_FLOW_CONTROL_PFC,             "FLOW-CONTROL-PFC" },             /* 10.4.24 FLOW-CONTROL-PFC */
6544
/* 0x2e */  { BSSGP_PDU_FLOW_CONTROL_PFC_ACK,         "FLOW-CONTROL-PFC-ACK" },         /* 10.4.25 FLOW-CONTROL-PFC-ACK */
6545
/* 0x2f to 0x3f Reserved */
6546
/* 0x2f */  { BSSGP_PDU_RESERVED_0X2F,                 "Reserved" },                    /*  */
6547
/* 0x30 */  { BSSGP_PDU_RESERVED_0X30,                 "Reserved" },                    /*  */
6548
/* 0x31 */  { BSSGP_PDU_RESERVED_0X31,                 "Reserved" },                    /*  */
6549
/* 0x32 */  { BSSGP_PDU_RESERVED_0X32,                 "Reserved" },                    /*  */
6550
/* 0x33 */  { BSSGP_PDU_RESERVED_0X33,                 "Reserved" },                    /*  */
6551
/* 0x34 */  { BSSGP_PDU_RESERVED_0X34,                 "Reserved" },                    /*  */
6552
/* 0x35 */  { BSSGP_PDU_RESERVED_0X35,                 "Reserved" },                    /*  */
6553
/* 0x36 */  { BSSGP_PDU_RESERVED_0X36,                 "Reserved" },                    /*  */
6554
/* 0x37 */  { BSSGP_PDU_RESERVED_0X37,                 "Reserved" },                    /*  */
6555
/* 0x38 */  { BSSGP_PDU_RESERVED_0X38,                 "Reserved" },                    /*  */
6556
/* 0x39 */  { BSSGP_PDU_RESERVED_0X39,                 "Reserved" },                    /*  */
6557
/* 0x3a */  { BSSGP_PDU_RESERVED_0X3A,                 "Reserved" },                    /*  */
6558
/* 0x3b */  { BSSGP_PDU_RESERVED_0X3B,                 "Reserved" },                    /*  */
6559
/* 0x3c */  { BSSGP_PDU_RESERVED_0X3C,                 "Reserved" },                    /*  */
6560
/* 0x3d */  { BSSGP_PDU_RESERVED_0X3D,                 "Reserved" },                    /*  */
6561
/* 0x3e */  { BSSGP_PDU_RESERVED_0X3E,                 "Reserved" },                    /*  */
6562
/* 0x3f */  { BSSGP_PDU_RESERVED_0X3F,                 "Reserved" },                    /*  */
6563
6564
/* 0x40 */  { BSSGP_PDU_SGSN_INVOKE_TRACE,             "SGSN-INVOKE-TRACE" },           /* 10.4.15 SGSN-INVOKE-TRACE */
6565
/* 0x41 */  { BSSGP_PDU_STATUS,                        "STATUS" },                      /* 10.4.14 STATUS */
6566
/* 0x42 */  { BSSGP_PDU_OVERLOAD,                      "OVERLOAD" },                    /* 10.4.36 OVERLOAD */
6567
/* 0x43 to 0x4f Reserved */
6568
/* 0x43 */  { BSSGP_PDU_RESERVED_0X43,                 "Reserved" },                    /*  */
6569
/* 0x44 */  { BSSGP_PDU_RESERVED_0X44,                 "Reserved" },                    /*  */
6570
/* 0x45 */  { BSSGP_PDU_RESERVED_0X45,                 "Reserved" },                    /*  */
6571
/* 0x46 */  { BSSGP_PDU_RESERVED_0X46,                 "Reserved" },                    /*  */
6572
/* 0x47 */  { BSSGP_PDU_RESERVED_0X47,                 "Reserved" },                    /*  */
6573
/* 0x48 */  { BSSGP_PDU_RESERVED_0X48,                 "Reserved" },                    /*  */
6574
/* 0x49 */  { BSSGP_PDU_RESERVED_0X49,                 "Reserved" },                    /*  */
6575
/* 0x4a */  { BSSGP_PDU_RESERVED_0X4A,                 "Reserved" },                    /*  */
6576
/* 0x4b */  { BSSGP_PDU_RESERVED_0X4B,                 "Reserved" },                    /*  */
6577
/* 0x4c */  { BSSGP_PDU_RESERVED_0X4C,                 "Reserved" },                    /*  */
6578
/* 0x4d */  { BSSGP_PDU_RESERVED_0X4D,                 "Reserved" },                    /*  */
6579
/* 0x4e */  { BSSGP_PDU_RESERVED_0X4E,                 "Reserved" },                    /*  */
6580
/* 0x4f */  { BSSGP_PDU_RESERVED_0X4F,                 "Reserved" },                    /*  */
6581
/* 0x50 */  { BSSGP_PDU_DOWNLOAD_BSS_PFC,              "DOWNLOAD-BSS-PFC" },            /* 10.4.16  DOWNLOAD-BSS-PFC */
6582
/* 0x51 */  { BSSGP_PDU_CREATE_BSS_PFC,                "CREATE-BSS-PFC" },              /* 10.4.17 CREATE-BSS-PFC */
6583
/* 0x52 */  { BSSGP_PDU_CREATE_BSS_PFC_ACK,            "CREATE-BSS-PFC-ACK" },          /* 10.4.18 CREATE-BSS-PFC-ACK */
6584
/* 0x53 */  { BSSGP_PDU_CREATE_BSS_PFC_NACK,           "CREATE-BSS-PFC-NACK" },         /* 10.4.19 CREATE-BSS-PFC-NACK */
6585
/* 0x54 */  { BSSGP_PDU_MODIFY_BSS_PFC,                "MODIFY-BSS-PFC" },              /* 10.4.20 MODIFY-BSS-PFC */
6586
/* 0x55 */  { BSSGP_PDU_MODIFY_BSS_PFC_ACK,            "MODIFY-BSS-PFC-ACK" },          /* 10.4.21 MODIFY-BSS-PFC-ACK */
6587
/* 0x56 */  { BSSGP_PDU_DELETE_BSS_PFC,                "DELETE-BSS-PFC" },              /* 10.4.22 DELETE-BSS-PFC */
6588
/* 0x57 */  { BSSGP_PDU_DELETE_BSS_PFC_ACK,            "DELETE-BSS-PFC-ACK" },          /* 10.4.23 DELETE-BSS-PFC-ACK */
6589
/* 0x58 */  { BSSGP_PDU_DELETE_BSS_PFC_REQ,            "DELETE-BSS-PFC-REQ" },          /* 10.4.26 DELETE-BSS-PFC-REQ */
6590
/* 0x59 */  { BSSGP_PDU_PS_HANDOVER_REQUIRED,          "PS-HANDOVER-REQUIRED" },        /* 10.4.27 PS-HANDOVER-REQUIRED */
6591
/* 0x5a */  { BSSGP_PDU_PS_HANDOVER_REQUIRED_ACK,      "PS-HANDOVER-REQUIRED-ACK" },    /* 10.4.28 PS-HANDOVER-REQUIRED-ACK */
6592
/* 0x5b */  { BSSGP_PDU_PS_HANDOVER_REQUIRED_NACK,     "PS-HANDOVER-REQUIRED-NACK" },   /* 10.4.29 PS-HANDOVER-REQUIRED-NACK */
6593
/* 0x5c */  { BSSGP_PDU_PS_HANDOVER_REQUEST,           "PS-HANDOVER-REQUEST" },         /* 10.4.30 PS-HANDOVER-REQUEST */
6594
/* 0x5d */  { BSSGP_PDU_PS_HANDOVER_REQUEST_ACK,       "PS-HANDOVER-REQUEST-ACK" },     /* 10.4.31 PS-HANDOVER-REQUEST-ACK */
6595
/* 0x5e */  { BSSGP_PDU_PS_HANDOVER_REQUEST_NACK,      "PS-HANDOVER-REQUEST-NACK" },    /* 10.4.31 10.4.32 PS-HANDOVER-REQUEST-NACK */
6596
6597
/* 0x5f */  { BSSGP_PDU_RESERVED_0X5F,                 "Reserved" },                    /*  */
6598
6599
/* 0x60 */  { BSSGP_PDU_PERFORM_LOCATION_REQUEST,     "PERFORM-LOCATION-REQUEST" },     /* 10.5.1 PERFORM-LOCATION-REQUEST */
6600
/* 0x61 */  { BSSGP_PDU_PERFORM_LOCATION_RESPONSE,    "PERFORM-LOCATION-RESPONSE" },    /* 10.5.2 PERFORM-LOCATION-RESPONSE */
6601
/* 0x62 */  { BSSGP_PDU_PERFORM_LOCATION_ABORT,       "PERFORM-LOCATION-ABORT" },       /* 10.5.3 PERFORM-LOCATION-ABORT */
6602
/* 0x63 */  { BSSGP_PDU_POSITION_COMMAND,             "POSITION-COMMAND" },             /* 10.5.4 POSITION-COMMAND */
6603
/* 0x64 */  { BSSGP_PDU_POSITION_RESPONSE,            "POSITION-RESPONSE" },            /* 10.5.5 POSITION-RESPONSE */
6604
6605
/* 0x65 */  { BSSGP_PDU_RESERVED_0X65,                 "Reserved" },                    /*  */
6606
/* 0x66 */  { BSSGP_PDU_RESERVED_0X66,                 "Reserved" },                    /*  */
6607
/* 0x67 */  { BSSGP_PDU_RESERVED_0X67,                 "Reserved" },                    /*  */
6608
/* 0x68 */  { BSSGP_PDU_RESERVED_0X68,                 "Reserved" },                    /*  */
6609
/* 0x69 */  { BSSGP_PDU_RESERVED_0X69,                 "Reserved" },                    /*  */
6610
/* 0x6a */  { BSSGP_PDU_RESERVED_0X6A,                 "Reserved" },                    /*  */
6611
/* 0x6b */  { BSSGP_PDU_RESERVED_0X6B,                 "Reserved" },                    /*  */
6612
/* 0x6b */  { BSSGP_PDU_RESERVED_0X6C,                 "Reserved" },                    /*  */
6613
/* 0x6d */  { BSSGP_PDU_RESERVED_0X6D,                 "Reserved" },                    /*  */
6614
/* 0x6e */  { BSSGP_PDU_RESERVED_0X6E,                 "Reserved" },                    /*  */
6615
/* 0x6f */  { BSSGP_PDU_RESERVED_0X6F,                 "Reserved" },                    /*  */
6616
6617
/* 0x70 */  { BSSGP_PDU_RAN_INFORMATION,              "RAN-INFORMATION" },              /* 10.6.2 RAN-INFORMATION */
6618
/* 0x71 */  { BSSGP_PDU_RAN_INFORMATION_REQUEST,      "RAN-INFORMATION-REQUEST" },      /* 10.6.1 RAN-INFORMATION-REQUEST */
6619
/* 0x72 */  { BSSGP_PDU_RAN_INFORMATION_ACK,          "RAN-INFORMATION-ACK" },          /* 10.6.3 RAN-INFORMATION-ACK */
6620
/* 0x73 */  { BSSGP_PDU_RAN_INFORMATION_ERROR,        "RAN-INFORMATION-ERROR" },        /* 10.6.4 RAN-INFORMATION-ERROR */
6621
/* 0x74 */  { BSSGP_PDU_RAN_INFORMATION_APP_ERROR,    "RAN-INFORMATION-APPLICATION-ERROR" }, /* 10.6.5 RAN-INFORMATION-APPLICATION-ERROR */
6622
/* 0x75 */  { BSSGP_PDU_RESERVED_0X75,                 "Reserved" },                    /*  */
6623
/* 0x76 */  { BSSGP_PDU_RESERVED_0X76,                 "Reserved" },                    /*  */
6624
/* 0x77 */  { BSSGP_PDU_RESERVED_0X77,                 "Reserved" },                    /*  */
6625
/* 0x78 */  { BSSGP_PDU_RESERVED_0X78,                 "Reserved" },                    /*  */
6626
/* 0x79 */  { BSSGP_PDU_RESERVED_0X79,                 "Reserved" },                    /*  */
6627
/* 0x7a */  { BSSGP_PDU_RESERVED_0X7A,                 "Reserved" },                    /*  */
6628
/* 0x7b */  { BSSGP_PDU_RESERVED_0X7B,                 "Reserved" },                    /*  */
6629
/* 0x7c */  { BSSGP_PDU_RESERVED_0X7C,                 "Reserved" },                    /*  */
6630
/* 0x7d */  { BSSGP_PDU_RESERVED_0X7D,                 "Reserved" },                    /*  */
6631
/* 0x7e */  { BSSGP_PDU_RESERVED_0X7E,                 "Reserved" },                    /*  */
6632
/* 0x7f */  { BSSGP_PDU_RESERVED_0X7F,                 "Reserved" },                    /*  */
6633
/* 0x80 */  { BSSGP_PDU_MBMS_SESSION_START_REQ,        "MBMS-SESSION-START-REQUEST" },  /* 10.7.1   MBMS-SESSION-START-REQUEST */
6634
/* 0x81 */  { BSSGP_PDU_MBMS_SESSION_START_RESP,       "MBMS-SESSION-START-RESPONSE" }, /* 10.7.2   MBMS-SESSION-START-RESPONSE */
6635
/* 0x82 */  { BSSGP_PDU_MBMS_SESSION_STOP_REQ,         "MBMS-SESSION-STOP-REQUEST" },   /* 10.7.3   MBMS-SESSION-STOP-REQUEST */
6636
/* 0x83 */  { BSSGP_PDU_MBMS_SESSION_STOP_RESP,        "MBMS-SESSION-STOP-RESPONSE" },  /* 10.7.4   MBMS-SESSION-STOP-RESPONSE */
6637
/* 0x84 */  { BSSGP_PDU_MBMS_SESSION_UPDATE_REQ,       "MBMS-SESSION-UPDATE-REQUEST" }, /* 10.7.5   MBMS-SESSION-UPDATE-REQUEST */
6638
/* 0x85 */  { BSSGP_PDU_MBMS_SESSION_UPDATE_RESP,      "MBMS-SESSION-UPDATE-RESPONSE" },/* 10.7.6   MBMS-SESSION-UPDATE-RESPONSE */
6639
6640
/* 0x86 */  { BSSGP_PDU_RESERVED_0X86,                 "Reserved" },                    /*  */
6641
/* 0x87 */  { BSSGP_PDU_RESERVED_0X87,                 "Reserved" },                    /*  */
6642
/* 0x88 */  { BSSGP_PDU_RESERVED_0X88,                 "Reserved" },                    /*  */
6643
/* 0x89 */  { BSSGP_PDU_RESERVED_0X89,                 "Reserved" },                    /*  */
6644
/* 0x8a */  { BSSGP_PDU_RESERVED_0X8A,                 "Reserved" },                    /*  */
6645
/* 0x8b */  { BSSGP_PDU_RESERVED_0X8B,                 "Reserved" },                    /*  */
6646
/* 0x8c */  { BSSGP_PDU_RESERVED_0X8C,                 "Reserved" },                    /*  */
6647
/* 0x8d */  { BSSGP_PDU_RESERVED_0X8D,                 "Reserved" },                    /*  */
6648
/* 0x8e */  { BSSGP_PDU_RESERVED_0X8E,                 "Reserved" },                    /*  */
6649
/* 0x8f */  { BSSGP_PDU_RESERVED_0X8F,                 "Reserved" },                    /*  */
6650
/* 0x90 */  { BSSGP_PDU_RESERVED_0X90,                 "Reserved" },                    /*  */
6651
6652
/* 0x91 */  {BSSGP_PDU_PS_HANDOVER_COMPLETE,           "PS-HANDOVER-COMPLETE" },        /* 10.4.33  PS-HANDOVER-COMPLETE */
6653
/* 0x92 */  {BSSGP_PDU_PS_HANDOVER_CANCEL,             "PS-HANDOVER-CANCEL" },          /* 10.4.34  PS-HANDOVER-CANCEL */
6654
/* 0x93 */  {BSSGP_PDU_PS_HANDOVER_COMPLETE_ACK,       "PS-HANDOVER-COMPLETE-ACK" },    /* 10.4.35  PS-HANDOVER-COMPLETE-ACK*/
6655
6656
    { 0,    NULL }
6657
};
6658
static value_string_ext bssgp_msg_strings_ext = VALUE_STRING_EXT_INIT(bssgp_msg_strings);
6659
6660
2.40k
#define NUM_BSSGP_MSG array_length(bssgp_msg_strings)
6661
static int ett_bssgp_msg[NUM_BSSGP_MSG];
6662
static void (* const bssgp_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len) = {
6663
/* 0x00 to 0x10 */
6664
    bssgp_dl_unitdata,                  /* 10.2.1 DL-UNITDATA */
6665
    bssgp_ul_unitdata,                  /* 10.2.2 UL-UNITDATA */
6666
    bssgp_ra_cap,                       /* 10.2.3 RA-CAPABILITY */
6667
    NULL,                               /* 10.2.4 (void) */
6668
    bssgp_dl_mbms_unitdata,             /* 10.2.5 DL-MBMS-UNITDATA */
6669
    bssgp_ul_mbms_unitdata,             /* 10.2.6 UL-MBMS-UNITDATA */
6670
    bssgp_paging_ps,                    /* 10.3.1 PAGING PS */
6671
    bssgp_paging_cs,                    /* 10.3.2 PAGING CS */
6672
    bssgp_ra_cap_upd,                   /* 10.3.3 RA-CAPABILITY-UPDATE */
6673
    bssgp_ra_cap_upd_ack,               /* 10.3.3 RA-CAPABILITY-UPDATE */
6674
    bssgp_ra_status,                    /* 10.3.5 RADIO-STATUS */
6675
    bssgp_suspend,                      /* 10.3.6 SUSPEND */
6676
    bssgp_suspend_ack,                  /* 10.3.7 SUSPEND-ACK */
6677
    bssgp_suspend_nack,                 /* 10.3.8 SUSPEND-NACK */
6678
    bssgp_resume,                       /* 10.3.9 RESUME */
6679
    bssgp_resume_ack,                   /* 10.3.10 RESUME-ACK */
6680
    bssgp_resume_nack,                  /* 10.3.11 RESUME-NACK */
6681
    bssgp_paging_ps_reject,             /* 10.3.12 PAGING PS REJECT */
6682
    bssgp_dummy_paging_ps,              /* 10.3.13 DUMMY PAGING PS */
6683
    bssgp_dummy_paging_ps_response,     /* 10.3.13 DUMMY PAGING PS RESPONSE */
6684
6685
    /* 0x14 to 0x1f Reserved */
6686
    NULL,                            /* 0x14 */
6687
    NULL,                            /* 0x15 */
6688
    NULL,                            /* 0x16 */
6689
    NULL,                            /* 0x17 */
6690
    NULL,                            /* 0x18 */
6691
    NULL,                            /* 0x19 */
6692
    NULL,                            /* 0x1A */
6693
    NULL,                            /* 0x1B */
6694
    NULL,                            /* 0x1C */
6695
    NULL,                            /* 0x1D */
6696
    NULL,                            /* 0x1E */
6697
    NULL,                            /* 0x1F */
6698
6699
/* 0x20 to 0x2e */
6700
    bssgp_bvc_block,                    /* 10.4.8 BVC-BLOCK */
6701
    bssgp_bvc_block_ack,                /* 10.4.9 BVC-BLOCK-ACK */
6702
    bssgp_bvc_reset,                    /* 10.4.12 BVC-RESET */
6703
    bssgp_bvc_reset_ack,                /* 10.4.13 BVC-RESET-ACK */
6704
    bssgp_bvc_un_block,                 /* 10.4.10 BVC-UNBLOCK */
6705
    bssgp_bvc_un_block_ack,             /* 10.4.11 BVC-UNBLOCK-ACK */
6706
    bssgp_flow_control_bvc,             /* 10.4.4 FLOW-CONTROL-BVC */
6707
    bssgp_flow_control_bvc_ack,         /* 10.4.5 FLOW-CONTROL-BVC-ACK */
6708
    bssgp_flow_control_ms,              /* 10.4.6 FLOW-CONTROL-MS */
6709
    bssgp_flow_control_ms_ack,          /* 10.4.7 FLOW-CONTROL-MS-ACK */
6710
    bssgp_flush_ll,                     /* 10.4.1 FLUSH-LL */
6711
    bssgp_flush_ll_ack,                 /* 10.4.2 FLUSH-LL-ACK */
6712
    bssgp_llc_discarded,                /* 10.4.3 LLC-DISCARDED */
6713
    bssgp_flow_cntrl_pfc,               /* 10.4.24 FLOW-CONTROL-PFC */
6714
    bssgp_flow_cntrl_pfc_ack,           /* 10.4.25 FLOW-CONTROL-PFC-ACK */
6715
6716
/* 0x2f to 0x3f Reserved */
6717
    NULL,                              /* 0x2f */
6718
    NULL,                              /* 0x30 */
6719
    NULL,                              /* 0x31 */
6720
    NULL,                              /* 0x32 */
6721
    NULL,                              /* 0x33 */
6722
    NULL,                              /* 0x34 */
6723
    NULL,                              /* 0x35 */
6724
    NULL,                              /* 0x36 */
6725
    NULL,                              /* 0x37 */
6726
    NULL,                              /* 0x38 */
6727
    NULL,                              /* 0x39 */
6728
    NULL,                              /* 0x3A */
6729
    NULL,                              /* 0x3B */
6730
    NULL,                              /* 0x3C */
6731
    NULL,                              /* 0x3D */
6732
    NULL,                              /* 0x3E */
6733
    NULL,                              /* 0x3F */
6734
6735
/* 0x40 to 0x41 */
6736
    bssgp_sgsn_invoke_trace,            /* 10.4.15 SGSN-INVOKE-TRACE */
6737
    bssgp_status,                       /* 10.4.14 STATUS */
6738
    bssgp_overload,                     /* 10.4.36 OVERLOAD 0x42 */
6739
6740
/* 0x43 to 0x4f Reserved */
6741
    NULL,                              /* 0x43 */
6742
    NULL,                              /* 0x44 */
6743
    NULL,                              /* 0x45 */
6744
    NULL,                              /* 0x46 */
6745
    NULL,                              /* 0x47 */
6746
    NULL,                              /* 0x48 */
6747
    NULL,                              /* 0x49 */
6748
    NULL,                              /* 0x4A */
6749
    NULL,                              /* 0x4B */
6750
    NULL,                              /* 0x4C */
6751
    NULL,                              /* 0x4D */
6752
    NULL,                              /* 0x4E */
6753
    NULL,                              /* 0x4F */
6754
6755
/* 0x50 to 0x5e */
6756
    bssgp_download_bss_pfc,             /* 10.4.16    DOWNLOAD-BSS-PFC */
6757
    bssgp_create_bss_pfc,               /* 10.4.17 CREATE-BSS-PFC */
6758
    bssgp_create_bss_pfc_ack,           /* 10.4.18 CREATE-BSS-PFC-ACK */
6759
    bssgp_create_bss_pfc_nack,          /* 10.4.19 CREATE-BSS-PFC-NACK */
6760
    bssgp_modify_bss_pfc,               /* 10.4.20 MODIFY-BSS-PFC */
6761
    bssgp_modify_bss_pfc_ack,           /* 10.4.21 MODIFY-BSS-PFC-ACK */
6762
    bssgp_delete_bss_pfc,               /* 10.4.22 DELETE-BSS-PFC */
6763
    bssgp_delete_bss_pfc_ack,           /* 10.4.23 DELETE-BSS-PFC-ACK */
6764
    bssgp_delete_bss_pfc_req,           /* 10.4.26 DELETE-BSS-PFC-REQ */
6765
    bssgp_ps_ho_required,               /* 10.4.27 PS-HANDOVER-REQUIRED */
6766
    bssgp_ps_ho_required_ack,           /* 10.4.28 PS-HANDOVER-REQUIRED-ACK */
6767
    bssgp_ps_ho_required_nack,          /* 10.4.29 PS-HANDOVER-REQUIRED-NACK */
6768
    bssgp_ps_ho_request,                /* 10.4.30 PS-HANDOVER-REQUEST */
6769
    bssgp_ps_ho_request_ack,            /* 10.4.31 PS-HANDOVER-REQUEST-ACK */
6770
    bssgp_ps_ho_request_nack,           /* 10.4.31 10.4.32 PS-HANDOVER-REQUEST-NACK */
6771
6772
/* 0x5f Reserved */
6773
    NULL,                              /* 0x5F */
6774
6775
/* 0x60 */
6776
    bssgp_perform_loc_request,          /* 10.5.1 PERFORM-LOCATION-REQUEST */
6777
    bssgp_perform_loc_response,         /* 10.5.2 PERFORM-LOCATION-RESPONSE */
6778
    bssgp_perform_loc_response_abort,   /* 10.5.3 PERFORM-LOCATION-ABORT */
6779
    bssgp_pos_cmd,                      /* 10.5.4 POSITION-COMMAND */
6780
    bssgp_pos_resp,                     /* 10.5.5 POSITION-RESPONSE */
6781
6782
/* 0x65 to 0x6f Reserved */
6783
    NULL,                              /* 0x65 */
6784
    NULL,                              /* 0x66 */
6785
    NULL,                              /* 0x67 */
6786
    NULL,                              /* 0x68 */
6787
    NULL,                              /* 0x69 */
6788
    NULL,                              /* 0x6a */
6789
    NULL,                              /* 0x6b */
6790
    NULL,                              /* 0x6c */
6791
    NULL,                              /* 0x6d */
6792
    NULL,                              /* 0x6e */
6793
    NULL,                              /* 0x6f */
6794
    bssgp_ran_inf,                     /* 10.6.2 RAN-INFORMATION */
6795
    bssgp_ran_inf_request,             /* 10.6.1 RAN-INFORMATION-REQUEST */
6796
    bssgp_ran_inf_request_ack,         /* 10.6.3 RAN-INFORMATION-ACK */
6797
    bssgp_ran_inf_err,                 /* 10.6.4 RAN-INFORMATION-ERROR */
6798
    bssgp_ran_inf_app_err,             /* 10.6.5 RAN-INFORMATION-APPLICATION-ERROR */
6799
    NULL,                              /* 0x75 */
6800
    NULL,                              /* 0x76 */
6801
    NULL,                              /* 0x77 */
6802
    NULL,                              /* 0x78 */
6803
    NULL,                              /* 0x79 */
6804
    NULL,                              /* 0x7a */
6805
    NULL,                              /* 0x7b */
6806
    NULL,                              /* 0x7c */
6807
    NULL,                              /* 0x7d */
6808
    NULL,                              /* 0x7e */
6809
    NULL,                              /* 0x7f */
6810
    bssgp_mbms_session_start_req,      /* 10.7.1    MBMS-SESSION-START-REQUEST */
6811
    bssgp_mbms_session_start_resp,     /* 10.7.2    MBMS-SESSION-START-RESPONSE */
6812
    bssgp_mbms_session_stop_req,       /* 10.7.3    MBMS-SESSION-STOP-REQUEST */
6813
    bssgp_mbms_session_stop_resp,      /* 10.7.4    MBMS-SESSION-STOP-RESPONSE */
6814
    bssgp_mbms_session_update_req,     /* 10.7.5    MBMS-SESSION-UPDATE-REQUEST */
6815
    bssgp_mbms_session_uptate_resp,    /* 10.7.6    MBMS-SESSION-UPDATE-RESPONSE */
6816
    NULL,                              /* 0x86 */
6817
    NULL,                              /* 0x87 */
6818
    NULL,                              /* 0x88 */
6819
    NULL,                              /* 0x89 */
6820
    NULL,                              /* 0x8a */
6821
    NULL,                              /* 0x8b */
6822
    NULL,                              /* 0x8c */
6823
    NULL,                              /* 0x8d */
6824
    NULL,                              /* 0x8e */
6825
    NULL,                              /* 0x8f */
6826
    NULL,                              /* 0x90 */
6827
    bssgp_ps_ho_complete,              /* 0x91 10.4.33  PS-HANDOVER-COMPLETE */
6828
    bssgp_ps_ho_cancel,                /* 0x92 10.4.34  PS-HANDOVER-CANCEL */
6829
    bssgp_ps_ho_complete_ack,          /* 0x93 10.4.35  PS-HANDOVER-COMPLETE-ACK*/
6830
    NULL,    /* NONE */
6831
};
6832
6833
static void get_bssgp_msg_params(uint8_t oct, const char **msg_str, int *ett_tree, int *hf_idx, msg_fcn *msg_fcn_p)
6834
3.26k
{
6835
3.26k
    int             idx;
6836
6837
3.26k
    *msg_str = try_val_to_str_idx_ext((uint32_t) (oct & 0xff), &bssgp_msg_strings_ext, &idx);
6838
3.26k
    *hf_idx = hf_bssgp_msg_type;
6839
3.26k
    if (*msg_str != NULL) {
6840
3.25k
        *ett_tree = ett_bssgp_msg[idx];
6841
3.25k
        *msg_fcn_p = bssgp_msg_fcn[idx];
6842
3.25k
    }
6843
6844
3.26k
    return;
6845
3.26k
}
6846
6847
static int
6848
dissect_bssgp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
6849
3.26k
{
6850
6851
3.26k
    proto_item  *ti;
6852
3.26k
    proto_tree  *bssgp_tree = NULL;
6853
3.26k
    int          offset     = 0;
6854
3.26k
    uint32_t     len;
6855
3.26k
    const char *msg_str    = NULL;
6856
3.26k
    int          ett_tree;
6857
3.26k
    int          hf_idx;
6858
3.26k
    void        (*msg_fcn_p)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len);
6859
6860
    /* Save pinfo */
6861
3.26k
    g_rim_application_identity = 0;
6862
3.26k
    g_bssgp_ran_inf_pdu_t_ext_c = 0xfffffff;
6863
3.26k
    gparent_tree = tree;
6864
3.26k
    len = tvb_reported_length(tvb);
6865
6866
3.26k
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "BSSGP");
6867
6868
3.26k
    col_clear(pinfo->cinfo, COL_INFO);
6869
6870
6871
3.26k
    g_pdu_type = tvb_get_uint8(tvb,offset);
6872
3.26k
    ti = proto_tree_add_item(tree, proto_bssgp, tvb, 0, -1, ENC_NA);
6873
3.26k
    bssgp_tree = proto_item_add_subtree(ti, ett_bssgp);
6874
6875
    /* Messge type IE*/
6876
3.26k
    msg_fcn_p = NULL;
6877
3.26k
    ett_tree = -1;
6878
3.26k
    hf_idx = -1;
6879
3.26k
    msg_str = NULL;
6880
6881
3.26k
    get_bssgp_msg_params(g_pdu_type, &msg_str, &ett_tree, &hf_idx, &msg_fcn_p);
6882
6883
3.26k
    if(msg_str){
6884
3.25k
        col_add_str(pinfo->cinfo, COL_INFO, msg_str);
6885
3.25k
    }else{
6886
8
        expert_add_info_format(pinfo, ti, &ei_bssgp_msg_type, "Unknown message 0x%x", g_pdu_type);
6887
8
        return 1;
6888
8
    }
6889
6890
    /*
6891
     * Add BSSGP message name
6892
     */
6893
3.25k
    proto_tree_add_item(bssgp_tree, hf_idx, tvb, offset, 1, ENC_BIG_ENDIAN);
6894
3.25k
    offset++;
6895
6896
6897
    /*
6898
     * decode elements
6899
     */
6900
3.25k
    if (msg_fcn_p == NULL)
6901
17
    {
6902
17
        proto_tree_add_item(bssgp_tree, hf_bssgp_message_elements, tvb, offset, len - offset, ENC_NA);
6903
17
    }
6904
3.24k
    else
6905
3.24k
    {
6906
3.24k
        (*msg_fcn_p)(tvb, bssgp_tree, pinfo, offset, len - offset);
6907
3.24k
    }
6908
3.25k
    return tvb_captured_length(tvb);
6909
3.26k
}
6910
6911
void
6912
proto_register_bssgp(void)
6913
16
{
6914
16
    unsigned    i;
6915
16
    unsigned    last_offset;
6916
6917
16
    static hf_register_info hf[] = {
6918
16
        { &hf_bssgp_msg_type,
6919
16
          { "PDU Type", "bssgp.pdu_type",
6920
16
            FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bssgp_msg_strings_ext, 0x0,
6921
16
            NULL, HFILL }
6922
16
        },
6923
16
        { &hf_bssgp_elem_id,
6924
16
          { "Element ID", "bssgp.elem_id",
6925
16
            FT_UINT8, BASE_HEX, NULL, 0,
6926
16
            NULL, HFILL }
6927
16
        },
6928
16
        { &hf_bssgp_bss_area_ind,
6929
16
          { "BSS indicator", "bssgp.bss_ind",
6930
16
            FT_UINT8, BASE_HEX, NULL, 0x0,
6931
16
            NULL, HFILL }
6932
16
        },
6933
16
        { &hf_bssgp_bvci,
6934
16
          { "BVCI", "bssgp.bvci",
6935
16
            FT_UINT16, BASE_HEX, NULL, 0x0,
6936
16
            NULL, HFILL }
6937
16
        },
6938
16
        { &hf_bssgp_bmax,
6939
16
          { "Bmax(x 100 or in increments as defined by the Flow Control Granularity IE)", "bssgp.bmax",
6940
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
6941
16
            NULL, HFILL }
6942
16
        },
6943
16
        { &hf_bssgp_r,
6944
16
          { "R(x 100 or in increments as defined by the Flow Control Granularity IE)", "bssgp.r",
6945
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
6946
16
            NULL, HFILL }
6947
16
        },
6948
16
        { &hf_bssgp_r_pfc,
6949
16
          { "R_PFC(x 100 or in increments as defined by the Flow Control Granularity IE)", "bssgp.r_pfc",
6950
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
6951
16
            NULL, HFILL }
6952
16
        },
6953
16
        { &hf_bssgp_bucket_size,
6954
16
          { "Bmax(x 100 or in increments as defined by the Flow Control Granularity IE)", "bssgp.bucket_size",
6955
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
6956
16
            NULL, HFILL }
6957
16
        },
6958
16
        { &hf_bssgp_bmax_pfc,
6959
16
          { "Bmax_PFC(x 100 or in increments as defined by the Flow Control Granularity IE)", "bssgp.bmax_pfc",
6960
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
6961
16
            NULL, HFILL }
6962
16
        },
6963
16
        { &hf_bssgp_omc_id,
6964
16
          { "OMC identity", "bssgp.omc_id",
6965
16
            FT_BYTES, BASE_NONE, NULL, 0x0,
6966
16
            NULL, HFILL }
6967
16
        },
6968
16
        { &hf_bssgp_nsei,
6969
16
          { "NSEI", "bssgp.nsei",
6970
16
            FT_UINT16, BASE_HEX, NULL, 0x0,
6971
16
            NULL, HFILL }
6972
16
        },
6973
16
        { &hf_bssgp_rrlp_flag1,
6974
16
          { "Flag 1", "bssgp.rrlp_flag1",
6975
16
            FT_BOOLEAN, 8, TFS(&bssgp_rrlp_flg1_vals), 0x01,
6976
16
            NULL, HFILL }
6977
16
        },
6978
16
        { &hf_bssgp_ci,
6979
16
          { "CI", "bssgp.ci",
6980
16
            FT_UINT16, BASE_HEX, NULL, 0x0,
6981
16
            "Cell Identity", HFILL }
6982
16
        },
6983
16
        { &hf_bssgp_flush_action,
6984
16
          { "Action", "bssgp.flush_action",
6985
16
            FT_UINT8, BASE_DEC, VALS(bssgp_flush_action_vals), 0x0,
6986
16
            NULL, HFILL }
6987
16
        },
6988
16
        { &hf_bssgp_llc_frames_disc,
6989
16
          { "Number of frames discarded", "bssgp.llc_frames_disc",
6990
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
6991
16
            NULL, HFILL }
6992
16
        },
6993
16
        { &hf_bssgp_ra_discriminator,
6994
16
          { "Routing Address Discriminator", "bssgp.rad",
6995
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ra_discriminator_vals), 0x0f,
6996
16
            NULL, HFILL }
6997
16
        },
6998
16
        { &hf_bssgp_rim_app_id,
6999
16
          { "RIM Application Identity", "bssgp.rim_app_id",
7000
16
            FT_UINT8, BASE_DEC, VALS(bssgp_rim_appid_vals), 0x0,
7001
16
            NULL, HFILL }
7002
16
        },
7003
16
        { &hf_bssgp_rim_seq_no,
7004
16
          { "RIM Sequence Number", "bssgp.rim_seq_no",
7005
16
            FT_UINT32, BASE_DEC, NULL, 0x0,
7006
16
            NULL, HFILL }
7007
16
        },
7008
16
        { &hf_bssgp_rat_discriminator,
7009
16
          { "RAT discriminator", "bssgp.rat_discriminator",
7010
16
            FT_UINT8, BASE_DEC, VALS(bssgp_rat_discriminator_vals), 0x0f,
7011
16
            NULL, HFILL }
7012
16
        },
7013
16
        { &hf_bssgp_nacc_cause,
7014
16
          { "NACC Cause", "bssgp.nacc_cause",
7015
16
            FT_UINT8, BASE_DEC, VALS(bssgp_nacc_cause_vals), 0x0,
7016
16
            NULL, HFILL }
7017
16
        },
7018
16
        { &hf_bssgp_si3_cause,
7019
16
          { "SI3 Cause", "bssgp.si3_cause",
7020
16
            FT_UINT8, BASE_DEC, VALS(bssgp_si3_cause_vals), 0x0,
7021
16
            NULL, HFILL }
7022
16
        },
7023
16
        { &hf_bssgp_mbms_data_ch_cause,
7024
16
          { "MBMS data channel Cause", "bssgp.mbms_data_ch_cause",
7025
16
            FT_UINT8, BASE_DEC, VALS(bssgp_mbms_data_ch_cause_vals), 0x0,
7026
16
            NULL, HFILL }
7027
16
        },
7028
16
        { &hf_bssgp_utra_si_cause,
7029
16
          { "UTRA SI Cause", "bssgp.utra_si_cause",
7030
16
            FT_UINT8, BASE_DEC, VALS(bssgp_utra_si_cause_vals), 0x0,
7031
16
            NULL, HFILL }
7032
16
        },
7033
16
        { &hf_bssgp_num_si_psi,
7034
16
          { "Number of SI/PSI", "bssgp.num_si_psi",
7035
16
            FT_UINT8, BASE_DEC, NULL, 0xfe,
7036
16
            NULL, HFILL }
7037
16
        },
7038
16
        {&hf_bssgp_si_psi_type,
7039
16
         { "Type", "bssgp.si_psi_type",
7040
16
           FT_BOOLEAN, 8, TFS(&bssgp_si_psi_type_vals), 0x01,
7041
16
           NULL, HFILL }
7042
16
        },
7043
16
        { &hf_bssgp_ran_inf_req_pdu_t_ext_c,
7044
16
          { "PDU Type Extension", "bssgp.ran_inf_req_pdu_t_ext_c",
7045
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ran_inf_req_pdu_t_ext_c_vals), 0x0e,
7046
16
            NULL, HFILL }
7047
16
        },
7048
16
        { &hf_bssgp_ran_inf_pdu_t_ext_c,
7049
16
          { "PDU Type Extension", "bssgp.ran_inf_pdu_t_ext_c",
7050
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ran_inf_pdu_t_ext_c_vals), 0x0e,
7051
16
            NULL, HFILL }
7052
16
        },
7053
16
        {&hf_bssgp_rim_pdu_ind_ack,
7054
16
         { "ACK", "bssgp.rim_pdu_ind_ack",
7055
16
           FT_BOOLEAN, 8, TFS(&bssgp_rim_pdu_ind_ack_vals), 0x01,
7056
16
           NULL, HFILL }
7057
16
        },
7058
16
        { &hf_bssgp_rim_proto_ver_no,
7059
16
          { "RIM Protocol Version Number", "bssgp.rim_proto_ver_no",
7060
16
            FT_UINT8, BASE_DEC, VALS(bssgp_rim_proto_ver_no_vals), 0x0,
7061
16
            NULL, HFILL }
7062
16
        },
7063
16
        { &hf_bssgp_delay_val,
7064
16
          { "Delay Value (in centi-seconds)", "bssgp.delay_val",
7065
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
7066
16
            NULL, HFILL }
7067
16
        },
7068
16
        { &hf_bssgp_cause,
7069
16
          { "Cause", "bssgp.cause",
7070
16
            FT_UINT8, BASE_DEC|BASE_EXT_STRING, &bssgp_cause_vals_ext, 0x0,
7071
16
            NULL, HFILL }
7072
16
        },
7073
16
        { &hf_bssgp_peak_rate_gran,
7074
16
          { "Peak Bit Rate Granularity", "bssgp.peak_rate_gran",
7075
16
            FT_UINT8, BASE_DEC, NULL, 0xc0,
7076
16
            NULL, HFILL }
7077
16
        },
7078
16
        { &hf_bssgp_cr_bit,
7079
16
          { "C/R", "bssgp.cr_bit",
7080
16
            FT_BOOLEAN, 8, TFS(&bssgp_cr_bit_vals), 0x20,
7081
16
            NULL, HFILL }
7082
16
        },
7083
16
        { &hf_bssgp_t_bit,
7084
16
          { "T", "bssgp.t_bit",
7085
16
            FT_BOOLEAN, 8, TFS(&bssgp_t_bit_vals), 0x10,
7086
16
            NULL, HFILL }
7087
16
        },
7088
16
        { &hf_bssgp_a_bit,
7089
16
          { "A", "bssgp.a_bit",
7090
16
            FT_BOOLEAN, 8, TFS(&bssgp_a_bit_vals), 0x08,
7091
16
            NULL, HFILL }
7092
16
        },
7093
16
        { &hf_bssgp_ra_cause,
7094
16
          { "Radio Cause", "bssgp.ra_cause",
7095
16
            FT_UINT8, BASE_DEC, VALS(bssgp_radio_cause_vals), 0x00,
7096
16
            NULL, HFILL }
7097
16
        },
7098
16
        { &hf_bssgp_ra_cap_upd_cause,
7099
16
          { "RA-Cap-UPD Cause", "bssgp.ra_cap_upd_cause",
7100
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ra_cap_upd_cause_vals), 0x00,
7101
16
            NULL, HFILL }
7102
16
        },
7103
16
        { &hf_bssgp_r_default_ms,
7104
16
          { "R_default_MS(x 100 or in increments as defined by the Flow Control Granularity IE)", "bssgp.r_default_ms",
7105
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
7106
16
            NULL, HFILL }
7107
16
        },
7108
7109
16
        { &hf_bssgp_suspend_ref_no,
7110
16
          { "Suspend Reference Number", "bssgp.suspend_ref_no",
7111
16
            FT_UINT8, BASE_DEC, NULL, 0x00,
7112
16
            NULL, HFILL }
7113
16
        },
7114
16
        { &hf_bssgp_tag,
7115
16
          { "Tag", "bssgp.tag",
7116
16
            FT_UINT8, BASE_DEC, NULL, 0x00,
7117
16
            NULL, HFILL }
7118
16
        },
7119
16
        { &hf_bssgp_trace_ref,
7120
16
          { "Trace Reference", "bssgp.trace_ref",
7121
16
            FT_UINT16, BASE_DEC, NULL, 0x00,
7122
16
            NULL, HFILL }
7123
16
        },
7124
16
        { &hf_bssgp_trigger_id,
7125
16
          { "Entity Identity", "bssgp.entity_id",
7126
16
            FT_BYTES, BASE_NONE, NULL, 0x00,
7127
16
            NULL, HFILL }
7128
16
        },
7129
16
        { &hf_bssgp_transaction_id,
7130
16
          { "Transaction Id", "bssgp.transaction_id",
7131
16
            FT_UINT16, BASE_DEC, NULL, 0x00,
7132
16
            NULL, HFILL }
7133
16
        },
7134
16
        { &hf_bssgp_no_of_oct,
7135
16
          { "Number of octets transferred or deleted", "bssgp.no_of_oct",
7136
16
            FT_UINT24, BASE_DEC, NULL, 0x00,
7137
16
            NULL, HFILL }
7138
16
        },
7139
16
        { &hf_bssgp_unit_val,
7140
16
          { "Unit Value", "bssgp.unit_val",
7141
16
            FT_UINT8, BASE_DEC, VALS(bssgp_unit_vals), 0xe0,
7142
16
            NULL, HFILL }
7143
16
        },
7144
16
        { &hf_bssgp_gprs_timer,
7145
16
          { "Unit Value", "bssgp.gprs_timer",
7146
16
            FT_UINT8, BASE_DEC, NULL, 0x1f,
7147
16
            NULL, HFILL }
7148
16
        },
7149
7150
16
        { &hf_bssgp_mbms,
7151
16
          { "MBMS Procedures", "bssgp.mbms",
7152
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
7153
16
            NULL, HFILL }
7154
16
        },
7155
16
        { &hf_bssgp_EnhancedRadioStatus,
7156
16
          { "Enhanced Radio Status Procedures", "bssgp.enhancedradiostatus",
7157
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
7158
16
            NULL, HFILL }
7159
16
        },
7160
16
        { &hf_bssgp_pfcfc,
7161
16
          { "PFC Flow Control Procedures", "bssgp.pfcfc",
7162
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
7163
16
            NULL, HFILL }
7164
16
        },
7165
16
        { &hf_bssgp_rim,
7166
16
          { "RAN Information Management (RIM) procedures", "bssgp.rim",
7167
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
7168
16
            NULL, HFILL }
7169
16
        },
7170
16
        { &hf_bssgp_lcs,
7171
16
          { "LCS Procedures", "bssgp.lcs",
7172
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
7173
16
            NULL, HFILL }
7174
16
        },
7175
16
        { &hf_bssgp_inr,
7176
16
          { "Inter-NSE re-routing(INR)", "bssgp.inr",
7177
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
7178
16
            NULL, HFILL }
7179
16
        },
7180
16
        { &hf_bssgp_cbl,
7181
16
          { "Current Bucket Level(CBL) Procedures", "bssgp.cbl",
7182
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
7183
16
            NULL, HFILL }
7184
16
        },
7185
16
        { &hf_bssgp_pfc,
7186
16
          { "Packet Flow Context(PFC) Procedures", "bssgp.pfc",
7187
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
7188
16
            NULL, HFILL }
7189
16
        },
7190
16
        { &hf_bssgp_bucket_full_ratio,
7191
16
          { "Ratio of the bucket that is filled up with data", "bssgp.bucket_full_ratio",
7192
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7193
16
            "B current x (100 / Bmax)", HFILL }
7194
16
        },
7195
16
        { &hf_bssgp_b_pfc,
7196
16
          { "B_PFC: Bucket Full Ratio of the PFC", "bssgp.b_pfc",
7197
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7198
16
            "B current x (100 / Bmax)", HFILL }
7199
16
        },
7200
7201
16
        { &hf_bssgp_precedence,
7202
16
          { "Precedence", "bssgp.precedence",
7203
16
            FT_UINT8, BASE_DEC, NULL, 0x07,
7204
16
            NULL, HFILL }
7205
16
        },
7206
16
        { &hf_bssgp_serv_utran_cco,
7207
16
          { "Service UTRAN CCO", "bssgp.serv_utran_cco",
7208
16
            FT_UINT8, BASE_DEC, VALS(bssgp_service_utran_cco_vals), 0x07,
7209
16
            NULL, HFILL }
7210
16
        },
7211
16
        { &hf_bssgp_mbms_session_id,
7212
16
          { "MBMS Session ID", "bssgp.mbms_session_id",
7213
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7214
16
            NULL, HFILL }
7215
16
        },
7216
16
        { &hf_bssgp_mbms_cause,
7217
16
          { "Cause", "bssgp.mbms_cause",
7218
16
            FT_UINT8, BASE_DEC|BASE_EXT_STRING, &bssgp_mbms_cause_vals_ext, 0x0f,
7219
16
            NULL, HFILL }
7220
16
        },
7221
16
        { &hf_bssgp_mbms_stop_cause,
7222
16
          { "Stop Cause", "bssgp.mbms_stop_cause",
7223
16
            FT_UINT8, BASE_DEC|BASE_EXT_STRING, &bssgp_mbms_stop_cause_vals_ext, 0x0f,
7224
16
            NULL, HFILL }
7225
16
        },
7226
16
        { &hf_bssgp_session_inf,
7227
16
          { "BC/MC", "bssgp.session_inf",
7228
16
            FT_BOOLEAN, 8, TFS(&tfs_bssgp_bc_mc), 0x01,
7229
16
            NULL, HFILL }
7230
16
        },
7231
16
        { &hf_bssgp_mbms_num_ra_ids,
7232
16
          { "Number of Routing Area Identifications", "bssgp.mbms_num_ra_ids",
7233
16
            FT_UINT8, BASE_DEC|BASE_EXT_STRING, &bssgp_mbms_num_ra_ids_vals_ext, 0xf0,
7234
16
            NULL, HFILL }
7235
16
        },
7236
16
        { &hf_bssgp_eDRX,
7237
16
        { "eDRX", "bssgp.edrx",
7238
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
7239
16
            NULL, HFILL }
7240
16
        },
7241
16
        { &hf_bssgp_dcn,
7242
16
        { "DCN(Dedicated Core Network)", "bssgp.dcn",
7243
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
7244
16
            NULL, HFILL }
7245
16
        },
7246
16
        { &hf_bssgp_ec_gsm_iot,
7247
16
          { "EC-GSM-IoT", "bssgp.ec_gsm_iot",
7248
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
7249
16
            NULL, HFILL }
7250
16
        },
7251
16
        { &hf_bssgp_csps_coord,
7252
16
          { "CS/PS COORD", "bssgp.csps_coord",
7253
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
7254
16
            NULL, HFILL }
7255
16
        },
7256
16
        { &hf_bssgp_mocn,
7257
16
          { "MOCN", "bssgp.mocn",
7258
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
7259
16
            NULL, HFILL }
7260
16
        },
7261
16
        { &hf_bssgp_gb_if,
7262
16
          { "Gigabit Interface", "bssgp.gb_if",
7263
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
7264
16
            NULL, HFILL }
7265
16
        },
7266
16
        { &hf_bssgp_ps_ho,
7267
16
          { "PS Handover", "bssgp.ps_ho",
7268
16
            FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
7269
16
            NULL, HFILL }
7270
16
        },
7271
16
        { &hf_bssgp_src_to_trg_transp_cont,
7272
16
          { "Source to Target Transparent Container", "bssgp.src_to_trg_transp_cont",
7273
16
            FT_BYTES, FT_NONE, NULL, 0x0,
7274
16
            NULL, HFILL }
7275
16
        },
7276
16
        { &hf_bssgp_trg_to_src_transp_cont,
7277
16
          { "Target to Source Transparent Container", "bssgp.trg_to_src_transp_cont",
7278
16
            FT_BYTES, FT_NONE, NULL, 0x0,
7279
16
            NULL, HFILL }
7280
16
        },
7281
16
        { &hf_bssgp_rnc_id,
7282
16
          { "RNC ID", "bssgp.rnc_id",
7283
16
            FT_UINT16, BASE_DEC, NULL, 0x0,
7284
16
            NULL, HFILL }
7285
16
        },
7286
16
        { &hf_bssgp_page_mode,
7287
16
          { "PAGE_MODE", "bssgp.page_mode",
7288
16
            FT_UINT8, BASE_DEC, VALS(bssgp_page_mode_vals), 0x03,
7289
16
            NULL, HFILL }
7290
16
        },
7291
16
        { &hf_bssgp_container_id,
7292
16
          { "Container ID", "bssgp.container_id",
7293
16
            FT_UINT8, BASE_DEC, NULL, 0x03,
7294
16
            NULL, HFILL }
7295
16
        },
7296
16
        { &hf_bssgp_global_tfi,
7297
16
          { "Global TFI", "bssgp.global_tfi",
7298
16
            FT_UINT8, BASE_DEC, VALS(bssgp_global_tfi_vals), 0x0,
7299
16
            NULL, HFILL }
7300
16
        },
7301
16
        { &hf_bssgp_ul_tfi,
7302
16
          { "UPLINK_TFI", "bssgp.ul_tfi",
7303
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7304
16
            NULL, HFILL }
7305
16
        },
7306
16
        { &hf_bssgp_dl_tfi,
7307
16
          { "DOWNLINK_TFI", "bssgp.dl_tfi",
7308
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7309
16
            NULL, HFILL }
7310
16
        },
7311
16
        { &hf_bssgp_time_to_MBMS_data_tran,
7312
16
          { "Time to MBMS Data Transfer", "bssgp.time_to_mbms_data_tran",
7313
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7314
16
            NULL, HFILL }
7315
16
        },
7316
16
        { &hf_bssgp_mbms_session_rep_no,
7317
16
          { "MBMS-Session-Repetition-Number", "bssgp.mbms_session_rep_no",
7318
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7319
16
            NULL, HFILL }
7320
16
        },
7321
16
        { &hf_bssgp_ps_ho_cmd,
7322
16
          { "PS Handover Command", "bssgp.ps_ho_cmd",
7323
16
            FT_BYTES, BASE_NONE, NULL, 0x0,
7324
16
            NULL, HFILL }
7325
16
        },
7326
16
        { &hf_bssgp_sipsi,
7327
16
          { "SI/PSI", "bssgp.sipsi",
7328
16
            FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01,
7329
16
            NULL, HFILL }
7330
16
        },
7331
16
        { &hf_bssgp_type,
7332
16
          { "Type", "bssgp.type",
7333
16
            FT_UINT8, BASE_DEC, VALS(type_vals), 0x01,
7334
16
            NULL, HFILL }
7335
16
        },
7336
16
        { &hf_bssgp_cs_indication,
7337
16
          { "CS Indication Contents", "bssgp.cs_indication",
7338
16
            FT_UINT8, BASE_HEX, NULL, 0x0,
7339
16
            NULL, HFILL }
7340
16
        },
7341
7342
16
        { &hf_bssgp_flow_control_gran,
7343
16
          { "Granularity", "bssgp.flow_control_gran",
7344
16
            FT_UINT8, BASE_DEC, VALS(bssgp_flow_control_gran_vals), 0x03,
7345
16
            NULL, HFILL }
7346
16
        },
7347
16
        { &hf_bssgp_serv_eutran_cco,
7348
16
          { "Service EUTRAN CCO", "bssgp.serv_eutran_cco",
7349
16
            FT_UINT8, BASE_DEC, VALS(bssgp_service_eutran_cco_vals), 0x18,
7350
16
            NULL, HFILL }
7351
16
        },
7352
16
        { &hf_bssgp_sub_prof_id_f_rat_freq_prio,
7353
16
          { "Subscriber Profile ID for RAT/Frequency priority", "bssgp.sub_prof_id_f_rat_freq_prio",
7354
16
            FT_UINT8, BASE_DEC, NULL, 0x0,
7355
16
            NULL, HFILL }
7356
16
        },
7357
16
        { &hf_bssgp_eutran_irat_ho_inf_req,
7358
16
          { "E-UTRAN Inter RAT Handover Info", "bssgp.eutran_irat_ho_inf_req",
7359
16
            FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x02,
7360
16
            NULL, HFILL }
7361
16
        },
7362
16
        { &hf_bssgp_irat_ho_inf_req,
7363
16
          { "Inter RAT Handover Info", "bssgp.irat_ho_inf_req",
7364
16
            FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01,
7365
16
            NULL, HFILL }
7366
16
        },
7367
7368
16
        { &hf_bssgp_rel_int_rat_ho_inf_ind,
7369
16
          { "Inter RAT Handover Info", "bssgp.rel_int_rat_ho_inf_ind",
7370
16
            FT_BOOLEAN, 8, TFS(&tfs_reliable_not_reliable), 0x01,
7371
16
            NULL, HFILL }
7372
16
        },
7373
16
        { &hf_bssgp_csg_id,
7374
16
          { "CSG Identity (CSG-ID)", "bssgp.csg_id",
7375
16
            FT_UINT32, BASE_HEX, NULL, 0xffffff0f,
7376
16
            NULL, HFILL }
7377
16
        },
7378
16
        { &hf_bssgp_cell_acc_mode,
7379
16
          { "Cell Access Mode", "bssgp.cell_acc_mode",
7380
16
            FT_UINT8, BASE_DEC, VALS(bssgp_cell_access_mode_vals), 0x01,
7381
16
            NULL, HFILL }
7382
16
        },
7383
16
        { &hf_bssgp_redir_complete_outcome,
7384
16
          { "Outcome Value", "bssgp.redir_complete_outcome",
7385
16
            FT_UINT8, BASE_HEX, VALS(bssgp_redir_complete_outcome_vals), 0x0,
7386
16
            NULL, HFILL }
7387
16
        },
7388
16
        { &hf_bssgp_redir_indication_reroute_reject_cause,
7389
16
          { "Reroute Reject Cause Value", "bssgp.redir_indication_reroute_reject_cause",
7390
16
            FT_UINT8, BASE_HEX, VALS(bssgp_redir_indication_reroute_reject_cause_vals), 0x0,
7391
16
            NULL, HFILL }
7392
16
        },
7393
16
        { &hf_bssgp_unconfirm_send_state_var,
7394
16
          { "Unconfirmed Send State Variable V(U)", "bssgp.unconfirm_send_state_var",
7395
16
            FT_UINT16, BASE_DEC, NULL, 0x01ff,
7396
16
            NULL, HFILL }
7397
16
        },
7398
16
        { &hf_bssgp_Global_ENB_ID_PDU,
7399
16
          { "Global-ENB-ID", "bssgp.Global_ENB_ID",
7400
16
            FT_NONE, BASE_NONE, NULL, 0,
7401
16
            NULL, HFILL }
7402
16
        },
7403
16
        { &hf_bssgp_SONtransferRequestContainer_PDU,
7404
16
          { "SONtransferRequestContainer", "bssgp.SONtransferRequestContainer",
7405
16
            FT_UINT32, BASE_DEC, VALS(s1ap_SONtransferRequestContainer_vals), 0,
7406
16
            NULL, HFILL }},
7407
7408
16
        { &hf_bssgp_plmn_id,
7409
16
          { "PLMN ID", "bssgp.plmn_id",
7410
16
            FT_STRING, BASE_NONE, NULL, 0,
7411
16
            NULL, HFILL }},
7412
7413
16
        { &hf_bssgp_num_pfc,
7414
16
          { "Number of PFCs", "bssgp.num_pfc",
7415
16
            FT_UINT16, BASE_DEC, NULL, 0x01ff,
7416
16
            NULL, HFILL }
7417
16
        },
7418
7419
16
        { &hf_bssgp_llc_data,
7420
16
          { "LLC DATA", "bssgp.llc_data",
7421
16
            FT_BYTES, BASE_NONE, NULL, 0,
7422
16
            NULL, HFILL }},
7423
7424
16
        { &hf_bssgp_pdu_data,
7425
16
          { "PDU DATA", "bssgp.pdu_data",
7426
16
            FT_BYTES, BASE_NONE, NULL, 0,
7427
16
            NULL, HFILL }},
7428
7429
16
        { &hf_bssgp_rrlp_apdu,
7430
16
          { "RRLP APDU", "bssgp.rrlp_apdu",
7431
16
            FT_BYTES, BASE_NONE, NULL, 0,
7432
16
            NULL, HFILL }},
7433
7434
16
        { &hf_bssgp_dtm_handover_command_data,
7435
16
          { "DTM Handover Command data", "bssgp.dtm_handover_command_data",
7436
16
            FT_BYTES, BASE_NONE, NULL, 0,
7437
16
            NULL, HFILL }},
7438
7439
16
        { &hf_bssgp_message_elements,
7440
16
          { "Message Elements", "bssgp.message_elements",
7441
16
            FT_BYTES, BASE_NONE, NULL, 0,
7442
16
            NULL, HFILL }},
7443
7444
16
        { &hf_bssgp_spare,
7445
16
          { "Spare octet(s)", "bssgp.spare",
7446
16
            FT_BYTES, BASE_NONE, NULL, 0,
7447
16
            NULL, HFILL }},
7448
7449
16
        { &hf_bssgp_si,
7450
16
          { "SI", "bssgp.si",
7451
16
            FT_BYTES, BASE_NONE, NULL, 0,
7452
16
            NULL, HFILL }},
7453
7454
16
        { &hf_bssgp_psi,
7455
16
          { "PSI", "bssgp.psi",
7456
16
            FT_BYTES, BASE_NONE, NULL, 0,
7457
16
            NULL, HFILL }},
7458
7459
16
        { &hf_bssgp_peak_bit_rate,
7460
16
          { "Peak bit rate", "bssgp.peak_bit_rate",
7461
16
            FT_UINT16, BASE_DEC, NULL, 0,
7462
16
            NULL, HFILL }},
7463
7464
16
        { &hf_bssgp_sys_info_type3_msg,
7465
16
          { "SYSTEM INFORMATION type 3 message", "bssgp.sys_info_type3_msg",
7466
16
            FT_BYTES, BASE_NONE, NULL, 0,
7467
16
            NULL, HFILL }},
7468
7469
16
        { &hf_bssgp_trace_type_data,
7470
16
          { "Trace Type data ( Coding unknown (Specification withdrawn) 3GPP TS 32.008)", "bssgp.trace_type_data",
7471
16
            FT_BYTES, BASE_NONE, NULL, 0,
7472
16
            NULL, HFILL }},
7473
7474
16
        { &hf_bssgp_si_item,
7475
16
          { "SI item", "bssgp.si_item",
7476
16
            FT_BYTES, BASE_NONE, NULL, 0,
7477
16
            NULL, HFILL }},
7478
16
        { &hf_bssgp_edrx_cycle_value,
7479
16
          { "eDRX Cycle Value", "bssgp.edrx_cycle_value",
7480
16
            FT_UINT8, BASE_HEX, VALS(bssgp_edrx_cycle_vals), 0x0f,
7481
16
            NULL, HFILL }},
7482
7483
16
        { &hf_bssgp_tunpo_minutes,
7484
16
          { "Minutes", "bssgp.tunpo_minutes",
7485
16
            FT_UINT8, BASE_DEC, NULL, 0x3F,
7486
16
            NULL, HFILL } },
7487
7488
16
        { &hf_bssgp_tunpo_seconds,
7489
16
          { "Seconds", "bssgp.tunpo_seconds",
7490
16
            FT_UINT8, BASE_DEC, NULL, 0x3F,
7491
16
            NULL, HFILL } },
7492
7493
16
        { &hf_bssgp_ec_dl_coverage_class,
7494
16
          { "DL Coverage Class", "bssgp.ec_dl_coverage_class",
7495
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ec_dl_coverage_class_vals), 0x38,
7496
16
            NULL, HFILL } },
7497
7498
16
        { &hf_bssgp_ec_ul_coverage_class,
7499
16
          { "UL Coverage Class", "bssgp.ec_ul_coverage_class",
7500
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ec_ul_coverage_class_vals), 0x07,
7501
16
            NULL, HFILL } },
7502
7503
16
        { &hf_bssgp_sci,
7504
16
          { "SCI", "bssgp.sci",
7505
16
            FT_UINT8, BASE_DEC, NULL, 0,
7506
16
            NULL, HFILL } },
7507
7508
16
        { &hf_bssgp_ggsn_pgw_location,
7509
16
          { "GGSN/P-GW location", "bssgp.ggsn_pgw_location",
7510
16
            FT_UINT8, BASE_DEC, VALS(bssgp_ggsn_pgw_location_vals), 0x0,
7511
16
            NULL, HFILL } },
7512
7513
16
        { &hf_bssgp_pei,
7514
16
          { "Positioning Event Indicator(PEI)", "bssgp.pei",
7515
16
            FT_UINT8, BASE_DEC, VALS(bssgp_pei_vals), 0x80,
7516
16
            NULL, HFILL } },
7517
7518
16
        { &hf_bssgp_paging_attempt_count,
7519
16
          { "Paging Attempt Count", "bssgp.paging_attempt_count",
7520
16
            FT_UINT8, BASE_HEX, VALS(bssgp_paging_attempt_count_vals), 0x7,
7521
16
            NULL, HFILL } },
7522
7523
16
        { &hf_bssgp_intended_num_of_pag_attempts,
7524
16
          { "Intended Number of Paging Attempts", "bssgp.intended_num_of_pag_attempts",
7525
16
            FT_UINT8, BASE_HEX, VALS(bssgp_intended_num_of_pag_attempts_vals), 0x78,
7526
16
            NULL, HFILL } },
7527
7528
16
        { &hf_bssgp_extended_feature_bitmap,
7529
16
        { "Extended Feature Bitmap", "bssgp.extended_feature_bitmap",
7530
16
          FT_UINT8, BASE_HEX, NULL, 0x0,
7531
16
          NULL, HFILL }
7532
16
        },
7533
16
        { &hf_bssgp_prio_class_ind,
7534
16
        { "Priority Class Indicator", "bssgp.prio_class_ind",
7535
16
            FT_UINT8, BASE_HEX, NULL, 0x0,
7536
16
            NULL, HFILL }
7537
16
        },
7538
16
        { &hf_bssgp_prio_class_flag_b0,
7539
16
        { "A mobile station configured for 'low access priority'", "bssgp.prio_class_ind.b0",
7540
16
            FT_BOOLEAN, 8, NULL, 0x01,
7541
16
            NULL, HFILL }
7542
16
        },
7543
7544
16
    };
7545
7546
    /* Setup protocol subtree array */
7547
16
#define NUM_INDIVIDUAL_ELEMS    12
7548
16
    int *ett[NUM_INDIVIDUAL_ELEMS +
7549
16
              NUM_BSSGP_ELEM +
7550
16
              NUM_BSSGP_MSG];
7551
7552
16
    static ei_register_info ei[] = {
7553
16
        { &ei_bssgp_extraneous_data, { "bssgp.extraneous_data", PI_PROTOCOL, PI_NOTE, "Extraneous Data, dissector bug or later version spec(report to wireshark.org)", EXPFILL }},
7554
16
        { &ei_bssgp_missing_mandatory_element, { "bssgp.missing_mandatory_element", PI_PROTOCOL, PI_ERROR, "Missing Mandatory element, rest of dissection is suspect", EXPFILL }},
7555
16
        { &ei_bssgp_not_dissected_yet, { "bssgp.not_dissected_yet", PI_UNDECODED, PI_WARN, "Not dissected yet", EXPFILL }},
7556
16
        { &ei_bssgp_erroneous_app_container, { "bssgp.erroneous_app_container", PI_PROTOCOL, PI_WARN, "Erroneous Application Container including IEI and LI", EXPFILL }},
7557
16
        { &ei_bssgp_si_item, { "bssgp.unknown_si", PI_PROTOCOL, PI_WARN, "Unknown SI message", EXPFILL }},
7558
16
        { &ei_bssgp_unknown_rim_app_id_data, { "bssgp.rim_app_id_data.unknown", PI_PROTOCOL, PI_WARN, "Unknown RIM Application Identity Data", EXPFILL }},
7559
16
        { &ei_bssgp_unknown_app_container, { "bssgp.unknown_app_container", PI_PROTOCOL, PI_WARN, "Unknown Application Error Container", EXPFILL }},
7560
16
        { &ei_bssgp_ra_discriminator, { "bssgp.ra_discriminator.unknown", PI_PROTOCOL, PI_WARN, "Unknown RIM Routing Address discriminator", EXPFILL }},
7561
16
        { &ei_bssgp_unknown_rim_app_id, { "bssgp.rim_app_id.unknown", PI_PROTOCOL, PI_WARN, "Unknown RIM Application Identity", EXPFILL }},
7562
16
        { &ei_bssgp_msg_type, { "bssgp.msg_type.unknown", PI_PROTOCOL, PI_WARN, "Unknown message", EXPFILL }},
7563
16
        { &ei_bssgp_ran_inf_app_cont_utra_si,{ "bssgp.ran_inf_app_cont_utra_si", PI_PROTOCOL, PI_WARN, "UTRA SI Container missing", EXPFILL } },
7564
16
    };
7565
7566
16
    expert_module_t* expert_bssgp;
7567
7568
16
    ett[0] = &ett_bssgp;
7569
16
    ett[1] = &ett_bssgp_list_of_setup_pfcs;
7570
16
    ett[2] = &ett_bssgp_pfcs_to_be_set_up_list_t10;
7571
16
    ett[3] = &ett_bssgp_pfcs_to_be_set_up_list_arp;
7572
16
    ett[4] = &ett_bssgp_pfcs_to_be_set_up_list_abqp;
7573
16
    ett[5] = &ett_bssgp_pfcs_to_be_set_up_list_pft;
7574
16
    ett[6] = &ett_bssgp_pfcs_to_be_set_up_list;
7575
16
    ett[7] = &ett_bssgp_new;
7576
16
    ett[8] = &ett_bssgp_pfc_flow_control_parameters_pfc;
7577
16
    ett[9] = &ett_bssgp_ra_id;
7578
16
    ett[10] = &ett_bssgp_extended_feature_bitmap;
7579
16
    ett[11] = &ett_bssgp_prio_class_ind;
7580
7581
16
    last_offset = NUM_INDIVIDUAL_ELEMS;
7582
7583
1.87k
    for (i=0; i < NUM_BSSGP_ELEM; i++, last_offset++)
7584
1.85k
    {
7585
1.85k
        ett[last_offset] = &ett_bssgp_elem[i];
7586
1.85k
    }
7587
7588
2.40k
    for (i=0; i < NUM_BSSGP_MSG; i++, last_offset++)
7589
2.38k
    {
7590
2.38k
        ett[last_offset] = &ett_bssgp_msg[i];
7591
2.38k
    }
7592
7593
    /* Register the protocol name and description */
7594
16
    proto_bssgp = proto_register_protocol("Base Station Subsystem GPRS Protocol", "BSSGP", "bssgp");
7595
7596
    /* Required function calls to register the header fields and subtrees used */
7597
16
    proto_register_field_array(proto_bssgp, hf, array_length(hf));
7598
16
    proto_register_subtree_array(ett, array_length(ett));
7599
16
    expert_bssgp = expert_register_protocol(proto_bssgp);
7600
16
    expert_register_field_array(expert_bssgp, ei, array_length(ei));
7601
16
    register_dissector("bssgp", dissect_bssgp, proto_bssgp);
7602
7603
    /* Register configuration options */
7604
16
    bssgp_module = prefs_register_protocol(proto_bssgp, NULL);
7605
16
    prefs_register_obsolete_preference(bssgp_module, "decode_nri");
7606
16
    prefs_register_obsolete_preference(bssgp_module, "nri_length");
7607
16
}
7608
7609
/* If this dissector uses sub-dissector registration add a registration routine.
7610
 */
7611
void
7612
proto_reg_handoff_bssgp(void)
7613
16
{
7614
16
    llc_handle = find_dissector("llcgprs");
7615
16
    rrlp_handle = find_dissector("rrlp");
7616
16
    rrc_sys_info_cont_handle = find_dissector("rrc.sysinfo.cont");
7617
7618
16
    diameter_3gpp_avp_dissector_table = find_dissector_table("diameter.3gpp");
7619
16
}
7620
7621
/*
7622
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
7623
 *
7624
 * Local variables:
7625
 * c-basic-offset: 4
7626
 * tab-width: 8
7627
 * indent-tabs-mode: nil
7628
 * End:
7629
 *
7630
 * vi: set shiftwidth=4 tabstop=8 expandtab:
7631
 * :indentSize=4:tabSize=8:noTabs=true:
7632
 */