Coverage Report

Created: 2026-09-28 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-waveagent.c
Line
Count
Source
1
/* packet-waveagent.c
2
 * Routines for WaveAgent dissection
3
 * Copyright 2009-2011, Tom Cook <tcook@ixiacom.com>
4
 *
5
 * Wireshark - Network traffic analyzer
6
 * By Gerald Combs <gerald@wireshark.org>
7
 * Copyright 1998 Gerald Combs
8
 * *
9
 * SPDX-License-Identifier: GPL-2.0-or-later
10
 */
11
12
#include "config.h"
13
14
#include <epan/packet.h>
15
16
#define ETHERNET_INTERFACE      1
16
16
#define WLAN_INTERFACE          2
17
18
16
#define IPV4_TYPE               2
19
16
#define IPV6_TYPE               10
20
21
0
#define NUM_STATE_CHANGES       8
22
0
#define NUM_BSS                 8
23
#define SHORT_STR               256
24
25
0
#define WA_V2_PAYLOAD_OFFSET    40
26
0
#define WA_V3_PAYLOAD_OFFSET    44
27
28
void proto_register_waveagent(void);
29
void proto_reg_handoff_waveagent(void);
30
31
/* Initialize the protocol and registered fields */
32
static int proto_waveagent;
33
static int hf_waveagent_controlword;
34
static int hf_waveagent_payloadlen;
35
static int hf_waveagent_transnum;
36
static int hf_waveagent_rtoken;
37
static int hf_waveagent_flowid;
38
static int hf_waveagent_capstatus;
39
static int hf_waveagent_protocolversion;
40
static int hf_waveagent_capimpl;
41
static int hf_waveagent_id;
42
static int hf_waveagent_bindtag;
43
static int hf_waveagent_version;
44
static int hf_waveagent_brokerip;
45
static int hf_waveagent_brokerport;
46
static int hf_waveagent_bindlevel;
47
static int hf_waveagent_bindport;
48
static int hf_waveagent_numinterfaces;
49
static int hf_waveagent_capabilities2;
50
static int hf_waveagent_ifmask;
51
static int hf_waveagent_commandstatus;
52
static int hf_waveagent_syserrno;
53
static int hf_waveagent_statusstring;
54
static int hf_waveagent_rxdatapckts;
55
static int hf_waveagent_rxdatabytes;
56
static int hf_waveagent_rxpcktrate;
57
static int hf_waveagent_rxbyterate;
58
static int hf_waveagent_txdatapckts;
59
static int hf_waveagent_txdatabytes;
60
static int hf_waveagent_txpcktrate;
61
static int hf_waveagent_txbyterate;
62
static int hf_waveagent_looppckts;
63
static int hf_waveagent_loopbytes;
64
static int hf_waveagent_rxctlpckts;
65
static int hf_waveagent_rxctlbytes;
66
static int hf_waveagent_txctlpckts;
67
static int hf_waveagent_txctlbytes;
68
static int hf_waveagent_unknowncmds;
69
static int hf_waveagent_snap;
70
static int hf_waveagent_state;
71
static int hf_waveagent_appstate;
72
static int hf_waveagent_rx1pl;
73
static int hf_waveagent_rx2pl;
74
static int hf_waveagent_rx3pl;
75
static int hf_waveagent_rx4pl;
76
static int hf_waveagent_rx5pl;
77
static int hf_waveagent_rxoospkts;
78
/* static int hf_waveagent_rxmeanlatency; */
79
/* static int hf_waveagent_rxminlatency; */
80
/* static int hf_waveagent_rxmaxlatency; */
81
static int hf_waveagent_latencysum;
82
static int hf_waveagent_latencycount;
83
static int hf_waveagent_txflowstop;
84
static int hf_waveagent_jitter;
85
static int hf_waveagent_remoteport;
86
static int hf_waveagent_remoteaddr;
87
static int hf_waveagent_dscp;
88
static int hf_waveagent_fsflags;
89
static int hf_waveagent_fscbrflag;
90
static int hf_waveagent_fscombinedsetupflag;
91
/* static int hf_waveagent_totalbytes; */
92
static int hf_waveagent_payfill;
93
static int hf_waveagent_paysize;
94
static int hf_waveagent_avgrate;
95
static int hf_waveagent_rxflownum;
96
static int hf_waveagent_mode;
97
static int hf_waveagent_endpointtype;
98
static int hf_waveagent_totalframes;
99
static int hf_waveagent_bssidstartindex;
100
static int hf_waveagent_bssidstopindex;
101
static int hf_waveagent_ifindex;
102
static int hf_waveagent_iftype;
103
static int hf_waveagent_ifdescription;
104
static int hf_waveagent_ifmacaddr;
105
static int hf_waveagent_iflinkspeed;
106
static int hf_waveagent_ifdhcp;
107
static int hf_waveagent_ifwlanbssid;
108
static int hf_waveagent_ifwlanssid;
109
static int hf_waveagent_ifiptype;
110
static int hf_waveagent_ifipv4;
111
static int hf_waveagent_ifipv6;
112
static int hf_waveagent_ifdhcpserver;
113
static int hf_waveagent_ifgateway;
114
static int hf_waveagent_ifdnsserver;
115
static int hf_waveagent_ifethl2status;
116
static int hf_waveagent_ifwlanl2status;
117
static int hf_waveagent_ifl3status;
118
static int hf_waveagent_totalbssid;
119
static int hf_waveagent_returnedbssid;
120
static int hf_waveagent_scanbssid;
121
static int hf_waveagent_scanssid;
122
static int hf_waveagent_ifwlanrssi;
123
static int hf_waveagent_ifwlansupprates;
124
static int hf_waveagent_ifwlancapabilities;
125
static int hf_waveagent_ifwlanchannel;
126
static int hf_waveagent_ifwlanprivacy;
127
static int hf_waveagent_ifwlanbssmode;
128
static int hf_waveagent_ifwlannoise;
129
static int hf_waveagent_ifphytypes;
130
static int hf_waveagent_ifphytypebit0;
131
static int hf_waveagent_ifphytypebit1;
132
static int hf_waveagent_ifphytypebit2;
133
static int hf_waveagent_ifphytypebit3;
134
/* static int hf_waveagent_ifphytypebit4; */
135
static int hf_waveagent_ifwlanauthentication;
136
static int hf_waveagent_ifwlancipher;
137
static int hf_waveagent_delayfactor;
138
static int hf_waveagent_medialossrate;
139
static int hf_waveagent_txstartts;
140
static int hf_waveagent_txendts;
141
static int hf_waveagent_rxstartts;
142
static int hf_waveagent_rxendts;
143
static int hf_waveagent_oidcode;
144
static int hf_waveagent_oidvalue;
145
static int hf_waveagent_destip;
146
static int hf_waveagent_destport;
147
static int hf_waveagent_connectflags;
148
static int hf_waveagent_connecttype;
149
static int hf_waveagent_minrssi;
150
static int hf_waveagent_connecttimeout;
151
static int hf_waveagent_connectattempts;
152
static int hf_waveagent_reason;
153
static int hf_waveagent_sigsequencenum;
154
static int hf_waveagent_relaydestid;
155
static int hf_waveagent_relaysrcid;
156
static int hf_waveagent_relaymessagest;
157
158
/* Initialize the subtree pointers */
159
static int ett_waveagent;
160
static int ett_statechange;
161
static int ett_phytypes;
162
static int ett_fsflags;
163
static int ett_scindex[8];  /* NUM_STATE_CHANGES */
164
static int ett_bss[8];  /* NUM_BSS           */
165
static int ett_relaymessage;
166
167
168
static const value_string control_words[] = {
169
    { 0x01, "Receive, Count, Discard"},
170
    { 0x02, "Receive, Count, Loopback"},
171
    { 0x03, "Receive, Count, Push timestamp, Discard"},
172
    { 0x04, "Receive, Count, Push timestamp, Loopback"},
173
    { 0x08, "Transmit"},
174
    { 0x11, "Start Flow"},
175
    { 0x12, "Stop Flow"},
176
    { 0x20, "Stats Reset"},
177
    { 0x21, "Stats Request"},
178
    { 0x22, "Flow Stats Reset"},
179
    { 0x23, "Scan Results Request"},
180
    { 0x24, "Interface Info Request"},
181
    { 0x25, "Interface Change Info Request"},
182
    { 0x26, "OID Request"},
183
    { 0x2e, "Scan Results Response"},
184
    { 0x2f, "Stats Response"},
185
    { 0x30, "Interface Info Response"},
186
    { 0x31, "Interface Change Info Response"},
187
    { 0x32, "OID Response"},  /* XXX: is this correct ? entry originally located after 0x41 */
188
    { 0x3e, "Relay Message"},
189
    { 0x3f, "Relay Response"},
190
    { 0x40, "Client Connect Request"},
191
    { 0x41, "Client Disconnect Request"},
192
    { 0x80, "Capabilities Request"},
193
    { 0x81, "Capabilities Response"},
194
    { 0x82, "Reserve Request"},
195
    { 0x84, "Release Request"},
196
    { 0x85, "Flow Setup"},
197
    { 0x86, "Flow Destroy"},
198
    { 0x87, "Flow Connect"},
199
    { 0x88, "Flow Disconnect"},
200
    { 0x89, "Flow Listen"},
201
    { 0x8a, "Scan Request"},
202
    { 0x8b, "Learning Message"},
203
    { 0x8f, "Command Response"},
204
    { 0, NULL},
205
};
206
static value_string_ext control_words_ext = VALUE_STRING_EXT_INIT(control_words);
207
208
/* Dissects the WLAN interface stats structure */
209
static void dissect_wlan_if_stats(uint32_t starting_offset, proto_item *parent_tree, tvbuff_t *tvb)
210
0
{
211
0
    proto_item *phy_types;
212
0
    proto_tree *phy_types_tree;
213
0
    uint32_t    phy_types_bitfield, noise_floor;
214
215
0
    proto_tree_add_item(parent_tree,
216
0
        hf_waveagent_ifwlanbssid, tvb, starting_offset, 6, ENC_NA);
217
218
    /* two bytes of pad go here */
219
220
0
    proto_tree_add_item(parent_tree,
221
0
        hf_waveagent_ifwlanssid, tvb, starting_offset + 8, 32, ENC_ASCII);
222
223
    /* 4 byte SSID length field not reported */
224
225
0
    proto_tree_add_item(parent_tree,
226
0
        hf_waveagent_ifwlanrssi, tvb, starting_offset + 44, 4, ENC_BIG_ENDIAN);
227
228
0
    noise_floor = tvb_get_ntohl(tvb, starting_offset + 48);
229
230
0
    if (noise_floor != 0x7fffffff) {
231
0
        proto_tree_add_item(parent_tree,
232
0
            hf_waveagent_ifwlannoise, tvb, starting_offset + 48, 4, ENC_BIG_ENDIAN);
233
0
    }
234
0
    else {
235
0
        proto_tree_add_int_format_value(parent_tree,
236
0
            hf_waveagent_ifwlannoise, tvb, starting_offset + 48, 4, noise_floor,
237
0
            "Not Reported");
238
0
    }
239
240
0
    phy_types_bitfield = tvb_get_ntohl(tvb, starting_offset + 52);
241
242
0
    phy_types = proto_tree_add_uint(parent_tree, hf_waveagent_ifphytypes,
243
0
                                tvb, starting_offset + 52, 4, phy_types_bitfield);
244
245
0
    phy_types_tree = proto_item_add_subtree(phy_types, ett_phytypes);
246
247
0
    proto_tree_add_item(phy_types_tree,
248
0
            hf_waveagent_ifphytypebit0, tvb, starting_offset + 55, 1, ENC_LITTLE_ENDIAN);
249
250
0
    proto_tree_add_item(phy_types_tree,
251
0
            hf_waveagent_ifphytypebit1, tvb, starting_offset + 55, 1, ENC_LITTLE_ENDIAN);
252
253
0
    proto_tree_add_item(phy_types_tree,
254
0
            hf_waveagent_ifphytypebit2, tvb, starting_offset + 55, 1, ENC_LITTLE_ENDIAN);
255
256
0
    proto_tree_add_item(phy_types_tree,
257
0
            hf_waveagent_ifphytypebit3, tvb, starting_offset + 55, 1, ENC_LITTLE_ENDIAN);
258
259
0
    proto_tree_add_item(parent_tree,
260
0
        hf_waveagent_ifwlanauthentication, tvb, starting_offset + 56, 4, ENC_BIG_ENDIAN);
261
262
0
    proto_tree_add_item(parent_tree,
263
0
        hf_waveagent_ifwlancipher, tvb, starting_offset + 60, 4, ENC_BIG_ENDIAN);
264
0
}
265
266
static void dissect_wa_payload(uint32_t starting_offset, proto_item *parent_tree, packet_info* pinfo, tvbuff_t *tvb, uint32_t control_word, uint8_t version)
267
0
{
268
0
    switch (control_word)
269
0
    {
270
0
        case 0x11:   /* Flow start message */
271
0
            proto_tree_add_item(parent_tree,
272
0
                hf_waveagent_payfill, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
273
274
0
            proto_tree_add_item(parent_tree,
275
0
                hf_waveagent_paysize, tvb, starting_offset+4, 4, ENC_BIG_ENDIAN);
276
277
0
            proto_tree_add_item(parent_tree,
278
0
                hf_waveagent_avgrate, tvb, starting_offset+8, 4, ENC_BIG_ENDIAN);
279
280
0
            proto_tree_add_item(parent_tree,
281
0
                hf_waveagent_totalframes, tvb, starting_offset+12, 4, ENC_BIG_ENDIAN);
282
283
0
            break;
284
285
0
        case 0x23:   /* Scan results request */
286
0
            proto_tree_add_item(parent_tree,
287
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
288
289
0
            proto_tree_add_item(parent_tree,
290
0
                hf_waveagent_bssidstartindex, tvb, starting_offset+4, 4, ENC_BIG_ENDIAN);
291
292
0
            proto_tree_add_item(parent_tree,
293
0
                hf_waveagent_bssidstopindex, tvb, starting_offset+8, 4, ENC_BIG_ENDIAN);
294
295
0
            break;
296
297
0
        case 0x24:   /* Interface info request */
298
0
        case 0x25:   /* Interface change info request */
299
0
        case 0x8a:   /* Scan request */
300
0
            proto_tree_add_item(parent_tree,
301
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
302
303
0
            break;
304
305
0
        case 0x26:   /* OID request */
306
0
            proto_tree_add_item(parent_tree,
307
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
308
309
0
            proto_tree_add_item(parent_tree,
310
0
                hf_waveagent_oidcode, tvb, starting_offset+4, 4, ENC_BIG_ENDIAN);
311
312
0
            break;
313
314
0
        case 0x30: {  /* Interface stats response */
315
0
            uint32_t if_type;
316
317
0
            proto_tree_add_item(parent_tree,
318
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
319
320
0
            if_type = tvb_get_ntohl(tvb, starting_offset + 4);
321
322
0
            proto_tree_add_item(parent_tree,
323
0
                hf_waveagent_iftype, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
324
325
0
            proto_tree_add_item(parent_tree,
326
0
                hf_waveagent_ifdhcp, tvb, starting_offset + 8, 4, ENC_BIG_ENDIAN);
327
328
0
            proto_tree_add_item(parent_tree,
329
0
                hf_waveagent_ifmacaddr, tvb, starting_offset + 12, 6, ENC_NA);
330
331
            /* 2 bytes of pad go here */
332
333
0
            proto_tree_add_item(parent_tree,
334
0
                hf_waveagent_iflinkspeed, tvb, starting_offset + 20, 4, ENC_BIG_ENDIAN);
335
336
0
            proto_tree_add_item(parent_tree,
337
0
                hf_waveagent_ifdescription, tvb, starting_offset + 24, 128, ENC_ASCII);
338
339
            /* 4 byte length field goes here - skip it */
340
341
            /* two bytes of pad go here */
342
343
            /* If we have WLAN interface, then report the following */
344
0
            if (if_type == WLAN_INTERFACE)
345
0
                dissect_wlan_if_stats(starting_offset + 156, parent_tree, tvb);
346
347
            /* Next come the BindingAddress fields (for each address):
348
                2 bytes:  IP type (v4 or v6)
349
                2 bytes:  address length
350
                4 bytes:  service number (not used)
351
                16 bytes: IP address     */
352
353
            /* for the bound IP address, report both IP type and address */
354
355
0
            proto_tree_add_item(parent_tree,
356
0
                hf_waveagent_ifiptype, tvb, starting_offset + 252, 2, ENC_BIG_ENDIAN);
357
358
0
            if (tvb_get_ntohs(tvb, starting_offset + 252) == IPV4_TYPE) {
359
0
                proto_tree_add_item(parent_tree,
360
0
                    hf_waveagent_ifipv4, tvb, starting_offset + 260, 4, ENC_BIG_ENDIAN);  /* grab the last 4 bytes of the IP address field */
361
0
            }
362
0
            else {
363
0
                proto_tree_add_item(parent_tree,
364
0
                    hf_waveagent_ifipv6, tvb, starting_offset + 260, 16, ENC_NA);
365
0
            }
366
367
0
            proto_tree_add_item(parent_tree,
368
0
                hf_waveagent_ifdhcpserver, tvb, starting_offset + 284, 4, ENC_BIG_ENDIAN);
369
370
0
            proto_tree_add_item(parent_tree,
371
0
                hf_waveagent_ifgateway,    tvb, starting_offset + 308, 4, ENC_BIG_ENDIAN);
372
373
0
            proto_tree_add_item(parent_tree,
374
0
                hf_waveagent_ifdnsserver,  tvb, starting_offset + 332, 4, ENC_BIG_ENDIAN);
375
376
0
            break;
377
0
        }
378
379
0
        case 0x31:  {  /* Interface change info response */
380
0
            uint32_t offset;
381
0
            uint32_t if_type;
382
0
            uint32_t delta;
383
0
            uint32_t iLoop;
384
385
0
            proto_tree_add_item(parent_tree,
386
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
387
388
0
            if_type = tvb_get_ntohl(tvb, starting_offset + 4);
389
390
0
            proto_tree_add_item(parent_tree,
391
0
                hf_waveagent_iftype, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
392
393
0
            offset = starting_offset + 8;
394
0
            delta = 156;
395
396
0
            for (iLoop = 0; iLoop < NUM_STATE_CHANGES; iLoop++) {
397
0
                proto_item *stIndex;
398
0
                proto_tree *st_change_index_tree;
399
0
                uint32_t    if_status;
400
0
                int         current_offset;
401
402
0
                current_offset = offset + iLoop * delta;
403
404
                /* Check to see if the interface entry is valid */
405
0
                if_status = tvb_get_ntohl(tvb, current_offset);
406
0
                if (if_status == 0) continue;  /* No entry at this index, keep going */
407
408
                /* Add index specific trees to hide the details */
409
0
                stIndex = proto_tree_add_uint_format_value(parent_tree,
410
0
                    hf_waveagent_ifwlanl2status, tvb, current_offset, 4, if_status, "Interface state change %d", iLoop);
411
412
0
                st_change_index_tree = proto_item_add_subtree(stIndex, ett_scindex[iLoop]);
413
414
0
                if (if_type == WLAN_INTERFACE) {
415
0
                    proto_tree_add_item(st_change_index_tree,
416
0
                        hf_waveagent_ifwlanl2status, tvb, current_offset, 4, ENC_BIG_ENDIAN);
417
0
                } else {
418
0
                    proto_tree_add_item(st_change_index_tree,
419
0
                        hf_waveagent_ifethl2status, tvb, current_offset, 4, ENC_BIG_ENDIAN);
420
0
                }
421
422
0
                proto_tree_add_item(st_change_index_tree,
423
0
                    hf_waveagent_ifl3status, tvb, current_offset + 4, 4, ENC_BIG_ENDIAN);
424
425
0
                proto_tree_add_item(st_change_index_tree,
426
0
                    hf_waveagent_iflinkspeed, tvb, current_offset + 8, 4, ENC_BIG_ENDIAN);
427
428
0
                if (if_type == WLAN_INTERFACE) {
429
0
                    dissect_wlan_if_stats(current_offset + 12, st_change_index_tree, tvb);
430
0
                }
431
432
0
                proto_tree_add_item(st_change_index_tree,
433
0
                    hf_waveagent_snap, tvb, current_offset + 108, 8, ENC_BIG_ENDIAN);
434
435
0
                proto_tree_add_item(st_change_index_tree,
436
0
                    hf_waveagent_ifiptype, tvb, current_offset + 116, 2, ENC_BIG_ENDIAN);
437
438
0
                if (tvb_get_ntohs(tvb, current_offset + 116) == IPV4_TYPE) {
439
0
                    proto_tree_add_item(st_change_index_tree,
440
0
                        hf_waveagent_ifipv4, tvb, current_offset + 124, 4, ENC_BIG_ENDIAN);  /* grab the last 4 bytes of the IP address field */
441
0
                }
442
0
                else {
443
0
                    proto_tree_add_item(st_change_index_tree,
444
0
                        hf_waveagent_ifipv6, tvb, current_offset + 124, 16, ENC_NA);
445
0
                }
446
447
                /* 16 bytes of padding */
448
0
            }
449
450
0
            break;
451
0
        }
452
453
0
        case 0x32:   /* OID response */
454
0
            proto_tree_add_item(parent_tree,
455
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
456
457
0
            proto_tree_add_item(parent_tree,
458
0
                hf_waveagent_oidcode, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
459
460
0
            proto_tree_add_item(parent_tree,
461
0
                hf_waveagent_oidvalue, tvb, starting_offset + 12, 1024, ENC_ASCII);
462
463
0
            break;
464
465
0
        case 0x2e: {  /* scan results response message */
466
0
            uint32_t       offset;
467
0
            proto_item    *pi;
468
0
            uint32_t       num_bss_entries;
469
0
            uint32_t       tag_len;
470
0
            uint32_t       delta;
471
0
            uint32_t       iLoop;
472
0
            wmem_strbuf_t *sb;
473
474
0
            proto_tree_add_item(parent_tree,
475
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
476
477
478
0
            proto_tree_add_item(parent_tree,
479
0
                hf_waveagent_totalbssid, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
480
481
0
            pi = proto_tree_add_item(parent_tree,
482
0
                hf_waveagent_returnedbssid, tvb, starting_offset + 8, 4, ENC_BIG_ENDIAN);
483
484
0
            num_bss_entries = tvb_get_ntohl(tvb, starting_offset + 8);
485
486
0
            if (num_bss_entries > NUM_BSS) {
487
0
                proto_item_append_text(pi, " [**Too large: Limiting to " G_STRINGIFY(NUM_BSS) "]");
488
0
                num_bss_entries = NUM_BSS;
489
0
            }
490
            /* Add 4 bytes of pad for the offset */
491
492
0
            offset = starting_offset + 16;
493
0
            delta  = 148;
494
495
0
            sb = wmem_strbuf_new_sized(pinfo->pool, 8);
496
497
0
            for (iLoop = 0; iLoop < num_bss_entries; iLoop++)
498
0
            {
499
0
                proto_item *bssIndex;
500
0
                proto_tree *bss_tree;
501
0
                int         current_offset;
502
503
0
                wmem_strbuf_truncate(sb, 0);
504
505
0
                current_offset = offset + iLoop * delta;
506
507
0
                bssIndex = proto_tree_add_item(parent_tree,
508
0
                    hf_waveagent_scanssid, tvb, current_offset, 32, ENC_ASCII);
509
510
0
                bss_tree = proto_item_add_subtree(bssIndex, ett_bss[iLoop]);
511
512
0
                tag_len = tvb_get_ntohl(tvb, current_offset + 52);
513
514
0
                if (tag_len != 0) {
515
0
                    uint32_t      isr;
516
0
                    uint8_t       isr_value;
517
518
0
                    for (isr = 0; isr < tag_len; isr++) {
519
0
                        isr_value = tvb_get_uint8(tvb, offset + 36 + isr);
520
0
                        if (isr_value == 0xFF){
521
0
                            proto_tree_add_string (bss_tree, hf_waveagent_ifwlansupprates, tvb, offset + 36 + isr,
522
0
                                                   1,
523
0
                                                   "BSS requires support for mandatory features of HT PHY (IEEE 802.11"
524
0
                                                   " - Clause 20)");
525
0
                        } else {
526
0
                            wmem_strbuf_append_printf(sb, "%2.1f%s ",
527
0
                                      (isr_value & 0x7F) * 0.5,
528
0
                                      (isr_value & 0x80) ? "(B)" : "");
529
530
0
                        }
531
0
                    }
532
0
                    wmem_strbuf_append(sb, " [Mbit/sec]");
533
0
                }
534
0
                else {
535
0
                    wmem_strbuf_append(sb, "Not defined");
536
0
                }
537
538
0
                proto_tree_add_string (bss_tree, hf_waveagent_ifwlansupprates, tvb, offset + 36,
539
0
                    tag_len, wmem_strbuf_get_str(sb));
540
541
0
                proto_tree_add_item(bss_tree,
542
0
                    hf_waveagent_scanbssid, tvb, current_offset + 56, 6, ENC_NA);
543
544
0
                proto_tree_add_item(bss_tree,
545
0
                    hf_waveagent_ifwlancapabilities, tvb, current_offset + 62, 2, ENC_BIG_ENDIAN);
546
547
0
                proto_tree_add_item(bss_tree,
548
0
                    hf_waveagent_ifwlanrssi, tvb, current_offset + 64, 4, ENC_BIG_ENDIAN);
549
550
                /*  For now this is just a 4 byte pad, so comment it out...  */
551
#if 0
552
                proto_tree_add_item(bss_tree,
553
                    hf_waveagent_ifwlansigquality, tvb, current_offset + 68, 4, ENC_BIG_ENDIAN);
554
#endif
555
0
                proto_tree_add_item(bss_tree,
556
0
                    hf_waveagent_ifwlanchannel, tvb, current_offset + 72, 4, ENC_BIG_ENDIAN);
557
558
0
                proto_tree_add_item(bss_tree,
559
0
                    hf_waveagent_ifwlanprivacy, tvb, current_offset + 76, 4, ENC_BIG_ENDIAN);
560
561
0
                proto_tree_add_item(bss_tree,
562
0
                    hf_waveagent_ifwlanbssmode, tvb, current_offset + 80, 4, ENC_BIG_ENDIAN);
563
0
            }
564
0
            break;
565
0
        }
566
567
0
        case 0x2f:   /* Stats response message */
568
0
            if (version < 3) {
569
                /* For version 2 WA protocol the capability status is not in the header but in the CAP
570
                   RESPONSE.  Need to read it here and then advance the payload offset.  This is a
571
                   packet that had a structure change in the beginning of the packet when moving
572
                   to v3 */
573
0
                proto_tree_add_item(parent_tree,
574
0
                    hf_waveagent_capstatus, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
575
576
0
                proto_tree_add_item(parent_tree,
577
0
                    hf_waveagent_protocolversion, tvb, starting_offset, 1, ENC_BIG_ENDIAN);
578
579
0
                starting_offset += 4;
580
0
            }
581
582
0
            proto_tree_add_item(parent_tree,
583
0
                hf_waveagent_capimpl, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
584
585
0
            proto_tree_add_item(parent_tree,
586
0
                       hf_waveagent_state, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
587
588
0
            proto_tree_add_item(parent_tree,
589
0
                       hf_waveagent_appstate, tvb, starting_offset + 8, 4, ENC_BIG_ENDIAN);
590
591
0
            proto_tree_add_item(parent_tree,
592
0
                hf_waveagent_rxdatapckts, tvb, starting_offset + 12, 8, ENC_BIG_ENDIAN);
593
594
0
            proto_tree_add_item(parent_tree,
595
0
                hf_waveagent_rxdatabytes, tvb, starting_offset + 20, 8, ENC_BIG_ENDIAN);
596
597
0
            proto_tree_add_item(parent_tree,
598
0
                hf_waveagent_rxpcktrate, tvb, starting_offset + 28, 8, ENC_BIG_ENDIAN);
599
600
0
            proto_tree_add_item(parent_tree,
601
0
                hf_waveagent_rxbyterate, tvb, starting_offset + 36, 8, ENC_BIG_ENDIAN);
602
603
0
            proto_tree_add_item(parent_tree,
604
0
                hf_waveagent_txdatapckts, tvb, starting_offset + 44, 8, ENC_BIG_ENDIAN);
605
606
0
            proto_tree_add_item(parent_tree,
607
0
                hf_waveagent_txdatabytes, tvb, starting_offset + 52, 8, ENC_BIG_ENDIAN);
608
609
0
            proto_tree_add_item(parent_tree,
610
0
                hf_waveagent_txpcktrate, tvb, starting_offset + 60, 8, ENC_BIG_ENDIAN);
611
612
0
            proto_tree_add_item(parent_tree,
613
0
                hf_waveagent_txbyterate, tvb, starting_offset + 68, 8, ENC_BIG_ENDIAN);
614
615
0
            proto_tree_add_item(parent_tree,
616
0
                hf_waveagent_looppckts, tvb, starting_offset + 76, 8, ENC_BIG_ENDIAN);
617
618
0
            proto_tree_add_item(parent_tree,
619
0
                hf_waveagent_loopbytes, tvb, starting_offset + 84, 8, ENC_BIG_ENDIAN);
620
621
0
            proto_tree_add_item(parent_tree,
622
0
                hf_waveagent_rxctlpckts, tvb, starting_offset + 92, 8, ENC_BIG_ENDIAN);
623
624
0
            proto_tree_add_item(parent_tree,
625
0
                hf_waveagent_rxctlbytes, tvb, starting_offset + 100, 8, ENC_BIG_ENDIAN);
626
627
0
            proto_tree_add_item(parent_tree,
628
0
                hf_waveagent_txctlpckts, tvb, starting_offset + 108, 8, ENC_BIG_ENDIAN);
629
630
0
            proto_tree_add_item(parent_tree,
631
0
                hf_waveagent_txctlbytes, tvb, starting_offset + 116, 8, ENC_BIG_ENDIAN);
632
633
0
            proto_tree_add_item(parent_tree,
634
0
                hf_waveagent_unknowncmds, tvb, starting_offset + 124, 8, ENC_BIG_ENDIAN);
635
636
0
            proto_tree_add_item(parent_tree,
637
0
                hf_waveagent_snap, tvb, starting_offset + 132, 8, ENC_BIG_ENDIAN);
638
639
#if 0
640
            proto_tree_add_item(parent_tree,
641
                hf_waveagent_tstamp1, tvb, 140, 4, ENC_BIG_ENDIAN);
642
643
            proto_tree_add_item(parent_tree,
644
                hf_waveagent_tstamp2, tvb, 144, 4, ENC_BIG_ENDIAN);
645
646
            proto_tree_add_item(parent_tree,
647
                hf_waveagent_tstamp3, tvb, 148, 4, ENC_BIG_ENDIAN);
648
649
            proto_tree_add_item(parent_tree,
650
                hf_waveagent_tstamp4, tvb, 152, 4, ENC_BIG_ENDIAN);
651
652
            proto_tree_add_item(parent_tree,
653
                hf_waveagent_tstamp5, tvb, 156, 4, ENC_BIG_ENDIAN);
654
655
            proto_tree_add_item(parent_tree,
656
                hf_waveagent_tstamp6, tvb, 160, 4, ENC_BIG_ENDIAN);
657
658
            proto_tree_add_item(parent_tree,
659
                hf_waveagent_tstamp7, tvb, 164, 4, ENC_BIG_ENDIAN);
660
661
            proto_tree_add_item(parent_tree,
662
                hf_waveagent_tstamp8, tvb, 168, 4, ENC_BIG_ENDIAN);
663
664
            proto_tree_add_item(parent_tree,
665
                hf_waveagent_minlcldelta, tvb, 172, 4, ENC_BIG_ENDIAN);
666
667
            proto_tree_add_item(parent_tree,
668
                hf_waveagent_maxlcldelta, tvb, 176, 4, ENC_BIG_ENDIAN);
669
670
            proto_tree_add_item(parent_tree,
671
                hf_waveagent_avglcldelta, tvb, 180, 4, ENC_BIG_ENDIAN);
672
673
            proto_tree_add_item(parent_tree,
674
                hf_waveagent_minremdelta, tvb, 184, 4, ENC_BIG_ENDIAN);
675
676
            proto_tree_add_item(parent_tree,
677
                hf_waveagent_maxremdelta, tvb, 188, 4, ENC_BIG_ENDIAN);
678
679
            proto_tree_add_item(parent_tree,
680
                hf_waveagent_avgremdelta, tvb, 192, 4, ENC_BIG_ENDIAN);
681
#endif
682
0
            proto_tree_add_item(parent_tree,
683
0
                hf_waveagent_rx1pl, tvb, starting_offset + 284, 8, ENC_BIG_ENDIAN);
684
685
0
            proto_tree_add_item(parent_tree,
686
0
                hf_waveagent_rx2pl, tvb, starting_offset + 292, 8, ENC_BIG_ENDIAN);
687
688
0
            proto_tree_add_item(parent_tree,
689
0
                hf_waveagent_rx3pl, tvb, starting_offset + 300, 8, ENC_BIG_ENDIAN);
690
691
0
            proto_tree_add_item(parent_tree,
692
0
                hf_waveagent_rx4pl, tvb, starting_offset + 308, 8, ENC_BIG_ENDIAN);
693
694
0
            proto_tree_add_item(parent_tree,
695
0
                hf_waveagent_rx5pl, tvb, starting_offset + 316, 8, ENC_BIG_ENDIAN);
696
697
0
            proto_tree_add_item(parent_tree,
698
0
                hf_waveagent_rxoospkts, tvb, starting_offset + 324, 8, ENC_BIG_ENDIAN);
699
700
0
            proto_tree_add_item(parent_tree,
701
0
                hf_waveagent_jitter, tvb, starting_offset + 356, 8, ENC_BIG_ENDIAN);
702
703
0
            if (version >= 3) {
704
0
                proto_tree_add_item(parent_tree,
705
0
                    hf_waveagent_delayfactor, tvb, starting_offset + 364, 8, ENC_BIG_ENDIAN);
706
707
0
                proto_tree_add_item(parent_tree,
708
0
                    hf_waveagent_medialossrate, tvb, starting_offset + 372, 8, ENC_BIG_ENDIAN);
709
710
0
                proto_tree_add_item(parent_tree,
711
0
                    hf_waveagent_txstartts, tvb, starting_offset + 380, 8, ENC_BIG_ENDIAN);
712
713
0
                proto_tree_add_item(parent_tree,
714
0
                    hf_waveagent_txendts, tvb, starting_offset + 388, 8, ENC_BIG_ENDIAN);
715
716
0
                proto_tree_add_item(parent_tree,
717
0
                    hf_waveagent_rxstartts, tvb, starting_offset + 396, 8, ENC_BIG_ENDIAN);
718
719
0
                proto_tree_add_item(parent_tree,
720
0
                    hf_waveagent_rxendts, tvb, starting_offset + 404, 8, ENC_BIG_ENDIAN);
721
722
0
                proto_tree_add_item(parent_tree,
723
0
                    hf_waveagent_latencysum, tvb, starting_offset + 412, 8, ENC_BIG_ENDIAN);
724
725
0
                proto_tree_add_item(parent_tree,
726
0
                    hf_waveagent_latencycount, tvb, starting_offset + 420, 8, ENC_BIG_ENDIAN);
727
728
0
                proto_tree_add_item(parent_tree,
729
0
                    hf_waveagent_txflowstop, tvb, starting_offset + 428, 8, ENC_BIG_ENDIAN);
730
0
            }
731
732
0
            break;
733
734
0
        case 0x40: {
735
0
            uint32_t offset;
736
0
            uint32_t delta;
737
0
            uint32_t iLoop;
738
0
            uint32_t num_bss_entries;
739
740
0
            proto_tree_add_item(parent_tree,
741
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
742
743
0
            proto_tree_add_item(parent_tree,
744
0
                hf_waveagent_connectflags, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
745
746
0
            proto_tree_add_item(parent_tree,
747
0
                hf_waveagent_connecttype, tvb, starting_offset + 8, 4, ENC_BIG_ENDIAN);
748
749
0
            proto_tree_add_item(parent_tree,
750
0
                hf_waveagent_scanssid, tvb, starting_offset + 12, 32, ENC_ASCII);
751
752
0
            num_bss_entries = tvb_get_ntohl(tvb, starting_offset + 142);
753
754
0
            offset = starting_offset + 46;
755
0
            delta = 6;
756
0
            for (iLoop = 0; iLoop < num_bss_entries; iLoop++)
757
0
            {
758
0
                int current_offset;
759
0
                current_offset = offset + iLoop * delta;
760
761
0
                proto_tree_add_item(parent_tree,
762
0
                    hf_waveagent_scanbssid, tvb, current_offset, 6, ENC_NA);
763
0
            }
764
765
0
            proto_tree_add_item(parent_tree,
766
0
                hf_waveagent_minrssi, tvb, starting_offset + 146, 4, ENC_BIG_ENDIAN);
767
768
0
            proto_tree_add_item(parent_tree,
769
0
                hf_waveagent_connecttimeout, tvb, starting_offset + 150, 4, ENC_BIG_ENDIAN);
770
771
0
            proto_tree_add_item(parent_tree,
772
0
                hf_waveagent_connectattempts, tvb, starting_offset + 154, 4, ENC_BIG_ENDIAN);
773
774
0
            break;
775
0
        }
776
777
0
        case 0x41:
778
0
            proto_tree_add_item(parent_tree,
779
0
                hf_waveagent_ifindex, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
780
781
0
            proto_tree_add_item(parent_tree,
782
0
                hf_waveagent_reason, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
783
784
0
            break;
785
786
0
        case 0x81:   /* Capabilities response */
787
0
            if (version < 3) {
788
                /* For version 2 WA protocol the capability status is not in the header but in the CAP
789
                   RESPONSE.  Need to read it here and then advance the payload offset.  This is a
790
                   packet that had a structure change in the beginning of the packet when moving
791
                   to v3 */
792
0
                proto_tree_add_item(parent_tree,
793
0
                    hf_waveagent_capstatus, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
794
795
0
                proto_tree_add_item(parent_tree,
796
0
                    hf_waveagent_protocolversion, tvb, starting_offset, 1, ENC_BIG_ENDIAN);
797
798
0
                starting_offset += 4;
799
0
            }
800
801
0
            proto_tree_add_item(parent_tree,
802
0
                hf_waveagent_capimpl, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
803
804
0
            proto_tree_add_item(parent_tree,
805
0
                hf_waveagent_id, tvb, starting_offset + 4, 128, ENC_ASCII);
806
807
0
            proto_tree_add_item(parent_tree,
808
0
                hf_waveagent_bindtag, tvb, starting_offset + 136, 128, ENC_ASCII);
809
810
0
            proto_tree_add_item(parent_tree,
811
0
                hf_waveagent_version, tvb, starting_offset + 268, 128, ENC_ASCII);
812
813
0
            proto_tree_add_item(parent_tree,
814
0
                hf_waveagent_brokerip, tvb, starting_offset + 400, 4, ENC_BIG_ENDIAN);
815
816
0
            proto_tree_add_item(parent_tree,
817
0
                hf_waveagent_brokerport, tvb, starting_offset + 404, 4, ENC_BIG_ENDIAN);
818
819
0
            proto_tree_add_item(parent_tree,
820
0
                hf_waveagent_bindlevel, tvb, starting_offset + 408, 4, ENC_BIG_ENDIAN);
821
822
0
            proto_tree_add_item(parent_tree,
823
0
                hf_waveagent_bindport, tvb, starting_offset + 412, 4, ENC_BIG_ENDIAN);
824
825
0
            if (version >= 3) {
826
0
                proto_tree_add_item(parent_tree,
827
0
                    hf_waveagent_capabilities2, tvb, starting_offset + 416, 4, ENC_BIG_ENDIAN);
828
829
0
                proto_tree_add_item(parent_tree,
830
0
                    hf_waveagent_numinterfaces, tvb, starting_offset + 420, 4, ENC_BIG_ENDIAN);
831
832
0
                proto_tree_add_item(parent_tree,
833
0
                    hf_waveagent_ifmask, tvb, starting_offset + 424, 4, ENC_BIG_ENDIAN);
834
0
            }
835
836
0
            break;
837
838
0
        case 0x82:    /* Reserve request */
839
0
            proto_tree_add_item(parent_tree,
840
0
                hf_waveagent_bindtag, tvb, starting_offset, 128, ENC_ASCII);
841
842
0
            proto_tree_add_item(parent_tree,
843
0
                hf_waveagent_brokerip, tvb, starting_offset + 132, 4, ENC_BIG_ENDIAN);
844
845
0
            proto_tree_add_item(parent_tree,
846
0
                hf_waveagent_brokerport, tvb, starting_offset + 136, 4, ENC_BIG_ENDIAN);
847
848
0
            break;
849
850
0
        case 0x85: {   /* Flow setup */
851
0
            proto_tree *fs_flags;
852
0
            proto_tree *fs_flags_tree;
853
0
            uint32_t    flags_bitfield;
854
855
0
            if (version < 3) {
856
0
                proto_tree_add_item(parent_tree,
857
0
                    hf_waveagent_rxflownum, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
858
0
            }
859
860
0
            proto_tree_add_item(parent_tree,
861
0
                hf_waveagent_mode, tvb, starting_offset + 7, 1, ENC_BIG_ENDIAN);
862
863
0
            proto_tree_add_item(parent_tree,
864
0
                hf_waveagent_endpointtype, tvb, starting_offset + 7, 1, ENC_BIG_ENDIAN);
865
866
0
            proto_tree_add_item(parent_tree,
867
0
                hf_waveagent_bindport, tvb, starting_offset + 8, 4, ENC_BIG_ENDIAN);
868
869
0
            proto_tree_add_item(parent_tree,
870
0
                hf_waveagent_bindlevel, tvb, starting_offset + 12, 4, ENC_BIG_ENDIAN);
871
872
0
            proto_tree_add_item(parent_tree,
873
0
                hf_waveagent_remoteport, tvb, starting_offset + 16, 4, ENC_BIG_ENDIAN);
874
875
0
            proto_tree_add_item(parent_tree,
876
0
                hf_waveagent_remoteaddr, tvb, starting_offset + 24, 4, ENC_BIG_ENDIAN);
877
878
0
            proto_tree_add_item(parent_tree,
879
0
                hf_waveagent_dscp, tvb, starting_offset + 40, 4, ENC_BIG_ENDIAN);
880
881
0
            flags_bitfield = tvb_get_ntohl(tvb, starting_offset + 44);
882
883
0
            fs_flags = proto_tree_add_uint(parent_tree, hf_waveagent_fsflags,
884
0
                                        tvb, starting_offset + 44, 4, flags_bitfield);
885
886
0
            fs_flags_tree = proto_item_add_subtree(fs_flags, ett_fsflags);
887
888
0
            proto_tree_add_item(fs_flags_tree,
889
0
                    hf_waveagent_fscbrflag, tvb, starting_offset + 47, 1, ENC_LITTLE_ENDIAN);
890
891
0
            proto_tree_add_item(fs_flags_tree,
892
0
                    hf_waveagent_fscombinedsetupflag, tvb, starting_offset + 47, 1, ENC_LITTLE_ENDIAN);
893
894
0
            if (version >= 3) {
895
0
                proto_tree_add_item(parent_tree,
896
0
                    hf_waveagent_ifindex, tvb, starting_offset + 48, 4, ENC_BIG_ENDIAN);
897
898
0
                proto_tree_add_item(parent_tree,
899
0
                    hf_waveagent_payfill, tvb, starting_offset + 52, 4, ENC_BIG_ENDIAN);
900
901
0
                proto_tree_add_item(parent_tree,
902
0
                    hf_waveagent_paysize, tvb, starting_offset + 56, 4, ENC_BIG_ENDIAN);
903
904
0
                proto_tree_add_item(parent_tree,
905
0
                    hf_waveagent_avgrate, tvb, starting_offset + 60, 4, ENC_BIG_ENDIAN);
906
907
0
                proto_tree_add_item(parent_tree,
908
0
                    hf_waveagent_totalframes, tvb, starting_offset + 64, 4, ENC_BIG_ENDIAN);
909
0
            }
910
911
0
            break;
912
0
        }
913
914
0
        case 0x8b:
915
0
            proto_tree_add_item(parent_tree,
916
0
                hf_waveagent_destip, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
917
918
0
            proto_tree_add_item(parent_tree,
919
0
                hf_waveagent_destport, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
920
921
0
            proto_tree_add_item(parent_tree,
922
0
                hf_waveagent_connectflags, tvb, starting_offset + 8, 4, ENC_BIG_ENDIAN);
923
924
0
            break;
925
926
0
        case 0x3f:  /* Relay response */
927
0
        case 0x8f:  /* Command Response */
928
0
            proto_tree_add_item(parent_tree,
929
0
                hf_waveagent_commandstatus, tvb, starting_offset, 4, ENC_BIG_ENDIAN);
930
931
0
            proto_tree_add_item(parent_tree,
932
0
                hf_waveagent_syserrno, tvb, starting_offset + 4, 4, ENC_BIG_ENDIAN);
933
934
0
            proto_tree_add_item(parent_tree,
935
0
                hf_waveagent_statusstring, tvb, starting_offset + 8, 128, ENC_ASCII);
936
937
0
            break;
938
0
    }
939
0
}
940
941
942
943
static uint32_t dissect_wa_header(uint32_t starting_offset, proto_item *parent_tree, tvbuff_t *tvb, uint8_t version)
944
0
{
945
0
    uint32_t wa_payload_offset;
946
947
0
    proto_tree_add_item(parent_tree,
948
0
        hf_waveagent_controlword, tvb, 30+starting_offset, 2, ENC_BIG_ENDIAN);
949
950
0
    proto_tree_add_item(parent_tree,
951
0
        hf_waveagent_payloadlen, tvb, 20+starting_offset, 4, ENC_BIG_ENDIAN);
952
953
0
    proto_tree_add_item(parent_tree,
954
0
        hf_waveagent_transnum, tvb, 24+starting_offset, 4, ENC_BIG_ENDIAN);
955
956
0
    proto_tree_add_item(parent_tree,
957
0
        hf_waveagent_rtoken, tvb, 32+starting_offset, 4, ENC_BIG_ENDIAN);
958
959
0
    proto_tree_add_item(parent_tree,
960
0
        hf_waveagent_flowid, tvb, 36+starting_offset, 4, ENC_BIG_ENDIAN);
961
962
0
    if (version >= 3) {
963
0
        proto_tree_add_item(parent_tree,
964
0
            hf_waveagent_capstatus, tvb, 40+starting_offset, 4, ENC_BIG_ENDIAN);
965
966
0
        proto_tree_add_item(parent_tree,
967
0
            hf_waveagent_protocolversion, tvb, 40+starting_offset, 1, ENC_BIG_ENDIAN);
968
969
0
        wa_payload_offset = WA_V3_PAYLOAD_OFFSET + starting_offset;
970
0
    }
971
0
    else {
972
0
        wa_payload_offset = WA_V2_PAYLOAD_OFFSET + starting_offset;
973
0
    }
974
975
0
    proto_tree_add_item(parent_tree,
976
0
        hf_waveagent_sigsequencenum, tvb, 4+starting_offset, 1, ENC_BIG_ENDIAN);
977
978
0
    return wa_payload_offset;
979
0
}
980
981
/* Dissect the packets */
982
static int dissect_waveagent(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
983
1.27k
{
984
1.27k
    proto_item *ti, *rmi;
985
1.27k
    proto_tree *waveagent_tree, *relay_message_tree, *payload_tree;
986
1.27k
    uint8_t     signature_start, signature_end;
987
1.27k
    uint8_t     version;
988
1.27k
    uint32_t    magic_number;
989
1.27k
    uint32_t    control_word, paylen;
990
1.27k
    uint32_t    wa_payload_offset;
991
992
    /* Check that there's enough data */
993
1.27k
    if (tvb_captured_length(tvb) < 52 )
994
1.00k
        return 0;
995
996
265
    magic_number    = tvb_get_ntohl(tvb, 16) & 0x0FFFFFFF;  /* Mask magic number off */
997
265
    if(magic_number != 0x0F87C3A5){
998
265
        return 0;
999
265
    }
1000
1001
0
    signature_start = tvb_get_uint8(tvb, 0);
1002
0
    signature_end   = tvb_get_uint8(tvb, 15);
1003
1004
0
    if ( ((signature_start != 0xcc) && (signature_start !=0xdd)) ||
1005
0
         (signature_end != 0xE2))
1006
        /*  This packet does not appear to belong to WaveAgent.
1007
         *  Return 0 to give another dissector a chance to dissect it.
1008
         */
1009
0
        return 0;
1010
1011
0
    version         = ((tvb_get_ntohl(tvb, 16) & 0xF0000000) >> 28 == 1) ? 3 : 2;       /* Mask version bit off */
1012
1013
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "WA");
1014
0
    col_clear(pinfo->cinfo, COL_INFO);
1015
1016
    /* Grab the control word, parse the WaveAgent payload accordingly */
1017
1018
0
    control_word = tvb_get_ntohl(tvb, 28);
1019
0
    paylen       = tvb_get_ntohl(tvb, 20);
1020
1021
0
    col_add_fstr(pinfo->cinfo, COL_INFO, "%s (0x%x)",
1022
0
        val_to_str_ext_const(control_word, &control_words_ext, "Unknown"), control_word);
1023
1024
0
    if (tree) {
1025
        /* create display subtree for the protocol */
1026
0
        ti = proto_tree_add_protocol_format(tree, proto_waveagent, tvb, 0, -1,
1027
0
                        "WaveAgent, %s (0x%x), Payload Length %u Bytes",
1028
0
                        val_to_str_ext_const(control_word, &control_words_ext, "Unknown"), control_word, paylen);
1029
1030
0
        waveagent_tree = proto_item_add_subtree(ti, ett_waveagent);
1031
1032
0
        wa_payload_offset = dissect_wa_header(0, waveagent_tree, tvb, version);
1033
1034
0
        payload_tree = waveagent_tree;
1035
1036
        /* Need to check for a relay message.  If so, parse the extra fields and then parse the WA packet */
1037
0
        if (control_word == 0x3e)
1038
0
        {
1039
0
            proto_tree_add_item(waveagent_tree,
1040
0
                hf_waveagent_relaydestid, tvb, wa_payload_offset, 4, ENC_BIG_ENDIAN);
1041
0
            proto_tree_add_item(waveagent_tree,
1042
0
                hf_waveagent_relaysrcid, tvb, wa_payload_offset+4, 4, ENC_BIG_ENDIAN);
1043
1044
            /* Parse control_word of the relay message */
1045
0
            control_word = tvb_get_ntohl(tvb, wa_payload_offset+12+28);
1046
0
                rmi = proto_tree_add_none_format(waveagent_tree, hf_waveagent_relaymessagest,
1047
0
                                                 tvb, wa_payload_offset+12+28, 0,
1048
0
                                                 "Relayed WaveAgent Message, %s (0x%x)",
1049
0
                                                 val_to_str_ext_const(control_word, &control_words_ext, "Unknown"),
1050
0
                                                 control_word);
1051
1052
0
            relay_message_tree = proto_item_add_subtree(rmi, ett_relaymessage);
1053
1054
0
            wa_payload_offset = dissect_wa_header(wa_payload_offset+12, relay_message_tree, tvb, version);
1055
0
            payload_tree = relay_message_tree;
1056
0
        }
1057
1058
0
        dissect_wa_payload(wa_payload_offset, payload_tree, pinfo, tvb, control_word, version);
1059
0
    }
1060
1061
    /* Return the amount of data this dissector was able to dissect */
1062
0
    return tvb_captured_length(tvb);
1063
0
}
1064
1065
static bool dissect_waveagent_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1066
1.27k
{
1067
1.27k
    return dissect_waveagent(tvb, pinfo, tree) > 0;
1068
1.27k
}
1069
1070
1071
#if 0
1072
static const value_string status_values[] = {
1073
    { 0, "OK" },
1074
    { 1, "In Use" },
1075
    { 0, NULL }
1076
};
1077
#endif
1078
1079
/* Register the protocol with Wireshark */
1080
1081
void proto_register_waveagent(void)
1082
16
{
1083
16
    static const value_string tcp_states[] = {
1084
16
        {  0, "Closed" },
1085
16
        {  1, "Listen" },
1086
16
        {  2, "SYN Sent" },
1087
16
        {  3, "SYN received" },
1088
16
        {  4, "Established" },
1089
16
        {  5, "FIN Wait 1" },
1090
16
        {  6, "FIN Wait 2" },
1091
16
        {  7, "Close Wait" },
1092
16
        {  8, "Closing" },
1093
16
        {  9, "Last ACK" },
1094
16
        { 10, "Time Wait" },
1095
16
        {  0, NULL },
1096
16
    };
1097
1098
16
    static const value_string app_states[] = {
1099
16
        {  0, "IDLE" },
1100
16
        {  1, "READY" },
1101
16
        {  0, NULL },
1102
16
    };
1103
1104
16
    static const value_string wa_modes[] = {
1105
16
        {  0, "In-band" },
1106
16
        {  1, "Source" },
1107
16
        {  2, "Sink" },
1108
16
        {  3, "Loopback" },
1109
16
        {  0, NULL },
1110
16
    };
1111
1112
16
    static const value_string wa_endpointtypes[] = {
1113
16
        {  0, "Undefined" },
1114
16
        {  1, "Server" },
1115
16
        {  2, "Client" },
1116
16
        {  0, NULL },
1117
16
    };
1118
1119
16
    static const value_string binding_levels[] = {
1120
16
        {  0, "WLAN" },
1121
16
        {  1, "Ethernet" },
1122
16
        {  2, "IP" },
1123
16
        {  3, "UDP" },
1124
16
        {  4, "TCP" },
1125
16
        {  5, "FIN Wait 1" },
1126
16
        {  6, "FIN Wait 2" },
1127
16
        {  7, "Close Wait" },
1128
16
        {  8, "Closing" },
1129
16
        {  9, "Last ACK" },
1130
16
        { 10, "Time Wait" },
1131
16
        {  0, NULL },
1132
16
    };
1133
1134
16
    static const value_string if_types[] = {
1135
16
        {  ETHERNET_INTERFACE, "Ethernet" },
1136
16
        {  WLAN_INTERFACE, "WLAN" },
1137
16
        {  0, NULL },
1138
16
    };
1139
1140
16
    static const value_string no_yes[] = {
1141
16
        {  0, "No" },
1142
16
        {  1, "Yes" },
1143
16
        {  0, NULL },
1144
16
    };
1145
1146
16
    static const value_string ip_types[] = {
1147
16
        {  0,  "Unspecified" },
1148
16
        {  IPV4_TYPE,  "IPv4" },
1149
16
        {  IPV6_TYPE, "IPv6" },
1150
16
        {  0, NULL },
1151
16
    };
1152
1153
16
    static const value_string if_l3_states[] = {
1154
16
        {  0, "Uninitialized" },
1155
16
        {  1, "Disconnected" },
1156
16
        {  2, "Connected" },
1157
16
        {  3, "Error" },
1158
16
        {  0, NULL },
1159
16
    };
1160
1161
16
    static const value_string if_wlan_states[] = {
1162
16
        {  0, "Uninitialized" },
1163
16
        {  1, "Not ready" },
1164
16
        {  2, "Connected" },
1165
16
        {  3, "Ad Hoc network formed" },
1166
16
        {  4, "Disconnecting" },
1167
16
        {  5, "Disconnected" },
1168
16
        {  6, "Associating" },
1169
16
        {  7, "Discovering" },
1170
16
        {  8, "Authenticating" },
1171
16
        {  0, NULL },
1172
16
    };
1173
1174
16
    static const value_string if_eth_states[] = {
1175
16
        {  0, "Uninitialized" },
1176
16
        {  1, "Not Operational" },
1177
16
        {  2, "Unreachable" },
1178
16
        {  3, "Disconnected" },
1179
16
        {  4, "Connecting" },
1180
16
        {  5, "Connected" },
1181
16
        {  6, "Operational" },
1182
16
        {  7, "Error" },
1183
16
        {  0, NULL },
1184
16
    };
1185
1186
16
    static const value_string bss_modes[] = {
1187
16
        {  0, "Infrastructure" },
1188
16
        {  1, "IBSS" },
1189
16
        {  2, "Unknown" },
1190
16
        {  0, NULL },
1191
16
    };
1192
1193
16
    static const value_string auth_algs[] = {
1194
16
        {  0,  "Open" },
1195
16
        {  1,  "Shared Key" },
1196
16
        {  2,  "WPA" },
1197
16
        {  4,  "WPA PSK" },
1198
16
        {  8,  "WPA2" },
1199
16
        { 16, "WPA2 PSK" },
1200
16
        {  0, NULL },
1201
16
    };
1202
1203
16
    static const value_string cipher_algs[] = {
1204
16
        {  0,  "None" },
1205
16
        {  1,  "WEP 40" },
1206
16
        {  2,  "WEP 104" },
1207
16
        {  4,  "WEP" },
1208
16
        {  8,  "TKIP" },
1209
16
        { 16, "CCMP" },
1210
16
        {  0, NULL },
1211
16
    };
1212
1213
    /* Setup list of header fields  See Section 1.6.1 for details*/
1214
16
    static hf_register_info hf[] = {
1215
1216
    /* START: General purpose message fields - used in multiple messages */
1217
16
        { &hf_waveagent_controlword,
1218
16
        { "Control Word", "waveagent.cword",
1219
16
        FT_UINT16, BASE_HEX | BASE_EXT_STRING, &control_words_ext, 0x0,
1220
16
        NULL, HFILL } },
1221
1222
16
        { &hf_waveagent_payloadlen,
1223
16
        { "Payload Length", "waveagent.paylen",
1224
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1225
16
        NULL, HFILL } },
1226
1227
16
        { &hf_waveagent_transnum,
1228
16
        { "Transaction Number", "waveagent.transnum",
1229
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1230
16
        NULL, HFILL } },
1231
1232
16
        { &hf_waveagent_rtoken,
1233
16
        { "Reservation Token", "waveagent.rtoken",
1234
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1235
16
        NULL, HFILL } },
1236
1237
16
        { &hf_waveagent_flowid,
1238
16
        { "Flow ID", "waveagent.flowid",
1239
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1240
16
        NULL, HFILL } },
1241
1242
16
        { &hf_waveagent_capstatus,
1243
16
        { "Capabilities Status", "waveagent.capstatus",
1244
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1245
16
        NULL, HFILL } },
1246
1247
16
        { &hf_waveagent_protocolversion,
1248
16
        { "Protocol Version", "waveagent.protocolversion",
1249
16
        FT_UINT8, BASE_DEC, NULL, 0x0,
1250
16
        NULL, HFILL } },
1251
1252
16
        { &hf_waveagent_capimpl,
1253
16
        { "Capabilities Implementation", "waveagent.capimpl",
1254
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1255
16
        NULL, HFILL } },
1256
1257
16
        { &hf_waveagent_sigsequencenum,
1258
16
        { "Signature Sequence Number", "waveagent.sigsequencenum",
1259
16
        FT_UINT8, BASE_DEC, NULL, 0x0,
1260
16
        NULL, HFILL } },
1261
1262
16
        { &hf_waveagent_id,
1263
16
        { "ID", "waveagent.id",
1264
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1265
16
        NULL, HFILL } },
1266
1267
16
        { &hf_waveagent_bindtag,
1268
16
        { "Binding Tag", "waveagent.bindtag",
1269
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1270
16
        NULL, HFILL } },
1271
1272
16
        { &hf_waveagent_version,
1273
16
        { "Version", "waveagent.version",
1274
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1275
16
        NULL, HFILL } },
1276
1277
16
        { &hf_waveagent_brokerip,
1278
16
        { "Broker IP address", "waveagent.brokerip",
1279
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1280
16
        NULL, HFILL } },
1281
1282
16
        { &hf_waveagent_brokerport,
1283
16
        { "Broker Port", "waveagent.brokerport",
1284
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1285
16
        NULL, HFILL } },
1286
1287
16
        { &hf_waveagent_bindlevel,
1288
16
        { "Binding Level", "waveagent.bindlevel",
1289
16
        FT_UINT32, BASE_DEC, VALS(binding_levels), 0x0,
1290
16
        NULL, HFILL } },
1291
1292
16
        { &hf_waveagent_bindport,
1293
16
        { "Binding Port", "waveagent.bindport",
1294
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1295
16
        NULL, HFILL } },
1296
1297
16
        { &hf_waveagent_ifindex,
1298
16
        { "Interface Index", "waveagent.ifindex",
1299
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1300
16
        NULL, HFILL } },
1301
    /* END: General purpose message fields - used in multiple messages */
1302
1303
    /* START: Capabilities response fields (specific to this message, other general fields are also used) */
1304
16
        { &hf_waveagent_capabilities2,
1305
16
        { "Additional Capabilities", "waveagent.capabilities2",
1306
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1307
16
        NULL, HFILL } },
1308
1309
16
        { &hf_waveagent_numinterfaces,
1310
16
        { "Number of WA Interfaces", "waveagent.numinterfaces",
1311
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1312
16
        NULL, HFILL } },
1313
1314
16
        { &hf_waveagent_ifmask,
1315
16
        { "Mask of Active Interfaces", "waveagent.ifmask",
1316
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1317
16
        NULL, HFILL } },
1318
    /* END: Capabilities response fields (specific to this message, other general fields are also used) */
1319
1320
    /* START: Command response message fields */
1321
16
        { &hf_waveagent_commandstatus,
1322
16
        { "Status of Previous Command", "waveagent.cmdstat",
1323
16
        FT_INT32, BASE_DEC, NULL, 0x0,
1324
16
        NULL, HFILL } },
1325
1326
16
        { &hf_waveagent_syserrno,
1327
16
        { "System Error Number", "waveagent.syserrno",
1328
16
        FT_INT32, BASE_DEC, NULL, 0x0,
1329
16
        NULL, HFILL } },
1330
1331
16
        { &hf_waveagent_statusstring,
1332
16
        { "Status Message", "waveagent.statmsg",
1333
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1334
16
        NULL, HFILL } },
1335
    /* END: Command response message fields */
1336
1337
    /* START: Stats response message fields */
1338
16
        { &hf_waveagent_rxdatapckts,
1339
16
        { "Received Data Packets", "waveagent.rxdpkts",
1340
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1341
16
        NULL, HFILL } },
1342
1343
16
        { &hf_waveagent_rxdatabytes,
1344
16
        { "Received Data Bytes", "waveagent.rxdbytes",
1345
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1346
16
        NULL, HFILL } },
1347
1348
16
        { &hf_waveagent_rxpcktrate,
1349
16
        { "Received Data Packet Rate (pps)", "waveagent.rxpktrate",
1350
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1351
16
        NULL, HFILL } },
1352
1353
16
        { &hf_waveagent_rxbyterate,
1354
16
        { "Received Byte Rate", "waveagent.rxbyterate",
1355
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1356
16
        NULL, HFILL } },
1357
1358
16
        { &hf_waveagent_txdatapckts,
1359
16
        { "Transmitted Data Packets", "waveagent.txdpkts",
1360
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1361
16
        NULL, HFILL } },
1362
1363
16
        { &hf_waveagent_txdatabytes,
1364
16
        { "Transmitted Data Bytes", "waveagent.txdbytes",
1365
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1366
16
        NULL, HFILL } },
1367
1368
16
        { &hf_waveagent_txpcktrate,
1369
16
        { "Transmitted Data Packet Rate (pps)", "waveagent.txpktrate",
1370
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1371
16
        NULL, HFILL } },
1372
1373
16
        { &hf_waveagent_txbyterate,
1374
16
        { "Transmitted Byte Rate", "waveagent.txbyterate",
1375
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1376
16
        NULL, HFILL } },
1377
1378
16
        { &hf_waveagent_looppckts,
1379
16
        { "Loopback Packets", "waveagent.looppckts",
1380
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1381
16
        NULL, HFILL } },
1382
1383
16
        { &hf_waveagent_loopbytes,
1384
16
        { "Loopback Bytes", "waveagent.loopbytes",
1385
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1386
16
        NULL, HFILL } },
1387
1388
16
        { &hf_waveagent_rxctlpckts,
1389
16
        { "Received Control Packets", "waveagent.rxctlpkts",
1390
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1391
16
        NULL, HFILL } },
1392
1393
16
        { &hf_waveagent_rxctlbytes,
1394
16
        { "Received Control Bytes", "waveagent.rxctlbytes",
1395
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1396
16
        NULL, HFILL } },
1397
1398
16
        { &hf_waveagent_txctlpckts,
1399
16
        { "Transmitted Control Packets", "waveagent.txctlpkts",
1400
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1401
16
        NULL, HFILL } },
1402
1403
16
        { &hf_waveagent_txctlbytes,
1404
16
        { "Transmitted Control Bytes", "waveagent.txctlbytes",
1405
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1406
16
        NULL, HFILL } },
1407
1408
16
        { &hf_waveagent_unknowncmds,
1409
16
        { "Unknown Commands", "waveagent.unkcmds",
1410
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1411
16
        NULL, HFILL } },
1412
1413
16
        { &hf_waveagent_snap,
1414
16
        { "Time Snap for Counters", "waveagent.snap",
1415
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1416
16
        NULL, HFILL } },
1417
1418
16
        { &hf_waveagent_appstate,
1419
16
        { "TCP State", "waveagent.state",
1420
16
        FT_UINT32, BASE_DEC, VALS(tcp_states), 0x0,
1421
16
        NULL, HFILL } },
1422
1423
16
        { &hf_waveagent_state,
1424
16
        { "Application State", "waveagent.appstate",
1425
16
        FT_UINT32, BASE_DEC, VALS(app_states), 0x0,
1426
16
        NULL, HFILL } },
1427
1428
16
        { &hf_waveagent_rx1pl,
1429
16
        { "Instances of single packet loss", "waveagent.rx1pl",
1430
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1431
16
        NULL, HFILL } },
1432
1433
16
        { &hf_waveagent_rx2pl,
1434
16
        { "Instances of 2 sequential packets lost", "waveagent.rx2pl",
1435
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1436
16
        NULL, HFILL } },
1437
1438
16
        { &hf_waveagent_rx3pl,
1439
16
        { "Instances of 3 sequential packets lost", "waveagent.rx3pl",
1440
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1441
16
        NULL, HFILL } },
1442
1443
16
        { &hf_waveagent_rx4pl,
1444
16
        { "Instances of 4 sequential packets lost", "waveagent.rx4pl",
1445
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1446
16
        NULL, HFILL } },
1447
1448
16
        { &hf_waveagent_rx5pl,
1449
16
        { "Instances of 5 sequential packets lost", "waveagent.rx5pl",
1450
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1451
16
        NULL, HFILL } },
1452
1453
16
        { &hf_waveagent_rxoospkts,
1454
16
        { "Instances of out-of-sequence packets", "waveagent.rxoospkts",
1455
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1456
16
        NULL, HFILL } },
1457
1458
#if 0
1459
        { &hf_waveagent_rxmeanlatency,
1460
        { "Rx Mean latency", "waveagent.rxmeanlatency",
1461
        FT_UINT64, BASE_DEC, NULL, 0x0,
1462
        NULL, HFILL } },
1463
#endif
1464
1465
#if 0
1466
        { &hf_waveagent_rxminlatency,
1467
        { "Rx Minimum latency", "waveagent.rxminlatency",
1468
        FT_UINT64, BASE_DEC, NULL, 0x0,
1469
        NULL, HFILL } },
1470
#endif
1471
1472
#if 0
1473
        { &hf_waveagent_rxmaxlatency,
1474
        { "Rx Maximum latency", "waveagent.rxmaxlatency",
1475
        FT_UINT64, BASE_DEC, NULL, 0x0,
1476
        NULL, HFILL } },
1477
#endif
1478
1479
16
        { &hf_waveagent_jitter,
1480
16
        { "Jitter (microseconds)", "waveagent.jitter",
1481
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1482
16
        NULL, HFILL } },
1483
1484
16
        { &hf_waveagent_delayfactor,
1485
16
        { "Delay Factor", "waveagent.delayfactor",
1486
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1487
16
        NULL, HFILL } },
1488
1489
16
        { &hf_waveagent_medialossrate,
1490
16
        { "Media Loss Rate", "waveagent.medialossrate",
1491
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1492
16
        NULL, HFILL } },
1493
1494
16
        { &hf_waveagent_txstartts,
1495
16
        { "Timestamp for first Tx flow packet", "waveagent.txstartts",
1496
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1497
16
        NULL, HFILL } },
1498
1499
16
        { &hf_waveagent_txendts,
1500
16
        { "Timestamp for last Tx flow packet", "waveagent.txendts",
1501
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1502
16
        NULL, HFILL } },
1503
1504
16
        { &hf_waveagent_rxstartts,
1505
16
        { "Timestamp for first Rx flow packet", "waveagent.rxstartts",
1506
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1507
16
        NULL, HFILL } },
1508
1509
16
        { &hf_waveagent_rxendts,
1510
16
        { "Timestamp for last Rx flow packet", "waveagent.rxendts",
1511
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1512
16
        NULL, HFILL } },
1513
1514
16
        { &hf_waveagent_latencysum,
1515
16
        { "Sum of latencies across all received packets", "waveagent.latencysum",
1516
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1517
16
        NULL, HFILL } },
1518
1519
16
        { &hf_waveagent_latencycount,
1520
16
        { "Count of packets included in the latency sum", "waveagent.latencycount",
1521
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1522
16
        NULL, HFILL } },
1523
1524
16
        { &hf_waveagent_txflowstop,
1525
16
        { "Timestamp for Tx flow stop message", "waveagent.txflowstop",
1526
16
        FT_UINT64, BASE_DEC, NULL, 0x0,
1527
16
        NULL, HFILL } },
1528
    /* END Stats response message fields */
1529
1530
    /* START: Flow setup message */
1531
16
        { &hf_waveagent_rxflownum,
1532
16
        { "Received Flow Number", "waveagent.rxflownum",
1533
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1534
16
        NULL, HFILL } },
1535
1536
16
        { &hf_waveagent_mode,
1537
16
        { "WaveAgent Mode", "waveagent.trafficmode",
1538
16
        FT_UINT8, BASE_DEC, VALS(wa_modes), 0x03,
1539
16
        NULL, HFILL } },
1540
1541
16
        { &hf_waveagent_endpointtype,
1542
16
        { "WaveAgent Endpoint Type", "waveagent.endpointtype",
1543
16
        FT_UINT8, BASE_DEC, VALS(wa_endpointtypes), 0x0c,
1544
16
        NULL, HFILL } },
1545
1546
16
        { &hf_waveagent_remoteport,
1547
16
        { "Remote port", "waveagent.remoteport",
1548
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1549
16
        NULL, HFILL } },
1550
1551
16
        { &hf_waveagent_remoteaddr,
1552
16
        { "Remote address", "waveagent.remoteaddr",
1553
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1554
16
        NULL, HFILL } },
1555
1556
16
        { &hf_waveagent_dscp,
1557
16
        { "DSCP Setting", "waveagent.dscp",
1558
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1559
16
        NULL, HFILL } },
1560
1561
16
        { &hf_waveagent_fsflags,
1562
16
        { "Flow Setup Flags", "waveagent.fsflags",
1563
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1564
16
        NULL, HFILL } },
1565
1566
16
        { &hf_waveagent_fscbrflag,
1567
16
        { "CBR Transmit Mode", "waveagent.fscbrflag",
1568
16
        FT_BOOLEAN, 4, NULL, 0x1, NULL, HFILL } },
1569
1570
16
        { &hf_waveagent_fscombinedsetupflag,
1571
16
        { "Setup, Connect/Listen, Start Combined", "waveagent.fscombinedsetupflag",
1572
16
        FT_BOOLEAN, 4, NULL, 0x2, NULL, HFILL } },
1573
1574
    /* END: Flow setup message */
1575
1576
    /* START: Flow start message fields */
1577
16
        { &hf_waveagent_payfill,
1578
16
        { "Payload Fill", "waveagent.payfill",
1579
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1580
16
        NULL, HFILL } },
1581
1582
16
        { &hf_waveagent_paysize,
1583
16
        { "WaveAgent Payload Size (bytes)", "waveagent.paysize",
1584
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1585
16
        NULL, HFILL } },
1586
1587
16
        { &hf_waveagent_avgrate,
1588
16
        { "Average Rate (header + payload + trailer bytes/s)", "waveagent.avgrate",
1589
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1590
16
        NULL, HFILL } },
1591
1592
16
        { &hf_waveagent_totalframes,
1593
16
        { "Total Frames", "waveagent.totalframes",
1594
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1595
16
        NULL, HFILL } },
1596
1597
    /* END: Flow start message fields */
1598
1599
    /* START: Scan results request (0x23) fields */
1600
16
        { &hf_waveagent_bssidstartindex,
1601
16
        { "Starting Index of BSSID list for reporting", "waveagent.bssidstartindex",
1602
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1603
16
        NULL, HFILL } },
1604
1605
16
        { &hf_waveagent_bssidstopindex,
1606
16
        { "Ending Index of BSSID list for reporting", "waveagent.bssidstopindex",
1607
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1608
16
        NULL, HFILL } },
1609
1610
    /* END: Scan results request (0x23) fields */
1611
1612
    /* START: WLAN Interface stats fields */
1613
16
        { &hf_waveagent_ifwlanbssid,
1614
16
        { "WLAN Interface Connected to BSSID", "waveagent.ifwlanbssid",
1615
16
        FT_ETHER, 0, NULL, 0x0,
1616
16
        NULL, HFILL } },
1617
1618
16
        { &hf_waveagent_ifwlanssid,
1619
16
        { "WLAN Interface Connected to SSID", "waveagent.ifwlanssid",
1620
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1621
16
        NULL, HFILL } },
1622
1623
16
        { &hf_waveagent_ifwlanrssi,
1624
16
        { "WLAN Interface RSSI", "waveagent.ifwlanrssi",
1625
16
        FT_INT32, BASE_DEC, NULL, 0x0,
1626
16
        NULL, HFILL } },
1627
1628
16
        { &hf_waveagent_ifwlannoise,
1629
16
        { "WLAN Interface Noise Floor (dBm)", "waveagent.ifwlannoise",
1630
16
        FT_INT32, BASE_DEC, NULL, 0x0,
1631
16
        NULL, HFILL } },
1632
1633
16
        { &hf_waveagent_ifphytypes,
1634
16
        { "WLAN Interface Supported PHY Types", "waveagent.ifphytypes",
1635
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1636
16
        NULL, HFILL } },
1637
1638
16
        { &hf_waveagent_ifphytypebit0,
1639
16
        { "11b", "waveagent.ifphytypebit0",
1640
16
        FT_BOOLEAN, 4, NULL, 0x1, NULL, HFILL } },
1641
1642
16
        { &hf_waveagent_ifphytypebit1,
1643
16
        { "11g", "waveagent.ifphytypebit1",
1644
16
        FT_BOOLEAN, 4, NULL, 0x2, NULL, HFILL } },
1645
1646
16
        { &hf_waveagent_ifphytypebit2,
1647
16
        { "11a", "waveagent.ifphytypebit2",
1648
16
        FT_BOOLEAN, 4, NULL, 0x4, NULL, HFILL } },
1649
1650
16
        { &hf_waveagent_ifphytypebit3,
1651
16
        { "11n", "waveagent.ifphytypebit3",
1652
16
        FT_BOOLEAN, 4, NULL, 0x8, NULL, HFILL } },
1653
1654
16
        { &hf_waveagent_ifwlanauthentication,
1655
16
        { "WLAN Interface Authentication Algorithm", "waveagent.ifwlanauthentication",
1656
16
        FT_UINT32, BASE_DEC, VALS(auth_algs), 0x0,
1657
16
        NULL, HFILL } },
1658
1659
16
        { &hf_waveagent_ifwlancipher,
1660
16
        { "WLAN Interface Encryption/Cipher Algorithm", "waveagent.ifwlancipher",
1661
16
        FT_UINT32, BASE_DEC, VALS(cipher_algs), 0x0,
1662
16
        NULL, HFILL } },
1663
    /* END: WLAN Interface stats fields */
1664
1665
    /* START: Interface stats response (0x2d) fields */
1666
16
        { &hf_waveagent_iftype,
1667
16
        { "Interface type", "waveagent.iftype",
1668
16
        FT_UINT32, BASE_DEC, VALS(if_types), 0x0,
1669
16
        NULL, HFILL } },
1670
1671
16
        { &hf_waveagent_ifdescription,
1672
16
        { "Name/Description of the adapter", "waveagent.ifdescription",
1673
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1674
16
        NULL, HFILL } },
1675
1676
16
        { &hf_waveagent_ifmacaddr,
1677
16
        { "Interface MAC Address", "waveagent.ifmacaddr",
1678
16
        FT_ETHER, 0, NULL, 0x0,
1679
16
        NULL, HFILL } },
1680
1681
16
        { &hf_waveagent_iflinkspeed,
1682
16
        { "Interface Link Speed (kbps)", "waveagent.iflinkspeed",
1683
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1684
16
        NULL, HFILL } },
1685
1686
16
        { &hf_waveagent_ifdhcp,
1687
16
        { "Interface DHCP Enabled", "waveagent.ifdhcp",
1688
16
        FT_UINT32, BASE_DEC, VALS(no_yes), 0x0,
1689
16
        NULL, HFILL } },
1690
1691
16
        { &hf_waveagent_ifiptype,
1692
16
        { "Interface IP Type", "waveagent.ifiptype",
1693
16
        FT_UINT32, BASE_DEC, VALS(ip_types), 0x0,
1694
16
        NULL, HFILL } },
1695
1696
16
        { &hf_waveagent_ifipv4,
1697
16
        { "Interface Bound to IP Address", "waveagent.ifipv4",
1698
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1699
16
        NULL, HFILL } },
1700
1701
16
        { &hf_waveagent_ifipv6,
1702
16
        { "Interface Bound to IP Address", "waveagent.ifipv6",
1703
16
        FT_IPv6, BASE_NONE, NULL, 0x0,
1704
16
        NULL, HFILL } },
1705
1706
16
        { &hf_waveagent_ifdhcpserver,
1707
16
        { "Interface DHCP Server Address", "waveagent.ifdhcpserver",
1708
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1709
16
        NULL, HFILL } },
1710
1711
16
        { &hf_waveagent_ifgateway,
1712
16
        { "Interface Gateway", "waveagent.ifgateway",
1713
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1714
16
        NULL, HFILL } },
1715
1716
16
        { &hf_waveagent_ifdnsserver,
1717
16
        { "Interface DNS Server Address", "waveagent.ifdnsserver",
1718
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1719
16
        NULL, HFILL } },
1720
1721
16
        { &hf_waveagent_ifethl2status,
1722
16
        { "Ethernet L2 Interface Status", "waveagent.ifethl2status",
1723
16
        FT_UINT32, BASE_DEC, VALS(if_eth_states), 0x0,
1724
16
        NULL, HFILL } },
1725
1726
16
        { &hf_waveagent_ifwlanl2status,
1727
16
        { "WLAN L2 Interface Status", "waveagent.ifwlanl2status",
1728
16
        FT_UINT32, BASE_DEC, VALS(if_wlan_states), 0x0,
1729
16
        NULL, HFILL } },
1730
1731
16
        { &hf_waveagent_ifl3status,
1732
16
        { "L3 Interface Status", "waveagent.ifl3status",
1733
16
        FT_UINT32, BASE_DEC, VALS(if_l3_states), 0x0,
1734
16
        NULL, HFILL } },
1735
1736
    /* END: Interface stats response (0x2d) fields */
1737
1738
    /* START: Scan results response (0x2e) fields */
1739
16
        { &hf_waveagent_totalbssid,
1740
16
        { "Number of Found BSSID", "waveagent.totalbssid",
1741
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1742
16
        NULL, HFILL } },
1743
1744
16
        { &hf_waveagent_returnedbssid,
1745
16
        { "Number of BSSID Reported in This Response", "waveagent.returnedbssid",
1746
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1747
16
        NULL, HFILL } },
1748
1749
16
        { &hf_waveagent_scanbssid,
1750
16
        { "BSSID", "waveagent.scanbssid",
1751
16
        FT_ETHER, 0, NULL, 0x0,
1752
16
        NULL, HFILL } },
1753
1754
16
        { &hf_waveagent_scanssid,
1755
16
        { "SSID", "waveagent.scanssid",
1756
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1757
16
        NULL, HFILL } },
1758
1759
16
        { &hf_waveagent_ifwlansupprates,
1760
16
        { "Supported Rates", "waveagent.ifwlansupportedrates",
1761
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1762
16
        NULL, HFILL } },
1763
1764
16
        { &hf_waveagent_ifwlancapabilities,
1765
16
        { "Capabilities field", "waveagent.ifwlancapabilities",
1766
16
        FT_UINT16, BASE_HEX, NULL, 0x0,
1767
16
        NULL, HFILL } },
1768
1769
16
        { &hf_waveagent_ifwlanchannel,
1770
16
        { "Channel", "waveagent.ifwlanchannel",
1771
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1772
16
        NULL, HFILL } },
1773
1774
16
        { &hf_waveagent_ifwlanprivacy,
1775
16
        { "Privacy Enabled", "waveagent.ifwlanprivacy",
1776
16
        FT_UINT32, BASE_DEC, VALS(no_yes), 0x0,
1777
16
        NULL, HFILL } },
1778
1779
16
        { &hf_waveagent_ifwlanbssmode,
1780
16
        { "BSS Mode", "waveagent.ifwlanbssmode",
1781
16
        FT_UINT32, BASE_DEC, VALS(bss_modes), 0x0,
1782
16
        NULL, HFILL } },
1783
    /* END: Scan results response (0x2e) fields */
1784
1785
    /* START: OID fields */
1786
16
        { &hf_waveagent_oidcode,
1787
16
        { "OID Code", "waveagent.oidcode",
1788
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1789
16
        NULL, HFILL } },
1790
1791
16
        { &hf_waveagent_oidvalue,
1792
16
        { "OID Value", "waveagent.oidvalue",
1793
16
        FT_STRING, BASE_NONE, NULL, 0x0,
1794
16
        NULL, HFILL } },
1795
    /* END: OID fields */
1796
1797
    /* START: Learning Message fields */
1798
16
        { &hf_waveagent_destip,
1799
16
        { "Destination IP", "waveagent.destip",
1800
16
        FT_IPv4, BASE_NONE, NULL, 0x0,
1801
16
        NULL, HFILL } },
1802
1803
16
        { &hf_waveagent_destport,
1804
16
        { "Destination Port", "waveagent.destport",
1805
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1806
16
        NULL, HFILL } },
1807
1808
16
        { &hf_waveagent_connectflags,
1809
16
        { "Connect Flags", "waveagent.connectflags",
1810
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1811
16
        NULL, HFILL } },
1812
    /* END: Learning Message fields */
1813
1814
    /* START: client connect fields */
1815
16
        { &hf_waveagent_connecttype,
1816
16
        { "Connect Type", "waveagent.connecttype",
1817
16
        FT_UINT32, BASE_HEX, NULL, 0x0,
1818
16
        NULL, HFILL } },
1819
1820
16
        { &hf_waveagent_minrssi,
1821
16
        { "Minimum RSSI", "waveagent.minrssi",
1822
16
        FT_INT32, BASE_DEC, NULL, 0x0,
1823
16
        NULL, HFILL } },
1824
1825
16
        { &hf_waveagent_connecttimeout,
1826
16
        { "Connect timeout (s)", "waveagent.connecttimeout",
1827
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1828
16
        NULL, HFILL } },
1829
1830
16
        { &hf_waveagent_connectattempts,
1831
16
        { "Connect attempts", "waveagent.connectattempt",
1832
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1833
16
        NULL, HFILL } },
1834
1835
16
        { &hf_waveagent_reason,
1836
16
        { "Reason", "waveagent.reason",
1837
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1838
16
        NULL, HFILL } },
1839
    /* END: client connect fields */
1840
1841
    /* START: relay server fields */
1842
16
        { &hf_waveagent_relaydestid,
1843
16
        { "ID of destination client (assigned by relay server)", "waveagent.relaydestid",
1844
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1845
16
        NULL, HFILL } },
1846
1847
16
        { &hf_waveagent_relaysrcid,
1848
16
        { "ID of source client (assigned by relay server)", "waveagent.relaysrcid",
1849
16
        FT_UINT32, BASE_DEC, NULL, 0x0,
1850
16
        NULL, HFILL } },
1851
1852
16
        { &hf_waveagent_relaymessagest,
1853
16
        { "Relayed WaveAgent Message", "waveagent.relaymessagest",
1854
16
        FT_NONE, BASE_NONE, NULL, 0x0,
1855
16
        "This is a relayed WaveAgent message", HFILL } },
1856
1857
/* END: relay server fields */
1858
1859
16
    };
1860
1861
/* Setup protocol subtree array */
1862
16
    static int *ett[] = {
1863
16
        &ett_waveagent,
1864
16
        &ett_statechange,
1865
16
        &ett_phytypes,
1866
16
        &ett_fsflags,
1867
16
        &ett_scindex[0],
1868
16
        &ett_scindex[1],
1869
16
        &ett_scindex[2],
1870
16
        &ett_scindex[3],
1871
16
        &ett_scindex[4],
1872
16
        &ett_scindex[5],
1873
16
        &ett_scindex[6],
1874
16
        &ett_scindex[7],
1875
16
        &ett_bss[0],
1876
16
        &ett_bss[1],
1877
16
        &ett_bss[2],
1878
16
        &ett_bss[3],
1879
16
        &ett_bss[4],
1880
16
        &ett_bss[5],
1881
16
        &ett_bss[6],
1882
16
        &ett_bss[7],
1883
16
        &ett_relaymessage,
1884
16
    };
1885
1886
16
    proto_waveagent = proto_register_protocol("WaveAgent", "waveagent", "waveagent");
1887
1888
16
    proto_register_field_array(proto_waveagent, hf, array_length(hf));
1889
16
    proto_register_subtree_array(ett, array_length(ett));
1890
16
}
1891
1892
1893
void proto_reg_handoff_waveagent(void)
1894
16
{
1895
16
    heur_dissector_add("udp", dissect_waveagent_heur, "WaveAgent over UDP", "waveagent_udp", proto_waveagent, HEURISTIC_ENABLE);
1896
16
}
1897
1898
1899
/*
1900
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
1901
 *
1902
 * Local variables:
1903
 * c-basic-offset: 4
1904
 * tab-width: 8
1905
 * indent-tabs-mode: nil
1906
 * End:
1907
 *
1908
 * vi: set shiftwidth=4 tabstop=8 expandtab:
1909
 * :indentSize=4:tabSize=8:noTabs=true:
1910
 */