Coverage Report

Created: 2026-01-02 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-gsmtap.c
Line
Count
Source
1
/* packet-gsmtap.c
2
 * Routines for GSMTAP captures
3
 *
4
 * (C) 2008-2013 by Harald Welte <laforge@gnumonks.org>
5
 * (C) 2011 by Holger Hans Peter Freyther
6
 * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
7
 * (C) 2024 by Tamas Regos <tamas.regos@infostam.com>
8
 *
9
 * Wireshark - Network traffic analyzer
10
 * By Gerald Combs <gerald@wireshark.org>
11
 * Copyright 1998 Gerald Combs
12
 *
13
 * SPDX-License-Identifier: GPL-2.0-or-later
14
 */
15
16
/* GSMTAP is a generic header format for GSM protocol captures,
17
 * it uses the IANA-assigned UDP port number 4729 and carries
18
 * payload in various formats of GSM interfaces such as Um MAC
19
 * blocks or Um bursts.
20
 *
21
 * It is defined by the gsmtap.h libosmocore header, in
22
 *
23
 * http://cgit.osmocom.org/libosmocore/tree/include/osmocom/core/gsmtap.h
24
 *
25
 * Example programs generating GSMTAP data are airprobe
26
 * (http://git.gnumonks.org/cgit/airprobe/) or OsmocomBB (http://bb.osmocom.org/)
27
 *
28
 * It has also been used for Tetra by the OsmocomTETRA project.
29
 * (http://tetra.osmocom.org/)
30
 *
31
 * GSMTAP also carries payload in various formats of WiMAX interfaces.
32
 * It uses the wimax plugin to decode the WiMAX bursts.
33
 */
