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-aruba-erm.c
Line
Count
Source
1
/* packet-aruba-erm.c
2
 * Routines for the disassembly of Aruba encapsulated remote mirroring frames
3
 * (Adapted from packet-hp-erm.c and packet-cisco-erspan.c)
4
 *
5
 * Copyright 2010  Alexis La Goutte <alexis.lagoutte at gmail dot com>
6
 *
7
 * ERM Radio-Format added by Hadriel Kaplan
8
 *
9
 * Type 6 added by Jeffrey Goff <jgoff at arubanetworks dot com>
10
 *
11
 * Wireshark - Network traffic analyzer
12
 * By Gerald Combs <gerald@wireshark.org>
13
 * Copyright 1998 Gerald Combs
14
 *
15
 * SPDX-License-Identifier: GPL-2.0-or-later
16
 */
17
18
/*
19
 * See
20
 *
21
 *    http://community.arubanetworks.com/t5/Unified-Wired-Wireless-Access/Bug-in-ArubaOS-Packet-Capture/td-p/237984
22
 *
23
 *    http://kjspgd.net/?p=30
24
 *
25
 * for more information.
26
 */
27
28
/*
29
 * Formats:
30
 *
31
 * Pcap (type 0):
32
 *
33
 * Payload contains a pcap record header:
34
 *
35
 * typedef struct pcaprec_hdr_s {
36
 *       uint32_t ts_sec;          timestamp seconds
37
 *       uint32_t ts_usec;         timestamp microseconds
38
 *       uint32_t incl_len;        number of octets of packet saved in file
39
 *       uint32_t orig_len;        actual length of packet
40
 * } pcaprec_hdr_t;
41
 *
42
 * followed by the packet data, starting with an 802.11 header.
43
 *
44
 * Peek (type 1):
45
 *
46
 * Payload contains a "Peek remote" packet, as supported by
47
 * EtherPeek/AiroPeek/OmniPeek.
48
 *
49
 * Airmagnet (type 2):
50
 *
51
 * Unknown payload format.
52
 *
53
 * Pcap + radio header (type 3):
54
 *
55
 * Payload contains a pcap record header, as per the above, followed
56
 * by a header with radio information:
57
 *
58
 *  struct radio_hdr {
59
 *   __u16  rate_per_half_mhz;
60
 *   __u8   channel;
61
 *   __u8   signal_percent;
62
 *  } __attribute__ ((packed));
63
 *
64
 * followed by the packet data, starting with an 802.11 header.
65
 *
66
 * PPI (type 4):
67
 *
68
 * Payload contains a PPI header followed by the packet data, starting
69
 * with an 802.11 header.
70
 *
71
 * Peek 11n/11ac (type 5):
72
 *
73
 * This is probably the "new" "Peek remote" format.  The "Peek remote"
74
 * dissector should probably be able to distinguish this from type 1,
75
 * as the "new" format has a magic number in it.  Given that there's
76
 * a heuristic "Peek remote new" dissector, those packets might
77
 * automatically be recognized without setting any preference whatsoever.
78
 *
79
 * Radiotap (type 6):
80
 *
81
 * As part of 802.11ax development, Aruba has added radiotap capture
82
 * encapsulation. This new format can be used with any model of AP
83
 * be it 11ax, 11ac or 11n.
84
 * Note: type 6 is _only_ supported in ArubaOS 8.6 and higher.
85
 *
86
 */
