Coverage Report

Created: 2026-03-30 07:00

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