34
35
#include "config.h"
36
37
#include <epan/packet.h>
38
#include <epan/expert.h>
39
#include <epan/conversation.h>
40
#include <epan/tfs.h>
41
#include <epan/unit_strings.h>
42
#include "packet-gsm_rlcmac.h"
43
#include <wiretap/wtap.h>
44
45
#include "packet-gsmtap.h"
46
#include "packet-lapdm.h"
47
#include "packet-tetra.h"
48
49
void proto_register_gsmtap(void);
50
void proto_reg_handoff_gsmtap(void);
51
52
static dissector_handle_t gsmtap_handle;
53
54
static int proto_gsmtap;
55
56
static int hf_gsmtap_version;
57
static int hf_gsmtap_hdrlen;
58
static int hf_gsmtap_type;
59
static int hf_gsmtap_timeslot;
60
static int hf_gsmtap_subslot;
61
static int hf_gsmtap_arfcn;
62
static int hf_gsmtap_uplink;
63
static int hf_gsmtap_pcs;
64
static int hf_gsmtap_signal_dbm;
65
static int hf_gsmtap_snr_db;
66
static int hf_gsmtap_frame_nr;
67
static int hf_gsmtap_burst_type;
68
static int hf_gsmtap_channel_type;
69
static int hf_gsmtap_tetra_channel_type;
70
static int hf_gsmtap_gmr1_channel_type;
71
static int hf_gsmtap_lte_rrc_channel_type;
72
static int hf_gsmtap_rrc_sub_type;
73
static int hf_gsmtap_e1t1_sub_type;
74
static int hf_gsmtap_sim_sub_type;
75
static int hf_gsmtap_antenna;
76
static int hf_gsmtap_radio_fields;
77
static int hf_gsmtap_res;
78
79
static int hf_sacch_l1h_power_lev;
80
static int hf_sacch_l1h_fpc;
81
static int hf_sacch_l1h_sro_srr;
82
static int hf_sacch_l1h_ta;
83
84
static int hf_ptcch_spare;
85
static int hf_ptcch_ta_idx;
86
static int hf_ptcch_ta_val;
87
static int hf_ptcch_padding;
88
89
static int hf_um_voice_type;
90
91
static int ett_gsmtap;
92
93
static expert_field ei_gsmtap_unknown_gsmtap_version;
94
95
enum {
96
  GSMTAP_SUB_DATA = 0,
97
  GSMTAP_SUB_UM,
98
  GSMTAP_SUB_UM_LAPDM,
99
  GSMTAP_SUB_UM_RLC_MAC_UL,
100
  GSMTAP_SUB_UM_RLC_MAC_DL,
101
  GSMTAP_SUB_LLC,
102
  GSMTAP_SUB_SNDCP,
103
  GSMTAP_SUB_ABIS,
104
  /* WiMAX sub handles */
105
  GSMTAP_SUB_CDMA_CODE,
106
  GSMTAP_SUB_FCH,
107
  GSMTAP_SUB_FFB,
108
  GSMTAP_SUB_PDU,
109
  GSMTAP_SUB_HACK,
110
  GSMTAP_SUB_PHY_ATTRIBUTES,
111
  GSMTAP_SUB_CBCH,
112
  GSMTAP_SUB_SIM,
113
  /* GMR-1 sub handles */
114
  GSMTAP_SUB_GMR1_BCCH,
115
  GSMTAP_SUB_GMR1_CCCH,
116
  GSMTAP_SUB_GMR1_LAPSAT,
117
  GSMTAP_SUB_GMR1_RACH,
118
  /* UMTS */
119
  GSMTAP_SUB_UMTS_RLC_MAC,
120
  GSMTAP_SUB_UMTS_RRC,
121
  /* LTE*/
122
  GSMTAP_SUB_LTE_RRC,
123
  GSMTAP_SUB_LTE_NAS,
124
  GSMTAP_SUB_LAPD,
125
  GSMTAP_SUB_FR,
126
  GSMTAP_SUB_V5EF,
127
  GSMTAP_SUB_GSM_RLP,
128
  /* E1/T1 */
129
  GSMTAP_SUB_PPP,
130
  GSMTAP_SUB_V120,
131
  GSMTAP_SUB_X75,
132
133
  GSMTAP_SUB_MAX
134
};
135
136
enum {
137
  GSMTAP_SIM_SUB_APDU = 0,
138
  GSMTAP_SIM_SUB_ATR,
139
140
  GSMTAP_SIM_SUB_MAX
141
};
142
143
enum {
144
  GSMTAP_RRC_SUB_DL_DCCH_Message = 0,
145
  GSMTAP_RRC_SUB_UL_DCCH_Message,
146
  GSMTAP_RRC_SUB_DL_CCCH_Message,
147
  GSMTAP_RRC_SUB_UL_CCCH_Message,
148
  GSMTAP_RRC_SUB_PCCH_Message,
149
  GSMTAP_RRC_SUB_DL_SHCCH_Message,
150
  GSMTAP_RRC_SUB_UL_SHCCH_Message,
151
  GSMTAP_RRC_SUB_BCCH_FACH_Message,
152
  GSMTAP_RRC_SUB_BCCH_BCH_Message,
153
  GSMTAP_RRC_SUB_MCCH_Message,
154
  GSMTAP_RRC_SUB_MSCH_Message,
155
  GSMTAP_RRC_SUB_HandoverToUTRANCommand,
156
  GSMTAP_RRC_SUB_InterRATHandoverInfo,
157
  GSMTAP_RRC_SUB_SystemInformation_BCH,
158
  GSMTAP_RRC_SUB_System_Information_Container,
159
  GSMTAP_RRC_SUB_UE_RadioAccessCapabilityInfo,
160
  GSMTAP_RRC_SUB_MasterInformationBlock,
161
  GSMTAP_RRC_SUB_SysInfoType1,
162
  GSMTAP_RRC_SUB_SysInfoType2,
163
  GSMTAP_RRC_SUB_SysInfoType3,
164
  GSMTAP_RRC_SUB_SysInfoType4,
165
  GSMTAP_RRC_SUB_SysInfoType5,
166
  GSMTAP_RRC_SUB_SysInfoType5bis,
167
  GSMTAP_RRC_SUB_SysInfoType6,
168
  GSMTAP_RRC_SUB_SysInfoType7,
169
  GSMTAP_RRC_SUB_SysInfoType8,
170
  GSMTAP_RRC_SUB_SysInfoType9,
171
  GSMTAP_RRC_SUB_SysInfoType10,
172
  GSMTAP_RRC_SUB_SysInfoType11,
173
  GSMTAP_RRC_SUB_SysInfoType11bis,
174
  GSMTAP_RRC_SUB_SysInfoType12,
175
  GSMTAP_RRC_SUB_SysInfoType13,
176
  GSMTAP_RRC_SUB_SysInfoType13_1,
177
  GSMTAP_RRC_SUB_SysInfoType13_2,
178
  GSMTAP_RRC_SUB_SysInfoType13_3,
179
  GSMTAP_RRC_SUB_SysInfoType13_4,
180
  GSMTAP_RRC_SUB_SysInfoType14,
181
  GSMTAP_RRC_SUB_SysInfoType15,
182
  GSMTAP_RRC_SUB_SysInfoType15bis,
183
  GSMTAP_RRC_SUB_SysInfoType15_1,
184
  GSMTAP_RRC_SUB_SysInfoType15_1bis,
185
  GSMTAP_RRC_SUB_SysInfoType15_2,
186
  GSMTAP_RRC_SUB_SysInfoType15_2bis,
187
  GSMTAP_RRC_SUB_SysInfoType15_2ter,
188
  GSMTAP_RRC_SUB_SysInfoType15_3,
189
  GSMTAP_RRC_SUB_SysInfoType15_3bis,
190
  GSMTAP_RRC_SUB_SysInfoType15_4,
191
  GSMTAP_RRC_SUB_SysInfoType15_5,
192
  GSMTAP_RRC_SUB_SysInfoType15_6,
193
  GSMTAP_RRC_SUB_SysInfoType15_7,
194
  GSMTAP_RRC_SUB_SysInfoType15_8,
195
  GSMTAP_RRC_SUB_SysInfoType16,
196
  GSMTAP_RRC_SUB_SysInfoType17,
197
  GSMTAP_RRC_SUB_SysInfoType18,
198
  GSMTAP_RRC_SUB_SysInfoType19,
199
  GSMTAP_RRC_SUB_SysInfoType20,
200
  GSMTAP_RRC_SUB_SysInfoType21,
201
  GSMTAP_RRC_SUB_SysInfoType22,
202
  GSMTAP_RRC_SUB_SysInfoTypeSB1,
203
  GSMTAP_RRC_SUB_SysInfoTypeSB2,
204
  GSMTAP_RRC_SUB_ToTargetRNC_Container,
205
  GSMTAP_RRC_SUB_TargetRNC_ToSourceRNC_Container,
206
207
  GSMTAP_RRC_SUB_MAX
208
};
209
210
static const value_string rrc_sub_types[] = {
211
  { GSMTAP_RRC_SUB_DL_DCCH_Message,     "RRC DL-DCCH" },
212
  { GSMTAP_RRC_SUB_UL_DCCH_Message,     "RRC UL-DCCH" },
213
  { GSMTAP_RRC_SUB_DL_CCCH_Message,     "RRC DL-CCCH" },
214
  { GSMTAP_RRC_SUB_UL_CCCH_Message,     "RRC UL-CCCH" },
215
  { GSMTAP_RRC_SUB_PCCH_Message,        "RRC PCCH" },
216
  { GSMTAP_RRC_SUB_DL_SHCCH_Message,      "RRC DL-SHCCH" },
217
  { GSMTAP_RRC_SUB_UL_SHCCH_Message,      "RRC UL-SHCCH" },
218
  { GSMTAP_RRC_SUB_BCCH_FACH_Message,     "RRC BCCH-FACH" },
219
  { GSMTAP_RRC_SUB_BCCH_BCH_Message,      "RRC BCCH-BCH" },
220
  { GSMTAP_RRC_SUB_MCCH_Message,        "RRC MCCH" },
221
  { GSMTAP_RRC_SUB_MSCH_Message,        "RRC MSCH" },
222
  { GSMTAP_RRC_SUB_HandoverToUTRANCommand,    "RRC Handover To UTRAN Command" },
223
  { GSMTAP_RRC_SUB_InterRATHandoverInfo,      "RRC Inter RAT Handover Info" },
224
  { GSMTAP_RRC_SUB_SystemInformation_BCH,     "RRC System Information - BCH" },
225
  { GSMTAP_RRC_SUB_System_Information_Container,    "RRC System Information Container" },
226
  { GSMTAP_RRC_SUB_UE_RadioAccessCapabilityInfo,    "RRC UE Radio Access Capability Info" },
227
  { GSMTAP_RRC_SUB_MasterInformationBlock,    "RRC Master Information Block" },
228
  { GSMTAP_RRC_SUB_SysInfoType1,        "RRC System Information Type 1" },
229
  { GSMTAP_RRC_SUB_SysInfoType2,        "RRC System Information Type 2" },
230
  { GSMTAP_RRC_SUB_SysInfoType3,        "RRC System Information Type 3" },
231
  { GSMTAP_RRC_SUB_SysInfoType4,        "RRC System Information Type 4" },
232
  { GSMTAP_RRC_SUB_SysInfoType5,        "RRC System Information Type 5" },
233
  { GSMTAP_RRC_SUB_SysInfoType5bis,     "RRC System Information Type 5bis" },
234
  { GSMTAP_RRC_SUB_SysInfoType6,        "RRC System Information Type 6" },
235
  { GSMTAP_RRC_SUB_SysInfoType7,        "RRC System Information Type 7" },
236
  { GSMTAP_RRC_SUB_SysInfoType8,        "RRC System Information Type 8" },
237
  { GSMTAP_RRC_SUB_SysInfoType9,        "RRC System Information Type 9" },
238
  { GSMTAP_RRC_SUB_SysInfoType10,       "RRC System Information Type 10" },
239
  { GSMTAP_RRC_SUB_SysInfoType11,       "RRC System Information Type 11" },
240
  { GSMTAP_RRC_SUB_SysInfoType11bis,      "RRC System Information Type 11bis" },
241
  { GSMTAP_RRC_SUB_SysInfoType12,       "RRC System Information Type 12" },
242
  { GSMTAP_RRC_SUB_SysInfoType13,       "RRC System Information Type 13" },
243
  { GSMTAP_RRC_SUB_SysInfoType13_1,     "RRC System Information Type 13.1" },
244
  { GSMTAP_RRC_SUB_SysInfoType13_2,     "RRC System Information Type 13.2" },
245
  { GSMTAP_RRC_SUB_SysInfoType13_3,     "RRC System Information Type 13.3" },
246
  { GSMTAP_RRC_SUB_SysInfoType13_4,     "RRC System Information Type 13.4" },
247
  { GSMTAP_RRC_SUB_SysInfoType14,       "RRC System Information Type 14" },
248
  { GSMTAP_RRC_SUB_SysInfoType15,       "RRC System Information Type 15" },
249
  { GSMTAP_RRC_SUB_SysInfoType15bis,      "RRC System Information Type 15bis" },
250
  { GSMTAP_RRC_SUB_SysInfoType15_1,     "RRC System Information Type 15.1" },
251
  { GSMTAP_RRC_SUB_SysInfoType15_1bis,      "RRC System Information Type 15.1bis" },
252
  { GSMTAP_RRC_SUB_SysInfoType15_2,     "RRC System Information Type 15.1" },
253
  { GSMTAP_RRC_SUB_SysInfoType15_2bis,      "RRC System Information Type 15.2bis" },
254
  { GSMTAP_RRC_SUB_SysInfoType15_2ter,      "RRC System Information Type 15.2ter" },
255
  { GSMTAP_RRC_SUB_SysInfoType15_3,     "RRC System Information Type 15.3" },
256
  { GSMTAP_RRC_SUB_SysInfoType15_3bis,      "RRC System Information Type 15.3bis" },
257
  { GSMTAP_RRC_SUB_SysInfoType15_4,     "RRC System Information Type 15.4" },
258
  { GSMTAP_RRC_SUB_SysInfoType15_5,     "RRC System Information Type 15.5" },
259
  { GSMTAP_RRC_SUB_SysInfoType15_6,     "RRC System Information Type 15.6" },
260
  { GSMTAP_RRC_SUB_SysInfoType15_7,     "RRC System Information Type 15.7 "},
261
  { GSMTAP_RRC_SUB_SysInfoType15_8,     "RRC System Information Type 15.8" },
262
  { GSMTAP_RRC_SUB_SysInfoType16,       "RRC System Information Type 16" },
263
  { GSMTAP_RRC_SUB_SysInfoType17,       "RRC System Information Type 17" },
264
  { GSMTAP_RRC_SUB_SysInfoType18,       "RRC System Information Type 18" },
265
  { GSMTAP_RRC_SUB_SysInfoType19,       "RRC System Information Type 19" },
266
  { GSMTAP_RRC_SUB_SysInfoType20,       "RRC System Information Type 20" },
267
  { GSMTAP_RRC_SUB_SysInfoType21,       "RRC System Information Type 21" },
268
  { GSMTAP_RRC_SUB_SysInfoType22,       "RRC System Information Type 22" },
269
  { GSMTAP_RRC_SUB_SysInfoTypeSB1,      "RRC System Information Type SB 1" },
270
  { GSMTAP_RRC_SUB_SysInfoTypeSB2,      "RRC System Information Type SB 2" },
271
  { GSMTAP_RRC_SUB_ToTargetRNC_Container,     "RRC To Target RNC Container" },
272
  { GSMTAP_RRC_SUB_TargetRNC_ToSourceRNC_Container, "RRC Target RNC To Source RNC Container" },
273
  { 0,              NULL }
274
};
275
276
/* LTE RRC message types */
277
enum {
278
  GSMTAP_LTE_RRC_SUB_DL_CCCH_Message = 0,
279
  GSMTAP_LTE_RRC_SUB_DL_DCCH_Message,
280
  GSMTAP_LTE_RRC_SUB_UL_CCCH_Message,
281
  GSMTAP_LTE_RRC_SUB_UL_DCCH_Message,
282
  GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message,
283
  GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message,
284
  GSMTAP_LTE_RRC_SUB_PCCH_Message,
285
  GSMTAP_LTE_RRC_SUB_MCCH_Message,
286
  GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_MBMS,
287
  GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_BR,
288
  GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_MBMS,
289
  GSMTAP_LTE_RRC_SUB_SC_MCCH_Message,
290
  GSMTAP_LTE_RRC_SUB_SBCCH_SL_BCH_Message,
291
  GSMTAP_LTE_RRC_SUB_SBCCH_SL_BCH_Message_V2X,
292
  GSMTAP_LTE_RRC_SUB_DL_CCCH_Message_NB,
293
  GSMTAP_LTE_RRC_SUB_DL_DCCH_Message_NB,
294
  GSMTAP_LTE_RRC_SUB_UL_CCCH_Message_NB,
295
  GSMTAP_LTE_RRC_SUB_UL_DCCH_Message_NB,
296
  GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB,
297
  GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_TDD_NB,
298
  GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_NB,
299
  GSMTAP_LTE_RRC_SUB_PCCH_Message_NB,
300
  GSMTAP_LTE_RRC_SUB_SC_MCCH_Message_NB,
301
302
  GSMTAP_LTE_RRC_SUB_MAX
303
};
304
305
/* LTE NAS message types */
306
enum {
307
  GSMTAP_LTE_NAS_PLAIN = 0,
308
  GSMTAP_LTE_NAS_SEC_HEADER,
309
310
  GSMTAP_LTE_NAS_SUB_MAX
311
};
312
313
/*! First byte of type==GSMTAP_TYPE_UM sub_type==GSMTAP_CHANNEL_VOICE payload */
314
enum gsmtap_um_voice_type {
315
  /*! 1 byte TOC + 112 bits (14 octets) = 15 octets payload;
316
   *  Reference is RFC5993 Section 5.2.1 + 3GPP TS 46.030 Annex B */
317
  GSMTAP_UM_VOICE_HR,
318
  /*! 33 payload bytes; Reference is RFC3551 Section 4.5.8.1 */
319
  GSMTAP_UM_VOICE_FR,
320
  /*! 31 payload bytes; Reference is RFC3551 Section 4.5.9 + ETSI TS 101 318 */
321
  GSMTAP_UM_VOICE_EFR,
322
  /*! 1 byte TOC + 5..31 bytes = 6..32 bytes payload; RFC4867 octet-aligned */
323
  GSMTAP_UM_VOICE_AMR,
324
  /* TODO: Revisit the types below; their usage; ... */
325
  GSMTAP_UM_VOICE_AMR_SID_BAD,
326
  GSMTAP_UM_VOICE_AMR_ONSET,
327
  GSMTAP_UM_VOICE_AMR_RATSCCH,
328
  GSMTAP_UM_VOICE_AMR_SID_UPDATE_INH,
329
  GSMTAP_UM_VOICE_AMR_SID_FIRST_P1,
330
  GSMTAP_UM_VOICE_AMR_SID_FIRST_P2,
331
  GSMTAP_UM_VOICE_AMR_SID_FIRST_INH,
332
  GSMTAP_UM_VOICE_AMR_RATSCCH_MARKER,
333
  GSMTAP_UM_VOICE_AMR_RATSCCH_DATA,
334
};
335
336
static dissector_handle_t sub_handles[GSMTAP_SUB_MAX];
337
static dissector_handle_t sim_sub_handles[GSMTAP_SIM_SUB_MAX];
338
static dissector_handle_t rrc_sub_handles[GSMTAP_RRC_SUB_MAX];
339
static dissector_handle_t lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_MAX];
340
static dissector_handle_t lte_nas_sub_handles[GSMTAP_LTE_NAS_SUB_MAX];
341
342
static dissector_table_t gsmtap_dissector_table;
343
344
static const value_string gsmtap_bursts[] = {
345
  { GSMTAP_BURST_UNKNOWN,   "UNKNOWN" },
346
  { GSMTAP_BURST_FCCH,    "FCCH" },
347
  { GSMTAP_BURST_PARTIAL_SCH, "PARTIAL SCH" },
348
  { GSMTAP_BURST_SCH,   "SCH" },
349
  { GSMTAP_BURST_CTS_SCH,   "CTS SCH" },
350
  { GSMTAP_BURST_COMPACT_SCH, "COMPACT SCH" },
351
  { GSMTAP_BURST_NORMAL,    "NORMAL" },
352
  { GSMTAP_BURST_DUMMY,   "DUMMY" },
353
  { GSMTAP_BURST_ACCESS,    "RACH" },
354
  /* WiMAX bursts */
355
  { GSMTAP_BURST_CDMA_CODE, "CDMA Code" },
356
  { GSMTAP_BURST_FCH,   "FCH" },
357
  { GSMTAP_BURST_FFB,   "Fast Feedback" },
358
  { GSMTAP_BURST_PDU,   "PDU" },
359
  { GSMTAP_BURST_HACK,    "HACK" },
360
  { GSMTAP_BURST_PHY_ATTRIBUTES,  "PHY Attributes" },
361
  { 0,        NULL },
362
};
363
364
static const value_string gsmtap_channels[] = {
365
  { GSMTAP_CHANNEL_UNKNOWN, "UNKNOWN" },
366
  { GSMTAP_CHANNEL_BCCH,    "BCCH" },
367
  { GSMTAP_CHANNEL_CCCH,    "CCCH" },
368
  { GSMTAP_CHANNEL_RACH,    "RACH" },
369
  { GSMTAP_CHANNEL_AGCH,    "AGCH" },
370
  { GSMTAP_CHANNEL_PCH,   "PCH" },
371
  { GSMTAP_CHANNEL_SDCCH,   "SDCCH" },
372
  { GSMTAP_CHANNEL_SDCCH4,  "SDCCH/4" },
373
  { GSMTAP_CHANNEL_SDCCH8,  "SDCCH/8" },
374
  { GSMTAP_CHANNEL_TCH_F,   "FACCH/F" },
375
  { GSMTAP_CHANNEL_TCH_H,   "FACCH/H" },
376
  { GSMTAP_CHANNEL_PACCH,   "PACCH" },
377
  { GSMTAP_CHANNEL_CBCH52,  "CBCH" },
378
  { GSMTAP_CHANNEL_PDTCH,   "PDTCH" },
379
  { GSMTAP_CHANNEL_PTCCH,   "PTTCH" },
380
  { GSMTAP_CHANNEL_CBCH51,  "CBCH" },
381
  { GSMTAP_CHANNEL_VOICE_F, "TCH/F" },
382
  { GSMTAP_CHANNEL_VOICE_H, "TCH/H" },
383
384
  { GSMTAP_CHANNEL_ACCH|
385
    GSMTAP_CHANNEL_SDCCH,   "LSACCH" },
386
  { GSMTAP_CHANNEL_ACCH|
387
    GSMTAP_CHANNEL_SDCCH4,  "SACCH/4" },
388
  { GSMTAP_CHANNEL_ACCH|
389
    GSMTAP_CHANNEL_SDCCH8,  "SACCH/8" },
390
  { GSMTAP_CHANNEL_ACCH|
391
    GSMTAP_CHANNEL_TCH_F,   "SACCH/F" },
392
  { GSMTAP_CHANNEL_ACCH|
393
    GSMTAP_CHANNEL_TCH_H,   "SACCH/H" },
394
  { 0,        NULL },
395
};
396
397
static const value_string gsmtap_tetra_channels[] = {
398
  { GSMTAP_TETRA_BSCH,    "BSCH" },
399
  { GSMTAP_TETRA_AACH,    "AACH" },
400
  { GSMTAP_TETRA_SCH_HU,    "SCH/HU" },
401
  { GSMTAP_TETRA_SCH_HD,    "SCH/HD" },
402
  { GSMTAP_TETRA_SCH_F,   "SCH/F" },
403
  { GSMTAP_TETRA_BNCH,    "BNCH" },
404
  { GSMTAP_TETRA_STCH,    "STCH" },
405
  { GSMTAP_TETRA_TCH_F,   "AACH" },
406
  { 0,        NULL },
407
};
408
409
static const value_string gsmtap_gmr1_channels[] = {
410
  { GSMTAP_GMR1_BCCH,   "BCCH" },
411
  { GSMTAP_GMR1_CCCH,   "CCCH" },
412
  { GSMTAP_GMR1_PCH,    "PCH" },
413
  { GSMTAP_GMR1_AGCH,   "AGCH" },
414
  { GSMTAP_GMR1_BACH,   "BACH" },
415
  { GSMTAP_GMR1_RACH,   "RACH" },
416
  { GSMTAP_GMR1_CBCH,   "CBCH" },
417
  { GSMTAP_GMR1_SDCCH,    "SDCCH" },
418
  { GSMTAP_GMR1_TACCH,    "TACCH" },
419
  { GSMTAP_GMR1_GBCH,   "GBCH" },
420
  { GSMTAP_GMR1_TCH3,   "TCH3" },
421
  { GSMTAP_GMR1_TCH3|
422
    GSMTAP_GMR1_FACCH,    "FACCH3" },
423
  { GSMTAP_GMR1_TCH3|
424
    GSMTAP_GMR1_DKAB,   "DKAB" },
425
  { GSMTAP_GMR1_TCH6,   "TCH6" },
426
  { GSMTAP_GMR1_TCH6|
427
    GSMTAP_GMR1_FACCH,    "FACCH6" },
428
  { GSMTAP_GMR1_TCH6|
429
    GSMTAP_GMR1_SACCH,    "SACCH6" },
430
  { GSMTAP_GMR1_TCH9,   "TCH9" },
431
  { GSMTAP_GMR1_TCH9|
432
    GSMTAP_GMR1_FACCH,    "FACCH9" },
433
  { GSMTAP_GMR1_TCH9|
434
    GSMTAP_GMR1_SACCH,    "SACCH9" },
435
  { 0,        NULL },
436
};
437
438
/* Logical channel names for LTE RRC messages according to 3GPP TS 38.331 */
439
static const value_string gsmtap_lte_rrc_channels[] = {
440
  { GSMTAP_LTE_RRC_SUB_DL_CCCH_Message,   "CCCH" },
441
  { GSMTAP_LTE_RRC_SUB_DL_DCCH_Message,   "DCCH" },
442
  { GSMTAP_LTE_RRC_SUB_UL_CCCH_Message,   "CCCH" },
443
  { GSMTAP_LTE_RRC_SUB_UL_DCCH_Message,   "DCCH" },
444
  { GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message,    "BBCH" },
445
  { GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message, "BBCH" },
446
  { GSMTAP_LTE_RRC_SUB_PCCH_Message,    "PCCH" },
447
  { GSMTAP_LTE_RRC_SUB_MCCH_Message,    "MCCH" },
448
  { GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_MBMS, "BBCH" },
449
  { GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_BR,  "BCCH" },
450
  { GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_MBMS,  "BCCH" },
451
  { GSMTAP_LTE_RRC_SUB_SC_MCCH_Message,   "MCCH" },
452
  { GSMTAP_LTE_RRC_SUB_SBCCH_SL_BCH_Message,  "SBCCH" },
453
  { GSMTAP_LTE_RRC_SUB_SBCCH_SL_BCH_Message_V2X,  "SBCCH" },
454
  { GSMTAP_LTE_RRC_SUB_DL_CCCH_Message_NB,  "CCCH" },
455
  { GSMTAP_LTE_RRC_SUB_DL_DCCH_Message_NB,  "DCCH" },
456
  { GSMTAP_LTE_RRC_SUB_UL_CCCH_Message_NB,  "CCCH" },
457
  { GSMTAP_LTE_RRC_SUB_UL_DCCH_Message_NB,  "DCCH" },
458
  { GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB, "BBCH" },
459
  { GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_TDD_NB, "BBCH" },
460
  { GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_NB,  "BCCH" },
461
  { GSMTAP_LTE_RRC_SUB_PCCH_Message_NB,   "PCCH" },
462
  { GSMTAP_LTE_RRC_SUB_SC_MCCH_Message_NB,  "MCCH" },
463
  { 0,            NULL },
464
};
465
466
/* the mapping is not complete */
467
static const int gsmtap_to_tetra[9] = {
468
  0,
469
  TETRA_CHAN_BSCH,
470
  TETRA_CHAN_AACH,
471
  TETRA_CHAN_SCH_HU,
472
  0,
473
  TETRA_CHAN_SCH_F,
474
  TETRA_CHAN_BNCH,
475
  TETRA_CHAN_STCH,
476
  0
477
};
478
479
static const value_string gsmtap_types[] = {
480
  { GSMTAP_TYPE_UM,   "GSM Um (MS<->BTS)" },
481
  { GSMTAP_TYPE_ABIS,   "GSM Abis (BTS<->BSC)" },
482
  { GSMTAP_TYPE_UM_BURST,   "GSM Um burst (MS<->BTS)" },
483
  { GSMTAP_TYPE_SIM,    "SIM" },
484
  { GSMTAP_TYPE_TETRA_I1,   "TETRA V+D" },
485
  { GSMTAP_TTPE_TETRA_I1_BURST, "TETRA V+D burst" },
486
  { GSMTAP_TYPE_WMX_BURST,  "WiMAX burst" },
487
  { GSMTAP_TYPE_GMR1_UM,    "GMR-1 air interface (MES-MS<->GTS)" },
488
  { GSMTAP_TYPE_UMTS_RLC_MAC, "UMTS RLC/MAC" },
489
  { GSMTAP_TYPE_UMTS_RRC,   "UMTS RRC" },
490
  { GSMTAP_TYPE_LTE_RRC,    "LTE RRC" },
491
  { GSMTAP_TYPE_LTE_MAC,    "LTE MAC" },
492
  { GSMTAP_TYPE_LTE_MAC_FRAMED, "LTE MAC framed" },
493
  { GSMTAP_TYPE_OSMOCORE_LOG, "libosmocore logging" },
494
  { GSMTAP_TYPE_QC_DIAG,    "Qualcomm DIAG" },
495
  { GSMTAP_TYPE_LTE_NAS,    "LTE NAS" },
496
  { GSMTAP_TYPE_E1T1,   "E1/T1" },
497
  { GSMTAP_TYPE_GSM_RLP,    "GSM RLP" },
498
  { 0,        NULL },
499
};
500
501
static const value_string gsmtap_um_voice_types[] = {
502
  { GSMTAP_UM_VOICE_HR,     "HR" },
503
  { GSMTAP_UM_VOICE_FR,     "FR" },
504
  { GSMTAP_UM_VOICE_EFR,      "EFR" },
505
  { GSMTAP_UM_VOICE_AMR,      "AMR" },
506
  { GSMTAP_UM_VOICE_AMR_SID_BAD,    "AMR_SID_BAD" },
507
  { GSMTAP_UM_VOICE_AMR_ONSET,    "AMR_ONSET" },
508
  { GSMTAP_UM_VOICE_AMR_RATSCCH,    "AMR_RATSCCH" },
509
  { GSMTAP_UM_VOICE_AMR_SID_UPDATE_INH, "AMR_SID_UPDATE_INH" },
510
  { GSMTAP_UM_VOICE_AMR_SID_FIRST_P1, "AMR_SID_FIRST_P1" },
511
  { GSMTAP_UM_VOICE_AMR_SID_FIRST_P2, "AMR_SID_FIRST_P2" },
512
  { GSMTAP_UM_VOICE_AMR_SID_FIRST_INH,  "AMR_SID_FIRST_INH" },
513
  { GSMTAP_UM_VOICE_AMR_RATSCCH_MARKER, "AMR_RATSCCH_MARKER" },
514
  { GSMTAP_UM_VOICE_AMR_RATSCCH_DATA, "AMR_RATSCCH_DATA" },
515
  { 0,          NULL },
516
};
517
518
static const value_string gsmtap_um_e1t1_types[] = {
519
  { GSMTAP_E1T1_LAPD,     "LAPD" }, /* ISDN LAPD Q.921 */
520
  { GSMTAP_E1T1_FR,     "FR" },   /* Frame Relay */
521
  { GSMTAP_E1T1_RAW,      "RAW" },  /* RAW/transparent B-channels */
522
  { GSMTAP_E1T1_TRAU16,     "TRAU 16k" }, /* 16k/s sub-channels (I.460) with GSM TRAU frames */
523
  { GSMTAP_E1T1_TRAU8,      "TRAU 8k" },  /* 8k/s sub-channels (I.460) with GSM TRAU frames */
524
  { GSMTAP_E1T1_V5EF,     "V5-EF" },  /* V5 Envelope Function */
525
  { GSMTAP_E1T1_X75,      "X.75" }, /* X.75 B-channel data */
526
  { GSMTAP_E1T1_V120,     "V.120" },  /* V.120 B-channel data */
527
  { GSMTAP_E1T1_V110,     "V.110" },  /* V.110 B-channel data */
528
  { GSMTAP_E1T1_H221,     "H.221" },  /* H.221 B-channel data */
529
  { GSMTAP_E1T1_PPP,      "PPP" },  /* PPP */
530
  { 0,          NULL },
531
};
532
533
static const value_string gsmtap_sim_types[] = {
534
  { GSMTAP_SIM_APDU,  "APDU" },
535
  { GSMTAP_SIM_ATR, "ATR" },
536
  { GSMTAP_SIM_PPS_REQ, "PPS request" },
537
  { GSMTAP_SIM_PPS_RSP, "PPS response" },
538
  { GSMTAP_SIM_TPDU_HDR,  "TPDU command header" },
539
  { GSMTAP_SIM_TPDU_CMD,  "TPDU command body" },
540
  { GSMTAP_SIM_TPDU_RSP,  "TPDU response body" },
541
  { GSMTAP_SIM_TPDU_SW, "TPDU response trailer" },
542
  { 0,      NULL },
543
};
544
545
/* dissect a SACCH L1 header which is included in the first 2 bytes
546
 * of every SACCH frame (according to TS 04.04) */