87
88
#include "config.h"
89
90
#include <wiretap/wtap.h>
91
92
#include <epan/packet.h>
93
#include <epan/expert.h>
94
#include <epan/prefs.h>
95
#include <epan/decode_as.h>
96
97
#include <wsutil/802_11-utils.h>
98
99
#define TYPE_PCAP 0
100
#define TYPE_PEEK 1
101
#define TYPE_AIRMAGNET 2
102
#define TYPE_PCAPPLUSRADIO 3
103
#define TYPE_PPI 4
104
105
#define IS_ARUBA 0x01
106
107
#if 0
108
static const value_string aruba_erm_type_vals[] = {
109
    { TYPE_PCAP,            "pcap (type 0)" },
110
    { TYPE_PEEK,            "peek (type 1)" },
111
    { TYPE_AIRMAGNET,       "Airmagnet (type 2)" },
112
    { TYPE_PCAPPLUSRADIO,   "pcap + radio header (type 3)" },
113
    { TYPE_PPI,             "PPI (type 4)" },
114
    { 0, NULL }
115
};
116
#endif
117
118
void proto_register_aruba_erm(void);
119
void proto_reg_handoff_aruba_erm(void);
120
void proto_reg_handoff_aruba_erm_radio(void);
121
122
#if 0
123
static int   aruba_erm_type;
124
#endif
125
126
static int  proto_aruba_erm;
127
static int  proto_aruba_erm_type0;
128
static int  proto_aruba_erm_type1;
129
static int  proto_aruba_erm_type2;
130
static int  proto_aruba_erm_type3;
131
static int  proto_aruba_erm_type4;
132
static int  proto_aruba_erm_type5;
133
static int  proto_aruba_erm_type6;
134
135
static int  hf_aruba_erm_time;
136
static int  hf_aruba_erm_incl_len;
137
static int  hf_aruba_erm_orig_len;
138
static int  hf_aruba_erm_data_rate;
139
static int  hf_aruba_erm_data_rate_gen;
140
static int  hf_aruba_erm_channel;
141
static int  hf_aruba_erm_signal_strength;
142
143
static int ett_aruba_erm;
144
145
static expert_field ei_aruba_erm_airmagnet;
146
static expert_field ei_aruba_erm_decode;
147
148
static dissector_handle_t aruba_erm_handle;
149
static dissector_handle_t aruba_erm_handle_type0;
150
static dissector_handle_t aruba_erm_handle_type1;
151
static dissector_handle_t aruba_erm_handle_type2;
152
static dissector_handle_t aruba_erm_handle_type3;
153
static dissector_handle_t aruba_erm_handle_type4;
154
static dissector_handle_t aruba_erm_handle_type5;
155
static dissector_handle_t aruba_erm_handle_type6;
156
static dissector_handle_t wlan_radio_handle;
157
static dissector_handle_t wlan_withfcs_handle;
158
static dissector_handle_t peek_handle;
159
static dissector_handle_t ppi_handle;
160
static dissector_handle_t radiotap_handle;
161
162
static dissector_table_t aruba_erm_subdissector_table;
163
164
static int
165
dissect_aruba_erm_pcap(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *aruba_erm_tree, unsigned offset)
166
0
{
167
0
    proto_tree_add_item(aruba_erm_tree, hf_aruba_erm_time, tvb, offset, 8, ENC_TIME_SECS_USECS|ENC_BIG_ENDIAN);
168
0
    offset +=8;
169
170
0
    proto_tree_add_item(aruba_erm_tree, hf_aruba_erm_incl_len, tvb, 8, 4, ENC_BIG_ENDIAN);
171
0
    offset +=4;
172
173
0
    proto_tree_add_item(aruba_erm_tree, hf_aruba_erm_orig_len, tvb, 12, 4, ENC_BIG_ENDIAN);
174
0
    offset +=4;
175
176
0
    return offset;
177
0
}
178
179
static proto_tree *
180
dissect_aruba_erm_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset _U_)
181
0
{
182
183
0
    proto_item *ti;
184
0
    proto_tree *aruba_erm_tree;
185
186
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "ARUBA_ERM");
187
0
    col_set_str(pinfo->cinfo, COL_INFO, "ARUBA_ERM");
188
189
190
0
    ti = proto_tree_add_item(tree, proto_aruba_erm, tvb, 0, 0, ENC_NA);
191
0
    aruba_erm_tree = proto_item_add_subtree(ti, ett_aruba_erm);
192
193
0
    return aruba_erm_tree;