547
static void
548
dissect_sacch_l1h(tvbuff_t *tvb, proto_tree *tree)
549
21
{
550
21
  proto_item *ti;
551
21
  proto_tree *l1h_tree = NULL;
552
553
21
  if (!tree)
554
0
    return;
555
556
21
  ti = proto_tree_add_protocol_format(tree, proto_gsmtap, tvb, 0, 2,
557
21
      "SACCH L1 Header, Power Level: %u, Timing Advance: %u",
558
21
      tvb_get_uint8(tvb, 0) & 0x1f,
559
21
      tvb_get_uint8(tvb, 1));
560
21
  l1h_tree = proto_item_add_subtree(ti, ett_gsmtap);
561
  /* Power Level */
562
21
  proto_tree_add_item(l1h_tree, hf_sacch_l1h_power_lev, tvb, 0, 1, ENC_BIG_ENDIAN);
563
  /* Fast Power Control */
564
21
  proto_tree_add_item(l1h_tree, hf_sacch_l1h_fpc, tvb, 0, 1, ENC_BIG_ENDIAN);
565
  /* SRO/SRR (SACCH Repetition) bit */
566
21
  proto_tree_add_item(l1h_tree, hf_sacch_l1h_sro_srr, tvb, 0, 1, ENC_BIG_ENDIAN);
567
  /* Actual Timing Advance */
568
21
  proto_tree_add_item(l1h_tree, hf_sacch_l1h_ta, tvb, 1, 1, ENC_BIG_ENDIAN);
569
21
}
570
571
/* Dissect a PTCCH/D (Packet Timing Advance Control Channel) message.
572
 * See 3GPP TS 45.010, section 5.6.2 and 3GPP TS 45.002, section 3.3.4.2.
573
 *
574
 *   +--------------+--------------+-----+---------------+------------------+
575
 *   |    Octet 1   |    Octet 2   |     |    Octet 16   |  Octet 17 .. 23  |
576
 *   +---+----------+---+----------+-----+---+-----------+------------------+
577
 *   | 0 | TA TAI=0 | 0 | TA TAI=1 | ... | 0 | TA TAI=15 | Padding 00101011 |
578
 *   +---+----------+---+----------+-----+---+-----------+------------------+
579
 */