194
195
196
0
}
197
198
199
static int
200
dissect_aruba_erm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
201
0
{
202
0
    unsigned offset = 0;
203
204
0
    if (!dissector_try_payload_with_data(aruba_erm_subdissector_table, tvb, pinfo, tree, true, NULL)) {
205
206
0
        dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
207
        /* Add Expert info how decode...*/
208
0
        proto_tree_add_expert_remaining(tree, pinfo, &ei_aruba_erm_decode, tvb, offset);
209
0
        call_data_dissector(tvb, pinfo, tree);
210
0
    }
211
212
0
    return tvb_captured_length(tvb);
213
0
}
214
215
216
static int
217
dissect_aruba_erm_type0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
218
0
{
219
0
    tvbuff_t * next_tvb;
220
0
    unsigned offset = 0;
221
0
    proto_tree *aruba_erm_tree;
222
223
0
    aruba_erm_tree = dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
224
225
0
    offset = dissect_aruba_erm_pcap(tvb, pinfo, aruba_erm_tree, offset);
226
0
    proto_item_set_len(aruba_erm_tree, offset);
227
228
0
    next_tvb = tvb_new_subset_remaining(tvb, offset);
229
    /* No way to determine if TX or RX packet... (TX = no FCS, RX = FCS...)*/
230
0
    call_dissector(wlan_withfcs_handle, next_tvb, pinfo, tree);
231
232
0
    return tvb_captured_length(tvb);
233
0
}
234
235
static int
236
dissect_aruba_erm_type1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
237
0
{
238
0
    unsigned offset = 0;
239
240
0
    dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
241
242
    /* Say to PEEK dissector, it is a Aruba PEEK packet */
243
0
    call_dissector_with_data(peek_handle, tvb, pinfo, tree, GUINT_TO_POINTER(IS_ARUBA));
244
245
0
    return tvb_captured_length(tvb);
246
0
}
247
248
static int
249
dissect_aruba_erm_type2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
250
0
{
251
0
    unsigned offset = 0;
252
253
0
    dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
254
255
    /* Not (yet) supported launch data dissector */
256
0
    proto_tree_add_expert_remaining(tree, pinfo, &ei_aruba_erm_airmagnet, tvb, offset);
257
0
    call_data_dissector(tvb, pinfo, tree);
258
259
0
    return tvb_captured_length(tvb);
260
0
}
261
262
static int
263
dissect_aruba_erm_type3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
264
0
{
265
0
    tvbuff_t * next_tvb;
266
0
    unsigned offset = 0;
267
0
    proto_tree *aruba_erm_tree;
268
0
    struct ieee_802_11_phdr phdr;
269
0
    uint32_t signal_strength;
270
0
    proto_item *ti_data_rate;
271
0
    uint16_t data_rate;
272
0
    unsigned channel;
273
274
0
    aruba_erm_tree = dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
275
276
0
    offset = dissect_aruba_erm_pcap(tvb, pinfo, aruba_erm_tree, offset);
277
278
0
    memset(&phdr, 0, sizeof(phdr));
279
0
    phdr.decrypted = false;
280
0
    phdr.datapad = false;
281
0
    phdr.phy = PHDR_802_11_PHY_UNKNOWN;
282
0
    phdr.has_data_rate = true;
283
0
    data_rate = tvb_get_ntohs(tvb, offset);
284
0
    phdr.data_rate = data_rate;
285
0
    proto_tree_add_item(aruba_erm_tree, hf_aruba_erm_data_rate, tvb, offset, 2, ENC_BIG_ENDIAN);
286
0
    ti_data_rate = proto_tree_add_float_format(aruba_erm_tree, hf_aruba_erm_data_rate_gen,
287
0
                                                tvb, 16, 2,
288
0
                                                (float)data_rate / 2,
289
0
                                                "Data Rate: %.1f Mb/s",
290
0
                                                (float)data_rate / 2);
291
0
    proto_item_set_generated(ti_data_rate);
292
0
    offset += 2;
293
294
0
    proto_tree_add_item_ret_uint(aruba_erm_tree, hf_aruba_erm_channel, tvb, offset, 1, ENC_BIG_ENDIAN, &channel);
295
0
    phdr.has_channel = true;
296
0
    phdr.channel = channel;
297
0
    offset += 1;
298
299
0
    proto_tree_add_item_ret_uint(aruba_erm_tree, hf_aruba_erm_signal_strength, tvb, offset, 1, ENC_BIG_ENDIAN, &signal_strength);
300
0
    phdr.has_signal_percent = true;
301
0
    phdr.signal_percent = signal_strength;
302
0
    offset += 1;
303
304
0
    proto_item_set_len(aruba_erm_tree, offset);
305
0
    next_tvb = tvb_new_subset_remaining(tvb, offset);
306
307
    /*
308
     * We don't know they PHY, but we do have the data rate;
309
     * try to guess the PHY based on the data rate and channel.
310
     */
311
0
    if (RATE_IS_DSSS(phdr.data_rate)) {
312
        /* 11b */
313
0
        phdr.phy = PHDR_802_11_PHY_11B;
314
0
        phdr.phy_info.info_11b.has_short_preamble = false;
315
0
    } else if (RATE_IS_OFDM(phdr.data_rate)) {
316
        /* 11a or 11g, depending on the band. */
317
0
        if (CHAN_IS_BG(phdr.channel)) {
318
            /* 11g */
319
0
            phdr.phy = PHDR_802_11_PHY_11G;
320
0
            phdr.phy_info.info_11g.has_mode = false;
321
0
        } else {
322
            /* 11a */
323
0
            phdr.phy = PHDR_802_11_PHY_11A;
324
0
            phdr.phy_info.info_11a.has_channel_type = false;
325
0
            phdr.phy_info.info_11a.has_turbo_type = false;
326
0
        }
327
0
    }
328
329
0
    if(signal_strength == 100){ /* When signal = 100 %, it is TX packet and there is no FCS */
330
0
        phdr.fcs_len = 0; /* TX packet, no FCS */
331
0
    } else {
332
0
        phdr.fcs_len = 4; /* We have an FCS */
333
0
    }
334
0
    call_dissector_with_data(wlan_radio_handle, next_tvb, pinfo, tree, &phdr);
335
0
    return tvb_captured_length(tvb);
336
0
}
337
338
static int
339
dissect_aruba_erm_type4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
340
0
{
341
0
    unsigned offset = 0;
342
343
0
    dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
344
345
0
    call_dissector(ppi_handle, tvb, pinfo, tree);
346
347
0
    return tvb_captured_length(tvb);
348
0
}
349
350
/* Type 5 is the same of type 1 but with Peek Header version = 2, named internally Peekremote -ng */
351
static int
352
dissect_aruba_erm_type5(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
353
0
{
354
0
    unsigned offset = 0;
355
356
0
    dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
357
358
    /* Say to PEEK dissector, it is a Aruba PEEK  packet */
359
0
    call_dissector_with_data(peek_handle, tvb, pinfo, tree, GUINT_TO_POINTER(IS_ARUBA));
360
361
0
    return tvb_captured_length(tvb);
362
0
}
363
364
static int
365
dissect_aruba_erm_type6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
366
0
{
367
0
    unsigned offset = 0;
368
369
0
    dissect_aruba_erm_common(tvb, pinfo, tree, &offset);
370
371
    /* Note: In a similar manner to type 3, packets transmitted by the capturing
372
       AP will be passed with no FCS and a hardcoded 'antenna signal' of -30dBm.
373
       However, unlike type 3 we don't need to do anything about this because the
374
       radiotap header flag "FCS at end" will be correctly set to "False" in this case
375
       which is handled transparently by the radiotap dissector. All other received
376
       frames are expected to have a FCS and "FCS at end" set to "True".
377
     */
378
0
    call_dissector(radiotap_handle, tvb, pinfo, tree);
379
380
0
    return tvb_captured_length(tvb);
381
0
}
382
383
static void
384
aruba_erm_prompt(packet_info *pinfo _U_, char* result)
385
0
{
386
0
    snprintf(result, MAX_DECODE_AS_PROMPT_LEN, "Aruba ERM payload as");
387
0
}
388
389
void
390
proto_register_aruba_erm(void)
391
14
{
392
393
14
    static hf_register_info hf[] = {
394
395
14
        { &hf_aruba_erm_time,
396
14
          { "Packet Capture Timestamp", "aruba_erm.time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL,
397
14
            0x00, NULL, HFILL }},
398
14
        { &hf_aruba_erm_incl_len,
399
14
          { "Packet Captured Length", "aruba_erm.incl_len", FT_UINT32, BASE_DEC, NULL,
400
14
            0x00, NULL, HFILL }},
401
14
        { &hf_aruba_erm_orig_len,
402
14
          { "Packet Length", "aruba_erm.orig_len", FT_UINT32, BASE_DEC, NULL,
403
14
            0x00, NULL, HFILL }},
404
14
        { &hf_aruba_erm_data_rate,
405
14
          { "Data Rate", "aruba_erm.data_rate", FT_UINT16, BASE_DEC, NULL,
406
14
            0x00, "Data rate (1/2 Mb/s)", HFILL }},
407
14
        { &hf_aruba_erm_data_rate_gen,
408
14
          { "Data Rate", "aruba_erm.data_rate_gen", FT_FLOAT, BASE_NONE, NULL,
409
14
            0x00, "Data rate (1/2 Mb/s)", HFILL }},
410
14
        { &hf_aruba_erm_channel,
411
14
          { "Channel", "aruba_erm.channel", FT_UINT8, BASE_DEC, NULL,
412
14
            0x00, "802.11 channel number that this frame was sent/received on", HFILL }},
413
14
        { &hf_aruba_erm_signal_strength,
414
14
          { "Signal Strength [percent]", "aruba_erm.signal_strength", FT_UINT8, BASE_DEC, NULL,
415
14
            0x00, "Signal strength (Percentage)", HFILL }},
416
14
    };
417
418
    /* both formats share the same tree */
419
14
    static int *ett[] = {
420
14
        &ett_aruba_erm,
421
14
    };
422
423
14
    static ei_register_info ei[] = {
424
14
        { &ei_aruba_erm_airmagnet, { "aruba_erm.airmagnet", PI_UNDECODED, PI_ERROR, "Airmagnet (type 2) is no yet supported (Please use other type)", EXPFILL }},
425
14
        { &ei_aruba_erm_decode, { "aruba_erm.decode", PI_UNDECODED, PI_NOTE, "Use Decode AS (Aruba ERM Type) for decoding payload", EXPFILL }}
426
14
    };
427
428
#if 0
429
    static const enum_val_t aruba_erm_types[] = {
430
        { "pcap_type_0", "pcap (type 0)", TYPE_PCAP},
431
        { "peek_type_1", "peek (type 1)", TYPE_PEEK},
432
        { "airmagnet_type_2", "Airmagnet (type 2)", TYPE_AIRMAGNET},
433
        { "pcapplusradio_type_3", "pcap + radio header (type 3)", TYPE_PCAPPLUSRADIO},
434
        { "ppi_type_4", "PPI (type 4)", TYPE_PPI},
435
        { NULL, NULL, -1}
436
    };
437
#endif
438
439
14
    module_t *aruba_erm_module;
440
441
14
    expert_module_t* expert_aruba_erm;
442
443
14
    proto_aruba_erm = proto_register_protocol("Aruba Networks encapsulated remote mirroring", "ARUBA_ERM" , "aruba_erm");
444
14
    proto_aruba_erm_type0 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - PCAP (Type 0)", "ARUBA ERM PCAP (Type 0)", "aruba_erm_type0", proto_aruba_erm, FT_PROTOCOL);
445
14
    proto_aruba_erm_type1 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - PEEK (Type 1)", "ARUBA ERM PEEK (type 1)", "aruba_erm_type1", proto_aruba_erm, FT_PROTOCOL);
446
14
    proto_aruba_erm_type2 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - AIRMAGNET (Type 2)", "ARUBA ERM AIRMAGNET (Type 2)", "aruba_erm_type2", proto_aruba_erm, FT_PROTOCOL);
447
14
    proto_aruba_erm_type3 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - PCAP+RADIO (Type 3)", "ARUBA ERM PCAP+RADIO (Type 3)", "aruba_erm_type3", proto_aruba_erm, FT_PROTOCOL);
448
14
    proto_aruba_erm_type4 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - PPI (Type 4)", "ARUBA ERM PPI (Type 4)", "aruba_erm_type4", proto_aruba_erm, FT_PROTOCOL);
449
14
    proto_aruba_erm_type5 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - PEEK (Type 5)", "ARUBA ERM PEEK-NG (type 5)", "aruba_erm_type5", proto_aruba_erm, FT_PROTOCOL);
450
14
    proto_aruba_erm_type6 = proto_register_protocol_in_name_only("Aruba Networks encapsulated remote mirroring - RADIOTAP (Type 6)", "ARUBA ERM RADIOTAP (type 6)", "aruba_erm_type6", proto_aruba_erm, FT_PROTOCOL);
451
452
14
    aruba_erm_module = prefs_register_protocol(proto_aruba_erm, NULL);
453
454
#if 0
455
    /* Obso...*/
456
    prefs_register_enum_preference(aruba_erm_module, "type.captured",
457
                       "Type of formats for captured packets",
458
                       "Type of formats for captured packets",
459
                       &aruba_erm_type, aruba_erm_types, false);
460
#endif
461
14
    prefs_register_obsolete_preference(aruba_erm_module, "type.captured");
462
463
14
    proto_register_field_array(proto_aruba_erm, hf, array_length(hf));
464
14
    proto_register_subtree_array(ett, array_length(ett));
465
14
    expert_aruba_erm = expert_register_protocol(proto_aruba_erm);
466
14
    expert_register_field_array(expert_aruba_erm, ei, array_length(ei));
467
468
14
    aruba_erm_handle = register_dissector("aruba_erm", dissect_aruba_erm, proto_aruba_erm);
469
470
14
    aruba_erm_subdissector_table = register_decode_as_next_proto(proto_aruba_erm, "aruba_erm.type",
471
14
                                                                "Aruba ERM Type", aruba_erm_prompt);
472
473
14
    aruba_erm_handle_type0 = register_dissector("aruba_erm.type0", dissect_aruba_erm_type0, proto_aruba_erm_type0);
474
14
    aruba_erm_handle_type1 = register_dissector("aruba_erm.type1", dissect_aruba_erm_type1, proto_aruba_erm_type1);
475
14
    aruba_erm_handle_type2 = register_dissector("aruba_erm.type2", dissect_aruba_erm_type2, proto_aruba_erm_type2);
476
14
    aruba_erm_handle_type3 = register_dissector("aruba_erm.type3", dissect_aruba_erm_type3, proto_aruba_erm_type3);
477
14
    aruba_erm_handle_type4 = register_dissector("aruba_erm.type4", dissect_aruba_erm_type4, proto_aruba_erm_type4);
478
14
    aruba_erm_handle_type5 = register_dissector("aruba_erm.type5", dissect_aruba_erm_type5, proto_aruba_erm_type5);
479
14
    aruba_erm_handle_type6 = register_dissector("aruba_erm.type6", dissect_aruba_erm_type6, proto_aruba_erm_type6);
480
14
}
481
482
void
483
proto_reg_handoff_aruba_erm(void)
484
14
{
485
14
    wlan_radio_handle = find_dissector_add_dependency("wlan_radio", proto_aruba_erm);
486
14
    wlan_withfcs_handle = find_dissector_add_dependency("wlan_withfcs", proto_aruba_erm);
487
14
    ppi_handle = find_dissector_add_dependency("ppi", proto_aruba_erm);
488
14
    peek_handle = find_dissector_add_dependency("peekremote", proto_aruba_erm);
489
14
    radiotap_handle = find_dissector_add_dependency("radiotap", proto_aruba_erm);
490
491
14
    dissector_add_uint_range_with_preference("udp.port", "", aruba_erm_handle);
492
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type0);
493
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type1);
494
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type2);
495
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type3);
496
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type4);
497
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type5);
498
14
    dissector_add_for_decode_as("aruba_erm.type", aruba_erm_handle_type6);
499
14
}
500
501
/*
502
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
503
 *
504
 * Local variables:
505
 * c-basic-offset: 4
506
 * tab-width: 8
507
 * indent-tabs-mode: nil
508
 * End:
509
 *
510
 * vi: set shiftwidth=4 tabstop=8 expandtab:
511
 * :indentSize=4:tabSize=8:noTabs=true:
512
 */