580
static void
581
dissect_ptcch_dl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
582
1
{
583
1
  proto_tree *sub_tree;
584
1
  proto_item *ti, *gi;
585
1
  int offset;
586
587
1
  col_set_str(pinfo->cinfo, COL_INFO, "Packet Timing Advance Control");
588
589
1
  if (!tree)
590
0
    return;
591
592
1
  ti = proto_tree_add_protocol_format(tree, proto_gsmtap, tvb, 0, 23,
593
1
    "PTCCH (Packet Timing Advance Control Channel) on Downlink");
594
1
  sub_tree = proto_item_add_subtree(ti, ett_gsmtap);
595
596
17
  for (offset = 0; offset < 16; offset++) {
597
    /* Meta info: Timing Advance Index */
598
16
    gi = proto_tree_add_uint(sub_tree, hf_ptcch_ta_idx, tvb, 0, 0, offset);
599
16
    proto_item_set_generated(gi);
600
601
16
    proto_tree_add_item(sub_tree, hf_ptcch_spare, tvb, offset, 1, ENC_NA);
602
16
    proto_tree_add_item(sub_tree, hf_ptcch_ta_val, tvb, offset, 1, ENC_NA);
603
16
  }
604
605
  /* Spare padding */
606
1
  proto_tree_add_item(sub_tree, hf_ptcch_padding, tvb, offset, -1, ENC_NA);
607
1
}
608
609
static void
610
handle_lapdm(uint8_t sub_type, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
611
14
{
612
14
  lapdm_data_t ld;
613
614
14
  ld.is_acch = (sub_type & GSMTAP_CHANNEL_ACCH) != 0;
615
14
  call_dissector_with_data(sub_handles[GSMTAP_SUB_UM_LAPDM], tvb, pinfo, tree, &ld);
616
14
}
617
618
static void
619
handle_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
620
1
{
621
1
  uint8_t channel_type = GSMTAP_CHANNEL_RACH;
622
1
  call_dissector_with_data(sub_handles[GSMTAP_SUB_UM], tvb, pinfo, tree, &channel_type);
623
1
}
624
625
static void
626
dissect_um_voice(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
627
2
{
628
2
  tvbuff_t *payload_tvb;
629
2
  uint8_t vtype = tvb_get_uint8(tvb, 0);
630
631
2
  col_add_fstr(pinfo->cinfo, COL_INFO, "GSM CS User Plane (Voice/CSD): %s",
632
2
      val_to_str(pinfo->pool, vtype, gsmtap_um_voice_types, "Unknown %d"));
633
634
2
  proto_tree_add_item(tree, hf_um_voice_type, tvb, 0, 1, ENC_NA);
635
636
2
  payload_tvb = tvb_new_subset_remaining(tvb, 1);
637
2
  call_dissector(sub_handles[GSMTAP_SUB_DATA], payload_tvb, pinfo, tree);
638
2
}
639
640
static void
641
handle_tetra(int channel, tvbuff_t *payload_tvb, packet_info *pinfo, proto_tree *tree)
642
23
{
643
23
  int tetra_chan;
644
23
  if (channel < 0 || channel > GSMTAP_TETRA_TCH_F)
645
1
    return;
646
647
22
  tetra_chan = gsmtap_to_tetra[channel];
648
22
  if (tetra_chan <= 0)
649
1
    return;
650
651
21
  tetra_dissect_pdu(tetra_chan, TETRA_DOWNLINK, payload_tvb, tree, pinfo);
652
21
}
653
654
/* length of an EGPRS RLC data block for given MCS */
655
static const unsigned data_block_len_by_mcs[] = {
656
  0,  /* MCS0 */
657
  22, /* MCS1 */
658
  28,
659
  37,
660
  44,
661
  56,
662
  74,
663
  56,
664
  68,
665
  74, /* MCS9 */
666
  0,  /* MCS_INVALID */
667
};
668
669
/* determine the number of rlc data blocks and their size / offsets */
670
static void
671
setup_rlc_mac_priv(RlcMacPrivateData_t *rm, bool is_uplink,
672
  unsigned *n_calls, unsigned *data_block_bits, unsigned *data_block_offsets)
673
38
{
674
38
  unsigned nc, dbl = 0, dbo[2] = {0,0};
675
676
38
  dbl = data_block_len_by_mcs[rm->mcs];
677
678
38
  switch (rm->block_format) {
679
14
  case RLCMAC_HDR_TYPE_1:
680
14
    nc = 3;
681
14
    dbo[0] = is_uplink ? 5*8 + 6 : 5*8 + 0;
682
14
    dbo[1] = dbo[0] + dbl * 8 + 2;
683
14
    break;
684
12
  case RLCMAC_HDR_TYPE_2:
685
12
    nc = 2;
686
12
    dbo[0] = is_uplink ? 4*8 + 5 : 3*8 + 4;
687
12
    break;
688
12
  case RLCMAC_HDR_TYPE_3:
689
12
    nc = 2;
690
12
    dbo[0] = 3*8 + 7;
691
12
    break;
692
0
  default:
693
0
    nc = 1;
694
0
    break;
695
38
  }
696
697
38
  *n_calls = nc;
698
38
  *data_block_bits = dbl * 8 + 2;
699
38
  data_block_offsets[0] = dbo[0];
700
38
  data_block_offsets[1] = dbo[1];
701
38
}
702
703
/* bit-shift the entire 'src' of length 'length_bytes' by 'offset_bits'
704
 * and store the reuslt to caller-allocated 'buffer'.  The shifting is
705
 * done lsb-first, unlike tvb_new_octet_aligned() */
706
static void clone_aligned_buffer_lsbf(unsigned offset_bits, unsigned length_bytes,
707
  const uint8_t *src, uint8_t *buffer)
708
41
{
709
41
  unsigned hdr_bytes;
710
41
  unsigned extra_bits;
711
41
  unsigned i;
712
713
41
  uint8_t c, last_c;
714
41
  uint8_t *dst;
715
716
41
  hdr_bytes = offset_bits / 8;
717
41
  extra_bits = offset_bits % 8;
718
719
41
  if (extra_bits == 0) {
720
    /* It is aligned already */
721
6
    memmove(buffer, src + hdr_bytes, length_bytes);
722
6
    return;
723
6
  }
724
725
35
  dst = buffer;
726
35
  src = src + hdr_bytes;
727
35
  last_c = *(src++);
728
729
1.75k
  for (i = 0; i < length_bytes; i++) {
730
1.71k
    c = src[i];
731
1.71k
    *(dst++) = (last_c >> extra_bits) | (c << (8 - extra_bits));
732
1.71k
    last_c = c;
733
1.71k
  }
734
35
}
735
736
/* obtain an (aligned) EGPRS data block with given bit-offset and
737
 * bit-length from the parent TVB */
738
static tvbuff_t *get_egprs_data_block(tvbuff_t *tvb, unsigned offset_bits,
739
  unsigned length_bits, packet_info *pinfo)
740
49
{
741
49
  tvbuff_t *aligned_tvb;
742
49
  const unsigned initial_spare_bits = 6;
743
49
  uint8_t *aligned_buf;
744
49
  unsigned min_src_length_bytes = (offset_bits + length_bits + 7) / 8;
745
49
  unsigned length_bytes = (initial_spare_bits + length_bits + 7) / 8;
746
747
49
  tvb_ensure_bytes_exist(tvb, 0, min_src_length_bytes);
748
749
49
  aligned_buf = (uint8_t *) wmem_alloc(pinfo->pool, length_bytes);
750
751
  /* Copy the data out of the tvb to an aligned buffer */
752
49
  clone_aligned_buffer_lsbf(
753
49
    offset_bits - initial_spare_bits, length_bytes,
754
49
    tvb_get_ptr(tvb, 0, min_src_length_bytes),
755
49
    aligned_buf);
756
757
  /* clear spare bits and move block header bits to the right */
758
49
  aligned_buf[0] = aligned_buf[0] >> initial_spare_bits;
759
760
49
  aligned_tvb = tvb_new_child_real_data(tvb, aligned_buf,
761
49
    length_bytes, length_bytes);
762
49
  add_new_data_source(pinfo, aligned_tvb, "Aligned EGPRS data bits");
763
764
49
  return aligned_tvb;
765
49
}
766
767
static void tvb_len_get_mcs_and_fmt(unsigned len, bool is_uplink, unsigned *frm, uint8_t *mcs)
768
111
{
769
111
  if (len <= 5 && is_uplink) {
770
    /* Assume random access burst */
771
2
    *frm = RLCMAC_PRACH;
772
2
    *mcs = 0;
773
2
    return;
774
2
  }
775
776
109
  switch (len)
777
109
  {
778
1
  case 23:  *frm = RLCMAC_CS1; *mcs = 0; break;
779
2
  case 34:  *frm = RLCMAC_CS2; *mcs = 0; break;
780
1
  case 40:  *frm = RLCMAC_CS3; *mcs = 0; break;
781
1
  case 54:  *frm = RLCMAC_CS4; *mcs = 0; break;
782
2
  case 27:  *frm = RLCMAC_HDR_TYPE_3; *mcs = 1; break;
783
3
  case 33:  *frm = RLCMAC_HDR_TYPE_3; *mcs = 2; break;
784
2
  case 42:  *frm = RLCMAC_HDR_TYPE_3; *mcs = 3; break;
785
5
  case 49:  *frm = RLCMAC_HDR_TYPE_3; *mcs = 4; break;
786
5
  case 60:  /* fall through */
787
6
  case 61:  *frm = RLCMAC_HDR_TYPE_2; *mcs = 5; break;
788
3
  case 78:  /* fall through */
789
6
  case 79:  *frm = RLCMAC_HDR_TYPE_2; *mcs = 6; break;
790
5
  case 118: /* fall through */
791
6
  case 119: *frm = RLCMAC_HDR_TYPE_1; *mcs = 7; break;
792
2
  case 142: /* fall through */
793
3
  case 143: *frm = RLCMAC_HDR_TYPE_1; *mcs = 8; break;
794
3
  case 154: /* fall through */
795
5
  case 155: *frm = RLCMAC_HDR_TYPE_1; *mcs = 9; break;
796
66
  default:  *frm = RLCMAC_CS1; *mcs = 0; break; /* TODO: report error instead */
797
109
  }
798
109
}
799
800
static void
801
handle_rlcmac(uint32_t frame_nr, tvbuff_t *payload_tvb, packet_info *pinfo, proto_tree *tree)
802
111
{
803
804
111
  int sub_handle;
805
111
  RlcMacPrivateData_t rlcmac_data = {0};
806
111
  tvbuff_t *data_tvb;
807
111
  unsigned data_block_bits, data_block_offsets[2];
808
111
  unsigned num_calls;
809
111
  bool is_uplink;
810
811
111
  if (pinfo->p2p_dir == P2P_DIR_SENT) {
812
39
    is_uplink = 1;
813
39
    sub_handle = GSMTAP_SUB_UM_RLC_MAC_UL;
814
72
  } else {
815
72
    is_uplink = 0;
816
72
    sub_handle = GSMTAP_SUB_UM_RLC_MAC_DL;
817
72
  }
818
819
111
  rlcmac_data.magic = GSM_RLC_MAC_MAGIC_NUMBER;
820
111
  rlcmac_data.frame_number = frame_nr;
821
822
111
  tvb_len_get_mcs_and_fmt(tvb_reported_length(payload_tvb), is_uplink,
823
111
        (unsigned *) &rlcmac_data.block_format,
824
111
        (uint8_t *) &rlcmac_data.mcs);
825
826
111
  switch (rlcmac_data.block_format) {
827
14
  case RLCMAC_HDR_TYPE_1:
828
26
  case RLCMAC_HDR_TYPE_2:
829
38
  case RLCMAC_HDR_TYPE_3:
830
    /* First call of RLC/MAC dissector for header */
831
38
    call_dissector_with_data(sub_handles[sub_handle], payload_tvb,
832
38
           pinfo, tree, (void *) &rlcmac_data);
833
834
    /* now determine how to proceed for data */
835
38
    setup_rlc_mac_priv(&rlcmac_data, is_uplink,
836
38
           &num_calls, &data_block_bits, data_block_offsets);
837
838
    /* and call dissector one or two time for the data blocks */
839
38
    if (num_calls >= 2) {
840
38
      rlcmac_data.flags = GSM_RLC_MAC_EGPRS_BLOCK1;
841
38
      data_tvb = get_egprs_data_block(payload_tvb, data_block_offsets[0],
842
38
              data_block_bits, pinfo);
843
38
      call_dissector_with_data(sub_handles[sub_handle], data_tvb, pinfo, tree,
844
38
             (void *) &rlcmac_data);
845
38
    }
846
38
    if (num_calls == 3) {
847
11
      rlcmac_data.flags = GSM_RLC_MAC_EGPRS_BLOCK2;
848
11
      data_tvb = get_egprs_data_block(payload_tvb, data_block_offsets[1],
849
11
              data_block_bits, pinfo);
850
11
      call_dissector_with_data(sub_handles[sub_handle], data_tvb, pinfo, tree,
851
11
             (void *) &rlcmac_data);
852
11
    }
853
38
    break;
854
73
  default:
855
    /* regular GPRS CS doesn't need any
856
     * shifting/re-alignment or even separate calls for
857
     * header and data blocks.  We simply call the dissector
858
     * as-is */
859
73
    call_dissector_with_data(sub_handles[sub_handle], payload_tvb, pinfo, tree,
860
73
           (void *) &rlcmac_data);
861
111
  }
862
111
}
863
864
/* dissect a GSMTAP v2 header and hand payload off to respective dissector */
865
static int
866
dissect_gsmtap_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
867
17.9k
{
868
17.9k
  int sub_handle, sub_handle_idx = 0, len, offset = 0;
869
17.9k
  proto_item *ti;
870
17.9k
  proto_tree *gsmtap_tree = NULL;
871
17.9k
  tvbuff_t *payload_tvb, *l1h_tvb = NULL;
872
17.9k
  uint8_t hdr_len, type, sub_type, timeslot, subslot;
873
17.9k
  uint16_t arfcn;
874
17.9k
  uint32_t frame_nr;
875
876
17.9k
  len = tvb_reported_length(tvb);
877
878
17.9k
  hdr_len = tvb_get_uint8(tvb, offset + 1) <<2;
879
17.9k
  type = tvb_get_uint8(tvb, offset + 2);
880
17.9k
  timeslot = tvb_get_uint8(tvb, offset + 3);
881
17.9k
  arfcn = tvb_get_ntohs(tvb, offset + 4);
882
17.9k
  frame_nr = tvb_get_ntohl(tvb, offset + 8);
883
17.9k
  sub_type = tvb_get_uint8(tvb, offset + 12);
884
17.9k
  subslot = tvb_get_uint8(tvb, offset + 14);
885
886
  /* In case of a SACCH, there is a two-byte L1 header in front
887
   * of the packet (see TS 04.04) */
888
17.9k
  if (type == GSMTAP_TYPE_UM &&
889
162
      sub_type & GSMTAP_CHANNEL_ACCH) {
890
21
    l1h_tvb = tvb_new_subset_length(tvb, hdr_len, 2);
891
21
    payload_tvb = tvb_new_subset_length(tvb, hdr_len+2, len-(hdr_len+2));
892
17.9k
  } else {
893
17.9k
    payload_tvb = tvb_new_subset_length(tvb, hdr_len, len-hdr_len);
894
17.9k
  }
895
896
  /* We don't want any UDP related info left in the INFO field, as the
897
   * gsm_a_dtap dissector will not clear but only append */
898
17.9k
  col_clear(pinfo->cinfo, COL_INFO);
899
900
17.9k
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "GSMTAP");
901
902
17.9k
  ti = proto_tree_add_protocol_format(tree, proto_gsmtap, tvb, 0, hdr_len,
903
17.9k
    "GSM TAP Header");
904
17.9k
  gsmtap_tree = proto_item_add_subtree(ti, ett_gsmtap);
905
17.9k
  proto_tree_add_item(gsmtap_tree, hf_gsmtap_version,
906
17.9k
          tvb, offset, 1, ENC_BIG_ENDIAN);
907
17.9k
  proto_tree_add_uint(gsmtap_tree, hf_gsmtap_hdrlen,
908
17.9k
          tvb, offset+1, 1, hdr_len);
909
17.9k
  proto_tree_add_item(gsmtap_tree, hf_gsmtap_type,
910
17.9k
          tvb, offset+2, 1, ENC_BIG_ENDIAN);
911
  /* Some GSMTAP types are completely unrelated to the Um air interface */
912
17.9k
  if (dissector_try_uint(gsmtap_dissector_table, type, payload_tvb,
913
17.9k
             pinfo, tree))
914
13
    return tvb_captured_length(tvb);
915
916
17.9k
  if (arfcn & GSMTAP_ARFCN_F_UPLINK) {
917
2.62k
    col_set_str(pinfo->cinfo, COL_RES_NET_SRC, "MS");
918
2.62k
    col_set_str(pinfo->cinfo, COL_RES_NET_DST, "BTS");
919
    /* p2p_dir is used by the LAPDm dissector */
920
2.62k
    pinfo->p2p_dir = P2P_DIR_SENT;
921
15.3k
  } else {
922
15.3k
    col_set_str(pinfo->cinfo, COL_RES_NET_SRC, "BTS");
923
15.3k
    switch (sub_type & ~GSMTAP_CHANNEL_ACCH) {
924
5.18k
    case GSMTAP_CHANNEL_BCCH:
925
5.64k
    case GSMTAP_CHANNEL_CCCH:
926
5.85k
    case GSMTAP_CHANNEL_PCH:
927
5.89k
    case GSMTAP_CHANNEL_AGCH:
928
5.96k
    case GSMTAP_CHANNEL_CBCH51:
929
6.07k
    case GSMTAP_CHANNEL_CBCH52:
930
6.19k
    case GSMTAP_CHANNEL_PTCCH:
931
6.19k
      col_set_str(pinfo->cinfo, COL_RES_NET_DST, "Broadcast");
932
6.19k
      break;
933
9.12k
    default:
934
9.12k
      col_set_str(pinfo->cinfo, COL_RES_NET_DST, "MS");
935
9.12k
      break;
936
15.3k
    }
937
    /* p2p_dir is used by the LAPDm dissector */
938
15.3k
    pinfo->p2p_dir = P2P_DIR_RECV;
939
15.3k
  }
940
941
  /* Try to build an identifier of different 'streams' */
942
  /* (AFCN _cant_ be used because of hopping */
943
17.9k
  conversation_set_elements_by_id(pinfo, CONVERSATION_GSMTAP, (timeslot << 3) | subslot);
944
945
17.9k
  if (tree) {
946
17.9k
    if (type == GSMTAP_TYPE_SIM) {
947
      /* Skip parsing radio fields for SIM type. */
948
331
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_radio_fields,
949
331
          tvb, offset+3, 9, ENC_NA);
950
331
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_sim_sub_type,
951
331
          tvb, offset+12, 1, ENC_BIG_ENDIAN);
952
331
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_radio_fields,
953
331
          tvb, offset+13, 2, ENC_NA);
954
17.6k
    } else {
955
17.6k
      uint8_t channel;
956
17.6k
      const char *channel_str;
957
17.6k
      channel = tvb_get_uint8(tvb, offset+12);
958
17.6k
      if (type == GSMTAP_TYPE_TETRA_I1)
959
23
        channel_str = val_to_str(pinfo->pool, channel, gsmtap_tetra_channels, "Unknown: %d");
960
17.5k
      else if (type == GSMTAP_TYPE_GMR1_UM)
961
39
        channel_str = val_to_str(pinfo->pool, channel, gsmtap_gmr1_channels, "Unknown: %d");
962
17.5k
      else if (type == GSMTAP_TYPE_LTE_RRC)
963
9.45k
        channel_str = val_to_str(pinfo->pool, channel, gsmtap_lte_rrc_channels, "Unknown: %d");
964
8.09k
      else
965
8.09k
        channel_str = val_to_str(pinfo->pool, channel, gsmtap_channels, "Unknown: %d");
966
967
17.6k
      proto_item_append_text(ti, ", ARFCN: %u (%s), TS: %u, Channel: %s (%u)",
968
17.6k
        arfcn & GSMTAP_ARFCN_MASK,
969
17.6k
        arfcn & GSMTAP_ARFCN_F_UPLINK ? "Uplink" : "Downlink",
970
17.6k
        tvb_get_uint8(tvb, offset+3),
971
17.6k
        channel_str,
972
17.6k
        tvb_get_uint8(tvb, offset+14));
973
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_timeslot,
974
17.6k
          tvb, offset+3, 1, ENC_BIG_ENDIAN);
975
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_arfcn,
976
17.6k
          tvb, offset+4, 2, ENC_BIG_ENDIAN);
977
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_uplink,
978
17.6k
          tvb, offset+4, 2, ENC_BIG_ENDIAN);
979
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_pcs,
980
17.6k
          tvb, offset+4, 2, ENC_BIG_ENDIAN);
981
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_signal_dbm,
982
17.6k
          tvb, offset+6, 1, ENC_BIG_ENDIAN);
983
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_snr_db,
984
17.6k
          tvb, offset+7, 1, ENC_BIG_ENDIAN);
985
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_frame_nr,
986
17.6k
          tvb, offset+8, 4, ENC_BIG_ENDIAN);
987
17.6k
      if (type == GSMTAP_TYPE_UM_BURST)
988
1
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_burst_type,
989
1
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
990
17.6k
      else if (type == GSMTAP_TYPE_UM)
991
162
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_channel_type,
992
162
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
993
17.4k
      else if (type == GSMTAP_TYPE_TETRA_I1)
994
23
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_tetra_channel_type,
995
23
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
996
17.4k
      else if (type == GSMTAP_TYPE_WMX_BURST)
997
2
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_burst_type,
998
2
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
999
17.4k
      else if (type == GSMTAP_TYPE_GMR1_UM)
1000
39
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_gmr1_channel_type,
1001
39
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
1002
17.3k
      else if (type == GSMTAP_TYPE_LTE_RRC)
1003
9.45k
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_lte_rrc_channel_type,
1004
9.45k
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
1005
7.93k
      else if (type == GSMTAP_TYPE_UMTS_RRC)
1006
6.92k
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_rrc_sub_type,
1007
6.92k
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
1008
1.00k
      else if (type == GSMTAP_TYPE_E1T1)
1009
247
        proto_tree_add_item(gsmtap_tree, hf_gsmtap_e1t1_sub_type,
1010
247
            tvb, offset+12, 1, ENC_BIG_ENDIAN);
1011
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_antenna,
1012
17.6k
          tvb, offset+13, 1, ENC_BIG_ENDIAN);
1013
17.6k
      proto_tree_add_item(gsmtap_tree, hf_gsmtap_subslot,
1014
17.6k
          tvb, offset+14, 1, ENC_BIG_ENDIAN);
1015
17.6k
    }
1016
17.9k
    proto_tree_add_item(gsmtap_tree, hf_gsmtap_res, tvb, offset+15, 1, ENC_BIG_ENDIAN);
1017
17.9k
  }
1018
1019
17.9k
  switch (type) {
1020
331
  case GSMTAP_TYPE_SIM:
1021
331
    sub_handle = GSMTAP_SUB_SIM;
1022
331
    switch (sub_type) {
1023
7
    case GSMTAP_SIM_ATR:
1024
7
      sub_handle_idx = GSMTAP_SIM_SUB_ATR;
1025
7
      break;
1026
324
    default:
1027
324
      sub_handle_idx = GSMTAP_SIM_SUB_APDU;
1028
324
      break;
1029
331
    }
1030
331
    break;
1031
6.92k
  case GSMTAP_TYPE_UMTS_RRC:
1032
6.92k
    sub_handle = GSMTAP_SUB_UMTS_RRC;
1033
6.92k
    sub_handle_idx = sub_type;
1034
6.92k
    if (sub_handle_idx >= GSMTAP_RRC_SUB_MAX) {
1035
1
      sub_handle = GSMTAP_SUB_DATA;
1036
1
    }
1037
    /* make entry in the Protocol column on summary display.
1038
     * Normally, the RRC dissector would be doing this, but
1039
     * we are bypassing dissect_rrc() and directly call a
1040
     * sub-dissector */
1041
6.92k
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "RRC");
1042
6.92k
    break;
1043
9.45k
  case GSMTAP_TYPE_LTE_RRC:
1044
9.45k
    sub_handle = GSMTAP_SUB_LTE_RRC;
1045
9.45k
    sub_handle_idx = sub_type;
1046
9.45k
    if (sub_handle_idx >= GSMTAP_LTE_RRC_SUB_MAX) {
1047
1
      sub_handle = GSMTAP_SUB_DATA;
1048
1
    }
1049
    /*Directly call the respective lte rrc message dissector */
1050
9.45k
    break;
1051
9
  case GSMTAP_TYPE_LTE_NAS:
1052
9
    sub_handle = GSMTAP_SUB_LTE_NAS;
1053
9
    sub_handle_idx = sub_type;
1054
9
    if (sub_handle_idx >= GSMTAP_LTE_NAS_SUB_MAX) {
1055
1
      sub_handle = GSMTAP_SUB_DATA;
1056
1
    }
1057
9
    break;
1058
1059
162
  case GSMTAP_TYPE_UM:
1060
162
    if (l1h_tvb)
1061
21
      dissect_sacch_l1h(l1h_tvb, tree);
1062
162
    switch (sub_type & ~GSMTAP_CHANNEL_ACCH) {
1063
2
    case GSMTAP_CHANNEL_BCCH:
1064
4
    case GSMTAP_CHANNEL_CCCH:
1065
6
    case GSMTAP_CHANNEL_PCH:
1066
8
    case GSMTAP_CHANNEL_AGCH:
1067
      /* FIXME: we might want to skip idle frames */
1068
8
      sub_handle = GSMTAP_SUB_UM;
1069
8
      break;
1070
2
    case GSMTAP_CHANNEL_SDCCH:
1071
6
    case GSMTAP_CHANNEL_SDCCH4:
1072
9
    case GSMTAP_CHANNEL_SDCCH8:
1073
11
    case GSMTAP_CHANNEL_TCH_F:
1074
14
    case GSMTAP_CHANNEL_TCH_H:
1075
14
      handle_lapdm(sub_type, payload_tvb, pinfo, tree);
1076
14
      return tvb_captured_length(tvb);
1077
11
    case GSMTAP_CHANNEL_PACCH:
1078
11
      if (pinfo->p2p_dir == P2P_DIR_SENT) {
1079
6
        sub_handle = GSMTAP_SUB_UM_RLC_MAC_UL;
1080
6
      }
1081
5
      else
1082
5
      {
1083
5
        sub_handle = GSMTAP_SUB_UM_RLC_MAC_DL;
1084
5
      }
1085
11
      break;
1086
111
    case GSMTAP_CHANNEL_PDTCH:
1087
111
      handle_rlcmac(frame_nr, payload_tvb, pinfo, tree);
1088
111
      return tvb_captured_length(tvb);
1089
    /* See 3GPP TS 45.003, section 5.2 "Packet control channels" */
1090
2
    case GSMTAP_CHANNEL_PTCCH:
1091
      /* PTCCH/D carries Timing Advance updates encoded with CS-1 */
1092
2
      if (pinfo->p2p_dir == P2P_DIR_RECV) {
1093
1
        dissect_ptcch_dl(payload_tvb, pinfo, tree);
1094
1
        return tvb_captured_length(tvb);
1095
1
      }
1096
1097
      /* PTCCH/U carries Access Bursts for Timing Advance estimation */
1098
1
      sub_handle = GSMTAP_SUB_DATA;
1099
1
      break;
1100
1101
9
    case GSMTAP_CHANNEL_CBCH51:
1102
11
    case GSMTAP_CHANNEL_CBCH52:
1103
11
      sub_handle = GSMTAP_SUB_CBCH;
1104
11
      break;
1105
1106
1
    case GSMTAP_CHANNEL_VOICE_F:
1107
2
    case GSMTAP_CHANNEL_VOICE_H:
1108
2
      dissect_um_voice(payload_tvb, pinfo, tree);
1109
2
      return tvb_captured_length(tvb);
1110
1111
1
    case GSMTAP_CHANNEL_RACH:
1112
1
      handle_rach(payload_tvb, pinfo, tree);
1113
1
      return tvb_captured_length(tvb);
1114
1115
2
    default:
1116
2
      sub_handle = GSMTAP_SUB_DATA;
1117
2
      break;
1118
162
    }
1119
33
    break;
1120
391
  case GSMTAP_TYPE_ABIS:
1121
391
    sub_handle = GSMTAP_SUB_ABIS;
1122
391
    break;
1123
313
  case GSMTAP_TYPE_GB_LLC:
1124
313
    sub_handle = GSMTAP_SUB_LLC;
1125
313
    break;
1126
7
  case GSMTAP_TYPE_GB_SNDCP:
1127
7
    sub_handle = GSMTAP_SUB_SNDCP;
1128
7
    break;
1129
23
  case GSMTAP_TYPE_TETRA_I1:
1130
23
    handle_tetra(tvb_get_uint8(tvb, offset+12), payload_tvb, pinfo, tree);
1131
23
    return tvb_captured_length(tvb);
1132
2
  case GSMTAP_TYPE_WMX_BURST:
1133
2
    switch (sub_type) {
1134
0
    case GSMTAP_BURST_CDMA_CODE:
1135
0
      sub_handle = GSMTAP_SUB_CDMA_CODE;
1136
0
      break;
1137
1
    case GSMTAP_BURST_FCH:
1138
1
      sub_handle = GSMTAP_SUB_FCH;
1139
1
      break;
1140
0
    case GSMTAP_BURST_FFB:
1141
0
      sub_handle = GSMTAP_SUB_FFB;
1142
0
      break;
1143
0
    case GSMTAP_BURST_PDU:
1144
0
      sub_handle = GSMTAP_SUB_PDU;
1145
0
      break;
1146
0
    case GSMTAP_BURST_HACK:
1147
0
      sub_handle = GSMTAP_SUB_HACK;
1148
0
      break;
1149
0
    case GSMTAP_BURST_PHY_ATTRIBUTES:
1150
0
      sub_handle = GSMTAP_SUB_PHY_ATTRIBUTES;
1151
0
      break;
1152
1
    default:
1153
1
      sub_handle = GSMTAP_SUB_DATA;
1154
1
      break;
1155
2
    }
1156
2
    break;
1157
39
  case GSMTAP_TYPE_GMR1_UM:
1158
39
    switch (sub_type) {
1159
9
    case GSMTAP_GMR1_BCCH:
1160
9
      sub_handle = GSMTAP_SUB_GMR1_BCCH;
1161
9
      break;
1162
2
    case GSMTAP_GMR1_CCCH:
1163
3
    case GSMTAP_GMR1_AGCH:
1164
5
    case GSMTAP_GMR1_PCH:
1165
5
      sub_handle = GSMTAP_SUB_GMR1_CCCH;
1166
5
      break;
1167
12
    case GSMTAP_GMR1_SDCCH:
1168
18
    case GSMTAP_GMR1_TCH3 | GSMTAP_GMR1_FACCH:
1169
23
    case GSMTAP_GMR1_TCH6 | GSMTAP_GMR1_FACCH:
1170
24
    case GSMTAP_GMR1_TCH9 | GSMTAP_GMR1_FACCH:
1171
24
      sub_handle = GSMTAP_SUB_GMR1_LAPSAT;
1172
24
      break;
1173
0
    case GSMTAP_GMR1_RACH:
1174
0
      sub_handle = GSMTAP_SUB_GMR1_RACH;
1175
0
      break;
1176
1
    default:
1177
1
      sub_handle = GSMTAP_SUB_DATA;
1178
1
      break;
1179
39
    }
1180
39
    break;
1181
247
  case GSMTAP_TYPE_E1T1:
1182
247
    switch (sub_type) {
1183
39
    case GSMTAP_E1T1_LAPD:
1184
39
      sub_handle = GSMTAP_SUB_LAPD;
1185
39
      if (sub_handles[sub_handle]) {
1186
39
        struct isdn_phdr isdn;
1187
39
        isdn.uton = pinfo->p2p_dir == P2P_DIR_SENT ? 1 : 0;
1188
39
        isdn.channel = 0;
1189
39
        call_dissector_with_data(sub_handles[sub_handle], payload_tvb, pinfo, tree, &isdn);
1190
39
      }
1191
39
      return tvb_captured_length(tvb);
1192
88
    case GSMTAP_E1T1_FR:
1193
88
      sub_handle = GSMTAP_SUB_FR;
1194
88
      break;
1195
109
    case GSMTAP_E1T1_V5EF:
1196
109
      sub_handle = GSMTAP_SUB_V5EF;
1197
109
      if (sub_handles[sub_handle]) {
1198
109
        struct isdn_phdr isdn;
1199
109
        isdn.uton = pinfo->p2p_dir == P2P_DIR_SENT ? 1 : 0;
1200
109
        isdn.channel = 0;
1201
109
        call_dissector_with_data(sub_handles[sub_handle], payload_tvb, pinfo, tree, &isdn);
1202
109
      }
1203
109
      return tvb_captured_length(tvb);
1204
2
    case GSMTAP_E1T1_PPP:
1205
2
      sub_handle = GSMTAP_SUB_PPP;
1206
2
      if (sub_handles[sub_handle]) {
1207
2
        struct isdn_phdr isdn;
1208
2
        isdn.uton = pinfo->p2p_dir == P2P_DIR_SENT ? 1 : 0;
1209
2
        isdn.channel = 0;
1210
2
        call_dissector_with_data(sub_handles[sub_handle], payload_tvb, pinfo, tree, &isdn);
1211
2
      }
1212
2
      return tvb_captured_length(tvb);
1213
5
    case GSMTAP_E1T1_V120:
1214
5
      sub_handle = GSMTAP_SUB_V120;
1215
5
      if (sub_handles[sub_handle]) {
1216
5
        struct isdn_phdr isdn;
1217
5
        isdn.uton = pinfo->p2p_dir == P2P_DIR_SENT ? 1 : 0;
1218
5
        isdn.channel = 0;
1219
5
        call_dissector_with_data(sub_handles[sub_handle], payload_tvb, pinfo, tree, &isdn);
1220
5
      }
1221
5
      return tvb_captured_length(tvb);
1222
3
    case GSMTAP_E1T1_X75:
1223
3
      sub_handle = GSMTAP_SUB_X75;
1224
3
      if (sub_handles[sub_handle]) {
1225
3
        struct isdn_phdr isdn;
1226
3
        isdn.uton = pinfo->p2p_dir == P2P_DIR_SENT ? 1 : 0;
1227
3
        isdn.channel = 0;
1228
3
        call_dissector_with_data(sub_handles[sub_handle], payload_tvb, pinfo, tree, &isdn);
1229
3
      }
1230
3
      return tvb_captured_length(tvb);
1231
1
    default:
1232
1
      sub_handle = GSMTAP_SUB_DATA;
1233
1
      break;
1234
247
    }
1235
89
    break;
1236
89
  case GSMTAP_TYPE_GSM_RLP:
1237
35
    sub_handle = GSMTAP_SUB_GSM_RLP;
1238
35
    break;
1239
0
  case GSMTAP_TYPE_UM_BURST:
1240
1
  default:
1241
1
    sub_handle = GSMTAP_SUB_DATA;
1242
1
    break;
1243
17.9k
  }
1244
17.6k
  switch (sub_handle){
1245
331
  case GSMTAP_SUB_SIM:
1246
331
    call_dissector(sim_sub_handles[sub_handle_idx], payload_tvb,
1247
331
             pinfo, tree);
1248
331
    break;
1249
6.92k
  case GSMTAP_SUB_UMTS_RRC:
1250
6.92k
    call_dissector(rrc_sub_handles[sub_handle_idx], payload_tvb,
1251
6.92k
             pinfo, tree);
1252
6.92k
    break;
1253
9.45k
  case GSMTAP_SUB_LTE_RRC:
1254
9.45k
    call_dissector(lte_rrc_sub_handles[sub_handle_idx], payload_tvb,
1255
9.45k
             pinfo, tree);
1256
9.45k
    break;
1257
8
  case GSMTAP_SUB_LTE_NAS:
1258
8
    call_dissector(lte_nas_sub_handles[sub_handle_idx], payload_tvb,
1259
8
             pinfo, tree);
1260
8
    break;
1261
913
  default:
1262
913
    if (sub_handles[sub_handle] != NULL)
1263
912
      call_dissector(sub_handles[sub_handle], payload_tvb, pinfo, tree);
1264
913
    break;
1265
17.6k
  }
1266
  /* TODO: warn user that the WiMAX plugin must be enabled for some types */
1267
3.91k
  return tvb_captured_length(tvb);
1268
17.6k
}
1269
1270
static int
1271
dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
1272
17.9k
{
1273
17.9k
  uint8_t version;
1274
17.9k
  proto_tree *gsmtap_tree;
1275
17.9k
  proto_item *ti, *tf;
1276
1277
17.9k
  version = tvb_get_uint8(tvb, 0);
1278
1279
17.9k
  if (version == 2) {
1280
17.9k
    return dissect_gsmtap_v2(tvb, pinfo, tree, data);
1281
17.9k
  }
1282
1283
  /* Unknown GSMTAP version */
1284
3
  ti = proto_tree_add_protocol_format(tree, proto_gsmtap, tvb, 0, 1, "GSMTAP, unknown version (%u)", version);
1285
3
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "GSMTAP");
1286
3
  col_clear(pinfo->cinfo, COL_INFO);
1287
3
  col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown GSMTAP version (%u)", version);
1288
3
  gsmtap_tree = proto_item_add_subtree(ti, ett_gsmtap);
1289
3
  tf = proto_tree_add_item(gsmtap_tree, hf_gsmtap_version, tvb, 0, 1, ENC_BIG_ENDIAN);
1290
3
  expert_add_info(pinfo, tf, &ei_gsmtap_unknown_gsmtap_version);
1291
3
  return 1;
1292
17.9k
}
1293
1294
void
1295
proto_register_gsmtap(void)
1296
14
{
1297
14
  static hf_register_info hf[] = {
1298
14
    { &hf_gsmtap_version, { "Version", "gsmtap.version",
1299
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
1300
14
    { &hf_gsmtap_hdrlen, { "Header Length", "gsmtap.hdr_len",
1301
14
      FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_byte_bytes), 0, NULL, HFILL } },
1302
14
    { &hf_gsmtap_type, { "Payload Type", "gsmtap.type",
1303
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_types), 0, NULL, HFILL } },
1304
14
    { &hf_gsmtap_timeslot, { "Time Slot", "gsmtap.ts",
1305
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
1306
14
    { &hf_gsmtap_arfcn, { "ARFCN", "gsmtap.arfcn",
1307
14
      FT_UINT16, BASE_DEC, NULL, GSMTAP_ARFCN_MASK, NULL, HFILL } },
1308
14
    { &hf_gsmtap_uplink, { "Uplink", "gsmtap.uplink",
1309
14
      FT_UINT16, BASE_DEC, NULL, GSMTAP_ARFCN_F_UPLINK, NULL, HFILL } },
1310
14
    { &hf_gsmtap_pcs, { "PCS band indicator", "gsmtap.pcs_band",
1311
14
      FT_UINT16, BASE_DEC, NULL, GSMTAP_ARFCN_F_PCS, NULL, HFILL } },
1312
14
    { &hf_gsmtap_signal_dbm, { "Signal Level", "gsmtap.signal_dbm",
1313
14
      FT_INT8, BASE_DEC | BASE_UNIT_STRING, UNS(&units_dbm), 0, NULL, HFILL } },
1314
14
    { &hf_gsmtap_snr_db, { "Signal/Noise Ratio", "gsmtap.snr_db",
1315
14
      FT_INT8, BASE_DEC | BASE_UNIT_STRING, UNS(&units_decibels), 0, NULL, HFILL } },
1316
14
    { &hf_gsmtap_frame_nr, { "GSM Frame Number", "gsmtap.frame_nr",
1317
14
      FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } },
1318
14
    { &hf_gsmtap_burst_type, { "Burst Type", "gsmtap.burst_type",
1319
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_bursts), 0, NULL, HFILL }},
1320
14
    { &hf_gsmtap_channel_type, { "Channel Type", "gsmtap.chan_type",
1321
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_channels), 0, NULL, HFILL }},
1322
14
    { &hf_gsmtap_tetra_channel_type, { "Channel Type", "gsmtap.tetra_chan_type",
1323
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_tetra_channels), 0, NULL, HFILL }},
1324
14
    { &hf_gsmtap_gmr1_channel_type, { "Channel Type", "gsmtap.gmr1_chan_type",
1325
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_gmr1_channels), 0, NULL, HFILL }},
1326
14
    { &hf_gsmtap_lte_rrc_channel_type, { "Channel Type", "gsmtap.lte_rrc_chan_type",
1327
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_lte_rrc_channels), 0, NULL, HFILL }},
1328
14
    { &hf_gsmtap_rrc_sub_type, { "Message Type", "gsmtap.rrc_sub_type",
1329
14
      FT_UINT8, BASE_DEC, VALS(rrc_sub_types), 0, NULL, HFILL }},
1330
14
    { &hf_gsmtap_e1t1_sub_type, { "Channel Type", "gsmtap.e1t1_sub_type",
1331
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_um_e1t1_types), 0, NULL, HFILL }},
1332
14
    { &hf_gsmtap_sim_sub_type, { "SIM Type", "gsmtap.sim_sub_type",
1333
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_sim_types), 0, NULL, HFILL }},
1334
14
    { &hf_gsmtap_antenna, { "Antenna Number", "gsmtap.antenna",
1335
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
1336
14
    { &hf_gsmtap_subslot, { "Sub-Slot", "gsmtap.sub_slot",
1337
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
1338
14
    { &hf_gsmtap_radio_fields, { "Radio Fields", "gsmtap.radio_fields",
1339
14
      FT_NONE, BASE_NONE, NULL, 0, "Radio Fields are not used for this payload type", HFILL }},
1340
14
    { &hf_gsmtap_res, { "Reserved", "gsmtap.res",
1341
14
      FT_UINT8, BASE_DEC, NULL, 0, "Reserved for future use (RFU)", HFILL }},
1342
1343
14
    { &hf_sacch_l1h_power_lev, { "MS power level", "gsmtap.sacch_l1.power_lev",
1344
14
      FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL } },
1345
14
    { &hf_sacch_l1h_fpc, { "FPC (Fast Power Control)", "gsmtap.sacch_l1.fpc",
1346
14
      FT_BOOLEAN, 8, TFS(&tfs_inuse_not_inuse), 0x20, NULL, HFILL } },
1347
14
    { &hf_sacch_l1h_sro_srr, { "SRO/SRR (SACCH Repetition)", "gsmtap.sacch_l1.sro_srr",
1348
14
      FT_BOOLEAN, 8, TFS(&tfs_required_not_required), 0x40, NULL, HFILL } },
1349
14
    { &hf_sacch_l1h_ta, { "Actual Timing Advance", "gsmtap.sacch_l1.ta",
1350
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
1351
14
    { &hf_um_voice_type, { "GSM Um Voice Type", "gsmtap.um_voice_type",
1352
14
      FT_UINT8, BASE_DEC, VALS(gsmtap_um_voice_types), 0, NULL, HFILL } },
1353
1354
    /* PTCCH (Packet Timing Advance Control Channel) on Downlink */
1355
14
    { &hf_ptcch_spare, { "Spare Bit", "gsmtap.ptcch.spare",
1356
14
      FT_UINT8, BASE_DEC, NULL, 0x80, NULL, HFILL } },
1357
14
    { &hf_ptcch_ta_idx, { "Timing Advance Index", "gsmtap.ptcch.ta_idx",
1358
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
1359
14
    { &hf_ptcch_ta_val, { "Timing Advance Value", "gsmtap.ptcch.ta_val",
1360
14
      FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL } },
1361
14
    { &hf_ptcch_padding, { "Spare Padding", "gsmtap.ptcch.padding",
1362
14
      FT_BYTES, SEP_SPACE, NULL, 0, NULL, HFILL } },
1363
14
  };
1364
14
  static int *ett[] = {
1365
14
    &ett_gsmtap
1366
14
  };
1367
14
  static ei_register_info ei[] = {
1368
14
    { &ei_gsmtap_unknown_gsmtap_version, { "gsmtap.version.invalid", PI_PROTOCOL, PI_WARN, "Unknown protocol version", EXPFILL }},
1369
14
  };
1370
1371
14
  expert_module_t* expert_gsmtap;
1372
1373
14
  proto_gsmtap = proto_register_protocol("GSM Radiotap", "GSMTAP", "gsmtap");
1374
14
  proto_register_field_array(proto_gsmtap, hf, array_length(hf));
1375
14
  proto_register_subtree_array(ett, array_length(ett));
1376
14
  expert_gsmtap = expert_register_protocol(proto_gsmtap);
1377
14
  expert_register_field_array(expert_gsmtap, ei, array_length(ei));
1378
1379
14
  gsmtap_dissector_table = register_dissector_table("gsmtap.type",
1380
14
            "GSMTAP type", proto_gsmtap, FT_UINT8, BASE_HEX);
1381
1382
14
  gsmtap_handle = register_dissector("gsmtap", dissect_gsmtap, proto_gsmtap);
1383
14
}
1384
1385
void
1386
proto_reg_handoff_gsmtap(void)
1387
14
{
1388
  /* TODO: some dissectors may be NULL if not loaded */
1389
14
  sub_handles[GSMTAP_SUB_DATA] = find_dissector("data");
1390
14
  sub_handles[GSMTAP_SUB_UM] = find_dissector_add_dependency("gsm_a_ccch", proto_gsmtap);
1391
14
  sub_handles[GSMTAP_SUB_UM_LAPDM] = find_dissector_add_dependency("lapdm", proto_gsmtap);
1392
14
  sub_handles[GSMTAP_SUB_UM_RLC_MAC_UL] = find_dissector_add_dependency("gsm_rlcmac_ul", proto_gsmtap);
1393
14
  sub_handles[GSMTAP_SUB_UM_RLC_MAC_DL] = find_dissector_add_dependency("gsm_rlcmac_dl", proto_gsmtap);
1394
14
  sub_handles[GSMTAP_SUB_LLC] = find_dissector_add_dependency("llcgprs", proto_gsmtap);
1395
14
  sub_handles[GSMTAP_SUB_SNDCP] = find_dissector_add_dependency("sndcp", proto_gsmtap);
1396
14
  sub_handles[GSMTAP_SUB_ABIS] = find_dissector_add_dependency("gsm_a_dtap", proto_gsmtap);
1397
14
  sub_handles[GSMTAP_SUB_CDMA_CODE] = find_dissector_add_dependency("wimax_cdma_code_burst_handler", proto_gsmtap);
1398
14
  sub_handles[GSMTAP_SUB_FCH] = find_dissector_add_dependency("wimax_fch_burst_handler", proto_gsmtap);
1399
14
  sub_handles[GSMTAP_SUB_FFB] = find_dissector_add_dependency("wimax_ffb_burst_handler", proto_gsmtap);
1400
14
  sub_handles[GSMTAP_SUB_PDU] = find_dissector_add_dependency("wimax_pdu_burst_handler", proto_gsmtap);
1401
14
  sub_handles[GSMTAP_SUB_HACK] = find_dissector_add_dependency("wimax_hack_burst_handler", proto_gsmtap);
1402
14
  sub_handles[GSMTAP_SUB_PHY_ATTRIBUTES] = find_dissector_add_dependency("wimax_phy_attributes_burst_handler", proto_gsmtap);
1403
14
  sub_handles[GSMTAP_SUB_CBCH] = find_dissector_add_dependency("gsm_cbch", proto_gsmtap);
1404
14
  sub_handles[GSMTAP_SUB_GMR1_BCCH] = find_dissector_add_dependency("gmr1_bcch", proto_gsmtap);
1405
14
  sub_handles[GSMTAP_SUB_GMR1_CCCH] = find_dissector_add_dependency("gmr1_ccch", proto_gsmtap);
1406
14
  sub_handles[GSMTAP_SUB_GMR1_LAPSAT] = find_dissector_add_dependency("lapsat", proto_gsmtap);
1407
14
  sub_handles[GSMTAP_SUB_GMR1_RACH] = find_dissector_add_dependency("gmr1_rach", proto_gsmtap);
1408
14
  sub_handles[GSMTAP_SUB_UMTS_RRC] = find_dissector_add_dependency("rrc", proto_gsmtap);
1409
14
  sub_handles[GSMTAP_SUB_LAPD] = find_dissector_add_dependency("lapd-phdr", proto_gsmtap);
1410
14
  sub_handles[GSMTAP_SUB_FR] = find_dissector_add_dependency("fr", proto_gsmtap);
1411
14
  sub_handles[GSMTAP_SUB_V5EF] = find_dissector_add_dependency("v5ef", proto_gsmtap);
1412
14
  sub_handles[GSMTAP_SUB_GSM_RLP] = find_dissector_add_dependency("gsm_rlp", proto_gsmtap);
1413
14
  sub_handles[GSMTAP_SUB_PPP] = find_dissector_add_dependency("ppp", proto_gsmtap);
1414
14
  sub_handles[GSMTAP_SUB_V120] = find_dissector_add_dependency("v120", proto_gsmtap);
1415
14
  sub_handles[GSMTAP_SUB_X75] = find_dissector_add_dependency("x75", proto_gsmtap);
1416
1417
14
  sim_sub_handles[GSMTAP_SIM_SUB_APDU] = find_dissector_add_dependency("gsm_sim", proto_gsmtap);
1418
14
  sim_sub_handles[GSMTAP_SIM_SUB_ATR] = find_dissector_add_dependency("iso7816.atr", proto_gsmtap);
1419
1420
14
  rrc_sub_handles[GSMTAP_RRC_SUB_DL_DCCH_Message] = find_dissector_add_dependency("rrc.dl.dcch", proto_gsmtap);
1421
14
  rrc_sub_handles[GSMTAP_RRC_SUB_UL_DCCH_Message] = find_dissector_add_dependency("rrc.ul.dcch", proto_gsmtap);
1422
14
  rrc_sub_handles[GSMTAP_RRC_SUB_DL_CCCH_Message] = find_dissector_add_dependency("rrc.dl.ccch", proto_gsmtap);
1423
14
  rrc_sub_handles[GSMTAP_RRC_SUB_UL_CCCH_Message] = find_dissector_add_dependency("rrc.ul.ccch", proto_gsmtap);
1424
14
  rrc_sub_handles[GSMTAP_RRC_SUB_PCCH_Message] = find_dissector_add_dependency("rrc.pcch", proto_gsmtap);
1425
14
  rrc_sub_handles[GSMTAP_RRC_SUB_DL_SHCCH_Message] = find_dissector_add_dependency("rrc.dl.shcch", proto_gsmtap);
1426
14
  rrc_sub_handles[GSMTAP_RRC_SUB_UL_SHCCH_Message] = find_dissector_add_dependency("rrc.ul.shcch", proto_gsmtap);
1427
14
  rrc_sub_handles[GSMTAP_RRC_SUB_BCCH_FACH_Message] = find_dissector_add_dependency("rrc.bcch.fach", proto_gsmtap);
1428
14
  rrc_sub_handles[GSMTAP_RRC_SUB_BCCH_BCH_Message] = find_dissector_add_dependency("rrc.bcch.bch", proto_gsmtap);
1429
14
  rrc_sub_handles[GSMTAP_RRC_SUB_MCCH_Message] = find_dissector_add_dependency("rrc.mcch", proto_gsmtap);
1430
14
  rrc_sub_handles[GSMTAP_RRC_SUB_MSCH_Message] = find_dissector_add_dependency("rrc.msch", proto_gsmtap);
1431
14
  rrc_sub_handles[GSMTAP_RRC_SUB_HandoverToUTRANCommand] = find_dissector_add_dependency("rrc.irat.ho_to_utran_cmd", proto_gsmtap);
1432
14
  rrc_sub_handles[GSMTAP_RRC_SUB_InterRATHandoverInfo] = find_dissector_add_dependency("rrc.irat.irat_ho_info", proto_gsmtap);
1433
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SystemInformation_BCH] = find_dissector_add_dependency("rrc.sysinfo", proto_gsmtap);
1434
14
  rrc_sub_handles[GSMTAP_RRC_SUB_System_Information_Container] = find_dissector_add_dependency("rrc.sysinfo.cont", proto_gsmtap);
1435
14
  rrc_sub_handles[GSMTAP_RRC_SUB_UE_RadioAccessCapabilityInfo] = find_dissector_add_dependency("rrc.ue_radio_access_cap_info", proto_gsmtap);
1436
14
  rrc_sub_handles[GSMTAP_RRC_SUB_MasterInformationBlock] = find_dissector_add_dependency("rrc.si.mib", proto_gsmtap);
1437
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType1] = find_dissector_add_dependency("rrc.si.sib1", proto_gsmtap);
1438
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType2] = find_dissector_add_dependency("rrc.si.sib2", proto_gsmtap);
1439
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType3] = find_dissector_add_dependency("rrc.si.sib3", proto_gsmtap);
1440
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType4] = find_dissector_add_dependency("rrc.si.sib4", proto_gsmtap);
1441
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType5] = find_dissector_add_dependency("rrc.si.sib5", proto_gsmtap);
1442
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType5bis] = find_dissector_add_dependency("rrc.si.sib5bis", proto_gsmtap);
1443
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType6] = find_dissector_add_dependency("rrc.si.sib6", proto_gsmtap);
1444
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType7] = find_dissector_add_dependency("rrc.si.sib7", proto_gsmtap);
1445
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType8] = find_dissector_add_dependency("rrc.si.sib8", proto_gsmtap);
1446
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType9] = find_dissector_add_dependency("rrc.si.sib9", proto_gsmtap);
1447
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType10] = find_dissector_add_dependency("rrc.si.sib10", proto_gsmtap);
1448
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType11] = find_dissector_add_dependency("rrc.si.sib11", proto_gsmtap);
1449
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType11bis] = find_dissector_add_dependency("rrc.si.sib11bis", proto_gsmtap);
1450
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType12] = find_dissector_add_dependency("rrc.si.sib12", proto_gsmtap);
1451
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType13] = find_dissector_add_dependency("rrc.si.sib13", proto_gsmtap);
1452
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType13_1] = find_dissector_add_dependency("rrc.si.sib13-1", proto_gsmtap);
1453
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType13_2] = find_dissector_add_dependency("rrc.si.sib13-2", proto_gsmtap);
1454
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType13_3] = find_dissector_add_dependency("rrc.si.sib13-3", proto_gsmtap);
1455
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType13_4] = find_dissector_add_dependency("rrc.si.sib13-4", proto_gsmtap);
1456
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType14] = find_dissector_add_dependency("rrc.si.sib14", proto_gsmtap);
1457
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15] = find_dissector_add_dependency("rrc.si.sib15", proto_gsmtap);
1458
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15bis] = find_dissector_add_dependency("rrc.si.sib15bis", proto_gsmtap);
1459
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_1] = find_dissector_add_dependency("rrc.si.sib15-1", proto_gsmtap);
1460
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_1bis] = find_dissector_add_dependency("rrc.si.sib15-1bis", proto_gsmtap);
1461
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_2] = find_dissector_add_dependency("rrc.si.sib15-2", proto_gsmtap);
1462
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_2bis] = find_dissector_add_dependency("rrc.si.sib15-2bis", proto_gsmtap);
1463
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_2ter] = find_dissector_add_dependency("rrc.si.sib15-2ter", proto_gsmtap);
1464
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_3] = find_dissector_add_dependency("rrc.si.sib15-3", proto_gsmtap);
1465
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_3bis] = find_dissector_add_dependency("rrc.si.sib15-3bis", proto_gsmtap);
1466
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_4] = find_dissector_add_dependency("rrc.si.sib15-4", proto_gsmtap);
1467
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_5] = find_dissector_add_dependency("rrc.si.sib15-5", proto_gsmtap);
1468
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_6] = find_dissector_add_dependency("rrc.si.sib15-6", proto_gsmtap);
1469
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_7] = find_dissector_add_dependency("rrc.si.sib15-7", proto_gsmtap);
1470
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType15_8] = find_dissector_add_dependency("rrc.si.sib15-8", proto_gsmtap);
1471
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType16] = find_dissector_add_dependency("rrc.si.sib16", proto_gsmtap);
1472
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType17] = find_dissector_add_dependency("rrc.si.sib17", proto_gsmtap);
1473
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType18] = find_dissector_add_dependency("rrc.si.sib18", proto_gsmtap);
1474
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType19] = find_dissector_add_dependency("rrc.si.sib19", proto_gsmtap);
1475
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType20] = find_dissector_add_dependency("rrc.si.sib20", proto_gsmtap);
1476
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType21] = find_dissector_add_dependency("rrc.si.sib21", proto_gsmtap);
1477
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoType22] = find_dissector_add_dependency("rrc.si.sib22", proto_gsmtap);
1478
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoTypeSB1] = find_dissector_add_dependency("rrc.si.sb1", proto_gsmtap);
1479
14
  rrc_sub_handles[GSMTAP_RRC_SUB_SysInfoTypeSB2] = find_dissector_add_dependency("rrc.si.sb2", proto_gsmtap);
1480
14
  rrc_sub_handles[GSMTAP_RRC_SUB_ToTargetRNC_Container] = find_dissector_add_dependency("rrc.s_to_trnc_cont", proto_gsmtap);
1481
14
  rrc_sub_handles[GSMTAP_RRC_SUB_TargetRNC_ToSourceRNC_Container] = find_dissector_add_dependency("rrc.t_to_srnc_cont", proto_gsmtap);
1482
1483
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_DL_CCCH_Message] = find_dissector_add_dependency("lte_rrc.dl_ccch", proto_gsmtap);
1484
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_DL_DCCH_Message] = find_dissector_add_dependency("lte_rrc.dl_dcch", proto_gsmtap);
1485
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_UL_CCCH_Message] = find_dissector_add_dependency("lte_rrc.ul_ccch", proto_gsmtap);
1486
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_UL_DCCH_Message] = find_dissector_add_dependency("lte_rrc.ul_dcch", proto_gsmtap);
1487
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message] = find_dissector_add_dependency("lte_rrc.bcch_bch", proto_gsmtap);
1488
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message] = find_dissector_add_dependency("lte_rrc.bcch_dl_sch", proto_gsmtap);
1489
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_PCCH_Message] = find_dissector_add_dependency("lte_rrc.pcch", proto_gsmtap);
1490
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_MCCH_Message] = find_dissector_add_dependency("lte_rrc.mcch", proto_gsmtap);
1491
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_MBMS] = find_dissector_add_dependency("lte_rrc.bcch_bch.mbms", proto_gsmtap);
1492
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_BR] = find_dissector_add_dependency("lte_rrc.bcch_dl_sch_br", proto_gsmtap);
1493
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_MBMS] = find_dissector_add_dependency("lte_rrc.bcch_dl_sch.mbms", proto_gsmtap);
1494
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_SC_MCCH_Message] = find_dissector_add_dependency("lte_rrc.sc_mcch", proto_gsmtap);
1495
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_SBCCH_SL_BCH_Message] = find_dissector_add_dependency("lte_rrc.sbcch_sl_bch", proto_gsmtap);
1496
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_SBCCH_SL_BCH_Message_V2X] = find_dissector_add_dependency("lte_rrc.sbcch_sl_bch.v2x", proto_gsmtap);
1497
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_DL_CCCH_Message_NB] = find_dissector_add_dependency("lte_rrc.dl_ccch.nb", proto_gsmtap);
1498
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_DL_DCCH_Message_NB] = find_dissector_add_dependency("lte_rrc.dl_dcch.nb", proto_gsmtap);
1499
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_UL_CCCH_Message_NB] = find_dissector_add_dependency("lte_rrc.ul_ccch.nb", proto_gsmtap);
1500
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_UL_DCCH_Message_NB] = find_dissector_add_dependency("lte_rrc.ul_dcch.nb", proto_gsmtap);
1501
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB] = find_dissector_add_dependency("lte_rrc.bcch_bch.nb", proto_gsmtap);
1502
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_TDD_NB] = find_dissector_add_dependency("lte_rrc.bcch_bch.nb.tdd", proto_gsmtap);
1503
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message_NB] = find_dissector_add_dependency("lte_rrc.bcch_dl_sch.nb", proto_gsmtap);
1504
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_PCCH_Message_NB] = find_dissector_add_dependency("lte_rrc.pcch.nb", proto_gsmtap);
1505
14
  lte_rrc_sub_handles[GSMTAP_LTE_RRC_SUB_SC_MCCH_Message_NB] = find_dissector_add_dependency("lte_rrc.sc_mcch.nb", proto_gsmtap);
1506
1507
14
  lte_nas_sub_handles[GSMTAP_LTE_NAS_PLAIN] = find_dissector_add_dependency("nas-eps_plain", proto_gsmtap);
1508
14
  lte_nas_sub_handles[GSMTAP_LTE_NAS_SEC_HEADER] = find_dissector_add_dependency("nas-eps", proto_gsmtap);
1509
1510
14
  dissector_add_uint_with_preference("udp.port", GSMTAP_UDP_PORT, gsmtap_handle);
1511
14
}
1512
1513
/*
1514
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
1515
 *
1516
 * Local variables:
1517
 * c-basic-offset: 8
1518
 * tab-width: 8
1519
 * indent-tabs-mode: t
1520
 * End:
1521
 *
1522
 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
1523
 * :indentSize=8:tabSize=8:noTabs=false:
1524
 */