Coverage Report

Created: 2025-08-04 07:15

/src/wireshark/epan/dissectors/packet-ieee80211.c
Line
Count
Source (jump to first uncovered line)
1
/* packet-ieee80211.c
2
 * Routines for Wireless LAN (IEEE 802.11) dissection
3
 * Copyright 2000, Axis Communications AB
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
 * Credits:
12
 *
13
 * The following people helped me by pointing out bugs etc. Thank you!
14
 *
15
 * Marco Molteni
16
 * Lena-Marie Nilsson
17
 * Magnus Hultman-Persson
18
 */
19
20
/*
21
 * 10/24/2005 - Add dissection for 802.11e
22
 * Zhu Yi <yi.zhu@intel.com>
23
 *
24
 * 04/21/2008 - Added dissection for 802.11p
25
 * Arada Systems <http://www.aradasystems.com>
26
 *
27
 * 04/20/2013 - Added dissection of 802.11ad according to the 9th draft of the standard.
28
 * Extended as a project in the Laboratory of Computer Communication & Networking (LCCN), Computer Science Department, Technion, Israel.
29
 * Majd Omari    <majd.omari@outlook.com>
30
 * Jalil Moraney <moraney.jalil@outlook.com>
31
 */
32
33
/*
34
 * Reference :
35
 * The 802.11 standard is "free", 6 month after the publication.
36
 *
37
 * IEEE Std 802.11-2020: Revision of IEEE Std 802.11-2016
38
 * include 5 amendments (802.11ai,ah,aj,ak,aq) 802.11-2016
39
 * include 5 amendments (802.11ae,aa,ad,ac,af) 802.11-2012
40
 * include 10 amendments (802.11k,r,y,w,n,p,z,v,u,s) 802.11-2007
41
 * include 8 amendments (802.11a,b,d,e,g,h,i,j) 802.11-1999
42
 * https://ieeexplore.ieee.org/document/9502043
43
 *
44
 * WAPI (IE 68)
45
 * http://isotc.iso.org/livelink/livelink/fetch/-8913189/8913214/8913250/8913253/JTC001-N-9880.pdf?nodeid=8500308&vernum=-2
46
 */
47
48
#include "config.h"
49
50
#include <math.h>
51
52
#include <epan/packet.h>
53
#include <epan/capture_dissectors.h>
54
#include <epan/exceptions.h>
55
#include <wsutil/pint.h>
56
#include <wsutil/ws_roundup.h>
57
#include <epan/addr_resolv.h>
58
#include <epan/address_types.h>
59
#include <epan/strutil.h>
60
#include <epan/prefs.h>
61
#include <epan/reassemble.h>
62
#include "packet-eapol.h"
63
#include "packet-ieee80211.h"
64
#include <epan/etypes.h>
65
#include <epan/oui.h>
66
#include <epan/crc32-tvb.h>
67
#include <epan/crypt/wep-wpadefs.h>
68
#include <epan/expert.h>
69
#include <epan/conversation_table.h>
70
#include <epan/uat.h>
71
#include <epan/eapol_keydes_types.h>
72
#include <epan/proto_data.h>
73
#include <epan/tfs.h>
74
#include <epan/unit_strings.h>
75
#include <wsutil/array.h>
76
#include <wsutil/bits_ctz.h>
77
78
#include "packet-wps.h"
79
#include "packet-e212.h"
80
#include "packet-sflow.h"
81
#include "packet-gre.h"
82
83
#include <epan/crypt/dot11decrypt_ws.h>
84
85
void proto_register_ieee80211(void);
86
void proto_reg_handoff_ieee80211(void);
87
void proto_register_wlan_rsna_eapol(void);
88
89
static dissector_handle_t centrino_handle;
90
91
typedef struct {
92
  DOT11DECRYPT_KEY_ITEM used_key;
93
  unsigned keydata_len;
94
  uint8_t *keydata;
95
} proto_keydata_t;
96
97
extern value_string_ext eap_type_vals_ext; /* from packet-eap.c */
98
99
/* TUs are used a lot in 802.11 ... */
100
static const unit_name_string units_tu_tus = { "TU", "TUs" };
101
102
/* DIs are also used */
103
static const unit_name_string units_di_dis = { "DI", "DIs" };
104
105
/* az min/max time units */
106
static const unit_name_string units_100_us = { " times 100 microseconds", NULL };
107
static const unit_name_string units_10_ms = { " times 10 milliseconds", NULL };
108
109
0
#define IS_2_4_GHZ(freq) (freq >= 2400 && freq <= 2500)
110
#define IS_5PLUS GHZ(freq) (freq >= 5000)
111
0
#define IS_6_GHZ(freq) (freq >= 5955)
112
113
/*
114
 * We keep STA properties here, like whether they are S1G STAs or DMG STAs.
115
 * This is based on looking at BEACONs, or perhaps from the radiotap header
116
 * if we get one.
117
 */
118
static wmem_map_t *sta_prop_hash;
119
120
/*
121
 * Not sure that they can be both, so are bit values wanted?
122
 */
123
3.68k
#define STA_IS_S1G 0x00000001
124
#define STA_IS_DMG 0x00000002
125
126
/*
127
 * Add the top three bytes of the STA address to the bottom three bytes
128
 */
129
static unsigned
130
sta_prop_hash_fn(const void *k)
131
4.54k
{
132
4.54k
  return wmem_strong_hash((const uint8_t *)k, 6);
133
4.54k
}
134
135
static gboolean
136
sta_prop_equal_fn(const void *v, const void *w)
137
1.43k
{
138
1.43k
  const uint8_t *k1 = (const uint8_t *)v;
139
1.43k
  const uint8_t *k2 = (const uint8_t *)w;
140
141
1.43k
  return memcmp(k1, k2, 6) == 0; /* Compare each address for equality */
142
1.43k
}
143
144
/* bitmask for bits [l..h]
145
 * taken from kernel's include/linux/bitops.h
146
 */
147
1.61k
#define GENMASK(h, l)  (((1U << ((h) - (l) + 1)) - 1) << (l))
148
154
#define GENMASK64(h, l)  (((UINT64_C(1) << ((h) - (l) + 1)) - 1) << (l))
149
150
/* Defragment fragmented 802.11 datagrams */
151
static bool wlan_defragment = true;
152
153
/* call subdissector for retransmitted frames */
154
static bool wlan_subdissector = true;
155
156
/* Check for the presence of the 802.11 FCS */
157
static bool wlan_check_fcs;
158
159
/* Check the FCS checksum */
160
static bool wlan_check_checksum;
161
162
/* Ignore vendor-specific HT elements */
163
static bool wlan_ignore_draft_ht;
164
165
/* Ignore the Protection bit; assume packet is decrypted */
166
241
#define WLAN_IGNORE_PROT_NO     0
167
272
#define WLAN_IGNORE_PROT_WO_IV  1
168
#define WLAN_IGNORE_PROT_W_IV   2
169
static int wlan_ignore_prot = WLAN_IGNORE_PROT_NO;
170
171
/* The Key MIC len has been set by the user */
172
static bool wlan_key_mic_len_enable;
173
static unsigned wlan_key_mic_len;
174
175
/* Counter incremented on each (re)association
176
 * This value will be assiged to each packet's pinfo->srcport/pinfo->destport
177
 * as a way to uniquely make a one to one mapping between conversations and
178
 * associations
179
 */
180
static uint32_t association_counter;
181
/* associatin_counter is assigned in authentication for AKM 24/MLD */
182
static uint32_t assoc_counter_in_auth;
183
184
/* Treat all Wi-Fi frames as being S1G frames where it is important */
185
static bool treat_as_s1g;
186
187
/* Table for reassembly of fragments. */
188
static reassembly_table wlan_reassembly_table;
189
190
/* Statistical data */
191
static struct _wlan_stats wlan_stats;
192
193
/*-------------------------------------
194
 * UAT for WEP decoder
195
 *-------------------------------------
196
 */
197
static uat_wep_key_record_t *uat_wep_key_records;
198
static uat_t                *wep_uat;
199
static unsigned              num_wepkeys_uat;
200
201
static void *
202
uat_wep_key_record_copy_cb(void* n, const void* o, size_t siz _U_)
203
0
{
204
0
  uat_wep_key_record_t* new_key = (uat_wep_key_record_t *)n;
205
0
  const uat_wep_key_record_t* old_key = (const uat_wep_key_record_t *)o;
206
207
0
  new_key->string = g_strdup(old_key->string);
208
209
0
  return new_key;
210
0
}
211
212
static bool
213
uat_wep_key_record_update_cb(void* r, char** err)
214
0
{
215
0
  uat_wep_key_record_t* rec = (uat_wep_key_record_t *)r;
216
0
  decryption_key_t* dk;
217
0
  unsigned dk_type;
218
219
0
  if (rec->string == NULL) {
220
0
    *err = g_strdup("Key can't be blank");
221
0
    return false;
222
0
  }
223
224
0
  *err = NULL;
225
0
  g_strstrip(rec->string);
226
0
  dk = parse_key_string(rec->string, rec->key, err);
227
228
0
  if (dk != NULL) {
229
0
    dk_type = dk->type;
230
0
    free_key_string(dk);
231
0
    switch (dk_type) {
232
0
      case DOT11DECRYPT_KEY_TYPE_WEP:
233
0
      case DOT11DECRYPT_KEY_TYPE_WEP_40:
234
0
      case DOT11DECRYPT_KEY_TYPE_WEP_104:
235
0
        if (rec->key != DOT11DECRYPT_KEY_TYPE_WEP) {
236
0
          *err = g_strdup("Invalid WEP key format");
237
0
          return false;
238
0
        }
239
0
        break;
240
0
      case DOT11DECRYPT_KEY_TYPE_WPA_PWD:
241
0
        if (rec->key != DOT11DECRYPT_KEY_TYPE_WPA_PWD) {
242
0
          *err = g_strdup("Invalid WPA_PWD key format");
243
0
          return false;
244
0
        }
245
0
        break;
246
0
      case DOT11DECRYPT_KEY_TYPE_WPA_PSK:
247
0
        if (rec->key != DOT11DECRYPT_KEY_TYPE_WPA_PSK) {
248
0
          *err = g_strdup("Invalid WPA_PSK key format");
249
0
          return false;
250
0
        }
251
0
        break;
252
0
      case DOT11DECRYPT_KEY_TYPE_TK:
253
0
        if (rec->key != DOT11DECRYPT_KEY_TYPE_TK) {
254
0
          *err = g_strdup("Invalid TK key format");
255
0
          return false;
256
0
        }
257
0
        break;
258
0
      case DOT11DECRYPT_KEY_TYPE_MSK:
259
0
        if (rec->key != DOT11DECRYPT_KEY_TYPE_MSK) {
260
0
          *err = g_strdup("Invalid MSK key format");
261
0
          return false;
262
0
        }
263
0
        break;
264
0
      default:
265
0
        *err = g_strdup("Invalid key format");
266
0
        return false;
267
0
    }
268
0
  } else {
269
0
    if (*err == NULL) {
270
0
        *err = g_strdup("Invalid key format");
271
0
    }
272
0
    return false;
273
0
  }
274
0
  return true;
275
0
}
276
277
static void
278
uat_wep_key_record_free_cb(void*r)
279
0
{
280
0
  uat_wep_key_record_t* key = (uat_wep_key_record_t *)r;
281
0
  g_free(key->string);
282
0
}
283
284
UAT_VS_DEF(uat_wep_key_records, key, uat_wep_key_record_t, uint8_t, 0, STRING_KEY_TYPE_WEP)
285
UAT_CSTRING_CB_DEF(uat_wep_key_records, string, uat_wep_key_record_t)
286
287
/* Stuff for the WEP/WPA/WPA2 decoder */
288
static bool enable_decryption = true;
289
290
static void
291
ieee_80211_add_tagged_parameters(tvbuff_t *tvb, int offset, packet_info *pinfo,
292
                                  proto_tree *tree, int tagged_parameters_len, int ftype,
293
                                  association_sanity_check_t *association_sanity_check);
294
295
296
static void
297
save_proto_data(tvbuff_t *tvb, packet_info *pinfo, int offset, size_t size, int key);
298
299
static void
300
save_proto_data_value(packet_info *pinfo, unsigned value, int key);
301
302
static void try_scan_tdls_keys(tvbuff_t *tvb, packet_info *pinfo, int offset);
303
304
static void try_scan_ft_assoc_keys(packet_info *pinfo, const wlan_hdr_t *whdr);
305
306
static tvbuff_t *
307
try_decrypt(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, unsigned len,
308
            uint8_t *algorithm, uint32_t *sec_trailer,
309
            PDOT11DECRYPT_KEY_ITEM used_key);
310
311
static int weak_iv(unsigned char *iv);
312
313
typedef struct mimo_control
314
{
315
  uint8_t nc;
316
  uint8_t nr;
317
  bool chan_width;
318
  uint8_t grouping;
319
  uint8_t coefficient_size;
320
  uint8_t codebook_info;
321
  uint8_t remaining_matrix_segment;
322
} mimo_control_t;
323
324
/* ************************************************************************* */
325
/*                          Miscellaneous Constants                          */
326
/* ************************************************************************* */
327
0
#define SHORT_STR 256
328
329
typedef enum {
330
  IS_DMG_KEY = 1,
331
  IS_AP_KEY,
332
  IS_CTRL_GRANT_OR_GRANT_ACK_KEY,
333
  IS_S1G_KEY,
334
  DECRYPTED_EAPOL_KEY,
335
  DECRYPTED_GTK_KEY,
336
  PACKET_DATA_KEY,
337
  ASSOC_COUNTER_KEY,
338
  STA_KEY,
339
  BSSID_KEY,
340
  NONCE_KEY,
341
  GROUP_CIPHER_KEY,
342
  CIPHER_KEY,
343
  AKM_KEY,
344
  MIC_KEY,
345
  MIC_LEN_KEY,
346
  KEY_VERSION_KEY,
347
  KEY_LEN_KEY,
348
  KEY_IV_KEY,
349
  KEY_DATA_KEY,
350
  KEY_DATA_LEN_KEY,
351
  GTK_KEY,
352
  GTK_LEN_KEY,
353
  MDID_KEY,
354
  FTE_R0KH_ID_KEY,
355
  FTE_R0KH_ID_LEN_KEY,
356
  FTE_R1KH_ID_KEY,
357
  FTE_R1KH_ID_LEN_KEY,
358
  FTE_ANONCE_KEY,
359
  FTE_SNONCE_KEY,
360
  FTE_MIC_KEY,
361
  FTE_MIC_LEN_KEY,
362
  FTE_TAG_KEY,
363
  MDE_TAG_KEY,
364
  RSNE_TAG_KEY,
365
  RSNXE_TAG_KEY,
366
  RDE_TAG_KEY,
367
  GTK_SUBELEM_KEY_LEN_KEY,
368
  PASN_DATA_KEY,
369
  HE_CHANNEL_WIDTH_KEY,
370
  FRAME_TYPE_KEY,
371
} wlan_proto_key_t;
372
373
/* ************************************************************************* */
374
/*  Define some very useful macros that are used to analyze frame types etc. */
375
/* ************************************************************************* */
376
377
/*
378
 * Fetch the frame control field and swap it if needed.  "fcf" and "tvb"
379
 * must be valid variables.
380
 */
381
19.4k
#define FETCH_FCF(off) ((option_flags & IEEE80211_COMMON_OPT_BROKEN_FC) ? \
382
19.4k
  GUINT16_SWAP_LE_BE(tvb_get_letohs(tvb, off)) : \
383
19.4k
  tvb_get_letohs(tvb, off))
384
385
/*
386
 * Extract the fragment number and sequence number from the sequence
387
 * control field.
388
 */
389
3.74k
#define SEQCTL_FRAGMENT_NUMBER(x) ((x) & 0x000F)
390
3.74k
#define SEQCTL_SEQUENCE_NUMBER(x) (((x) & 0xFFF0) >> 4)
391
392
/*
393
 * Extract subfields from the QoS control field.
394
 */
395
#define QOS_TID(x)            ((x) & 0x000F)
396
#define QOS_PRIORITY(x)       ((x) & 0x0007)
397
393
#define QOS_EOSP(x)           (((x) & 0x0010) >> 4) /* end of service period */
398
#define QOS_ACK_POLICY(x)     (((x) & 0x0060) >> 5)
399
672
#define QOS_AMSDU_PRESENT(x)  (((x) & 0x0080) >> 6)
400
393
#define QOS_FIELD_CONTENT(x)  (((x) & 0xFF00) >> 8)
401
233
#define QOS_SCALING_FACTOR(x)  (((x) & 0xD0) >> 6)
402
233
#define QOS_UNSCALED_VALUE(x)  ((x) & 0x3F)
403
71
#define QOS_MESH_CONTROL_PRESENT(x) (((x) & 0x0100) >> 8)
404
405
28
#define QOS_FLAG_EOSP    0x0010
406
407
/*
408
 * Extract subfields from the result of QOS_FIELD_CONTENT().
409
 */
410
135
#define QOS_PS_BUF_STATE_INDICATED(x)  (((x) & 0x02) >> 1)
411
#define QOS_PS_HIGHEST_PRI_BUF_AC(x)   (((x) & 0x0C) >> 2)
412
123
#define QOS_PS_QAP_BUF_LOAD(x)         (((x) & 0xF0) >> 4)
413
414
/*
415
 * Bits from the HT Control field.
416
 * 802.11-2016 9.2.4.6, and 802.11ax draft, 32 bits.
417
 */
418
776
#define HTC_VHT              0x00000001
419
1.08k
#define HTC_HE               0x00000002
420
87
#define HTC_MRQ              0x00000004
421
132
#define HTC_UNSOLICITED_MFB  0x20000000
422
423
/*
424
 * Extract subfields from the HT Control field.
425
 */
426
#define HTC_LAC(htc)           ((htc) & 0xFE)
427
1.34k
#define HTC_LAC_MAI(htc)       (((htc) >> 2) & 0xF)
428
908
#define HTC_IS_ASELI(htc)      (HTC_LAC_MAI(htc) == 0xE)
429
437
#define HTC_LAC_MAI_MRQ(htc)   ((HTC_LAC_MAI(htc))  & 0x1)
430
#define HTC_LAC_MAI_MSI(htc)   ((HTC_LAC_MAI(htc) >> 1) & 0x7)
431
#define HTC_LAC_MFSI(htc)      (((htc) >> 4) & 0x7)
432
#define HTC_LAC_ASEL_CMD(htc)  (((htc) >> 9) & 0x7)
433
#define HTC_LAC_ASEL_DATA(htc) (((htc) >> 12) & 0xF)
434
#define HTC_LAC_MFB(htc)       (((htc) >> 9) & 0x7F)
435
#define HTC_CAL_POS(htc)       (((htc) >> 16) & 0x3)
436
#define HTC_CAL_SEQ(htc)       (((htc) >> 18) & 0x3)
437
#define HTC_CSI_STEERING(htc)  (((htc) >> 22) & 0x3)
438
#define HTC_NDP_ANN(htc)       (((htc) >> 24) & 0x1)
439
#define HTC_AC_CONSTRAINT(htc) (((htc) >> 30) & 0x1)
440
#define HTC_RDG_MORE_PPDU(htc) (((htc) >> 31) & 0x1)
441
442
#define HTC_MFB(htc)           (((htc) >> 9) & 0x7FFF)
443
444
/* VHT-MCS = 15, NUM_STS = 7 */
445
163
#define HTC_NO_FEEDBACK_PRESENT(mfb) (((mfb) & 0x7F) == 0x7F)
446
447
/*
448
 * Extract subfields from the key octet in WEP-encrypted frames.
449
 */
450
272
#define KEY_OCTET_WEP_KEY(x)   (((x) & 0xC0) >> 6)
451
452
272
#define KEY_EXTIV    0x20
453
381
#define EXTIV_LEN    8
454
455
/*
456
 * Bits from the Mesh Flags field
457
 */
458
765
#define MESH_FLAGS_ADDRESS_EXTENSION  0x3
459
460
/* ************************************************************************* */
461
/*              Constants used to identify cooked frame types                */
462
/* ************************************************************************* */
463
12.4k
#define MGT_FRAME            0x00  /* Frame type is management */
464
3.31k
#define CONTROL_FRAME        0x01  /* Frame type is control */
465
7.84k
#define DATA_FRAME           0x02  /* Frame type is Data */
466
3.31k
#define EXTENSION_FRAME      0x03  /* Frame type is Extension */
467
468
1.00k
#define DATA_SHORT_HDR_LEN     24
469
175
#define DATA_LONG_HDR_LEN      30
470
3.21k
#define MGT_FRAME_HDR_LEN      24  /* Length of Management frame-headers */
471
472
/* ************************************************************************* */
473
/*        Logical field codes (IEEE 802.11 encoding of tags)                 */
474
/* ************************************************************************* */
475
const value_string ie_tag_num_vals[] = {
476
  { TAG_SSID,                                 "SSID parameter set" },
477
  { TAG_SUPP_RATES,                           "Supported Rates" },
478
  { TAG_FH_PARAMETER,                         "FH Parameter set" },
479
  { TAG_DS_PARAMETER,                         "DS Parameter set" },
480
  { TAG_CF_PARAMETER,                         "CF Parameter set" },
481
  { TAG_TIM,                                  "Traffic Indication Map (TIM)" },
482
  { TAG_IBSS_PARAMETER,                       "IBSS Parameter set" },
483
  { TAG_COUNTRY_INFO,                         "Country Information" },
484
  { TAG_FH_HOPPING_PARAMETER,                 "Hopping Pattern Parameters" },
485
  { TAG_FH_HOPPING_TABLE,                     "Hopping Pattern Table" },
486
  { TAG_REQUEST,                              "Request" },
487
  { TAG_QBSS_LOAD,                            "QBSS Load Element" },
488
  { TAG_EDCA_PARAM_SET,                       "EDCA Parameter Set" },
489
  { TAG_TSPEC,                                "Traffic Specification" },
490
  { TAG_TCLAS,                                "Traffic Classification" },
491
  { TAG_SCHEDULE,                             "Schedule" },
492
  { TAG_CHALLENGE_TEXT,                       "Challenge text" },
493
  { TAG_POWER_CONSTRAINT,                     "Power Constraint" },
494
  { TAG_POWER_CAPABILITY,                     "Power Capability" },
495
  { TAG_TPC_REQUEST,                          "TPC Request" },
496
  { TAG_TPC_REPORT,                           "TPC Report" },
497
  { TAG_SUPPORTED_CHANNELS,                   "Supported Channels" },
498
  { TAG_CHANNEL_SWITCH_ANN,                   "Channel Switch Announcement" },
499
  { TAG_MEASURE_REQ,                          "Measurement Request" },
500
  { TAG_MEASURE_REP,                          "Measurement Report" },
501
  { TAG_QUIET,                                "Quiet" },
502
  { TAG_IBSS_DFS,                             "IBSS DFS" },
503
  { TAG_ERP_INFO,                             "ERP Information" },
504
  { TAG_TS_DELAY,                             "TS Delay" },
505
  { TAG_TCLAS_PROCESS,                        "TCLAS Processing" },
506
  { TAG_HT_CAPABILITY,                        "HT Capabilities" },
507
  { TAG_QOS_CAPABILITY,                       "QoS Capability" },
508
  { TAG_ERP_INFO_OLD,                         "ERP Information" }, /* Reserved... */
509
  { TAG_RSN_IE,                               "RSN Information" },
510
  { TAG_EXT_SUPP_RATES,                       "Extended Supported Rates" },
511
  { TAG_AP_CHANNEL_REPORT,                    "AP Channel Report" },
512
  { TAG_NEIGHBOR_REPORT,                      "Neighbor Report" },
513
  { TAG_RCPI,                                 "RCPI" },
514
  { TAG_MOBILITY_DOMAIN,                      "Mobility Domain" },
515
  { TAG_FAST_BSS_TRANSITION,                  "Fast BSS Transition" },
516
  { TAG_TIMEOUT_INTERVAL,                     "Timeout Interval" },
517
  { TAG_RIC_DATA,                             "RIC Data" },
518
  { TAG_DSE_REG_LOCATION,                     "DSE Registered Location" },
519
  { TAG_SUPPORTED_OPERATING_CLASSES,          "Supported Operating Classes" },
520
  { TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT, "Extended Channel Switch Announcement" },
521
  { TAG_HT_OPERATION,                         "HT Operation" },
522
  { TAG_SECONDARY_CHANNEL_OFFSET,             "Secondary Channel Offset (802.11n D1.10)" },
523
  { TAG_BSS_AVG_ACCESS_DELAY,                 "BSS Average Access Delay" },
524
  { TAG_ANTENNA,                              "Antenna" },
525
  { TAG_RSNI,                                 "RSNI" },
526
  { TAG_MEASURE_PILOT_TRANS,                  "Measurement Pilot Transmission" },
527
  { TAG_BSS_AVB_ADM_CAPACITY,                 "BSS Available Admission Capacity" },
528
  { TAG_IE_68_CONFLICT,                       "BSS AC Access Delay/WAPI Parameter Set" },
529
  { TAG_TIME_ADV,                             "Time Advertisement" },
530
  { TAG_RM_ENABLED_CAPABILITY,                "RM Enabled Capabilities" },
531
  { TAG_MULTIPLE_BSSID,                       "Multiple BSSID" },
532
  { TAG_20_40_BSS_CO_EX,                      "20/40 BSS Coexistence" },
533
  { TAG_20_40_BSS_INTOL_CH_REP,               "20/40 BSS Intolerant Channel Report" },   /* IEEE P802.11n/D6.0 */
534
  { TAG_OVERLAP_BSS_SCAN_PAR,                 "Overlapping BSS Scan Parameters" },       /* IEEE P802.11n/D6.0 */
535
  { TAG_RIC_DESCRIPTOR,                       "RIC Descriptor" },
536
  { TAG_MMIE,                                 "Management MIC" },
537
  { TAG_EVENT_REQUEST,                        "Event Request" },
538
  { TAG_EVENT_REPORT,                         "Event Report" },
539
  { TAG_DIAGNOSTIC_REQUEST,                   "Diagnostic Request" },
540
  { TAG_DIAGNOSTIC_REPORT,                    "Diagnostic Report" },
541
  { TAG_LOCATION_PARAMETERS,                  "Location Parameters" },
542
  { TAG_NO_BSSID_CAPABILITY,                  "Non Transmitted BSSID Capability" },
543
  { TAG_SSID_LIST,                            "SSID List" },
544
  { TAG_MULTIPLE_BSSID_INDEX,                 "Multiple BSSID Index" },
545
  { TAG_FMS_DESCRIPTOR,                       "FMS Descriptor" },
546
  { TAG_FMS_REQUEST,                          "FMS Request" },
547
  { TAG_FMS_RESPONSE,                         "FMS Response" },
548
  { TAG_QOS_TRAFFIC_CAPABILITY,               "QoS Traffic Capability" },
549
  { TAG_BSS_MAX_IDLE_PERIOD,                  "BSS Max Idle Period" },
550
  { TAG_TFS_REQUEST,                          "TFS Request" },
551
  { TAG_TFS_RESPONSE,                         "TFS Response" },
552
  { TAG_WNM_SLEEP_MODE,                       "WNM-Sleep Mode" },
553
  { TAG_TIM_BROADCAST_REQUEST,                "TIM Broadcast Request" },
554
  { TAG_TIM_BROADCAST_RESPONSE,               "TIM Broadcast Response" },
555
  { TAG_COLLOCATED_INTER_REPORT,              "Collocated Interference Report" },
556
  { TAG_CHANNEL_USAGE,                        "Channel Usage" },
557
  { TAG_TIME_ZONE,                            "Time Zone" },
558
  { TAG_DMS_REQUEST,                          "DMS Request" },
559
  { TAG_DMS_RESPONSE,                         "DMS Response" },
560
  { TAG_LINK_IDENTIFIER,                      "Link Identifier" },
561
  { TAG_WAKEUP_SCHEDULE,                      "Wakeup Schedule" },
562
  { TAG_CHANNEL_SWITCH_TIMING,                "Channel Switch Timing" },
563
  { TAG_PTI_CONTROL,                          "PTI Control" },
564
  { TAG_PU_BUFFER_STATUS,                     "PU Buffer Status" },
565
  { TAG_INTERWORKING,                         "Interworking" },
566
  { TAG_ADVERTISEMENT_PROTOCOL,               "Advertisement Protocol"},
567
  { TAG_EXPIDITED_BANDWIDTH_REQ,              "Expedited Bandwidth Request" },
568
  { TAG_QOS_MAP_SET,                          "QoS Map Set" },
569
  { TAG_ROAMING_CONSORTIUM,                   "Roaming Consortium" },
570
  { TAG_EMERGENCY_ALERT_ID,                   "Emergency Alert Identifier" },
571
  { TAG_MESH_CONFIGURATION,                   "Mesh Configuration" },
572
  { TAG_MESH_ID,                              "Mesh ID" },
573
  { TAG_MESH_LINK_METRIC_REPORT,              "Mesh Link Metric Report" },
574
  { TAG_CONGESTION_NOTIFICATION,              "Congestion Notification" },
575
  { TAG_MESH_PEERING_MGMT,                    "Mesh Peering Management" },
576
  { TAG_MESH_CHANNEL_SWITCH,                  "Mesh Channel Switch Parameters" },
577
  { TAG_MESH_AWAKE_WINDOW,                    "Mesh Awake Window" },
578
  { TAG_BEACON_TIMING,                        "Beacon Timing" },
579
  { TAG_MCCAOP_SETUP_REQUEST,                 "MCCAOP Setup Request" },
580
  { TAG_MCCAOP_SETUP_REPLY,                   "MCCAOP SETUP Reply" },
581
  { TAG_MCCAOP_ADVERTISEMENT,                 "MCCAOP Advertisement" },
582
  { TAG_MCCAOP_TEARDOWN,                      "MCCAOP Teardown" },
583
  { TAG_GANN,                                 "Gate Announcement" },
584
  { TAG_RANN,                                 "Root Announcement" },
585
  { TAG_EXTENDED_CAPABILITIES,                "Extended Capabilities" },
586
  { TAG_AGERE_PROPRIETARY,                    "Agere Proprietary" },
587
  { TAG_MESH_PREQ,                            "Path Request" },
588
  { TAG_MESH_PREP,                            "Path Reply" },
589
  { TAG_MESH_PERR,                            "Path Error" },
590
  { TAG_CISCO_CCX1_CKIP,                      "Cisco CCX1 CKIP + Device Name" },
591
  { TAG_CISCO_CCX2,                           "Cisco CCX2" },
592
  { TAG_PXU,                                  "Proxy Update" },
593
  { TAG_PXUC,                                 "Proxy Update Confirmation"},
594
  { TAG_AUTH_MESH_PEERING_EXCH,               "Authenticated Mesh Peering Exchange" },
595
  { TAG_MIC,                                  "MIC (Message Integrity Code)" },
596
  { TAG_DESTINATION_URI,                      "Destination URI" },
597
  { TAG_U_APSD_COEX,                          "U-APSD Coexistence" },
598
  { TAG_WAKEUP_SCHEDULE_AD,                   "Wakeup Schedule 802.11ad" },
599
  { TAG_EXTENDED_SCHEDULE,                    "Extended Schedule" },
600
  { TAG_STA_AVAILABILITY,                     "STA Availability" },
601
  { TAG_DMG_TSPEC,                            "DMG TSPEC" },
602
  { TAG_NEXT_DMG_ATI,                         "Next DMG ATI" },
603
  { TAG_DMG_CAPABILITIES,                     "DMG Capabilities" },
604
  { TAG_CISCO_CCX3,                           "Cisco Unknown 95" },
605
  { TAG_CISCO_VENDOR_SPECIFIC,                "Vendor Specific" },
606
  { TAG_DMG_OPERATION,                        "DMG Operating" },
607
  { TAG_DMG_BSS_PARAMETER_CHANGE,             "DMG BSS Parameter Change" },
608
  { TAG_DMG_BEAM_REFINEMENT,                  "DMG Beam Refinement" },
609
  { TAG_CHANNEL_MEASURMENT_FB,                "Channel Measurement Feedback" },
610
  { TAG_AWAKE_WINDOW,                         "Awake Window" },
611
  { TAG_MULTI_BAND,                           "Multi Band" },
612
  { TAG_ADDBA_EXT,                            "ADDBA Extension" },
613
  { TAG_NEXTPCP_LIST,                         "NEXTPCP List" },
614
  { TAG_PCP_HANDOVER,                         "PCP Handover" },
615
  { TAG_DMG_LINK_MARGIN,                      "DMG Link Margin" },
616
  { TAG_SWITCHING_STREAM,                     "Switching Stream" },
617
  { TAG_SESSION_TRANSMISSION,                 "Session Transmission" },
618
  { TAG_DYN_TONE_PAIR_REP,                    "Dynamic Tone Pairing Report" },
619
  { TAG_CLUSTER_REP,                          "Cluster Report" },
620
  { TAG_RELAY_CAPABILITIES,                   "Relay Capabilities" },
621
  { TAG_RELAY_TRANSFER_PARAM,                 "Relay Transfer Parameter" },
622
  { TAG_BEAMLINK_MAINTENANCE,                 "Beamlink Maintenance" },
623
  { TAG_MULTIPLE_MAC_SUBLAYERS,               "Multiple MAC Sublayers" },
624
  { TAG_U_PID,                                "U-PID" },
625
  { TAG_DMG_LINK_ADAPTION_ACK,                "DMG Link Adaption Acknowledgment" },
626
  { TAG_SYMBOL_PROPRIETARY,                   "Symbol Proprietary" },
627
  { TAG_MCCAOP_ADVERTISEMENT_OV,              "MCCAOP Advertisement Overview" },
628
  { TAG_QUIET_PERIOD_REQ,                     "Quiet Period Request" },
629
  { TAG_QUIET_PERIOD_RES,                     "Quiet Period Response" },
630
  { TAG_ECAPC_POLICY,                         "ECAPC Policy" },
631
  { TAG_CLUSTER_TIME_OFFSET,                  "Cluster Time Offset" },
632
  { TAG_INTRA_ACCESS_CAT_PRIO,                "Intra-Access Category Priority" },
633
  { TAG_SCS_DESCRIPTOR,                       "SCS Descriptor" },
634
  { TAG_ANTENNA_SECTOR_ID,                    "Antenna Sector ID" },
635
  { TAG_VHT_CAPABILITY,                       "VHT Capabilities" },
636
  { TAG_VHT_OPERATION,                        "VHT Operation" },
637
  { TAG_EXT_BSS_LOAD,                         "Extended BSS Load" },
638
  { TAG_WIDE_BW_CHANNEL_SWITCH,               "Wide Bandwidth Channel Switch" },
639
  { TAG_TX_PWR_ENVELOPE,                      "Tx Power Envelope" },
640
  { TAG_CHANNEL_SWITCH_WRAPPER,               "Channel Switch Wrapper" },
641
  { TAG_OPERATING_MODE_NOTIFICATION,          "Operating Mode Notification" },
642
  { TAG_REDUCED_NEIGHBOR_REPORT,              "Reduced Neighbor Report" },
643
  { TAG_FINE_TIME_MEASUREMENT_PARAM,          "Fine Time Measurement Params" },
644
  { TAG_S1G_OPEN_LOOP_LINK_MARGIN_INDEX,      "S1G Open-Loop Link Margin Index" },
645
  { TAG_RPS,                                  "RPS" },
646
  { TAG_PAGE_SLICE,                           "Page Slice" },
647
  { TAG_AID_REQUEST,                          "AID Request" },
648
  { TAG_AID_RESPONSE,                         "AID Response" },
649
  { TAG_S1G_SECTOR_OPERATION,                 "Sector Operation" },
650
  { TAG_S1G_BEACON_COMPATIBILITY,             "S1G Beacon Compatibility" },
651
  { TAG_SHORT_BEACON_INTERVAL,                "Short Beacon Interval" },
652
  { TAG_CHANGE_SEQUENCE,                      "Change Sequence" },
653
  { TAG_TWT,                                  "Target Wake Time" },
654
  { TAG_S1G_CAPABILITIES,                     "S1G Capabilities" },
655
  { TAG_SUBCHANNEL_SELECTIVE_TRANSMISSION,    "Subchannel Selective Transmission" },
656
  { TAG_VENDOR_SPECIFIC_IE,                   "Vendor Specific" },
657
  { TAG_AUTHENTICATION_CONTROL,               "Authentication Control" },
658
  { TAG_TSF_TIMER_ACCURACY,                   "TSF Timer Accuracy" },
659
  { TAG_S1G_RELAY,                            "S1G Relay" },
660
  { TAG_REACHABLE_ADDRESS,                    "Reachable Address" },
661
  { TAG_S1G_RELAY_DISCOVERY,                  "S1G Relay Discovery" },
662
  { TAG_AID_ANNOUNCEMENT,                     "AID Announcement" },
663
  { TAG_PV1_PROBE_RESPONSE_OPTION,            "PV1 Probe Response Option" },
664
  { TAG_EL_OPERATION,                         "EL Operation" },
665
  { TAG_SECTORIZED_GROUP_ID_LIST,             "Sectorized Group ID List" },
666
  { TAG_S1G_OPERATION,                        "S1G Operation" },
667
  { TAG_HEADER_COMPRESSION,                   "Header Compression" },
668
  { TAG_SST_OPERATION,                        "SST Operation" },
669
  { TAG_MAD,                                  "MAD" },
670
  { TAG_S1G_RELAY_ACTIVATION,                 "S1G Relay Activation" },
671
  { TAG_CAG_NUMBER,                           "CAG Number"},
672
  { TAG_AP_CSN,                               "AP-CSN"},
673
  { TAG_FILS_INDICATION,                      "FILS Indication"},
674
  { TAG_DIFF_INITIAL_LINK_SETUP,              "Differential Initial Link Setup"},
675
  { TAG_FRAGMENT,                             "Fragment"},
676
  { TAG_RSNX,                                 "RSN eXtension"},
677
  { TAG_ELEMENT_ID_EXTENSION,                 "Element ID Extension" },
678
  { 0, NULL }
679
};
680
681
static value_string_ext tag_num_vals_ext = VALUE_STRING_EXT_INIT(ie_tag_num_vals);
682
683
#define ETAG_ASSOC_DELAY_INFO          1
684
36
#define ETAG_FILS_REQ_PARAMS           2
685
#define ETAG_FILS_KEY_CONFIRM          3
686
16
#define ETAG_FILS_SESSION              4
687
#define ETAG_FILS_HLP_CONTAINER        5
688
#define ETAG_FILS_IP_ADDRESS_ASSIGN    6
689
#define ETAG_KEY_DELIVERY              7
690
18
#define ETAG_FILS_WRAPPED_DATA         8
691
9
#define ETAG_FTM_SYNC_INFO             9
692
25
#define ETAG_EXTENDED_REQUEST          10
693
21
#define ETAG_ESTIMATED_SERVICE_PARAM   11
694
#define ETAG_FILS_PUBLIC_KEY           12
695
10
#define ETAG_FILS_NONCE                13
696
27
#define ETAG_FUTURE_CHANNEL_GUIDANCE   14
697
698
/* RFC 8110 */
699
27
#define ETAG_OWE_DH_PARAMETER          32
700
701
335
#define ETAG_PASSWORD_IDENTIFIER       33
702
703
/* 802.11AX defined tags */
704
313
#define ETAG_HE_CAPABILITIES                   35
705
277
#define ETAG_HE_OPERATION                      36
706
6
#define ETAG_UORA_PARAMETER_SET                37
707
6
#define ETAG_MU_EDCA_PARAMETER_SET             38
708
274
#define ETAG_SPATIAL_REUSE_PARAMETER_SET       39
709
4
#define ETAG_NDP_FEEDBACK_REPORT_PARAMETER_SET 41
710
268
#define ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT     42
711
31
#define ETAG_QUIET_TIME_PERIOD_SETUP           43
712
4
#define ETAG_ESS_REPORT                        45
713
7
#define ETAG_OPS                               46
714
#define ETAG_HE_BSS_LOAD                       47
715
102
#define ETAG_MAX_CHANNEL_SWITCH_TIME           52
716
12
#define ETAG_OCI                               54
717
4
#define ETAG_MULTIPLE_BSSID_CONFIGURATION      55
718
28
#define ETAG_NON_INHERITANCE                   56
719
2
#define ETAG_KNOWN_BSSID                       57
720
14
#define ETAG_SHORT_SSID                        58
721
268
#define ETAG_HE_6GHZ_BAND_CAPABILITIES         59
722
#define ETAG_UL_MU_POWER_CAPABILITIES          60
723
6
#define ETAG_MSCS_DESCRIPTOR_ELEMENT           88
724
5
#define ETAG_TCLAS_MASK                        89
725
327
#define ETAG_REJECTED_GROUPS                   92
726
325
#define ETAG_ANTI_CLOGGING_TOKEN               93
727
728
/* 802.11az */
729
2
#define ETAG_SECURE_LTF_PARAMETERS                      94
730
#define ETAG_ISTA_PASSIVE_TB_RANGING_MEASUREMENT_REPORT 95
731
#define ETAG_RSTA_PASSIVE_TB_RANGING_MEASUREMENT_REPORT 96
732
#define ETAG_PASSIVE_TB_RANGING_LCI_TABLE_ELEMENT       97
733
29
#define ETAG_ISTA_AVAILABILITY_WINDOW                   98
734
36
#define ETAG_RSTA_AVAILABILITY_WINDOW                   99
735
19
#define ETAG_PASN_PARAMETERS                            100
736
71
#define ETAG_RANGING_PARAMETERS                         101
737
7
#define ETAG_DIRECTION_MEASUREMENT_RESULTS              102
738
#define ETAG_MULTIPLE_AOD_FEEDBACK                      103
739
#define ETAG_MULTIPLE_BEST_AWV_ID                       104
740
#define ETAG_LOS_LIKELIHOOD                             105
741
9
#define ETAG_EHT_OPERATION                              106
742
876
#define ETAG_MULTI_LINK                                 107
743
16
#define ETAG_EHT_CAPABILITIES                           108
744
186
#define ETAG_TID_TO_LINK_MAPPING                        109
745
18
#define ETAG_MULTI_LINK_TRAFFIC                         110
746
19
#define ETAG_QOS_CHARACTERISTICS                        113
747
162
#define ETAG_AKM_SUITE_SELECTOR                         114
748
2
#define ETAG_MLO_LINK_INFORMATION                       133
749
84
#define ETAG_AID_BITMAP                                 134
750
87
#define ETAG_BANDWIDTH_INDICATION                       135
751
6
#define ETAG_NONAP_STA_REGULATORY_CONNECT               137
752
753
754
static const value_string tag_num_vals_eid_ext[] = {
755
  { ETAG_ASSOC_DELAY_INFO,                    "Association Delay Info" },
756
  { ETAG_FILS_REQ_PARAMS,                     "FILS Request Parameters" },
757
  { ETAG_FILS_KEY_CONFIRM,                    "FILS Key Confirmation" },
758
  { ETAG_FILS_SESSION,                        "FILS Session" },
759
  { ETAG_FILS_HLP_CONTAINER,                  "FILS HLP Container" },
760
  { ETAG_FILS_IP_ADDRESS_ASSIGN,              "FILS IP Address Assignment" },
761
  { ETAG_KEY_DELIVERY,                        "Key Delivery" },
762
  { ETAG_FILS_WRAPPED_DATA,                   "Wrapped Data" },
763
  { ETAG_FTM_SYNC_INFO,                       "FTM Synchronization Information" },
764
  { ETAG_EXTENDED_REQUEST,                    "Extended Request" },
765
  { ETAG_ESTIMATED_SERVICE_PARAM,             "Estimated Service Parameters" },
766
  { ETAG_FILS_PUBLIC_KEY,                     "FILS Public Key" },
767
  { ETAG_FILS_NONCE,                          "FILS Nonce" },
768
  { ETAG_FUTURE_CHANNEL_GUIDANCE,             "Future Channel Guidance" },
769
  { ETAG_OWE_DH_PARAMETER,                    "OWE Diffie-Hellman Parameter" },
770
  { ETAG_PASSWORD_IDENTIFIER,                 "Password Identifier" },
771
  { ETAG_HE_CAPABILITIES,                     "HE Capabilities" },
772
  { ETAG_HE_OPERATION,                        "HE Operation" },
773
  { ETAG_UORA_PARAMETER_SET,                  "UORA Parameter Set" },
774
  { ETAG_MU_EDCA_PARAMETER_SET,               "MU EDCA Parameter Set" },
775
  { ETAG_SPATIAL_REUSE_PARAMETER_SET,         "Spatial Reuse Parameter Set" },
776
  { ETAG_NDP_FEEDBACK_REPORT_PARAMETER_SET,   "NDP Feedback Report Parameter Set" },
777
  { ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT,       "BSS Color Change Announcement" },
778
  { ETAG_QUIET_TIME_PERIOD_SETUP,             "Quiet Time Period Setup" },
779
  { ETAG_ESS_REPORT,                          "ESS Report" },
780
  { ETAG_OPS,                                 "Opportunistic Power Save" },
781
  { ETAG_HE_BSS_LOAD,                         "HE BSS Load" },
782
  { ETAG_MAX_CHANNEL_SWITCH_TIME,             "Max Channel Switch Time" },
783
  { ETAG_OCI,                                 "Operating Channel Information" },
784
  { ETAG_MULTIPLE_BSSID_CONFIGURATION,        "Multiple BSSID Configuration" },
785
  { ETAG_NON_INHERITANCE,                     "Non-Inheritance"},
786
  { ETAG_KNOWN_BSSID,                         "Known BSSID" },
787
  { ETAG_SHORT_SSID,                          "Short SSID" },
788
  { ETAG_HE_6GHZ_BAND_CAPABILITIES,           "HE 6 GHz Band Capabilities" },
789
  { ETAG_UL_MU_POWER_CAPABILITIES,            "UL MU Power Capabilities" },
790
  { ETAG_MSCS_DESCRIPTOR_ELEMENT,             "MSCS Descriptor Element" },
791
  { ETAG_TCLAS_MASK,                          "TCLAS Mask" },
792
  { ETAG_REJECTED_GROUPS,                     "Rejected Groups" },
793
  { ETAG_ANTI_CLOGGING_TOKEN,                 "Anti-Clogging Token Container" },
794
  /* 802.11az */
795
  { ETAG_SECURE_LTF_PARAMETERS,               "Secure LTF Parameters" },
796
  { ETAG_ISTA_PASSIVE_TB_RANGING_MEASUREMENT_REPORT, "ISTA Passive TB Ranging Measurement Report" },
797
  { ETAG_RSTA_PASSIVE_TB_RANGING_MEASUREMENT_REPORT, "RSTA Passive TB Ranging Measurement Report" },
798
  { ETAG_PASSIVE_TB_RANGING_LCI_TABLE_ELEMENT, "Passive TB Ranging LCI Table element" },
799
  { ETAG_ISTA_AVAILABILITY_WINDOW,            "ISTA Availability Window" },
800
  { ETAG_RSTA_AVAILABILITY_WINDOW,            "RSTA Availability Window" },
801
  { ETAG_PASN_PARAMETERS,                     "PASN Parameters" },
802
  { ETAG_RANGING_PARAMETERS,                  "Ranging Parameters" },
803
  { ETAG_DIRECTION_MEASUREMENT_RESULTS,       "Direction Measurement Results" },
804
  { ETAG_MULTIPLE_AOD_FEEDBACK,               "Multiple AOD Feedback" },
805
  { ETAG_MULTIPLE_BEST_AWV_ID,                "Multiple Best AWV ID" },
806
  { ETAG_LOS_LIKELIHOOD,                      "LOS Likelihood" },
807
  { ETAG_EHT_OPERATION,                       "EHT Operation (802.11be D3.0)" },
808
  { ETAG_MULTI_LINK,                          "Multi-Link (802.11be D3.0)" },
809
  { ETAG_EHT_CAPABILITIES,                    "EHT Capabilities (802.11be D3.0)" },
810
  { ETAG_TID_TO_LINK_MAPPING,                 "TID-To-Link Mapping (802.11be D3.0)" },
811
  { ETAG_MULTI_LINK_TRAFFIC,                  "Multi-Link Traffic Indication (802.11be D3.0)" },
812
  { ETAG_QOS_CHARACTERISTICS,                 "QoS Characteristics (802.11be D3.0)" },
813
  { ETAG_AKM_SUITE_SELECTOR,                  "AKM Suite Selector" },
814
  { ETAG_MLO_LINK_INFORMATION,                "MLO Link Information (802.11be D3.0)" },
815
  { ETAG_AID_BITMAP,                          "AID Bitmap (802.11be D3.0)" },
816
  { ETAG_BANDWIDTH_INDICATION,                "Bandwidth Indication (802.11be D3.0)" },
817
  { ETAG_NONAP_STA_REGULATORY_CONNECT,        "Non-AP STA Regulatory Connectivity" },
818
  { 0, NULL }
819
};
820
static value_string_ext tag_num_vals_eid_ext_ext = VALUE_STRING_EXT_INIT(tag_num_vals_eid_ext);
821
822
static const value_string wfa_qos_subtype_vals[] = {
823
  { 0, "DSCP Policy Query" },
824
  { 1, "DSCP Policy Request" },
825
  { 2, "DSCP Policy Response" },
826
  { 0, NULL }
827
};
828
829
static const value_string wfa_action_subtype_vals[] = {
830
  { WFA_SUBTYPE_ACTION_QOS_MGMT, "QoS Management" },
831
  { 0, NULL }
832
};
833
834
const value_string wfa_subtype_vals[] = {
835
  { WFA_SUBTYPE_SUBSCRIPTION_REMEDIATION, "Subscription Remediation" },
836
  { WFA_SUBTYPE_DEAUTHENTICATION_IMMINENT, "Deauthentication Imminent" },
837
  { WFA_SUBTYPE_P2P, "P2P" },
838
  { WFA_SUBTYPE_HS20_INDICATION, "Hotspot 2.0 Indication" },
839
  { WFA_SUBTYPE_OSEN, "OSU Server-only l2 Encryption Network" },
840
  { WFA_SUBTYPE_NAN_IE, "NAN" },
841
  { WFA_SUBTYPE_MBO_OCE, "Multi Band Operation - Optimized Connectivity Experience"},
842
  { WFA_SUBTYPE_NAN_ACTION, "NAN Action" },
843
  { WFA_SUBTYPE_DPP, "Device Provisioning Protocol" },
844
  { WFA_SUBTYPE_IEEE1905_MULTI_AP, "IEEE1905 Multi-AP" },
845
  { WFA_SUBTYPE_OWE_TRANSITION_MODE, "OWE Transition Mode" },
846
  { WFA_SUBTYPE_WIFI_60G, "60GHz Information Element" },
847
  { WFA_WNM_SUBTYPE_NON_PREF_CHAN_REPORT, "Non-preferred Channel Report" },
848
  { WFA_WNM_SUBTYPE_CELL_DATA_CAPABILITIES, "Cellular Data Capabilities" },
849
  { WFA_SUBTYPE_TRANSITION_DISABLE_KDE, "Transition Disable KDE" },
850
  { WFA_SUBTYPE_QOS_MGMT, "QoS Management" },
851
  { WFA_SUBTYPE_RSN_OVERRIDE, "RSN Element Override" },
852
  { WFA_SUBTYPE_RSN_OVERRIDE_2, "RSN Element Override 2" },
853
  { WFA_SUBTYPE_RSNX_OVERRIDE, "RSN Extension Element Override" },
854
  { WFA_SUBTYPE_RSN_SELECTION, "RSN Selection" },
855
  { WFA_SUBTYPE_RSN_OVERRIDE_LINK_KDE, "RSN Override Link KDE" },
856
  { 0, NULL }
857
};
858
859
static const value_string wfa_anqp_subtype_vals[] = {
860
  { WFA_ANQP_SUBTYPE_HS20, "Hotspot 2.0 ANQP" },
861
  { WFA_ANQP_SUBTYPE_MBO, "Multi Band Operation ANQP" },
862
  { 0, NULL }
863
};
864
865
0
#define DPP_CONFIGURATION_PROTOCOL 0x01
866
867
static const value_string dpp_subtype_vals[] = {
868
  { DPP_CONFIGURATION_PROTOCOL, "DPP Configuration Protocol" },
869
  { 0, NULL }
870
};
871
872
/* ************************************************************************* */
873
/*              Supported Rates (7.3.2.2)                                    */
874
/* ************************************************************************* */
875
876
static const value_string ieee80211_supported_rates_vals[] = {
877
  { 0x02, "1" },
878
  { 0x03, "1.5" },
879
  { 0x04, "2" },
880
  { 0x05, "2.5" },
881
  { 0x06, "3" },
882
  { 0x09, "4.5" },
883
  { 0x0B, "5.5" },
884
  { 0x0C, "6" },
885
  { 0x12, "9" },
886
  { 0x16, "11" },
887
  { 0x18, "12" },
888
  { 0x1B, "13.5" },
889
  { 0x24, "18" },
890
  { 0x2C, "22" },
891
  { 0x30, "24" },
892
  { 0x36, "27" },
893
  { 0x42, "33" },
894
  { 0x48, "36" },
895
  { 0x60, "48" },
896
  { 0x6C, "54" },
897
  { 0x82, "1(B)" },
898
  { 0x83, "1.5(B)" },
899
  { 0x84, "2(B)" },
900
  { 0x85, "2.5(B)" },
901
  { 0x86, "3(B)" },
902
  { 0x89, "4.5(B)" },
903
  { 0x8B, "5.5(B)" },
904
  { 0x8C, "6(B)" },
905
  { 0x92, "9(B)" },
906
  { 0x96, "11(B)" },
907
  { 0x98, "12(B)" },
908
  { 0x9B, "13.5(B)" },
909
  { 0xA4, "18(B)" },
910
  { 0xAC, "22(B)" },
911
  { 0xB0, "24(B)" },
912
  { 0xB6, "27(B)" },
913
  { 0xC2, "33(B)" },
914
  { 0xC8, "36(B)" },
915
  { 0xE0, "48(B)" },
916
  { 0xEC, "54(B)" },
917
  /* BSS membership selector */
918
  { 0xFA, "HE PHY" },
919
  { 0xFB, "SAE Hash to Element Only" },
920
  { 0xFC, "EPD" }, /* 802.11ak */
921
  { 0xFD, "GLK" }, /* 802.11ak */
922
  { 0xFE, "VHT PHY" },
923
  { 0xFF, "HT PHY" },
924
  { 0,    NULL}
925
};
926
value_string_ext ieee80211_supported_rates_vals_ext = VALUE_STRING_EXT_INIT(ieee80211_supported_rates_vals);
927
928
/* ************************************************************************* */
929
/*                         8.4.1.7 Reason Code field                         */
930
/* ************************************************************************* */
931
static const value_string ieee80211_reason_code[] = {
932
  {  1, "Unspecified reason" },
933
  {  2, "Previous authentication no longer valid" },
934
  {  3, "Deauthenticated because sending STA is leaving (or has left) the BSS" },
935
  {  4, "Disassociated due to inactivity" },
936
  {  5, "Disassociated because AP is unable to handle all currently associated STAs" },
937
  {  6, "Class 2 frame received from nonauthenticated STA" },
938
  {  7, "Class 3 frame received from nonassociated STA" },
939
  {  8, "Disassociated because sending STA is leaving (or has left) BSS" },
940
  {  9, "STA requesting (re)association is not authenticated with responding STA" },
941
  { 10, "Disassociated because the information in the Power Capability element is unacceptable" },
942
  { 11, "Disassociated because the information in the Supported Channels element is unacceptable" },
943
  { 12, "Disassociated due to BSS transition management" },
944
  { 13, "Invalid information element, i.e., an information element defined in this standard for which the content does not meet the specifications in Clause 9" },
945
  { 14, "Message integrity code (MIC) failure" },
946
  { 15, "4-way handshake timeout" },
947
  { 16, "Group key handshake timeout" },
948
  { 17, "Element in 4-way handshake different from (Re)Association Request/Probe Response/Beacon frame" },
949
  { 18, "Invalid group cipher" },
950
  { 19, "Invalid pairwise cipher" },
951
  { 20, "Invalid AKMP" },
952
  { 21, "Unsupported RSNE version" },
953
  { 22, "Invalid RSNE capabilities" },
954
  { 23, "IEEE 802.1X authentication failed" },
955
  { 24, "Cipher suite rejected because of the security policy" },
956
  { 25, "TDLS direct-link teardown due to TDLS peer STA unreachable via the TDLS direct link" },
957
  { 26, "TDLS direct-link teardown for unspecified reason" },
958
  { 27, "Disassociated because session terminated by SSP request" },
959
  { 28, "Disassociated because of lack of SSP roaming agreement" },
960
  { 29, "Requested service rejected because of SSP cipher suite or AKM requirement " },
961
  { 30, "Requested service not authorized in this location" },
962
  { 31, "TS deleted because QoS AP lacks sufficient bandwidth for this QoS STA due to a change in BSS service characteristics or operational mode" },
963
  { 32, "Disassociated for unspecified, QoS-related reason" },
964
  { 33, "Disassociated because QoS AP lacks sufficient bandwidth for this QoS STA" },
965
  { 34, "Disassociated because excessive number of frames need to be acknowledged, but are not acknowledged due to AP transmissions and/or poor channel conditions" },
966
  { 35, "Disassociated because STA is transmitting outside the limits of its TXOPs" },
967
  { 36, "Requested from peer STA as the STA is leaving the BSS (or resetting)" },
968
  { 37, "Requesting STA is no longer using the stream or session" },
969
  { 38, "Requesting STA received frames using a mechanism for which a setup has not been completed" },
970
  { 39, "Requested from peer STA due to timeout" },
971
  { 46, "Disassociated because authorized access limit reached" },
972
  { 47, "Disassociated due to external service requirements" },
973
  { 48, "Invalid FT Action frame count" },
974
  { 49, "Invalid pairwise master key identifier (PMKID)" },
975
  { 50, "Invalid MDE" },
976
  { 51, "Invalid FTE" },
977
  { 52, "Mesh peering canceled for unknown reasons" },
978
  { 53, "The mesh STA has reached the supported maximum number of peer mesh STAs" },
979
  { 54, "The received information violates the Mesh Configuration policy configured in the mesh STA profile" },
980
  { 55, "The mesh STA has received a Mesh Peering Close message requesting to close the mesh peering" },
981
  { 56, "The mesh STA has re-sent dot11MeshMaxRetries Mesh Peering Open messages, without receiving a Mesh Peering Confirm message" },
982
  { 57, "The confirmTimer for the mesh peering instance times out" },
983
  { 58, "The mesh STA fails to unwrap the GTK or the values in the wrapped contents do not match" },
984
  { 59, "The mesh STA receives inconsistent information about the mesh parameters between Mesh Peering Management frames" },
985
  { 60, "The mesh STA fails the authenticated mesh peering exchange because due to failure in selecting either the pairwise ciphersuite or group ciphersuite" },
986
  { 61, "The mesh STA does not have proxy information for this external destination" },
987
  { 62, "The mesh STA does not have forwarding information for this destination" },
988
  { 63, "The mesh STA determines that the link to the next hop of an active path in its forwarding information is no longer usable" },
989
  { 64, "The Deauthentication frame was sent because the MAC address of the STA already exists in the mesh BSS. See 11.3.3 (Additional mechanisms for an AP collocated with a mesh STA)" },
990
  { 65, "The mesh STA performs channel switch to meet regulatory requirements" },
991
  { 66, "The mesh STA performs channel switch with unspecified reason" },
992
  { 67, "Transmission link establishment in alternative channel failed" },
993
  { 68, "The alternative channel is occupied" },
994
  { 71, "Disassociated due to poor RSSI" },
995
  { 0,  NULL}
996
};
997
value_string_ext ieee80211_reason_code_ext = VALUE_STRING_EXT_INIT(ieee80211_reason_code);
998
999
/* ************************************************************************* */
1000
/*                         8.4.1.9 Status Code field                         */
1001
/* ************************************************************************* */
1002
static const value_string ieee80211_status_code[] = {
1003
  {  0, "Successful" },
1004
  {  1, "Unspecified failure" },
1005
  {  2, "TDLS wakeup schedule rejected but alternative schedule provided" },
1006
  {  3, "TDLS wakeup schedule rejected" },
1007
  {  4, "Reserved" },
1008
  {  5, "Security disabled" },
1009
  {  6, "Unacceptable lifetime" },
1010
  {  7, "Not in same BSS" },
1011
  {  8, "Reserved" },
1012
  {  9, "Reserved" },
1013
  { 10, "Cannot support all requested capabilities in the Capability Information field" },
1014
  { 11, "Reassociation denied due to inability to confirm that association exists" },
1015
  { 12, "Association denied due to reason outside the scope of this standard" },
1016
  { 13, "Responding STA does not support the specified authentication algorithm" },
1017
  { 14, "Received an Authentication frame with authentication transaction sequence number out of expected sequence" },
1018
  { 15, "Authentication rejected because of challenge failure" },
1019
  { 16, "Authentication rejected due to timeout waiting for next frame in sequence" },
1020
  { 17, "Association denied because AP is unable to handle additional associated STAs" },
1021
  { 18, "Association denied due to requesting STA not supporting all of the data rates in the BSSBasicRateSet parameter, the Basic HT-MCS Set field of the HT Operation parameter, or the Basic VHT-MCS and NSS Set field in the VHT Operation parameter" },
1022
  { 19, "Association denied due to requesting STA not supporting the short preamble option" },
1023
  { 20, "Reserved" },
1024
  { 21, "Reserved" },
1025
  { 22, "Association request rejected because spectrum management capability is required" },
1026
  { 23, "Association request rejected because the information in the Power Capability element is unacceptable" },
1027
  { 24, "Association request rejected because the information in the Supported Channels element is unacceptable" },
1028
  { 25, "Association denied due to requesting STA not supporting short slot time" },
1029
  { 26, "Reserved" },
1030
  { 27, "Association denied because the requesting STA does not support HT features" },
1031
  { 28, "R0KH unreachable" },
1032
  { 29, "Reserved"},
1033
  { 30, "Association request rejected temporarily; try again later" },
1034
  { 31, "Robust management frame policy violation" },
1035
  { 32, "Unspecified, QoS-related failure" },
1036
  { 33, "Association denied because QoS AP or PCP has insufficient bandwidth to handle another QoS STA" },
1037
  { 34, "Association denied due to excessive frame loss rates and/ or poor conditions on current operating channel" },
1038
  { 35, "Association (with QoS BSS) denied because the requesting STA does not support the QoS facility" },
1039
  { 36, "Reserved" },
1040
  { 37, "The request has been declined" },
1041
  { 38, "The request has not been successful as one or more parameters have invalid values" },
1042
  { 39, "The allocation or TS has not been created because the request cannot be honored; however, a suggested TSPEC/DMG TSPEC is provided so that the initiating STA can attempt to set another allocation or TS with the suggested changes to the TSPEC/DMG TSPEC" },
1043
  { 40, "Invalid element, i.e., an element defined in this standard for which the content does not meet the specifications in Clause 9 (Frame formats)" },
1044
  { 41, "Invalid group cipher" },
1045
  { 42, "Invalid pairwise cipher" },
1046
  { 43, "Invalid AKMP" },
1047
  { 44, "Unsupported RSNE version" },
1048
  { 45, "Invalid RSNE capabilities" },
1049
  { 46, "Cipher suite rejected because of security policy" },
1050
  { 47, "The TS or allocation has not been created; however, the HC or PCP might be capable of creating a TS or allocation, in response to a request, after the time indicated in the TS Delay element" },
1051
  { 48, "Reserved" },
1052
  { 49, "The Destination STA is not present within this BSS" },
1053
  { 50, "The Destination STA is not a QoS STA" },
1054
  { 51, "Association denied because the listen interval is too large" },
1055
  { 52, "Invalid FT Action frame count" },
1056
  { 53, "Invalid pairwise master key identifier (PMKID)" },
1057
  { 54, "Invalid MDE" },
1058
  { 55, "Invalid FTE" },
1059
  { 56, "Requested TCLAS processing is not supported by the AP or PCP" },
1060
  { 57, "The AP or PCP has insufficient TCLAS processing resources to satisfy the request" },
1061
  { 58, "The TS has not been created because the request cannot be honored; however, the HC or PCP suggests that the STA transition to a different BSS to set up the TS" },
1062
  { 59, "GAS advertisement protocol not supported" },
1063
  { 60, "No outstanding GAS request" },
1064
  { 61, "GAS response not received from the advertisement server" },
1065
  { 62, "STA timed out waiting for GAS query response" },
1066
  { 63, "GAS response is larger than query response length limit" },
1067
  { 64, "Request refused because home network does not support request" },
1068
  { 65, "Advertisement server in the network is not currently reachable" },
1069
  { 66, "Reserved" },
1070
  { 67, "Request refused due to permissions received via SSPN interface" },
1071
  { 68, "Request refused because the AP or PCP does not support unauthenticated access" },
1072
  { 69, "Reserved" },
1073
  { 70, "Reserved" },
1074
  { 71, "Reserved" },
1075
  { 72, "Invalid contents of RSNE, other than unsupported RSNE version or invalid RSNE capabilities, AKMP or pairwise cipher" },
1076
  { 73, "U-APSD coexistence is not supported" },
1077
  { 74, "Requested U-APSD coexistence mode is not supported" },
1078
  { 75, "Requested interval/duration value cannot be supported with U-APSD coexistence" },
1079
  { 76, "Authentication is rejected because an anti-clogging token is required" },
1080
  { 77, "Authentication is rejected because the offered finite cyclic group is not supported" },
1081
  { 78, "The TBTT adjustment request has not been successful because the STA could not find an alternative TBTT" },
1082
  { 79, "Transmission failure" },
1083
  { 80, "Requested TCLAS not supported" },
1084
  { 81, "TCLAS resources exhausted" },
1085
  { 82, "Rejected with suggested BSS transition" },
1086
  { 83, "Reject with recommended schedule" },
1087
  { 84, "Reject because no wakeup schedule specified" },
1088
  { 85, "Success, the destination STA is in power save mode" },
1089
  { 86, "FST pending, in process of admitting FST session" },
1090
  { 87, "Performing FST now" },
1091
  { 88, "FST pending, gap(s) in block ack window" },
1092
  { 89, "Reject because of U-PID setting" },
1093
  { 90, "Reserved" },
1094
  { 91, "Reserved" },
1095
  { 92, "(Re)Association refused for some external reason" },
1096
  { 93, "(Re)Association refused because of memory limits at the AP" },
1097
  { 94, "(Re)Association refused because emergency services are not supported at the AP" },
1098
  { 95, "GAS query response not yet received" },
1099
  { 96, "Reject since the request is for transition to a frequency band subject to DSE procedures and FST Initiator is a dependent STA" },
1100
  { 97, "Requested TCLAS processing has been terminated by the AP" },
1101
  { 98, "The TS schedule conflicts with an existing schedule; an alternative schedule is provided" },
1102
  { 99, "The association has been denied; however, one or more Multi-band elements are included that can be used by the receiving STA to join the BSS" },
1103
  { 100, "The request failed due to a reservation conflict" },
1104
  { 101, "The request failed due to exceeded MAF limit" },
1105
  { 102, "The request failed due to exceeded MCCA track limit" },
1106
  { 103, "Association denied because the information in the Spectrum Management field is unacceptable" },
1107
  { 104, "Association denied because the requesting STA does not support VHT features" },
1108
  { 105, "Enablement denied" },
1109
  { 106, "Enablement denied due to restriction from an authorized GDB" },
1110
  { 107, "Authorization deenabled" },
1111
  { 108, "Re(association) refused or disassociated because energy limited operation is not supported at the AP" },
1112
  { 109, "BlockAck negotiation refused because, due to buffer constraints and other unspecified reasons, the recipient prefers to generate only NDP BlockAck frames" },
1113
  { 110, "Association denied/disassociated because the suggested value for max away duration is unacceptable" },
1114
  { 111, "Re(association) refused or disassociated because flow control operation is not supported by the non-AP STA" },
1115
  { 112, "Authentication rejected due to FILS authentication failure" },
1116
  { 113, "Authentication rejected due to unknown Authentication Server" },
1117
  { 114, "Reserved" },
1118
  { 115, "Reserved" },
1119
  { 116, "Request denied because the allocation of notification period is failed" },
1120
  { 117, "Request denied because the request of channel splitting is failed" },
1121
  { 118, "Request denied because the allocation request is failed" },
1122
  { 119, "Association denied because the requesting STA does not support CMMG features" },
1123
  { 120, "The requested GAS fragment is not available" },
1124
  { 121, "Success, the CAG Version provided by the requesting STA is the same as the latest CAG Version provided by the relevant server" },
1125
  { 122, "The STA is not authorized to use GLK per local policy" },
1126
  { 123, "Authentication rejected because the password identifier is unknown" },
1127
  { 124, "Reserved"},
1128
  { 125, "Request denied because source address of request is inconsistent with local MAC address policy" },
1129
  { 126, "SAE authentication uses direct hashing, instead of looping, to obtain the PWE" },
1130
  { 127, "Reserved"},
1131
  { 128, "Requested TCLAS processing has been terminated by the AP due to insufficient QoS capacity" },
1132
  { 129, "Requested TCLAS processing has been terminated by the AP due to conflict with higher layer QoS policies" },
1133
  { 130, "Association denied because the requesting STA is affiliated with a non-AP MLD that is associated with the AP MLD"},
1134
  { 131, "EPCS priority access denied because the non-AP MLD is not authorized to use the service"},
1135
  { 132, "EPCS priority access denied due to reason outside the scope of this standard"},
1136
  { 133, "Request denied because the requested TID-to-link mapping is unacceptable"},
1137
  { 134, "Preferred TID-to-link mapping suggested"},
1138
  { 135, "Association denied because the requesting STA does not support EHT features"},
1139
  { 139, "Link not accepted because the link on which the (Re)Association Request frame is transmitted is not accepted"},
1140
  { 140, "EPCS priority access is temporarily denied because the receiving AP MLD is unable to verify that the non-AP MLD is authorized for an unspecified reason"},
1141
  { 141, "Operation parameter update denied because the requested operation parameters or capabilities are not acceptable"},
1142
  {   0, NULL}
1143
};
1144
value_string_ext ieee80211_status_code_ext = VALUE_STRING_EXT_INIT(ieee80211_status_code);
1145
1146
static const value_string ieee80211_transition_reasons[] = {
1147
  { 0, "Unspecified" },
1148
  { 1, "Excessive frame loss rates and/or poor conditions" },
1149
  { 2, "Excessive delay for current traffic streams" },
1150
  { 3, "Insufficient QoS capacity for current traffic streams (TSPEC rejected)" },
1151
  { 4, "First association to ESS (the association initiated by an Association Request frame instead of a Reassociation Request frame)" },
1152
  { 5, "Load balancing" },
1153
  { 6, "Better AP found" },
1154
  { 7, "Deauthenticated or Disassociated from the previous AP" },
1155
  { 8, "AP failed IEEE 802.1X EAP Authentication" },
1156
  { 9, "AP failed 4-way handshake" },
1157
  { 10, "Received too many replay counter failures" },
1158
  { 11, "Received too many data MIC failures" },
1159
  { 12, "Exceeded maximum number of retransmissions" },
1160
  { 13, "Received too many broadcast disassociations" },
1161
  { 14, "Received too many broadcast deauthentications" },
1162
  { 15, "Previous transition failed" },
1163
  { 16, "Low RSSI" },
1164
  { 17, "Roam from a non-IEEE-802.11 system" },
1165
  { 18, "Transition due to received BSS Transition Request frame" },
1166
  { 19, "Preferred BSS transition candidate list included" },
1167
  { 20, "Leaving ESS" },
1168
  { 0,    NULL}
1169
};
1170
/* ************************************************************************* */
1171
/*                         Frame types, and their names                      */
1172
/* ************************************************************************* */
1173
static const value_string frame_type_subtype_vals[] = {
1174
  {MGT_ASSOC_REQ,             "Association Request"},
1175
  {MGT_ASSOC_RESP,            "Association Response"},
1176
  {MGT_REASSOC_REQ,           "Reassociation Request"},
1177
  {MGT_REASSOC_RESP,          "Reassociation Response"},
1178
  {MGT_PROBE_REQ,             "Probe Request"},
1179
  {MGT_PROBE_RESP,            "Probe Response"},
1180
  {MGT_MEASUREMENT_PILOT,     "Measurement Pilot"},
1181
  {MGT_BEACON,                "Beacon frame"},
1182
  {MGT_ATIM,                  "ATIM"},
1183
  {MGT_DISASS,                "Disassociate"},
1184
  {MGT_AUTHENTICATION,        "Authentication"},
1185
  {MGT_DEAUTHENTICATION,      "Deauthentication"},
1186
  {MGT_ACTION,                "Action"},
1187
  {MGT_ACTION_NO_ACK,         "Action No Ack"},
1188
  {MGT_ARUBA_WLAN,            "Aruba Management"},
1189
1190
  {CTRL_TRIGGER,              "Trigger"},
1191
  {CTRL_TACK,                 "TWT Ack"},
1192
  {CTRL_BEAMFORM_RPT_POLL,    "Beamforming Report Poll"},
1193
  {CTRL_VHT_NDP_ANNC,         "VHT/HE/EHT/RANGING NDP Announcement"},
1194
  {CTRL_CONTROL_WRAPPER,      "Control Wrapper"},
1195
  {CTRL_BLOCK_ACK_REQ,        "802.11 Block Ack Req"},
1196
  {CTRL_BLOCK_ACK,            "802.11 Block Ack"},
1197
  {CTRL_PS_POLL,              "Power-Save poll"},
1198
  {CTRL_RTS,                  "Request-to-send"},
1199
  {CTRL_CTS,                  "Clear-to-send"},
1200
  {CTRL_ACKNOWLEDGEMENT,      "Acknowledgement"},
1201
  {CTRL_CFP_END,              "CF-End (Control-frame)"},
1202
  {CTRL_CFP_ENDACK,           "CF-End + CF-Ack (Control-frame)"},
1203
1204
  {DATA,                      "Data"},
1205
  {DATA_CF_ACK,               "Data + CF-Ack"},
1206
  {DATA_CF_POLL,              "Data + CF-Poll"},
1207
  {DATA_CF_ACK_POLL,          "Data + CF-Ack + CF-Poll"},
1208
  {DATA_NULL_FUNCTION,        "Null function (No data)"},
1209
  {DATA_CF_ACK_NOD,           "Acknowledgement (No data)"},
1210
  {DATA_CF_POLL_NOD,          "CF-Poll (No data)"},
1211
  {DATA_CF_ACK_POLL_NOD,      "CF-Ack/Poll (No data)"},
1212
  {DATA_QOS_DATA,             "QoS Data"},
1213
  {DATA_QOS_DATA_CF_ACK,      "QoS Data + CF-Acknowledgment"},
1214
  {DATA_QOS_DATA_CF_POLL,     "QoS Data + CF-Poll"},
1215
  {DATA_QOS_DATA_CF_ACK_POLL, "QoS Data + CF-Ack + CF-Poll"},
1216
  {DATA_QOS_NULL,             "QoS Null function (No data)"},
1217
  {DATA_QOS_CF_POLL_NOD,      "QoS CF-Poll (No Data)"},
1218
  {DATA_QOS_CF_ACK_POLL_NOD,  "QoS CF-Ack + CF-Poll (No data)"},
1219
1220
  {EXTENSION_DMG_BEACON,      "DMG Beacon"},
1221
  {EXTENSION_S1G_BEACON,      "S1G Beacon"},
1222
1223
  {CTRL_POLL,                 "Poll"},
1224
  {CTRL_SPR,                  "Service Period Request"},
1225
  {CTRL_GRANT,                "Grant"},
1226
  {CTRL_DMG_CTS,              "DMG Clear-to-send"},
1227
  {CTRL_DMG_DTS,              "DMG Denial-to-send"},
1228
  {CTRL_GRANT_ACK,            "Grant Acknowledgment"},
1229
  {CTRL_SSW,                  "Sector Sweep"},
1230
  {CTRL_SSW_FEEDBACK,         "Sector Sweep Feedback"},
1231
  {CTRL_SSW_ACK,              "Sector Sweep Acknowledgment"},
1232
1233
  {0,                         NULL}
1234
};
1235
static value_string_ext frame_type_subtype_vals_ext = VALUE_STRING_EXT_INIT(frame_type_subtype_vals);
1236
1237
/* ************************************************************************* */
1238
/*                 802.1D Tag Name (by WME Access Category Names)            */
1239
/* ************************************************************************* */
1240
static const value_string ieee80211_qos_tags_acs[] = {
1241
  { 0, "Best Effort (Best Effort)" },
1242
  { 1, "Background (Background)" },
1243
  { 2, "Spare (Background)" },
1244
  { 3, "Excellent Effort (Best Effort)" },
1245
  { 4, "Controlled Load (Video)" },
1246
  { 5, "Video (Video)" },
1247
  { 6, "Voice (Voice)" },
1248
  { 7, "Network Control (Voice)" },
1249
  { 0, NULL }
1250
};
1251
1252
/* ************************************************************************* */
1253
/*                   WME Access Category Names (by WME ACI)                  */
1254
/* ************************************************************************* */
1255
static const value_string wme_acs[] = {
1256
  { 0, "Best Effort" },
1257
  { 1, "Background" },
1258
  { 2, "Video" },
1259
  { 3, "Voice" },
1260
  { 0, NULL }
1261
};
1262
1263
/* ************************************************************************* */
1264
/*                  Aruba Management Type                                    */
1265
/* ************************************************************************* */
1266
static const value_string aruba_mgt_typevals[] = {
1267
  { 0x0001,       "Hello" },
1268
  { 0x0002,       "Probe" },
1269
  { 0x0003,       "MTU" },
1270
  { 0x0004,       "Ageout" },
1271
  { 0x0005,       "Heartbeat" },
1272
  { 0x0006,       "Deauth" },
1273
  { 0x0007,       "Disassoc" },
1274
  { 0x0008,       "Probe response" },
1275
  { 0x0009,       "Tunnel update" },
1276
  { 0x000A,       "Laser beam active" },
1277
  { 0x000B,       "Client IP" },
1278
  { 0x000C,       "Laser beam active v2" },
1279
  { 0x000D,       "AP statistics" },
1280
  { 0,            NULL }
1281
};
1282
static value_string_ext aruba_mgt_typevals_ext = VALUE_STRING_EXT_INIT(aruba_mgt_typevals);
1283
1284
/*** Begin: Action Fixed Parameter ***/
1285
117
#define CAT_SPECTRUM_MGMT          0
1286
10
#define CAT_QOS                    1
1287
11
#define CAT_DLS                    2
1288
5
#define CAT_BLOCK_ACK              3
1289
10
#define CAT_PUBLIC                 4
1290
763
#define CAT_RADIO_MEASUREMENT      5
1291
9
#define CAT_FAST_BSS_TRANSITION    6
1292
36
#define CAT_HT                     7
1293
5
#define CAT_SA_QUERY               8
1294
21
#define CAT_PUBLIC_PROTECTED       9
1295
10
#define CAT_WNM                   10
1296
5
#define CAT_UNPROTECTED_WNM       11
1297
51
#define CAT_TDLS                  12
1298
4
#define CAT_MESH                  13
1299
3
#define CAT_MULTIHOP              14
1300
2
#define CAT_SELF_PROTECTED        15
1301
19
#define CAT_DMG                   16
1302
3
#define CAT_MGMT_NOTIFICATION     17
1303
9
#define CAT_FAST_SESSION_TRANSFER 18
1304
25
#define CAT_ROBUST_AV_STREAMING   19
1305
3
#define CAT_UNPROTECTED_DMG       20
1306
130
#define CAT_VHT                   21
1307
5
#define CAT_S1G                   22
1308
3
#define CAT_PROTECTED_S1G         23
1309
#define CAT_FLOW_CONTROL          24
1310
#define CAT_CONTROL_RESPONSE_MCS_NEG 25
1311
#define CAT_FILS                  26
1312
/* aj */
1313
#define CAT_CDMG                  27
1314
#define CAT_CMMG                  28
1315
/* ak */
1316
#define CAT_GLK                   29
1317
1318
118
#define CAT_HE                    30
1319
5
#define CAT_PROTECTED_HE          31
1320
2
#define CAT_PROTECTED_FTM         34
1321
113
#define CAT_EHT                   36
1322
498
#define CAT_PROTECTED_EHT         37
1323
1
#define CAT_VENDOR_SPECIFIC_PROTECTED 126
1324
3
#define CAT_VENDOR_SPECIFIC     127
1325
1326
#define CAT_MESH_LINK_METRIC               31
1327
#define CAT_MESH_PATH_SELECTION            32
1328
#define CAT_MESH_INTERWORKING              33
1329
#define CAT_MESH_RESOURCE_COORDINATION     34
1330
#define CAT_MESH_SECURITY_ARCHITECTURE     35
1331
1332
41
#define SM_ACTION_MEASUREMENT_REQUEST   0
1333
44
#define SM_ACTION_MEASUREMENT_REPORT    1
1334
46
#define SM_ACTION_TPC_REQUEST           2
1335
48
#define SM_ACTION_TPC_REPORT            3
1336
3
#define SM_ACTION_CHAN_SWITCH_ANNC      4
1337
4
#define SM_ACTION_EXT_CHAN_SWITCH_ANNC  5
1338
1339
2
#define QOS_ACTION_ADDTS_REQUEST     0
1340
3
#define QOS_ACTION_ADDTS_RESPONSE    1
1341
1
#define QOS_ACTION_DELTS             2
1342
2
#define QOS_ACTION_SCHEDULE      3
1343
0
#define QOS_ACTION_MAP_CONFIGURE 4
1344
1345
3
#define DLS_ACTION_REQUEST       0
1346
3
#define DLS_ACTION_RESPONSE      1
1347
2
#define DLS_ACTION_TEARDOWN      2
1348
1349
#define BA_ADD_BLOCK_ACK_REQUEST      0
1350
#define BA_ADD_BLOCK_ACK_RESPONSE     1
1351
#define BA_DELETE_BLOCK_ACK           2
1352
1353
1
#define BA_NDP_ADD_BLOCK_ACK_REQUEST  128
1354
0
#define BA_NDP_ADD_BLOCK_ACK_RESPONSE 129
1355
2
#define BA_NDP_DELETE_BLOCK_ACK       130
1356
1
#define BA_BAT_ADD_BLOCK_ACK_REQUEST  132
1357
0
#define BA_BAT_ADD_BLOCK_ACK_RESPONSE 133
1358
2
#define BA_BAT_DELETE_BLOCK_ACK       134
1359
1360
1
#define BA_ADD_BLOCK_ACK_REQUEST    0
1361
0
#define BA_ADD_BLOCK_ACK_RESPONSE   1
1362
1
#define BA_DELETE_BLOCK_ACK         2
1363
1364
/* Keep in sync with PPA_* defines */
1365
#define PA_20_40_BSS_COEXISTENCE_MANAGEMENT 0
1366
#define PA_DSE_ENABLEMENT                   1
1367
#define PA_DSE_DEENABLEMENT                 2
1368
#define PA_DSE_REG_LOC_ANNOUNCEMENT         3
1369
1
#define PA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT  4
1370
#define PA_DSE_MEASUREMENT_REQUEST          5
1371
#define PA_DSE_MEASUREMENT_REPORT           6
1372
#define PA_MEASUREMENT_PILOT                7
1373
#define PA_DSE_POWER_CONSTRAINT             8
1374
3
#define PA_VENDOR_SPECIFIC                  9
1375
1
#define PA_GAS_INITIAL_REQUEST             10
1376
3
#define PA_GAS_INITIAL_RESPONSE            11
1377
2
#define PA_GAS_COMEBACK_REQUEST            12
1378
14
#define PA_GAS_COMEBACK_RESPONSE           13
1379
0
#define PA_TDLS_DISCOVERY_RESPONSE         14
1380
#define PA_LOCATION_TRACK_NOTIFICATION     15
1381
1
#define PA_QAB_REQUEST                     16
1382
1
#define PA_QAB_RESPONSE                    17
1383
#define PA_QMF_POLICY                      18
1384
#define PA_QMF_POLICY_CHANGE               19
1385
#define PA_QLOAD_REQUEST                   20
1386
#define PA_QLOAD_REPORT                    21
1387
#define PA_HCCA_TXOP_ADVERTISEMENT         22
1388
#define PA_HCCA_TXOP_RESPONSE              23
1389
#define PA_PUBLIC_KEY                      24
1390
#define PA_CHANNEL_AVAILABILITY_QUERY      25
1391
#define PA_CHANNEL_SCHEDULE_MANAGEMENT     26
1392
#define PA_CONTACT_VERIFICATION_SIGNAL     27
1393
#define PA_GDD_ENABLEMENT_REQUEST          28
1394
#define PA_GDD_ENABLEMENT_RESPONSE         29
1395
#define PA_NETWORK_CHANNEL_CONTROL         30
1396
#define PA_WHITE_SPACE_MAP_ANNOUNCEMENT    31
1397
2
#define PA_FTM_REQUEST                     32
1398
0
#define PA_FTM                             33
1399
1
#define PA_FILS_DISCOVERY                  34
1400
/* 802.11aj */
1401
#define PA_DCS_MEASUREMENT_REQUEST               35
1402
#define PA_DCS_MEASUREMENT_REPORT                36
1403
#define PA_DCS_REQUEST                           37
1404
#define PA_DCS_RESPONSE                          38
1405
#define PA_EXTENDED_NOTIFICATION_PERIOD_REQUEST  39
1406
#define PA_EXTENDED_NOTIFICATION_PERIOD_RESPONSE 40
1407
#define PA_EXTENDED_CHANNEL_SPLITTING_REQUEST    41
1408
#define PA_EXTENDED_CHANNEL_SPLITTING_RESPONSE   42
1409
/* 802.11aq */
1410
#define PA_GROUP_ADDRESSED_GAS_REQUEST     43
1411
#define PA_GROUP_ADDRESSED_GAS_RESPONSE    44
1412
/* Unknown */
1413
#define PA_ON_CHANNEL_TUNNEL_REQUEST       45
1414
#define PA_VALUE_46                        46
1415
/* 802.11az */
1416
1
#define PA_LOCATION_MEASUREMENT_REPORT                                      47
1417
#define PA_ISTA_PASSIVE_TB_RANGING_MEASUREMENT_REPORT                       48
1418
#define PA_PRIMARY_RSTA_BROADCAST_PASSIVE_TB_RANGING_MEASUREMENT_REPORT     49
1419
#define PA_SECONDARY_RSTA_BROADCAST_PASSIVE_TB_RANGING_MEASUREMENT_REPORT   50
1420
1421
/* Keep in sync with PA_* defines */
1422
#define PPA_DSE_ENABLEMENT                   1
1423
#define PPA_DSE_DEENABLEMENT                 2
1424
#define PPA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT  4
1425
#define PPA_DSE_MEASUREMENT_REQUEST          5
1426
#define PPA_DSE_MEASUREMENT_REPORT           6
1427
#define PPA_DSE_POWER_CONSTRAINT             8
1428
#define PPA_VENDOR_SPECIFIC                  9
1429
#define PPA_GAS_INITIAL_REQUEST             10
1430
#define PPA_GAS_INITIAL_RESPONSE            11
1431
#define PPA_GAS_COMEBACK_REQUEST            12
1432
#define PPA_GAS_COMEBACK_RESPONSE           13
1433
#define PPA_QAB_REQUEST                     16
1434
#define PPA_QAB_RESPONSE                    17
1435
1436
2
#define HT_ACTION_NOTIFY_CHAN_WIDTH           0
1437
1
#define HT_ACTION_SM_PWR_SAVE                 1
1438
25
#define HT_ACTION_PSMP_ACTION                 2
1439
0
#define HT_ACTION_SET_PCO_PHASE               3
1440
0
#define HT_ACTION_MIMO_CSI                    4
1441
0
#define HT_ACTION_MIMO_BEAMFORMING            5
1442
4
#define HT_ACTION_MIMO_COMPRESSED_BEAMFORMING 6
1443
1
#define HT_ACTION_ANT_SEL_FEEDBACK            7
1444
1
#define HT_ACTION_HT_INFO_EXCHANGE            8
1445
1446
3
#define DMG_ACTION_PWR_SAVE_CONFIG_REQ           0
1447
1
#define DMG_ACTION_PWR_SAVE_CONFIG_RES           1
1448
1
#define DMG_ACTION_INFO_REQ                      2
1449
0
#define DMG_ACTION_INFO_RES                      3
1450
1
#define DMG_ACTION_HANDOVER_REQ                  4
1451
0
#define DMG_ACTION_HANDOVER_RES                  5
1452
0
#define DMG_ACTION_DTP_REQ                       6
1453
2
#define DMG_ACTION_DTP_RES                       7
1454
1
#define DMG_ACTION_RELAY_SEARCH_REQ              8
1455
0
#define DMG_ACTION_RELAY_SEARCH_RES              9
1456
0
#define DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_REQ 10
1457
4
#define DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_RES 11
1458
0
#define DMG_ACTION_RLS_REQ                       12
1459
2
#define DMG_ACTION_RLS_RES                       13
1460
0
#define DMG_ACTION_RLS_ANNOUNCE                  14
1461
0
#define DMG_ACTION_RLS_TEARDOWN                  15
1462
0
#define DMG_ACTION_RELAY_ACK_REQ                 16
1463
0
#define DMG_ACTION_RELAY_ACK_RES                 17
1464
0
#define DMG_ACTION_TPA_REQ                       18
1465
0
#define DMG_ACTION_TPA_RES                       19
1466
0
#define DMG_ACTION_TPA_REP                       20
1467
0
#define DMG_ACTION_ROC_REQ                       21
1468
0
#define DMG_ACTION_ROC_RES                       22
1469
1470
1
#define UNPROTECTED_DMG_ANNOUNCE                 0
1471
0
#define UNPROTECTED_DMG_BRP                      1
1472
1473
2
#define FST_SETUP_REQUEST                        0
1474
0
#define FST_SETUP_RESPONSE                       1
1475
0
#define FST_TEAR_DOWN                            2
1476
0
#define FST_ACK_REQUEST                          3
1477
2
#define FST_ACK_RESPONSE                         4
1478
1
#define FST_ON_CHANNEL_TUNNEL_REQUEST            5
1479
1480
3
#define ROBUST_AV_STREAMING_SCS_REQUEST          0
1481
19
#define ROBUST_AV_STREAMING_SCS_RESPONSE         1
1482
#define ROBUST_AV_STREAMING_GROUP_MEMBERSHIP_REQ 2
1483
#define ROBUST_AV_STREAMING_GROUP_MEMBERSHIP_RSP 3
1484
1
#define ROBUST_AV_STREAMING_MSCS_REQUEST         4
1485
0
#define ROBUST_AV_STREAMING_MSCS_RESPONSE        5
1486
1487
1488
/* IEEE Std 802.11r-2008, 7.4.8, Table 7-57g */
1489
1
#define FT_ACTION_REQUEST               1
1490
2
#define FT_ACTION_RESPONSE              2
1491
0
#define FT_ACTION_CONFIRM               3
1492
0
#define FT_ACTION_ACK                   4
1493
1494
/* SA Query Action frame codes (IEEE 802.11w-2009, 7.4.9) */
1495
3
#define SA_QUERY_REQUEST                0
1496
0
#define SA_QUERY_RESPONSE               1
1497
1498
/* IEEE Std 802.11z-2010, 7.4.11, Table 7-57v1 */
1499
1
#define TDLS_SETUP_REQUEST              0
1500
40
#define TDLS_SETUP_RESPONSE             1
1501
2
#define TDLS_SETUP_CONFIRM              2
1502
1
#define TDLS_TEARDOWN                   3
1503
1
#define TDLS_PEER_TRAFFIC_INDICATION    4
1504
0
#define TDLS_CHANNEL_SWITCH_REQUEST     5
1505
1
#define TDLS_CHANNEL_SWITCH_RESPONSE    6
1506
0
#define TDLS_PEER_PSM_REQUEST           7
1507
1
#define TDLS_PEER_PSM_RESPONSE          8
1508
0
#define TDLS_PEER_TRAFFIC_RESPONSE      9
1509
0
#define TDLS_DISCOVERY_REQUEST          10
1510
1511
/* IEEE Std 802.11-2012, 8.5.7.1, Table 8-206 */
1512
195
#define RM_ACTION_RADIO_MEASUREMENT_REQUEST         0
1513
40
#define RM_ACTION_RADIO_MEASUREMENT_REPORT          1
1514
9
#define RM_ACTION_LINK_MEASUREMENT_REQUEST          2
1515
5
#define RM_ACTION_LINK_MEASUREMENT_REPORT           3
1516
2
#define RM_ACTION_NEIGHBOR_REPORT_REQUEST           4
1517
228
#define RM_ACTION_NEIGHBOR_REPORT_RESPONSE          5
1518
1519
/* 11s draft 12.0, table 7-57v30 */
1520
#define MESH_ACTION_LINK_METRIC_REPORT              0
1521
#define MESH_ACTION_HWMP                            1
1522
#define MESH_ACTION_GATE_ANNOUNCE                   2
1523
#define MESH_ACTION_CONGESTION_CTL                  3
1524
#define MESH_ACTION_MCCA_SETUP_REQUEST              4
1525
#define MESH_ACTION_MCCA_SETUP_REPLY                5
1526
#define MESH_ACTION_MCCA_ADV_REQUEST                6
1527
#define MESH_ACTION_MCCA_ADV                        7
1528
#define MESH_ACTION_MCCA_TEARDOWN                   8
1529
#define MESH_ACTION_TBTT_ADJ_REQUEST                9
1530
4
#define MESH_ACTION_TBTT_ADJ_RESPONSE              10
1531
1532
/* 11s draft 12.0, table 7-57v42: Multihop Action field values */
1533
#define MULTIHOP_ACTION_PROXY_UPDATE                0
1534
#define MULTIHOP_ACTION_PROXY_UPDATE_CONF           1
1535
1536
/* 11s draft 12.0, table 7-57v24: Self-protected Action field values */
1537
1
#define SELFPROT_ACTION_MESH_PEERING_OPEN           1
1538
0
#define SELFPROT_ACTION_MESH_PEERING_CONFIRM        2
1539
0
#define SELFPROT_ACTION_MESH_PEERING_CLOSE          3
1540
#define SELFPROT_ACTION_MESH_GROUP_KEY_INFORM       4
1541
#define SELFPROT_ACTION_MESH_GROUP_KEY_ACK          5
1542
1543
/* 11s draft 12.0, table 7-43bj6: Mesh Peering Protocol Identifier field values */
1544
#define MESH_PEERING_PROTO_MGMT                     0
1545
#define MESH_PEERING_PROTO_AMPE                     1
1546
#define MESH_PEERING_PROTO_VENDOR                 255
1547
1548
/* Vendor actions */
1549
/* MARVELL */
1550
0
#define MRVL_ACTION_MESH_MANAGEMENT     1
1551
1552
0
#define MRVL_MESH_MGMT_ACTION_RREQ      0
1553
0
#define MRVL_MESH_MGMT_ACTION_RREP      1
1554
0
#define MRVL_MESH_MGMT_ACTION_RERR      2
1555
#define MRVL_MESH_MGMT_ACTION_PLDM      3
1556
1557
0
#define ANQP_INFO_ANQP_QUERY_LIST                256
1558
0
#define ANQP_INFO_ANQP_CAPAB_LIST                257
1559
0
#define ANQP_INFO_VENUE_NAME_INFO                258
1560
#define ANQP_INFO_EMERGENCY_CALL_NUMBER_INFO     259
1561
0
#define ANQP_INFO_NETWORK_AUTH_TYPE_INFO         260
1562
0
#define ANQP_INFO_ROAMING_CONSORTIUM_LIST        261
1563
0
#define ANQP_INFO_IP_ADDR_TYPE_AVAILABILITY_INFO 262
1564
0
#define ANQP_INFO_NAI_REALM_LIST                 263
1565
0
#define ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO     264
1566
#define ANQP_INFO_AP_GEOSPATIAL_LOCATION         265
1567
#define ANQP_INFO_AP_CIVIC_LOCATION              266
1568
#define ANQP_INFO_AP_LOCATION_PUBLIC_ID_URI      267
1569
0
#define ANQP_INFO_DOMAIN_NAME_LIST               268
1570
#define ANQP_INFO_EMERGENCY_ALERT_ID_URI         269
1571
#define ANQP_INFO_TDLS_CAPAB_INFO                270
1572
#define ANQP_INFO_EMERGENCY_NAI                  271
1573
0
#define ANQP_INFO_NEIGHBOR_REPORT                272
1574
#define ANQP_INFO_QUERY_AP_LIST                  273
1575
#define ANQP_INFO_AP_LIST_RESPONSE               274
1576
#define ANQP_INFO_FILS_REALM_INFO                275
1577
#define ANQP_INFO_CAG                            276
1578
0
#define ANQP_INFO_VENUE_URL                      277
1579
0
#define ANQP_INFO_ADVICE_OF_CHARGE               278
1580
#define ANQP_INFO_LOCAL_CONTENT                  279
1581
0
#define ANQP_INFO_NETWORK_AUTH_TYPE_TIMESTAMP    280
1582
0
#define ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST    56797
1583
1584
/* ANQP information ID - IEEE Std 802.11u-2011 - Table 7-43bk */
1585
static const value_string anqp_info_id_vals[] = {
1586
  {ANQP_INFO_ANQP_QUERY_LIST, "ANQP Query list"},
1587
  {ANQP_INFO_ANQP_CAPAB_LIST, "ANQP Capability list"},
1588
  {ANQP_INFO_VENUE_NAME_INFO, "Venue Name information"},
1589
  {ANQP_INFO_EMERGENCY_CALL_NUMBER_INFO, "Emergency Call Number information"},
1590
  {ANQP_INFO_NETWORK_AUTH_TYPE_INFO,
1591
   "Network Authentication Type information"},
1592
  {ANQP_INFO_ROAMING_CONSORTIUM_LIST, "Roaming Consortium list"},
1593
  {ANQP_INFO_IP_ADDR_TYPE_AVAILABILITY_INFO,
1594
   "IP Address Type Availability information"},
1595
  {ANQP_INFO_NAI_REALM_LIST, "NAI Realm list"},
1596
  {ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO, "3GPP Cellular Network information"},
1597
  {ANQP_INFO_AP_GEOSPATIAL_LOCATION, "AP Geospatial Location"},
1598
  {ANQP_INFO_AP_CIVIC_LOCATION, "AP Civic Location"},
1599
  {ANQP_INFO_AP_LOCATION_PUBLIC_ID_URI, "AP Location Public Identifier URI"},
1600
  {ANQP_INFO_DOMAIN_NAME_LIST, "Domain Name list"},
1601
  {ANQP_INFO_EMERGENCY_ALERT_ID_URI, "Emergency Alert Identifier URI"},
1602
  {ANQP_INFO_TDLS_CAPAB_INFO, "TDLS Capability information"},
1603
  {ANQP_INFO_EMERGENCY_NAI, "Emergency NAI"},
1604
  {ANQP_INFO_NEIGHBOR_REPORT, "Neighbor Report"},
1605
  {ANQP_INFO_QUERY_AP_LIST, "Query AP List"},
1606
  {ANQP_INFO_AP_LIST_RESPONSE, "AP List Response"},
1607
  {ANQP_INFO_FILS_REALM_INFO, "FILS Realm Info"},
1608
  {ANQP_INFO_CAG, "CAG"},
1609
  {ANQP_INFO_VENUE_URL, "Venue URL"},
1610
  {ANQP_INFO_ADVICE_OF_CHARGE, "Advice of Charge"},
1611
  {ANQP_INFO_LOCAL_CONTENT, "Local Content"},
1612
  {ANQP_INFO_NETWORK_AUTH_TYPE_TIMESTAMP,
1613
   "Network Authentication Type with Timestamp"},
1614
  {ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST, "ANQP vendor-specific list"},
1615
  {0, NULL}
1616
};
1617
static value_string_ext anqp_info_id_vals_ext = VALUE_STRING_EXT_INIT(anqp_info_id_vals);
1618
1619
/* IEEE 802.11v - WNM Action field values */
1620
enum wnm_action {
1621
  WNM_EVENT_REQ = 0,
1622
  WNM_EVENT_REPORT = 1,
1623
  WNM_DIAGNOSTIC_REQ = 2,
1624
  WNM_DIAGNOSTIC_REPORT = 3,
1625
  WNM_LOCATION_CFG_REQ = 4,
1626
  WNM_LOCATION_CFG_RESP = 5,
1627
  WNM_BSS_TRANS_MGMT_QUERY = 6,
1628
  WNM_BSS_TRANS_MGMT_REQ = 7,
1629
  WNM_BSS_TRANS_MGMT_RESP = 8,
1630
  WNM_FMS_REQ = 9,
1631
  WNM_FMS_RESP = 10,
1632
  WNM_COLLOCATED_INTERFERENCE_REQ = 11,
1633
  WNM_COLLOCATED_INTERFERENCE_REPORT = 12,
1634
  WNM_TFS_REQ = 13,
1635
  WNM_TFS_RESP = 14,
1636
  WNM_TFS_NOTIFY = 15,
1637
  WNM_SLEEP_MODE_REQ = 16,
1638
  WNM_SLEEP_MODE_RESP = 17,
1639
  WNM_TIM_BROADCAST_REQ = 18,
1640
  WNM_TIM_BROADCAST_RESP = 19,
1641
  WNM_QOS_TRAFFIC_CAPAB_UPDATE = 20,
1642
  WNM_CHANNEL_USAGE_REQ = 21,
1643
  WNM_CHANNEL_USAGE_RESP = 22,
1644
  WNM_DMS_REQ = 23,
1645
  WNM_DMS_RESP = 24,
1646
  WNM_TIMING_MEASUREMENT_REQ = 25,
1647
  WNM_NOTIFICATION_REQ = 26,
1648
  WNM_NOTIFICATION_RESP = 27
1649
};
1650
1651
static const value_string wnm_action_codes[] = {
1652
  { WNM_EVENT_REQ, "Event Request" },
1653
  { WNM_EVENT_REPORT, "Event Report" },
1654
  { WNM_DIAGNOSTIC_REQ, "Diagnostic Request" },
1655
  { WNM_DIAGNOSTIC_REPORT, "Diagnostic Report" },
1656
  { WNM_LOCATION_CFG_REQ, "Location Configuration Request" },
1657
  { WNM_LOCATION_CFG_RESP, "Location Configuration Response" },
1658
  { WNM_BSS_TRANS_MGMT_QUERY, "BSS Transition Management Query" },
1659
  { WNM_BSS_TRANS_MGMT_REQ, "BSS Transition Management Request" },
1660
  { WNM_BSS_TRANS_MGMT_RESP, "BSS Transition Management Response" },
1661
  { WNM_FMS_REQ, "FMS Request" },
1662
  { WNM_FMS_RESP, "FMS Response" },
1663
  { WNM_COLLOCATED_INTERFERENCE_REQ, "Collocated Interference Request" },
1664
  { WNM_COLLOCATED_INTERFERENCE_REPORT, "Collocated Interference Report" },
1665
  { WNM_TFS_REQ, "TFS Request" },
1666
  { WNM_TFS_RESP, "TFS Response" },
1667
  { WNM_TFS_NOTIFY, "TFS Notify" },
1668
  { WNM_SLEEP_MODE_REQ, "WNM-Sleep Mode Request" },
1669
  { WNM_SLEEP_MODE_RESP, "WNM-Sleep Mode Response" },
1670
  { WNM_TIM_BROADCAST_REQ, "TIM Broadcast Request" },
1671
  { WNM_TIM_BROADCAST_RESP, "TIM Broadcast Response" },
1672
  { WNM_QOS_TRAFFIC_CAPAB_UPDATE, "QoS Traffic Capability Update" },
1673
  { WNM_CHANNEL_USAGE_REQ, "Channel Usage Request" },
1674
  { WNM_CHANNEL_USAGE_RESP, "Channel Usage Response" },
1675
  { WNM_DMS_REQ, "DMS Request" },
1676
  { WNM_DMS_RESP, "DMS Response" },
1677
  { WNM_TIMING_MEASUREMENT_REQ, "Timing Measurement Request" },
1678
  { WNM_NOTIFICATION_REQ, "WNM-Notification Request" },
1679
  { WNM_NOTIFICATION_RESP, "WNM-Notification Response" },
1680
  { 0, NULL }
1681
};
1682
static value_string_ext wnm_action_codes_ext = VALUE_STRING_EXT_INIT(wnm_action_codes);
1683
1684
enum unprotected_wnm_action {
1685
  UNPROTECTED_WNM_TIM = 0,
1686
  UNPROTECTED_WNM_TIMING_MEASUREMENT = 1
1687
};
1688
1689
static const value_string unprotected_wnm_action_codes[] = {
1690
  { UNPROTECTED_WNM_TIM, "TIM" },
1691
  { UNPROTECTED_WNM_TIMING_MEASUREMENT, "Timing Measurement" },
1692
  { 0, NULL }
1693
};
1694
static value_string_ext unprotected_wnm_action_codes_ext = VALUE_STRING_EXT_INIT(unprotected_wnm_action_codes);
1695
1696
static const value_string wnm_notification_types[] = {
1697
  { 0, "Firmware Update Notification" },
1698
  { 1, "Reserved for use by WFA" },
1699
  { 221, "Vendor Specific" },
1700
  { 0, NULL }
1701
};
1702
1703
static value_string_ext wnm_notification_types_ext =
1704
  VALUE_STRING_EXT_INIT(wnm_notification_types);
1705
1706
static const range_string wnm_notification_response_code[] = {
1707
  { 0, 0, "Notification Acknowledged" },
1708
  { 1, 255, "Reserved" },
1709
  { 0, 0, NULL }
1710
};
1711
1712
/*** End: Action Fixed Parameter ***/
1713
1714
static const value_string ieee80211_tag_measure_request_type_flags[] = {
1715
  {0x00, "Basic Request"},
1716
  {0x01, "Clear Channel Assessment (CCA) Request"},
1717
  {0x02, "Receive Power Indication (RPI) Histogram Request"},
1718
  {0x03, "Channel Load Request"},
1719
  {0x04, "Noise Histogram Request"},
1720
  {0x05, "Beacon Request"},
1721
  {0x06, "Frame Request"},
1722
  {0x07, "STA Statistics Request"},
1723
  {0x08, "Location Configuration Indication (LCI) Request"},
1724
  {0x09, "Transmit Stream Measurement Request"},
1725
  {0x0a, "Multicast Diagnostics Request"},
1726
  {0x0b, "Location Civic Request"},
1727
  {0x0c, "Location Identifier Request"},
1728
  {0x0d, "Directional Channel Quality Request"},
1729
  {0x0e, "Directional Measurement Request"},
1730
  {0x0f, "Directional Statistics Request"},
1731
  {0x10, "Fine Timing Measurement Range Request"},
1732
  {0xFF, "Measurement Pause Request"},
1733
  {0x00, NULL}
1734
};
1735
static value_string_ext ieee80211_tag_measure_request_type_flags_ext =
1736
  VALUE_STRING_EXT_INIT(ieee80211_tag_measure_request_type_flags);
1737
1738
static const value_string ieee80211_tag_measure_report_type_flags[] = {
1739
  { 0x00, "Basic Report" },
1740
  { 0x01, "Clear Channel Assessment (CCA) Report" },
1741
  { 0x02, "Receive Power Indication (RPI) Histogram Report" },
1742
  { 0x03, "Channel Load Report" },
1743
  { 0x04, "Noise Histogram Report" },
1744
  { 0x05, "Beacon Report" },
1745
  { 0x06, "Frame Report" },
1746
  { 0x07, "STA Statistics Report" },
1747
  { 0x08, "Location Configuration Information (LCI) Report" },
1748
  { 0x09, "Transmit Stream Measurement Report" },
1749
  { 0x0a, "Multicast Diagnostics Report"},
1750
  { 0x0b, "Location Civic Report"},
1751
  { 0x0c, "Location Identifier Report"},
1752
  { 0x0d, "Directional Channel Quality Report"},
1753
  { 0x0e, "Directional Measurement Report"},
1754
  { 0x0f, "Directional Statistics Report"},
1755
  { 0x10, "Fine Timing Measurement Range Report"},
1756
  { 0x00, NULL }
1757
};
1758
static value_string_ext ieee80211_tag_measure_report_type_flags_ext =
1759
  VALUE_STRING_EXT_INIT(ieee80211_tag_measure_report_type_flags);
1760
1761
static const true_false_string ieee80211_tag_measure_report_frame_info_frame_type_flag = {
1762
  "Measurement Pilot Frame",
1763
  "Beacon/Probe Response Frame"
1764
};
1765
1766
static const true_false_string ig_tfs = {
1767
  "Group address (multicast/broadcast)",
1768
  "Individual address (unicast)"
1769
};
1770
1771
static const true_false_string lg_tfs = {
1772
  "Locally administered address (this is NOT the factory default)",
1773
  "Globally unique address (factory default)"
1774
};
1775
1776
static const true_false_string ieee80211_tag_measure_map_field_bss_flag = {
1777
  "At least one valid MPDU was received by another BSS or IBSS during the measurement period.",
1778
  "No valid MPDUs were received from another BSS or IBSS during the measurement period."
1779
};
1780
1781
static const value_string ieee80211_tag_measure_request_measurement_mode_flags[] = {
1782
  { 0x00, "Passive" },
1783
  { 0x01, "Active" },
1784
  { 0x02, "Beacon Table" },
1785
  { 0x00, NULL }
1786
};
1787
1788
467
#define MEASURE_REQ_BEACON_SUB_SSID 0
1789
98
#define MEASURE_REQ_BEACON_SUB_BRI 1
1790
43
#define MEASURE_REQ_BEACON_SUB_RD 2
1791
22
#define MEASURE_REQ_BEACON_SUB_REQUEST 10
1792
54
#define MEASURE_REQ_BEACON_SUB_REQUEST_EXT 11
1793
5
#define MEASURE_REQ_BEACON_SUB_APCP 51
1794
12
#define MEASURE_REQ_BEACON_SUB_WIDE_BW_CHANNEL_SWITCH 163
1795
84
#define MEASURE_REQ_BEACON_SUB_LAST_REPORT_REQ 164
1796
#define MEASURE_REQ_BEACON_SUB_VS 221
1797
1798
static const value_string ieee80211_tag_measure_request_beacon_sub_id_flags[] = {
1799
  { MEASURE_REQ_BEACON_SUB_SSID, "SSID" },
1800
  { MEASURE_REQ_BEACON_SUB_BRI, "Beacon Reporting Information" },
1801
  { MEASURE_REQ_BEACON_SUB_RD, "Reporting Detail" },
1802
  { MEASURE_REQ_BEACON_SUB_REQUEST, "Request" },
1803
  { MEASURE_REQ_BEACON_SUB_REQUEST_EXT, "Extended Request" },
1804
  { MEASURE_REQ_BEACON_SUB_APCP, "AP Channel Report" },
1805
  { MEASURE_REQ_BEACON_SUB_WIDE_BW_CHANNEL_SWITCH, "Wide Channel Bandwidth Switch" },
1806
  { MEASURE_REQ_BEACON_SUB_LAST_REPORT_REQ, "Last Beacon Report Indication Request" },
1807
  { MEASURE_REQ_BEACON_SUB_VS, "Vendor Specific" },
1808
  { 0x00, NULL}
1809
};
1810
1811
static const value_string ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition_flags[] = {
1812
  { 0x00, "Report to be issued after each measurement." },
1813
  { 0x01, "The measured RCPI level is greater than an absolute threshold." },
1814
  { 0x02, "The measured RCPI level is less than an absolute threshold." },
1815
  { 0x03, "The measured RSNI level is greater than an absolute threshold." },
1816
  { 0x04, "The measured RSNI level is less than an absolute threshold." },
1817
  { 0x05, "The measured RCPI level is greater than a threshold defined by an offset from the serving AP's reference RCPI." },
1818
  { 0x06, "The measured RCPI level is less than a threshold defined by an offset from the serving AP's reference RCPI." },
1819
  { 0x07, "The measured RSNI level is greater than a threshold defined by an offset from the serving AP's reference RSNI." },
1820
  { 0x08, "The measured RSNI level is less than a threshold defined by an offset from the serving AP's reference RSNI." },
1821
  { 0x09, "The measured RCPI level is in a range bound by the serving AP's reference RCPI and an offset from the serving AP's reference RCPI." },
1822
  { 0x0a, "The measured RSNI level is in a range bound by the serving AP's reference RSNI and an offset from the serving AP's reference RSNI." },
1823
  { 0xfe, "Report not required to be issued" },
1824
  { 0x00, NULL }
1825
};
1826
1827
static const value_string ieee80211_tag_measure_request_beacon_sub_reporting_detail_flags[] = {
1828
  { 0, "No fixed length fields or elements" },
1829
  { 1, "All fixed length fields and any requested elements in the Request information element if present" },
1830
  { 2, "All fixed length fields and elements (default, used when Reporting Detail subelement is not included in Beacon Request" },
1831
  { 0x00, NULL }
1832
};
1833
1834
static const value_string ieee80211_tag_measure_request_group_id_flags[] = {
1835
  { 0x00, "STA Counters from dot11CountersTable" },
1836
  { 0x01, "STA Counters from dot11MacStatistics group" },
1837
  { 0x02, "QoS STA Counters for UP0 from dot11QosCountersTable" },
1838
  { 0x03, "QoS STA Counters for UP1 from dot11QosCountersTable" },
1839
  { 0x04, "QoS STA Counters for UP2 from dot11QosCountersTable" },
1840
  { 0x05, "QoS STA Counters for UP3 from dot11QosCountersTable" },
1841
  { 0x06, "QoS STA Counters for UP4 from dot11QosCountersTable" },
1842
  { 0x07, "QoS STA Counters for UP5 from dot11QosCountersTable" },
1843
  { 0x08, "QoS STA Counters for UP6 from dot11QosCountersTable" },
1844
  { 0x09, "QoS STA Counters for UP7 from dot11QosCountersTable" },
1845
  { 0x0a, "BSS Average Access Delays" },
1846
  { 0x0b, "STA Counters from dot11A-MSDU Group" },
1847
  { 0x0c, "STA Counters from dot11A-MPDU Group" },
1848
  { 0x0d, "STA Counters from dot11 BAR, Channel Width, PSMP Group" },
1849
  { 0x0e, "STA Counters from dot11Protection Group" },
1850
  { 0x0f, "STBC Group" },
1851
  { 0x00, NULL }
1852
};
1853
static value_string_ext ieee80211_tag_measure_request_group_id_flags_ext =
1854
  VALUE_STRING_EXT_INIT(ieee80211_tag_measure_request_group_id_flags);
1855
1856
static const value_string ieee80211_tag_measure_request_location_subject[] = {
1857
  { 0, "Local" },
1858
  { 1, "Remote" },
1859
  { 2, "Third party" },
1860
  { 0x00, NULL }
1861
};
1862
1863
static const value_string ieee80211_tag_measure_request_civic_location_type[] = {
1864
  { 0, "IETF RFC 4776" },
1865
  { 1, "Vendor Specific" },
1866
  { 0x00, NULL }
1867
};
1868
1869
static const value_string ieee80211_tclas_process_flag[] = {
1870
  {0x00, "Incoming MSDU's higher layer parameters have to match to the parameters in all associated TCLAS elements."},
1871
  {0x01, "Incoming MSDU's higher layer parameters have to match to at least one of the associated TCLAS elements."},
1872
  {0x02, "Incoming MSDU's that do not belong to any other TS are classified to the TS for which this TCLAS Processing element is used. In this case, there will not be any associated TCLAS elements."},
1873
  {0, NULL}
1874
};
1875
1876
1877
48
#define MEASURE_REQ_CHANNEL_LOAD_SUB_REPORTING_INFO 1
1878
1879
static const value_string ieee80211_tag_measure_request_channel_load_sub_id_vals[] = {
1880
  { MEASURE_REQ_CHANNEL_LOAD_SUB_REPORTING_INFO, "Channel Load Reporting Information" },
1881
  { 221, "Vendor Specific" },
1882
  { 0x00, NULL}
1883
};
1884
1885
static const value_string ieee80211_tag_measure_request_channel_load_sub_reporting_condition_vals[] = {
1886
  { 0x00, "Report to be issued after each measurement (default, used when Channel Load Reporting Information subelement is not included in Channel Load Request)." },
1887
  { 0x01, "Report to be issued when measured Channel Load is equal to or greater than the reference value." },
1888
  { 0x02, "Report to be issued when measured Channel Load is equal to or less than the reference value." },
1889
  { 0x00, NULL}
1890
};
1891
1892
39
#define MEASURE_REQ_NOISE_HISTOGRAM_SUB_REPORTING_INFO 1
1893
1894
static const value_string ieee80211_tag_measure_request_noise_histogram_sub_id_vals[] = {
1895
  { MEASURE_REQ_NOISE_HISTOGRAM_SUB_REPORTING_INFO, "Noise Histogram Reporting Information" },
1896
  { 221, "Vendor Specific" },
1897
  { 0x00, NULL}
1898
};
1899
1900
static const value_string ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition_vals[] = {
1901
  { 0x00, "Report to be issued after each measurement (default, used when Noise Histogram Reporting Information subelement is not included in Noise Histogram Request)." },
1902
  { 0x01, "Noise Histogram Report to be issued when measured ANPI is equal to or greater than the reference value." },
1903
  { 0x02, "Noise Histogram Report to be issued when measured ANPI is equal to or less than the reference value." },
1904
  { 0x00, NULL}
1905
};
1906
1907
30
#define MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY 1
1908
44
#define MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY_FRAG_ID 2
1909
0
#define MEASURE_REP_BEACON_SUB_WIDE_BW_CHANNEL_SWITCH 163
1910
1
#define MEASURE_REP_BEACON_SUB_LAST_REPORT_INDICATION 164
1911
1912
static const value_string ieee80211_tag_measure_report_beacon_sub_id_vals[] = {
1913
  { MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY, "Reported Frame Body" },
1914
  { MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY_FRAG_ID, "Reported Frame Body Fragment ID" },
1915
  { MEASURE_REP_BEACON_SUB_WIDE_BW_CHANNEL_SWITCH, "Wide Bandwidth Channel Switch"},
1916
  { MEASURE_REP_BEACON_SUB_LAST_REPORT_INDICATION, "Last Beacon Report Indication"},
1917
  { 221, "Vendor Specific" },
1918
  { 0x00, NULL}
1919
};
1920
1921
111
#define MEASURE_REP_LCI_SUB_REPORTED_LCI 0
1922
#define MEASURE_REP_LCI_SUB_REPORTED_AZIMUTH_REPORT 1
1923
#define MEASURE_REP_LCI_SUB_REPORTED_OR_STA 2
1924
#define MEASURE_REP_LCI_SUB_REPORTED_T_MAC 3
1925
6
#define MEASURE_REP_LCI_SUB_REPORTED_Z 4
1926
#define MEASURE_REP_LCI_SUB_REPORTED_RLE 5
1927
18
#define MEASURE_REP_LCI_SUB_REPORTED_URP 6
1928
#define MEASURE_REP_LCI_SUB_REPORTED_CO_BSSID 7
1929
1930
static const value_string ieee80211_tag_measure_report_lci_sub_id_vals[] = {
1931
  { MEASURE_REP_LCI_SUB_REPORTED_LCI, "LCI" },
1932
  { MEASURE_REP_LCI_SUB_REPORTED_AZIMUTH_REPORT, "Azimuth Report" },
1933
  { MEASURE_REP_LCI_SUB_REPORTED_OR_STA, "Originator Requesting STA MAC Address" },
1934
  { MEASURE_REP_LCI_SUB_REPORTED_T_MAC, "Target MAC Address" },
1935
  { MEASURE_REP_LCI_SUB_REPORTED_Z, "Z" },
1936
  { MEASURE_REP_LCI_SUB_REPORTED_RLE, "Relative Location Error" },
1937
  { MEASURE_REP_LCI_SUB_REPORTED_URP, "Usage Rules/Policy" },
1938
  { MEASURE_REP_LCI_SUB_REPORTED_CO_BSSID, "Co-Located BSSID List" },
1939
  { 221, "Vendor Specific" },
1940
  { 0x00, NULL}
1941
};
1942
1943
155
#define MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_CIVIC 0
1944
#define MEASURE_REP_CIVIC_SUB_REPORTED_OR_STA 1
1945
#define MEASURE_REP_CIVIC_SUB_REPORTED_T_MAC 2
1946
#define MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_REFERENCE 3
1947
#define MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_SHAPE 4
1948
#define MEASURE_REP_CIVIC_SUB_REPORTED_MAP_IMAGE 5
1949
#define MEASURE_REP_CIVIC_SUB_REPORTED_RESERVED 6
1950
#define MEASURE_REP_CIVIC_SUB_REPORTED_CO_BSSID 7
1951
1952
static const value_string ieee80211_tag_measure_report_civic_sub_id_vals[] = {
1953
  { MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_CIVIC, "Location Civic" },
1954
  { MEASURE_REP_CIVIC_SUB_REPORTED_OR_STA, "Originator Requesting STA MAC Address" },
1955
  { MEASURE_REP_CIVIC_SUB_REPORTED_T_MAC, "Target MAC Address" },
1956
  { MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_REFERENCE, "Location Reference" },
1957
  { MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_SHAPE, "Location Shape" },
1958
  { MEASURE_REP_CIVIC_SUB_REPORTED_MAP_IMAGE, "Map Image" },
1959
  { MEASURE_REP_CIVIC_SUB_REPORTED_RESERVED, "Reserved" },
1960
  { MEASURE_REP_CIVIC_SUB_REPORTED_CO_BSSID, "Co-Located BSSID List" },
1961
  { 221, "Vendor Specific" },
1962
  { 0x00, NULL}
1963
};
1964
1965
static const value_string frame_type[] = {
1966
  {MGT_FRAME,       "Management frame"},
1967
  {CONTROL_FRAME,   "Control frame"},
1968
  {DATA_FRAME,      "Data frame"},
1969
  {EXTENSION_FRAME, "Extension frame"},
1970
  {0,               NULL}
1971
};
1972
1973
static const value_string tofrom_ds[] = {
1974
  {0,                     "Not leaving DS or network is operating "
1975
    "in AD-HOC mode (To DS: 0 From DS: 0)"},
1976
  {FLAG_TO_DS,            "Frame from STA to DS via an AP (To DS: 1 "
1977
    "From DS: 0)"},
1978
  {FLAG_FROM_DS,          "Frame from DS to a STA via AP(To DS: 0 "
1979
    "From DS: 1)"},
1980
  {FLAG_TO_DS|FLAG_FROM_DS, "WDS (AP to AP) or Mesh (MP to MP) Frame "
1981
    "(To DS: 1 From DS: 1)"},
1982
  {0, NULL}
1983
};
1984
1985
static const true_false_string tods_flag = {
1986
  "Frame is entering DS",
1987
  "Frame is not entering DS"
1988
};
1989
1990
static const true_false_string fromds_flag = {
1991
  "Frame is exiting DS",
1992
  "Frame is not exiting DS"
1993
};
1994
1995
static const true_false_string more_fragments = {
1996
  "More fragments follow",
1997
  "This is the last fragment"
1998
};
1999
2000
static const true_false_string retry_flags = {
2001
  "Frame is being retransmitted",
2002
  "Frame is not being retransmitted"
2003
};
2004
2005
static const true_false_string s1g_dynamic_indication_flags = {
2006
  "Dynamic",
2007
  "Static"
2008
};
2009
2010
static const true_false_string pm_flags = {
2011
  "STA will go to sleep",
2012
  "STA will stay up"
2013
};
2014
2015
static const true_false_string md_flags = {
2016
  "Data is buffered for STA at AP",
2017
  "No data buffered"
2018
};
2019
2020
static const true_false_string protected_flags = {
2021
  "Data is protected",
2022
  "Data is not protected"
2023
};
2024
2025
static const true_false_string order_flags = {
2026
  "Strictly ordered",
2027
  "Not strictly ordered"
2028
};
2029
2030
static const true_false_string cf_ess_flags = {
2031
  "Transmitter is an AP",
2032
  "Transmitter is a STA"
2033
};
2034
2035
2036
static const true_false_string cf_privacy_flags = {
2037
  "Data confidentiality required",
2038
  "Data confidentiality not required"
2039
};
2040
2041
static const true_false_string cf_ibss_flags = {
2042
  "Transmitter belongs to an IBSS",
2043
  "Transmitter belongs to a BSS"
2044
};
2045
2046
static const true_false_string eosp_flag = {
2047
  "End of service period",
2048
  "Service period"
2049
};
2050
2051
static const true_false_string bit4_flag = {
2052
  "Bits 8-15 of QoS Control field are Queue Size",
2053
  "Bits 8-15 of QoS Control field are TXOP Duration Requested"
2054
};
2055
2056
static const true_false_string ieee80211_qos_amsdu_present_flag = {
2057
  "A-MSDU",
2058
  "MSDU"
2059
};
2060
2061
static const true_false_string csa_txrestrict_flags = {
2062
  "Tx Restrict",
2063
  "No Tx Restrict"
2064
};
2065
2066
static const true_false_string csa_initiator_flags = {
2067
  "Initiator",
2068
  "Non Initiator"
2069
};
2070
2071
static const true_false_string mesh_config_cap_power_save_level_flags = {
2072
   "At least one of the peer-specific mesh power modes is deep sleep mode",
2073
   "None of the peer-specific mesh power modes is deep sleep mode"
2074
};
2075
2076
static const true_false_string ieee80211_qos_mesh_ps = {
2077
  "deep sleep mode",
2078
  "light sleep mode"
2079
};
2080
2081
#define AUTH_ALG_OPEN                   0
2082
#define AUTH_ALG_SHARED                 1
2083
#define AUTH_ALG_FAST_BSS_TRANS         2
2084
14
#define AUTH_ALG_SAE                    3
2085
#define AUTH_ALG_FILS_SK_WITHOUT_PFS    4
2086
4
#define AUTH_ALG_FILS_SK_WITH_PFS       5
2087
2
#define AUTH_ALG_FILS_PK                6
2088
0
#define AUTH_ALG_PASN                   7
2089
#define AUTH_ALG_NETWORK_EAP         0x80
2090
2091
static const value_string auth_alg[] = {
2092
  {AUTH_ALG_OPEN,                "Open System"},
2093
  {AUTH_ALG_SHARED,              "Shared key"},
2094
  {AUTH_ALG_FAST_BSS_TRANS,      "Fast BSS Transition"},
2095
  {AUTH_ALG_SAE,                 "Simultaneous Authentication of Equals (SAE)"},
2096
  {AUTH_ALG_FILS_SK_WITHOUT_PFS, "FILS Shared Key authentication without PFS"},
2097
  {AUTH_ALG_FILS_SK_WITH_PFS,    "FILS Shared Key authentication with PFS"},
2098
  {AUTH_ALG_FILS_PK,             "FILS Public Key authentication"},
2099
  {AUTH_ALG_PASN,                "Pre-Association Security Negotiation (PASN)"},
2100
  {AUTH_ALG_NETWORK_EAP,         "Network EAP"},  /* Cisco proprietary? */
2101
  {0, NULL}
2102
};
2103
2104
/* IANA - Internet Key Exchange (IKE) Attributes - Group Description (https://www.iana.org/assignments/ipsec-registry/ipsec-registry.xhtml) */
2105
static const value_string ff_finite_cyclic_group_vals[] = {
2106
  { 1, "default 768-bit MODP group"},
2107
  { 2, "alternate 1024-bit MODP group"},
2108
  { 3, "EC2N group on GP[2^155]"},
2109
  { 4, "EC2N group on GP[2^185]"},
2110
  { 5, "1536-bit MODP group"},
2111
  {14, "2048-bit MODP group"},
2112
  {15, "3072-bit MODP group"},
2113
  {16, "4096-bit MODP group"},
2114
  {17, "6144-bit MODP group"},
2115
  {18, "8192-bit MODP group"},
2116
  {19, "256-bit random ECP group"},
2117
  {20, "384-bit random ECP group"},
2118
  {21, "521-bit random ECP group"},
2119
  {22, "1024-bit MODP Group with 160-bit Prime Order Subgroup"},
2120
  {23, "2048-bit MODP Group with 224-bit Prime Order Subgroup"},
2121
  {24, "2048-bit MODP Group with 256-bit Prime Order Subgroup"},
2122
  {25, "192-bit Random ECP Group"},
2123
  {26, "224-bit Random ECP Group"},
2124
  {27, "224-bit Brainpool ECP group"},
2125
  {28, "256-bit Brainpool ECP group"},
2126
  {29, "384-bit Brainpool ECP group"},
2127
  {30, "512-bit Brainpool ECP group"},
2128
  {0, NULL}
2129
};
2130
2131
static const true_false_string ff_block_ack_params_amsdu_permitted_flag = {
2132
  "Permitted in QoS Data MPDUs",
2133
  "Not Permitted"
2134
};
2135
2136
static const true_false_string ff_block_ack_params_policy_flag = {
2137
  "Immediate Block Ack",
2138
  "Delayed Block Ack"
2139
};
2140
2141
static const value_string  ff_channel_width_vals[] = {
2142
  {0x00, "20 MHz channel width only"},
2143
  {0x01, "Any channel width in the STA's Supported Channel Width Set"},
2144
  {0, NULL}
2145
};
2146
2147
static const true_false_string ff_qos_info_ap_q_ack_flag = {
2148
  "APs MIB attribute dot11QAckOptionImplemented is true",
2149
  "APs MIB attribute dot11QAckOptionImplemented is false"
2150
};
2151
2152
static const true_false_string ff_qos_info_ap_queue_req_flag = {
2153
  "AP can process a nonzero Queue Size subfield in the QoS Control field in QoS data frames",
2154
  "AP cannot process a nonzero Queue Size subfield in the QoS Control field in QoS data frames"
2155
};
2156
2157
static const true_false_string ff_qos_info_ap_txop_request_flag = {
2158
  "AP can process a nonzero TXOP Duration Requested subfield in the QoS Control field in QoS data frames",
2159
  "AP cannot process a nonzero TXOP Duration Requested subfield in the QoS Control field in QoS data frames"
2160
};
2161
2162
static const true_false_string ff_qos_info_sta_ac_flag = {
2163
  "Trigger-enabled and Delivery-enabled",
2164
  "Neither Trigger-enabled nor Delivery-enabled"
2165
};
2166
2167
static const true_false_string ff_qos_info_sta_q_ack_flag = {
2168
  "STAs MIB attribute dot11QAckOptionImplemented is true",
2169
  "STAs MIB attribute dot11QAckOptionImplemented is false"
2170
};
2171
2172
static const value_string ff_qos_info_sta_max_sp_len_flags[] = {
2173
  {0x00, "AP may deliver all buffered MSDUs, A-MSDUs and MMPDUs"},
2174
  {0x01, "AP may deliver a maximum of two MSDUs, A-MSDUs and MMPDUs per SP"},
2175
  {0x02, "AP may deliver a maximum of four MSDUs, A-MSDUs and MMPDUs per SP"},
2176
  {0x03, "AP may deliver a maximum of six MSDUs, A-MSDUs and MMPDUs per SP"},
2177
  {0, NULL}
2178
};
2179
2180
static const true_false_string ff_qos_info_sta_more_data_ack_flag = {
2181
  "STA can process ACK frames with the More Data bit in the Frame Control field set to 1 and will remain in the wake state",
2182
  "STA cannot process ACK frames with the More Data bit in the Frame Control field set to 1"
2183
};
2184
2185
static const true_false_string ff_sm_pwr_save_sm_mode_flag = {
2186
  "Dynamic SM Power Save mode",
2187
  "Static SM Power Save mode"
2188
};
2189
2190
static const true_false_string ff_pco_phase_cntrl_flag = {
2191
  "40 MHz Phase",
2192
  "20 MHz Phase"
2193
};
2194
2195
static const true_false_string ff_psmp_param_set_more_psmp_flag = {
2196
  "More PSMP Sequences Follow",
2197
  "No PSMP Sequences Follow"
2198
};
2199
2200
static const value_string ff_mimo_cntrl_nc_index_flags[] = {
2201
  {0x00, "1 Column"},
2202
  {0x01, "2 Columns"},
2203
  {0x02, "3 Columns"},
2204
  {0x03, "4 Columns"},
2205
  {0, NULL}
2206
};
2207
2208
static const value_string ff_mimo_cntrl_nr_index_flags[] = {
2209
  {0x00, "1 Row"},
2210
  {0x01, "2 Rows"},
2211
  {0x02, "3 Rows"},
2212
  {0x03, "4 Rows"},
2213
  {0, NULL}
2214
};
2215
2216
static const true_false_string ff_mimo_cntrl_channel_width_flag = {
2217
  "40 MHz",
2218
  "20 MHz"
2219
};
2220
2221
static const true_false_string ff_ht_info_information_request_flag = {
2222
  "Requesting HT Information Exchange management action frame",
2223
  "Should not send an HT Information Exchange management action frame"
2224
};
2225
2226
static const true_false_string ff_ht_info_40_mhz_intolerant_flag = {
2227
  "Transmitting station is intolerant of 40 MHz operation",
2228
  "Transmitting station permits 40 MHz operation"
2229
};
2230
2231
static const true_false_string ff_ht_info_sta_chan_width_flag = {
2232
  "40 MHz",
2233
  "20 MHz"
2234
};
2235
2236
static const value_string ff_ht_action_flags[] = {
2237
  {HT_ACTION_NOTIFY_CHAN_WIDTH,           "Notify Channel Width"},
2238
  {HT_ACTION_SM_PWR_SAVE,                 "Spatial Multiplexing (SM) Power Save"},
2239
  {HT_ACTION_PSMP_ACTION,                 "Power Save Multi-Poll (PSMP) action frame"},
2240
  {HT_ACTION_SET_PCO_PHASE,               "Set PCO Phase"},
2241
  {HT_ACTION_MIMO_CSI,                    "MIMO CSI Matrices"},
2242
  {HT_ACTION_MIMO_BEAMFORMING,            "MIMO Non-compressed Beamforming"},
2243
  {HT_ACTION_MIMO_COMPRESSED_BEAMFORMING, "MIMO Compressed Beamforming"},
2244
  {HT_ACTION_ANT_SEL_FEEDBACK,            "Antenna Selection Indices Feedback"},
2245
  {HT_ACTION_HT_INFO_EXCHANGE,            "HT Information Exchange"},
2246
  {0x00, NULL}
2247
};
2248
2249
static const value_string ff_fst_action_flags[] = {
2250
  {FST_SETUP_REQUEST,             "FST Setup Request"},
2251
  {FST_SETUP_RESPONSE,            "FST Setup Response"},
2252
  {FST_TEAR_DOWN,                 "FST Tear Down"},
2253
  {FST_ACK_REQUEST,               "FST Ack Request"},
2254
  {FST_ACK_RESPONSE,              "FST Ack Response"},
2255
  {FST_ON_CHANNEL_TUNNEL_REQUEST, "FST On-channel Tunnel Request"},
2256
  {0x00, NULL}
2257
};
2258
2259
static const value_string ff_robust_av_streaming_action_flags[] = {
2260
  {ROBUST_AV_STREAMING_SCS_REQUEST,          "SCS Request"},
2261
  {ROBUST_AV_STREAMING_SCS_RESPONSE,         "SCS Response"},
2262
  {ROBUST_AV_STREAMING_GROUP_MEMBERSHIP_REQ, "Group Membership Request"},
2263
  {ROBUST_AV_STREAMING_GROUP_MEMBERSHIP_RSP, "Group Membership Response"},
2264
  {ROBUST_AV_STREAMING_MSCS_REQUEST,         "MSCS Request"},
2265
  {ROBUST_AV_STREAMING_MSCS_RESPONSE,        "MSCS Response"},
2266
  {0x00, NULL}
2267
};
2268
2269
static const value_string ff_dmg_action_flags[] = {
2270
  {DMG_ACTION_PWR_SAVE_CONFIG_REQ,           "Power Save Configuration Request"},
2271
  {DMG_ACTION_PWR_SAVE_CONFIG_RES,           "Power Save Configuration Response"},
2272
  {DMG_ACTION_INFO_REQ,                      "Information Request"},
2273
  {DMG_ACTION_INFO_RES,                      "Information Response"},
2274
  {DMG_ACTION_HANDOVER_REQ,                  "Handover Request"},
2275
  {DMG_ACTION_HANDOVER_RES,                  "Handover Response"},
2276
  {DMG_ACTION_DTP_REQ,                       "DTP Request"},
2277
  {DMG_ACTION_DTP_RES,                       "DTP Response"},
2278
  {DMG_ACTION_RELAY_SEARCH_REQ,              "Relay Search Request"},
2279
  {DMG_ACTION_RELAY_SEARCH_RES,              "Relay Search Response"},
2280
  {DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_REQ, "Multi Relay Channel Measurement Request"},
2281
  {DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_RES, "Multi Relay Channel Measurement Response"},
2282
  {DMG_ACTION_RLS_REQ,                       "RLS Request"},
2283
  {DMG_ACTION_RLS_RES,                       "RLS Response"},
2284
  {DMG_ACTION_RLS_ANNOUNCE,                  "RLS Announcement"},
2285
  {DMG_ACTION_RLS_TEARDOWN,                  "RLS Teardown"},
2286
  {DMG_ACTION_RELAY_ACK_REQ,                 "Relay ACK Request"},
2287
  {DMG_ACTION_RELAY_ACK_RES,                 "Relay ACK Response"},
2288
  {DMG_ACTION_TPA_REQ,                       "TPA Request"},
2289
  {DMG_ACTION_TPA_RES,                       "TPA Response"},
2290
  {DMG_ACTION_TPA_REP,                       "TPA Report"},
2291
  {DMG_ACTION_ROC_REQ,                       "ROC Request"},
2292
  {DMG_ACTION_ROC_RES,                       "ROC Response"},
2293
  {0x00, NULL}
2294
};
2295
2296
static const value_string ff_unprotected_dmg_action_flags[] = {
2297
  {UNPROTECTED_DMG_ANNOUNCE,      "Announce"},
2298
  {UNPROTECTED_DMG_BRP,           "BRP"},
2299
  {0x00, NULL}
2300
};
2301
static const value_string ff_mimo_cntrl_grouping_flags[] = {
2302
  {0x00, "No Grouping"},
2303
  {0x01, "Carrier Groups of 2"},
2304
  {0x02, "Carrier Groups of 4"},
2305
  {0x03, "Reserved"},
2306
  {0, NULL}
2307
};
2308
2309
static const value_string ff_mimo_cntrl_coefficient_size_flags[] = {
2310
  {0x00, "4 Bits"},
2311
  {0x01, "5 Bits"},
2312
  {0x02, "6 Bits"},
2313
  {0x03, "8 Bits"},
2314
  {0, NULL}
2315
};
2316
2317
static const value_string ff_mimo_cntrl_codebook_info_flags[] = {
2318
  {0x00, "1 bit for 'Capital Psi', 3 bits for 'Small Psi'"},
2319
  {0x01, "2 bit for 'Capital Psi', 4 bits for 'Small Psi'"},
2320
  {0x02, "3 bit for 'Capital Psi', 5 bits for 'Small Psi'"},
2321
  {0x03, "4 bit for 'Capital Psi', 6 bits for 'Small Psi'"},
2322
  {0, NULL}
2323
};
2324
2325
static const value_string ff_ppa_action_codes[] = {
2326
  {PPA_DSE_ENABLEMENT,                  "Protected DSE enablement"},
2327
  {PPA_DSE_DEENABLEMENT,                "Protected DSE deenablement"},
2328
  {PPA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT, "Protected Extended Channel Switch Announcement"},
2329
  {PPA_DSE_MEASUREMENT_REQUEST,         "Protected DSE measurement request"},
2330
  {PPA_DSE_MEASUREMENT_REPORT,          "Protected DSE measurement report"},
2331
  {PPA_DSE_POWER_CONSTRAINT,            "Protected DSE power constraint"},
2332
  {PPA_VENDOR_SPECIFIC,                 "Protected Vendor Specific"},
2333
  {PPA_GAS_INITIAL_REQUEST,             "Protected GAS Initial Request"},
2334
  {PPA_GAS_INITIAL_RESPONSE,            "Protected GAS Initial Response"},
2335
  {PPA_GAS_COMEBACK_REQUEST,            "Protected GAS Comeback Request"},
2336
  {PPA_GAS_COMEBACK_RESPONSE,           "Protected GAS Comeback Response"},
2337
  {PPA_QAB_REQUEST,                     "Protected QAB Request"},
2338
  {PPA_QAB_RESPONSE,                    "Protected QAB Response"},
2339
  {0x00, NULL}
2340
};
2341
static value_string_ext ff_ppa_action_codes_ext = VALUE_STRING_EXT_INIT(ff_ppa_action_codes);
2342
2343
static const value_string ff_pa_action_codes[] = {
2344
  {PA_20_40_BSS_COEXISTENCE_MANAGEMENT, "20/40 BSS Coexistence Management"},
2345
  {PA_DSE_ENABLEMENT,                  "DSE enablement"},
2346
  {PA_DSE_DEENABLEMENT,                "DSE deenablement"},
2347
  {PA_DSE_REG_LOC_ANNOUNCEMENT,        "DSE Registered Location Announcement"},
2348
  {PA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT, "Extended Channel Switch Announcement"},
2349
  {PA_DSE_MEASUREMENT_REQUEST,         "DSE measurement request"},
2350
  {PA_DSE_MEASUREMENT_REPORT,          "DSE measurement report"},
2351
  {PA_MEASUREMENT_PILOT,               "Measurement Pilot"},
2352
  {PA_DSE_POWER_CONSTRAINT,            "DSE power constraint"},
2353
  {PA_VENDOR_SPECIFIC,                 "Vendor Specific"},
2354
  {PA_GAS_INITIAL_REQUEST,             "GAS Initial Request"},
2355
  {PA_GAS_INITIAL_RESPONSE,            "GAS Initial Response"},
2356
  {PA_GAS_COMEBACK_REQUEST,            "GAS Comeback Request"},
2357
  {PA_GAS_COMEBACK_RESPONSE,           "GAS Comeback Response"},
2358
  {PA_TDLS_DISCOVERY_RESPONSE,         "TDLS Discovery Response"},
2359
  {PA_LOCATION_TRACK_NOTIFICATION,     "Location Track Notification"},
2360
  {PA_QAB_REQUEST,                     "QAB Request"},
2361
  {PA_QAB_RESPONSE,                    "QAB Response"},
2362
  {PA_QMF_POLICY,                      "QMF Policy"},
2363
  {PA_QMF_POLICY_CHANGE,               "QMF Policy Change"},
2364
  {PA_QLOAD_REQUEST,                   "QLoad Request"},
2365
  {PA_QLOAD_REPORT,                    "QLoad Report"},
2366
  {PA_HCCA_TXOP_ADVERTISEMENT,         "HCCA TXOP Advertisement"},
2367
  {PA_HCCA_TXOP_RESPONSE,              "HCCA TXOP Response"},
2368
  {PA_PUBLIC_KEY,                      "Public Key"},
2369
  {PA_CHANNEL_AVAILABILITY_QUERY,      "Channel Availability Query"},
2370
  {PA_CHANNEL_SCHEDULE_MANAGEMENT,     "Channel Schedule Management"},
2371
  {PA_CONTACT_VERIFICATION_SIGNAL,     "Contact Verification Signal"},
2372
  {PA_GDD_ENABLEMENT_REQUEST,          "GDD Enablement Request"},
2373
  {PA_GDD_ENABLEMENT_RESPONSE,         "GDD Enablement Response"},
2374
  {PA_NETWORK_CHANNEL_CONTROL,         "Network Channel Control"},
2375
  {PA_WHITE_SPACE_MAP_ANNOUNCEMENT,    "White Space Map Announcement"},
2376
  {PA_FTM_REQUEST,                     "FTM Request"},
2377
  {PA_FTM,                             "FTM"},
2378
  {PA_FILS_DISCOVERY,                  "FILS Discovery"},
2379
  {PA_LOCATION_MEASUREMENT_REPORT,                                      "Location Measurement Report"},
2380
  {PA_ISTA_PASSIVE_TB_RANGING_MEASUREMENT_REPORT,                       "ISTA Passive TB Ranging Measurement Report"},
2381
  {PA_PRIMARY_RSTA_BROADCAST_PASSIVE_TB_RANGING_MEASUREMENT_REPORT,     "Primary RSTA Broadcast Passive TB Ranging Measurement Report"},
2382
  {PA_SECONDARY_RSTA_BROADCAST_PASSIVE_TB_RANGING_MEASUREMENT_REPORT,   "Secondary RSTA Broadcast Passive TB Ranging Measurement Report"},
2383
  {0x00, NULL}
2384
};
2385
value_string_ext ff_pa_action_codes_ext = VALUE_STRING_EXT_INIT(ff_pa_action_codes);
2386
2387
static const value_string protected_ftm_action_vals[] = {
2388
  {0, "Reserved"},
2389
  {1, "Protected FTM Request"},
2390
  {2, "Protected FTM"},
2391
  {3, "Protected Location Measurement Report"},
2392
  {0, NULL}
2393
};
2394
2395
static const value_string ftm_trigger_vals[] = {
2396
  {0, "Stop sending FTM frames"},
2397
  {1, "Start or continue sending FTM frames"},
2398
  /* all other values reserved */
2399
  {0, NULL}
2400
};
2401
2402
static const value_string category_codes[] = {
2403
  {CAT_SPECTRUM_MGMT,                    "Spectrum Management (SM)"},
2404
  {CAT_QOS,                              "Quality of Service (QoS)"},
2405
  {CAT_DLS,                              "Direct-Link Setup (DLS)"},
2406
  {CAT_BLOCK_ACK,                        "Block Ack"},
2407
  {CAT_PUBLIC,                           "Public Action"},
2408
  {CAT_RADIO_MEASUREMENT,                "Radio Measurement"},
2409
  {CAT_FAST_BSS_TRANSITION,              "Fast BSS Transition"},
2410
  {CAT_HT,                               "High Throughput"},
2411
  {CAT_SA_QUERY,                         "SA Query"},
2412
  {CAT_PUBLIC_PROTECTED,                 "Protected Dual of Public Action"},
2413
  {CAT_WNM,                              "WNM"},
2414
  {CAT_UNPROTECTED_WNM,                  "Unprotected WNM"},
2415
  {CAT_TDLS,                             "TDLS"},
2416
  {CAT_MESH,                             "MESH"},
2417
  {CAT_MULTIHOP,                         "Multihop"},
2418
  {CAT_SELF_PROTECTED,                   "Self-protected"},
2419
  {CAT_DMG,                              "DMG"},
2420
  {CAT_MGMT_NOTIFICATION,                "Management Notification"},
2421
  {CAT_FAST_SESSION_TRANSFER,            "Fast Session Transfer"},
2422
  {CAT_ROBUST_AV_STREAMING,              "Robust AV Streaming"},
2423
  {CAT_UNPROTECTED_DMG,                  "Unprotected DMG"},
2424
  {CAT_VHT,                              "VHT"},
2425
  {CAT_S1G,                              "S1G"},
2426
  {CAT_PROTECTED_S1G,                    "Protected S1G"},
2427
  {CAT_FLOW_CONTROL,                     "Flow Control"},
2428
  {CAT_CONTROL_RESPONSE_MCS_NEG,         "Control Response MCS Negotiation"},
2429
  {CAT_FILS,                             "FILS"},
2430
  {CAT_HE,                               "HE"},
2431
  {CAT_PROTECTED_HE,                     "Protected HE"},
2432
  {CAT_PROTECTED_FTM,                    "Protected FTM"},
2433
  {CAT_EHT,                              "EHT"},
2434
  {CAT_PROTECTED_EHT,                    "Protected EHT"},
2435
  {CAT_VENDOR_SPECIFIC_PROTECTED,        "Vendor-specific Protected"},
2436
  {CAT_VENDOR_SPECIFIC,                  "Vendor Specific"},
2437
2438
  {0x80 | CAT_SPECTRUM_MGMT,             "Spectrum Management (SM) (error)"},
2439
  {0x80 | CAT_QOS,                       "Quality of Service (QoS (error))"},
2440
  {0x80 | CAT_DLS,                       "Direct-Link Setup (DLS) (error)"},
2441
  {0x80 | CAT_BLOCK_ACK,                 "Block Ack (error)"},
2442
  {0x80 | CAT_PUBLIC,                    "Public Action (error)"},
2443
  {0x80 | CAT_RADIO_MEASUREMENT,         "Radio Measurement (error)"},
2444
  {0x80 | CAT_FAST_BSS_TRANSITION,       "Fast BSS Transition (error)"},
2445
  {0x80 | CAT_HT,                        "High Throughput (error)"},
2446
  {0x80 | CAT_SA_QUERY,                  "SA Query (error)"},
2447
  {0x80 | CAT_PUBLIC_PROTECTED,          "Protected Dual of Public Action (error)"},
2448
  {0x80 | CAT_WNM,                       "WNM (error)"},
2449
  {0x80 | CAT_UNPROTECTED_WNM,           "Unprotected WNM (error)"},
2450
  {0x80 | CAT_TDLS,                      "TDLS (error)"},
2451
  {0x80 | CAT_MESH,                      "Mesh (error)"},
2452
  {0x80 | CAT_MULTIHOP,                  "Multihop (error)"},
2453
  {0x80 | CAT_SELF_PROTECTED,            "Self-protected (error)"},
2454
  {0x80 | CAT_DMG,                       "DMG (error)"},
2455
  {0x80 | CAT_MGMT_NOTIFICATION,         "Management Notification (error)"},
2456
  {0x80 | CAT_FAST_SESSION_TRANSFER,     "Fast Session Transfer (error)"},
2457
  {0x80 | CAT_ROBUST_AV_STREAMING,       "Robust AV Streaming (error)"},
2458
  {0x80 | CAT_UNPROTECTED_DMG,           "Unprotected DMG (error)"},
2459
  {0x80 | CAT_VHT,                       "VHT (error)"},
2460
  {0x80 | CAT_HE,                        "HE (error)"},
2461
  {0x80 | CAT_PROTECTED_HE,              "Protected HE (error)"},
2462
  {0x80 | CAT_PROTECTED_FTM,             "Protected FTM (error)"},
2463
  {0x80 | CAT_EHT,                       "EHT (error)"},
2464
  {0x80 | CAT_PROTECTED_EHT,             "Protected EHT (error)"},
2465
  {0x80 | CAT_VENDOR_SPECIFIC_PROTECTED, "Vendor-specific Protected (error)"},
2466
  {0x80 | CAT_VENDOR_SPECIFIC,           "Vendor Specific (error)"},
2467
  {0, NULL}
2468
};
2469
static value_string_ext category_codes_ext = VALUE_STRING_EXT_INIT(category_codes);
2470
2471
99
#define NR_SUB_ID_TSF_INFO                 1
2472
48
#define NR_SUB_ID_CON_COU_STR              2
2473
63
#define NR_SUB_ID_BSS_TRN_CAN_PREF         3
2474
75
#define NR_SUB_ID_BSS_TER_DUR              4
2475
#define NR_SUB_ID_BEARING                  5
2476
#define NR_SUB_ID_WIDE_BW_CHANNEL          6
2477
2478
#define NR_SUB_ID_MEASUREMENT_REPORT       39
2479
2
#define NR_SUB_ID_HT_CAPABILITIES          45
2480
7
#define NR_SUB_ID_HT_OPERATION             61
2481
10
#define NR_SUB_ID_SEC_CHANNEL_OFFSET       62
2482
2
#define NR_SUB_ID_MEASUREMENT_PILOT_INFO   66
2483
#define NR_SUB_ID_RM_ENABLE_CAP            70
2484
14
#define NR_SUB_ID_HT_MULTIPLE_BSSID        71
2485
#define NR_SUB_ID_VHT_CAPABILITIES         191
2486
#define NR_SUB_ID_VHT_OPERATION            192
2487
3
#define NR_SUB_ID_HE_CAPABILITIES          193
2488
3
#define NR_SUB_ID_HE_OPERATION             194
2489
2
#define NR_SUB_ID_EHT_CAPABILITIES         199
2490
4
#define NR_SUB_ID_EHT_OPERATION            200
2491
10
#define NR_SUB_ID_BASIC_MULTI_LINK         201
2492
2493
0
#define NR_SUB_ID_VENDOR_SPECIFIC          221
2494
2495
static const value_string ieee80211_neighbor_report_subelement_id_vals[] = {
2496
  {NR_SUB_ID_TSF_INFO, "TSF Information"},
2497
  {NR_SUB_ID_CON_COU_STR, "Condensed Country String"},
2498
  {NR_SUB_ID_BSS_TRN_CAN_PREF, "BSS Transition Candidate Preference"},
2499
  {NR_SUB_ID_BSS_TER_DUR, "BSS Termination Duration"},
2500
  {NR_SUB_ID_BEARING, "Bearing"},
2501
  {NR_SUB_ID_WIDE_BW_CHANNEL, "Wide Bandwidth Channel"},
2502
  {NR_SUB_ID_MEASUREMENT_REPORT, "Measurement Report"},
2503
  {NR_SUB_ID_HT_CAPABILITIES, "HT Capabilities"},
2504
  {NR_SUB_ID_HT_OPERATION, "HT Operation"},
2505
  {NR_SUB_ID_SEC_CHANNEL_OFFSET, "Secondary Channel Offset"},
2506
  {NR_SUB_ID_MEASUREMENT_PILOT_INFO, "Measurement Pilot Transmission"},
2507
  {NR_SUB_ID_RM_ENABLE_CAP, "RM Enabled Capabilities"},
2508
  {NR_SUB_ID_HT_MULTIPLE_BSSID, "Multiple BSSID"},
2509
  {NR_SUB_ID_VHT_CAPABILITIES, "VHT Capabilities"},
2510
  {NR_SUB_ID_VHT_OPERATION, "VHT Operation"},
2511
  {NR_SUB_ID_HE_CAPABILITIES, "HE Capabilities"},
2512
  {NR_SUB_ID_HE_OPERATION, "HE Operation"},
2513
  {NR_SUB_ID_EHT_CAPABILITIES, "EHT Capabilities"},
2514
  {NR_SUB_ID_EHT_OPERATION, "EHT Operation"},
2515
  {NR_SUB_ID_BASIC_MULTI_LINK, "Basic Multi-Link"},
2516
  {NR_SUB_ID_VENDOR_SPECIFIC, "Vendor Specific"},
2517
  {0, NULL}
2518
};
2519
2520
static const value_string ieee80211_neighbor_report_bssid_info_reachability_vals[] = {
2521
  {0, "Reserved"},
2522
  {1, "Not Reachable"},
2523
  {2, "Unknown"},
2524
  {3, "Reachable"},
2525
  {0, NULL}
2526
};
2527
2528
static const value_string action_codes[] = {
2529
  {SM_ACTION_MEASUREMENT_REQUEST, "Measurement Request"},
2530
  {SM_ACTION_MEASUREMENT_REPORT,  "Measurement Report"},
2531
  {SM_ACTION_TPC_REQUEST,         "TPC Request"},
2532
  {SM_ACTION_TPC_REPORT,          "TPC Report"},
2533
  {SM_ACTION_CHAN_SWITCH_ANNC,    "Channel Switch Announcement"},
2534
  {0, NULL}
2535
};
2536
2537
static const value_string vendor_action_types_mrvl[] = {
2538
  {MRVL_ACTION_MESH_MANAGEMENT, "Mesh Management"},
2539
  {0, NULL}
2540
};
2541
2542
static const value_string mesh_mgt_action_codes_mrvl[] = {
2543
  {MRVL_MESH_MGMT_ACTION_RREQ, "Route Request"},
2544
  {MRVL_MESH_MGMT_ACTION_RREP, "Route Response"},
2545
  {MRVL_MESH_MGMT_ACTION_RERR, "Route Error"},
2546
  {MRVL_MESH_MGMT_ACTION_PLDM, "Peer Link Down"},
2547
  {0, NULL}
2548
};
2549
2550
static const value_string mesh_path_selection_codes[] = {
2551
  {0x0, "Hybrid Wireless Mesh Protocol"},
2552
  {0, NULL}
2553
};
2554
2555
static const value_string mesh_metric_codes[] = {
2556
  {0x0, "Airtime Link Metric"},
2557
  {0, NULL}
2558
};
2559
2560
static const value_string wme_action_codes[] = {
2561
  {0x00, "Setup request"},
2562
  {0x01, "Setup response"},
2563
  {0x02, "Teardown"},
2564
  {0x00, NULL}
2565
};
2566
2567
static const value_string wme_status_codes[] = {
2568
  {0x00, "Admission accepted"},
2569
  {0x01, "Invalid parameters"},
2570
  {0x03, "Refused"},
2571
  {0x00, NULL}
2572
};
2573
2574
static const value_string mesh_action[] = {
2575
  {MESH_ACTION_LINK_METRIC_REPORT, "Mesh Link Metric Report"},
2576
  {MESH_ACTION_HWMP,               "HWMP Mesh Path Selection"},
2577
  {MESH_ACTION_GATE_ANNOUNCE,      "Gate Announcement"},
2578
  {MESH_ACTION_CONGESTION_CTL,     "Congestion Control Notification"},
2579
  {MESH_ACTION_MCCA_SETUP_REQUEST, "MCCA Setup Request"},
2580
  {MESH_ACTION_MCCA_SETUP_REPLY,   "MCCA Setup Reply"},
2581
  {MESH_ACTION_MCCA_ADV_REQUEST,   "MCCA Advertisement Request"},
2582
  {MESH_ACTION_MCCA_ADV,           "MCCA Advertisement"},
2583
  {MESH_ACTION_MCCA_TEARDOWN,      "MCCA Teardown"},
2584
  {MESH_ACTION_TBTT_ADJ_REQUEST,   "TBTT Adjustment Request"},
2585
  {MESH_ACTION_TBTT_ADJ_RESPONSE,  "TBTT Adjustment Response"},
2586
  {0, NULL}
2587
};
2588
static value_string_ext mesh_action_ext = VALUE_STRING_EXT_INIT(mesh_action);
2589
2590
static const value_string multihop_action[] = {
2591
  {MULTIHOP_ACTION_PROXY_UPDATE,      "Proxy Update"},
2592
  {MULTIHOP_ACTION_PROXY_UPDATE_CONF, "Proxy Update Confirmation"},
2593
  {0, NULL}
2594
};
2595
2596
static const value_string selfprot_action[] = {
2597
  {SELFPROT_ACTION_MESH_PEERING_OPEN,     "Mesh Peering Open"},
2598
  {SELFPROT_ACTION_MESH_PEERING_CONFIRM,  "Mesh Peering Confirm"},
2599
  {SELFPROT_ACTION_MESH_PEERING_CLOSE,    "Mesh Peering Close"},
2600
  {SELFPROT_ACTION_MESH_GROUP_KEY_INFORM, "Mesh Group Key Inform"},
2601
  {SELFPROT_ACTION_MESH_GROUP_KEY_ACK,    "Mesh Group Key Ack"},
2602
  {0, NULL}
2603
};
2604
2605
static const value_string mesh_peering_proto_ids[] = {
2606
  {MESH_PEERING_PROTO_MGMT,   "Mesh peering management protocol"},
2607
  {MESH_PEERING_PROTO_AMPE,   "Authenticated mesh peering exchange protocol"},
2608
  {MESH_PEERING_PROTO_VENDOR, "Vendor specific"},
2609
  {0, NULL}
2610
};
2611
2612
static const true_false_string hwmp_targ_usn_flags = {
2613
  "[USN = 1] Target Sequence Number Unknown at Originator",
2614
  "[USN = 0] Target Sequence Number Known at Originator"
2615
};
2616
2617
static const true_false_string hwmp_targ_to_flags = {
2618
  "[TO = 1] Only Target Will Respond",
2619
  "[TO = 0] Intermediate Nodes May Respond"
2620
};
2621
2622
static const value_string ack_policy[] = {
2623
  {0x00, "Normal Ack"},
2624
  {0x01, "No Ack"},
2625
  {0x02, "No explicit acknowledgment"},
2626
  {0x03, "Block Ack"},
2627
  {0x00, NULL}
2628
};
2629
2630
static const value_string qos_action_codes[] = {
2631
  {QOS_ACTION_ADDTS_REQUEST,  "ADDTS Request"},
2632
  {QOS_ACTION_ADDTS_RESPONSE, "ADDTS Response"},
2633
  {QOS_ACTION_DELTS,          "DELTS"},
2634
  {QOS_ACTION_SCHEDULE,   "Schedule"},
2635
  {QOS_ACTION_MAP_CONFIGURE, "QoS Map Configure"},
2636
  {0, NULL}
2637
};
2638
2639
static const value_string ba_action_codes[] = {
2640
  {BA_ADD_BLOCK_ACK_REQUEST,      "Add Block Ack Request"},
2641
  {BA_ADD_BLOCK_ACK_RESPONSE,     "Add Block Ack Response"},
2642
  {BA_DELETE_BLOCK_ACK,           "Delete Block Ack"},
2643
  {BA_NDP_ADD_BLOCK_ACK_REQUEST,  "NDP ADDBA Request"},
2644
  {BA_NDP_ADD_BLOCK_ACK_RESPONSE, "NDP ADDBA Response"},
2645
  {BA_NDP_DELETE_BLOCK_ACK,       "NDP DELBA"},
2646
  {BA_BAT_ADD_BLOCK_ACK_REQUEST,  "BAT ADDBA Request"},
2647
  {BA_BAT_ADD_BLOCK_ACK_RESPONSE, "BAT ADDBA Response"},
2648
  {BA_BAT_DELETE_BLOCK_ACK,       "BAT DELBA"},
2649
  {0x00, NULL}
2650
};
2651
2652
static const value_string dls_action_codes[] = {
2653
  {DLS_ACTION_REQUEST,  "DLS Request"},
2654
  {DLS_ACTION_RESPONSE, "DLS Response"},
2655
  {DLS_ACTION_TEARDOWN, "DLS Teardown"},
2656
  {0, NULL}
2657
};
2658
2659
static const value_string tsinfo_type[] = {
2660
  {0x0, "Aperiodic or unspecified Traffic"},
2661
  {0x1, "Periodic Traffic"},
2662
  {0, NULL}
2663
};
2664
2665
static const value_string tsinfo_direction[] = {
2666
  {0x00, "Uplink"},
2667
  {0x01, "Downlink"},
2668
  {0x02, "Direct link"},
2669
  {0x03, "Bidirectional link"},
2670
  {0, NULL}
2671
};
2672
2673
static const value_string tsinfo_access[] = {
2674
  {0x00, "Reserved"},
2675
  {0x01, "EDCA"},
2676
  {0x02, "HCCA"},
2677
  {0x03, "HEMM"},
2678
  {0, NULL}
2679
};
2680
2681
static const value_string qos_up[] = {
2682
  {0x00, "Best Effort"},
2683
  {0x01, "Background"},
2684
  {0x02, "Spare"},
2685
  {0x03, "Excellent Effort"},
2686
  {0x04, "Controlled Load"},
2687
  {0x05, "Video"},
2688
  {0x06, "Voice"},
2689
  {0x07, "Network Control"},
2690
  {0, NULL}
2691
};
2692
2693
static const range_string classifier_type[] = {
2694
  {0x00, 0x00, "Ethernet parameters"},
2695
  {0x01, 0x01, "TCP/UDP IP parameters"},
2696
  {0x02, 0x02, "IEEE 802.1D/Q parameters"},
2697
  {0x03, 0x03, "Filter Offset parameters"},
2698
  {0x04, 0x04, "IP and higher layer parameters"},
2699
  {0x05, 0x05, "IEEE 802.1D/Q parameters"},
2700
  {0x06, 0x06, "IEEE 802.11 MAC header parameters"},
2701
  {0x07, 0x07, "IEEE Std 802.11 downlink PV1 MPDU MAC header parameters"},
2702
  {0x08, 0x08, "IEEE Std 802.11 non-downlink PV1 MPDU MAC header parameters"},
2703
  {0x09, 0x09, "IEEE Std 802.11 PV1 MPDU Full Address MAC header parameters"},
2704
  {0x0A, 0x0A, "IP extensions and higher layer parameters"},
2705
  {0x0B, 0xFF, "Reserved" },
2706
  {0, 0, NULL}
2707
};
2708
2709
static const true_false_string ieee80211_block_ack_control_ack_policy_flag = {
2710
    "Sender Does Not Require Immediate Acknowledgement",
2711
    "Immediate Acknowledgement Required"
2712
};
2713
2714
static const value_string ft_action_codes[] = {
2715
  {FT_ACTION_REQUEST, "FT Request"},
2716
  {FT_ACTION_RESPONSE, "FT Response"},
2717
  {FT_ACTION_CONFIRM, "FT Confirm"},
2718
  {FT_ACTION_ACK, "FT Ack"},
2719
  {0, NULL}
2720
};
2721
2722
static const value_string sa_query_action_codes[] = {
2723
  {SA_QUERY_REQUEST, "SA Query Request"},
2724
  {SA_QUERY_RESPONSE, "SA Query Response"},
2725
  {0, NULL}
2726
};
2727
2728
static const value_string ieee80211_data_encap_payload_types[] = {
2729
  {1, "Remote Request/Response"},
2730
  {2, "TDLS"},
2731
  {0, NULL}
2732
};
2733
2734
static const true_false_string rsn_preauth_flags = {
2735
  "Transmitter supports pre-authentication",
2736
  "Transmitter does not support pre-authentication"
2737
};
2738
2739
static const true_false_string rsn_no_pairwise_flags = {
2740
  "Transmitter cannot support WEP default key 0 simultaneously with "
2741
  "Pairwise key",
2742
  "Transmitter can support WEP default key 0 simultaneously with "
2743
  "Pairwise key"
2744
};
2745
2746
static const value_string rsn_cap_replay_counter[] = {
2747
  {0x00, "1 replay counter per PTKSA/GTKSA/STAKeySA"},
2748
  {0x01, "2 replay counters per PTKSA/GTKSA/STAKeySA"},
2749
  {0x02, "4 replay counters per PTKSA/GTKSA/STAKeySA"},
2750
  {0x03, "16 replay counters per PTKSA/GTKSA/STAKeySA"},
2751
  {0, NULL}
2752
};
2753
2754
static const true_false_string ht_ldpc_coding_flag = {
2755
  "Transmitter supports receiving LDPC coded packets",
2756
  "Transmitter does not support receiving LDPC coded packets"
2757
};
2758
2759
static const true_false_string ht_chan_width_flag = {
2760
  "Transmitter supports 20MHz and 40MHz operation",
2761
  "Transmitter only supports 20MHz operation"
2762
};
2763
2764
static const value_string ht_sm_pwsave_flag[] = {
2765
  {0x00, "Static SM Power Save mode"},
2766
  {0x01, "Dynamic SM Power Save mode"},
2767
  {0x02, "Reserved"},
2768
  {0x03, "SM Power Save disabled"},
2769
  {0x00, NULL}
2770
};
2771
2772
static const true_false_string ht_green_flag = {
2773
  "Transmitter is able to receive PPDUs with Green Field (GF) preamble",
2774
  "Transmitter is not able to receive PPDUs with Green Field (GF) preamble"
2775
};
2776
2777
static const value_string ht_rx_stbc_flag[] = {
2778
  {0x00, "No Rx STBC support"},
2779
  {0x01, "Rx support of one spatial stream"},
2780
  {0x02, "Rx support of one and two spatial streams"},
2781
  {0x03, "Rx support of one, two, and three spatial streams"},
2782
  {0x00, NULL}
2783
};
2784
2785
  /* IEEE Stc 802.11ac-2013 8.4.2.29 Extended Capabilities element*/
2786
static const value_string vht_max_mpdu_in_amsdu[] = {
2787
    {0x00, "No limit"},
2788
    {0x01, "32"},
2789
    {0x02, "16"},
2790
    {0x03, "8"},
2791
    {0, NULL}
2792
};
2793
2794
  /* IEEE Stc 802.11ac/D3.1 */
2795
2796
static const value_string vht_max_mpdu_length_flag[] = {
2797
  {0x00, "3 895"},
2798
  {0x01, "7 991"},
2799
  {0x02, "11 454"},
2800
  {0x03, "Reserved"},
2801
  {0x00, NULL}
2802
};
2803
2804
static const value_string vht_supported_chan_width_set_flag[] = {
2805
  {0x00, "Neither 160MHz nor 80+80 supported"},
2806
  {0x01, "160MHz supported"},
2807
  {0x02, "160MHz and 80+80 Supported"},
2808
  {0x03, "Reserved"},
2809
  {0x00, NULL}
2810
};
2811
2812
static const value_string vht_rx_stbc_flag[] = {
2813
  {0x00, "None"},
2814
  {0x01, "1 Spatial Stream Supported"},
2815
  {0x02, "1 to 2 Spatial Stream Supported"},
2816
  {0x03, "1 to 3 Spatial Stream Supported"},
2817
  {0x04, "1 to 4 Spatial Stream Supported"},
2818
  {0x05, "Reserved"},
2819
  {0x06, "Reserved"},
2820
  {0x07, "Reserved"},
2821
  {0x00, NULL}
2822
};
2823
2824
static const value_string num_plus_one_3bit_flag[] = {
2825
  {0x00, "1"},
2826
  {0x01, "2"},
2827
  {0x02, "3"},
2828
  {0x03, "4"},
2829
  {0x04, "5"},
2830
  {0x05, "6"},
2831
  {0x06, "7"},
2832
  {0x07, "8"},
2833
  {0x00, NULL}
2834
};
2835
2836
static const value_string vht_max_ampdu_flag[] = {
2837
  {0x00, "8 191"},
2838
  {0x01, "16 383"},
2839
  {0x02, "32 767"},
2840
  {0x03, "65 535"},
2841
  {0x04, "131 071"},
2842
  {0x05, "262 143"},
2843
  {0x06, "524 287"},
2844
  {0x07, "1 048 575"},
2845
  {0x00, NULL}
2846
};
2847
2848
static const value_string vht_link_adapt_flag[] = {
2849
  {0x00, "No Feedback"},
2850
  {0x01, "Reserved (logically only solicited feedback)"},
2851
  {0x02, "Unsolicited feedback only"},
2852
  {0x03, "Both (can provide unsolicited feedback and respond to VHT MRQ)"},
2853
  {0x00, NULL}
2854
};
2855
2856
static const value_string vht_supported_mcs_flag[] = {
2857
  {0x00, "MCS 0-7"},
2858
  {0x01, "MCS 0-8"},
2859
  {0x02, "MCS 0-9"},
2860
  {0x03, "Not Supported"},
2861
  {0x00, NULL}
2862
};
2863
2864
static const value_string vht_tpe_pwr_units[] = {
2865
  { 0, "Local EIRP" },
2866
  { 1, "Local EIRP PSD" },
2867
  { 2, "Regulatory client EIRP" },
2868
  { 3, "Regulatory client EIRP PSD" },
2869
  { 4, "Additional regulatory client EIRP" },
2870
  { 5, "Additional regulatory client EIRP PSD" },
2871
  { 6, "Reserved" },
2872
  { 7, "Reserved" },
2873
  {0x00, NULL}
2874
};
2875
2876
static const true_false_string vht_ndp_annc_sta_info_feedback_type = {
2877
  "MU feedback requested",
2878
  "SU feedback requested"
2879
};
2880
2881
static const true_false_string ht_max_amsdu_flag = {
2882
  "7935 bytes",
2883
  "3839 bytes"
2884
};
2885
2886
static const true_false_string ht_dss_cck_40_flag = {
2887
  "Will/Can use DSSS/CCK in 40 MHz",
2888
  "Won't/Can't use of DSSS/CCK in 40 MHz"
2889
};
2890
2891
static const true_false_string ht_40_mhz_intolerant_flag = {
2892
  "Use of 40 MHz transmissions restricted/disallowed",
2893
  "Use of 40 MHz transmissions unrestricted/allowed"
2894
};
2895
2896
static const value_string ampduparam_mpdu_start_spacing_flags[] = {
2897
  {0x00, "No restriction"},
2898
  {0x01, "1/4 [usec]"},
2899
  {0x02, "1/2 [usec]"},
2900
  {0x03, "1 [usec]"},
2901
  {0x04, "2 [usec]"},
2902
  {0x05, "4 [usec]"},
2903
  {0x06, "8 [usec]"},
2904
  {0x07, "16 [usec]"},
2905
  {0x00, NULL}
2906
};
2907
2908
static const true_false_string mcsset_tx_rx_mcs_set_not_equal_flag = {
2909
  "Not Equal",
2910
  "Equal",
2911
};
2912
2913
static const value_string mcsset_tx_max_spatial_streams_flags[] = {
2914
  {0x00, "1 spatial stream"},
2915
  {0x01, "2 spatial streams"},
2916
  {0x02, "3 spatial streams"},
2917
  {0x03, "4 spatial streams"},
2918
  {0x04, "TX MCS Set Not Defined"},
2919
  {0x00, NULL}
2920
};
2921
2922
static const value_string htex_mcs_flags[] = {
2923
  {0x00, "STA does not provide MCS feedback"},
2924
  {0x01, "Reserved"},
2925
  {0x02, "STA provides only unsolicited MCS feedback"},
2926
  {0x03, "STA can provide MCS feedback in response to MRQ as well as unsolicited MCS feedback"},
2927
  {0x00, NULL}
2928
};
2929
2930
static const value_string txbf_calib_flag[] = {
2931
  {0x00, "Not supported"},
2932
  {0x01, "Can respond to a calibration request but cannot initiate calibration"},
2933
  {0x02, "Reserved"},
2934
  {0x03, "Can both initiate and respond to a calibration request"},
2935
  {0x00, NULL}
2936
};
2937
2938
static const value_string txbf_feedback_flags[] = {
2939
  {0x00, "Not supported"},
2940
  {0x01, "Delayed feedback capable"},
2941
  {0x02, "Immediate feedback capable"},
2942
  {0x03, "Delayed and immediate feedback capable"},
2943
  {0x00, NULL}
2944
};
2945
2946
static const value_string txbf_antenna_flags[] = {
2947
  {0x00, "1 TX antenna sounding"},
2948
  {0x01, "2 TX antenna sounding"},
2949
  {0x02, "3 TX antenna sounding"},
2950
  {0x03, "4 TX antenna sounding"},
2951
  {0x00, NULL}
2952
};
2953
2954
static const value_string txbf_csi_max_rows_bf_flags[] = {
2955
  {0x00, "1 row of CSI"},
2956
  {0x01, "2 rows of CSI"},
2957
  {0x02, "3 rows of CSI"},
2958
  {0x03, "4 rows of CSI"},
2959
  {0x00, NULL}
2960
};
2961
2962
static const value_string txbf_chan_est_flags[] = {
2963
  {0x00, "1 space time stream"},
2964
  {0x01, "2 space time streams"},
2965
  {0x02, "3 space time streams"},
2966
  {0x03, "4 space time streams"},
2967
  {0x00, NULL}
2968
};
2969
2970
static const value_string txbf_min_group_flags[] = {
2971
  {0x00, "No grouping supported"},
2972
  {0x01, "Groups of 1, 2 supported"},
2973
  {0x02, "Groups of 1, 4 supported"},
2974
  {0x03, "Groups of 1, 2, 4 supported"},
2975
  {0x00, NULL}
2976
};
2977
2978
static const value_string hta_ext_chan_offset_flag[] = {
2979
  {0x00, "No Extension Channel"},
2980
  {0x01, "Extension Channel above control channel"},
2981
  {0x02, "Undefined"},
2982
  {0x03, "Extension Channel below control channel"},
2983
  {0x00, NULL}
2984
};
2985
2986
static const true_false_string hta_rec_tx_width_flag = {
2987
  "Any channel width enabled",
2988
  "Use 20MHz channel (control)"
2989
};
2990
2991
static const true_false_string hta_rifs_mode_flag = {
2992
  "Use of RIFS permitted",
2993
  "Use of RIFS prohibited"
2994
};
2995
2996
static const true_false_string hta_controlled_access_flag = {
2997
  "Not only PSMP",
2998
  "PSMP only"
2999
};
3000
3001
static const value_string hta_service_interval_flag[] = {
3002
  {0x00, "5ms"},
3003
  {0x01, "10ms"},
3004
  {0x02, "15ms"},
3005
  {0x03, "20ms"},
3006
  {0x04, "25ms"},
3007
  {0x05, "30ms"},
3008
  {0x06, "35ms"},
3009
  {0x07, "40ms"},
3010
  {0x00, NULL}
3011
};
3012
3013
static const value_string hta_operating_mode_flag[] = {
3014
  {0x00, "Pure HT, no protection"},
3015
  {0x01, "There may be non-HT devices (control & ext channel)"},
3016
  {0x02, "No non-HT is associated, but at least 1 20MHz is. protect on"},
3017
  {0x03, "Mixed: no non-HT is associated, protect on"},
3018
  {0x00, NULL}
3019
};
3020
3021
static const true_false_string hta_non_gf_devices_flag = {
3022
  "All HT devices associated are GF capable",
3023
  "One or More HT devices are not GF capable"
3024
};
3025
3026
static const true_false_string hta_dual_stbc_protection_flag = {
3027
  "Dual CTS protections is used",
3028
  "Regular use of RTS/CTS"
3029
};
3030
3031
static const true_false_string hta_secondary_beacon_flag = {
3032
  "Secondary Beacon",
3033
  "Primary Beacon"
3034
};
3035
3036
static const true_false_string hta_lsig_txop_protection_flag = {
3037
  "Full Support",
3038
  "Not full support"
3039
};
3040
3041
static const true_false_string hta_pco_active_flag = {
3042
  "PCO is activated in the BSS",
3043
  "PCO is not activated in the BSS"
3044
};
3045
3046
static const true_false_string hta_pco_phase_flag = {
3047
  "Switch to 20MHz phase/keep 20MHz",
3048
  "Switch to 40MHz phase/keep 40MHz"
3049
};
3050
3051
static const value_string ht_info_secondary_channel_offset_flags[] = {
3052
  {0x00, "No secondary channel"},
3053
  {0x01, "Secondary channel is above the primary channel"},
3054
  {0x02, "Reserved"},
3055
  {0x03, "Secondary channel is below the primary channel"},
3056
  {0x00, NULL}
3057
};
3058
3059
static const true_false_string ht_info_channel_sta_width_flag = {
3060
  "Channel of any width supported",
3061
  "20 MHz channel width only"
3062
};
3063
3064
static const true_false_string ht_info_rifs_mode_flag = {
3065
  "Permitted",
3066
  "Prohibited"
3067
};
3068
3069
static const value_string ht_info_operating_protection_mode_flags[] = {
3070
  {0x00, "No protection mode"},
3071
  {0x01, "HT non-member protection mode"},
3072
  {0x02, "20 MHz protection mode"},
3073
  {0x03, "non-HT mixed mode"},
3074
  {0x00, NULL}
3075
};
3076
3077
static const true_false_string ht_info_non_greenfield_sta_present_flag = {
3078
  "One or more associated STAs are not greenfield capable",
3079
  "All associated STAs are greenfield capable"
3080
};
3081
3082
static const true_false_string ht_info_obss_non_ht_stas_present_flag = {
3083
  "Use of protection for non-HT STAs by overlapping BSSs is needed",
3084
  "Use of protection for non-HT STAs by overlapping BSSs is not needed"
3085
};
3086
3087
static const true_false_string ht_info_dual_beacon_flag = {
3088
  "AP transmits a secondary beacon",
3089
  "No second beacon is transmitted"
3090
};
3091
3092
static const true_false_string ht_info_stbc_beacon_flag = {
3093
  "STBC beacon",
3094
  "Primary beacon"
3095
};
3096
3097
static const true_false_string htc_lac_trq_flag = {
3098
  "Want sounding PPDU",
3099
  "Don't want sounding PPDU"
3100
};
3101
3102
static const true_false_string htc_lac_mai_mrq_flag = {
3103
  "MCS feedback requested",
3104
  "No MCS feedback requested"
3105
};
3106
3107
static const value_string ieee80211_htc_lac_asel_command_flags[] = {
3108
  {0x00, "Transmit Antenna Selection Sounding Indication (TXASSI)"},
3109
  {0x01, "Transmit Antenna Selection Sounding Request (TXASSR)"},
3110
  {0x02, "Receive Antenna Selection Sounding Indication (RXASSI)"},
3111
  {0x03, "Receive Antenna Selection Sounding Request (RXASSR)"},
3112
  {0x04, "Sounding Label"},
3113
  {0x05, "No feedback, ASEL training failure"},
3114
  {0x06, "Transmit Antenna Selection Sounding Indication (TXASSI) requesting feedback of explicit CSI"},
3115
  {0x07, "Reserved"},
3116
  {0x00, NULL}
3117
};
3118
3119
static const value_string ieee80211_htc_cal_pos_flags[] = {
3120
  {0x00, "Not a calibration frame"},
3121
  {0x01, "Calibration Start"},
3122
  {0x02, "Sounding Response"},
3123
  {0x03, "Sounding Complete"},
3124
  {0x00, NULL}
3125
};
3126
3127
static const value_string ieee80211_htc_csi_steering_flags[] = {
3128
  {0x00, "No feedback required"},
3129
  {0x01, "CSI"},
3130
  {0x02, "Non-compressed Beamforming Feedback Matrix"},
3131
  {0x03, "Compressed Beamforming Feedback Matrix"},
3132
  {0x00, NULL}
3133
};
3134
3135
static const true_false_string ieee80211_htc_ndp_announcement_flag = {
3136
  "NDP will follow",
3137
  "No NDP will follow"
3138
};
3139
3140
static const value_string ieee80211_htc_bw_recommended_vht_mcs_vals[] = {
3141
  {0, "20 MHz"},
3142
  {1, "40 MHz"},
3143
  {2, "80 MHz"},
3144
  {3, "160 MHz and 80+80 MHz"},
3145
  {0, NULL}
3146
};
3147
3148
static const value_string ieee80211_htc_s1g_bw_recommended_vht_mcs_vals[] = {
3149
  {0, "1 MHz"},
3150
  {1, "2 MHz"},
3151
  {2, "4 MHz"},
3152
  {3, "8 MHz"},
3153
  {4, "16 MHz"},
3154
  {5, "Reserved"},
3155
  {6, "Reserved"},
3156
  {7, "Reserved"},
3157
  {0, NULL}
3158
};
3159
3160
static const value_string ieee80211_htc_coding_type_vals[] = {
3161
  {0, "BCC"},
3162
  {1, "LDPC"},
3163
  {0, NULL}
3164
};
3165
3166
static const value_string ieee80211_htc_fb_tx_type_vals[] = {
3167
  {0, "Not beamformed"},
3168
  {1, "Beamformed"},
3169
  {0, NULL}
3170
};
3171
3172
static const value_string ieee80211_tag_secondary_channel_offset_flags[] = {
3173
  {0x00, "No Secondary Channel"},
3174
  {0x01, "Above Primary Channel"},
3175
  {0x02, "Reserved"},
3176
  {0x03, "Below Primary Channel"},
3177
  {0x00, NULL}
3178
};
3179
3180
135
#define BSS_BITMASK_UP0   0x0001
3181
135
#define BSS_BITMASK_UP1   0x0002
3182
135
#define BSS_BITMASK_UP2   0x0004
3183
135
#define BSS_BITMASK_UP3   0x0008
3184
135
#define BSS_BITMASK_UP4   0x0010
3185
135
#define BSS_BITMASK_UP5   0x0020
3186
135
#define BSS_BITMASK_UP6   0x0040
3187
135
#define BSS_BITMASK_UP7   0x0080
3188
135
#define BSS_BITMASK_AC0   0x0100
3189
135
#define BSS_BITMASK_AC1   0x0200
3190
135
#define BSS_BITMASK_AC2   0x0400
3191
135
#define BSS_BITMASK_AC3   0x0800
3192
14
#define BSS_BITMASK_RSV   0xF000
3193
3194
static const value_string ieee80211_tag_ext_channel_switch_announcement_switch_mode_flags[] = {
3195
  {0x00, "Frames may be transmitted before the channel switch has been completed"},
3196
  {0x01, "No more frames are to be transmitted until the channel switch has been completed"},
3197
  {0x00, NULL}
3198
};
3199
3200
static const value_string service_interval_granularity_vals[] = {
3201
  { 0, "5 ms" },
3202
  { 1, "10 ms" },
3203
  { 2, "15 ms" },
3204
  { 3, "20 ms" },
3205
  { 4, "25 ms" },
3206
  { 5, "30 ms" },
3207
  { 6, "35 ms" },
3208
  { 7, "40 ms" },
3209
  { 0x00, NULL }
3210
};
3211
3212
static const value_string wep_type_vals[] = {
3213
  { DOT11DECRYPT_KEY_TYPE_WEP, STRING_KEY_TYPE_WEP },
3214
  { DOT11DECRYPT_KEY_TYPE_WPA_PWD, STRING_KEY_TYPE_WPA_PWD },
3215
  { DOT11DECRYPT_KEY_TYPE_WPA_PSK, STRING_KEY_TYPE_WPA_PSK },
3216
  { DOT11DECRYPT_KEY_TYPE_TK, STRING_KEY_TYPE_TK },
3217
  { DOT11DECRYPT_KEY_TYPE_MSK, STRING_KEY_TYPE_MSK },
3218
  { 0x00, NULL }
3219
};
3220
3221
static const value_string ieee80211_ht_pren_type_vals[] = {
3222
  { 51,  "HT Capabilities (802.11n D1.10)" },
3223
  { 52,  "HT Additional Capabilities (802.11n D1.00)" },
3224
  { 0, NULL }
3225
};
3226
3227
static const true_false_string ieee80211_cf_ssw_direction = {
3228
  "Transmitted by the beamforming responder",
3229
  "Transmitted by the beamforming initiator"
3230
};
3231
3232
static const value_string bss_type[] = {
3233
  {0x0, "Reserved"},
3234
  {0x1, "IBSS"},
3235
  {0x2, "PBSS"},
3236
  {0x3, "Infrastructure BSS"},
3237
  {0,   NULL}
3238
};
3239
3240
static const value_string band_id[] = {
3241
  {0x0, "TV white spaces"},
3242
  {0x1, "Sub-1 GHz (excluding TV white spaces)"},
3243
  {0x2, "2.4 GHz"},
3244
  {0x3, "3.6 GHz"},
3245
  {0x4, "4.9 and 5 GHz"},
3246
  {0x5, "60 GHz"},
3247
  {0x6, "45 GHz"},
3248
  {0x7, "6 GHz"},
3249
  {0,   NULL}
3250
};
3251
3252
static const value_string extended_sc_mcs[] = {
3253
  {0x0, "None"},
3254
  {0x1, "MCS 9.1"},
3255
  {0x2, "MCS 12.1"},
3256
  {0x3, "MCS 12.2"},
3257
  {0x4, "MCS 12.3"},
3258
  {0x5, "MCS 12.4"},
3259
  {0x6, "MCS 12.5"},
3260
  {0x7, "MCS 12.6"},
3261
  {0, NULL}
3262
};
3263
3264
static const range_string max_basic_sf_amsdu[] = {
3265
  {0, 0, "No Limit"},
3266
  {1, 1, "4 Basic subframes"},
3267
  {2, 2, "8 Basic subframes"},
3268
  {3, 3, "16 Basic subframes"},
3269
  {4, 4, "32 Basic subframes"},
3270
  {5, 5, "64 Basic subframes"},
3271
  {6, 6, "128 Basic subframes"},
3272
  {7, 7, "256 Basic subframes"},
3273
  {8, 255, "reserved"},
3274
  {0, 0, NULL}
3275
};
3276
3277
static const range_string max_short_sf_amsdu[] = {
3278
  {0, 0, "No Limit"},
3279
  {1, 1, "32 Short subframes"},
3280
  {2, 2, "64 Short subframes"},
3281
  {3, 3, "128 Short subframes"},
3282
  {4, 4, "256 Short subframes"},
3283
  {5, 5, "512 Short subframes"},
3284
  {6, 6, "1024 Short subframes"},
3285
  {7, 255, "reserved"},
3286
  {0, 0, NULL}
3287
};
3288
3289
static const value_string allocation_type[] = {
3290
  {0x0, "SP Allocation"},
3291
  {0x1, "CBAP allocation"},
3292
  {0,   NULL}
3293
};
3294
3295
static const value_string vht_operation_info_channel_width[] = {
3296
  {0x00, "20MHz or 40MHz"},
3297
  {0x01, "80MHZ"},
3298
  {0x10, "160MHz"},
3299
  {0x11, "80MHz+80MHz"},
3300
  {0, NULL}
3301
};
3302
static const value_string operating_mode_field_channel_width[] = {
3303
  {0x00, "20MHz"},
3304
  {0x01, "40MHZ"},
3305
  {0x02, "80MHz"},
3306
  {0x03, "160MHz or 80MHz+80MHz"},
3307
  {0, NULL}
3308
};
3309
3310
static const value_string operat_mode_field_rxnss[] = {
3311
  {0x0, "1Nss"},
3312
  {0x1, "2Nss"},
3313
  {0x2, "3Nss"},
3314
  {0x3, "4Nss"},
3315
  {0x4, "5Nss"},
3316
  {0x5, "6Nss"},
3317
  {0x6, "7Nss"},
3318
  {0x7, "8Nss"},
3319
  {0, NULL}
3320
};
3321
3322
96
#define VHT_ACT_VHT_COMPRESSED_BEAMFORMING  0
3323
18
#define VHT_ACT_GROUP_ID_MANAGEMENT         1
3324
2
#define VHT_ACT_OPERATION_MODE_NOTIFICATION 2
3325
3326
static const value_string vht_action_vals[] = {
3327
  {VHT_ACT_VHT_COMPRESSED_BEAMFORMING, "VHT Compressed Beamforming"},
3328
  {VHT_ACT_GROUP_ID_MANAGEMENT, "Group ID Management"},
3329
  {VHT_ACT_OPERATION_MODE_NOTIFICATION, "Operating Mode Notification"},
3330
  {0,   NULL}
3331
};
3332
3333
static const value_string ff_vht_mimo_cntrl_nc_index_vals[] = {
3334
  {0x00, "1 Column"},
3335
  {0x01, "2 Columns"},
3336
  {0x02, "3 Columns"},
3337
  {0x03, "4 Columns"},
3338
  {0x04, "5 Columns"},
3339
  {0x05, "6 Columns"},
3340
  {0x06, "7 Columns"},
3341
  {0x07, "8 Columns"},
3342
  {0, NULL}
3343
};
3344
3345
static const value_string ff_vht_mimo_cntrl_nr_index_vals[] = {
3346
  {0x00, "1 Row"},
3347
  {0x01, "2 Rows"},
3348
  {0x02, "3 Rows"},
3349
  {0x03, "4 Rows"},
3350
  {0x04, "5 Rows"},
3351
  {0x05, "6 Rows"},
3352
  {0x06, "7 Rows"},
3353
  {0x07, "8 Rows"},
3354
  {0, NULL}
3355
};
3356
3357
static const value_string ff_vht_mimo_cntrl_channel_width_vals[] = {
3358
  {0x00, "20 MHz"},
3359
  {0x01, "40 MHz"},
3360
  {0x02, "80 MHz"},
3361
  {0x03, "160 MHz / 80+80 MHz"},
3362
  {0, NULL}
3363
};
3364
3365
static const value_string ff_vht_mimo_cntrl_grouping_vals[] = {
3366
  {0x00, "1 (No Grouping)"},
3367
  {0x01, "2"},
3368
  {0x02, "4"},
3369
  {0x03, "Reserved"},
3370
  {0, NULL}
3371
};
3372
3373
static const value_string ff_vht_mimo_cntrl_feedback_vals[] = {
3374
  {0x00, "SU"},
3375
  {0x01, "MU"},
3376
  {0, NULL}
3377
};
3378
3379
2
#define S1G_ACT_AID_SWITCH_REQUEST   0
3380
0
#define S1G_ACT_AID_SWITCH_RESPONSE  1
3381
0
#define S1G_ACT_SYNC_CONTROL         2
3382
0
#define S1G_ACT_STA_INFO_ANNOUNCE    3
3383
1
#define S1G_ACT_EDCA_PARAM_SET       4
3384
1
#define S1G_ACT_EL_OPERATION         5
3385
0
#define S1G_ACT_TWT_SETUP            6
3386
0
#define S1G_ACT_TWT_TEARDOWN         7
3387
0
#define S1G_ACT_SECT_GROUP_ID_LIST   8
3388
0
#define S1G_ACT_SECT_ID_FEEDBACK     9
3389
#define S1G_ACT_RESERVED             10
3390
0
#define S1G_ACT_TWT_INFORMATION      11
3391
3392
static const value_string s1g_action_vals[] = {
3393
  {S1G_ACT_AID_SWITCH_REQUEST, "AID Switch Request"},
3394
  {S1G_ACT_AID_SWITCH_RESPONSE, "AID Switch Response"},
3395
  {S1G_ACT_SYNC_CONTROL, "Sync Control"},
3396
  {S1G_ACT_STA_INFO_ANNOUNCE, "STA Information Announcement"},
3397
  {S1G_ACT_EDCA_PARAM_SET, "EDCA Parameter Set"},
3398
  {S1G_ACT_EL_OPERATION, "EL Operation"},
3399
  {S1G_ACT_TWT_SETUP, "TWT Setup"},
3400
  {S1G_ACT_TWT_TEARDOWN, "TWT Teardown"},
3401
  {S1G_ACT_SECT_GROUP_ID_LIST, "Sectorized Group ID List"},
3402
  {S1G_ACT_SECT_ID_FEEDBACK, "Sector ID Feedback"},
3403
  {S1G_ACT_RESERVED, "Reserved"},
3404
  {S1G_ACT_TWT_INFORMATION, "TWT Information"},
3405
  {0,   NULL},
3406
};
3407
3408
1
#define PROT_S1G_ACT_REACH_ADDR_UPDATE    0
3409
1
#define PROT_S1G_ACT_RELAY_ACTIVATE_REQ   1
3410
1
#define PROT_S1G_ACT_RELAY_ACTIVATE_RESP  2
3411
1
#define PROT_S1G_ACT_HEADER_COMPRESSION   3
3412
0
#define PROT_S1G_ACT_TWT_SETUP            4
3413
0
#define PROT_S1G_ACT_TWT_TEARDOWN         5
3414
0
#define PROT_S1G_ACT_TWT_INFORMATION      6
3415
0
#define PROT_S1G_ACT_AID_SWITCH_REQUEST   7
3416
0
#define PROT_S1G_ACT_AID_SWITCH_RESPONSE  8
3417
0
#define PROT_S1G_ACT_SYNC_CONTROL         9
3418
0
#define PROT_S1G_ACT_STA_INFO_ANNOUNCE    10
3419
0
#define PROT_S1G_ACT_EDCA_PARAM_SET       11
3420
0
#define PROT_S1G_ACT_EL_OPERATION         12
3421
0
#define PROT_S1G_ACT_SECT_GROUP_ID_LIST   13
3422
1
#define PROT_S1G_ACT_SECT_ID_FEEDBACK     14
3423
3424
static const value_string prot_s1g_action_vals[] = {
3425
  {PROT_S1G_ACT_REACH_ADDR_UPDATE, "Reachable Address Update"},
3426
  {PROT_S1G_ACT_RELAY_ACTIVATE_REQ, "Relay Activation Request"},
3427
  {PROT_S1G_ACT_RELAY_ACTIVATE_RESP, "Relay Activation Response"},
3428
  {PROT_S1G_ACT_HEADER_COMPRESSION, "Header Compression"},
3429
  {PROT_S1G_ACT_TWT_SETUP, "Protected TWT Setup"},
3430
  {PROT_S1G_ACT_TWT_TEARDOWN, "Protected TWT Teardown"},
3431
  {PROT_S1G_ACT_TWT_INFORMATION, "Protected TWT Information"},
3432
  {PROT_S1G_ACT_AID_SWITCH_REQUEST, "Protected AID Switch Request"},
3433
  {PROT_S1G_ACT_AID_SWITCH_RESPONSE, "Protected AID Switch Response"},
3434
  {PROT_S1G_ACT_SYNC_CONTROL, "Protected Sync Control"},
3435
  {PROT_S1G_ACT_STA_INFO_ANNOUNCE, "Protected STA Information Announcement"},
3436
  {PROT_S1G_ACT_EDCA_PARAM_SET, "Protected EDCA Parameter Set"},
3437
  {PROT_S1G_ACT_EL_OPERATION, "Protected EL Operation"},
3438
  {PROT_S1G_ACT_SECT_GROUP_ID_LIST, "Protected Sectorized Group ID List"},
3439
  {PROT_S1G_ACT_SECT_ID_FEEDBACK, "Protected Sector ID Feedback"},
3440
  {0,   NULL},
3441
};
3442
3443
static const value_string twt_neg_type_vals[] = {
3444
  {0x0, "Individual TWT"},
3445
  {0x1, "Wake TBTT"},
3446
  {0x2, "Broadcast TWT schedule, TWT element in broadcast management frame"},
3447
  {0x3, "Broadcast TWT schedule, TWT element in unicast management frame"},
3448
  {0,   NULL},
3449
};
3450
3451
static const true_false_string twt_responder_pm_mode_tfs = {
3452
  "AP may doze outside the TWT",
3453
  "AP is always awake",
3454
};
3455
3456
static const true_false_string twt_requester_tfs = {
3457
  "This STA is a TWT Requesting STA",
3458
  "This STA is a TWT Responding STA or a TWT scheduling AP",
3459
};
3460
3461
static const true_false_string twt_info_frame_disabled_tfs = {
3462
  "Reception of TWT Information frames is disabled",
3463
  "Reception of TWT Information frames is enabled",
3464
};
3465
3466
static const true_false_string twt_wake_duration_unit_tfs = {
3467
  "1 TU",
3468
  "256 microseconds",
3469
};
3470
3471
93
#define REQUEST_TWT   0
3472
155
#define SUGGEST_TWT   1
3473
222
#define DEMAND_TWT    2
3474
48
#define TWT_GROUPING  3
3475
478
#define ACCEPT_TWT    4
3476
594
#define ALTERNATE_TWT 5
3477
49
#define DICTATE_TWT   6
3478
110
#define REJECT_TWT    7
3479
3480
static const value_string twt_setup_cmd[] = {
3481
  {REQUEST_TWT,   "Request TWT"},
3482
  {SUGGEST_TWT,   "Suggest TWT"},
3483
  {DEMAND_TWT,    "Demand TWT"},
3484
  {TWT_GROUPING,  "TWT Grouping"},
3485
  {ACCEPT_TWT,    "Accept TWT"},
3486
  {ALTERNATE_TWT, "Alternate TWT"},
3487
  {DICTATE_TWT,   "Dictate TWT"},
3488
  {REJECT_TWT,    "Reject TWT"},
3489
  {0,   NULL},
3490
};
3491
3492
static const true_false_string twt_trigger = {
3493
  "TWT SP includes trigger frames",
3494
  "TWT SP does not include trigger frames",
3495
};
3496
3497
static const true_false_string twt_implicit = {
3498
  "TWT is implicit",
3499
  "TWT is explicit",
3500
};
3501
3502
static const true_false_string twt_flow_type = {
3503
  "TWT is unannounced, the TWT responding STA can send frames at any time",
3504
  "TWT is announced, the TWT Requesting STA will send trigger frames",
3505
};
3506
3507
static const value_string he_phy_device_class_vals[] = {
3508
  { 0, "Class B Device" },
3509
  { 1, "Class A Device" },
3510
  { 0, NULL }
3511
};
3512
3513
static const value_string he_phy_midamble_tx_rx_max_nsts_vals[] = {
3514
  { 0, "1 Space-Time Stream" },
3515
  { 1, "2 Space-Time Streams" },
3516
  { 2, "3 Space-Time Streams" },
3517
  { 3, "4 Space-Time Streams" },
3518
  { 0, NULL }
3519
};
3520
3521
static const value_string he_phy_dcm_max_constellation_vals[] = {
3522
  { 0, "DCM is not supported" },
3523
  { 1, "BPSK" },
3524
  { 2, "QPSK" },
3525
  { 3, "16-QAM" },
3526
  { 0, NULL }
3527
};
3528
3529
static const value_string he_phy_dcm_max_nss_vals[] = {
3530
  { 0, "1 Spatial Stream" },
3531
  { 1, "2 Spatial Streams" },
3532
  { 0, NULL }
3533
};
3534
3535
static const value_string he_phy_dcm_max_ru_vals[] = {
3536
  { 0, "242-tone RU" },
3537
  { 1, "484-tone RU" },
3538
  { 2, "996-tone RU" },
3539
  { 3, "2x996-tone RU"},
3540
  { 0, NULL }
3541
};
3542
3543
static const value_string he_phy_nominal_packet_padding_vals[] = {
3544
  { 0, "0 µs for all constellations, Nss and RU allocations" },
3545
  { 1, "8 µs for all constellations, Nss and RU allocations" },
3546
  { 2, "16 µs for all constellations, Nss and RU allocations" },
3547
  { 3, "Reserved" },
3548
  { 0, NULL }
3549
};
3550
3551
// MBO-OCE attributes
3552
0
#define MBO_AP_CAPABILTY_INDICATION     1
3553
0
#define MBO_NON_PREF_CHANNEL_REPORT     2
3554
0
#define MBO_CELLULAR_DATA_CAPABILITIES  3
3555
0
#define MBO_ASSOCIATION_DISALLOWED      4
3556
0
#define MBO_CELLULAR_DATA_PREFERENCE    5
3557
0
#define MBO_TRANSITION_REASON           6
3558
0
#define MBO_TRANSITION_REJECTION_REASON 7
3559
0
#define MBO_ASSOCIATION_RETRY_DELAY     8
3560
0
#define OCE_CAPABILTY_INDICATION        101
3561
0
#define OCE_RSSI_ASSOCIATION_REJECTION  102
3562
0
#define OCE_REDUCED_WAN_METRICS         103
3563
0
#define OCE_RNR_COMPLETENESS            104
3564
0
#define OCE_PROBE_SUPPR_BSSID           105
3565
0
#define OCE_PROBE_SUPPR_SSID            106
3566
3567
static const value_string wfa_mbo_oce_attr_id_vals[] = {
3568
  { MBO_AP_CAPABILTY_INDICATION, "MBO AP Capability Indication"},
3569
  { MBO_NON_PREF_CHANNEL_REPORT, "Non-preferred Channel Report"},
3570
  { MBO_CELLULAR_DATA_CAPABILITIES, "Cellular Data Capabilities"},
3571
  { MBO_ASSOCIATION_DISALLOWED, "Association Disallowed"},
3572
  { MBO_CELLULAR_DATA_PREFERENCE, "Cellular Data Connection Preference"},
3573
  { MBO_TRANSITION_REASON, "Transition Reason Code BTM Request"},
3574
  { MBO_TRANSITION_REJECTION_REASON, "Transition Rejection Reason Code"},
3575
  { MBO_ASSOCIATION_RETRY_DELAY, "Association Retry Delay"},
3576
  { OCE_CAPABILTY_INDICATION, "OCE Capability Indication" },
3577
  { OCE_RSSI_ASSOCIATION_REJECTION, "RSSI-based (Re-)Association Rejection" },
3578
  { OCE_REDUCED_WAN_METRICS, "Reduced WAN Metrics" },
3579
  { OCE_RNR_COMPLETENESS, "RNR Completeness" },
3580
  { OCE_PROBE_SUPPR_BSSID, "Probe Suppression BSSIDs" },
3581
  { OCE_PROBE_SUPPR_SSID, "Probe Suppression SSIDs" },
3582
  { 0, NULL}
3583
};
3584
3585
static const value_string wfa_mbo_non_pref_chan_pref_vals[] = {
3586
  { 0, "non-operable band/channel for the STA"},
3587
  { 1, "band/channel the STA prefers not to operate in"},
3588
  { 255, "band/channel the STA prefers to operate in"},
3589
  { 0, NULL }
3590
};
3591
3592
static const value_string wfa_mbo_non_pref_chan_reason_vals[] = {
3593
  { 0, "Unspecified reason"},
3594
  { 1, "An unacceptable level of interference is being experienced by STA in this channel"},
3595
  { 2, "The STA has another active connection in this channel, "
3596
    "or near enough to this channel to cause operating interference"},
3597
  { 0, NULL }
3598
};
3599
3600
static const value_string wfa_mbo_cellular_cap_vals[] = {
3601
  { 1, "Cellular data connection available"},
3602
  { 2, "Cellular data connection not available"},
3603
  { 3, "Not Cellular data capable"},
3604
  { 0, NULL }
3605
};
3606
3607
static const value_string wfa_mbo_assoc_dissallow_reason_vals[] = {
3608
  { 1, "Unspecified reason"},
3609
  { 2, "Maximum number of associated STAs reached"},
3610
  { 3, "Air interface is overloaded"},
3611
  { 4, "Authentication server overloaded"},
3612
  { 5, "Insufficient RSSI"},
3613
  { 0, NULL }
3614
};
3615
3616
static const value_string wfa_mbo_cellular_pref_vals[] = {
3617
  { 0, "Excluded. The AP does not want STA to use the cellular data connection"},
3618
  { 1, "The AP prefers the STA should not use cellular data connection"},
3619
  { 255, "The AP prefers the STA should use cellular data connection"},
3620
  { 0, NULL }
3621
};
3622
3623
static const value_string wfa_mbo_transition_reason_vals[] = {
3624
  { 0, "Unspecified"},
3625
  { 1, "Excessive frame loss rate"},
3626
  { 2, "Excessive delay for current traffic stream"},
3627
  { 3, "Insufficient bandwidth for current traffic stream"},
3628
  { 4, "Load balancing"},
3629
  { 5, "Low RSSI"},
3630
  { 6, "Received excessive number of retransmissions"},
3631
  { 7, "High interference"},
3632
  { 8, "Gray zone"},
3633
  { 9, "Transitioning to a premium AP"},
3634
  { 0, NULL }
3635
};
3636
3637
static const value_string wfa_mbo_transition_rej_reason_vals[] = {
3638
  { 0, "Unspecified"},
3639
  { 1, "Excessive frame loss rate expected by the STA if it transitions"},
3640
  { 2, "Excessive delay for current traffic stream would be incurred by BSS transition at this time"},
3641
  { 3, "Insufficient QoS capacity for current traffic stream expected by the STA if it transitions"},
3642
  { 4, "Low RSSI in frames being received by the STA from to the suggested candidate BSS(s)"},
3643
  { 5, "High interference expected by STA if it transitions"},
3644
  { 6, "Service Availability – the STA expects that services it needs "
3645
    "which are available at its serving AP will not be available if it transitions"},
3646
  { 0, NULL }
3647
};
3648
3649
/* 802.11ai FILS Discovery */
3650
15
#define PA_FILS_FC_SSID_LENGTH  0x001F
3651
15
#define PA_FILS_FC_CAPABILITY   0x0020
3652
15
#define PA_FILS_FC_SHORT_SSID   0x0040
3653
15
#define PA_FILS_FC_AP_CSN       0x0080
3654
15
#define PA_FILS_FC_ANO          0x0100
3655
15
#define PA_FILS_FC_CCFS1        0x0200
3656
15
#define PA_FILS_FC_PC           0x0400
3657
15
#define PA_FILS_FC_RSN_INFO     0x0800
3658
15
#define PA_FILS_FC_LENGTH       0x1000
3659
15
#define PA_FILS_FC_MD           0x2000
3660
14
#define PA_FILS_FC_RESERVED     0xC000
3661
3662
static const value_string fils_discovery_capability_bss_operating_channel_width[] = {
3663
  {0, "20MHz (or 22Mhz) / TVHT_W"},
3664
  {1, "40MHZ / TVHT_W+W"},
3665
  {2, "80MHz / TVHT_2W"},
3666
  {3, "160MHz or 80MHz+80MHz / TVHT_4W or TVHT_2W+2W"},
3667
  {0, NULL}
3668
};
3669
3670
static const value_string fils_discovery_capability_max_number_of_spatial_streams[] = {
3671
  {0, "1 spatial stream"},
3672
  {1, "2 spatial streams"},
3673
  {2, "3 spatial streams"},
3674
  {3, "4 spatial streams"},
3675
  {4, "5-8 spatial streams"},
3676
  {0, NULL}
3677
};
3678
3679
static const value_string fils_discovery_capability_phy_index[] = {
3680
  {0, "HR/DSSS"},
3681
  {1, "ERP-OFDM"},
3682
  {2, "HT"},
3683
  {3, "VHT or TVHT"},
3684
  {4, "HE"},
3685
  {0x00, NULL}
3686
};
3687
3688
static const value_string fils_discovery_capability_fils_minimum_rate_dsss[] = {
3689
  {0, "1 Mbps"},
3690
  {1, "2 Mbps"},
3691
  {2, "5.5 Mbps"},
3692
  {3, "11 Mbps"},
3693
  {0x00, NULL}
3694
};
3695
3696
static const value_string fils_discovery_capability_fils_minimum_rate_ofdm[] = {
3697
  {0, "6 Mbps"},
3698
  {1, "9 Mbps"},
3699
  {2, "12 Mbps"},
3700
  {3, "18 Mbps"},
3701
  {4, "24 Mbps"},
3702
  {0x00, NULL}
3703
};
3704
3705
static const value_string fils_discovery_capability_fils_minimum_rate_ht_vht_tvht[] = {
3706
  {0, "MCS 0"},
3707
  {1, "MCS 1"},
3708
  {2, "MCS 2"},
3709
  {3, "MCS 3"},
3710
  {4, "MCS 4"},
3711
  {0x00, NULL}
3712
};
3713
3714
static const value_string fils_discovery_capability_fils_minimum_rate_he[] = {
3715
  {0, "HE-MCS 0"},
3716
  {1, "HE-MCS 1"},
3717
  {2, "HE-MCS 2"},
3718
  {3, "HE-MCS 3"},
3719
  {4, "HE-MCS 4"},
3720
  {0x00, NULL}
3721
};
3722
3723
static const value_string wfa_rsne_variant_vals[] = {
3724
  { 0, "RSNE" },
3725
  { 1, "RSNE Override" },
3726
  { 2, "RSNE Override 2" },
3727
  { 0, NULL }
3728
};
3729
3730
static int proto_wlan;
3731
static int proto_centrino;
3732
static int proto_aggregate;
3733
static bool ieee80211_tvb_invalid;
3734
3735
/* ************************************************************************* */
3736
/*                Header field info values for FC-field                      */
3737
/* ************************************************************************* */
3738
static int hf_ieee80211_fc_field;
3739
static int hf_ieee80211_fc_proto_version;
3740
static int hf_ieee80211_fc_frame_type;
3741
static int hf_ieee80211_fc_frame_subtype;
3742
static int hf_ieee80211_fc_frame_extension;
3743
static int hf_ieee80211_fc_frame_type_subtype;
3744
3745
static int hf_ieee80211_fc_flags;
3746
static int hf_ieee80211_fc_flags_str;
3747
static int hf_ieee80211_fc_to_ds;
3748
static int hf_ieee80211_fc_from_ds;
3749
static int hf_ieee80211_fc_data_ds;
3750
3751
static int hf_ieee80211_fc_more_frag;
3752
static int hf_ieee80211_fc_retry;
3753
static int hf_ieee80211_fc_pwr_mgt;
3754
static int hf_ieee80211_fc_more_data;
3755
static int hf_ieee80211_fc_protected;
3756
static int hf_ieee80211_fc_order;
3757
3758
/* S1G Flags */
3759
static int hf_ieee80211_fc_s1g_next_tbtt_present;
3760
static int hf_ieee80211_fc_s1g_compressed_ssid_present;
3761
static int hf_ieee80211_fc_s1g_ano_present;
3762
static int hf_ieee80211_fc_s1g_bss_bw;
3763
static int hf_ieee80211_fc_s1g_security;
3764
static int hf_ieee80211_fc_s1g_ap_pm;
3765
3766
/* S1G PV0 fields */
3767
static int hf_ieee80211_fc_s1g_bw_indication;
3768
static int hf_ieee80211_fc_s1g_dynamic_indication;
3769
3770
/* PV1 fields */
3771
static int hf_ieee80211_fc_pv1_proto_version;
3772
static int hf_ieee80211_fc_pv1_type;
3773
static int hf_ieee80211_fc_pv1_ptid;
3774
static int hf_ieee80211_fc_pv1_mgmt_subtype;
3775
static int hf_ieee80211_fc_pv1_cntl_subtype;
3776
static int hf_ieee80211_fc_pv1_unk_field;
3777
static int hf_ieee80211_fc_pv1_bw_indication;
3778
static int hf_ieee80211_fc_pv1_dynamic_indication;
3779
static int hf_ieee80211_fc_pv1_cntl_power_mgmt;
3780
static int hf_ieee80211_fc_pv1_cntl_more_data;
3781
static int hf_ieee80211_fc_pv1_cntl_flow_control;
3782
static int hf_ieee80211_fc_pv1_cntl_next_twt_info;
3783
static int hf_ieee80211_fc_pv1_mgmt_pr_next_tbt;
3784
static int hf_ieee80211_fc_pv1_mgmt_pr_full_ssid;
3785
static int hf_ieee80211_fc_pv1_mgmt_pr_ano;
3786
static int hf_ieee80211_fc_pv1_mgmt_pr_bss_bw;
3787
static int hf_ieee80211_fc_pv1_mgmt_pr_security;
3788
static int hf_ieee80211_fc_pv1_mgmt_pr_1mhz_pc;
3789
static int hf_ieee80211_fc_pv1_mgmt_pr_slot_assign;
3790
static int hf_ieee80211_fc_pv1_mgmt_pr_more_frag;
3791
static int hf_ieee80211_fc_pv1_mgmt_pr_pwr_mgmt;
3792
static int hf_ieee80211_fc_pv1_mgmt_pr_grp_indic;
3793
static int hf_ieee80211_fc_pv1_mgmt_pr_protected;
3794
static int hf_ieee80211_fc_pv1_mgmt_pr_end_of_svc;
3795
static int hf_ieee80211_fc_pv1_mgmt_pr_relayed_frm;
3796
static int hf_ieee80211_fc_pv1_mgmt_pr_ack_policy;
3797
static int hf_ieee80211_fc_pv1_from_ds;
3798
static int hf_ieee80211_fc_pv1_more_fragments;
3799
static int hf_ieee80211_fc_pv1_power_mgmt;
3800
static int hf_ieee80211_fc_pv1_more_data;
3801
static int hf_ieee80211_fc_pv1_protected_frame;
3802
static int hf_ieee80211_fc_pv1_end_service_per;
3803
static int hf_ieee80211_fc_pv1_relayed_frame;
3804
static int hf_ieee80211_fc_pv1_ack_policy;
3805
static int hf_ieee80211_pv1_sid;
3806
static int hf_ieee80211_pv1_sid_association_id;
3807
static int hf_ieee80211_pv1_sid_a3_present;
3808
static int hf_ieee80211_pv1_sid_a4_present;
3809
static int hf_ieee80211_pv1_sid_a_msdu;
3810
3811
static int hf_ieee80211_pv1_cnt_stack_tetra_timest;
3812
static int hf_ieee80211_pv1_cnt_bat_beacon_seq;
3813
static int hf_ieee80211_pv1_cnt_bat_penta_timest;
3814
static int hf_ieee80211_pv1_cnt_bat_next_twt_info;
3815
static int hf_ieee80211_pv1_cnt_bat_stating_seq_cntl;
3816
static int hf_ieee80211_pv1_cnt_bat_bitmap;
3817
3818
static int hf_ieee80211_pv1_mgmt_reserved;
3819
static int hf_ieee80211_pv1_cntl_reserved;
3820
3821
typedef struct retransmit_key {
3822
  uint8_t bssid[6];
3823
  uint8_t src[6];
3824
  uint16_t seq_control;
3825
  unsigned   fnum;
3826
} retransmit_key;
3827
3828
static GHashTable *fc_analyse_retransmit_table;
3829
static GHashTable *fc_first_frame_table;
3830
3831
static int hf_ieee80211_fc_analysis_retransmission;
3832
static int hf_ieee80211_fc_analysis_retransmission_frame;
3833
3834
/* ************************************************************************* */
3835
/*                   Header values for Duration/ID field                     */
3836
/* ************************************************************************* */
3837
static int hf_ieee80211_did_duration;
3838
static int hf_ieee80211_assoc_id;
3839
3840
/* ************************************************************************* */
3841
/*         Header values for different address-fields (all 4 of them)        */
3842
/* ************************************************************************* */
3843
static int hf_ieee80211_addr_da;  /* Destination address subfield */
3844
static int hf_ieee80211_addr_da_resolved;  /* Dst addr subfield resolved*/
3845
static int hf_ieee80211_addr_da_oui;  /* Destination address subfield */
3846
static int hf_ieee80211_addr_da_oui_resolved;  /* Dst addr subfield resolved*/
3847
static int hf_ieee80211_addr_da_ig;  /* Destination address IG bit */
3848
static int hf_ieee80211_addr_da_lg;  /* Destination address LG bit */
3849
3850
static int hf_ieee80211_addr_sa;  /* Source address subfield */
3851
static int hf_ieee80211_addr_sa_resolved;  /* Src addr subfield resolved*/
3852
static int hf_ieee80211_addr_sa_oui;  /* Source address subfield */
3853
static int hf_ieee80211_addr_sa_oui_resolved;  /* Src addr subfield resolved*/
3854
static int hf_ieee80211_addr_sa_ig;  /* Source address IG bit */
3855
static int hf_ieee80211_addr_sa_lg;  /* Source address LG bit */
3856
3857
static int hf_ieee80211_addr_ra;  /* Receiver address subfield */
3858
static int hf_ieee80211_addr_ra_resolved;  /* Rcv addr subfield resolved*/
3859
static int hf_ieee80211_addr_ra_oui;  /* Receiver address subfield */
3860
static int hf_ieee80211_addr_ra_oui_resolved;  /* Rcv addr subfield resolved*/
3861
static int hf_ieee80211_addr_ra_ig;  /* Receiver address IG bit */
3862
static int hf_ieee80211_addr_ra_lg;  /* Receiver address LG bit */
3863
3864
static int hf_ieee80211_addr_ta;  /* Transmitter address subfield */
3865
static int hf_ieee80211_addr_ta_resolved;  /* Txm addr subfield resolved*/
3866
static int hf_ieee80211_addr_ta_oui;  /* Transmitter address subfield */
3867
static int hf_ieee80211_addr_ta_oui_resolved;  /* Txm addr subfield resolved*/
3868
static int hf_ieee80211_addr_ta_ig;  /* Transmitter address IG bit */
3869
static int hf_ieee80211_addr_ta_lg;  /* Transmitter address LG bit */
3870
3871
static int hf_ieee80211_addr_bssid;  /* address is bssid */
3872
static int hf_ieee80211_addr_bssid_resolved;  /* bssid resolved*/
3873
static int hf_ieee80211_addr_bssid_oui;  /* address is bssid */
3874
static int hf_ieee80211_addr_bssid_oui_resolved;  /* bssid resolved*/
3875
static int hf_ieee80211_addr_bssid_ig;  /* bssid address IG bit */
3876
static int hf_ieee80211_addr_bssid_lg;  /* bssid address LG bit */
3877
3878
static int hf_ieee80211_addr_staa;  /* address is station address */
3879
static int hf_ieee80211_addr_staa_resolved;  /* station address resolved*/
3880
static int hf_ieee80211_addr_staa_oui;  /* address is station address */
3881
static int hf_ieee80211_addr_staa_oui_resolved;  /* station address resolved*/
3882
static int hf_ieee80211_addr_staa_ig;  /* station address IG bit */
3883
static int hf_ieee80211_addr_staa_lg;  /* station address LG bit */
3884
3885
static int hf_ieee80211_addr;  /* Source or destination address subfield */
3886
static int hf_ieee80211_addr_resolved;/*Src/dst address subfield resolved*/
3887
static int hf_ieee80211_addr_oui;  /* Source or destination address subfield */
3888
static int hf_ieee80211_addr_oui_resolved;/*Src/dst address subfield resolved*/
3889
static int hf_ieee80211_addr_ig;  /* Src/dst address IG bit */
3890
static int hf_ieee80211_addr_lg;  /* Src/dst address LG bit */
3891
3892
static int hf_ieee80211_mgt;
3893
3894
/* ************************************************************************* */
3895
/*                Header values for QoS control field                        */
3896
/* ************************************************************************* */
3897
static int hf_ieee80211_qos;
3898
static int hf_ieee80211_qos_tid;
3899
static int hf_ieee80211_qos_priority;
3900
static int hf_ieee80211_qos_ack_policy;
3901
static int hf_ieee80211_qos_amsdu_present;
3902
static int hf_ieee80211_qos_eosp;
3903
static int hf_ieee80211_qos_bit4;
3904
static int hf_ieee80211_qos_txop_limit;
3905
static int hf_ieee80211_qos_ps_buf_state;
3906
static int hf_ieee80211_qos_buf_state_indicated;
3907
static int hf_ieee80211_qos_highest_pri_buf_ac;
3908
static int hf_ieee80211_qos_qap_buf_load;
3909
static int hf_ieee80211_qos_txop_dur_req;
3910
static int hf_ieee80211_qos_queue_size;
3911
static int hf_ieee80211_qos_mesh_ctl_present;
3912
static int hf_ieee80211_qos_mesh_ps_rsvd;
3913
static int hf_ieee80211_qos_mesh_ps_unicast;
3914
static int hf_ieee80211_qos_mesh_ps_multicast;
3915
static int hf_ieee80211_qos_mesh_rspi;
3916
3917
/* ************************************************************************* */
3918
/*                Header values for HT control field (+HTC) and HE control   */
3919
/* ************************************************************************* */
3920
/* 802.11-2012 and 802.11ac-2013 8.2.4.6 */
3921
static int hf_ieee80211_htc;
3922
static int hf_ieee80211_htc_vht;
3923
static int hf_ieee80211_htc_he;
3924
static int hf_ieee80211_htc_he_ctrl_id;
3925
static int hf_ieee80211_he_a_control_padding;
3926
static int hf_ieee80211_he_a_control_ones;
3927
static int hf_ieee80211_he_trs_he_tb_ppdu_len;
3928
static int hf_ieee80211_he_trs_ru_allocation;
3929
static int hf_ieee80211_he_dl_tx_power;
3930
static int hf_ieee80211_he_ul_target_rssi;
3931
static int hf_ieee80211_he_ul_mcs;
3932
static int hf_ieee80211_he_ul_reserved;
3933
static int hf_ieee80211_he_om_rx_nss;
3934
static int hf_ieee80211_he_om_channel_width;
3935
static int hf_ieee80211_he_om_ul_mu_disable;
3936
static int hf_ieee80211_he_om_tx_nsts;
3937
static int hf_ieee80211_he_om_er_su_disable;
3938
static int hf_ieee80211_he_om_dl_mu_mimo_resound;
3939
static int hf_ieee80211_he_om_ul_mu_data_disable;
3940
static int hf_ieee80211_he_hla_unsolicited_mfb;
3941
static int hf_ieee80211_he_hla_mrq;
3942
static int hf_ieee80211_he_hla_nss;
3943
static int hf_ieee80211_he_hla_he_mcs;
3944
static int hf_ieee80211_he_hla_dcm;
3945
static int hf_ieee80211_he_hla_ru;
3946
static int hf_ieee80211_he_hla_bw;
3947
static int hf_ieee80211_he_hla_msi_ppdu_type;
3948
static int hf_ieee80211_he_hla_tx_bf;
3949
static int hf_ieee80211_he_hla_reserved;
3950
static int hf_ieee80211_he_bsr_aci_bitmap;
3951
static int hf_ieee80211_he_bsr_delta_tid;
3952
static int hf_ieee80211_he_bsr_aci_high;
3953
static int hf_ieee80211_he_bsr_scaling_factor;
3954
static int hf_ieee80211_he_bsr_queue_size_high;
3955
static int hf_ieee80211_he_bsr_queue_size_all;
3956
static int hf_ieee80211_he_uph_ul_power_headroom;
3957
static int hf_ieee80211_he_uph_ul_min_transmit_power_flag;
3958
static int hf_ieee80211_he_uph_reserved;
3959
static int hf_ieee80211_he_cci_ac_constraint;
3960
static int hf_ieee80211_he_cci_rdg_more_ppdu;
3961
static int hf_ieee80211_he_cci_sr_ppdu_indic;
3962
static int hf_ieee80211_he_cci_reserved;
3963
static int hf_ieee80211_he_eht_om_rx_nss_ext;
3964
static int hf_ieee80211_he_eht_om_chan_w_ext;
3965
static int hf_ieee80211_he_eht_om_tx_nsts_ext;
3966
static int hf_ieee80211_he_eht_om_reserved;
3967
static int hf_ieee80211_he_srs_ppdu_resp_dur;
3968
static int hf_ieee80211_he_srs_reserved;
3969
static int hf_ieee80211_he_aar_assisted_ap_bitmap;
3970
static int hf_ieee80211_he_aar_reserved;
3971
static int hf_ieee80211_he_btc_avail_chan;
3972
static int hf_ieee80211_he_btc_reserved;
3973
static int hf_ieee80211_he_trigger_common_info;
3974
static int hf_ieee80211_he_trigger_type;
3975
static int hf_ieee80211_he_trigger_ul_length;
3976
static int hf_ieee80211_he_trigger_more_tf;
3977
static int hf_ieee80211_he_trigger_cs_required;
3978
static int hf_ieee80211_he_trigger_ul_bw;
3979
static int hf_ieee80211_he_trigger_gi_and_ltf_type;
3980
static int hf_ieee80211_he_trigger_mu_mimo_ltf_mode;
3981
static int hf_ieee80211_he_trigger_num_he_ltf_syms_etc;
3982
static int hf_ieee80211_he_trigger_ul_stbc;
3983
static int hf_ieee80211_he_trigger_ldpc_extra_sym_seg;
3984
static int hf_ieee80211_he_trigger_ap_tx_power;
3985
static int hf_ieee80211_he_trigger_pre_fec_padding_factor;
3986
static int hf_ieee80211_he_trigger_pe_disambiguity;
3987
static int hf_ieee80211_he_trigger_ul_spatial_reuse;
3988
static int hf_ieee80211_he_trigger_doppler;
3989
static int hf_ieee80211_he_trigger_ul_he_sig_a_reserved;
3990
static int hf_ieee80211_he_trigger_reserved;
3991
static int hf_ieee80211_he_trigger_user_info;
3992
static int hf_ieee80211_he_trigger_user_info_padding_start;
3993
static int hf_ieee80211_he_trigger_padding;
3994
static int hf_ieee80211_he_trigger_bar_ctrl;
3995
static int hf_ieee80211_he_trigger_bar_ctrl_ba_ack_policy;
3996
static int hf_ieee80211_he_trigger_bar_ctrl_ba_type;
3997
static int hf_ieee80211_he_trigger_bar_ctrl_reserved;
3998
static int hf_ieee80211_he_trigger_bar_ctrl_tid_info;
3999
static int hf_ieee80211_he_trigger_bar_info;
4000
static int hf_ieee80211_he_trigger_bar_info_blk_ack_seq_ctrl;
4001
static int hf_ieee80211_he_trigger_mpdu_mu_spacing;
4002
static int hf_ieee80211_he_trigger_tid_aggregation_limit;
4003
static int hf_ieee80211_he_trigger_dependent_reserved1;
4004
static int hf_ieee80211_he_trigger_preferred_ac;
4005
static int hf_ieee80211_he_trigger_starting_aid;
4006
static int hf_ieee80211_he_trigger_dependent_reserved2;
4007
static int hf_ieee80211_he_trigger_feedback_type;
4008
static int hf_ieee80211_he_trigger_dependent_reserved3;
4009
static int hf_ieee80211_he_trigger_nfrp_target_rssi;
4010
static int hf_ieee80211_he_trigger_multiplexing_flag;
4011
static int hf_ieee80211_he_trigger_dep_nfrp_user_info;
4012
static int hf_ieee80211_he_trigger_feedback_seg_retrans_bm;
4013
static int hf_ieee80211_he_trigger_aid12;
4014
static int hf_ieee80211_he_trigger_ru_allocation;
4015
static int hf_ieee80211_he_trigger_ru_allocation_region;
4016
static int hf_ieee80211_he_trigger_ru_starting_spatial_stream;
4017
static int hf_ieee80211_he_trigger_ru_number_spatial_streams;
4018
static int hf_ieee80211_he_trigger_ru_number_ra_ru;
4019
static int hf_ieee80211_he_trigger_ru_no_more_ra_ru;
4020
static int hf_ieee80211_he_trigger_ul_fec_coding_type;
4021
static int hf_ieee80211_he_trigger_ul_mcs;
4022
static int hf_ieee80211_he_trigger_ul_dcm;
4023
static int hf_ieee80211_he_trigger_ul_target_rssi;
4024
static int hf_ieee80211_he_trigger_user_reserved;
4025
static int hf_ieee80211_he_trigger_dep_basic_user_info;
4026
static int hf_ieee80211_he_trigger_ranging_common_info_1;
4027
static int hf_ieee80211_he_trigger_ranging_common_info_2;
4028
static int hf_ieee80211_eht_trigger_common_info;
4029
static int hf_ieee80211_eht_trigger_type;
4030
static int hf_ieee80211_eht_trigger_ul_length;
4031
static int hf_ieee80211_eht_trigger_more_tf;
4032
static int hf_ieee80211_eht_trigger_cs_required;
4033
static int hf_ieee80211_eht_trigger_ul_bw;
4034
static int hf_ieee80211_eht_trigger_gi_and_eht_ltf_type;
4035
static int hf_ieee80211_eht_trigger_num_he_eht_ltf_syms_etc;
4036
static int hf_ieee80211_eht_trigger_reserved2;
4037
static int hf_ieee80211_eht_trigger_ldpc_extra_sym_seg;
4038
static int hf_ieee80211_eht_trigger_ap_tx_power;
4039
static int hf_ieee80211_eht_trigger_pre_fec_padding_factor;
4040
static int hf_ieee80211_eht_trigger_pe_disambiguity;
4041
static int hf_ieee80211_eht_trigger_ul_spatial_reuse;
4042
static int hf_ieee80211_eht_trigger_reserved3;
4043
static int hf_ieee80211_eht_trigger_he_eht_p160;
4044
static int hf_ieee80211_eht_trigger_special_user_info_flag;
4045
static int hf_ieee80211_eht_trigger_eht_reserved;
4046
static int hf_ieee80211_eht_trigger_reserved4;
4047
static int hf_ieee80211_eht_trigger_reserved;
4048
static int hf_ieee80211_eht_trigger_aid12;
4049
static int hf_ieee80211_eht_trigger_special_user_info;
4050
static int hf_ieee80211_eht_trigger_phy_version_identifier;
4051
static int hf_ieee80211_eht_trigger_ul_bw_extenstion;
4052
static int hf_ieee80211_eht_trigger_eht_spatial_reuse_1;
4053
static int hf_ieee80211_eht_trigger_eht_spatial_reuse_2;
4054
static int hf_ieee80211_eht_trigger_disregard_u_sig_1;
4055
static int hf_ieee80211_eht_trigger_validate_u_sig_2;
4056
static int hf_ieee80211_eht_trigger_disregard_u_sig_2_4lsb;
4057
static int hf_ieee80211_eht_trigger_disregard_u_sig_2_msb;
4058
static int hf_ieee80211_eht_trigger_special_reserved;
4059
static int hf_ieee80211_eht_trigger_user_info;
4060
static int hf_ieee80211_eht_trigger_ru_allocation_region;
4061
static int hf_ieee80211_eht_trigger_ru_allocation;
4062
static int hf_ieee80211_eht_trigger_ul_fec_coding_type;
4063
static int hf_ieee80211_eht_trigger_ul_eht_mcs;
4064
static int hf_ieee80211_eht_trigger_ru_starting_spatial_stream;
4065
static int hf_ieee80211_eht_trigger_ru_number_spatial_streams;
4066
static int hf_ieee80211_eht_trigger_ul_target_recv_power;
4067
static int hf_ieee80211_eht_trigger_ps160;
4068
static int hf_ieee80211_eht_trigger_user_info_reserved;
4069
static int hf_ieee80211_uhr_trigger_common_info;
4070
static int hf_ieee80211_uhr_trigger_type;
4071
static int hf_ieee80211_uhr_trigger_ul_length;
4072
static int hf_ieee80211_uhr_trigger_more_tf;
4073
static int hf_ieee80211_uhr_trigger_cs_required;
4074
static int hf_ieee80211_uhr_trigger_ul_bw;
4075
static int hf_ieee80211_uhr_trigger_gi_and_he_uhr_ltf_type;
4076
static int hf_ieee80211_uhr_trigger_num_he_uhr_ltf_syms_etc;
4077
static int hf_ieee80211_uhr_trigger_reserved2;
4078
static int hf_ieee80211_uhr_trigger_ldpc_extra_sym_seg;
4079
static int hf_ieee80211_uhr_trigger_ap_tx_power;
4080
static int hf_ieee80211_uhr_trigger_pre_fec_padding_factor;
4081
static int hf_ieee80211_uhr_trigger_pe_disambiguity;
4082
static int hf_ieee80211_uhr_trigger_ul_spatial_reuse;
4083
static int hf_ieee80211_uhr_trigger_reserved3;
4084
static int hf_ieee80211_uhr_trigger_he_uhr_p160;
4085
static int hf_ieee80211_uhr_trigger_special_user_info_flag;
4086
static int hf_ieee80211_uhr_trigger_dru_rru;
4087
static int hf_ieee80211_uhr_trigger_ifcs;
4088
static int hf_ieee80211_uhr_trigger_uhr_reserved;
4089
static int hf_ieee80211_uhr_trigger_reserved4;
4090
static int hf_ieee80211_uhr_trigger_reserved;
4091
static int hf_ieee80211_uhr_trigger_user_info;
4092
static int hf_ieee80211_uhr_trigger_aid12;
4093
static int hf_ieee80211_uhr_trigger_ru_allocation_region;
4094
static int hf_ieee80211_uhr_trigger_ru_allocation;
4095
static int hf_ieee80211_uhr_trigger_ul_fec_coding_type;
4096
static int hf_ieee80211_uhr_trigger_ul_uhr_mcs;
4097
static int hf_ieee80211_uhr_trigger_2xldpc;
4098
static int hf_ieee80211_uhr_trigger_ru_starting_spatial_stream;
4099
static int hf_ieee80211_uhr_trigger_ru_number_spatial_streams;
4100
static int hf_ieee80211_uhr_trigger_dru_distribution_bw;
4101
static int hf_ieee80211_uhr_trigger_dru_reserved;
4102
static int hf_ieee80211_uhr_trigger_ul_target_recv_power;
4103
static int hf_ieee80211_uhr_trigger_ps160;
4104
4105
4106
static int hf_ieee80211_ranging_trigger_subtype1;
4107
static int hf_ieee80211_ranging_trigger_reserved1;
4108
static int hf_ieee80211_ranging_trigger_token;
4109
static int hf_ieee80211_ranging_trigger_subtype2;
4110
static int hf_ieee80211_ranging_trigger_reserved2;
4111
static int hf_ieee80211_ranging_trigger_sounding_dialog_token;
4112
static int hf_ieee80211_he_trigger_ranging_trigger_poll_rpt;
4113
static int hf_ieee80211_ranging_pol_rpt_aid12_rsid12;
4114
static int hf_ieee80211_ranging_pol_rpt_ru_alloc_region;
4115
static int hf_ieee80211_ranging_pol_rpt_ru_alloc;
4116
static int hf_ieee80211_ranging_pol_rpt_ul_fec_coding_type;
4117
static int hf_ieee80211_ranging_pol_rpt_ulmcs;
4118
static int hf_ieee80211_ranging_pol_rpt_uldcm;
4119
static int hf_ieee80211_ranging_pol_rpt_starting_spatial_stream;
4120
static int hf_ieee80211_ranging_pol_rpt_number_spatial_streams;
4121
static int hf_ieee80211_ranging_pol_rpt_ul_target_rssi;
4122
static int hf_ieee80211_ranging_pol_rpt_reserved;
4123
static int hf_ieee80211_he_trigger_ranging_trigger_sounding;
4124
static int hf_ieee80211_ranging_sounding_aid12_rsid12;
4125
static int hf_ieee80211_ranging_sounding_reserved1;
4126
static int hf_ieee80211_ranging_sounding_i2r_rep;
4127
static int hf_ieee80211_ranging_sounding_reserved2;
4128
static int hf_ieee80211_ranging_sounding_starting_spatial_stream;
4129
static int hf_ieee80211_ranging_sounding_number_spatial_streams;
4130
static int hf_ieee80211_ranging_sounding_ul_target_rssi;
4131
static int hf_ieee80211_ranging_sounding_reserved3;
4132
static int hf_ieee80211_he_trigger_ranging_trigger_sec_sound;
4133
static int hf_ieee80211_ranging_sec_sound_aid12_rsid12;
4134
static int hf_ieee80211_ranging_sec_sound_reserved1;
4135
static int hf_ieee80211_ranging_sec_sound_i2r_rep;
4136
static int hf_ieee80211_ranging_sec_sound_reserved2;
4137
static int hf_ieee80211_ranging_sec_sound_starting_spatial_stream;
4138
static int hf_ieee80211_ranging_sec_sound_number_spatial_streams;
4139
static int hf_ieee80211_ranging_sec_sound_ul_target_rssi;
4140
static int hf_ieee80211_ranging_sec_sound_reserved3;
4141
static int hf_ieee80211_he_trigger_ranging_user_info_sac;
4142
static int hf_ieee80211_he_ndp_annc_sta;
4143
static int hf_ieee80211_he_ndp_annc_aid11;
4144
static int hf_ieee80211_he_ndp_annc_ru_start;
4145
static int hf_ieee80211_he_ndp_annc_ru_end;
4146
static int hf_ieee80211_he_ndp_annc_feedback_type_and_ng;
4147
static int hf_ieee80211_he_ndp_annc_disambiguation;
4148
static int hf_ieee80211_he_ndp_annc_codebook_size;
4149
static int hf_ieee80211_he_ndp_annc_nc;
4150
static int hf_ieee80211_he_ndp_annc_disallowed_bitmap;
4151
static int hf_ieee80211_he_ndp_annc_reserved1;
4152
static int hf_ieee80211_he_ndp_annc_reserved2;
4153
static int hf_ieee80211_he_qtp_control;
4154
static int hf_ieee80211_he_qtp_setup_quiet_period_duration;
4155
static int hf_ieee80211_he_qtp_setup_srv_specific_identif;
4156
static int hf_ieee80211_he_qtp_request_dialog_token;
4157
static int hf_ieee80211_he_qtp_request_quiet_period_offset;
4158
static int hf_ieee80211_he_qtp_request_quiet_period_duration;
4159
static int hf_ieee80211_he_qtp_request_quiet_period_interval;
4160
static int hf_ieee80211_he_qtp_request_repetition_count;
4161
static int hf_ieee80211_he_qtp_request_srv_specific_identif;
4162
static int hf_ieee80211_he_qtp_response_dialog_token;
4163
static int hf_ieee80211_he_qtp_response_status_code;
4164
static int hf_ieee80211_he_qtp_response_quiet_period_offset;
4165
static int hf_ieee80211_he_qtp_response_quiet_period_duration;
4166
static int hf_ieee80211_he_qtp_response_quiet_period_interval;
4167
static int hf_ieee80211_he_qtp_response_repetition_count;
4168
static int hf_ieee80211_he_qtp_response_srv_specific_identif;
4169
static int hf_ieee80211_htc_ht_lac;
4170
static int hf_ieee80211_htc_lac_trq;
4171
static int hf_ieee80211_htc_lac_mai_aseli;
4172
static int hf_ieee80211_htc_lac_mai_mrq;
4173
static int hf_ieee80211_htc_lac_mai_msi;
4174
static int hf_ieee80211_htc_lac_mai_reserved;
4175
static int hf_ieee80211_htc_lac_mfsi;
4176
static int hf_ieee80211_htc_lac_mfb;
4177
static int hf_ieee80211_htc_lac_asel_command;
4178
static int hf_ieee80211_htc_lac_asel_data;
4179
static int hf_ieee80211_htc_cal_pos;
4180
static int hf_ieee80211_htc_cal_seq;
4181
static int hf_ieee80211_htc_reserved1;
4182
static int hf_ieee80211_htc_csi_steering;
4183
static int hf_ieee80211_htc_ndp_announcement;
4184
static int hf_ieee80211_htc_reserved2;
4185
static int hf_ieee80211_htc_mrq;
4186
static int hf_ieee80211_htc_msi;
4187
static int hf_ieee80211_htc_msi_stbc_reserved;
4188
static int hf_ieee80211_htc_compressed_msi;
4189
static int hf_ieee80211_htc_ppdu_stbc_encoded;
4190
static int hf_ieee80211_htc_mfsi;
4191
static int hf_ieee80211_htc_gid_l;
4192
static int hf_ieee80211_htc_mfb;
4193
static int hf_ieee80211_htc_num_sts;
4194
static int hf_ieee80211_htc_vht_mcs;
4195
static int hf_ieee80211_htc_bw;
4196
static int hf_ieee80211_htc_s1g_num_sts;
4197
static int hf_ieee80211_htc_s1g_vht_mcs;
4198
static int hf_ieee80211_htc_s1g_bw;
4199
static int hf_ieee80211_htc_snr;
4200
static int hf_ieee80211_htc_reserved3;
4201
static int hf_ieee80211_htc_gid_h;
4202
static int hf_ieee80211_htc_coding_type;
4203
static int hf_ieee80211_htc_fb_tx_type;
4204
static int hf_ieee80211_htc_unsolicited_mfb;
4205
static int hf_ieee80211_htc_ac_constraint;
4206
static int hf_ieee80211_htc_rdg_more_ppdu;
4207
4208
/* ************************************************************************* */
4209
/*                Header values for sequence number field                    */
4210
/* ************************************************************************* */
4211
static int hf_ieee80211_frag_number;
4212
static int hf_ieee80211_seq_number;
4213
4214
/* ************************************************************************* */
4215
/*                   Header values for Frame Check field                     */
4216
/* ************************************************************************* */
4217
static int hf_ieee80211_fcs;
4218
static int hf_ieee80211_fcs_status;
4219
4220
/* ************************************************************************* */
4221
/*                   Header values for reassembly                            */
4222
/* ************************************************************************* */
4223
static int hf_ieee80211_fragments;
4224
static int hf_ieee80211_fragment;
4225
static int hf_ieee80211_fragment_overlap;
4226
static int hf_ieee80211_fragment_overlap_conflict;
4227
static int hf_ieee80211_fragment_multiple_tails;
4228
static int hf_ieee80211_fragment_too_long_fragment;
4229
static int hf_ieee80211_fragment_error;
4230
static int hf_ieee80211_fragment_count;
4231
static int hf_ieee80211_reassembled_in;
4232
static int hf_ieee80211_reassembled_length;
4233
4234
static int proto_wlan_ext;
4235
4236
/* ************************************************************************* */
4237
/*                      Fixed fields found in mgt frames                     */
4238
/* ************************************************************************* */
4239
static int hf_ieee80211_fixed_parameters;  /* Protocol payload for management frames */
4240
4241
static int hf_ieee80211_ff_auth_alg;            /* Authentication algorithm field            */
4242
static int hf_ieee80211_ff_auth_seq;            /* Authentication transaction sequence       */
4243
static int hf_ieee80211_ff_current_ap;          /* Current AP MAC address                    */
4244
static int hf_ieee80211_ff_listen_ival;         /* Listen interval fixed field               */
4245
static int hf_ieee80211_ff_timestamp;           /* 64 bit timestamp                          */
4246
static int hf_ieee80211_ff_beacon_interval;     /* 16 bit Beacon interval                    */
4247
static int hf_ieee80211_ff_assoc_id;            /* 16 bit AID field                          */
4248
static int hf_ieee80211_ff_reason;              /* 16 bit reason code                        */
4249
static int hf_ieee80211_ff_status_code;         /* Status code                               */
4250
static int hf_ieee80211_ff_category_code;       /* 8 bit Category code */
4251
static int hf_ieee80211_ff_action_code;         /* 8 bit Action code */
4252
static int hf_ieee80211_ff_dialog_token;        /* 8 bit Dialog token */
4253
static int hf_ieee80211_ff_trigger;
4254
static int hf_ieee80211_ff_ftm_tod;
4255
static int hf_ieee80211_ff_ftm_toa;
4256
static int hf_ieee80211_ff_ftm_tod_err;
4257
static int hf_ieee80211_ff_ftm_toa_err;
4258
static int hf_ieee80211_ff_followup_dialog_token;
4259
static int hf_ieee80211_ff_wme_action_code;     /* Management notification action code */
4260
static int hf_ieee80211_ff_wme_status_code;     /* Management notification setup response status code */
4261
static int hf_ieee80211_ff_qos_action_code;
4262
static int hf_ieee80211_ff_dls_action_code;
4263
static int hf_ieee80211_ff_dst_mac_addr;        /* DLS destination MAC address */
4264
static int hf_ieee80211_ff_src_mac_addr;        /* DLS source MAC address */
4265
static int hf_ieee80211_ff_req_ap_addr;
4266
static int hf_ieee80211_ff_res_ap_addr;
4267
static int hf_ieee80211_ff_check_beacon;
4268
static int hf_ieee80211_ff_dls_timeout;         /* DLS timeout value */
4269
static int hf_ieee80211_ff_ft_action_code; /* 8 bit FT Action code */
4270
static int hf_ieee80211_ff_sta_address;
4271
static int hf_ieee80211_ff_target_ap_address;
4272
static int hf_ieee80211_ff_gas_comeback_delay;
4273
static int hf_ieee80211_ff_gas_fragment_id;
4274
static int hf_ieee80211_ff_more_gas_fragments;
4275
static int hf_ieee80211_ff_query_request_length;
4276
static int hf_ieee80211_ff_query_request;
4277
static int hf_ieee80211_ff_query_response_length;
4278
static int hf_ieee80211_ff_query_response;
4279
static int hf_ieee80211_ff_anqp_info_id;
4280
static int hf_ieee80211_ff_anqp_info_length;
4281
static int hf_ieee80211_ff_anqp_info;
4282
static int hf_ieee80211_ff_anqp_query_id;
4283
static int hf_ieee80211_ff_anqp_capability;
4284
static int hf_ieee80211_ff_anqp_capability_vlen;
4285
static int hf_ieee80211_ff_anqp_capability_vendor;
4286
static int hf_ieee80211_ff_venue_info_group;
4287
static int hf_ieee80211_ff_venue_info_type;
4288
static int hf_ieee80211_ff_anqp_venue_length;
4289
static int hf_ieee80211_ff_anqp_venue_language;
4290
static int hf_ieee80211_ff_anqp_venue_name;
4291
static int hf_ieee80211_ff_anqp_nw_auth_type_indicator;
4292
static int hf_ieee80211_ff_anqp_nw_auth_type_url_len;
4293
static int hf_ieee80211_ff_anqp_nw_auth_type_url;
4294
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_indicator;
4295
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_url_len;
4296
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_url;
4297
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_year;
4298
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_mon;
4299
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_day;
4300
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_hr;
4301
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_min;
4302
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_sec;
4303
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_msec;
4304
static int hf_ieee80211_ff_anqp_nw_auth_type_ts_rsvd;
4305
static int hf_ieee80211_ff_anqp_roaming_consortium_oi_len;
4306
static int hf_ieee80211_ff_anqp_roaming_consortium_oi;
4307
static int hf_ieee80211_ff_anqp_ip_addr_avail_ipv6;
4308
static int hf_ieee80211_ff_anqp_ip_addr_avail_ipv4;
4309
static int hf_ieee80211_ff_anqp_nai_realm_count;
4310
static int hf_ieee80211_ff_anqp_nai_field_len;
4311
static int hf_ieee80211_ff_anqp_nai_realm_encoding;
4312
static int hf_ieee80211_ff_anqp_nai_realm_length;
4313
static int hf_ieee80211_ff_anqp_nai_realm;
4314
static int hf_ieee80211_ff_anqp_nai_realm_eap_count;
4315
static int hf_ieee80211_ff_anqp_nai_realm_eap_len;
4316
static int hf_ieee80211_ff_anqp_nai_realm_eap_method;
4317
static int hf_ieee80211_ff_anqp_nai_realm_auth_param_count;
4318
static int hf_ieee80211_ff_anqp_nai_realm_auth_param_id;
4319
static int hf_ieee80211_ff_anqp_nai_realm_auth_param_len;
4320
static int hf_ieee80211_ff_anqp_nai_realm_auth_param_value;
4321
static int hf_ieee80211_3gpp_gc_gud;
4322
static int hf_ieee80211_3gpp_gc_udhl;
4323
static int hf_ieee80211_3gpp_gc_iei;
4324
static int hf_ieee80211_3gpp_gc_num_plmns;
4325
static int hf_ieee80211_3gpp_gc_plmn;
4326
static int hf_ieee80211_3gpp_gc_plmn_len;
4327
static int hf_ieee80211_ff_anqp_domain_name_len;
4328
static int hf_ieee80211_ff_anqp_domain_name;
4329
static int hf_ieee80211_ff_tdls_action_code;
4330
static int hf_ieee80211_ff_target_channel;
4331
static int hf_ieee80211_ff_operating_class;
4332
static int hf_ieee80211_ff_channel;
4333
static int hf_ieee80211_ff_wnm_action_code;
4334
static int hf_ieee80211_ff_unprotected_wnm_action_code;
4335
static int hf_ieee80211_ff_key_data_length;
4336
static int hf_ieee80211_ff_key_data;
4337
static int hf_ieee80211_ff_wnm_notification_type;
4338
static int hf_ieee80211_ff_wnm_notification_response_status;
4339
static int hf_ieee80211_ff_rm_action_code;
4340
static int hf_ieee80211_ff_rm_dialog_token;
4341
static int hf_ieee80211_ff_rm_repetitions;
4342
static int hf_ieee80211_ff_rm_tx_power;
4343
static int hf_ieee80211_ff_rm_max_tx_power;
4344
static int hf_ieee80211_ff_tpc;
4345
static int hf_ieee80211_ff_tpc_element_id;
4346
static int hf_ieee80211_ff_tpc_length;
4347
static int hf_ieee80211_ff_tpc_tx_power;
4348
static int hf_ieee80211_ff_tpc_link_margin;
4349
static int hf_ieee80211_ff_rm_rx_antenna_id;
4350
static int hf_ieee80211_ff_rm_tx_antenna_id;
4351
static int hf_ieee80211_ff_rm_rcpi;
4352
static int hf_ieee80211_ff_rm_rsni;
4353
static int hf_ieee80211_ff_request_mode_pref_cand;
4354
static int hf_ieee80211_ff_request_mode_abridged;
4355
static int hf_ieee80211_ff_request_mode_disassoc_imminent;
4356
static int hf_ieee80211_ff_request_mode_bss_term_included;
4357
static int hf_ieee80211_ff_request_mode_ess_disassoc_imminent;
4358
static int hf_ieee80211_ff_request_mode_link_removal_imminent;
4359
static int hf_ieee80211_ff_request_mode_reserved;
4360
static int hf_ieee80211_ff_disassoc_timer;
4361
static int hf_ieee80211_ff_validity_interval;
4362
static int hf_ieee80211_ff_url_len;
4363
static int hf_ieee80211_ff_url;
4364
static int hf_ieee80211_ff_target_bss;
4365
static int hf_ieee80211_ff_bss_transition_query_reason;
4366
static int hf_ieee80211_ff_bss_transition_status_code;
4367
static int hf_ieee80211_ff_bss_termination_delay;
4368
static int hf_ieee80211_ff_bss_transition_candidate_list_entries;
4369
4370
static int hf_ieee80211_ff_sa_query_action_code;
4371
static int hf_ieee80211_ff_transaction_id;
4372
4373
static int hf_ieee80211_ff_send_confirm;
4374
static int hf_ieee80211_ff_scalar;
4375
static int hf_ieee80211_ff_finite_field_element;
4376
static int hf_ieee80211_ff_confirm;
4377
static int hf_ieee80211_ff_finite_cyclic_group;
4378
static int hf_ieee80211_ff_sae_message_type;
4379
static int hf_ieee80211_ff_sae_anti_clogging_token;
4380
4381
4382
/* Vendor specific */
4383
static int hf_ieee80211_ff_marvell_action_type;
4384
static int hf_ieee80211_ff_marvell_mesh_mgt_action_code;
4385
static int hf_ieee80211_ff_marvell_mesh_mgt_length;     /* Mesh Management length */
4386
static int hf_ieee80211_ff_marvell_mesh_mgt_mode;       /* Mesh Management mode */
4387
static int hf_ieee80211_ff_marvell_mesh_mgt_ttl;        /* Mesh Management TTL */
4388
static int hf_ieee80211_ff_marvell_mesh_mgt_dstcount;   /* Mesh Management dst count */
4389
static int hf_ieee80211_ff_marvell_mesh_mgt_hopcount;   /* Mesh Management hop count */
4390
static int hf_ieee80211_ff_marvell_mesh_mgt_rreqid;     /* Mesh Management RREQ ID */
4391
static int hf_ieee80211_ff_marvell_mesh_mgt_sa;         /* Mesh Management src addr */
4392
static int hf_ieee80211_ff_marvell_mesh_mgt_ssn;        /* Mesh Management src sequence number */
4393
static int hf_ieee80211_ff_marvell_mesh_mgt_metric;     /* Mesh Management metric */
4394
static int hf_ieee80211_ff_marvell_mesh_mgt_flags;      /* Mesh Management RREQ flags */
4395
static int hf_ieee80211_ff_marvell_mesh_mgt_da;         /* Mesh Management dst addr */
4396
static int hf_ieee80211_ff_marvell_mesh_mgt_dsn;        /* Mesh Management dst sequence number */
4397
static int hf_ieee80211_ff_marvell_mesh_mgt_lifetime;   /* Mesh Management lifetime */
4398
4399
4400
static int hf_ieee80211_ff_ba_action;
4401
4402
static int hf_ieee80211_ff_block_ack_params;
4403
static int hf_ieee80211_ff_block_ack_params_amsdu_permitted;
4404
static int hf_ieee80211_ff_block_ack_params_policy;
4405
static int hf_ieee80211_ff_block_ack_params_tid;
4406
static int hf_ieee80211_ff_block_ack_params_buffer_size;
4407
4408
static int * const ieee80211_ff_block_ack_params_fields[] = {
4409
  &hf_ieee80211_ff_block_ack_params_amsdu_permitted,
4410
  &hf_ieee80211_ff_block_ack_params_policy,
4411
  &hf_ieee80211_ff_block_ack_params_tid,
4412
  &hf_ieee80211_ff_block_ack_params_buffer_size,
4413
  NULL
4414
};
4415
4416
static int hf_ieee80211_ff_block_ack_timeout;
4417
4418
static int hf_ieee80211_ff_block_ack_ssc;
4419
static int hf_ieee80211_ff_block_ack_ssc_fragment;
4420
static int hf_ieee80211_ff_block_ack_ssc_sequence;
4421
4422
static int * const ieee80211_ff_block_ack_ssc_fields[] = {
4423
  &hf_ieee80211_ff_block_ack_ssc_fragment,
4424
  &hf_ieee80211_ff_block_ack_ssc_sequence,
4425
  NULL
4426
};
4427
4428
static int hf_ieee80211_ff_delba_param;
4429
static int hf_ieee80211_ff_delba_param_reserved;
4430
static int hf_ieee80211_ff_delba_param_init;
4431
static int hf_ieee80211_ff_delba_param_tid;
4432
4433
static int * const ieee80211_ff_delba_param_fields[] = {
4434
  &hf_ieee80211_ff_delba_param_reserved,
4435
  &hf_ieee80211_ff_delba_param_init,
4436
  &hf_ieee80211_ff_delba_param_tid,
4437
  NULL
4438
};
4439
4440
static int hf_ieee80211_ff_max_reg_pwr;
4441
static int hf_ieee80211_ff_measurement_pilot_int;
4442
static int hf_ieee80211_ff_country_str;
4443
static int hf_ieee80211_ff_max_tx_pwr;
4444
static int hf_ieee80211_ff_tx_pwr_used;
4445
static int hf_ieee80211_ff_transceiver_noise_floor;
4446
static int hf_ieee80211_ff_channel_width;
4447
4448
static int hf_ieee80211_ff_qos_info_ap;
4449
static int hf_ieee80211_ff_qos_info_ap_edca_param_set_counter;
4450
static int hf_ieee80211_ff_qos_info_ap_q_ack;
4451
static int hf_ieee80211_ff_qos_info_ap_queue_req;
4452
static int hf_ieee80211_ff_qos_info_ap_txop_request;
4453
static int hf_ieee80211_ff_qos_info_ap_more_data_ack;
4454
4455
static int * const ieee80211_ff_qos_info_ap_fields[] = {
4456
  &hf_ieee80211_ff_qos_info_ap_edca_param_set_counter,
4457
  &hf_ieee80211_ff_qos_info_ap_q_ack,
4458
  &hf_ieee80211_ff_qos_info_ap_queue_req,
4459
  &hf_ieee80211_ff_qos_info_ap_txop_request,
4460
  &hf_ieee80211_ff_qos_info_ap_more_data_ack,
4461
  NULL
4462
};
4463
4464
static int hf_ieee80211_ff_qos_info_sta;
4465
static int hf_ieee80211_ff_qos_info_sta_ac_vo;
4466
static int hf_ieee80211_ff_qos_info_sta_ac_vi;
4467
static int hf_ieee80211_ff_qos_info_sta_ac_bk;
4468
static int hf_ieee80211_ff_qos_info_sta_ac_be;
4469
static int hf_ieee80211_ff_qos_info_sta_q_ack;
4470
static int hf_ieee80211_ff_qos_info_sta_max_sp_length;
4471
static int hf_ieee80211_ff_qos_info_sta_more_data_ack;
4472
4473
static int * const ieee80211_ff_qos_info_sta_fields[] = {
4474
  &hf_ieee80211_ff_qos_info_sta_ac_vo,
4475
  &hf_ieee80211_ff_qos_info_sta_ac_vi,
4476
  &hf_ieee80211_ff_qos_info_sta_ac_bk,
4477
  &hf_ieee80211_ff_qos_info_sta_ac_be,
4478
  &hf_ieee80211_ff_qos_info_sta_q_ack,
4479
  &hf_ieee80211_ff_qos_info_sta_max_sp_length,
4480
  &hf_ieee80211_ff_qos_info_sta_more_data_ack,
4481
  NULL
4482
};
4483
4484
static int hf_ieee80211_ff_sm_pwr_save;
4485
static int hf_ieee80211_ff_sm_pwr_save_enabled;
4486
static int hf_ieee80211_ff_sm_pwr_save_sm_mode;
4487
static int hf_ieee80211_ff_sm_pwr_save_reserved;
4488
4489
static int * const ieee80211_ff_sw_pwr_save_fields[] = {
4490
  &hf_ieee80211_ff_sm_pwr_save_enabled,
4491
  &hf_ieee80211_ff_sm_pwr_save_sm_mode,
4492
  &hf_ieee80211_ff_sm_pwr_save_reserved,
4493
  NULL
4494
};
4495
4496
static int hf_ieee80211_ff_pco_phase_cntrl;
4497
4498
static int hf_ieee80211_ff_psmp_param_set;
4499
static int hf_ieee80211_ff_psmp_param_set_n_sta;
4500
static int hf_ieee80211_ff_psmp_param_set_more_psmp;
4501
static int hf_ieee80211_ff_psmp_param_set_psmp_sequence_duration;
4502
4503
static int * const ieee80211_ff_psmp_param_set_fields[] = {
4504
  &hf_ieee80211_ff_psmp_param_set_n_sta,
4505
  &hf_ieee80211_ff_psmp_param_set_more_psmp,
4506
  &hf_ieee80211_ff_psmp_param_set_psmp_sequence_duration,
4507
  NULL
4508
};
4509
4510
static int hf_ieee80211_ff_mimo_cntrl;
4511
static int hf_ieee80211_ff_mimo_cntrl_nc_index;
4512
static int hf_ieee80211_ff_mimo_cntrl_nr_index;
4513
static int hf_ieee80211_ff_mimo_cntrl_channel_width;
4514
static int hf_ieee80211_ff_mimo_cntrl_grouping;
4515
static int hf_ieee80211_ff_mimo_cntrl_coefficient_size;
4516
static int hf_ieee80211_ff_mimo_cntrl_codebook_info;
4517
static int hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment;
4518
static int hf_ieee80211_ff_mimo_cntrl_reserved;
4519
static int hf_ieee80211_ff_mimo_cntrl_sounding_timestamp;
4520
4521
static int hf_ieee80211_ff_ftm_param_delim1;
4522
static int hf_ieee80211_ff_ftm_param_status_indication;
4523
static int hf_ieee80211_ff_ftm_param_value;
4524
static int hf_ieee80211_ff_ftm_param_reserved1;
4525
static int hf_ieee80211_ff_ftm_param_burst_exponent;
4526
static int hf_ieee80211_ff_ftm_param_burst_duration;
4527
4528
static int hf_ieee80211_ff_ftm_param_delim2;
4529
static int hf_ieee80211_ff_ftm_param_min_delta_ftm;
4530
static int hf_ieee80211_ff_ftm_param_partial_tsf_timer;
4531
static int hf_ieee80211_ff_ftm_param_partial_tsf_no_pref;
4532
static int hf_ieee80211_ff_ftm_param_asap_capable;
4533
static int hf_ieee80211_ff_ftm_param_asap;
4534
static int hf_ieee80211_ff_ftm_param_ftm_per_burst;
4535
4536
static int hf_ieee80211_ff_ftm_param_delim3;
4537
static int hf_ieee80211_ff_ftm_param_reserved2;
4538
static int hf_ieee80211_ff_ftm_param_format_and_bw;
4539
static int hf_ieee80211_ff_ftm_param_burst_period;
4540
4541
/* az D3.0 introduces a 1-octet TOD Error field; use a different name to avoid
4542
 * conflicting with the existing hf_ieee80211_ff_ftm_tod_err (which is 2
4543
 * octets).
4544
 */
4545
static int hf_ieee80211_ff_ftm_tod_err1;
4546
static int hf_ieee80211_ff_ftm_max_tod_error_exponent;
4547
static int hf_ieee80211_ff_ftm_tod_err_reserved;
4548
static int hf_ieee80211_ff_ftm_tod_not_continuous;
4549
4550
/* Same situation with ...toa_err1 as ...tod_err1 */
4551
static int hf_ieee80211_ff_ftm_toa_err1;
4552
static int hf_ieee80211_ff_ftm_max_toa_error_exponent;
4553
static int hf_ieee80211_ff_ftm_toa_err_reserved;
4554
static int hf_ieee80211_ff_ftm_invalid_measurement;
4555
static int hf_ieee80211_ff_ftm_toa_type;
4556
4557
static int hf_ieee80211_ff_ftm_cfo;
4558
static int hf_ieee80211_ff_ftm_r2i_ndp_tx_power;
4559
static int hf_ieee80211_ff_ftm_i2r_ndp_target_rssi;
4560
4561
/* az: FTM Ranging Parameters Element */
4562
static int hf_ieee80211_tag_ranging_parameters;
4563
static int hf_ieee80211_tag_ranging_subelt_tag;
4564
static int hf_ieee80211_tag_ranging_subelt_len;
4565
static int hf_ieee80211_tag_ranging_status_indication;
4566
static int hf_ieee80211_tag_ranging_value;
4567
static int hf_ieee80211_tag_ranging_i2r_lmr_feedback;
4568
static int hf_ieee80211_tag_ranging_secure_ltf_required;
4569
static int hf_ieee80211_tag_ranging_secure_ltf_support;
4570
static int hf_ieee80211_tag_ranging_ranging_priority;
4571
static int hf_ieee80211_tag_ranging_r2i_toa_type;
4572
static int hf_ieee80211_tag_ranging_i2r_toa_type;
4573
static int hf_ieee80211_tag_ranging_r2i_aoa_requested;
4574
static int hf_ieee80211_tag_ranging_i2r_aoa_requested;
4575
static int hf_ieee80211_tag_ranging_format_and_bandwidth;
4576
static int hf_ieee80211_tag_ranging_immediate_r2i_feedback;
4577
static int hf_ieee80211_tag_ranging_immediate_i2r_feedback;
4578
static int hf_ieee80211_tag_ranging_max_i2r_repetition;
4579
static int hf_ieee80211_tag_ranging_max_r2i_repetition;
4580
static int hf_ieee80211_tag_ranging_reserved1;
4581
static int hf_ieee80211_tag_ranging_reserved2;
4582
static int hf_ieee80211_tag_ranging_max_r2i_sts_le_80_mhz;
4583
static int hf_ieee80211_tag_ranging_max_r2i_sts_gt_80_mhz;
4584
static int hf_ieee80211_tag_ranging_max_r2i_ltf_total;
4585
static int hf_ieee80211_tag_ranging_max_i2r_ltf_total;
4586
static int hf_ieee80211_tag_ranging_max_i2r_sts_le_80_mhz;
4587
static int hf_ieee80211_tag_ranging_max_i2r_sts_gt_80_mhz;
4588
static int hf_ieee80211_tag_ranging_bss_color_info;
4589
4590
/* az: FTM Ranging Parameters NTB-specific subelement */
4591
static int hf_ieee80211_tag_ranging_ntb;
4592
static int hf_ieee80211_tag_ranging_ntb_reserved1;
4593
static int hf_ieee80211_tag_ranging_ntb_min_time_msmts;
4594
static int hf_ieee80211_tag_ranging_ntb_max_time_msmts;
4595
static int hf_ieee80211_tag_ranging_ntb_r2i_tx_power;
4596
static int hf_ieee80211_tag_ranging_ntb_i2r_tx_power;
4597
static int hf_ieee80211_tag_ranging_ntb_reserved2;
4598
4599
/* az: FTM Ranging Specific TB subelement */
4600
static int hf_ieee80211_tag_ranging_aid_rsid;
4601
static int hf_ieee80211_tag_ranging_device_class;
4602
static int hf_ieee80211_tag_ranging_full_bw_ul_mu_mimo;
4603
static int hf_ieee80211_tag_ranging_trigger_frame_paddur;
4604
static int hf_ieee80211_tag_ranging_max_sess_exp;
4605
static int hf_ieee80211_tag_ranging_passive_tb_ranging;
4606
static int hf_ieee80211_tag_ranging_tb_specific_reserved;
4607
4608
/* az: FTM Ranging Secure HE-LTF subelement */
4609
static int hf_ieee80211_tag_ranging_secure_he_ltf;
4610
static int hf_ieee80211_tag_ranging_secure_he_ltf_version;
4611
static int hf_ieee80211_tag_ranging_secure_he_ltf_req;
4612
static int hf_ieee80211_tag_ranging_secure_he_ltf_r2i_tx_window;
4613
static int hf_ieee80211_tag_ranging_secure_he_ltf_i2r_tx_window;
4614
static int hf_ieee80211_tag_ranging_secure_he_ltf_reserved;
4615
4616
/* az: PASN subelements etc. */
4617
static int hf_ieee80211_tag_pasn_parameters_control;
4618
static int hf_ieee80211_tag_pasn_params_comeback_info_present;
4619
static int hf_ieee80211_tag_pasn_params_group_and_key_present;
4620
static int hf_ieee80211_tag_pasn_parameters_reserved;
4621
static int hf_ieee80211_tag_pasn_parameters_wrapped_fmt;
4622
static int hf_ieee80211_tag_pasn_comeback_after;
4623
static int hf_ieee80211_tag_pasn_cookie_length;
4624
static int hf_ieee80211_tag_pasn_cookie;
4625
static int hf_ieee80211_tag_pasn_finite_cyclic_group_id;
4626
static int hf_ieee80211_tag_pasn_ephemeral_public_key_len;
4627
static int hf_ieee80211_tag_pasn_ephemeral_public_key;
4628
static int hf_ieee80211_pasn_auth1_frame_len;
4629
static int hf_ieee80211_pasn_auth2_frame_len;
4630
4631
/* az: Secure LTF Parameters */
4632
static int hf_ieee80211_tag_secure_ltf_params_counter;
4633
static int hf_ieee80211_tag_secure_ltf_generation_sac;
4634
static int hf_ieee80211_tag_secure_ltf_management_sac;
4635
static int hf_ieee80211_tag_secure_ltf_result_ltf_ofs;
4636
4637
/* az: ista and rsta availability details */
4638
static int hf_ieee80211_ftm_ista_availability_count;
4639
static int hf_ieee80211_ftm_ista_availability_reserved;
4640
static int hf_ieee80211_ftm_ista_avail_bits;
4641
static int hf_ieee80211_ftm_ista_avail_pad;
4642
4643
static int hf_ieee80211_ftm_rsta_header;
4644
static int hf_ieee80211_ftm_rsta_count;
4645
static int hf_ieee80211_ftm_rsta_avail_window_bcast_fmt;
4646
static int hf_ieee80211_ftm_rsta_partial_tsf_timer1;
4647
static int hf_ieee80211_ftm_rsta_duration1;
4648
static int hf_ieee80211_ftm_rsta_passive_tb_ranging_reserved1;
4649
static int hf_ieee80211_ftm_rsta_periodicity1;
4650
static int hf_ieee80211_ftm_rsta_partial_tsf_timer;
4651
static int hf_ieee80211_ftm_rsta_duration;
4652
static int hf_ieee80211_ftm_rsta_passive_tb_ranging_reserved;
4653
static int hf_ieee80211_ftm_rsta_periodicity;
4654
static int hf_ieee80211_ftm_rsta_format_and_bandwidth;
4655
static int hf_ieee80211_ftm_rsta_reserved;
4656
static int hf_ieee80211_ftm_rsta_avail_subfield_short;
4657
static int hf_ieee80211_ftm_rsta_avail_subfield_long;
4658
4659
/* be: Multi-link elements and other fields */
4660
static int hf_ieee80211_eht_multi_link_control;
4661
static int hf_ieee80211_eht_multi_link_control_type;
4662
static int hf_ieee80211_eht_multi_link_control_reserved;
4663
static int hf_ieee80211_eht_multi_link_control_link_id_present;
4664
static int hf_ieee80211_eht_multi_link_control_bss_parms_ch_count;
4665
static int hf_ieee80211_eht_multi_link_control_medium_sync_delay;
4666
static int hf_ieee80211_eht_multi_link_control_eml_capa;
4667
static int hf_ieee80211_eht_multi_link_control_mld_capa;
4668
static int hf_ieee80211_eht_multi_link_control_basic_mld_id_present;
4669
static int hf_ieee80211_eht_multi_link_control_ext_mld_capa;
4670
static int hf_ieee80211_eht_multi_link_control_bitmap_reserved;
4671
static int hf_ieee80211_eht_multi_link_control_probe_mld_id_present;
4672
static int hf_ieee80211_eht_multi_link_control_probe_mld_mac_addr_present;
4673
static int hf_ieee80211_eht_multi_link_control_probe_reserved;
4674
static int hf_ieee80211_eht_multi_link_control_reconfig_mld_mac;
4675
static int hf_ieee80211_eht_multi_link_control_reconfig_eml_capa;
4676
static int hf_ieee80211_eht_multi_link_control_reconfig_mld_capa_oper;
4677
static int hf_ieee80211_eht_multi_link_control_reconfig_ext_mld_capa_oper;
4678
static int hf_ieee80211_eht_multi_link_control_reconfig_reserved;
4679
static int hf_ieee80211_eht_multi_link_control_tdls_reserved;
4680
static int hf_ieee80211_eht_multi_link_control_prio_access_reserved;
4681
static int hf_ieee80211_eht_common_field_length;
4682
static int hf_ieee80211_eht_common_field_mld_mac;
4683
static int hf_ieee80211_eht_common_field_link_id_field;
4684
static int hf_ieee80211_eht_common_info_link_id;
4685
static int hf_ieee80211_eht_common_info_link_id_reserved;
4686
static int hf_ieee80211_eht_common_field_bss_param_change_count;
4687
static int hf_ieee80211_eht_common_field_medium_sync_field;
4688
static int hf_ieee80211_eht_common_info_medium_sync_duration;
4689
static int hf_ieee80211_eht_common_info_medium_sync_threshold;
4690
static int hf_ieee80211_eht_common_info_medium_sync_max_txops;
4691
static int hf_ieee80211_eht_common_field_eml_capabilities;
4692
static int hf_ieee80211_eht_common_info_eml_capa_emlsr_support;
4693
static int hf_ieee80211_eht_common_info_eml_capa_emlsr_padding_delay;
4694
static int hf_ieee80211_eht_common_info_eml_capa_emlsr_transition_delay;
4695
static int hf_ieee80211_eht_common_info_eml_capa_emlmr_support;
4696
static int hf_ieee80211_eht_common_info_eml_capa_emlmr_delay;
4697
static int hf_ieee80211_eht_common_info_eml_capa_transition_timeout;
4698
static int hf_ieee80211_eht_common_info_eml_capa_reserved;
4699
static int hf_ieee80211_eht_common_field_mld_capabilities;
4700
static int hf_ieee80211_eht_common_info_mld_max_simul_links;
4701
static int hf_ieee80211_eht_common_info_mld_srs_support;
4702
static int hf_ieee80211_eht_common_info_mld_tid_to_link_map_neg;
4703
static int hf_ieee80211_eht_common_info_mld_freq_sep_for_str;
4704
static int hf_ieee80211_eht_common_info_mld_aar_support;
4705
static int hf_ieee80211_eht_common_info_mld_link_reconf_op_support;
4706
static int hf_ieee80211_eht_common_info_mld_aligned_twt_support;
4707
static int hf_ieee80211_eht_common_info_mld_reserved;
4708
static int hf_ieee80211_eht_common_field_mld_id;
4709
static int hf_ieee80211_eht_common_field_ap_mld_mac;
4710
static int hf_ieee80211_eht_common_field_ext_mld_capabilities;
4711
static int hf_ieee80211_eht_common_info_ext_mld_op_update_support;
4712
static int hf_ieee80211_eht_common_info_ext_mld_max_simul_links;
4713
static int hf_ieee80211_eht_common_info_ext_mld_nstr_status_support;
4714
static int hf_ieee80211_eht_common_info_ext_mld_emlsr_enable_one_link_support;
4715
static int hf_ieee80211_eht_common_info_ext_mld_btm_mld_recom_aps_support;
4716
static int hf_ieee80211_eht_common_info_ext_mld_reserved;
4717
static int hf_ieee80211_eht_multi_link_subelt_tag;
4718
static int hf_ieee80211_eht_multi_link_subelt_len;
4719
static int hf_ieee80211_eht_multi_link_type_0_link_count;
4720
static int hf_ieee80211_eht_multi_link_type_1_link_count;
4721
static int hf_ieee80211_eht_multi_link_type_2_link_count;
4722
static int hf_ieee80211_eht_multi_link_type_3_link_count;
4723
static int hf_ieee80211_eht_multi_link_type_4_link_count;
4724
static int hf_ieee80211_eht_multi_link_link_id_list;
4725
static int hf_ieee80211_eht_profile_sta_control;
4726
static int hf_ieee80211_eht_profile_link_id;
4727
static int hf_ieee80211_eht_profile_complete_profile;
4728
static int hf_ieee80211_eht_profile_mac_address_present;
4729
static int hf_ieee80211_eht_profile_beacon_interval_present;
4730
static int hf_ieee80211_eht_profile_tsf_offset_present;
4731
static int hf_ieee80211_eht_profile_dtim_info_present;
4732
static int hf_ieee80211_eht_profile_nstr_link_pair_present;
4733
static int hf_ieee80211_eht_profile_nstr_bitmap_size;
4734
static int hf_ieee80211_eht_profile_bss_params_change_count_present;
4735
static int hf_ieee80211_eht_profile_reserved;
4736
static int hf_ieee80211_eht_profile_probe_reserved;
4737
static int hf_ieee80211_eht_profile_removal_timer_present;
4738
static int hf_ieee80211_eht_profile_reconfig_operation_type;
4739
static int hf_ieee80211_eht_profile_operation_para_present;
4740
static int hf_ieee80211_eht_profile_reconfig_nstr_bitmap_size;
4741
static int hf_ieee80211_eht_profile_reconfig_nstr_bitmap_present;
4742
static int hf_ieee80211_eht_profile_reconfig_reserved;
4743
static int hf_ieee80211_eht_profile_prio_acc_reserved;
4744
static int hf_ieee80211_eht_sta_profile_info_len;
4745
static int hf_ieee80211_eht_sta_profile_info_mac;
4746
static int hf_ieee80211_eht_sta_profile_info_beacon;
4747
static int hf_ieee80211_eht_sta_profile_info_tsf_offset;
4748
static int hf_ieee80211_eht_sta_profile_info_dtim_count;
4749
static int hf_ieee80211_eht_sta_profile_info_dtim_period;
4750
static int hf_ieee80211_eht_sta_profile_info_bitmap;
4751
static int hf_ieee80211_eht_sta_profile_bss_params_change_count;
4752
static int hf_ieee80211_eht_sta_profile_removal_timer;
4753
static int hf_ieee80211_eht_sta_profile_presence_indi;
4754
static int hf_ieee80211_eht_sta_profile_presence_indi_max_mpdu_length_present;
4755
static int hf_ieee80211_eht_sta_profile_presence_indi_max_amsdu_length_present;
4756
static int hf_ieee80211_eht_sta_profile_presence_indi_reserved;
4757
static int hf_ieee80211_eht_sta_profile_operation_para_info;
4758
static int hf_ieee80211_eht_sta_profile_operation_para_info_max_mpdu_length;
4759
static int hf_ieee80211_eht_sta_profile_operation_para_info_amsdu_length;
4760
static int hf_ieee80211_eht_sta_profile_operation_para_info_pad;
4761
static int hf_ieee80211_eht_operation_parameters;
4762
static int hf_ieee80211_eht_basic_eht_mcs_nss_set;
4763
static int hf_ieee80211_eht_operation_control_chan_width;
4764
static int hf_ieee80211_eht_operation_control_reserved;
4765
static int hf_ieee80211_eht_operation_info_present;
4766
static int hf_ieee80211_eht_operation_subchannel_bitmap_present;
4767
static int hf_ieee80211_eht_operation_default_pe_duration;
4768
static int hf_ieee80211_eht_operation_group_addressed_bu_indication_limit;
4769
static int hf_ieee80211_eht_operation_group_addressed_bu_indication_exp;
4770
static int hf_ieee80211_eht_operation_mcs15_disable;
4771
static int hf_ieee80211_eht_operation_reserved;
4772
static int hf_ieee80211_eht_operation_control;
4773
static int hf_ieee80211_eht_operation_ccfs0;
4774
static int hf_ieee80211_eht_operation_ccfs1;
4775
static int hf_ieee80211_eht_operation_disabled_bitmap;
4776
static int hf_ieee80211_eht_mac_capabilities;
4777
static int hf_ieee80211_eht_mac_capa_epcs_prio_access_support;
4778
static int hf_ieee80211_eht_mac_capa_eht_om_control_support;
4779
static int hf_ieee80211_eht_mac_capa_trig_txop_sharing_mode_1_support;
4780
static int hf_ieee80211_eht_mac_capa_trig_txop_sharing_mode_2_support;
4781
static int hf_ieee80211_eht_mac_capa_restricted_twt_support;
4782
static int hf_ieee80211_eht_mac_capa_scs_traffic_description_support;
4783
static int hf_ieee80211_eht_mac_capa_maximum_mpdu_length;
4784
static int hf_ieee80211_eht_mac_capa_maximum_ampdu_length_exp_ext;
4785
static int hf_ieee80211_eht_mac_capa_eht_trs_support;
4786
static int hf_ieee80211_eht_mac_capa_txop_return_support_txop_sha_mode;
4787
static int hf_ieee80211_eht_mac_capa_two_bqrs_support;
4788
static int hf_ieee80211_eht_mac_capa_eht_link_adaptation_support;
4789
static int hf_ieee80211_eht_mac_capa_unsolicited_epcs_update;
4790
static int hf_ieee80211_eht_mac_capa_reserved;
4791
static int hf_ieee80211_eht_phy_bits_0_15;
4792
static int hf_ieee80211_eht_phy_bits_0_15_reserved;
4793
static int hf_ieee80211_eht_phy_bits_0_15_320_mhz_in_6ghz;
4794
static int hf_ieee80211_eht_phy_bits_0_15_242_tone_ru_bw_wider_20mhz;
4795
static int hf_ieee80211_eht_phy_bits_0_15_ndp_and_3_2_us_gi;
4796
static int hf_ieee80211_eht_phy_bits_0_15_partial_bw_ul_mu_mimo;
4797
static int hf_ieee80211_eht_phy_bits_0_15_su_beamformer;
4798
static int hf_ieee80211_eht_phy_bits_0_15_su_beamformee;
4799
static int hf_ieee80211_eht_phy_bits_0_15_su_beamformee_le_80mhz;
4800
static int hf_ieee80211_eht_phy_bits_0_15_su_beamformee_eq_160mhz;
4801
static int hf_ieee80211_eht_phy_bits_0_15_su_beamformee_eq_320mhz;
4802
static int hf_ieee80211_eht_phy_bits_16_31;
4803
static int hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_lt_80mhz;
4804
static int hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_eq_160mhz;
4805
static int hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_eq_320mhz;
4806
static int hf_ieee80211_eht_phy_bits_16_31_num_ng_eq_16_su_feedback;
4807
static int hf_ieee80211_eht_phy_bits_16_31_num_ng_eq_16_mu_feedback;
4808
static int hf_ieee80211_eht_phy_bits_16_31_codebook_size_4_2_su_fbck;
4809
static int hf_ieee80211_eht_phy_bits_16_31_codebook_size_7_5_mu_fbck;
4810
static int hf_ieee80211_eht_phy_bits_16_31_triggered_su_beemform_fbck;
4811
static int hf_ieee80211_eht_phy_bits_16_31_triggered_mu_beemform_p_bw_fbck;
4812
static int hf_ieee80211_eht_phy_bits_16_31_triggered_cqi_feedback;
4813
static int hf_ieee80211_eht_phy_bits_32_39;
4814
static int hf_ieee80211_eht_phy_bits_32_39_partial_bw_dl_mu_mimo;
4815
static int hf_ieee80211_eht_phy_bits_32_39_eht_psr_based_sr_support;
4816
static int hf_ieee80211_eht_phy_bits_32_39_power_boost_factor_support;
4817
static int hf_ieee80211_eht_phy_bits_32_39_eht_mu_ppdu_w_4x_eht_ltf_08_gi;
4818
static int hf_ieee80211_eht_phy_bits_32_39_max_nc;
4819
static int hf_ieee80211_eht_phy_bits_40_63;
4820
static int hf_ieee80211_eht_phy_bits_40_63_non_triggered_cqi_fbck;
4821
static int hf_ieee80211_eht_phy_bits_40_63_tx_1024_4096_qam_lt_242_ru_support;
4822
static int hf_ieee80211_eht_phy_bits_40_63_rx_1024_4096_qam_lt_242_ru_support;
4823
static int hf_ieee80211_eht_phy_bits_40_63_ppe_thresholds_present;
4824
static int hf_ieee80211_eht_phy_bits_40_63_common_nominal_packet_padding;
4825
static int hf_ieee80211_eht_phy_bits_40_63_max_num_supported_eht_ltfs;
4826
static int hf_ieee80211_eht_phy_bits_40_63_support_of_mcx_15;
4827
static int hf_ieee80211_eht_phy_bits_40_63_support_of_eht_dup_in_6_ghz;
4828
static int hf_ieee80211_eht_phy_bits_40_63_support_20_mhz_sta_ndp_wide_bw;
4829
static int hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_le_80_mhz;
4830
static int hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_eq_160_mhz;
4831
static int hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_eq_320_mhz;
4832
static int hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_le_80_mhz;
4833
static int hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_eq_160_mhz;
4834
static int hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_eq_320_mhz;
4835
static int hf_ieee80211_eht_phy_bits_40_63_tb_sounding_feedback_rate_limit;
4836
static int hf_ieee80211_eht_phy_bits_64_71;
4837
static int hf_ieee80211_eht_phy_bits_64_71_rx_1024_qam_wid_bw_dl_ofdma_sup;
4838
static int hf_ieee80211_eht_phy_bits_64_71_rx_4096_qam_wid_bw_dl_ofdma_sup;
4839
static int hf_ieee80211_eht_phy_bits_64_71_20m_limit_capa_support;
4840
static int hf_ieee80211_eht_phy_bits_64_71_20m_mu_beam_feedback_dl_mu_mimo;
4841
static int hf_ieee80211_eht_phy_bits_64_71_20m_mru_support;
4842
static int hf_ieee80211_eht_phy_bits_64_71_reserved;
4843
static int hf_ieee80211_eht_supported_mcs_nss_bytes;
4844
static int hf_ieee80211_eht_mcs_and_nss_non_ap;
4845
static int hf_ieee80211_eht_rx_max_nss_20mhz_0_7;
4846
static int hf_ieee80211_eht_tx_max_nss_20mhz_0_7;
4847
static int hf_ieee80211_eht_rx_max_nss_20mhz_8_9;
4848
static int hf_ieee80211_eht_tx_max_nss_20mhz_8_9;
4849
static int hf_ieee80211_eht_rx_max_nss_20mhz_10_11;
4850
static int hf_ieee80211_eht_tx_max_nss_20mhz_10_11;
4851
static int hf_ieee80211_eht_rx_max_nss_20mhz_12_13;
4852
static int hf_ieee80211_eht_tx_max_nss_20mhz_12_13;
4853
static int hf_ieee80211_eht_le_80_rx_max_nss_0_9;
4854
static int hf_ieee80211_eht_le_80_tx_max_nss_0_9;
4855
static int hf_ieee80211_eht_le_80_rx_max_nss_10_11;
4856
static int hf_ieee80211_eht_le_80_tx_max_nss_10_11;
4857
static int hf_ieee80211_eht_le_80_rx_max_nss_12_13;
4858
static int hf_ieee80211_eht_le_80_tx_max_nss_12_13;
4859
static int hf_ieee80211_eht_160_rx_max_nss_0_9;
4860
static int hf_ieee80211_eht_160_tx_max_nss_0_9;
4861
static int hf_ieee80211_eht_160_rx_max_nss_10_11;
4862
static int hf_ieee80211_eht_160_tx_max_nss_10_11;
4863
static int hf_ieee80211_eht_160_rx_max_nss_12_13;
4864
static int hf_ieee80211_eht_160_tx_max_nss_12_13;
4865
static int hf_ieee80211_eht_320_rx_max_nss_0_9;
4866
static int hf_ieee80211_eht_320_tx_max_nss_0_9;
4867
static int hf_ieee80211_eht_320_rx_max_nss_10_11;
4868
static int hf_ieee80211_eht_320_tx_max_nss_10_11;
4869
static int hf_ieee80211_eht_320_rx_max_nss_12_13;
4870
static int hf_ieee80211_eht_320_tx_max_nss_12_13;
4871
static int hf_ieee80211_eht_mcs_and_nss_le_80mhz;
4872
static int hf_ieee80211_eht_mcs_and_nss_eq_160mhz;
4873
static int hf_ieee80211_eht_mcs_and_nss_eq_320mhz;
4874
static int hf_ieee80211_eht_ppe_thresholds;
4875
static int hf_ieee80211_eht_ttl_mapping_control;
4876
static int hf_ieee80211_eht_ttl_mapping_direction;
4877
static int hf_ieee80211_eht_ttl_default_link_mapping;
4878
static int hf_ieee80211_eht_ttl_mapping_switch_time_pres;
4879
static int hf_ieee80211_eht_ttl_expected_dura_pres;
4880
static int hf_ieee80211_eht_ttl_link_mapping_size;
4881
static int hf_ieee80211_eht_ttl_mapping_reserved;
4882
static int hf_ieee80211_eht_ttl_mapping_presence;
4883
static int hf_ieee80211_eht_ttl_mapping_switch_time;
4884
static int hf_ieee80211_eht_ttl_mapping_expected_duration;
4885
static int hf_ieee80211_eht_ttl_mapping_tid_0_link_mapping;
4886
static int hf_ieee80211_eht_ttl_mapping_tid_1_link_mapping;
4887
static int hf_ieee80211_eht_ttl_mapping_tid_2_link_mapping;
4888
static int hf_ieee80211_eht_ttl_mapping_tid_3_link_mapping;
4889
static int hf_ieee80211_eht_ttl_mapping_tid_4_link_mapping;
4890
static int hf_ieee80211_eht_ttl_mapping_tid_5_link_mapping;
4891
static int hf_ieee80211_eht_ttl_mapping_tid_6_link_mapping;
4892
static int hf_ieee80211_eht_ttl_mapping_tid_7_link_mapping;
4893
static int hf_ieee80211_eht_multi_link_traffic_control;
4894
static int hf_ieee80211_eht_multi_link_tc_bitmap_size;
4895
static int hf_ieee80211_eht_multi_link_tc_aid_offset;
4896
static int hf_ieee80211_eht_multi_link_tc_reserved;
4897
static int hf_ieee80211_eht_multi_link_traffic_indication;
4898
static int hf_ieee80211_eht_qos_chars_dirn;
4899
static int hf_ieee80211_eht_qos_chars_tid;
4900
static int hf_ieee80211_eht_qos_chars_user_prio;
4901
static int hf_ieee80211_eht_qos_chars_bitmap;
4902
static int hf_ieee80211_eht_qos_chars_linkid;
4903
static int hf_ieee80211_eht_qos_chars_resrvd;
4904
static int hf_ieee80211_eht_qos_chars_min_svc_interval;
4905
static int hf_ieee80211_eht_qos_chars_max_svc_interval;
4906
static int hf_ieee80211_eht_qos_chars_min_data_rate;
4907
static int hf_ieee80211_eht_qos_chars_delay_bound;
4908
static int hf_ieee80211_eht_qos_chars_max_msdu_size;
4909
static int hf_ieee80211_eht_qos_chars_service_start_time;
4910
static int hf_ieee80211_eht_qos_chars_service_start_time_linkid;
4911
static int hf_ieee80211_eht_qos_chars_mean_data_rate;
4912
static int hf_ieee80211_eht_qos_chars_burst_size;
4913
static int hf_ieee80211_eht_qos_chars_msdu_lifetime;
4914
static int hf_ieee80211_eht_qos_chars_msdu_delivery_ratio;
4915
static int hf_ieee80211_eht_qos_chars_msdu_count_exponent;
4916
static int hf_ieee80211_eht_qos_chars_medium_time;
4917
static int hf_ieee80211_eht_link_id_bitmap;
4918
static int hf_ieee80211_eht_aid_bitmap_length;
4919
static int hf_ieee80211_eht_aid_bitmap_control;
4920
static int hf_ieee80211_eht_aid_bitmap_control_reserved;
4921
static int hf_ieee80211_eht_aid_bitmap_control_offset;
4922
static int hf_ieee80211_eht_aid_bitmap_partial_aid_bitmap;
4923
static int hf_ieee80211_eht_aid_bitmap_aid;
4924
static int hf_ieee80211_eht_bw_indi_param;
4925
static int hf_ieee80211_eht_bw_indi_param_reserved;
4926
static int hf_ieee80211_eht_bw_indi_param_disabled_subchan_bitmap;
4927
static int hf_ieee80211_eht_bw_indi_param_reserved1;
4928
static int hf_ieee80211_eht_bw_indi_diabled_bitmap;
4929
static int hf_ieee80211_eht_mimo_ctrl_field;
4930
static int hf_ieee80211_eht_mimo_ctrl_nc_index;
4931
static int hf_ieee80211_eht_mimo_ctrl_nr_index;
4932
static int hf_ieee80211_eht_mimo_ctrl_bw;
4933
static int hf_ieee80211_eht_mimo_ctrl_grouping;
4934
static int hf_ieee80211_eht_mimo_ctrl_feedback_type;
4935
static int hf_ieee80211_eht_mimo_ctrl_reserved1;
4936
static int hf_ieee80211_eht_mimo_ctrl_remaining_feedback_segments;
4937
static int hf_ieee80211_eht_mimo_ctrl_first_feedback_segment;
4938
static int hf_ieee80211_eht_mimo_ctrl_partial_bw_info;
4939
static int hf_ieee80211_eht_mimo_ctrl_sounding_dialog_token_number;
4940
static int hf_ieee80211_eht_mimo_ctrl_codebook_info;
4941
static int hf_ieee80211_eht_mimo_ctrl_reserved2;
4942
4943
/* be: Compressed beamforming report etc */
4944
static int hf_ieee80211_eht_compressed_beamforming_report_snr;
4945
static int hf_ieee80211_eht_compressed_beamform_scidx;
4946
4947
/* be: MU Exclusive beamforming report */
4948
static int hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr;
4949
4950
static int hf_ieee80211_eht_eml_control_field;
4951
static int hf_ieee80211_eht_eml_control_emlsr_mode;
4952
static int hf_ieee80211_eht_eml_control_emlmr_mode;
4953
static int hf_ieee80211_eht_eml_control_emlsr_para_update_control;
4954
static int hf_ieee80211_eht_eml_control_device_coexist_activities;
4955
static int hf_ieee80211_eht_eml_control_reserved;
4956
static int hf_ieee80211_eht_eml_control_link_bitmap;
4957
static int hf_ieee80211_eht_eml_control_link_enable_id;
4958
static int hf_ieee80211_eht_eml_control_mcs_map_count;
4959
static int hf_ieee80211_eht_eml_control_mcs_map_count_bw;
4960
static int hf_ieee80211_eht_eml_control_mcs_map_count_reserved;
4961
static int hf_ieee80211_eht_emlsr_para_update;
4962
static int hf_ieee80211_eht_emlsr_para_update_padding_delay;
4963
static int hf_ieee80211_eht_emlsr_para_update_tran_delay;
4964
static int hf_ieee80211_eht_emlsr_para_update_reserved;
4965
4966
static int hf_ieee80211_eht_group_key_data_length;
4967
static int hf_ieee80211_eht_reconfig_link_id_info;
4968
static int hf_ieee80211_eht_reconfig_link_id;
4969
static int hf_ieee80211_eht_reconfig_link_id_reserved;
4970
static int hf_ieee80211_eht_reconfig_status_code;
4971
4972
static int hf_ieee80211_ff_ant_selection;
4973
static int hf_ieee80211_ff_ant_selection_0;
4974
static int hf_ieee80211_ff_ant_selection_1;
4975
static int hf_ieee80211_ff_ant_selection_2;
4976
static int hf_ieee80211_ff_ant_selection_3;
4977
static int hf_ieee80211_ff_ant_selection_4;
4978
static int hf_ieee80211_ff_ant_selection_5;
4979
static int hf_ieee80211_ff_ant_selection_6;
4980
static int hf_ieee80211_ff_ant_selection_7;
4981
4982
static int * const ieee80211_ff_ant_selection_fields[] = {
4983
  &hf_ieee80211_ff_ant_selection_0,
4984
  &hf_ieee80211_ff_ant_selection_1,
4985
  &hf_ieee80211_ff_ant_selection_2,
4986
  &hf_ieee80211_ff_ant_selection_3,
4987
  &hf_ieee80211_ff_ant_selection_4,
4988
  &hf_ieee80211_ff_ant_selection_5,
4989
  &hf_ieee80211_ff_ant_selection_6,
4990
  &hf_ieee80211_ff_ant_selection_7,
4991
  NULL
4992
};
4993
4994
static int hf_ieee80211_ff_ext_channel_switch_announcement;
4995
static int hf_ieee80211_ff_ext_channel_switch_announcement_switch_mode;
4996
static int hf_ieee80211_ff_ext_channel_switch_announcement_new_ope_class;
4997
static int hf_ieee80211_ff_ext_channel_switch_announcement_new_chan_number;
4998
static int hf_ieee80211_ff_ext_channel_switch_announcement_switch_count;
4999
5000
static int * const ieee80211_ff_ext_channel_switch_announcement_fields[] = {
5001
  &hf_ieee80211_ff_ext_channel_switch_announcement_switch_mode,
5002
  &hf_ieee80211_ff_ext_channel_switch_announcement_new_ope_class,
5003
  &hf_ieee80211_ff_ext_channel_switch_announcement_new_chan_number,
5004
  &hf_ieee80211_ff_ext_channel_switch_announcement_switch_count,
5005
  NULL
5006
};
5007
5008
static int hf_ieee80211_ff_ht_info;
5009
static int hf_ieee80211_ff_ht_info_information_request;
5010
static int hf_ieee80211_ff_ht_info_40_mhz_intolerant;
5011
static int hf_ieee80211_ff_ht_info_sta_chan_width;
5012
static int hf_ieee80211_ff_ht_info_reserved;
5013
5014
static int * const ieee80211_ff_ht_info_fields[] = {
5015
  &hf_ieee80211_ff_ht_info_information_request,
5016
  &hf_ieee80211_ff_ht_info_40_mhz_intolerant,
5017
  &hf_ieee80211_ff_ht_info_sta_chan_width,
5018
  &hf_ieee80211_ff_ht_info_reserved,
5019
  NULL
5020
};
5021
5022
static int hf_ieee80211_ff_ht_action;
5023
5024
static int hf_ieee80211_ff_psmp_sta_info;
5025
static int hf_ieee80211_ff_psmp_sta_info_type;
5026
static int hf_ieee80211_ff_psmp_sta_info_dtt_start_offset;
5027
static int hf_ieee80211_ff_psmp_sta_info_dtt_duration;
5028
static int hf_ieee80211_ff_psmp_sta_info_sta_id;
5029
static int hf_ieee80211_ff_psmp_sta_info_utt_start_offset;
5030
static int hf_ieee80211_ff_psmp_sta_info_utt_duration;
5031
static int hf_ieee80211_ff_psmp_sta_info_reserved_small;
5032
static int hf_ieee80211_ff_psmp_sta_info_reserved_large;
5033
static int hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id;
5034
5035
static int hf_ieee80211_ff_mimo_csi_snr;
5036
static int hf_ieee80211_ff_mimo_csi_matrices;
5037
static int hf_ieee80211_ff_mimo_csi_bf_matrices;
5038
static int hf_ieee80211_ff_mimo_csi_cbf_matrices;
5039
5040
/*** Begin: 802.11s additions ***/
5041
static int hf_ieee80211_mesh_control_field;
5042
5043
static int hf_ieee80211_ff_mesh_action;
5044
static int hf_ieee80211_ff_multihop_action;
5045
static int hf_ieee80211_ff_mesh_flags;
5046
static int hf_ieee80211_ff_mesh_ttl;
5047
static int hf_ieee80211_ff_mesh_sequence;
5048
static int hf_ieee80211_ff_mesh_addr4;
5049
static int hf_ieee80211_ff_mesh_addr5;
5050
static int hf_ieee80211_ff_mesh_addr6;
5051
static int hf_ieee80211_ff_selfprot_action;
5052
5053
static int hf_ieee80211_mesh_peering_proto;
5054
static int hf_ieee80211_mesh_peering_local_link_id;
5055
static int hf_ieee80211_mesh_peering_peer_link_id;
5056
5057
static int hf_ieee80211_ff_hwmp_flags;
5058
static int hf_ieee80211_ff_hwmp_hopcount;
5059
static int hf_ieee80211_ff_hwmp_ttl;
5060
static int hf_ieee80211_ff_hwmp_pdid;
5061
static int hf_ieee80211_ff_hwmp_orig_sta;
5062
static int hf_ieee80211_ff_hwmp_orig_sn;
5063
static int hf_ieee80211_ff_hwmp_orig_ext;
5064
static int hf_ieee80211_ff_hwmp_lifetime;
5065
static int hf_ieee80211_ff_hwmp_metric;
5066
static int hf_ieee80211_ff_hwmp_targ_count;
5067
static int hf_ieee80211_ff_hwmp_targ_flags;
5068
static int hf_ieee80211_ff_hwmp_targ_to_flags;
5069
static int hf_ieee80211_ff_hwmp_targ_usn_flags;
5070
static int hf_ieee80211_ff_hwmp_targ_sta;
5071
static int hf_ieee80211_ff_hwmp_targ_sn;
5072
static int hf_ieee80211_ff_hwmp_targ_ext;
5073
static int hf_ieee80211_rann_flags;
5074
static int hf_ieee80211_rann_root_sta;
5075
static int hf_ieee80211_rann_sn;
5076
static int hf_ieee80211_rann_interval;
5077
5078
static int hf_ieee80211_mesh_channel_switch_ttl;
5079
static int hf_ieee80211_mesh_channel_switch_flag;
5080
static int hf_ieee80211_mesh_channel_switch_reason_code;
5081
static int hf_ieee80211_mesh_channel_switch_precedence_value;
5082
static int hf_ieee80211_mesh_chswitch_flag_txrestrict;
5083
static int hf_ieee80211_mesh_chswitch_flag_initiator;
5084
5085
static int hf_ieee80211_mesh_config_path_sel_protocol;
5086
static int hf_ieee80211_mesh_config_path_sel_metric;
5087
static int hf_ieee80211_mesh_config_congestion_control;
5088
static int hf_ieee80211_mesh_config_sync_method;
5089
static int hf_ieee80211_mesh_config_auth_protocol;
5090
static int hf_ieee80211_mesh_config_formation_info;
5091
static int hf_ieee80211_mesh_config_capability;
5092
static int hf_ieee80211_mesh_id;
5093
static int hf_ieee80211_mesh_config_cap_accepting;
5094
static int hf_ieee80211_mesh_config_cap_mcca_support;
5095
static int hf_ieee80211_mesh_config_cap_mcca_enabled;
5096
static int hf_ieee80211_mesh_config_cap_forwarding;
5097
static int hf_ieee80211_mesh_config_cap_mbca_enabled;
5098
static int hf_ieee80211_mesh_config_cap_tbtt_adjusting;
5099
static int hf_ieee80211_mesh_config_cap_power_save_level;
5100
static int hf_ieee80211_mesh_config_cap_reserved;
5101
static int hf_ieee80211_mesh_form_info_conn_to_mesh_gate;
5102
static int hf_ieee80211_mesh_form_info_num_of_peerings;
5103
static int hf_ieee80211_mesh_form_info_conn_to_as;
5104
static int hf_ieee80211_mesh_awake_window;
5105
static int hf_ieee80211_mesh_mic;
5106
static int hf_ieee80211_mesh_ampe_encrypted_data;
5107
5108
static int hf_ieee80211_bcn_timing_rctrl;
5109
static int hf_ieee80211_bcn_timing_rctrl_more;
5110
static int hf_ieee80211_bcn_timing_rctrl_element_num;
5111
static int hf_ieee80211_bcn_timing_rctrl_status_num;
5112
static int hf_ieee80211_bcn_timing_info;
5113
static int hf_ieee80211_bcn_timing_info_nsta_id;
5114
static int hf_ieee80211_bcn_timing_info_nsta_tbtt;
5115
static int hf_ieee80211_bcn_timing_info_nsta_bi;
5116
5117
static int hf_ieee80211_gann_flags;
5118
static int hf_ieee80211_gann_flags_reserved;
5119
static int hf_ieee80211_gann_hop_count;
5120
static int hf_ieee80211_gann_elem_ttl;
5121
static int hf_ieee80211_gann_mesh_gate_addr;
5122
static int hf_ieee80211_gann_seq_num;
5123
static int hf_ieee80211_gann_interval;
5124
5125
static int hf_ieee80211_pxu_pxu_id;
5126
static int hf_ieee80211_pxu_pxu_origin_mac;
5127
static int hf_ieee80211_pxu_no_proxy_info;
5128
static int hf_ieee80211_pxu_proxy_info;
5129
static int hf_ieee80211_pxu_proxy_info_flags;
5130
static int hf_ieee80211_pxu_proxy_info_flags_delete;
5131
static int hf_ieee80211_pxu_proxy_info_flags_orig_is_proxy;
5132
static int hf_ieee80211_pxu_proxy_info_flags_lifetime;
5133
static int hf_ieee80211_pxu_proxy_info_flags_reserved;
5134
static int hf_ieee80211_pxu_proxy_info_ext_mac;
5135
static int hf_ieee80211_pxu_proxy_info_seq_num;
5136
static int hf_ieee80211_pxu_proxy_info_proxy_mac;
5137
static int hf_ieee80211_pxu_proxy_info_lifetime;
5138
5139
static int hf_ieee80211_pxuc_pxu_id;
5140
static int hf_ieee80211_pxuc_pxu_recip_mac;
5141
5142
static int hf_ieee80211_ff_public_action;
5143
static int hf_ieee80211_ff_protected_public_action;
5144
static int hf_ieee80211_ff_tod;
5145
static int hf_ieee80211_ff_toa;
5146
static int hf_ieee80211_ff_max_tod_err;
5147
static int hf_ieee80211_ff_max_toa_err;
5148
5149
/* ************************************************************************* */
5150
/*            Flags found in the capability field (fixed field)              */
5151
/* ************************************************************************* */
5152
static int hf_ieee80211_ff_capture;
5153
static int hf_ieee80211_ff_cf_ess;
5154
static int hf_ieee80211_ff_cf_ibss;
5155
static int hf_ieee80211_ff_cf_reserved1;
5156
static int hf_ieee80211_ff_cf_reserved2;
5157
static int hf_ieee80211_ff_cf_privacy;
5158
static int hf_ieee80211_ff_cf_preamble;
5159
static int hf_ieee80211_ff_cf_critical_update_flag;
5160
static int hf_ieee80211_ff_cf_nontran_bss_critical_update_flag;
5161
static int hf_ieee80211_ff_cf_spec_man;
5162
static int hf_ieee80211_ff_cf_qos;
5163
static int hf_ieee80211_ff_cf_short_slot_time;
5164
static int hf_ieee80211_ff_cf_apsd;
5165
static int hf_ieee80211_ff_cf_radio_measurement;
5166
static int hf_ieee80211_ff_cf_epd;
5167
static int hf_ieee80211_ff_cf_reserved5;
5168
static int hf_ieee80211_ff_cf_reserved6;
5169
5170
/* ************************************************************************* */
5171
/*                       A-MSDU fields                                       */
5172
/* ************************************************************************* */
5173
static int hf_ieee80211_amsdu_subframe;
5174
static int hf_ieee80211_amsdu_length;
5175
static int hf_ieee80211_amsdu_padding;
5176
5177
/* ************************************************************************* */
5178
/*                       Tagged value format fields                          */
5179
/* ************************************************************************* */
5180
static int hf_ieee80211_tagged_parameters;  /* Tagged payload item */
5181
static int hf_ieee80211_tag;
5182
static int hf_ieee80211_tag_number;
5183
static int hf_ieee80211_tag_length;
5184
static int hf_ieee80211_tag_data;
5185
static int hf_ieee80211_tag_oui;
5186
static int hf_ieee80211_tag_oui_wfa_subtype;
5187
static int hf_ieee80211_tag_oui_wfa_action_type;
5188
static int hf_ieee80211_tag_ssid;
5189
static int hf_ieee80211_tag_supp_rates;
5190
static int hf_ieee80211_tag_fh_dwell_time;
5191
static int hf_ieee80211_tag_fh_hop_set;
5192
static int hf_ieee80211_tag_fh_hop_pattern;
5193
static int hf_ieee80211_tag_fh_hop_index;
5194
static int hf_ieee80211_tag_ds_param_channel;
5195
static int hf_ieee80211_tag_cfp_count;
5196
static int hf_ieee80211_tag_cfp_period;
5197
static int hf_ieee80211_tag_cfp_max_duration;
5198
static int hf_ieee80211_tag_cfp_dur_remaining;
5199
static int hf_ieee80211_tim_dtim_count;
5200
static int hf_ieee80211_tim_dtim_period;
5201
static int hf_ieee80211_tim_bmapctl;
5202
static int hf_ieee80211_tim_bmapctl_mcast;
5203
static int hf_ieee80211_tim_bmapctl_offset;
5204
static int hf_ieee80211_tim_partial_virtual_bitmap;
5205
static int hf_ieee80211_tim_aid;
5206
static int hf_ieee80211_tag_ibss_atim_window;
5207
static int hf_ieee80211_tag_country_info_code;
5208
static int hf_ieee80211_tag_country_info_env;
5209
static int hf_ieee80211_tag_country_info_pad;
5210
static int hf_ieee80211_tag_country_info_fnm;
5211
static int hf_ieee80211_tag_country_info_fnm_fcn;
5212
static int hf_ieee80211_tag_country_info_fnm_nc;
5213
static int hf_ieee80211_tag_country_info_fnm_mtpl;
5214
static int hf_ieee80211_tag_country_info_rrc;
5215
static int hf_ieee80211_tag_country_info_rrc_oei;
5216
static int hf_ieee80211_tag_country_info_rrc_oc;
5217
static int hf_ieee80211_tag_country_info_rrc_cc;
5218
static int hf_ieee80211_tag_fh_hopping_parameter_prime_radix;
5219
static int hf_ieee80211_tag_fh_hopping_parameter_nb_channels;
5220
static int hf_ieee80211_tag_fh_hopping_table_flag;
5221
static int hf_ieee80211_tag_fh_hopping_table_number_of_sets;
5222
static int hf_ieee80211_tag_fh_hopping_table_modulus;
5223
static int hf_ieee80211_tag_fh_hopping_table_offset;
5224
static int hf_ieee80211_tag_fh_hopping_random_table;
5225
static int hf_ieee80211_tag_request;
5226
static int hf_ieee80211_tag_extended_request_id;
5227
static int hf_ieee80211_tag_extended_request_extension;
5228
static int hf_ieee80211_tag_challenge_text;
5229
5230
static int hf_ieee80211_oui_qos_subtype;
5231
static int hf_ieee80211_oui_qos_mgmt_dialog_token;
5232
static int hf_ieee80211_oui_qos_mgmt_resp_control;
5233
static int hf_ieee80211_oui_qos_mgmt_rsp_ctrl_more;
5234
static int hf_ieee80211_oui_qos_mgmt_rsp_ctrl_reset;
5235
static int hf_ieee80211_oui_qos_mgmt_rsp_reserved;
5236
static int hf_ieee80211_oui_qos_mgmt_rqst_control;
5237
static int hf_ieee80211_oui_qos_mgmt_rq_ctrl_more;
5238
static int hf_ieee80211_oui_qos_mgmt_rq_ctrl_reset;
5239
static int hf_ieee80211_oui_qos_mgmt_rq_reserved;
5240
static int hf_ieee80211_oui_qos_mgmt_count;
5241
static int hf_ieee80211_dscp_policy_id;
5242
static int hf_ieee80211_dscp_policy_status;
5243
static int hf_ieee80211_dscp_policy_scs_sts_list;
5244
5245
static int hf_ieee80211_tag_he_6ghz_cap_inf;
5246
static int hf_ieee80211_tag_he_6ghz_cap_inf_b0_b2;
5247
static int hf_ieee80211_tag_he_6ghz_cap_inf_b3_b5;
5248
static int hf_ieee80211_tag_he_6ghz_cap_inf_b6_b7;
5249
static int hf_ieee80211_tag_he_6ghz_cap_inf_b8;
5250
static int hf_ieee80211_tag_he_6ghz_cap_inf_b9_b10;
5251
static int hf_ieee80211_tag_he_6ghz_cap_inf_b11;
5252
static int hf_ieee80211_tag_he_6ghz_cap_inf_b12;
5253
static int hf_ieee80211_tag_he_6ghz_cap_inf_b13;
5254
static int hf_ieee80211_tag_he_6ghz_cap_inf_b14_b15;
5255
5256
static int hf_ieee80211_tag_ftm_tsf_sync_info;
5257
5258
static int * const ieee80211_tag_he_6ghz_cap_inf[] = {
5259
  &hf_ieee80211_tag_he_6ghz_cap_inf_b0_b2,
5260
  &hf_ieee80211_tag_he_6ghz_cap_inf_b3_b5,
5261
  &hf_ieee80211_tag_he_6ghz_cap_inf_b6_b7,
5262
  &hf_ieee80211_tag_he_6ghz_cap_inf_b8,
5263
  &hf_ieee80211_tag_he_6ghz_cap_inf_b9_b10,
5264
  &hf_ieee80211_tag_he_6ghz_cap_inf_b11,
5265
  &hf_ieee80211_tag_he_6ghz_cap_inf_b12,
5266
  &hf_ieee80211_tag_he_6ghz_cap_inf_b13,
5267
  &hf_ieee80211_tag_he_6ghz_cap_inf_b14_b15,
5268
  NULL
5269
};
5270
5271
5272
static int hf_ieee80211_wep_iv;
5273
static int hf_ieee80211_wep_iv_weak;
5274
static int hf_ieee80211_tkip_extiv;
5275
static int hf_ieee80211_ccmp_extiv;
5276
static int hf_ieee80211_wep_key;
5277
static int hf_ieee80211_wep_icv;
5278
static int hf_ieee80211_fc_analysis_pmk;
5279
static int hf_ieee80211_fc_analysis_kck;
5280
static int hf_ieee80211_fc_analysis_kek;
5281
static int hf_ieee80211_fc_analysis_tk;
5282
static int hf_ieee80211_fc_analysis_gtk;
5283
5284
static int hf_ieee80211_block_ack_control;
5285
static int hf_ieee80211_block_ack_control_ack_policy;
5286
static int hf_ieee80211_block_ack_control_type;
5287
static int hf_ieee80211_block_ack_control_reserved;
5288
static int hf_ieee80211_block_ack_control_tid_info;
5289
5290
static int hf_ieee80211_block_ack_multi_tid_reserved;
5291
static int hf_ieee80211_block_ack_multi_tid_value;
5292
static int hf_ieee80211_block_ack_bitmap;
5293
static int hf_ieee80211_block_ack_bitmap_missing_frame;
5294
static int hf_ieee80211_block_ack_bitmap_last_ack_frame;
5295
static int hf_ieee80211_block_ack_gcr_addr;
5296
5297
static int hf_ieee80211_block_ack_multi_sta_aid11;
5298
static int hf_ieee80211_block_ack_multi_sta_ack_type;
5299
static int hf_ieee80211_block_ack_multi_sta_tid;
5300
static int hf_ieee80211_block_ack_multi_sta_aid_tid;
5301
static int hf_ieee80211_block_ack_multi_sta_reserved;
5302
static int hf_ieee80211_block_ack_multi_sta_ra;
5303
5304
static int hf_ieee80211_tag_measure_request_measurement_mode;
5305
static int hf_ieee80211_tag_measure_request_bssid;
5306
5307
static int hf_ieee80211_tag_measure_request_subelement_length;
5308
static int hf_ieee80211_tag_measure_request_beacon_sub_id;
5309
static int hf_ieee80211_tag_measure_request_beacon_sub_ssid;
5310
static int hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition;
5311
static int hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset;
5312
static int hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail;
5313
static int hf_ieee80211_tag_measure_request_beacon_sub_last_report_indication_request;
5314
static int hf_ieee80211_tag_measure_request_beacon_unknown;
5315
5316
static int hf_ieee80211_tag_measure_request_channel_load_sub_id;
5317
static int hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition;
5318
static int hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref;
5319
5320
static int hf_ieee80211_tag_measure_request_noise_histogram_sub_id;
5321
static int hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition;
5322
static int hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref;
5323
5324
static int hf_ieee80211_tag_measure_request_frame_request_type;
5325
static int hf_ieee80211_tag_measure_request_mac_address;
5326
static int hf_ieee80211_tag_measure_request_peer_mac_address;
5327
static int hf_ieee80211_tag_measure_request_group_id;
5328
5329
static int hf_ieee80211_tag_measure_request_location_subject;
5330
static int hf_ieee80211_tag_measure_request_civic_location_type;
5331
static int hf_ieee80211_tag_measure_request_location_service_interval_units;
5332
static int hf_ieee80211_tag_measure_request_location_service_interval;
5333
5334
static int hf_ieee80211_tag_measure_request_unknown;
5335
5336
static int hf_ieee80211_ht_pren_type;
5337
static int hf_ieee80211_ht_pren_unknown;
5338
5339
static int hf_ieee80211_ht_cap;
5340
static int hf_ieee80211_ht_vs_cap;
5341
static int hf_ieee80211_ht_ldpc_coding;
5342
static int hf_ieee80211_ht_chan_width;
5343
static int hf_ieee80211_ht_sm_pwsave;
5344
static int hf_ieee80211_ht_green;
5345
static int hf_ieee80211_ht_short20;
5346
static int hf_ieee80211_ht_short40;
5347
static int hf_ieee80211_ht_tx_stbc;
5348
static int hf_ieee80211_ht_rx_stbc;
5349
static int hf_ieee80211_ht_reserved_b10;
5350
static int hf_ieee80211_ht_max_amsdu;
5351
static int hf_ieee80211_ht_dss_cck_40;
5352
static int hf_ieee80211_ht_reserved_b13;
5353
static int hf_ieee80211_ht_40_mhz_intolerant;
5354
static int hf_ieee80211_ht_reserved_b15;
5355
5356
static int hf_ieee80211_ext_bss_mu_mimo_capable_sta_count;
5357
static int hf_ieee80211_ext_bss_ss_underutilization;
5358
static int hf_ieee80211_ext_bss_observable_sec_20mhz_utilization;
5359
static int hf_ieee80211_ext_bss_observable_sec_40mhz_utilization;
5360
static int hf_ieee80211_ext_bss_observable_sec_80mhz_utilization;
5361
static int hf_ieee80211_wide_bw_new_channel_width;
5362
static int hf_ieee80211_wide_bw_new_channel_center_freq_segment0;
5363
static int hf_ieee80211_wide_bw_new_channel_center_freq_segment1;
5364
5365
static int hf_ieee80211_operat_notification_mode;
5366
static int hf_ieee80211_operat_mode_field_channel_width;
5367
static int hf_ieee80211_operat_mode_field_160_80plus80_bw;
5368
static int hf_ieee80211_operat_mode_field_no_ldpc;
5369
static int hf_ieee80211_operat_mode_field_rxnss;
5370
static int hf_ieee80211_operat_mode_field_rxnsstype;
5371
5372
static int hf_ieee80211_tbtt_info;
5373
static int hf_ieee80211_tbtt_filtered_nap;
5374
static int hf_ieee80211_tbtt_info_count;
5375
static int hf_ieee80211_tbtt_info_length;
5376
5377
static int hf_ieee80211_tbtt_operating_class;
5378
static int hf_ieee80211_tbtt_channel_number;
5379
5380
static int hf_ieee80211_tbtt_offset;
5381
static int hf_ieee80211_tbtt_bssid;
5382
static int hf_ieee80211_tbtt_short_ssid;
5383
static int hf_ieee80211_rnr_bss_params;
5384
static int hf_ieee80211_rnr_oct_recommended;
5385
static int hf_ieee80211_rnr_same_ssid;
5386
static int hf_ieee80211_rnr_multiple_bssid;
5387
static int hf_ieee80211_rnr_transmitted_bssid;
5388
static int hf_ieee80211_rnr_ess_with_colocated_ap;
5389
static int hf_ieee80211_rnr_unsolicited_probe_responses;
5390
static int hf_ieee80211_rnr_same_colocated_ap;
5391
static int hf_ieee80211_rnr_same_reserved;
5392
static int hf_ieee80211_rnr_20mhz_psd_subfield;
5393
static int hf_ieee80211_rnr_reserved_data;
5394
static int hf_ieee80211_rnr_mld_params;
5395
static int hf_ieee80211_rnr_mld_id;
5396
static int hf_ieee80211_rnr_mld_link_id;
5397
static int hf_ieee80211_rnr_mld_bss_params_change_count;
5398
static int hf_ieee80211_rnr_mld_all_updates_included;
5399
static int hf_ieee80211_rnr_mld_disabled_link_indication;
5400
static int hf_ieee80211_rnr_mld_reserved;
5401
5402
static int hf_ieee80211_ampduparam;
5403
static int hf_ieee80211_ampduparam_vs;
5404
static int hf_ieee80211_ampduparam_mpdu;
5405
static int hf_ieee80211_ampduparam_mpdu_start_spacing;
5406
static int hf_ieee80211_ampduparam_reserved;
5407
5408
static int hf_ieee80211_beacon_sequence;
5409
static int hf_ieee80211_pentapartial_timestamp;
5410
static int hf_ieee80211_tack_next_twt_info;
5411
static int hf_ieee80211_tack_next_twt;
5412
static int hf_ieee80211_tack_flow_identifier;
5413
5414
static int hf_ieee80211_ff_s1g_action;
5415
static int hf_ieee80211_ff_prot_s1g_action;
5416
static int hf_ieee80211_ff_s1g_timestamp;
5417
static int hf_ieee80211_ff_s1g_change_sequence;
5418
static int hf_ieee80211_ff_s1g_next_tbtt;
5419
static int hf_ieee80211_ff_s1g_compressed_ssid;
5420
static int hf_ieee80211_ff_s1g_access_network_options;
5421
5422
static int hf_ieee80211_s1g_sync_control;
5423
static int hf_ieee80211_s1g_sync_control_uplink_sync_request;
5424
static int hf_ieee80211_s1g_sync_control_time_slot_protection_request;
5425
static int hf_ieee80211_s1g_sync_control_reserved;
5426
5427
static int hf_ieee80211_s1g_sector_id_index;
5428
static int hf_ieee80211_s1g_sector_id_preferred_sector_id;
5429
static int hf_ieee80211_s1g_sector_id_snr;
5430
static int hf_ieee80211_s1g_sector_id_receive_sector_bitmap;
5431
5432
static int hf_ieee80211_s1g_twt_information_control;
5433
static int hf_ieee80211_s1g_twt_flow_identifier;
5434
static int hf_ieee80211_s1g_twt_response_required;
5435
static int hf_ieee80211_s1g_twt_next_twt_request;
5436
static int hf_ieee80211_s1g_twt_next_twt_subfield_size;
5437
static int hf_ieee80211_s1g_twt_reserved;
5438
static int hf_ieee80211_s1g_twt_next_twt_32;
5439
static int hf_ieee80211_s1g_twt_next_twt_48;
5440
static int hf_ieee80211_s1g_twt_next_twt_64;
5441
5442
static int hf_ieee80211_s1g_update_edca_info;
5443
static int hf_ieee80211_s1g_update_edca_override;
5444
static int hf_ieee80211_s1g_update_edca_ps_poll_aci;
5445
static int hf_ieee80211_s1g_update_edca_raw_aci;
5446
static int hf_ieee80211_s1g_update_edca_sta_type;
5447
static int hf_ieee80211_s1g_update_edca_reserved;
5448
5449
static int hf_ieee80211_s1g_cap_byte1;
5450
static int hf_ieee80211_s1g_cap_byte2;
5451
static int hf_ieee80211_s1g_cap_byte3;
5452
static int hf_ieee80211_s1g_cap_byte4;
5453
static int hf_ieee80211_s1g_cap_byte5;
5454
static int hf_ieee80211_s1g_cap_byte6;
5455
static int hf_ieee80211_s1g_cap_byte7;
5456
static int hf_ieee80211_s1g_cap_byte8;
5457
static int hf_ieee80211_s1g_cap_byte9;
5458
static int hf_ieee80211_s1g_cap_byte10;
5459
static int hf_ieee80211_s1g_cap_s1g_long_support;
5460
static int hf_ieee80211_s1g_cap_short_gi_for_1_mhz;
5461
static int hf_ieee80211_s1g_cap_short_gi_for_2_mhz;
5462
static int hf_ieee80211_s1g_cap_short_gi_for_4_mhz;
5463
static int hf_ieee80211_s1g_cap_short_gi_for_8_mhz;
5464
static int hf_ieee80211_s1g_cap_short_gi_for_16_mhz;
5465
static int hf_ieee80211_s1g_cap_supported_channel_width;
5466
static int hf_ieee80211_s1g_cap_rx_ldpc;
5467
static int hf_ieee80211_s1g_cap_tx_stbc;
5468
static int hf_ieee80211_s1g_cap_rx_stbc;
5469
static int hf_ieee80211_s1g_cap_su_beamformer_capable;
5470
static int hf_ieee80211_s1g_cap_su_beamformee_capable;
5471
static int hf_ieee80211_s1g_cap_beamformee_sts_capability;
5472
static int hf_ieee80211_s1g_cap_number_sounding_dimensions;
5473
static int hf_ieee80211_s1g_cap_mu_beamformer_capable;
5474
static int hf_ieee80211_s1g_cap_mu_beamformee_capable;
5475
static int hf_ieee80211_s1g_cap_htc_vht_capable;
5476
static int hf_ieee80211_s1g_cap_travelling_pilot_support;
5477
static int hf_ieee80211_s1g_cap_rd_responder;
5478
static int hf_ieee80211_s1g_cap_ht_delayed_block_ack;
5479
static int hf_ieee80211_s1g_cap_maximum_mpdu_length;
5480
static int hf_ieee80211_s1g_cap_maximum_a_mpdu_length_exp;
5481
static int hf_ieee80211_s1g_cap_minimum_mpdu_start_spacing;
5482
static int hf_ieee80211_s1g_cap_uplink_sync_capable;
5483
static int hf_ieee80211_s1g_cap_dynamic_aid;
5484
static int hf_ieee80211_s1g_cap_bat_support;
5485
static int hf_ieee80211_s1g_cap_tim_ade_support;
5486
static int hf_ieee80211_s1g_cap_non_tim_support;
5487
static int hf_ieee80211_s1g_cap_group_aid_support;
5488
static int hf_ieee80211_s1g_cap_sta_type_support;
5489
static int hf_ieee80211_s1g_cap_centralized_authentication_control;
5490
static int hf_ieee80211_s1g_cap_distributed_authentication_control;
5491
static int hf_ieee80211_s1g_cap_a_msdu_support;
5492
static int hf_ieee80211_s1g_cap_a_mpdu_support;
5493
static int hf_ieee80211_s1g_cap_asymmetic_block_ack_support;
5494
static int hf_ieee80211_s1g_cap_flow_control_support;
5495
static int hf_ieee80211_s1g_cap_sectorized_beam_capable;
5496
static int hf_ieee80211_s1g_cap_obss_mitigation_support;
5497
static int hf_ieee80211_s1g_cap_fragment_ba_support;
5498
static int hf_ieee80211_s1g_cap_ndp_ps_poll_supported;
5499
static int hf_ieee80211_s1g_cap_raw_operation_support;
5500
static int hf_ieee80211_s1g_cap_page_slicing_support;
5501
static int hf_ieee80211_s1g_cap_txop_sharing_implicit_ack_support;
5502
static int hf_ieee80211_s1g_cap_vht_link_adaptation_capable;
5503
static int hf_ieee80211_s1g_cap_tack_support_as_ps_poll_response;
5504
static int hf_ieee80211_s1g_cap_duplicate_1_mhz_support;
5505
static int hf_ieee80211_s1g_cap_mcs_negotiation_support;
5506
static int hf_ieee80211_s1g_cap_1_mhz_control_response_preamble_support;
5507
static int hf_ieee80211_s1g_cap_ndp_beamforming_report_poll_support;
5508
static int hf_ieee80211_s1g_cap_unsolicited_dynamic_aid;
5509
static int hf_ieee80211_s1g_cap_sector_training_operation_supported;
5510
static int hf_ieee80211_s1g_cap_temporary_ps_mode_switch;
5511
static int hf_ieee80211_s1g_cap_twt_grouping_support;
5512
static int hf_ieee80211_s1g_cap_bdt_capable;
5513
static int hf_ieee80211_s1g_cap_color;
5514
static int hf_ieee80211_s1g_cap_twt_requester_support;
5515
static int hf_ieee80211_s1g_cap_twt_responder_support;
5516
static int hf_ieee80211_s1g_cap_pv1_frame_support;
5517
static int hf_ieee80211_s1g_cap_link_adaptation_per_normal_control_response_capable;
5518
static int hf_ieee80211_s1g_cap_reserved;
5519
static int hf_ieee80211_s1g_mcs_and_nss_set;
5520
static int hf_ieee80211_s1g_rx_s1g_mcs_map;
5521
static int hf_ieee80211_s1g_rx_highest_supported_long_gi_data_rate;
5522
static int hf_ieee80211_s1g_tx_s1g_mcs_map;
5523
static int hf_ieee80211_s1g_tx_highest_supported_long_gi_data_rate;
5524
static int hf_ieee80211_s1g_rx_single_spatial_stream_map_for_1_mhz;
5525
static int hf_ieee80211_s1g_tx_single_spatial_stream_map_for_1_mhz;
5526
static int hf_ieee80211_s1g_mcs_and_nss_reserved;
5527
static int hf_ieee80211_s1g_subchannel_selective_transmission;
5528
static int hf_ieee80211_s1g_sst_sounding_option;
5529
static int hf_ieee80211_s1g_channel_activity_bitmap;
5530
static int hf_ieee80211_s1g_ul_activity;
5531
static int hf_ieee80211_s1g_dl_activity;
5532
static int hf_ieee80211_s1g_max_trans_width;
5533
static int hf_ieee80211_s1g_activity_start_time;
5534
static int hf_ieee80211_s1g_sst_sounding_option1;
5535
static int hf_ieee80211_s1g_channel_activity_bitmap1;
5536
static int hf_ieee80211_s1g_sounding_start_time_present;
5537
static int hf_ieee80211_s1g_channel_activity_reserved;
5538
static int hf_ieee80211_s1g_max_trans_width1;
5539
static int hf_ieee80211_s1g_sounding_start_time;
5540
static int hf_ieee80211_s1g_open_loop_link_margin;
5541
static int hf_ieee80211_s1g_raw_control;
5542
static int hf_ieee80211_s1g_raw_type;
5543
static int hf_ieee80211_s1g_raw_type_options;
5544
static int hf_ieee80211_s1g_raw_start_time_indication;
5545
static int hf_ieee80211_s1g_raw_raw_group_indication;
5546
static int hf_ieee80211_s1g_raw_channel_indication_preference;
5547
static int hf_ieee80211_s1g_raw_periodic_raw_indication;
5548
static int hf_ieee80211_s1g_raw_slot_def;
5549
static int hf_ieee80211_s1g_slot_def_format_indication;
5550
static int hf_ieee80211_s1g_slot_def_cross_slot_boundary;
5551
static int hf_ieee80211_s1g_slot_def_slot_duration_count8;
5552
static int hf_ieee80211_s1g_slot_def_num_slots6;
5553
static int hf_ieee80211_s1g_slot_def_slot_duration_count11;
5554
static int hf_ieee80211_s1g_slot_def_num_slots3;
5555
static int hf_ieee80211_s1g_raw_start_time;
5556
static int hf_ieee80211_s1g_raw_group_subfield;
5557
static int hf_ieee80211_s1g_raw_group_page_index;
5558
static int hf_ieee80211_s1g_raw_group_start_aid;
5559
static int hf_ieee80211_s1g_raw_group_end_aid;
5560
static int hf_ieee80211_s1g_raw_channel_indication;
5561
static int hf_ieee80211_s1g_raw_ci_channel_activity_bitmap;
5562
static int hf_ieee80211_s1g_raw_ci_max_trans_width;
5563
static int hf_ieee80211_s1g_raw_ci_ul_activity;
5564
static int hf_ieee80211_s1g_raw_ci_dl_activity;
5565
static int hf_ieee80211_s1g_raw_ci_reserved;
5566
static int hf_ieee80211_s1g_raw_praw_periodicity;
5567
static int hf_ieee80211_s1g_raw_praw_validity;
5568
static int hf_ieee80211_s1g_raw_praw_start_offset;
5569
static int hf_ieee80211_s1g_page_slice_page_period;
5570
static int hf_ieee80211_s1g_page_slice_control;
5571
static int hf_ieee80211_s1g_page_slice_page_index;
5572
static int hf_ieee80211_s1g_page_slice_page_slice_length;
5573
static int hf_ieee80211_s1g_page_slice_page_slice_count;
5574
static int hf_ieee80211_s1g_page_slice_block_offset;
5575
static int hf_ieee80211_s1g_page_slice_tim_offset;
5576
static int hf_ieee80211_s1g_page_slice_reserved;
5577
static int hf_ieee80211_s1g_page_slice_page_bitmap;
5578
static int hf_ieee80211_s1g_aid_request_mode;
5579
static int hf_ieee80211_s1g_aid_request_interval_present;
5580
static int hf_ieee80211_s1g_aid_request_per_sta_address_present;
5581
static int hf_ieee80211_s1g_aid_request_service_characteristic_present;
5582
static int hf_ieee80211_s1g_aid_request_non_tim_mode_switch;
5583
static int hf_ieee80211_s1g_aid_request_tim_mode_switch;
5584
static int hf_ieee80211_s1g_aid_request_group_address_present;
5585
static int hf_ieee80211_s1g_aid_request_reserved;
5586
static int hf_ieee80211_s1g_aid_request_interval;
5587
static int hf_ieee80211_s1g_aid_request_characteristic_sensor;
5588
static int hf_ieee80211_s1g_aid_request_characteristic_offload;
5589
static int hf_ieee80211_s1g_aid_request_characteristic_official_service;
5590
static int hf_ieee80211_s1g_aid_request_characteristic_reserved;
5591
static int hf_ieee80211_s1g_aid_req_peer_sta_addr;
5592
static int hf_ieee80211_s1g_aid_request_characteristic;
5593
static int hf_ieee80211_s1g_aid_req_group_addr;
5594
static int hf_ieee80211_s1g_aid_rsp_aid_group_aid;
5595
static int hf_ieee80211_s1g_aid_rsp_aid_switch_count;
5596
static int hf_ieee80211_s1g_aid_rsp_aid_response_interval;
5597
static int hf_ieee80211_s1g_sector_op_control_16b;
5598
static int hf_ieee80211_s1g_sector_op_sectorization_type_b16;
5599
static int hf_ieee80211_s1g_sector_op_periodic_training_indicator;
5600
static int hf_ieee80211_s1g_sector_op_training_period;
5601
static int hf_ieee80211_s1g_sector_op_remaining_beacon_interval;
5602
static int hf_ieee80211_s1g_sector_op_reserved_b16;
5603
static int hf_ieee80211_s1g_sector_op_control;
5604
static int hf_ieee80211_s1g_sector_op_sectorization_type;
5605
static int hf_ieee80211_s1g_sector_op_period;
5606
static int hf_ieee80211_s1g_sector_op_omni;
5607
static int hf_ieee80211_s1g_sector_op_group_info;
5608
static int hf_ieee80211_s1g_short_beacon_interval;
5609
static int hf_ieee80211_s1g_change_sequence;
5610
static int hf_ieee80211_s1g_auth_control_control;
5611
static int hf_ieee80211_s1g_auth_control_deferral;
5612
static int hf_ieee80211_s1g_auth_control_reserved;
5613
static int hf_ieee80211_s1g_auth_control_thresh;
5614
static int hf_ieee80211_s1g_auth_control_thresh_tus;
5615
static int hf_ieee80211_s1g_auth_slot_duration;
5616
static int hf_ieee80211_s1g_auth_max_trans_int;
5617
static int hf_ieee80211_s1g_auth_min_trans_int;
5618
static int hf_ieee80211_s1g_tsf_timer_accuracy;
5619
static int hf_ieee80211_s1g_relay_control;
5620
static int hf_ieee80211_s1g_relay_control_rootap_bssid;
5621
static int hf_ieee80211_s1g_relay_function_activation_mode;
5622
static int hf_ieee80211_s1g_relay_function_direction;
5623
static int hf_ieee80211_s1g_relay_function_enable_relay_function;
5624
static int hf_ieee80211_s1g_relay_function_stas_present_indic;
5625
static int hf_ieee80211_s1g_relay_function_reserved;
5626
static int hf_ieee80211_s1g_number_of_stas;
5627
static int hf_ieee80211_s1g_initiator_mac_address;
5628
static int hf_ieee80211_s1g_address_count;
5629
static int hf_ieee80211_s1g_reachable_add_remove;
5630
static int hf_ieee80211_s1g_reachable_relay_capable;
5631
static int hf_ieee80211_s1g_reachable_reserved;
5632
static int hf_ieee80211_s1g_reachable_mac_address;
5633
static int hf_ieee80211_s1g_relay_discovery_control;
5634
static int hf_ieee80211_s1g_min_data_rate_included;
5635
static int hf_ieee80211_s1g_mean_data_rate_included;
5636
static int hf_ieee80211_s1g_max_data_rate_included;
5637
static int hf_ieee80211_s1g_delay_and_min_phy_rate;
5638
static int hf_ieee80211_s1g_information_not_available;
5639
static int hf_ieee80211_s1g_relay_discovery_reserved;
5640
static int hf_ieee80211_s1g_relay_control_ul_min;
5641
static int hf_ieee80211_s1g_relay_control_ul_mean;
5642
static int hf_ieee80211_s1g_relay_control_ul_max;
5643
static int hf_ieee80211_s1g_relay_control_dl_min;
5644
static int hf_ieee80211_s1g_relay_control_dl_mean;
5645
static int hf_ieee80211_s1g_relay_control_dl_max;
5646
static int hf_ieee80211_s1g_relay_hierarchy_identifier;
5647
static int hf_ieee80211_s1g_relay_no_more_relay_flag;
5648
static int hf_ieee80211_s1g_aid_entry_mac_addr;
5649
static int hf_ieee80211_s1g_aid_entry_assoc_id;
5650
static int hf_ieee80211_s1g_beacon_compatibility_info;
5651
static int hf_ieee80211_s1g_beacon_interval;
5652
static int hf_ieee80211_s1g_tsf_completion;
5653
static int hf_ieee80211_s1g_channel_width;
5654
static int hf_ieee80211_s1g_primary_channel_width;
5655
static int hf_ieee80211_s1g_bss_operating_channel_width;
5656
static int hf_ieee80211_s1g_primary_channel_location;
5657
static int hf_ieee80211_s1g_reserved_b6;
5658
static int hf_ieee80211_s1g_mcs10_use;
5659
static int hf_ieee80211_s1g_operating_class;
5660
static int hf_ieee80211_s1g_primary_channel_number;
5661
static int hf_ieee80211_s1g_channel_center_frequency;
5662
static int hf_ieee80211_s1g_basic_mcs_and_nss_set;
5663
static int hf_ieee80211_s1g_sst_enabled_channel_bitmap;
5664
static int hf_ieee80211_s1g_sst_primary_channel_offset;
5665
static int hf_ieee80211_s1g_sst_channel_unit;
5666
static int hf_ieee80211_s1g_sst_reserved;
5667
static int hf_ieee80211_s1g_max_away_duration;
5668
static int hf_ieee80211_s1g_tim_bmapctrl;
5669
static int hf_ieee80211_s1g_tim_bmapctl_traffic_indicator;
5670
static int hf_ieee80211_s1g_tim_page_slice_number;
5671
static int hf_ieee80211_s1g_tim_page_index;
5672
static int hf_ieee80211_s1g_pvb_block_control_byte;
5673
static int hf_ieee80211_s1g_pvb_encoding_mode;
5674
static int hf_ieee80211_s1g_pvb_inverse_bitmap;
5675
static int hf_ieee80211_s1g_pvb_block_offset;
5676
static int hf_ieee80211_s1g_block_bitmap;
5677
static int hf_ieee80211_s1g_block_bitmap_sta_aid13;
5678
static int hf_ieee80211_s1g_block_bitmap_single_aid;
5679
static int hf_ieee80211_s1g_block_bitmap_olb_length;
5680
static int hf_ieee80211_s1g_block_bitmap_ade;
5681
static int hf_ieee80211_s1g_block_bitmap_ewl;
5682
static int hf_ieee80211_s1g_block_bitmap_len;
5683
static int hf_ieee80211_s1g_block_bitmap_ade_bytes;
5684
static int hf_ieee80211_s1g_probe_response_group_bitmap;
5685
static int hf_ieee80211_s1g_probe_resp_subfield_0;
5686
static int hf_ieee80211_pv1_probe_response_req_full_ssid;
5687
static int hf_ieee80211_pv1_probe_response_req_next_tbtt;
5688
static int hf_ieee80211_pv1_probe_response_req_access_network_option;
5689
static int hf_ieee80211_pv1_probe_response_req_s1g_beacon_compatibility;
5690
static int hf_ieee80211_pv1_probe_response_req_supported_rates;
5691
static int hf_ieee80211_pv1_probe_response_req_s1g_capability;
5692
static int hf_ieee80211_pv1_probe_response_req_s1g_operation;
5693
static int hf_ieee80211_pv1_probe_response_req_rsn;
5694
static int hf_ieee80211_s1g_el_op_max_awake_duration;
5695
static int hf_ieee80211_s1g_el_op_recovery_time_duration;
5696
static int hf_ieee80211_s1g_sectorized_group_id_list;
5697
static int hf_ieee80211_s1g_header_comp_control;
5698
static int hf_ieee80211_s1g_header_comp_req_resp;
5699
static int hf_ieee80211_s1g_header_comp_store_a3;
5700
static int hf_ieee80211_s1g_header_comp_store_a4;
5701
static int hf_ieee80211_s1g_header_comp_ccmp_update_present;
5702
static int hf_ieee80211_s1g_header_comp_pv1_data_type_3_supported;
5703
static int hf_ieee80211_s1g_header_comp_reserved;
5704
static int hf_ieee80211_s1g_header_comp_a3;
5705
static int hf_ieee80211_s1g_header_comp_a4;
5706
static int hf_ieee80211_s1g_header_comp_ccmp_update;
5707
5708
static int hf_ieee80211_mcsset;
5709
static int hf_ieee80211_mcsset_vs;
5710
static int hf_ieee80211_mcsset_rx_bitmask;
5711
static int hf_ieee80211_mcsset_rx_bitmask_0to7;
5712
static int hf_ieee80211_mcsset_rx_bitmask_8to15;
5713
static int hf_ieee80211_mcsset_rx_bitmask_16to23;
5714
static int hf_ieee80211_mcsset_rx_bitmask_24to31;
5715
static int hf_ieee80211_mcsset_rx_bitmask_32;
5716
static int hf_ieee80211_mcsset_rx_bitmask_33to38;
5717
static int hf_ieee80211_mcsset_rx_bitmask_39to52;
5718
static int hf_ieee80211_mcsset_rx_bitmask_53to76;
5719
static int hf_ieee80211_mcsset_highest_data_rate;
5720
static int hf_ieee80211_mcsset_tx_mcs_set_defined;
5721
static int hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal;
5722
static int hf_ieee80211_mcsset_tx_max_spatial_streams;
5723
static int hf_ieee80211_mcsset_tx_unequal_modulation;
5724
5725
static int hf_ieee80211_htex_cap;
5726
static int hf_ieee80211_htex_vs_cap;
5727
static int hf_ieee80211_htex_reserved_b0_b7;
5728
static int hf_ieee80211_htex_mcs;
5729
static int hf_ieee80211_htex_htc_support;
5730
static int hf_ieee80211_htex_rd_responder;
5731
static int hf_ieee80211_htex_reserved_b12_b15;
5732
5733
static int hf_ieee80211_txbf;
5734
static int hf_ieee80211_txbf_vs;
5735
static int hf_ieee80211_txbf_cap;
5736
static int hf_ieee80211_txbf_rcv_ssc;
5737
static int hf_ieee80211_txbf_tx_ssc;
5738
static int hf_ieee80211_txbf_rcv_ndp;
5739
static int hf_ieee80211_txbf_tx_ndp;
5740
static int hf_ieee80211_txbf_impl_txbf;
5741
static int hf_ieee80211_txbf_calib;
5742
static int hf_ieee80211_txbf_expl_csi;
5743
static int hf_ieee80211_txbf_expl_uncomp_fm;
5744
static int hf_ieee80211_txbf_expl_comp_fm;
5745
static int hf_ieee80211_txbf_expl_bf_csi;
5746
static int hf_ieee80211_txbf_expl_uncomp_fm_feed;
5747
static int hf_ieee80211_txbf_expl_comp_fm_feed;
5748
static int hf_ieee80211_txbf_csi_num_bf_ant;
5749
static int hf_ieee80211_txbf_min_group;
5750
static int hf_ieee80211_txbf_uncomp_sm_bf_ant;
5751
static int hf_ieee80211_txbf_comp_sm_bf_ant;
5752
static int hf_ieee80211_txbf_csi_max_rows_bf;
5753
static int hf_ieee80211_txbf_chan_est;
5754
static int hf_ieee80211_txbf_resrv;
5755
5756
/*** Begin: 802.11n - HT Operation IE  ***/
5757
static int hf_ieee80211_ht_operation_primary_channel;
5758
5759
static int hf_ieee80211_ht_operation_info_delimiter1;
5760
static int hf_ieee80211_ht_operation_info_secondary_channel_offset;
5761
static int hf_ieee80211_ht_operation_info_sta_channel_width;
5762
static int hf_ieee80211_ht_operation_info_rifs_mode;
5763
static int hf_ieee80211_ht_operation_info_reserved_b4_b7;
5764
5765
static int hf_ieee80211_ht_operation_info_delimiter2;
5766
static int hf_ieee80211_ht_operation_info_protection;
5767
static int hf_ieee80211_ht_operation_info_non_greenfield_sta_present;
5768
static int hf_ieee80211_ht_operation_info_reserved_b11;
5769
static int hf_ieee80211_ht_operation_info_obss_non_ht_stas_present;
5770
static int hf_ieee80211_ht_operation_info_channel_center_freq_seg_2;
5771
static int hf_ieee80211_ht_operation_info_reserved_b21_b23;
5772
5773
static int hf_ieee80211_ht_operation_info_delimiter3;
5774
static int hf_ieee80211_ht_operation_info_reserved_b24_b29;
5775
static int hf_ieee80211_ht_operation_info_dual_beacon;
5776
static int hf_ieee80211_ht_operation_info_dual_cts_protection;
5777
static int hf_ieee80211_ht_operation_info_stbc_beacon;
5778
static int hf_ieee80211_ht_operation_info_reserved_b33_b39;
5779
5780
static int hf_ieee80211_ht_operation_mcsset_reserved;
5781
/*** End: 802.11n - HT Operation IE  ***/
5782
5783
static int hf_ieee80211_tag_ap_channel_report_operating_class;
5784
static int hf_ieee80211_tag_ap_channel_report_channel_list;
5785
5786
static int hf_ieee80211_tag_secondary_channel_offset;
5787
5788
static int hf_ieee80211_tag_bss_ap_avg_access_delay;
5789
5790
static int hf_ieee80211_tag_antenna_id;
5791
5792
static int hf_ieee80211_tag_rsni;
5793
5794
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask;
5795
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0;
5796
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1;
5797
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2;
5798
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3;
5799
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4;
5800
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5;
5801
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6;
5802
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7;
5803
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0;
5804
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1;
5805
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2;
5806
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3;
5807
static int hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv;
5808
static int hf_ieee80211_tag_bss_avb_adm_cap_up0;
5809
static int hf_ieee80211_tag_bss_avb_adm_cap_up1;
5810
static int hf_ieee80211_tag_bss_avb_adm_cap_up2;
5811
static int hf_ieee80211_tag_bss_avb_adm_cap_up3;
5812
static int hf_ieee80211_tag_bss_avb_adm_cap_up4;
5813
static int hf_ieee80211_tag_bss_avb_adm_cap_up5;
5814
static int hf_ieee80211_tag_bss_avb_adm_cap_up6;
5815
static int hf_ieee80211_tag_bss_avb_adm_cap_up7;
5816
static int hf_ieee80211_tag_bss_avb_adm_cap_ac0;
5817
static int hf_ieee80211_tag_bss_avb_adm_cap_ac1;
5818
static int hf_ieee80211_tag_bss_avb_adm_cap_ac2;
5819
static int hf_ieee80211_tag_bss_avb_adm_cap_ac3;
5820
5821
static int hf_ieee80211_tag_bss_avg_ac_access_delay_be;
5822
static int hf_ieee80211_tag_bss_avg_ac_access_delay_bk;
5823
static int hf_ieee80211_tag_bss_avg_ac_access_delay_vi;
5824
static int hf_ieee80211_tag_bss_avg_ac_access_delay_vo;
5825
5826
static int hf_ieee80211_tag_rm_enabled_capabilities;
5827
static int hf_ieee80211_tag_rm_enabled_capabilities_b0;
5828
static int hf_ieee80211_tag_rm_enabled_capabilities_b1;
5829
static int hf_ieee80211_tag_rm_enabled_capabilities_b2;
5830
static int hf_ieee80211_tag_rm_enabled_capabilities_b3;
5831
static int hf_ieee80211_tag_rm_enabled_capabilities_b4;
5832
static int hf_ieee80211_tag_rm_enabled_capabilities_b5;
5833
static int hf_ieee80211_tag_rm_enabled_capabilities_b6;
5834
static int hf_ieee80211_tag_rm_enabled_capabilities_b7;
5835
static int hf_ieee80211_tag_rm_enabled_capabilities_b8;
5836
static int hf_ieee80211_tag_rm_enabled_capabilities_b9;
5837
static int hf_ieee80211_tag_rm_enabled_capabilities_b10;
5838
static int hf_ieee80211_tag_rm_enabled_capabilities_b11;
5839
static int hf_ieee80211_tag_rm_enabled_capabilities_b12;
5840
static int hf_ieee80211_tag_rm_enabled_capabilities_b13;
5841
static int hf_ieee80211_tag_rm_enabled_capabilities_b14;
5842
static int hf_ieee80211_tag_rm_enabled_capabilities_b15;
5843
static int hf_ieee80211_tag_rm_enabled_capabilities_b16;
5844
static int hf_ieee80211_tag_rm_enabled_capabilities_b17;
5845
static int hf_ieee80211_tag_rm_enabled_capabilities_b18to20;
5846
static int hf_ieee80211_tag_rm_enabled_capabilities_b21to23;
5847
static int hf_ieee80211_tag_rm_enabled_capabilities_b24to26;
5848
static int hf_ieee80211_tag_rm_enabled_capabilities_b27;
5849
static int hf_ieee80211_tag_rm_enabled_capabilities_b28;
5850
static int hf_ieee80211_tag_rm_enabled_capabilities_b29;
5851
static int hf_ieee80211_tag_rm_enabled_capabilities_b30;
5852
static int hf_ieee80211_tag_rm_enabled_capabilities_b31;
5853
static int hf_ieee80211_tag_rm_enabled_capabilities_b32;
5854
static int hf_ieee80211_tag_rm_enabled_capabilities_b33;
5855
static int hf_ieee80211_tag_rm_enabled_capabilities_b34;
5856
static int hf_ieee80211_tag_rm_enabled_capabilities_b35;
5857
static int hf_ieee80211_tag_rm_enabled_capabilities_o5;
5858
5859
static int hf_ieee80211_tag_rcpi;
5860
static int hf_ieee80211_tag_multiple_bssid;
5861
static int hf_ieee80211_tag_multiple_bssid_subelem_id;
5862
static int hf_ieee80211_tag_multiple_bssid_subelem_len;
5863
static int hf_ieee80211_tag_multiple_bssid_subelem_reserved;
5864
static int hf_ieee80211_tag_multiple_bssid_subelem_nontrans_profile;
5865
5866
static int hf_ieee80211_tag_20_40_bc;
5867
static int hf_ieee80211_tag_20_40_bc_information_request;
5868
static int hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant;
5869
static int hf_ieee80211_tag_20_40_bc_20_mhz_bss_width_request;
5870
static int hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request;
5871
static int hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant;
5872
static int hf_ieee80211_tag_20_40_bc_reserved;
5873
5874
static int hf_ieee80211_tag_intolerant_operating_class;
5875
static int hf_ieee80211_tag_intolerant_channel_list;
5876
static int hf_ieee80211_tag_intolerant_channel;
5877
5878
static int hf_ieee80211_tag_power_constraint_local;
5879
5880
static int hf_ieee80211_tag_power_capability_min;
5881
static int hf_ieee80211_tag_power_capability_max;
5882
5883
static int hf_ieee80211_tag_tpc_report_trsmt_pow;
5884
static int hf_ieee80211_tag_tpc_report_link_mrg;
5885
static int hf_ieee80211_tag_tpc_report_reserved;
5886
5887
static int hf_ieee80211_tag_supported_channels;
5888
static int hf_ieee80211_tag_supported_channels_first;
5889
static int hf_ieee80211_tag_supported_channels_range;
5890
5891
static int hf_ieee80211_csa_channel_switch_mode;
5892
static int hf_ieee80211_csa_new_channel_number;
5893
static int hf_ieee80211_csa_channel_switch_count;
5894
5895
static int hf_ieee80211_tag_measure_request_token;
5896
static int hf_ieee80211_tag_measure_request_mode;
5897
static int hf_ieee80211_tag_measure_request_mode_parallel;
5898
static int hf_ieee80211_tag_measure_request_mode_enable;
5899
static int hf_ieee80211_tag_measure_request_mode_request;
5900
static int hf_ieee80211_tag_measure_request_mode_report;
5901
static int hf_ieee80211_tag_measure_request_mode_duration_mandatory;
5902
static int hf_ieee80211_tag_measure_request_mode_reserved;
5903
static int hf_ieee80211_tag_measure_request_type;
5904
5905
static int hf_ieee80211_tag_measure_request_channel_number;
5906
static int hf_ieee80211_tag_measure_request_start_time;
5907
static int hf_ieee80211_tag_measure_request_duration;
5908
5909
static int hf_ieee80211_tag_measure_request_operating_class;
5910
static int hf_ieee80211_tag_measure_request_randomization_interval;
5911
5912
static int hf_ieee80211_tag_measure_report_measurement_token;
5913
static int hf_ieee80211_tag_measure_report_mode;
5914
static int hf_ieee80211_tag_measure_report_mode_late;
5915
static int hf_ieee80211_tag_measure_report_mode_incapable;
5916
static int hf_ieee80211_tag_measure_report_mode_refused;
5917
static int hf_ieee80211_tag_measure_report_mode_reserved;
5918
static int hf_ieee80211_tag_measure_report_type;
5919
static int hf_ieee80211_tag_measure_report_channel_number;
5920
static int hf_ieee80211_tag_measure_report_start_time;
5921
static int hf_ieee80211_tag_measure_report_duration;
5922
5923
static int hf_ieee80211_tag_measure_basic_map_field;
5924
static int hf_ieee80211_tag_measure_map_field_bss;
5925
static int hf_ieee80211_tag_measure_map_field_ofdm;
5926
static int hf_ieee80211_tag_measure_map_field_unident_signal;
5927
static int hf_ieee80211_tag_measure_map_field_radar;
5928
static int hf_ieee80211_tag_measure_map_field_unmeasured;
5929
static int hf_ieee80211_tag_measure_map_field_reserved;
5930
5931
static int hf_ieee80211_tag_measure_cca_busy_fraction;
5932
5933
static int hf_ieee80211_tag_measure_rpi_histogram_report;
5934
static int hf_ieee80211_tag_measure_rpi_histogram_report_0;
5935
static int hf_ieee80211_tag_measure_rpi_histogram_report_1;
5936
static int hf_ieee80211_tag_measure_rpi_histogram_report_2;
5937
static int hf_ieee80211_tag_measure_rpi_histogram_report_3;
5938
static int hf_ieee80211_tag_measure_rpi_histogram_report_4;
5939
static int hf_ieee80211_tag_measure_rpi_histogram_report_5;
5940
static int hf_ieee80211_tag_measure_rpi_histogram_report_6;
5941
static int hf_ieee80211_tag_measure_rpi_histogram_report_7;
5942
5943
static int hf_ieee80211_tag_measure_report_operating_class;
5944
static int hf_ieee80211_tag_measure_report_channel_load;
5945
static int hf_ieee80211_tag_measure_report_frame_info;
5946
static int hf_ieee80211_tag_measure_report_frame_info_phy_type;
5947
static int hf_ieee80211_tag_measure_report_frame_info_frame_type;
5948
static int hf_ieee80211_tag_measure_report_rcpi;
5949
static int hf_ieee80211_tag_measure_report_rsni;
5950
static int hf_ieee80211_tag_measure_report_bssid;
5951
static int hf_ieee80211_tag_measure_report_ant_id;
5952
static int hf_ieee80211_tag_measure_report_anpi;
5953
static int hf_ieee80211_tag_measure_report_ipi_density_0;
5954
static int hf_ieee80211_tag_measure_report_ipi_density_1;
5955
static int hf_ieee80211_tag_measure_report_ipi_density_2;
5956
static int hf_ieee80211_tag_measure_report_ipi_density_3;
5957
static int hf_ieee80211_tag_measure_report_ipi_density_4;
5958
static int hf_ieee80211_tag_measure_report_ipi_density_5;
5959
static int hf_ieee80211_tag_measure_report_ipi_density_6;
5960
static int hf_ieee80211_tag_measure_report_ipi_density_7;
5961
static int hf_ieee80211_tag_measure_report_ipi_density_8;
5962
static int hf_ieee80211_tag_measure_report_ipi_density_9;
5963
static int hf_ieee80211_tag_measure_report_ipi_density_10;
5964
static int hf_ieee80211_tag_measure_report_parent_tsf;
5965
5966
static int hf_ieee80211_tag_measure_report_subelement_length;
5967
static int hf_ieee80211_tag_measure_report_beacon_sub_id;
5968
static int hf_ieee80211_tag_measure_report_beacon_unknown;
5969
static int hf_ieee80211_tag_measure_report_beacon_sub_last_report_indication;
5970
static int hf_ieee80211_tag_measure_reported_frame_frag_id;
5971
static int hf_ieee80211_tag_measure_reported_frame_frag_rep_id;
5972
static int hf_ieee80211_tag_measure_reported_frame_frag_number;
5973
static int hf_ieee80211_tag_measure_reported_frame_frag_more;
5974
5975
static int hf_ieee80211_tag_measure_report_lci_sub_id;
5976
static int hf_ieee80211_tag_measure_report_lci_lci;
5977
static int hf_ieee80211_tag_measure_report_lci_z_sta_floor_info;
5978
static int hf_ieee80211_tag_measure_report_lci_z_sta_floor_info_expected_to_move;
5979
static int hf_ieee80211_tag_measure_report_lci_z_sta_floor_info_sta_floor_number;
5980
static int hf_ieee80211_tag_measure_report_lci_z_sta_height_above_floor;
5981
static int hf_ieee80211_tag_measure_report_lci_z_sta_height_above_floor_uncertainty;
5982
static int hf_ieee80211_tag_measure_report_lci_urp;
5983
static int hf_ieee80211_tag_measure_report_lci_urp_retransmission_allowed;
5984
static int hf_ieee80211_tag_measure_report_lci_urp_retention_expires_relative_present;
5985
static int hf_ieee80211_tag_measure_report_lci_urp_sta_location_policy;
5986
static int hf_ieee80211_tag_measure_report_lci_urp_reserved;
5987
static int hf_ieee80211_tag_measure_report_lci_urp_retention_expires_relative;
5988
static int hf_ieee80211_tag_measure_report_lci_unknown;
5989
5990
static int hf_ieee80211_tag_measure_report_civic_location_type;
5991
static int hf_ieee80211_tag_measure_report_civic_sub_id;
5992
static int hf_ieee80211_tag_measure_report_location_civic_country;
5993
static int hf_ieee80211_tag_measure_report_location_civic_type;
5994
static int hf_ieee80211_tag_measure_report_location_civic_length;
5995
static int hf_ieee80211_tag_measure_report_location_civic;
5996
5997
static int hf_ieee80211_tag_measure_report_unknown;
5998
5999
static int hf_ieee80211_tag_quiet_count;
6000
static int hf_ieee80211_tag_quiet_period;
6001
static int hf_ieee80211_tag_quiet_duration;
6002
static int hf_ieee80211_tag_quiet_offset;
6003
6004
static int hf_ieee80211_tag_dfs_owner;
6005
static int hf_ieee80211_tag_dfs_recovery_interval;
6006
static int hf_ieee80211_tag_dfs_channel_map;
6007
static int hf_ieee80211_tag_dfs_channel_number;
6008
static int hf_ieee80211_tag_dfs_map;
6009
6010
static int hf_ieee80211_tag_erp_info;
6011
static int hf_ieee80211_tag_erp_info_erp_present;
6012
static int hf_ieee80211_tag_erp_info_use_protection;
6013
static int hf_ieee80211_tag_erp_info_barker_preamble_mode;
6014
static int hf_ieee80211_tag_erp_info_reserved;
6015
6016
static int hf_ieee80211_tag_extended_capabilities;
6017
static int hf_ieee80211_tag_extended_capabilities_b0;
6018
static int hf_ieee80211_tag_extended_capabilities_b1;
6019
static int hf_ieee80211_tag_extended_capabilities_b2;
6020
static int hf_ieee80211_tag_extended_capabilities_b3;
6021
static int hf_ieee80211_tag_extended_capabilities_b4;
6022
static int hf_ieee80211_tag_extended_capabilities_b5;
6023
static int hf_ieee80211_tag_extended_capabilities_b6;
6024
static int hf_ieee80211_tag_extended_capabilities_b7;
6025
static int hf_ieee80211_tag_extended_capabilities_b8;
6026
static int hf_ieee80211_tag_extended_capabilities_b9;
6027
static int hf_ieee80211_tag_extended_capabilities_b10;
6028
static int hf_ieee80211_tag_extended_capabilities_b11;
6029
static int hf_ieee80211_tag_extended_capabilities_b12;
6030
static int hf_ieee80211_tag_extended_capabilities_b13;
6031
static int hf_ieee80211_tag_extended_capabilities_b14;
6032
static int hf_ieee80211_tag_extended_capabilities_b15;
6033
static int hf_ieee80211_tag_extended_capabilities_b16;
6034
static int hf_ieee80211_tag_extended_capabilities_b17;
6035
static int hf_ieee80211_tag_extended_capabilities_b18;
6036
static int hf_ieee80211_tag_extended_capabilities_b19;
6037
static int hf_ieee80211_tag_extended_capabilities_b20;
6038
static int hf_ieee80211_tag_extended_capabilities_b21;
6039
static int hf_ieee80211_tag_extended_capabilities_b22;
6040
static int hf_ieee80211_tag_extended_capabilities_b23;
6041
static int hf_ieee80211_tag_extended_capabilities_b24;
6042
static int hf_ieee80211_tag_extended_capabilities_b25;
6043
static int hf_ieee80211_tag_extended_capabilities_b26;
6044
static int hf_ieee80211_tag_extended_capabilities_b27;
6045
static int hf_ieee80211_tag_extended_capabilities_b28;
6046
static int hf_ieee80211_tag_extended_capabilities_b29;
6047
static int hf_ieee80211_tag_extended_capabilities_b30;
6048
static int hf_ieee80211_tag_extended_capabilities_b31;
6049
static int hf_ieee80211_tag_extended_capabilities_b32;
6050
static int hf_ieee80211_tag_extended_capabilities_b33;
6051
static int hf_ieee80211_tag_extended_capabilities_b34;
6052
static int hf_ieee80211_tag_extended_capabilities_b35;
6053
static int hf_ieee80211_tag_extended_capabilities_b36;
6054
static int hf_ieee80211_tag_extended_capabilities_b37;
6055
static int hf_ieee80211_tag_extended_capabilities_b38;
6056
static int hf_ieee80211_tag_extended_capabilities_b39;
6057
static int hf_ieee80211_tag_extended_capabilities_b40;
6058
static int hf_ieee80211_tag_extended_capabilities_serv_int_granularity;
6059
static int hf_ieee80211_tag_extended_capabilities_b44;
6060
static int hf_ieee80211_tag_extended_capabilities_b45;
6061
static int hf_ieee80211_tag_extended_capabilities_b46;
6062
static int hf_ieee80211_tag_extended_capabilities_b47;
6063
static int hf_ieee80211_tag_extended_capabilities_b48;
6064
static int hf_ieee80211_tag_extended_capabilities_b49;
6065
static int hf_ieee80211_tag_extended_capabilities_b50;
6066
static int hf_ieee80211_tag_extended_capabilities_b51;
6067
static int hf_ieee80211_tag_extended_capabilities_b52;
6068
static int hf_ieee80211_tag_extended_capabilities_b53;
6069
static int hf_ieee80211_tag_extended_capabilities_b54;
6070
static int hf_ieee80211_tag_extended_capabilities_b55;
6071
static int hf_ieee80211_tag_extended_capabilities_b56;
6072
static int hf_ieee80211_tag_extended_capabilities_b57;
6073
static int hf_ieee80211_tag_extended_capabilities_b58;
6074
static int hf_ieee80211_tag_extended_capabilities_b59;
6075
static int hf_ieee80211_tag_extended_capabilities_b60;
6076
static int hf_ieee80211_tag_extended_capabilities_b61;
6077
static int hf_ieee80211_tag_extended_capabilities_b62;
6078
static int hf_ieee80211_tag_extended_capabilities_b63;
6079
/* Used for the two-byte ext-cap field when present */
6080
static int hf_ieee80211_tag_extended_capabilities_2;
6081
static int hf_ieee80211_tag_extended_capabilities_b56_2;
6082
static int hf_ieee80211_tag_extended_capabilities_b57_2;
6083
static int hf_ieee80211_tag_extended_capabilities_b58_2;
6084
static int hf_ieee80211_tag_extended_capabilities_b59_2;
6085
static int hf_ieee80211_tag_extended_capabilities_b60_2;
6086
static int hf_ieee80211_tag_extended_capabilities_b61_2;
6087
static int hf_ieee80211_tag_extended_capabilities_b62_2;
6088
static int hf_ieee80211_tag_extended_capabilities_max_num_msdus;
6089
static int hf_ieee80211_tag_extended_capabilities_b65_2;
6090
static int hf_ieee80211_tag_extended_capabilities_b66_2;
6091
static int hf_ieee80211_tag_extended_capabilities_b67_2;
6092
static int hf_ieee80211_tag_extended_capabilities_b68_2;
6093
static int hf_ieee80211_tag_extended_capabilities_b69_2;
6094
static int hf_ieee80211_tag_extended_capabilities_b70_2;
6095
static int hf_ieee80211_tag_extended_capabilities_b71_2;
6096
6097
static int hf_ieee80211_tag_extended_capabilities_b72;
6098
static int hf_ieee80211_tag_extended_capabilities_b73;
6099
static int hf_ieee80211_tag_extended_capabilities_b74;
6100
static int hf_ieee80211_tag_extended_capabilities_b75;
6101
static int hf_ieee80211_tag_extended_capabilities_b76;
6102
static int hf_ieee80211_tag_extended_capabilities_b77;
6103
static int hf_ieee80211_tag_extended_capabilities_b78;
6104
static int hf_ieee80211_tag_extended_capabilities_b79;
6105
static int hf_ieee80211_tag_extended_capabilities_b80;
6106
static int hf_ieee80211_tag_extended_capabilities_b81;
6107
static int hf_ieee80211_tag_extended_capabilities_b82;
6108
static int hf_ieee80211_tag_extended_capabilities_b83;
6109
static int hf_ieee80211_tag_extended_capabilities_b84;
6110
static int hf_ieee80211_tag_extended_capabilities_b85;
6111
static int hf_ieee80211_tag_extended_capabilities_b86;
6112
static int hf_ieee80211_tag_extended_capabilities_b87;
6113
6114
static int hf_ieee80211_tag_extended_capabilities_b88;
6115
static int hf_ieee80211_tag_extended_capabilities_b89;
6116
static int hf_ieee80211_tag_extended_capabilities_b90;
6117
static int hf_ieee80211_tag_extended_capabilities_b91;
6118
static int hf_ieee80211_tag_extended_capabilities_b92;
6119
static int hf_ieee80211_tag_extended_capabilities_b93;
6120
static int hf_ieee80211_tag_extended_capabilities_b94;
6121
static int hf_ieee80211_tag_extended_capabilities_b95;
6122
6123
static int hf_ieee80211_tag_extended_capabilities_b96;
6124
static int hf_ieee80211_tag_extended_capabilities_b97;
6125
static int hf_ieee80211_tag_extended_capabilities_b98;
6126
static int hf_ieee80211_tag_extended_capabilities_b99;
6127
static int hf_ieee80211_tag_extended_capabilities_b100;
6128
static int hf_ieee80211_tag_extended_capabilities_b101;
6129
static int hf_ieee80211_tag_extended_capabilities_b102;
6130
static int hf_ieee80211_tag_extended_capabilities_b103;
6131
static int hf_ieee80211_tag_extended_capabilities_b104;
6132
static int hf_ieee80211_tag_extended_capabilities_b105;
6133
static int hf_ieee80211_tag_extended_capabilities_reserved2;
6134
6135
static int hf_ieee80211_tag_cisco_ccx1_unknown;
6136
static int hf_ieee80211_tag_cisco_ccx1_name;
6137
static int hf_ieee80211_tag_cisco_ccx1_clients;
6138
static int hf_ieee80211_tag_cisco_ccx1_unknown2;
6139
6140
static int hf_ieee80211_vs_cisco_ap_name_v2;
6141
6142
static int hf_ieee80211_vht_cap;
6143
static int hf_ieee80211_vht_max_mpdu_length;
6144
static int hf_ieee80211_vht_supported_chan_width_set;
6145
static int hf_ieee80211_vht_rx_ldpc;
6146
static int hf_ieee80211_vht_short_gi_for_80;
6147
static int hf_ieee80211_vht_short_gi_for_160;
6148
static int hf_ieee80211_vht_tx_stbc;
6149
static int hf_ieee80211_vht_rx_stbc;
6150
static int hf_ieee80211_vht_su_beamformer_cap;
6151
static int hf_ieee80211_vht_su_beamformee_cap;
6152
static int hf_ieee80211_vht_beamformer_antennas;
6153
static int hf_ieee80211_vht_sounding_dimensions;
6154
static int hf_ieee80211_vht_mu_beamformer_cap;
6155
static int hf_ieee80211_vht_mu_beamformee_cap;
6156
static int hf_ieee80211_vht_txop_ps;
6157
static int hf_ieee80211_vht_var_htc_field;
6158
static int hf_ieee80211_vht_max_ampdu;
6159
static int hf_ieee80211_vht_link_adaptation_cap;
6160
static int hf_ieee80211_vht_rx_pattern;
6161
static int hf_ieee80211_vht_tx_pattern;
6162
static int hf_ieee80211_vht_ext_nss_bw_support;
6163
6164
static int hf_ieee80211_vht_mcsset;
6165
6166
static int hf_ieee80211_vht_mcsset_rx_mcs_map;
6167
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss;
6168
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss;
6169
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss;
6170
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss;
6171
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss;
6172
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss;
6173
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss;
6174
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss;
6175
6176
static int hf_ieee80211_vht_mcsset_max_nsts_total;
6177
static int hf_ieee80211_vht_mcsset_rx_highest_long_gi;
6178
static int hf_ieee80211_vht_mcsset_extended_nss_bw_capable;
6179
static int hf_ieee80211_vht_mcsset_reserved;
6180
6181
static int hf_ieee80211_vht_mcsset_tx_mcs_map;
6182
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss;
6183
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss;
6184
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss;
6185
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss;
6186
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss;
6187
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss;
6188
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss;
6189
static int hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss;
6190
6191
static int hf_ieee80211_vht_op;
6192
static int hf_ieee80211_vht_op_channel_width;
6193
static int hf_ieee80211_vht_op_channel_center0;
6194
static int hf_ieee80211_vht_op_channel_center1;
6195
6196
static int hf_ieee80211_vht_op_basic_mcs_map;
6197
static int hf_ieee80211_vht_op_max_basic_mcs_for_1_ss;
6198
static int hf_ieee80211_vht_op_max_basic_mcs_for_2_ss;
6199
static int hf_ieee80211_vht_op_max_basic_mcs_for_3_ss;
6200
static int hf_ieee80211_vht_op_max_basic_mcs_for_4_ss;
6201
static int hf_ieee80211_vht_op_max_basic_mcs_for_5_ss;
6202
static int hf_ieee80211_vht_op_max_basic_mcs_for_6_ss;
6203
static int hf_ieee80211_vht_op_max_basic_mcs_for_7_ss;
6204
static int hf_ieee80211_vht_op_max_basic_mcs_for_8_ss;
6205
static int hf_ieee80211_vht_mcsset_tx_highest_long_gi;
6206
6207
static int hf_ieee80211_vht_tpe_pwr_info;
6208
static int hf_ieee80211_vht_tpe_pwr_info_count;
6209
static int hf_ieee80211_vht_tpe_pwr_info_unit;
6210
static int hf_ieee80211_vht_tpe_pwr_info_category;
6211
static int hf_ieee80211_vht_tpe_pwr_constr_20;
6212
static int hf_ieee80211_vht_tpe_pwr_constr_40;
6213
static int hf_ieee80211_vht_tpe_pwr_constr_80;
6214
static int hf_ieee80211_vht_tpe_pwr_constr_160;
6215
static int hf_ieee80211_vht_tpe_pwr_constr_320;
6216
static int hf_ieee80211_vht_tpe_any_bw_psd;
6217
static int hf_ieee80211_vht_tpe_psd;
6218
static int hf_ieee80211_vht_tpe_ext_count;
6219
static int hf_ieee80211_vht_tpe_ext_reserved;
6220
6221
static int hf_ieee80211_beamform_feedback_seg_retrans_bitmap;
6222
6223
static int hf_ieee80211_ndp_annc_token;
6224
static int hf_ieee80211_ndp_annc_variant;
6225
static int hf_ieee80211_ndp_annc_token_number;
6226
static int hf_ieee80211_vht_ndp_annc_sta_info_aid12;
6227
static int hf_ieee80211_vht_ndp_annc_sta_info_feedback_type;
6228
static int hf_ieee80211_vht_ndp_annc_sta_info_nc_index;
6229
static int hf_ieee80211_vht_ndp_annc_sta_info_reserved;
6230
6231
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008;
6232
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_aid11;
6233
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_ltf_offset;
6234
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_r2i_n_sts;
6235
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_r2i_rep;
6236
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_i2r_n_sts;
6237
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_reserved1;
6238
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_disambiguation;
6239
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_i2r_rep;
6240
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_reserved2;
6241
6242
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043;
6243
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_aid11;
6244
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_sac;
6245
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_disambiguation;
6246
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_reserved;
6247
6248
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044;
6249
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_aid11;
6250
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_partial_tsf;
6251
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_disambiguation;
6252
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_reserved;
6253
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_token;
6254
6255
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045;
6256
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_aid11;
6257
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_i2r_ndp_tx_power;
6258
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_r2i_ndp_target_rssi;
6259
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_disambiguation;
6260
static int hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_reserved;
6261
6262
6263
static int hf_ieee80211_ndp_eht_annc_sta_info;
6264
static int hf_ieee80211_ndp_eht_annc_aid11;
6265
static int hf_ieee80211_ndp_eht_annc_resolution;
6266
static int hf_ieee80211_ndp_eht_annc_feedback_map;
6267
static int hf_ieee80211_ndp_eht_annc_reserved1;
6268
static int hf_ieee80211_ndp_eht_annc_nc_index;
6269
static int hf_ieee80211_ndp_eht_annc_feedback_type;
6270
static int hf_ieee80211_ndp_eht_annc_disambiguation;
6271
static int hf_ieee80211_ndp_eht_annc_codebook_size;
6272
static int hf_ieee80211_ndp_eht_annc_reserved2;
6273
6274
static int hf_ieee80211_ff_vht_action;
6275
static int hf_ieee80211_ff_vht_mimo_cntrl;
6276
static int hf_ieee80211_ff_vht_mimo_cntrl_nc_index;
6277
static int hf_ieee80211_ff_vht_mimo_cntrl_nr_index;
6278
static int hf_ieee80211_ff_vht_mimo_cntrl_channel_width;
6279
static int hf_ieee80211_ff_vht_mimo_cntrl_grouping;
6280
static int hf_ieee80211_ff_vht_mimo_cntrl_codebook_info;
6281
static int hf_ieee80211_ff_vht_mimo_cntrl_feedback_type;
6282
static int hf_ieee80211_ff_vht_mimo_cntrl_remaining_feedback_seg;
6283
static int hf_ieee80211_ff_vht_mimo_cntrl_first_feedback_seg;
6284
static int hf_ieee80211_ff_vht_mimo_cntrl_reserved;
6285
static int hf_ieee80211_ff_vht_mimo_cntrl_sounding_dialog_token_number;
6286
6287
static int * const hf_ieee80211_ff_vht_mimo_cntrl_fields[] = {
6288
  &hf_ieee80211_ff_vht_mimo_cntrl_nc_index,
6289
  &hf_ieee80211_ff_vht_mimo_cntrl_nr_index,
6290
  &hf_ieee80211_ff_vht_mimo_cntrl_channel_width,
6291
  &hf_ieee80211_ff_vht_mimo_cntrl_grouping,
6292
  &hf_ieee80211_ff_vht_mimo_cntrl_codebook_info,
6293
  &hf_ieee80211_ff_vht_mimo_cntrl_feedback_type,
6294
  &hf_ieee80211_ff_vht_mimo_cntrl_remaining_feedback_seg,
6295
  &hf_ieee80211_ff_vht_mimo_cntrl_first_feedback_seg,
6296
  &hf_ieee80211_ff_vht_mimo_cntrl_reserved,
6297
  &hf_ieee80211_ff_vht_mimo_cntrl_sounding_dialog_token_number,
6298
  NULL,
6299
};
6300
6301
static int hf_ieee80211_vht_compressed_beamforming_report;
6302
static int hf_ieee80211_vht_compressed_beamforming_report_snr;
6303
static int hf_ieee80211_vht_compressed_beamform_scidx;
6304
static int hf_ieee80211_vht_group_id_management;
6305
static int hf_ieee80211_vht_membership_status_array;
6306
static int hf_ieee80211_vht_user_position_array;
6307
static int hf_ieee80211_vht_operation_mode_notification;
6308
static int hf_ieee80211_vht_membership_status_field;
6309
static int hf_ieee80211_vht_user_position_field;
6310
static int hf_ieee80211_vht_mu_exclusive_beamforming_report;
6311
static int hf_ieee80211_vht_mu_exclusive_beamforming_delta_snr;
6312
6313
static int hf_ieee80211_ff_he_action;
6314
static int hf_ieee80211_ff_protected_he_action;
6315
static int hf_ieee80211_ff_protected_ftm_action;
6316
static int hf_ieee80211_ff_eht_action;
6317
static int hf_ieee80211_ff_protected_eht_action;
6318
static int hf_ieee80211_he_mimo_control_nc_index;
6319
static int hf_ieee80211_he_mimo_control_nr_index;
6320
static int hf_ieee80211_he_mimo_control_bw;
6321
static int hf_ieee80211_he_mimo_control_grouping;
6322
static int hf_ieee80211_he_mimo_control_codebook_info;
6323
static int hf_ieee80211_he_mimo_control_feedback_type;
6324
static int hf_ieee80211_he_mimo_control_remaining_feedback_segs;
6325
static int hf_ieee80211_he_mimo_control_first_feedback_seg;
6326
static int hf_ieee80211_he_mimo_control_ru_start_index;
6327
static int hf_ieee80211_he_mimo_control_ru_end_index;
6328
static int hf_ieee80211_he_mimo_control_sounding_dialog_token_num;
6329
static int hf_ieee80211_he_mimo_control_reserved;
6330
static int hf_ieee80211_he_mimo_control_field;
6331
static int hf_ieee80211_he_compressed_beamforming_report_snr;
6332
static int hf_ieee80211_he_compressed_beamform_scidx;
6333
static int hf_ieee80211_he_beamforming_report_len;
6334
6335
static int hf_ieee80211_tag_neighbor_report_bssid;
6336
static int hf_ieee80211_tag_neighbor_report_bssid_info;
6337
static int hf_ieee80211_tag_neighbor_report_bssid_info_reachability;
6338
static int hf_ieee80211_tag_neighbor_report_bssid_info_security;
6339
static int hf_ieee80211_tag_neighbor_report_bssid_info_key_scope;
6340
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability;
6341
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng;
6342
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos;
6343
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd;
6344
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt;
6345
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback;
6346
static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback;
6347
static int hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain;
6348
static int hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput;
6349
static int hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput;
6350
static int hf_ieee80211_tag_neighbor_report_bssid_info_ftm;
6351
static int hf_ieee80211_tag_neighbor_report_bssid_info_high_efficiency;
6352
static int hf_ieee80211_tag_neighbor_report_bssid_info_er_bss;
6353
static int hf_ieee80211_tag_neighbor_report_bssid_info_colocated_ap;
6354
static int hf_ieee80211_tag_neighbor_report_bssid_info_unsolicited_probe_responses_active;
6355
static int hf_ieee80211_tag_neighbor_report_bssid_info_ess_with_colocated_ap;
6356
static int hf_ieee80211_tag_neighbor_report_bssid_info_oct_supported_with_reporting_ap;
6357
static int hf_ieee80211_tag_neighbor_report_bssid_info_colocated_6ghz_ap;
6358
static int hf_ieee80211_tag_neighbor_report_bssid_info_eht;
6359
static int hf_ieee80211_tag_neighbor_report_bssid_info_reserved;
6360
static int hf_ieee80211_tag_neighbor_report_ope_class;
6361
static int hf_ieee80211_tag_neighbor_report_channel_number;
6362
static int hf_ieee80211_tag_neighbor_report_phy_type;
6363
static int hf_ieee80211_tag_neighbor_report_subelement_id;
6364
static int hf_ieee80211_tag_neighbor_report_subelement_length;
6365
static int hf_ieee80211_tag_neighbor_report_subelement_data;
6366
static int hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref;
6367
static int hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf;
6368
static int hf_ieee80211_tag_neighbor_report_subelement_bss_dur;
6369
static int hf_ieee80211_tag_neighbor_report_subelement_tsf_offset;
6370
static int hf_ieee80211_tag_neighbor_report_subelement_beacon_interval;
6371
static int hf_ieee80211_tag_neighbor_report_subelement_country_code;
6372
static int hf_ieee80211_tag_supported_ope_classes_current;
6373
static int hf_ieee80211_tag_supported_ope_classes_alternate;
6374
6375
static int hf_ieee80211_tag_dirn_meas_results_aoa_results;
6376
static int hf_ieee80211_tag_ftm_aoa_results_aoa_azimuth;
6377
static int hf_ieee80211_tag_ftm_aoa_results_aoa_elevation;
6378
static int hf_ieee80211_tag_ftm_aoa_results_aoa_azimuth_accuracy;
6379
static int hf_ieee80211_tag_ftm_aoa_results_aoa_elevation_accuracy;
6380
static int hf_ieee80211_tag_ftm_aoa_results_best_awv_id;
6381
static int hf_ieee80211_tag_ftm_aoa_results_aoa_reference;
6382
static int hf_ieee80211_tag_ftm_aoa_results_reserved;
6383
6384
/* IEEE Std 802.11r-2008 7.3.2.47 */
6385
static int hf_ieee80211_tag_mobility_domain_mdid;
6386
static int hf_ieee80211_tag_mobility_domain_ft_capab;
6387
static int hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds;
6388
static int hf_ieee80211_tag_mobility_domain_ft_capab_resource_req;
6389
static int hf_ieee80211_tag_mobility_domain_ft_capab_reserved;
6390
static int * const ieee80211_tag_mobility_domain_ft_capab_fields[] = {
6391
  &hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds,
6392
  &hf_ieee80211_tag_mobility_domain_ft_capab_resource_req,
6393
  &hf_ieee80211_tag_mobility_domain_ft_capab_reserved,
6394
  NULL
6395
};
6396
6397
/* IEEE Std 802.11r-2008 7.3.2.48 */
6398
static int hf_ieee80211_tag_ft_mic_control;
6399
static int hf_ieee80211_tag_ft_mic_control_rsnxe_used;
6400
static int hf_ieee80211_tag_ft_mic_control_mic_length;
6401
static int hf_ieee80211_tag_ft_mic_control_reserved;
6402
static int hf_ieee80211_tag_ft_mic_control_element_count;
6403
static int * const ieee80211_tag_ft_mic_control_fields[] = {
6404
  &hf_ieee80211_tag_ft_mic_control_rsnxe_used,
6405
  &hf_ieee80211_tag_ft_mic_control_mic_length,
6406
  &hf_ieee80211_tag_ft_mic_control_reserved,
6407
  &hf_ieee80211_tag_ft_mic_control_element_count,
6408
  NULL
6409
};
6410
static int hf_ieee80211_tag_ft_mic;
6411
static int hf_ieee80211_tag_ft_anonce;
6412
static int hf_ieee80211_tag_ft_snonce;
6413
static int hf_ieee80211_tag_ft_subelem_id;
6414
static int hf_ieee80211_tag_ft_subelem_len;
6415
static int hf_ieee80211_tag_ft_subelem_data;
6416
static int hf_ieee80211_tag_ft_subelem_r1kh_id;
6417
static int hf_ieee80211_tag_ft_subelem_gtk_key_info;
6418
static int hf_ieee80211_tag_ft_subelem_gtk_key_id;
6419
static int hf_ieee80211_tag_ft_subelem_gtk_key_length;
6420
static int hf_ieee80211_tag_ft_subelem_gtk_rsc;
6421
static int hf_ieee80211_tag_ft_subelem_gtk_key;
6422
static int hf_ieee80211_tag_ft_subelem_gtk_key_encrypted;
6423
static int hf_ieee80211_tag_ft_subelem_r0kh_id;
6424
static int hf_ieee80211_tag_ft_subelem_igtk_key_id;
6425
static int hf_ieee80211_tag_ft_subelem_igtk_ipn;
6426
static int hf_ieee80211_tag_ft_subelem_igtk_key_length;
6427
static int hf_ieee80211_tag_ft_subelem_igtk_key;
6428
static int hf_ieee80211_tag_ft_subelem_oci_op_class;
6429
static int hf_ieee80211_tag_ft_subelem_oci_prim_chan_num;
6430
static int hf_ieee80211_tag_ft_subelem_oci_freq_seg_1;
6431
static int hf_ieee80211_tag_ft_subelem_oci_oct_op_class;
6432
static int hf_ieee80211_tag_ft_subelem_oci_oct_prim_chan_num;
6433
static int hf_ieee80211_tag_ft_subelem_oci_oct_freq_seg_1;
6434
static int hf_ieee80211_tag_ft_subelem_bigtk_key_id;
6435
static int hf_ieee80211_tag_ft_subelem_bigtk_bipn;
6436
static int hf_ieee80211_tag_ft_subelem_bigtk_key_length;
6437
static int hf_ieee80211_tag_ft_subelem_bigtk_key;
6438
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_key_info;
6439
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_key_id;
6440
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_link_id_info;
6441
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_link_id;
6442
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_key_length;
6443
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_rsc;
6444
static int hf_ieee80211_tag_ft_subelem_mlo_gtk_key;
6445
static int hf_ieee80211_tag_ft_subelem_mlo_igtk_key_id;
6446
static int hf_ieee80211_tag_ft_subelem_mlo_igtk_ipn;
6447
static int hf_ieee80211_tag_ft_subelem_mlo_igtk_link_id_info;
6448
static int hf_ieee80211_tag_ft_subelem_mlo_igtk_link_id;
6449
static int hf_ieee80211_tag_ft_subelem_mlo_igtk_key_length;
6450
static int hf_ieee80211_tag_ft_subelem_mlo_igtk_key;
6451
static int hf_ieee80211_tag_ft_subelem_mlo_bigtk_key_id;
6452
static int hf_ieee80211_tag_ft_subelem_mlo_bigtk_bipn;
6453
static int hf_ieee80211_tag_ft_subelem_mlo_bigtk_link_id_info;
6454
static int hf_ieee80211_tag_ft_subelem_mlo_bigtk_link_id;
6455
static int hf_ieee80211_tag_ft_subelem_mlo_bigtk_key_length;
6456
static int hf_ieee80211_tag_ft_subelem_mlo_bigtk_key;
6457
6458
/* IEEE Std 802.11-2012: 11r 8.4.2.52 */
6459
static int hf_ieee80211_tag_ric_data_id;
6460
static int hf_ieee80211_tag_ric_data_desc_cnt;
6461
static int hf_ieee80211_tag_ric_data_status_code;
6462
6463
/* IEEE Std 802.11-2012: 11r 8.4.2.53 */
6464
static int hf_ieee80211_tag_ric_desc_rsrc_type;
6465
static int hf_ieee80211_tag_ric_desc_var_params;
6466
6467
/* IEEE Std 802.11w-2009 7.3.2.55 */
6468
static int hf_ieee80211_tag_mmie_keyid;
6469
static int hf_ieee80211_tag_mmie_ipn;
6470
static int hf_ieee80211_tag_mmie_mic;
6471
6472
/* IEEE Std 802.11-2016: 9.4.2.72 */
6473
static int hf_ieee80211_tag_no_bssid_capability_dmg_bss_control;
6474
static int hf_ieee80211_tag_no_bssid_capability_dmg_bss_control_type;
6475
static int hf_ieee80211_tag_no_bssid_capability_dmg_bss_control_reserved;
6476
6477
/* IEEE Std 802.11-2016: 9.4.2.74 */
6478
static int hf_ieee80211_tag_multiple_bssid_index_bssid_index;
6479
static int hf_ieee80211_tag_multiple_bssid_index_dtim_period;
6480
static int hf_ieee80211_tag_multiple_bssid_index_dtim_count;
6481
6482
/* IEEE Std 802.11-2012: 8.4.2.61 */
6483
static int hf_ieee80211_tag_obss_spd;
6484
static int hf_ieee80211_tag_obss_sad;
6485
static int hf_ieee80211_tag_obss_cwtsi;
6486
static int hf_ieee80211_tag_obss_sptpc;
6487
static int hf_ieee80211_tag_obss_satpc;
6488
static int hf_ieee80211_tag_obss_wctdf;
6489
static int hf_ieee80211_tag_obss_sat;
6490
6491
/* IEEE Std 802.11-2012: 8.4.2.25.1 */
6492
static int hf_ieee80211_group_data_cipher_suite_oui;
6493
static int hf_ieee80211_group_data_cipher_suite_type;
6494
static int hf_ieee80211_osen_pairwise_cipher_suite_oui;
6495
static int hf_ieee80211_osen_pairwise_cipher_suite_type;
6496
static int hf_ieee80211_osen_pcs_count;
6497
static int hf_ieee80211_osen_akm_count;
6498
static int hf_ieee80211_osen_akm_cipher_suite_oui;
6499
static int hf_ieee80211_osen_akm_cipher_suite_type;
6500
static int hf_ieee80211_osen_rsn_cap_preauth;
6501
static int hf_ieee80211_osen_rsn_cap_no_pairwise;
6502
static int hf_ieee80211_osen_rsn_cap_ptksa_replay_counter;
6503
static int hf_ieee80211_osen_rsn_cap_gtksa_replay_counter;
6504
static int hf_ieee80211_osen_rsn_cap_mfpr;
6505
static int hf_ieee80211_osen_rsn_cap_mfpc;
6506
static int hf_ieee80211_osen_rsn_cap_jmr;
6507
static int hf_ieee80211_osen_rsn_cap_peerkey;
6508
static int hf_ieee80211_osen_rsn_spp_a_msdu_capable;
6509
static int hf_ieee80211_osen_rsn_spp_a_msdu_required;
6510
static int hf_ieee80211_osen_rsn_pbac;
6511
static int hf_ieee80211_osen_extended_key_id_iaf;
6512
static int hf_ieee80211_osen_reserved;
6513
static int hf_ieee80211_osen_rsn_cap_flags;
6514
static int hf_ieee80211_osen_pmkid_count;
6515
static int hf_ieee80211_osen_pmkid;
6516
static int hf_ieee80211_osen_group_management_cipher_suite_oui;
6517
static int hf_ieee80211_osen_group_management_cipher_suite_type;
6518
6519
/*WAPI-Specification 7.3.2.25 : WAPI Parameter Set*/
6520
static int hf_ieee80211_tag_wapi_param_set_version;
6521
6522
static int hf_ieee80211_tag_wapi_param_set_akm_suite_count;
6523
static int hf_ieee80211_tag_wapi_param_set_akm_suite_oui;
6524
static int hf_ieee80211_tag_wapi_param_set_akm_suite_type;
6525
6526
static int hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count;
6527
static int hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui;
6528
static int hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type;
6529
6530
static int hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui;
6531
static int hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type;
6532
6533
static int hf_ieee80211_tag_wapi_param_set_capab;
6534
static int hf_ieee80211_tag_wapi_param_set_capab_preauth;
6535
static int hf_ieee80211_tag_wapi_param_set_capab_rsvd;
6536
static int hf_ieee80211_tag_wapi_param_set_bkid_count;
6537
static int hf_ieee80211_tag_wapi_param_set_bkid_list;
6538
6539
/* IEEE Std 802.11v-2011 7.3.2.61 */
6540
static int hf_ieee80211_tag_time_adv_timing_capab;
6541
static int hf_ieee80211_tag_time_adv_time_value;
6542
static int hf_ieee80211_tag_time_adv_time_value_year;
6543
static int hf_ieee80211_tag_time_adv_time_value_month;
6544
static int hf_ieee80211_tag_time_adv_time_value_day;
6545
static int hf_ieee80211_tag_time_adv_time_value_hours;
6546
static int hf_ieee80211_tag_time_adv_time_value_minutes;
6547
static int hf_ieee80211_tag_time_adv_time_value_seconds;
6548
static int hf_ieee80211_tag_time_adv_time_value_milliseconds;
6549
static int hf_ieee80211_tag_time_adv_time_value_reserved;
6550
static int hf_ieee80211_tag_time_adv_time_error;
6551
static int hf_ieee80211_tag_time_adv_time_update_counter;
6552
6553
/* IEEE Std 802.11-2012 8.4.2.81 */
6554
static int hf_ieee80211_tag_bss_max_idle_period;
6555
static int hf_ieee80211_tag_bss_max_idle_options;
6556
static int hf_ieee80211_tag_bss_max_idle_options_protected;
6557
static int hf_ieee80211_tag_bss_idle_options_reserved;
6558
6559
/* IEEE Std 802.11-2012 8.4.2.82 */
6560
static int hf_ieee80211_tag_tfs_request_id;
6561
static int hf_ieee80211_tag_tfs_request_ac_delete_after_match;
6562
static int hf_ieee80211_tag_tfs_request_ac_notify;
6563
static int hf_ieee80211_tag_tfs_request_subelem_id;
6564
static int hf_ieee80211_tag_tfs_request_subelem_len;
6565
static int hf_ieee80211_tag_tfs_request_subelem;
6566
6567
/* IEEE Std 802.11-2012 8.4.2.83 */
6568
static int hf_ieee80211_tag_tfs_response_subelem_id;
6569
static int hf_ieee80211_tag_tfs_response_subelem_len;
6570
static int hf_ieee80211_tag_tfs_response_subelem;
6571
static int hf_ieee80211_tag_tfs_response_status;
6572
static int hf_ieee80211_tag_tfs_response_id;
6573
6574
/* IEEE Std 802.11-2012 8.4.2.84 */
6575
static int hf_ieee80211_tag_wnm_sleep_mode_action_type;
6576
static int hf_ieee80211_tag_wnm_sleep_mode_response_status;
6577
static int hf_ieee80211_tag_wnm_sleep_mode_interval;
6578
6579
static int hf_ieee80211_wnm_sub_elt_id;
6580
static int hf_ieee80211_wnm_sub_elt_len;
6581
6582
/* IEEE Std 802.11v-2011 7.3.2.87 */
6583
static int hf_ieee80211_tag_time_zone;
6584
6585
/* IEEE Std 802.11u-2011 7.3.2.92 */
6586
static int hf_ieee80211_tag_interworking_access_network_type;
6587
static int hf_ieee80211_tag_interworking_internet;
6588
static int hf_ieee80211_tag_interworking_asra;
6589
static int hf_ieee80211_tag_interworking_esr;
6590
static int hf_ieee80211_tag_interworking_uesa;
6591
static int hf_ieee80211_tag_interworking_hessid;
6592
6593
/* IEEE Std 802.11-2012, 8.4.2.97 */
6594
static int hf_ieee80211_tag_qos_map_set_dscp_exc;
6595
static int hf_ieee80211_tag_qos_map_set_dscp_exc_val;
6596
static int hf_ieee80211_tag_qos_map_set_dscp_exc_up;
6597
static int hf_ieee80211_tag_qos_map_set_range;
6598
static int hf_ieee80211_tag_qos_map_set_low;
6599
static int hf_ieee80211_tag_qos_map_set_high;
6600
6601
/* IEEE Std 802.11u-2011 7.3.2.93 */
6602
static int hf_ieee80211_tag_adv_proto_resp_len_limit;
6603
static int hf_ieee80211_tag_adv_proto_pame_bi;
6604
static int hf_ieee80211_tag_adv_proto_id;
6605
static int hf_ieee80211_tag_adv_vs_len;
6606
/* static int hf_ieee80211_tag_adv_proto_vs_info; */
6607
6608
/* IEEE Std 802.11u-2011 7.3.2.96 */
6609
static int hf_ieee80211_tag_roaming_consortium_num_anqp_oi;
6610
static int hf_ieee80211_tag_roaming_consortium_oi1_len;
6611
static int hf_ieee80211_tag_roaming_consortium_oi2_len;
6612
static int hf_ieee80211_tag_roaming_consortium_oi1;
6613
static int hf_ieee80211_tag_roaming_consortium_oi2;
6614
static int hf_ieee80211_tag_roaming_consortium_oi3;
6615
6616
/* 802.11n 7.3.2.48 */
6617
static int hf_ieee80211_hta_cc;
6618
static int hf_ieee80211_hta_cap1;
6619
static int hf_ieee80211_hta_cap2;
6620
static int hf_ieee80211_hta_ext_chan_offset;
6621
static int hf_ieee80211_hta_rec_tx_width;
6622
static int hf_ieee80211_hta_rifs_mode;
6623
static int hf_ieee80211_hta_controlled_access;
6624
static int hf_ieee80211_hta_service_interval;
6625
static int hf_ieee80211_hta_operating_mode;
6626
static int hf_ieee80211_hta_non_gf_devices;
6627
static int hf_ieee80211_hta_basic_stbc_mcs;
6628
static int hf_ieee80211_hta_dual_stbc_protection;
6629
static int hf_ieee80211_hta_secondary_beacon;
6630
static int hf_ieee80211_hta_lsig_txop_protection;
6631
static int hf_ieee80211_hta_pco_active;
6632
static int hf_ieee80211_hta_pco_phase;
6633
6634
static int hf_ieee80211_antsel;
6635
static int hf_ieee80211_antsel_vs;
6636
static int hf_ieee80211_antsel_b0;
6637
static int hf_ieee80211_antsel_b1;
6638
static int hf_ieee80211_antsel_b2;
6639
static int hf_ieee80211_antsel_b3;
6640
static int hf_ieee80211_antsel_b4;
6641
static int hf_ieee80211_antsel_b5;
6642
static int hf_ieee80211_antsel_b6;
6643
static int hf_ieee80211_antsel_b7;
6644
6645
static int hf_ieee80211_rsn_version;
6646
static int hf_ieee80211_rsn_gcs;
6647
static int hf_ieee80211_rsn_gcs_oui;
6648
static int hf_ieee80211_rsn_gcs_type;
6649
static int hf_ieee80211_rsn_gcs_80211_type;
6650
static int hf_ieee80211_rsn_pcs_count;
6651
static int hf_ieee80211_rsn_pcs_list;
6652
static int hf_ieee80211_rsn_pcs;
6653
static int hf_ieee80211_rsn_pcs_oui;
6654
static int hf_ieee80211_rsn_pcs_80211_type;
6655
static int hf_ieee80211_rsn_pcs_type;
6656
static int hf_ieee80211_rsn_akms_count;
6657
static int hf_ieee80211_rsn_akms_list;
6658
static int hf_ieee80211_rsn_akms;
6659
static int hf_ieee80211_rsn_akms_oui;
6660
static int hf_ieee80211_rsn_akms_80211_type;
6661
static int hf_ieee80211_rsn_akms_type;
6662
static int hf_ieee80211_rsn_cap;
6663
static int hf_ieee80211_rsn_cap_preauth;
6664
static int hf_ieee80211_rsn_cap_no_pairwise;
6665
static int hf_ieee80211_rsn_cap_ptksa_replay_counter;
6666
static int hf_ieee80211_rsn_cap_gtksa_replay_counter;
6667
static int hf_ieee80211_rsn_cap_mfpr;
6668
static int hf_ieee80211_rsn_cap_mfpc;
6669
static int hf_ieee80211_rsn_cap_jmr;
6670
static int hf_ieee80211_rsn_cap_peerkey;
6671
static int hf_ieee80211_rsn_cap_spp_amsdu_cap;
6672
static int hf_ieee80211_rsn_cap_spp_amsdu_req;
6673
static int hf_ieee80211_rsn_cap_pbac;
6674
static int hf_ieee80211_rsn_cap_extended_key_id_iaf;
6675
static int hf_ieee80211_rsn_cap_ocvc;
6676
static int hf_ieee80211_rsn_pmkid_count;
6677
static int hf_ieee80211_rsn_pmkid_list;
6678
static int hf_ieee80211_rsn_pmkid;
6679
static int hf_ieee80211_rsn_gmcs;
6680
static int hf_ieee80211_rsn_gmcs_oui;
6681
static int hf_ieee80211_rsn_gmcs_type;
6682
static int hf_ieee80211_rsn_gmcs_80211_type;
6683
6684
static int hf_ieee80211_wfa_ie_type;
6685
static int hf_ieee80211_wfa_ie_wpa_version;
6686
static int hf_ieee80211_wfa_ie_wpa_mcs;
6687
static int hf_ieee80211_wfa_ie_wpa_mcs_oui;
6688
static int hf_ieee80211_wfa_ie_wpa_mcs_type;
6689
static int hf_ieee80211_wfa_ie_wpa_mcs_wfa_type;
6690
static int hf_ieee80211_wfa_ie_wpa_ucs_count;
6691
static int hf_ieee80211_wfa_ie_wpa_ucs_list;
6692
static int hf_ieee80211_wfa_ie_wpa_ucs;
6693
static int hf_ieee80211_wfa_ie_wpa_ucs_oui;
6694
static int hf_ieee80211_wfa_ie_wpa_ucs_wfa_type;
6695
static int hf_ieee80211_wfa_ie_wpa_ucs_type;
6696
static int hf_ieee80211_wfa_ie_wpa_akms_count;
6697
static int hf_ieee80211_wfa_ie_wpa_akms_list;
6698
static int hf_ieee80211_wfa_ie_wpa_akms;
6699
static int hf_ieee80211_wfa_ie_wpa_akms_oui;
6700
static int hf_ieee80211_wfa_ie_wpa_akms_wfa_type;
6701
static int hf_ieee80211_wfa_ie_wpa_akms_type;
6702
static int hf_ieee80211_wfa_ie_wme_subtype;
6703
static int hf_ieee80211_wfa_ie_wme_version;
6704
static int hf_ieee80211_wfa_ie_wme_qos_info;
6705
static int hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length;
6706
static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be;
6707
static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk;
6708
static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi;
6709
static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo;
6710
static int hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved;
6711
static int hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd;
6712
static int hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count;
6713
static int hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved;
6714
static int hf_ieee80211_wfa_ie_wme_reserved;
6715
static int hf_ieee80211_wfa_ie_wme_ac_parameters;
6716
static int hf_ieee80211_wfa_ie_wme_acp_aci_aifsn;
6717
static int hf_ieee80211_wfa_ie_wme_acp_aci_be;
6718
static int hf_ieee80211_wfa_ie_wme_acp_acm_be;
6719
static int hf_ieee80211_wfa_ie_wme_acp_aifsn_be;
6720
static int hf_ieee80211_wfa_ie_wme_acp_reserved_be;
6721
static int hf_ieee80211_wfa_ie_wme_acp_aci_bk;
6722
static int hf_ieee80211_wfa_ie_wme_acp_acm_bk;
6723
static int hf_ieee80211_wfa_ie_wme_acp_aifsn_bk;
6724
static int hf_ieee80211_wfa_ie_wme_acp_reserved_bk;
6725
static int hf_ieee80211_wfa_ie_wme_acp_aci_vi;
6726
static int hf_ieee80211_wfa_ie_wme_acp_acm_vi;
6727
static int hf_ieee80211_wfa_ie_wme_acp_aifsn_vi;
6728
static int hf_ieee80211_wfa_ie_wme_acp_reserved_vi;
6729
static int hf_ieee80211_wfa_ie_wme_acp_aci_vo;
6730
static int hf_ieee80211_wfa_ie_wme_acp_acm_vo;
6731
static int hf_ieee80211_wfa_ie_wme_acp_aifsn_vo;
6732
static int hf_ieee80211_wfa_ie_wme_acp_reserved_vo;
6733
static int hf_ieee80211_wfa_ie_wme_acp_ecw;
6734
static int hf_ieee80211_wfa_ie_wme_acp_ecw_max_be;
6735
static int hf_ieee80211_wfa_ie_wme_acp_ecw_max_bk;
6736
static int hf_ieee80211_wfa_ie_wme_acp_ecw_max_vo;
6737
static int hf_ieee80211_wfa_ie_wme_acp_ecw_max_vi;
6738
static int hf_ieee80211_wfa_ie_wme_acp_ecw_min_be;
6739
static int hf_ieee80211_wfa_ie_wme_acp_ecw_min_bk;
6740
static int hf_ieee80211_wfa_ie_wme_acp_ecw_min_vo;
6741
static int hf_ieee80211_wfa_ie_wme_acp_ecw_min_vi;
6742
static int hf_ieee80211_wfa_ie_wme_acp_txop_limit_be;
6743
static int hf_ieee80211_wfa_ie_wme_acp_txop_limit_bk;
6744
static int hf_ieee80211_wfa_ie_wme_acp_txop_limit_vo;
6745
static int hf_ieee80211_wfa_ie_wme_acp_txop_limit_vi;
6746
static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo;
6747
static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid;
6748
static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction;
6749
static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb;
6750
static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up;
6751
static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved;
6752
static int hf_ieee80211_wfa_ie_wme_tspec_nor_msdu;
6753
static int hf_ieee80211_wfa_ie_wme_tspec_max_msdu;
6754
static int hf_ieee80211_wfa_ie_wme_tspec_min_srv;
6755
static int hf_ieee80211_wfa_ie_wme_tspec_max_srv;
6756
static int hf_ieee80211_wfa_ie_wme_tspec_inact_int;
6757
static int hf_ieee80211_wfa_ie_wme_tspec_susp_int;
6758
static int hf_ieee80211_wfa_ie_wme_tspec_srv_start;
6759
static int hf_ieee80211_wfa_ie_wme_tspec_min_data;
6760
static int hf_ieee80211_wfa_ie_wme_tspec_mean_data;
6761
static int hf_ieee80211_wfa_ie_wme_tspec_peak_data;
6762
static int hf_ieee80211_wfa_ie_wme_tspec_burst_size;
6763
static int hf_ieee80211_wfa_ie_wme_tspec_delay_bound;
6764
static int hf_ieee80211_wfa_ie_wme_tspec_min_phy;
6765
static int hf_ieee80211_wfa_ie_wme_tspec_surplus;
6766
static int hf_ieee80211_wfa_ie_wme_tspec_medium;
6767
static int hf_ieee80211_wfa_ie_nc_cost_level;
6768
static int hf_ieee80211_wfa_ie_nc_reserved;
6769
static int hf_ieee80211_wfa_ie_nc_cost_flags;
6770
static int hf_ieee80211_wfa_ie_tethering_type;
6771
static int hf_ieee80211_wfa_ie_tethering_mac_length;
6772
static int hf_ieee80211_wfa_ie_tethering_mac;
6773
static int hf_ieee80211_wfa_ie_owe_bssid;
6774
static int hf_ieee80211_wfa_ie_owe_ssid_length;
6775
static int hf_ieee80211_wfa_ie_owe_ssid;
6776
static int hf_ieee80211_wfa_ie_owe_band_info;
6777
static int hf_ieee80211_wfa_ie_owe_channel_info;
6778
static int hf_ieee80211_wfa_ie_mbo_oce_attr;
6779
static int hf_ieee80211_wfa_ie_mbo_oce_attr_id;
6780
static int hf_ieee80211_wfa_ie_mbo_oce_attr_len;
6781
static int hf_ieee80211_wfa_ie_mbo_ap_cap;
6782
static int hf_ieee80211_wfa_ie_mbo_ap_cap_cell;
6783
static int hf_ieee80211_wfa_ie_mbo_ap_cap_reserved;
6784
static int hf_ieee80211_wfa_ie_mbo_non_pref_chan_op_class;
6785
static int hf_ieee80211_wfa_ie_mbo_non_pref_chan_chan;
6786
static int hf_ieee80211_wfa_ie_mbo_non_pref_chan_pref;
6787
static int hf_ieee80211_wfa_ie_mbo_non_pref_chan_reason;
6788
static int hf_ieee80211_wfa_ie_mbo_cellular_cap;
6789
static int hf_ieee80211_wfa_ie_mbo_assoc_disallow_reason;
6790
static int hf_ieee80211_wfa_ie_mbo_cellular_pref;
6791
static int hf_ieee80211_wfa_ie_mbo_transition_reason;
6792
static int hf_ieee80211_wfa_ie_mbo_transition_rej_reason;
6793
static int hf_ieee80211_wfa_ie_mbo_assoc_retry_delay;
6794
static int hf_ieee80211_wfa_ie_oce_cap_ctrl;
6795
static int hf_ieee80211_wfa_ie_oce_cap_release;
6796
static int hf_ieee80211_wfa_ie_oce_cap_sta_cfon;
6797
static int hf_ieee80211_wfa_ie_oce_cap_11b_only_ap;
6798
static int hf_ieee80211_wfa_ie_oce_cap_hlp;
6799
static int hf_ieee80211_wfa_ie_oce_cap_non_oce_ap;
6800
static int hf_ieee80211_wfa_ie_oce_cap_reserved;
6801
static int hf_ieee80211_wfa_ie_oce_rssi_assoc_rej_delta;
6802
static int hf_ieee80211_wfa_ie_oce_rssi_assoc_rej_delay;
6803
static int hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap;
6804
static int hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap_downlink;
6805
static int hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap_uplink;
6806
static int hf_ieee80211_wfa_ie_oce_rnr_completeness_short_ssid;
6807
static int hf_ieee80211_wfa_ie_oce_probe_suppr_bssid;
6808
static int hf_ieee80211_wfa_ie_oce_probe_suppr_ssid;
6809
static int hf_ieee80211_wfa_anqp_mbo_subtype;
6810
static int hf_ieee80211_wfa_anqp_mbo_query;
6811
static int hf_ieee80211_wfa_anqp_mbo_cellular_pref;
6812
static int hf_ieee80211_wfa_ie_transition_disable_bitmap;
6813
static int hf_ieee80211_wfa_ie_transition_disable_wpa3_personal;
6814
static int hf_ieee80211_wfa_ie_transition_disable_sae_pk;
6815
static int hf_ieee80211_wfa_ie_transition_disable_wpa3_enterprise;
6816
static int hf_ieee80211_wfa_ie_transition_disable_enhanced_open;
6817
static int hf_ieee80211_wfa_ie_transition_disable_reserved_b4thru7;
6818
static int hf_ieee80211_wfa_ie_transition_disable_reserved;
6819
6820
static int hf_ieee80211_aironet_ie_type;
6821
static int hf_ieee80211_aironet_ie_dtpc;
6822
static int hf_ieee80211_aironet_ie_dtpc_unknown;
6823
static int hf_ieee80211_aironet_ie_version;
6824
static int hf_ieee80211_aironet_ie_data;
6825
static int hf_ieee80211_aironet_ie_qos_reserved;
6826
static int hf_ieee80211_aironet_ie_qos_paramset;
6827
static int hf_ieee80211_aironet_ie_qos_val;
6828
static int hf_ieee80211_aironet_ie_clientmfp;
6829
6830
static int hf_ieee80211_vs_sgdsn_tag;
6831
static int hf_ieee80211_vs_sgdsn_type;
6832
static int hf_ieee80211_vs_sgdsn_length;
6833
static int hf_ieee80211_vs_sgdsn_version;
6834
static int hf_ieee80211_vs_sgdsn_icaomfrcode;
6835
static int hf_ieee80211_vs_sgdsn_manufacturer;
6836
static int hf_ieee80211_vs_sgdsn_model;
6837
static int hf_ieee80211_vs_sgdsn_serialnumber;
6838
static int hf_ieee80211_vs_sgdsn_serialnumber_len;
6839
static int hf_ieee80211_vs_sgdsn_gpscoord;
6840
static int hf_ieee80211_vs_sgdsn_altitude;
6841
static int hf_ieee80211_vs_sgdsn_speed;
6842
static int hf_ieee80211_vs_sgdsn_heading;
6843
6844
static int hf_ieee80211_vs_nintendo_type;
6845
static int hf_ieee80211_vs_nintendo_length;
6846
static int hf_ieee80211_vs_nintendo_servicelist;
6847
static int hf_ieee80211_vs_nintendo_service;
6848
static int hf_ieee80211_vs_nintendo_consoleid;
6849
static int hf_ieee80211_vs_nintendo_unknown;
6850
6851
static int hf_ieee80211_vs_aruba_subtype;
6852
static int hf_ieee80211_vs_aruba_apname;
6853
static int hf_ieee80211_vs_aruba_data;
6854
static int hf_ieee80211_vs_aruba_gps_length;
6855
static int hf_ieee80211_vs_aruba_gps_subversion;
6856
static int hf_ieee80211_vs_aruba_gps_hop;
6857
static int hf_ieee80211_vs_aruba_gps_latitude;
6858
static int hf_ieee80211_vs_aruba_gps_longitude;
6859
static int hf_ieee80211_vs_aruba_gps_major_axis;
6860
static int hf_ieee80211_vs_aruba_gps_minor_axis;
6861
static int hf_ieee80211_vs_aruba_gps_orientation;
6862
static int hf_ieee80211_vs_aruba_gps_distance;
6863
6864
static int hf_ieee80211_vs_routerboard_unknown;
6865
static int hf_ieee80211_vs_routerboard_subitem;
6866
static int hf_ieee80211_vs_routerboard_subtype;
6867
static int hf_ieee80211_vs_routerboard_sublength;
6868
static int hf_ieee80211_vs_routerboard_subdata;
6869
static int hf_ieee80211_vs_routerboard_subtype1_prefix;
6870
static int hf_ieee80211_vs_routerboard_subtype1_data;
6871
6872
static int hf_ieee80211_vs_meru_subitem;
6873
static int hf_ieee80211_vs_meru_subtype;
6874
static int hf_ieee80211_vs_meru_sublength;
6875
static int hf_ieee80211_vs_meru_subdata;
6876
6877
static int hf_ieee80211_vs_extreme_subtype;
6878
static int hf_ieee80211_vs_extreme_subdata;
6879
static int hf_ieee80211_vs_extreme_unknown;
6880
static int hf_ieee80211_vs_extreme_ap_length;
6881
static int hf_ieee80211_vs_extreme_ap_name;
6882
6883
static int hf_ieee80211_vs_aerohive_version;
6884
static int hf_ieee80211_vs_aerohive_subtype;
6885
static int hf_ieee80211_vs_aerohive_hostname_length;
6886
static int hf_ieee80211_vs_aerohive_hostname;
6887
static int hf_ieee80211_vs_aerohive_data;
6888
6889
static int hf_ieee80211_vs_mist_ap_name;
6890
static int hf_ieee80211_vs_mist_data;
6891
6892
static int hf_ieee80211_vs_ruckus_ap_name;
6893
static int hf_ieee80211_vs_ruckus_data;
6894
6895
static int hf_ieee80211_vs_alcatel_ap_name;
6896
static int hf_ieee80211_vs_alcatel_data;
6897
6898
static int hf_ieee80211_vs_fortinet_subtype;
6899
static int hf_ieee80211_vs_fortinet_system_type;
6900
static int hf_ieee80211_vs_fortinet_system_length;
6901
static int hf_ieee80211_vs_fortinet_system_apname;
6902
static int hf_ieee80211_vs_fortinet_system_apmodel;
6903
static int hf_ieee80211_vs_fortinet_system_apserial;
6904
static int hf_ieee80211_vs_fortinet_data;
6905
6906
static int hf_ieee80211_vs_arista_subtype;
6907
static int hf_ieee80211_vs_arista_apname;
6908
static int hf_ieee80211_vs_arista_data;
6909
6910
static int hf_ieee80211_vs_wisun_type;
6911
static int hf_ieee80211_vs_wisun_ptkid;
6912
static int hf_ieee80211_vs_wisun_gtkl;
6913
static int hf_ieee80211_vs_wisun_gtkl_gtk0;
6914
static int hf_ieee80211_vs_wisun_gtkl_gtk1;
6915
static int hf_ieee80211_vs_wisun_gtkl_gtk2;
6916
static int hf_ieee80211_vs_wisun_gtkl_gtk3;
6917
static int hf_ieee80211_vs_wisun_nr;
6918
static int hf_ieee80211_vs_wisun_lgtkl;
6919
static int hf_ieee80211_vs_wisun_lgtkl_lgtk0;
6920
static int hf_ieee80211_vs_wisun_lgtkl_lgtk1;
6921
static int hf_ieee80211_vs_wisun_lgtkl_lgtk2;
6922
static int hf_ieee80211_vs_wisun_lgtk_key_id;
6923
static int hf_ieee80211_vs_wisun_lgtk_lgtk;
6924
static int hf_ieee80211_vs_wisun_data;
6925
6926
static int hf_ieee80211_vs_apple_type;
6927
static int hf_ieee80211_vs_apple_subtype;
6928
static int hf_ieee80211_vs_apple_length;
6929
static int hf_ieee80211_vs_apple_data;
6930
6931
static int hf_ieee80211_rsn_ie_ptk_keyid;
6932
6933
static int hf_ieee80211_rsn_ie_gtk_kde_data_type;
6934
static int hf_ieee80211_rsn_ie_gtk_kde_key_id;
6935
static int hf_ieee80211_rsn_ie_gtk_kde_tx;
6936
static int hf_ieee80211_rsn_ie_gtk_kde_reserved1;
6937
static int hf_ieee80211_rsn_ie_gtk_kde_reserved2;
6938
static int hf_ieee80211_rsn_ie_gtk_kde_gtk;
6939
6940
static int hf_ieee80211_rsn_ie_mac_address_kde_mac;
6941
6942
static int hf_ieee80211_rsn_ie_pmkid;
6943
6944
static int hf_ieee80211_rsn_ie_unknown;
6945
6946
static int hf_ieee80211_rsn_ie_gtk_kde_nonce;
6947
static int hf_ieee80211_rsn_ie_gtk_kde_lifetime;
6948
static int hf_ieee80211_rsn_ie_error_kde_res;
6949
static int hf_ieee80211_rsn_ie_error_kde_error_type;
6950
static int hf_ieee80211_rsn_ie_igtk_kde_keyid;
6951
static int hf_ieee80211_rsn_ie_igtk_kde_ipn;
6952
static int hf_ieee80211_rsn_ie_igtk_kde_igtk;
6953
static int hf_ieee80211_rsn_ie_oci_operating_class;
6954
static int hf_ieee80211_rsn_ie_oci_primary_channel_number;
6955
static int hf_ieee80211_rsn_ie_oci_frequency_segment_1;
6956
static int hf_ieee80211_rsn_ie_bigtk_key_id;
6957
static int hf_ieee80211_rsn_ie_bigtk_bipn;
6958
static int hf_ieee80211_rsn_ie_bigtk_bigtk;
6959
static int hf_ieee80211_rsn_ie_mlo_link_info;
6960
static int hf_ieee80211_rsn_ie_mlo_linkid;
6961
static int hf_ieee80211_rsn_ie_mlo_rnse_present;
6962
static int hf_ieee80211_rsn_ie_mlo_rnsxe_present;
6963
static int hf_ieee80211_rsn_ie_mlo_reserved;
6964
static int hf_ieee80211_rsn_ie_mlo_mac_addr;
6965
static int hf_ieee80211_rsn_ie_mlo_gtk_kde_key_id;
6966
static int hf_ieee80211_rsn_ie_mlo_gtk_kde_tx;
6967
static int hf_ieee80211_rsn_ie_mlo_gtk_kde_reserved;
6968
static int hf_ieee80211_rsn_ie_mlo_gtk_kde_linkid;
6969
static int hf_ieee80211_rsn_ie_mlo_gtk_kde_pn;
6970
static int hf_ieee80211_rsn_ie_mlo_gtk_kde_gtk;
6971
6972
static int hf_ieee80211_rsn_ie_mlo_igtk_kde_key_id;
6973
static int hf_ieee80211_rsn_ie_mlo_igtk_kde_ipn;
6974
static int hf_ieee80211_rsn_ie_mlo_igtk_kde_reserved;
6975
static int hf_ieee80211_rsn_ie_mlo_igtk_kde_linkid;
6976
static int hf_ieee80211_rsn_ie_mlo_igtk_kde_igtk;
6977
6978
static int hf_ieee80211_rsn_ie_mlo_bigtk_kde_key_id;
6979
static int hf_ieee80211_rsn_ie_mlo_bigtk_kde_ipn;
6980
static int hf_ieee80211_rsn_ie_mlo_bigtk_kde_reserved;
6981
static int hf_ieee80211_rsn_ie_mlo_bigtk_kde_linkid;
6982
static int hf_ieee80211_rsn_ie_mlo_bigtk_kde_bigtk;
6983
6984
static int hf_ieee80211_marvell_ie_type;
6985
static int hf_ieee80211_marvell_ie_mesh_subtype;
6986
static int hf_ieee80211_marvell_ie_mesh_version;
6987
static int hf_ieee80211_marvell_ie_mesh_active_proto_id;
6988
static int hf_ieee80211_marvell_ie_mesh_active_metric_id;
6989
static int hf_ieee80211_marvell_ie_mesh_cap;
6990
static int hf_ieee80211_marvell_ie_data;
6991
6992
static int hf_ieee80211_extreme_mesh_ie_type;
6993
static int hf_ieee80211_extreme_mesh_ie_services;
6994
static int hf_ieee80211_extreme_mesh_ie_hello_f_root;
6995
static int hf_ieee80211_extreme_mesh_ie_hello_f_proxy;
6996
static int hf_ieee80211_extreme_mesh_ie_hello_f_geo;
6997
static int hf_ieee80211_extreme_mesh_ie_hello_f_path_pref;
6998
static int hf_ieee80211_extreme_mesh_ie_hello_f_mobile;
6999
static int hf_ieee80211_extreme_mesh_ie_htr;
7000
static int hf_ieee80211_extreme_mesh_ie_mtr;
7001
static int hf_ieee80211_extreme_mesh_ie_root;
7002
static int hf_ieee80211_extreme_mesh_ie_nh;
7003
static int hf_ieee80211_extreme_mesh_ie_mesh_id;
7004
static int hf_ieee80211_extreme_mesh_ie_mp_id;
7005
7006
static int hf_ieee80211_atheros_ie_type;
7007
static int hf_ieee80211_atheros_ie_subtype;
7008
static int hf_ieee80211_atheros_ie_version;
7009
static int hf_ieee80211_atheros_ie_cap_f_turbop;
7010
static int hf_ieee80211_atheros_ie_cap_f_comp;
7011
static int hf_ieee80211_atheros_ie_cap_f_ff;
7012
static int hf_ieee80211_atheros_ie_cap_f_xr;
7013
static int hf_ieee80211_atheros_ie_cap_f_ar;
7014
static int hf_ieee80211_atheros_ie_cap_f_burst;
7015
static int hf_ieee80211_atheros_ie_cap_f_wme;
7016
static int hf_ieee80211_atheros_ie_cap_f_boost;
7017
static int hf_ieee80211_atheros_ie_advcap_cap;
7018
static int hf_ieee80211_atheros_ie_advcap_defkey;
7019
static int hf_ieee80211_atheros_ie_xr_info;
7020
static int hf_ieee80211_atheros_ie_xr_base_bssid;
7021
static int hf_ieee80211_atheros_ie_xr_xr_bssid;
7022
static int hf_ieee80211_atheros_ie_xr_xr_beacon;
7023
static int hf_ieee80211_atheros_ie_xr_base_cap;
7024
static int hf_ieee80211_atheros_ie_xr_xr_cap;
7025
static int hf_ieee80211_atheros_ie_data;
7026
7027
/*QBSS - Version 1,2,802.11e*/
7028
7029
static int hf_ieee80211_qbss2_cal;
7030
static int hf_ieee80211_qbss2_gl;
7031
static int hf_ieee80211_qbss_cu;
7032
static int hf_ieee80211_qbss2_cu;
7033
static int hf_ieee80211_qbss_scount;
7034
static int hf_ieee80211_qbss2_scount;
7035
static int hf_ieee80211_qbss_version;
7036
static int hf_ieee80211_qbss_adc;
7037
7038
static int hf_ieee80211_tsinfo;
7039
static int hf_ieee80211_tsinfo_type;
7040
static int hf_ieee80211_tsinfo_tsid;
7041
static int hf_ieee80211_tsinfo_dir;
7042
static int hf_ieee80211_tsinfo_access;
7043
static int hf_ieee80211_tsinfo_agg;
7044
static int hf_ieee80211_tsinfo_apsd;
7045
static int hf_ieee80211_tsinfo_up;
7046
static int hf_ieee80211_tsinfo_ack;
7047
static int hf_ieee80211_tsinfo_sched;
7048
static int hf_ieee80211_tsinfo_rsv;
7049
7050
static int * const ieee80211_tsinfo_fields[] = {
7051
  &hf_ieee80211_tsinfo_type,
7052
  &hf_ieee80211_tsinfo_tsid,
7053
  &hf_ieee80211_tsinfo_dir,
7054
  &hf_ieee80211_tsinfo_access,
7055
  &hf_ieee80211_tsinfo_agg,
7056
  &hf_ieee80211_tsinfo_apsd,
7057
  &hf_ieee80211_tsinfo_up,
7058
  &hf_ieee80211_tsinfo_ack,
7059
  &hf_ieee80211_tsinfo_sched,
7060
  &hf_ieee80211_tsinfo_rsv,
7061
  NULL
7062
};
7063
7064
static int hf_ieee80211_tspec_nor_msdu;
7065
static int hf_ieee80211_tspec_max_msdu;
7066
static int hf_ieee80211_tspec_min_srv;
7067
static int hf_ieee80211_tspec_max_srv;
7068
static int hf_ieee80211_tspec_inact_int;
7069
static int hf_ieee80211_tspec_susp_int;
7070
static int hf_ieee80211_tspec_srv_start;
7071
static int hf_ieee80211_tspec_min_data;
7072
static int hf_ieee80211_tspec_mean_data;
7073
static int hf_ieee80211_tspec_peak_data;
7074
static int hf_ieee80211_tspec_burst_size;
7075
static int hf_ieee80211_tspec_delay_bound;
7076
static int hf_ieee80211_tspec_min_phy;
7077
static int hf_ieee80211_tspec_surplus;
7078
static int hf_ieee80211_tspec_medium;
7079
static int hf_ieee80211_tspec_dmg;
7080
static int hf_ieee80211_ts_delay;
7081
static int hf_ieee80211_tclas_process;
7082
static int hf_ieee80211_tag_ext_supp_rates;
7083
static int hf_ieee80211_sched_info;
7084
static int hf_ieee80211_sched_info_agg;
7085
static int hf_ieee80211_sched_info_tsid;
7086
static int hf_ieee80211_sched_info_dir;
7087
static int hf_ieee80211_sched_srv_start;
7088
static int hf_ieee80211_sched_srv_int;
7089
static int hf_ieee80211_sched_spec_int;
7090
static int hf_ieee80211_tclas_up;
7091
static int hf_ieee80211_tclas_class_type;
7092
static int hf_ieee80211_tclas_class_mask;
7093
static int hf_ieee80211_tclas_mask_reserved;
7094
static int hf_ieee80211_tclas_class_mask0_src_addr;
7095
static int hf_ieee80211_tclas_class_mask0_dst_addr;
7096
static int hf_ieee80211_tclas_class_mask0_type;
7097
static int hf_ieee80211_tclas_class_mask1_ver;
7098
static int hf_ieee80211_tclas_class_mask1_src_ip;
7099
static int hf_ieee80211_tclas_class_mask1_dst_ip;
7100
static int hf_ieee80211_tclas_class_mask1_src_port;
7101
static int hf_ieee80211_tclas_class_mask1_dst_port;
7102
static int hf_ieee80211_tclas_class_mask1_ipv4_dscp;
7103
static int hf_ieee80211_tclas_class_mask1_ipv4_proto;
7104
static int hf_ieee80211_tclas_class_mask1_reserved;
7105
static int hf_ieee80211_tclas_class_mask1_ipv6_flow;
7106
static int hf_ieee80211_tclas_class_mask2_tci;
7107
static int hf_ieee80211_tclas_src_mac_addr;
7108
static int hf_ieee80211_tclas_dst_mac_addr;
7109
static int hf_ieee80211_tclas_ether_type;
7110
static int hf_ieee80211_tclas_version;
7111
static int hf_ieee80211_tclas_ipv4_src;
7112
static int hf_ieee80211_tclas_ipv4_dst;
7113
static int hf_ieee80211_tclas_src_port;
7114
static int hf_ieee80211_tclas_dst_port;
7115
static int hf_ieee80211_tclas_dscp;
7116
static int hf_ieee80211_tclas_protocol;
7117
static int hf_ieee80211_tclas_ipv6_src;
7118
static int hf_ieee80211_tclas_ipv6_dst;
7119
static int hf_ieee80211_tclas_flow;
7120
static int hf_ieee80211_tclas_tag_type;
7121
static int hf_ieee80211_tclas_filter_offset;
7122
static int hf_ieee80211_tclas_filter_value;
7123
static int hf_ieee80211_tclas_filter_mask;
7124
static int hf_ieee80211_tclas4_version;
7125
static int hf_ieee80211_tclas_class_mask4_ver;
7126
static int hf_ieee80211_tclas_class_mask4_4_src_ip;
7127
static int hf_ieee80211_tclas_class_mask4_4_dst_ip;
7128
static int hf_ieee80211_tclas_class_mask4_src_port;
7129
static int hf_ieee80211_tclas_class_mask4_dst_port;
7130
static int hf_ieee80211_tclas_class_mask4_dscp;
7131
static int hf_ieee80211_tclas_class_mask4_ipv4_proto;
7132
static int hf_ieee80211_tclas_class_mask4_reserved;
7133
static int hf_ieee80211_tclas_class_mask4_6_src_ip;
7134
static int hf_ieee80211_tclas_class_mask4_6_dst_ip;
7135
static int hf_ieee80211_tclas_reserved_bytes;
7136
static int hf_ieee80211_tclas_class_mask4_next_hdr;
7137
static int hf_ieee80211_tclas_class_mask4_flow_label;
7138
static int hf_ieee80211_tclas4_ipv4_src;
7139
static int hf_ieee80211_tclas4_ipv4_dst;
7140
static int hf_ieee80211_tclas4_src_port;
7141
static int hf_ieee80211_tclas4_dst_port;
7142
static int hf_ieee80211_tclas4_dscp;
7143
static int hf_ieee80211_tclas4_protocol;
7144
static int hf_ieee80211_tclas4_reserved;
7145
static int hf_ieee80211_tclas4_ipv6_src;
7146
static int hf_ieee80211_tclas4_ipv6_dst;
7147
static int hf_ieee80211_tclas4_next_hdr;
7148
static int hf_ieee80211_tclas4_flow;
7149
static int hf_ieee80211_tclas_tclas_8021d_up_pcp;
7150
static int hf_ieee80211_tclas_8021q_dei;
7151
static int hf_ieee80211_tclas_8021q_vid;
7152
7153
static int hf_ieee80211_tclas_class_mask5_up_prio;
7154
static int hf_ieee80211_tclas_class_mask5_dei;
7155
static int hf_ieee80211_tclas_class_mask5_vid;
7156
static int hf_ieee80211_tclas_class_mask5_reserved;
7157
7158
static int hf_ieee80211_tclas_class_mask6_a_above;
7159
static int hf_ieee80211_tclas_class_mask6_frame_control_match_spec;
7160
static int hf_ieee80211_tclas_class_mask6_duration_id_match_spec;
7161
static int hf_ieee80211_tclas_class_mask6_address_1_match_spec;
7162
static int hf_ieee80211_tclas_class_mask6_address_2_match_spec;
7163
static int hf_ieee80211_tclas_class_mask6_address_3_match_spec;
7164
static int hf_ieee80211_tclas_class_mask6_sequence_control_spec;
7165
static int hf_ieee80211_tclas_class_mask6_address_4_match_spec;
7166
static int hf_ieee80211_tclas_class_mask6_qos_control_spec;
7167
static int hf_ieee80211_tclas_class_mask6_ht_control_spec;
7168
static int hf_ieee80211_tclas_class_mask6_reserved;
7169
static int hf_ieee80211_tclas6_frame_control_spec;
7170
static int hf_ieee80211_tclas6_frame_control_mask;
7171
static int hf_ieee80211_tclas6_duration_spec;
7172
static int hf_ieee80211_tclas6_duration_mask;
7173
static int hf_ieee80211_tclas6_address_1_spec;
7174
static int hf_ieee80211_tclas6_address_1_mask;
7175
static int hf_ieee80211_tclas6_address_2_spec;
7176
static int hf_ieee80211_tclas6_address_2_mask;
7177
static int hf_ieee80211_tclas6_address_3_spec;
7178
static int hf_ieee80211_tclas6_address_3_mask;
7179
static int hf_ieee80211_tclas6_sequence_control_spec;
7180
static int hf_ieee80211_tclas6_sequence_control_mask;
7181
static int hf_ieee80211_tclas6_address_4_spec;
7182
static int hf_ieee80211_tclas6_address_4_mask;
7183
static int hf_ieee80211_tclas6_qos_control_spec;
7184
static int hf_ieee80211_tclas6_qos_control_mask;
7185
static int hf_ieee80211_tclas6_ht_control_spec;
7186
static int hf_ieee80211_tclas6_ht_control_mask;
7187
7188
static int hf_ieee80211_tclas_class_mask7_frame_control_match_spec;
7189
static int hf_ieee80211_tclas_class_mask7_address_1_sid_match_spec;
7190
static int hf_ieee80211_tclas_class_mask7_address_2_match_spec;
7191
static int hf_ieee80211_tclas_class_mask7_sequence_control_spec;
7192
static int hf_ieee80211_tclas_class_mask7_address_3_match_spec;
7193
static int hf_ieee80211_tclas_class_mask7_address_4_match_spec;
7194
static int hf_ieee80211_tclas_class_mask7_reserved;
7195
static int hf_ieee80211_tclas7_frame_control_spec;
7196
static int hf_ieee80211_tclas7_frame_control_mask;
7197
static int hf_ieee80211_tclas7_address_1_sid_spec;
7198
static int hf_ieee80211_tclas7_address_1_sid_mask;
7199
static int hf_ieee80211_tclas7_address_2_spec;
7200
static int hf_ieee80211_tclas7_address_2_mask;
7201
static int hf_ieee80211_tclas7_sequence_control_spec;
7202
static int hf_ieee80211_tclas7_sequence_control_mask;
7203
static int hf_ieee80211_tclas7_address_3_spec;
7204
static int hf_ieee80211_tclas7_address_3_mask;
7205
static int hf_ieee80211_tclas7_address_4_spec;
7206
static int hf_ieee80211_tclas7_address_4_mask;
7207
7208
static int hf_ieee80211_tclas_class_mask8_frame_control_match_spec;
7209
static int hf_ieee80211_tclas_class_mask8_address_1_bssid_match_spec;
7210
static int hf_ieee80211_tclas_class_mask8_address_2_sid_match_spec;
7211
static int hf_ieee80211_tclas_class_mask8_sequence_control_spec;
7212
static int hf_ieee80211_tclas_class_mask8_address_3_match_spec;
7213
static int hf_ieee80211_tclas_class_mask8_address_4_match_spec;
7214
static int hf_ieee80211_tclas_class_mask8_reserved;
7215
static int hf_ieee80211_tclas8_frame_control_spec;
7216
static int hf_ieee80211_tclas8_frame_control_mask;
7217
static int hf_ieee80211_tclas8_address_1_bssid_spec;
7218
static int hf_ieee80211_tclas8_address_1_bssid_mask;
7219
static int hf_ieee80211_tclas8_address_2_sid_spec;
7220
static int hf_ieee80211_tclas8_address_2_sid_mask;
7221
static int hf_ieee80211_tclas8_sequence_control_spec;
7222
static int hf_ieee80211_tclas8_sequence_control_mask;
7223
static int hf_ieee80211_tclas8_address_3_spec;
7224
static int hf_ieee80211_tclas8_address_3_mask;
7225
static int hf_ieee80211_tclas8_address_4_spec;
7226
static int hf_ieee80211_tclas8_address_4_mask;
7227
7228
static int hf_ieee80211_tclas_class_mask9_frame_control_match_spec;
7229
static int hf_ieee80211_tclas_class_mask9_address_1_match_spec;
7230
static int hf_ieee80211_tclas_class_mask9_address_2_match_spec;
7231
static int hf_ieee80211_tclas_class_mask9_sequence_control_spec;
7232
static int hf_ieee80211_tclas_class_mask9_reserved;
7233
static int hf_ieee80211_tclas9_frame_control_spec;
7234
static int hf_ieee80211_tclas9_frame_control_mask;
7235
static int hf_ieee80211_tclas9_address_1_spec;
7236
static int hf_ieee80211_tclas9_address_1_mask;
7237
static int hf_ieee80211_tclas9_address_2_spec;
7238
static int hf_ieee80211_tclas9_address_2_mask;
7239
static int hf_ieee80211_tclas9_sequence_control_spec;
7240
static int hf_ieee80211_tclas9_sequence_control_mask;
7241
7242
static int hf_ieee80211_tclas10_protocol_instance;
7243
static int hf_ieee80211_tclas10_protocol_num_next_hdr;
7244
7245
static int hf_ieee80211_aruba;
7246
static int hf_ieee80211_aruba_hb_seq;
7247
static int hf_ieee80211_aruba_mtu;
7248
7249
static int hf_ieee80211_tag_vendor_oui_type;
7250
static int hf_ieee80211_tag_vendor_data;
7251
7252
static int hf_ieee80211_symbp_extreme_assoc_clients;
7253
static int hf_ieee80211_symbp_extreme_load_kbps;
7254
static int hf_ieee80211_symbp_extreme_load_pps;
7255
static int hf_ieee80211_symbp_extreme_client_tx_power;
7256
static int hf_ieee80211_symbp_extreme_timestamp;
7257
7258
static int hf_ieee80211_tag_symbol_proprietary_oui;
7259
static int hf_ieee80211_tag_symbol_proprietary_data;
7260
7261
/* IEEE Std 802.11z-2010 7.3.2.62 */
7262
static int hf_ieee80211_tag_link_id_bssid;
7263
static int hf_ieee80211_tag_link_id_init_sta;
7264
static int hf_ieee80211_tag_link_id_resp_sta;
7265
7266
/* IEEE Std 802.11z-2010 7.3.2.63 */
7267
static int hf_ieee80211_tag_wakeup_schedule_offset;
7268
static int hf_ieee80211_tag_wakeup_schedule_interval;
7269
static int hf_ieee80211_tag_wakeup_schedule_awake_window_slots;
7270
static int hf_ieee80211_tag_wakeup_schedule_max_awake_dur;
7271
static int hf_ieee80211_tag_wakeup_schedule_idle_count;
7272
7273
/* IEEE Std 802.11z-2010 7.3.2.64 */
7274
static int hf_ieee80211_tag_channel_switch_timing_switch_time;
7275
static int hf_ieee80211_tag_channel_switch_timing_switch_timeout;
7276
7277
/* IEEE Std 802.11z-2010 7.3.2.65 */
7278
static int hf_ieee80211_tag_pti_control_tid;
7279
static int hf_ieee80211_tag_pti_control_sequence_control;
7280
7281
/* IEEE Std 802.11z-2010 7.3.2.66 */
7282
static int hf_ieee80211_tag_pu_buffer_status_ac_bk;
7283
static int hf_ieee80211_tag_pu_buffer_status_ac_be;
7284
static int hf_ieee80211_tag_pu_buffer_status_ac_vi;
7285
static int hf_ieee80211_tag_pu_buffer_status_ac_vo;
7286
7287
/* IEEE Std 802.11r-2008 7.3.2.49 */
7288
static int hf_ieee80211_tag_timeout_int_type;
7289
static int hf_ieee80211_tag_timeout_int_value;
7290
7291
/* Ethertype 89-0d */
7292
static int hf_ieee80211_data_encap_payload_type;
7293
7294
static int hf_ieee80211_anqp_wfa_subtype;
7295
7296
static int hf_ieee80211_dpp_subtype;
7297
7298
/* Hotspot 2.0 */
7299
static int hf_ieee80211_hs20_indication_dgaf_disabled;
7300
static int hf_ieee80211_hs20_indication_pps_mo_id_present;
7301
static int hf_ieee80211_hs20_indication_anqp_domain_id_present;
7302
static int hf_ieee80211_hs20_reserved;
7303
static int hf_ieee80211_hs20_indication_version_number;
7304
static int hf_ieee80211_hs20_indication_pps_mo_id;
7305
static int hf_ieee80211_hs20_indication_anqp_domain_id;
7306
7307
static int hf_ieee80211_hs20_anqp_subtype;
7308
static int hf_ieee80211_hs20_anqp_reserved;
7309
static int hf_ieee80211_hs20_anqp_payload;
7310
static int hf_ieee80211_hs20_anqp_hs_query_list;
7311
static int hf_ieee80211_hs20_anqp_hs_capability_list;
7312
static int hf_ieee80211_hs20_anqp_ofn_length;
7313
static int hf_ieee80211_hs20_anqp_ofn_language;
7314
static int hf_ieee80211_hs20_anqp_ofn_name;
7315
static int hf_ieee80211_hs20_anqp_wan_metrics_link_status;
7316
static int hf_ieee80211_hs20_anqp_wan_metrics_symmetric_link;
7317
static int hf_ieee80211_hs20_anqp_wan_metrics_at_capacity;
7318
static int hf_ieee80211_hs20_anqp_wan_metrics_reserved;
7319
static int hf_ieee80211_hs20_anqp_wan_metrics_downlink_speed;
7320
static int hf_ieee80211_hs20_anqp_wan_metrics_uplink_speed;
7321
static int hf_ieee80211_hs20_anqp_wan_metrics_downlink_load;
7322
static int hf_ieee80211_hs20_anqp_wan_metrics_uplink_load;
7323
static int hf_ieee80211_hs20_anqp_wan_metrics_lmd;
7324
static int hf_ieee80211_hs20_anqp_cc_proto_ip_proto;
7325
static int hf_ieee80211_hs20_anqp_cc_proto_port_num;
7326
static int hf_ieee80211_hs20_anqp_cc_proto_status;
7327
static int hf_ieee80211_hs20_anqp_nai_hrq_count;
7328
static int hf_ieee80211_hs20_anqp_nai_hrq_encoding_type;
7329
static int hf_ieee80211_hs20_anqp_nai_hrq_length;
7330
static int hf_ieee80211_hs20_anqp_nai_hrq_realm_name;
7331
static int hf_ieee80211_hs20_anqp_oper_class_indic;
7332
static int hf_ieee80211_hs20_osu_friendly_names_len;
7333
static int hf_ieee80211_hs20_osu_friendly_name_length;
7334
static int hf_ieee80211_hs20_osu_friendly_name_language;
7335
static int hf_ieee80211_hs20_osu_friendly_name_name;
7336
static int hf_ieee80211_hs20_osu_server_uri_len;
7337
static int hf_ieee80211_hs20_osu_server_uri;
7338
static int hf_ieee80211_hs20_osu_method_list_len;
7339
static int hf_ieee80211_hs20_osu_method_val;
7340
static int hf_ieee80211_hs20_icons_avail_len;
7341
static int hf_ieee80211_hs20_osu_providers_list_ssid_len;
7342
static int hf_ieee80211_hs20_osu_providers_ssid;
7343
static int hf_ieee80211_hs20_osu_providers_count;
7344
static int hf_ieee80211_hs20_osu_prov_length;
7345
static int hf_ieee80211_hs20_icon_request_filename;
7346
static int hf_ieee80211_hs20_icon_binary_file_status;
7347
static int hf_ieee80211_hs20_icon_type_length;
7348
static int hf_ieee80211_hs20_icon_type;
7349
static int hf_ieee80211_hs20_icon_binary_data_len;
7350
static int hf_ieee80211_hs20_icon_binary_data;
7351
static int hf_ieee80211_osu_icon_avail_width;
7352
static int hf_ieee80211_osu_icon_avail_height;
7353
static int hf_ieee80211_osu_icon_avail_lang_code;
7354
static int hf_ieee80211_osu_icon_avail_icon_type_len;
7355
static int hf_ieee80211_osu_icon_avail_icon_type;
7356
static int hf_ieee80211_osu_icon_avail_filename_len;
7357
static int hf_ieee80211_osu_icon_avail_filename;
7358
static int hf_ieee80211_hs20_osu_nai_len;
7359
static int hf_ieee80211_hs20_osu_nai;
7360
static int hf_ieee80211_hs20_osu_service_desc_len;
7361
static int hf_ieee80211_hs20_osu_service_desc_duple_len;
7362
static int hf_ieee80211_hs20_osu_service_desc_lang;
7363
static int hf_ieee80211_hs20_osu_service_desc;
7364
static int hf_ieee80211_hs20_anqp_venue_url_length;
7365
static int hf_ieee80211_hs20_anqp_venue_number;
7366
static int hf_ieee80211_hs20_anqp_venue_url;
7367
static int hf_ieee80211_hs20_anqp_advice_of_charge_length;
7368
static int hf_ieee80211_hs20_anqp_advice_of_charge_type;
7369
static int hf_ieee80211_hs20_anqp_aoc_nai_realm_encoding;
7370
static int hf_ieee80211_hs20_anqp_aoc_nai_realm_len;
7371
static int hf_ieee80211_hs20_anqp_aoc_nai_realm;
7372
static int hf_ieee80211_hs20_anqp_aoc_plan_len;
7373
static int hf_ieee80211_hs20_anqp_aoc_plan_lang;
7374
static int hf_ieee80211_hs20_anqp_aoc_plan_curcy;
7375
static int hf_ieee80211_hs20_anqp_aoc_plan_information;
7376
7377
static int hf_ieee80211_hs20_subscription_remediation_url_len;
7378
static int hf_ieee80211_hs20_subscription_remediation_server_url;
7379
static int hf_ieee80211_hs20_subscription_remediation_server_method;
7380
static int hf_ieee80211_hs20_deauth_reason_code;
7381
static int hf_ieee80211_hs20_reauth_delay;
7382
static int hf_ieee80211_hs20_deauth_reason_url_len;
7383
static int hf_ieee80211_hs20_deauth_imminent_reason_url;
7384
7385
/* IEEE Std 802.11ai : FILS Discovery */
7386
static int hf_ieee80211_ff_fils_discovery_frame_control;
7387
static int hf_ieee80211_ff_fils_discovery_frame_control_ssid_length;
7388
static int hf_ieee80211_ff_fils_discovery_frame_control_capability;
7389
static int hf_ieee80211_ff_fils_discovery_frame_control_short_ssid;
7390
static int hf_ieee80211_ff_fils_discovery_frame_control_ap_csn;
7391
static int hf_ieee80211_ff_fils_discovery_frame_control_ano;
7392
static int hf_ieee80211_ff_fils_discovery_frame_control_channel_center_frequency;
7393
static int hf_ieee80211_ff_fils_discovery_frame_control_primary_channel;
7394
static int hf_ieee80211_ff_fils_discovery_frame_control_rsn_info;
7395
static int hf_ieee80211_ff_fils_discovery_frame_control_length;
7396
static int hf_ieee80211_ff_fils_discovery_frame_control_md;
7397
static int hf_ieee80211_ff_fils_discovery_frame_control_reserved;
7398
static int hf_ieee80211_ff_fils_discovery_ssid;
7399
static int hf_ieee80211_ff_fils_discovery_capability;
7400
static int hf_ieee80211_ff_fils_discovery_capability_ess;
7401
static int hf_ieee80211_ff_fils_discovery_capability_privacy;
7402
static int hf_ieee80211_ff_fils_discovery_capability_bss_operating_channel_width;
7403
static int hf_ieee80211_ff_fils_discovery_capability_max_number_of_spatial_streams;
7404
static int hf_ieee80211_ff_fils_discovery_capability_reserved;
7405
static int hf_ieee80211_ff_fils_discovery_capability_multiple_bssid;
7406
static int hf_ieee80211_ff_fils_discovery_capability_phy_index;
7407
static int hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_dsss;
7408
static int hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_ofdm;
7409
static int hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_ht_vht_tvht;
7410
static int hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_he;
7411
static int hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate;
7412
7413
static int hf_ieee80211_ff_fils_discovery_short_ssid;
7414
static int hf_ieee80211_ff_fils_discovery_ap_csn;
7415
static int hf_ieee80211_ff_fils_discovery_ano;
7416
static int hf_ieee80211_ff_fils_discovery_ccfs1;
7417
static int hf_ieee80211_ff_fils_discovery_operating_class;
7418
static int hf_ieee80211_ff_fils_discovery_primary_channel;
7419
static int hf_ieee80211_ff_fils_discovery_rsn_info;
7420
static int hf_ieee80211_ff_fils_discovery_length;
7421
static int hf_ieee80211_ff_fils_discovery_md;
7422
7423
/* IEEE Std 802.11ad */
7424
static int hf_ieee80211_block_ack_RBUFCAP;
7425
static int hf_ieee80211_cf_response_offset;
7426
static int hf_ieee80211_grant_ack_reserved;
7427
static int hf_ieee80211_ff_dynamic_allocation;
7428
static int hf_ieee80211_ff_TID;
7429
static int hf_ieee80211_ff_alloc_type;
7430
static int hf_ieee80211_ff_src_aid;
7431
static int hf_ieee80211_ff_dest_aid;
7432
static int hf_ieee80211_ff_alloc_duration;
7433
static int hf_ieee80211_ff_b39;
7434
static int hf_ieee80211_ff_ssw;
7435
static int hf_ieee80211_ff_ssw_direction;
7436
static int hf_ieee80211_ff_ssw_cdown;
7437
static int hf_ieee80211_ff_ssw_sector_id;
7438
static int hf_ieee80211_ff_ssw_dmg_ant_id;
7439
static int hf_ieee80211_ff_ssw_rxss_len;
7440
static int hf_ieee80211_ff_bf;
7441
static int hf_ieee80211_ff_bf_train;
7442
static int hf_ieee80211_ff_bf_is_init;
7443
static int hf_ieee80211_ff_bf_is_resp;
7444
static int hf_ieee80211_ff_bf_num_sectors;
7445
static int hf_ieee80211_ff_bf_num_rx_dmg_ants;
7446
static int hf_ieee80211_ff_bf_b12b15;
7447
static int hf_ieee80211_ff_bf_rxss_len;
7448
static int hf_ieee80211_ff_bf_rxss_rate;
7449
static int hf_ieee80211_ff_bf_b10b15;
7450
static int hf_ieee80211_addr_nav_da;
7451
static int hf_ieee80211_addr_nav_sa;
7452
static int hf_ieee80211_ff_sswf;
7453
static int hf_ieee80211_ff_sswf_num_rx_dmg_ants;
7454
static int hf_ieee80211_ff_sswf_poll_required;
7455
static int hf_ieee80211_ff_sswf_total_sectors;
7456
static int hf_ieee80211_ff_sswf_reserved1;
7457
static int hf_ieee80211_ff_sswf_reserved2;
7458
static int hf_ieee80211_ff_sswf_sector_select;
7459
static int hf_ieee80211_ff_sswf_dmg_antenna_select;
7460
static int hf_ieee80211_ff_sswf_snr_report;
7461
static int hf_ieee80211_ff_brp;
7462
static int hf_ieee80211_ff_brp_L_RX;
7463
static int hf_ieee80211_ff_brp_TX_TRN_REQ;
7464
static int hf_ieee80211_ff_brp_MID_REQ;
7465
static int hf_ieee80211_ff_brp_BC_REQ;
7466
static int hf_ieee80211_ff_brp_MID_GRANT;
7467
static int hf_ieee80211_ff_brp_BC_GRANT;
7468
static int hf_ieee80211_ff_brp_chan_FBCK_CAP;
7469
static int hf_ieee80211_ff_brp_tx_sector;
7470
static int hf_ieee80211_ff_brp_other_aid;
7471
static int hf_ieee80211_ff_brp_tx_antenna;
7472
static int hf_ieee80211_ff_brp_reserved;
7473
static int hf_ieee80211_ff_blm;
7474
static int hf_ieee80211_ff_blm_unit_index;
7475
static int hf_ieee80211_ff_blm_maint_value;
7476
static int hf_ieee80211_ff_blm_is_master;
7477
static int hf_ieee80211_ff_bic;
7478
static int hf_ieee80211_ff_bic_cc_present;
7479
static int hf_ieee80211_ff_bic_discovery_mode;
7480
static int hf_ieee80211_ff_bic_next_beacon;
7481
static int hf_ieee80211_ff_bic_ati_present;
7482
static int hf_ieee80211_ff_bic_abft_len;
7483
static int hf_ieee80211_ff_bic_fss;
7484
static int hf_ieee80211_ff_bic_is_resp;
7485
static int hf_ieee80211_ff_bic_next_abft;
7486
static int hf_ieee80211_ff_bic_frag_txss;
7487
static int hf_ieee80211_ff_bic_txss_span;
7488
static int hf_ieee80211_ff_bic_NBI_abft;
7489
static int hf_ieee80211_ff_bic_abft_count;
7490
static int hf_ieee80211_ff_bic_nabft;
7491
static int hf_ieee80211_ff_bic_pcp;
7492
static int hf_ieee80211_ff_bic_reserved;
7493
static int * const ieee80211_ff_bic_fields[] = {
7494
  &hf_ieee80211_ff_bic_cc_present,
7495
  &hf_ieee80211_ff_bic_discovery_mode,
7496
  &hf_ieee80211_ff_bic_next_beacon,
7497
  &hf_ieee80211_ff_bic_ati_present,
7498
  &hf_ieee80211_ff_bic_abft_len,
7499
  &hf_ieee80211_ff_bic_fss,
7500
  &hf_ieee80211_ff_bic_is_resp,
7501
  &hf_ieee80211_ff_bic_next_abft,
7502
  &hf_ieee80211_ff_bic_frag_txss,
7503
  &hf_ieee80211_ff_bic_txss_span,
7504
  &hf_ieee80211_ff_bic_NBI_abft,
7505
  &hf_ieee80211_ff_bic_abft_count,
7506
  &hf_ieee80211_ff_bic_nabft,
7507
  &hf_ieee80211_ff_bic_pcp,
7508
  &hf_ieee80211_ff_bic_reserved,
7509
  NULL
7510
};
7511
static int hf_ieee80211_ff_dmg_params;
7512
static int hf_ieee80211_ff_dmg_params_bss;
7513
static int hf_ieee80211_ff_dmg_params_cbap_only;
7514
static int hf_ieee80211_ff_dmg_params_cbap_src;
7515
static int hf_ieee80211_ff_dmg_params_privacy;
7516
static int hf_ieee80211_ff_dmg_params_policy;
7517
static int hf_ieee80211_ff_dmg_params_spec_mgmt;
7518
static int hf_ieee80211_ff_dmg_params_radio_measure;
7519
static int hf_ieee80211_ff_cc;
7520
static int hf_ieee80211_ff_cc_abft_resp_addr;
7521
static int hf_ieee80211_ff_cc_sp_duration;
7522
static int hf_ieee80211_ff_cc_cluster_id;
7523
static int hf_ieee80211_ff_cc_role;
7524
static int hf_ieee80211_ff_cc_max_mem;
7525
static int hf_ieee80211_ff_dmg_action_code;
7526
static int hf_ieee80211_ff_dmg_pwr_mgmt;
7527
static int hf_ieee80211_ff_subject_address;
7528
static int hf_ieee80211_ff_handover_reason;
7529
static int hf_ieee80211_ff_handover_remaining_bi;
7530
static int hf_ieee80211_ff_handover_result;
7531
static int hf_ieee80211_ff_handover_reject_reason;
7532
static int hf_ieee80211_ff_destination_reds_aid;
7533
static int hf_ieee80211_ff_destination_aid;
7534
static int hf_ieee80211_ff_relay_aid;
7535
static int hf_ieee80211_ff_source_aid;
7536
static int hf_ieee80211_ff_timing_offset;
7537
static int hf_ieee80211_ff_sampling_frequency_offset;
7538
static int hf_ieee80211_ff_relay_operation_type;
7539
static int hf_ieee80211_ff_peer_sta_aid;
7540
static int hf_ieee80211_ff_snr;
7541
static int hf_ieee80211_ff_internal_angle;
7542
static int hf_ieee80211_ff_recommend;
7543
static int hf_ieee80211_ff_unprotected_dmg_action_code;
7544
static int hf_ieee80211_ff_fst_action_code;
7545
static int hf_ieee80211_ff_robust_av_streaming_action_code;
7546
static int hf_ieee80211_ff_llt;
7547
static int hf_ieee80211_ff_fsts_id;
7548
static int hf_ieee80211_ff_mmpdu_len;
7549
static int hf_ieee80211_ff_mmpdu_ctrl;
7550
static int hf_ieee80211_ff_oct_mmpdu;
7551
static int hf_ieee80211_ff_scs_scsid;
7552
static int hf_ieee80211_ff_scs_status;
7553
static int hf_ieee80211_ff_scs_response_count;
7554
7555
#if 0
7556
static int hf_ieee80211_ff_rcsi;
7557
static int hf_ieee80211_ff_rcsi_aid;
7558
#endif
7559
static int hf_ieee80211_ff_band_id;
7560
static int hf_ieee80211_tag_relay_support;
7561
static int hf_ieee80211_tag_relay_use;
7562
static int hf_ieee80211_tag_relay_permission;
7563
static int hf_ieee80211_tag_AC_power;
7564
static int hf_ieee80211_tag_relay_prefer;
7565
static int hf_ieee80211_tag_duplex;
7566
static int hf_ieee80211_tag_cooperation;
7567
static int hf_ieee80211_tag_move;
7568
static int hf_ieee80211_tag_size;
7569
static int hf_ieee80211_tag_tbtt_offset;
7570
static int hf_ieee80211_tag_bi_duration;
7571
static int hf_ieee80211_tag_dmg_capa_sta_addr;
7572
static int hf_ieee80211_tag_dmg_capa_aid;
7573
static int hf_ieee80211_tag_reverse_direction;
7574
static int hf_ieee80211_tag_hlts;
7575
static int hf_ieee80211_tag_tpc;
7576
static int hf_ieee80211_tag_spsh;
7577
static int hf_ieee80211_tag_rx_antenna;
7578
static int hf_ieee80211_tag_fast_link;
7579
static int hf_ieee80211_tag_num_sectors;
7580
static int hf_ieee80211_tag_rxss_length;
7581
static int hf_ieee80211_tag_reciprocity;
7582
static int hf_ieee80211_tag_max_ampdu_exp;
7583
static int hf_ieee80211_tag_min_mpdu_spacing;
7584
static int hf_ieee80211_tag_ba_flow_control;
7585
static int hf_ieee80211_tag_max_sc_rx_mcs;
7586
static int hf_ieee80211_tag_max_ofdm_rx_mcs;
7587
static int hf_ieee80211_tag_max_sc_tx_mcs;
7588
static int hf_ieee80211_tag_max_ofdm_tx_mcs;
7589
static int hf_ieee80211_tag_low_power_supported;
7590
static int hf_ieee80211_tag_code_rate;
7591
static int hf_ieee80211_tag_dtp;
7592
static int hf_ieee80211_tag_appdu_supp;
7593
static int hf_ieee80211_tag_heartbeat;
7594
static int hf_ieee80211_tag_other_aid;
7595
static int hf_ieee80211_tag_pattern_recip;
7596
static int hf_ieee80211_tag_heartbeat_elapsed;
7597
static int hf_ieee80211_tag_grant_ack_supp;
7598
static int hf_ieee80211_tag_RXSSTxRate_supp;
7599
static int hf_ieee80211_tag_pcp_tddti;
7600
static int hf_ieee80211_tag_pcp_PSA;
7601
static int hf_ieee80211_tag_pcp_handover;
7602
static int hf_ieee80211_tag_pcp_max_assoc;
7603
static int hf_ieee80211_tag_pcp_power_src;
7604
static int hf_ieee80211_tag_pcp_decenter;
7605
static int hf_ieee80211_tag_pcp_forwarding;
7606
static int hf_ieee80211_tag_pcp_center;
7607
static int hf_ieee80211_tag_sta_beam_track;
7608
static int hf_ieee80211_tag_ext_sc_mcs_max_tx;
7609
static int hf_ieee80211_tag_ext_sc_mcs_tx_code_7_8;
7610
static int hf_ieee80211_tag_ext_sc_mcs_max_rx;
7611
static int hf_ieee80211_tag_ext_sc_mcs_rx_code_7_8;
7612
static int hf_ieee80211_tag_max_basic_sf_amsdu;
7613
static int hf_ieee80211_tag_max_short_sf_amsdu;
7614
static int hf_ieee80211_tag_PSRSI;
7615
static int hf_ieee80211_tag_min_BHI_duration;
7616
static int hf_ieee80211_tag_brdct_sta_info_dur;
7617
static int hf_ieee80211_tag_assoc_resp_confirm_time;
7618
static int hf_ieee80211_tag_min_pp_duration;
7619
static int hf_ieee80211_tag_SP_idle_timeout;
7620
static int hf_ieee80211_tag_max_lost_beacons;
7621
static int hf_ieee80211_tag_type;
7622
static int hf_ieee80211_tag_tap1;
7623
static int hf_ieee80211_tag_state1;
7624
static int hf_ieee80211_tag_tap2;
7625
static int hf_ieee80211_tag_state2;
7626
static int hf_ieee80211_tag_allocation_id;
7627
static int hf_ieee80211_tag_allocation_type;
7628
static int hf_ieee80211_tag_pseudo_static;
7629
static int hf_ieee80211_tag_truncatable;
7630
static int hf_ieee80211_tag_extendable;
7631
static int hf_ieee80211_tag_pcp_active;
7632
static int hf_ieee80211_tag_lp_sc_used;
7633
static int hf_ieee80211_tag_src_aid;
7634
static int hf_ieee80211_tag_dest_aid;
7635
static int hf_ieee80211_tag_alloc_start;
7636
static int hf_ieee80211_tag_alloc_block_duration;
7637
static int hf_ieee80211_tag_num_blocks;
7638
static int hf_ieee80211_tag_alloc_block_period;
7639
static int hf_ieee80211_tag_aid;
7640
static int hf_ieee80211_tag_cbap;
7641
static int hf_ieee80211_tag_pp_avail;
7642
static int hf_ieee80211_tag_next_ati_start_time;
7643
static int hf_ieee80211_tag_next_ati_duration;
7644
static int hf_ieee80211_tag_old_bssid;
7645
static int hf_ieee80211_tag_new_pcp_addr;
7646
static int hf_ieee80211_tag_bssid;
7647
static int hf_ieee80211_tag_duplex_relay;
7648
static int hf_ieee80211_tag_cooperation_relay;
7649
static int hf_ieee80211_tag_tx_mode;
7650
static int hf_ieee80211_tag_link_change_interval;
7651
static int hf_ieee80211_tag_data_sensing_time;
7652
static int hf_ieee80211_tag_first_period;
7653
static int hf_ieee80211_tag_second_period;
7654
static int hf_ieee80211_tag_initiator;
7655
static int hf_ieee80211_tag_tx_train_res;
7656
static int hf_ieee80211_tag_rx_train_res;
7657
static int hf_ieee80211_tag_tx_trn_ok;
7658
static int hf_ieee80211_tag_txss_fbck_req;
7659
static int hf_ieee80211_tag_bs_fbck;
7660
static int hf_ieee80211_tag_bs_fbck_antenna_id;
7661
static int hf_ieee80211_tag_snr_requested;
7662
static int hf_ieee80211_tag_channel_measurement_requested;
7663
static int hf_ieee80211_tag_number_of_taps_requested;
7664
static int hf_ieee80211_tag_sector_id_order_req;
7665
static int hf_ieee80211_tag_snr_present;
7666
static int hf_ieee80211_tag_channel_measurement_present;
7667
static int hf_ieee80211_tag_tap_delay_present;
7668
static int hf_ieee80211_tag_number_of_taps_present;
7669
static int hf_ieee80211_tag_number_of_measurement;
7670
static int hf_ieee80211_tag_sector_id_order_present;
7671
static int hf_ieee80211_tag_number_of_beams;
7672
static int hf_ieee80211_tag_mid_extension;
7673
static int hf_ieee80211_tag_capability_request;
7674
static int hf_ieee80211_tag_beam_refine_reserved;
7675
static int hf_ieee80211_tag_nextpcp_list;
7676
static int hf_ieee80211_tag_nextpcp_token;
7677
static int hf_ieee80211_tag_remaining_BI;
7678
static int hf_ieee80211_tag_request_token;
7679
static int hf_ieee80211_tag_bi_start_time;
7680
static int hf_ieee80211_tag_sleep_cycle;
7681
static int hf_ieee80211_tag_num_awake_bis;
7682
static int hf_ieee80211_tag_tspec_allocation_id;
7683
static int hf_ieee80211_tag_tspec_allocation_type;
7684
static int hf_ieee80211_tag_tspec_allocation_format;
7685
static int hf_ieee80211_tag_tspec_pseudo_static;
7686
static int hf_ieee80211_tag_tspec_truncatable;
7687
static int hf_ieee80211_tag_tspec_extendable;
7688
static int hf_ieee80211_tag_tspec_lp_sc_used;
7689
static int hf_ieee80211_tag_tspec_up;
7690
static int hf_ieee80211_tag_tspec_dest_aid;
7691
static int hf_ieee80211_tag_tspec_allocation_period;
7692
static int hf_ieee80211_tag_tspec_min_allocation;
7693
static int hf_ieee80211_tag_tspec_max_allocation;
7694
static int hf_ieee80211_tag_tspec_min_duration;
7695
static int hf_ieee80211_tag_tspec_num_of_constraints;
7696
static int hf_ieee80211_tag_tspec_tsconst_start_time;
7697
static int hf_ieee80211_tag_tspec_tsconst_duration;
7698
static int hf_ieee80211_tag_tspec_tsconst_period;
7699
static int hf_ieee80211_tag_tspec_tsconst_interferer_mac;
7700
static int hf_ieee80211_tag_channel_measurement_feedback_relative_I;
7701
static int hf_ieee80211_tag_channel_measurement_feedback_relative_Q;
7702
static int hf_ieee80211_tag_channel_measurement_feedback_tap_delay;
7703
static int hf_ieee80211_tag_channel_measurement_feedback_sector_id;
7704
static int hf_ieee80211_tag_channel_measurement_feedback_antenna_id;
7705
static int hf_ieee80211_tag_awake_window;
7706
static int hf_ieee80211_tag_addba_ext_no_frag;
7707
static int hf_ieee80211_tag_addba_ext_he_fragmentation_operation;
7708
static int hf_ieee80211_tag_addba_ext_reserved;
7709
static int hf_ieee80211_tag_addba_ext_buffer_size;
7710
static int hf_ieee80211_tag_multi_band_ctrl_sta_role;
7711
static int hf_ieee80211_tag_multi_band_ctrl_addr_present;
7712
static int hf_ieee80211_tag_multi_band_ctrl_cipher_present;
7713
static int hf_ieee80211_tag_multi_band_oper_class;
7714
static int hf_ieee80211_tag_multi_band_channel_number;
7715
static int hf_ieee80211_tag_multi_band_tsf_offset;
7716
static int hf_ieee80211_tag_multi_band_conn_ap;
7717
static int hf_ieee80211_tag_multi_band_conn_pcp;
7718
static int hf_ieee80211_tag_multi_band_conn_dls;
7719
static int hf_ieee80211_tag_multi_band_conn_tdls;
7720
static int hf_ieee80211_tag_multi_band_conn_ibss;
7721
static int hf_ieee80211_tag_multi_band_fst_timeout;
7722
static int hf_ieee80211_tag_multi_band_sta_mac;
7723
static int hf_ieee80211_tag_activity;
7724
static int hf_ieee80211_tag_dmg_link_adapt_mcs;
7725
static int hf_ieee80211_tag_dmg_link_adapt_link_margin;
7726
static int hf_ieee80211_tag_ref_timestamp;
7727
static int hf_ieee80211_tag_switching_stream_non_qos;
7728
static int hf_ieee80211_tag_switching_stream_param_num;
7729
static int hf_ieee80211_tag_switching_stream_old_tid;
7730
static int hf_ieee80211_tag_switching_stream_old_direction;
7731
static int hf_ieee80211_tag_switching_stream_new_tid;
7732
static int hf_ieee80211_tag_switching_stream_new_direction;
7733
static int hf_ieee80211_tag_switching_stream_new_valid_id;
7734
static int hf_ieee80211_tag_switching_stream_llt_type;
7735
7736
static int hf_ieee80211_mysterious_extra_stuff;
7737
7738
static int hf_ieee80211_mscs_descriptor_type;
7739
static int hf_ieee80211_mscs_user_prio_control_reserved;
7740
static int hf_ieee80211_user_prio_bitmap;
7741
static int hf_ieee80211_user_prio_bitmap_bit0;
7742
static int hf_ieee80211_user_prio_bitmap_bit1;
7743
static int hf_ieee80211_user_prio_bitmap_bit2;
7744
static int hf_ieee80211_user_prio_bitmap_bit3;
7745
static int hf_ieee80211_user_prio_bitmap_bit4;
7746
static int hf_ieee80211_user_prio_bitmap_bit5;
7747
static int hf_ieee80211_user_prio_bitmap_bit6;
7748
static int hf_ieee80211_user_prio_bitmap_bit7;
7749
static int hf_ieee80211_user_prio_limit;
7750
static int hf_ieee80211_user_prio_reserved;
7751
static int hf_ieee80211_stream_timeout_reserved;
7752
static int hf_ieee80211_stream_timeout;
7753
static int hf_ieee80211_mscs_subelement_id;
7754
static int hf_ieee80211_mscs_subelement_len;
7755
static int hf_ieee80211_mscs_subelement_data;
7756
7757
static int hf_ieee80211_intra_access_prio;
7758
static int hf_ieee80211_intra_access_prio_user_prio;
7759
static int hf_ieee80211_intra_access_prio_alt_queue;
7760
static int hf_ieee80211_intra_access_prio_drop_elig;
7761
static int hf_ieee80211_intra_access_prio_reserved;
7762
7763
static int hf_ieee80211_scs_descriptor_scsid;
7764
static int hf_ieee80211_scs_descriptor_type;
7765
7766
static int hf_ieee80211_esp_access_category;
7767
static int hf_ieee80211_esp_reserved;
7768
static int hf_ieee80211_esp_data_format;
7769
static int hf_ieee80211_esp_ba_windows_size;
7770
static int hf_ieee80211_esp_est_air_time_frac;
7771
static int hf_ieee80211_esp_data_ppdu_duration_target;
7772
static int hf_ieee80211_estimated_service_params;
7773
7774
static int hf_ieee80211_fcg_new_channel_number;
7775
static int hf_ieee80211_fcg_extra_info;
7776
static int hf_ieee80211_sae_password_identifier;
7777
7778
static int hf_ieee80211_sae_anti_clogging_token;
7779
7780
static int hf_ieee80211_tag_fils_indication_info_nr_pk;
7781
static int hf_ieee80211_tag_fils_indication_info_nr_realm;
7782
static int hf_ieee80211_tag_fils_indication_info_ip_config;
7783
static int hf_ieee80211_tag_fils_indication_info_cache_id_included;
7784
static int hf_ieee80211_tag_fils_indication_info_hessid_included;
7785
static int hf_ieee80211_tag_fils_indication_info_ska_without_pfs;
7786
static int hf_ieee80211_tag_fils_indication_info_ska_with_pfs;
7787
static int hf_ieee80211_tag_fils_indication_info_pka;
7788
static int hf_ieee80211_tag_fils_indication_info_reserved;
7789
static int hf_ieee80211_tag_fils_indication_cache_identifier;
7790
static int hf_ieee80211_tag_fils_indication_hessid;
7791
static int hf_ieee80211_tag_fils_indication_realm_list;
7792
static int hf_ieee80211_tag_fils_indication_realm_identifier;
7793
static int hf_ieee80211_tag_fils_indication_public_key_list;
7794
static int hf_ieee80211_tag_fils_indication_public_key_type;
7795
static int hf_ieee80211_tag_fils_indication_public_key_length;
7796
static int hf_ieee80211_tag_fils_indication_public_key_indicator;
7797
7798
static int hf_ieee80211_qos_mgmt_attribute_id;
7799
static int hf_ieee80211_qos_mgmt_attribute_len;
7800
static int hf_ieee80211_qos_mgmt_start_port_range;
7801
static int hf_ieee80211_qos_mgmt_end_port_range;
7802
static int hf_ieee80211_qos_mgmt_dscp_pol_id;
7803
static int hf_ieee80211_qos_mgmt_dscp_pol_req_type;
7804
static int hf_ieee80211_qos_mgmt_dscp_pol_dscp;
7805
static int hf_ieee80211_qos_mgmt_domain_name;
7806
static int hf_ieee80211_qos_mgmt_unknown_attr;
7807
7808
static int hf_ieee80211_ext_tag;
7809
static int hf_ieee80211_ext_tag_number;
7810
static int hf_ieee80211_ext_tag_length;
7811
static int hf_ieee80211_ext_tag_data;
7812
7813
static int hf_ieee80211_fils_req_params_parameter_control_bitmap;
7814
static int hf_ieee80211_fils_req_params_fils_criteria_present;
7815
static int hf_ieee80211_fils_req_params_max_delay_limit_present;
7816
static int hf_ieee80211_fils_req_params_minimum_data_rate_present;
7817
static int hf_ieee80211_fils_req_params_rcpi_limit_present;
7818
static int hf_ieee80211_fils_req_params_oui_response_criteria_present;
7819
static int hf_ieee80211_fils_req_params_reserved;
7820
static int hf_ieee80211_fils_req_params_max_channel_time;
7821
static int hf_ieee80211_fils_req_params_fils_criteria;
7822
static int hf_ieee80211_fils_req_params_fils_criteria_bss_delay;
7823
static int hf_ieee80211_fils_req_params_fils_criteria_phy_support;
7824
static int hf_ieee80211_fils_req_params_fils_criteria_reserved;
7825
static int hf_ieee80211_fils_req_params_max_delay_limit;
7826
static int hf_ieee80211_fils_req_params_minimum_data_rate;
7827
static int hf_ieee80211_fils_req_params_rcpi_limit;
7828
static int hf_ieee80211_fils_req_params_oui_response_criteria;
7829
7830
static int hf_ieee80211_fils_session;
7831
static int hf_ieee80211_fils_encrypted_data;
7832
static int hf_ieee80211_fils_nonce;
7833
7834
/* wfa 60g ie tree */
7835
static int hf_ieee80211_wfa_60g_attr;
7836
static int hf_ieee80211_wfa_60g_attr_id;
7837
static int hf_ieee80211_wfa_60g_attr_len;
7838
7839
static int hf_ieee80211_wfa_60g_attr_cap_sta_mac_addr;
7840
static int hf_ieee80211_wfa_60g_attr_cap_recv_amsdu_frames;
7841
static int hf_ieee80211_wfa_60g_attr_cap_reserved;
7842
7843
/* ************************************************************************* */
7844
/*                              802.11AX fields                              */
7845
/* ************************************************************************* */
7846
static int hf_ieee80211_he_mac_capabilities;
7847
static int hf_ieee80211_he_htc_he_support;
7848
static int hf_ieee80211_he_twt_requester_support;
7849
static int hf_ieee80211_he_twt_responder_support;
7850
static int hf_ieee80211_he_dynamic_fragmentation_support;
7851
static int hf_ieee80211_he_max_number_fragmented_msdus;
7852
static int hf_ieee80211_he_min_fragment_size;
7853
static int hf_ieee80211_he_trigger_frame_mac_padding_dur;
7854
static int hf_ieee80211_he_multi_tid_aggregation_rx_support;
7855
static int hf_ieee80211_he_he_link_adaptation_support;
7856
static int hf_ieee80211_he_all_ack_support;
7857
static int hf_ieee80211_he_trs_support;
7858
static int hf_ieee80211_he_bsr_support;
7859
static int hf_ieee80211_he_broadcast_twt_support;
7860
static int hf_ieee80211_he_32_bit_ba_bitmap_support;
7861
static int hf_ieee80211_he_mu_cascading_support;
7862
static int hf_ieee80211_he_ack_enabled_aggregation_support;
7863
static int hf_ieee80211_he_reserved_b24;
7864
static int hf_ieee80211_he_om_control_support;
7865
static int hf_ieee80211_he_ofdma_ra_support;
7866
static int hf_ieee80211_he_max_a_mpdu_length_exponent_ext;
7867
static int hf_ieee80211_he_a_msdu_fragmentation_support;
7868
static int hf_ieee80211_he_flexible_twt_schedule_support;
7869
static int hf_ieee80211_he_rx_control_frame_to_multibss;
7870
static int hf_ieee80211_he_bsrp_bqrp_a_mpdu_aggregation;
7871
static int hf_ieee80211_he_qtp_support;
7872
static int hf_ieee80211_he_bqr_support;
7873
static int hf_ieee80211_he_psr_responder;
7874
static int hf_ieee80211_he_ndp_feedback_report_support;
7875
static int hf_ieee80211_he_ops_support;
7876
static int hf_ieee80211_he_a_msdu_in_a_mpdu_support;
7877
static int hf_ieee80211_he_multi_tid_aggregation_tx_support;
7878
static int hf_ieee80211_he_subchannel_selective_trans_support;
7879
static int hf_ieee80211_he_2_996_tone_ru_support;
7880
static int hf_ieee80211_he_om_control_ul_mu_data_disable_rx_support;
7881
static int hf_ieee80211_he_dynamic_sm_power_save;
7882
static int hf_ieee80211_he_punctured_sounding_support;
7883
static int hf_ieee80211_he_ht_and_vht_trigger_frame_rx_support;
7884
static int hf_ieee80211_he_reserved_bit_18;
7885
static int hf_ieee80211_he_reserved_bit_19;
7886
static int hf_ieee80211_he_reserved_bit_25;
7887
static int hf_ieee80211_he_reserved_bit_29;
7888
static int hf_ieee80211_he_reserved_bit_34;
7889
static int hf_ieee80211_he_reserved_bits_5_7;
7890
static int hf_ieee80211_he_reserved_bits_8_9;
7891
static int hf_ieee80211_he_reserved_bits_15_16;
7892
static int hf_ieee80211_he_phy_reserved_b0;
7893
static int hf_ieee80211_he_phy_cap_reserved_b0;
7894
static int hf_ieee80211_he_phy_chan_width_set;
7895
static int hf_ieee80211_he_40mhz_channel_2_4ghz;
7896
static int hf_ieee80211_he_40_and_80_mhz_5ghz;
7897
static int hf_ieee80211_he_160_mhz_5ghz;
7898
static int hf_ieee80211_he_160_80_plus_80_mhz_5ghz;
7899
static int hf_ieee80211_he_242_tone_rus_in_2_4ghz;
7900
static int hf_ieee80211_he_242_tone_rus_in_5ghz;
7901
static int hf_ieee80211_he_5ghz_b0_reserved;
7902
static int hf_ieee80211_he_5ghz_b4_reserved;
7903
static int hf_ieee80211_he_24ghz_b1_reserved;
7904
static int hf_ieee80211_he_24ghz_b2_reserved;
7905
static int hf_ieee80211_he_24ghz_b3_reserved;
7906
static int hf_ieee80211_he_24ghz_b5_reserved;
7907
static int hf_ieee80211_he_chan_width_reserved;
7908
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_1_ss;
7909
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_2_ss;
7910
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_3_ss;
7911
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_4_ss;
7912
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_5_ss;
7913
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_6_ss;
7914
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_7_ss;
7915
static int hf_ieee80211_he_mcs_max_he_mcs_80_rx_8_ss;
7916
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_1_ss;
7917
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_2_ss;
7918
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_3_ss;
7919
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_4_ss;
7920
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_5_ss;
7921
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_6_ss;
7922
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_7_ss;
7923
static int hf_ieee80211_he_mcs_max_he_mcs_80_tx_8_ss;
7924
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_1_ss;
7925
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_2_ss;
7926
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_3_ss;
7927
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_4_ss;
7928
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_5_ss;
7929
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_6_ss;
7930
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_7_ss;
7931
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_8_ss;
7932
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_1_ss;
7933
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_2_ss;
7934
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_3_ss;
7935
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_4_ss;
7936
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_5_ss;
7937
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_6_ss;
7938
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_7_ss;
7939
static int hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_8_ss;
7940
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_1_ss;
7941
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_2_ss;
7942
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_3_ss;
7943
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_4_ss;
7944
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_5_ss;
7945
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_6_ss;
7946
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_7_ss;
7947
static int hf_ieee80211_he_mcs_max_he_mcs_160_rx_8_ss;
7948
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_1_ss;
7949
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_2_ss;
7950
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_3_ss;
7951
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_4_ss;
7952
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_5_ss;
7953
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_6_ss;
7954
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_7_ss;
7955
static int hf_ieee80211_he_mcs_max_he_mcs_160_tx_8_ss;
7956
static int hf_ieee80211_he_rx_he_mcs_map_lte_80;
7957
static int hf_ieee80211_he_tx_he_mcs_map_lte_80;
7958
static int hf_ieee80211_he_rx_he_mcs_map_160;
7959
static int hf_ieee80211_he_tx_he_mcs_map_160;
7960
static int hf_ieee80211_he_rx_he_mcs_map_80_80;
7961
static int hf_ieee80211_he_tx_he_mcs_map_80_80;
7962
static int hf_ieee80211_he_ppe_thresholds_nss;
7963
static int hf_ieee80211_he_ppe_thresholds_ru_index_bitmask;
7964
static int hf_ieee80211_he_ppe_ppet16;
7965
static int hf_ieee80211_he_ppe_ppet8;
7966
static int hf_ieee80211_he_phy_b8_to_b23;
7967
static int hf_ieee80211_he_phy_cap_punctured_preamble_rx;
7968
static int hf_ieee80211_he_phy_cap_device_class;
7969
static int hf_ieee80211_he_phy_cap_ldpc_coding_in_payload;
7970
static int hf_ieee80211_he_phy_cap_he_su_ppdu_1x_he_ltf_08us;
7971
static int hf_ieee80211_he_phy_cap_midamble_tx_rx_max_nsts;
7972
static int hf_ieee80211_he_phy_cap_ndp_with_4x_he_ltf_32us;
7973
static int hf_ieee80211_he_phy_cap_stbc_tx_lt_80mhz;
7974
static int hf_ieee80211_he_phy_cap_stbc_rx_lt_80mhz;
7975
static int hf_ieee80211_he_phy_cap_doppler_tx;
7976
static int hf_ieee80211_he_phy_cap_doppler_rx;
7977
static int hf_ieee80211_he_phy_cap_full_bw_ul_mu_mimo;
7978
static int hf_ieee80211_he_phy_cap_partial_bw_ul_mu_mimo;
7979
static int hf_ieee80211_he_phy_b24_to_b39;
7980
static int hf_ieee80211_he_phy_cap_dcm_max_constellation_tx;
7981
static int hf_ieee80211_he_phy_cap_dcm_max_nss_tx;
7982
static int hf_ieee80211_he_phy_cap_dcm_max_constellation_rx;
7983
static int hf_ieee80211_he_phy_cap_dcm_max_nss_rx;
7984
static int hf_ieee80211_he_phy_cap_rx_partial_bw_su_20mhz_he_mu_ppdu;
7985
static int hf_ieee80211_he_phy_cap_su_beamformer;
7986
static int hf_ieee80211_he_phy_cap_su_beamformee;
7987
static int hf_ieee80211_he_phy_cap_mu_beamformer;
7988
static int hf_ieee80211_he_phy_cap_beamformee_sts_lte_80mhz;
7989
static int hf_ieee80211_he_phy_cap_beamformee_sts_gt_80mhz;
7990
static int hf_ieee80211_he_phy_b40_to_b55;
7991
static int hf_ieee80211_he_phy_cap_number_of_sounding_dims_lte_80;
7992
static int hf_ieee80211_he_phy_cap_number_of_sounding_dims_gt_80;
7993
static int hf_ieee80211_he_phy_cap_ng_eq_16_su_fb;
7994
static int hf_ieee80211_he_phy_cap_ng_eq_16_mu_fb;
7995
static int hf_ieee80211_he_phy_cap_codebook_size_eq_4_2_fb;
7996
static int hf_ieee80211_he_phy_cap_codebook_size_eq_7_5_fb;
7997
static int hf_ieee80211_he_phy_cap_triggered_su_beamforming_fb;
7998
static int hf_ieee80211_he_phy_cap_triggered_mu_beamforming_fb;
7999
static int hf_ieee80211_he_phy_cap_triggered_cqi_fb;
8000
static int hf_ieee80211_he_phy_cap_partial_bw_extended_range;
8001
static int hf_ieee80211_he_phy_cap_partial_bw_dl_mu_mimo;
8002
static int hf_ieee80211_he_phy_cap_ppe_threshold_present;
8003
static int hf_ieee80211_he_phy_b56_to_b71;
8004
static int hf_ieee80211_he_phy_cap_psr_based_sr_support;
8005
static int hf_ieee80211_he_phy_cap_power_boost_factor_ar_support;
8006
static int hf_ieee80211_he_phy_cap_he_su_ppdu_etc_gi;
8007
static int hf_ieee80211_he_phy_cap_max_nc;
8008
static int hf_ieee80211_he_phy_cap_stbc_tx_gt_80_mhz;
8009
static int hf_ieee80211_he_phy_cap_stbc_rx_gt_80_mhz;
8010
static int hf_ieee80211_he_phy_cap_he_er_su_ppdu_4xxx_gi;
8011
static int hf_ieee80211_he_phy_cap_20mhz_in_40mhz_24ghz_band;
8012
static int hf_ieee80211_he_phy_cap_20mhz_in_160_80p80_ppdu;
8013
static int hf_ieee80211_he_phy_cap_80mgz_in_160_80p80_ppdu;
8014
static int hf_ieee80211_he_phy_cap_he_er_su_ppdu_1xxx_gi;
8015
static int hf_ieee80211_he_phy_cap_midamble_tx_rx_2x_xxx_ltf;
8016
static int hf_ieee80211_he_phy_b72_to_b87;
8017
static int hf_ieee80211_he_phy_cap_dcm_max_ru;
8018
static int hf_ieee80211_he_phy_cap_longer_than_16_he_sigb_ofdm_symbol_support;
8019
static int hf_ieee80211_he_phy_cap_non_triggered_cqi_feedback;
8020
static int hf_ieee80211_he_phy_cap_tx_1024_qam_242_tone_ru_support;
8021
static int hf_ieee80211_he_phy_cap_rx_1024_qam_242_tone_ru_support;
8022
static int hf_ieee80211_he_phy_cap_rx_full_bw_su_using_he_muppdu_w_compressed_sigb;
8023
static int hf_ieee80211_he_phy_cap_rx_full_bw_su_using_he_muppdu_w_non_compressed_sigb;
8024
static int hf_ieee80211_he_phy_cap_nominal_packet_padding;
8025
static int hf_ieee80211_he_phy_cap_he_mu_ppdu_ru_rx_max;
8026
static int hf_ieee80211_he_phy_cap_b81_b87_reserved;
8027
static int hf_ieee80211_he_operation_parameter;
8028
static int hf_ieee80211_he_operation_default_pe_duration;
8029
static int hf_ieee80211_he_operation_twt_required;
8030
static int hf_ieee80211_he_operation_txop_duration_rts_threshold;
8031
static int hf_ieee80211_he_operation_vht_operation_information_present;
8032
static int hf_ieee80211_he_operation_co_hosted_bss;
8033
static int hf_ieee80211_he_operation_er_su_disable;
8034
static int hf_ieee80211_he_operation_6ghz_operation_information_present;
8035
static int hf_ieee80211_he_operation_reserved_b16_b23;
8036
static int hf_ieee80211_he_bss_color_information;
8037
static int hf_ieee80211_he_bss_color_info_bss_color;
8038
static int hf_ieee80211_he_bss_color_partial_bss_color;
8039
static int hf_ieee80211_he_bss_color_bss_color_disabled;
8040
static int hf_ieee80211_he_operation_basic_mcs;
8041
static int hf_ieee80211_he_oper_max_he_mcs_for_1_ss;
8042
static int hf_ieee80211_he_oper_max_he_mcs_for_2_ss;
8043
static int hf_ieee80211_he_oper_max_he_mcs_for_3_ss;
8044
static int hf_ieee80211_he_oper_max_he_mcs_for_4_ss;
8045
static int hf_ieee80211_he_oper_max_he_mcs_for_5_ss;
8046
static int hf_ieee80211_he_oper_max_he_mcs_for_6_ss;
8047
static int hf_ieee80211_he_oper_max_he_mcs_for_7_ss;
8048
static int hf_ieee80211_he_oper_max_he_mcs_for_8_ss;
8049
static int hf_ieee80211_he_operation_channel_width;
8050
static int hf_ieee80211_he_operation_channel_center_freq_0;
8051
static int hf_ieee80211_he_operation_channel_center_freq_1;
8052
static int hf_ieee80211_he_operation_max_co_hosted_bssid_indicator;
8053
static int hf_ieee80211_he_operation_6ghz_primary_channel;
8054
static int hf_ieee80211_he_operation_6ghz_control;
8055
static int hf_ieee80211_he_operation_6ghz_control_channel_width;
8056
static int hf_ieee80211_he_operation_6ghz_control_duplicate_beacon;
8057
static int hf_ieee80211_he_operation_6ghz_control_regulatory_info;
8058
static int hf_ieee80211_he_operation_6ghz_control_reserved;
8059
static int hf_ieee80211_he_operation_6ghz_channel_center_freq_0;
8060
static int hf_ieee80211_he_operation_6ghz_channel_center_freq_1;
8061
static int hf_ieee80211_he_operation_6ghz_minimum_rate;
8062
static int hf_ieee80211_he_muac_aci_aifsn;
8063
static int hf_ieee80211_he_muac_aifsn;
8064
static int hf_ieee80211_he_muac_acm;
8065
static int hf_ieee80211_he_muac_aci;
8066
static int hf_ieee80211_he_muac_reserved;
8067
static int hf_ieee80211_he_mu_edca_timer;
8068
static int hf_ieee80211_he_muac_ecwmin_ecwmax;
8069
static int hf_ieee80211_he_srp_disallowed;
8070
static int hf_ieee80211_he_non_srg_obss_pd_sr_disallowed;
8071
static int hf_ieee80211_he_non_srg_offset_present;
8072
static int hf_ieee80211_he_srg_information_present;
8073
static int hf_ieee80211_he_hesiga_spatial_reuse_value15_allowed;
8074
static int hf_ieee80211_he_sr_control_reserved;
8075
static int hf_ieee80211_he_spatial_reuse_sr_control;
8076
static int hf_ieee80211_he_spatial_non_srg_obss_pd_max_offset;
8077
static int hf_ieee80211_he_spatial_srg_obss_pd_min_offset;
8078
static int hf_ieee80211_he_spatial_srg_obss_pd_max_offset;
8079
static int hf_ieee80211_he_spatial_srg_bss_color_bitmap;
8080
static int hf_ieee80211_he_spatial_srg_partial_bssid_bitmap;
8081
static int hf_ieee80211_he_ess_report_planned_ess;
8082
static int hf_ieee80211_he_ess_report_edge_of_ess;
8083
static int hf_ieee80211_he_resource_request_buffer_thresh;
8084
static int hf_ieee80211_he_bss_color_change_new_color_info;
8085
static int hf_ieee80211_he_new_bss_color_info_color;
8086
static int hf_ieee80211_he_new_bss_color_info_reserved;
8087
static int hf_ieee80211_he_bss_color_change_switch_countdown;
8088
static int hf_ieee80211_he_ess_report_info_field;
8089
static int hf_ieee80211_he_ess_report_recommend_transition_thresh;
8090
static int hf_ieee80211_he_ops_duration;
8091
static int hf_ieee80211_he_uora_field;
8092
static int hf_ieee80211_he_uora_eocwmin;
8093
static int hf_ieee80211_he_uora_owcwmax;
8094
static int hf_ieee80211_he_uora_reserved;
8095
8096
static int hf_ieee80211_max_channel_switch_time;
8097
8098
static int hf_ieee80211_oci_operating_class;
8099
static int hf_ieee80211_oci_primary_channel_number;
8100
static int hf_ieee80211_oci_frequency_segment_1;
8101
static int hf_ieee80211_oci_oct_operating_class;
8102
static int hf_ieee80211_oci_oct_primary_channel_number;
8103
static int hf_ieee80211_oci_oct_frequency_segment_1;
8104
8105
static int hf_ieee80211_multiple_bssid_configuration_bssid_count;
8106
static int hf_ieee80211_multiple_bssid_configuration_full_set_rx_periodicity;
8107
static int hf_ieee80211_known_bssid_bitmap;
8108
static int hf_ieee80211_short_ssid;
8109
8110
static int hf_ieee80211_non_inheritance_element_id_list_length;
8111
static int hf_ieee80211_non_inheritance_element_id_list_element_id;
8112
static int hf_ieee80211_non_inheritance_element_id_ext_list_length;
8113
static int hf_ieee80211_non_inheritance_element_id_ext_list_element_id_ext;
8114
8115
static int hf_ieee80211_rejected_groups_group;
8116
8117
static int hf_ieee80211_twt_bcast_flow;
8118
static int hf_ieee80211_twt_individual_flow;
8119
static int hf_ieee80211_twt_individual_flow_id;
8120
static int hf_ieee80211_twt_individual_reserved;
8121
static int hf_ieee80211_twt_bcast_id;
8122
static int hf_ieee80211_twt_neg_type;
8123
static int hf_ieee80211_twt_neg_type2_reserved1;
8124
static int hf_ieee80211_twt_neg_type2_reserved2;
8125
static int hf_ieee80211_twt_bcast_teardown_all;
8126
static int hf_ieee80211_twt_bcast_teardown_all_twt;
8127
static int hf_ieee80211_twt_bcast_twt_id_reserved;
8128
static int hf_ieee80211_twt_bcast_neg_type_reserved;
8129
8130
static int hf_ieee80211_tag_twt_control_field;
8131
static int hf_ieee80211_tag_twt_ndp_paging_indicator;
8132
static int hf_ieee80211_tag_twt_responder_pm_mode;
8133
static int hf_ieee80211_tag_twt_neg_type;
8134
static int hf_ieee80211_tag_twt_info_frame_disabled;
8135
static int hf_ieee80211_tag_twt_wake_duration_unit;
8136
static int hf_ieee80211_tag_twt_link_id_bitmap_present;
8137
static int hf_ieee80211_tag_twt_aligned_twt;
8138
8139
static int hf_ieee80211_tag_twt_req_type_field;
8140
static int hf_ieee80211_tag_twt_req_type_req;
8141
static int hf_ieee80211_tag_twt_req_type_setup_cmd;
8142
static int hf_ieee80211_tag_twt_req_type_trigger;
8143
static int hf_ieee80211_tag_twt_req_type_implicit;
8144
static int hf_ieee80211_tag_twt_req_type_flow_type;
8145
static int hf_ieee80211_tag_twt_req_type_flow_id;
8146
static int hf_ieee80211_tag_twt_req_type_wake_int_exp;
8147
static int hf_ieee80211_tag_twt_req_type_prot;
8148
static int hf_ieee80211_tag_twt_req_type_last_bcst_parm_set;
8149
static int hf_ieee80211_tag_twt_req_type_bcst_twt_recom;
8150
static int hf_ieee80211_tag_twt_req_type_aligned;
8151
8152
static int hf_ieee80211_tag_twt_ndp_paging_field;
8153
static int hf_ieee80211_tag_twt_ndp_paging_p_id;
8154
static int hf_ieee80211_tag_twt_ndp_max_ndp_paging_period;
8155
static int hf_ieee80211_tag_twt_ndp_partial_tsf_offset;
8156
static int hf_ieee80211_tag_twt_ndp_action;
8157
static int hf_ieee80211_tag_twt_ndp_min_sleep_duration;
8158
static int hf_ieee80211_tag_twt_ndp_reserved;
8159
static int hf_ieee80211_tag_twt_link_id_bitmap;
8160
static int hf_ieee80211_tag_twt_aligned_twt_link_bitmap;
8161
static int hf_ieee80211_tag_twt_broadcast_info;
8162
static int hf_ieee80211_tag_twt_bcast_info_persistence;
8163
static int hf_ieee80211_tag_twt_bcast_info_id;
8164
static int hf_ieee80211_tag_twt_bcast_info_rtwt_traffic_present;
8165
static int hf_ieee80211_tag_twt_bcast_info_rtwt_sche_info;
8166
static int hf_ieee80211_tag_twt_traffic_info_control;
8167
static int hf_ieee80211_tag_twt_traffic_info_dl_bitmap_valid;
8168
static int hf_ieee80211_tag_twt_traffic_info_ul_bitmap_valid;
8169
static int hf_ieee80211_tag_twt_traffic_info_reserved;
8170
static int hf_ieee80211_tag_twt_traffic_info_rtwt_dl_bitmap;
8171
static int hf_ieee80211_tag_twt_traffic_info_rtwt_ul_bitmap;
8172
8173
static int hf_ieee80211_tag_twt_target_wake_time;
8174
static int hf_ieee80211_tag_twt_target_wake_time_short;
8175
static int hf_ieee80211_tag_twt_nom_min_twt_wake_dur;
8176
static int hf_ieee80211_tag_twt_wake_interval_mantissa;
8177
static int hf_ieee80211_tag_twt_channel;
8178
8179
static int hf_ieee80211_tag_rsnx;
8180
/* octet 1 */
8181
static int hf_ieee80211_tag_rsnx_length;
8182
static int hf_ieee80211_tag_rsnx_protected_twt_operations_support;
8183
static int hf_ieee80211_tag_rsnx_sae_hash_to_element;
8184
static int hf_ieee80211_tag_rsnx_sae_pk;
8185
static int hf_ieee80211_tag_rsnx_protected_wur_frame_support;
8186
/* octet 2 */
8187
static int hf_ieee80211_tag_rsnx_secure_ltf_support;
8188
static int hf_ieee80211_tag_rsnx_secure_rtt_supported;
8189
static int hf_ieee80211_tag_rsnx_urnm_mfpr_x20;
8190
static int hf_ieee80211_tag_rsnx_protected_announce_support;
8191
static int hf_ieee80211_tag_rsnx_pbac;
8192
static int hf_ieee80211_tag_rsnx_extended_s1g_action_protection;
8193
static int hf_ieee80211_tag_rsnx_spp_amsdu_capable;
8194
static int hf_ieee80211_tag_rsnx_urnm_mfpr;
8195
static int hf_ieee80211_tag_rsnx_reserved;
8196
8197
static int hf_ieee80211_wfa_rsn_selection;
8198
static int hf_ieee80211_wfa_rsn_or_link_kde_link_id;
8199
8200
static int hf_ieee80211_nonap_sta_regulatory_conn;
8201
static int hf_ieee80211_nonap_sta_regu_conn_indoor_ap_valid;
8202
static int hf_ieee80211_nonap_sta_regu_conn_indoor_ap;
8203
static int hf_ieee80211_nonap_sta_regu_conn_sp_ap_valid;
8204
static int hf_ieee80211_nonap_sta_regu_conn_sp_ap;
8205
static int hf_ieee80211_nonap_sta_regu_conn_reserved;
8206
8207
static int hf_ieee80211_tag_channel_usage_mode;
8208
8209
static int hf_ieee80211_ff_count;
8210
8211
/* ************************************************************************* */
8212
/*                              RFC 8110 fields                              */
8213
/* ************************************************************************* */
8214
static int hf_ieee80211_owe_dh_parameter_group;
8215
static int hf_ieee80211_owe_dh_parameter_public_key;
8216
8217
/* ************************************************************************* */
8218
/*                               Protocol trees                              */
8219
/* ************************************************************************* */
8220
static int ett_80211;
8221
static int ett_proto_flags;
8222
static int ett_cap_tree;
8223
static int ett_fc_tree;
8224
static int ett_cntrl_wrapper_fc;
8225
static int ett_cntrl_wrapper_payload;
8226
static int ett_fragments;
8227
static int ett_fragment;
8228
static int ett_block_ack;
8229
static int ett_block_ack_tid;
8230
static int ett_block_ack_request_control;
8231
static int ett_block_ack_bitmap;
8232
static int ett_block_ack_request_multi_sta_aid_tid;
8233
static int ett_multi_sta_block_ack;
8234
static int ett_ath_cap_tree;
8235
static int ett_extreme_mesh_services_tree;
8236
static int ett_addr;
8237
8238
static int ett_80211_mgt;
8239
static int ett_fixed_parameters;
8240
static int ett_tagged_parameters;
8241
static int ett_tag_bmapctl_tree;
8242
static int ett_s1g_pvb_tree;
8243
static int ett_s1g_pvb_eb_tree;
8244
static int ett_s1g_pvb_block_control_byte;
8245
static int ett_s1g_pvb_block_bitmap_tree;
8246
static int ett_s1g_pvb_subblock_tree;
8247
static int ett_s1g_pvb_olb_tree;
8248
static int ett_s1g_pvb_olb_subblock;
8249
static int ett_s1g_pvb_ade_tree;
8250
static int ett_s1g_pvb_ade_control;
8251
static int ett_tag_country_fnm_tree;
8252
static int ett_tag_country_rcc_tree;
8253
static int ett_qos_parameters;
8254
static int ett_qos_ps_buf_state;
8255
static int ett_wep_parameters;
8256
static int ett_msh_control;
8257
static int ett_hwmp_targ_flags_tree;
8258
static int ett_mesh_chswitch_flag_tree;
8259
static int ett_mesh_config_cap_tree;
8260
static int ett_mesh_formation_info_tree;
8261
static int ett_bcn_timing_rctrl_tree;
8262
static int ett_bcn_timing_info_tree;
8263
static int ett_gann_flags_tree;
8264
static int ett_pxu_proxy_info_tree;
8265
static int ett_pxu_proxy_info_flags_tree;
8266
8267
static int ett_rsn_gcs_tree;
8268
static int ett_rsn_pcs_tree;
8269
static int ett_rsn_sub_pcs_tree;
8270
static int ett_rsn_akms_tree;
8271
static int ett_rsn_sub_akms_tree;
8272
static int ett_rsn_cap_tree;
8273
static int ett_rsn_pmkid_tree;
8274
static int ett_rsn_gmcs_tree;
8275
8276
static int ett_kde_mlo_link_info;
8277
8278
static int ett_wpa_mcs_tree;
8279
static int ett_wpa_ucs_tree;
8280
static int ett_wpa_sub_ucs_tree;
8281
static int ett_wpa_akms_tree;
8282
static int ett_wpa_sub_akms_tree;
8283
static int ett_wme_ac;
8284
static int ett_wme_aci_aifsn;
8285
static int ett_wme_ecw;
8286
static int ett_wme_qos_info;
8287
8288
static int ett_update_edca_info;
8289
8290
static int ett_ht_cap_tree;
8291
static int ett_ampduparam_tree;
8292
static int ett_mcsset_tree;
8293
static int ett_mcsbit_tree;
8294
static int ett_htex_cap_tree;
8295
static int ett_txbf_tree;
8296
static int ett_antsel_tree;
8297
static int ett_hta_cap_tree;
8298
static int ett_hta_cap1_tree;
8299
static int ett_hta_cap2_tree;
8300
8301
static int ett_s1g_ndp;
8302
static int ett_s1g_ndp_ack;
8303
static int ett_s1g_ndp_cts;
8304
static int ett_s1g_ndp_cf_end;
8305
static int ett_s1g_ndp_ps_poll;
8306
static int ett_s1g_ndp_ps_poll_ack;
8307
static int ett_s1g_ndp_block_ack;
8308
static int ett_s1g_ndp_beamforming_report_poll;
8309
static int ett_s1g_ndp_paging;
8310
static int ett_s1g_ndp_probe;
8311
static int ett_pv1_sid;
8312
static int ett_pv1_sid_field;
8313
static int ett_pv1_seq_control;
8314
static int ett_ieee80211_s1g_capabilities_info;
8315
static int ett_ieee80211_s1g_capabilities;
8316
static int ett_s1g_cap_byte1;
8317
static int ett_s1g_cap_byte2;
8318
static int ett_s1g_cap_byte3;
8319
static int ett_s1g_cap_byte4;
8320
static int ett_s1g_cap_byte5;
8321
static int ett_s1g_cap_byte6;
8322
static int ett_s1g_cap_byte7;
8323
static int ett_s1g_cap_byte8;
8324
static int ett_s1g_cap_byte9;
8325
static int ett_s1g_cap_byte10;
8326
static int ett_ieee80211_s1g_sup_mcs_and_nss_set;
8327
static int ett_s1g_mcs_and_mcs_set;
8328
static int ett_s1g_operation_info;
8329
static int ett_s1g_channel_width;
8330
static int ett_s1g_subchannel_selective_transmission;
8331
static int ett_s1g_raw_assignment;
8332
static int ett_s1g_raw_assn_tree;
8333
static int ett_s1g_raw_control;
8334
static int ett_s1g_raw_slot_def;
8335
static int ett_s1g_raw_group_subfield;
8336
static int ett_s1g_raw_channel_indication;
8337
static int ett_s1g_page_slice_control;
8338
static int ett_s1g_aid_request_mode;
8339
static int ett_s1g_aid_characteristic;
8340
static int ett_s1g_sector_operation;
8341
static int ett_tack_info;
8342
static int ett_ieee80211_s1g_auth_control;
8343
static int ett_s1g_relay_control;
8344
static int ett_s1g_relay_function;
8345
static int ett_ieee80211_s1g_addr_list;
8346
static int ett_ieee80211_s1g_reach_addr;
8347
static int ett_s1g_relay_discovery_control;
8348
static int ett_ieee80211_s1g_aid_entry;
8349
static int ett_s1g_probe_resp_subfield_0;
8350
static int ett_s1g_header_comp_control;
8351
static int ett_pv1_mgmt_action;
8352
static int ett_pv1_mgmt_action_no_ack;
8353
static int ett_pv1_cntl_stack;
8354
static int ett_pv1_cntl_bat;
8355
8356
static int ett_htc_tree;
8357
static int ett_htc_he_a_control;
8358
static int ett_mfb_subtree;
8359
static int ett_lac_subtree;
8360
static int ett_ieee80211_buffer_status_report;
8361
static int ett_ieee80211_a_control_padding;
8362
static int ett_ieee80211_a_control_ones;
8363
static int ett_ieee80211_triggered_response_schedule;
8364
static int ett_ieee80211_control_om;
8365
static int ett_ieee80211_hla_control;
8366
static int ett_ieee80211_control_uph;
8367
static int ett_ieee80211_buffer_control_bqr;
8368
static int ett_ieee80211_control_cci;
8369
static int ett_ieee80211_control_eht_om;
8370
static int ett_ieee80211_control_srs;
8371
static int ett_ieee80211_control_aar;
8372
8373
static int ett_vht_cap_tree;
8374
static int ett_vht_mcsset_tree;
8375
static int ett_vht_rx_mcsbit_tree;
8376
static int ett_vht_tx_mcsbit_tree;
8377
static int ett_vht_basic_mcsbit_tree;
8378
static int ett_vht_op_tree;
8379
static int ett_vht_tpe_info_tree;
8380
static int ett_tpe_psd;
8381
8382
static int ett_vht_ranging_annc;
8383
static int ett_ndp_ranging_annc_sta_info;
8384
8385
static int ett_ff_he_action;
8386
static int ett_ff_protected_he_action;
8387
static int ett_ff_protected_eht_action;
8388
static int ett_ff_he_mimo_control;
8389
static int ett_ff_he_mimo_beamforming_report_snr;
8390
static int ett_ff_he_mimo_feedback_matrices;
8391
8392
static int ett_ff_vhtmimo_cntrl;
8393
static int ett_ff_vhtmimo_beamforming_report;
8394
static int ett_ff_vhtmimo_beamforming_report_snr;
8395
static int ett_ff_vhtmimo_beamforming_angle;
8396
static int ett_ff_vhtmimo_beamforming_report_feedback_matrices;
8397
static int ett_ff_vhtmu_exclusive_beamforming_report_matrices;
8398
8399
static int ett_vht_grpidmgmt;
8400
static int ett_vht_msa;
8401
static int ett_vht_upa;
8402
8403
static int ett_ht_operation_info_delimiter1_tree;
8404
static int ett_ht_operation_info_delimiter2_tree;
8405
static int ett_ht_operation_info_delimiter3_tree;
8406
8407
static int ett_ff_ftm_param_delim1;
8408
static int ett_ff_ftm_param_delim2;
8409
static int ett_ff_ftm_param_delim3;
8410
static int ett_ff_ftm_tod_err1;
8411
static int ett_ff_ftm_toa_err1;
8412
static int ett_tag_ranging;
8413
static int ett_tag_ranging_ntb;
8414
static int ett_tag_ranging_secure_he_ltf;
8415
8416
static int ett_ranging_subelement_tree;
8417
8418
static int ett_tag_direct_meas_results;
8419
8420
static int ett_rsta_avail_header;
8421
static int ett_rsta_avail_tree;
8422
static int ett_rsta_avail_subfield;
8423
8424
static int ett_pasn_parameters;
8425
static int ett_pasn_comeback_tree;
8426
8427
static int ett_pasn_auth_frame;
8428
8429
/* 802.11be trees */
8430
static int ett_eht_multi_link_control;
8431
static int ett_eht_multi_link_common_info;
8432
static int ett_eht_multi_link_common_info_link_id;
8433
static int ett_eht_multi_link_common_info_medium_sync;
8434
static int ett_eht_multi_link_common_info_eml_capa;
8435
static int ett_eht_multi_link_common_info_mld_capa;
8436
static int ett_eht_multi_link_common_info_ext_mld_capa;
8437
static int ett_eht_multi_link_per_sta;
8438
static int ett_eht_multi_link_subelt;
8439
static int ett_eht_multi_link_sta_control;
8440
static int ett_eht_multi_link_per_sta_info;
8441
static int ett_eht_multi_link_sta_dtim;
8442
static int ett_eht_multi_link_reconf_oper_param;
8443
static int ett_eht_multi_link_reconfig_presence_indi;
8444
static int ett_eht_multi_link_reconfig_operation_para_info;
8445
static int ett_eht_operation_params;
8446
static int ett_eht_operation_control;
8447
static int ett_eht_mac_capa;
8448
static int ett_eht_phy_capa;
8449
static int ett_eht_phy_bits_0_15;
8450
static int ett_eht_phy_bits_16_31;
8451
static int ett_eht_phy_bits_32_39;
8452
static int ett_eht_phy_bits_40_63;
8453
static int ett_eht_phy_bits_64_71;
8454
static int ett_eht_phy_mcs_nss;
8455
static int ett_eht_phy_mcs_nss_set;
8456
static int ett_eht_ttl_mapping;
8457
static int ett_eht_ttl_mapping_link_mapping;
8458
static int ett_eht_eht_multi_link_tc;
8459
static int ett_eht_qos_characteristics;
8460
static int ett_eht_aid_bmapctl_tree;
8461
static int ett_eht_bw_indication_param;
8462
static int ett_eht_eml_control;
8463
static int ett_eht_eml_control_link_map;
8464
static int ett_eht_eml_control_mcs_map_count;
8465
static int ett_eht_emlsr_para_update;
8466
static int ett_eht_mimo_ctrl;
8467
static int ett_eht_beamforming_rpt_ru_index;
8468
static int ett_eht_beamforming_feedback_tree;
8469
static int ett_ff_eht_mimo_beamforming_report_snr;
8470
static int ett_ff_eht_mimo_mu_exclusive_report;
8471
static int ett_eht_mu_exclusive_beamforming_rpt_ru_index;
8472
static int ett_eht_reconfig_status_list;
8473
static int ett_eht_group_key_data;
8474
8475
static int ett_tag_measure_request_mode_tree;
8476
static int ett_tag_measure_request_type_tree;
8477
static int ett_tag_measure_request_sub_element_tree;
8478
static int ett_tag_measure_report_mode_tree;
8479
static int ett_tag_measure_report_type_tree;
8480
static int ett_tag_measure_report_basic_map_tree;
8481
static int ett_tag_measure_report_rpi_tree;
8482
static int ett_tag_measure_report_frame_tree;
8483
static int ett_tag_measure_report_sub_element_tree;
8484
static int ett_tag_measure_reported_frame_tree;
8485
static int ett_tag_measure_reported_frame_frag_id_tree;
8486
static int ett_tag_measure_reported_lci_z_tree;
8487
static int ett_tag_measure_reported_lci_urp_tree;
8488
static int ett_tag_bss_bitmask_tree;
8489
static int ett_tag_dfs_map_tree;
8490
static int ett_tag_dfs_map_flags_tree;
8491
static int ett_tag_erp_info_tree;
8492
static int ett_tag_ex_cap1;
8493
static int ett_tag_ex_cap2;
8494
static int ett_tag_ex_cap3;
8495
static int ett_tag_ex_cap4;
8496
static int ett_tag_ex_cap5;
8497
static int ett_tag_ex_cap6;
8498
static int ett_tag_ex_cap7;
8499
static int ett_tag_ex_cap8;
8500
static int ett_tag_ex_cap89;
8501
static int ett_tag_ex_cap10;
8502
static int ett_tag_ex_cap11;
8503
static int ett_tag_ex_cap12;
8504
static int ett_tag_ex_cap13;
8505
static int ett_tag_ex_cap14;
8506
8507
static int ett_tag_rm_cap1;
8508
static int ett_tag_rm_cap2;
8509
static int ett_tag_rm_cap3;
8510
static int ett_tag_rm_cap4;
8511
static int ett_tag_rm_cap5;
8512
8513
static int ett_tag_rsnx_octet1;
8514
static int ett_tag_rsnx_octet2;
8515
8516
static int ett_tag_multiple_bssid_subelem_tree;
8517
static int ett_tag_20_40_bc;
8518
8519
static int ett_tag_intolerant_tree;
8520
8521
static int ett_tag_tclas_mask_tree;
8522
8523
static int ett_tag_supported_channels;
8524
8525
static int ett_tag_neighbor_report_bssid_info_tree;
8526
static int ett_tag_neighbor_report_bssid_info_capability_tree;
8527
static int ett_tag_neighbor_report_subelement_tree;
8528
static int ett_tag_neighbor_report_sub_tag_tree;
8529
8530
static int ett_tag_wapi_param_set_akm_tree;
8531
static int ett_tag_wapi_param_set_ucast_tree;
8532
static int ett_tag_wapi_param_set_mcast_tree;
8533
static int ett_tag_wapi_param_set_preauth_tree;
8534
8535
static int ett_max_idle_period_options;
8536
8537
static int ett_tag_time_adv_tree;
8538
8539
static int ett_tag_he_6ghz_cap_inf_tree;
8540
8541
static int ett_ff_ba_param_tree;
8542
static int ett_ff_ba_ssc_tree;
8543
static int ett_ff_delba_param_tree;
8544
static int ett_ff_qos_info;
8545
static int ett_ff_sm_pwr_save;
8546
static int ett_ff_psmp_param_set;
8547
static int ett_ff_mimo_cntrl;
8548
static int ett_ff_ant_sel;
8549
static int ett_mimo_report;
8550
static int ett_ff_chan_switch_announce;
8551
static int ett_ff_ht_info;
8552
static int ett_ff_psmp_sta_info;
8553
8554
static int ett_tpc;
8555
8556
static int ett_msdu_aggregation_parent_tree;
8557
static int ett_msdu_aggregation_subframe_tree;
8558
8559
static int ett_80211_mgt_ie;
8560
static int ett_tsinfo_tree;
8561
static int ett_sched_tree;
8562
8563
static int ett_fcs;
8564
8565
static int ett_hs20_osu_providers_list;
8566
static int ett_hs20_osu_provider_tree;
8567
static int ett_hs20_friendly_names_list;
8568
static int ett_hs20_friendly_name_tree;
8569
static int ett_hs20_osu_provider_method_list;
8570
static int ett_osu_icons_avail_list;
8571
static int ett_hs20_osu_icon_tree;
8572
static int ett_hs20_osu_service_desc_list;
8573
static int ett_hs20_osu_service_desc_tree;
8574
static int ett_hs20_venue_url;
8575
static int ett_hs20_advice_of_charge;
8576
static int ett_hs20_aoc_plan;
8577
8578
static int ett_hs20_ofn_tree;
8579
8580
static int ett_adv_proto;
8581
static int ett_adv_proto_tuple;
8582
static int ett_gas_query;
8583
static int ett_gas_anqp;
8584
static int ett_nai_realm;
8585
static int ett_nai_realm_eap;
8586
static int ett_tag_ric_data_desc_ie;
8587
static int ett_anqp_vendor_capab;
8588
8589
static int ett_osen_group_data_cipher_suite;
8590
static int ett_osen_pairwise_cipher_suites;
8591
static int ett_osen_pairwise_cipher_suite;
8592
static int ett_osen_akm_cipher_suites;
8593
static int ett_osen_akm_cipher_suite;
8594
static int ett_osen_rsn_cap_tree;
8595
static int ett_osen_pmkid_list;
8596
static int ett_osen_pmkid_tree;
8597
static int ett_osen_group_management_cipher_suite;
8598
8599
static int ett_hs20_cc_proto_port_tuple;
8600
8601
static int ett_tag_no_bssid_capability_dmg_bss_control_tree;
8602
static int ett_ssid_list;
8603
8604
static int ett_sgdsn;
8605
static int ett_nintendo;
8606
8607
static int ett_routerboard;
8608
8609
static int ett_meru;
8610
8611
static int ett_wisun_gtkl;
8612
static int ett_wisun_lgtkl;
8613
8614
static int ett_qos_map_set_exception;
8615
static int ett_qos_map_set_range;
8616
8617
static int ett_wnm_notif_subelt;
8618
8619
static int ett_ieee80211_3gpp_plmn;
8620
8621
static int ett_mbo_oce_attr;
8622
static int ett_mbo_ap_cap;
8623
static int ett_oce_cap;
8624
static int ett_oce_metrics_cap;
8625
8626
static int ett_tag_mobility_domain_ft_capab_tree;
8627
8628
static int ett_tag_ft_mic_control_tree;
8629
static int ett_tag_ft_subelem_tree;
8630
8631
static int ett_qos_mgmt_pol_capa;
8632
static int ett_qos_mgmt_attributes;
8633
static int ett_qos_mgmt_dscp_policy_capabilities;
8634
static int ett_qos_mgmt_dscp_policy;
8635
static int ett_qos_mgmt_tclas;
8636
static int ett_qos_mgmt_domain_name;
8637
static int ett_qos_mgmt_unknown_attribute;
8638
static int ett_dscp_policy_status_list;
8639
static int ett_pol_rqst_cont_tree;
8640
static int ett_pol_resp_cont_tree;
8641
8642
static expert_field ei_ieee80211_bad_length;
8643
static expert_field ei_ieee80211_inv_val;
8644
static expert_field ei_ieee80211_vht_tpe_pwr_info_count;
8645
static expert_field ei_ieee80211_vht_tpe_pwr_info_unit;
8646
static expert_field ei_ieee80211_ff_query_response_length;
8647
static expert_field ei_ieee80211_ff_anqp_nai_realm_eap_len;
8648
static expert_field ei_hs20_anqp_nai_hrq_length;
8649
static expert_field ei_ieee80211_extra_data;
8650
static expert_field ei_ieee80211_tag_data;
8651
static expert_field ei_ieee80211_tdls_setup_confirm_malformed;
8652
static expert_field ei_ieee80211_ff_anqp_nai_field_len;
8653
static expert_field ei_ieee80211_rsn_pcs_count;
8654
static expert_field ei_ieee80211_tag_measure_request_unknown;
8655
static expert_field ei_ieee80211_tag_measure_request_beacon_unknown;
8656
static expert_field ei_ieee80211_tag_measure_report_unknown;
8657
static expert_field ei_ieee80211_tag_measure_report_beacon_unknown;
8658
static expert_field ei_ieee80211_tag_measure_report_lci_unknown;
8659
static expert_field ei_ieee80211_tag_number;
8660
static expert_field ei_ieee80211_ff_anqp_info_length;
8661
static expert_field ei_hs20_anqp_ofn_length;
8662
static expert_field ei_ieee80211_tdls_setup_response_malformed;
8663
static expert_field ei_ieee80211_ff_anqp_capability;
8664
static expert_field ei_ieee80211_not_enough_room_for_anqp_header;
8665
static expert_field ei_ieee80211_ff_query_request_length;
8666
static expert_field ei_ieee80211_wfa_ie_wme_qos_info_bad_ftype;
8667
static expert_field ei_ieee80211_qos_info_bad_ftype;
8668
static expert_field ei_ieee80211_qos_bad_aifsn;
8669
static expert_field ei_ieee80211_pmkid_count_too_large;
8670
static expert_field ei_ieee80211_ff_anqp_venue_length;
8671
static expert_field ei_ieee80211_ff_anqp_roaming_consortium_oi_len;
8672
static expert_field ei_ieee80211_tag_length;
8673
static expert_field ei_ieee80211_missing_data;
8674
static expert_field ei_ieee80211_rsn_pmkid_count;
8675
static expert_field ei_ieee80211_fc_retry;
8676
static expert_field ei_ieee80211_tag_wnm_sleep_mode_no_key_data;
8677
static expert_field ei_ieee80211_dmg_subtype;
8678
static expert_field ei_ieee80211_vht_action;
8679
static expert_field ei_ieee80211_mesh_peering_unexpected;
8680
static expert_field ei_ieee80211_fcs;
8681
static expert_field ei_ieee80211_mismatched_akm_suite;
8682
static expert_field ei_ieee80211_vs_routerboard_unexpected_len;
8683
static expert_field ei_ieee80211_vs_sgdsn_serialnumber_invalid_len_val;
8684
static expert_field ei_ieee80211_vs_sgdsn_serialnumber_unexpected_len_val;
8685
static expert_field ei_ieee80211_twt_tear_down_bad_neg_type;
8686
static expert_field ei_ieee80211_twt_setup_bad_command;
8687
static expert_field ei_ieee80211_twt_bcast_info_no_term;
8688
static expert_field ei_ieee80211_invalid_control_word;
8689
static expert_field ei_ieee80211_invalid_control_id;
8690
static expert_field ei_ieee80211_invalid_control_length;
8691
static expert_field ei_ieee80211_wfa_60g_attr_len_invalid;
8692
static expert_field ei_ieee80211_wfa_60g_unknown_attribute;
8693
static expert_field ei_ieee80211_htc_in_dmg_packet;
8694
static expert_field ei_ieee80211_eht_invalid_subelement;
8695
static expert_field ei_ieee80211_eht_invalid_action;
8696
static expert_field ei_ieee80211_eht_invalid_multi_link;
8697
static expert_field ei_ieee80211_eht_invalid_nc_nr;
8698
8699
8700
/* 802.11ad trees */
8701
static int ett_dynamic_alloc_tree;
8702
static int ett_ssw_tree;
8703
static int ett_bf_tree;
8704
static int ett_sswf_tree;
8705
static int ett_brp_tree;
8706
static int ett_blm_tree;
8707
static int ett_bic_tree;
8708
static int ett_dmg_params_tree;
8709
static int ett_cc_tree;
8710
static int ett_rcsi_tree;
8711
static int ett_80211_ext;
8712
static int ett_allocation_tree;
8713
static int ett_sta_info;
8714
8715
static int ett_ieee80211_esp;
8716
8717
static int ett_ieee80211_wfa_60g_attr;
8718
static int ett_ieee80211_wfa_transition_disable_tree;
8719
8720
/* 802.11ah trees */
8721
static int ett_s1g_sync_control_tree;
8722
static int ett_s1g_sector_id_index;
8723
static int ett_s1g_twt_information_control;
8724
static int ett_twt_tear_down_tree;
8725
static int ett_twt_control_field_tree;
8726
static int ett_twt_req_type_tree;
8727
static int ett_twt_ndp_paging_field_tree;
8728
static int ett_twt_broadcast_info_tree;
8729
static int ett_twt_traffic_info_tree;
8730
static int ett_twt_traffic_info_control_tree;
8731
8732
/* 802.11ax trees */
8733
static int ett_he_mac_capabilities;
8734
static int ett_he_phy_capabilities;
8735
static int ett_he_phy_cap_first_byte;
8736
static int ett_he_phy_cap_chan_width_set;
8737
static int ett_he_phy_cap_b8_to_b23;
8738
static int ett_he_phy_cap_b24_to_b39;
8739
static int ett_he_phy_cap_b40_to_b55;
8740
static int ett_he_phy_cap_b56_to_b71;
8741
static int ett_he_phy_cap_b72_to_b87;
8742
static int ett_he_mcs_and_nss_set;
8743
static int ett_he_rx_tx_he_mcs_map_lte_80;
8744
static int ett_he_rx_mcs_map_lte_80;
8745
static int ett_he_tx_mcs_map_lte_80;
8746
static int ett_he_rx_tx_he_mcs_map_160;
8747
static int ett_he_rx_mcs_map_160;
8748
static int ett_he_tx_mcs_map_160;
8749
static int ett_he_rx_tx_he_mcs_map_80_80;
8750
static int ett_he_rx_mcs_map_80_80;
8751
static int ett_he_tx_mcs_map_80_80;
8752
static int ett_he_ppe_threshold;
8753
static int ett_he_ppe_nss;
8754
static int ett_he_ppe_ru_alloc;
8755
static int ett_he_uora_tree;
8756
static int ett_he_aic_aifsn;
8757
static int ett_he_spatial_reuse_control;
8758
static int ett_he_bss_new_color_info;
8759
static int ett_he_ess_report_info_field;
8760
static int ett_he_operation_params;
8761
static int ett_he_bss_color_information;
8762
static int ett_he_oper_basic_mcs;
8763
static int ett_he_operation_vht_op_info;
8764
static int ett_mscs_user_prio;
8765
static int ett_ieee80211_user_prio_bitmap;
8766
static int ett_ieee80211_intra_access_prio;
8767
static int ett_he_operation_6ghz;
8768
static int ett_he_operation_6ghz_control;
8769
static int ett_he_mu_edca_param;
8770
static int ett_he_trigger_common_info;
8771
static int ett_he_trigger_ranging;
8772
static int ett_he_trigger_ranging_poll;
8773
static int ett_he_trigger_packet_extension;
8774
static int ett_he_trigger_base_common_info;
8775
static int ett_he_trigger_bar_ctrl;
8776
static int ett_he_trigger_bar_info;
8777
static int ett_he_trigger_user_info;
8778
static int ett_he_trigger_base_user_info;
8779
static int ett_he_trigger_dep_basic_user_info;
8780
static int ett_he_trigger_dep_nfrp_user_info;
8781
static int ett_ndp_annc;
8782
static int ett_ndp_vht_annc_sta_list;
8783
static int ett_ndp_vht_annc_sta_info_tree;
8784
static int ett_ndp_he_annc_sta_list;
8785
static int ett_ndp_he_annc_sta_item;
8786
static int ett_ndp_he_annc_sta_info;
8787
static int ett_ndp_ranging_annc_sta_list;
8788
static int ett_ndp_eht_annc_sta_list;
8789
static int ett_ndp_eht_annc_sta_info;
8790
static int ett_non_inheritance_element_id_list;
8791
static int ett_non_inheritance_element_id_ext_list;
8792
8793
/* 802.11ai trees */
8794
static int ett_fils_indication_realm_list;
8795
static int ett_fils_indication_public_key_list;
8796
static int ett_ff_fils_discovery_frame_control;
8797
static int ett_ff_fils_discovery_capability;
8798
static int ett_neighbor_ap_info;
8799
static int ett_tbtt_infos;
8800
static int ett_rnr_bss_params_tree;
8801
static int ett_rnr_mld_params_tree;
8802
8803
static int ett_ff_fils_req_params;
8804
static int ett_ff_fils_req_params_fils_criteria;
8805
8806
static int ett_nonap_sta_regulatory_conn;
8807
8808
static int ett_chan_usage;
8809
8810
/* Generic address HF list for proto_tree_add_mac48_detail() */
8811
static const mac_hf_list_t mac_addr = {
8812
  &hf_ieee80211_addr,
8813
  &hf_ieee80211_addr_resolved,
8814
  &hf_ieee80211_addr_oui,
8815
  &hf_ieee80211_addr_oui_resolved,
8816
  &hf_ieee80211_addr_lg,
8817
  &hf_ieee80211_addr_ig,
8818
};
8819
8820
/* Generic address HF list for proto_tree_add_mac48_detail() --
8821
 * no LG/IG bits */
8822
static const mac_hf_list_t mac_addr_hidden = {
8823
  &hf_ieee80211_addr,
8824
  &hf_ieee80211_addr_resolved,
8825
  &hf_ieee80211_addr_oui,
8826
  &hf_ieee80211_addr_oui_resolved,
8827
  NULL,
8828
  NULL,
8829
};
8830
8831
/* Destination address HF list for proto_tree_add_mac48_detail() */
8832
static const mac_hf_list_t mac_da = {
8833
  &hf_ieee80211_addr_da,
8834
  &hf_ieee80211_addr_da_resolved,
8835
  &hf_ieee80211_addr_da_oui,
8836
  &hf_ieee80211_addr_da_oui_resolved,
8837
  &hf_ieee80211_addr_da_lg,
8838
  &hf_ieee80211_addr_da_ig,
8839
};
8840
8841
/* Source address HF list for proto_tree_add_mac48_detail() */
8842
static const mac_hf_list_t mac_sa = {
8843
  &hf_ieee80211_addr_sa,
8844
  &hf_ieee80211_addr_sa_resolved,
8845
  &hf_ieee80211_addr_sa_oui,
8846
  &hf_ieee80211_addr_sa_oui_resolved,
8847
  &hf_ieee80211_addr_sa_lg,
8848
  &hf_ieee80211_addr_sa_ig,
8849
};
8850
8851
/* Receiver address HF list for proto_tree_add_mac48_detail() */
8852
static const mac_hf_list_t mac_ra = {
8853
  &hf_ieee80211_addr_ra,
8854
  &hf_ieee80211_addr_ra_resolved,
8855
  &hf_ieee80211_addr_ra_oui,
8856
  &hf_ieee80211_addr_ra_oui_resolved,
8857
  &hf_ieee80211_addr_ra_lg,
8858
  &hf_ieee80211_addr_ra_ig,
8859
};
8860
8861
/* Transmitter address HF list for proto_tree_add_mac48_detail() */
8862
static const mac_hf_list_t mac_ta = {
8863
  &hf_ieee80211_addr_ta,
8864
  &hf_ieee80211_addr_ta_resolved,
8865
  &hf_ieee80211_addr_ta_oui,
8866
  &hf_ieee80211_addr_ta_oui_resolved,
8867
  &hf_ieee80211_addr_ta_lg,
8868
  &hf_ieee80211_addr_ta_ig,
8869
};
8870
8871
/* BSSID address HF list for proto_tree_add_mac48_detail() */
8872
static const mac_hf_list_t mac_bssid = {
8873
  &hf_ieee80211_addr_bssid,
8874
  &hf_ieee80211_addr_bssid_resolved,
8875
  &hf_ieee80211_addr_bssid_oui,
8876
  &hf_ieee80211_addr_bssid_oui_resolved,
8877
  &hf_ieee80211_addr_bssid_lg,
8878
  &hf_ieee80211_addr_bssid_ig,
8879
};
8880
8881
/* Station address HF list for proto_tree_add_mac48_detail() */
8882
static const mac_hf_list_t mac_staa = {
8883
  &hf_ieee80211_addr_staa,
8884
  &hf_ieee80211_addr_staa_resolved,
8885
  &hf_ieee80211_addr_staa_oui,
8886
  &hf_ieee80211_addr_staa_oui_resolved,
8887
  &hf_ieee80211_addr_staa_lg,
8888
  &hf_ieee80211_addr_staa_ig,
8889
};
8890
8891
static const fragment_items frag_items = {
8892
  &ett_fragment,
8893
  &ett_fragments,
8894
  &hf_ieee80211_fragments,
8895
  &hf_ieee80211_fragment,
8896
  &hf_ieee80211_fragment_overlap,
8897
  &hf_ieee80211_fragment_overlap_conflict,
8898
  &hf_ieee80211_fragment_multiple_tails,
8899
  &hf_ieee80211_fragment_too_long_fragment,
8900
  &hf_ieee80211_fragment_error,
8901
  &hf_ieee80211_fragment_count,
8902
  &hf_ieee80211_reassembled_in,
8903
  &hf_ieee80211_reassembled_length,
8904
  /* Reassembled data field */
8905
  NULL,
8906
  "fragments"
8907
};
8908
8909
static const enum_val_t wlan_ignore_prot_options[] = {
8910
  { "no",         "No",               WLAN_IGNORE_PROT_NO    },
8911
  { "without_iv", "Yes - without IV", WLAN_IGNORE_PROT_WO_IV },
8912
  { "with_iv",    "Yes - with IV",    WLAN_IGNORE_PROT_W_IV  },
8913
  { NULL,         NULL,               0                     }
8914
};
8915
8916
static int wlan_address_type = -1;
8917
static int wlan_bssid_address_type = -1;
8918
static int wlan_ra_ta_address_type = -1;
8919
static int wlan_aid_address_type = -1;
8920
8921
static int beacon_padding; /* beacon padding bug */
8922
8923
/*
8924
 * Check if we have an S1G STA
8925
 */
8926
static bool
8927
sta_is_s1g(packet_info *pinfo)
8928
10.8k
{
8929
10.8k
  void * data_p;
8930
8931
10.8k
  if (treat_as_s1g)
8932
0
    return true;
8933
8934
10.8k
  data_p = p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_S1G_KEY);
8935
10.8k
  return GPOINTER_TO_INT(data_p);
8936
10.8k
}
8937
8938
static const unsigned char bssid_broadcast_data[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
8939
static address bssid_broadcast;
8940
bool
8941
0
is_broadcast_bssid(const address *bssid) {
8942
0
  return addresses_equal(&bssid_broadcast, bssid);
8943
0
}
8944
8945
static heur_dissector_list_t heur_subdissector_list;
8946
8947
static dissector_handle_t ieee80211_handle;
8948
static dissector_handle_t wlan_withoutfcs_handle;
8949
static dissector_handle_t llc_handle;
8950
static dissector_handle_t epd_llc_handle;
8951
static dissector_handle_t ipx_handle;
8952
static dissector_handle_t eth_withoutfcs_handle;
8953
8954
static capture_dissector_handle_t llc_cap_handle;
8955
static capture_dissector_handle_t ipx_cap_handle;
8956
8957
static dissector_table_t ethertype_subdissector_table;
8958
static dissector_table_t tagged_field_table;
8959
static dissector_table_t vendor_specific_action_table;
8960
static dissector_table_t wifi_alliance_action_subtype_table;
8961
static dissector_table_t vendor_specific_anqp_info_table;
8962
static dissector_table_t wifi_alliance_anqp_info_table;
8963
static dissector_table_t wifi_alliance_ie_table;
8964
static dissector_table_t wifi_alliance_public_action_table;
8965
8966
static int wlan_tap;
8967
8968
static const value_string access_network_type_vals[] = {
8969
  {  0, "Private network" },
8970
  {  1, "Private network with guest access" },
8971
  {  2, "Chargeable public network" },
8972
  {  3, "Free public network" },
8973
  {  4, "Personal device network" },
8974
  {  5, "Emergency services only network" },
8975
  { 14, "Test or experimental" },
8976
  { 15, "Wildcard" },
8977
  { 0, NULL }
8978
};
8979
8980
static const value_string adv_proto_id_vals[] = {
8981
  {  0, "Access Network Query Protocol"},
8982
  {  1, "MIH Information Service"},
8983
  {  2, "MIH Command and Event Services Capability Discovery"},
8984
  {  3, "Emergency Alert System (EAS)"},
8985
  {  4, "Location-to-Service Translation Protocol"},
8986
  {221, "Vendor Specific"},
8987
  {0, NULL}
8988
};
8989
8990
static const value_string timeout_int_types[] = {
8991
  {1, "Reassociation deadline interval (TUs)"},
8992
  {2, "Key lifetime interval (seconds)"},
8993
  {3, "Association Comeback time (TUs)"},
8994
  {4, "Time to start (TUs)"},
8995
  {0, NULL}
8996
};
8997
8998
static const value_string tdls_action_codes[] = {
8999
  {TDLS_SETUP_REQUEST,           "TDLS Setup Request"},
9000
  {TDLS_SETUP_RESPONSE,          "TDLS Setup Response"},
9001
  {TDLS_SETUP_CONFIRM,           "TDLS Setup Confirm"},
9002
  {TDLS_TEARDOWN,                "TDLS Teardown"},
9003
  {TDLS_PEER_TRAFFIC_INDICATION, "TDLS Peer Traffic Indication"},
9004
  {TDLS_CHANNEL_SWITCH_REQUEST,  "TDLS Channel Switch Request"},
9005
  {TDLS_CHANNEL_SWITCH_RESPONSE, "TDLS Channel Switch Response"},
9006
  {TDLS_PEER_PSM_REQUEST,        "TDLS Peer PSM Request"},
9007
  {TDLS_PEER_PSM_RESPONSE,       "TDLS Peer PSM Response"},
9008
  {TDLS_PEER_TRAFFIC_RESPONSE,   "TDLS Peer Traffic Response"},
9009
  {TDLS_DISCOVERY_REQUEST,       "TDLS Discovery Request"},
9010
  {0, NULL}
9011
};
9012
static value_string_ext tdls_action_codes_ext = VALUE_STRING_EXT_INIT(tdls_action_codes);
9013
9014
static const value_string rm_action_codes[] = {
9015
  {RM_ACTION_RADIO_MEASUREMENT_REQUEST,   "Radio Measurement Request"},
9016
  {RM_ACTION_RADIO_MEASUREMENT_REPORT,    "Radio Measurement Report"},
9017
  {RM_ACTION_LINK_MEASUREMENT_REQUEST,    "Link Measurement Request"},
9018
  {RM_ACTION_LINK_MEASUREMENT_REPORT,     "Link Measurement Report"},
9019
  {RM_ACTION_NEIGHBOR_REPORT_REQUEST,     "Neighbor Report Request"},
9020
  {RM_ACTION_NEIGHBOR_REPORT_RESPONSE,    "Neighbor Report Response"},
9021
  {0, NULL}
9022
};
9023
static value_string_ext rm_action_codes_ext = VALUE_STRING_EXT_INIT(rm_action_codes);
9024
9025
static const val64_string number_of_taps_values[] = {
9026
  {0x0, "1 tap"},
9027
  {0x1, "5 taps"},
9028
  {0x2, "15 taps"},
9029
  {0x3, "63 taps"},
9030
  {0, NULL}
9031
};
9032
9033
80
#define PSMP_STA_INFO_BROADCAST 0
9034
27
#define PSMP_STA_INFO_MULTICAST 1
9035
39
#define PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED 2
9036
9037
216
#define PSMP_STA_INFO_FLAG_TYPE         0x00000003
9038
14
#define PSMP_STA_INFO_FLAG_DTT_START    0x00001FFC
9039
14
#define PSMP_STA_INFO_FLAG_DTT_DURATION 0x001FE000
9040
9041
14
#define PSMP_STA_INFO_FLAG_STA_ID       0x001FFFE0
9042
9043
14
#define PSMP_STA_INFO_FLAG_UTT_START    0x0000FFE0
9044
14
#define PSMP_STA_INFO_FLAG_UTT_DURATION 0x03FF0000
9045
9046
14
#define PSMP_STA_INFO_FLAG_IA_RESERVED  0xFC000000
9047
9048
static const value_string ff_psmp_sta_info_flags[] = {
9049
  { PSMP_STA_INFO_BROADCAST,              "Broadcast"},
9050
  { PSMP_STA_INFO_MULTICAST,              "Multicast"},
9051
  { PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED, "Individually Addressed"},
9052
  {0, NULL}
9053
};
9054
9055
static const char*
9056
wlan_conv_get_filter_type(conv_item_t* conv, conv_filter_type_e filter)
9057
0
{
9058
0
    if ((filter == CONV_FT_SRC_ADDRESS) && (conv->src_address.type == wlan_address_type))
9059
0
        return "wlan.sa";
9060
9061
0
    if ((filter == CONV_FT_DST_ADDRESS) && (conv->dst_address.type == wlan_address_type))
9062
0
        return "wlan.da";
9063
9064
0
    if ((filter == CONV_FT_ANY_ADDRESS) && (conv->src_address.type == wlan_address_type))
9065
0
        return "wlan.addr";
9066
9067
0
    return CONV_FILTER_INVALID;
9068
0
}
9069
9070
static ct_dissector_info_t wlan_ct_dissector_info = {&wlan_conv_get_filter_type};
9071
9072
static tap_packet_status
9073
wlan_conversation_packet(void *pct, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip, tap_flags_t flags)
9074
0
{
9075
0
  conv_hash_t *hash = (conv_hash_t*) pct;
9076
0
  hash->flags = flags;
9077
0
  const wlan_hdr_t *whdr=(const wlan_hdr_t *)vip;
9078
0
  tap_packet_status status = TAP_PACKET_DONT_REDRAW;
9079
9080
0
  if ((whdr->src.type != AT_NONE) && (whdr->dst.type != AT_NONE)) {
9081
0
    add_conversation_table_data(hash, &whdr->src, &whdr->dst, 0, 0, 1, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->abs_ts, &wlan_ct_dissector_info, CONVERSATION_NONE);
9082
9083
0
    status = TAP_PACKET_REDRAW;
9084
0
  }
9085
9086
0
  return status;
9087
0
}
9088
9089
static const char*
9090
wlan_endpoint_get_filter_type(endpoint_item_t* endpoint, conv_filter_type_e filter)
9091
0
{
9092
0
  if ((filter == CONV_FT_ANY_ADDRESS) && (endpoint->myaddress.type == wlan_address_type))
9093
0
    return "wlan.addr";
9094
9095
0
  return CONV_FILTER_INVALID;
9096
0
}
9097
9098
static et_dissector_info_t wlan_endpoint_dissector_info = {&wlan_endpoint_get_filter_type};
9099
9100
static tap_packet_status
9101
wlan_endpoint_packet(void *pit, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip, tap_flags_t flags)
9102
0
{
9103
0
  conv_hash_t *hash = (conv_hash_t*) pit;
9104
0
  hash->flags = flags;
9105
0
  const wlan_hdr_t *whdr=(const wlan_hdr_t *)vip;
9106
0
  tap_packet_status status = TAP_PACKET_DONT_REDRAW;
9107
9108
  /* Take two "add" passes per packet, adding for each direction, ensures that all
9109
  packets are counted properly (even if address is sending to itself)
9110
  XXX - this could probably be done more efficiently inside endpoint_table */
9111
0
  if (whdr->src.type != AT_NONE) {
9112
0
    add_endpoint_table_data(hash, &whdr->src, 0, true, 1, pinfo->fd->pkt_len, &wlan_endpoint_dissector_info, ENDPOINT_NONE);
9113
0
    status = TAP_PACKET_REDRAW;
9114
0
  }
9115
9116
0
  if (whdr->dst.type != AT_NONE) {
9117
0
    add_endpoint_table_data(hash, &whdr->dst, 0, false, 1, pinfo->fd->pkt_len, &wlan_endpoint_dissector_info, ENDPOINT_NONE);
9118
0
    status = TAP_PACKET_REDRAW;
9119
0
  }
9120
9121
0
  return status;
9122
0
}
9123
9124
static const char*
9125
wlan_col_filter_str(const address* addr _U_, bool is_src)
9126
0
{
9127
0
  if (is_src)
9128
0
    return "wlan.sa";
9129
9130
0
  return "wlan.da";
9131
0
}
9132
9133
static const char*
9134
wlan_bssid_col_filter_str(const address* addr _U_, bool is_src _U_)
9135
0
{
9136
0
  return "wlan.bssid";
9137
0
}
9138
9139
static const char*
9140
wlan_ra_ta_col_filter_str(const address* addr _U_, bool is_src)
9141
0
{
9142
0
  if (is_src)
9143
0
    return "wlan.ta";
9144
9145
0
  return "wlan.ra";
9146
0
}
9147
9148
static const char*
9149
wlan_aid_col_filter_str(const address* addr _U_, bool is_src _U_)
9150
0
{
9151
0
  return "wlan.fc.sid.association_id";
9152
0
}
9153
9154
static void
9155
beacon_interval_base_custom(char *result, uint32_t beacon_interval)
9156
0
{
9157
0
  double temp_double;
9158
9159
0
  temp_double = (double)beacon_interval;
9160
0
  snprintf(result, ITEM_LABEL_LENGTH, "%f [Seconds]", (temp_double * 1024 / 1000000));
9161
0
}
9162
9163
static void
9164
allocation_duration_base_custom(char *result, uint32_t allocation_duration)
9165
0
{
9166
0
  double temp_double;
9167
9168
0
  temp_double = (double)allocation_duration;
9169
0
  snprintf(result, ITEM_LABEL_LENGTH, "%f [Seconds]", (temp_double / 1000000));
9170
0
}
9171
9172
static void
9173
extra_one_base_custom(char *result, uint32_t value)
9174
6
{
9175
6
  snprintf(result, ITEM_LABEL_LENGTH, "%d", value+1);
9176
6
}
9177
9178
static void
9179
extra_one_mul_two_base_custom(char *result, uint32_t value)
9180
0
{
9181
0
  snprintf(result, ITEM_LABEL_LENGTH, "%d", (value+1)*2);
9182
0
}
9183
9184
static void
9185
rcpi_and_power_level_custom(char *result, uint8_t value)
9186
0
{
9187
  /* 802.11-2016 section 9.4.2.38
9188
     RCPI = |2 x (P + 110)| in steps of 0.5 dB */
9189
9190
0
  if (value == 0)
9191
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d (P < -109.5 dBm)", value);
9192
0
  else if (value == 220)
9193
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d (P >= 0 dBm)", value);
9194
0
  else if (value < 220)
9195
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d (P = %.1f dBm)", value, ((double)value) / 2 - 110);
9196
0
  else if (value < 255)
9197
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d (Reserved)", value);
9198
0
  else
9199
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d (Measurement not available)", value);
9200
0
}
9201
9202
static void
9203
sts_custom(char *result, uint32_t value)
9204
0
{
9205
0
  snprintf(result, ITEM_LABEL_LENGTH, "%d STS", value + 1);
9206
0
}
9207
9208
static void
9209
rep_custom(char *result, uint32_t value)
9210
0
{
9211
0
  snprintf(result, ITEM_LABEL_LENGTH, "%u repetition%s (%u)", value + 1, plurality(value + 1, "", "s"), value);
9212
0
}
9213
9214
static void
9215
hundred_us_base_custom(char *result, uint32_t value)
9216
842
{
9217
842
  snprintf(result, ITEM_LABEL_LENGTH, "%0.1f ms (%u)", ((double)value * 100 / 1000), value);
9218
842
}
9219
9220
static void
9221
partial_tsf_custom(char *result, uint32_t value)
9222
842
{
9223
842
  uint32_t shifted = value << 10;
9224
842
  snprintf(result, ITEM_LABEL_LENGTH, "%u %s (%u)", shifted,
9225
842
             unit_name_string_get_value(shifted, &units_microseconds), value);
9226
842
}
9227
9228
/*
9229
 * We use this is displaying the ru allocation region.
9230
 */
9231
static uint8_t global_he_trigger_bw;
9232
9233
static void
9234
he_ru_allocation_base_custom(char *result, uint32_t ru_allocation)
9235
13.6k
{
9236
13.6k
  uint32_t tones = 0;
9237
9238
13.6k
  switch (global_he_trigger_bw) {
9239
4.56k
  case 0:
9240
4.56k
    if (ru_allocation <= 8) {
9241
1.84k
      tones = 26;
9242
1.84k
      break;
9243
1.84k
    }
9244
2.71k
    if (ru_allocation >= 37 && ru_allocation <= 40) {
9245
138
      tones = 52;
9246
138
      break;
9247
138
    }
9248
2.57k
    if (ru_allocation >= 53 && ru_allocation <= 54) {
9249
233
      tones = 106;
9250
233
      break;
9251
233
    }
9252
2.34k
    if (ru_allocation == 61) {
9253
150
      tones = 242;
9254
150
      break;
9255
150
    }
9256
    // error
9257
2.19k
    break;
9258
4.43k
  case 1:
9259
4.43k
    if (ru_allocation <= 17) {
9260
1.25k
      tones = 26;
9261
1.25k
      break;
9262
1.25k
    }
9263
3.18k
    if (ru_allocation >= 37 && ru_allocation <= 44) {
9264
305
      tones = 52;
9265
305
      break;
9266
305
    }
9267
2.88k
    if (ru_allocation >= 53 && ru_allocation <= 56) {
9268
207
      tones = 106;
9269
207
      break;
9270
207
    }
9271
2.67k
    if (ru_allocation >= 61 && ru_allocation <= 62) {
9272
500
      tones = 242;
9273
500
      break;
9274
500
    }
9275
2.17k
    if (ru_allocation == 65) {
9276
191
      tones = 484;
9277
191
      break;
9278
191
    }
9279
    // error
9280
1.98k
    break;
9281
2.81k
  case 2:
9282
    /* fall-through */
9283
4.65k
  case 3:
9284
4.65k
    if (ru_allocation <= 36) {
9285
2.05k
      tones = 26;
9286
2.05k
      break;
9287
2.05k
    }
9288
2.59k
    if (ru_allocation >= 37 && ru_allocation <= 52) {
9289
428
      tones = 52;
9290
428
      break;
9291
428
    }
9292
2.16k
    if (ru_allocation >= 53 && ru_allocation <= 60) {
9293
292
      tones = 106;
9294
292
      break;
9295
292
    }
9296
1.87k
    if (ru_allocation >= 61 && ru_allocation <= 64) {
9297
227
      tones = 242;
9298
227
      break;
9299
227
    }
9300
1.65k
    if (ru_allocation >= 65 && ru_allocation <= 66) {
9301
117
      tones = 484;
9302
117
      break;
9303
117
    }
9304
1.53k
    if (ru_allocation == 67) {
9305
149
      tones = 996;
9306
149
      break;
9307
149
    }
9308
1.38k
    if (ru_allocation == 68 && global_he_trigger_bw == 3) {
9309
186
      tones = 2*996;
9310
186
      break;
9311
186
    }
9312
1.19k
    break;
9313
1.19k
  default:
9314
0
    break;
9315
13.6k
  }
9316
9317
13.6k
  if (tones)
9318
8.27k
    snprintf(result, ITEM_LABEL_LENGTH, "%d (%d tones)", ru_allocation, tones);
9319
5.37k
  else
9320
5.37k
    snprintf(result, ITEM_LABEL_LENGTH, "%d (bogus number of tones)", ru_allocation);
9321
13.6k
}
9322
9323
static void
9324
eht_ru_allocation_base_custom(char *result, uint32_t ru_allocation)
9325
0
{
9326
0
  char *ru_str;
9327
9328
  /* TODO: check with PS160, B0 of RU allocation, BW */
9329
0
  if (ru_allocation <= 36) {
9330
0
    ru_str = "RU size: 26";
9331
0
  } else if (ru_allocation >= 37 && ru_allocation <= 52) {
9332
0
    ru_str = "RU size: 52";
9333
0
  } else if (ru_allocation >= 53 && ru_allocation <= 60) {
9334
0
    ru_str = "RU size: 106";
9335
0
  } else if (ru_allocation >= 61 && ru_allocation <= 64) {
9336
0
    ru_str = "RU size: 242";
9337
0
  } else if (ru_allocation == 65 || ru_allocation == 66) {
9338
0
    ru_str = "RU size: 484";
9339
0
  } else if (ru_allocation == 67) {
9340
0
    ru_str = "RU size: 996";
9341
0
  } else if (ru_allocation == 68) {
9342
0
    ru_str = "RU size: 2x996";
9343
0
  } else if (ru_allocation == 69) {
9344
0
    ru_str = "RU size: 4x996";
9345
0
  } else if (ru_allocation >= 70 && ru_allocation <= 81) {
9346
0
    ru_str = "MRU size: 52+26";
9347
0
  } else if (ru_allocation >= 82 && ru_allocation <= 89) {
9348
0
    ru_str = "MRU size: 106+26";
9349
0
  } else if (ru_allocation >= 90 && ru_allocation <= 93) {
9350
0
    ru_str = "MRU size: 484+242";
9351
0
  } else if (ru_allocation >= 94 && ru_allocation <= 95) {
9352
0
    ru_str = "MRU size: 996+484";
9353
0
  } else if (ru_allocation >= 96 && ru_allocation <= 99) {
9354
0
    ru_str = "MRU size: 996+484+242";
9355
0
  } else if (ru_allocation >= 100 && ru_allocation <= 103) {
9356
0
    ru_str = "MRU size: 2x996+484";
9357
0
  } else if (ru_allocation == 104) {
9358
0
    ru_str = "MRU size: 3x996";
9359
0
  } else if (ru_allocation == 105 || ru_allocation == 106) {
9360
0
    ru_str = "MRU size: 3x996+484";
9361
0
  } else {
9362
0
    ru_str = "Reserved";
9363
0
  }
9364
9365
0
  snprintf(result, ITEM_LABEL_LENGTH, "%d (%s)", ru_allocation, ru_str);
9366
0
}
9367
9368
/*
9369
 * We use this to display the ANSI/CTA-2063 Serial number length
9370
 */
9371
static void
9372
vs_sgdsn_serialnumber_len_custom(char *result, uint32_t val)
9373
0
{
9374
0
  if (val >= 0x30 && val <= 0x39) {
9375
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d byte(s)", val-0x30);
9376
0
  } else if (val >= 0x41 && val <= 0x46) {
9377
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d byte(s)", val-0x37);
9378
0
  } else {
9379
0
    snprintf(result, ITEM_LABEL_LENGTH, "Invalid length: %u", val);
9380
0
  }
9381
0
}
9382
9383
/* ************************************************************************* */
9384
/* Mesh Control field helper functions
9385
 *
9386
 * Per IEEE 802.11s Draft 12.0 section 7.2.2.1:
9387
 *
9388
 * The frame body consists of either:
9389
 * The MSDU (or a fragment thereof), the Mesh Control field (if and only if the
9390
 * frame is transmitted by a mesh STA and the Mesh Control Present subfield of
9391
 * the QoS Control field is 1)...
9392
 *
9393
 * 8.2.4.5.1 "QoS Control field structure", table 8-4, in 802.11-2012,
9394
 * seems to indicate that the bit that means "Mesh Control Present" in
9395
 * frames sent by mesh STAs in a mesh BSS is part of the TXOP Limit field,
9396
 * the AP PS Buffer State field, the TXOP Duration Requested field, or the
9397
 * Queue Size field in some data frames in non-mesh BSSes.
9398
 *
9399
 * We need a statefull sniffer for that.  For now, use heuristics.
9400
 *
9401
 * Notably, only mesh data frames contain the Mesh Control field in the header.
9402
 * Other frames that contain mesh control (i.e., multihop action frames) have
9403
 * it deeper in the frame body where it can be definitively identified.
9404
 * Further, mesh data frames always have to-ds and from-ds either 11 or 01.  We
9405
 * use these facts to make our heuristics more reliable.
9406
 * ************************************************************************* */
9407
static int
9408
has_mesh_control(uint16_t fcf, uint16_t qos_ctl, uint8_t mesh_flags)
9409
133
{
9410
  /* assume mesh control present if the QOS field's Mesh Control Present bit is
9411
   * set, all reserved bits in the mesh_flags field are zero, and the address
9412
   * extension mode is not a reserved value.
9413
   */
9414
133
  return (((FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) || (FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T2)) &&
9415
133
          (QOS_MESH_CONTROL_PRESENT(qos_ctl)) &&
9416
133
          ((mesh_flags & ~MESH_FLAGS_ADDRESS_EXTENSION) == 0) &&
9417
133
          ((mesh_flags & MESH_FLAGS_ADDRESS_EXTENSION) != MESH_FLAGS_ADDRESS_EXTENSION));
9418
133
}
9419
9420
/****************************************************************************** */
9421
/*
9422
 * locally originated mesh frames will have a mesh control field, but no QoS header
9423
 * detect the presence of mesh control field by checking if mesh flags are legal
9424
 * and confirming that the next header is an 802.2 LLC header
9425
 *
9426
 ****************************************************************************** */
9427
static int
9428
has_mesh_control_local(uint16_t fcf, uint8_t mesh_flags, uint16_t next_header)
9429
341
{
9430
341
  return (((FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) || (FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T2)) &&
9431
341
          ((mesh_flags & ~MESH_FLAGS_ADDRESS_EXTENSION) == 0) &&
9432
341
          ((mesh_flags & MESH_FLAGS_ADDRESS_EXTENSION) != MESH_FLAGS_ADDRESS_EXTENSION)) &&
9433
341
          next_header == 0xaaaa;
9434
341
}
9435
9436
static int
9437
find_mesh_control_length(uint8_t mesh_flags)
9438
512
{
9439
512
  return 6 + 6*(mesh_flags & MESH_FLAGS_ADDRESS_EXTENSION);
9440
512
}
9441
9442
static mimo_control_t
9443
get_mimo_control(tvbuff_t *tvb, int offset)
9444
4
{
9445
4
  uint16_t       mimo;
9446
4
  mimo_control_t output;
9447
9448
4
  mimo = tvb_get_letohs(tvb, offset);
9449
9450
4
  output.nc = (mimo & 0x0003) + 1;
9451
4
  output.nr = ((mimo & 0x000C) >> 2) + 1;
9452
4
  output.chan_width = (mimo & 0x0010) >> 4;
9453
4
  output.coefficient_size = 4; /* XXX - Is this a good default? */
9454
9455
4
  switch ((mimo & 0x0060) >> 5)
9456
4
    {
9457
4
      case 0:
9458
4
        output.grouping = 1;
9459
4
        break;
9460
9461
0
      case 1:
9462
0
        output.grouping = 2;
9463
0
        break;
9464
9465
0
      case 2:
9466
0
        output.grouping = 4;
9467
0
        break;
9468
9469
0
      default:
9470
0
        output.grouping = 1;
9471
0
        break;
9472
4
    }
9473
9474
4
  switch ((mimo & 0x0180) >> 7)
9475
4
    {
9476
3
      case 0:
9477
3
        output.coefficient_size = 4;
9478
3
        break;
9479
9480
1
      case 1:
9481
1
        output.coefficient_size = 5;
9482
1
        break;
9483
9484
0
      case 2:
9485
0
        output.coefficient_size = 6;
9486
0
        break;
9487
9488
0
      case 3:
9489
0
        output.coefficient_size = 8;
9490
0
        break;
9491
4
    }
9492
9493
4
  output.codebook_info = (mimo & 0x0600) >> 9;
9494
4
  output.remaining_matrix_segment = (mimo & 0x3800) >> 11;
9495
9496
4
  return output;
9497
4
}
9498
9499
static int
9500
get_mimo_na(uint8_t nr, uint8_t nc)
9501
4
{
9502
4
  if ((nr == 2) && (nc == 1)) {
9503
0
    return 2;
9504
4
  } else if ((nr == 2) && (nc == 2)) {
9505
0
    return 2;
9506
4
  } else if ((nr == 3) && (nc == 1)) {
9507
0
    return 4;
9508
4
  } else if ((nr == 3) && (nc == 2)) {
9509
0
    return 6;
9510
4
  } else if ((nr == 3) && (nc == 3)) {
9511
0
    return 6;
9512
4
  } else if ((nr == 4) && (nc == 1)) {
9513
0
    return 6;
9514
4
  } else if ((nr == 4) && (nc == 2)) {
9515
0
    return 10;
9516
4
  } else if ((nr == 4) && (nc == 3)) {
9517
0
    return 12;
9518
4
  } else if ((nr == 4) && (nc == 4)) {
9519
0
    return 12;
9520
4
  } else{
9521
4
    return 0;
9522
4
  }
9523
4
}
9524
9525
static int
9526
get_mimo_ns(bool chan_width, uint8_t output_grouping)
9527
4
{
9528
4
  int ns = 0;
9529
9530
4
  if (chan_width)
9531
3
  {
9532
3
    switch (output_grouping)
9533
3
      {
9534
3
        case 1:
9535
3
          ns = 114;
9536
3
          break;
9537
9538
0
          case 2:
9539
0
            ns = 58;
9540
0
            break;
9541
9542
0
          case 4:
9543
0
            ns = 30;
9544
0
            break;
9545
9546
0
          default:
9547
0
            ns = 0;
9548
3
      }
9549
3
  } else {
9550
1
    switch (output_grouping)
9551
1
      {
9552
1
        case 1:
9553
1
          ns = 56;
9554
1
          break;
9555
9556
0
        case 2:
9557
0
          ns = 30;
9558
0
          break;
9559
9560
0
        case 4:
9561
0
          ns = 16;
9562
0
          break;
9563
9564
0
        default:
9565
0
          ns = 0;
9566
1
      }
9567
1
  }
9568
9569
4
  return ns;
9570
4
}
9571
9572
static int
9573
add_mimo_csi_matrices_report(proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl)
9574
0
{
9575
0
  proto_tree *snr_tree;
9576
0
  int         csi_matrix_size, start_offset;
9577
0
  int         ns, i;
9578
9579
0
  start_offset = offset;
9580
0
  snr_tree = proto_tree_add_subtree(tree, tvb, offset, mimo_cntrl.nc,
9581
0
                        ett_mimo_report, NULL, "Signal to Noise Ratio");
9582
9583
0
  for (i = 1; i <= mimo_cntrl.nr; i++)
9584
0
  {
9585
0
    uint8_t snr;
9586
9587
0
    snr = tvb_get_uint8(tvb, offset);
9588
0
    proto_tree_add_uint_format(snr_tree, hf_ieee80211_ff_mimo_csi_snr, tvb, offset, 1,
9589
0
                               snr, "Channel %d - Signal to Noise Ratio: 0x%02X", i, snr);
9590
0
    offset += 1;
9591
0
  }
9592
9593
0
  ns = get_mimo_ns(mimo_cntrl.chan_width, mimo_cntrl.grouping);
9594
0
  csi_matrix_size = ns*(3+(2*mimo_cntrl.nc*mimo_cntrl.nr*mimo_cntrl.coefficient_size));
9595
0
  csi_matrix_size = WS_ROUNDUP_8(csi_matrix_size) / 8;
9596
0
  proto_tree_add_item(snr_tree, hf_ieee80211_ff_mimo_csi_matrices, tvb, offset, csi_matrix_size, ENC_NA);
9597
0
  offset += csi_matrix_size;
9598
0
  return offset - start_offset;
9599
0
}
9600
9601
static int
9602
add_mimo_beamforming_feedback_report(proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl)
9603
0
{
9604
0
  proto_tree *snr_tree;
9605
0
  int         csi_matrix_size, start_offset;
9606
0
  int         ns, i;
9607
9608
0
  start_offset = offset;
9609
0
  snr_tree = proto_tree_add_subtree(tree, tvb, offset, mimo_cntrl.nc, ett_mimo_report, NULL, "Signal to Noise Ratio");
9610
9611
0
  for (i = 1; i <= mimo_cntrl.nc; i++)
9612
0
  {
9613
0
    uint8_t snr;
9614
9615
0
    snr = tvb_get_uint8(tvb, offset);
9616
0
    proto_tree_add_uint_format(snr_tree, hf_ieee80211_ff_mimo_csi_snr, tvb, offset, 1,
9617
0
                               snr, "Stream %d - Signal to Noise Ratio: 0x%02X", i, snr);
9618
0
    offset += 1;
9619
0
  }
9620
9621
0
  ns = get_mimo_ns(mimo_cntrl.chan_width, mimo_cntrl.grouping);
9622
0
  csi_matrix_size = ns*(2*mimo_cntrl.nc*mimo_cntrl.nr*mimo_cntrl.coefficient_size);
9623
0
  csi_matrix_size = WS_ROUNDUP_8(csi_matrix_size) / 8;
9624
0
  proto_tree_add_item(snr_tree, hf_ieee80211_ff_mimo_csi_bf_matrices, tvb, offset, csi_matrix_size, ENC_NA);
9625
0
  offset += csi_matrix_size;
9626
0
  return offset - start_offset;
9627
0
}
9628
9629
static int
9630
add_mimo_compressed_beamforming_feedback_report(proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl)
9631
4
{
9632
4
  proto_tree *snr_tree;
9633
4
  int         csi_matrix_size, start_offset;
9634
4
  int         ns, na, i;
9635
9636
4
  start_offset = offset;
9637
4
  snr_tree = proto_tree_add_subtree(tree, tvb, offset, mimo_cntrl.nc,
9638
4
                        ett_mimo_report, NULL, "Signal to Noise Ratio");
9639
9640
8
  for (i = 1; i <= mimo_cntrl.nc; i++)
9641
4
  {
9642
4
    int8_t snr;
9643
4
    char edge_sign;
9644
9645
4
    snr = tvb_get_int8(tvb, offset);
9646
9647
4
    switch(snr) {
9648
0
      case -128:
9649
0
        edge_sign = '<';
9650
0
        break;
9651
0
      case 127:
9652
0
        edge_sign = '>';
9653
0
        break;
9654
4
      default:
9655
4
        edge_sign = ' ';
9656
4
        break;
9657
4
    }
9658
4
    proto_tree_add_uint_format(snr_tree, hf_ieee80211_ff_mimo_csi_snr, tvb, offset, 1,
9659
4
                               snr, "Stream %d - Signal to Noise Ratio: %c%3.2fdB", i, edge_sign,snr/4.0+22.0);
9660
4
    offset += 1;
9661
4
  }
9662
9663
4
  na = get_mimo_na(mimo_cntrl.nr, mimo_cntrl.nc);
9664
4
  ns = get_mimo_ns(mimo_cntrl.chan_width, mimo_cntrl.grouping);
9665
4
  csi_matrix_size = ns*(na*((mimo_cntrl.codebook_info+1)*2 + 2)/2);
9666
4
  csi_matrix_size = WS_ROUNDUP_8(csi_matrix_size) / 8;
9667
4
  proto_tree_add_item(snr_tree, hf_ieee80211_ff_mimo_csi_cbf_matrices, tvb, offset, csi_matrix_size, ENC_NA);
9668
4
  offset += csi_matrix_size;
9669
4
  return offset - start_offset;
9670
4
}
9671
9672
static void
9673
mesh_active_window_base_custom(char *result, uint32_t mesh_active_window)
9674
0
{
9675
0
  snprintf(result, ITEM_LABEL_LENGTH, "%f [Seconds]", (mesh_active_window * 1024.0 / 1000000));
9676
0
}
9677
9678
/* ************************************************************************* */
9679
/*          This is the capture function used to update packet counts        */
9680
/* ************************************************************************* */
9681
static bool
9682
capture_ieee80211_common(const unsigned char * pd, int offset, int len,
9683
                          capture_packet_info_t *cpinfo, const union wtap_pseudo_header *pseudo_header _U_, bool datapad)
9684
0
{
9685
0
  uint16_t fcf, hdr_length;
9686
9687
0
  if (!BYTES_ARE_IN_FRAME(offset, len, 2))
9688
0
    return false;
9689
9690
0
  fcf = pletoh16(&pd[offset]);
9691
9692
0
  if (IS_PROTECTED(FCF_FLAGS(fcf)) && (wlan_ignore_prot == WLAN_IGNORE_PROT_NO))
9693
0
    return false;
9694
9695
0
  switch (COMPOSE_FRAME_TYPE (fcf)) {
9696
9697
0
    case DATA:
9698
0
    case DATA_CF_ACK:
9699
0
    case DATA_CF_POLL:
9700
0
    case DATA_CF_ACK_POLL:
9701
0
    case DATA_QOS_DATA:
9702
0
    case DATA_QOS_DATA_CF_ACK:
9703
0
    case DATA_QOS_DATA_CF_POLL:
9704
0
    case DATA_QOS_DATA_CF_ACK_POLL:
9705
0
    {
9706
      /* These are data frames that actually contain *data*. */
9707
0
      hdr_length = (FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) ? DATA_LONG_HDR_LEN : DATA_SHORT_HDR_LEN;
9708
9709
0
      if (DATA_FRAME_IS_QOS(COMPOSE_FRAME_TYPE(fcf))) {
9710
        /* QoS frame, so the header includes a QoS field */
9711
0
        uint16_t qosoff;  /* Offset of the 2-byte QoS field */
9712
0
        uint8_t mesh_flags;
9713
9714
0
        qosoff = hdr_length;
9715
0
        hdr_length += 2; /* Include the QoS field in the header length */
9716
9717
0
        if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
9718
          /* Frame has a 4-byte HT Control field */
9719
0
          hdr_length += 4;
9720
0
        }
9721
9722
0
        if (datapad) {
9723
          /*
9724
           * Include the padding between the 802.11 header and the body,
9725
           * as "helpfully" provided by some Atheros adapters.
9726
           *
9727
           * In the Atheros mesh capture sample we have, the padding
9728
           * is before the mesh header, possibly because it doesn't
9729
           * recognize the mesh header.
9730
           */
9731
0
          hdr_length = WS_ROUNDUP_4(hdr_length);
9732
0
        }
9733
9734
        /*
9735
         * Does it look as if we have a mesh header?
9736
         * Look at the Mesh Control subfield of the QoS field and at the
9737
         * purported mesh flag fields.
9738
         */
9739
0
        if (!BYTES_ARE_IN_FRAME(offset, hdr_length, 1))
9740
0
          return false;
9741
9742
0
        mesh_flags = pd[hdr_length];
9743
0
        if (has_mesh_control(fcf, pletoh16(&pd[qosoff]), mesh_flags)) {
9744
          /* Yes, add the length of that in as well. */
9745
0
          hdr_length += find_mesh_control_length(mesh_flags);
9746
0
        }
9747
0
      }
9748
      /* I guess some bridges take Netware Ethernet_802_3 frames,
9749
         which are 802.3 frames (with a length field rather than
9750
         a type field, but with no 802.2 header in the payload),
9751
         and just stick the payload into an 802.11 frame.  I've seen
9752
         captures that show frames of that sort.
9753
9754
         We also handle some odd form of encapsulation in which a
9755
         complete Ethernet frame is encapsulated within an 802.11
9756
         data frame, with no 802.2 header.  This has been seen
9757
         from some hardware.
9758
9759
         On top of that, at least at some point it appeared that
9760
         the OLPC XO sent out frames with two bytes of 0 between
9761
         the "end" of the 802.11 header and the beginning of
9762
         the payload.
9763
9764
         So, if the packet doesn't start with 0xaa 0xaa:
9765
9766
           we first use the same scheme that linux-wlan-ng does to detect
9767
           those encapsulated Ethernet frames, namely looking to see whether
9768
           the frame either starts with 6 octets that match the destination
9769
           address from the 802.11 header or has 6 octets that match the
9770
           source address from the 802.11 header following the first 6 octets,
9771
           and, if so, treat it as an encapsulated Ethernet frame;
9772
9773
           otherwise, we use the same scheme that we use in the Ethernet
9774
           dissector to recognize Netware 802.3 frames, namely checking
9775
           whether the packet starts with 0xff 0xff and, if so, treat it
9776
           as an encapsulated IPX frame, and then check whether the
9777
           packet starts with 0x00 0x00 and, if so, treat it as an OLPC
9778
           frame. */
9779
0
      if (!BYTES_ARE_IN_FRAME(offset+hdr_length, len, 2))
9780
0
        return false;
9781
9782
0
      if ((pd[offset+hdr_length] != 0xaa) && (pd[offset+hdr_length+1] != 0xaa)) {
9783
#if 0
9784
        /* XXX - this requires us to parse the header to find the source
9785
           and destination addresses. */
9786
        if (BYTES_ARE_IN_FRAME(offset+hdr_length, len, 12)) {
9787
          /* We have two MAC addresses after the header. */
9788
          if ((memcmp(&pd[offset+hdr_length+6], pinfo->dl_src.data, 6) == 0) ||
9789
              (memcmp(&pd[offset+hdr_length+6], pinfo->dl_dst.data, 6) == 0)) {
9790
            return capture_eth (pd, offset + hdr_length, len, cpinfo, pseudo_header);
9791
          }
9792
        }
9793
#endif
9794
0
        if ((pd[offset+hdr_length] == 0xff) && (pd[offset+hdr_length+1] == 0xff))
9795
0
          return call_capture_dissector (ipx_cap_handle, pd, offset+hdr_length, len, cpinfo, pseudo_header);
9796
0
        else if ((pd[offset+hdr_length] == 0x00) && (pd[offset+hdr_length+1] == 0x00))
9797
0
          return call_capture_dissector (llc_cap_handle, pd, offset + hdr_length + 2, len, cpinfo, pseudo_header);
9798
0
      }
9799
0
      else {
9800
0
        return call_capture_dissector (llc_cap_handle, pd, offset + hdr_length, len, cpinfo, pseudo_header);
9801
0
      }
9802
0
      break;
9803
0
    }
9804
0
  }
9805
9806
0
  return false;
9807
0
}
9808
9809
/*
9810
 * Handle 802.11 with a variable-length link-layer header.
9811
 */
9812
static bool
9813
capture_ieee80211(const unsigned char * pd, int offset, int len, capture_packet_info_t *cpinfo, const union wtap_pseudo_header *pseudo_header _U_)
9814
0
{
9815
0
  return capture_ieee80211_common (pd, offset, len, cpinfo, pseudo_header, false);
9816
0
}
9817
9818
/*
9819
 * Handle 802.11 with a variable-length link-layer header and data padding.
9820
 */
9821
static bool
9822
capture_ieee80211_datapad(const unsigned char * pd, int offset, int len,
9823
                           capture_packet_info_t *cpinfo, const union wtap_pseudo_header *pseudo_header _U_)
9824
0
{
9825
0
  return capture_ieee80211_common (pd, offset, len, cpinfo, pseudo_header, true);
9826
0
}
9827
9828
9829
/* ************************************************************************* */
9830
/*          Add the subtree used to store the fixed parameters               */
9831
/* ************************************************************************* */
9832
static proto_tree *
9833
get_fixed_parameter_tree(proto_tree * tree, tvbuff_t *tvb, int start, int size,
9834
                         bool no_append)
9835
3.23k
{
9836
3.23k
  proto_item *fixed_fields;
9837
9838
3.23k
  fixed_fields = proto_tree_add_item(tree, hf_ieee80211_fixed_parameters, tvb, start, size, ENC_NA);
9839
3.23k
  if (!no_append)
9840
3.19k
    proto_item_append_text(fixed_fields, " (%d bytes)", size);
9841
9842
3.23k
  return proto_item_add_subtree(fixed_fields, ett_fixed_parameters);
9843
3.23k
}
9844
9845
9846
/* ************************************************************************* */
9847
/*            Add the subtree used to store tagged parameters                */
9848
/* ************************************************************************* */
9849
static proto_tree *
9850
get_tagged_parameter_tree(proto_tree * tree, tvbuff_t *tvb, int start, int size)
9851
4.90k
{
9852
4.90k
  proto_item *tagged_fields;
9853
9854
4.90k
  tagged_fields = proto_tree_add_item(tree, hf_ieee80211_tagged_parameters, tvb, start, -1, ENC_NA);
9855
4.90k
  proto_item_append_text(tagged_fields, " (%d bytes)", size);
9856
9857
4.90k
  return proto_item_add_subtree(tagged_fields, ett_tagged_parameters);
9858
4.90k
}
9859
9860
static void
9861
add_ptk_analysis(tvbuff_t *tvb, proto_tree *tree, DOT11DECRYPT_KEY_ITEM *used_key)
9862
0
{
9863
0
  if (!used_key) {
9864
0
    return;
9865
0
  }
9866
0
  const uint8_t *key = NULL;
9867
0
  proto_item *ti;
9868
0
  char buf[SHORT_STR];
9869
0
  int len = Dot11DecryptGetKCK(used_key, &key);
9870
0
  bytes_to_hexstr(buf, key, len);
9871
0
  buf[2 * len] = '\0';
9872
0
  ti = proto_tree_add_string(tree, hf_ieee80211_fc_analysis_kck, tvb, 0, 0, buf);
9873
0
  proto_item_set_generated(ti);
9874
9875
0
  len = Dot11DecryptGetKEK(used_key, &key);
9876
0
  bytes_to_hexstr(buf, key, len);
9877
0
  buf[2 * len] = '\0';
9878
0
  ti = proto_tree_add_string(tree, hf_ieee80211_fc_analysis_kek, tvb, 0, 0, buf);
9879
0
  proto_item_set_generated(ti);
9880
0
}
9881
9882
static int
9883
dissect_vendor_action_marvell(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_)
9884
0
{
9885
0
  uint8_t octet;
9886
0
  int offset = 0;
9887
9888
0
  octet = tvb_get_uint8(tvb, offset);
9889
0
  proto_tree_add_item(tree, hf_ieee80211_ff_marvell_action_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9890
0
  offset += 1;
9891
0
  switch (octet)
9892
0
    {
9893
0
      case MRVL_ACTION_MESH_MANAGEMENT:
9894
0
        octet = tvb_get_uint8(tvb, offset);
9895
0
        proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9896
0
        offset += 1;
9897
0
        switch (octet)
9898
0
          {
9899
0
            case MRVL_MESH_MGMT_ACTION_RREQ:
9900
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9901
0
              offset += 1;
9902
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9903
0
              offset += 1;
9904
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9905
0
              offset += 1;
9906
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9907
0
              offset += 1;
9908
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_rreqid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9909
0
              offset += 4;
9910
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_sa, tvb, offset, 6, ENC_NA);
9911
0
              offset += 6;
9912
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_ssn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9913
0
              offset += 4;
9914
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9915
0
              offset += 4;
9916
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9917
0
              offset += 4;
9918
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_dstcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9919
0
              offset += 1;
9920
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9921
0
              offset += 1;
9922
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_da, tvb, offset, 6, ENC_NA);
9923
0
              offset += 6;
9924
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_dsn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9925
0
              offset += 4;
9926
0
              break;
9927
0
            case MRVL_MESH_MGMT_ACTION_RREP:
9928
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9929
0
              offset += 1;
9930
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9931
0
              offset += 1;
9932
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9933
0
              offset += 1;
9934
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9935
0
              offset += 1;
9936
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_da, tvb, offset, 6, ENC_NA);
9937
0
              offset += 6;
9938
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_dsn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9939
0
              offset += 4;
9940
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9941
0
              offset += 4;
9942
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9943
0
              offset += 4;
9944
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_sa, tvb, offset, 6, ENC_NA);
9945
0
              offset += 6;
9946
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_ssn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9947
0
              offset += 4;
9948
0
              break;
9949
0
            case MRVL_MESH_MGMT_ACTION_RERR:
9950
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9951
0
              offset += 1;
9952
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9953
0
              offset += 1;
9954
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_dstcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
9955
0
              offset += 1;
9956
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_da, tvb, offset, 6, ENC_NA);
9957
0
              offset += 6;
9958
0
              proto_tree_add_item(tree, hf_ieee80211_ff_marvell_mesh_mgt_dsn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
9959
0
              offset += 4;
9960
0
              break;
9961
0
            default:
9962
0
              break;
9963
0
          }
9964
0
        break;
9965
0
      default:
9966
0
        break;
9967
0
    }
9968
9969
0
  return offset;
9970
0
}
9971
9972
static int
9973
dissect_dscp_policy_query(tvbuff_t *tvb, packet_info *pinfo _U_,
9974
                          proto_tree *tree, int offset)
9975
0
{
9976
0
  int start_offset = offset;
9977
9978
0
  while (tvb_captured_length_remaining(tvb, offset)) {
9979
0
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
9980
0
  }
9981
9982
0
  return offset - start_offset;
9983
0
}
9984
9985
static int * const rqst_control_fields[] = {
9986
  &hf_ieee80211_oui_qos_mgmt_rq_ctrl_more,
9987
  &hf_ieee80211_oui_qos_mgmt_rq_ctrl_reset,
9988
  &hf_ieee80211_oui_qos_mgmt_rq_reserved,
9989
  NULL
9990
};
9991
9992
static int
9993
dissect_dscp_policy_request(tvbuff_t *tvb, packet_info *pinfo _U_,
9994
                            proto_tree *tree, int offset)
9995
0
{
9996
0
  int start_offset = offset;
9997
9998
0
  proto_tree_add_bitmask(tree, tvb, offset,
9999
0
                         hf_ieee80211_oui_qos_mgmt_rqst_control,
10000
0
                         ett_pol_rqst_cont_tree, rqst_control_fields,
10001
0
                         ENC_NA);
10002
0
  offset += 1;
10003
10004
0
  while (tvb_reported_length_remaining(tvb, offset)) {
10005
0
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
10006
0
  }
10007
10008
0
  return offset - start_offset;
10009
0
}
10010
10011
static int * const resp_control_fields[] = {
10012
  &hf_ieee80211_oui_qos_mgmt_rsp_ctrl_more,
10013
  &hf_ieee80211_oui_qos_mgmt_rsp_ctrl_reset,
10014
  &hf_ieee80211_oui_qos_mgmt_rsp_reserved,
10015
  NULL
10016
};
10017
10018
static int
10019
dissect_dscp_policy_response(tvbuff_t *tvb, packet_info *pinfo,
10020
                             proto_tree *tree, int offset)
10021
0
{
10022
0
  int start_offset = offset;
10023
0
  uint8_t count;
10024
0
  wmem_strbuf_t *status_buf = wmem_strbuf_create(pinfo->pool);
10025
0
  int i;
10026
10027
0
  proto_tree_add_bitmask(tree, tvb, offset,
10028
0
                         hf_ieee80211_oui_qos_mgmt_resp_control,
10029
0
                         ett_pol_resp_cont_tree, resp_control_fields,
10030
0
                         ENC_NA);
10031
0
  offset += 1;
10032
10033
0
  count = tvb_get_uint8(tvb, offset);
10034
0
  proto_tree_add_item(tree, hf_ieee80211_oui_qos_mgmt_count, tvb, offset,
10035
0
                      1, ENC_NA);
10036
0
  offset += 1;
10037
10038
0
  for (i = 0; i < count; i++) {
10039
0
    proto_tree *status_tree = NULL;
10040
0
    uint8_t scsid, status;
10041
10042
0
    scsid = tvb_get_uint8(tvb, offset);
10043
0
    status_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2,
10044
0
                                                ett_dscp_policy_status_list,
10045
0
                                                NULL, "Status list item %d",
10046
0
                                                i);
10047
0
    proto_tree_add_item(status_tree, hf_ieee80211_dscp_policy_id, tvb,
10048
0
                        offset, 1, ENC_NA);
10049
0
    if (wmem_strbuf_get_len(status_buf) == 0) {
10050
0
      wmem_strbuf_append_printf(status_buf, "%u:", scsid);
10051
0
    } else {
10052
0
      wmem_strbuf_append_printf(status_buf, " %u:", scsid);
10053
0
    }
10054
0
    offset += 1;
10055
10056
0
    status = tvb_get_uint8(tvb, offset);
10057
0
    proto_tree_add_item(status_tree, hf_ieee80211_dscp_policy_status, tvb,
10058
0
                        offset, 1, ENC_NA);
10059
0
    wmem_strbuf_append_printf(status_buf, "%u", status);
10060
0
    offset += 1;
10061
0
  }
10062
0
  proto_tree_add_string(tree, hf_ieee80211_dscp_policy_scs_sts_list, tvb, 0, 1,
10063
0
                        wmem_strbuf_finalize(status_buf));
10064
10065
0
  return offset - start_offset;
10066
0
}
10067
10068
static int
10069
dissect_vendor_action_wfa_qos_mgmt(tvbuff_t *tvb, packet_info *pinfo,
10070
                                   proto_tree *tree, void *data _U_)
10071
0
{
10072
0
  int offset = 0;
10073
0
  uint8_t subtype = tvb_get_uint8(tvb, offset);
10074
10075
0
  proto_tree_add_item(tree, hf_ieee80211_oui_qos_subtype, tvb, offset, 1,
10076
0
                      ENC_NA);
10077
0
  offset += 1;
10078
10079
0
  proto_tree_add_item(tree, hf_ieee80211_oui_qos_mgmt_dialog_token, tvb, offset,
10080
0
                      1, ENC_NA);
10081
0
  offset += 1;
10082
10083
0
  switch (subtype) {
10084
0
  case 0:
10085
0
    offset += dissect_dscp_policy_query(tvb, pinfo, tree, offset);
10086
0
    break;
10087
0
  case 1:
10088
0
    offset += dissect_dscp_policy_request(tvb, pinfo, tree, offset);
10089
0
    break;
10090
0
  case 2:
10091
0
    offset += dissect_dscp_policy_response(tvb, pinfo, tree, offset);
10092
0
    break;
10093
0
  }
10094
10095
0
  return offset;
10096
0
}
10097
10098
static int
10099
dissect_vendor_action_wifi_alliance(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
10100
0
{
10101
0
  uint8_t subtype;
10102
0
  int offset = 0;
10103
0
  int dissected;
10104
0
  tvbuff_t *subtvb;
10105
10106
0
  subtype = tvb_get_uint8(tvb, offset);
10107
0
  proto_tree_add_item(tree, hf_ieee80211_tag_oui_wfa_action_type, tvb, offset,
10108
0
                      1, ENC_NA);
10109
0
  offset += 1;
10110
10111
0
  subtvb = tvb_new_subset_remaining(tvb, offset);
10112
0
  dissected = dissector_try_uint_with_data(wifi_alliance_action_subtype_table, subtype, subtvb, pinfo, tree, false, NULL);
10113
0
  if (dissected <= 0)
10114
0
  {
10115
0
      call_data_dissector(subtvb, pinfo, tree);
10116
0
      dissected = tvb_reported_length(subtvb);
10117
0
  }
10118
10119
0
  offset += dissected;
10120
10121
0
  return offset;
10122
0
}
10123
10124
/*
10125
 * This function is called from two different places. In one case it is called
10126
 * without the tag and length. In other cases, it is called with those and
10127
 * is asked to return the type and subtype. We know the difference because
10128
 * type and subtype will be NULL in the first case.
10129
 */
10130
static unsigned
10131
dissect_advertisement_protocol_common(packet_info *pinfo, proto_tree *tree,
10132
                               tvbuff_t *tvb, int offset, unsigned *type,
10133
                               unsigned *subtype)
10134
149
{
10135
149
  uint8_t     tag_no = 0, tag_len, left;
10136
149
  proto_item *item = NULL, *adv_item;
10137
149
  proto_tree *adv_tree, *adv_tuple_tree;
10138
10139
149
  if (type)
10140
18
    *type = 0xff; // Last reserved value
10141
149
  if (subtype)
10142
18
    *subtype = 0xff;
10143
149
  tag_no = tvb_get_uint8(tvb, offset);
10144
149
  if (type)
10145
18
    item = proto_tree_add_item(tree, hf_ieee80211_tag_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
10146
10147
  /*
10148
   * If we have the tag and len, use the len in the tvb, otherwise ask
10149
   * for the length of the tvb.
10150
   */
10151
149
  if (type)
10152
18
    tag_len = tvb_get_uint8(tvb, offset + 1);
10153
131
  else
10154
131
    tag_len = tvb_reported_length_remaining(tvb, 0);
10155
10156
149
  if (type && tag_no != TAG_ADVERTISEMENT_PROTOCOL) {
10157
18
    expert_add_info_format(pinfo, item, &ei_ieee80211_tag_number,
10158
18
                           "Unexpected IE %d (expected Advertisement "
10159
18
                           "Protocol)", tag_no);
10160
18
    return 2 + tag_len;
10161
18
  }
10162
131
  if (type)
10163
0
    item = proto_tree_add_uint(tree, hf_ieee80211_tag_length, tvb, offset + 1, 1, tag_len);
10164
131
  if (tag_len < 2) {
10165
12
    if (!type)
10166
12
      item = proto_tree_add_uint(tree, hf_ieee80211_tag_length, tvb, offset + 1, 1, tag_len);
10167
12
    expert_add_info_format(pinfo, item, &ei_ieee80211_tag_length,
10168
12
                           "Advertisement Protocol: IE must be at least 2 "
10169
12
                           "octets long");
10170
12
    return 2 + tag_len;
10171
12
  }
10172
10173
119
  left = tag_len;
10174
119
  if (type) /* Skip past the header if there ... */
10175
0
    offset += 2;
10176
119
  adv_tree = proto_tree_add_subtree(tree, tvb, offset, left,
10177
119
                                 ett_adv_proto, &adv_item, "Advertisement Protocol element");
10178
10179
5.27k
  while (left >= 2) {
10180
5.16k
    uint8_t id;
10181
10182
5.16k
    id = tvb_get_uint8(tvb, offset + 1);
10183
5.16k
    if (id == 0)
10184
1.59k
      proto_item_append_text(adv_item, ": ANQP");
10185
5.16k
    adv_tuple_tree = proto_tree_add_subtree_format(adv_tree, tvb, offset, 2, ett_adv_proto_tuple, &item,
10186
5.16k
                               "Advertisement Protocol Tuple: %s",
10187
5.16k
                               val_to_str(id, adv_proto_id_vals,
10188
5.16k
                                          "Unknown (%d)"));
10189
10190
5.16k
    proto_tree_add_item(adv_tuple_tree,
10191
5.16k
                        hf_ieee80211_tag_adv_proto_resp_len_limit, tvb,
10192
5.16k
                        offset, 1, ENC_LITTLE_ENDIAN);
10193
5.16k
    proto_tree_add_item(adv_tuple_tree,
10194
5.16k
                        hf_ieee80211_tag_adv_proto_pame_bi, tvb,
10195
5.16k
                        offset, 1, ENC_LITTLE_ENDIAN);
10196
5.16k
    offset += 1;
10197
5.16k
    left--;
10198
5.16k
    proto_tree_add_item(adv_tuple_tree, hf_ieee80211_tag_adv_proto_id, tvb,
10199
5.16k
                        offset, 1, ENC_LITTLE_ENDIAN);
10200
5.16k
    offset += 1;
10201
5.16k
    left--;
10202
10203
5.16k
    if ((id == 0) && type)
10204
0
      *type = ADV_PROTO_ID_ANQP;
10205
10206
5.16k
    if (id == 221) {
10207
      /* Vendor specific */
10208
37
      uint8_t len = tvb_get_uint8(tvb, offset);
10209
37
      unsigned oui;
10210
37
      uint8_t wfa_subtype;
10211
37
      proto_tree_add_item(adv_tuple_tree, hf_ieee80211_tag_adv_vs_len, tvb, offset, 1, ENC_NA);
10212
37
      offset += 1;
10213
37
      left   -= 1;
10214
37
      if (type)
10215
0
        *type = ADV_PROTO_ID_VS;
10216
37
      if (len > left) {
10217
10
        expert_add_info_format(pinfo, item, &ei_ieee80211_tag_length,
10218
10
                               "Vendor specific info length error");
10219
10
        return 2 + tag_len;
10220
10
      }
10221
27
      proto_tree_add_item_ret_uint(adv_tuple_tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
10222
27
      offset += 3;
10223
27
      left   -= 3;
10224
27
      wfa_subtype = tvb_get_uint8(tvb, offset);
10225
27
      proto_tree_add_item(adv_tuple_tree, hf_ieee80211_anqp_wfa_subtype, tvb,
10226
27
                        offset, 1, ENC_NA);
10227
27
      offset += 1;
10228
27
      left   -= 1;
10229
27
      if (oui == OUI_WFA) {
10230
0
        proto_tree_add_item(adv_tuple_tree, hf_ieee80211_dpp_subtype, tvb, offset, 1, ENC_NA);
10231
0
        if (subtype && wfa_subtype == WFA_SUBTYPE_DPP) {
10232
0
          *subtype = WFA_SUBTYPE_DPP;
10233
0
          *subtype |= (tvb_get_uint8(tvb, offset) << 8);
10234
0
        }
10235
0
        offset++;
10236
0
        left--;
10237
0
      }
10238
27
    }
10239
5.16k
  }
10240
10241
109
  if (left) {
10242
32
    expert_add_info_format(pinfo, item, &ei_ieee80211_extra_data,
10243
32
                           "Unexpected extra data in the end");
10244
32
  }
10245
10246
109
  return 2 + tag_len;
10247
119
}
10248
10249
static int
10250
dissect_advertisement_protocol(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
10251
131
{
10252
131
  return dissect_advertisement_protocol_common(pinfo, tree, tvb, 0, NULL, NULL);
10253
131
}
10254
10255
static void
10256
dissect_anqp_query_list(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int end)
10257
0
{
10258
0
  while (offset + 2 <= end) {
10259
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_query_id,
10260
0
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
10261
0
    offset += 2;
10262
0
  }
10263
0
  if (offset != end) {
10264
0
    expert_add_info_format(pinfo, tree, &ei_ieee80211_ff_anqp_info_length,
10265
0
                           "Unexpected ANQP Query list format");
10266
0
  }
10267
0
}
10268
10269
static void
10270
dissect_hs20_anqp_hs_capability_list(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
10271
0
{
10272
0
  while (offset < end) {
10273
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_hs_capability_list,
10274
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10275
0
    offset++;
10276
0
  }
10277
0
}
10278
10279
static void
10280
dissect_anqp_capab_list(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int end)
10281
0
{
10282
0
  uint16_t    id, len;
10283
0
  proto_item *item;
10284
0
  proto_tree *vtree;
10285
0
  uint32_t    oui;
10286
0
  uint8_t     subtype;
10287
10288
0
  while (offset + 2 <= end) {
10289
0
    id = tvb_get_letohs(tvb, offset);
10290
0
    item = proto_tree_add_item(tree, hf_ieee80211_ff_anqp_capability,
10291
0
                               tvb, offset, 2, ENC_LITTLE_ENDIAN);
10292
0
    offset += 2;
10293
0
    if (id == ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST) {
10294
0
      vtree = proto_item_add_subtree(item, ett_anqp_vendor_capab);
10295
0
      len = tvb_get_letohs(tvb, offset);
10296
0
      proto_tree_add_item(vtree, hf_ieee80211_ff_anqp_capability_vlen,
10297
0
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
10298
0
      offset += 2;
10299
0
      if ((len < 3) || ((offset + len) > end)) {
10300
0
        expert_add_info(pinfo, tree, &ei_ieee80211_ff_anqp_capability);
10301
0
        return;
10302
0
      }
10303
0
      proto_tree_add_item_ret_uint(vtree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
10304
0
      offset += 3;
10305
0
      len    -= 3;
10306
10307
0
      switch (oui) {
10308
0
      case OUI_WFA:
10309
0
        if (len == 0)
10310
0
          break;
10311
0
        subtype = tvb_get_uint8(tvb, offset);
10312
0
        proto_item_append_text(vtree, " - WFA - %s",
10313
0
                               val_to_str(subtype, wfa_anqp_subtype_vals,
10314
0
                                          "Unknown (%u)"));
10315
0
        proto_tree_add_item(vtree, hf_ieee80211_anqp_wfa_subtype,
10316
0
                            tvb, offset, 1, ENC_NA);
10317
0
        offset++;
10318
0
        len--;
10319
0
        switch (subtype) {
10320
0
        case WFA_ANQP_SUBTYPE_HS20:
10321
0
          proto_tree_add_item(vtree, hf_ieee80211_hs20_anqp_subtype, tvb, offset, 1, ENC_NA);
10322
0
          proto_tree_add_item(vtree, hf_ieee80211_hs20_anqp_reserved, tvb, offset + 1, 1, ENC_NA);
10323
0
          offset += 2;
10324
0
          len -= 2;
10325
0
          dissect_hs20_anqp_hs_capability_list(vtree, tvb, offset, end);
10326
0
          break;
10327
0
        default:
10328
0
          proto_tree_add_item(vtree, hf_ieee80211_ff_anqp_capability_vendor,
10329
0
                              tvb, offset, len, ENC_NA);
10330
0
          break;
10331
0
        }
10332
0
        break;
10333
0
      default:
10334
0
        proto_tree_add_item(vtree, hf_ieee80211_ff_anqp_capability_vendor,
10335
0
                            tvb, offset, len, ENC_NA);
10336
0
        break;
10337
0
      }
10338
10339
0
      offset += len;
10340
0
    }
10341
0
  }
10342
0
  if (offset != end) {
10343
0
    expert_add_info_format(pinfo, tree, &ei_ieee80211_ff_anqp_info_length,
10344
0
                           "Unexpected ANQP Capability list format");
10345
0
  }
10346
0
}
10347
10348
static const value_string venue_group_vals[] = {
10349
  {  0, "Unspecified" },
10350
  {  1, "Assembly" },
10351
  {  2, "Business" },
10352
  {  3, "Educational" },
10353
  {  4, "Factory and Industrial" },
10354
  {  5, "Institutional" },
10355
  {  6, "Mercantile" },
10356
  {  7, "Residential" },
10357
  {  8, "Storage" },
10358
  {  9, "Utility and Miscellaneous" },
10359
  { 10, "Vehicular" },
10360
  { 11, "Outdoor" },
10361
  { 0, NULL }
10362
};
10363
static value_string_ext venue_group_vals_ext = VALUE_STRING_EXT_INIT(venue_group_vals);
10364
10365
static void
10366
dissect_venue_info(proto_tree *tree, tvbuff_t *tvb, int offset)
10367
20
{
10368
20
  proto_tree_add_item(tree, hf_ieee80211_ff_venue_info_group,
10369
20
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10370
20
  proto_tree_add_item(tree, hf_ieee80211_ff_venue_info_type,
10371
20
                      tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
10372
20
}
10373
10374
static void
10375
dissect_venue_name_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int end)
10376
0
{
10377
0
  proto_item *item;
10378
10379
0
  dissect_venue_info(tree, tvb, offset);
10380
0
  offset += 2;
10381
0
  while (offset + 4 <= end) {
10382
0
    uint8_t vlen = tvb_get_uint8(tvb, offset);
10383
0
    item = proto_tree_add_item(tree, hf_ieee80211_ff_anqp_venue_length,
10384
0
                               tvb, offset, 1, ENC_LITTLE_ENDIAN);
10385
0
    offset += 1;
10386
0
    if ((vlen > (end - offset)) || (vlen < 3)) {
10387
0
      expert_add_info(pinfo, item, &ei_ieee80211_ff_anqp_venue_length);
10388
0
      break;
10389
0
    }
10390
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_venue_language,
10391
0
                        tvb, offset, 3, ENC_ASCII);
10392
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_venue_name,
10393
0
                        tvb, offset + 3, vlen - 3, ENC_UTF_8);
10394
0
    offset += vlen;
10395
0
  }
10396
0
}
10397
10398
static const value_string nw_auth_type_vals[] = {
10399
  { 0, "Acceptance of terms and conditions" },
10400
  { 1, "On-line enrollment supported" },
10401
  { 2, "http/https redirection" },
10402
  { 3, "DNS redirection" },
10403
  { 0, NULL }
10404
};
10405
10406
static void
10407
dissect_network_auth_type(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
10408
0
{
10409
0
  while (offset + 3 <= end) {
10410
0
    uint16_t len;
10411
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_indicator,
10412
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10413
0
    offset += 1;
10414
0
    len = tvb_get_letohs(tvb, offset);
10415
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_url_len,
10416
0
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
10417
0
    offset += 2;
10418
0
    if (len)
10419
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_url,
10420
0
                          tvb, offset, len, ENC_ASCII);
10421
0
    offset += len;
10422
0
  }
10423
0
}
10424
10425
static void
10426
dissect_anqp_network_auth_type_timestamp(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
10427
0
{
10428
0
  while (offset + 2 <= end) {
10429
0
    uint8_t len;
10430
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_indicator,
10431
0
                        tvb, offset, 1, ENC_NA);
10432
0
    len = tvb_get_uint8(tvb, offset + 1);
10433
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_url_len,
10434
0
                        tvb, offset, 1, ENC_NA);
10435
0
    offset += 2;
10436
0
    if(len)
10437
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_url,
10438
0
                          tvb, offset, len, ENC_ASCII);
10439
0
    offset += len;
10440
    /* Optional Time Value - Either 0 or 10 octets */
10441
    /* Format: Octet 0-1: Year (0-65534)
10442
               Octet 2: Month (0-12)
10443
               Octet 3: Day of month (0-31)
10444
               Octet 4: Hours (0-23)
10445
               Octet 5: Minutes (0-59)
10446
               Octet 6: Seconds (0-59)
10447
               Octet 7-8: Milliseconds (0-999)
10448
               Octet 9: Reserved */
10449
0
    if ((offset + 10) < end) {
10450
      /* Enough bytes to dissect a timestamp */
10451
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_year,
10452
0
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
10453
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_mon,
10454
0
                          tvb, offset, 1, ENC_NA);
10455
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_day,
10456
0
                          tvb, offset, 1, ENC_NA);
10457
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_hr,
10458
0
                          tvb, offset, 1, ENC_NA);
10459
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_min,
10460
0
                          tvb, offset, 1, ENC_NA);
10461
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_sec,
10462
0
                          tvb, offset, 1, ENC_NA);
10463
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_msec,
10464
0
                          tvb, offset, 2, ENC_NA);
10465
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nw_auth_type_ts_rsvd,
10466
0
                          tvb, offset, 1, ENC_NA);
10467
0
      offset += 10;
10468
0
    } else {
10469
      /* Not enough bytes to dissect a timestamp */
10470
0
    }
10471
0
  }
10472
0
}
10473
10474
static void
10475
add_manuf(proto_item *item, tvbuff_t *tvb, int offset)
10476
239
{
10477
239
  const char *manuf_name;
10478
10479
239
  manuf_name = tvb_get_manuf_name_if_known(tvb, offset);
10480
239
  if (manuf_name == NULL)
10481
178
    return;
10482
61
  proto_item_append_text(item, " - %s", manuf_name);
10483
61
}
10484
10485
static void
10486
dissect_roaming_consortium_list(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
10487
                                int end)
10488
0
{
10489
0
  proto_item *item;
10490
0
  uint8_t     len;
10491
10492
0
  while (offset < end) {
10493
0
    len = tvb_get_uint8(tvb, offset);
10494
0
    item = proto_tree_add_item(tree,
10495
0
                               hf_ieee80211_ff_anqp_roaming_consortium_oi_len,
10496
0
                               tvb, offset, 1, ENC_LITTLE_ENDIAN);
10497
0
    offset += 1;
10498
0
    if ((len > (end - offset)) || (len < 3)) {
10499
0
      expert_add_info(pinfo, item, &ei_ieee80211_ff_anqp_roaming_consortium_oi_len);
10500
0
      break;
10501
0
    }
10502
0
    item = proto_tree_add_item(tree,
10503
0
                               hf_ieee80211_ff_anqp_roaming_consortium_oi,
10504
0
                               tvb, offset, len, ENC_NA);
10505
0
    add_manuf(item, tvb, offset);
10506
0
    offset += len;
10507
0
  }
10508
0
}
10509
10510
static const value_string ip_addr_avail_ipv6_vals[] = {
10511
  { 0, "Address type not available" },
10512
  { 1, "Address type available" },
10513
  { 2, "Availability of the address type not known" },
10514
  { 0, NULL }
10515
};
10516
10517
static const value_string ip_addr_avail_ipv4_vals[] = {
10518
  { 0, "Address type not available" },
10519
  { 1, "Public IPv4 address available" },
10520
  { 2, "Port-restricted IPv4 address available" },
10521
  { 3, "Single NATed private IPv4 address available" },
10522
  { 4, "Double NATed private IPv4 address available" },
10523
  { 5, "Port-restricted IPv4 address and single NATed IPv4 address available" },
10524
  { 6, "Port-restricted IPv4 address and double NATed IPv4 address available" },
10525
  { 7, "Availability of the address type is not known" },
10526
  { 0, NULL }
10527
};
10528
10529
static void
10530
dissect_ip_addr_type_availability_info(proto_tree *tree, tvbuff_t *tvb,
10531
                                       int offset)
10532
0
{
10533
0
  proto_tree_add_item(tree, hf_ieee80211_ff_anqp_ip_addr_avail_ipv6,
10534
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10535
0
  proto_tree_add_item(tree, hf_ieee80211_ff_anqp_ip_addr_avail_ipv4,
10536
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10537
0
}
10538
10539
static const value_string nai_realm_encoding_vals[] = {
10540
  { 0, "Formatted in accordance with RFC 4282" },
10541
  { 1, "UTF-8 formatted that is not formatted in accordance with RFC 4282" },
10542
  { 0, NULL }
10543
};
10544
10545
static const range_string oper_class_rvals[] = {
10546
  {   0,   0, "Unknown" }, /* 0 should not be used */
10547
  {   1,  65, "Reserved" },
10548
  {  66,  66, "0.863 GHz, 1 MHz Spacing" },
10549
  {  67,  67, "0.863 GHz, 2 MHz Spacing" },
10550
  {  68,  68, "0.902 GHz, 1 MHz Spacing" },
10551
  {  69,  69, "0.902 GHz, 2 MHz Spacing" },
10552
  {  70,  70, "0.902 GHz, 4 MHz Spacing" },
10553
  {  71,  71, "0.902 GHz, 8 MHz Spacing" },
10554
  {  72,  72, "0.902 GHz, 16 MHz Spacing" },
10555
  {  73,  73, "0.9165 GHz, 1 MHz Spacing" },
10556
  {  74,  74, "0.9175 GHz, 1 MHz Spacing" },
10557
  {  75,  75, "0.9175 GHz, 2 MHz Spacing" },
10558
  {  76,  76, "0.9175 GHz, 4 Spacing" },
10559
  {  77,  77, "0.9014 GHz, 1 MHz Spacing" },
10560
  {  78,  80, "Reserved" },
10561
  {  81,  81, "2.407 GHz, Channels 1-13, 25 MHz Spacing" },
10562
  {  82,  82, "2.414 GHz, Channel 14, 25 MHz Spacing" },
10563
  {  83,  83, "2.407 GHz, Channels 1-9, 40 MHz Spacing" },
10564
  {  84,  84, "2.407 GHz, Channels 5-13, 40 MHz Spacing" },
10565
  {  85,  93, "Reserved" },
10566
  {  94,  94, "3.0 GHz, Channels 133 and 137, 20 MHz Spacing" },
10567
  {  95,  95, "3.0 GHz, Channels 132, 134, 136, and 138, 10 MHz Spacing" },
10568
  {  96,  96, "3.0025 GHz, Channels 131-138, 5 MHz Spacing" },
10569
  {  97, 100, "Reserved" },
10570
  { 101, 101, "4.85 GHz, Channels 21 and 25, 20 MHz Spacing" },
10571
  { 102, 102, "4.89 GHz, Channels 11, 13, 15, 17, and 19, 10 MHz Spacing" },
10572
  { 103, 103, "4.9375 GHz, Channels 1-10, 5 MHz Spacing" },
10573
  { 104, 104, "4.0 GHz, Channels 184 and 192, 40 MHz Spacing" },
10574
  { 105, 105, "4.0 GHz, Channels 188 and 196, 40 MHz Spacing" },
10575
  { 106, 106, "4.0 GHz, Channels 191 and 195, 20 MHz Spacing" },
10576
  { 107, 107, "4.0 GHz, Channels 189, 191, 193, 195, and 197, 10 MHz Spacing" },
10577
  { 108, 108, "4.0025 GHz, Channels 188-197, 5 MHz Spacing" },
10578
  { 109, 109, "4.0 GHz, Channels 184, 188, 192, and 196, 20 MHz Spacing" },
10579
  { 110, 110, "4.0 GHz, Channels 183-189, 10 MHz Spacing" },
10580
  { 111, 111, "4.0025 GHz, Channels 182-189, 5 MHz Spacing" },
10581
  { 112, 114, "Reserved" },
10582
  { 115, 115, "5.0 GHz, Channels 36, 40, 44, and 48, 20 MHz Spacing" },
10583
  { 116, 116, "5.0 GHz, Channels 36 and 44, 40 MHz Spacing" },
10584
  { 117, 117, "5.0 GHz, Channels 40 and 48, 40 MHz Spacing" },
10585
  { 118, 118, "5.0 GHz, Channels 52, 56, 60, and 64, 20 MHz Spacing" },
10586
  { 119, 119, "5.0 GHz, Channels 52 and 60, 40 MHz Spacing" },
10587
  { 120, 120, "5.0 GHz, Channels 56 and 64, 40 MHz Spacing" },
10588
  { 121, 121, "5.0 GHz, Channels 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, and 140, 20 MHz Spacing" },
10589
  { 122, 122, "5.0 GHz, Channels 100, 108, 116, 124, and 132, 40 MHz Spacing" },
10590
  { 123, 123, "5.0 GHz, Channels 104, 112, 120, 128, and 136, 40 MHz Spacing" },
10591
  { 124, 124, "5.0 GHz, Channels 149, 153, 157, and 161, 20 MHz Spacing" },
10592
  { 125, 125, "5.0 GHz, Channels 149, 153, 157, 161, 165, and 169, 20 MHz Spacing" },
10593
  { 126, 126, "5.0 GHz, Channels 149 and 157, 40 MHz Spacing" },
10594
  { 127, 127, "5.0 GHz, Channels 153 and 161, 40 MHz Spacing" },
10595
  { 128, 128, "5.0 GHz, Channel center frequency index 42, 58, 106, 122, 138 and 155, 80 MHz Spacing" },
10596
  { 129, 129, "5.0 GHz, Channel center frequency index 50 and 114, 160 MHz Spacing" },
10597
  { 130, 130, "5.0 GHz, Channel center frequency index 42, 58, 106, 122, 138 and 155, 80 MHz Spacing, 80+" },
10598
  { 131, 131, "5.950 GHz, Channels 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, and 233, 20 MHz Spacing" },
10599
  { 132, 132, "5.950 GHz, Channel center frequency index 3, 11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99, 107, 115, 123, 131, 139, 147, 155, 163, 171, 179, 187, 195, 203, 211, 219, and 227, 40 MHz Spacing" },
10600
  { 133, 133, "5.950 GHz, Channel center frequency index 7, 23, 39, 55, 71, 87, 103, 119, 135, 151, 167, 183, 199, and 215, 80 MHz Spacing" },
10601
  { 134, 134, "5.950 GHz, Channel center frequency index 15, 47, 79, 111, 143, 175, and 207, 160 MHz Spacing" },
10602
  { 135, 135, "5.950 GHz, Channel center frequency index 7, 23, 39, 55, 71, 87, 103, 119, 135, 151, 167, 183, 199, and 215, 80 MHz Spacing, 80+" },
10603
  { 136, 136, "5.925 GHz, Channel center frequency index 2, 20 MHz Spacing" },
10604
  { 137, 137, "5.925 GHz, Channel center frequency index 31, 63, 95, 127, 159, and 191, 320 MHz Spacing" },
10605
  { 138, 179, "Reserved" },
10606
  { 180, 180, "56.16 GHz, Channels 1, 2, 3, 4, 5, and 6, 2160 MHz Spacing" },
10607
  { 181, 181, "56.16 GHz, Channels 2 and 3, 2160 MHz Spacing" },
10608
  { 182, 182, "56.70 GHz, Channels 35, 36, 37, and 38, 1080 MHz Spacing" },
10609
  { 183, 183, "42.66 GHz, Channels 1, 2, 3, 4, 5, 6, 7, and 8, 540 MHz Spacing" },
10610
  { 184, 184, "47.52 GHz, Channels 9 and 10, 540 MHz Spacing" },
10611
  { 185, 185, "42.93 GHz, Channels 11, 12, 13, and 14, 1080 MHz Spacing" },
10612
  { 186, 186, "47.79 GHz, Channel 15, 1080 MHz Spacing" },
10613
  { 187, 191, "Reserved" },
10614
  { 192, 254, "Vendor-Specific" },
10615
10616
  { 255, 255, "Reserved" },
10617
  {   0,   0, NULL }
10618
};
10619
10620
static const value_string nai_realm_auth_param_id_vals[] = {
10621
  {   1, "Expanded EAP Method" },
10622
  {   2, "Non-EAP Inner Authentication Type" },
10623
  {   3, "Inner Authentication EAP Method Type" },
10624
  {   4, "Expanded Inner EAP Method" },
10625
  {   5, "Credential Type" },
10626
  {   6, "Tunneled EAP Method Credential Type" },
10627
  { 221, "Vendor Specific" },
10628
  { 0, NULL }
10629
};
10630
10631
static void
10632
dissect_nai_realm_list(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int end)
10633
0
{
10634
0
  uint16_t      count, len;
10635
0
  proto_item   *item, *r_item;
10636
0
  int           f_end, eap_end;
10637
0
  uint8_t       nai_len, eap_count, eap_len, auth_param_count, auth_param_len;
10638
0
  uint8_t       auth_param_id;
10639
0
  proto_tree   *realm_tree, *eap_tree;
10640
0
  const uint8_t *realm;
10641
10642
0
  count = tvb_get_letohs(tvb, offset);
10643
0
  proto_tree_add_item(tree, hf_ieee80211_ff_anqp_nai_realm_count,
10644
0
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
10645
0
  offset += 2;
10646
0
  while (count > 0) {
10647
0
    len = tvb_get_letohs(tvb, offset);
10648
0
    realm_tree = proto_tree_add_subtree(tree, tvb, offset, 2 + len, ett_nai_realm, &r_item, "NAI Realm Data");
10649
10650
0
    item = proto_tree_add_item(realm_tree, hf_ieee80211_ff_anqp_nai_field_len,
10651
0
                               tvb, offset, 2, ENC_LITTLE_ENDIAN);
10652
0
    offset += 2;
10653
0
    if (offset + len > end) {
10654
0
      expert_add_info_format(pinfo, item, &ei_ieee80211_ff_anqp_nai_field_len,
10655
0
                             "Invalid NAI Realm List");
10656
0
      break;
10657
0
    }
10658
0
    f_end = offset + len;
10659
0
    proto_tree_add_item(realm_tree, hf_ieee80211_ff_anqp_nai_realm_encoding,
10660
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10661
0
    offset += 1;
10662
0
    nai_len = tvb_get_uint8(tvb, offset);
10663
0
    proto_tree_add_item(realm_tree, hf_ieee80211_ff_anqp_nai_realm_length,
10664
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10665
0
    offset += 1;
10666
0
    if (offset + nai_len > f_end) {
10667
0
      expert_add_info_format(pinfo, r_item, &ei_ieee80211_ff_anqp_nai_field_len,
10668
0
                             "Invalid NAI Realm Data");
10669
0
      break;
10670
0
    }
10671
0
    proto_tree_add_item_ret_string(realm_tree, hf_ieee80211_ff_anqp_nai_realm,
10672
0
                        tvb, offset, nai_len, ENC_ASCII|ENC_NA, pinfo->pool, &realm);
10673
0
    if (realm) {
10674
0
      proto_item_append_text(r_item, " (%s)", realm);
10675
0
    }
10676
0
    offset += nai_len;
10677
0
    eap_count = tvb_get_uint8(tvb, offset);
10678
0
    proto_tree_add_item(realm_tree, hf_ieee80211_ff_anqp_nai_realm_eap_count,
10679
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10680
0
    offset += 1;
10681
10682
0
    while (eap_count > 0) {
10683
0
      eap_len = tvb_get_uint8(tvb, offset);
10684
0
      eap_end = offset + 1 + eap_len;
10685
0
      eap_tree = proto_tree_add_subtree(realm_tree, tvb, offset, 1 + eap_len,
10686
0
                                 ett_nai_realm_eap, NULL, "EAP Method");
10687
10688
0
      item = proto_tree_add_item(eap_tree,
10689
0
                                 hf_ieee80211_ff_anqp_nai_realm_eap_len,
10690
0
                                 tvb, offset, 1, ENC_LITTLE_ENDIAN);
10691
0
      offset += 1;
10692
0
      if (offset + eap_len > f_end) {
10693
0
        expert_add_info(pinfo, item, &ei_ieee80211_ff_anqp_nai_realm_eap_len);
10694
0
        break;
10695
0
      }
10696
10697
0
      proto_item_append_text(eap_tree, ": %s",
10698
0
                             val_to_str_ext(tvb_get_uint8(tvb, offset),
10699
0
                                            &eap_type_vals_ext, "Unknown (%d)"));
10700
0
      proto_tree_add_item(eap_tree, hf_ieee80211_ff_anqp_nai_realm_eap_method,
10701
0
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
10702
0
      offset += 1;
10703
0
      auth_param_count = tvb_get_uint8(tvb, offset);
10704
0
      proto_tree_add_item(eap_tree,
10705
0
                          hf_ieee80211_ff_anqp_nai_realm_auth_param_count,
10706
0
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
10707
0
      offset += 1;
10708
10709
0
      while (auth_param_count > 0) {
10710
0
        auth_param_id = tvb_get_uint8(tvb, offset);
10711
0
        proto_tree_add_item(eap_tree,
10712
0
                            hf_ieee80211_ff_anqp_nai_realm_auth_param_id,
10713
0
                            tvb, offset, 1, ENC_LITTLE_ENDIAN);
10714
0
        offset += 1;
10715
0
        auth_param_len = tvb_get_uint8(tvb, offset);
10716
0
        proto_tree_add_item(eap_tree,
10717
0
                            hf_ieee80211_ff_anqp_nai_realm_auth_param_len,
10718
0
                            tvb, offset, 1, ENC_LITTLE_ENDIAN);
10719
0
        offset += 1;
10720
0
        item = proto_tree_add_item(
10721
0
          eap_tree, hf_ieee80211_ff_anqp_nai_realm_auth_param_value,
10722
0
          tvb, offset, auth_param_len, ENC_NA);
10723
0
        if ((auth_param_id == 3) && (auth_param_len == 1)) {
10724
0
          uint8_t inner_method = tvb_get_uint8(tvb, offset);
10725
0
          const char *str;
10726
0
          str = val_to_str_ext(inner_method, &eap_type_vals_ext, "Unknown (%d)");
10727
10728
0
          proto_item_append_text(eap_tree, " / %s", str);
10729
0
          proto_item_append_text(item, " - %s", str);
10730
0
        }
10731
0
        offset += auth_param_len;
10732
10733
0
        auth_param_count--;
10734
0
      }
10735
10736
0
      offset = eap_end;
10737
0
      eap_count--;
10738
0
    }
10739
10740
0
    offset = f_end;
10741
0
    count--;
10742
0
  }
10743
0
}
10744
10745
static void
10746
dissect_3gpp_cellular_network_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
10747
0
{
10748
0
  uint8_t     iei, num, plmn_idx = 0;
10749
0
  proto_item *item;
10750
10751
  /* See Annex A of 3GPP TS 24.234 v8.1.0 for description */
10752
0
  proto_tree_add_item(tree, hf_ieee80211_3gpp_gc_gud, tvb, offset, 1, ENC_LITTLE_ENDIAN);
10753
0
  offset += 1;
10754
0
  proto_tree_add_item(tree, hf_ieee80211_3gpp_gc_udhl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
10755
0
  offset += 1;
10756
0
  iei = tvb_get_uint8(tvb, offset);
10757
0
  item = proto_tree_add_item(tree, hf_ieee80211_3gpp_gc_iei, tvb, offset, 1, ENC_LITTLE_ENDIAN);
10758
0
  if (iei == 0)
10759
0
    proto_item_append_text(item, " (PLMN List)");
10760
0
  else
10761
0
    return;
10762
0
  offset += 1;
10763
0
  proto_tree_add_item(tree, hf_ieee80211_3gpp_gc_plmn_len, tvb, offset, 1, ENC_LITTLE_ENDIAN);
10764
0
  offset += 1;
10765
0
  num = tvb_get_uint8(tvb, offset);
10766
0
  proto_tree_add_item(tree, hf_ieee80211_3gpp_gc_num_plmns, tvb, offset, 1, ENC_LITTLE_ENDIAN);
10767
0
  offset += 1;
10768
0
  while (num > 0) {
10769
0
    proto_item *plmn_item = NULL;
10770
0
    proto_tree *plmn_tree = NULL;
10771
0
    unsigned plmn_val = 0;
10772
10773
0
    if (tvb_reported_length_remaining(tvb, offset) < 3)
10774
0
      break;
10775
0
    plmn_val = tvb_get_letoh24(tvb, offset);
10776
0
    plmn_item = proto_tree_add_uint_format(tree, hf_ieee80211_3gpp_gc_plmn,
10777
0
                                tvb, offset, 3, plmn_val, "PLMN %d (0x%x)",
10778
0
                                plmn_idx++, plmn_val);
10779
0
    plmn_tree = proto_item_add_subtree(plmn_item, ett_ieee80211_3gpp_plmn);
10780
0
    dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, plmn_tree, offset, E212_NONE, true);
10781
0
    num--;
10782
0
    offset += 3;
10783
0
  }
10784
0
}
10785
10786
static void
10787
dissect_domain_name_list(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
10788
0
{
10789
0
  uint8_t len;
10790
10791
0
  while (offset < end) {
10792
0
    len = tvb_get_uint8(tvb, offset);
10793
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_domain_name_len,
10794
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10795
0
    offset += 1;
10796
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_domain_name,
10797
0
                        tvb, offset, len, ENC_ASCII);
10798
0
    offset += len;
10799
0
  }
10800
0
}
10801
10802
static int
10803
dissect_hs20_subscription_remediation(tvbuff_t *tvb, packet_info *pinfo _U_,
10804
  proto_tree *tree, void *data _U_)
10805
0
{
10806
0
  int offset = 0;
10807
0
  uint8_t url_len = tvb_get_uint8(tvb, offset);
10808
0
  proto_item *pi = NULL;
10809
10810
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_subscription_remediation_url_len, tvb, offset,
10811
0
                        1, ENC_NA);
10812
0
  offset++;
10813
0
  if (tvb_reported_length_remaining(tvb, offset) >= url_len) {
10814
0
    pi = proto_tree_add_item(tree, hf_ieee80211_hs20_subscription_remediation_server_url,
10815
0
                        tvb, offset, url_len, ENC_ASCII);
10816
0
    offset += url_len;
10817
0
    proto_item_set_url(pi);
10818
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_subscription_remediation_server_method,
10819
0
                        tvb, offset, 1, ENC_NA);
10820
0
    offset++;
10821
0
  }
10822
10823
0
  return offset;
10824
0
}
10825
10826
static int
10827
dissect_hs20_deauthentication_imminent(tvbuff_t *tvb, packet_info *pinfo _U_,
10828
  proto_tree *tree, void *data _U_)
10829
0
{
10830
0
  int offset = 0;
10831
0
  uint8_t url_len = 0;
10832
0
  proto_item *pi = NULL;
10833
10834
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_deauth_reason_code, tvb, offset, 1, ENC_NA);
10835
0
  offset++;
10836
10837
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_reauth_delay, tvb, offset, 2,
10838
0
                        ENC_LITTLE_ENDIAN);
10839
0
  offset += 2;
10840
10841
0
  url_len = tvb_get_uint8(tvb, offset);
10842
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_deauth_reason_url_len, tvb, offset, 1,
10843
0
                        ENC_NA);
10844
0
  offset++;
10845
10846
0
  if (tvb_reported_length_remaining(tvb, offset) >= url_len) {
10847
0
    pi = proto_tree_add_item(tree, hf_ieee80211_hs20_deauth_imminent_reason_url,
10848
0
                        tvb, offset, url_len, ENC_ASCII);
10849
0
    offset += url_len;
10850
0
    proto_item_set_url(pi);
10851
0
  }
10852
0
  return offset;
10853
0
}
10854
10855
0
#define HS20_ANQP_HS_QUERY_LIST              1
10856
0
#define HS20_ANQP_HS_CAPABILITY_LIST         2
10857
0
#define HS20_ANQP_OPERATOR_FRIENDLY_NAME     3
10858
0
#define HS20_ANQP_WAN_METRICS                4
10859
0
#define HS20_ANQP_CONNECTION_CAPABILITY      5
10860
0
#define HS20_ANQP_NAI_HOME_REALM_QUERY       6
10861
0
#define HS20_ANQP_OPERATING_CLASS_INDICATION 7
10862
0
#define HS20_ANQP_OSU_PROVIDERS_LIST         8
10863
/* 9 is reserved */
10864
0
#define HS20_ANQP_ICON_REQUEST               10
10865
0
#define HS20_ANQP_ICON_BINARY_FILE           11
10866
0
#define HS20_ANQP_OPERATOR_ICON_METADATA     12
10867
0
#define HS20_ANQP_ADVICE_OF_CHARGE           13
10868
10869
static const value_string hs20_anqp_subtype_vals[] = {
10870
  { HS20_ANQP_HS_QUERY_LIST, "HS Query list" },
10871
  { HS20_ANQP_HS_CAPABILITY_LIST, "HS Capability List" },
10872
  { HS20_ANQP_OPERATOR_FRIENDLY_NAME, "Operator Friendly Name" },
10873
  { HS20_ANQP_WAN_METRICS, "WAN Metrics" },
10874
  { HS20_ANQP_CONNECTION_CAPABILITY, "Connection Capability" },
10875
  { HS20_ANQP_NAI_HOME_REALM_QUERY, "NAI Home Realm Query" },
10876
  { HS20_ANQP_OPERATING_CLASS_INDICATION, "Operating Class Indication" },
10877
  { HS20_ANQP_OSU_PROVIDERS_LIST, "OSU Providers List" },
10878
  { 9, "Reserved" },
10879
  { HS20_ANQP_ICON_REQUEST, "Icon Request" },
10880
  { HS20_ANQP_ICON_BINARY_FILE, "Icon Binary File" },
10881
  { HS20_ANQP_OPERATOR_ICON_METADATA, "Operator Icon Metadata" },
10882
  { HS20_ANQP_ADVICE_OF_CHARGE, "Advice of Charge" },
10883
  { 0, NULL }
10884
};
10885
10886
static void
10887
dissect_hs20_anqp_hs_query_list(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
10888
0
{
10889
0
  while (offset < end) {
10890
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_hs_query_list,
10891
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
10892
0
    offset++;
10893
0
  }
10894
0
}
10895
10896
static void
10897
dissect_hs20_anqp_operator_friendly_name(proto_tree *tree, tvbuff_t *tvb,
10898
                                         packet_info *pinfo, int offset,
10899
                                         int end, int hf_array[],
10900
                                         int ett_val)
10901
0
{
10902
0
  int ofn_index = 0;
10903
10904
0
  while (offset + 4 <= end) {
10905
0
    uint8_t vlen = tvb_get_uint8(tvb, offset);
10906
0
    proto_tree *ofn_tree = NULL;
10907
0
    proto_item *item = NULL, *pi = NULL;
10908
0
    int start_offset = offset;
10909
10910
0
    ofn_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_val,
10911
0
                                        &pi, "Friendly Name [%d]", ofn_index + 1);
10912
10913
0
    item = proto_tree_add_item(ofn_tree, hf_array[0],
10914
0
                               tvb, offset, 1, ENC_LITTLE_ENDIAN);
10915
0
    offset++;
10916
0
    if (vlen > end - offset || vlen < 3) {
10917
0
      expert_add_info(pinfo, item, &ei_hs20_anqp_ofn_length);
10918
0
      break;
10919
0
    }
10920
0
    proto_tree_add_item(ofn_tree, hf_array[1],
10921
0
                        tvb, offset, 3, ENC_ASCII|ENC_NA);
10922
0
    proto_tree_add_item(ofn_tree, hf_array[2],
10923
0
                        tvb, offset + 3, vlen - 3, ENC_UTF_8);
10924
0
    offset += vlen;
10925
10926
0
    proto_item_set_len(pi, offset - start_offset);
10927
0
    ofn_index++;
10928
0
  }
10929
0
}
10930
10931
static const value_string hs20_wm_link_status_vals[] = {
10932
  { 0, "Reserved" },
10933
  { 1, "Link up" },
10934
  { 2, "Link down" },
10935
  { 3, "Link in test state" },
10936
  { 0, NULL }
10937
};
10938
10939
static void
10940
dissect_hs20_anqp_wan_metrics(proto_tree *tree, tvbuff_t *tvb, int offset, bool request)
10941
0
{
10942
0
  if (request)
10943
0
    return;
10944
10945
0
  if(tvb_reported_length_remaining(tvb, offset) < 13)
10946
0
    return;
10947
10948
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_link_status,
10949
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10950
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_symmetric_link,
10951
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10952
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_at_capacity,
10953
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10954
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_reserved,
10955
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10956
0
  offset++;
10957
10958
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_downlink_speed,
10959
0
                      tvb, offset, 4, ENC_LITTLE_ENDIAN);
10960
0
  offset += 4;
10961
10962
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_uplink_speed,
10963
0
                      tvb, offset, 4, ENC_LITTLE_ENDIAN);
10964
0
  offset += 4;
10965
10966
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_downlink_load,
10967
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10968
0
  offset++;
10969
10970
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_uplink_load,
10971
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
10972
0
  offset++;
10973
10974
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_wan_metrics_lmd,
10975
0
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
10976
0
}
10977
10978
static const value_string hs20_cc_proto_vals[] = {
10979
  {  1, "ICMP" },
10980
  {  6, "TCP" },
10981
  { 17, "UDP" },
10982
  { 50, "ESP" },
10983
  {  0, NULL }
10984
};
10985
10986
static const value_string hs20_cc_port_vals[] = {
10987
  {    0, "[Supported]" }, /* Used to indicate ICMP, ESP for IPSec VPN, or IKEv2 for IPSec VPN */
10988
  {   20, "FTP" },
10989
  {   22, "SSH" },
10990
  {   80, "HTTP" },
10991
  {  443, "HTTPS" },
10992
  {  500, "IKEv2 for IPSec VPN" },
10993
  { 1723, "PPTP for IPSec VPN" },
10994
  { 4500, "[Optional] IKEv2 for IPSec VPN" },
10995
  { 5060, "VOIP" },
10996
  {    0, NULL },
10997
};
10998
10999
static const value_string hs20_cc_status_vals[] = {
11000
  { 0, "Closed" },
11001
  { 1, "Open" },
11002
  { 2, "Unknown" },
11003
  { 0, NULL }
11004
};
11005
11006
static void
11007
dissect_hs20_anqp_connection_capability(proto_tree *tree, tvbuff_t *tvb,
11008
                                        int offset, int end)
11009
0
{
11010
0
  proto_tree *tuple;
11011
0
  while (offset + 4 <= end) {
11012
0
    uint8_t ip_proto, status;
11013
0
    uint16_t port_num;
11014
11015
0
    ip_proto = tvb_get_uint8(tvb, offset);
11016
0
    port_num = tvb_get_letohs(tvb, offset + 1);
11017
0
    status = tvb_get_uint8(tvb, offset + 3);
11018
11019
0
    tuple = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_hs20_cc_proto_port_tuple, NULL,
11020
0
                               "ProtoPort Tuple - ip_proto=%s port_num=%s status=%s",
11021
0
                               val_to_str(ip_proto, hs20_cc_proto_vals, "Unknown (%u)"),
11022
0
                               val_to_str(port_num, hs20_cc_port_vals, "Unknown (%u)"),
11023
0
                               val_to_str(status, hs20_cc_status_vals, "Reserved (%u)"));
11024
0
    proto_tree_add_item(tuple, hf_ieee80211_hs20_anqp_cc_proto_ip_proto,
11025
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
11026
0
    offset++;
11027
0
    proto_tree_add_item(tuple, hf_ieee80211_hs20_anqp_cc_proto_port_num,
11028
0
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
11029
0
    offset += 2;
11030
0
    proto_tree_add_item(tuple, hf_ieee80211_hs20_anqp_cc_proto_status,
11031
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
11032
0
    offset++;
11033
0
  }
11034
0
}
11035
11036
static void
11037
dissect_hs20_anqp_nai_home_realm_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
11038
                                       int offset, int end)
11039
0
{
11040
0
  uint8_t len;
11041
0
  proto_item *item;
11042
11043
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_nai_hrq_count,
11044
0
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
11045
0
  offset++;
11046
11047
0
  while (offset + 2 <= end) {
11048
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_nai_hrq_encoding_type,
11049
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
11050
0
    offset++;
11051
0
    len = tvb_get_uint8(tvb, offset);
11052
0
    item = proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_nai_hrq_length,
11053
0
                               tvb, offset, 1, ENC_LITTLE_ENDIAN);
11054
0
    offset++;
11055
0
    if (offset + len > end) {
11056
0
      expert_add_info(pinfo, item, &ei_hs20_anqp_nai_hrq_length);
11057
0
      break;
11058
0
    }
11059
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_nai_hrq_realm_name,
11060
0
                        tvb, offset, len, ENC_ASCII);
11061
0
    offset += len;
11062
0
  }
11063
0
}
11064
11065
static void
11066
dissect_hs20_anqp_oper_class_indic(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
11067
0
{
11068
0
  while (offset < end) {
11069
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_oper_class_indic,
11070
0
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
11071
0
    offset++;
11072
0
  }
11073
0
}
11074
11075
static int
11076
dissect_hs20_osu_friendly_names(proto_tree *tree, tvbuff_t *tvb,
11077
  packet_info *pinfo, int offset, int end _U_)
11078
0
{
11079
0
  int osu_fn_hf_array[3] = {hf_ieee80211_hs20_osu_friendly_name_length,
11080
0
                            hf_ieee80211_hs20_osu_friendly_name_language,
11081
0
                            hf_ieee80211_hs20_osu_friendly_name_name };
11082
0
  uint16_t osu_fn_count = tvb_get_letohs(tvb, offset);
11083
0
  proto_tree *fn_tree = NULL;
11084
11085
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_osu_friendly_names_len, tvb, offset, 2,
11086
0
                        ENC_LITTLE_ENDIAN);
11087
0
  offset += 2;
11088
11089
0
  fn_tree = proto_tree_add_subtree(tree, tvb, offset, osu_fn_count,
11090
0
                        ett_hs20_friendly_names_list, NULL,
11091
0
                        "Friendly Names List");
11092
11093
0
  dissect_hs20_anqp_operator_friendly_name(fn_tree, tvb, pinfo, offset,
11094
0
                        offset + osu_fn_count,
11095
0
                        osu_fn_hf_array, ett_hs20_friendly_name_tree);
11096
11097
0
  return offset + osu_fn_count;
11098
0
}
11099
11100
static int
11101
dissect_hs20_osu_icon_available(proto_tree *tree, tvbuff_t *tvb,
11102
  packet_info *pinfo _U_, int offset, int end _U_, uint16_t icon_index)
11103
0
{
11104
0
  proto_tree *icon_avail = NULL;
11105
0
  proto_item *pi = NULL;
11106
0
  int start_offset = offset;
11107
0
  uint8_t icon_type_len = 0, icon_filename_len = 0;
11108
11109
0
  icon_avail = proto_tree_add_subtree_format(tree, tvb, offset, -1,
11110
0
                        ett_hs20_osu_icon_tree, &pi,
11111
0
                        "Icon Available %d", icon_index);
11112
11113
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_width, tvb, offset, 2,
11114
0
                        ENC_LITTLE_ENDIAN);
11115
0
  offset += 2;
11116
11117
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_height, tvb, offset, 2,
11118
0
                        ENC_LITTLE_ENDIAN);
11119
0
  offset += 2;
11120
11121
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_lang_code, tvb, offset, 3,
11122
0
                        ENC_ASCII);
11123
0
  offset += 3;
11124
11125
0
  icon_type_len = tvb_get_uint8(tvb, offset);
11126
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_icon_type_len, tvb, offset,
11127
0
                        1, ENC_NA);
11128
0
  offset++;
11129
11130
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_icon_type, tvb, offset,
11131
0
                        icon_type_len, ENC_ASCII);
11132
0
  offset += icon_type_len;
11133
11134
0
  icon_filename_len = tvb_get_uint8(tvb, offset);
11135
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_filename_len, tvb, offset,
11136
0
                        1, ENC_NA);
11137
0
  offset++;
11138
11139
0
  proto_tree_add_item(icon_avail, hf_ieee80211_osu_icon_avail_filename, tvb, offset,
11140
0
                        icon_filename_len, ENC_ASCII);
11141
0
  offset += icon_filename_len;
11142
11143
0
  proto_item_set_len(pi, offset - start_offset);
11144
11145
0
  return offset;
11146
0
}
11147
11148
static const value_string osu_method_vals[] = {
11149
  { 0, "OMA DM" },
11150
  { 1, "SOAP XML SPP" },
11151
  { 0, NULL },
11152
};
11153
11154
static int
11155
dissect_hs20_osu_provider(proto_tree *tree, tvbuff_t *tvb,
11156
  packet_info *pinfo, int offset, int end, uint8_t provider_index)
11157
0
{
11158
0
  proto_tree *prov_tree = NULL;
11159
0
  proto_item *osupi = NULL, *uri_pi = NULL;
11160
0
  int start_offset = offset;
11161
0
  uint8_t osu_server_uri_len = 0;
11162
0
  uint8_t osu_method_list_len = 0;
11163
0
  uint16_t icons_avail = 0, icons_index = 0;
11164
0
  uint8_t osu_nai_len = 0;
11165
0
  uint16_t osu_service_desc_len = 0;
11166
11167
0
  prov_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
11168
0
                        ett_hs20_osu_provider_tree, &osupi,
11169
0
                        "OSU Provider %d", provider_index);
11170
11171
0
  proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_prov_length, tvb, offset, 2,
11172
0
                        ENC_LITTLE_ENDIAN);
11173
0
  offset += 2;
11174
11175
0
  offset = dissect_hs20_osu_friendly_names(prov_tree, tvb, pinfo, offset, end);
11176
11177
0
  proto_item_set_len(osupi, offset - start_offset);
11178
11179
0
  osu_server_uri_len = tvb_get_uint8(tvb, offset);
11180
0
  proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_server_uri_len, tvb, offset, 1,
11181
0
                        ENC_NA);
11182
0
  offset++;
11183
11184
0
  uri_pi = proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_server_uri, tvb, offset,
11185
0
                        osu_server_uri_len, ENC_ASCII);
11186
0
  offset += osu_server_uri_len;
11187
0
  proto_item_set_url(uri_pi);
11188
11189
0
  osu_method_list_len = tvb_get_uint8(tvb, offset);
11190
0
  proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_method_list_len, tvb, offset, 1,
11191
0
                        ENC_NA);
11192
0
  offset++;
11193
11194
0
  if (osu_method_list_len > 0) {
11195
0
    proto_tree *osu_method_list = NULL;
11196
0
    uint8_t osu_method_list_index = 0;
11197
11198
0
    osu_method_list = proto_tree_add_subtree(prov_tree, tvb, offset,
11199
0
                                osu_method_list_len,
11200
0
                                ett_hs20_osu_provider_method_list,
11201
0
                                NULL, "OSU Method List");
11202
0
    while (osu_method_list_len > osu_method_list_index) {
11203
0
      proto_item *pi = NULL;
11204
0
      uint8_t method = tvb_get_uint8(tvb, offset);
11205
11206
0
      pi = proto_tree_add_item(osu_method_list, hf_ieee80211_hs20_osu_method_val, tvb,
11207
0
                        offset, 1, ENC_NA);
11208
0
      proto_item_append_text(pi, ": %s",
11209
0
                                val_to_str_const(method, osu_method_vals,
11210
0
                                        "Reserved"));
11211
0
      offset++;
11212
0
      osu_method_list_index++;
11213
0
    }
11214
0
  }
11215
11216
0
  icons_avail = tvb_get_letohs(tvb, offset);
11217
0
  proto_tree_add_item(prov_tree, hf_ieee80211_hs20_icons_avail_len, tvb, offset, 2,
11218
0
                        ENC_LITTLE_ENDIAN);
11219
0
  offset += 2;
11220
11221
0
  if (icons_avail > 0) {
11222
0
    proto_tree *icon_list = NULL;
11223
0
    proto_item *pi = NULL;
11224
11225
0
    start_offset = offset;
11226
11227
0
    icon_list = proto_tree_add_subtree(prov_tree, tvb, offset, -1,
11228
0
                                ett_osu_icons_avail_list, &pi,
11229
0
                                "Icons Available");
11230
11231
0
    while ((offset - start_offset) < icons_avail) {
11232
0
      offset = dissect_hs20_osu_icon_available(icon_list, tvb, pinfo, offset,
11233
0
                                end, icons_index);
11234
0
      icons_index++;
11235
0
    }
11236
11237
0
    proto_item_set_len(pi, offset - start_offset);
11238
0
  }
11239
11240
0
  osu_nai_len = tvb_get_uint8(tvb, offset);
11241
0
  proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_nai_len, tvb, offset, 1, ENC_NA);
11242
0
  offset++;
11243
11244
0
  if (osu_nai_len > 0) {
11245
0
    proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_nai, tvb, offset,
11246
0
                        osu_nai_len, ENC_ASCII);
11247
0
    offset += osu_nai_len;
11248
0
  }
11249
11250
0
  osu_service_desc_len = tvb_get_letohs(tvb, offset);
11251
0
  proto_tree_add_item(prov_tree, hf_ieee80211_hs20_osu_service_desc_len, tvb, offset, 2,
11252
0
                        ENC_LITTLE_ENDIAN);
11253
0
  offset += 2;
11254
11255
0
  if (osu_service_desc_len > 0) {
11256
0
    proto_tree *desc_tree = NULL;
11257
0
    proto_item *pi = NULL;
11258
0
    uint8_t service_desc_index = 0;
11259
11260
0
    start_offset = offset;
11261
0
    desc_tree = proto_tree_add_subtree(prov_tree, tvb, offset, -1,
11262
0
                                ett_hs20_osu_service_desc_list, &pi,
11263
0
                                "OSU Service Description List");
11264
11265
0
    while ((offset - start_offset) < osu_service_desc_len) {
11266
0
      proto_tree *desc_duple = NULL;
11267
0
      uint8_t serv_desc_len = tvb_get_uint8(tvb, offset);
11268
11269
0
      desc_duple = proto_tree_add_subtree_format(desc_tree, tvb, offset,
11270
0
                                1 + serv_desc_len,
11271
0
                                ett_hs20_osu_service_desc_tree, NULL,
11272
0
                                "OSU Service Description Duple %d",
11273
0
                                service_desc_index);
11274
11275
0
      proto_tree_add_item(desc_duple, hf_ieee80211_hs20_osu_service_desc_duple_len, tvb,
11276
0
                                offset, 1, ENC_NA);
11277
0
      offset++;
11278
11279
0
      proto_tree_add_item(desc_duple, hf_ieee80211_hs20_osu_service_desc_lang, tvb, offset,
11280
0
                                3, ENC_ASCII);
11281
0
      offset += 3;
11282
11283
0
      proto_tree_add_item(desc_duple, hf_ieee80211_hs20_osu_service_desc, tvb, offset,
11284
0
                                serv_desc_len - 3, ENC_ASCII);
11285
0
      offset += serv_desc_len - 3;
11286
11287
0
      service_desc_index++;
11288
0
    }
11289
11290
0
    proto_item_set_len(pi, offset - start_offset);
11291
0
  }
11292
11293
0
  return offset;
11294
0
}
11295
11296
static void
11297
dissect_hs20_anqp_osu_providers_list(proto_tree *tree, tvbuff_t *tvb,
11298
  packet_info *pinfo, int offset, int end)
11299
0
{
11300
0
  uint8_t ssid_len = tvb_get_uint8(tvb, offset);
11301
0
  uint8_t osu_prov_count = 0, osu_prov_index = 0;
11302
11303
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_osu_providers_list_ssid_len, tvb, offset, 1,
11304
0
                        ENC_NA);
11305
0
  offset++;
11306
11307
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_osu_providers_ssid, tvb, offset, ssid_len,
11308
0
                        ENC_UTF_8);
11309
0
  offset += ssid_len;
11310
11311
0
  osu_prov_count = tvb_get_uint8(tvb, offset);
11312
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_osu_providers_count, tvb, offset, 1,
11313
0
                        ENC_NA);
11314
0
  offset++;
11315
11316
0
  if (osu_prov_count > 0) {
11317
0
    int start_offset = offset;
11318
0
    proto_item *pi = NULL;
11319
0
    proto_tree *osu_prov_list = NULL;
11320
11321
0
    osu_prov_list = proto_tree_add_subtree(tree, tvb, offset, -1,
11322
0
                        ett_hs20_osu_providers_list, &pi,
11323
0
                        "OSU Providers List");
11324
0
    while (offset < end && osu_prov_count > osu_prov_index) {
11325
0
      offset = dissect_hs20_osu_provider(osu_prov_list, tvb, pinfo, offset, end,
11326
0
                        osu_prov_index);
11327
0
      osu_prov_index++;
11328
0
    }
11329
11330
0
    proto_item_set_len(pi, offset - start_offset);
11331
0
  }
11332
0
}
11333
11334
static void
11335
dissect_hs20_anqp_icon_request(proto_tree *tree, tvbuff_t *tvb, int offset,
11336
  int end)
11337
0
{
11338
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_icon_request_filename, tvb, offset,
11339
0
                        end - offset, ENC_UTF_8);
11340
0
}
11341
11342
static const value_string hs20_icon_download_status_vals[] = {
11343
  { 0, "Success" },
11344
  { 1, "File not found" },
11345
  { 2, "Unspecified file error" },
11346
  { 0, NULL }
11347
};
11348
11349
static void
11350
dissect_hs20_anqp_icon_binary_file(proto_tree *tree, tvbuff_t *tvb, int offset,
11351
  int end _U_)
11352
0
{
11353
0
  uint8_t icon_download_status = tvb_get_uint8(tvb, offset);
11354
0
  proto_item *pi = NULL;
11355
0
  uint8_t icon_type_len = 0;
11356
0
  uint16_t icon_binary_data_len = 0;
11357
11358
0
  pi = proto_tree_add_item(tree, hf_ieee80211_hs20_icon_binary_file_status, tvb, offset, 1,
11359
0
                        ENC_NA);
11360
0
  offset++;
11361
0
  proto_item_append_text(pi, ": %s",
11362
0
                         val_to_str(icon_download_status,
11363
0
                                    hs20_icon_download_status_vals,
11364
0
                                    "Reserved (%u)"));
11365
11366
0
  icon_type_len = tvb_get_uint8(tvb, offset);
11367
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_icon_type_length, tvb, offset, 1, ENC_NA);
11368
0
  offset++;
11369
11370
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_icon_type, tvb, offset, icon_type_len,
11371
0
                        ENC_UTF_8);
11372
0
  offset += icon_type_len;
11373
11374
0
  icon_binary_data_len = tvb_get_letohs(tvb, offset);
11375
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_icon_binary_data_len, tvb, offset, 2,
11376
0
                        ENC_BIG_ENDIAN);
11377
0
  offset += 2;
11378
11379
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_icon_binary_data, tvb, offset,
11380
0
                        icon_binary_data_len, ENC_NA);
11381
0
}
11382
11383
static void
11384
dissect_hs20_anqp_operator_icon_metadata(proto_tree *tree, tvbuff_t *tvb,
11385
  int offset, int end _U_)
11386
0
{
11387
0
  proto_item *pi = NULL;
11388
0
  int start_offset = offset;
11389
0
  uint8_t icon_type_len = 0, icon_filename_len = 0;
11390
11391
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_width, tvb, offset, 2,
11392
0
                        ENC_LITTLE_ENDIAN);
11393
0
  offset += 2;
11394
11395
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_height, tvb, offset, 2,
11396
0
                        ENC_LITTLE_ENDIAN);
11397
0
  offset += 2;
11398
11399
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_lang_code, tvb, offset, 3,
11400
0
                        ENC_ASCII);
11401
0
  offset += 3;
11402
11403
0
  icon_type_len = tvb_get_uint8(tvb, offset);
11404
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_icon_type_len, tvb, offset,
11405
0
                        1, ENC_NA);
11406
0
  offset++;
11407
11408
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_icon_type, tvb, offset,
11409
0
                        icon_type_len, ENC_ASCII);
11410
0
  offset += icon_type_len;
11411
11412
0
  icon_filename_len = tvb_get_uint8(tvb, offset);
11413
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_filename_len, tvb, offset,
11414
0
                        1, ENC_NA);
11415
0
  offset++;
11416
11417
0
  proto_tree_add_item(tree, hf_ieee80211_osu_icon_avail_filename, tvb, offset,
11418
0
                        icon_filename_len, ENC_ASCII);
11419
0
  offset += icon_filename_len;
11420
11421
0
  proto_item_set_len(pi, offset - start_offset);
11422
0
}
11423
11424
static void
11425
dissect_anqp_venue_url(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
11426
0
{
11427
0
  uint16_t url_duple_index = 0;
11428
11429
0
  while (offset < end) {
11430
0
    proto_tree *venue_url = NULL;
11431
0
    proto_item *url_pi = NULL;
11432
0
    uint8_t url_duple_len = tvb_get_uint8(tvb, offset);
11433
11434
0
    venue_url = proto_tree_add_subtree_format(tree, tvb, offset,
11435
0
                        url_duple_len + 1, ett_hs20_venue_url, NULL,
11436
0
                        "Venue URL Duple %d", url_duple_index);
11437
11438
0
    proto_tree_add_item(venue_url, hf_ieee80211_hs20_anqp_venue_url_length, tvb, offset,
11439
0
                        1, ENC_NA);
11440
0
    offset++;
11441
11442
0
    proto_tree_add_item(venue_url, hf_ieee80211_hs20_anqp_venue_number, tvb, offset, 1,
11443
0
                        ENC_NA);
11444
0
    offset++;
11445
11446
0
    url_pi = proto_tree_add_item(venue_url, hf_ieee80211_hs20_anqp_venue_url, tvb, offset,
11447
0
                        url_duple_len -1, ENC_ASCII);
11448
0
    proto_item_set_url(url_pi);
11449
11450
0
    offset += (url_duple_len - 1);
11451
11452
0
    url_duple_index++;
11453
0
  }
11454
0
}
11455
11456
static const value_string advice_of_charge_type_vals[] = {
11457
  { 0, "Time-based" },
11458
  { 1, "Data-volume-based" },
11459
  { 2, "Time-and-data-volume-based" },
11460
  { 3, "Unlimited" },
11461
  { 0, NULL }
11462
};
11463
11464
static void
11465
dissect_hs20_anqp_advice_of_charge(proto_tree *tree, tvbuff_t *tvb, int offset,
11466
  int end _U_)
11467
0
{
11468
0
  uint16_t toc_index = 0;
11469
11470
0
  while (offset < end) {
11471
0
    uint16_t adv_charge_len = tvb_get_letohs(tvb, offset);
11472
0
    proto_tree *aoc_tree = NULL;
11473
0
    proto_tree *plan_info_tree = NULL;
11474
0
    proto_item *pi = NULL, *tpi = NULL;
11475
0
    int start_offset = offset;
11476
0
    uint8_t aoc_type = 0, nai_realm_len = 0;
11477
0
    uint8_t plan_index = 0;
11478
0
    uint16_t plan_tot_len = 0;
11479
0
    int plan_offset = 0;
11480
11481
0
    aoc_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
11482
0
                        ett_hs20_advice_of_charge, &pi,
11483
0
                        "Advice of Charge Duple %d", toc_index);
11484
0
    proto_tree_add_item(aoc_tree, hf_ieee80211_hs20_anqp_advice_of_charge_length, tvb,
11485
0
                        offset, 2, ENC_LITTLE_ENDIAN);
11486
0
    offset += 2;
11487
11488
0
    aoc_type = tvb_get_uint8(tvb, offset);
11489
0
    tpi = proto_tree_add_item(aoc_tree, hf_ieee80211_hs20_anqp_advice_of_charge_type, tvb,
11490
0
                        offset, 1, ENC_NA);
11491
0
    offset++;
11492
0
    proto_item_append_text(tpi, ": %s",
11493
0
                                val_to_str(aoc_type,
11494
0
                                        advice_of_charge_type_vals,
11495
0
                                        "Reserved (%u)"));
11496
11497
0
    proto_tree_add_item(aoc_tree, hf_ieee80211_hs20_anqp_aoc_nai_realm_encoding, tvb,
11498
0
                        offset, 1, ENC_NA);
11499
0
    offset++;
11500
11501
0
    nai_realm_len = tvb_get_uint8(tvb, offset);
11502
0
    proto_tree_add_item(aoc_tree, hf_ieee80211_hs20_anqp_aoc_nai_realm_len, tvb, offset,
11503
0
                        1, ENC_NA);
11504
0
    offset++;
11505
11506
0
    proto_tree_add_item(aoc_tree, hf_ieee80211_hs20_anqp_aoc_nai_realm, tvb, offset,
11507
0
                        nai_realm_len, ENC_UTF_8);
11508
0
    offset += nai_realm_len;
11509
11510
0
    plan_tot_len = adv_charge_len - 3 - nai_realm_len;
11511
0
    plan_offset = offset;
11512
11513
0
    while (offset < (plan_offset + plan_tot_len)) {
11514
0
        uint16_t plan_len = tvb_get_letohs(tvb, offset);
11515
11516
0
        plan_info_tree = proto_tree_add_subtree_format(aoc_tree, tvb, offset,
11517
0
                                plan_len + 2, ett_hs20_aoc_plan, NULL,
11518
0
                                "Plan #%u", plan_index);
11519
11520
0
        proto_tree_add_item(plan_info_tree, hf_ieee80211_hs20_anqp_aoc_plan_len, tvb,
11521
0
                        offset, 2, ENC_LITTLE_ENDIAN);
11522
0
        offset += 2;
11523
11524
0
        proto_tree_add_item(plan_info_tree, hf_ieee80211_hs20_anqp_aoc_plan_lang, tvb,
11525
0
                        offset, 3, ENC_ASCII);
11526
0
        offset += 3;
11527
11528
0
        proto_tree_add_item(plan_info_tree, hf_ieee80211_hs20_anqp_aoc_plan_curcy, tvb,
11529
0
                        offset, 3, ENC_ASCII);
11530
0
        offset += 3;
11531
11532
0
        proto_tree_add_item(plan_info_tree, hf_ieee80211_hs20_anqp_aoc_plan_information,
11533
0
                        tvb, offset, plan_len - 6, ENC_UTF_8);
11534
0
        offset += plan_len - 6;
11535
11536
0
        plan_index++;
11537
0
    }
11538
11539
0
    proto_item_set_len(pi, offset - start_offset);
11540
11541
0
    toc_index++;
11542
0
  }
11543
0
}
11544
11545
static int
11546
dissect_hs20_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
11547
0
{
11548
0
  uint8_t subtype;
11549
0
  int ofn_hf_array[3] = {hf_ieee80211_hs20_anqp_ofn_length,
11550
0
                         hf_ieee80211_hs20_anqp_ofn_language,
11551
0
                         hf_ieee80211_hs20_anqp_ofn_name };
11552
11553
0
  int end = tvb_reported_length(tvb);
11554
0
  int offset = 0;
11555
0
  anqp_info_dissector_data_t* anqp_data = (anqp_info_dissector_data_t*)data;
11556
11557
0
  DISSECTOR_ASSERT(anqp_data);
11558
11559
0
  subtype = tvb_get_uint8(tvb, offset);
11560
0
  proto_item_append_text(tree, " - HS 2.0 %s",
11561
0
                         val_to_str(subtype, hs20_anqp_subtype_vals,
11562
0
                                    "Reserved (%u)"));
11563
0
  if (anqp_data->idx == 0) {
11564
0
    col_append_fstr(pinfo->cinfo, COL_INFO, " HS 2.0 %s",
11565
0
                    val_to_str(subtype, hs20_anqp_subtype_vals,
11566
0
                               "Reserved (%u)"));
11567
0
  } else if (anqp_data->idx == 1) {
11568
0
    col_append_str(pinfo->cinfo, COL_INFO, ", ..");
11569
0
  }
11570
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_subtype, tvb, offset, 1,
11571
0
                      ENC_LITTLE_ENDIAN);
11572
0
  offset++;
11573
11574
0
  proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_reserved, tvb, offset, 1,
11575
0
                      ENC_LITTLE_ENDIAN);
11576
0
  offset++;
11577
11578
0
  switch (subtype) {
11579
0
  case HS20_ANQP_HS_QUERY_LIST:
11580
0
    dissect_hs20_anqp_hs_query_list(tree, tvb, offset, end);
11581
0
    break;
11582
0
  case HS20_ANQP_HS_CAPABILITY_LIST:
11583
0
    dissect_hs20_anqp_hs_capability_list(tree, tvb, offset, end);
11584
0
    break;
11585
0
  case HS20_ANQP_OPERATOR_FRIENDLY_NAME:
11586
0
    dissect_hs20_anqp_operator_friendly_name(tree, tvb, pinfo, offset, end,
11587
0
                                ofn_hf_array, ett_hs20_ofn_tree);
11588
0
    break;
11589
0
  case HS20_ANQP_WAN_METRICS:
11590
0
    dissect_hs20_anqp_wan_metrics(tree, tvb, offset, anqp_data->request);
11591
0
    break;
11592
0
  case HS20_ANQP_CONNECTION_CAPABILITY:
11593
0
    dissect_hs20_anqp_connection_capability(tree, tvb, offset, end);
11594
0
    break;
11595
0
  case HS20_ANQP_NAI_HOME_REALM_QUERY:
11596
0
    dissect_hs20_anqp_nai_home_realm_query(tree, tvb, pinfo, offset, end);
11597
0
    break;
11598
0
  case HS20_ANQP_OPERATING_CLASS_INDICATION:
11599
0
    dissect_hs20_anqp_oper_class_indic(tree, tvb, offset, end);
11600
0
    break;
11601
0
  case HS20_ANQP_OSU_PROVIDERS_LIST:
11602
0
    dissect_hs20_anqp_osu_providers_list(tree, tvb, pinfo, offset, end);
11603
0
    break;
11604
0
  case HS20_ANQP_ICON_REQUEST:
11605
0
    dissect_hs20_anqp_icon_request(tree, tvb, offset, end);
11606
0
    break;
11607
0
  case HS20_ANQP_ICON_BINARY_FILE:
11608
0
    dissect_hs20_anqp_icon_binary_file(tree, tvb, offset, end);
11609
0
    break;
11610
0
  case HS20_ANQP_OPERATOR_ICON_METADATA:
11611
0
    dissect_hs20_anqp_operator_icon_metadata(tree, tvb, offset, end);
11612
0
    break;
11613
0
  case HS20_ANQP_ADVICE_OF_CHARGE:
11614
0
    dissect_hs20_anqp_advice_of_charge(tree, tvb, offset, end);
11615
0
    break;
11616
0
  default:
11617
0
    if (offset == end)
11618
0
      break;
11619
0
    proto_tree_add_item(tree, hf_ieee80211_hs20_anqp_payload, tvb, offset,
11620
0
                        end - offset, ENC_NA);
11621
0
    break;
11622
0
  }
11623
11624
0
  return tvb_captured_length(tvb);
11625
0
}
11626
11627
// MBO ANQP element subtypes
11628
0
#define MBO_ANQP_QUERY_LIST               1
11629
0
#define MBO_ANQP_CELLULAR_DATA_PREFERENCE 2
11630
11631
static const value_string mbo_anqp_subtype_vals[] = {
11632
  { MBO_ANQP_QUERY_LIST, "MBO Query List" },
11633
  { MBO_ANQP_CELLULAR_DATA_PREFERENCE, "Cellular Data Connection Preference" },
11634
  { 0, NULL }
11635
};
11636
11637
static int
11638
dissect_mbo_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
11639
0
{
11640
0
  uint8_t subtype;
11641
0
  int len = tvb_reported_length(tvb);
11642
0
  int offset = 0;
11643
11644
0
  if (len < 2) {
11645
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
11646
0
    return offset;
11647
0
  }
11648
11649
0
  subtype = tvb_get_uint8(tvb, offset);
11650
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_anqp_mbo_subtype, tvb, offset, 1, ENC_NA);
11651
0
  offset++;
11652
0
  len--;
11653
11654
0
  switch (subtype) {
11655
0
  case MBO_ANQP_QUERY_LIST:
11656
0
    while (len > 0) {
11657
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_anqp_mbo_query, tvb, offset, 1, ENC_NA);
11658
0
      offset++;
11659
0
      len--;
11660
0
    }
11661
0
    break;
11662
0
  case MBO_ANQP_CELLULAR_DATA_PREFERENCE:
11663
0
    proto_tree_add_item(tree, hf_ieee80211_wfa_anqp_mbo_cellular_pref, tvb, offset,
11664
0
                        1, ENC_NA);
11665
0
    offset++;
11666
0
    len--;
11667
0
    break;
11668
0
  default:
11669
0
    break;
11670
0
  }
11671
11672
0
  return offset;
11673
0
}
11674
11675
static int
11676
dissect_vendor_wifi_alliance_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
11677
0
{
11678
0
  uint8_t subtype;
11679
0
  int offset = 0;
11680
0
  tvbuff_t *subtvb;
11681
11682
0
  subtype = tvb_get_uint8(tvb, offset);
11683
0
  proto_tree_add_item(tree, hf_ieee80211_anqp_wfa_subtype, tvb, offset, 1, ENC_NA);
11684
0
  offset += 1;
11685
11686
0
  subtvb = tvb_new_subset_remaining(tvb, offset);
11687
0
  if (!dissector_try_uint_with_data(wifi_alliance_anqp_info_table, subtype, subtvb, pinfo, tree, false, data))
11688
0
      call_data_dissector(subtvb, pinfo, tree);
11689
11690
0
  return tvb_captured_length(tvb);
11691
0
}
11692
11693
11694
static int
11695
dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data);
11696
11697
static int
11698
dissect_anqp_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
11699
                  bool request, int idx)
11700
0
{
11701
0
  uint16_t    id, len;
11702
0
  uint32_t    oui;
11703
0
  proto_item *item;
11704
0
  tvbuff_t *vendor_tvb;
11705
0
  anqp_info_dissector_data_t anqp_info;
11706
11707
0
  item = proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_id,
11708
0
                             tvb, offset, 2, ENC_LITTLE_ENDIAN);
11709
0
  id = tvb_get_letohs(tvb, offset);
11710
0
  if (id != ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST) {
11711
0
    if (idx == 0) {
11712
0
      proto_item_append_text(tree, " - %s",
11713
0
                             val_to_str_ext(id, &anqp_info_id_vals_ext, "Unknown (%u)"));
11714
0
      col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
11715
0
                      val_to_str_ext(id, &anqp_info_id_vals_ext, "Unknown (%u)"));
11716
0
    } else if (idx == 1) {
11717
0
      proto_item_append_text(tree, ", ..");
11718
0
      col_append_str(pinfo->cinfo, COL_INFO, ", ..");
11719
0
    }
11720
0
  }
11721
0
  tree = proto_item_add_subtree(item, ett_gas_anqp);
11722
0
  offset += 2;
11723
0
  proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_length,
11724
0
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
11725
0
  len = tvb_get_letohs(tvb, offset);
11726
0
  offset += 2;
11727
0
  if (tvb_reported_length_remaining(tvb, offset) < len) {
11728
0
    expert_add_info(pinfo, tree, &ei_ieee80211_ff_anqp_info_length);
11729
0
    return 4 + len;
11730
0
  }
11731
0
  switch (id)
11732
0
  {
11733
0
  case ANQP_INFO_ANQP_QUERY_LIST:
11734
0
    dissect_anqp_query_list(tree, tvb, pinfo, offset, offset + len);
11735
0
    break;
11736
0
  case ANQP_INFO_ANQP_CAPAB_LIST:
11737
0
    dissect_anqp_capab_list(tree, tvb, pinfo, offset, offset + len);
11738
0
    break;
11739
0
  case ANQP_INFO_VENUE_NAME_INFO:
11740
0
    dissect_venue_name_info(tree, tvb, pinfo, offset, offset + len);
11741
0
    break;
11742
0
  case ANQP_INFO_NETWORK_AUTH_TYPE_INFO:
11743
0
    dissect_network_auth_type(tree, tvb, offset, offset + len);
11744
0
    break;
11745
0
  case ANQP_INFO_ROAMING_CONSORTIUM_LIST:
11746
0
    dissect_roaming_consortium_list(tree, tvb, pinfo, offset, offset + len);
11747
0
    break;
11748
0
  case ANQP_INFO_IP_ADDR_TYPE_AVAILABILITY_INFO:
11749
0
    dissect_ip_addr_type_availability_info(tree, tvb, offset);
11750
0
    break;
11751
0
  case ANQP_INFO_NAI_REALM_LIST:
11752
0
    dissect_nai_realm_list(tree, tvb, pinfo, offset, offset + len);
11753
0
    break;
11754
0
  case ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO:
11755
0
    dissect_3gpp_cellular_network_info(tree, tvb, pinfo, offset);
11756
0
    break;
11757
0
  case ANQP_INFO_DOMAIN_NAME_LIST:
11758
0
    dissect_domain_name_list(tree, tvb, offset, offset + len);
11759
0
    break;
11760
0
  case ANQP_INFO_NEIGHBOR_REPORT:
11761
0
    {
11762
0
      tvbuff_t *report_tvb;
11763
0
      static const uint8_t ids[] = { TAG_NEIGHBOR_REPORT };
11764
11765
0
      report_tvb = tvb_new_subset_length(tvb, offset, len);
11766
0
      int report_offset = 0;
11767
      /* Cf. IEEE 802.11-2020 9.4.5.19 Neighbor Report ANQP-element with
11768
       * IEEE 802.11-2016 9.4.5.19 and IEEE 802.11-2012 8.4.4.19.
11769
       * The line "The Element ID and the Length fields of the Neighbor Report
11770
       * element... are not included" was removed as it made it impossible
11771
       * to include more than one Neighbor Element (using the overall ANQP
11772
       * Info length could not distinguish between extra length due to a second
11773
       * Neighbor Report and extra length due to optional subelements.)
11774
       * The headerless version was apparently never deployed so use the new
11775
       * specification (though we could test to see if the next octet is
11776
       * TAG_NEIGHBOR_REPORT and dissect with the older method if not.)
11777
       */
11778
0
      while (tvb_reported_length_remaining(report_tvb, report_offset)) {
11779
0
        report_offset += add_tagged_field(pinfo, tree, report_tvb, report_offset, 0,
11780
0
          ids, G_N_ELEMENTS(ids), NULL);
11781
0
      }
11782
0
    }
11783
0
    break;
11784
0
  case ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST:
11785
0
    proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
11786
0
    offset += 3;
11787
0
    vendor_tvb = tvb_new_subset_length(tvb, offset, len - 3);
11788
11789
0
    anqp_info.request = request;
11790
0
    anqp_info.idx = idx;
11791
0
    if (!dissector_try_uint_with_data(vendor_specific_anqp_info_table, oui, vendor_tvb, pinfo, tree, false, &anqp_info))
11792
0
    {
11793
0
      proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info, tvb, offset, len, ENC_NA);
11794
0
    }
11795
0
    break;
11796
0
  case ANQP_INFO_VENUE_URL:
11797
0
    dissect_anqp_venue_url(tree, tvb, offset, offset + len);
11798
0
    break;
11799
0
  case ANQP_INFO_ADVICE_OF_CHARGE:
11800
0
    dissect_hs20_anqp_advice_of_charge(tree, tvb, offset, offset + len);
11801
0
    break;
11802
0
  case ANQP_INFO_NETWORK_AUTH_TYPE_TIMESTAMP:
11803
0
    dissect_anqp_network_auth_type_timestamp(tree, tvb, offset, offset + len);
11804
0
    break;
11805
0
  default:
11806
0
    proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info,
11807
0
                        tvb, offset, len, ENC_NA);
11808
0
    break;
11809
0
  }
11810
11811
0
  return 4 + len;
11812
0
}
11813
11814
static void
11815
dissect_anqp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, bool request)
11816
0
{
11817
0
  int idx = 0;
11818
11819
0
  proto_item_append_text(tree, ": ANQP ");
11820
0
  proto_item_append_text(tree, request ? "Request" : "Response");
11821
0
  if (tvb_reported_length_remaining(tvb, offset) < 4) {
11822
0
    expert_add_info_format(pinfo, tree, &ei_ieee80211_not_enough_room_for_anqp_header,
11823
0
                           "Not enough room for ANQP header");
11824
0
    return;
11825
0
  }
11826
0
  col_append_fstr(pinfo->cinfo, COL_INFO, ", ANQP %s",
11827
0
                  request ? "Req" : "Resp");
11828
0
  while (tvb_reported_length_remaining(tvb, offset) > 0) {
11829
0
    offset += dissect_anqp_info(tree, tvb, pinfo, offset, request, idx);
11830
0
    idx += 1;
11831
0
  }
11832
0
}
11833
11834
static unsigned
11835
dissect_gas_initial_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
11836
                            unsigned type, unsigned subtype)
11837
1
{
11838
1
  uint16_t    req_len;
11839
1
  int         start = offset;
11840
1
  proto_item *item;
11841
1
  proto_tree *query;
11842
11843
  /* Query Request Length (2 octets) */
11844
1
  req_len = tvb_get_letohs(tvb, offset);
11845
11846
1
  query = proto_tree_add_subtree(tree, tvb, offset, 2 + req_len, ett_gas_query, &item, "Query Request");
11847
1
  if (tvb_reported_length_remaining(tvb, offset) < 2 + req_len) {
11848
0
    expert_add_info(pinfo, item, &ei_ieee80211_ff_query_request_length);
11849
0
    return tvb_reported_length_remaining(tvb, offset);
11850
0
  }
11851
11852
1
  proto_tree_add_item(query, hf_ieee80211_ff_query_request_length,
11853
1
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
11854
1
  offset += 2;
11855
  /*
11856
   * Query Request (GAS query; formatted per protocol specified in the
11857
   * Advertisement Protocol IE)
11858
   */
11859
1
  switch (type) {
11860
0
  case ADV_PROTO_ID_ANQP:
11861
0
    dissect_anqp(query, tvb, pinfo, offset, true);
11862
0
    break;
11863
0
  case ADV_PROTO_ID_VS:
11864
0
    if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) | WFA_SUBTYPE_DPP)) {
11865
0
       col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
11866
0
                       val_to_str(subtype >> 8, dpp_subtype_vals, "Unknown (%u)"));
11867
0
      dissect_wifi_dpp_config_proto(pinfo, query, tvb, offset);
11868
0
    }
11869
0
    break;
11870
1
  default:
11871
1
    proto_tree_add_item(query, hf_ieee80211_ff_query_request,
11872
1
                        tvb, offset, req_len, ENC_NA);
11873
1
  }
11874
1
  offset += req_len;
11875
11876
1
  return offset - start;
11877
1
}
11878
11879
static unsigned
11880
dissect_gas_initial_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
11881
                             unsigned type, unsigned subtype)
11882
3
{
11883
3
  uint16_t    resp_len;
11884
3
  int         start = offset;
11885
3
  proto_item *item;
11886
3
  proto_tree *query;
11887
11888
  /* Query Response Length (2 octets) */
11889
3
  resp_len = tvb_get_letohs(tvb, offset);
11890
11891
3
  query = proto_tree_add_subtree(tree, tvb, offset, 2 + resp_len,
11892
3
                             ett_gas_query, &item, "Query Response");
11893
3
  if (tvb_reported_length_remaining(tvb, offset) < 2 + resp_len) {
11894
1
    expert_add_info(pinfo, item, &ei_ieee80211_ff_query_response_length);
11895
1
    return tvb_reported_length_remaining(tvb, offset);
11896
1
  }
11897
11898
2
  proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
11899
2
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
11900
2
  offset += 2;
11901
  /* Query Response (optional) */
11902
2
  if (resp_len) {
11903
0
    switch (type) {
11904
0
    case ADV_PROTO_ID_ANQP:
11905
0
      dissect_anqp(query, tvb, pinfo, offset, false);
11906
0
      break;
11907
0
    case ADV_PROTO_ID_VS:
11908
0
      if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) | WFA_SUBTYPE_DPP)) {
11909
0
         col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
11910
0
                         val_to_str(subtype >> 8, dpp_subtype_vals, "Unknown (%u)"));
11911
0
        dissect_wifi_dpp_config_proto(pinfo, query, tvb, offset);
11912
0
      }
11913
0
      break;
11914
0
    default:
11915
0
      proto_tree_add_item(query, hf_ieee80211_ff_query_response,
11916
0
                          tvb, offset, resp_len, ENC_NA);
11917
0
    }
11918
0
    offset += resp_len;
11919
0
  }
11920
11921
2
  return offset - start;
11922
2
}
11923
11924
static reassembly_table gas_reassembly_table;
11925
11926
static int ett_gas_resp_fragment;
11927
static int ett_gas_resp_fragments;
11928
11929
static int hf_ieee80211_gas_resp_fragments;
11930
static int hf_ieee80211_gas_resp_fragment;
11931
static int hf_ieee80211_gas_resp_fragment_overlap;
11932
static int hf_ieee80211_gas_resp_fragment_overlap_conflict;
11933
static int hf_ieee80211_gas_resp_fragment_multiple_tails;
11934
static int hf_ieee80211_gas_resp_fragment_too_long_fragment;
11935
static int hf_ieee80211_gas_resp_fragment_error;
11936
static int hf_ieee80211_gas_resp_fragment_count;
11937
static int hf_ieee80211_gas_resp_reassembled_in;
11938
static int hf_ieee80211_gas_resp_reassembled_length;
11939
11940
static const fragment_items gas_resp_frag_items = {
11941
  &ett_gas_resp_fragment,
11942
  &ett_gas_resp_fragments,
11943
  &hf_ieee80211_gas_resp_fragments,
11944
  &hf_ieee80211_gas_resp_fragment,
11945
  &hf_ieee80211_gas_resp_fragment_overlap,
11946
  &hf_ieee80211_gas_resp_fragment_overlap_conflict,
11947
  &hf_ieee80211_gas_resp_fragment_multiple_tails,
11948
  &hf_ieee80211_gas_resp_fragment_too_long_fragment,
11949
  &hf_ieee80211_gas_resp_fragment_error,
11950
  &hf_ieee80211_gas_resp_fragment_count,
11951
  &hf_ieee80211_gas_resp_reassembled_in,
11952
  &hf_ieee80211_gas_resp_reassembled_length,
11953
  /* Reassembled data field */
11954
  NULL,
11955
  "GAS Response fragments"
11956
};
11957
11958
static unsigned
11959
dissect_gas_comeback_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
11960
                              unsigned type, unsigned subtype _U_, uint8_t frag, bool more,
11961
                              uint8_t dialog_token)
11962
14
{
11963
14
  uint16_t    resp_len;
11964
14
  int         start = offset;
11965
14
  proto_item *item;
11966
14
  proto_tree *query;
11967
11968
  /* Query Response Length (2 octets) */
11969
14
  resp_len = tvb_get_letohs(tvb, offset);
11970
11971
14
  query = proto_tree_add_subtree(tree, tvb, offset, 2 + resp_len,
11972
14
                             ett_gas_query, &item, "Query Response");
11973
14
  if (tvb_reported_length_remaining(tvb, offset) < 2 + resp_len) {
11974
2
    expert_add_info(pinfo, item, &ei_ieee80211_ff_query_response_length);
11975
2
    return tvb_reported_length_remaining(tvb, offset);
11976
2
  }
11977
11978
12
  proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
11979
12
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
11980
12
  offset += 2;
11981
  /* Query Response (optional) */
11982
12
  if (resp_len) {
11983
2
    if (type == ADV_PROTO_ID_ANQP && (frag == 0) && !more)
11984
0
      dissect_anqp(query, tvb, pinfo, offset, false);
11985
2
    else {
11986
2
      fragment_head *frag_msg;
11987
2
      bool save_fragmented;
11988
2
      tvbuff_t *new_tvb;
11989
11990
2
      save_fragmented = pinfo->fragmented;
11991
2
      pinfo->fragmented = true;
11992
2
      frag_msg = fragment_add_seq_check(&gas_reassembly_table, tvb, offset,
11993
2
                                        pinfo, dialog_token, NULL,
11994
2
                                        frag, resp_len, more);
11995
2
      new_tvb = process_reassembled_data(tvb, offset, pinfo,
11996
2
                                         "Reassembled GAS Query Response",
11997
2
                                         frag_msg, &gas_resp_frag_items,
11998
2
                                         NULL, tree);
11999
2
      if (new_tvb) {
12000
0
        switch (type) {
12001
0
        case ADV_PROTO_ID_ANQP:
12002
0
          dissect_anqp(query, new_tvb, pinfo, 0, false);
12003
0
          break;
12004
0
        case ADV_PROTO_ID_VS:
12005
0
          if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) |
12006
0
                           WFA_SUBTYPE_DPP)) {
12007
0
            col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
12008
0
                            val_to_str(subtype >> 8, dpp_subtype_vals,
12009
0
                                       "Unknown (%u)"));
12010
0
            dissect_wifi_dpp_config_proto(pinfo, query, new_tvb, 0);
12011
0
          } else {
12012
0
            proto_tree_add_item(query, hf_ieee80211_ff_query_response,
12013
0
                                new_tvb, 0,
12014
0
                                tvb_reported_length_remaining(new_tvb, 0),
12015
0
                                ENC_NA);
12016
0
          }
12017
0
          break;
12018
0
        default:
12019
0
          proto_tree_add_item(query, hf_ieee80211_ff_query_response,
12020
0
                              new_tvb, 0,
12021
0
                              tvb_reported_length_remaining(new_tvb, 0),
12022
0
                              ENC_NA);
12023
0
        }
12024
0
      }
12025
12026
      /* The old tvb cannot be used anymore */
12027
2
      ieee80211_tvb_invalid = true;
12028
12029
2
      pinfo->fragmented = save_fragmented;
12030
2
    }
12031
2
    offset += resp_len;
12032
2
  }
12033
12034
12
  return offset - start;
12035
12
}
12036
12037
/* ************************************************************************* */
12038
/*              Dissect and add fixed mgmt fields to protocol tree           */
12039
/* ************************************************************************* */
12040
12041
static uint64_t last_timestamp;
12042
12043
static unsigned
12044
add_ff_timestamp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12045
444
{
12046
444
  last_timestamp = tvb_get_letoh64(tvb, offset);
12047
444
  proto_tree_add_item(tree, hf_ieee80211_ff_timestamp, tvb, offset, 8,
12048
444
                      ENC_LITTLE_ENDIAN);
12049
444
  return 8;
12050
444
}
12051
12052
static unsigned
12053
add_ff_beacon_interval(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
12054
524
{
12055
524
  proto_tree_add_item(tree, hf_ieee80211_ff_beacon_interval, tvb, offset, 2,
12056
524
                      ENC_LITTLE_ENDIAN);
12057
524
  col_append_fstr(pinfo->cinfo, COL_INFO, ", BI=%d",
12058
524
                  tvb_get_letohs(tvb, offset));
12059
524
  return 2;
12060
524
}
12061
12062
static unsigned
12063
add_ff_dmg_params(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset);
12064
12065
static unsigned
12066
add_ff_cap_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12067
2.49k
{
12068
2.49k
  static int * const ieee80211_cap_info_fields[] = {
12069
2.49k
    &hf_ieee80211_ff_cf_ess,
12070
2.49k
    &hf_ieee80211_ff_cf_ibss,
12071
2.49k
    &hf_ieee80211_ff_cf_reserved1,
12072
2.49k
    &hf_ieee80211_ff_cf_reserved2,
12073
2.49k
    &hf_ieee80211_ff_cf_privacy,
12074
2.49k
    &hf_ieee80211_ff_cf_preamble,
12075
2.49k
    &hf_ieee80211_ff_cf_critical_update_flag,
12076
2.49k
    &hf_ieee80211_ff_cf_nontran_bss_critical_update_flag,
12077
2.49k
    &hf_ieee80211_ff_cf_spec_man,
12078
2.49k
    &hf_ieee80211_ff_cf_qos,
12079
2.49k
    &hf_ieee80211_ff_cf_short_slot_time,
12080
2.49k
    &hf_ieee80211_ff_cf_apsd,
12081
2.49k
    &hf_ieee80211_ff_cf_radio_measurement,
12082
2.49k
    &hf_ieee80211_ff_cf_epd,
12083
2.49k
    &hf_ieee80211_ff_cf_reserved5,
12084
2.49k
    &hf_ieee80211_ff_cf_reserved6,
12085
2.49k
    NULL
12086
2.49k
  };
12087
12088
  /* The capability information includes DMG parameters whenever it is transmitted by
12089
     a DMG STA/AP (802.11ad-2012, 8.4.1.4) */
12090
12091
2.49k
  bool isDMG = GPOINTER_TO_INT(p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY));
12092
12093
2.49k
  if (isDMG) {
12094
5
    proto_item *cap_item;
12095
5
    proto_tree *cap_tree;
12096
5
    cap_item = proto_tree_add_item(tree, hf_ieee80211_ff_capture, tvb, offset, 2,
12097
5
                                   ENC_LITTLE_ENDIAN);
12098
5
    cap_tree = proto_item_add_subtree(cap_item, ett_cap_tree);
12099
5
    add_ff_dmg_params(cap_tree, tvb, pinfo, offset);
12100
2.48k
  } else {
12101
    /*
12102
     * We can only interpret the ESS and IBSS fields to be an AP if the
12103
     * frame is a BEACON or PROBE_RESPONSE
12104
     */
12105
2.48k
    uint32_t l_frame_type = GPOINTER_TO_UINT(p_get_proto_data(wmem_file_scope(),
12106
2.48k
                                                         pinfo, proto_wlan,
12107
2.48k
                                                         FRAME_TYPE_KEY));
12108
2.48k
    if (((tvb_get_letohs(tvb, offset) & 0x0003) == 0x1 &&
12109
2.48k
        (l_frame_type == MGT_BEACON || l_frame_type == MGT_PROBE_RESP)) ||
12110
2.48k
        l_frame_type == MGT_ASSOC_RESP || l_frame_type == MGT_REASSOC_RESP) {
12111
146
      p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_AP_KEY, GINT_TO_POINTER(true));
12112
146
    }
12113
12114
2.48k
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
12115
2.48k
                                      hf_ieee80211_ff_capture,
12116
2.48k
                                      ett_cap_tree, ieee80211_cap_info_fields,
12117
2.48k
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12118
2.48k
  }
12119
2.49k
  return 2;
12120
2.49k
}
12121
12122
static unsigned
12123
add_ff_auth_alg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12124
44
{
12125
44
  proto_tree_add_item(tree, hf_ieee80211_ff_auth_alg, tvb, offset, 2,
12126
44
                      ENC_LITTLE_ENDIAN);
12127
44
  return 2;
12128
44
}
12129
12130
static unsigned
12131
add_ff_auth_trans_seq(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12132
44
{
12133
44
  proto_tree_add_item(tree, hf_ieee80211_ff_auth_seq, tvb, offset, 2,
12134
44
                      ENC_LITTLE_ENDIAN);
12135
44
  return 2;
12136
44
}
12137
12138
static unsigned
12139
add_ff_current_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12140
67
{
12141
67
  proto_tree_add_item(tree, hf_ieee80211_ff_current_ap, tvb, offset, 6,
12142
67
                      ENC_NA);
12143
67
  return 6;
12144
67
}
12145
12146
static unsigned
12147
add_ff_listen_ival(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12148
2.01k
{
12149
2.01k
  proto_tree_add_item(tree, hf_ieee80211_ff_listen_ival, tvb, offset, 2,
12150
2.01k
                      ENC_LITTLE_ENDIAN);
12151
2.01k
  return 2;
12152
2.01k
}
12153
12154
static unsigned
12155
add_ff_reason_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12156
288
{
12157
288
  proto_tree_add_item(tree, hf_ieee80211_ff_reason, tvb, offset, 2,
12158
288
                      ENC_LITTLE_ENDIAN);
12159
288
  return 2;
12160
288
}
12161
12162
static unsigned
12163
add_ff_assoc_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12164
92
{
12165
92
  proto_tree_add_item(tree, hf_ieee80211_ff_assoc_id, tvb, offset, 2,
12166
92
                      ENC_LITTLE_ENDIAN);
12167
92
  return 2;
12168
92
}
12169
12170
static unsigned
12171
add_ff_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12172
270
{
12173
270
  proto_tree_add_item(tree, hf_ieee80211_ff_status_code, tvb, offset, 2,
12174
270
                      ENC_LITTLE_ENDIAN);
12175
270
  return 2;
12176
270
}
12177
12178
static unsigned
12179
add_ff_category_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12180
2.05k
{
12181
2.05k
  proto_tree_add_item(tree, hf_ieee80211_ff_category_code, tvb, offset, 1,
12182
2.05k
                      ENC_LITTLE_ENDIAN);
12183
2.05k
  return 1;
12184
2.05k
}
12185
12186
static unsigned
12187
add_ff_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12188
117
{
12189
117
  proto_tree_add_item(tree, hf_ieee80211_ff_action_code, tvb, offset, 1,
12190
117
                      ENC_LITTLE_ENDIAN);
12191
117
  return 1;
12192
117
}
12193
12194
static unsigned
12195
add_ff_trigger(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12196
2
{
12197
2
  uint8_t trigger = tvb_get_uint8(tvb, offset);
12198
2
  col_append_fstr(pinfo->cinfo, COL_INFO, ", Trigger=%d (%s)", trigger,
12199
2
                  val_to_str_const(trigger, ftm_trigger_vals, "Unknown"));
12200
2
  proto_tree_add_item(tree, hf_ieee80211_ff_trigger, tvb, offset, 1,
12201
2
                      ENC_LITTLE_ENDIAN);
12202
2
  return 1;
12203
2
}
12204
12205
static unsigned
12206
add_ff_ftm_tod(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12207
1
{
12208
1
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_tod, tvb, offset, 6,
12209
1
                      ENC_LITTLE_ENDIAN);
12210
1
  return 6;
12211
1
}
12212
12213
static unsigned
12214
add_ff_ftm_toa(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12215
1
{
12216
1
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_toa, tvb, offset, 6,
12217
1
                      ENC_LITTLE_ENDIAN);
12218
1
  return 6;
12219
1
}
12220
12221
static unsigned
12222
add_ff_ftm_tod_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12223
0
{
12224
0
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_tod_err, tvb, offset, 2,
12225
0
                      ENC_LITTLE_ENDIAN);
12226
0
  return 2;
12227
0
}
12228
12229
static unsigned
12230
add_ff_ftm_toa_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12231
0
{
12232
0
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_toa_err, tvb, offset, 2,
12233
0
                      ENC_LITTLE_ENDIAN);
12234
0
  return 2;
12235
0
}
12236
12237
static unsigned
12238
add_ff_ftm_tod_err1(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12239
1
{
12240
1
  static int * const fields[] = {
12241
1
    &hf_ieee80211_ff_ftm_max_tod_error_exponent,
12242
1
    &hf_ieee80211_ff_ftm_tod_err_reserved,
12243
1
    &hf_ieee80211_ff_ftm_tod_not_continuous,
12244
1
    NULL
12245
1
  };
12246
12247
1
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_ftm_tod_err1,
12248
1
                                    ett_ff_ftm_tod_err1, fields,
12249
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12250
1
  return 1;
12251
1
}
12252
12253
static unsigned
12254
add_ff_ftm_toa_err1(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12255
1
{
12256
1
  static int * const fields[] = {
12257
1
    &hf_ieee80211_ff_ftm_max_toa_error_exponent,
12258
1
    &hf_ieee80211_ff_ftm_toa_err_reserved,
12259
1
    &hf_ieee80211_ff_ftm_invalid_measurement,
12260
1
    &hf_ieee80211_ff_ftm_toa_type,
12261
1
    NULL
12262
1
  };
12263
12264
1
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_ftm_toa_err1,
12265
1
                                    ett_ff_ftm_toa_err1, fields,
12266
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12267
1
  return 1;
12268
1
}
12269
12270
static unsigned
12271
add_ff_ftm_cfo_parameter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12272
1
{
12273
1
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_cfo, tvb, offset, 2,
12274
1
                      ENC_LITTLE_ENDIAN);
12275
1
  return 2;
12276
1
}
12277
12278
static unsigned
12279
add_ff_ftm_r2i_ndp_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12280
1
{
12281
1
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_r2i_ndp_tx_power, tvb, offset, 1,
12282
1
                      ENC_LITTLE_ENDIAN);
12283
1
  return 1;
12284
1
}
12285
12286
static unsigned
12287
add_ff_ftm_i2r_ndp_target_rssi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12288
1
{
12289
1
  proto_tree_add_item(tree, hf_ieee80211_ff_ftm_i2r_ndp_target_rssi, tvb, offset, 1,
12290
1
                      ENC_LITTLE_ENDIAN);
12291
1
  return 1;
12292
1
}
12293
12294
static int
12295
dissect_ftm_params(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
12296
44
{
12297
44
  int offset = 0;
12298
44
  int len = 0;
12299
44
  proto_tree *ftm_param_tree = tree;
12300
44
  static int * const ieee80211_ftm_params_fields1[] = {
12301
44
    &hf_ieee80211_ff_ftm_param_status_indication,
12302
44
    &hf_ieee80211_ff_ftm_param_value,
12303
44
    &hf_ieee80211_ff_ftm_param_reserved1,
12304
44
    &hf_ieee80211_ff_ftm_param_burst_exponent,
12305
44
    &hf_ieee80211_ff_ftm_param_burst_duration,
12306
44
    NULL};
12307
12308
44
  static int * const ieee80211_ftm_params_fields2[] = {
12309
44
    &hf_ieee80211_ff_ftm_param_min_delta_ftm,
12310
44
    &hf_ieee80211_ff_ftm_param_partial_tsf_timer,
12311
44
    &hf_ieee80211_ff_ftm_param_partial_tsf_no_pref,
12312
44
    &hf_ieee80211_ff_ftm_param_asap_capable,
12313
44
    &hf_ieee80211_ff_ftm_param_asap,
12314
44
    &hf_ieee80211_ff_ftm_param_ftm_per_burst,
12315
44
    NULL};
12316
12317
44
  static int * const ieee80211_ftm_params_fields3[] = {
12318
44
    &hf_ieee80211_ff_ftm_param_reserved2,
12319
44
    &hf_ieee80211_ff_ftm_param_format_and_bw,
12320
44
    &hf_ieee80211_ff_ftm_param_burst_period,
12321
44
    NULL};
12322
12323
44
  len = tvb_captured_length(tvb);
12324
44
  if (len != 9)
12325
42
      return 0;
12326
12327
2
  proto_tree_add_bitmask_with_flags(ftm_param_tree, tvb, offset, hf_ieee80211_ff_ftm_param_delim1,
12328
2
                                    ett_ff_ftm_param_delim1, ieee80211_ftm_params_fields1,
12329
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12330
2
  offset += 2;
12331
2
  proto_tree_add_bitmask_with_flags(ftm_param_tree, tvb, offset, hf_ieee80211_ff_ftm_param_delim2,
12332
2
                                    ett_ff_ftm_param_delim2, ieee80211_ftm_params_fields2,
12333
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12334
2
  offset += 4;
12335
2
  proto_tree_add_bitmask_with_flags(ftm_param_tree, tvb, offset, hf_ieee80211_ff_ftm_param_delim3,
12336
2
                                    ett_ff_ftm_param_delim3, ieee80211_ftm_params_fields3,
12337
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12338
2
  offset += 3;
12339
12340
2
  return offset;
12341
44
}
12342
12343
static unsigned
12344
add_ff_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12345
404
{
12346
404
  uint8_t value = tvb_get_uint8(tvb, offset);
12347
404
  col_append_fstr(pinfo->cinfo, COL_INFO, ", Dialog Token=%d", value);
12348
404
  proto_tree_add_item(tree, hf_ieee80211_ff_dialog_token, tvb, offset, 1,
12349
404
                      ENC_LITTLE_ENDIAN);
12350
404
  return 1;
12351
404
}
12352
12353
static unsigned
12354
add_ff_followup_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12355
0
{
12356
0
  proto_tree_add_item(tree, hf_ieee80211_ff_followup_dialog_token, tvb, offset, 1,
12357
0
                      ENC_LITTLE_ENDIAN);
12358
0
  return 1;
12359
0
}
12360
12361
static unsigned
12362
add_ff_wme_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12363
3
{
12364
3
  proto_tree_add_item(tree, hf_ieee80211_ff_wme_action_code, tvb, offset, 1,
12365
3
                      ENC_LITTLE_ENDIAN);
12366
3
  return 1;
12367
3
}
12368
12369
static unsigned
12370
add_ff_wme_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12371
3
{
12372
3
  proto_tree_add_item(tree, hf_ieee80211_ff_wme_status_code, tvb, offset, 1,
12373
3
                      ENC_LITTLE_ENDIAN);
12374
3
  return 1;
12375
3
}
12376
12377
static unsigned
12378
add_ff_qos_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12379
8
{
12380
8
  proto_tree_add_item(tree, hf_ieee80211_ff_qos_action_code, tvb, offset, 1,
12381
8
                      ENC_LITTLE_ENDIAN);
12382
8
  return 1;
12383
8
}
12384
12385
static unsigned
12386
add_ff_block_ack_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12387
3
{
12388
3
  proto_tree_add_item(tree, hf_ieee80211_ff_ba_action, tvb, offset, 1,
12389
3
                      ENC_LITTLE_ENDIAN);
12390
3
  return 1;
12391
3
}
12392
12393
static unsigned
12394
add_ff_block_ack_param(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12395
1
{
12396
1
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_block_ack_params,
12397
1
                         ett_ff_ba_param_tree,
12398
1
                         ieee80211_ff_block_ack_params_fields,
12399
1
                         ENC_LITTLE_ENDIAN);
12400
1
  return 2;
12401
1
}
12402
12403
static unsigned
12404
add_ff_block_ack_timeout(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12405
1
{
12406
1
  proto_tree_add_item(tree, hf_ieee80211_ff_block_ack_timeout, tvb, offset, 2,
12407
1
                      ENC_LITTLE_ENDIAN);
12408
1
  return 2;
12409
1
}
12410
12411
static unsigned
12412
add_ff_block_ack_ssc(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12413
2.92k
{
12414
2.92k
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_block_ack_ssc,
12415
2.92k
                         ett_ff_ba_ssc_tree, ieee80211_ff_block_ack_ssc_fields,
12416
2.92k
                         ENC_LITTLE_ENDIAN);
12417
2.92k
  return 2;
12418
2.92k
}
12419
12420
static unsigned
12421
add_ff_qos_ts_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12422
3
{
12423
3
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_tsinfo,
12424
3
                         ett_tsinfo_tree, ieee80211_tsinfo_fields,
12425
3
                         ENC_LITTLE_ENDIAN);
12426
3
  return 3;
12427
3
}
12428
12429
static unsigned
12430
add_ff_mesh_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12431
4
{
12432
4
  proto_tree_add_item(tree, hf_ieee80211_ff_mesh_action, tvb, offset, 1,
12433
4
                      ENC_LITTLE_ENDIAN);
12434
4
  return 1;
12435
4
}
12436
12437
static unsigned
12438
add_ff_multihop_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12439
3
{
12440
3
  proto_tree_add_item(tree, hf_ieee80211_ff_multihop_action, tvb, offset, 1,
12441
3
                      ENC_LITTLE_ENDIAN);
12442
3
  return 1;
12443
3
}
12444
12445
static unsigned
12446
add_ff_mesh_control(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12447
11
{
12448
11
  int    start = offset;
12449
11
  uint8_t flags;
12450
12451
11
  proto_tree_add_item(tree, hf_ieee80211_ff_mesh_flags, tvb, offset, 1,
12452
11
                      ENC_LITTLE_ENDIAN);
12453
11
  flags = tvb_get_uint8(tvb, offset);
12454
11
  offset += 1;
12455
11
  proto_tree_add_item(tree, hf_ieee80211_ff_mesh_ttl, tvb, offset, 1,
12456
11
                      ENC_LITTLE_ENDIAN);
12457
11
  offset += 1;
12458
11
  proto_tree_add_item(tree, hf_ieee80211_ff_mesh_sequence, tvb, offset, 4,
12459
11
                      ENC_LITTLE_ENDIAN);
12460
11
  offset += 4;
12461
12462
11
  switch (flags & 0x03) {
12463
1
  case 1:
12464
1
    proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr4, tvb, offset, 6,
12465
1
                        ENC_NA);
12466
1
    offset += 6;
12467
1
    break;
12468
3
  case 2:
12469
3
    proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr5, tvb, offset, 6,
12470
3
                        ENC_NA);
12471
3
    offset += 6;
12472
3
    proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr6, tvb, offset, 6,
12473
3
                        ENC_NA);
12474
3
    offset += 6;
12475
3
    break;
12476
0
  case 3:
12477
0
    proto_item_append_text(tree, " Unknown Address Extension Mode");
12478
0
    break;
12479
4
  default:
12480
    /* no default action */
12481
4
    break;
12482
11
  }
12483
12484
5
  return offset - start;
12485
11
}
12486
12487
static unsigned
12488
add_ff_selfprot_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12489
2
{
12490
2
  proto_tree_add_item(tree, hf_ieee80211_ff_selfprot_action, tvb, offset, 1,
12491
2
                      ENC_LITTLE_ENDIAN);
12492
2
  return 1;
12493
2
}
12494
12495
static unsigned
12496
add_ff_dls_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12497
8
{
12498
8
  proto_tree_add_item(tree, hf_ieee80211_ff_dls_action_code, tvb, offset, 1,
12499
8
                      ENC_LITTLE_ENDIAN);
12500
8
  return 1;
12501
8
}
12502
12503
static unsigned
12504
add_ff_dst_mac_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12505
8
{
12506
8
  proto_tree_add_item(tree, hf_ieee80211_ff_dst_mac_addr, tvb, offset, 6,
12507
8
                      ENC_NA);
12508
8
  return 6;
12509
8
}
12510
12511
static unsigned
12512
add_ff_src_mac_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12513
8
{
12514
8
  proto_tree_add_item(tree, hf_ieee80211_ff_src_mac_addr, tvb, offset, 6,
12515
8
                      ENC_NA);
12516
8
  return 6;
12517
8
}
12518
12519
static unsigned
12520
add_ff_req_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12521
1
{
12522
1
  proto_tree_add_item(tree, hf_ieee80211_ff_req_ap_addr, tvb, offset, 6,
12523
1
                      ENC_NA);
12524
1
  return 6;
12525
1
}
12526
12527
static unsigned
12528
add_ff_res_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12529
1
{
12530
1
  proto_tree_add_item(tree, hf_ieee80211_ff_res_ap_addr, tvb, offset, 6,
12531
1
                      ENC_NA);
12532
1
  return 6;
12533
1
}
12534
12535
static unsigned
12536
add_ff_check_beacon(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12537
3
{
12538
3
  proto_tree_add_item(tree, hf_ieee80211_ff_check_beacon, tvb, offset, 1,
12539
3
                      ENC_NA);
12540
3
  return 1;
12541
3
}
12542
12543
static unsigned
12544
add_ff_tod(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12545
3
{
12546
3
  proto_tree_add_item(tree, hf_ieee80211_ff_tod, tvb, offset, 4,
12547
3
                     ENC_NA);
12548
3
  return 4;
12549
3
}
12550
12551
static unsigned
12552
add_ff_toa(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12553
3
{
12554
3
  proto_tree_add_item(tree, hf_ieee80211_ff_toa, tvb, offset, 4,
12555
3
                      ENC_NA);
12556
3
  return 4;
12557
3
}
12558
12559
static unsigned
12560
add_ff_max_tod_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12561
3
{
12562
3
  proto_tree_add_item(tree, hf_ieee80211_ff_max_tod_err, tvb, offset, 1,
12563
3
                      ENC_NA);
12564
3
  return 1;
12565
3
}
12566
12567
static unsigned
12568
add_ff_max_toa_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12569
3
{
12570
3
  proto_tree_add_item(tree, hf_ieee80211_ff_max_toa_err, tvb, offset, 1,
12571
3
                      ENC_NA);
12572
3
  return 1;
12573
3
}
12574
12575
static unsigned
12576
add_ff_dls_timeout(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12577
3
{
12578
3
  proto_tree_add_item(tree, hf_ieee80211_ff_dls_timeout, tvb, offset, 2,
12579
3
                      ENC_LITTLE_ENDIAN);
12580
3
  return 2;
12581
3
}
12582
12583
static unsigned
12584
add_ff_delba_param_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12585
2
{
12586
2
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_delba_param,
12587
2
                         ett_ff_ba_param_tree, ieee80211_ff_delba_param_fields,
12588
2
                         ENC_LITTLE_ENDIAN);
12589
2
  return 2;
12590
2
}
12591
12592
static unsigned
12593
add_ff_max_reg_pwr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12594
33
{
12595
33
  proto_tree_add_item(tree, hf_ieee80211_ff_max_reg_pwr, tvb, offset, 2,
12596
33
                      ENC_LITTLE_ENDIAN);
12597
33
  return 2;
12598
33
}
12599
12600
static unsigned
12601
add_ff_measurement_pilot_int(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12602
33
{
12603
33
  proto_tree_add_item(tree, hf_ieee80211_ff_measurement_pilot_int, tvb, offset,
12604
33
                      1, ENC_NA);
12605
33
  return 1;
12606
33
}
12607
12608
static unsigned
12609
add_ff_country_str(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12610
33
{
12611
33
  proto_tree_add_item(tree, hf_ieee80211_ff_country_str, tvb, offset, 2,
12612
33
                      ENC_ASCII);
12613
33
  offset += 2;
12614
12615
33
  proto_tree_add_item(tree, hf_ieee80211_tag_country_info_env,
12616
33
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
12617
33
  return 3;
12618
33
}
12619
12620
static unsigned
12621
add_ff_max_tx_pwr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12622
33
{
12623
33
  proto_tree_add_item(tree, hf_ieee80211_ff_max_tx_pwr, tvb, offset, 1,
12624
33
                      ENC_LITTLE_ENDIAN);
12625
33
  return 1;
12626
33
}
12627
12628
static unsigned
12629
add_ff_tx_pwr_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12630
33
{
12631
33
  proto_tree_add_item(tree, hf_ieee80211_ff_tx_pwr_used, tvb, offset, 1,
12632
33
                      ENC_LITTLE_ENDIAN);
12633
33
  return 1;
12634
33
}
12635
12636
static unsigned
12637
add_ff_transceiver_noise_floor(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12638
33
{
12639
33
  proto_tree_add_item(tree, hf_ieee80211_ff_transceiver_noise_floor, tvb,
12640
33
                      offset, 1, ENC_LITTLE_ENDIAN);
12641
33
  return 1;
12642
33
}
12643
12644
static unsigned
12645
add_ff_channel_width(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12646
2
{
12647
2
  proto_tree_add_item(tree, hf_ieee80211_ff_channel_width, tvb, offset, 1,
12648
2
                      ENC_LITTLE_ENDIAN);
12649
2
  return 1;
12650
2
}
12651
12652
/* QoS Info:  802.11-2012 8.4.1.17 */
12653
static unsigned
12654
add_ff_qos_info_ap(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12655
8
{
12656
  /* From AP so decode as AP: Figure 8-51-QoS Info field when sent by a AP */
12657
8
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_qos_info_ap,
12658
8
                                    ett_ff_qos_info, ieee80211_ff_qos_info_ap_fields,
12659
8
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12660
8
  return 1;
12661
8
}
12662
12663
12664
/* QoS Info:  802.11-2012 8.4.1.17 */
12665
static unsigned
12666
add_ff_qos_info_sta(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12667
11
{
12668
  /* To AP so decode as STA: Figure 8-52-QoS Info field when set by a non-AP STA */
12669
11
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_qos_info_sta,
12670
11
                                    ett_ff_qos_info, ieee80211_ff_qos_info_sta_fields,
12671
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12672
11
  return 1;
12673
11
}
12674
12675
static unsigned
12676
add_ff_sm_pwr_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12677
1
{
12678
1
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_sm_pwr_save,
12679
1
                         ett_ff_sm_pwr_save, ieee80211_ff_sw_pwr_save_fields,
12680
1
                         ENC_LITTLE_ENDIAN);
12681
1
  return 1;
12682
1
}
12683
12684
static unsigned
12685
add_ff_pco_phase_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12686
0
{
12687
0
  proto_tree_add_item(tree, hf_ieee80211_ff_pco_phase_cntrl, tvb, offset, 1,
12688
0
                      ENC_LITTLE_ENDIAN);
12689
0
  return 1;
12690
0
}
12691
12692
static unsigned
12693
add_ff_psmp_param_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12694
25
{
12695
25
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_psmp_param_set,
12696
25
                         ett_ff_psmp_param_set,
12697
25
                         ieee80211_ff_psmp_param_set_fields,
12698
25
                         ENC_LITTLE_ENDIAN);
12699
25
  return 2;
12700
25
}
12701
12702
static unsigned
12703
add_ff_mimo_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12704
4
{
12705
4
  proto_item *mimo_item;
12706
4
  proto_tree *mimo_tree;
12707
4
  static int * const ieee80211_mimo_fields[] = {
12708
4
    &hf_ieee80211_ff_mimo_cntrl_nc_index,
12709
4
    &hf_ieee80211_ff_mimo_cntrl_nr_index,
12710
4
    &hf_ieee80211_ff_mimo_cntrl_channel_width,
12711
4
    &hf_ieee80211_ff_mimo_cntrl_grouping,
12712
4
    &hf_ieee80211_ff_mimo_cntrl_coefficient_size,
12713
4
    &hf_ieee80211_ff_mimo_cntrl_codebook_info,
12714
4
    &hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment,
12715
4
    &hf_ieee80211_ff_mimo_cntrl_reserved,
12716
4
    NULL
12717
4
  };
12718
12719
4
  mimo_item = proto_tree_add_item(tree, hf_ieee80211_ff_mimo_cntrl, tvb,
12720
4
                                  offset, 6, ENC_NA);
12721
4
  mimo_tree = proto_item_add_subtree(mimo_item, ett_ff_mimo_cntrl);
12722
12723
4
  proto_tree_add_bitmask_list(mimo_tree, tvb, offset, 2, ieee80211_mimo_fields, ENC_LITTLE_ENDIAN);
12724
4
  offset += 2;
12725
4
  proto_tree_add_item(mimo_tree, hf_ieee80211_ff_mimo_cntrl_sounding_timestamp,
12726
4
                      tvb, offset, 4, ENC_LITTLE_ENDIAN);
12727
12728
4
  return 6;
12729
4
}
12730
12731
static unsigned
12732
add_ff_ant_selection(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12733
1
{
12734
1
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_ant_selection,
12735
1
                         ett_ff_ant_sel, ieee80211_ff_ant_selection_fields,
12736
1
                         ENC_LITTLE_ENDIAN);
12737
1
  return 1;
12738
1
}
12739
12740
static unsigned
12741
add_ff_extended_channel_switch_announcement(proto_tree *tree, tvbuff_t *tvb,
12742
                                            packet_info *pinfo _U_, int offset)
12743
4
{
12744
4
  proto_tree_add_bitmask(tree, tvb, offset,
12745
4
                         hf_ieee80211_ff_ext_channel_switch_announcement,
12746
4
                         ett_ff_chan_switch_announce,
12747
4
                         ieee80211_ff_ext_channel_switch_announcement_fields,
12748
4
                         ENC_LITTLE_ENDIAN);
12749
4
  return 4;
12750
4
}
12751
12752
static unsigned
12753
add_ff_ht_information(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12754
1
{
12755
1
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_ht_info,
12756
1
                         ett_ff_ht_info, ieee80211_ff_ht_info_fields,
12757
1
                         ENC_LITTLE_ENDIAN);
12758
1
  return 1;
12759
1
}
12760
static unsigned
12761
add_ff_lmr_report(proto_tree *tree, tvbuff_t *tvb,
12762
                  packet_info *pinfo _U_, int offset)
12763
1
{
12764
1
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
12765
1
  offset += add_ff_ftm_tod(tree, tvb, pinfo, offset);
12766
1
  offset += add_ff_ftm_toa(tree, tvb, pinfo, offset);
12767
1
  offset += add_ff_ftm_tod_err1(tree, tvb, pinfo, offset);
12768
1
  offset += add_ff_ftm_toa_err1(tree, tvb, pinfo, offset);
12769
1
  offset += add_ff_ftm_cfo_parameter(tree, tvb, pinfo, offset);
12770
1
  offset += add_ff_ftm_r2i_ndp_tx_power(tree, tvb, pinfo, offset);
12771
1
  offset += add_ff_ftm_i2r_ndp_target_rssi(tree, tvb, pinfo, offset);
12772
  /* Secure LTF parameters (optional) */
12773
  /* AOA feedback (optional) */
12774
1
  return offset;
12775
1
}
12776
12777
static unsigned
12778
add_ff_ftm_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12779
2
{
12780
2
  return add_ff_trigger(tree, tvb, pinfo, offset);
12781
2
}
12782
12783
static unsigned
12784
add_ff_ftm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12785
0
{
12786
0
  unsigned start = offset;
12787
0
  uint8_t dialog_token = tvb_get_uint8(tvb, offset);
12788
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
12789
0
  if (dialog_token == 0) {
12790
0
    col_append_str(pinfo->cinfo, COL_INFO, " (Termination)");
12791
0
  }
12792
0
  offset += add_ff_followup_dialog_token(tree, tvb, pinfo, offset);
12793
0
  offset += add_ff_ftm_tod(tree, tvb, pinfo, offset);
12794
0
  offset += add_ff_ftm_toa(tree, tvb, pinfo, offset);
12795
0
  offset += add_ff_ftm_tod_err(tree, tvb, pinfo, offset);
12796
0
  offset += add_ff_ftm_toa_err(tree, tvb, pinfo, offset);
12797
0
  return offset - start;
12798
0
}
12799
12800
static unsigned
12801
add_ff_ht_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12802
36
{
12803
36
  proto_tree_add_item(tree, hf_ieee80211_ff_ht_action, tvb, offset, 1,
12804
36
                      ENC_LITTLE_ENDIAN);
12805
36
  return 1;
12806
36
}
12807
12808
static unsigned
12809
add_ff_dmg_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12810
19
{
12811
19
  proto_tree_add_item(tree, hf_ieee80211_ff_dmg_action_code, tvb, offset, 1,
12812
19
                      ENC_LITTLE_ENDIAN);
12813
19
  return 1;
12814
19
}
12815
12816
static unsigned
12817
add_ff_dmg_pwr_mgmt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12818
3
{
12819
3
  proto_tree_add_item(tree, hf_ieee80211_ff_dmg_pwr_mgmt, tvb, offset, 1,
12820
3
                      ENC_LITTLE_ENDIAN);
12821
3
  return 1;
12822
3
}
12823
12824
static unsigned
12825
add_ff_psmp_sta_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12826
202
{
12827
202
  proto_item *psmp_item;
12828
202
  proto_tree *psmp_tree;
12829
12830
202
  psmp_item = proto_tree_add_item(tree, hf_ieee80211_ff_psmp_sta_info, tvb,
12831
202
                                  offset, 8, ENC_LITTLE_ENDIAN);
12832
202
  psmp_tree = proto_item_add_subtree(psmp_item, ett_ff_psmp_sta_info);
12833
12834
202
  proto_tree_add_item(psmp_item, hf_ieee80211_ff_psmp_sta_info_type, tvb,
12835
202
                      offset, 4, ENC_LITTLE_ENDIAN);
12836
12837
202
  switch (tvb_get_letohl(tvb, offset) & PSMP_STA_INFO_FLAG_TYPE) {
12838
80
  case PSMP_STA_INFO_BROADCAST:
12839
80
    proto_tree_add_item(psmp_tree,
12840
80
                        hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
12841
80
                        offset, 4, ENC_LITTLE_ENDIAN);
12842
80
    proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
12843
80
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
12844
    /* Missing 64 bit bitmask... */
12845
80
    proto_tree_add_uint64(psmp_tree,
12846
80
                          hf_ieee80211_ff_psmp_sta_info_reserved_large,
12847
80
                          tvb, offset, 8,
12848
80
                          (tvb_get_letoh64(tvb, offset) &
12849
80
                           UINT64_C(0xFFFFFFFFFFE00000)) >> 21);
12850
80
    break;
12851
27
  case PSMP_STA_INFO_MULTICAST:
12852
27
    proto_tree_add_item(psmp_tree,
12853
27
                        hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
12854
27
                        offset, 4, ENC_LITTLE_ENDIAN);
12855
27
    proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
12856
27
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
12857
    /* Missing 64 bit bitmask... */
12858
27
    proto_tree_add_uint64(psmp_tree,
12859
27
                          hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id,
12860
27
                          tvb, offset, 6,
12861
27
                          (tvb_get_letoh64(tvb, offset) &
12862
27
                           UINT64_C(0xFFFFFFFFFFE00000)) >> 21);
12863
27
    break;
12864
39
  case PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED:
12865
39
    proto_tree_add_item(psmp_tree,
12866
39
                        hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
12867
39
                        offset, 4, ENC_LITTLE_ENDIAN);
12868
39
    proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
12869
39
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
12870
39
    offset += 2;
12871
39
    proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_sta_id, tvb,
12872
39
                        offset, 4, ENC_LITTLE_ENDIAN);
12873
39
    offset += 2;
12874
12875
39
    proto_tree_add_item(psmp_tree,
12876
39
                        hf_ieee80211_ff_psmp_sta_info_utt_start_offset,
12877
39
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
12878
39
    proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_utt_duration,
12879
39
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
12880
39
    proto_tree_add_item(psmp_tree,
12881
39
                        hf_ieee80211_ff_psmp_sta_info_reserved_small, tvb,
12882
39
                        offset, 4, ENC_LITTLE_ENDIAN);
12883
39
    break;
12884
202
  }
12885
12886
194
  return 8;
12887
202
}
12888
12889
static unsigned
12890
add_ff_schedule_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12891
22
{
12892
22
  static int * const ieee80211_schedule_info_fields1[] = {
12893
22
    &hf_ieee80211_sched_info_agg,
12894
22
    NULL
12895
22
  };
12896
22
  static int * const ieee80211_schedule_info_fields2[] = {
12897
22
    &hf_ieee80211_sched_info_agg,
12898
22
    &hf_ieee80211_sched_info_tsid,
12899
22
    &hf_ieee80211_sched_info_dir,
12900
22
    NULL
12901
22
  };
12902
12903
22
  if (tvb_get_letohs(tvb, offset) & 0x0001) {
12904
2
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_sched_info,
12905
2
                                    ett_sched_tree, ieee80211_schedule_info_fields2,
12906
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12907
20
  } else {
12908
20
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_sched_info,
12909
20
                                    ett_sched_tree, ieee80211_schedule_info_fields1,
12910
20
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
12911
20
  }
12912
12913
22
  return 2;
12914
22
}
12915
12916
static unsigned
12917
add_ff_pa_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12918
10
{
12919
10
  proto_tree_add_item(tree, hf_ieee80211_ff_public_action, tvb, offset, 1,
12920
10
                      ENC_LITTLE_ENDIAN);
12921
10
  return 1;
12922
10
}
12923
12924
static unsigned
12925
add_ff_ppa_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12926
21
{
12927
21
  proto_tree_add_item(tree, hf_ieee80211_ff_protected_public_action, tvb, offset, 1,
12928
21
                      ENC_LITTLE_ENDIAN);
12929
21
  return 1;
12930
21
}
12931
12932
static unsigned
12933
add_ff_ft_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12934
9
{
12935
9
  proto_tree_add_item(tree, hf_ieee80211_ff_ft_action_code, tvb, offset, 1,
12936
9
                      ENC_LITTLE_ENDIAN);
12937
9
  return 1;
12938
9
}
12939
12940
static unsigned
12941
add_ff_sta_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12942
4
{
12943
4
  proto_tree_add_item(tree, hf_ieee80211_ff_sta_address, tvb, offset, 6,
12944
4
                      ENC_NA);
12945
4
  return 6;
12946
4
}
12947
12948
static unsigned
12949
add_ff_target_ap_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12950
3
{
12951
3
  proto_tree_add_item(tree, hf_ieee80211_ff_target_ap_address, tvb, offset, 6,
12952
3
                      ENC_NA);
12953
3
  return 6;
12954
3
}
12955
12956
static unsigned
12957
add_ff_gas_comeback_delay(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12958
17
{
12959
17
  proto_tree_add_item(tree, hf_ieee80211_ff_gas_comeback_delay, tvb, offset, 2,
12960
17
                      ENC_LITTLE_ENDIAN);
12961
17
  return 2;
12962
17
}
12963
12964
static unsigned
12965
add_ff_gas_fragment_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12966
14
{
12967
14
  proto_tree_add_item(tree, hf_ieee80211_ff_gas_fragment_id, tvb, offset, 1,
12968
14
                      ENC_LITTLE_ENDIAN);
12969
14
  proto_tree_add_item(tree, hf_ieee80211_ff_more_gas_fragments, tvb, offset, 1,
12970
14
                      ENC_LITTLE_ENDIAN);
12971
14
  return 1;
12972
14
}
12973
12974
static unsigned
12975
add_ff_sa_query_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12976
5
{
12977
5
  proto_tree_add_item(tree, hf_ieee80211_ff_sa_query_action_code, tvb, offset,
12978
5
                      1, ENC_LITTLE_ENDIAN);
12979
5
  return 1;
12980
5
}
12981
12982
static unsigned
12983
add_ff_transaction_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
12984
3
{
12985
3
  proto_tree_add_item(tree, hf_ieee80211_ff_transaction_id, tvb, offset, 2,
12986
3
                      ENC_LITTLE_ENDIAN);
12987
3
  return 2;
12988
3
}
12989
12990
static unsigned
12991
add_ff_tdls_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
12992
51
{
12993
51
  uint8_t code;
12994
51
  code = tvb_get_uint8(tvb, offset);
12995
51
  col_set_str(pinfo->cinfo, COL_INFO,
12996
51
              val_to_str_ext_const(code, &tdls_action_codes_ext,
12997
51
                                   "Unknown TDLS Action"));
12998
51
  proto_tree_add_item(tree, hf_ieee80211_ff_tdls_action_code, tvb, offset, 1,
12999
51
                      ENC_LITTLE_ENDIAN);
13000
51
  return 1;
13001
51
}
13002
13003
static unsigned
13004
add_ff_target_channel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13005
0
{
13006
0
  proto_tree_add_item(tree, hf_ieee80211_ff_target_channel, tvb, offset, 1,
13007
0
                      ENC_LITTLE_ENDIAN);
13008
0
  return 1;
13009
0
}
13010
13011
static unsigned
13012
add_ff_operating_class(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13013
3.37k
{
13014
3.37k
  proto_tree_add_item(tree, hf_ieee80211_ff_operating_class, tvb, offset, 1,
13015
3.37k
                      ENC_LITTLE_ENDIAN);
13016
3.37k
  return 1;
13017
3.37k
}
13018
13019
static unsigned
13020
add_ff_channel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13021
3.36k
{
13022
3.36k
  proto_tree_add_item(tree, hf_ieee80211_ff_channel, tvb, offset, 1,
13023
3.36k
                      ENC_LITTLE_ENDIAN);
13024
3.36k
  return 1;
13025
3.36k
}
13026
13027
static unsigned
13028
add_ff_wnm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13029
10
{
13030
10
  uint8_t code;
13031
13032
10
  code = tvb_get_uint8(tvb, offset);
13033
10
  col_set_str(pinfo->cinfo, COL_INFO,
13034
10
              val_to_str_ext_const(code, &wnm_action_codes_ext, "Unknown WNM Action"));
13035
10
  proto_tree_add_item(tree, hf_ieee80211_ff_wnm_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
13036
10
  return 1;
13037
10
}
13038
13039
static unsigned
13040
add_ff_unprotected_wnm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13041
5
{
13042
5
  uint8_t code;
13043
13044
5
  code = tvb_get_uint8(tvb, offset);
13045
5
  col_set_str(pinfo->cinfo, COL_INFO,
13046
5
              val_to_str_ext_const(code, &unprotected_wnm_action_codes_ext, "Unknown Unprotected WNM Action"));
13047
5
  proto_tree_add_item(tree, hf_ieee80211_ff_unprotected_wnm_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
13048
5
  return 1;
13049
5
}
13050
13051
static unsigned
13052
add_ff_unprotected_dmg_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13053
3
{
13054
3
  proto_tree_add_item(tree, hf_ieee80211_ff_unprotected_dmg_action_code, tvb, offset, 1, ENC_NA);
13055
3
  return 1;
13056
3
}
13057
13058
static unsigned
13059
add_ff_key_data_length(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13060
1
{
13061
1
  proto_tree_add_item(tree, hf_ieee80211_ff_key_data_length, tvb, offset, 2,
13062
1
                      ENC_LITTLE_ENDIAN);
13063
1
  return 2;
13064
1
}
13065
13066
static unsigned
13067
add_ff_wnm_notification_type(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13068
5
{
13069
5
  proto_tree_add_item(tree, hf_ieee80211_ff_wnm_notification_type,
13070
5
                      tvb, offset, 1, ENC_NA);
13071
5
  return 1;
13072
5
}
13073
13074
/* Action frame: Radio Measurement actions */
13075
static unsigned
13076
add_ff_rm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13077
763
{
13078
763
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_action_code, tvb, offset, 1, ENC_NA);
13079
763
  return 1;
13080
763
}
13081
13082
static unsigned
13083
add_ff_rm_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13084
479
{
13085
479
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_dialog_token, tvb, offset, 1, ENC_NA);
13086
479
  return 1;
13087
479
}
13088
13089
/* Radio Measurement Request frame, Action fields */
13090
static unsigned
13091
add_ff_rm_repetitions(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13092
195
{
13093
  /* Note: 65535 means repeated until cancelled or superseded */
13094
195
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_repetitions, tvb, offset, 2,
13095
195
                      ENC_BIG_ENDIAN);
13096
195
  return 2;
13097
195
}
13098
13099
/* Link Measurement Request frame, Action fields*/
13100
static unsigned
13101
add_ff_rm_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13102
9
{
13103
  /* In dBm, see 8.4.1.20 */
13104
9
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_tx_power, tvb, offset, 1, ENC_NA);
13105
9
  return 1;
13106
9
}
13107
13108
static unsigned
13109
add_ff_rm_max_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13110
9
{
13111
  /* In dBm, see 8.4.1.19 */
13112
9
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_max_tx_power, tvb, offset, 1, ENC_NA);
13113
9
  return 1;
13114
9
}
13115
13116
/* Link Measurement Report frame, Action fields */
13117
static unsigned
13118
add_ff_rm_tpc_report(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13119
5
{
13120
5
  proto_tree *tpc_tree;
13121
5
  proto_item *tpc_item;
13122
13123
  /* 8.4.2.19 TPC Report element */
13124
  /* XXX - The TPC Report element is exactly the same as that dissected
13125
   * by ieee80211_tag_tpc_report(), so some of these fixed fields duplicate
13126
   * tagged fields.
13127
   */
13128
5
  tpc_item = proto_tree_add_item(tree, hf_ieee80211_ff_tpc, tvb, offset, 4, ENC_NA);
13129
5
  tpc_tree = proto_item_add_subtree(tpc_item, ett_tpc);
13130
5
  proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_element_id, tvb, offset, 1, ENC_NA);
13131
5
  proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_length, tvb, offset + 1, 1, ENC_NA);
13132
5
  proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_tx_power, tvb, offset + 2, 1, ENC_NA);
13133
5
  proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_link_margin, tvb, offset + 3, 1, ENC_NA);
13134
5
  return 4;
13135
5
}
13136
13137
static unsigned
13138
add_ff_rm_rx_antenna_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13139
5
{
13140
  /* 8.4.2.42: 0 means unknown, 1-254 is valid, 255 means multiple antennas */
13141
5
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_rx_antenna_id, tvb, offset, 1, ENC_NA);
13142
5
  return 1;
13143
5
}
13144
13145
static unsigned
13146
add_ff_rm_tx_antenna_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13147
5
{
13148
  /* 8.4.2.42: 0 means unknown, 1-254 is valid, 255 means multiple antennas */
13149
5
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_tx_antenna_id, tvb, offset, 1, ENC_NA);
13150
5
  return 1;
13151
5
}
13152
13153
static unsigned
13154
add_ff_rm_rcpi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13155
5
{
13156
  /* 8.4.2.40: RCPI as specified for certain PHYs */
13157
5
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_rcpi, tvb, offset, 1, ENC_NA);
13158
5
  return 1;
13159
5
}
13160
13161
static unsigned
13162
add_ff_rm_rsni(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13163
5
{
13164
  /* 8.4.2.43: RSNI in steps of 0.5 dB, calculated as:
13165
   * RSNI = (10 * log10((RCPI_{power} - ANPI_{power}) / ANPI_{power}) + 20)*2 */
13166
5
  proto_tree_add_item(tree, hf_ieee80211_ff_rm_rsni, tvb, offset, 1, ENC_NA);
13167
5
  return 1;
13168
5
}
13169
13170
static unsigned
13171
add_ff_bss_transition_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13172
0
{
13173
0
  proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_status_code, tvb, offset, 1,
13174
0
                      ENC_LITTLE_ENDIAN);
13175
0
  return 1;
13176
0
}
13177
13178
static unsigned
13179
add_ff_bss_termination_delay(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13180
0
{
13181
0
  proto_tree_add_item(tree, hf_ieee80211_ff_bss_termination_delay, tvb, offset, 1,
13182
0
                      ENC_LITTLE_ENDIAN);
13183
0
  return 1;
13184
0
}
13185
13186
static unsigned
13187
add_ff_fils_discovery(proto_tree *tree, tvbuff_t *tvb,
13188
                                            packet_info *pinfo _U_, int offset)
13189
1
{
13190
13191
1
  uint16_t fc, ssid_length;
13192
1
  static int * const ieee80211_ff_fils_discovery_frame_control[] = {
13193
1
    &hf_ieee80211_ff_fils_discovery_frame_control_ssid_length,
13194
1
    &hf_ieee80211_ff_fils_discovery_frame_control_capability,
13195
1
    &hf_ieee80211_ff_fils_discovery_frame_control_short_ssid,
13196
1
    &hf_ieee80211_ff_fils_discovery_frame_control_ap_csn,
13197
1
    &hf_ieee80211_ff_fils_discovery_frame_control_ano,
13198
1
    &hf_ieee80211_ff_fils_discovery_frame_control_channel_center_frequency,
13199
1
    &hf_ieee80211_ff_fils_discovery_frame_control_primary_channel,
13200
1
    &hf_ieee80211_ff_fils_discovery_frame_control_rsn_info,
13201
1
    &hf_ieee80211_ff_fils_discovery_frame_control_length,
13202
1
    &hf_ieee80211_ff_fils_discovery_frame_control_md,
13203
1
    &hf_ieee80211_ff_fils_discovery_frame_control_reserved,
13204
1
    NULL
13205
1
  };
13206
13207
1
  proto_tree_add_bitmask(tree, tvb, offset,
13208
1
                         hf_ieee80211_ff_fils_discovery_frame_control,
13209
1
                         ett_ff_fils_discovery_frame_control,
13210
1
                         ieee80211_ff_fils_discovery_frame_control,
13211
1
                         ENC_LITTLE_ENDIAN);
13212
1
  fc = tvb_get_letohs(tvb, offset);
13213
1
  offset += 2;
13214
13215
1
  offset += add_ff_timestamp(tree, tvb, pinfo, offset);
13216
13217
1
  offset += add_ff_beacon_interval(tree, tvb, pinfo, offset);
13218
13219
1
  if(fc & PA_FILS_FC_SHORT_SSID) {
13220
     /* Always 4 bytes for Short SSID */
13221
     /* TODO add check of SSID Length */
13222
0
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_short_ssid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
13223
0
    offset += 4;
13224
1
  } else {
13225
1
    ssid_length = (fc & PA_FILS_FC_SSID_LENGTH) + 1;
13226
1
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_ssid, tvb, offset, ssid_length, ENC_ASCII);
13227
1
    offset += ssid_length;
13228
1
  }
13229
13230
1
  if(fc & PA_FILS_FC_LENGTH){
13231
1
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_length, tvb, offset, 1, ENC_NA);
13232
1
    offset += 1;
13233
1
  }
13234
13235
1
  if(fc & PA_FILS_FC_CAPABILITY) {
13236
1
    proto_tree *fdc_tree;
13237
1
    proto_item *fdc_item;
13238
1
    uint32_t fdc;
13239
1
    fdc_item = proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_fils_discovery_capability, tvb, offset, 2, ENC_LITTLE_ENDIAN, &fdc);
13240
1
    fdc_tree = proto_item_add_subtree(fdc_item, ett_ff_fils_discovery_capability);
13241
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_ess, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13242
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_privacy, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13243
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_bss_operating_channel_width, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13244
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_max_number_of_spatial_streams, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13245
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13246
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_multiple_bssid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13247
1
    proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_phy_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13248
1
    switch((fdc & 0x1C00) >> 10){
13249
0
      case 0:
13250
0
        proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_dsss, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13251
0
      break;
13252
0
      case 1:
13253
0
        proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_ofdm, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13254
0
      break;
13255
0
      case 2:
13256
0
      case 3:
13257
0
        proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_ht_vht_tvht, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13258
0
      break;
13259
1
      case 4:
13260
1
        proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_he, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13261
1
      break;
13262
0
      default:
13263
0
        proto_tree_add_item(fdc_tree, hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
13264
0
      break;
13265
1
    }
13266
1
    offset += 2;
13267
1
  }
13268
13269
1
  if(fc & PA_FILS_FC_PC) {
13270
1
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_operating_class, tvb, offset, 1, ENC_NA);
13271
1
    offset += 1;
13272
1
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_primary_channel, tvb, offset, 1, ENC_NA);
13273
1
    offset += 1;
13274
1
  }
13275
13276
1
  if(fc & PA_FILS_FC_AP_CSN) {
13277
0
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_ap_csn, tvb, offset, 1, ENC_NA);
13278
0
    offset += 1;
13279
0
  }
13280
13281
1
  if(fc & PA_FILS_FC_ANO) {
13282
0
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_ano, tvb, offset, 1, ENC_NA);
13283
0
    offset += 1;
13284
0
  }
13285
13286
1
  if(fc & PA_FILS_FC_RSN_INFO) {
13287
    /*TODO Dissect RSN info */
13288
0
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_rsn_info, tvb, offset, 5, ENC_NA);
13289
0
    offset += 5;
13290
0
  }
13291
13292
1
  if(fc & PA_FILS_FC_CCFS1){
13293
0
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_ccfs1, tvb, offset, 1, ENC_NA);
13294
0
    offset += 1;
13295
0
  }
13296
13297
1
  if(fc & PA_FILS_FC_MD) {
13298
    /*TODO Dissect Mobility Domain */
13299
1
    proto_tree_add_item(tree, hf_ieee80211_ff_fils_discovery_md, tvb, offset, 3, ENC_NA);
13300
1
    offset += 3;
13301
1
  }
13302
13303
1
  return offset;
13304
1
}
13305
13306
13307
static unsigned
13308
add_ff_action_spectrum_mgmt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13309
117
{
13310
117
    switch (tvb_get_uint8(tvb, offset + 1)) {
13311
41
    case SM_ACTION_MEASUREMENT_REQUEST:
13312
44
    case SM_ACTION_MEASUREMENT_REPORT:
13313
46
    case SM_ACTION_TPC_REQUEST:
13314
48
    case SM_ACTION_TPC_REPORT:
13315
48
      add_ff_category_code(tree, tvb, pinfo, offset);
13316
48
      add_ff_action_code(tree, tvb, pinfo, offset + 1);
13317
48
      add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
13318
48
      return 3;
13319
3
    case SM_ACTION_CHAN_SWITCH_ANNC:
13320
4
    case SM_ACTION_EXT_CHAN_SWITCH_ANNC:
13321
4
      add_ff_category_code(tree, tvb, pinfo, offset);
13322
4
      add_ff_action_code(tree, tvb, pinfo, offset + 1);
13323
4
      return 2;
13324
65
    default:
13325
65
      add_ff_category_code(tree, tvb, pinfo, offset);
13326
65
      add_ff_action_code(tree, tvb, pinfo, offset + 1);
13327
65
      return 2;
13328
117
    }
13329
117
}
13330
13331
static unsigned
13332
add_ff_action_qos(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13333
10
{
13334
10
  switch (tvb_get_uint8(tvb, offset + 1)) {
13335
2
  case QOS_ACTION_ADDTS_REQUEST:
13336
2
    add_ff_category_code(tree, tvb, pinfo, offset);
13337
2
    add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
13338
2
    add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
13339
2
    return 3;
13340
3
  case QOS_ACTION_ADDTS_RESPONSE:
13341
3
    add_ff_category_code(tree, tvb, pinfo, offset);
13342
3
    add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
13343
3
    add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
13344
3
    add_ff_status_code(tree, tvb, pinfo, offset + 3);
13345
3
    return 5;
13346
1
  case QOS_ACTION_DELTS:
13347
1
    add_ff_category_code(tree, tvb, pinfo, offset);
13348
1
    add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
13349
1
    add_ff_qos_ts_info(tree, tvb, pinfo, offset + 2);
13350
1
    add_ff_reason_code(tree, tvb, pinfo, offset + 5);
13351
1
    return 7;
13352
2
  case QOS_ACTION_SCHEDULE:
13353
2
    add_ff_category_code(tree, tvb, pinfo, offset);
13354
2
    add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
13355
2
    return 2;
13356
0
  case QOS_ACTION_MAP_CONFIGURE:
13357
0
    add_ff_category_code(tree, tvb, pinfo, offset);
13358
0
    add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
13359
0
    return 2;
13360
2
  default:
13361
2
    add_ff_category_code(tree, tvb, pinfo, offset);
13362
2
    return 2;
13363
10
  }
13364
10
}
13365
13366
static unsigned
13367
add_ff_action_dls(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13368
11
{
13369
11
  switch (tvb_get_uint8(tvb, offset + 1)) {
13370
3
  case DLS_ACTION_REQUEST:
13371
3
    add_ff_category_code(tree, tvb, pinfo, offset);
13372
3
    add_ff_dls_action_code(tree, tvb, pinfo, offset +  1);
13373
3
    add_ff_dst_mac_addr(tree, tvb, pinfo, offset +  2);
13374
3
    add_ff_src_mac_addr(tree, tvb, pinfo, offset +  8);
13375
3
    add_ff_cap_info(tree, tvb, pinfo, offset + 14);
13376
3
    add_ff_dls_timeout(tree, tvb, pinfo, offset + 16);
13377
3
    return 18;
13378
3
  case DLS_ACTION_RESPONSE:
13379
3
    add_ff_category_code(tree, tvb, pinfo, offset);
13380
3
    add_ff_dls_action_code(tree, tvb, pinfo, offset +  1);
13381
3
    add_ff_status_code(tree, tvb, pinfo, offset +  2);
13382
3
    add_ff_dst_mac_addr(tree, tvb, pinfo, offset +  4);
13383
3
    add_ff_src_mac_addr(tree, tvb, pinfo, offset + 10);
13384
3
    if (!hf_ieee80211_ff_status_code) {
13385
0
      add_ff_cap_info(tree, tvb, pinfo, offset + 16);
13386
0
    }
13387
3
    return 16;
13388
2
  case DLS_ACTION_TEARDOWN:
13389
2
    add_ff_category_code(tree, tvb, pinfo, offset);
13390
2
    add_ff_dls_action_code(tree, tvb, pinfo, offset +  1);
13391
2
    add_ff_dst_mac_addr(tree, tvb, pinfo, offset +  2);
13392
2
    add_ff_src_mac_addr(tree, tvb, pinfo, offset +  8);
13393
2
    add_ff_reason_code(tree, tvb, pinfo, offset + 14);
13394
2
    return 16;
13395
3
  default:
13396
3
    add_ff_category_code(tree, tvb, pinfo, offset);
13397
3
    return 2;
13398
11
  }
13399
11
}
13400
13401
static unsigned
13402
add_ff_action_block_ack(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13403
5
{
13404
5
  unsigned start = offset;
13405
13406
5
  switch (tvb_get_uint8(tvb, offset + 1)) {
13407
1
  case BA_ADD_BLOCK_ACK_REQUEST:
13408
1
  case BA_NDP_ADD_BLOCK_ACK_REQUEST:
13409
1
  case BA_BAT_ADD_BLOCK_ACK_REQUEST:
13410
1
    offset += add_ff_category_code(tree, tvb, pinfo, offset);
13411
1
    offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
13412
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13413
1
    offset += add_ff_block_ack_param(tree, tvb, pinfo, offset);
13414
1
    offset += add_ff_block_ack_timeout(tree, tvb, pinfo, offset);
13415
1
    offset += add_ff_block_ack_ssc(tree, tvb, pinfo, offset);
13416
1
    break;
13417
0
  case BA_ADD_BLOCK_ACK_RESPONSE:
13418
0
  case BA_NDP_ADD_BLOCK_ACK_RESPONSE:
13419
0
  case BA_BAT_ADD_BLOCK_ACK_RESPONSE:
13420
0
    offset += add_ff_category_code(tree, tvb, pinfo, offset);
13421
0
    offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
13422
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13423
0
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
13424
0
    offset += add_ff_block_ack_param(tree, tvb, pinfo, offset);
13425
0
    offset += add_ff_block_ack_timeout(tree, tvb, pinfo, offset);
13426
0
    break;
13427
1
  case BA_DELETE_BLOCK_ACK:
13428
2
  case BA_NDP_DELETE_BLOCK_ACK:
13429
2
  case BA_BAT_DELETE_BLOCK_ACK:
13430
2
    offset += add_ff_category_code(tree, tvb, pinfo, offset);
13431
2
    offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
13432
2
    offset += add_ff_delba_param_set(tree, tvb, pinfo, offset);
13433
2
    offset += add_ff_reason_code(tree, tvb, pinfo, offset);
13434
2
    break;
13435
5
  }
13436
13437
5
  return offset - start;  /* Size of fixed fields */
13438
5
}
13439
13440
unsigned
13441
add_ff_action_public_fields(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, uint8_t code)
13442
40
{
13443
40
  uint32_t oui;
13444
40
  unsigned type;
13445
40
  unsigned subtype;
13446
40
  uint8_t  dialog_token;
13447
40
  uint8_t  frag;
13448
40
  bool more;
13449
40
  tvbuff_t *vendor_tvb;
13450
40
  int dissected;
13451
13452
40
  unsigned start = offset;
13453
13454
40
  switch (code) {
13455
1
  case PA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT:
13456
1
    offset += add_ff_extended_channel_switch_announcement(tree, tvb, pinfo, offset);
13457
1
    break;
13458
3
  case PA_VENDOR_SPECIFIC:
13459
3
    proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
13460
3
    offset += 3;
13461
3
    switch (oui) {
13462
0
    case OUI_WFA:
13463
0
      subtype = tvb_get_uint8(tvb, offset);
13464
0
      proto_tree_add_item(tree, hf_ieee80211_tag_oui_wfa_subtype, tvb, offset, 1, ENC_NA);
13465
0
      offset += 1;
13466
0
      vendor_tvb = tvb_new_subset_remaining(tvb, offset);
13467
0
      dissected = dissector_try_uint_with_data(wifi_alliance_public_action_table, subtype, vendor_tvb, pinfo, tree, false, NULL);
13468
0
      offset += dissected;
13469
0
      break;
13470
3
    default:
13471
      /* Don't know how to handle this vendor */
13472
3
      break;
13473
3
    }
13474
3
    break;
13475
3
  case PA_GAS_INITIAL_REQUEST:
13476
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13477
1
    offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
13478
1
                                             &type, &subtype);
13479
1
    offset += dissect_gas_initial_request(tree, tvb, pinfo, offset, type,
13480
1
                                          subtype);
13481
1
    break;
13482
3
  case PA_GAS_INITIAL_RESPONSE:
13483
3
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13484
3
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
13485
3
    offset += add_ff_gas_comeback_delay(tree, tvb, pinfo, offset);
13486
3
    offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
13487
3
                                             &type, &subtype);
13488
3
    offset += dissect_gas_initial_response(tree, tvb, pinfo, offset, type,
13489
3
                                           subtype);
13490
3
    break;
13491
2
  case PA_GAS_COMEBACK_REQUEST:
13492
2
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13493
2
    break;
13494
14
  case PA_GAS_COMEBACK_RESPONSE:
13495
14
    dialog_token = tvb_get_uint8(tvb, offset);
13496
14
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13497
14
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
13498
14
    frag = tvb_get_uint8(tvb, offset) & 0x7f;
13499
14
    more = (tvb_get_uint8(tvb, offset) & 0x80) != 0;
13500
14
    offset += add_ff_gas_fragment_id(tree, tvb, pinfo, offset);
13501
14
    offset += add_ff_gas_comeback_delay(tree, tvb, pinfo, offset);
13502
14
    offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
13503
14
                                             &type, &subtype);
13504
14
    offset += dissect_gas_comeback_response(tree, tvb, pinfo, offset, type,
13505
14
                                            subtype, frag, more, dialog_token);
13506
14
    break;
13507
0
  case PA_TDLS_DISCOVERY_RESPONSE:
13508
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "TDLS");
13509
0
    col_set_str(pinfo->cinfo, COL_INFO, "TDLS Discovery Response");
13510
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13511
0
    offset += add_ff_cap_info(tree, tvb, pinfo, offset);
13512
0
    break;
13513
1
  case PA_QAB_REQUEST:
13514
1
  case PA_QAB_RESPONSE:
13515
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
13516
1
    offset += add_ff_req_ap_addr(tree, tvb, pinfo, offset);
13517
1
    offset += add_ff_res_ap_addr(tree, tvb, pinfo, offset);
13518
1
    break;
13519
2
  case PA_FTM_REQUEST:
13520
2
    col_set_str(pinfo->cinfo, COL_INFO, "FTM Request");
13521
2
    offset += add_ff_ftm_request(tree, tvb, pinfo, offset);
13522
2
    break;
13523
0
  case PA_FTM:
13524
0
    col_set_str(pinfo->cinfo, COL_INFO, "FTM");
13525
0
    offset += add_ff_ftm(tree, tvb, pinfo, offset);
13526
0
    break;
13527
1
  case PA_FILS_DISCOVERY:
13528
1
    col_set_str(pinfo->cinfo, COL_INFO, "FILS Discovery");
13529
1
    offset = add_ff_fils_discovery(tree, tvb, pinfo, offset);
13530
1
    break;
13531
1
  case PA_LOCATION_MEASUREMENT_REPORT:
13532
1
    col_set_str(pinfo->cinfo, COL_INFO, "Location Measurement Report");
13533
1
    offset = add_ff_lmr_report(tree, tvb, pinfo, offset);
13534
1
    break;
13535
40
  }
13536
13537
39
  return offset - start;  /* Size of fixed fields */
13538
40
}
13539
13540
static unsigned
13541
add_ff_action_public(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13542
10
{
13543
10
  uint8_t code;
13544
10
  unsigned start = offset;
13545
10
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13546
10
  code    = tvb_get_uint8(tvb, offset);
13547
10
  offset += add_ff_pa_action_code(tree, tvb, pinfo, offset);
13548
10
  offset += add_ff_action_public_fields(tree, tvb, pinfo, offset, code);
13549
10
  return offset - start;
13550
10
}
13551
13552
static unsigned
13553
add_ff_action_protected_public(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13554
21
{
13555
21
  uint8_t code;
13556
21
  unsigned start = offset;
13557
21
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13558
21
  code    = tvb_get_uint8(tvb, offset);
13559
21
  offset += add_ff_ppa_action_code(tree, tvb, pinfo, offset);
13560
21
  offset += add_ff_action_public_fields(tree, tvb, pinfo, offset, code);
13561
21
  return offset - start;
13562
21
}
13563
13564
static unsigned
13565
add_ff_action_radio_measurement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13566
763
{
13567
763
  unsigned  start = offset;
13568
763
  uint8_t code;
13569
13570
763
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13571
763
  code = tvb_get_uint8(tvb, offset);
13572
763
  offset += add_ff_rm_action_code(tree, tvb, pinfo, offset);
13573
13574
763
  switch (code) {
13575
195
  case RM_ACTION_RADIO_MEASUREMENT_REQUEST:
13576
195
    offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
13577
195
    offset += add_ff_rm_repetitions(tree, tvb, pinfo, offset);
13578
    /* Followed by Measurement Request Elements */
13579
195
    break;
13580
40
  case RM_ACTION_RADIO_MEASUREMENT_REPORT:
13581
40
    offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
13582
    /* Followed by Measurement Report Elements */
13583
40
    break;
13584
9
  case RM_ACTION_LINK_MEASUREMENT_REQUEST:
13585
9
    offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
13586
9
    offset += add_ff_rm_tx_power(tree, tvb, pinfo, offset);
13587
9
    offset += add_ff_rm_max_tx_power(tree, tvb, pinfo, offset);
13588
    /* Followed by Optional Subelements */
13589
9
    break;
13590
5
  case RM_ACTION_LINK_MEASUREMENT_REPORT:
13591
5
    offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
13592
5
    offset += add_ff_rm_tpc_report(tree, tvb, pinfo, offset);
13593
5
    offset += add_ff_rm_rx_antenna_id(tree, tvb, pinfo, offset);
13594
5
    offset += add_ff_rm_tx_antenna_id(tree, tvb, pinfo, offset);
13595
5
    offset += add_ff_rm_rcpi(tree, tvb, pinfo, offset);
13596
5
    offset += add_ff_rm_rsni(tree, tvb, pinfo, offset);
13597
    /* Followed by Optional Subelements */
13598
5
    break;
13599
2
  case RM_ACTION_NEIGHBOR_REPORT_REQUEST:
13600
2
    offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
13601
    /* Followed by Optional Subelements */
13602
2
    break;
13603
228
  case RM_ACTION_NEIGHBOR_REPORT_RESPONSE:
13604
228
    offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
13605
    /* Followed by Neighbor Report Elements */
13606
228
    break;
13607
763
  }
13608
13609
763
  return offset - start;  /* Size of fixed fields */
13610
763
}
13611
13612
static unsigned
13613
add_ff_action_fast_bss_transition(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13614
9
{
13615
9
  unsigned  start = offset;
13616
9
  uint8_t code;
13617
13618
9
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13619
9
  code    = tvb_get_uint8(tvb, offset);
13620
9
  offset += add_ff_ft_action_code(tree, tvb, pinfo, offset);
13621
13622
9
  switch (code) {
13623
1
  case FT_ACTION_REQUEST:
13624
1
    offset += add_ff_sta_address(tree, tvb, pinfo, offset);
13625
1
    offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
13626
    /* Followed by FT Request frame body (IEs) */
13627
1
    break;
13628
2
  case FT_ACTION_RESPONSE:
13629
2
    offset += add_ff_sta_address(tree, tvb, pinfo, offset);
13630
2
    offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
13631
2
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
13632
    /* Followed by FT Response frame body (IEs) */
13633
2
    break;
13634
0
  case FT_ACTION_CONFIRM:
13635
0
    offset += add_ff_sta_address(tree, tvb, pinfo, offset);
13636
0
    offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
13637
    /* Followed by FT Confirm frame body (IEs) */
13638
0
    break;
13639
0
  case FT_ACTION_ACK:
13640
0
    offset += add_ff_sta_address(tree, tvb, pinfo, offset);
13641
0
    offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
13642
0
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
13643
    /* Followed by FT Ack frame body (IEs) */
13644
0
    break;
13645
9
  }
13646
13647
9
  return offset - start;  /* Size of fixed fields */
13648
9
}
13649
13650
static unsigned
13651
add_ff_action_sa_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13652
5
{
13653
5
  unsigned  start = offset;
13654
5
  uint8_t code;
13655
13656
5
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13657
5
  code    = tvb_get_uint8(tvb, offset);
13658
5
  offset += add_ff_sa_query_action_code(tree, tvb, pinfo, offset);
13659
13660
5
  switch (code) {
13661
3
  case SA_QUERY_REQUEST:
13662
3
    offset += add_ff_transaction_id(tree, tvb, pinfo, offset);
13663
3
    break;
13664
0
  case SA_QUERY_RESPONSE:
13665
0
    offset += add_ff_transaction_id(tree, tvb, pinfo, offset);
13666
0
    break;
13667
5
  }
13668
13669
5
  return offset - start;  /* Size of fixed fields */
13670
5
}
13671
13672
static unsigned
13673
add_ff_action_mesh(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13674
4
{
13675
4
  unsigned length;
13676
13677
4
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13678
4
  offset += add_ff_mesh_action(tree, tvb, pinfo, offset);
13679
  /* The only fixed fields are the category and mesh action.  The rest are IEs.
13680
   */
13681
4
  length = 2;
13682
4
  if (tvb_get_uint8(tvb, 1) == MESH_ACTION_TBTT_ADJ_RESPONSE) {
13683
    /* ..except for the TBTT Adjustment Response, which has a status code field
13684
     */
13685
1
    length += add_ff_status_code(tree, tvb, pinfo, offset);
13686
1
  }
13687
4
  return length;
13688
4
}
13689
13690
static unsigned
13691
add_ff_action_multihop(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
13692
3
{
13693
3
  unsigned start = offset;
13694
13695
3
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13696
3
  offset += add_ff_multihop_action(tree, tvb, pinfo, offset);
13697
3
  offset += add_ff_mesh_control(tree, tvb, pinfo, offset);
13698
3
  return offset - start;
13699
3
}
13700
13701
static unsigned
13702
add_ff_action_self_protected(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
13703
                             association_sanity_check_t *association_sanity_check)
13704
2
{
13705
2
  unsigned start = offset;
13706
2
  uint8_t self_protected_action = tvb_get_uint8(tvb, start + 1);
13707
13708
2
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
13709
2
  offset += add_ff_selfprot_action(tree, tvb, pinfo, offset);
13710
13711
2
  switch (self_protected_action) {
13712
1
  case SELFPROT_ACTION_MESH_PEERING_OPEN:
13713
1
    offset += add_ff_cap_info(tree, tvb, pinfo, offset);
13714
1
    if (association_sanity_check)
13715
0
      association_sanity_check->ampe_frame = self_protected_action;
13716
1
    break;
13717
0
  case SELFPROT_ACTION_MESH_PEERING_CONFIRM:
13718
0
    offset += add_ff_cap_info(tree, tvb, pinfo, offset);
13719
0
    offset += add_ff_assoc_id(tree, tvb, pinfo, offset);
13720
0
    if (association_sanity_check)
13721
0
      association_sanity_check->ampe_frame = self_protected_action;
13722
0
    break;
13723
0
  case SELFPROT_ACTION_MESH_PEERING_CLOSE:
13724
0
    if (association_sanity_check)
13725
0
      association_sanity_check->ampe_frame = self_protected_action;
13726
0
    break;
13727
2
  }
13728
13729
2
  return offset - start;
13730
2
}
13731
13732
static unsigned
13733
add_ff_vht_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13734
130
{
13735
130
  proto_tree_add_item(tree, hf_ieee80211_ff_vht_action, tvb, offset, 1,
13736
130
                      ENC_LITTLE_ENDIAN);
13737
130
  return 1;
13738
130
}
13739
13740
static unsigned
13741
add_ff_s1g_timestamp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13742
557
{
13743
557
  proto_tree_add_item(tree, hf_ieee80211_ff_s1g_timestamp, tvb, offset,
13744
557
                      4, ENC_LITTLE_ENDIAN);
13745
557
  return 4;
13746
557
}
13747
13748
static unsigned
13749
add_ff_change_sequence(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13750
554
{
13751
554
  proto_tree_add_item(tree, hf_ieee80211_ff_s1g_change_sequence, tvb, offset,
13752
554
                      1, ENC_NA);
13753
554
  return 1;
13754
554
}
13755
13756
static unsigned
13757
add_ff_next_tbtt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13758
211
{
13759
211
  proto_tree_add_item(tree, hf_ieee80211_ff_s1g_next_tbtt, tvb, offset,
13760
211
                      3, ENC_LITTLE_ENDIAN);
13761
211
  return 3;
13762
211
}
13763
13764
static unsigned
13765
add_ff_compressed_ssid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13766
134
{
13767
134
  proto_tree_add_item(tree, hf_ieee80211_ff_s1g_compressed_ssid, tvb, offset,
13768
134
                      4, ENC_LITTLE_ENDIAN);
13769
134
  return 4;
13770
134
}
13771
13772
/* This should not be S1G specific because 802.11-2016 defines it as well. */
13773
static unsigned
13774
add_ff_access_network_options(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13775
264
{
13776
264
  proto_tree_add_item(tree, hf_ieee80211_ff_s1g_access_network_options, tvb,
13777
264
                      offset, 1, ENC_LITTLE_ENDIAN);
13778
264
  return 1;
13779
264
}
13780
13781
static unsigned
13782
add_ff_s1g_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13783
5
{
13784
5
  proto_tree_add_item(tree, hf_ieee80211_ff_s1g_action, tvb, offset, 1,
13785
5
                      ENC_LITTLE_ENDIAN);
13786
5
  return 1;
13787
5
}
13788
13789
static unsigned
13790
add_ff_prot_s1g_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
13791
3
{
13792
3
  proto_tree_add_item(tree, hf_ieee80211_ff_prot_s1g_action, tvb, offset, 1,
13793
3
                      ENC_LITTLE_ENDIAN);
13794
3
  return 1;
13795
3
}
13796
13797
static conversation_t *find_or_create_wlan_conversation(packet_info *pinfo)
13798
734
{
13799
  /* HACK to avoid collision with conversation in EAP dissector */
13800
734
  pinfo->srcport = GPOINTER_TO_UINT(
13801
734
    p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, ASSOC_COUNTER_KEY));
13802
734
  pinfo->destport = pinfo->srcport;
13803
734
  return find_or_create_conversation(pinfo);
13804
734
}
13805
13806
734
static ieee80211_conversation_data_t* get_or_create_conversation_data(conversation_t *conversation) {
13807
734
  ieee80211_conversation_data_t *conversation_data = (ieee80211_conversation_data_t*)conversation_get_proto_data(conversation, proto_wlan);
13808
734
  if (!conversation_data) {
13809
734
    conversation_data = wmem_new(wmem_file_scope(), ieee80211_conversation_data_t);
13810
734
    conversation_add_proto_data(conversation, proto_wlan, conversation_data);
13811
734
    memset(conversation_data, 0, sizeof(ieee80211_conversation_data_t));
13812
734
  }
13813
734
  return conversation_data;
13814
734
}
13815
13816
5
static unsigned get_group_element_len(unsigned group) {
13817
5
  switch (group) {
13818
    /* Diffie-Hellman groups */
13819
0
    case 1:
13820
0
      return 96;
13821
0
    case 2:
13822
0
    case 22:
13823
0
      return 128;
13824
0
    case 5:
13825
0
      return 192;
13826
0
    case 14:
13827
0
    case 23:
13828
0
    case 24:
13829
0
      return 256;
13830
0
    case 15:
13831
0
      return 384;
13832
0
    case 16:
13833
0
      return 512;
13834
0
    case 17:
13835
0
      return 768;
13836
0
    case 18:
13837
0
      return 1024;
13838
    /* ECC groups */
13839
0
    case 19:
13840
0
    case 28:
13841
0
      return 64;
13842
0
    case 20:
13843
0
    case 29:
13844
0
      return 96;
13845
0
    case 21:
13846
0
      return 132;
13847
0
    case 25:
13848
0
      return 48;
13849
0
    case 26:
13850
0
      return 56;
13851
0
    case 30:
13852
0
      return 128;
13853
5
    default:
13854
5
      return 0;
13855
5
  }
13856
5
}
13857
13858
5
static unsigned get_scalar_len(unsigned group) {
13859
5
  switch (group) {
13860
    /* Diffie-Hellman groups */
13861
0
    case 1:
13862
0
      return 96;
13863
0
    case 2:
13864
0
      return 128;
13865
0
    case 5:
13866
0
      return 192;
13867
0
    case 14:
13868
0
      return 256;
13869
0
    case 15:
13870
0
      return 384;
13871
0
    case 16:
13872
0
      return 512;
13873
0
    case 17:
13874
0
      return 768;
13875
0
    case 18:
13876
0
      return 1024;
13877
0
    case 22:
13878
0
      return 20;
13879
0
    case 23:
13880
0
      return 28;
13881
0
    case 24:
13882
0
      return 32;
13883
    /* ECC groups */
13884
0
    case 19:
13885
0
    case 28:
13886
0
      return 32;
13887
0
    case 20:
13888
0
    case 29:
13889
0
      return 48;
13890
0
    case 21:
13891
0
      return 66;
13892
0
    case 25:
13893
0
      return 24;
13894
0
    case 26:
13895
0
      return 28;
13896
0
    case 30:
13897
0
      return 64;
13898
5
    default:
13899
5
      return 0;
13900
5
  }
13901
5
}
13902
13903
static unsigned
13904
find_fixed_field_len(tvbuff_t *tvb, unsigned offset)
13905
5
{
13906
5
  unsigned start_offset = offset;
13907
5
  unsigned len = tvb_reported_length(tvb);
13908
13909
5
  if (offset >= len) {
13910
0
    return 0;
13911
0
  }
13912
13913
2.81k
  while (offset < len) {
13914
2.80k
    if (tvb_get_uint8(tvb, offset) == 0xFF) {
13915
      /*
13916
       * Check if we have a len followed by either ETAG_REJECTED_GROUPS
13917
       * or ETAG_PASSWORD_IDENTIFIER or ETAG_ANTI_CLOGGING_TOKEN
13918
       */
13919
      /* The length of SAE Confirm or Scalar Fixed parameter >= 32 */
13920
170
      if ((offset < len - 3) && (offset - start_offset >= 32)) {
13921
158
        uint8_t etag_len = tvb_get_uint8(tvb, offset + 1);
13922
158
        uint8_t check_byte = tvb_get_uint8(tvb, offset + 2);
13923
158
        if (check_byte == ETAG_REJECTED_GROUPS ||
13924
158
            check_byte == ETAG_PASSWORD_IDENTIFIER ||
13925
158
            check_byte == ETAG_ANTI_CLOGGING_TOKEN ||
13926
158
            check_byte == ETAG_MULTI_LINK ||
13927
158
            check_byte == ETAG_AKM_SUITE_SELECTOR) {
13928
          /* Add length check to avoid false detection */
13929
9
          if (offset + etag_len + 2 <= len) {
13930
0
            break;
13931
0
          }
13932
9
        }
13933
158
      }
13934
170
    }
13935
2.80k
    offset++;
13936
2.80k
  }
13937
13938
5
  return offset - start_offset;
13939
5
}
13940
13941
static const value_string ff_sae_message_type_vals[] = {
13942
  {1, "Commit" },
13943
  {2, "Confirm" },
13944
  {0, NULL }
13945
};
13946
13947
/*
13948
 * We have to deal with the issue that an anti-clogging token may be in this
13949
 * thing.
13950
 */
13951
static unsigned
13952
add_ff_auth_sae(proto_tree *tree, tvbuff_t *tvb,
13953
                         packet_info *pinfo _U_, unsigned offset)
13954
7
{
13955
7
  unsigned alg, seq, status_code, len;
13956
7
  alg = tvb_get_letohs(tvb, 0);
13957
13958
7
  if (alg != AUTH_ALG_SAE)
13959
0
    return offset;
13960
13961
7
  seq = tvb_get_letohs(tvb, 2);
13962
7
  status_code = tvb_get_letohs(tvb, 4);
13963
13964
7
  proto_tree_add_uint(tree, hf_ieee80211_ff_sae_message_type, tvb, 2, 2, seq);
13965
13966
7
  if (seq == 1)
13967
5
  {
13968
5
    uint16_t group;
13969
5
    unsigned sc_len, elt_len;
13970
5
    int is_ap = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool,
13971
5
                                 pinfo, proto_wlan, IS_AP_KEY));
13972
13973
    /*
13974
     * Order is: Status code,
13975
     *           Finite Cyclic Group,
13976
     *           Anti-Clogging Token in some cases
13977
     *           Send-Confirm in some cases
13978
     *           Scalar in some cases
13979
     *           FFE in some cases
13980
     *           Confirm in some cases
13981
     *           Challenge Text in some cases
13982
     *           RSNE in some cases.
13983
     *           MDE in some cases.
13984
     *           Fast BSS TRansition ... in some cases.
13985
     */
13986
13987
    /* 76: Authentication is rejected because an Anti-Clogging Token is required (cf ieee80211_status_code) */
13988
      /* These are present if status code is 0, 76, 77 or 126 */
13989
5
    if (status_code == 0 || status_code == 76 || status_code == 77 ||
13990
5
        status_code == 126)
13991
5
    {
13992
5
      group = tvb_get_letohs(tvb, offset);
13993
5
      proto_tree_add_item(tree, hf_ieee80211_ff_finite_cyclic_group, tvb,
13994
5
                          offset, 2, ENC_LITTLE_ENDIAN);
13995
5
      offset += 2;
13996
13997
13998
      /*
13999
       * Now, get the fixed field length remaining. It will be divided up into
14000
       * Anti-Clogging token, Scalar, FFE and some IEs.
14001
       */
14002
5
      len = find_fixed_field_len(tvb, offset);
14003
5
      sc_len = get_scalar_len(group);
14004
5
      elt_len = get_group_element_len(group);
14005
14006
      /*
14007
       * The first conditional captures the case where we have an error and
14008
       * an anti-clogging token with Scalar Field and FFE.
14009
       * The second handles the case where we have an error with only an
14010
       * anti-clogging token.
14011
       * The third conditional below is a way to avoid keeping state about
14012
       * what was in a previous response!
14013
       */
14014
5
      if (((status_code == 76 || status_code == 126) &&
14015
5
           ((len > (sc_len + elt_len)))) ||
14016
5
           ((status_code == 76) && (len > 0) && (len < (sc_len + elt_len))) ||
14017
5
          ((status_code == 0) && (len > (sc_len + elt_len)))) {
14018
5
        unsigned anti_clogging_len;
14019
        /*
14020
         * Handle the anti-clogging field. There is an anti-clogging token
14021
         * before the other two.
14022
         */
14023
5
        if (len > (sc_len + elt_len))
14024
5
          anti_clogging_len = len - (sc_len + elt_len);
14025
0
        else
14026
0
          anti_clogging_len = len;
14027
14028
5
        proto_tree_add_item(tree, hf_ieee80211_ff_sae_anti_clogging_token, tvb,
14029
5
                            offset, anti_clogging_len, ENC_NA);
14030
5
        offset += anti_clogging_len;
14031
5
      }
14032
14033
5
      if (sc_len == 0) {
14034
        /* assume no anti-clogging token */
14035
5
        if (!(len % 3))
14036
2
        {
14037
2
          sc_len = len / 3;
14038
2
        }
14039
3
        else
14040
3
        {
14041
3
          sc_len = len / 2;
14042
3
        }
14043
5
        elt_len = len - sc_len;
14044
5
      }
14045
14046
      /* Only present if status = 0 or 126 */
14047
5
      if (status_code == 0 || status_code == 126) {
14048
5
        proto_tree_add_item(tree, hf_ieee80211_ff_scalar, tvb, offset,
14049
5
                            sc_len, ENC_NA);
14050
5
        offset += sc_len;
14051
14052
5
        proto_tree_add_item(tree, hf_ieee80211_ff_finite_field_element, tvb,
14053
5
                            offset, elt_len, ENC_NA);
14054
5
        offset += elt_len;
14055
14056
        /* Create conversation when AP accept SAE commit */
14057
5
        if (is_ap) {
14058
0
          conversation_t *conversation;
14059
0
          ieee80211_conversation_data_t *conversation_data;
14060
0
          if (!pinfo->fd->visited) {
14061
0
            association_counter++;
14062
0
            p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, ASSOC_COUNTER_KEY,
14063
0
                GUINT_TO_POINTER(association_counter));
14064
0
            assoc_counter_in_auth = 1;
14065
0
          }
14066
0
          conversation = find_or_create_wlan_conversation(pinfo);
14067
0
          conversation_data = get_or_create_conversation_data(conversation);
14068
0
          conversation_data->sae_group = group;
14069
0
        }
14070
5
      }
14071
5
    }
14072
5
  }
14073
2
  else if ((seq == 2) && (status_code == 0))
14074
0
  {
14075
0
    proto_tree_add_item(tree, hf_ieee80211_ff_send_confirm, tvb, 6, 2,
14076
0
                        ENC_LITTLE_ENDIAN);
14077
0
    offset += 2;
14078
14079
    /* Check if there are additional elements */
14080
0
    len = find_fixed_field_len(tvb, offset);
14081
0
    proto_tree_add_item(tree, hf_ieee80211_ff_confirm, tvb, offset, len,
14082
0
                        ENC_NA);
14083
0
    offset += len;
14084
0
  }
14085
14086
7
  return offset;
14087
7
}
14088
14089
static unsigned
14090
add_ff_auth_fils(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
14091
                 unsigned offset)
14092
2
{
14093
2
  unsigned alg, seq, status_code;
14094
2
  alg = tvb_get_letohs(tvb, 0);
14095
14096
2
  if ((alg != AUTH_ALG_FILS_SK_WITH_PFS) && (alg != AUTH_ALG_FILS_PK))
14097
0
    return offset;
14098
14099
2
  seq = tvb_get_letohs(tvb, 2);
14100
2
  status_code = tvb_get_letohs(tvb, 4);
14101
14102
2
  if ((seq == 1) || (seq == 2 && status_code == 0)) {
14103
0
    unsigned group = tvb_get_letohs(tvb, 6);
14104
0
    unsigned elt_len;
14105
0
    proto_tree_add_item(tree, hf_ieee80211_ff_finite_cyclic_group, tvb, 6, 2,
14106
0
                        ENC_LITTLE_ENDIAN);
14107
0
    offset = 8;
14108
0
    elt_len = get_group_element_len(group);
14109
14110
0
    proto_tree_add_item(tree, hf_ieee80211_ff_finite_field_element, tvb, offset,
14111
0
                        elt_len, ENC_NA);
14112
14113
0
    offset += elt_len;
14114
0
  }
14115
14116
  /* What about the other FILS case? */
14117
14118
2
  return offset;
14119
2
}
14120
14121
/*
14122
 * We handle different elements depending on whether the sequence number is
14123
 * 1, 2 or 3.
14124
 */
14125
typedef struct ieee80211_pasn_data {
14126
  unsigned pasn_seq;
14127
  unsigned pasn_status_code;
14128
} ieee80211_pasn_data_t;
14129
14130
static ieee80211_pasn_data_t*
14131
create_pasn_data(packet_info *pinfo, unsigned seq, unsigned status)
14132
0
{
14133
0
  ieee80211_pasn_data_t *pasn_data = NULL;
14134
14135
0
  pasn_data = wmem_new(pinfo->pool, ieee80211_pasn_data_t);
14136
14137
0
  if(pasn_data) {
14138
0
    p_add_proto_data(pinfo->pool, pinfo, proto_wlan, PASN_DATA_KEY, pasn_data);
14139
0
    pasn_data->pasn_seq = seq;
14140
0
    pasn_data->pasn_status_code = status;
14141
0
  }
14142
14143
0
  return pasn_data;
14144
0
}
14145
14146
static unsigned
14147
add_ff_auth_pasn(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
14148
                 unsigned offset)
14149
0
{
14150
0
  unsigned seq, status_code;
14151
0
  ieee80211_pasn_data_t *pasn_data = NULL;
14152
14153
0
  seq = tvb_get_letohs(tvb, 2);
14154
0
  status_code = tvb_get_letohs(tvb, 4);
14155
14156
0
  pasn_data = create_pasn_data(pinfo, seq, status_code);
14157
0
  if (!pasn_data) {
14158
    /* Leave it undissected if we cannot get memory. */
14159
0
    return offset + tvb_captured_length_remaining(tvb, offset);
14160
0
  }
14161
14162
0
  if (seq == 1) {
14163
    /*
14164
     * Contains RSN Info,
14165
     * PASN field,
14166
     * Wrapped Data may be present if the PASN element says so,
14167
     * RSNXE may be present
14168
     * Timeout Interval element may be present
14169
     * Fragment element may be present if it was fragmented.
14170
     */
14171
0
    while (tvb_captured_length_remaining(tvb, offset)) {
14172
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
14173
0
    }
14174
0
  } else if (seq == 2) {
14175
    /* This test might not be needed */
14176
0
    if (status_code != 0) {
14177
0
      offset += tvb_captured_length_remaining(tvb, offset);
14178
0
      return offset;
14179
0
    }
14180
    /*
14181
     * RSN element is present.
14182
     * PASN element is present if status == 0.
14183
     * Wrapped Data element present if the PASN element says so.
14184
     * ...
14185
     */
14186
0
    while (tvb_captured_length_remaining(tvb, offset)) {
14187
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
14188
0
    }
14189
0
  } else if (seq == 3) {
14190
    /*
14191
     * Contains PASN element if status == 0
14192
     * Contains Wrapped Data element if PASN element says so and status is 0.
14193
     * Contains MC element
14194
     * May contain fragment elements.
14195
     */
14196
0
    while (tvb_captured_length_remaining(tvb, offset)) {
14197
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
14198
0
    }
14199
0
  }
14200
14201
0
  offset += tvb_captured_length_remaining(tvb, offset);
14202
14203
0
  return offset;
14204
0
}
14205
14206
/*
14207
 * Handle an Auth Frame. We need to be able to call this from several places.
14208
 *
14209
 * We should also handle the different auth types more correctly.
14210
 */
14211
static int
14212
dissect_auth_frame(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb)
14213
44
{
14214
44
  int offset = 0;
14215
44
  uint16_t auth_algorithm = tvb_get_letohs(tvb, offset);
14216
14217
44
  add_ff_auth_alg(tree, tvb, pinfo, offset);
14218
44
  offset += 2;
14219
14220
44
  add_ff_auth_trans_seq(tree, tvb, pinfo, offset);
14221
44
  offset += 2;
14222
14223
44
  add_ff_status_code(tree, tvb, pinfo, offset);
14224
44
  offset += 2;
14225
14226
44
  switch (auth_algorithm) {
14227
7
  case AUTH_ALG_SAE:
14228
7
    offset = add_ff_auth_sae(tree, tvb, pinfo, offset);
14229
7
    break;
14230
1
  case AUTH_ALG_FILS_PK:
14231
2
  case  AUTH_ALG_FILS_SK_WITH_PFS:
14232
2
    offset = add_ff_auth_fils(tree, tvb, pinfo, offset);
14233
2
    break;
14234
0
  case AUTH_ALG_PASN:
14235
0
    offset = add_ff_auth_pasn(tree, tvb, pinfo, offset);
14236
0
    break;
14237
44
  }
14238
14239
39
  return offset;
14240
44
}
14241
14242
/*
14243
 * If it is PASN wrapped data, handle it correctly, else defer to fils
14244
 * wrapped data.
14245
 */
14246
static void
14247
dissect_wrapped_data(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
14248
                     int offset, uint8_t ext_tag_len _U_)
14249
18
{
14250
18
  ieee80211_pasn_data_t *pasn_data =
14251
18
    (ieee80211_pasn_data_t*)p_get_proto_data(pinfo->pool, pinfo, proto_wlan,
14252
18
                                             PASN_DATA_KEY);
14253
14254
18
  if (pasn_data) {
14255
0
    proto_tree *auth_tree = NULL;
14256
0
    proto_item *ai = NULL;
14257
0
    uint16_t frame_len = 0;
14258
0
    tvbuff_t *new_tvb = NULL;
14259
14260
0
    switch (pasn_data->pasn_seq) {
14261
0
    case 1:
14262
0
      auth_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
14263
0
                                         ett_pasn_auth_frame, &ai,
14264
0
                                         "Authentication Frame");
14265
0
      new_tvb = tvb_new_subset_remaining(tvb, offset);
14266
0
      offset = dissect_auth_frame(auth_tree, pinfo, new_tvb);
14267
0
      proto_item_set_len(ai, offset); /* This is correct */
14268
0
      break;
14269
14270
0
    case 2:
14271
      /* This has two auth frames in it. */
14272
0
      frame_len = tvb_get_letohs(tvb, offset);
14273
0
      proto_tree_add_item(tree, hf_ieee80211_pasn_auth1_frame_len, tvb, offset,
14274
0
                          2, ENC_LITTLE_ENDIAN);
14275
0
      offset += 2;
14276
0
      auth_tree = proto_tree_add_subtree(tree, tvb, offset, frame_len,
14277
0
                                         ett_pasn_auth_frame, NULL,
14278
0
                                         "Authentication Frame 1");
14279
0
      new_tvb = tvb_new_subset_length(tvb, offset, frame_len);
14280
0
      offset += dissect_auth_frame(auth_tree, pinfo, new_tvb);
14281
14282
      /* Second frame */
14283
0
      frame_len = tvb_get_letohs(tvb, offset);
14284
0
      proto_tree_add_item(tree, hf_ieee80211_pasn_auth2_frame_len, tvb, offset,
14285
0
                          2, ENC_LITTLE_ENDIAN);
14286
0
      offset += 2;
14287
0
      auth_tree = proto_tree_add_subtree(tree, tvb, offset, frame_len,
14288
0
                                         ett_pasn_auth_frame, NULL,
14289
0
                                         "Authentication Frame 2");
14290
0
      new_tvb = tvb_new_subset_length(tvb, offset, frame_len);
14291
0
      dissect_auth_frame(auth_tree, pinfo, new_tvb);
14292
0
      break;
14293
14294
0
    case 3:
14295
0
      auth_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
14296
0
                                         ett_pasn_auth_frame, &ai,
14297
0
                                         "Authentication Frame");
14298
0
      new_tvb = tvb_new_subset_remaining(tvb, offset);
14299
0
      offset = dissect_auth_frame(auth_tree, pinfo, new_tvb);
14300
0
      proto_item_set_len(ai, offset);
14301
0
      break;
14302
0
    }
14303
0
  }
14304
18
}
14305
14306
50
#define FILS_REQ_PARAMS_FILS_CRITERIA           0x01
14307
50
#define FILS_REQ_PARAMS_MAX_DELAY_LIMIT         0x02
14308
50
#define FILS_REQ_PARAMS_MINIMUM_DATA_RATE       0x04
14309
50
#define FILS_REQ_PARAMS_RCPI_LIMIT              0x08
14310
50
#define FILS_REQ_PARAMS_OUI_RESPONSE_CRITERIA   0x10
14311
14
#define FILS_REQ_PARAMS_RESERVED                0xE0
14312
14313
14
#define FILS_REQ_PARAMS_FILS_CRITERIA_BSS_DELAY   0x07
14314
14
#define FILS_REQ_PARAMS_FILS_CRITERIA_PHY_SUPPORT 0x38
14315
14
#define FILS_REQ_PARAMS_FILS_CRITERIA_RESERVED    0xC0
14316
14317
static void
14318
dissect_fils_req_params(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb,
14319
                     int offset, uint8_t ext_tag_len _U_)
14320
36
{
14321
36
  uint8_t bitmap;
14322
14323
36
  static int * const ieee80211_fils_req_params_paramter_control_bitmap[] = {
14324
36
    &hf_ieee80211_fils_req_params_fils_criteria_present,
14325
36
    &hf_ieee80211_fils_req_params_max_delay_limit_present,
14326
36
    &hf_ieee80211_fils_req_params_minimum_data_rate_present,
14327
36
    &hf_ieee80211_fils_req_params_rcpi_limit_present,
14328
36
    &hf_ieee80211_fils_req_params_oui_response_criteria_present,
14329
36
    &hf_ieee80211_fils_req_params_reserved,
14330
36
    NULL
14331
36
  };
14332
14333
36
  static int * const ieee80211_fils_req_params_fils_criteria[] = {
14334
36
    &hf_ieee80211_fils_req_params_fils_criteria_bss_delay,
14335
36
    &hf_ieee80211_fils_req_params_fils_criteria_phy_support,
14336
36
    &hf_ieee80211_fils_req_params_fils_criteria_reserved,
14337
36
    NULL
14338
36
  };
14339
14340
36
  bitmap = tvb_get_uint8(tvb, offset);
14341
36
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_fils_req_params_parameter_control_bitmap,
14342
36
                         ett_ff_fils_req_params, ieee80211_fils_req_params_paramter_control_bitmap, ENC_LITTLE_ENDIAN);
14343
36
  offset += 1;
14344
14345
36
  proto_tree_add_item(tree, hf_ieee80211_fils_req_params_max_channel_time,
14346
36
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
14347
36
  offset +=1;
14348
14349
36
  if(bitmap & FILS_REQ_PARAMS_FILS_CRITERIA) {
14350
14
    proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_fils_req_params_fils_criteria,
14351
14
                         ett_ff_fils_req_params_fils_criteria, ieee80211_fils_req_params_fils_criteria, ENC_LITTLE_ENDIAN);
14352
14
    offset += 1;
14353
14
  }
14354
14355
36
  if(bitmap & FILS_REQ_PARAMS_MAX_DELAY_LIMIT) {
14356
25
    proto_tree_add_item(tree, hf_ieee80211_fils_req_params_max_delay_limit,
14357
25
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
14358
25
    offset += 1;
14359
25
  }
14360
14361
36
  if(bitmap & FILS_REQ_PARAMS_MINIMUM_DATA_RATE) {
14362
16
    proto_tree_add_item(tree, hf_ieee80211_fils_req_params_minimum_data_rate,
14363
16
                        tvb, offset, 3, ENC_LITTLE_ENDIAN);
14364
16
    offset += 3;
14365
16
  }
14366
14367
36
  if(bitmap & FILS_REQ_PARAMS_RCPI_LIMIT) {
14368
10
    proto_tree_add_item(tree, hf_ieee80211_fils_req_params_rcpi_limit,
14369
10
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
14370
10
    offset += 1;
14371
10
  }
14372
14373
36
  if(bitmap & FILS_REQ_PARAMS_OUI_RESPONSE_CRITERIA) {
14374
13
    proto_tree_add_item(tree, hf_ieee80211_fils_req_params_oui_response_criteria,
14375
13
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
14376
    //offset += 2;
14377
13
  }
14378
14379
36
}
14380
14381
static unsigned
14382
wnm_bss_trans_mgmt_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14383
0
{
14384
0
  int    start = offset;
14385
0
  int    left;
14386
0
  int tmp_sublen;
14387
0
  const uint8_t ids[] = { TAG_NEIGHBOR_REPORT };
14388
14389
14390
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14391
14392
0
  proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_query_reason, tvb, offset, 1,
14393
0
                      ENC_NA);
14394
0
  offset += 1;
14395
14396
0
  left = tvb_reported_length_remaining(tvb, offset);
14397
0
  if (left > 0) {
14398
0
    proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
14399
0
                        tvb, offset, left, ENC_NA);
14400
14401
0
    while (left > 0){
14402
0
      tmp_sublen = tvb_get_uint8(tvb, offset + 1);
14403
0
      if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
14404
0
        break;
14405
0
      }
14406
0
      left -= (tmp_sublen + 2);
14407
0
      offset += (tmp_sublen + 2);
14408
0
    }
14409
0
  }
14410
14411
0
  return offset - start;
14412
0
}
14413
14414
14415
static unsigned
14416
wnm_bss_trans_mgmt_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14417
0
{
14418
0
  int    start = offset;
14419
0
  uint8_t mode;
14420
0
  int    left = tvb_reported_length_remaining(tvb, offset);
14421
0
  int tmp_sublen;
14422
0
  const uint8_t ids[] = { TAG_NEIGHBOR_REPORT, TAG_VENDOR_SPECIFIC_IE};
14423
14424
0
  static int * const ieee80211_ff_request_flags[] = {
14425
0
    &hf_ieee80211_ff_request_mode_pref_cand,
14426
0
    &hf_ieee80211_ff_request_mode_abridged,
14427
0
    &hf_ieee80211_ff_request_mode_disassoc_imminent,
14428
0
    &hf_ieee80211_ff_request_mode_bss_term_included,
14429
0
    &hf_ieee80211_ff_request_mode_ess_disassoc_imminent,
14430
0
    &hf_ieee80211_ff_request_mode_link_removal_imminent,
14431
0
    &hf_ieee80211_ff_request_mode_reserved,
14432
0
    NULL
14433
0
  };
14434
14435
0
  if (left < 5) {
14436
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
14437
0
    return offset - start;
14438
0
  }
14439
14440
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14441
14442
0
  mode = tvb_get_uint8(tvb, offset);
14443
0
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_ff_request_flags, ENC_LITTLE_ENDIAN);
14444
0
  offset += 1;
14445
14446
0
  proto_tree_add_item(tree, hf_ieee80211_ff_disassoc_timer, tvb, offset, 2,
14447
0
                      ENC_LITTLE_ENDIAN);
14448
0
  offset += 2;
14449
14450
0
  proto_tree_add_item(tree, hf_ieee80211_ff_validity_interval, tvb, offset, 1,
14451
0
                      ENC_LITTLE_ENDIAN);
14452
0
  offset += 1;
14453
0
  left -= 5;
14454
14455
0
  if (mode & 0x08) {
14456
0
    proto_item *item;
14457
0
    proto_tree  *sub_tree;
14458
0
    uint8_t sub_id, sub_len;
14459
14460
    // BSS termination Duration sub element is the same as the neighbor report sub element
14461
0
    if (left < 12) {
14462
0
      expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
14463
0
      return offset - start;
14464
0
    }
14465
14466
0
    sub_tree = proto_tree_add_subtree(tree, tvb, offset, 12, ett_tag_neighbor_report_subelement_tree,
14467
0
                                      NULL, "BSS Termination Duration");
14468
14469
0
    sub_id = tvb_get_uint8(tvb, offset);
14470
0
    item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_neighbor_report_subelement_id,
14471
0
                               tvb, offset, 1, ENC_NA);
14472
0
    offset += 1;
14473
0
    if (sub_id != NR_SUB_ID_BSS_TER_DUR) {
14474
0
      expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
14475
0
                             "Incorrect BSS Termination Duration subelement ID");
14476
0
    }
14477
14478
0
    sub_len = tvb_get_uint8(tvb, offset);
14479
0
    item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_neighbor_report_subelement_length,
14480
0
                               tvb, offset, 1, ENC_NA);
14481
0
    offset += 1;
14482
0
    if (sub_len != 10) {
14483
0
       expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
14484
0
                              "Incorrect BSS Termination Duration subelement length");
14485
0
    }
14486
14487
0
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf,
14488
0
                        tvb, offset, 8, ENC_LITTLE_ENDIAN);
14489
0
    offset += 8;
14490
0
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_neighbor_report_subelement_bss_dur,
14491
0
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
14492
0
    offset += 2;
14493
0
    left -= 12;
14494
0
  }
14495
14496
0
  if (mode & 0x10) {
14497
0
    uint8_t url_len;
14498
14499
0
    url_len = tvb_get_uint8(tvb, offset);
14500
0
    if (left < url_len) {
14501
0
      expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
14502
0
      return offset - start;
14503
0
    }
14504
14505
0
    proto_tree_add_item(tree, hf_ieee80211_ff_url_len, tvb, offset, 1,
14506
0
                        ENC_LITTLE_ENDIAN);
14507
0
    offset += 1;
14508
0
    proto_tree_add_item(tree, hf_ieee80211_ff_url, tvb, offset, url_len,
14509
0
                        ENC_ASCII);
14510
0
    offset += url_len;
14511
0
    left -= url_len + 1;
14512
0
  }
14513
14514
0
  if (left > 0) {
14515
0
    proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
14516
0
                        tvb, offset, left, ENC_NA);
14517
14518
0
    while (left > 0){
14519
0
      tmp_sublen = tvb_get_uint8(tvb, offset + 1);
14520
0
      if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
14521
0
        break;
14522
0
      }
14523
0
      left -= (tmp_sublen + 2);
14524
0
      offset += (tmp_sublen + 2);
14525
0
    }
14526
0
  }
14527
14528
0
  return offset - start;
14529
0
}
14530
14531
14532
static unsigned
14533
wnm_bss_trans_mgmt_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14534
0
{
14535
0
  int    start = offset;
14536
0
  uint8_t code;
14537
0
  int    left;
14538
0
  int tmp_sublen;
14539
0
  const uint8_t ids[] = { TAG_NEIGHBOR_REPORT, TAG_VENDOR_SPECIFIC_IE };
14540
14541
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14542
0
  code = tvb_get_uint8(tvb, offset);
14543
0
  offset += add_ff_bss_transition_status_code(tree, tvb, pinfo, offset);
14544
0
  offset += add_ff_bss_termination_delay(tree, tvb, pinfo, offset);
14545
0
  if (!code) {
14546
0
    proto_tree_add_item(tree, hf_ieee80211_ff_target_bss,
14547
0
                        tvb, offset, 6, ENC_NA);
14548
0
    offset += 6;
14549
0
  }
14550
0
  left = tvb_reported_length_remaining(tvb, offset);
14551
0
  if (left > 0) {
14552
0
    proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
14553
0
                        tvb, offset, left, ENC_NA);
14554
0
    while (left > 0){
14555
0
      tmp_sublen = tvb_get_uint8(tvb, offset + 1);
14556
0
      if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
14557
0
        break;
14558
0
      }
14559
0
      left -= (tmp_sublen + 2);
14560
0
      offset += (tmp_sublen + 2);
14561
0
    }
14562
0
  }
14563
14564
0
  return offset - start;
14565
0
}
14566
14567
static unsigned
14568
wnm_sleep_mode_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14569
0
{
14570
0
  int start = offset;
14571
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14572
0
  return offset - start;
14573
0
}
14574
14575
static unsigned
14576
wnm_sleep_mode_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14577
1
{
14578
1
  int start = offset;
14579
1
  uint16_t key_data_len;
14580
1
  int left;
14581
14582
1
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14583
1
  key_data_len = tvb_get_letohs(tvb, offset);
14584
1
  offset += add_ff_key_data_length(tree, tvb, pinfo, offset);
14585
1
  left = tvb_reported_length_remaining(tvb, offset);
14586
1
  if (left < key_data_len) {
14587
1
    expert_add_info(pinfo, tree, &ei_ieee80211_tag_wnm_sleep_mode_no_key_data);
14588
1
    return offset - start;
14589
1
  }
14590
0
  proto_tree_add_item(tree, hf_ieee80211_ff_key_data, tvb, offset,
14591
0
                      key_data_len, ENC_NA);
14592
0
  offset += key_data_len;
14593
0
  return offset - start;
14594
1
}
14595
14596
static unsigned
14597
wnm_tfs_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14598
0
{
14599
0
  int start = offset;
14600
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14601
0
  return offset - start;
14602
0
}
14603
14604
static unsigned
14605
wnm_tfs_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14606
0
{
14607
0
  int start = offset;
14608
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14609
0
  return offset - start;
14610
0
}
14611
14612
12
#define AP_DESCRIPTOR            0
14613
5
#define FIRMWARE_VERSION_CURRENT 1
14614
0
#define FIRMWARE_VERSION_NEW     2
14615
14616
static unsigned
14617
dissect_wnm_subelements(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
14618
28
  int offset) {
14619
28
  unsigned sub_elt_id = tvb_get_uint8(tvb, offset);
14620
28
  unsigned sub_elt_len = tvb_get_uint8(tvb, offset + 1);
14621
14622
28
  proto_tree_add_item(tree, hf_ieee80211_wnm_sub_elt_id, tvb, offset, 1, ENC_NA);
14623
28
  offset++;
14624
14625
28
  proto_tree_add_item(tree, hf_ieee80211_wnm_sub_elt_len, tvb, offset, 1, ENC_NA);
14626
28
  offset++;
14627
14628
28
  switch (sub_elt_id) {
14629
12
  case AP_DESCRIPTOR:
14630
14631
12
    break;
14632
14633
5
  case FIRMWARE_VERSION_CURRENT:
14634
14635
5
    break;
14636
14637
0
  case FIRMWARE_VERSION_NEW:
14638
14639
0
    break;
14640
28
  }
14641
14642
28
  offset += sub_elt_len;
14643
28
  return offset;
14644
28
}
14645
14646
static unsigned
14647
wnm_channel_usage_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14648
0
{
14649
0
  int start = offset;
14650
14651
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14652
14653
0
  return offset - start;
14654
0
}
14655
14656
static unsigned
14657
wnm_channel_usage_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14658
0
{
14659
0
  int start = offset, i;
14660
0
  uint8_t id, len;
14661
0
  proto_tree *subtree;
14662
14663
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14664
14665
  /* Parse multiple chan usage elements */
14666
0
  id = tvb_get_uint8(tvb, offset);
14667
0
  while (id == TAG_CHANNEL_USAGE){
14668
0
    len = tvb_get_uint8(tvb, offset + 1);
14669
0
    subtree = proto_tree_add_subtree(tree, tvb, offset, len + 2,
14670
0
                                     ett_chan_usage,
14671
0
                                     NULL, "Channel Usage");
14672
0
    proto_tree_add_item(subtree, hf_ieee80211_tag_number, tvb, offset, 1, ENC_NA);
14673
0
    offset += 1;
14674
0
    proto_tree_add_item(subtree, hf_ieee80211_tag_length, tvb, offset, 1, ENC_NA);
14675
0
    offset += 1;
14676
0
    proto_tree_add_item(subtree, hf_ieee80211_tag_channel_usage_mode, tvb, offset, 1, ENC_NA);
14677
0
    offset += 1;
14678
0
    len -= 1;
14679
14680
0
    for (i = 0; i < (len / 2); i++) {
14681
0
      offset += add_ff_operating_class(subtree, tvb, pinfo, offset);
14682
0
      offset += add_ff_channel(subtree, tvb, pinfo, offset);
14683
0
    }
14684
0
    id = tvb_get_uint8(tvb, offset);
14685
0
  }
14686
0
  offset += add_ff_country_str(tree, tvb, pinfo, offset);
14687
14688
0
  return offset - start;
14689
0
}
14690
14691
static unsigned
14692
wnm_notification_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14693
5
{
14694
5
  int start = offset;
14695
5
  int len = 0;
14696
5
  uint8_t wnm_type = 0;
14697
5
  uint8_t wnm_sub_elt = 0;
14698
14699
5
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14700
5
  wnm_type = tvb_get_uint8(tvb, offset);
14701
5
  offset += add_ff_wnm_notification_type(tree, tvb, pinfo, offset);
14702
5
  len = tvb_reported_length_remaining(tvb, offset);
14703
14704
5
  if (wnm_type == 0) {
14705
4
    int offset_end = offset + len;
14706
32
    while (offset < offset_end) {
14707
28
      int start_offset = offset;
14708
28
      proto_tree *wnm_list = NULL;
14709
28
      proto_item *wnm_item = NULL;
14710
28
      wnm_list = proto_tree_add_subtree_format(tree, tvb, offset, -1,
14711
28
                        ett_wnm_notif_subelt,
14712
28
                        &wnm_item, "WNM Subelement %d", wnm_sub_elt);
14713
28
      offset = dissect_wnm_subelements(wnm_list, tvb, pinfo, offset);
14714
28
      proto_item_set_len(wnm_item, offset - start_offset);
14715
28
    }
14716
4
  }
14717
5
  return offset - start;
14718
5
}
14719
14720
static unsigned
14721
wnm_notification_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14722
0
{
14723
0
  int start = offset;
14724
14725
0
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14726
0
  proto_tree_add_item(tree, hf_ieee80211_ff_wnm_notification_response_status,
14727
0
                      tvb, offset, 1, ENC_NA);
14728
0
  offset += 1;
14729
14730
0
  return offset - start;
14731
0
}
14732
14733
static unsigned
14734
add_ff_action_wnm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14735
10
{
14736
10
  uint8_t code;
14737
10
  unsigned  start = offset;
14738
14739
10
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
14740
10
  code    = tvb_get_uint8(tvb, offset);
14741
10
  offset += add_ff_wnm_action_code(tree, tvb, pinfo, offset);
14742
10
  switch (code) {
14743
1
  case WNM_EVENT_REQ:
14744
1
  case WNM_EVENT_REPORT:
14745
1
  case WNM_DIAGNOSTIC_REQ:
14746
2
  case WNM_DIAGNOSTIC_REPORT:
14747
2
  case WNM_LOCATION_CFG_REQ:
14748
2
  case WNM_LOCATION_CFG_RESP:
14749
2
  case WNM_FMS_REQ:
14750
2
  case WNM_FMS_RESP:
14751
2
  case WNM_DMS_REQ:
14752
2
  case WNM_DMS_RESP:
14753
2
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14754
2
    break;
14755
0
  case WNM_BSS_TRANS_MGMT_QUERY:
14756
0
    offset += wnm_bss_trans_mgmt_query(tree, tvb, pinfo, offset);
14757
0
    break;
14758
0
  case WNM_BSS_TRANS_MGMT_REQ:
14759
0
    offset += wnm_bss_trans_mgmt_req(tree, tvb, pinfo, offset);
14760
0
    break;
14761
0
  case WNM_BSS_TRANS_MGMT_RESP:
14762
0
    offset += wnm_bss_trans_mgmt_resp(tree, tvb, pinfo, offset);
14763
0
    break;
14764
0
  case WNM_TFS_REQ:
14765
0
    offset += wnm_tfs_req(tree, tvb, pinfo, offset);
14766
0
    break;
14767
0
  case WNM_TFS_RESP:
14768
0
    offset += wnm_tfs_resp(tree, tvb, pinfo, offset);
14769
0
    break;
14770
0
  case WNM_SLEEP_MODE_REQ:
14771
0
    offset += wnm_sleep_mode_req(tree, tvb, pinfo, offset);
14772
0
    break;
14773
1
  case WNM_SLEEP_MODE_RESP:
14774
1
    offset += wnm_sleep_mode_resp(tree, tvb, pinfo, offset);
14775
1
    break;
14776
0
  case WNM_CHANNEL_USAGE_REQ:
14777
0
    offset += wnm_channel_usage_req(tree, tvb, pinfo, offset);
14778
0
    break;
14779
0
  case WNM_CHANNEL_USAGE_RESP:
14780
0
    offset += wnm_channel_usage_resp(tree, tvb, pinfo, offset);
14781
0
    break;
14782
5
  case WNM_NOTIFICATION_REQ:
14783
5
    offset += wnm_notification_req(tree, tvb, pinfo, offset);
14784
5
    break;
14785
0
  case WNM_NOTIFICATION_RESP:
14786
0
    offset += wnm_notification_resp(tree, tvb, pinfo, offset);
14787
0
    break;
14788
10
  }
14789
14790
10
  return offset - start;  /* Size of fixed fields */
14791
10
}
14792
14793
static unsigned
14794
add_ff_action_unprotected_wnm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14795
5
{
14796
5
  uint8_t code;
14797
5
  unsigned  start = offset;
14798
14799
5
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
14800
5
  code    = tvb_get_uint8(tvb, offset);
14801
5
  offset += add_ff_unprotected_wnm_action_code(tree, tvb, pinfo, offset);
14802
14803
5
  switch (code) {
14804
3
  case UNPROTECTED_WNM_TIM:
14805
3
    offset += add_ff_check_beacon(tree, tvb, pinfo, offset);
14806
3
    offset += add_ff_timestamp(tree, tvb, pinfo, offset);
14807
3
    offset += add_ff_tod(tree, tvb, pinfo, offset);
14808
3
    offset += add_ff_toa(tree, tvb, pinfo, offset);
14809
3
    offset += add_ff_max_tod_err(tree, tvb, pinfo, offset);
14810
3
    offset += add_ff_max_toa_err(tree, tvb, pinfo, offset);
14811
3
    break;
14812
0
  case UNPROTECTED_WNM_TIMING_MEASUREMENT:
14813
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14814
0
    offset += add_ff_followup_dialog_token(tree, tvb, pinfo, offset);
14815
0
    break;
14816
5
  }
14817
14818
5
  return offset - start;  /* Size of fixed fields */
14819
5
}
14820
14821
static unsigned
14822
add_ff_action_tdls(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14823
51
{
14824
51
  uint8_t code;
14825
51
  uint16_t status;
14826
51
  unsigned   start = offset;
14827
14828
51
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
14829
51
  code = tvb_get_uint8(tvb, offset);
14830
14831
  /* Extract keys for dot11decrypt engine */
14832
51
  try_scan_tdls_keys(tvb, pinfo, offset);
14833
14834
51
  offset += add_ff_tdls_action_code(tree, tvb, pinfo, offset);
14835
51
  switch (code) {
14836
1
  case TDLS_SETUP_REQUEST:
14837
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14838
1
    offset += add_ff_cap_info(tree, tvb, pinfo, offset);
14839
1
    break;
14840
40
  case TDLS_SETUP_RESPONSE:
14841
40
    status = tvb_get_letohs(tvb, offset);
14842
40
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
14843
40
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14844
40
    if (tvb_reported_length_remaining(tvb, offset) < 2) {
14845
0
      if (status == 0) {
14846
0
        expert_add_info(pinfo, tree, &ei_ieee80211_tdls_setup_response_malformed);
14847
0
      }
14848
0
      break;
14849
0
    }
14850
40
    offset += add_ff_cap_info(tree, tvb, pinfo, offset);
14851
40
    break;
14852
2
  case TDLS_SETUP_CONFIRM:
14853
2
    status = tvb_get_letohs(tvb, offset);
14854
2
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
14855
2
    if (tvb_reported_length_remaining(tvb, offset) < 1) {
14856
0
      if (status == 0) {
14857
0
        expert_add_info(pinfo, tree, &ei_ieee80211_tdls_setup_confirm_malformed);
14858
0
      }
14859
0
      break;
14860
0
    }
14861
2
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14862
2
    break;
14863
1
  case TDLS_TEARDOWN:
14864
1
    offset += add_ff_reason_code(tree, tvb, pinfo, offset);
14865
1
    break;
14866
1
  case TDLS_PEER_TRAFFIC_INDICATION:
14867
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14868
1
    break;
14869
0
  case TDLS_CHANNEL_SWITCH_REQUEST:
14870
0
    offset += add_ff_target_channel(tree, tvb, pinfo, offset);
14871
0
    offset += add_ff_operating_class(tree, tvb, pinfo, offset);
14872
0
    break;
14873
1
  case TDLS_CHANNEL_SWITCH_RESPONSE:
14874
1
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
14875
1
    break;
14876
0
  case TDLS_PEER_PSM_REQUEST:
14877
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14878
0
    break;
14879
1
  case TDLS_PEER_PSM_RESPONSE:
14880
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14881
1
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
14882
1
    break;
14883
0
  case TDLS_PEER_TRAFFIC_RESPONSE:
14884
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14885
0
    break;
14886
0
  case TDLS_DISCOVERY_REQUEST:
14887
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14888
0
    break;
14889
51
  }
14890
14891
51
  return offset - start;  /* Size of fixed fields */
14892
51
}
14893
14894
static unsigned
14895
add_ff_action_mgmt_notification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14896
3
{
14897
3
  unsigned start = offset;
14898
14899
3
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
14900
3
  offset += add_ff_wme_action_code(tree, tvb, pinfo, offset);
14901
3
  offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
14902
3
  offset += add_ff_wme_status_code(tree, tvb, pinfo, offset);
14903
14904
3
  return offset - start;  /* Size of fixed fields */
14905
3
}
14906
14907
static unsigned
14908
add_ff_action_vendor_specific(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14909
3
{
14910
3
  unsigned   start = offset;
14911
3
  uint32_t oui;
14912
3
  tvbuff_t *vendor_tvb;
14913
3
  int dissected;
14914
14915
3
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
14916
3
  proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
14917
3
  offset += 3;
14918
14919
3
  vendor_tvb = tvb_new_subset_remaining(tvb, offset);
14920
3
  dissected = dissector_try_uint_with_data(vendor_specific_action_table, oui, vendor_tvb, pinfo, tree, false, NULL);
14921
3
  if (dissected <= 0)
14922
3
  {
14923
3
      call_data_dissector(vendor_tvb, pinfo, tree);
14924
      /* Skip the whole TVB because we don't know its format */
14925
3
      dissected = tvb_reported_length_remaining(vendor_tvb, 0);
14926
3
  }
14927
14928
3
  offset += dissected;
14929
14930
3
  return offset - start;  /* Size of fixed fields */
14931
3
}
14932
14933
static unsigned
14934
add_ff_action_ht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
14935
36
{
14936
36
  unsigned  start = offset;
14937
36
  uint8_t n_sta, i;
14938
36
  mimo_control_t mimo_cntrl;
14939
14940
36
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
14941
36
  offset += add_ff_ht_action_code(tree, tvb, pinfo, offset);
14942
14943
36
  switch (tvb_get_uint8(tvb, offset - 1)) {
14944
2
  case HT_ACTION_NOTIFY_CHAN_WIDTH:
14945
2
    offset += add_ff_channel_width(tree, tvb, pinfo, offset);
14946
2
    break;
14947
1
  case HT_ACTION_SM_PWR_SAVE:
14948
1
    offset += add_ff_sm_pwr_cntrl(tree, tvb, pinfo, offset);
14949
1
    break;
14950
25
  case HT_ACTION_PSMP_ACTION:
14951
25
    n_sta = tvb_get_uint8(tvb, offset);
14952
25
    offset += add_ff_psmp_param_set(tree, tvb, pinfo, offset);
14953
227
    for (i = 0; i < (n_sta & 0x0F); i++) {
14954
202
      offset += add_ff_psmp_sta_info(tree, tvb, pinfo, offset);
14955
202
    }
14956
25
    break;
14957
0
  case HT_ACTION_SET_PCO_PHASE:
14958
0
    offset += add_ff_pco_phase_cntrl(tree, tvb, pinfo, offset);
14959
0
    break;
14960
0
  case HT_ACTION_MIMO_CSI:
14961
0
    mimo_cntrl = get_mimo_control(tvb, offset);
14962
0
    offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
14963
0
    offset += add_mimo_csi_matrices_report(tree, tvb, offset, mimo_cntrl);
14964
0
    break;
14965
0
  case HT_ACTION_MIMO_BEAMFORMING:
14966
0
    mimo_cntrl = get_mimo_control(tvb, offset);
14967
0
    offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
14968
0
    offset += add_mimo_beamforming_feedback_report(tree, tvb, offset,
14969
0
                                                   mimo_cntrl);
14970
0
    break;
14971
4
  case HT_ACTION_MIMO_COMPRESSED_BEAMFORMING:
14972
4
    mimo_cntrl = get_mimo_control(tvb, offset);
14973
4
    offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
14974
4
    offset += add_mimo_compressed_beamforming_feedback_report(tree, tvb,
14975
4
                                                              offset,
14976
4
                                                              mimo_cntrl);
14977
4
    break;
14978
1
  case HT_ACTION_ANT_SEL_FEEDBACK:
14979
1
    offset += add_ff_ant_selection(tree, tvb, pinfo, offset);
14980
1
    break;
14981
1
  case HT_ACTION_HT_INFO_EXCHANGE:
14982
1
    offset += add_ff_ht_information(tree, tvb, pinfo, offset);
14983
1
    break;
14984
36
  }
14985
14986
28
  return offset - start;
14987
36
}
14988
14989
static unsigned
14990
add_ff_beacon_interval_ctrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
14991
225
{
14992
225
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bic,
14993
225
                                    ett_bic_tree, ieee80211_ff_bic_fields,
14994
225
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
14995
14996
225
  return 6;
14997
225
}
14998
14999
static unsigned
15000
add_ff_beamforming_ctrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset, bool isGrant)
15001
359
{
15002
359
  uint16_t bf_field = tvb_get_letohs(tvb, offset);
15003
359
  bool isInit = (bf_field & 0x2) >> 1;
15004
359
  bool isResp = (bf_field & 0x4) >> 2;
15005
359
  static int * const ieee80211_ff_beamforming_ctrl[] = {
15006
359
    &hf_ieee80211_ff_bf_train,
15007
359
    &hf_ieee80211_ff_bf_is_init,
15008
359
    &hf_ieee80211_ff_bf_is_resp,
15009
359
    &hf_ieee80211_ff_bf_rxss_len,
15010
359
    &hf_ieee80211_ff_bf_rxss_rate,
15011
359
    &hf_ieee80211_ff_bf_b10b15,
15012
359
    NULL
15013
359
  };
15014
15015
359
  static int * const ieee80211_ff_beamforming_ctrl_grant[] = {
15016
359
    &hf_ieee80211_ff_bf_train,
15017
359
    &hf_ieee80211_ff_bf_is_init,
15018
359
    &hf_ieee80211_ff_bf_is_resp,
15019
359
    &hf_ieee80211_ff_bf_num_sectors,
15020
359
    &hf_ieee80211_ff_bf_num_rx_dmg_ants,
15021
359
    &hf_ieee80211_ff_bf_b12b15,
15022
359
    NULL
15023
359
  };
15024
15025
359
  if((isInit==true) && (isResp==true) && isGrant) {
15026
2
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bf,
15027
2
                                    ett_bf_tree, ieee80211_ff_beamforming_ctrl_grant,
15028
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15029
357
  } else {
15030
357
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bf,
15031
357
                                    ett_bf_tree, ieee80211_ff_beamforming_ctrl,
15032
357
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15033
357
  }
15034
359
  return 2;
15035
359
}
15036
15037
static unsigned
15038
add_ff_dynamic_allocation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15039
9
{
15040
9
  static int * const ieee80211_ff_dynamic_allocation[] = {
15041
9
    &hf_ieee80211_ff_TID,
15042
9
    &hf_ieee80211_ff_alloc_type,
15043
9
    &hf_ieee80211_ff_src_aid,
15044
9
    &hf_ieee80211_ff_dest_aid,
15045
9
    &hf_ieee80211_ff_alloc_duration,
15046
9
    &hf_ieee80211_ff_b39,
15047
9
    NULL
15048
9
  };
15049
15050
9
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_dynamic_allocation,
15051
9
                                    ett_dynamic_alloc_tree, ieee80211_ff_dynamic_allocation,
15052
9
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15053
15054
9
  return 5;
15055
9
}
15056
15057
static unsigned
15058
add_ff_beamformed_link(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15059
7
{
15060
7
  static int * const ieee80211_ff_beamformed_link[] = {
15061
7
    &hf_ieee80211_ff_blm_unit_index,
15062
7
    &hf_ieee80211_ff_blm_maint_value,
15063
7
    &hf_ieee80211_ff_blm_is_master,
15064
7
    NULL
15065
7
  };
15066
15067
7
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_blm,
15068
7
                                    ett_blm_tree, ieee80211_ff_beamformed_link,
15069
7
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15070
7
  return 1;
15071
7
}
15072
15073
static unsigned
15074
add_ff_BRP_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15075
4
{
15076
4
  static int * const ieee80211_ff_BRP_request[] = {
15077
4
    &hf_ieee80211_ff_brp_L_RX,
15078
4
    &hf_ieee80211_ff_brp_TX_TRN_REQ,
15079
4
    &hf_ieee80211_ff_brp_MID_REQ,
15080
4
    &hf_ieee80211_ff_brp_BC_REQ,
15081
4
    &hf_ieee80211_ff_brp_MID_GRANT,
15082
4
    &hf_ieee80211_ff_brp_BC_GRANT,
15083
4
    &hf_ieee80211_ff_brp_chan_FBCK_CAP,
15084
4
    &hf_ieee80211_ff_brp_tx_sector,
15085
4
    &hf_ieee80211_ff_brp_other_aid,
15086
4
    &hf_ieee80211_ff_brp_tx_antenna,
15087
4
    &hf_ieee80211_ff_brp_reserved,
15088
4
    NULL
15089
4
  };
15090
15091
4
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_brp,
15092
4
                                    ett_brp_tree, ieee80211_ff_BRP_request,
15093
4
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15094
4
  return 4;
15095
4
}
15096
15097
static unsigned
15098
add_ff_sector_sweep_feedback_from_iss(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15099
2
{
15100
2
  static int * const ieee80211_ff_sector_sweep_feedback_from_iss[] = {
15101
2
    &hf_ieee80211_ff_sswf_total_sectors,
15102
2
    &hf_ieee80211_ff_sswf_num_rx_dmg_ants,
15103
2
    &hf_ieee80211_ff_sswf_reserved1,
15104
2
    &hf_ieee80211_ff_sswf_poll_required,
15105
2
    &hf_ieee80211_ff_sswf_reserved2,
15106
2
    NULL
15107
2
  };
15108
15109
2
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_sswf,
15110
2
                                    ett_sswf_tree, ieee80211_ff_sector_sweep_feedback_from_iss,
15111
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15112
2
  return 3;
15113
2
}
15114
15115
static unsigned
15116
add_ff_sector_sweep_feedback_to_iss(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15117
6
{
15118
6
  static int * const ieee80211_ff_sector_sweep_feedback_to_iss[] = {
15119
6
    &hf_ieee80211_ff_sswf_sector_select,
15120
6
    &hf_ieee80211_ff_sswf_dmg_antenna_select,
15121
6
    &hf_ieee80211_ff_sswf_snr_report,
15122
6
    &hf_ieee80211_ff_sswf_poll_required,
15123
6
    &hf_ieee80211_ff_sswf_reserved2,
15124
6
    NULL
15125
6
  };
15126
15127
6
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_sswf,
15128
6
                                    ett_sswf_tree, ieee80211_ff_sector_sweep_feedback_to_iss,
15129
6
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15130
6
  return 3;
15131
6
}
15132
15133
static unsigned
15134
add_ff_sector_sweep(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15135
230
{
15136
230
  static int * const ieee80211_ff_sector_sweep[] = {
15137
230
    &hf_ieee80211_ff_ssw_direction,
15138
230
    &hf_ieee80211_ff_ssw_cdown,
15139
230
    &hf_ieee80211_ff_ssw_sector_id,
15140
230
    &hf_ieee80211_ff_ssw_dmg_ant_id,
15141
230
    &hf_ieee80211_ff_ssw_rxss_len,
15142
230
    NULL
15143
230
  };
15144
15145
230
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_ssw,
15146
230
                                    ett_ssw_tree, ieee80211_ff_sector_sweep,
15147
230
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15148
230
  return 3;
15149
230
}
15150
15151
static unsigned
15152
add_ff_dmg_params(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15153
225
{
15154
225
  static int * const ieee80211_ff_dmg_params[] = {
15155
225
    &hf_ieee80211_ff_dmg_params_bss,
15156
225
    &hf_ieee80211_ff_dmg_params_cbap_only,
15157
225
    &hf_ieee80211_ff_dmg_params_cbap_src,
15158
225
    &hf_ieee80211_ff_dmg_params_privacy,
15159
225
    &hf_ieee80211_ff_dmg_params_policy,
15160
225
    &hf_ieee80211_ff_dmg_params_spec_mgmt,
15161
225
    &hf_ieee80211_ff_dmg_params_radio_measure,
15162
225
    NULL
15163
225
  };
15164
15165
225
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_dmg_params,
15166
225
                                    ett_dmg_params_tree, ieee80211_ff_dmg_params,
15167
225
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15168
225
  return 1;
15169
225
}
15170
15171
static unsigned
15172
add_ff_cc_field(proto_tree *tree, tvbuff_t *tvb, int offset, bool dis)
15173
103
{
15174
103
  proto_item *cc_item = proto_tree_add_item(tree, hf_ieee80211_ff_cc, tvb, offset, 8, ENC_LITTLE_ENDIAN);
15175
103
  proto_tree *cc_tree = proto_item_add_subtree(cc_item, ett_cc_tree);
15176
103
  uint64_t cc_field;
15177
103
  if(dis) {
15178
62
    proto_tree_add_item(cc_tree, hf_ieee80211_ff_cc_abft_resp_addr, tvb, offset, 6, ENC_NA);
15179
62
  } else {
15180
41
    cc_field = tvb_get_letoh64(tvb, offset);
15181
    /*TODO : Add support of bitmask for FT_(U)INT64 */
15182
41
    proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_sp_duration, tvb, offset, 1, (uint32_t)(cc_field & 0xff));
15183
41
    proto_tree_add_uint64(cc_tree, hf_ieee80211_ff_cc_cluster_id, tvb, offset+1, 6, (uint64_t)((cc_field & UINT64_C(0x00ffffffffffff00)) >> 8));
15184
41
    proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_role, tvb, offset+7, 1, (uint32_t)((cc_field & UINT64_C(0x0300000000000000)) >> 56));
15185
41
    proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_max_mem, tvb, offset+7, 1, (uint32_t)((cc_field & UINT64_C(0x7c00000000000000)) >> 58));
15186
41
  }
15187
103
  return 8;
15188
103
}
15189
15190
15191
static unsigned
15192
add_ff_band_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15193
147
{
15194
147
  proto_tree_add_item(tree, hf_ieee80211_ff_band_id, tvb, offset, 1, ENC_NA);
15195
147
  return 1;
15196
147
}
15197
15198
static unsigned
15199
add_ff_subject_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15200
1
{
15201
1
  proto_tree_add_item(tree, hf_ieee80211_ff_subject_address, tvb, offset, 6, ENC_NA);
15202
1
  return 6;
15203
1
}
15204
15205
static unsigned
15206
add_ff_handover_reason(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15207
1
{
15208
1
  proto_tree_add_item(tree, hf_ieee80211_ff_handover_reason, tvb, offset, 1, ENC_NA);
15209
1
  return 1;
15210
1
}
15211
15212
static unsigned
15213
add_ff_handover_remaining_bi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15214
1
{
15215
1
  proto_tree_add_item(tree, hf_ieee80211_ff_handover_remaining_bi, tvb, offset, 1, ENC_NA);
15216
1
  return 1;
15217
1
}
15218
15219
static unsigned
15220
add_ff_handover_result(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15221
0
{
15222
0
  proto_tree_add_item(tree, hf_ieee80211_ff_handover_result, tvb, offset, 1, ENC_NA);
15223
0
  return 1;
15224
0
}
15225
15226
static unsigned
15227
add_ff_handover_reject_reason(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15228
0
{
15229
0
  proto_tree_add_item(tree, hf_ieee80211_ff_handover_reject_reason, tvb, offset, 1, ENC_NA);
15230
0
  return 1;
15231
0
}
15232
15233
static unsigned
15234
add_ff_destination_reds_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15235
1
{
15236
1
  proto_tree_add_item(tree, hf_ieee80211_ff_destination_reds_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15237
1
  return 2;
15238
1
}
15239
15240
static unsigned
15241
add_ff_destination_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15242
0
{
15243
0
  proto_tree_add_item(tree, hf_ieee80211_ff_destination_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15244
0
  return 2;
15245
0
}
15246
15247
static unsigned
15248
add_ff_relay_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15249
0
{
15250
0
  proto_tree_add_item(tree, hf_ieee80211_ff_relay_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15251
0
  return 2;
15252
0
}
15253
15254
static unsigned
15255
add_ff_source_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15256
0
{
15257
0
  proto_tree_add_item(tree, hf_ieee80211_ff_source_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15258
0
  return 2;
15259
0
}
15260
15261
static unsigned
15262
add_ff_timing_offset(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15263
0
{
15264
0
  proto_tree_add_item(tree, hf_ieee80211_ff_timing_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15265
0
  return 2;
15266
0
}
15267
15268
static unsigned
15269
add_ff_sampling_frequency_offset(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15270
0
{
15271
0
  proto_tree_add_item(tree, hf_ieee80211_ff_sampling_frequency_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15272
0
  return 2;
15273
0
}
15274
15275
static unsigned
15276
add_ff_relay_operation_type(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15277
0
{
15278
0
  proto_tree_add_item(tree, hf_ieee80211_ff_relay_operation_type, tvb, offset, 1, ENC_NA);
15279
0
  return 1;
15280
0
}
15281
15282
static unsigned
15283
add_ff_fst_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15284
9
{
15285
9
  proto_tree_add_item(tree, hf_ieee80211_ff_fst_action_code, tvb, offset, 1, ENC_NA);
15286
9
  return 1;
15287
9
}
15288
15289
static unsigned
15290
add_ff_robust_av_streaming_action_code(proto_tree *tree, tvbuff_t *tvb,
15291
                                       packet_info *pinfo _U_, int offset)
15292
25
{
15293
25
  proto_tree_add_item(tree, hf_ieee80211_ff_robust_av_streaming_action_code,
15294
25
                      tvb, offset, 1, ENC_NA);
15295
25
  return 1;
15296
25
}
15297
15298
static unsigned
15299
add_ff_llt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15300
2
{
15301
2
  proto_tree_add_item(tree, hf_ieee80211_ff_llt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
15302
2
  return 4;
15303
2
}
15304
15305
static unsigned
15306
add_ff_fsts_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15307
2
{
15308
2
  proto_tree_add_item(tree, hf_ieee80211_ff_fsts_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
15309
2
  return 4;
15310
2
}
15311
15312
static unsigned
15313
add_ff_oct_mmpdu(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15314
1
{
15315
1
  unsigned start = offset;
15316
1
  unsigned len = tvb_get_letohs(tvb, offset);
15317
1
  proto_tree_add_item(tree, hf_ieee80211_ff_mmpdu_len, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15318
1
  offset += 2;
15319
1
  proto_tree_add_item(tree, hf_ieee80211_ff_mmpdu_ctrl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
15320
1
  offset += 2;
15321
1
  proto_tree_add_item(tree, hf_ieee80211_ff_oct_mmpdu, tvb, offset, len, ENC_NA);
15322
1
  offset += len;
15323
1
  return offset - start;
15324
1
}
15325
15326
static int * const eht_eml_control_field_mode_headers[] = {
15327
  &hf_ieee80211_eht_eml_control_emlsr_mode,
15328
  &hf_ieee80211_eht_eml_control_emlmr_mode,
15329
  &hf_ieee80211_eht_eml_control_emlsr_para_update_control,
15330
  &hf_ieee80211_eht_eml_control_device_coexist_activities,
15331
  &hf_ieee80211_eht_eml_control_reserved,
15332
  NULL
15333
};
15334
15335
static int * const eht_emlsr_para_update_headers[] = {
15336
  &hf_ieee80211_eht_emlsr_para_update_padding_delay,
15337
  &hf_ieee80211_eht_emlsr_para_update_tran_delay,
15338
  &hf_ieee80211_eht_emlsr_para_update_reserved,
15339
  NULL
15340
};
15341
15342
static int * const eht_eml_control_mcs_map_count_headers[] = {
15343
  &hf_ieee80211_eht_eml_control_mcs_map_count_bw,
15344
  &hf_ieee80211_eht_eml_control_mcs_map_count_reserved,
15345
  NULL
15346
};
15347
15348
static const value_string eht_eml_control_mcs_map_count_bw[] = {
15349
  {0x00, "80 MHz"},
15350
  {0x01, "160 MHz"},
15351
  {0x02, "320 MHz"},
15352
  {0, NULL}
15353
};
15354
15355
static int * const eht_le_80_mcs_map_hdrs[] = {
15356
  &hf_ieee80211_eht_le_80_rx_max_nss_0_9,
15357
  &hf_ieee80211_eht_le_80_tx_max_nss_0_9,
15358
  &hf_ieee80211_eht_le_80_rx_max_nss_10_11,
15359
  &hf_ieee80211_eht_le_80_tx_max_nss_10_11,
15360
  &hf_ieee80211_eht_le_80_rx_max_nss_12_13,
15361
  &hf_ieee80211_eht_le_80_tx_max_nss_12_13,
15362
  NULL
15363
};
15364
15365
static int * const eht_160_mcs_map_hdrs[] = {
15366
  &hf_ieee80211_eht_160_rx_max_nss_0_9,
15367
  &hf_ieee80211_eht_160_tx_max_nss_0_9,
15368
  &hf_ieee80211_eht_160_rx_max_nss_10_11,
15369
  &hf_ieee80211_eht_160_tx_max_nss_10_11,
15370
  &hf_ieee80211_eht_160_rx_max_nss_12_13,
15371
  &hf_ieee80211_eht_160_tx_max_nss_12_13,
15372
  NULL
15373
};
15374
15375
static int * const eht_320_mcs_map_hdrs[] = {
15376
  &hf_ieee80211_eht_320_rx_max_nss_0_9,
15377
  &hf_ieee80211_eht_320_tx_max_nss_0_9,
15378
  &hf_ieee80211_eht_320_rx_max_nss_10_11,
15379
  &hf_ieee80211_eht_320_tx_max_nss_10_11,
15380
  &hf_ieee80211_eht_320_rx_max_nss_12_13,
15381
  &hf_ieee80211_eht_320_tx_max_nss_12_13,
15382
  NULL
15383
};
15384
15385
static unsigned
15386
dissect_eht_eml_control_field(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15387
17
{
15388
17
  unsigned start = offset;
15389
17
  unsigned len = tvb_captured_length_remaining(tvb, offset);
15390
17
  uint8_t mode = tvb_get_uint8(tvb, offset);
15391
17
  uint8_t mcs_map_count;
15392
17
  proto_item *link_map_item;
15393
17
  proto_tree *link_map_tree;
15394
17
  uint16_t bmap, f;
15395
15396
17
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
15397
17
                                    hf_ieee80211_eht_eml_control_field,
15398
17
                                    ett_eht_eml_control,
15399
17
                                    eht_eml_control_field_mode_headers,
15400
17
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15401
17
  offset += 1;
15402
15403
17
  if (mode & 0x03) { /* EMLSR or EMLMR*/
15404
10
    if (len < 3) {
15405
0
      expert_add_info_format(pinfo, tree, &ei_ieee80211_eht_invalid_action, "EMLSR or EMLMR length %u is wrong", len);
15406
0
      return len;
15407
0
    }
15408
10
    link_map_item = proto_tree_add_item(tree,
15409
10
                      hf_ieee80211_eht_eml_control_link_bitmap,
15410
10
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
15411
10
    link_map_tree = proto_item_add_subtree(link_map_item,
15412
10
                     ett_eht_eml_control_link_map);
15413
10
    bmap = tvb_get_letohs(tvb, offset);
15414
170
    for (f = 0; f < 16; f++) {
15415
160
      if (bmap & (1 << f)) {
15416
67
        proto_tree_add_uint_format_value(link_map_tree,
15417
67
          hf_ieee80211_eht_eml_control_link_enable_id,
15418
67
          tvb, offset + (f/8), 1, f, "%u", f);
15419
67
      }
15420
160
    }
15421
10
    offset += 2;
15422
10
  }
15423
17
  if (mode & 0x02) { /* EMLMR */
15424
8
    if (len < 7) {
15425
0
      expert_add_info_format(pinfo, tree, &ei_ieee80211_eht_invalid_action, "EMLMR length %u is wrong", len);
15426
0
      return len;
15427
0
    }
15428
8
    mcs_map_count = tvb_get_uint8(tvb, offset) & 0x03;
15429
8
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
15430
8
        hf_ieee80211_eht_eml_control_mcs_map_count,
15431
8
        ett_eht_eml_control_mcs_map_count,
15432
8
        eht_eml_control_mcs_map_count_headers, ENC_LITTLE_ENDIAN,
15433
8
        BMT_NO_APPEND);
15434
8
    offset++;
15435
15436
8
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
15437
8
      hf_ieee80211_eht_mcs_and_nss_le_80mhz,
15438
8
      ett_eht_phy_mcs_nss_set,
15439
8
      eht_le_80_mcs_map_hdrs,
15440
8
      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15441
8
    offset += 3;
15442
8
    if (mcs_map_count >= 1) {
15443
6
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
15444
6
        hf_ieee80211_eht_mcs_and_nss_eq_160mhz,
15445
6
        ett_eht_phy_mcs_nss_set,
15446
6
        eht_160_mcs_map_hdrs,
15447
6
        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15448
6
      offset += 3;
15449
6
    }
15450
8
    if (mcs_map_count >= 2) {
15451
5
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
15452
5
        hf_ieee80211_eht_mcs_and_nss_eq_320mhz,
15453
5
        ett_eht_phy_mcs_nss_set,
15454
5
        eht_320_mcs_map_hdrs,
15455
5
        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
15456
5
      offset += 3;
15457
5
    }
15458
8
  }
15459
15460
17
  if (mode & 0x04) { /* EMLSR Parameter Update */
15461
9
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
15462
9
      hf_ieee80211_eht_emlsr_para_update, ett_eht_emlsr_para_update,
15463
9
      eht_emlsr_para_update_headers, ENC_LITTLE_ENDIAN,
15464
9
      BMT_NO_APPEND);
15465
9
    offset++;
15466
9
  }
15467
15468
17
  return offset - start;
15469
17
}
15470
15471
static int
15472
add_tag_relay_capabilities(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
15473
46
{
15474
46
  int tag_len = tvb_reported_length(tvb);
15475
46
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
15476
46
  int offset = 0;
15477
46
  static int * const ieee80211_tag_relay_capabilities[] = {
15478
46
    &hf_ieee80211_tag_relay_support,
15479
46
    &hf_ieee80211_tag_relay_use,
15480
46
    &hf_ieee80211_tag_relay_permission,
15481
46
    &hf_ieee80211_tag_AC_power,
15482
46
    &hf_ieee80211_tag_relay_prefer,
15483
46
    &hf_ieee80211_tag_duplex,
15484
46
    &hf_ieee80211_tag_cooperation,
15485
46
    NULL
15486
46
  };
15487
15488
46
  if (tag_len < 2) {
15489
10
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length must be 2");
15490
10
    return 1;
15491
10
  }
15492
15493
36
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_relay_capabilities, ENC_NA);
15494
36
  return tvb_captured_length(tvb);
15495
46
}
15496
15497
#if 0
15498
static unsigned
15499
add_ff_relay_capable_sta_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15500
{
15501
  proto_item *rcsi_item = proto_tree_add_item(tree, hf_ieee80211_ff_rcsi, tvb, offset, 3, ENC_LITTLE_ENDIAN);
15502
  proto_tree *rcsi_tree = proto_item_add_subtree(rcsi_item, ett_rcsi_tree);
15503
  proto_tree_add_item(rcsi_tree, hf_ieee80211_ff_rcsi_aid, tvb, offset, 1, ENC_NA);
15504
  offset += 1;
15505
  add_tag_relay_capabilities(pinfo, rcsi_item, 2, rcsi_tree, tvb, &offset);
15506
  return 3;
15507
}
15508
#endif
15509
15510
1.11k
#define NEXT_TBTT_PRESENT       0x01
15511
1.11k
#define COMPRESSED_SSID_PRESENT 0x02
15512
1.11k
#define ANO_PRESENT             0x04
15513
15514
static void
15515
dissect_ieee80211_extension(uint16_t fcf, tvbuff_t *tvb, packet_info *pinfo,
15516
                            proto_tree *tree, uint16_t flags)
15517
789
{
15518
789
  proto_item *ti;
15519
789
  proto_tree *ext_tree;
15520
789
  proto_tree *fixed_tree;
15521
789
  proto_tree *tagged_tree;
15522
15523
789
  int offset = 0;
15524
789
  int tagged_parameter_tree_len;
15525
15526
789
  ti = proto_tree_add_item(tree, proto_wlan_ext, tvb, offset, -1, ENC_NA);
15527
789
  ext_tree = proto_item_add_subtree(ti, ett_80211_ext);
15528
15529
789
  switch (COMPOSE_FRAME_TYPE(fcf))
15530
789
  {
15531
226
    case EXTENSION_DMG_BEACON:
15532
226
    {
15533
226
      bool cc, dis;
15534
226
      uint16_t bic_field;
15535
226
      fixed_tree = get_fixed_parameter_tree(ext_tree, tvb, offset, 20, false);
15536
226
      offset += add_ff_timestamp(fixed_tree, tvb, pinfo, offset);
15537
226
      offset += add_ff_sector_sweep(fixed_tree, tvb, pinfo, offset);
15538
226
      offset += add_ff_beacon_interval(fixed_tree, tvb, pinfo, offset);
15539
226
      bic_field = tvb_get_letohs(tvb, offset);
15540
226
      cc = (bic_field & 0x1);
15541
226
      dis  = (bic_field & 0x2) >> 1;
15542
226
      offset += add_ff_beacon_interval_ctrl(fixed_tree, tvb, pinfo, offset);
15543
226
      offset += add_ff_dmg_params(fixed_tree, tvb, pinfo, offset);
15544
226
      if(cc) {
15545
103
        offset += add_ff_cc_field(fixed_tree, tvb, offset, dis);
15546
103
      }
15547
226
      tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
15548
15549
      /*
15550
       * The tagged params are optional here. See Table 8.33a of the 2012
15551
       * version of the standard.
15552
       */
15553
226
      if (tagged_parameter_tree_len) {
15554
208
        tagged_tree = get_tagged_parameter_tree(ext_tree, tvb, offset, tagged_parameter_tree_len);
15555
208
        ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, EXTENSION_DMG_BEACON, NULL);
15556
208
      }
15557
226
      break;
15558
0
    }
15559
557
    case EXTENSION_S1G_BEACON:
15560
557
    {
15561
557
        int params_size = 5;
15562
15563
557
        if (flags & NEXT_TBTT_PRESENT) params_size += 3;
15564
557
        if (flags & COMPRESSED_SSID_PRESENT) params_size += 4;
15565
557
        if (flags & ANO_PRESENT) params_size += 1;
15566
15567
557
        fixed_tree = get_fixed_parameter_tree( ext_tree, tvb, offset, params_size, false);
15568
557
        offset += add_ff_s1g_timestamp(fixed_tree, tvb, pinfo, offset);
15569
557
        offset += add_ff_change_sequence(fixed_tree, tvb, pinfo, offset);
15570
557
        if (flags & NEXT_TBTT_PRESENT)
15571
211
          offset += add_ff_next_tbtt(fixed_tree, tvb, pinfo, offset);
15572
557
        if (flags & COMPRESSED_SSID_PRESENT)
15573
134
          offset += add_ff_compressed_ssid(fixed_tree, tvb, pinfo, offset);
15574
557
        if (flags & ANO_PRESENT)
15575
264
          offset += add_ff_access_network_options(fixed_tree, tvb, pinfo, offset);
15576
15577
557
        tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
15578
15579
557
        if (tagged_parameter_tree_len) {
15580
550
          tagged_tree = get_tagged_parameter_tree(ext_tree, tvb, offset, tagged_parameter_tree_len);
15581
550
          ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, EXTENSION_S1G_BEACON, NULL);
15582
550
        }
15583
557
    }
15584
789
  }
15585
789
}
15586
15587
static unsigned
15588
add_ff_action_unprotected_dmg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
15589
3
{
15590
3
  uint8_t code;
15591
3
  unsigned  start = offset;
15592
15593
3
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
15594
3
  code    = tvb_get_uint8(tvb, offset);
15595
3
  offset += add_ff_unprotected_dmg_action_code(tree, tvb, pinfo, offset);
15596
3
  switch (code) {
15597
1
    case UNPROTECTED_DMG_ANNOUNCE:
15598
1
      offset += add_ff_timestamp(tree, tvb, pinfo, offset);
15599
1
      offset += add_ff_beacon_interval(tree, tvb, pinfo, offset);
15600
1
      break;
15601
0
    case UNPROTECTED_DMG_BRP:
15602
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
15603
0
      offset += add_ff_BRP_request(tree, tvb, pinfo, offset);
15604
0
      break;
15605
3
  }
15606
3
  return offset - start;
15607
3
}
15608
15609
/* There is no easy way to skip all these subcarrier indices that must not
15610
 * be displayed when showing compressed beamforming feedback matrices
15611
 * Table 8-53g IEEE Std 802.11ac-2013 amendment.
15612
 *
15613
 * The irregular use of case statements in this function is to improve
15614
 * readability in what is otherwise a large function that does very little.
15615
 */
15616
static inline int
15617
vht_compressed_skip_scidx(uint8_t nchan_width, uint8_t ng, int scidx)
15618
5.41k
{
15619
5.41k
  switch(nchan_width) {
15620
    /* 20 MHz */
15621
395
    case 0:
15622
      /* No Grouping */
15623
395
      if (ng == 0)
15624
259
        switch (scidx) {
15625
          /* Pilot subcarriers */
15626
19
          case -21: case -7: case 7: case 21:
15627
          /* DC subcarrier */
15628
23
          case 0:
15629
23
            scidx++;
15630
259
          default:
15631
259
            break;
15632
259
        }
15633
395
      break;
15634
    /* 40 MHz */
15635
395
    case 1:
15636
      /* No Grouping */
15637
259
      if (ng == 0)
15638
138
        switch (scidx) {
15639
          /* Pilot subcarriers */
15640
8
          case -53: case -25: case -11: case 11: case 25: case 53:
15641
8
            scidx++;
15642
8
            break;
15643
          /* DC subcarriers */
15644
1
          case -1: case 0: case 1:
15645
1
            scidx = 2;
15646
130
          default:
15647
130
            break;
15648
138
        }
15649
259
      break;
15650
    /* 80 MHz */
15651
525
    case 2:
15652
      /* No Grouping */
15653
525
      if (ng == 0)
15654
378
        switch (scidx) {
15655
          /* Pilot subcarriers */
15656
10
          case -103: case -75: case -39: case -11: case 11: case 39: case 75: case 103:
15657
10
            scidx++;
15658
10
            break;
15659
          /* DC subcarriers, skip -1, 0, 1 */
15660
1
          case -1:
15661
1
            scidx = 2;
15662
368
          default:
15663
368
            break;
15664
378
        }
15665
525
      break;
15666
    /* 160 MHz / 80+80 Mhz
15667
     * Skip values here assume 160 MHz, as vht_mimo_control does not let us differentiate
15668
     * between 160 MHz & 80-80MHz */
15669
4.23k
    case 3:
15670
4.23k
      switch (ng) {
15671
        /* No Grouping */
15672
3.84k
        case 0:
15673
          /* DC subcarriers, skip -5 to 5*/
15674
3.84k
          if (scidx == -5) {
15675
10
            scidx = 6;
15676
10
            break;
15677
10
          }
15678
3.83k
          switch (scidx) {
15679
            /* Pilot subcarriers */
15680
93
            case -231: case -203: case -167: case -139: case -117: case -89: case -53: case -25:
15681
131
            case 25: case 53: case 89: case 117: case 139: case 167: case 203: case 231:
15682
131
              scidx++;
15683
131
              break;
15684
            /* Other subcarriers, skip -129 to -127, 127 to 129 */
15685
12
            case -129:
15686
12
              scidx = -126;
15687
12
              break;
15688
4
            case 127:
15689
4
              scidx = 130;
15690
4
              break;
15691
3.69k
            default:
15692
3.69k
              break;
15693
3.83k
          }
15694
3.83k
          break;
15695
        /* Grouping of 2 */
15696
3.83k
        case 1:
15697
340
          switch (scidx) {
15698
            /* DC subcarriers */
15699
1
            case -128: case -4: case -2: case 0: case 2: case 4: case 128:
15700
1
              scidx++;
15701
340
            default:
15702
340
              break;
15703
340
          }
15704
340
          break;
15705
        /* Grouping of 4 */
15706
340
        case 2:
15707
50
          if (scidx == -2 || scidx == 2)
15708
0
            scidx++;
15709
50
          break;
15710
4.23k
      }
15711
4.23k
      break;
15712
4.23k
    default:
15713
0
      break;
15714
5.41k
  }
15715
15716
5.41k
  return scidx;
15717
5.41k
}
15718
15719
static inline int vht_exclusive_skip_scidx(uint8_t nchan_width, uint8_t ng, int scidx)
15720
130
{
15721
130
  switch (nchan_width) {
15722
    /* 20 MHz */
15723
82
    case 0:
15724
82
      switch (ng) {
15725
        /* No Grouping */
15726
30
        case 0:
15727
30
          if (scidx == -2 || scidx == 1)
15728
2
              scidx++;
15729
28
          else
15730
28
              scidx = scidx + 2;
15731
30
          break;
15732
32
        case 1:
15733
32
          switch (scidx) {
15734
4
            case -4: case 1:
15735
4
              scidx = scidx + 3;
15736
4
              break;
15737
2
            case -1:
15738
2
              scidx = 1;
15739
2
              break;
15740
26
            default:
15741
26
              scidx = scidx + 4;
15742
26
              break;
15743
32
          }
15744
32
          break;
15745
32
        default:
15746
20
          switch (scidx) {
15747
4
            case -4: case 1:
15748
4
              scidx = scidx + 3;
15749
4
              break;
15750
2
            case -1:
15751
2
              scidx = 1;
15752
2
              break;
15753
14
            default:
15754
14
              scidx = scidx + 8;
15755
14
              break;
15756
20
          }
15757
20
          break;
15758
82
      }
15759
82
      break;
15760
    /* 40 MHz */
15761
82
    case 1:
15762
    /* 80 MHz */
15763
48
    case 2:
15764
48
      switch (ng) {
15765
        /* No Grouping */
15766
0
        case 0:
15767
0
          if (scidx == -2)
15768
0
            scidx = 2;
15769
0
          else
15770
0
            scidx = scidx + 2;
15771
0
          break;
15772
0
        case 1:
15773
0
          scidx = scidx + 4;
15774
0
          break;
15775
48
        default:
15776
48
          if (scidx == -2)
15777
2
            scidx = 2;
15778
46
          else
15779
46
            scidx = scidx + 8;
15780
48
          break;
15781
48
      }
15782
48
      break;
15783
    /* 160 MHz / 80+80 Mhz */
15784
48
    case 3:
15785
0
      switch (ng) {
15786
        /* No Grouping */
15787
0
        case 0:
15788
0
          switch (scidx) {
15789
            /* DC subcarriers, skip -4 to 4*/
15790
0
            case -6:
15791
0
              scidx = 6;
15792
0
              break;
15793
            /* Other subcarriers, skip -128, 128 */
15794
0
            case -130:
15795
0
              scidx = -126;
15796
0
              break;
15797
0
            case 126:
15798
0
              scidx = 130;
15799
0
              break;
15800
0
            default:
15801
0
              scidx = scidx + 2;
15802
0
              break;
15803
0
          }
15804
0
          break;
15805
0
        case 1:
15806
0
          switch (scidx) {
15807
            /* DC subcarriers, skip -4 to 4*/
15808
0
            case -6:
15809
0
              scidx = 6;
15810
0
              break;
15811
0
            default:
15812
0
              scidx = scidx + 4;
15813
0
              break;
15814
0
          }
15815
0
          break;
15816
0
        default:
15817
0
          switch (scidx) {
15818
0
            case -6:
15819
0
              scidx = 6;
15820
0
              break;
15821
0
            case -130:
15822
0
              scidx = -126;
15823
0
              break;
15824
0
            case 126:
15825
0
              scidx = 130;
15826
0
              break;
15827
0
            default:
15828
0
              scidx = scidx + 8;
15829
0
              break;
15830
0
          }
15831
0
        break;
15832
0
      }
15833
0
      break;
15834
0
    default:
15835
0
      break;
15836
130
  }
15837
130
  return scidx;
15838
130
}
15839
15840
static int
15841
dissect_he_feedback_matrix(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
15842
                           int offset, int bit_offset, int scidx,
15843
                           int nr, int nc,
15844
                           int phi_bits, int psi_bits,
15845
                           int hf);
15846
15847
static unsigned
15848
add_ff_vht_compressed_beamforming_report(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
15849
96
{
15850
96
  uint32_t vht_mimo;
15851
96
  uint8_t nc;
15852
96
  uint8_t nr;
15853
96
  uint8_t chan_width;
15854
96
  uint8_t grouping;
15855
96
  bool codebook_info;
15856
96
  bool feedback_type;
15857
96
  proto_item *vht_beam_item, *vht_excl_beam_item;
15858
96
  proto_tree *vht_beam_tree, *subtree, *vht_excl_beam_tree;
15859
96
  int i, len, pos, ns, scidx = 0;
15860
96
  uint8_t phi, psi, carry;
15861
96
  int j, ic, off_len = 0, sscidx = 0, xnsc;
15862
96
  int bit_offset = 0;
15863
96
  int start_offset = 0;
15864
  /* Table 8-53g Subcarriers for which a Compressed Beamforming Feedback Matrix
15865
   * subfield is sent back. IEEE Std 802.11ac-2013 amendment */
15866
96
  static const int ns_arr[4][3] = { {  52,  30,  16 },
15867
96
                                    { 108,  58,  30 },
15868
96
                                    { 234, 122,  62 },
15869
96
                                    { 468, 244, 124 }
15870
96
                                  };
15871
15872
  /* Table 8-53j, no of Subcarriers for which the Delta SNR subfield is sent back to the beamformer.
15873
   * IEEE Std 802.11ac-2013 amendment */
15874
96
  static const int delta_ns_arr[4][3] = { {  30,  16,  10 },
15875
96
                                          {  58,  30,  16 },
15876
96
                                          { 122,  62,  32 },
15877
96
                                          { 244, 124,  64 }
15878
96
                                        };
15879
15880
96
  vht_mimo = tvb_get_letoh24(tvb, offset);
15881
96
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_vht_mimo_cntrl,
15882
96
                        ett_ff_vhtmimo_cntrl, hf_ieee80211_ff_vht_mimo_cntrl_fields, ENC_LITTLE_ENDIAN);
15883
96
  offset += 3;
15884
15885
  /* Extract values for beamforming use */
15886
96
  nc = (vht_mimo & 0x7) + 1;
15887
96
  nr = ((vht_mimo & 0x38) >> 3) + 1;
15888
96
  chan_width = (vht_mimo & 0xC0) >> 6;
15889
96
  grouping = ((vht_mimo & 0x300) >> 8);
15890
96
  codebook_info = (vht_mimo & 0x400) >> 10;
15891
96
  feedback_type = (vht_mimo & 0x800) >> 11;
15892
15893
96
  if (feedback_type) {
15894
38
    if (codebook_info) {
15895
24
      psi = 7; phi = 9;
15896
24
    } else {
15897
14
      psi = 5; phi = 7;
15898
14
    }
15899
58
  } else {
15900
58
    if (codebook_info) {
15901
9
      psi = 4; phi = 6;
15902
49
    } else {
15903
49
      psi = 2; phi = 4;
15904
49
    }
15905
58
  }
15906
15907
96
  vht_beam_item = proto_tree_add_item(tree, hf_ieee80211_vht_compressed_beamforming_report, tvb,
15908
96
                                  offset, -1, ENC_NA);
15909
96
  vht_beam_tree = proto_item_add_subtree(vht_beam_item, ett_ff_vhtmimo_beamforming_report);
15910
15911
96
  subtree = proto_tree_add_subtree(vht_beam_tree, tvb, offset, nc,
15912
96
                        ett_ff_vhtmimo_beamforming_report_snr, NULL, "Average Signal to Noise Ratio");
15913
15914
565
  for (i = 1; i <= nc; i++)
15915
469
  {
15916
469
    int8_t snr;
15917
469
    char edge_sign;
15918
15919
469
    snr = tvb_get_int8(tvb, offset);
15920
15921
469
    switch(snr) {
15922
55
      case -128:
15923
55
        edge_sign = '<';
15924
55
        break;
15925
2
      case 127:
15926
2
        edge_sign = '>';
15927
2
        break;
15928
412
      default:
15929
412
        edge_sign = ' ';
15930
412
        break;
15931
469
    }
15932
15933
469
    proto_tree_add_int_format(subtree, hf_ieee80211_vht_compressed_beamforming_report_snr, tvb, offset, 1,
15934
469
                               snr, "Stream %d - Signal to Noise Ratio: %c%3.2fdB", i, edge_sign,snr/4.0+22.0);
15935
15936
469
    offset += 1;
15937
469
  }
15938
15939
  /* Table 8-53c Subfields of the VHT MIMO Control field (802.11ac-2013)
15940
   * reserves value 3 of the Grouping subfield. */
15941
96
  if (grouping == 3) {
15942
2
    expert_add_info_format(pinfo, vht_beam_item, &ei_ieee80211_inv_val,
15943
2
                           "Grouping subfield value 3 is reserved");
15944
2
    return offset;
15945
2
  }
15946
15947
94
  start_offset = offset;
15948
94
  subtree = proto_tree_add_subtree(vht_beam_tree, tvb, offset, -1,
15949
94
                        ett_ff_vhtmimo_beamforming_report_feedback_matrices,
15950
94
                        NULL, "Feedback Matrices");
15951
15952
94
  ns = ns_arr[chan_width][grouping];
15953
94
  switch(chan_width) {
15954
23
    case 0:
15955
23
      scidx = -28;
15956
23
      break;
15957
15
    case 1:
15958
15
      scidx = -58;
15959
15
      break;
15960
21
    case 2:
15961
21
      scidx = -122;
15962
21
      break;
15963
35
    case 3:
15964
      /* This is -122 for 80+80MHz Channel Width but vht_mimo_control does not allow us
15965
       * to differentiate between 160MHz and 80+80Mhz */
15966
35
      scidx = -250;
15967
35
      break;
15968
94
  }
15969
15970
94
  bit_offset = offset * 8;
15971
5.51k
  for (i = 0; i < ns; i++) {
15972
15973
5.41k
    scidx = vht_compressed_skip_scidx(chan_width, grouping, scidx);
15974
15975
5.41k
    bit_offset = dissect_he_feedback_matrix(subtree, tvb, pinfo, offset,
15976
5.41k
                                    bit_offset, scidx++, nr, nc, phi, psi,
15977
5.41k
                                    hf_ieee80211_vht_compressed_beamform_scidx);
15978
5.41k
    offset = bit_offset / 8;
15979
5.41k
  }
15980
15981
94
  proto_item_set_len(subtree, offset - start_offset);
15982
15983
94
  if (feedback_type) {
15984
7
    xnsc = delta_ns_arr[chan_width][grouping];
15985
7
    if ((nc * xnsc *4) % 8)
15986
0
        off_len = (nc * xnsc *4) / 8 + 1;
15987
7
    else
15988
7
        off_len = (nc * xnsc *4) / 8;
15989
7
    switch(chan_width) {
15990
5
      case 0:
15991
5
        sscidx = -28;
15992
5
        break;
15993
1
      case 1:
15994
1
        sscidx = -58;
15995
1
        break;
15996
1
      case 2:
15997
1
        sscidx = -122;
15998
1
        break;
15999
0
      case 3:
16000
0
        sscidx = -250;
16001
0
        break;
16002
7
    }
16003
7
    vht_excl_beam_item = proto_tree_add_item(tree, hf_ieee80211_vht_mu_exclusive_beamforming_report, tvb, offset, off_len, ENC_NA);
16004
7
    vht_excl_beam_tree = proto_item_add_subtree(vht_excl_beam_item, ett_ff_vhtmu_exclusive_beamforming_report_matrices);
16005
16006
7
    carry = 1;
16007
137
    for (j = 1; j <= xnsc; j++) {
16008
472
      for (ic = 1; ic <= nc; ic++) {
16009
342
        if (carry % 2){
16010
171
          pos = 0;
16011
171
          len = 1;
16012
171
        }
16013
171
        else
16014
171
        {
16015
171
          pos = 1;
16016
171
          len = 0;
16017
171
        }
16018
342
        proto_tree_add_none_format(vht_excl_beam_tree, hf_ieee80211_vht_mu_exclusive_beamforming_delta_snr, tvb,
16019
342
                                      offset - pos, 1, "Delta SNR for space-time stream %d for subcarrier %d", ic, sscidx);
16020
342
        offset += len;
16021
342
        carry ++;
16022
342
      }
16023
130
      sscidx = vht_exclusive_skip_scidx(chan_width, grouping, sscidx);
16024
130
    }
16025
7
  }
16026
16027
94
  return offset;
16028
94
}
16029
16030
static unsigned
16031
add_ff_action_vht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
16032
130
{
16033
130
  unsigned start = offset;
16034
130
  uint8_t vht_action, field_val;
16035
130
  uint64_t msa_value;
16036
130
  uint64_t upa_value;
16037
130
  int m, half, msa_index;
16038
130
  proto_item *ti;
16039
130
  proto_tree *ti_tree;
16040
130
  proto_item *msa, *upa;
16041
130
  proto_tree *msa_tree, *upa_tree;
16042
16043
130
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
16044
16045
130
  vht_action = tvb_get_uint8(tvb, offset);
16046
130
  offset += add_ff_vht_action(tree, tvb, pinfo, offset);
16047
16048
130
  switch(vht_action){
16049
96
    case VHT_ACT_VHT_COMPRESSED_BEAMFORMING:{
16050
96
      offset = add_ff_vht_compressed_beamforming_report(tree, tvb, pinfo, offset);
16051
96
      offset += tvb_reported_length_remaining(tvb, offset);
16052
96
    }
16053
96
    break;
16054
18
    case VHT_ACT_GROUP_ID_MANAGEMENT:{
16055
18
      ti = proto_tree_add_item(tree, hf_ieee80211_vht_group_id_management, tvb,
16056
18
                          offset, -1, ENC_NA);
16057
18
      ti_tree = proto_item_add_subtree(ti, ett_vht_grpidmgmt);
16058
16059
18
      msa_value = tvb_get_letoh64(tvb, offset);
16060
18
      msa = proto_tree_add_item(ti_tree, hf_ieee80211_vht_membership_status_array, tvb,
16061
18
                                offset, 8, ENC_NA);
16062
18
      msa_tree = proto_item_add_subtree(msa, ett_vht_msa);
16063
1.17k
      for (m = 0; m < 64; m++) {
16064
1.15k
          if (msa_value & (INT64_C(1) << m))
16065
370
              proto_tree_add_uint_format(msa_tree, hf_ieee80211_vht_membership_status_field,
16066
370
                                               tvb, offset + (m/8), 1, 1, "Membership Status in Group ID %d: 1", m);
16067
1.15k
      }
16068
18
      offset += 8;
16069
16070
18
      upa = proto_tree_add_item(ti_tree, hf_ieee80211_vht_user_position_array, tvb,
16071
18
                                      offset, 16, ENC_NA);
16072
18
      upa_tree = proto_item_add_subtree(upa, ett_vht_upa);
16073
16074
48
      for (half = 0, msa_index = 0; half < 2; half++) {
16075
30
          upa_value = tvb_get_letoh64(tvb, offset);
16076
990
          for (m = 0; m < 64; m += 2, msa_index++) {
16077
960
              if (msa_value & (INT64_C(1) << msa_index)) {
16078
332
                  field_val = (uint8_t)((upa_value >> m) & 0x3);
16079
332
                  proto_tree_add_uint_format(upa_tree, hf_ieee80211_vht_user_position_field,
16080
332
                      tvb, offset + (m / 8), 1, field_val, "User Position in Group ID %d: %u", msa_index, field_val);
16081
332
              }
16082
960
          }
16083
30
          offset += 8;
16084
30
      }
16085
16086
18
      offset += tvb_reported_length_remaining(tvb, offset);
16087
18
    }
16088
18
    break;
16089
2
    case VHT_ACT_OPERATION_MODE_NOTIFICATION:{
16090
2
      ti = proto_tree_add_item(tree, hf_ieee80211_vht_operation_mode_notification, tvb,
16091
2
                          offset, -1, ENC_NA);
16092
2
      expert_add_info(pinfo, ti, &ei_ieee80211_vht_action);
16093
2
      offset += tvb_reported_length_remaining(tvb, offset);
16094
2
    }
16095
2
    break;
16096
14
    default:
16097
14
    break;
16098
130
  }
16099
16100
16101
46
  return offset - start;
16102
130
}
16103
16104
static int * const s1g_sync_control_headers[] = {
16105
  &hf_ieee80211_s1g_sync_control_uplink_sync_request,
16106
  &hf_ieee80211_s1g_sync_control_time_slot_protection_request,
16107
  &hf_ieee80211_s1g_sync_control_reserved,
16108
  NULL
16109
};
16110
16111
static int
16112
add_ff_sync_control(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
16113
0
{
16114
0
  int start = offset;
16115
16116
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16117
0
                                    hf_ieee80211_s1g_sync_control,
16118
0
                                    ett_s1g_sync_control_tree,
16119
0
                                    s1g_sync_control_headers,
16120
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_FLAGS);
16121
0
  offset += 1;
16122
16123
0
  return offset - start;
16124
0
}
16125
16126
static int * const s1g_sector_id_index_headers[] = {
16127
  &hf_ieee80211_s1g_sector_id_preferred_sector_id,
16128
  &hf_ieee80211_s1g_sector_id_snr,
16129
  &hf_ieee80211_s1g_sector_id_receive_sector_bitmap,
16130
  NULL
16131
};
16132
16133
static void
16134
s1g_sector_id_index_snr_custom(char *result, uint16_t snr)
16135
1
{
16136
1
  switch (snr) {
16137
0
  case 0:
16138
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s", "Less than or equal to -3dB");
16139
0
    break;
16140
0
  case 30:
16141
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s", "Greater than or equal to 27dB");
16142
0
    break;
16143
0
  case 31:
16144
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s", "No Feedback");
16145
0
    break;
16146
1
  default:
16147
1
    snprintf(result, ITEM_LABEL_LENGTH, "%ddB", snr - 3);
16148
1
  }
16149
1
}
16150
16151
static int
16152
add_ff_sector_id_index(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
16153
1
{
16154
1
  int start = offset;
16155
16156
1
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16157
1
                                    hf_ieee80211_s1g_sector_id_index,
16158
1
                                    ett_s1g_sector_id_index,
16159
1
                                    s1g_sector_id_index_headers,
16160
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_FLAGS);
16161
1
  offset += 2;
16162
16163
1
  return offset - start;
16164
1
}
16165
16166
static int * const s1g_twt_information_control_headers[] = {
16167
  &hf_ieee80211_s1g_twt_flow_identifier,
16168
  &hf_ieee80211_s1g_twt_response_required,
16169
  &hf_ieee80211_s1g_twt_next_twt_request,
16170
  &hf_ieee80211_s1g_twt_next_twt_subfield_size,
16171
  &hf_ieee80211_s1g_twt_reserved,
16172
  NULL
16173
};
16174
16175
static int
16176
add_ff_twt_information(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
16177
0
{
16178
0
  int start = offset;
16179
0
  uint8_t control = tvb_get_uint8(tvb, offset);
16180
16181
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16182
0
                                    hf_ieee80211_s1g_twt_information_control,
16183
0
                                    ett_s1g_twt_information_control,
16184
0
                                    s1g_twt_information_control_headers,
16185
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_FLAGS);
16186
0
  offset += 1;
16187
16188
0
  if (control & 0x60) {
16189
0
    int len_bits = ((control >> 5) & 0x03);
16190
0
    int len = 0;
16191
16192
0
    switch (len_bits) {
16193
0
    case 0:
16194
0
      len = 0; /* Should not happen! */
16195
0
      break;
16196
0
    case 1:
16197
0
      len = 4;
16198
0
      proto_tree_add_item(tree, hf_ieee80211_s1g_twt_next_twt_32, tvb, offset,
16199
0
                          len, ENC_LITTLE_ENDIAN);
16200
0
      break;
16201
0
    case 2:
16202
0
      len = 6;
16203
0
      proto_tree_add_item(tree, hf_ieee80211_s1g_twt_next_twt_48, tvb, offset,
16204
0
                          len, ENC_LITTLE_ENDIAN);
16205
0
      break;
16206
0
    case 3:
16207
0
      len = 8;
16208
0
      proto_tree_add_item(tree, hf_ieee80211_s1g_twt_next_twt_64, tvb, offset,
16209
0
                          len, ENC_LITTLE_ENDIAN);
16210
0
      break;
16211
0
    }
16212
16213
0
    offset += len;
16214
0
  }
16215
16216
0
  return offset - start;
16217
0
}
16218
16219
static unsigned
16220
add_ff_s1g_twt_setup(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
16221
0
{
16222
0
  const uint8_t ids[] = { TAG_TWT };
16223
0
  unsigned start = offset;
16224
16225
0
  offset += add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL);
16226
16227
0
  return offset - start;
16228
0
}
16229
16230
static int * const ieee80211_twt_individual_flow[] = {
16231
  &hf_ieee80211_twt_individual_flow_id,
16232
  &hf_ieee80211_twt_individual_reserved,
16233
  &hf_ieee80211_twt_neg_type,
16234
  &hf_ieee80211_twt_bcast_teardown_all_twt,
16235
  NULL,
16236
};
16237
static int * const ieee80211_twt_bcast_flow[] = {
16238
  &hf_ieee80211_twt_bcast_id,
16239
  &hf_ieee80211_twt_neg_type,
16240
  &hf_ieee80211_twt_bcast_teardown_all_twt,
16241
  NULL,
16242
};
16243
static int * const ieee80211_twt_neg_type2[] = {
16244
  &hf_ieee80211_twt_neg_type2_reserved1,
16245
  &hf_ieee80211_twt_neg_type,
16246
  &hf_ieee80211_twt_neg_type2_reserved2,
16247
  NULL,
16248
};
16249
static int * const ieee80211_twt_teardown_all[] = {
16250
  &hf_ieee80211_twt_bcast_twt_id_reserved,
16251
  &hf_ieee80211_twt_bcast_neg_type_reserved,
16252
  &hf_ieee80211_twt_bcast_teardown_all_twt,
16253
  NULL,
16254
};
16255
16256
static unsigned
16257
add_ff_s1g_twt_teardown(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
16258
0
{
16259
0
  uint8_t twt_flow_id = tvb_get_uint8(tvb, offset);
16260
16261
  // Bit 7 is means Teardown All TWT, and the other fields are reserved
16262
0
  if (twt_flow_id & 0x80) {
16263
0
    proto_tree_add_bitmask(tree, tvb, offset,
16264
0
                           hf_ieee80211_twt_bcast_teardown_all,
16265
0
                           ett_twt_tear_down_tree,
16266
0
                           ieee80211_twt_teardown_all,
16267
0
                           ENC_NA);
16268
0
    return 1;
16269
0
  }
16270
16271
  // Bits 5 and 6 are the negotiation type - See ieee80211.ax/D3.0 9.6.25.9
16272
0
  switch ((twt_flow_id & 0x60) >> 5) {
16273
0
    case 2:
16274
0
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16275
0
                                        hf_ieee80211_twt_bcast_flow,
16276
0
                                        ett_twt_tear_down_tree, ieee80211_twt_neg_type2,
16277
0
                                        ENC_LITTLE_ENDIAN, BMT_NO_FLAGS);
16278
0
      break;
16279
16280
0
    case 3:
16281
      // According to 11ax, first 5 bits are the BCAST TWT flow ID
16282
0
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16283
0
                                        hf_ieee80211_twt_bcast_flow,
16284
0
                                        ett_twt_tear_down_tree, ieee80211_twt_bcast_flow,
16285
0
                                        ENC_LITTLE_ENDIAN, BMT_NO_FLAGS);
16286
0
    break;
16287
0
    case 0:
16288
0
    case 1:
16289
      // According to 11ah / 11ax, first 3 bits are the UCAST TWT flow ID
16290
0
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16291
0
                                        hf_ieee80211_twt_individual_flow,
16292
0
                                        ett_twt_tear_down_tree, ieee80211_twt_individual_flow,
16293
0
                                        ENC_LITTLE_ENDIAN, BMT_NO_FLAGS);
16294
0
      break;
16295
0
    default:
16296
0
      proto_tree_add_expert(tree, pinfo, &ei_ieee80211_twt_tear_down_bad_neg_type,
16297
0
                            tvb, offset, tvb_reported_length_remaining(tvb, offset));
16298
0
  }
16299
16300
  // The TWT Flow ID size
16301
0
  return 1;
16302
0
}
16303
16304
static unsigned
16305
add_ff_action_s1g(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
16306
5
{
16307
5
  unsigned start = offset;
16308
5
  uint8_t s1g_action;
16309
16310
5
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
16311
16312
5
  s1g_action = tvb_get_uint8(tvb, offset);
16313
5
  offset += add_ff_s1g_action(tree, tvb, pinfo, offset);
16314
16315
5
  switch(s1g_action) {
16316
2
  case S1G_ACT_AID_SWITCH_REQUEST:
16317
2
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16318
2
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16319
2
    break;
16320
0
  case S1G_ACT_AID_SWITCH_RESPONSE:
16321
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16322
0
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16323
0
    break;
16324
0
  case S1G_ACT_SYNC_CONTROL:
16325
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16326
0
    offset += add_ff_sync_control(tree, tvb, pinfo, offset);
16327
0
    break;
16328
0
  case S1G_ACT_STA_INFO_ANNOUNCE:
16329
0
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16330
0
     break;
16331
1
  case S1G_ACT_EDCA_PARAM_SET:
16332
1
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16333
1
    break;
16334
1
  case S1G_ACT_EL_OPERATION:
16335
1
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16336
1
    break;
16337
0
  case S1G_ACT_TWT_SETUP:
16338
0
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16339
0
    offset += add_ff_s1g_twt_setup(tree, tvb, pinfo, offset);
16340
0
    break;
16341
0
  case S1G_ACT_TWT_TEARDOWN:
16342
0
    offset += add_ff_s1g_twt_teardown(tree, tvb, pinfo, offset);
16343
0
    break;
16344
0
  case S1G_ACT_SECT_GROUP_ID_LIST:
16345
0
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16346
0
    break;
16347
0
  case S1G_ACT_SECT_ID_FEEDBACK:
16348
0
    offset += add_ff_sector_id_index(tree, tvb, pinfo, offset);
16349
0
    break;
16350
0
  case S1G_ACT_TWT_INFORMATION:
16351
0
    offset += add_ff_twt_information(tree, tvb, pinfo, offset);
16352
0
    break;
16353
1
  default:
16354
1
    break;
16355
5
  }
16356
16357
3
  return offset - start;
16358
5
}
16359
16360
static unsigned
16361
add_ff_action_protected_s1g(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
16362
3
{
16363
3
  unsigned start = offset;
16364
3
  uint8_t s1g_action;
16365
16366
3
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
16367
16368
3
  s1g_action = tvb_get_uint8(tvb, offset);
16369
3
  offset += add_ff_prot_s1g_action(tree, tvb, pinfo, offset);
16370
16371
3
  switch(s1g_action) {
16372
1
    case PROT_S1G_ACT_REACH_ADDR_UPDATE:
16373
1
    case PROT_S1G_ACT_RELAY_ACTIVATE_REQ:
16374
1
    case PROT_S1G_ACT_RELAY_ACTIVATE_RESP:
16375
1
    case PROT_S1G_ACT_HEADER_COMPRESSION:
16376
      // TODO
16377
1
      break;
16378
0
    case PROT_S1G_ACT_TWT_SETUP:
16379
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16380
0
      offset += add_ff_s1g_twt_setup(tree, tvb, pinfo, offset);
16381
0
      break;
16382
0
    case PROT_S1G_ACT_TWT_TEARDOWN:
16383
0
      offset += add_ff_s1g_twt_teardown(tree, tvb, pinfo, offset);
16384
0
      break;
16385
0
    case PROT_S1G_ACT_TWT_INFORMATION:
16386
0
      offset += add_ff_twt_information(tree, tvb, pinfo, offset);
16387
0
      break;
16388
0
    case PROT_S1G_ACT_AID_SWITCH_REQUEST:
16389
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16390
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16391
0
      break;
16392
0
    case PROT_S1G_ACT_AID_SWITCH_RESPONSE:
16393
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16394
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16395
0
      break;
16396
0
    case PROT_S1G_ACT_SYNC_CONTROL:
16397
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
16398
0
      offset += add_ff_sync_control(tree, tvb, pinfo, offset);
16399
0
      break;
16400
0
    case PROT_S1G_ACT_STA_INFO_ANNOUNCE:
16401
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16402
0
      break;
16403
0
    case PROT_S1G_ACT_EDCA_PARAM_SET:
16404
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16405
0
      break;
16406
0
    case PROT_S1G_ACT_EL_OPERATION:
16407
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16408
0
      break;
16409
0
    case PROT_S1G_ACT_SECT_GROUP_ID_LIST:
16410
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
16411
0
      break;
16412
1
    case PROT_S1G_ACT_SECT_ID_FEEDBACK:
16413
1
      offset += add_ff_sector_id_index(tree, tvb, pinfo, offset);
16414
1
      break;
16415
1
    default:
16416
1
      break;
16417
3
  }
16418
16419
3
  return offset - start;
16420
3
}
16421
16422
110
#define HE_COMPRESSED_BEAMFORMING_AND_CQI 0
16423
5
#define HE_QUIET_TIME_PERIOD              1
16424
16425
static const range_string he_action_rvals[] = {
16426
  { HE_COMPRESSED_BEAMFORMING_AND_CQI, HE_COMPRESSED_BEAMFORMING_AND_CQI,
16427
        "HE Compressed Beamforming And CQI" },
16428
  { HE_QUIET_TIME_PERIOD, HE_QUIET_TIME_PERIOD,
16429
        "Quiet Time Period" },
16430
  { HE_QUIET_TIME_PERIOD + 1, 255, "Reserved" },
16431
  { 0, 0, NULL }
16432
};
16433
16434
3
#define HE_BSS_COLOR_CHANGE_ANNOUNCEMENT  0
16435
16436
static const range_string protected_he_action_rvals[] = {
16437
  { HE_BSS_COLOR_CHANGE_ANNOUNCEMENT, HE_BSS_COLOR_CHANGE_ANNOUNCEMENT,
16438
        "HE BSS Color Change Announcement" },
16439
  { HE_BSS_COLOR_CHANGE_ANNOUNCEMENT + 1, 255, "Reserved" },
16440
  { 0, 0, NULL }
16441
};
16442
16443
118
#define EHT_TID_LINK_MAP_REQ            0
16444
34
#define EHT_TID_LINK_MAP_RESP           1
16445
26
#define EHT_TID_LINK_MAP_TEAR_DOWN      2
16446
3
#define EHT_EPCS_PRIO_ACCESS_REQ        3
16447
16
#define EHT_EPCS_PRIO_ACCESS_RESP       4
16448
12
#define EHT_EPCS_PRIO_ACCESS_TEAR_DOWN  5
16449
17
#define EHT_EML_OP_MODE_NOTIFICATION    6
16450
14
#define EHT_LINK_RECOMMENDATION         7
16451
14
#define EHT_MULTI_LINK_OP_UPDATE_REQ    8
16452
1
#define EHT_MULTI_LINK_OP_UPDATE_RESP   9
16453
3
#define EHT_LINK_RECONFIG_NOTIFY       10
16454
5
#define EHT_LINK_RECONFIG_REQ          11
16455
19
#define EHT_LINK_RECONFIG_RESP         12
16456
16457
static const range_string protected_eht_action_rvals[] = {
16458
  { EHT_TID_LINK_MAP_REQ, EHT_TID_LINK_MAP_REQ,
16459
        "EHT TID-to-Link Mapping Request" },
16460
  { EHT_TID_LINK_MAP_RESP, EHT_TID_LINK_MAP_RESP,
16461
        "EHT TID-to-Link Mapping Response" },
16462
  { EHT_TID_LINK_MAP_TEAR_DOWN, EHT_TID_LINK_MAP_TEAR_DOWN,
16463
        "EHT TID-to-Link Mapping Teardown" },
16464
  { EHT_EPCS_PRIO_ACCESS_REQ, EHT_EPCS_PRIO_ACCESS_REQ,
16465
        "EHT EPCS Priority Access Request" },
16466
  { EHT_EPCS_PRIO_ACCESS_RESP, EHT_EPCS_PRIO_ACCESS_RESP,
16467
        "EHT EPCS Priority Access Response" },
16468
  { EHT_EPCS_PRIO_ACCESS_TEAR_DOWN, EHT_EPCS_PRIO_ACCESS_TEAR_DOWN,
16469
        "EHT EPCS Priority Access Teardown" },
16470
  { EHT_EML_OP_MODE_NOTIFICATION, EHT_EML_OP_MODE_NOTIFICATION,
16471
        "EHT EML Operating Mode Notification" },
16472
  { EHT_LINK_RECOMMENDATION, EHT_LINK_RECOMMENDATION,
16473
        "EHT Link Recommendation" },
16474
  { EHT_MULTI_LINK_OP_UPDATE_REQ, EHT_MULTI_LINK_OP_UPDATE_REQ,
16475
        "EHT Multi-Link Operation Update Request" },
16476
  { EHT_MULTI_LINK_OP_UPDATE_RESP, EHT_MULTI_LINK_OP_UPDATE_RESP,
16477
        "EHT Multi-Link Operation Update Response" },
16478
  { EHT_LINK_RECONFIG_NOTIFY, EHT_LINK_RECONFIG_NOTIFY,
16479
        "EHT Link Reconfiguration Notify" },
16480
  { EHT_LINK_RECONFIG_REQ, EHT_LINK_RECONFIG_REQ,
16481
        "EHT Link Reconfiguration Request" },
16482
  { EHT_LINK_RECONFIG_RESP, EHT_LINK_RECONFIG_RESP,
16483
        "EHT Link Reconfiguration Response" },
16484
  { EHT_LINK_RECONFIG_RESP + 1, 255, "Reserved" },
16485
  { 0, 0, NULL }
16486
};
16487
16488
/*
16489
 * This currently only works for SU, 20MHz, 40MHz and 80MHz and grouping 4 and 16.
16490
 */
16491
struct scidx_start_end {
16492
  int start;
16493
  int end;
16494
};
16495
16496
290
#define N_SCIDX_20MHZ_NG4 9
16497
static const struct scidx_start_end scidx_20MHz_Ng4[N_SCIDX_20MHZ_NG4] = {
16498
  { -122, -96 },
16499
  { -96, -68 },
16500
  { -68, -40 },
16501
  { -44, -16 },
16502
  { -16, 16 },
16503
  { 16, 44 },
16504
  { 40, 68 },
16505
  { 68, 96 },
16506
  { 96, 122 }
16507
};
16508
16509
515
#define N_SCIDX_20MHZ_NG16 9
16510
static const struct scidx_start_end scidx_20MHz_Ng16[9] = {
16511
  { -122, -84 },
16512
  { -96, -64 },
16513
  { -80, -32 },
16514
  { -52, -4 },
16515
  { -20, 20 },
16516
  { 4, 52 },
16517
  { 32, 80 },
16518
  { 64, 96 },
16519
  { 84, 122 }
16520
};
16521
16522
168
#define N_SCIDX_40MHZ_NG4 18
16523
static const struct scidx_start_end scidx_40MHz_Ng4[N_SCIDX_40MHZ_NG4] = {
16524
  { -500 + 256, -472 + 256 },
16525
  { -476 + 256, -448 + 256 },
16526
  { -488 + 256, -420 + 256 },
16527
  { -420 + 256, -392 + 256 },
16528
  { -392 + 256, -364 + 256 },
16529
  { -368 + 256, -340 + 256 },
16530
  { -340 + 256, -312 + 256 },
16531
  { -312 + 256, -284 + 256 },
16532
  { -288 + 256, -260 + 256 },
16533
  {  260 - 256,  288 - 256 },
16534
  {  284 - 256,  312 - 256 },
16535
  {  312 - 256,  340 - 256 },
16536
  {  340 - 256,  368 - 256 },
16537
  {  364 - 256,  392 - 256 },
16538
  {  392 - 256,  420 - 256 },
16539
  {  420 - 256,  448 - 256 },
16540
  {  448 - 256,  476 - 256 },
16541
  {  472 - 256,  500 - 256 }
16542
};
16543
16544
54
#define N_SCIDX_40MHZ_NG16 18
16545
static const struct scidx_start_end scidx_40MHz_Ng16[N_SCIDX_40MHZ_NG16] = {
16546
  { -500 + 256, -468 + 256 },
16547
  { -484 + 256, -436 + 256 },
16548
  { -452 + 256, -420 + 256 },
16549
  { -420 + 256, -388 + 256 },
16550
  { -404 + 256, -356 + 256 },
16551
  { -372 + 256, -340 + 256 },
16552
  { -340 + 256, -308 + 256 },
16553
  { -324 + 256, -276 + 256 },
16554
  { -292 + 256, -260 + 245 },
16555
  {  260 - 256,  292 - 256 },
16556
  {  276 - 256,  324 - 256 },
16557
  {  308 - 256,  340 - 256 },
16558
  {  340 - 256,  322 - 256 },
16559
  {  356 - 256,  404 - 256 },
16560
  {  388 - 256,  420 - 256 },
16561
  {  420 - 256,  452 - 256 },
16562
  {  436 - 256,  484 - 256 },
16563
  {  468 - 256,  500 - 256 }
16564
};
16565
16566
154
#define N_SCIDX_80MHZ_NG4 37
16567
static const struct scidx_start_end scidx_80MHz_Ng4[N_SCIDX_80MHZ_NG4] = {
16568
  { -500, -472 },
16569
  { -476, -448 },
16570
  { -448, -420 },
16571
  { -420, -392 },
16572
  { -392, -364 },
16573
  { -368, -340 },
16574
  { -340, -312 },
16575
  { -312, -284 },
16576
  { -288, -260 },
16577
  { -260, -232 },
16578
  { -232, -204 },
16579
  { -204, -176 },
16580
  { -180, -152 },
16581
  { -152, -124 },
16582
  { -124,  -96 },
16583
  { -100,  -72 },
16584
  {  -72,  -44 },
16585
  {  -44,  -16 },
16586
  {  -16,   16 },
16587
  {   16,   44 },
16588
  {   44,   72 },
16589
  {   72,  100 },
16590
  {   96,  124 },
16591
  {  124,  152 },
16592
  {  152,  180 },
16593
  {  176,  204 },
16594
  {  204,  232 },
16595
  {  232,  260 },
16596
  {  260,  288 },
16597
  {  284,  312 },
16598
  {  312,  340 },
16599
  {  340,  368 },
16600
  {  364,  392 },
16601
  {  392,  420 },
16602
  {  420,  448 },
16603
  {  448,  476 },
16604
  {  472,  500 }
16605
};
16606
16607
192
#define N_SCIDX_80MHZ_NG16 37
16608
static const struct scidx_start_end scidx_80MHz_Ng16[N_SCIDX_80MHZ_NG16] = {
16609
  { -500, -468 },
16610
  { -484, -436 },
16611
  { -452, -420 },
16612
  { -420, -388 },
16613
  { -404, -356 },
16614
  { -372, -340 },
16615
  { -340, -308 },
16616
  { -324, -276 },
16617
  { -292, -260 },
16618
  { -260, -228 },
16619
  { -244, -196 },
16620
  { -212, -164 },
16621
  { -180, -148 },
16622
  { -164, -116 },
16623
  { -132,  -84 },
16624
  { -100,  -68 },
16625
  {  -84,  -36 },
16626
  {  -52,   -4 },
16627
  {  -20,   20 },
16628
  {    4,   52 },
16629
  {   36,   84 },
16630
  {   68,  100 },
16631
  {   84,  132 },
16632
  {  116,  164 },
16633
  {  148,  180 },
16634
  {  164,  212 },
16635
  {  196,  244 },
16636
  {  228,  260 },
16637
  {  260,  292 },
16638
  {  276,  324 },
16639
  {  308,  340 },
16640
  {  340,  372 },
16641
  {  356,  404 },
16642
  {  388,  420 },
16643
  {  420,  452 },
16644
  {  436,  484 },
16645
  {  468,  500 },
16646
};
16647
16648
32
#define SU_FEEDBACK (0)
16649
52
#define MU_FEEDBACK (1)
16650
0
#define CQI_FEEDBACK (2)
16651
#define RESERVED_FEEDBACK (3)
16652
16653
945
#define BW_20MHz (0)
16654
123
#define BW_40MHz (1)
16655
190
#define BW_80MHz (2)
16656
2
#define BW_160MHz (3)
16657
16658
1.47k
#define SCIDX_END_SENTINAL (0x80000000)
16659
16660
static int
16661
next_he_scidx(int scidx, int bw _U_, int grouping _U_, int feedback _U_,
16662
              int ru_start_index, int ru_end_index)
16663
641
{
16664
641
  int incr = 4;
16665
16666
  /*
16667
   * We need to check the correct bw value to determine if we have hit
16668
   * the end of the range of SCIDXes.
16669
   */
16670
641
  switch (bw) {
16671
384
  case BW_20MHz:
16672
384
    if (grouping == 0) {
16673
137
      if (ru_end_index >= N_SCIDX_20MHZ_NG4 ||
16674
137
          scidx == scidx_20MHz_Ng4[ru_end_index].end)  /* we returned the max */
16675
2
        return SCIDX_END_SENTINAL;
16676
247
    } else {
16677
247
      if (ru_end_index >= N_SCIDX_20MHZ_NG16 ||
16678
247
          scidx == scidx_20MHz_Ng16[ru_end_index].end)
16679
5
        return SCIDX_END_SENTINAL;
16680
247
    }
16681
377
    break;
16682
377
  case BW_40MHz:
16683
99
    if (grouping == 0) {
16684
76
      if (ru_end_index >= N_SCIDX_40MHZ_NG4 ||
16685
76
          scidx == scidx_40MHz_Ng4[ru_end_index].end)
16686
4
        return SCIDX_END_SENTINAL;
16687
76
    } else {
16688
23
      if (ru_end_index >= N_SCIDX_40MHZ_NG16 ||
16689
23
          scidx == scidx_40MHz_Ng16[ru_end_index].end)
16690
2
        return SCIDX_END_SENTINAL;
16691
23
    }
16692
93
    break;
16693
156
  case BW_80MHz:
16694
156
    if (grouping == 0) {
16695
69
      if (ru_end_index >= N_SCIDX_80MHZ_NG4 ||
16696
69
          scidx == scidx_80MHz_Ng4[ru_end_index].end)
16697
3
        return SCIDX_END_SENTINAL;
16698
87
    } else {
16699
87
      if (ru_end_index >= N_SCIDX_80MHZ_NG16 ||
16700
87
          scidx == scidx_80MHz_Ng16[ru_end_index].end)
16701
4
        return SCIDX_END_SENTINAL;
16702
87
    }
16703
149
    break;
16704
149
  case BW_160MHz:
16705
2
    return SCIDX_END_SENTINAL;
16706
641
  }
16707
16708
  /*
16709
   * Check if this is the first time though and figure out the starting
16710
   * SCIDX.
16711
   */
16712
619
  if (scidx == (int)SCIDX_END_SENTINAL)
16713
95
    switch (bw) {
16714
37
    case BW_20MHz:
16715
37
      if (grouping == 0) {
16716
16
        if (ru_start_index >= N_SCIDX_20MHZ_NG4)
16717
2
          return SCIDX_END_SENTINAL;
16718
14
        else
16719
14
          return scidx_20MHz_Ng4[ru_start_index].start;
16720
21
      } else {
16721
21
        if (ru_start_index >= N_SCIDX_20MHZ_NG16)
16722
1
          return SCIDX_END_SENTINAL;
16723
20
        else
16724
20
          return scidx_20MHz_Ng16[ru_start_index].start;
16725
21
      }
16726
24
    case BW_40MHz:
16727
24
      if (grouping == 0) {
16728
16
        if (ru_start_index >= N_SCIDX_40MHZ_NG4)
16729
2
          return SCIDX_END_SENTINAL;
16730
14
        else
16731
14
          return scidx_40MHz_Ng4[ru_start_index].start;
16732
16
      } else {
16733
8
        if (ru_start_index >= N_SCIDX_40MHZ_NG16)
16734
2
          return SCIDX_END_SENTINAL;
16735
6
        else
16736
6
          return scidx_40MHz_Ng16[ru_start_index].start;
16737
8
      }
16738
34
    case BW_80MHz:
16739
34
      if (grouping == 0) {
16740
16
        if (ru_start_index >= N_SCIDX_80MHZ_NG4)
16741
1
          return SCIDX_END_SENTINAL;
16742
15
        else
16743
15
          return scidx_80MHz_Ng4[ru_start_index].start;
16744
18
      } else {
16745
18
        if (ru_start_index >= N_SCIDX_80MHZ_NG16)
16746
2
          return SCIDX_END_SENTINAL;
16747
16
        else
16748
16
          return scidx_80MHz_Ng16[ru_start_index].start;
16749
18
      }
16750
0
    case BW_160MHz:
16751
0
      return SCIDX_END_SENTINAL;
16752
95
  }
16753
16754
  /*
16755
   * for BW_20MHz it is more complex, and the start and end sets have an
16756
   * increment of 2, and around zero they go -4, -2, 2, 4 as well.
16757
   */
16758
524
  if (bw == BW_20MHz) {
16759
340
    if (grouping == 0) {
16760
119
      if (scidx == -122)
16761
2
        return -120;
16762
117
      if (scidx == -4)
16763
7
        return -2;
16764
110
      if (scidx == 2)
16765
6
        return 4;
16766
104
      if (scidx == 120)
16767
1
        return 122;
16768
221
    } else {
16769
221
      if (scidx == -122)
16770
2
        return -116;
16771
219
      if (scidx == -4)
16772
2
        return -2;
16773
217
      if (scidx == -2)
16774
1
        return 2;
16775
216
      if (scidx == 2)
16776
1
        return 4;
16777
215
      if (scidx == 116)
16778
1
        return 122;
16779
215
    }
16780
340
  }
16781
16782
501
  if (grouping == 1)
16783
292
    incr = 16;
16784
16785
501
  scidx += incr;
16786
16787
501
  if (scidx == 0)  /* Not sure if this is needed */
16788
4
    scidx += incr;
16789
16790
501
  return scidx;
16791
524
}
16792
16793
/*
16794
 * This might have a problem if there are not enough bits in the TVB.
16795
 * Will only handle a limited number of bits.
16796
 */
16797
static uint16_t
16798
he_get_bits(tvbuff_t *tvb, int bit_offset, int bit_len)
16799
91.6k
{
16800
91.6k
  uint32_t bits;
16801
91.6k
  int byte_offset = bit_offset / 8;
16802
91.6k
  int bit_start = bit_offset % 8;
16803
91.6k
  int bit_mask = (1 << bit_len) - 1;  /* Select that many bits */
16804
91.6k
  int remaining_length = tvb_reported_length_remaining(tvb, byte_offset);
16805
16806
91.6k
  if (remaining_length >= 3)
16807
90.5k
    bits = tvb_get_letoh24(tvb, byte_offset);
16808
1.16k
  else if (remaining_length == 2)
16809
475
    bits = tvb_get_letohs(tvb, byte_offset);
16810
685
  else
16811
685
    bits = tvb_get_uint8(tvb, byte_offset);
16812
16813
91.6k
  bits = bits >> bit_start;
16814
16815
91.6k
  return bits & bit_mask;
16816
91.6k
}
16817
16818
static int
16819
dissect_he_feedback_matrix(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
16820
                           int offset, int bit_offset, int scidx,
16821
                           int nr, int nc, int phi_bits, int psi_bits,
16822
                           int hf)
16823
8.95k
{
16824
8.95k
  int ri, ci;
16825
8.95k
  int start_bit_offset = bit_offset;
16826
8.95k
  int start_offset = offset;
16827
8.95k
  wmem_strbuf_t *angles = wmem_strbuf_new(pinfo->pool, NULL);
16828
16829
8.95k
  if (nc == nr)  /* If they are the same, reduce Nc by one */
16830
1.88k
    nc -= 1;
16831
16832
8.95k
  wmem_strbuf_append_printf(angles, "%d", scidx);
16833
  /* Reset to the start bit offset */
16834
8.95k
  bit_offset = start_bit_offset;
16835
16836
49.7k
  for (ci = 1; ci <= nc; ci++) {
16837
86.8k
    for (ri = ci; ri < nr; ri++) {
16838
46.1k
      int angle = he_get_bits(tvb, bit_offset, phi_bits);
16839
46.1k
      wmem_strbuf_append_printf(angles, ", φ%d%d:%d", ri, ci, angle);
16840
46.1k
      bit_offset += phi_bits;
16841
46.1k
    }
16842
86.3k
    for (ri = ci + 1; ri <= nr; ri++) {
16843
45.5k
      int angle = he_get_bits(tvb, bit_offset, psi_bits);
16844
45.5k
      wmem_strbuf_append_printf(angles, ", ψ%d%d:%d", ri, ci, angle);
16845
45.5k
      bit_offset += psi_bits;
16846
45.5k
    }
16847
40.7k
  }
16848
16849
  /* Update this */
16850
8.95k
  proto_tree_add_string(tree, hf, tvb, offset,
16851
8.95k
                        ((start_bit_offset + 7) / 8) - start_offset,
16852
8.95k
                        wmem_strbuf_get_str(angles));
16853
16854
8.95k
  return bit_offset;
16855
8.95k
}
16856
16857
static int * const he_mimo_control_headers[] = {
16858
  &hf_ieee80211_he_mimo_control_nc_index,
16859
  &hf_ieee80211_he_mimo_control_nr_index,
16860
  &hf_ieee80211_he_mimo_control_bw,
16861
  &hf_ieee80211_he_mimo_control_grouping,
16862
  &hf_ieee80211_he_mimo_control_codebook_info,
16863
  &hf_ieee80211_he_mimo_control_feedback_type,
16864
  &hf_ieee80211_he_mimo_control_remaining_feedback_segs,
16865
  &hf_ieee80211_he_mimo_control_first_feedback_seg,
16866
  &hf_ieee80211_he_mimo_control_ru_start_index,
16867
  &hf_ieee80211_he_mimo_control_ru_end_index,
16868
  &hf_ieee80211_he_mimo_control_sounding_dialog_token_num,
16869
  &hf_ieee80211_he_mimo_control_reserved,
16870
  NULL
16871
};
16872
16873
/*
16874
 * Handle compressed beamforming matrices and CQI
16875
 */
16876
static unsigned
16877
dissect_compressed_beamforming_and_cqi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
16878
110
{
16879
110
  int byte_count = 0;
16880
110
  uint64_t mimo_cntl = tvb_get_letoh40(tvb, offset);
16881
110
  int nc = 0, nr = 0, i;
16882
110
  int bw, grouping, codebook, feedback, bit_offset, scidx;
16883
110
  int phi_bits = 0, psi_bits = 0;
16884
110
  proto_tree *snr_tree = NULL, *feedback_tree = NULL;
16885
110
  int start_offset;
16886
110
  int ru_start_index, ru_end_index;
16887
16888
110
  nc = (int)((mimo_cntl & 0x07) + 1);
16889
110
  nr = (int)(((mimo_cntl >> 3) & 0x07) + 1);
16890
110
  bw = (int)((mimo_cntl >> 6) & 0x03);
16891
110
  grouping = (int)((mimo_cntl >> 8) & 0x01);
16892
110
  codebook = (int)((mimo_cntl >> 9) & 0x01);
16893
110
  feedback = (int)((mimo_cntl >> 10) & 0x03);
16894
110
  ru_start_index = (int)((mimo_cntl >> 16) & 0x7F);
16895
110
  ru_end_index = (int)((mimo_cntl >> 23) & 0x7F);
16896
16897
110
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
16898
110
    hf_ieee80211_he_mimo_control_field, ett_ff_he_mimo_control,
16899
110
    he_mimo_control_headers, ENC_LITTLE_ENDIAN,
16900
110
    BMT_NO_APPEND);
16901
110
  offset += 5;
16902
16903
110
  snr_tree = proto_tree_add_subtree(tree, tvb, offset, nc,
16904
110
                ett_ff_he_mimo_beamforming_report_snr, NULL,
16905
110
                "Average Signal to Noise Ratio");
16906
16907
705
  for (i = 0; i < nc; i++) {
16908
595
    int8_t snr = tvb_get_int8(tvb, offset);
16909
16910
595
    proto_tree_add_int_format(snr_tree,
16911
595
        hf_ieee80211_he_compressed_beamforming_report_snr, tvb, offset, 1,
16912
595
        snr, "Stream %d: %s%0.2fdB (0x%02x)", i, (snr == 127 ? ">=" :
16913
595
                                                  (snr == -128 ? "<=" : "")),
16914
595
                                             (float)((float)88 + snr)/4,
16915
595
                                             (uint8_t)snr);
16916
595
    offset++;
16917
595
  }
16918
16919
  /*
16920
   * The rest of the data consists of the compressed beamforming matrices, one
16921
   * for each SCIDX per group. Each matrix consists of phi and psi angles
16922
   * encoded using the number of bits specified using the codebook field.
16923
   *
16924
   * The matrices contain a number entries related to Nr -1 & Nc except when
16925
   * Nr == Nc, and then it is Nr -1 x Nc -1, with Nr - 1 phi angles, Nc - 1
16926
   * psi angles, Nr - 2 phi angles, Nc - 2 psi angles ...
16927
   */
16928
110
  if (feedback == 0) {  /* SU */
16929
68
    if (codebook == 0) {
16930
48
      psi_bits = 2; phi_bits = 4;
16931
48
    } else {
16932
20
      psi_bits = 4; phi_bits = 6;
16933
20
    }
16934
68
  } else if (feedback == 1) { /* MU */
16935
28
    if (grouping == 1) {
16936
11
      psi_bits = 9; phi_bits = 7;
16937
17
    } else {
16938
17
      if (codebook == 0) {
16939
14
        psi_bits = 5; phi_bits = 7;
16940
14
      } else {
16941
3
        psi_bits = 7; phi_bits = 9;
16942
3
      }
16943
17
    }
16944
28
  }  /* DO something about CQI etc. */
16945
16946
110
  feedback_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
16947
110
                        ett_ff_he_mimo_feedback_matrices, NULL,
16948
110
                        "Feedback Matrices");
16949
16950
110
  start_offset = offset;
16951
110
  bit_offset = offset * 8;
16952
110
  scidx = SCIDX_END_SENTINAL;
16953
714
  while ((scidx = next_he_scidx(scidx, bw, grouping, feedback,
16954
714
          ru_start_index, ru_end_index)) != (int)SCIDX_END_SENTINAL) {
16955
609
    int prev_bit_offset = bit_offset;
16956
609
    bit_offset = dissect_he_feedback_matrix(feedback_tree, tvb, pinfo, offset,
16957
609
                        bit_offset, scidx, nr, nc, phi_bits, psi_bits,
16958
609
                        hf_ieee80211_he_compressed_beamform_scidx);
16959
609
    if (bit_offset <= prev_bit_offset) {
16960
5
      expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
16961
5
      break;
16962
5
    }
16963
16964
604
    offset = bit_offset / 8;
16965
604
  }
16966
16967
110
  offset = (bit_offset + 7) / 8;
16968
110
  proto_item_set_len(feedback_tree, offset - start_offset);
16969
16970
  /* Sometimes the FCS is in the buffer as well ... */
16971
110
  byte_count = tvb_reported_length_remaining(tvb, offset);
16972
110
  if (byte_count > 0)
16973
36
    offset += byte_count; /* Should fix the real problem */
16974
16975
110
  return offset;
16976
110
}
16977
16978
enum quiet_time_period_control {
16979
  QTP_CONTROL_SETUP = 0,
16980
  QTP_CONTROL_REQUEST = 1,
16981
  QTP_CONTROL_RESPONSE = 2,
16982
};
16983
16984
static const range_string quiet_time_period_control_rvals[] = {
16985
  { QTP_CONTROL_SETUP,    QTP_CONTROL_SETUP,    "Quiet Time Period Setup" },
16986
  { QTP_CONTROL_REQUEST,  QTP_CONTROL_REQUEST,  "Quiet Time Period Request" },
16987
  { QTP_CONTROL_RESPONSE, QTP_CONTROL_RESPONSE, "Quiet Time Period Response" },
16988
  { QTP_CONTROL_RESPONSE +1 , 255, "Reserved" },
16989
  { 0, 0, NULL }
16990
};
16991
16992
static void
16993
dissect_bss_color_change(tvbuff_t *tvb, packet_info *pinfo _U_,
16994
proto_tree *tree, int offset, int len _U_);
16995
16996
static unsigned
16997
dissect_quiet_time_period(tvbuff_t *tvb, packet_info *pinfo _U_,
16998
proto_tree *tree, int offset, int len _U_)
16999
36
{
17000
36
  uint8_t control = tvb_get_uint8(tvb, offset);
17001
17002
36
  proto_tree_add_item(tree, hf_ieee80211_he_qtp_control, tvb, offset, 1, ENC_NA);
17003
36
  offset += 1;
17004
17005
36
  switch (control)
17006
36
  {
17007
12
  case QTP_CONTROL_SETUP:
17008
12
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_setup_quiet_period_duration, tvb, offset,
17009
12
                1, ENC_NA);
17010
12
    offset += 1;
17011
12
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_setup_srv_specific_identif, tvb, offset,
17012
12
                2, ENC_LITTLE_ENDIAN);
17013
12
    offset += 2;
17014
12
    break;
17015
17016
4
  case QTP_CONTROL_REQUEST:
17017
4
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_request_dialog_token, tvb, offset, 2,
17018
4
                ENC_LITTLE_ENDIAN);
17019
4
    offset += 2;
17020
4
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_request_quiet_period_offset, tvb, offset,
17021
4
                1, ENC_NA);
17022
4
    offset += 1;
17023
4
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_request_quiet_period_duration, tvb, offset,
17024
4
                2, ENC_LITTLE_ENDIAN);
17025
4
    offset += 2;
17026
4
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_request_quiet_period_interval, tvb, offset,
17027
4
                1, ENC_NA);
17028
4
    offset += 1;
17029
4
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_request_repetition_count, tvb, offset, 1,
17030
4
                ENC_NA);
17031
4
    offset += 1;
17032
4
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_request_srv_specific_identif, tvb, offset,
17033
4
                2, ENC_LITTLE_ENDIAN);
17034
4
    offset += 2;
17035
4
    break;
17036
17037
2
  case QTP_CONTROL_RESPONSE:
17038
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_dialog_token, tvb, offset, 2,
17039
2
                ENC_LITTLE_ENDIAN);
17040
2
    offset += 2;
17041
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_status_code, tvb, offset, 1,
17042
2
                ENC_NA);
17043
2
    offset += 1;
17044
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_quiet_period_offset, tvb, offset,
17045
2
                1, ENC_NA);
17046
2
    offset += 1;
17047
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_quiet_period_duration, tvb, offset,
17048
2
                2, ENC_LITTLE_ENDIAN);
17049
2
    offset += 2;
17050
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_quiet_period_interval, tvb, offset,
17051
2
                1, ENC_NA);
17052
2
    offset += 1;
17053
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_repetition_count, tvb, offset,
17054
2
                1, ENC_NA);
17055
2
    offset += 1;
17056
2
    proto_tree_add_item(tree, hf_ieee80211_he_qtp_response_srv_specific_identif, tvb, offset,
17057
2
                2, ENC_LITTLE_ENDIAN);
17058
2
    offset += 2;
17059
2
    break;
17060
17061
18
  default:
17062
    /* Reserved */
17063
18
    break;
17064
36
  }
17065
17066
35
  return offset;
17067
36
}
17068
17069
static unsigned
17070
add_ff_action_he(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
17071
118
{
17072
118
  unsigned start = offset;
17073
118
  uint8_t he_action;
17074
118
  uint8_t length;
17075
  //uint8_t elem_id, elem_id_extension;
17076
118
  proto_item *item;
17077
118
  proto_tree *subtree;
17078
118
  unsigned int len = tvb_reported_length_remaining(tvb, offset);
17079
17080
118
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
17081
17082
118
  he_action = tvb_get_uint8(tvb, offset);
17083
17084
118
  item = proto_tree_add_item(tree, hf_ieee80211_ff_he_action, tvb, offset, 1, ENC_NA);
17085
118
  offset += 1;
17086
17087
118
  subtree = proto_item_add_subtree(item, ett_ff_he_action);
17088
17089
17090
118
  switch (he_action) {
17091
110
  case HE_COMPRESSED_BEAMFORMING_AND_CQI:
17092
110
    proto_tree_add_uint_format(subtree, hf_ieee80211_he_beamforming_report_len,
17093
110
        tvb, offset, 0, len, "Total length: %u", len);
17094
110
    offset = dissect_compressed_beamforming_and_cqi(subtree, tvb, pinfo, offset);
17095
110
    break;
17096
17097
5
  case HE_QUIET_TIME_PERIOD:
17098
    //elem_id = tvb_get_uint8(tvb, offset);
17099
5
    length = tvb_get_uint8(tvb, offset + 1);
17100
    //elem_id_extension = tvb_get_uint8(tvb, offset + 2);
17101
    /* Should check following condition?
17102
     * elem_id == TAG_ELEMENT_ID_EXTENSION && elem_id_extension == ETAG_QUIET_TIME_PERIOD
17103
     */
17104
5
    offset = dissect_quiet_time_period(tvb, pinfo, subtree, offset + 3, length);
17105
5
    break;
17106
17107
3
  default:
17108
3
    break;
17109
118
  }
17110
45
  return offset - start;
17111
118
}
17112
17113
static unsigned
17114
add_ff_action_protected_he(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
17115
5
{
17116
5
  unsigned start = offset;
17117
5
  uint8_t protected_he_action;
17118
5
  uint8_t length;
17119
  //uint8_t elem_id, elem_id_extension;
17120
5
  proto_item *item;
17121
5
  proto_tree *subtree;
17122
17123
5
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
17124
17125
5
  protected_he_action = tvb_get_uint8(tvb, offset);
17126
17127
5
  item = proto_tree_add_item(tree, hf_ieee80211_ff_protected_he_action, tvb, offset,
17128
5
        1, ENC_NA);
17129
5
  offset += 1;
17130
17131
5
  subtree = proto_item_add_subtree(item, ett_ff_protected_he_action);
17132
17133
17134
5
  switch (protected_he_action) {
17135
3
  case HE_BSS_COLOR_CHANGE_ANNOUNCEMENT:
17136
    //elem_id = tvb_get_uint8(tvb, offset);
17137
3
    length = tvb_get_uint8(tvb, offset + 1);
17138
    //elem_id_extension = tvb_get_uint8(tvb, offset + 2);
17139
    /* Should check following condition?
17140
     * elem_id == TAG_ELEMENT_ID_EXTENSION && elem_id_extension == ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT
17141
     */
17142
3
    dissect_bss_color_change(tvb, pinfo, subtree, offset + 3, length);
17143
3
    offset += 5;
17144
3
    break;
17145
17146
2
  default:
17147
2
    break;
17148
5
  }
17149
17150
5
  return offset - start;
17151
5
}
17152
17153
static unsigned
17154
add_ff_action_protected_ftm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
17155
2
{
17156
2
  unsigned start = offset;
17157
2
  uint8_t action;
17158
17159
2
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
17160
2
  action = tvb_get_uint8(tvb, offset);
17161
2
  proto_tree_add_item(tree, hf_ieee80211_ff_protected_ftm_action, tvb, offset, 1, ENC_NA);
17162
2
  offset += 1;
17163
17164
2
  col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(action, protected_ftm_action_vals, "Unknown"));
17165
17166
2
  switch (action) {
17167
0
    case 1:
17168
0
      offset += add_ff_ftm_request(tree, tvb, pinfo, offset);
17169
0
      break;
17170
0
    case 2:
17171
0
      offset += add_ff_ftm(tree, tvb, pinfo, offset);
17172
0
      break;
17173
0
    case 3:
17174
0
      offset += add_ff_lmr_report(tree, tvb, pinfo, offset);
17175
0
      break;
17176
2
    default:  /* reserved */
17177
2
      break;
17178
2
  }
17179
17180
2
  return offset - start;
17181
2
}
17182
17183
static int * const eht_reconfig_link_id_hdrs[] = {
17184
  &hf_ieee80211_eht_reconfig_link_id,
17185
  &hf_ieee80211_eht_reconfig_link_id_reserved,
17186
  NULL
17187
};
17188
17189
static unsigned
17190
add_ff_count(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
17191
19
{
17192
19
  proto_tree_add_item(tree, hf_ieee80211_ff_count, tvb, offset, 1,
17193
19
                      ENC_LITTLE_ENDIAN);
17194
19
  return 1;
17195
19
}
17196
17197
static unsigned
17198
add_ff_action_protected_eht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
17199
498
{
17200
498
  unsigned start = offset;
17201
498
  uint8_t protected_eht_action;
17202
498
  proto_item *item;
17203
498
  int len = 0, count, i, id;
17204
498
  uint16_t status;
17205
498
  bool invalid = false;
17206
  /* Default Extension Element is Multi-Link */
17207
498
  uint8_t ext_ids[1] = {ETAG_MULTI_LINK};
17208
498
  proto_tree *sub_tree;
17209
17210
498
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
17211
17212
498
  protected_eht_action = tvb_get_uint8(tvb, offset);
17213
17214
498
  item = proto_tree_add_item(tree, hf_ieee80211_ff_protected_eht_action, tvb,
17215
498
                             offset, 1, ENC_NA);
17216
498
  offset += 1;
17217
17218
498
  switch (protected_eht_action) {
17219
118
  case EHT_TID_LINK_MAP_REQ:
17220
118
    ext_ids[0] = ETAG_TID_TO_LINK_MAPPING;
17221
118
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17222
17223
    /*
17224
     * Next contains one or two TID-To-Link mappings. We have to look into
17225
     * the elements to verify them because we don't have the length of this
17226
     * element and there might be other IEs after us.
17227
     */
17228
118
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17229
118
      len = tvb_get_uint8(tvb, offset + 1);
17230
118
    } else {
17231
0
      invalid = true;
17232
0
    }
17233
118
    if (!invalid && (len >= 1) &&
17234
118
        (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17235
68
         0, false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) > 0)) {
17236
49
      offset += len + 2;
17237
69
    } else {
17238
69
      invalid = true;
17239
69
    }
17240
118
    if (invalid) {
17241
50
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17242
50
                             "Invalid TID_TO_LINK_MAPPING_REQUEST. "
17243
50
                             "There should be one or two Tid-To-Link IEs "
17244
50
                             "but none found");
17245
50
      break;
17246
50
    }
17247
17248
68
    len = 0;
17249
68
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17250
43
      len = tvb_get_uint8(tvb, offset + 1);
17251
43
    }
17252
68
    if ((len >= 1) &&
17253
68
        (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17254
27
         0, false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) > 0)) {
17255
19
      offset += len + 2;
17256
19
    }
17257
68
    break;
17258
34
  case EHT_TID_LINK_MAP_RESP:
17259
34
    ext_ids[0] = ETAG_TID_TO_LINK_MAPPING;
17260
34
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17261
17262
34
    status = tvb_get_ntohs(tvb, offset);
17263
34
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
17264
34
    if (status == 134) {
17265
      /* There should be one or two TID-To-Link mappings. */
17266
0
      if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17267
0
        len = tvb_get_uint8(tvb, offset + 1);
17268
0
      } else {
17269
0
        invalid = true;
17270
0
      }
17271
0
      if (!invalid && (len >= 1) &&
17272
0
          (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17273
0
           0, false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) > 0)) {
17274
0
        offset += len + 2;
17275
0
      } else {
17276
0
        invalid = true;
17277
0
      }
17278
0
      if (invalid) {
17279
0
        expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17280
0
                               "Invalid TID_TO_LINK_MAPPING_RESPONSE. "
17281
0
                               "There should be one or two Tid-To-Link IEs "
17282
0
                               "but none found");
17283
0
        break;
17284
0
      }
17285
17286
0
      len = 0;
17287
0
      if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17288
0
        len = tvb_get_uint8(tvb, offset + 1);
17289
0
      }
17290
0
      if ((len >= 1) &&
17291
0
          (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17292
0
           0, false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) > 0)) {
17293
0
        offset += len + 2;
17294
0
      }
17295
0
    }
17296
34
    break;
17297
34
  case EHT_TID_LINK_MAP_TEAR_DOWN:
17298
    /* Seems to be nothing to do here */
17299
26
    break;
17300
3
  case EHT_EPCS_PRIO_ACCESS_REQ:
17301
3
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17302
3
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17303
3
      offset += add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0,
17304
3
                NULL, 0, FALSE, ext_ids, G_N_ELEMENTS(ext_ids), FALSE, NULL);
17305
3
    }
17306
3
    break;
17307
16
  case EHT_EPCS_PRIO_ACCESS_RESP:
17308
16
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17309
16
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
17310
16
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17311
16
      offset += add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0,
17312
16
                NULL, 0, FALSE, ext_ids, G_N_ELEMENTS(ext_ids), FALSE, NULL);
17313
16
    }
17314
16
    break;
17315
12
  case EHT_EPCS_PRIO_ACCESS_TEAR_DOWN:
17316
12
    break;
17317
17
  case EHT_EML_OP_MODE_NOTIFICATION:
17318
17
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17319
17
    offset += dissect_eht_eml_control_field(tree, tvb, pinfo, offset);
17320
17
    break;
17321
14
  case EHT_LINK_RECOMMENDATION:
17322
14
    offset += add_ff_reason_code(tree, tvb, pinfo, offset);
17323
14
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17324
14
      len = tvb_get_uint8(tvb, offset + 1);
17325
14
    } else {
17326
0
      invalid = true;
17327
0
    }
17328
14
    ext_ids[0] = ETAG_AID_BITMAP;
17329
14
    if (!invalid && (len >= 1) &&
17330
14
        (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17331
12
         0, false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) > 0)) {
17332
12
      offset += len + 2;
17333
12
    } else {
17334
2
      invalid = true;
17335
2
    }
17336
14
    if (invalid) {
17337
2
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17338
2
                             "Invalid LINK_RECOMMENDATION. "
17339
2
                             "There should be AID_BITMAP element "
17340
2
                             "but none found");
17341
2
      break;
17342
2
    }
17343
17344
12
    invalid = false;
17345
12
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17346
10
      len = tvb_get_uint8(tvb, offset + 1);
17347
10
    } else {
17348
2
      invalid = true;
17349
2
    }
17350
12
    ext_ids[0] = ETAG_MULTI_LINK_TRAFFIC;
17351
12
    if (!invalid && (len >= 1) &&
17352
12
        (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17353
8
         0, false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) > 0)) {
17354
5
      offset += len + 2;
17355
7
    } else {
17356
7
      invalid = true;
17357
7
    }
17358
12
    if (invalid) {
17359
4
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17360
4
                             "Invalid LINK_RECOMMENDATION. "
17361
4
                             "There should be MULTI_LINK_TRAFFIC element "
17362
4
                             "but none found");
17363
4
      break;
17364
4
    }
17365
8
    break;
17366
14
  case EHT_MULTI_LINK_OP_UPDATE_REQ:
17367
14
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17368
14
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17369
14
      len = tvb_get_uint8(tvb, offset + 1);
17370
14
    } else {
17371
0
      invalid = true;
17372
0
    }
17373
14
    if (!invalid && (len >= 1)) {
17374
8
      offset += add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0,
17375
8
                NULL, 0, FALSE, ext_ids, G_N_ELEMENTS(ext_ids), FALSE, NULL);
17376
8
    } else {
17377
6
      invalid = true;
17378
6
    }
17379
14
    if (invalid) {
17380
6
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17381
6
                             "Invalid Multi-Link Operation Update Request. "
17382
6
                             "There should be Reconf Multi-Link element "
17383
6
                             "but none found");
17384
6
      break;
17385
6
    }
17386
8
    break;
17387
8
  case EHT_MULTI_LINK_OP_UPDATE_RESP:
17388
1
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17389
1
    offset += add_ff_status_code(tree, tvb, pinfo, offset);
17390
1
    break;
17391
3
  case EHT_LINK_RECONFIG_NOTIFY:
17392
3
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17393
3
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17394
3
      len = tvb_get_uint8(tvb, offset + 1);
17395
3
    } else {
17396
0
      invalid = TRUE;
17397
0
    }
17398
3
    if (!invalid && (len >= 1)) {
17399
2
      offset += add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0,
17400
2
                NULL, 0, FALSE, ext_ids, G_N_ELEMENTS(ext_ids), FALSE, NULL);
17401
2
    } else {
17402
1
      invalid = TRUE;
17403
1
    }
17404
3
    if (invalid) {
17405
1
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17406
1
                             "Invalid Link Reconfiguration Notify. "
17407
1
                             "There should be Reconf Multi-Link element "
17408
1
                             "but none found");
17409
1
      break;
17410
1
    }
17411
2
    break;
17412
5
  case EHT_LINK_RECONFIG_REQ:
17413
5
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17414
5
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17415
5
      len = tvb_get_uint8(tvb, offset + 1);
17416
5
    } else {
17417
0
      invalid = TRUE;
17418
0
    }
17419
5
    if (!invalid && (len >= 1)) {
17420
4
      offset += add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0,
17421
4
                NULL, 0, FALSE, ext_ids, G_N_ELEMENTS(ext_ids), FALSE, NULL);
17422
4
    } else {
17423
1
      invalid = TRUE;
17424
1
    }
17425
5
    if (invalid) {
17426
1
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17427
1
                             "Invalid Link Reconfiguration Req. "
17428
1
                             "There should be Reconf Multi-Link element "
17429
1
                             "but none found");
17430
1
      break;
17431
1
    }
17432
4
    ext_ids[0] = ETAG_OCI;
17433
4
    if (tvb_captured_length_remaining(tvb, offset) >= 2) {
17434
4
      len = tvb_get_uint8(tvb, offset + 1);
17435
4
    } else {
17436
      /* OCI element field is optionally present */
17437
0
      break;
17438
0
    }
17439
4
    if (!invalid && (len >= 1) &&
17440
4
        (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, NULL,
17441
2
         0, FALSE, ext_ids, G_N_ELEMENTS(ext_ids), FALSE, NULL) > 0)) {
17442
2
      offset += len + 2;
17443
2
    } else {
17444
2
      invalid = TRUE;
17445
2
    }
17446
4
    if (invalid) {
17447
2
      expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17448
2
                             "Invalid Link Reconfiguration Req. "
17449
2
                             "There should be OCI element but none found");
17450
2
      break;
17451
2
    }
17452
2
    break;
17453
19
  case EHT_LINK_RECONFIG_RESP:
17454
19
    offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
17455
19
    count = tvb_get_uint8(tvb, offset);
17456
19
    offset += add_ff_count(tree, tvb, pinfo, offset);
17457
19
    if (count == 0)
17458
1
      break;
17459
17460
18
    sub_tree = proto_tree_add_subtree(tree, tvb, offset, count * 3,
17461
18
                                      ett_eht_reconfig_status_list, NULL,
17462
18
                                      "Reconfiguration Status List");
17463
541
    for (i = 0; i < count; i++) {
17464
523
      proto_tree_add_bitmask(sub_tree, tvb, offset,
17465
523
                             hf_ieee80211_eht_reconfig_link_id_info,
17466
523
                             ett_eht_multi_link_common_info_link_id,
17467
523
                             eht_reconfig_link_id_hdrs, ENC_NA);
17468
523
      offset += 1;
17469
523
      proto_tree_add_item(sub_tree, hf_ieee80211_eht_reconfig_status_code, tvb, offset, 2, ENC_LITTLE_ENDIAN);
17470
523
      offset += 2;
17471
523
    }
17472
17473
18
    if (tvb_captured_length_remaining(tvb, offset) <= 0)
17474
1
      break;
17475
17476
    /* Check next is Group Key Data */
17477
17
    id = tvb_get_uint8(tvb, offset);
17478
17
    if (id != 0xdd && id != 0xff) {
17479
5
      sub_tree = proto_tree_add_subtree(tree, tvb, offset, id,
17480
5
                                        ett_eht_group_key_data, NULL,
17481
5
                                        "Group Key Data");
17482
5
      proto_tree_add_item(sub_tree, hf_ieee80211_eht_group_key_data_length, tvb, offset, 1, ENC_NA);
17483
5
      offset += 1;
17484
5
      while (tvb_reported_length_remaining(tvb, offset)) {
17485
4
        id = tvb_get_uint8(tvb, offset);
17486
        /* Key Data should be MLO KDEs */
17487
4
        if (id != 0xdd)
17488
4
          break;
17489
0
        offset += add_tagged_field(pinfo, sub_tree, tvb, offset, 0, NULL, 0, NULL);
17490
0
      }
17491
5
    }
17492
17
    break;
17493
216
  default:
17494
216
    expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
17495
216
                           "Reserved Protected EHT Action %u",
17496
216
                           protected_eht_action);
17497
17498
216
    break;
17499
498
  }
17500
17501
453
  return offset - start;
17502
498
}
17503
17504
/*
17505
 * Structure for handling the EHT scidx info. Allows for a compact
17506
 * representation.
17507
 */
17508
struct scidx_part {
17509
  unsigned start_val;      /* What we start at                 */
17510
  bool use_ng;      /* Should we use Ng or the inc next */
17511
  unsigned inc;            /* The increment when not using Ng  */
17512
  unsigned stop_val;       /* When we should stop              */
17513
  bool last_ent;    /* This is the last one in the list */
17514
};
17515
17516
struct scidx_ctx {
17517
  uint8_t ru_index;
17518
  struct scidx_part *scidx_array;
17519
  uint8_t ng;
17520
  bool just_inited;
17521
  unsigned last_val;
17522
};
17523
17524
static struct scidx_part ru_242_tone_1_20MHz_ng4[] = {
17525
  { -122, false, 2, -120, false },
17526
  { -120, true,  0,   -4, false },
17527
  {   -2, false, 4,    2, false },
17528
  {    4, true,  0,  120, false },
17529
  {  120, false, 2,  122, true  }
17530
};
17531
17532
static struct scidx_part ru_242_tone_1_20MHz_ng16[] = {
17533
  { -122, false,  6, -116, false },
17534
  { -116, true,   0,   -4, false },
17535
  {   -2, false,  4,    2, false },
17536
  {    4, true,   0,  116, false },
17537
  {  116, false,  6,  122, true  }
17538
};
17539
17540
/* Here, there is one per RU index */
17541
/*Start, UseNg, Inc,End, last */
17542
static struct scidx_part ru_242_tone_40MHz[] = {
17543
  { -244, true, 0,   -4, true },
17544
  {    4, true, 0,  244, true }
17545
};
17546
17547
static struct scidx_part ru_242_tone_80MHz[] = {
17548
  { -500, true, 0, -260, true },
17549
  { -252, true, 0,  -12, true },
17550
  {   12, true, 0,  252, true },
17551
  {  260, true, 0,  500, true }
17552
};
17553
17554
static struct scidx_part ru_242_tone_160MHz[] = {
17555
  { -1012, true, 0, -772, true },
17556
  {  -764, true, 0, -524, true },
17557
  {  -500, true, 0, -260, true },
17558
  {  -252, true, 0,  -12, true },
17559
  {    12, true, 0,  252, true },
17560
  {   260, true, 0,  500, true },
17561
  {   524, true, 0,  764, true },
17562
  {   772, true, 0, 1012, true }
17563
};
17564
17565
static struct scidx_part ru_242_tone_320MHz[] = {
17566
  { -2036, true, 0, -1796, true },
17567
  { -1788, true, 0, -1548, true },
17568
  { -1524, true, 0, -1284, true },
17569
  { -1276, true, 0, -1036, true },
17570
  { -1012, true, 0,  -772, true },
17571
  {  -764, true, 0,  -524, true },
17572
  {  -500, true, 0,  -260, true },
17573
  {  -252, true, 0,   -12, true },
17574
  {    12, true, 0,   252, true },
17575
  {   260, true, 0,   500, true },
17576
  {   524, true, 0,   764, true },
17577
  {   772, true, 0,  1012, true },
17578
  {  1036, true, 0,  1276, true },
17579
  {  1284, true, 0,  1524, true },
17580
  {  1548, true, 0,  1788, true },
17581
  {  1796, true, 0,  2036, true }
17582
};
17583
17584
/* All these ru_96 tone sets for NG=4 go in pairs. */
17585
static struct scidx_part ru_996_tone_80MHz_ng4[] = {
17586
  { -500, false, 4,  -4, false },
17587
  {    4, false, 4, 500, true }
17588
};
17589
17590
static struct scidx_part ru_996_tone_80MHz_ng16[] = {
17591
  { -500,  true, 0, -260, false },
17592
  { -252,  true, 0,  -12, false },
17593
  {   -4, false, 8,    4, false },
17594
  {   12,  true, 0,  252, false },
17595
  {  260,  true, 0,  500,  true }
17596
};
17597
17598
static struct scidx_part ru_996_tone_160MHz_ng4[] = {
17599
  { -1012, true, 0, -516, false },
17600
  {  -508, true, 0,  -12,  true },
17601
17602
  {    12, true, 0,  508, false },
17603
  {   516, true, 0, 1012,  true }
17604
};
17605
17606
static struct scidx_part ru_996_tone_160MHz_ng16[] = {
17607
  { -1012,  true, 0, -772, false },
17608
  {  -764,  true, 0, -524, false },
17609
  {  -516, false, 8, -508, false },
17610
  {  -500,  true, 0, -260, false },
17611
  {  -252,  true, 0, -12 ,  true },
17612
17613
  {    12,  true, 0,  252, false },
17614
  {   260,  true, 0,  500, false },
17615
  {   508, false, 8,  516, false },
17616
  {   524,  true, 0,  764, false },
17617
  {   772,  true, 0, 1012,  true }
17618
};
17619
17620
static struct scidx_part ru_996_tone_320MHz_ng4[] = {
17621
  { -2036,  true, 0, -1540, false },
17622
  { -1532,  true, 0, -1036,  true },
17623
17624
  { -1012,  true, 0,  -516, false },
17625
  {  -508,  true, 0,   -12,  true },
17626
17627
  {    12,  true, 0,   508, false },
17628
  {   516,  true, 0,  1012,  true },
17629
17630
  {  1036,  true, 0,  1532, false },
17631
  {  1540,  true, 0,  2036,  true }
17632
};
17633
17634
static struct scidx_part ru_996_tone_320MHz_ng16[] = {
17635
  { -2036,  true, 0, -1796, false },
17636
  { -1788,  true, 0, -1548, false },
17637
  { -1540, false, 8, -1532, false },
17638
  { -1524,  true, 0, -1284, false },
17639
  { -1276,  true, 0, -1036,  true },
17640
17641
  { -1012,  true, 0,  -772, false },
17642
  {  -764,  true, 0,  -524, false },
17643
  {  -516, false, 8,  -508, false },
17644
  {  -500,  true, 0,  -260, false },
17645
  {  -252,  true, 0,   -12,  true },
17646
17647
  {    12,  true, 0,   252, false },
17648
  {   260,  true, 0,   500, false },
17649
  {   508, false, 8,   516, false },
17650
  {   524,  true, 0,   764, false },
17651
  {   772,  true, 0,  1012,  true },
17652
17653
  {  1036,  true, 0,  1276, false },
17654
  {  1284,  true, 0,  1524, false },
17655
  {  1532, false, 8,  1540, false },
17656
  {  1548,  true, 0,  1788, false },
17657
  {  1796,  true, 0,  2036,  true }
17658
};
17659
17660
17661
static void
17662
init_eht_scidx(struct scidx_ctx *ctx, uint8_t ru_index,
17663
               struct scidx_part *scidx_array, uint8_t ng)
17664
119
{
17665
119
  ctx->ru_index = ru_index;
17666
119
  ctx->scidx_array = scidx_array;
17667
119
  ctx->ng = ng;
17668
119
  ctx->just_inited = true;
17669
119
}
17670
17671
/* What about the special 20MHz ones? */
17672
/* Figure out the next SCIDX */
17673
static bool
17674
next_eht_scidx(struct scidx_ctx *ctx, int *scidx)
17675
2.97k
{
17676
2.97k
  if (ctx->just_inited) {
17677
119
    ctx->last_val = ctx->scidx_array->start_val;
17678
119
    ctx->just_inited = false;
17679
119
    *scidx = ctx->last_val;
17680
119
    return true;
17681
119
  }
17682
17683
  /* Move to the next val ... but check if it is a short seg first */
17684
2.85k
  if (ctx->last_val == ctx->scidx_array->stop_val) {
17685
85
    if (ctx->scidx_array->last_ent) {
17686
47
        return false;
17687
47
    } else {
17688
        /* Pretend like we just started again */
17689
        /* Also, note that the arrays need to be set up correctly */
17690
38
        ctx->scidx_array++;
17691
38
        if (ctx->last_val == ctx->scidx_array->start_val) {
17692
10
          if (ctx->scidx_array->use_ng) {
17693
9
            ctx->last_val += ctx->ng;
17694
9
          } else {
17695
1
            ctx->last_val += ctx->scidx_array->inc;
17696
1
          }
17697
28
        } else {
17698
28
          ctx->last_val = ctx->scidx_array->start_val;
17699
28
        }
17700
38
        *scidx = ctx->last_val;
17701
38
        return true;
17702
38
    }
17703
85
  }
17704
17705
  /*
17706
   * If the increment is not ng, then handle that.
17707
   */
17708
2.77k
  if (ctx->scidx_array->use_ng) {
17709
2.75k
    ctx->last_val += ctx->ng;
17710
2.75k
  } else {
17711
17
    ctx->last_val += ctx->scidx_array->inc;
17712
17
  }
17713
2.77k
  *scidx = ctx->last_val;
17714
17715
2.77k
  return true;
17716
2.85k
}
17717
17718
static int
17719
add_ff_eht_mu_exclusive_20MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
17720
                                  int offset, uint8_t nc_index,
17721
                                  uint8_t grouping, uint16_t partial_bw_info _U_)
17722
0
{
17723
0
  int start_offset = offset;
17724
0
  unsigned scidx;
17725
0
  struct scidx_ctx scidx_ctx;
17726
0
  uint8_t ng = grouping == 0 ? 4 : 16;
17727
0
  proto_tree *ru_index_tree = NULL;
17728
0
  proto_item *ruii = NULL;
17729
0
  unsigned ss = 0, get_snr = 1;
17730
0
  int8_t snr = 0, value;
17731
17732
0
  if (ng == 4) {
17733
0
    init_eht_scidx(&scidx_ctx, 1, &ru_242_tone_1_20MHz_ng4[0], ng);
17734
0
  } else {
17735
0
    init_eht_scidx(&scidx_ctx, 1, &ru_242_tone_1_20MHz_ng16[0], ng);
17736
0
  }
17737
17738
0
  ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17739
0
                                                ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17740
0
                                                &ruii,
17741
0
                                                "RU Index %d for 20MHz, Partial BW "
17742
0
                                                "not all one.", 1);
17743
0
  while (next_eht_scidx(&scidx_ctx, &scidx)) {
17744
0
    for (ss = 1; ss <= nc_index; ss++) {
17745
0
      if (get_snr) {
17746
0
        snr = tvb_get_int8(tvb, offset);
17747
0
        offset += 1;
17748
0
        value = snr & 0x0f;
17749
0
        get_snr = 0;
17750
0
      } else {
17751
0
        value = snr >> 4;
17752
0
        get_snr = 1;
17753
0
      }
17754
0
      proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17755
0
                                tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17756
0
                                ss, scidx, value);
17757
0
    }
17758
0
  }
17759
0
  proto_item_set_len(ruii, offset - start_offset);
17760
0
  return offset - start_offset;
17761
0
}
17762
17763
static int
17764
add_ff_eht_mu_exclusive_40MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
17765
                                  int offset, uint8_t nc_index,
17766
                                  uint8_t grouping, uint16_t partial_bw_info)
17767
0
{
17768
0
  int start_offset = offset;
17769
0
  int i = 0;
17770
0
  struct scidx_ctx scidx_ctx;
17771
0
  unsigned scidx;
17772
0
  uint8_t ng = grouping == 0 ? 4 : 16;
17773
0
  proto_tree *ru_index_tree = NULL;
17774
0
  proto_item *ruii = NULL;
17775
0
  unsigned ss = 0, get_snr = 1;
17776
0
  int8_t snr = 0, value;
17777
17778
  /* Add each of the RU index groups set */
17779
0
  for (i = 1; i <= 2; i++) {
17780
0
    int tree_offset = offset;
17781
0
    if ((partial_bw_info & (1 << i)) == 0x0) {
17782
0
      continue;  /* Only dissect those with the bit set */
17783
0
    }
17784
17785
0
    init_eht_scidx(&scidx_ctx, i, &ru_242_tone_40MHz[i - 1], ng);
17786
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17787
0
                                                  ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17788
0
                                                  &ruii,
17789
0
                                                  "RU Index %d for 40MHz, Partial BW "
17790
0
                                                  "not all one.", i);
17791
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
17792
0
      for (ss = 1; ss <= nc_index; ss++) {
17793
0
        if (get_snr) {
17794
0
          snr = tvb_get_int8(tvb, offset);
17795
0
          offset += 1;
17796
0
          value = snr & 0x0f;
17797
0
          get_snr = 0;
17798
0
        } else {
17799
0
          value = snr >> 4;
17800
0
          get_snr = 1;
17801
0
        }
17802
0
        proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17803
0
                                  tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17804
0
                                  ss, scidx, value);
17805
0
      }
17806
0
    }
17807
0
    proto_item_set_len(ruii, offset - tree_offset);
17808
0
  }
17809
17810
0
  return offset - start_offset;
17811
0
}
17812
17813
static int
17814
add_ff_eht_mu_exclusive_80MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
17815
                                  int offset, uint8_t nc_index,
17816
                                  uint8_t grouping, uint16_t partial_bw_info)
17817
1
{
17818
1
  int start_offset = offset;
17819
1
  int i = 0;
17820
1
  struct scidx_ctx scidx_ctx;
17821
1
  unsigned scidx;
17822
1
  uint8_t ng = grouping == 0 ? 4 : 16;
17823
1
  proto_tree *ru_index_tree = NULL;
17824
1
  proto_item *ruii = NULL;
17825
1
  unsigned ss = 0, get_snr = 1;
17826
1
  int8_t snr = 0, value;
17827
17828
1
  if (partial_bw_info == 0x1E) { /* Uses 996-tone RU indices */
17829
0
    if (ng == 4) {
17830
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_80MHz_ng4[0], ng);
17831
0
    } else {
17832
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_80MHz_ng16[0], ng);
17833
0
    }
17834
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17835
0
                                                  ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17836
0
                                                  &ruii,
17837
0
                                                  "996-tone RU Index %d for 80MHz", 1);
17838
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
17839
0
      for (ss = 1; ss <= nc_index; ss++) {
17840
0
        if (get_snr) {
17841
0
          snr = tvb_get_int8(tvb, offset);
17842
0
          offset += 1;
17843
0
          value = snr & 0x0f;
17844
0
          get_snr = 0;
17845
0
        } else {
17846
0
          value = snr >> 4;
17847
0
          get_snr = 1;
17848
0
        }
17849
0
        proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17850
0
                                  tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17851
0
                                  ss, scidx, value);
17852
0
      }
17853
0
    }
17854
0
    proto_item_set_len(ruii, offset - start_offset);
17855
17856
0
    return offset - start_offset;
17857
0
  }
17858
17859
  /* Add each of the RU index groups */
17860
5
  for (i = 1; i <= 4; i++) {
17861
4
    int tree_offset = offset;
17862
4
    if ((partial_bw_info & (1 << i)) == 0x0) {
17863
4
      continue;  /* Only dissect those with the bit set */
17864
4
    }
17865
17866
0
    init_eht_scidx(&scidx_ctx, i, &ru_242_tone_80MHz[i - 1], ng);
17867
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17868
0
                                                  ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17869
0
                                                  &ruii,
17870
0
                                                  "RU Index %d for 80MHz, Partial BW "
17871
0
                                                  "not all one.", i);
17872
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
17873
0
      for (ss = 1; ss <= nc_index; ss++) {
17874
0
        if (get_snr) {
17875
0
          snr = tvb_get_int8(tvb, offset);
17876
0
          offset += 1;
17877
0
          value = snr & 0x0f;
17878
0
          get_snr = 0;
17879
0
        } else {
17880
0
          value = snr >> 4;
17881
0
          get_snr = 1;
17882
0
        }
17883
0
        proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17884
0
                                  tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17885
0
                                  ss, scidx, value);
17886
0
      }
17887
0
    }
17888
0
    proto_item_set_len(ruii, offset - tree_offset);
17889
0
  }
17890
17891
1
  return offset - start_offset;
17892
1
}
17893
17894
static int
17895
add_ff_eht_mu_exclusive_160MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
17896
                                   int offset, uint8_t nc_index,
17897
                                   uint8_t grouping, uint16_t partial_bw_info)
17898
0
{
17899
0
  int start_offset = offset;
17900
0
  int tree_offset;
17901
0
  int i = 0;
17902
0
  struct scidx_ctx scidx_ctx;
17903
0
  unsigned scidx;
17904
0
  uint8_t ng = grouping == 0 ? 4 : 16;
17905
0
  proto_tree *ru_index_tree = NULL;
17906
0
  proto_item *ruii = NULL;
17907
0
  unsigned ss = 0, get_snr = 1;
17908
0
  int8_t snr = 0, value;
17909
17910
  /* Is the first lot a 996-tone RU? */
17911
0
  if ((partial_bw_info & 0x1E) == 0x1E) { /* Uses 996-tone RU indices */
17912
0
    tree_offset = offset;
17913
0
    if (ng == 4) {
17914
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng4[0], ng);
17915
0
    } else {
17916
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng16[0], ng);
17917
0
    }
17918
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17919
0
                                                  ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17920
0
                                                  &ruii,
17921
0
                                                  "996-tone RU Index %d for 160MHz", 1);
17922
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
17923
0
      for (ss = 1; ss <= nc_index; ss++) {
17924
0
        if (get_snr) {
17925
0
          snr = tvb_get_int8(tvb, offset);
17926
0
          offset += 1;
17927
0
          value = snr & 0x0f;
17928
0
          get_snr = 0;
17929
0
        } else {
17930
0
          value = snr >> 4;
17931
0
          get_snr = 1;
17932
0
        }
17933
0
        proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17934
0
                                  tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17935
0
                                  ss, scidx, value);
17936
0
      }
17937
0
    }
17938
0
    proto_item_set_len(ruii, offset - tree_offset);
17939
0
  } else {
17940
    /* Add each of the RU index groups for the lower 80MHz */
17941
0
    for (i = 1; i <= 4; i++) {
17942
0
      if ((partial_bw_info & (1 << i)) == 0x0) {
17943
0
        continue;  /* Only dissect those with the bit set */
17944
0
      }
17945
17946
0
      tree_offset = offset;
17947
0
      init_eht_scidx(&scidx_ctx, i, &ru_242_tone_160MHz[i - 1], ng);
17948
0
      ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17949
0
                                                    ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17950
0
                                                    &ruii,
17951
0
                                                    "RU Index %d for 160MHz, Partial BW "
17952
0
                                                    "not all one, lower 80MHz.", i);
17953
0
      while (next_eht_scidx(&scidx_ctx, &scidx)) {
17954
0
        for (ss = 1; ss <= nc_index; ss++) {
17955
0
          if (get_snr) {
17956
0
            snr = tvb_get_int8(tvb, offset);
17957
0
            offset += 1;
17958
0
            value = snr & 0x0f;
17959
0
            get_snr = 0;
17960
0
          } else {
17961
0
            value = snr >> 4;
17962
0
            get_snr = 1;
17963
0
          }
17964
0
          proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17965
0
                                    tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17966
0
                                    ss, scidx, value);
17967
0
        }
17968
0
      }
17969
0
      proto_item_set_len(ruii, offset - tree_offset);
17970
0
    }
17971
0
  }
17972
17973
  /* Is the second lot a 996-tone RU? */
17974
0
  get_snr = 1;
17975
0
  if ((partial_bw_info & 0x1E0) == 0x1E0) { /* Uses 996-tone RU indices */
17976
0
    tree_offset = offset;
17977
0
    if (ng == 4) {
17978
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng4[2], ng);
17979
0
    } else {
17980
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng16[5], ng);
17981
0
    }
17982
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
17983
0
                                                  ett_eht_mu_exclusive_beamforming_rpt_ru_index,
17984
0
                                                  &ruii,
17985
0
                                                  "996-tone RU Index %d for 160MHz", 2);
17986
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
17987
0
      for (ss = 1; ss <= nc_index; ss++) {
17988
0
        if (get_snr) {
17989
0
          snr = tvb_get_int8(tvb, offset);
17990
0
          offset += 1;
17991
0
          value = snr & 0x0f;
17992
0
          get_snr = 0;
17993
0
        } else {
17994
0
          value = snr >> 4;
17995
0
          get_snr = 1;
17996
0
        }
17997
0
        proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
17998
0
                                  tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
17999
0
                                  ss, scidx, value);
18000
0
      }
18001
0
    }
18002
0
    proto_item_set_len(ruii, offset - tree_offset);
18003
0
  } else {
18004
    /* Add each of the RU index groups for the lower 80MHz */
18005
0
    for (i = 5; i <= 8; i++) {
18006
0
      if ((partial_bw_info & (1 << i)) == 0x0) {
18007
0
        continue;  /* Only dissect those with the bit set */
18008
0
      }
18009
18010
0
      tree_offset = offset;
18011
0
      init_eht_scidx(&scidx_ctx, i, &ru_242_tone_160MHz[i - 1], ng);
18012
0
      ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18013
0
                                                    ett_eht_mu_exclusive_beamforming_rpt_ru_index,
18014
0
                                                    &ruii,
18015
0
                                                    "RU Index %d for 160MHz, Partial BW "
18016
0
                                                    "not all one, upper 80MHz.", i);
18017
0
      while (next_eht_scidx(&scidx_ctx, &scidx)) {
18018
0
        for (ss = 1; ss <= nc_index; ss++) {
18019
0
          if (get_snr) {
18020
0
            snr = tvb_get_int8(tvb, offset);
18021
0
            offset += 1;
18022
0
            value = snr & 0x0f;
18023
0
            get_snr = 0;
18024
0
          } else {
18025
0
            value = snr >> 4;
18026
0
            get_snr = 1;
18027
0
          }
18028
0
          proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
18029
0
                                    tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
18030
0
                                    ss, scidx, value);
18031
0
        }
18032
0
      }
18033
0
      proto_item_set_len(ruii, offset - tree_offset);
18034
0
    }
18035
0
  }
18036
18037
0
  return offset - start_offset;
18038
0
}
18039
18040
static int
18041
add_ff_eht_mu_exclusive_320MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
18042
                                   int offset, uint8_t nc_index,
18043
                                   uint8_t grouping, uint16_t partial_bw_info)
18044
1
{
18045
1
  int start_offset = offset;
18046
1
  int tree_offset = offset;
18047
1
  int i = 0, j = 0, k = 0;
18048
1
  struct scidx_ctx scidx_ctx;
18049
1
  unsigned scidx;
18050
1
  uint8_t ng = grouping == 0 ? 4 : 16;
18051
1
  proto_tree *ru_index_tree = NULL;
18052
1
  proto_item *ruii = NULL;
18053
1
  unsigned ss = 0, get_snr = 1;
18054
1
  int8_t snr = 0, value;
18055
18056
5
  for ( i = 0; i < 4; i++) {
18057
4
    if (((partial_bw_info >> (2*i+1)) & 0x03) == 0x03) { /* Uses 996-tone RU indices */
18058
0
      if (ng == 4) {
18059
0
        init_eht_scidx(&scidx_ctx, i+1, &ru_996_tone_320MHz_ng4[i * 2], ng);
18060
0
      } else {
18061
0
        init_eht_scidx(&scidx_ctx, i+1, &ru_996_tone_320MHz_ng16[i * 5], ng);
18062
0
      }
18063
0
      ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18064
0
                                                    ett_eht_mu_exclusive_beamforming_rpt_ru_index,
18065
0
                                                    &ruii,
18066
0
                                                    "996-tone RU Index %d for 320MHz",
18067
0
                                                    i+1);
18068
0
      tree_offset = offset;
18069
0
      while (next_eht_scidx(&scidx_ctx, &scidx)) {
18070
0
        for (ss = 1; ss <= nc_index; ss++) {
18071
0
          if (get_snr) {
18072
0
            snr = tvb_get_int8(tvb, offset);
18073
0
            offset += 1;
18074
0
            value = snr & 0x0f;
18075
0
            get_snr = 0;
18076
0
          } else {
18077
0
            value = snr >> 4;
18078
0
            get_snr = 1;
18079
0
          }
18080
0
          proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
18081
0
                                    tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
18082
0
                                    ss, scidx, value);
18083
0
        }
18084
0
      }
18085
0
      proto_item_set_len(ruii, offset - tree_offset);
18086
4
    } else {
18087
12
      for (j = 2*i; j <= 2*i+1; j++) {
18088
8
        if ((partial_bw_info & (1 << (j+1))) == 0x0) {
18089
8
          continue;  /* Only dissect those with the bit set */
18090
8
        }
18091
        /* Each 484-tone RU contains two 242-tone RUs */
18092
0
        for (k = 2*j;k <= 2*j+1;k++) {
18093
0
          init_eht_scidx(&scidx_ctx, k+1, &ru_242_tone_320MHz[k], ng);
18094
0
          ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18095
0
                            ett_eht_mu_exclusive_beamforming_rpt_ru_index,
18096
0
                            &ruii,
18097
0
                            "RU Index %d for 320MHz, Partial BW "
18098
0
                            "not all one.", k+1);
18099
0
          tree_offset = offset;
18100
0
          while (next_eht_scidx(&scidx_ctx, &scidx)) {
18101
0
            for (ss = 1; ss <= nc_index; ss++) {
18102
0
              if (get_snr) {
18103
0
                snr = tvb_get_int8(tvb, offset);
18104
0
                offset += 1;
18105
0
                value = snr & 0x0f;
18106
0
                get_snr = 0;
18107
0
              } else {
18108
0
                value = snr >> 4;
18109
0
                get_snr = 1;
18110
0
              }
18111
0
              proto_tree_add_int_format(ru_index_tree, hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
18112
0
                                        tvb, offset, 1, value, "Delta SNR for Stream %d for subcarrier %u: %d dB",
18113
0
                                        ss, scidx, value);
18114
0
            }
18115
0
          }
18116
0
          proto_item_set_len(ruii, offset - tree_offset);
18117
0
        }
18118
0
      }
18119
4
    }
18120
4
  }
18121
18122
1
  return offset - start_offset;
18123
1
}
18124
18125
static unsigned
18126
add_ff_eht_mu_exclusive_beamforming_rpt(proto_tree *tree, tvbuff_t *tvb,
18127
                                        packet_info *pinfo, int offset,
18128
                                        uint64_t mimo_control)
18129
7
{
18130
7
  uint8_t nc_index = mimo_control & 0x0F;
18131
7
  uint8_t bw = (mimo_control >> 8) & 0x07;
18132
7
  uint8_t grouping = (mimo_control >> 11) & 0x01;
18133
7
  uint16_t partial_bw_info = (mimo_control >> 21) & 0x01FF;
18134
7
  proto_tree *exclusive_tree = NULL;
18135
7
  proto_item *fti = NULL;
18136
7
  unsigned start_offset = offset;
18137
7
  unsigned tree_len = 0, byte_count = 0;
18138
18139
7
  exclusive_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
18140
7
                     ett_ff_eht_mimo_mu_exclusive_report, &fti,
18141
7
                     "EHT MU Exclusive Beamforming Report");
18142
18143
7
  switch (bw) {
18144
0
  case 0: /*  20 MHz */
18145
0
    tree_len = add_ff_eht_mu_exclusive_20MHz_rpt(exclusive_tree, tvb, pinfo, offset,
18146
0
                                                 nc_index, grouping, partial_bw_info);
18147
0
    proto_item_set_len(fti, tree_len);
18148
0
    offset += tree_len;
18149
0
    break;
18150
0
  case 1: /*  40 MHz */
18151
0
    tree_len = add_ff_eht_mu_exclusive_40MHz_rpt(exclusive_tree, tvb, pinfo, offset,
18152
0
                                                 nc_index, grouping, partial_bw_info);
18153
0
    proto_item_set_len(fti, tree_len);
18154
0
    offset += tree_len;
18155
0
    break;
18156
1
  case 2: /*  80 MHz */
18157
1
    tree_len = add_ff_eht_mu_exclusive_80MHz_rpt(exclusive_tree, tvb, pinfo, offset,
18158
1
                                                 nc_index, grouping, partial_bw_info);
18159
1
    proto_item_set_len(fti, tree_len);
18160
1
    offset += tree_len;
18161
1
    break;
18162
0
  case 3: /* 160 MHz */
18163
0
    tree_len = add_ff_eht_mu_exclusive_160MHz_rpt(exclusive_tree, tvb, pinfo, offset,
18164
0
                                                  nc_index, grouping, partial_bw_info);
18165
0
    proto_item_set_len(fti, tree_len);
18166
0
    offset += tree_len;
18167
0
    break;
18168
1
  case 4: /* 320 MHz */
18169
1
    tree_len = add_ff_eht_mu_exclusive_320MHz_rpt(exclusive_tree, tvb, pinfo, offset,
18170
1
                                                  nc_index, grouping, partial_bw_info);
18171
1
    proto_item_set_len(fti, tree_len);
18172
1
    offset += tree_len;
18173
1
    break;
18174
0
  default:
18175
    /* Add EI about invalid BW setting */
18176
0
    break;
18177
7
  }
18178
18179
2
  byte_count = tvb_reported_length_remaining(tvb, offset);
18180
2
  if (byte_count > 0)
18181
0
    offset += byte_count; /* Should fix the real problem. */
18182
18183
2
  return offset - start_offset;
18184
7
}
18185
18186
static int
18187
add_ff_eht_su_20MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
18188
                        int offset, uint8_t nc_index, uint8_t nr_index,
18189
                        uint8_t grouping, uint16_t partial_bw_info _U_,
18190
                        uint8_t phi_bits, uint8_t psi_bits)
18191
13
{
18192
13
  int start_offset = offset;
18193
13
  unsigned scidx;
18194
13
  struct scidx_ctx scidx_ctx;
18195
13
  uint8_t ng = grouping == 0 ? 4 : 16;
18196
13
  unsigned bit_offset = offset * 8;
18197
13
  proto_tree *ru_index_tree = NULL;
18198
13
  proto_item *ruii = NULL;
18199
18200
13
  if (ng == 4) {
18201
13
    init_eht_scidx(&scidx_ctx, 1, &ru_242_tone_1_20MHz_ng4[0], ng);
18202
13
  } else {
18203
0
    init_eht_scidx(&scidx_ctx, 1, &ru_242_tone_1_20MHz_ng16[0], ng);
18204
0
  }
18205
18206
13
  ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18207
13
                                                ett_eht_beamforming_rpt_ru_index,
18208
13
                                                &ruii,
18209
13
                                                "RU Index %d for 20MHz, Partial BW "
18210
13
                                                "not all one.", 1);
18211
161
  while (next_eht_scidx(&scidx_ctx, &scidx)) {
18212
148
    bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18213
148
                                            bit_offset, scidx, nr_index + 1,
18214
148
                                            nc_index + 1, phi_bits, psi_bits,
18215
148
                                            hf_ieee80211_eht_compressed_beamform_scidx);
18216
148
    offset = bit_offset / 8;
18217
148
  }
18218
13
  proto_item_set_len(ruii, offset - start_offset);
18219
18220
13
  return offset - start_offset;
18221
13
}
18222
18223
static int
18224
add_ff_eht_su_40MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
18225
                        int offset, uint8_t nc_index, uint8_t nr_index,
18226
                        uint8_t grouping, uint16_t partial_bw_info,
18227
                        uint8_t phi_bits, uint8_t psi_bits)
18228
15
{
18229
15
  int start_offset = offset;
18230
15
  int i = 0;
18231
15
  struct scidx_ctx scidx_ctx;
18232
15
  unsigned scidx;
18233
15
  uint8_t ng = grouping == 0 ? 4 : 16;
18234
15
  unsigned bit_offset = offset * 8;
18235
15
  proto_tree *ru_index_tree = NULL;
18236
15
  proto_item *ruii = NULL;
18237
18238
  /* Add each of the RU index groups set */
18239
37
  for (i = 1; i <= 2; i++) {
18240
22
    int tree_offset = offset;
18241
22
    if ((partial_bw_info & (1 << i)) == 0x0) {
18242
6
      continue;  /* Only dissect those with the bit set */
18243
6
    }
18244
18245
16
    init_eht_scidx(&scidx_ctx, i, &ru_242_tone_40MHz[i - 1], ng);
18246
16
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18247
16
                                                  ett_eht_beamforming_rpt_ru_index,
18248
16
                                                  &ruii,
18249
16
                                                  "RU Index %d for 40MHz, Partial BW "
18250
16
                                                  "not all one.", i);
18251
215
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
18252
199
      bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18253
199
                                              bit_offset, scidx, nr_index + 1,
18254
199
                                              nc_index + 1, phi_bits, psi_bits,
18255
199
                                              hf_ieee80211_eht_compressed_beamform_scidx);
18256
199
      offset = bit_offset / 8;
18257
199
    }
18258
16
    proto_item_set_len(ruii, offset - tree_offset);
18259
16
  }
18260
18261
15
  return offset - start_offset;
18262
15
}
18263
18264
static int
18265
add_ff_eht_su_80MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
18266
                        int offset, uint8_t nc_index, uint8_t nr_index,
18267
                        uint8_t grouping, uint16_t partial_bw_info,
18268
                        uint8_t phi_bits, uint8_t psi_bits)
18269
16
{
18270
16
  int start_offset = offset;
18271
16
  int i = 0;
18272
16
  struct scidx_ctx scidx_ctx;
18273
16
  unsigned scidx;
18274
16
  uint8_t ng = grouping == 0 ? 4 : 16;
18275
16
  unsigned bit_offset = offset * 8;
18276
16
  proto_tree *ru_index_tree = NULL;
18277
16
  proto_item *ruii = NULL;
18278
18279
16
  if (partial_bw_info == 0x1E) { /* Uses 996-tone RU indices */
18280
0
    if (ng == 4) {
18281
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_80MHz_ng4[0], ng);
18282
0
    } else {
18283
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_80MHz_ng16[0], ng);
18284
0
    }
18285
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18286
0
                                                  ett_eht_beamforming_rpt_ru_index,
18287
0
                                                  &ruii,
18288
0
                                                  "996-tone RU Index %d for 80MHz", 1);
18289
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
18290
0
      bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18291
0
                                              bit_offset, scidx, nr_index + 1,
18292
0
                                              nc_index + 1, phi_bits, psi_bits,
18293
0
                                              hf_ieee80211_eht_compressed_beamform_scidx);
18294
0
      offset = bit_offset / 8;
18295
0
    }
18296
0
    proto_item_set_len(ruii, offset - start_offset);
18297
18298
0
    return offset - start_offset;
18299
0
  }
18300
18301
  /* Add each of the RU index groups */
18302
49
  for (i = 1; i <= 4; i++) {
18303
33
    int tree_offset = offset;
18304
33
    if ((partial_bw_info & (1 << i)) == 0x0) {
18305
19
      continue;  /* Only dissect those with the bit set */
18306
19
    }
18307
18308
14
    init_eht_scidx(&scidx_ctx, i, &ru_242_tone_80MHz[i - 1], ng);
18309
14
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18310
14
                                                  ett_eht_beamforming_rpt_ru_index,
18311
14
                                                  &ruii,
18312
14
                                                  "RU Index %d for 80MHz, Partial BW "
18313
14
                                                  "not all one.", i);
18314
114
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
18315
100
      bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18316
100
                                              bit_offset, scidx, nr_index + 1,
18317
100
                                              nc_index + 1, phi_bits, psi_bits,
18318
100
                                              hf_ieee80211_eht_compressed_beamform_scidx);
18319
100
      offset = bit_offset / 8;
18320
100
    }
18321
14
    proto_item_set_len(ruii, offset - tree_offset);
18322
14
  }
18323
18324
16
  return offset - start_offset;
18325
16
}
18326
18327
static int
18328
add_ff_eht_su_160MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
18329
                         int offset, uint8_t nc_index, uint8_t nr_index,
18330
                         uint8_t grouping, uint16_t partial_bw_info,
18331
                         uint8_t phi_bits, uint8_t psi_bits)
18332
11
{
18333
11
  int start_offset = offset;
18334
11
  int tree_offset;
18335
11
  int i = 0;
18336
11
  struct scidx_ctx scidx_ctx;
18337
11
  unsigned scidx;
18338
11
  uint8_t ng = grouping == 0 ? 4 : 16;
18339
11
  unsigned bit_offset = offset * 8;
18340
11
  proto_tree *ru_index_tree = NULL;
18341
11
  proto_item *ruii = NULL;
18342
18343
  /* Is the first lot a 996-tone RU? */
18344
11
  if ((partial_bw_info & 0x1E) == 0x1E) { /* Uses 996-tone RU indices */
18345
0
    tree_offset = offset;
18346
0
    if (ng == 4) {
18347
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng4[0], ng);
18348
0
    } else {
18349
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng16[0], ng);
18350
0
    }
18351
0
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18352
0
                                                  ett_eht_beamforming_rpt_ru_index,
18353
0
                                                  &ruii,
18354
0
                                                  "996-tone RU Index %d for 160MHz", 1);
18355
0
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
18356
0
      bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18357
0
                                              bit_offset, scidx, nr_index + 1,
18358
0
                                              nc_index + 1, phi_bits, psi_bits,
18359
0
                                              hf_ieee80211_eht_compressed_beamform_scidx);
18360
0
      offset = bit_offset / 8;
18361
0
    }
18362
0
    proto_item_set_len(ruii, offset - tree_offset);
18363
11
  } else {
18364
    /* Add each of the RU index groups for the lower 80MHz */
18365
53
    for (i = 1; i <= 4; i++) {
18366
42
      if ((partial_bw_info & (1 << i)) == 0x0) {
18367
25
        continue;  /* Only dissect those with the bit set */
18368
25
      }
18369
18370
17
      tree_offset = offset;
18371
17
      init_eht_scidx(&scidx_ctx, i, &ru_242_tone_160MHz[i - 1], ng);
18372
17
      ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18373
17
                                                    ett_eht_beamforming_rpt_ru_index,
18374
17
                                                    &ruii,
18375
17
                                                    "RU Index %d for 160MHz, Partial BW "
18376
17
                                                    "not all one, lower 80MHz.", i);
18377
949
      while (next_eht_scidx(&scidx_ctx, &scidx)) {
18378
932
        bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo,
18379
932
                                                offset, bit_offset, scidx,
18380
932
                                                nr_index + 1, nc_index + 1,
18381
932
                                                phi_bits, psi_bits,
18382
932
                                                hf_ieee80211_eht_compressed_beamform_scidx);
18383
932
        offset = bit_offset / 8;
18384
932
      }
18385
17
      proto_item_set_len(ruii, offset - tree_offset);
18386
17
    }
18387
11
  }
18388
18389
  /* Is the second lot a 996-tone RU? */
18390
11
  if ((partial_bw_info & 0x1E0) == 0x1E0) { /* Uses 996-tone RU indices */
18391
2
    tree_offset = offset;
18392
2
    if (ng == 4) {
18393
2
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng4[2], ng);
18394
2
    } else {
18395
0
      init_eht_scidx(&scidx_ctx, i, &ru_996_tone_160MHz_ng16[5], ng);
18396
0
    }
18397
2
    ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18398
2
                                                  ett_eht_beamforming_rpt_ru_index,
18399
2
                                                  &ruii,
18400
2
                                                  "996-tone RU Index %d for 160MHz", 2);
18401
171
    while (next_eht_scidx(&scidx_ctx, &scidx)) {
18402
169
      bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18403
169
                                              bit_offset, scidx, nr_index + 1,
18404
169
                                              nc_index + 1, phi_bits, psi_bits,
18405
169
                                              hf_ieee80211_eht_compressed_beamform_scidx);
18406
169
      offset = bit_offset / 8;
18407
169
    }
18408
2
    proto_item_set_len(ruii, offset - tree_offset);
18409
9
  } else {
18410
    /* Add each of the RU index groups for the lower 80MHz */
18411
29
    for (i = 5; i <= 8; i++) {
18412
20
      if ((partial_bw_info & (1 << i)) == 0x0) {
18413
10
        continue;  /* Only dissect those with the bit set */
18414
10
      }
18415
18416
10
      tree_offset = offset;
18417
10
      init_eht_scidx(&scidx_ctx, i, &ru_242_tone_160MHz[i - 1], ng);
18418
10
      ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18419
10
                                                    ett_eht_beamforming_rpt_ru_index,
18420
10
                                                    &ruii,
18421
10
                                                    "RU Index %d for 160MHz, Partial BW "
18422
10
                                                    "not all one, upper 80MHz.", i);
18423
368
      while (next_eht_scidx(&scidx_ctx, &scidx)) {
18424
358
        bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo,
18425
358
                                                offset, bit_offset, scidx,
18426
358
                                                nr_index + 1, nc_index + 1,
18427
358
                                                phi_bits, psi_bits,
18428
358
                                                hf_ieee80211_eht_compressed_beamform_scidx);
18429
358
        offset = bit_offset / 8;
18430
358
      }
18431
10
      proto_item_set_len(ruii, offset - tree_offset);
18432
10
    }
18433
9
  }
18434
18435
11
  return offset - start_offset;
18436
11
}
18437
18438
static int
18439
add_ff_eht_su_320MHz_rpt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
18440
                         int offset, uint8_t nc_index, uint8_t nr_index,
18441
                         uint8_t grouping, uint16_t partial_bw_info,
18442
                         uint8_t phi_bits, uint8_t psi_bits)
18443
26
{
18444
26
  int start_offset = offset;
18445
26
  int tree_offset = offset;
18446
26
  int i = 0, j = 0, k = 0;
18447
26
  struct scidx_ctx scidx_ctx;
18448
26
  unsigned scidx;
18449
26
  uint8_t ng = grouping == 0 ? 4 : 16;
18450
26
  unsigned bit_offset = offset * 8;
18451
26
  proto_tree *ru_index_tree = NULL;
18452
26
  proto_item *ruii = NULL;
18453
18454
  /* Resolution is 40 MHz */
18455
104
  for (i = 0; i < 4; i++) {
18456
78
    if (((partial_bw_info >> (2*i+1)) & 0x03) == 0x03) { /* Uses 996-tone RU indices */
18457
15
      if (ng == 4) {
18458
3
        init_eht_scidx(&scidx_ctx, i+1, &ru_996_tone_320MHz_ng4[i * 2], ng);
18459
12
      } else {
18460
12
        init_eht_scidx(&scidx_ctx, i+1, &ru_996_tone_320MHz_ng16[i * 5], ng);
18461
12
      }
18462
15
      ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18463
15
                                                    ett_eht_beamforming_rpt_ru_index,
18464
15
                                                    &ruii,
18465
15
                                                    "996-tone RU Index %d for 320MHz",
18466
15
                                                    i+1);
18467
15
      tree_offset = offset;
18468
565
      while (next_eht_scidx(&scidx_ctx, &scidx)) {
18469
550
        bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo,
18470
550
                                                offset, bit_offset, scidx,
18471
550
                                                nr_index + 1, nc_index + 1,
18472
550
                                                phi_bits, psi_bits,
18473
550
                                                hf_ieee80211_eht_compressed_beamform_scidx);
18474
550
        offset = bit_offset / 8;
18475
550
      }
18476
15
      proto_item_set_len(ruii, offset - tree_offset);
18477
63
    } else {
18478
181
      for (j = 2*i; j <= 2*i+1; j++) {
18479
118
        if ((partial_bw_info & (1 << (j+1))) == 0x0) {
18480
99
          continue;  /* Only dissect those with the bit set */
18481
99
        }
18482
        /* Each 484-tone RU contains two 242-tone RUs */
18483
51
        for (k = 2*j;k <= 2*j+1;k++) {
18484
32
          init_eht_scidx(&scidx_ctx, k+1, &ru_242_tone_320MHz[k], ng);
18485
32
          ru_index_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
18486
32
                            ett_eht_beamforming_rpt_ru_index,
18487
32
                            &ruii,
18488
32
                            "RU Index %d for 320MHz, Partial BW "
18489
32
                            "not all one.", k+1);
18490
32
          tree_offset = offset;
18491
506
          while (next_eht_scidx(&scidx_ctx, &scidx)) {
18492
474
            bit_offset = dissect_he_feedback_matrix(ru_index_tree, tvb, pinfo, offset,
18493
474
                           bit_offset, scidx, nr_index + 1,
18494
474
                           nc_index + 1, phi_bits, psi_bits,
18495
474
                           hf_ieee80211_eht_compressed_beamform_scidx);
18496
474
            offset = bit_offset / 8;
18497
474
          }
18498
32
          proto_item_set_len(ruii, offset - tree_offset);
18499
32
        }
18500
19
      }
18501
63
    }
18502
78
  }
18503
18504
26
  return offset - start_offset;
18505
26
}
18506
18507
static unsigned
18508
add_ff_eht_su_beamforming_rpt(proto_tree *tree, tvbuff_t *tvb,
18509
                              packet_info *pinfo, int offset,
18510
                              uint64_t mimo_control)
18511
84
{
18512
84
  uint8_t nc_index = mimo_control & 0x0F;
18513
84
  uint8_t nr_index = (mimo_control >> 4) & 0x0F;
18514
84
  uint8_t bw = (mimo_control >> 8) & 0x07;
18515
84
  uint8_t grouping = (mimo_control >> 11) & 0x01;
18516
84
  uint16_t partial_bw_info = (mimo_control >> 21) & 0x01FF;
18517
84
  uint8_t codebook_info = (mimo_control >> 36) & 0x01;
18518
84
  proto_tree *snr_tree = NULL, *feedback_tree = NULL;
18519
84
  proto_item *fti = NULL;
18520
84
  uint8_t i = 0, phi_bits, psi_bits;
18521
84
  unsigned start_offset = offset;
18522
84
  unsigned tree_len = 0, byte_count = 0;
18523
18524
84
  snr_tree = proto_tree_add_subtree(tree, tvb, offset, nc_index + 1,
18525
84
               ett_ff_eht_mimo_beamforming_report_snr, NULL,
18526
84
               "Average Signal to Noise Ratio");
18527
18528
502
  for (i = 0; i < nc_index + 1; i++) {
18529
418
    int8_t snr = tvb_get_int8(tvb, offset);
18530
18531
418
    proto_tree_add_int_format(snr_tree,
18532
418
      hf_ieee80211_eht_compressed_beamforming_report_snr, tvb, offset, 1,
18533
418
      snr, "Stream %d: %s%0.2fdB (0x%02x)", i,
18534
418
      (snr == 127 ? ">=" : (snr == -128 ? "<=" : "")),
18535
418
      (float)((float)88 + snr)/4, (uint8_t)snr);
18536
418
    offset++;
18537
418
  }
18538
18539
84
  if (codebook_info == 0) {
18540
50
    phi_bits = 4;
18541
50
    psi_bits = 2;
18542
50
  } else {
18543
34
    phi_bits = 6;
18544
34
    psi_bits = 4;
18545
34
  }
18546
18547
84
  feedback_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
18548
84
                                         ett_eht_beamforming_feedback_tree,
18549
84
                                         &fti, "Feedback Matrices");
18550
84
  switch (bw) {
18551
13
  case 0: /*  20 MHz */
18552
13
    tree_len = add_ff_eht_su_20MHz_rpt(feedback_tree, tvb, pinfo, offset,
18553
13
                                       nc_index, nr_index, grouping,
18554
13
                                       partial_bw_info, phi_bits, psi_bits);
18555
13
    proto_item_set_len(fti, tree_len);
18556
13
    offset += tree_len;
18557
13
    break;
18558
15
  case 1: /*  40 MHz */
18559
15
    tree_len = add_ff_eht_su_40MHz_rpt(feedback_tree, tvb, pinfo, offset,
18560
15
                                       nc_index, nr_index, grouping,
18561
15
                                       partial_bw_info, phi_bits, psi_bits);
18562
15
    proto_item_set_len(fti, tree_len);
18563
15
    offset += tree_len;
18564
15
    break;
18565
16
  case 2: /*  80 MHz */
18566
16
    tree_len = add_ff_eht_su_80MHz_rpt(feedback_tree, tvb, pinfo, offset,
18567
16
                                       nc_index, nr_index, grouping,
18568
16
                                       partial_bw_info, phi_bits, psi_bits);
18569
16
    proto_item_set_len(fti, tree_len);
18570
16
    offset += tree_len;
18571
16
    break;
18572
11
  case 3: /* 160 MHz */
18573
11
    tree_len = add_ff_eht_su_160MHz_rpt(feedback_tree, tvb, pinfo, offset,
18574
11
                                        nc_index, nr_index, grouping,
18575
11
                                        partial_bw_info, phi_bits, psi_bits);
18576
11
    proto_item_set_len(fti, tree_len);
18577
11
    offset += tree_len;
18578
11
    break;
18579
26
  case 4: /* 320 MHz */
18580
26
    tree_len = add_ff_eht_su_320MHz_rpt(feedback_tree, tvb, pinfo, offset,
18581
26
                                        nc_index, nr_index, grouping,
18582
26
                                        partial_bw_info, phi_bits, psi_bits);
18583
26
    proto_item_set_len(fti, tree_len);
18584
26
    offset += tree_len;
18585
26
    break;
18586
3
  default:
18587
    /* Add EI about invalid BW setting */
18588
3
    break;
18589
84
  }
18590
18591
12
  byte_count = tvb_reported_length_remaining(tvb, offset);
18592
12
  if (byte_count > 0)
18593
12
    offset += byte_count; /* Should fix the real problem. */
18594
18595
12
  return offset - start_offset;
18596
84
}
18597
18598
static const val64_string eht_mimo_bw_vals[] = {
18599
  { 0, "20 MHz" },
18600
  { 1, "40 MHz" },
18601
  { 2, "80 MHz" },
18602
  { 3, "160 MHz" },
18603
  { 4, "320 MHz" },
18604
  { 5, "Reserved" },
18605
  { 6, "Reserved" },
18606
  { 7, "Reserved" },
18607
  { 0, NULL }
18608
};
18609
18610
static const val64_string eht_mimo_grouping_vals[] = {
18611
  { 0, "Ng = 4" },
18612
  { 1, "Ng = 16" },
18613
  { 0, NULL }
18614
};
18615
18616
static const val64_string eht_feedback_type_vals[] = {
18617
  { 0, "SU" },
18618
  { 1, "MU" },
18619
  { 2, "CQI" },
18620
  { 3, "Reserved" },
18621
  { 0, NULL }
18622
};
18623
18624
static int * const eht_mimo_ctrl_hdrs[] = {
18625
  &hf_ieee80211_eht_mimo_ctrl_nc_index,
18626
  &hf_ieee80211_eht_mimo_ctrl_nr_index,
18627
  &hf_ieee80211_eht_mimo_ctrl_bw,
18628
  &hf_ieee80211_eht_mimo_ctrl_grouping,
18629
  &hf_ieee80211_eht_mimo_ctrl_feedback_type,
18630
  &hf_ieee80211_eht_mimo_ctrl_reserved1,
18631
  &hf_ieee80211_eht_mimo_ctrl_remaining_feedback_segments,
18632
  &hf_ieee80211_eht_mimo_ctrl_first_feedback_segment,
18633
  &hf_ieee80211_eht_mimo_ctrl_partial_bw_info,
18634
  &hf_ieee80211_eht_mimo_ctrl_sounding_dialog_token_number,
18635
  &hf_ieee80211_eht_mimo_ctrl_codebook_info,
18636
  &hf_ieee80211_eht_mimo_ctrl_reserved2,
18637
  NULL
18638
};
18639
18640
static unsigned
18641
add_ff_eht_mimo_control_etc(proto_tree *tree _U_, tvbuff_t *tvb _U_,
18642
                            packet_info *pinfo _U_,
18643
                            int offset _U_)
18644
90
{
18645
90
  unsigned start = offset;
18646
90
  uint64_t mimo_control = tvb_get_uint40(tvb, offset, ENC_LITTLE_ENDIAN);
18647
90
  uint8_t feedback_type = (mimo_control >> 12) & 0x03;
18648
90
  uint8_t nc_index = mimo_control & 0x0F;
18649
90
  uint8_t nr_index = (mimo_control >> 4) & 0x0F;
18650
90
  proto_item *mci = NULL;
18651
18652
90
  mci = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
18653
90
                                          hf_ieee80211_eht_mimo_ctrl_field,
18654
90
                                          ett_eht_mimo_ctrl, eht_mimo_ctrl_hdrs,
18655
90
                                          ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
18656
18657
  /*
18658
   * Validate nc_index and nr_index and go no further if they exceed the
18659
   * limits.
18660
   *
18661
   * 802.11be D3.0
18662
   */
18663
90
  if (nc_index > 7) {
18664
2
    expert_add_info_format(pinfo, mci, &ei_ieee80211_eht_invalid_nc_nr,
18665
2
                           "Nc indices (%d) > 7 are reserved", nc_index);
18666
2
    return offset;
18667
2
  }
18668
88
  if (nr_index == 0 || nr_index > 7) {
18669
2
    expert_add_info_format(pinfo, mci, &ei_ieee80211_eht_invalid_nc_nr,
18670
2
                           "Nr indices (%d) 0 and > 7 are reserved", nr_index);
18671
2
    return offset;
18672
2
  }
18673
86
  offset += 5;
18674
18675
86
  switch (feedback_type) {
18676
32
  case SU_FEEDBACK:
18677
32
    offset += add_ff_eht_su_beamforming_rpt(tree, tvb, pinfo, offset,
18678
32
                                            mimo_control);
18679
32
    break;
18680
52
  case MU_FEEDBACK:
18681
52
    offset += add_ff_eht_su_beamforming_rpt(tree, tvb, pinfo, offset,
18682
52
                                            mimo_control);
18683
52
    offset += add_ff_eht_mu_exclusive_beamforming_rpt(tree, tvb, pinfo, offset,
18684
52
                                                      mimo_control);
18685
52
    break;
18686
0
  case CQI_FEEDBACK:
18687
    /* TODO */
18688
0
    break;
18689
2
  default:
18690
2
    break;
18691
86
  }
18692
18693
9
  return offset - start;
18694
86
}
18695
18696
static const range_string eht_action_rvals[] = {
18697
  { 0, 0, "EHT Compressed Beamforming/CQI" },
18698
  { 1, 255, "Reserved" },
18699
  { 0, 0, NULL }
18700
};
18701
18702
static unsigned
18703
add_ff_action_eht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo,
18704
                  int offset)
18705
113
{
18706
113
  unsigned start = offset;
18707
113
  uint8_t eht_action;
18708
113
  proto_item *item = NULL;
18709
18710
113
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
18711
18712
113
  eht_action = tvb_get_uint8(tvb, offset);
18713
18714
113
  item = proto_tree_add_item(tree, hf_ieee80211_ff_eht_action, tvb, offset, 1,
18715
113
                             ENC_NA);
18716
113
  offset += 1;
18717
18718
113
  switch (eht_action) {
18719
90
  case 0:
18720
90
    offset += add_ff_eht_mimo_control_etc(tree, tvb, pinfo, offset);
18721
90
    break;
18722
23
  default:
18723
23
    expert_add_info_format(pinfo, item, &ei_ieee80211_eht_invalid_action,
18724
23
                           "Reserved EHT Action %u", eht_action);
18725
113
  }
18726
18727
36
  return offset - start;
18728
113
}
18729
18730
static unsigned
18731
add_ff_action_fst(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
18732
9
{
18733
9
  uint8_t code;
18734
9
  unsigned  start = offset;
18735
18736
9
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
18737
9
  code    = tvb_get_uint8(tvb, offset);
18738
9
  offset += add_ff_fst_action_code(tree, tvb, pinfo, offset);
18739
9
  switch (code) {
18740
2
    case FST_SETUP_REQUEST:
18741
2
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18742
2
      offset += add_ff_llt(tree, tvb, pinfo, offset);
18743
2
      break;
18744
0
    case FST_SETUP_RESPONSE:
18745
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18746
0
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18747
0
      break;
18748
0
    case FST_TEAR_DOWN:
18749
0
      offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
18750
0
      break;
18751
0
    case FST_ACK_REQUEST:
18752
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18753
0
      offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
18754
0
      break;
18755
2
    case FST_ACK_RESPONSE:
18756
2
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18757
2
      offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
18758
2
      break;
18759
1
    case FST_ON_CHANNEL_TUNNEL_REQUEST:
18760
1
      offset += add_ff_oct_mmpdu(tree, tvb, pinfo, offset);
18761
1
      break;
18762
9
  }
18763
9
  return offset - start;
18764
9
}
18765
18766
static int
18767
add_ff_scs_descriptor_list(proto_tree *tree, tvbuff_t *tvb,
18768
                           packet_info *pinfo _U_, int offset)
18769
3
{
18770
3
  unsigned start = offset;
18771
18772
  /*
18773
   * This is could be a list, so it needs change.
18774
   */
18775
3
  offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
18776
3
  return offset - start;
18777
3
}
18778
18779
static int
18780
add_ff_scs_response_count(proto_tree *tree, tvbuff_t *tvb,
18781
                          packet_info *pinfo _U_, int offset)
18782
19
{
18783
19
  proto_tree_add_item(tree, hf_ieee80211_ff_scs_response_count, tvb, offset, 1,
18784
19
                      ENC_NA);
18785
18786
19
  return 1;
18787
19
}
18788
18789
static int
18790
add_ff_scs_status_list(proto_tree *tree, tvbuff_t *tvb,
18791
                       packet_info *pinfo _U_, int offset, uint8_t count)
18792
19
{
18793
19
  unsigned start = offset;
18794
18795
1.41k
  while (count > 0) {
18796
1.39k
    if (tvb_reported_length_remaining(tvb, offset) >= 3) {
18797
727
      proto_tree_add_item(tree, hf_ieee80211_ff_scs_scsid, tvb, offset, 1,
18798
727
                          ENC_NA);
18799
727
      offset += 1;
18800
18801
727
      proto_tree_add_item(tree, hf_ieee80211_ff_scs_status, tvb, offset, 2,
18802
727
                          ENC_LITTLE_ENDIAN);
18803
727
      offset += 2;
18804
727
    }
18805
1.39k
    count--;
18806
1.39k
  }
18807
18808
19
  return offset - start;
18809
19
}
18810
18811
static int
18812
add_ff_mscs_descriptor_elt(proto_tree *tree, tvbuff_t *tvb,
18813
                           packet_info *pinfo _U_, int offset)
18814
1
{
18815
1
  unsigned start = offset;
18816
18817
1
  offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
18818
1
  return offset - start;
18819
1
}
18820
18821
static unsigned
18822
add_ff_action_robust_av_streaming(proto_tree *tree, tvbuff_t *tvb,
18823
                                  packet_info *pinfo, int offset)
18824
25
{
18825
25
  uint8_t code, count;
18826
25
  unsigned  start = offset;
18827
18828
25
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
18829
25
  code    = tvb_get_uint8(tvb, offset);
18830
25
  offset += add_ff_robust_av_streaming_action_code(tree, tvb, pinfo, offset);
18831
18832
25
  switch (code) {
18833
3
    case ROBUST_AV_STREAMING_SCS_REQUEST:
18834
3
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18835
3
      offset += add_ff_scs_descriptor_list(tree, tvb, pinfo, offset);
18836
3
      break;
18837
19
    case ROBUST_AV_STREAMING_SCS_RESPONSE:
18838
19
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18839
19
      count = tvb_get_uint8(tvb, offset);
18840
19
      offset += add_ff_scs_response_count(tree, tvb, pinfo, offset);
18841
19
      offset += add_ff_scs_status_list(tree, tvb, pinfo, offset, count);
18842
19
      break;
18843
1
    case ROBUST_AV_STREAMING_MSCS_REQUEST:
18844
1
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18845
1
      offset += add_ff_mscs_descriptor_elt(tree, tvb, pinfo, offset);
18846
1
    break;
18847
0
    case ROBUST_AV_STREAMING_MSCS_RESPONSE:
18848
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18849
0
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18850
      /* If there is any more data it is probably an mscs descriptor */
18851
0
      if (tvb_reported_length_remaining(tvb, offset) > 0)
18852
0
        offset += add_ff_mscs_descriptor_elt(tree, tvb, pinfo, offset);
18853
0
    break;
18854
25
  }
18855
25
  return offset - start;
18856
25
}
18857
18858
static unsigned
18859
add_ff_action_dmg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
18860
19
{
18861
19
  uint8_t code;
18862
19
  unsigned  start = offset;
18863
19
  int left_offset;
18864
18865
19
  offset += add_ff_category_code(tree, tvb, pinfo, offset);
18866
19
  code    = tvb_get_uint8(tvb, offset);
18867
19
  offset += add_ff_dmg_action_code(tree, tvb, pinfo, offset);
18868
19
  switch (code) {
18869
3
    case DMG_ACTION_PWR_SAVE_CONFIG_REQ:
18870
3
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18871
3
      offset += add_ff_dmg_pwr_mgmt(tree, tvb, pinfo, offset);
18872
3
      break;
18873
1
    case DMG_ACTION_PWR_SAVE_CONFIG_RES:
18874
1
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18875
1
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18876
1
      break;
18877
1
    case DMG_ACTION_INFO_REQ:
18878
1
      offset += add_ff_subject_address(tree, tvb, pinfo, offset);
18879
1
      break;
18880
0
    case DMG_ACTION_INFO_RES:
18881
0
      offset += add_ff_subject_address(tree, tvb, pinfo, offset);
18882
0
      break;
18883
1
    case DMG_ACTION_HANDOVER_REQ:
18884
1
      offset += add_ff_handover_reason(tree, tvb, pinfo, offset);
18885
1
      offset += add_ff_handover_remaining_bi(tree, tvb, pinfo, offset);
18886
1
      break;
18887
0
    case DMG_ACTION_HANDOVER_RES:
18888
0
      offset += add_ff_handover_result(tree, tvb, pinfo, offset);
18889
0
      offset += add_ff_handover_reject_reason(tree, tvb, pinfo, offset);
18890
0
      break;
18891
0
    case DMG_ACTION_DTP_REQ:
18892
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18893
0
      break;
18894
2
    case DMG_ACTION_DTP_RES:
18895
2
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18896
2
      break;
18897
1
    case DMG_ACTION_RELAY_SEARCH_REQ:
18898
1
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18899
1
      offset += add_ff_destination_reds_aid(tree, tvb, pinfo, offset);
18900
1
      break;
18901
0
    case DMG_ACTION_RELAY_SEARCH_RES:
18902
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18903
0
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18904
0
      break;
18905
0
    case DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_REQ:
18906
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18907
0
      break;
18908
4
    case DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_RES:
18909
4
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18910
4
      left_offset =
18911
4
          tvb_reported_length_remaining(tvb, offset);
18912
86
      while(left_offset > 0) {
18913
82
        proto_tree_add_item(tree, hf_ieee80211_ff_peer_sta_aid, tvb, offset, 1, ENC_NA);
18914
82
        proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset+1, 1, ENC_NA);
18915
82
        proto_tree_add_item(tree, hf_ieee80211_ff_internal_angle, tvb, offset+2, 1, ENC_NA);
18916
82
        proto_tree_add_item(tree, hf_ieee80211_ff_recommend, tvb, offset+2, 1, ENC_NA);
18917
        /* another reserved byte */
18918
82
        offset += 4;
18919
82
        left_offset -= 4;
18920
82
      }
18921
4
      break;
18922
0
    case DMG_ACTION_RLS_REQ:
18923
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18924
0
      offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
18925
0
      offset += add_ff_relay_aid(tree, tvb, pinfo, offset);
18926
0
      offset += add_ff_source_aid(tree, tvb, pinfo, offset);
18927
0
      break;
18928
2
    case DMG_ACTION_RLS_RES:
18929
2
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18930
2
      break;
18931
0
    case DMG_ACTION_RLS_ANNOUNCE:
18932
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18933
0
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18934
0
      offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
18935
0
      offset += add_ff_relay_aid(tree, tvb, pinfo, offset);
18936
0
      offset += add_ff_source_aid(tree, tvb, pinfo, offset);
18937
0
      break;
18938
0
    case DMG_ACTION_RLS_TEARDOWN:
18939
0
      offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
18940
0
      offset += add_ff_relay_aid(tree, tvb, pinfo, offset);
18941
0
      offset += add_ff_source_aid(tree, tvb, pinfo, offset);
18942
0
      break;
18943
0
    case DMG_ACTION_RELAY_ACK_REQ:
18944
0
    case DMG_ACTION_RELAY_ACK_RES:
18945
0
      break;
18946
0
    case DMG_ACTION_TPA_REQ:
18947
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18948
0
      offset += add_ff_timing_offset(tree, tvb, pinfo, offset);
18949
0
      offset += add_ff_sampling_frequency_offset(tree, tvb, pinfo, offset);
18950
0
      break;
18951
0
    case DMG_ACTION_TPA_RES:
18952
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18953
0
      break;
18954
0
    case DMG_ACTION_TPA_REP:
18955
0
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18956
0
      break;
18957
0
    case DMG_ACTION_ROC_REQ:
18958
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18959
0
      offset += add_ff_relay_operation_type(tree, tvb, pinfo, offset);
18960
0
      break;
18961
0
    case DMG_ACTION_ROC_RES:
18962
0
      offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
18963
0
      offset += add_ff_status_code(tree, tvb, pinfo, offset);
18964
0
      break;
18965
19
  }
18966
17
  return offset - start;
18967
19
}
18968
18969
unsigned
18970
add_ff_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
18971
              association_sanity_check_t *association_sanity_check)
18972
2.05k
{
18973
2.05k
  switch (tvb_get_uint8(tvb, offset) & 0x7f) {
18974
117
  case CAT_SPECTRUM_MGMT: /* 0 */
18975
117
    return add_ff_action_spectrum_mgmt(tree, tvb, pinfo, offset);
18976
10
  case CAT_QOS: /* 1 */
18977
10
    return add_ff_action_qos(tree, tvb, pinfo, offset);
18978
11
  case CAT_DLS: /* 2 */
18979
11
    return add_ff_action_dls(tree, tvb, pinfo, offset);
18980
5
  case CAT_BLOCK_ACK: /* 3 */
18981
5
    return add_ff_action_block_ack(tree, tvb, pinfo, offset);
18982
10
  case CAT_PUBLIC: /* 4 */
18983
10
    return add_ff_action_public(tree, tvb, pinfo, offset);
18984
763
  case CAT_RADIO_MEASUREMENT: /* 5 */
18985
763
    return add_ff_action_radio_measurement(tree, tvb, pinfo, offset);
18986
9
  case CAT_FAST_BSS_TRANSITION: /* 6 */
18987
9
    return add_ff_action_fast_bss_transition(tree, tvb, pinfo, offset);
18988
36
  case CAT_HT: /* 7 */
18989
36
    return add_ff_action_ht(tree, tvb, pinfo, offset);
18990
5
  case CAT_SA_QUERY: /* 8 */
18991
5
    return add_ff_action_sa_query(tree, tvb, pinfo, offset);
18992
21
  case CAT_PUBLIC_PROTECTED: /* 9 */
18993
21
    return add_ff_action_protected_public(tree, tvb, pinfo, offset);
18994
10
  case CAT_WNM: /* 10 */
18995
10
    return add_ff_action_wnm(tree, tvb, pinfo, offset);
18996
5
  case CAT_UNPROTECTED_WNM: /* 11 */
18997
5
    return add_ff_action_unprotected_wnm(tree, tvb, pinfo, offset);
18998
51
  case CAT_TDLS: /* 12 */
18999
51
    return add_ff_action_tdls(tree, tvb, pinfo, offset);
19000
4
  case CAT_MESH: /* 13 */
19001
4
    return add_ff_action_mesh(tree, tvb, pinfo, offset);
19002
3
  case CAT_MULTIHOP: /* 14 */
19003
3
    return add_ff_action_multihop(tree, tvb, pinfo, offset);
19004
2
  case CAT_SELF_PROTECTED: /* 15 */
19005
2
    return add_ff_action_self_protected(tree, tvb, pinfo, offset, association_sanity_check);
19006
19
  case CAT_DMG: /* 16 */
19007
19
    return add_ff_action_dmg(tree, tvb, pinfo, offset);
19008
3
  case CAT_MGMT_NOTIFICATION:  /* Management notification frame - 17 */
19009
3
    return add_ff_action_mgmt_notification(tree, tvb, pinfo, offset);
19010
9
  case CAT_FAST_SESSION_TRANSFER: /* 18 */
19011
9
    return add_ff_action_fst(tree, tvb, pinfo, offset);
19012
25
  case CAT_ROBUST_AV_STREAMING: /* 19 */
19013
25
    return add_ff_action_robust_av_streaming(tree, tvb, pinfo, offset);
19014
3
  case CAT_UNPROTECTED_DMG: /* 20 */
19015
3
    return add_ff_action_unprotected_dmg(tree, tvb, pinfo, offset);
19016
130
  case CAT_VHT: /* 21 */
19017
130
    return add_ff_action_vht(tree, tvb, pinfo, offset);
19018
5
  case CAT_S1G: /* 22 */
19019
5
    return add_ff_action_s1g(tree, tvb, pinfo, offset);
19020
3
  case CAT_PROTECTED_S1G: /* 23 */
19021
3
    return add_ff_action_protected_s1g(tree, tvb, pinfo, offset);
19022
118
  case CAT_HE:
19023
118
    return add_ff_action_he(tree, tvb, pinfo, offset);
19024
5
  case CAT_PROTECTED_HE:
19025
5
    return add_ff_action_protected_he(tree, tvb, pinfo, offset);
19026
498
  case CAT_PROTECTED_EHT:
19027
498
    return add_ff_action_protected_eht(tree, tvb, pinfo, offset);
19028
2
  case CAT_PROTECTED_FTM:
19029
2
    return add_ff_action_protected_ftm(tree, tvb, pinfo, offset);
19030
113
  case CAT_EHT:
19031
113
    return add_ff_action_eht(tree, tvb, pinfo, offset);
19032
1
  case CAT_VENDOR_SPECIFIC_PROTECTED: /* Same as below for now */
19033
3
  case CAT_VENDOR_SPECIFIC:  /* Vendor Specific Protected Category - 127 */
19034
3
    return add_ff_action_vendor_specific(tree, tvb, pinfo, offset);
19035
57
  default:
19036
57
    add_ff_category_code(tree, tvb, pinfo, offset);
19037
57
    return 1;
19038
2.05k
  }
19039
2.05k
}
19040
19041
static const value_string ieee80211_rsn_cipher_vals[] = {
19042
  {0, "NONE"},
19043
  {1, "WEP (40-bit)"},
19044
  {2, "TKIP"},
19045
  {3, "AES (OCB)"},
19046
  {4, "AES (CCM)"},
19047
  {5, "WEP (104-bit)"},
19048
  {6, "BIP (128)"},
19049
  {7, "Group addressed traffic not allowed"},
19050
  {8, "GCMP (128)" },
19051
  {9, "GCMP (256)" },
19052
  {10, "CCMP (256)" },
19053
  {11, "BIP (GMAC-128)" },
19054
  {12, "BIP (GMAC-256)" },
19055
  {13, "BIP (CMAC-256)" },
19056
  {0, NULL}
19057
};
19058
19059
#define AKMS_NONE                 0x000FAC00
19060
#define AKMS_WPA                  0x000FAC01
19061
#define AKMS_PSK                  0x000FAC02
19062
0
#define AKMS_FT_IEEE802_1X        0x000FAC03
19063
0
#define AKMS_FT_PSK               0x000FAC04
19064
#define AKMS_WPA_SHA256           0x000FAC05
19065
#define AKMS_PSK_SHA256           0x000FAC06
19066
#define AKMS_TDLS                 0x000FAC07
19067
#define AKMS_SAE                  0x000FAC08
19068
0
#define AKMS_FT_SAE               0x000FAC09
19069
#define AKMS_AP_PEER_KEY          0x000FAC0A
19070
#define AKMS_WPA_SHA256_SUITEB    0x000FAC0B
19071
0
#define AKMS_WPA_SHA384_SUITEB    0x000FAC0C
19072
0
#define AKMS_FT_IEEE802_1X_SHA384 0x000FAC0D
19073
0
#define AKMS_FILS_SHA256          0x000FAC0E
19074
0
#define AKMS_FILS_SHA384          0x000FAC0F
19075
0
#define AKMS_FT_FILS_SHA256       0x000FAC10
19076
0
#define AKMS_FT_FILS_SHA384       0x000FAC11
19077
0
#define AKMS_OWE                  0x000FAC12
19078
0
#define AKMS_SAE_GROUP_DEPEND     0x000FAC18
19079
0
#define AKMS_FT_SAE_GROUP_DEPEND  0x000FAC19
19080
19081
static const value_string ieee80211_rsn_keymgmt_vals[] = {
19082
  {0, "NONE"},
19083
  {1, "WPA"},
19084
  {2, "PSK"},
19085
  {3, "FT over IEEE 802.1X"},
19086
  {4, "FT using PSK"},
19087
  {5, "WPA (SHA256)"},
19088
  {6, "PSK (SHA256)"},
19089
  {7, "TDLS / TPK Handshake (SHA256)"},
19090
  {8, "SAE (SHA256)" },
19091
  {9, "FT using SAE (SHA256)" },
19092
  {10, "APPeerKey (SHA256)" },
19093
  {11, "WPA (SHA256-SuiteB)" },
19094
  {12, "WPA (SHA384-SuiteB)" },
19095
  {13, "FT over IEEE 802.1X (SHA384)" },
19096
  {14, "FILS (SHA256 and AES-SIV-256)" },
19097
  {15, "FILS (SHA384 and AES-SIV-512)" },
19098
  {16, "FT over FILS (SHA256 and AES-SIV-256)" },
19099
  {17, "FT over FILS (SHA384 and AES-SIV-512)" },
19100
  {18, "Opportunistic Wireless Encryption"},
19101
  {19, "FT using PSK (SHA384)"},
19102
  {20, "PSK (SHA384)"},
19103
  {21, "PASN"},
19104
  {24, "SAE (GROUP-DEPEND)"},
19105
  {25, "FT using SAE (GROUP-DEPEND)"},
19106
  {0, NULL}
19107
};
19108
19109
#define OUIBASELEN (MAXNAMELEN + 12)
19110
19111
static void
19112
oui_base_custom(char *result, uint32_t oui)
19113
0
{
19114
0
  uint8_t      p_oui[3];
19115
0
  const char *manuf_name;
19116
19117
0
  p_oui[0] = oui >> 16 & 0xFF;
19118
0
  p_oui[1] = oui >> 8 & 0xFF;
19119
0
  p_oui[2] = oui & 0xFF;
19120
19121
0
  static_assert(OUIBASELEN <= ITEM_LABEL_LENGTH, "Buffer size mismatch!");
19122
  /* Attempt an OUI lookup. */
19123
0
  manuf_name = uint_get_manuf_name_if_known(oui);
19124
0
  if (manuf_name == NULL) {
19125
    /* Could not find an OUI. */
19126
0
    snprintf(result, OUIBASELEN, "%02x:%02x:%02x", p_oui[0], p_oui[1], p_oui[2]);
19127
0
  }
19128
0
  else {
19129
   /* Found an address string. */
19130
0
    snprintf(result, OUIBASELEN, "%02x:%02x:%02x (%.*s)", p_oui[0], p_oui[1], p_oui[2], MAXNAMELEN, manuf_name);
19131
0
  }
19132
0
}
19133
19134
static void
19135
rsn_gcs_base_custom(char *result, uint32_t gcs)
19136
0
{
19137
0
  char oui_result[OUIBASELEN];
19138
0
  char *tmp_str;
19139
19140
0
  oui_result[0] = '\0';
19141
0
  oui_base_custom(oui_result, gcs >> 8);
19142
0
  tmp_str = val_to_str_wmem(NULL, gcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
19143
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19144
0
  wmem_free(NULL, tmp_str);
19145
0
}
19146
19147
static void
19148
rsn_pcs_base_custom(char *result, uint32_t pcs)
19149
0
{
19150
0
  char oui_result[OUIBASELEN];
19151
0
  char *tmp_str;
19152
19153
0
  oui_result[0] = '\0';
19154
0
  oui_base_custom(oui_result, pcs >> 8);
19155
0
  tmp_str = val_to_str_wmem(NULL, pcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
19156
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19157
0
  wmem_free(NULL, tmp_str);
19158
19159
0
}
19160
static void
19161
rsn_akms_base_custom(char *result, uint32_t akms)
19162
0
{
19163
0
  char oui_result[OUIBASELEN];
19164
0
  char *tmp_str;
19165
19166
0
  oui_result[0] = '\0';
19167
0
  oui_base_custom(oui_result, akms >> 8);
19168
0
  tmp_str = val_to_str_wmem(NULL, akms & 0xFF, ieee80211_rsn_keymgmt_vals, "Unknown %d");
19169
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19170
0
  wmem_free(NULL, tmp_str);
19171
0
}
19172
19173
static char *
19174
rsn_pcs_return(wmem_allocator_t *scope, uint32_t pcs)
19175
0
{
19176
0
  char *result;
19177
19178
0
  result = (char *)wmem_alloc(scope, SHORT_STR);
19179
0
  result[0] = '\0';
19180
0
  rsn_pcs_base_custom(result, pcs);
19181
19182
0
  return result;
19183
0
}
19184
19185
static char *
19186
rsn_akms_return(wmem_allocator_t *scope, uint32_t akms)
19187
0
{
19188
0
  char *result;
19189
19190
0
  result = (char *)wmem_alloc(scope, SHORT_STR);
19191
0
  result[0] = '\0';
19192
0
  rsn_akms_base_custom(result, akms);
19193
19194
0
  return result;
19195
0
}
19196
19197
static void
19198
rsn_gmcs_base_custom(char *result, uint32_t gmcs)
19199
0
{
19200
0
  char oui_result[OUIBASELEN];
19201
0
  char *tmp_str;
19202
19203
0
  oui_result[0] = '\0';
19204
0
  oui_base_custom(oui_result, gmcs >> 8);
19205
0
  tmp_str = val_to_str_wmem(NULL, gmcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
19206
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19207
0
  wmem_free(NULL, tmp_str);
19208
0
}
19209
19210
static void
19211
rsni_base_custom(char *result, uint8_t rsni)
19212
0
{
19213
0
  double temp_double;
19214
19215
0
  if (rsni < 255) {
19216
0
    temp_double = (double)rsni - 20;
19217
0
    snprintf(result, ITEM_LABEL_LENGTH, "%.1f dB", (temp_double / 2));
19218
0
  } else
19219
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d (Measurement not available)", rsni);
19220
0
}
19221
19222
static void
19223
vht_tpe_custom(char *result, uint8_t txpwr)
19224
0
{
19225
0
  int8_t txpwr_db;
19226
19227
0
  txpwr_db = (int8_t)(txpwr);
19228
0
  snprintf(result, ITEM_LABEL_LENGTH, "%3.1f dBm", (txpwr_db/2.0));
19229
0
}
19230
19231
static void
19232
tpe_psd_custom(char *result, uint8_t txpwr)
19233
0
{
19234
0
  int8_t txpwr_db;
19235
19236
0
  txpwr_db = (int8_t)(txpwr);
19237
0
  if (txpwr_db == -128) {
19238
0
    snprintf(result, ITEM_LABEL_LENGTH, "Channel cannot be used for transmission");
19239
0
  } else if (txpwr_db == 127) {
19240
0
    snprintf(result, ITEM_LABEL_LENGTH, "No maximum PSD is specified for channel");
19241
0
  } else {
19242
0
    snprintf(result, ITEM_LABEL_LENGTH, "%3.1f dBm/MHz", (txpwr_db/2.0));
19243
0
  }
19244
0
}
19245
19246
static void
19247
channel_number_custom(char *result, uint8_t channel_number)
19248
0
{
19249
0
  switch(channel_number){
19250
0
    case 0:
19251
0
      snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on all supported channels in the specified Operating Class)", channel_number);
19252
0
    break;
19253
0
    case 255:
19254
0
      snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on all supported channels listed in the AP Channel Report)", channel_number);
19255
0
    break;
19256
0
    default :
19257
0
      snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on that Channel Number)", channel_number);
19258
0
    break;
19259
0
  }
19260
0
}
19261
19262
/* WPA / WME */
19263
static const value_string ieee802111_wfa_ie_type_vals[] = {
19264
  { 1, "WPA Information Element" },
19265
  { 2, "WMM/WME" },
19266
  { 4, "WPS" },
19267
  { 17, "Network Cost" },
19268
  { 18, "Tethering" },
19269
  { 0, NULL }
19270
};
19271
19272
static const value_string ieee80211_wfa_ie_wpa_cipher_vals[] = {
19273
  { 0, "NONE" },
19274
  { 1, "WEP (40-bit)" },
19275
  { 2, "TKIP" },
19276
  { 3, "AES (OCB)" },
19277
  { 4, "AES (CCM)" },
19278
  { 5, "WEP (104-bit)" },
19279
  { 6, "BIP" },
19280
  { 7, "Group addressed traffic not allowed" },
19281
  { 0, NULL }
19282
};
19283
19284
static const value_string ieee80211_wfa_ie_wpa_keymgmt_vals[] = {
19285
  { 0, "NONE" },
19286
  { 1, "WPA" },
19287
  { 2, "PSK" },
19288
  { 3, "FT over IEEE 802.1X" },
19289
  { 4, "FT using PSK" },
19290
  { 5, "WPA (SHA256)" },
19291
  { 6, "PSK (SHA256)" },
19292
  { 7, "TDLS / TPK Handshake" },
19293
  { 0, NULL }
19294
};
19295
19296
static const value_string ieee80211_wfa_ie_wme_acs_vals[] = {
19297
  { 0, "Best Effort" },
19298
  { 1, "Background" },
19299
  { 2, "Video" },
19300
  { 3, "Voice" },
19301
  { 0, NULL }
19302
};
19303
19304
static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_direction_vals[] = {
19305
  { 0, "Uplink" },
19306
  { 1, "Downlink" },
19307
  { 2, "Direct link" },
19308
  { 3, "Bidirectional link" },
19309
  { 0, NULL }
19310
};
19311
19312
static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_psb_vals[] = {
19313
  { 0, "Legacy" },
19314
  { 1, "U-APSD" },
19315
  { 0, NULL }
19316
};
19317
19318
static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_up_vals[] = {
19319
  { 0, "Best Effort" },
19320
  { 1, "Background" },
19321
  { 2, "Spare" },
19322
  { 3, "Excellent Effort" },
19323
  { 4, "Controlled Load" },
19324
  { 5, "Video" },
19325
  { 6, "Voice" },
19326
  { 7, "Network Control" },
19327
  { 0, NULL }
19328
};
19329
19330
/* Cost Level https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nct/24b04427-4ed6-4d12-a73d-c89ea72c7a94 */
19331
static const value_string ieee80211_wfa_ie_nc_cost_level_vals[] = {
19332
  { 0x0, "Unknown / The connection cost is unknown" },
19333
  { 0x01, "Unrestricted / The connection is unlimited and has unrestricted usage constraints" },
19334
  { 0x02, "Fixed / Usage counts toward a fixed allotment of data which the user has already paid for (or agreed to pay for)" },
19335
  { 0x04, "Variable / The connection cost is on a per-byte basis" },
19336
  {0, NULL}
19337
};
19338
19339
/* Cost Flags https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nct/b601a6a0-a4ff-4527-bf43-2eeee8c5796b */
19340
static const value_string ieee80211_wfa_ie_nc_cost_flags_vals[] = {
19341
  { 0x0, "Unknown / The usage is unknown or unrestricted" },
19342
  { 0x01, "Over Data Limit / Usage has exceeded the data limit of the metered network; different network costs or conditions might apply" },
19343
  { 0x02, "Congested / The network operator is experiencing or expecting heavy load" },
19344
  { 0x04, "Roaming / The tethering connection is roaming outside the provider's home network or affiliates" },
19345
  { 0x08, "Approaching Data Limit / Usage is near the data limit of the metered network; different network costs or conditions might apply once the limit is reached" },
19346
  {0, NULL}
19347
};
19348
19349
19350
static const value_string ieee80211_wfa_ie_tethering_type_vals[] = {
19351
  { 0x2B, "Broadcasted" },
19352
  {0, NULL}
19353
};
19354
19355
19356
static const value_string ieee802111_wfa_ie_wme_qos_info_sta_max_sp_length_vals[] = {
19357
  { 0, "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" },
19358
  { 1, "WMM AP may deliver a maximum of 2 buffered frames (MSDUs and MMPDUs) per USP" },
19359
  { 2, "WMM AP may deliver a maximum of 4 buffered frames (MSDUs and MMPDUs) per USP" },
19360
  { 3, "WMM AP may deliver a maximum of 6 buffered frames (MSDUs and MMPDUs) per USP" },
19361
  { 0, NULL}
19362
};
19363
static const true_false_string ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs = {
19364
  "WMM delivery and trigger enabled",
19365
  "non-WMM PS"
19366
};
19367
19368
/* az: Ranging Parameters */
19369
static const val64_string ieee80211_ranging_status_vals[] = {
19370
  { 0, "Reserved" },
19371
  { 1, "Successful; measurement exchanges are about to begin" },
19372
  { 2, "Request incapable; do not send same request again; FTM session ends" },
19373
  { 3, "Request failed; do not send new request for Value seconds; FTM session ends" },
19374
  { 0, NULL }
19375
};
19376
19377
static const val64_string ieee80211_ranging_fmt_bw_vals[] = {
19378
  { 0, "HE 20 MHz" },
19379
  { 1, "HE 40 MHz" },
19380
  { 2, "HE 80 MHz" },
19381
  { 3, "HE 80+80 MHz" },
19382
  { 4, "HE 160 MHz (two separate RF LOs)" },
19383
  { 5, "HE 160 MHz (single RF LO)" },
19384
  /* values 6-63 reserved */
19385
  { 0, NULL }
19386
};
19387
19388
static const val64_string ieee80211_ranging_ltf_total_vals[] = {
19389
  { 0, "4 LTFs" },
19390
  { 1, "8 LTFs" },
19391
  { 2, "16 LTFs" },
19392
  { 3, "No max LTFs specified" },
19393
  { 0, NULL }
19394
};
19395
19396
static void
19397
wpa_mcs_base_custom(char *result, uint32_t mcs)
19398
0
{
19399
0
  char oui_result[OUIBASELEN];
19400
0
  char *tmp_str;
19401
19402
0
  oui_result[0] = '\0';
19403
0
  oui_base_custom(oui_result, mcs >> 8);
19404
0
  tmp_str = val_to_str_wmem(NULL, mcs & 0xFF, ieee80211_wfa_ie_wpa_cipher_vals, "Unknown %d");
19405
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19406
0
  wmem_free(NULL, tmp_str);
19407
0
}
19408
19409
static void
19410
wpa_ucs_base_custom(char *result, uint32_t ucs)
19411
0
{
19412
0
  char oui_result[OUIBASELEN];
19413
0
  char *tmp_str;
19414
19415
0
  oui_result[0] = '\0';
19416
0
  oui_base_custom(oui_result, ucs >> 8);
19417
0
  tmp_str = val_to_str_wmem(NULL, ucs & 0xFF, ieee80211_wfa_ie_wpa_cipher_vals, "Unknown %d");
19418
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19419
0
  wmem_free(NULL, tmp_str);
19420
0
}
19421
static void
19422
wpa_akms_base_custom(char *result, uint32_t akms)
19423
0
{
19424
0
  char oui_result[OUIBASELEN];
19425
0
  char *tmp_str;
19426
19427
0
  oui_result[0] = '\0';
19428
0
  oui_base_custom(oui_result, akms >> 8);
19429
0
  tmp_str = val_to_str_wmem(NULL, akms & 0xFF, ieee80211_wfa_ie_wpa_keymgmt_vals, "Unknown %d");
19430
0
  snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
19431
0
  wmem_free(NULL, tmp_str);
19432
0
}
19433
19434
static char *
19435
wpa_ucs_return(wmem_allocator_t *scope, uint32_t ucs)
19436
0
{
19437
0
  char *result;
19438
19439
0
  result = (char *)wmem_alloc(scope, SHORT_STR);
19440
0
  result[0] = '\0';
19441
0
  wpa_ucs_base_custom(result, ucs);
19442
19443
0
  return result;
19444
0
}
19445
19446
static char *
19447
wpa_akms_return(wmem_allocator_t *scope, uint32_t akms)
19448
0
{
19449
0
  char *result;
19450
19451
0
  result = (char *)wmem_alloc(scope, SHORT_STR);
19452
0
  result[0] = '\0';
19453
0
  wpa_akms_base_custom(result, akms);
19454
19455
0
  return result;
19456
0
}
19457
19458
/* For each Field */
19459
static const value_string ieee80211_wapi_suite_type[] = {
19460
  {0, "Reserved"},
19461
  {1, "WAI Certificate Authentication and Key Management"},
19462
  {2, "WAI Preshared Key Authentication and Key Management"},
19463
  {0, NULL},
19464
};
19465
/* For Summary Tag Information */
19466
static const value_string ieee80211_wapi_suite_type_short[] = {
19467
  {0, "Reserved"},
19468
  {1, "WAI-CERT"},
19469
  {2, "WAI-PSK"},
19470
  {0, NULL},
19471
};
19472
19473
static const value_string ieee80211_wapi_cipher_type[] = {
19474
  {0, "Reserved"},
19475
  {1, "WPI-SMS4"},
19476
  {0, NULL},
19477
};
19478
19479
static const value_string ieee802111_wfa_ie_wme_type[] = {
19480
  { 0, "Information Element" },
19481
  { 1, "Parameter Element" },
19482
  { 2, "TSPEC Element" },
19483
  { 0, NULL}
19484
};
19485
19486
static const value_string ft_subelem_id_vals[] = {
19487
  {0, "Reserved"},
19488
  {1, "PMK-R1 key holder identifier (R1KH-ID)"},
19489
  {2, "GTK subelement"},
19490
  {3, "PMK-R0 key holder identifier (R0KH-ID)"},
19491
  {4, "IGTK"},
19492
  {5, "Operating Channel Information (OCI)"},
19493
  {6, "BIGTK"},
19494
  {7, "WIGTK"},
19495
  {8, "MLO GTK"},
19496
  {9, "MLO IGTK"},
19497
  {10, "MLO BIGTK"},
19498
  {0, NULL}
19499
};
19500
19501
static int
19502
dissect_wme_qos_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
19503
26
{
19504
26
  proto_item *wme_qos_info_item;
19505
19506
26
  static int * const ieee80211_mgt_req[] = {
19507
26
    &hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length,
19508
26
    &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be,
19509
26
    &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk,
19510
26
    &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi,
19511
26
    &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo,
19512
26
    &hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved,
19513
26
    NULL
19514
26
  };
19515
19516
26
  static int * const ieee80211_mgt_resp[] = {
19517
26
    &hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd,
19518
26
    &hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count,
19519
26
    &hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved,
19520
26
    NULL
19521
26
  };
19522
19523
26
  switch (ftype) {
19524
5
    case MGT_ASSOC_REQ:
19525
5
    case MGT_PROBE_REQ:
19526
5
    case MGT_REASSOC_REQ:
19527
5
    {
19528
      /* To AP so decode as per WMM standard Figure 7 QoS Info field when sent from WMM STA*/
19529
5
      proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_qos_info,
19530
5
                                    ett_wme_qos_info, ieee80211_mgt_req,
19531
5
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
19532
5
      break;
19533
5
    }
19534
0
    case MGT_BEACON:
19535
0
    case MGT_PROBE_RESP:
19536
0
    case MGT_ASSOC_RESP:
19537
0
    case MGT_REASSOC_RESP:
19538
12
    case MGT_ACTION:
19539
12
    {
19540
      /* From AP so decode as per WMM standard Figure 6 QoS Info field when sent from WMM AP */
19541
12
      proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_qos_info,
19542
12
                                    ett_wme_qos_info, ieee80211_mgt_resp,
19543
12
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
19544
12
      break;
19545
0
    }
19546
9
    default:
19547
9
        wme_qos_info_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_qos_info, tvb, offset, 1, ENC_NA);
19548
9
        expert_add_info_format(pinfo, wme_qos_info_item, &ei_ieee80211_wfa_ie_wme_qos_info_bad_ftype, "Could not deduce direction to decode correctly, ftype %u", ftype);
19549
9
      break;
19550
26
    }
19551
19552
26
  offset += 1;
19553
26
  return offset;
19554
26
}
19555
19556
static int * const update_edca_info_headers[] = {
19557
  &hf_ieee80211_s1g_update_edca_override,
19558
  &hf_ieee80211_s1g_update_edca_ps_poll_aci,
19559
  &hf_ieee80211_s1g_update_edca_raw_aci,
19560
  &hf_ieee80211_s1g_update_edca_sta_type,
19561
  &hf_ieee80211_s1g_update_edca_reserved,
19562
  NULL
19563
};
19564
19565
static const value_string sta_field_type_vals[] = {
19566
  { 0, "Valid for both sensor and non-sensor STAs" },
19567
  { 1, "Valid for sensor STAs" },
19568
  { 2, "Valid for non-sensor STAs" },
19569
  { 3, "Reserved" },
19570
  { 0, NULL }
19571
};
19572
19573
static int
19574
decode_qos_parameter_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
19575
26
{
19576
26
  int i;
19577
26
  bool is_s1g = sta_is_s1g(pinfo);
19578
  /* WME QoS Info Field */
19579
26
  offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype);
19580
  /* WME Reserved Field or EDCA Update */
19581
26
  if (is_s1g) {
19582
8
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
19583
8
                            hf_ieee80211_s1g_update_edca_info,
19584
8
                            ett_update_edca_info, update_edca_info_headers,
19585
8
                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
19586
19587
18
  } else {
19588
18
    proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_reserved, tvb, offset, 1, ENC_NA);
19589
18
  }
19590
19591
26
  offset += 1;
19592
  /* AC Parameters */
19593
129
  for (i = 0; i < 4; i++)
19594
103
  {
19595
103
    proto_item *ac_item, *aci_aifsn_item, *ecw_item, *cw_item;
19596
103
    proto_tree *ac_tree, *ecw_tree;
19597
103
    uint8_t aci_aifsn, ecw, ecwmin, ecwmax;
19598
103
    uint16_t cwmin, cwmax;
19599
103
    static int * const ieee80211_wfa_ie_wme_be[] = {
19600
103
        &hf_ieee80211_wfa_ie_wme_acp_aci_be,
19601
103
        &hf_ieee80211_wfa_ie_wme_acp_acm_be,
19602
103
        &hf_ieee80211_wfa_ie_wme_acp_aifsn_be,
19603
103
        &hf_ieee80211_wfa_ie_wme_acp_reserved_be,
19604
103
        NULL
19605
103
    };
19606
19607
103
    static int * const ieee80211_wfa_ie_wme_bk[] = {
19608
103
        &hf_ieee80211_wfa_ie_wme_acp_aci_bk,
19609
103
        &hf_ieee80211_wfa_ie_wme_acp_acm_bk,
19610
103
        &hf_ieee80211_wfa_ie_wme_acp_aifsn_bk,
19611
103
        &hf_ieee80211_wfa_ie_wme_acp_reserved_bk,
19612
103
        NULL
19613
103
    };
19614
19615
103
    static int * const ieee80211_wfa_ie_wme_vi[] = {
19616
103
        &hf_ieee80211_wfa_ie_wme_acp_aci_vi,
19617
103
        &hf_ieee80211_wfa_ie_wme_acp_acm_vi,
19618
103
        &hf_ieee80211_wfa_ie_wme_acp_aifsn_vi,
19619
103
        &hf_ieee80211_wfa_ie_wme_acp_reserved_vi,
19620
103
        NULL
19621
103
    };
19622
19623
103
    static int * const ieee80211_wfa_ie_wme_vo[] = {
19624
103
        &hf_ieee80211_wfa_ie_wme_acp_aci_vo,
19625
103
        &hf_ieee80211_wfa_ie_wme_acp_acm_vo,
19626
103
        &hf_ieee80211_wfa_ie_wme_acp_aifsn_vo,
19627
103
        &hf_ieee80211_wfa_ie_wme_acp_reserved_vo,
19628
103
        NULL
19629
103
    };
19630
19631
103
    static int * const * ie_wme_hdrs[] = {
19632
103
       ieee80211_wfa_ie_wme_be,
19633
103
       ieee80211_wfa_ie_wme_bk,
19634
103
       ieee80211_wfa_ie_wme_vi,
19635
103
       ieee80211_wfa_ie_wme_vo
19636
103
    };
19637
19638
103
    static int * const ecw_max_hf[] = {
19639
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_max_be,
19640
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_max_bk,
19641
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_max_vi,
19642
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_max_vo
19643
103
    };
19644
19645
103
    static int * const ecw_min_hf[] = {
19646
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_min_be,
19647
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_min_bk,
19648
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_min_vi,
19649
103
      &hf_ieee80211_wfa_ie_wme_acp_ecw_min_vo
19650
103
    };
19651
19652
103
    static int * const txop_limit_hf[] = {
19653
103
      &hf_ieee80211_wfa_ie_wme_acp_txop_limit_be,
19654
103
      &hf_ieee80211_wfa_ie_wme_acp_txop_limit_bk,
19655
103
      &hf_ieee80211_wfa_ie_wme_acp_txop_limit_vi,
19656
103
      &hf_ieee80211_wfa_ie_wme_acp_txop_limit_vo
19657
103
    };
19658
19659
103
    ac_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_ac_parameters, tvb, offset, 4, ENC_NA);
19660
103
    ac_tree = proto_item_add_subtree(ac_item, ett_wme_ac);
19661
19662
    /* ACI/AIFSN Field */
19663
103
    aci_aifsn_item = proto_tree_add_bitmask_with_flags(ac_tree, tvb, offset, hf_ieee80211_wfa_ie_wme_acp_aci_aifsn,
19664
103
                            ett_wme_aci_aifsn, ie_wme_hdrs[i],
19665
103
                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
19666
103
    aci_aifsn = tvb_get_uint8(tvb, offset);
19667
    /* 802.11-2012, 8.4.2.31 EDCA Parameter Set element */
19668
103
    if (aci_aifsn < 2) {
19669
56
       expert_add_info_format(pinfo, aci_aifsn_item, &ei_ieee80211_qos_bad_aifsn,
19670
56
         "The minimum value for the AIFSN subfield is 2 (found %u).", aci_aifsn);
19671
56
    }
19672
103
    proto_item_append_text(ac_item, " ACI %u (%s), ACM %s, AIFSN %u",
19673
103
      (aci_aifsn & 0x60) >> 5, try_val_to_str((aci_aifsn & 0x60) >> 5, ieee80211_wfa_ie_wme_acs_vals),
19674
103
      (aci_aifsn & 0x10) ? "yes" : "no", aci_aifsn & 0x0f);
19675
103
    offset += 1;
19676
19677
    /* ECWmin/ECWmax field */
19678
103
    ecw_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_ecw, tvb, offset, 1, ENC_NA);
19679
103
    ecw_tree = proto_item_add_subtree(ecw_item, ett_wme_ecw);
19680
103
    ecw = tvb_get_uint8(tvb, offset);
19681
103
    ecwmin = ecw & 0x0f;
19682
103
    ecwmax = (ecw & 0xf0) >> 4;
19683
103
    cwmin= (1 << ecwmin) - 1;
19684
103
    cwmax= (1 << ecwmax) - 1;
19685
103
    cw_item = proto_tree_add_item(ecw_tree, *ecw_max_hf[i], tvb, offset, 1, ENC_NA);
19686
103
    proto_item_append_text(cw_item, " (CW Max: %u)", cwmax);
19687
103
    cw_item = proto_tree_add_item(ecw_tree, *ecw_min_hf[i], tvb, offset, 1, ENC_NA);
19688
103
    proto_item_append_text(cw_item, " (CW Min: %u)", cwmin);
19689
103
    proto_item_append_text(ac_item, ", ECWmin/max %u/%u (CWmin/max %u/%u)", ecwmin, ecwmax, cwmin, cwmax);
19690
103
    offset += 1;
19691
19692
    /* TXOP Limit */
19693
103
    proto_tree_add_item(ac_tree, *txop_limit_hf[i], tvb, offset, 2, ENC_LITTLE_ENDIAN);
19694
103
    proto_item_append_text(ac_item, ", TXOP %u", tvb_get_letohs(tvb, offset));
19695
103
    offset += 2;
19696
103
  }
19697
19698
26
  return offset;
19699
26
}
19700
19701
static int
19702
dissect_vendor_ie_wpawme(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, uint32_t tag_len, int ftype)
19703
0
{
19704
0
  uint8_t type;
19705
19706
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_type, tvb, offset, 1, ENC_NA);
19707
0
  type = tvb_get_uint8(tvb, offset);
19708
0
  proto_item_append_text(tree, ": %s", val_to_str(type, ieee802111_wfa_ie_type_vals, "Unknown %d"));
19709
0
  offset += 1;
19710
19711
0
  switch (type) {
19712
0
    case 1:   /* Wi-Fi Protected Access (WPA) */
19713
0
    {
19714
0
      proto_item *wpa_mcs_item, *wpa_ucs_item, *wpa_akms_item;
19715
0
      proto_item *wpa_sub_ucs_item, *wpa_sub_akms_item;
19716
0
      proto_tree *wpa_mcs_tree, *wpa_ucs_tree, *wpa_akms_tree;
19717
0
      proto_tree *wpa_sub_ucs_tree, *wpa_sub_akms_tree;
19718
0
      uint16_t ucs_count, akms_count;
19719
0
      unsigned ii;
19720
19721
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19722
0
      offset += 2;
19723
19724
      /* Multicast Cipher Suite */
19725
0
      wpa_mcs_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_mcs, tvb, offset, 4, ENC_BIG_ENDIAN);
19726
0
      wpa_mcs_tree = proto_item_add_subtree(wpa_mcs_item, ett_wpa_mcs_tree);
19727
0
      proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
19728
19729
      /* Check if OUI is 00:50:F2 (WFA) */
19730
0
      if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
19731
0
      {
19732
0
        proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_wfa_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
19733
0
        save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset + 3), GROUP_CIPHER_KEY);
19734
0
      } else {
19735
0
        proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
19736
0
      }
19737
0
      offset += 4;
19738
19739
      /* Unicast Cipher Suites */
19740
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_ucs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19741
0
      ucs_count = tvb_get_letohs(tvb, offset);
19742
0
      offset += 2;
19743
19744
0
      wpa_ucs_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_ucs_list, tvb, offset, ucs_count * 4, ENC_NA);
19745
0
      wpa_ucs_tree = proto_item_add_subtree(wpa_ucs_item, ett_wpa_ucs_tree);
19746
0
      for (ii = 0; ii < ucs_count; ii++)
19747
0
      {
19748
0
        wpa_sub_ucs_item = proto_tree_add_item(wpa_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs, tvb, offset, 4, ENC_BIG_ENDIAN);
19749
0
        wpa_sub_ucs_tree = proto_item_add_subtree(wpa_sub_ucs_item, ett_wpa_sub_ucs_tree);
19750
0
        proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
19751
19752
        /* Check if OUI is 00:50:F2 (WFA) */
19753
0
        if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
19754
0
        {
19755
0
          proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_wfa_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
19756
0
          proto_item_append_text(wpa_ucs_item, " %s", wpa_ucs_return(pinfo->pool, tvb_get_ntohl(tvb, offset)));
19757
0
          save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset + 3), CIPHER_KEY);
19758
0
        } else {
19759
0
          proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
19760
0
        }
19761
0
        offset += 4;
19762
0
      }
19763
19764
      /* Authenticated Key Management Suites */
19765
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_akms_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19766
0
      akms_count = tvb_get_letohs(tvb, offset);
19767
0
      offset += 2;
19768
19769
0
      wpa_akms_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_akms_list, tvb, offset, akms_count * 4, ENC_NA);
19770
0
      wpa_akms_tree = proto_item_add_subtree(wpa_akms_item, ett_wpa_akms_tree);
19771
0
      for (ii = 0; ii < akms_count; ii++)
19772
0
      {
19773
0
        wpa_sub_akms_item = proto_tree_add_item(wpa_akms_tree, hf_ieee80211_wfa_ie_wpa_akms, tvb, offset, 4, ENC_BIG_ENDIAN);
19774
0
        wpa_sub_akms_tree = proto_item_add_subtree(wpa_sub_akms_item, ett_wpa_sub_akms_tree);
19775
0
        proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
19776
19777
        /* Check if OUI is 00:50:F2 (WFA) */
19778
0
        if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
19779
0
        {
19780
0
          proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_wfa_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
19781
0
          proto_item_append_text(wpa_akms_item, " %s", wpa_akms_return(pinfo->pool, tvb_get_ntohl(tvb, offset)));
19782
0
          save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset + 3), AKM_KEY);
19783
0
        } else {
19784
0
          proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
19785
0
        }
19786
0
        offset += 4;
19787
0
      }
19788
0
      break;
19789
0
    }
19790
0
    case 2:   /* Wireless Multimedia Enhancements (WME) */
19791
0
    {
19792
0
      uint8_t subtype;
19793
19794
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_subtype, tvb, offset, 1, ENC_NA);
19795
0
      subtype = tvb_get_uint8(tvb, offset);
19796
0
      proto_item_append_text(tree, ": %s", val_to_str(subtype, ieee802111_wfa_ie_wme_type, "Unknown %d"));
19797
0
      offset += 1;
19798
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_version, tvb, offset, 1, ENC_NA);
19799
0
      offset += 1;
19800
0
      switch (subtype) {
19801
0
        case 0: /* WME Information Element */
19802
0
        {
19803
          /* WME QoS Info Field */
19804
0
          offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype);
19805
0
          break;
19806
0
        }
19807
0
        case 1: /* WME Parameter Element */
19808
0
        {
19809
0
          offset = decode_qos_parameter_set(tree, tvb, pinfo, offset, ftype);
19810
0
          break;
19811
0
        }
19812
0
        case 2:   /* WME TSPEC Element */
19813
0
        {
19814
0
            static int * const ieee80211_wfa_ie_wme_tspec_tsinfo[] = {
19815
0
              &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid,
19816
0
              &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction,
19817
0
              &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb,
19818
0
              &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up,
19819
0
              &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved,
19820
0
              NULL
19821
0
            };
19822
19823
0
            proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_tspec_tsinfo,
19824
0
                                    ett_tsinfo_tree, ieee80211_wfa_ie_wme_tspec_tsinfo,
19825
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
19826
0
            offset += 3;
19827
19828
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_nor_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19829
0
            offset += 2;
19830
19831
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_max_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19832
0
            offset += 2;
19833
19834
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19835
0
            offset += 4;
19836
19837
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_max_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19838
0
            offset += 4;
19839
19840
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_inact_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19841
0
            offset += 4;
19842
19843
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_susp_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19844
0
            offset += 4;
19845
19846
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19847
0
            offset += 4;
19848
19849
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19850
0
            offset += 4;
19851
19852
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_mean_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19853
0
            offset += 4;
19854
19855
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_peak_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19856
0
            offset += 4;
19857
19858
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_burst_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19859
0
            offset += 4;
19860
19861
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_delay_bound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19862
0
            offset += 4;
19863
19864
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_phy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
19865
0
            offset += 4;
19866
19867
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_surplus, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19868
0
            offset += 2;
19869
19870
0
            proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_medium, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19871
0
            offset += 2;
19872
19873
0
          break;
19874
0
        }
19875
0
        default:
19876
          /* No default Action */
19877
0
        break;
19878
0
      } /* End switch (subtype) */
19879
0
      break;
19880
0
    }
19881
0
    case 4: /* WPS: Wifi Protected Setup */
19882
0
    {
19883
0
      dissect_wps_tlvs(tree, tvb, offset, tag_len-1, pinfo, false);
19884
0
    }
19885
0
    break;
19886
0
    case 17: /* Network Cost: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nct/88f0cdf4-cdf2-4455-b849-4abf1e5c11ac */
19887
0
    {
19888
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_nc_cost_level, tvb, offset, 1, ENC_LITTLE_ENDIAN);
19889
0
      offset += 1;
19890
19891
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_nc_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
19892
0
      offset += 1;
19893
19894
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_nc_cost_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
19895
0
      offset += 1;
19896
19897
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_nc_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
19898
0
      offset += 1;
19899
0
    }
19900
0
    break;
19901
0
    case 18: /* Tethering: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nct/a097f5bb-6eca-44ad-9a02-20d46ad30d6d */
19902
0
    {
19903
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_tethering_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19904
0
      offset += 2;
19905
19906
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_tethering_mac_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
19907
0
      offset += 2;
19908
19909
0
      proto_tree_add_item(tree, hf_ieee80211_wfa_ie_tethering_mac, tvb, offset, 6, ENC_NA);
19910
0
      offset += 6;
19911
19912
0
    }
19913
0
    break;
19914
0
    default:
19915
      /* No default Action...*/
19916
0
    break;
19917
0
  } /* End switch (type) */
19918
19919
0
  return offset;
19920
0
}
19921
19922
/*
19923
 * Dissect a group data cipher suite which consists of an OUI and a one-byte
19924
 * selector: IEEE802.11 2012 Figure 9-256.
19925
 *
19926
 * Accepts a two entry array of header fields so we can use this elsewhere.
19927
 */
19928
static int dissect_group_data_cipher_suite(tvbuff_t *tvb, packet_info *pinfo _U_,
19929
    proto_tree *tree, int offset, int *hf_array, int ett_val, char *label)
19930
0
{
19931
0
  proto_tree *gdcs_tree = NULL;
19932
19933
0
  gdcs_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_val, NULL,
19934
0
                         label);
19935
0
  proto_tree_add_item(gdcs_tree, hf_array[0], tvb, offset, 3, ENC_BIG_ENDIAN);
19936
0
  offset += 3;
19937
0
  proto_tree_add_item(gdcs_tree, hf_array[1], tvb, offset, 1, ENC_NA);
19938
0
  offset += 1;
19939
19940
0
  return offset;
19941
0
}
19942
19943
static int
19944
dissect_rsn_ie(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb,
19945
               int offset, uint32_t tag_len, association_sanity_check_t *association_sanity_check);
19946
19947
static int
19948
dissect_wfa_rsn_override(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
19949
0
{
19950
0
  int tag_len = tvb_reported_length(tvb);
19951
19952
0
  if (tag_len > 0)
19953
0
    dissect_rsn_ie(pinfo, tree, tvb, 0, tag_len, NULL);
19954
19955
0
  return tag_len;
19956
0
}
19957
19958
static int
19959
dissect_wfa_rsn_override_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
19960
0
{
19961
0
  int tag_len = tvb_reported_length(tvb);
19962
19963
0
  if (tag_len > 0)
19964
0
    dissect_rsn_ie(pinfo, tree, tvb, 0, tag_len, NULL);
19965
19966
0
  return tag_len;
19967
0
}
19968
19969
static int
19970
dissect_rsnx_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int tag_len);
19971
19972
static int
19973
dissect_wfa_rsnx_override(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
19974
0
{
19975
0
  int tag_len = tvb_reported_length(tvb);
19976
19977
0
  if (tag_len > 0)
19978
0
    dissect_rsnx_ie(tvb, pinfo, tree, tag_len);
19979
19980
0
  return tag_len;
19981
0
}
19982
19983
static int
19984
dissect_wfa_rsn_selection(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
19985
0
{
19986
0
  int tag_len = tvb_reported_length(tvb);
19987
19988
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_rsn_selection, tvb, 0,
19989
0
                      1, ENC_NA);
19990
19991
0
  return tag_len;
19992
0
}
19993
19994
static int
19995
dissect_wfa_rsn_override_link_kde(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
19996
0
{
19997
0
  int tag_len = tvb_reported_length(tvb);
19998
0
  int offset = 0;
19999
20000
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_rsn_or_link_kde_link_id, tvb, offset,
20001
0
                      1, ENC_NA);
20002
0
  offset++;
20003
0
  ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tree,
20004
0
                                   tag_len - 1, -1, NULL);
20005
20006
0
  return tag_len;
20007
0
}
20008
20009
static const range_string qos_mgmt_attributes[] = {
20010
  { 0, 0, "Reserved" },
20011
  { 1, 1, "Port Range" },
20012
  { 2, 2, "DSCP Policy" },
20013
  { 3, 3, "TCLAS" },
20014
  { 4, 4, "Domain Name" },
20015
  { 5, 255, "Reserved" },
20016
  { 0, 0, NULL }
20017
};
20018
20019
static int
20020
ieee80211_frame_classifier(tvbuff_t *tvb, packet_info *pinfo _U_,
20021
                           proto_tree *tree, int offset, int tag_len);
20022
20023
static int
20024
dissect_qos_mgmt(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
20025
0
{
20026
0
  int offset = 0;
20027
0
  uint8_t attr_id;
20028
0
  uint8_t attr_len;
20029
0
  uint8_t attr_num = 0;
20030
0
  proto_tree *sub_tree = NULL;
20031
20032
0
  while (tvb_captured_length_remaining(tvb, offset)) {
20033
0
    attr_id = tvb_get_uint8(tvb, offset);
20034
0
    attr_len = tvb_get_uint8(tvb, offset + 1);
20035
0
    proto_tree *attr = NULL;
20036
20037
0
    attr = proto_tree_add_subtree_format(tree, tvb, offset, attr_len + 2,
20038
0
                                  ett_qos_mgmt_attributes, NULL,
20039
0
                                  "QoS Management Attribute %d", attr_num++);
20040
0
    proto_tree_add_item(attr, hf_ieee80211_qos_mgmt_attribute_id, tvb, offset,
20041
0
                        1, ENC_NA);
20042
0
    offset += 1;
20043
20044
0
    proto_tree_add_item(attr, hf_ieee80211_qos_mgmt_attribute_len, tvb, offset,
20045
0
                        1, ENC_NA);
20046
0
    offset += 1;
20047
20048
0
    switch (attr_id) {
20049
0
    case 1:
20050
0
      sub_tree = proto_tree_add_subtree(attr, tvb, offset, 1,
20051
0
                          ett_qos_mgmt_dscp_policy_capabilities, NULL,
20052
0
                          "Port Range");
20053
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_start_port_range,
20054
0
                          tvb, offset, 2, ENC_BIG_ENDIAN);
20055
0
      offset += 2;
20056
20057
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_end_port_range, tvb,
20058
0
                          offset, 2, ENC_BIG_ENDIAN);
20059
0
      offset += 2;
20060
0
      break;
20061
0
    case 2:
20062
0
      sub_tree = proto_tree_add_subtree(attr, tvb, offset, attr_len,
20063
0
                          ett_qos_mgmt_dscp_policy, NULL,
20064
0
                          "DSCP Policy");
20065
20066
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_dscp_pol_id, tvb,
20067
0
                          offset, 1, ENC_NA);
20068
0
      offset += 1;
20069
20070
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_dscp_pol_req_type,
20071
0
                          tvb, offset, 1, ENC_NA);
20072
0
      offset += 1;
20073
20074
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_dscp_pol_dscp, tvb,
20075
0
                          offset, 1, ENC_NA);
20076
0
      offset += 1;
20077
0
      break;
20078
0
    case 3:
20079
0
      sub_tree = proto_tree_add_subtree(attr, tvb, offset, attr_len,
20080
0
                          ett_qos_mgmt_tclas, NULL,
20081
0
                          "TCLAS");
20082
20083
0
      ieee80211_frame_classifier(tvb, pinfo, sub_tree, offset, attr_len);
20084
0
      offset += attr_len;
20085
0
      break;
20086
0
    case 4:
20087
0
      sub_tree = proto_tree_add_subtree(attr, tvb, offset, attr_len,
20088
0
                          ett_qos_mgmt_domain_name, NULL,
20089
0
                          "Domain Name");
20090
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_domain_name, tvb,
20091
0
                          offset, attr_len, ENC_ASCII);
20092
0
      offset += attr_len;
20093
0
      break;
20094
0
    default:
20095
0
      sub_tree = proto_tree_add_subtree(attr, tvb, offset, attr_len,
20096
0
                          ett_qos_mgmt_unknown_attribute, NULL,
20097
0
                          "Unknown attribute");
20098
0
      proto_tree_add_item(sub_tree, hf_ieee80211_qos_mgmt_unknown_attr, tvb,
20099
0
                          offset, attr_len, ENC_NA);
20100
0
      offset += attr_len;
20101
0
      break;
20102
0
    }
20103
0
  }
20104
20105
0
  return offset;
20106
0
}
20107
20108
/*
20109
 * Handle the HS 2.0 rev 2 OSU Server-only authenticated layer 2 Encryption
20110
 * Network element. This is almost the same format as the RSNE so maybe some
20111
 * common code can be used.
20112
 */
20113
static int
20114
dissect_hs20_osen(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
20115
0
{
20116
0
  int offset = 0;
20117
0
  int hf_array[2] = { hf_ieee80211_group_data_cipher_suite_oui,
20118
0
                       hf_ieee80211_group_data_cipher_suite_type };
20119
0
  proto_tree *pwc_list = NULL;
20120
0
  proto_item *pwcsi = NULL;
20121
0
  uint16_t pwc_count = 0, pwc_index = 0;
20122
0
  uint16_t akms_count = 0, akms_index = 0;
20123
0
  static int * const osen_rsn_cap[] = {
20124
0
    &hf_ieee80211_osen_rsn_cap_preauth,
20125
0
    &hf_ieee80211_osen_rsn_cap_no_pairwise,
20126
0
    &hf_ieee80211_osen_rsn_cap_ptksa_replay_counter,
20127
0
    &hf_ieee80211_osen_rsn_cap_gtksa_replay_counter,
20128
0
    &hf_ieee80211_osen_rsn_cap_mfpr,
20129
0
    &hf_ieee80211_osen_rsn_cap_mfpc,
20130
0
    &hf_ieee80211_osen_rsn_cap_jmr,
20131
0
    &hf_ieee80211_osen_rsn_cap_peerkey,
20132
0
    &hf_ieee80211_osen_rsn_spp_a_msdu_capable,
20133
0
    &hf_ieee80211_osen_rsn_spp_a_msdu_required,
20134
0
    &hf_ieee80211_osen_rsn_pbac,
20135
0
    &hf_ieee80211_osen_extended_key_id_iaf,
20136
0
    &hf_ieee80211_osen_reserved,
20137
0
    NULL
20138
0
  };
20139
0
  uint16_t pmkid_count = 0, pmkid_index = 0;
20140
0
  int gmcs_array[2] = { hf_ieee80211_osen_group_management_cipher_suite_oui,
20141
0
                        hf_ieee80211_osen_group_management_cipher_suite_type };
20142
20143
0
  offset = dissect_group_data_cipher_suite(tvb, pinfo, tree, offset, hf_array,
20144
0
                        ett_osen_group_data_cipher_suite,
20145
0
                        "OSEN Group Data Cipher Suite");
20146
20147
0
  pwc_count = tvb_get_letohs(tvb, offset);
20148
0
  proto_tree_add_item(tree, hf_ieee80211_osen_pcs_count, tvb, offset,
20149
0
                      2, ENC_LITTLE_ENDIAN);
20150
0
  offset += 2;
20151
20152
0
  if (pwc_count > 0) {
20153
0
    int start_offset = offset;
20154
0
    pwc_list = proto_tree_add_subtree(tree, tvb, offset, -1,
20155
0
                        ett_osen_pairwise_cipher_suites, &pwcsi,
20156
0
                        "OSEN Pairwise Cipher Suite List");
20157
20158
0
    while (pwc_count > 0) {
20159
0
      if (tvb_reported_length_remaining(tvb, offset) >= 4) {
20160
0
        int hf_array2[2] = { hf_ieee80211_osen_pairwise_cipher_suite_oui,
20161
0
                            hf_ieee80211_osen_pairwise_cipher_suite_type };
20162
0
        char label[128];
20163
20164
0
        snprintf(label, sizeof(label), "OSEN Pairwise Cipher Suite %d", pwc_index);
20165
0
        offset = dissect_group_data_cipher_suite(tvb, pinfo, pwc_list,
20166
0
                        offset, hf_array2, ett_osen_pairwise_cipher_suite,
20167
0
                        label);
20168
0
        pwc_index++;
20169
0
        pwc_count--;
20170
0
      } else {
20171
        /* Insert the remaining? Expert Info? */
20172
0
        offset += tvb_reported_length_remaining(tvb, offset);
20173
0
        break;
20174
0
      }
20175
0
    }
20176
20177
0
    proto_item_set_len(pwcsi, offset - start_offset);
20178
0
  }
20179
20180
0
  if (tvb_reported_length_remaining(tvb, offset) == 0) {
20181
0
    return tvb_captured_length(tvb);
20182
0
  }
20183
20184
  /* Now handle the AKM Suites */
20185
0
  akms_count = tvb_get_letohs(tvb, offset);
20186
0
  proto_tree_add_item(tree, hf_ieee80211_osen_akm_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
20187
0
  offset += 2;
20188
20189
0
  if (akms_count > 0) {
20190
0
    int start_offset = offset;
20191
0
    proto_tree *akm_list = NULL;
20192
0
    proto_item *akmcsi = NULL;
20193
20194
0
    akm_list = proto_tree_add_subtree(tree, tvb, offset, -1,
20195
0
                        ett_osen_akm_cipher_suites, &akmcsi,
20196
0
                        "OSEN AKM Cipher Suite List");
20197
20198
0
    while (akms_count > 0) {
20199
0
      if (tvb_reported_length_remaining(tvb, offset) >= 4) {
20200
0
        int hf_array3[2] = { hf_ieee80211_osen_akm_cipher_suite_oui,
20201
0
                             hf_ieee80211_osen_akm_cipher_suite_type};
20202
0
        char label[128];
20203
20204
0
        snprintf(label, sizeof(label), "OSEN AKM Cipher Suite %d", akms_index);
20205
0
        offset = dissect_group_data_cipher_suite(tvb, pinfo, akm_list,
20206
0
                          offset, hf_array3, ett_osen_akm_cipher_suite,
20207
0
                          label);
20208
0
        akms_index++;
20209
0
        akms_count--;
20210
0
      } else {
20211
        /* Expert info? */
20212
0
        offset += tvb_reported_length_remaining(tvb, offset);
20213
0
        break;
20214
0
      }
20215
0
    }
20216
0
    proto_item_set_len(akmcsi, offset - start_offset);
20217
0
  }
20218
20219
  /* Any more? */
20220
0
  if (tvb_reported_length_remaining(tvb, offset) == 0) {
20221
0
    return tvb_captured_length(tvb);
20222
0
  }
20223
20224
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_osen_rsn_cap_flags,
20225
0
                                    ett_osen_rsn_cap_tree, osen_rsn_cap,
20226
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
20227
0
  offset += 2;
20228
20229
  /* Any more? */
20230
0
  if (tvb_reported_length_remaining(tvb, offset) == 0) {
20231
0
    return tvb_captured_length(tvb);
20232
0
  }
20233
20234
0
  pmkid_count = tvb_get_letohs(tvb, offset);
20235
0
  proto_tree_add_item(tree, hf_ieee80211_osen_pmkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
20236
0
  offset += 2;
20237
20238
0
  if (pmkid_count > 0) {
20239
0
    proto_tree *pmkid_list = NULL;
20240
20241
0
    pmkid_list = proto_tree_add_subtree(tree, tvb, offset, pmkid_count * 16,
20242
0
                                ett_osen_pmkid_list, NULL,
20243
0
                                "OSEN PKMID List");
20244
20245
0
    while (pmkid_count > 0) {
20246
0
      proto_tree *pmkid_tree = NULL;
20247
20248
0
      pmkid_tree = proto_tree_add_subtree_format(pmkid_list, tvb,offset, 16,
20249
0
                                ett_osen_pmkid_tree, NULL,
20250
0
                                "OSEN PKMID %d", pmkid_index);
20251
0
      proto_tree_add_item(pmkid_tree, hf_ieee80211_osen_pmkid, tvb, offset, 16,
20252
0
                          ENC_NA);
20253
0
      offset += 16;
20254
0
      pmkid_index++;
20255
0
      pmkid_count--;
20256
0
    }
20257
0
  }
20258
20259
0
  offset = dissect_group_data_cipher_suite(tvb, pinfo, tree, offset, gmcs_array,
20260
0
                        ett_osen_group_management_cipher_suite,
20261
0
                        "OSEN Group Management Cipher Suite");
20262
20263
0
  return offset;
20264
0
}
20265
20266
static const value_string hs20_indication_version_number_vals[] = {
20267
  { 0, "1.x" },
20268
  { 1, "2.x" },
20269
  { 2, "3.x" },
20270
  { 0, NULL }
20271
};
20272
20273
static int
20274
dissect_hs20_indication(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
20275
0
{
20276
0
  static int * const ieee80211_hs20_indication[] = {
20277
0
    &hf_ieee80211_hs20_indication_dgaf_disabled,
20278
0
    &hf_ieee80211_hs20_indication_pps_mo_id_present,
20279
0
    &hf_ieee80211_hs20_indication_anqp_domain_id_present,
20280
0
    &hf_ieee80211_hs20_reserved,
20281
0
    &hf_ieee80211_hs20_indication_version_number,
20282
0
    NULL
20283
0
  };
20284
0
  int len = tvb_captured_length(tvb);
20285
0
  int offset = 0;
20286
0
  uint8_t indic = tvb_get_uint8(tvb, offset);
20287
20288
0
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_hs20_indication,
20289
0
                              ENC_NA);
20290
0
  offset++;
20291
20292
0
  if (len >= 3 && (indic & 0x02)) { /* Contains a PPS MO ID field ... display it. */
20293
0
      proto_tree_add_item(tree, hf_ieee80211_hs20_indication_pps_mo_id, tvb, offset,
20294
0
                          2, ENC_LITTLE_ENDIAN);
20295
0
      offset += 2;
20296
0
  }
20297
20298
0
  if ((len >= (offset + 2)) && (indic & 0x04)) {
20299
0
     proto_tree_add_item(tree, hf_ieee80211_hs20_indication_anqp_domain_id, tvb, offset,
20300
0
                         2, ENC_LITTLE_ENDIAN);
20301
0
     offset += 2;
20302
0
  }
20303
20304
0
  return offset;
20305
0
}
20306
20307
enum ieee80211_wfa_60g_attr {
20308
  /* 0 Reserved */
20309
  WIFI_60G_ATTR_CAPABILITY = 1,
20310
  /* 2 - 225 Reserved */
20311
};
20312
20313
static const value_string ieee80211_wfa_60g_attr_ids[] = {
20314
  { WIFI_60G_ATTR_CAPABILITY, "60GHz Capability" },
20315
  { 0, NULL }
20316
};
20317
20318
static int
20319
dissect_wfa_60g_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
20320
0
{
20321
0
  int end = tvb_reported_length(tvb);
20322
0
  int offset = 0;
20323
0
  uint8_t id;
20324
0
  uint16_t len;
20325
0
  proto_tree *wf60g_tree;
20326
0
  proto_item *attrs;
20327
20328
0
  while (offset < end) {
20329
0
    if (end - offset < 2) {
20330
0
      expert_add_info_format(pinfo, tree, &ei_ieee80211_wfa_60g_attr_len_invalid, "Packet too short for Wi-Fi 60G attribute");
20331
0
      break;
20332
0
    }
20333
20334
0
    id = tvb_get_uint8(tvb, offset);
20335
0
    len = tvb_get_ntohs(tvb, offset + 1);
20336
0
    attrs = proto_tree_add_item(tree, hf_ieee80211_wfa_60g_attr, tvb, offset, 0, ENC_NA);
20337
0
    proto_item_append_text(attrs, ": %s", val_to_str(id, ieee80211_wfa_60g_attr_ids,
20338
0
                                             "Unknown attribute ID (%u)"));
20339
0
    wf60g_tree = proto_item_add_subtree(attrs, ett_ieee80211_wfa_60g_attr);
20340
0
    proto_tree_add_item(wf60g_tree, hf_ieee80211_wfa_60g_attr_id, tvb, offset, 1, ENC_BIG_ENDIAN);
20341
0
    offset += 1;
20342
0
    proto_tree_add_item(wf60g_tree, hf_ieee80211_wfa_60g_attr_len, tvb, offset, 1, ENC_BIG_ENDIAN);
20343
0
    offset += 1;
20344
20345
20346
0
    switch (id) {
20347
0
    case WIFI_60G_ATTR_CAPABILITY:
20348
0
      if (len - offset < 7) {
20349
0
        expert_add_info_format(pinfo, tree, &ei_ieee80211_wfa_60g_attr_len_invalid, "Packet too short for 60G capability attribute");
20350
0
        break;
20351
0
      }
20352
20353
0
      proto_tree_add_item(wf60g_tree, hf_ieee80211_wfa_60g_attr_cap_sta_mac_addr, tvb, offset, 6, ENC_NA);
20354
0
      offset += 6;
20355
0
      proto_tree_add_item(wf60g_tree, hf_ieee80211_wfa_60g_attr_cap_recv_amsdu_frames, tvb, offset, 1, ENC_BIG_ENDIAN);
20356
0
      proto_tree_add_item(wf60g_tree, hf_ieee80211_wfa_60g_attr_cap_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
20357
0
      offset += 1;
20358
0
      break;
20359
0
    default:
20360
0
      proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_wfa_60g_unknown_attribute, tvb,
20361
0
                                         offset, len+2, "Unknown attribute ID (%u)", id);
20362
0
    }
20363
20364
0
    offset += len;
20365
0
  }
20366
0
  return offset;
20367
0
}
20368
20369
static int
20370
dissect_owe_transition_mode(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
20371
0
{
20372
0
  uint8_t ssid_len;
20373
20374
0
  int len = tvb_captured_length(tvb);
20375
0
  int offset = 0;
20376
20377
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_owe_bssid, tvb, offset, 6, ENC_NA);
20378
0
  offset  += 6;
20379
0
  len -= 6;
20380
20381
0
  ssid_len = tvb_get_uint8(tvb, offset);
20382
20383
0
  proto_tree_add_uint(tree, hf_ieee80211_wfa_ie_owe_ssid_length, tvb, offset, 1, ssid_len);
20384
0
  offset  += 1;
20385
0
  len -= 1;
20386
20387
0
  if (len < ssid_len) {
20388
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
20389
0
    return offset;
20390
0
  }
20391
20392
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_owe_ssid, tvb, offset, ssid_len, ENC_ASCII);
20393
0
  offset  += len;
20394
0
  len -= len;
20395
20396
0
  if (len >= 2) {
20397
0
    proto_tree_add_item(tree, hf_ieee80211_wfa_ie_owe_band_info, tvb, offset, 1, ENC_NA);
20398
0
    offset  += 1;
20399
20400
0
    proto_tree_add_item(tree, hf_ieee80211_wfa_ie_owe_channel_info, tvb, offset, 1, ENC_NA);
20401
0
    offset  += 1;
20402
0
  }
20403
20404
0
  return offset;
20405
0
}
20406
20407
static int
20408
dissect_transition_disable_kde(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
20409
0
{
20410
0
  int tag_len = tvb_captured_length(tvb);
20411
0
  int offset = 0;
20412
0
  static int * const ieee80211_wfa_transition_disable_flags[] = {
20413
0
    &hf_ieee80211_wfa_ie_transition_disable_wpa3_personal,
20414
0
    &hf_ieee80211_wfa_ie_transition_disable_sae_pk,
20415
0
    &hf_ieee80211_wfa_ie_transition_disable_wpa3_enterprise,
20416
0
    &hf_ieee80211_wfa_ie_transition_disable_enhanced_open,
20417
0
    &hf_ieee80211_wfa_ie_transition_disable_reserved_b4thru7,
20418
0
    NULL
20419
0
  };
20420
20421
0
  if (tag_len < 1) {
20422
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
20423
0
    return 0;
20424
0
  }
20425
20426
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_transition_disable_bitmap,
20427
0
                                    ett_ieee80211_wfa_transition_disable_tree,
20428
0
                                    ieee80211_wfa_transition_disable_flags,
20429
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
20430
0
  offset++;
20431
20432
0
  if (offset < tag_len)
20433
0
    proto_tree_add_item(tree, hf_ieee80211_wfa_ie_transition_disable_reserved, tvb, offset, tag_len-offset, ENC_NA);
20434
0
  offset = tag_len;
20435
20436
0
  return offset;
20437
0
}
20438
20439
static int
20440
dissect_mbo_oce(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
20441
0
{
20442
0
  int len = tvb_reported_length(tvb);
20443
0
  int offset = 0;
20444
20445
0
  while (len >= 2) {
20446
0
    proto_item *attr_item;
20447
0
    proto_tree *attr_tree;
20448
0
    uint8_t attr_id = tvb_get_uint8(tvb, offset);
20449
0
    uint8_t attr_len = tvb_get_uint8(tvb, offset + 1);
20450
20451
0
    if (len < (attr_len + 2)) {
20452
0
      expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
20453
0
      return offset;
20454
0
    }
20455
20456
0
    attr_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_mbo_oce_attr, tvb, offset, attr_len + 2, ENC_NA);
20457
0
    attr_tree = proto_item_add_subtree(attr_item, ett_mbo_oce_attr);
20458
0
    proto_item_append_text(attr_item, " (%s)", val_to_str_const(attr_id, wfa_mbo_oce_attr_id_vals, "Unknown"));
20459
20460
0
    proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_oce_attr_id, tvb, offset, 1, ENC_NA);
20461
0
    offset += 1;
20462
0
    len -= 1;
20463
20464
0
    proto_tree_add_uint(attr_tree, hf_ieee80211_wfa_ie_mbo_oce_attr_len, tvb, offset, 1, attr_len);
20465
0
    offset  += 1;
20466
0
    len -= 1;
20467
20468
0
    switch (attr_id) {
20469
0
    case MBO_AP_CAPABILTY_INDICATION:
20470
0
    {
20471
0
      proto_item *cap_item;
20472
0
      proto_tree *cap_tree;
20473
20474
0
      if (attr_len != 1) {
20475
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20476
0
        return offset;
20477
0
      }
20478
0
      cap_item = proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_ap_cap, tvb, offset, 1, ENC_NA);
20479
0
      cap_tree = proto_item_add_subtree(cap_item, ett_mbo_ap_cap);
20480
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_mbo_ap_cap_cell, tvb, offset, 1, ENC_NA);
20481
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_mbo_ap_cap_reserved, tvb, offset, 1, ENC_NA);
20482
0
      break;
20483
0
    }
20484
0
    case MBO_NON_PREF_CHANNEL_REPORT:
20485
0
      if (attr_len == 0)
20486
0
        break;
20487
20488
0
      if (attr_len < 3) {
20489
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20490
0
        return offset;
20491
0
      }
20492
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_op_class, tvb, offset, 1, ENC_NA);
20493
0
      offset += 1;
20494
0
      len -= 1;
20495
0
      attr_len -= 1;
20496
0
      while (attr_len > 2) {
20497
0
        proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_chan, tvb, offset, 1, ENC_NA);
20498
0
        offset += 1;
20499
0
        len -= 1;
20500
0
        attr_len -= 1;
20501
0
      }
20502
20503
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_pref, tvb, offset, 1, ENC_NA);
20504
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_reason, tvb, offset + 1, 1, ENC_NA);
20505
0
      break;
20506
0
    case MBO_CELLULAR_DATA_CAPABILITIES:
20507
0
      if (attr_len != 1) {
20508
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20509
0
        return offset;
20510
0
      }
20511
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_cellular_cap, tvb, offset, 1, ENC_NA);
20512
0
      break;
20513
0
    case MBO_ASSOCIATION_DISALLOWED:
20514
0
      if (attr_len != 1) {
20515
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20516
0
        return offset;
20517
0
      }
20518
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_assoc_disallow_reason, tvb, offset, 1, ENC_NA);
20519
0
      break;
20520
0
    case MBO_CELLULAR_DATA_PREFERENCE:
20521
0
      if (attr_len != 1) {
20522
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20523
0
        return offset;
20524
0
      }
20525
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_cellular_pref, tvb, offset, 1, ENC_NA);
20526
0
      break;
20527
0
    case MBO_TRANSITION_REASON:
20528
0
      if (attr_len != 1) {
20529
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20530
0
        return offset;
20531
0
      }
20532
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_transition_reason, tvb, offset, 1, ENC_NA);
20533
0
      break;
20534
0
    case MBO_TRANSITION_REJECTION_REASON:
20535
0
      if (attr_len != 1) {
20536
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20537
0
        return offset;
20538
0
      }
20539
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_transition_rej_reason, tvb, offset, 1, ENC_NA);
20540
0
      break;
20541
0
    case MBO_ASSOCIATION_RETRY_DELAY:
20542
0
    {
20543
0
      if (attr_len != 2) {
20544
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20545
0
        return offset;
20546
0
      }
20547
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_mbo_assoc_retry_delay, tvb, offset,
20548
0
                          2, ENC_LITTLE_ENDIAN);
20549
0
      break;
20550
0
    }
20551
0
    case OCE_CAPABILTY_INDICATION:
20552
0
    {
20553
0
      proto_item *cap_item;
20554
0
      proto_tree *cap_tree;
20555
20556
0
      if (attr_len != 1) {
20557
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20558
0
        return offset;
20559
0
      }
20560
0
      cap_item = proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_cap_ctrl, tvb, offset, 1, ENC_NA);
20561
0
      cap_tree = proto_item_add_subtree(cap_item, ett_oce_cap);
20562
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_cap_release, tvb, offset, 1, ENC_NA);
20563
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_cap_sta_cfon, tvb, offset, 1, ENC_NA);
20564
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_cap_11b_only_ap, tvb, offset, 1, ENC_NA);
20565
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_cap_hlp, tvb, offset, 1, ENC_NA);
20566
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_cap_non_oce_ap, tvb, offset, 1, ENC_NA);
20567
0
      proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_cap_reserved, tvb, offset, 1, ENC_NA);
20568
0
      break;
20569
0
    }
20570
0
    case OCE_RSSI_ASSOCIATION_REJECTION:
20571
0
    {
20572
0
      if (attr_len != 2) {
20573
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20574
0
        return offset;
20575
0
      }
20576
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_rssi_assoc_rej_delta, tvb,
20577
0
                          offset, 1, ENC_NA);
20578
0
      proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_rssi_assoc_rej_delay, tvb,
20579
0
                          offset + 1, 1, ENC_NA);
20580
0
      break;
20581
0
    }
20582
0
    case OCE_REDUCED_WAN_METRICS:
20583
0
    {
20584
0
      proto_item *cap_item;
20585
0
      proto_tree *cap_tree;
20586
0
      uint8_t capacity;
20587
20588
0
      if (attr_len != 1) {
20589
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20590
0
        return offset;
20591
0
      }
20592
0
      cap_item = proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap,
20593
0
                                     tvb, offset, 1, ENC_NA);
20594
0
      cap_tree = proto_item_add_subtree(cap_item, ett_oce_metrics_cap);
20595
20596
0
      capacity = tvb_get_uint8(tvb, offset);
20597
0
      cap_item = proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap_downlink,
20598
0
                                     tvb, offset, 1, ENC_NA);
20599
0
      proto_item_append_text(cap_item, " (%d kbit/s)", (1 << (capacity & 0xF)) * 100);
20600
0
      cap_item = proto_tree_add_item(cap_tree, hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap_uplink,
20601
0
                                     tvb, offset, 1, ENC_NA);
20602
0
      capacity >>= 4;
20603
0
      proto_item_append_text(cap_item, " (%d kbit/s)", (1 << (capacity & 0xF)) * 100);
20604
0
      break;
20605
0
    }
20606
0
    case OCE_RNR_COMPLETENESS:
20607
0
      while (attr_len >= 4) {
20608
0
        proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_rnr_completeness_short_ssid,
20609
0
                            tvb, offset, 4, ENC_ASCII);
20610
0
        offset += 4;
20611
0
        attr_len -= 4;
20612
0
        len -= 4;
20613
0
      }
20614
0
      break;
20615
0
    case OCE_PROBE_SUPPR_BSSID:
20616
0
      while (attr_len >= 6) {
20617
0
        proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_probe_suppr_bssid,
20618
0
                            tvb, offset, 6, ENC_NA);
20619
0
        offset += 6;
20620
0
        attr_len -= 6;
20621
0
        len -= 6;
20622
0
      }
20623
0
      break;
20624
0
    case OCE_PROBE_SUPPR_SSID:
20625
0
      if (attr_len < 4) {
20626
0
        expert_add_info(pinfo, attr_tree, &ei_ieee80211_bad_length);
20627
0
        return offset;
20628
0
      }
20629
0
      while (attr_len >= 4) {
20630
0
        proto_tree_add_item(attr_tree, hf_ieee80211_wfa_ie_oce_probe_suppr_ssid,
20631
0
                            tvb, offset, 4, ENC_ASCII);
20632
0
        offset += 4;
20633
0
        attr_len -= 4;
20634
0
        len -= 4;
20635
0
      }
20636
0
      break;
20637
0
    default:
20638
0
      break;
20639
0
    }
20640
20641
0
    offset += attr_len;
20642
0
    len -= attr_len;
20643
0
  }
20644
20645
0
  if (len != 0) {
20646
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
20647
0
  }
20648
20649
0
  return offset;
20650
0
}
20651
20652
static int
20653
dissect_wfa_wnm_non_pref_chan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
20654
0
{
20655
0
  int len = tvb_reported_length(tvb);
20656
0
  int offset = 0;
20657
20658
0
  if (len == 0)
20659
0
    return 0;
20660
20661
0
  if (len < 3) {
20662
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
20663
0
    return 0;
20664
0
  }
20665
20666
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_op_class, tvb, offset, 1, ENC_NA);
20667
0
  offset ++;
20668
0
  len --;
20669
0
  while (len > 2) {
20670
0
    proto_tree_add_item(tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_chan, tvb, offset, 1, ENC_NA);
20671
0
    offset ++;
20672
0
    len --;
20673
0
  }
20674
20675
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_pref, tvb, offset, 1, ENC_NA);
20676
0
  offset ++;
20677
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_mbo_non_pref_chan_reason, tvb, offset, 1, ENC_NA);
20678
0
  offset ++;
20679
0
  return offset;
20680
0
}
20681
20682
static int
20683
dissect_wfa_wnm_cell_cap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
20684
0
{
20685
0
  int len = tvb_reported_length(tvb);
20686
20687
0
  if (len != 1) {
20688
0
    expert_add_info(pinfo, tree, &ei_ieee80211_bad_length);
20689
0
    return 0;
20690
0
  }
20691
20692
0
  proto_tree_add_item(tree, hf_ieee80211_wfa_ie_mbo_cellular_cap, tvb, 0, 1, ENC_NA);
20693
0
  return len;
20694
0
}
20695
20696
static void
20697
dissect_vendor_ie_wfa(packet_info *pinfo, proto_item *item, tvbuff_t *tag_tvb)
20698
0
{
20699
0
  int tag_len = tvb_reported_length(tag_tvb);
20700
0
  int dissect;
20701
0
  uint8_t subtype;
20702
0
  int offset = 0;
20703
0
  tvbuff_t *vendor_tvb;
20704
20705
0
  if (tag_len < 4)
20706
0
    return;
20707
20708
0
  subtype = tvb_get_uint8(tag_tvb, 3);
20709
0
  proto_item_append_text(item, ": %s", val_to_str_const(subtype, wfa_subtype_vals, "Unknown"));
20710
0
  vendor_tvb = tvb_new_subset_length(tag_tvb, offset + 4, tag_len - 4);
20711
0
  dissect = dissector_try_uint_with_data(wifi_alliance_ie_table, subtype, vendor_tvb, pinfo, item, false, NULL);
20712
0
  if (dissect <= 0) {
20713
0
      proto_tree_add_item(item, hf_ieee80211_tag_vendor_data, vendor_tvb, 0, tag_len - 4, ENC_NA);
20714
0
  }
20715
0
}
20716
20717
static const range_string kde_selectors_rvals[] = {
20718
  { 0, 0, "Reserved" },
20719
  { 1, 1, "GTK KDE" },
20720
  { 2, 2, "Reserved" },
20721
  { 3, 3, "MAC address KDE" },
20722
  { 4, 4, "PMKID KDE" },
20723
  { 5, 5, "Reserved" },
20724
  { 6, 6, "Nonce KDE" },
20725
  { 7, 7, "Lifetime KDE" },
20726
  { 8, 8, "Error KDE" },
20727
  { 9, 9, "IGTK KDE" },
20728
  { 10, 10, "Key ID KDE" },
20729
  { 11, 11, "Multi-band GTK KDE" },
20730
  { 12, 12, "Multi-band Key ID KDE" },
20731
  { 13, 13, "OCI KDE" },
20732
  { 14, 14, "BIGTK KDE" },
20733
  { 15, 15, "Reserved" },
20734
  { 16, 16, "MLO GTK KDE" },
20735
  { 17, 17, "MLO IGTK KDE" },
20736
  { 18, 18, "MLO BIGTK KDE" },
20737
  { 19, 19, "MLO LINK KDE" },
20738
  { 20, 255, "Reserved" },
20739
  { 0, 0, NULL }
20740
};
20741
20742
static const true_false_string tfs_rsn_gtk_kde_tx = {
20743
  "Temporal key used for both transmission and reception",
20744
  "Temporal key used only for reception"
20745
};
20746
20747
static int * const mlo_kde_link_hdrs[] = {
20748
  &hf_ieee80211_rsn_ie_mlo_linkid,
20749
  &hf_ieee80211_rsn_ie_mlo_rnse_present,
20750
  &hf_ieee80211_rsn_ie_mlo_rnsxe_present,
20751
  &hf_ieee80211_rsn_ie_mlo_reserved,
20752
  NULL
20753
};
20754
20755
static void
20756
dissect_rsn_ie_mlo_link(proto_item *item, proto_tree *tree, tvbuff_t *tvb,
20757
                        int offset, uint32_t tag_len _U_, packet_info *pinfo)
20758
0
{
20759
0
  uint8_t info = tvb_get_uint8(tvb, offset);
20760
20761
0
  proto_tree_add_bitmask(tree, tvb, offset,
20762
0
                         hf_ieee80211_rsn_ie_mlo_link_info,
20763
0
                         ett_kde_mlo_link_info, mlo_kde_link_hdrs,
20764
0
                         ENC_NA);
20765
0
  offset += 1;
20766
20767
0
  proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_mac_addr, tvb, offset, 6,
20768
0
                      ENC_NA);
20769
0
  offset += 6;
20770
0
  if ((info & 0x10) == 0x10) { /* Add the RSNE if present */
20771
0
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
20772
0
  }
20773
20774
0
  if ((info & 0x20) == 0x20) { /* Add the RSNXE if present */
20775
0
    add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
20776
0
  }
20777
20778
0
  proto_item_append_text(item, ": MLO Link KDE");
20779
0
}
20780
20781
static void
20782
dissect_vendor_ie_rsn(proto_item * item, proto_tree * tree, tvbuff_t * tvb,
20783
                      int offset, uint32_t tag_len, packet_info *pinfo)
20784
0
{
20785
0
  uint8_t data_type = tvb_get_uint8(tvb, offset);
20786
0
  proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_data_type, tvb,
20787
0
                      offset, 1, ENC_NA);
20788
0
  offset += 1;
20789
20790
0
  switch(data_type) {
20791
0
    case 1:
20792
0
    {
20793
      /* IEEE 802.11i / Key Data Encapsulation / Data Type=1 - GTK.
20794
       * This is only used within EAPOL-Key frame Key Data. */
20795
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_key_id, tvb,
20796
0
                          offset, 1, ENC_LITTLE_ENDIAN);
20797
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_tx, tvb, offset,
20798
0
                          1, ENC_LITTLE_ENDIAN);
20799
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_reserved1, tvb,
20800
0
                          offset, 1, ENC_LITTLE_ENDIAN);
20801
0
      offset += 1;
20802
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_reserved2, tvb,
20803
0
                          offset, 1, ENC_LITTLE_ENDIAN);
20804
0
      offset += 1;
20805
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_gtk, tvb, offset,
20806
0
                          tag_len - 3, ENC_NA);
20807
0
      proto_item_append_text(item, ": RSN GTK");
20808
0
      save_proto_data(tvb, pinfo, offset, tag_len - 3, GTK_KEY);
20809
0
      save_proto_data_value(pinfo, tag_len - 3, GTK_LEN_KEY);
20810
0
      break;
20811
0
    }
20812
0
    case 3: /* MAC Address KDE */
20813
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mac_address_kde_mac, tvb,
20814
0
                          offset, 6, ENC_NA);
20815
0
      proto_item_append_text(item, ": MAC Address KDE");
20816
0
      break;
20817
0
    case 4:
20818
0
    {
20819
      /* IEEE 802.11i / Key Data Encapsulation / Data Type=4 - PMKID.
20820
       * This is only used within EAPOL-Key frame Key Data. */
20821
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_pmkid, tvb, offset, 16, ENC_NA);
20822
0
      proto_item_append_text(item, ": RSN PMKID");
20823
0
      break;
20824
0
    }
20825
0
    case 6:
20826
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_nonce, tvb, offset,
20827
0
                          32, ENC_NA);
20828
0
      proto_item_append_text(item, ": NONCE KDE");
20829
0
      break;
20830
0
    case 7: /* Lifetime KDE */
20831
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_gtk_kde_lifetime, tvb,
20832
0
                          offset, 4, ENC_LITTLE_ENDIAN);
20833
0
      proto_item_append_text(item, ": Lifetime KDE");
20834
0
      break;
20835
0
    case 8: /* Error KDE */
20836
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_error_kde_res, tvb, offset,
20837
0
                          2, ENC_LITTLE_ENDIAN);
20838
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_error_kde_error_type, tvb,
20839
0
                          offset, 2, ENC_LITTLE_ENDIAN);
20840
0
      proto_item_append_text(item, ": Error KDE");
20841
0
      break;
20842
0
    case 9: /* IGTK KDE */
20843
0
    {
20844
      /* IEEE 802.11i / Key Data Encapsulation / Data Type=9 - IGTK.
20845
       * This is only used within EAPOL-Key frame Key Data. */
20846
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_igtk_kde_keyid, tvb,
20847
0
                          offset, 2, ENC_LITTLE_ENDIAN);
20848
0
      offset += 2;
20849
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_igtk_kde_ipn, tvb, offset,
20850
0
                          6, ENC_LITTLE_ENDIAN);
20851
0
      offset += 6;
20852
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_igtk_kde_igtk, tvb, offset,
20853
0
                          tag_len - 9, ENC_NA);
20854
0
      proto_item_append_text(item, ": RSN IGTK");
20855
0
      break;
20856
0
    }
20857
0
    case 10:
20858
0
    {
20859
      /* IEEE 802.11 - 2016 / Key Data Encapsulation / Data Type=10 - KeyID
20860
       * This is only used within EAPOL-Key frame Key Data when using Extended Key ID */
20861
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_ptk_keyid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
20862
0
      proto_item_append_text(item, ": RSN PTK");
20863
0
      break;
20864
0
    }
20865
0
    case 13: /* OCI KDE */
20866
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_oci_operating_class, tvb,
20867
0
                          offset, 1, ENC_NA);
20868
0
      offset += 1;
20869
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_oci_primary_channel_number,
20870
0
                          tvb, offset, 1, ENC_NA);
20871
0
      offset += 1;
20872
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_oci_frequency_segment_1,
20873
0
                          tvb, offset, 1, ENC_NA);
20874
0
      proto_item_append_text(item, ": OCI KDE");
20875
0
      break;
20876
0
    case 14: /* BIGTK KDE */
20877
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_bigtk_key_id, tvb, offset,
20878
0
                          2, ENC_LITTLE_ENDIAN);
20879
0
      offset += 2;
20880
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_bigtk_bipn, tvb, offset,
20881
0
                          6, ENC_LITTLE_ENDIAN);
20882
0
      offset += 6;
20883
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_bigtk_bigtk, tvb, offset,
20884
0
                          tag_len - 9, ENC_NA);
20885
0
      proto_item_append_text(item, ": BIGTK KDE");
20886
0
      break;
20887
0
    case 16: /* MLO GTK KDE */
20888
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_gtk_kde_key_id, tvb,
20889
0
                          offset, 1, ENC_NA);
20890
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_gtk_kde_tx, tvb,
20891
0
                          offset, 1, ENC_NA);
20892
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_gtk_kde_reserved, tvb,
20893
0
                          offset, 1, ENC_NA);
20894
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_gtk_kde_linkid, tvb,
20895
0
                          offset, 1, ENC_NA);
20896
0
      offset += 1;
20897
20898
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_gtk_kde_pn, tvb,
20899
0
                          offset, 6, ENC_NA);
20900
0
      offset += 6;
20901
20902
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_gtk_kde_gtk, tvb,
20903
0
                          offset, tag_len - 8, ENC_NA);
20904
20905
0
      proto_item_append_text(item, ": MLO GTK KDE");
20906
0
      break;
20907
0
    case 17: /* MLO IGTK KDE */
20908
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_igtk_kde_key_id, tvb,
20909
0
                          offset, 2, ENC_NA);
20910
0
      offset += 2;
20911
20912
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_igtk_kde_ipn, tvb,
20913
0
                          offset, 6, ENC_NA);
20914
0
      offset += 6;
20915
20916
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_igtk_kde_reserved, tvb,
20917
0
                          offset, 1, ENC_NA);
20918
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_igtk_kde_linkid, tvb,
20919
0
                          offset, 1, ENC_NA);
20920
0
      offset += 1;
20921
20922
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_igtk_kde_igtk, tvb,
20923
0
                          offset, tag_len - 10, ENC_NA);
20924
20925
0
      proto_item_append_text(item, ": MLO IGTK KDE");
20926
0
      break;
20927
0
    case 18: /* MLO BIGTK KDE */
20928
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_bigtk_kde_key_id, tvb,
20929
0
                          offset, 2, ENC_NA);
20930
0
      offset += 2;
20931
20932
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_bigtk_kde_ipn, tvb,
20933
0
                          offset, 6, ENC_NA);
20934
0
      offset += 6;
20935
20936
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_bigtk_kde_reserved, tvb,
20937
0
                          offset, 1, ENC_NA);
20938
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_bigtk_kde_linkid, tvb,
20939
0
                          offset, 1, ENC_NA);
20940
0
      offset += 1;
20941
20942
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_mlo_bigtk_kde_bigtk, tvb,
20943
0
                          offset, tag_len - 10, ENC_NA);
20944
20945
0
      proto_item_append_text(item, ": MLO BIGTK KDE");
20946
0
      break;
20947
0
    case 19: /*
20948
              * MLO Link KDE, contains  Link info, MAC Addr and possibly
20949
              * RSNE and RSNXE
20950
              */
20951
0
      dissect_rsn_ie_mlo_link(item, tree, tvb, offset, tag_len, pinfo);
20952
0
      break;
20953
0
    default:
20954
0
      proto_tree_add_item(tree, hf_ieee80211_rsn_ie_unknown, tvb, offset,
20955
0
                          tag_len - 1, ENC_NA);
20956
0
      proto_item_append_text(item, ": RSN UNKNOWN");
20957
0
      break;
20958
0
  }
20959
0
}
20960
20961
typedef enum {
20962
  MARVELL_IE_MESH = 4
20963
} marvell_ie_type_t;
20964
20965
static void
20966
dissect_vendor_ie_marvell(proto_item *item _U_, proto_tree *ietree,
20967
                          tvbuff_t *tvb, int offset, uint32_t tag_len)
20968
0
{
20969
0
  uint8_t type;
20970
20971
0
  type = tvb_get_uint8(tvb, offset);
20972
0
  proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
20973
0
  offset += 1;
20974
20975
0
  switch (type) {
20976
0
  case MARVELL_IE_MESH:
20977
0
    proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_subtype, tvb,
20978
0
                         offset++, 1, ENC_LITTLE_ENDIAN);
20979
0
    proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_version, tvb,
20980
0
                         offset++, 1, ENC_LITTLE_ENDIAN);
20981
0
    proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_active_proto_id, tvb,
20982
0
                         offset++, 1, ENC_LITTLE_ENDIAN);
20983
0
    proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_active_metric_id, tvb,
20984
0
                         offset++, 1, ENC_LITTLE_ENDIAN);
20985
0
    proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_cap, tvb,
20986
0
                         offset++, 1, ENC_LITTLE_ENDIAN);
20987
0
    break;
20988
20989
0
  default:
20990
0
    proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_data, tvb, offset,
20991
0
      tag_len - 1, ENC_NA);
20992
0
    break;
20993
0
  }
20994
0
}
20995
20996
typedef enum {
20997
  ATHEROS_IE_ADVCAP = 1,
20998
  ATHEROS_IE_XR = 3
20999
} atheros_ie_type_t;
21000
21001
typedef enum {
21002
  ATHEROS_IE_ADVCAP_S = 1
21003
} atheros_ie_advcap_subtype_t;
21004
21005
typedef enum {
21006
  ATHEROS_IE_XR_S = 1
21007
} atheros_ie_xr_subtype_t;
21008
21009
typedef enum {
21010
  ATHEROS_IE_CAP_TURBOP = 0x01,
21011
  ATHEROS_IE_CAP_COMP   = 0x02,
21012
  ATHEROS_IE_CAP_FF     = 0x04,
21013
  ATHEROS_IE_CAP_XR     = 0x08,
21014
  ATHEROS_IE_CAP_AR     = 0x10,
21015
  ATHEROS_IE_CAP_BURST  = 0x20,
21016
  ATHEROS_IE_CAP_WME    = 0x40,
21017
  ATHEROS_IE_CAP_BOOST  = 0x80
21018
} atheros_ie_cap_t;
21019
21020
static const value_string atheros_ie_type_vals[] = {
21021
  { ATHEROS_IE_ADVCAP, "Advanced Capability"},
21022
  { ATHEROS_IE_XR,     "eXtended Range"},
21023
  { 0,                 NULL }
21024
};
21025
21026
static int * const ieee80211_atheros_ie_cap[] = {
21027
  &hf_ieee80211_atheros_ie_cap_f_turbop,
21028
  &hf_ieee80211_atheros_ie_cap_f_comp,
21029
  &hf_ieee80211_atheros_ie_cap_f_ff,
21030
  &hf_ieee80211_atheros_ie_cap_f_xr,
21031
  &hf_ieee80211_atheros_ie_cap_f_ar,
21032
  &hf_ieee80211_atheros_ie_cap_f_burst,
21033
  &hf_ieee80211_atheros_ie_cap_f_wme,
21034
  &hf_ieee80211_atheros_ie_cap_f_boost,
21035
  NULL
21036
};
21037
21038
static int * const ieee80211_extreme_mesh_ie_hello[] = {
21039
  &hf_ieee80211_extreme_mesh_ie_hello_f_root,
21040
  &hf_ieee80211_extreme_mesh_ie_hello_f_proxy,
21041
  &hf_ieee80211_extreme_mesh_ie_hello_f_geo,
21042
  &hf_ieee80211_extreme_mesh_ie_hello_f_path_pref,
21043
  &hf_ieee80211_extreme_mesh_ie_hello_f_mobile,
21044
  NULL
21045
};
21046
21047
typedef enum {
21048
  EXTREME_MESH_IE_SERVICES_ROOT      = 0x01,
21049
  EXTREME_MESH_IE_SERVICES_PROXY     = 0x02,
21050
  EXTREME_MESH_IE_SERVICES_GEO       = 0x04,
21051
  EXTREME_MESH_IE_SERVICES_PATH_PREF = 0x08,
21052
  EXTREME_MESH_IE_SERVICES_MOBILE    = 0x10,
21053
} extreme_mesh_ie_services;
21054
21055
/* Mesh Fields found in Management Frames KJG */
21056
static const value_string extreme_mesh_ie_type_vals[] = {
21057
  {1, "Hello"},
21058
  {2, "Mesh ID"},
21059
  {3, "MPID"},
21060
  {0, NULL}
21061
};
21062
21063
static void
21064
dissect_vendor_ie_extreme_mesh(proto_item *item _U_, proto_tree *ietree,
21065
                          tvbuff_t *tvb, int offset, unsigned tag_len,
21066
                          packet_info *pinfo, proto_item *ti_len)
21067
0
{
21068
0
  uint8_t     type;
21069
21070
0
  if (tag_len <= 3) {
21071
0
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 6", tag_len+3);
21072
    /* Add length of OUI to tag_length */
21073
0
    return;
21074
0
  }
21075
0
  type = tvb_get_uint8(tvb, offset);
21076
0
  proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
21077
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, extreme_mesh_ie_type_vals, "Unknown"));
21078
0
  offset  += 1;
21079
0
  tag_len -= 1;
21080
21081
0
  switch (type) {
21082
0
    case 1:
21083
0
      {
21084
0
        proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_extreme_mesh_ie_services,
21085
0
        ett_extreme_mesh_services_tree, ieee80211_extreme_mesh_ie_hello, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
21086
0
        offset   += 1;
21087
21088
0
        proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_htr, tvb, offset, 1, ENC_NA);
21089
0
        offset   += 1;
21090
21091
0
        proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_mtr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
21092
0
        offset   += 2;
21093
21094
0
        proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_root, tvb, offset, 6, ENC_NA);
21095
0
        offset   += 6;
21096
21097
0
        proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_nh, tvb, offset, 6, ENC_NA);
21098
0
      }
21099
0
      break;
21100
0
    case 2:
21101
0
      {
21102
0
         proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_mesh_id, tvb, offset, tag_len, ENC_ASCII);
21103
0
      }
21104
0
      break;
21105
0
    case 3:
21106
0
      {
21107
0
         proto_tree_add_item(ietree, hf_ieee80211_extreme_mesh_ie_mp_id, tvb, offset, 6, ENC_NA);
21108
0
      }
21109
0
      break;
21110
0
    default:
21111
0
      break;
21112
0
  }
21113
0
}
21114
21115
static void
21116
dissect_vendor_ie_atheros(proto_item *item _U_, proto_tree *ietree,
21117
                          tvbuff_t *tvb, int offset, unsigned tag_len,
21118
                          packet_info *pinfo, proto_item *ti_len)
21119
0
{
21120
0
  uint8_t     type;
21121
0
  uint8_t     subtype;
21122
0
  uint8_t     version;
21123
21124
0
  if (tag_len <= 3) {
21125
0
        expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 6", tag_len+3); /* Add length of OUI to tag_length */
21126
0
        return;
21127
0
  }
21128
0
  proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_type, tvb, offset, 1, ENC_NA);
21129
0
  type = tvb_get_uint8(tvb, offset);
21130
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, atheros_ie_type_vals, "Unknown"));
21131
0
  offset  += 1;
21132
0
  tag_len -= 1;
21133
21134
0
  proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_subtype, tvb, offset, 1, ENC_NA);
21135
0
  subtype  = tvb_get_uint8(tvb, offset);
21136
0
  offset  += 1;
21137
0
  tag_len -= 1;
21138
21139
0
  proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_version, tvb, offset, 1, ENC_NA);
21140
0
  version  = tvb_get_uint8(tvb, offset);
21141
0
  offset  += 1;
21142
0
  tag_len -= 1;
21143
21144
0
  if (version == 0)
21145
0
  {
21146
0
    switch (type) {
21147
0
      case ATHEROS_IE_ADVCAP:
21148
0
      {
21149
0
        switch (subtype) {
21150
0
          case ATHEROS_IE_ADVCAP_S:
21151
0
          {
21152
0
            proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_advcap_cap,
21153
0
                                    ett_ath_cap_tree, ieee80211_atheros_ie_cap,
21154
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
21155
0
            offset   += 1;
21156
0
            tag_len  -= 1;
21157
21158
0
            proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_advcap_defkey, tvb, offset, 2, ENC_LITTLE_ENDIAN);
21159
0
            offset  += 2;
21160
0
            tag_len -= 2;
21161
0
            break;
21162
0
          }
21163
0
          default:
21164
          /* No default Action */
21165
0
          break;
21166
0
        } /* End switch (subtype) */
21167
0
        break;
21168
0
      }
21169
0
      case ATHEROS_IE_XR:
21170
0
      {
21171
0
        switch (subtype) {
21172
0
          case ATHEROS_IE_XR_S:
21173
0
          {
21174
0
            proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_info, tvb, offset, 1, ENC_NA);
21175
0
            offset  += 1;
21176
0
            tag_len -= 1;
21177
21178
0
            proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_base_bssid, tvb, offset, 6, ENC_NA);
21179
0
            offset  += 6;
21180
0
            tag_len -= 6;
21181
21182
0
            proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_xr_bssid, tvb, offset, 6, ENC_NA);
21183
0
            offset  += 6;
21184
0
            tag_len -= 6;
21185
21186
0
            proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_xr_beacon, tvb, offset, 2, ENC_LITTLE_ENDIAN);
21187
0
            offset  += 2;
21188
0
            tag_len -= 2;
21189
21190
0
            proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_xr_base_cap,
21191
0
                                    ett_ath_cap_tree, ieee80211_atheros_ie_cap,
21192
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
21193
0
            offset   += 1;
21194
0
            tag_len  -= 1;
21195
21196
0
            proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_xr_xr_cap,
21197
0
                                    ett_ath_cap_tree, ieee80211_atheros_ie_cap,
21198
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
21199
0
            offset   += 1;
21200
0
            tag_len  -= 1;
21201
0
            break;
21202
0
          }
21203
0
          default:
21204
          /* No default Action */
21205
0
          break;
21206
0
        } /* End switch (subtype) */
21207
0
        break;
21208
0
        default:
21209
        /* No default Action */
21210
0
        break;
21211
0
      } /* End switch (type) */
21212
21213
0
    }
21214
0
  }
21215
0
  if (tag_len > 0) {
21216
0
    proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_data, tvb, offset, tag_len, ENC_NA);
21217
0
  }
21218
0
}
21219
21220
typedef enum {
21221
  AIRONET_IE_DTPC = 0,
21222
  AIRONET_IE_UNKNOWN1 = 1,
21223
  AIRONET_IE_VERSION = 3,
21224
  AIRONET_IE_QOS,
21225
  AIRONET_IE_UNKNOWN11 = 11,
21226
  AIRONET_IE_QBSS_V2 = 14,
21227
  AIRONET_IE_CLIENT_MFP = 20,
21228
  AIRONET_IE_APNAME_V2 = 47
21229
} aironet_ie_type_t;
21230
21231
static const value_string aironet_ie_type_vals[] = {
21232
  { AIRONET_IE_DTPC,      "DTPC"},
21233
  { AIRONET_IE_UNKNOWN1,  "Unknown (1)"},
21234
  { AIRONET_IE_VERSION,   "CCX version"},
21235
  { AIRONET_IE_QOS,       "Qos"},
21236
  { AIRONET_IE_UNKNOWN11, "Unknown (11)"},
21237
  { AIRONET_IE_QBSS_V2,   "QBSS V2 - CCA"},
21238
  { AIRONET_IE_CLIENT_MFP, "Client MFP"},
21239
  { AIRONET_IE_APNAME_V2, "AP NAME v2"},
21240
  { 0,                    NULL }
21241
};
21242
21243
static const value_string aironet_mfp_vals[] = {
21244
  { 0,      "Disabled"},
21245
  { 1,      "Enabled"},
21246
  { 0,      NULL }
21247
};
21248
21249
static void
21250
dissect_vendor_ie_aironet(proto_item *aironet_item, proto_tree *ietree,
21251
                          tvbuff_t *tvb, int offset, uint32_t tag_len,packet_info *pinfo)
21252
0
{
21253
0
  uint8_t type,length;
21254
0
  int i;
21255
0
  bool dont_change = false; /* Don't change the IE item text to default */
21256
0
  const uint8_t* apname;
21257
21258
0
  type = tvb_get_uint8(tvb, offset);
21259
0
  proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
21260
0
  offset += 1;
21261
21262
0
  switch (type) {
21263
0
  case AIRONET_IE_DTPC:
21264
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_dtpc, tvb, offset, 1, ENC_NA);
21265
0
    proto_item_append_text(aironet_item, ": Aironet DTPC Powerlevel %ddBm", tvb_get_uint8(tvb, offset));
21266
0
    offset += 1;
21267
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_dtpc_unknown, tvb, offset, 1, ENC_NA);
21268
0
    dont_change = true;
21269
0
    break;
21270
0
  case AIRONET_IE_VERSION:
21271
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
21272
0
    proto_item_append_text(aironet_item, ": Aironet CCX version = %d", tvb_get_uint8(tvb, offset));
21273
0
    dont_change = true;
21274
0
    break;
21275
0
  case AIRONET_IE_QOS:
21276
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_qos_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
21277
0
    offset += 1;
21278
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_qos_paramset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
21279
0
    offset += 1;
21280
21281
    /* XXX: just copied over from WME. Maybe "Best Effort" and "Background"
21282
     *  need to be swapped. Also, the "TXOP" may be TXOP - or not.
21283
     */
21284
0
    for (i = 0; i < 4; i++) {
21285
0
      uint8_t byte1, byte2;
21286
0
      uint16_t txop;
21287
0
      byte1 = tvb_get_uint8(tvb, offset);
21288
0
      byte2 = tvb_get_uint8(tvb, offset + 1);
21289
0
      txop = tvb_get_letohs(tvb, offset + 2);
21290
0
      proto_tree_add_bytes_format(ietree, hf_ieee80211_aironet_ie_qos_val, tvb, offset, 4, NULL,
21291
0
          "CCX QoS Parameters: ACI %u (%s), Admission Control %sMandatory, AIFSN %u, ECWmin %u, ECWmax %u, TXOP %u",
21292
0
        (byte1 & 0x60) >> 5, val_to_str((byte1 & 0x60) >> 5, wme_acs, "(Unknown: %d)"),
21293
0
        (byte1 & 0x10) ? "" : "not ", byte1 & 0x0f,
21294
0
        byte2 & 0x0f, (byte2 & 0xf0) >> 4,
21295
0
        txop);
21296
0
      offset += 4;
21297
0
    }
21298
0
    break;
21299
0
  case AIRONET_IE_QBSS_V2:
21300
    /* Extract Values */
21301
0
    proto_tree_add_item(ietree, hf_ieee80211_qbss2_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
21302
0
    proto_tree_add_item(ietree, hf_ieee80211_qbss2_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
21303
0
    proto_tree_add_item(ietree, hf_ieee80211_qbss2_cal, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
21304
0
    proto_tree_add_item(ietree, hf_ieee80211_qbss2_gl, tvb, offset + 4, 1, ENC_LITTLE_ENDIAN);
21305
0
    break;
21306
0
  case AIRONET_IE_CLIENT_MFP:
21307
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_clientmfp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
21308
0
    proto_item_append_text(aironet_item, ": Aironet Client MFP %s",
21309
0
      val_to_str_const(1 & tvb_get_uint8(tvb, offset), aironet_mfp_vals, "Unknown"));
21310
0
    dont_change = true;
21311
0
    break;
21312
0
  case AIRONET_IE_APNAME_V2:
21313
  /* Adds support for the new AP name v2 format;
21314
this supports:
21315
- 32 character long AP names (vs 16 in v1/ccx)
21316
- is used on both WLC and Meraki
21317
- does not require CCX to be enabled.
21318
 */
21319
0
    tag_len -= 1;
21320
0
    length = tag_len;
21321
21322
0
    proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_cisco_ap_name_v2, tvb, offset, length, ENC_ASCII|ENC_NA, pinfo->pool,&apname);
21323
0
    proto_item_append_text(ietree, ": AP name v2: %s", apname);
21324
    // Set to true, so we dont append "Aironet type"
21325
0
    dont_change = true;
21326
0
  break;
21327
21328
0
  default:
21329
0
    proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_data, tvb, offset,
21330
0
      tag_len - 1, ENC_NA);
21331
0
    break;
21332
0
  }
21333
0
  if (!dont_change) {
21334
0
    proto_item_append_text(aironet_item, ": Aironet %s (%d)",
21335
0
      val_to_str_const(type, aironet_ie_type_vals, "Unknown"), type);
21336
0
  }
21337
0
}
21338
21339
/* info from lswifi https://github.com/joshschmelzle/lswifi/blob/v0.1.49/lswifi/elements.py#L1526 */
21340
#define ARUBA_CAC 1
21341
#define ARUBA_MESH 2
21342
0
#define ARUBA_APNAME 3
21343
#define ARUBA_ARM 4
21344
#define ARUBA_SLB 5
21345
#define ARUBA_SJ_LOOP_PROTECT 6
21346
#define ARUBA_AUTO_MESH 7
21347
#define ARUBA_LCI 8
21348
0
#define ARUBA_GPS 9
21349
#define ARUBA_AP_HEALTH 10
21350
21351
static const value_string ieee80211_vs_aruba_subtype_vals[] = {
21352
  { ARUBA_CAC, "CAC"},
21353
  { ARUBA_MESH, "Mesh"},
21354
  { ARUBA_APNAME, "AP Name"},
21355
  { ARUBA_ARM, "ARM"},
21356
  { ARUBA_SLB, "SLB"},
21357
  { ARUBA_SJ_LOOP_PROTECT, "SJ Loop Protect"},
21358
  { ARUBA_AUTO_MESH, "Auto Mesh"},
21359
  { ARUBA_LCI, "LCI"},
21360
  { ARUBA_GPS, "GPS Ellipse"},
21361
  { ARUBA_AP_HEALTH, "AP Health"},
21362
  { 0,                 NULL }
21363
};
21364
static void
21365
dissect_vendor_ie_aruba(proto_item *item, proto_tree *ietree,
21366
                          tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
21367
0
{
21368
0
  uint8_t type;
21369
0
  const uint8_t* name;
21370
21371
0
  offset += 1; /* VS OUI Type */
21372
0
  tag_len -= 1;
21373
21374
0
  type = tvb_get_uint8(tvb, offset);
21375
0
  proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_subtype, tvb, offset, 1, ENC_NA);
21376
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_aruba_subtype_vals, "Unknown"));
21377
0
  offset += 1;
21378
0
  tag_len -= 1;
21379
21380
0
  switch (type) {
21381
0
  case ARUBA_APNAME:
21382
0
    offset += 1;
21383
0
    tag_len -= 1;
21384
21385
0
    proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_aruba_apname, tvb,
21386
0
                         offset, tag_len, ENC_ASCII|ENC_NA, pinfo->pool, &name);
21387
0
    proto_item_append_text(item, " (%s)", name);
21388
0
    break;
21389
21390
0
  case ARUBA_GPS:
21391
0
    {
21392
0
      double latitude, longitude, major_axis, minor_axis, orientation, distance;
21393
0
      offset += 1;
21394
0
      tag_len -= 1;
21395
0
      if (tag_len < 1) {
21396
0
        expert_add_info_format(pinfo, ietree, &ei_ieee80211_bad_length,
21397
0
                          "Malformed Aruba GPS data (insufficient data)");
21398
0
        break;
21399
0
      }
21400
21401
0
      uint32_t gps_ie_length = tvb_get_uint8(tvb, offset);
21402
0
      offset += 1;
21403
0
      tag_len -= 1;
21404
0
      gps_ie_length -= 1;
21405
21406
0
      if (tag_len < gps_ie_length) {
21407
0
        expert_add_info_format(pinfo, ietree, &ei_ieee80211_bad_length,
21408
0
                      "Truncated Aruba GPS data (IE needs %u bytes but got %u)",
21409
0
                      gps_ie_length, tag_len);
21410
0
        break;
21411
0
      }
21412
21413
0
      proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_gps_subversion, tvb,
21414
0
                        offset, 1, ENC_NA);
21415
0
      offset += 1;
21416
0
      tag_len -= 1;
21417
21418
0
      proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_gps_hop, tvb,
21419
0
                        offset, 1, ENC_NA);
21420
0
      offset += 1;
21421
0
      tag_len -= 1;
21422
21423
0
      latitude = tvb_get_ntohieee_double(tvb, offset);
21424
0
      proto_tree_add_double_format_value(ietree, hf_ieee80211_vs_aruba_gps_latitude, tvb,
21425
0
                        offset, 8, latitude, "%.6f", latitude);
21426
0
      offset += 8;
21427
0
      tag_len -= 8;
21428
21429
0
      longitude = tvb_get_ntohieee_double(tvb, offset);
21430
0
      proto_tree_add_double_format_value(ietree, hf_ieee80211_vs_aruba_gps_longitude, tvb,
21431
0
                        offset, 8, longitude, "%.6f", longitude);
21432
0
      offset += 8;
21433
0
      tag_len -= 8;
21434
21435
0
      major_axis = tvb_get_ntohieee_double(tvb, offset);
21436
0
      proto_tree_add_double_format_value(ietree, hf_ieee80211_vs_aruba_gps_major_axis, tvb,
21437
0
                        offset, 8, major_axis, "%.6f", major_axis);
21438
0
      offset += 8;
21439
0
      tag_len -= 8;
21440
21441
0
      minor_axis = tvb_get_ntohieee_double(tvb, offset);
21442
0
      proto_tree_add_double_format_value(ietree, hf_ieee80211_vs_aruba_gps_minor_axis, tvb,
21443
0
                        offset, 8, minor_axis, "%.6f", minor_axis);
21444
0
      offset += 8;
21445
0
      tag_len -= 8;
21446
21447
0
      orientation = tvb_get_ntohieee_double(tvb, offset);
21448
0
      proto_tree_add_double_format_value(ietree, hf_ieee80211_vs_aruba_gps_orientation, tvb,
21449
0
                        offset, 8, orientation, "%.6f", orientation);
21450
0
      offset += 8;
21451
0
      tag_len -= 8;
21452
21453
0
      distance = tvb_get_ntohieee_double(tvb, offset);
21454
0
      proto_tree_add_double_format_value(ietree, hf_ieee80211_vs_aruba_gps_distance, tvb,
21455
0
                        offset, 8, distance, "%.6f", distance);
21456
0
      tag_len -= 8;
21457
21458
0
      if (tag_len > 0) {
21459
0
        expert_add_info_format(pinfo, ietree, &ei_ieee80211_bad_length,
21460
0
                        "Aruba GPS data contains additional %u bytes of unexpected data",
21461
0
                        tag_len);
21462
0
      }
21463
21464
0
      proto_item_append_text(item, " (coords: [%.6f, %.6f], ellipse: [%.2fm x %.2fm, %.2f°], distance: %.2fm)",
21465
0
                        latitude, longitude, major_axis, minor_axis, orientation, distance);
21466
0
    }
21467
0
    break;
21468
21469
0
  default:
21470
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_data, tvb, offset,
21471
0
      tag_len, ENC_NA);
21472
0
    if (tag_len > 0)
21473
0
      proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(pinfo->pool, tvb, offset, tag_len));
21474
0
    break;
21475
0
  }
21476
0
}
21477
21478
static void
21479
dissect_vendor_ie_routerboard(proto_item *item _U_, proto_tree *ietree,
21480
                          tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
21481
0
{
21482
0
  uint8_t type, length;
21483
0
  proto_item *subitem;
21484
0
  proto_tree *subtree;
21485
21486
0
  offset += 1; /* VS OUI Type */
21487
0
  tag_len -= 1;
21488
  /* FIXME: Make sure we have at least 2 bytes left */
21489
0
  proto_tree_add_item(ietree, hf_ieee80211_vs_routerboard_unknown, tvb, offset, 2, ENC_NA);
21490
21491
0
  offset += 2;
21492
0
  tag_len -= 2;
21493
21494
0
  while (tag_len >= 2) {
21495
0
    type = tvb_get_uint8(tvb, offset);
21496
0
    length = tvb_get_uint8(tvb, offset+1);
21497
0
    subitem = proto_tree_add_item(ietree, hf_ieee80211_vs_routerboard_subitem, tvb, offset, length+2, ENC_NA);
21498
0
    subtree = proto_item_add_subtree(subitem, ett_routerboard);
21499
0
    proto_item_set_text(subitem, "Sub IE (T/L: %d/%d)", type, length);
21500
21501
0
    proto_tree_add_item(subtree, hf_ieee80211_vs_routerboard_subtype, tvb, offset, 1, ENC_NA);
21502
0
    offset += 1;
21503
0
    tag_len -= 1;
21504
21505
0
    proto_tree_add_item(subtree, hf_ieee80211_vs_routerboard_sublength, tvb, offset, 1, ENC_NA);
21506
0
    offset += 1;
21507
0
    tag_len -= 1;
21508
21509
0
    if (tag_len < length)
21510
0
      length = tag_len;
21511
0
    if (length == 0) {
21512
0
      expert_add_info(pinfo, subitem, &ei_ieee80211_vs_routerboard_unexpected_len);
21513
0
      break;
21514
0
    }
21515
21516
0
    proto_tree_add_item(subtree, hf_ieee80211_vs_routerboard_subdata, tvb, offset, length, ENC_NA);
21517
21518
0
    if(type == 1){
21519
0
      if(length == 30){
21520
0
        proto_tree_add_item(subtree, hf_ieee80211_vs_routerboard_subtype1_prefix, tvb, offset, 10, ENC_NA);
21521
0
        proto_tree_add_item(subtree, hf_ieee80211_vs_routerboard_subtype1_data, tvb, offset + 10, length - 10, ENC_ASCII);
21522
0
      }else{
21523
0
        expert_add_info(pinfo, subitem, &ei_ieee80211_vs_routerboard_unexpected_len);
21524
0
      }
21525
0
    }
21526
21527
0
    offset += length;
21528
0
    tag_len -= length;
21529
0
  }
21530
0
}
21531
21532
0
#define AEROHIVE_HOSTNAME 33
21533
static const value_string ieee80211_vs_aerohive_type_vals[] = {
21534
  { AEROHIVE_HOSTNAME, "Host Name"},
21535
  { 0,                 NULL }
21536
};
21537
static void
21538
dissect_vendor_ie_aerohive(proto_item *item _U_, proto_tree *ietree,
21539
                          tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
21540
0
{
21541
0
  uint32_t type, length;
21542
0
  const uint8_t* hostname;
21543
0
  proto_item *ti_len;
21544
21545
  /* VS OUI Type */
21546
0
  type = tvb_get_uint8(tvb, offset);
21547
0
  offset += 1;
21548
0
  tag_len -= 1;
21549
21550
0
  proto_tree_add_item(ietree, hf_ieee80211_vs_aerohive_version, tvb, offset, 1, ENC_NA);
21551
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_aerohive_type_vals, "Unknown"));
21552
0
  offset += 1;
21553
0
  tag_len -= 1;
21554
21555
0
  switch(type){
21556
0
    case AEROHIVE_HOSTNAME: /* Subtype (1 byte) + Host Name Length (1 byte) + Host Name */
21557
21558
0
      proto_tree_add_item(ietree, hf_ieee80211_vs_aerohive_subtype, tvb, offset, 1, ENC_NA);
21559
0
      offset += 1;
21560
0
      tag_len -= 1;
21561
21562
0
      ti_len = proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_aerohive_hostname_length, tvb, offset, 1, ENC_NA, &length);
21563
0
      offset += 1;
21564
0
      tag_len -= 1;
21565
21566
0
      if (tag_len < length) {
21567
0
        expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < Host Name Length");
21568
0
        length = tag_len;
21569
0
      }
21570
21571
0
      proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_aerohive_hostname, tvb, offset, length, ENC_ASCII|ENC_NA, pinfo->pool, &hostname);
21572
0
      proto_item_append_text(item, " (%s)", hostname);
21573
21574
0
    break;
21575
21576
0
    default:
21577
0
      proto_tree_add_item(ietree, hf_ieee80211_vs_aerohive_data, tvb, offset, tag_len, ENC_NA);
21578
0
    break;
21579
0
  }
21580
0
}
21581
21582
0
#define MIST_APNAME 1
21583
static const value_string ieee80211_vs_mist_type_vals[] = {
21584
    { MIST_APNAME, "AP Name"},
21585
    { 0,           NULL }
21586
};
21587
static void
21588
dissect_vendor_ie_mist(proto_item *item _U_, proto_tree *ietree,
21589
                       tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
21590
0
{
21591
0
    uint32_t type, length;
21592
0
    const uint8_t* apname;
21593
21594
    /* VS OUI Type */
21595
0
    type = tvb_get_uint8(tvb, offset);
21596
0
    proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_mist_type_vals, "Unknown"));
21597
0
    offset += 1;
21598
0
    tag_len -= 1;
21599
21600
0
    switch(type){
21601
0
        case MIST_APNAME:
21602
0
            length = tag_len;
21603
0
            proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_mist_ap_name, tvb, offset, length, ENC_ASCII|ENC_NA, pinfo->pool, &apname);
21604
0
            proto_item_append_text(item, " (%s)", apname);
21605
0
            break;
21606
21607
0
        default:
21608
0
            proto_tree_add_item(ietree, hf_ieee80211_vs_mist_data, tvb, offset, tag_len, ENC_NA);
21609
0
            break;
21610
0
    }
21611
0
}
21612
21613
0
#define RUCKUS_APNAME 3
21614
static const value_string ieee80211_vs_ruckus_type_vals[] = {
21615
    { RUCKUS_APNAME, "AP Name"},
21616
    { 0,           NULL }
21617
};
21618
static void
21619
dissect_vendor_ie_ruckus(proto_item *item _U_, proto_tree *ietree,
21620
                       tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
21621
0
{
21622
0
    uint32_t type, length;
21623
0
    const uint8_t* apname;
21624
21625
    /* VS OUI Type */
21626
0
    type = tvb_get_uint8(tvb, offset);
21627
0
    proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_ruckus_type_vals, "Unknown"));
21628
0
    offset += 1;
21629
0
    tag_len -= 1;
21630
21631
0
    switch(type){
21632
0
        case RUCKUS_APNAME:
21633
0
          length = tag_len;
21634
0
            proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_ruckus_ap_name, tvb, offset, length, ENC_ASCII|ENC_NA, pinfo->pool, &apname);
21635
0
            proto_item_append_text(item, " (%s)", apname);
21636
0
            break;
21637
21638
0
        default:
21639
0
            proto_tree_add_item(ietree, hf_ieee80211_vs_ruckus_data, tvb, offset, tag_len, ENC_NA);
21640
0
            break;
21641
0
    }
21642
0
}
21643
21644
0
#define ALCATEL_APNAME 1
21645
static const value_string ieee80211_vs_alcatel_type_vals[] = {
21646
    { ALCATEL_APNAME, "AP Name"},
21647
    { 0, NULL }
21648
};
21649
static void
21650
dissect_vendor_ie_alcatel(proto_item *item _U_, proto_tree *ietree,
21651
                       tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
21652
0
{
21653
0
    uint32_t type, length;
21654
0
    const uint8_t* apname;
21655
21656
    /* VS OUI Type */
21657
0
    type = tvb_get_uint8(tvb, offset);
21658
0
    proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_alcatel_type_vals, "Unknown"));
21659
0
    offset += 1;
21660
0
    tag_len -= 1;
21661
21662
0
    switch(type){
21663
0
        case ALCATEL_APNAME:
21664
0
            length = tag_len;
21665
0
            proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_alcatel_ap_name, tvb, offset, length, ENC_ASCII|ENC_NA, pinfo->pool, &apname);
21666
0
            proto_item_append_text(item, " (%s)", apname);
21667
0
            break;
21668
21669
0
        default:
21670
0
            proto_tree_add_item(ietree, hf_ieee80211_vs_alcatel_data, tvb, offset, tag_len, ENC_NA);
21671
0
            break;
21672
0
    }
21673
0
}
21674
21675
enum vs_sgdsn_type {
21676
  SGDSN_VERSION = 0x01,
21677
  SGDSN_IDFR = 0x02,
21678
  SGDSN_IDANSI = 0x03,
21679
  SGDSN_LATITUDE = 0x04,
21680
  SGDSN_LONGITUDE = 0x05,
21681
  SGDSN_ALTITUDE_ABS = 0x06,
21682
  SGDSN_ALTITUDE_REL = 0x07,
21683
  SGDSN_LATITUDE_TAKEOFF = 0x08,
21684
  SGDSN_LONGITUDE_TAKEOFF = 0x09,
21685
  SGDSN_H_SPEED = 0x0a,
21686
  SGDSN_HEADING = 0x0b,
21687
};
21688
21689
static const value_string ieee80211_vs_sgdsn_type_vals[] = {
21690
  { SGDSN_VERSION,  "Version"},
21691
  { SGDSN_IDFR, "ID FR"},
21692
  { SGDSN_IDANSI, "ID ANSI"},
21693
  { SGDSN_LATITUDE, "Latitude"},
21694
  { SGDSN_LONGITUDE, "Longitude"},
21695
  { SGDSN_ALTITUDE_ABS, "Altitude AMSL"},
21696
  { SGDSN_ALTITUDE_REL, "Altitude AGL"},
21697
  { SGDSN_LATITUDE_TAKEOFF, "Latitude Takeoff"},
21698
  { SGDSN_LONGITUDE_TAKEOFF, "Longitude Takeoff"},
21699
  { SGDSN_H_SPEED, "Horizontal Speed"},
21700
  { SGDSN_HEADING, "Heading"},
21701
  { 0, NULL }
21702
};
21703
21704
static void
21705
dissect_vendor_ie_sgdsn(proto_item *item _U_, proto_tree *ietree,
21706
                       tvbuff_t *tvb, int offset, uint32_t tag_len,
21707
                       packet_info *pinfo)
21708
0
{
21709
  // Technical specification defined in French law "NOR: ECOI1934044A"
21710
  // https://www.legifrance.gouv.fr/eli/arrete/2019/12/27/ECOI1934044A/jo/texte
21711
21712
0
  uint8_t type = tvb_get_uint8(tvb, offset);
21713
0
  offset += 1;
21714
0
  tag_len -= 1;
21715
21716
0
  if (type == 1) {
21717
21718
0
    while (tag_len > 2) {
21719
21720
0
      uint8_t tlv_type = tvb_get_uint8(tvb, offset);
21721
0
      uint8_t tlv_len = tvb_get_uint8(tvb, offset+1);
21722
21723
0
      if (tag_len < tlv_len) {
21724
0
        break;
21725
0
      }
21726
21727
0
      proto_item *item_tlv = proto_tree_add_item(ietree, hf_ieee80211_vs_sgdsn_tag, tvb, offset, tlv_len + 2, ENC_NA);
21728
0
      proto_item *tree = proto_item_add_subtree(item_tlv, ett_sgdsn);
21729
21730
0
      proto_tree_add_item(tree, hf_ieee80211_vs_sgdsn_type, tvb, offset, 1, ENC_NA);
21731
0
      proto_tree_add_item(tree, hf_ieee80211_vs_sgdsn_length, tvb, offset + 1,  1, ENC_NA);
21732
21733
0
      offset += 2;
21734
0
      tag_len -= 2;
21735
21736
0
      proto_item_append_text(tree, ": %s", val_to_str_const(tlv_type, ieee80211_vs_sgdsn_type_vals, "Unknown"));
21737
21738
0
      switch(tlv_type) {
21739
0
      case SGDSN_VERSION:
21740
0
        if (tlv_len == 1) {
21741
0
          uint32_t value;
21742
0
          proto_tree_add_item_ret_uint(tree, hf_ieee80211_vs_sgdsn_version, tvb, offset, 1, ENC_NA, &value);
21743
0
          proto_item_append_text(tree, ": %d", value);
21744
0
        } else {
21745
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be 1");
21746
0
        }
21747
0
        break;
21748
0
      case SGDSN_IDFR:
21749
0
        if (tlv_len == 30) {
21750
0
          const uint8_t* string1;
21751
0
          const uint8_t* string2;
21752
0
          const uint8_t* string3;
21753
0
          proto_tree_add_item_ret_string(tree, hf_ieee80211_vs_sgdsn_manufacturer, tvb, offset, 3, ENC_ASCII|ENC_NA, pinfo->pool, &string1);
21754
0
          proto_tree_add_item_ret_string(tree, hf_ieee80211_vs_sgdsn_model, tvb, offset+3, 3, ENC_ASCII|ENC_NA, pinfo->pool, &string2);
21755
0
          proto_tree_add_item_ret_string(tree, hf_ieee80211_vs_sgdsn_serialnumber, tvb, offset+6, tlv_len-6, ENC_ASCII|ENC_NA, pinfo->pool, &string3);
21756
0
          proto_item_append_text(tree, ": %s %s %s", string1, string2, string3);
21757
0
        } else {
21758
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be 30");
21759
0
        }
21760
0
        break;
21761
0
      case SGDSN_IDANSI:
21762
0
        if (tlv_len >= 6 && tlv_len <= 20) {
21763
          // ANSI/CTA-2063 Small UAS Serial Number.
21764
          // Doc (free): https://shop.cta.tech/products/small-unmanned-aerial-systems-serial-numbers
21765
0
          const uint8_t* icao_mfr_code;
21766
0
          uint32_t sn_len;
21767
0
          const uint8_t* serial_number;
21768
0
          proto_tree_add_item_ret_string(tree, hf_ieee80211_vs_sgdsn_icaomfrcode, tvb, offset, 4, ENC_ASCII|ENC_NA, pinfo->pool, &icao_mfr_code);
21769
0
          proto_tree_add_item_ret_uint(tree, hf_ieee80211_vs_sgdsn_serialnumber_len, tvb, offset+4, 1, ENC_NA, &sn_len);
21770
0
          if(sn_len < 0x30 || (sn_len > 0x39 && sn_len < 0x41) || sn_len > 0x46) {
21771
0
            expert_add_info_format(pinfo, tree, &ei_ieee80211_vs_sgdsn_serialnumber_invalid_len_val, "Serial Number Length must be '0' to '9', or 'A' to 'F'");
21772
0
          } else if (sn_len != (uint32_t)tlv_len+(sn_len>0x39 ? 0x32 : 0x2A)) {
21773
            // Check that sn_len equals tlv_len - 5 + ( 0x37 if sn_len is 'A' to 'F', 0x30 otherwise).
21774
            // We suppressed the minus 5 in the check above to avoid a compilation warning
21775
0
            expert_add_info_format(pinfo, tree, &ei_ieee80211_vs_sgdsn_serialnumber_unexpected_len_val, "Expected %d byte(s), got %d byte(s)", tlv_len-5, (sn_len>0x39?sn_len-0x37:sn_len-0x30));
21776
0
          }
21777
0
          proto_tree_add_item_ret_string(tree, hf_ieee80211_vs_sgdsn_serialnumber, tvb, offset+5, tlv_len-5, ENC_ASCII|ENC_NA, pinfo->pool, &serial_number);
21778
0
          proto_item_append_text(tree, ": %s %s", icao_mfr_code, serial_number);
21779
0
        } else {
21780
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be between 6 and 20");
21781
0
        }
21782
0
        break;
21783
0
      case SGDSN_LATITUDE_TAKEOFF:
21784
0
      case SGDSN_LATITUDE:
21785
0
      case SGDSN_LONGITUDE_TAKEOFF:
21786
0
      case SGDSN_LONGITUDE:
21787
0
        if (tlv_len == 4) {
21788
0
          int32_t value;
21789
0
          proto_tree_add_item_ret_int(tree, hf_ieee80211_vs_sgdsn_gpscoord, tvb, offset, 4, ENC_NA, &value);
21790
0
          proto_item_append_text(tree, ": %.5f", value / 100000.0);
21791
0
        } else {
21792
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be 4");
21793
0
        }
21794
0
        break;
21795
0
      case SGDSN_ALTITUDE_ABS:
21796
0
      case SGDSN_ALTITUDE_REL:
21797
0
        if (tlv_len == 2) {
21798
0
          int32_t value;
21799
0
          proto_tree_add_item_ret_int(tree, hf_ieee80211_vs_sgdsn_altitude, tvb, offset, 2, ENC_NA, &value);
21800
0
          proto_item_append_text(tree, ": %d m", value);
21801
0
        } else {
21802
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be 4");
21803
0
        }
21804
0
        break;
21805
0
      case SGDSN_H_SPEED:
21806
0
        if (tlv_len == 1) {
21807
0
          uint32_t value;
21808
0
          proto_tree_add_item_ret_uint(tree, hf_ieee80211_vs_sgdsn_speed, tvb, offset, 1, ENC_NA, &value);
21809
0
          proto_item_append_text(tree, ": %d m/s", value);
21810
0
        } else {
21811
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be 1");
21812
0
        }
21813
0
        break;
21814
0
      case SGDSN_HEADING:
21815
0
        if (tlv_len == 2) {
21816
0
          uint32_t value;
21817
0
          proto_tree_add_item_ret_uint(tree, hf_ieee80211_vs_sgdsn_heading, tvb, offset, 2, ENC_NA, &value);
21818
0
          proto_item_append_text(tree, ": %d deg", value);
21819
0
        } else {
21820
0
          expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Value length must be 2");
21821
0
        }
21822
0
        break;
21823
0
      default:
21824
0
        expert_add_info_format(pinfo, tree, &ei_ieee80211_extra_data, "Unknown type");
21825
0
        break;
21826
0
      }
21827
21828
0
      offset += tlv_len;
21829
0
      tag_len -= tlv_len;
21830
0
    }
21831
21832
0
    if (tag_len) {
21833
0
      expert_add_info_format(pinfo, item, &ei_ieee80211_tag_length, "Remaining bytes, TLV structure error");
21834
0
    }
21835
0
  }
21836
0
}
21837
21838
enum vs_nintendo_type {
21839
  NINTENDO_SERVICES = 0x11,
21840
  NINTENDO_CONSOLEID = 0xF0
21841
};
21842
21843
static const value_string ieee80211_vs_nintendo_type_vals[] = {
21844
  { NINTENDO_SERVICES,  "Services"},
21845
  { NINTENDO_CONSOLEID, "ConsoleID"},
21846
  { 0, NULL }
21847
};
21848
21849
static proto_tree*
21850
dissect_vendor_ie_nintendo_tlv(const int hfindex, proto_tree *ietree,
21851
                          tvbuff_t *tvb, int offset, uint32_t sublen)
21852
0
{
21853
0
  proto_item *nintendo_item;
21854
0
  proto_tree *nintendo_tree;
21855
21856
0
  nintendo_item = proto_tree_add_item(ietree, hfindex, tvb, offset, sublen, ENC_NA);
21857
0
  nintendo_tree = proto_item_add_subtree(nintendo_item, ett_nintendo);
21858
21859
0
  proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_type, tvb, offset, 1, ENC_NA);
21860
0
  proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_length, tvb, offset + 1,  1, ENC_NA);
21861
21862
0
  return nintendo_tree;
21863
0
}
21864
21865
static void
21866
dissect_vendor_ie_nintendo(proto_item *item _U_, proto_tree *ietree,
21867
                          tvbuff_t *tvb, int offset, uint32_t tag_len)
21868
0
{
21869
0
  proto_tree *nintendo_tree;
21870
21871
0
  uint8_t     subtype;
21872
0
  uint8_t     sublength;
21873
0
  uint32_t    length = tag_len;
21874
21875
  /* Skip OUI type for now - the code is for type 1 (StreetPass) only */
21876
  /* http://3dbrew.org/wiki/StreetPass */
21877
0
  offset += 1;
21878
0
  length -= 1;
21879
21880
0
  while(length > 0 && length < 256) { /* otherwise we are < 0 but on unsigned */
21881
0
    subtype = tvb_get_uint8(tvb, offset);
21882
0
    sublength = tvb_get_uint8(tvb, offset + 1);
21883
21884
0
    switch(subtype) {
21885
0
    case NINTENDO_SERVICES:
21886
0
      nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_servicelist, ietree, tvb, offset, sublength + 2);
21887
0
      offset += 2;
21888
0
      length -= 2;
21889
21890
0
      while (sublength > 4) {
21891
21892
0
        proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_service, tvb, offset, 5, ENC_NA);
21893
0
        offset += 5;
21894
0
        length -= 5;
21895
0
        sublength -= 5;
21896
0
      }
21897
0
      break;
21898
0
    case NINTENDO_CONSOLEID:
21899
0
      nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_consoleid, ietree, tvb, offset, sublength + 2);
21900
0
      offset += + 2;
21901
0
      length -= + 2;
21902
21903
0
      proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_consoleid, tvb, offset, sublength, ENC_NA);
21904
0
      offset += sublength;
21905
0
      length -= sublength;
21906
0
      break;
21907
0
    default:
21908
0
      nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_unknown, ietree, tvb, offset, sublength + 2);
21909
0
      offset += + 2;
21910
0
      length -= + 2;
21911
21912
0
      proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_unknown, tvb, offset, sublength, ENC_NA);
21913
0
      offset += sublength;
21914
0
      length -= sublength;
21915
0
      break;
21916
0
    }
21917
0
  }
21918
0
}
21919
21920
static void
21921
dissect_vendor_ie_meru(proto_item *item _U_, proto_tree *ietree,
21922
                       tvbuff_t *tvb, int offset, uint32_t tag_len,
21923
                       packet_info *pinfo)
21924
0
{
21925
0
  uint32_t type, length;
21926
0
  proto_item *subitem, *ti_len;
21927
0
  proto_tree *subtree;
21928
21929
0
  while (tag_len >= 2) {
21930
0
    subitem = proto_tree_add_item(ietree, hf_ieee80211_vs_meru_subitem, tvb, offset, 2, ENC_NA);
21931
0
    subtree = proto_item_add_subtree(subitem, ett_meru);
21932
21933
0
    proto_tree_add_item_ret_uint(subtree, hf_ieee80211_vs_meru_subtype, tvb, offset, 1, ENC_NA, &type);
21934
0
    offset += 1;
21935
0
    tag_len -= 1;
21936
21937
0
    ti_len = proto_tree_add_item_ret_uint(subtree, hf_ieee80211_vs_meru_sublength, tvb, offset, 1, ENC_NA, &length);
21938
0
    offset += 1;
21939
0
    tag_len -= 1;
21940
21941
0
    if (tag_len < length) {
21942
0
      expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < Sub Length");
21943
0
      length = tag_len;
21944
0
    }
21945
21946
0
    proto_item_append_text(subitem, " (t=%d, l=%d)", type, length);
21947
0
    proto_item_set_len(subitem, 2+length);
21948
21949
0
    proto_tree_add_item(subtree, hf_ieee80211_vs_meru_subdata, tvb, offset, length, ENC_NA);
21950
0
    offset += length;
21951
0
    tag_len -= length;
21952
21953
0
  }
21954
0
}
21955
21956
static const value_string ieee80211_vs_extreme_subtype_vals[] = {
21957
  { 1, "AP Name"},
21958
  { 0, NULL }
21959
};
21960
21961
static void
21962
dissect_vendor_ie_extreme(proto_item *item _U_, proto_tree *ietree,
21963
                          tvbuff_t *tvb, int offset, uint32_t tag_len,
21964
                          packet_info *pinfo)
21965
0
{
21966
0
  uint32_t type, length;
21967
0
  proto_item *ti_len;
21968
21969
0
  proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_extreme_subtype, tvb, offset, 1, ENC_NA, &type);
21970
0
  offset += 1;
21971
0
  tag_len -= 1;
21972
21973
0
  proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_subdata, tvb, offset, tag_len, ENC_NA);
21974
21975
0
  switch(type){
21976
0
    case 1: /* Unknown (7 bytes) + AP Name Length (1 byte) + AP Name */
21977
21978
0
      proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_unknown, tvb, offset, 7, ENC_NA);
21979
0
      offset += 7;
21980
0
      tag_len -= 1;
21981
21982
0
      ti_len = proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_extreme_ap_length, tvb, offset, 1, ENC_NA, &length);
21983
0
      offset += 1;
21984
0
      tag_len -= 1;
21985
21986
0
      if (tag_len < length) {
21987
0
        expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < AP Length");
21988
0
        length = tag_len;
21989
0
      }
21990
21991
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_ap_name, tvb, offset, length, ENC_ASCII);
21992
21993
0
    break;
21994
0
    default:
21995
    /* Expert info ? */
21996
0
    break;
21997
0
  }
21998
0
}
21999
22000
0
#define FORTINET_SYSTEM 10
22001
static const value_string ieee80211_vs_fortinet_subtype_vals[] = {
22002
  { FORTINET_SYSTEM, "SYSTEM"},
22003
  { 0,                 NULL }
22004
};
22005
22006
0
#define FORTINET_SYSTEM_APNAME 1
22007
0
#define FORTINET_SYSTEM_APMODEL 2
22008
0
#define FORTINET_SYSTEM_APSERIAL 3
22009
static const value_string ieee80211_vs_fortinet_system_type_vals[] = {
22010
  { FORTINET_SYSTEM_APNAME, "AP NAME"},
22011
  { FORTINET_SYSTEM_APMODEL, "AP MODEL"},
22012
  { FORTINET_SYSTEM_APSERIAL, "AP SERIAL"},
22013
  { 0,                 NULL }
22014
};
22015
22016
static void
22017
dissect_vendor_ie_fortinet(proto_item *item, proto_tree *ietree,
22018
                          tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
22019
0
{
22020
0
  uint32_t type;
22021
22022
22023
0
  proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_fortinet_subtype, tvb, offset, 2, ENC_LITTLE_ENDIAN, &type);
22024
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_fortinet_subtype_vals, "Unknown"));
22025
0
  offset += 2;
22026
0
  tag_len -= 2;
22027
22028
0
  switch (type) {
22029
0
  case FORTINET_SYSTEM:
22030
0
    while (tag_len > 2) {
22031
0
      uint32_t system_type, system_length;
22032
22033
0
      proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_fortinet_system_type, tvb, offset, 1, ENC_NA, &system_type);
22034
0
      proto_item_append_text(item, " - %s:", val_to_str_const(system_type, ieee80211_vs_fortinet_system_type_vals, "Unknown"));
22035
0
      offset += 1;
22036
0
      tag_len -= 1;
22037
22038
0
      proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_fortinet_system_length, tvb, offset, 1, ENC_NA, &system_length);
22039
0
      offset += 1;
22040
0
      tag_len -= 1;
22041
22042
0
      switch (system_type) {
22043
0
        case FORTINET_SYSTEM_APNAME:{
22044
0
          const uint8_t* name;
22045
0
          proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_fortinet_system_apname, tvb,
22046
0
                               offset, system_length, ENC_ASCII|ENC_NA, pinfo->pool, &name);
22047
0
          proto_item_append_text(item, " %s", name);
22048
0
        }
22049
0
        break;
22050
0
        case FORTINET_SYSTEM_APMODEL:{
22051
0
          const uint8_t* model;
22052
0
          proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_fortinet_system_apmodel, tvb,
22053
0
                               offset, system_length, ENC_ASCII|ENC_NA, pinfo->pool, &model);
22054
0
          proto_item_append_text(item, " %s", model);
22055
0
        }
22056
0
        break;
22057
0
        case FORTINET_SYSTEM_APSERIAL:{
22058
0
          const uint8_t* serial;
22059
0
          proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_fortinet_system_apserial, tvb,
22060
0
                               offset, system_length, ENC_ASCII|ENC_NA, pinfo->pool, &serial);
22061
0
          proto_item_append_text(item, " %s", serial);
22062
0
        }
22063
0
        break;
22064
0
      }
22065
0
      offset += system_length;
22066
0
      tag_len -= system_length;
22067
0
    }
22068
0
    break;
22069
22070
0
  default:
22071
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_fortinet_data, tvb, offset,
22072
0
      tag_len, ENC_NA);
22073
0
    if (tag_len > 0)
22074
0
      proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(pinfo->pool, tvb, offset, tag_len));
22075
0
    break;
22076
0
  }
22077
0
}
22078
22079
0
#define ARISTA_APNAME  6
22080
static const value_string ieee80211_vs_arista_subtype_vals[] = {
22081
  { ARISTA_APNAME, "AP Name"},
22082
  { 0,                 NULL }
22083
};
22084
static void
22085
dissect_vendor_ie_arista(proto_item *item, proto_tree *ietree,
22086
                          tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
22087
0
{
22088
0
  uint8_t type;
22089
0
  const uint8_t* name;
22090
22091
0
  offset += 1; /* VS OUI Type */
22092
0
  tag_len -= 1;
22093
22094
0
  type = tvb_get_uint8(tvb, offset);
22095
0
  proto_tree_add_item(ietree, hf_ieee80211_vs_arista_subtype, tvb, offset, 1, ENC_NA);
22096
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_arista_subtype_vals, "Unknown"));
22097
0
  offset += 1;
22098
0
  tag_len -= 1;
22099
22100
0
  switch (type) {
22101
0
  case ARISTA_APNAME:
22102
0
    offset += 1;
22103
0
    tag_len -= 1;
22104
22105
0
    proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_arista_apname, tvb,
22106
0
                         offset, tag_len, ENC_ASCII|ENC_NA, pinfo->pool, &name);
22107
0
    proto_item_append_text(item, " (%s)", name);
22108
0
    break;
22109
22110
0
  default:
22111
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_arista_data, tvb, offset,
22112
0
      tag_len, ENC_NA);
22113
0
    if (tag_len > 0)
22114
0
      proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(pinfo->pool, tvb, offset, tag_len));
22115
0
    break;
22116
0
  }
22117
0
}
22118
22119
0
#define WISUN_PTKID 1
22120
0
#define WISUN_GTKL  2
22121
0
#define WISUN_NR    3
22122
0
#define WISUN_LGTKL 4
22123
0
#define WISUN_LGTK  5
22124
22125
static const value_string ieee80211_vs_wisun_type_vals[] = {
22126
  { WISUN_PTKID, "PTKID" },
22127
  { WISUN_GTKL,  "GTKL"  },
22128
  { WISUN_NR,    "NR"    },
22129
  { WISUN_LGTKL, "LGTKL" },
22130
  { WISUN_LGTK,  "LGTK"  },
22131
  { 0,           NULL    }
22132
};
22133
22134
14
#define WISUN_GTKL_GTK0 0x01
22135
14
#define WISUN_GTKL_GTK1 0x02
22136
14
#define WISUN_GTKL_GTK2 0x04
22137
14
#define WISUN_GTKL_GTK3 0x08
22138
22139
#define WISUN_NR_BR     0
22140
#define WISUN_NR_ROUTER 1
22141
#define WISUN_NR_LFN    2
22142
22143
static const value_string ieee80211_vs_wisun_nr_vals[] = {
22144
  { WISUN_NR_BR,     "Border Router" },
22145
  { WISUN_NR_ROUTER, "Router"        },
22146
  { WISUN_NR_LFN,    "LFN"           },
22147
  { 0,               NULL            }
22148
};
22149
22150
14
#define WISUN_LGTKL_LGTK0 0x01
22151
14
#define WISUN_LGTKL_LGTK1 0x02
22152
14
#define WISUN_LGTKL_LGTK2 0x04
22153
22154
static void
22155
dissect_vendor_ie_wisun(proto_item *item, proto_tree *ietree,
22156
                        tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
22157
0
{
22158
0
  uint32_t type;
22159
22160
0
  proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_wisun_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &type);
22161
0
  proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_wisun_type_vals, "Unknown"));
22162
0
  offset += 1;
22163
0
  tag_len -= 1;
22164
22165
0
  switch(type) {
22166
0
  case WISUN_PTKID:
22167
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_ptkid, tvb, offset, 16, ENC_NA);
22168
0
    break;
22169
0
  case WISUN_GTKL: {
22170
0
    static int * const wisun_gtkl[] = {
22171
0
        &hf_ieee80211_vs_wisun_gtkl_gtk0,
22172
0
        &hf_ieee80211_vs_wisun_gtkl_gtk1,
22173
0
        &hf_ieee80211_vs_wisun_gtkl_gtk2,
22174
0
        &hf_ieee80211_vs_wisun_gtkl_gtk3,
22175
0
        NULL,
22176
0
    };
22177
22178
0
    proto_tree_add_bitmask(ietree, tvb, offset, hf_ieee80211_vs_wisun_gtkl,
22179
0
                           ett_wisun_gtkl, wisun_gtkl, ENC_LITTLE_ENDIAN);
22180
0
    break;
22181
0
  }
22182
0
  case WISUN_NR:
22183
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_nr, tvb,
22184
0
                        offset, 1, ENC_LITTLE_ENDIAN);
22185
0
    break;
22186
0
  case WISUN_LGTKL: {
22187
0
    static int * const wisun_lgtkl[] = {
22188
0
        &hf_ieee80211_vs_wisun_lgtkl_lgtk0,
22189
0
        &hf_ieee80211_vs_wisun_lgtkl_lgtk1,
22190
0
        &hf_ieee80211_vs_wisun_lgtkl_lgtk2,
22191
0
        NULL,
22192
0
    };
22193
22194
0
    proto_tree_add_bitmask(ietree, tvb, offset, hf_ieee80211_vs_wisun_lgtkl,
22195
0
                           ett_wisun_lgtkl, wisun_lgtkl, ENC_LITTLE_ENDIAN);
22196
0
    break;
22197
0
  }
22198
0
  case WISUN_LGTK:
22199
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_lgtk_key_id, tvb,
22200
0
                        offset, 1, ENC_LITTLE_ENDIAN);
22201
0
    offset += 2;
22202
0
    tag_len -= 2;
22203
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_lgtk_lgtk, tvb,
22204
0
                        offset, tag_len, ENC_NA);
22205
0
    break;
22206
0
  default:
22207
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_data, tvb, offset, tag_len, ENC_NA);
22208
0
    if (tag_len > 0)
22209
0
      proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(pinfo->pool, tvb, offset, tag_len));
22210
0
    break;
22211
0
  }
22212
0
}
22213
22214
static const value_string ieee80211_vs_apple_subtype_vals[] = {
22215
  { 0,                 NULL }
22216
};
22217
22218
static void
22219
dissect_vendor_ie_apple(proto_item *item, proto_tree *ietree,
22220
                          tvbuff_t *tvb, int offset, uint32_t tag_len, packet_info *pinfo)
22221
0
{
22222
0
  uint32_t subtype, type, length;
22223
22224
0
  proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_apple_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &type);
22225
0
  offset += 1;
22226
0
  tag_len -= 1;
22227
22228
0
  if(type == 6) { /* when type is 6, there is some subtype...*/
22229
0
    proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_apple_subtype, tvb, offset, 2, ENC_LITTLE_ENDIAN, &subtype);
22230
0
    proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_apple_subtype_vals, "Unknown"));
22231
0
    offset += 2;
22232
0
    tag_len -= 2;
22233
22234
0
    proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_apple_length, tvb, offset, 1, ENC_NA, &length);
22235
0
    offset += 1;
22236
0
    tag_len -= 1;
22237
22238
0
    switch (subtype) {
22239
0
    default:
22240
0
      proto_tree_add_item(ietree, hf_ieee80211_vs_apple_data, tvb, offset, tag_len, ENC_NA);
22241
0
      if (tag_len > 0)
22242
0
        proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(pinfo->pool, tvb, offset, tag_len));
22243
0
      break;
22244
0
    }
22245
0
  } else{
22246
0
    proto_tree_add_item(ietree, hf_ieee80211_vs_apple_data, tvb, offset, tag_len, ENC_NA);
22247
0
    if (tag_len > 0)
22248
0
      proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(pinfo->pool, tvb, offset, tag_len));
22249
0
  }
22250
22251
0
}
22252
22253
/* 802.11-2012 8.4.2.37 QoS Capability element */
22254
static int
22255
dissect_qos_capability(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
22256
26
{
22257
26
  switch (ftype) {
22258
8
    case MGT_ASSOC_REQ:
22259
9
    case MGT_PROBE_REQ:
22260
11
    case MGT_REASSOC_REQ:
22261
11
    {
22262
      /* To AP so decode Qos Info as STA */
22263
11
      offset += add_ff_qos_info_sta(tree, tvb, pinfo, offset);
22264
11
      break;
22265
9
    }
22266
22267
1
    case MGT_BEACON:
22268
5
    case MGT_PROBE_RESP:
22269
8
    case MGT_ASSOC_RESP:
22270
8
    case MGT_REASSOC_RESP:
22271
8
    {
22272
      /* From AP so decode QoS Info as AP */
22273
8
      offset += add_ff_qos_info_ap(tree, tvb, pinfo, offset);
22274
8
      break;
22275
8
    }
22276
22277
7
    default:
22278
7
      expert_add_info_format(pinfo, proto_tree_get_parent(tree), &ei_ieee80211_qos_info_bad_ftype,
22279
7
                             "Could not deduce direction to decode correctly, ftype %u", ftype);
22280
7
      break;
22281
26
  }
22282
22283
26
  return offset;
22284
26
}
22285
22286
88
static ieee80211_packet_data_t* get_or_create_packet_data(packet_info *pinfo) {
22287
88
  ieee80211_packet_data_t *packet_data =
22288
88
    (ieee80211_packet_data_t*)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, PACKET_DATA_KEY);
22289
88
  if (!packet_data) {
22290
65
    packet_data = wmem_new(pinfo->pool, ieee80211_packet_data_t);
22291
65
    p_add_proto_data(pinfo->pool, pinfo, proto_wlan, PACKET_DATA_KEY, packet_data);
22292
65
    memset(packet_data, 0, sizeof(ieee80211_packet_data_t));
22293
65
  }
22294
88
  return packet_data;
22295
88
}
22296
22297
/* See ieee80211_rsn_keymgmt_vals */
22298
static bool is_ft_akm_suite(uint32_t akm_suite)
22299
0
{
22300
0
  switch (akm_suite) {
22301
0
    case AKMS_FT_IEEE802_1X:
22302
0
    case AKMS_FT_PSK:
22303
0
    case AKMS_FT_SAE:
22304
0
    case AKMS_FT_IEEE802_1X_SHA384:
22305
0
    case AKMS_FT_FILS_SHA256:
22306
0
    case AKMS_FT_FILS_SHA384:
22307
0
      return true;
22308
0
    default:
22309
0
      return false;
22310
0
  }
22311
0
}
22312
22313
static void
22314
save_proto_data(tvbuff_t *tvb, packet_info *pinfo, int offset, size_t size, int key)
22315
2.11k
{
22316
2.11k
  uint8_t *data;
22317
22318
2.11k
  if (!enable_decryption) {
22319
0
    return;
22320
0
  }
22321
2.11k
  data = (uint8_t *)wmem_alloc(pinfo->pool, size);
22322
2.11k
  tvb_memcpy(tvb, data, offset, size);
22323
2.11k
  p_add_proto_data(pinfo->pool, pinfo, proto_wlan, key, data);
22324
2.11k
}
22325
22326
static void
22327
save_proto_data_value(packet_info *pinfo, unsigned value, int key)
22328
384
{
22329
384
  if (!enable_decryption) {
22330
0
    return;
22331
0
  }
22332
384
  p_add_proto_data(pinfo->pool, pinfo, proto_wlan, key, GUINT_TO_POINTER(value));
22333
384
}
22334
22335
static void
22336
save_tag_for_dot11decrypt(tvbuff_t *tvb, packet_info *pinfo, int offset)
22337
67.9k
{
22338
67.9k
  uint8_t tag_no;
22339
67.9k
  uint8_t tag_len;
22340
22341
67.9k
  if (!enable_decryption) {
22342
0
    return;
22343
0
  }
22344
67.9k
  tag_no  = tvb_get_uint8(tvb, offset);
22345
67.9k
  tag_len = tvb_get_uint8(tvb, offset + 1);
22346
22347
67.9k
  switch (tag_no) {
22348
141
    case TAG_MOBILITY_DOMAIN:
22349
141
      save_proto_data(tvb, pinfo, offset, tag_len + 2, MDE_TAG_KEY);
22350
141
      break;
22351
233
    case TAG_FAST_BSS_TRANSITION:
22352
233
      save_proto_data(tvb, pinfo, offset, tag_len + 2, FTE_TAG_KEY);
22353
233
      break;
22354
79
    case TAG_RIC_DATA:
22355
79
      save_proto_data(tvb, pinfo, offset, tag_len + 2, RDE_TAG_KEY);
22356
79
      break;
22357
301
    case TAG_RSN_IE:
22358
301
      save_proto_data(tvb, pinfo, offset, tag_len + 2, RSNE_TAG_KEY);
22359
301
      break;
22360
92
    case TAG_RSNX:
22361
92
      save_proto_data(tvb, pinfo, offset, tag_len + 2, RSNXE_TAG_KEY);
22362
92
      break;
22363
67.1k
    default:
22364
67.1k
      break;
22365
67.9k
  }
22366
67.9k
}
22367
22368
static void
22369
set_packet_data_last_akm_suite(ieee80211_packet_data_t *packet_data,
22370
                               uint32_t last_akm_suite)
22371
0
{
22372
0
  packet_data->last_akm_suite_set = true;
22373
0
  packet_data->last_akm_suite = last_akm_suite;
22374
0
}
22375
22376
static void
22377
set_conversation_last_akm_suite(ieee80211_conversation_data_t *conv,
22378
                                uint32_t last_akm_suite)
22379
734
{
22380
734
  conv->last_akm_suite_set = true;
22381
734
  conv->last_akm_suite = last_akm_suite;
22382
734
}
22383
22384
/*
22385
 * 7.3.2.25 RSNE information element. Common format with OSEN except the
22386
 * version... should refactor
22387
 */
22388
static int
22389
dissect_rsn_ie(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb,
22390
               int offset, uint32_t tag_len, association_sanity_check_t *association_sanity_check)
22391
204
{
22392
204
  proto_item *rsn_gcs_item, *rsn_pcs_item, *rsn_akms_item, *rsn_pmkid_item, *rsn_gmcs_item;
22393
204
  proto_item *rsn_sub_pcs_item, *rsn_sub_akms_item;
22394
204
  proto_item *rsn_pcs_count, *rsn_akms_count, *rsn_pmkid_count;
22395
204
  proto_tree *rsn_gcs_tree, *rsn_pcs_tree, *rsn_akms_tree, *rsn_pmkid_tree, *rsn_gmcs_tree;
22396
204
  proto_tree *rsn_sub_pcs_tree, *rsn_sub_akms_tree;
22397
204
  uint16_t    pcs_count, akms_count, pmkid_count;
22398
204
  unsigned    ii;
22399
204
  int         tag_end = offset + tag_len;
22400
204
  static int * const ieee80211_rsn_cap[] = {
22401
204
    &hf_ieee80211_rsn_cap_preauth,
22402
204
    &hf_ieee80211_rsn_cap_no_pairwise,
22403
204
    &hf_ieee80211_rsn_cap_ptksa_replay_counter,
22404
204
    &hf_ieee80211_rsn_cap_gtksa_replay_counter,
22405
204
    &hf_ieee80211_rsn_cap_mfpr,
22406
204
    &hf_ieee80211_rsn_cap_mfpc,
22407
204
    &hf_ieee80211_rsn_cap_jmr,
22408
204
    &hf_ieee80211_rsn_cap_peerkey,
22409
204
    &hf_ieee80211_rsn_cap_spp_amsdu_cap,
22410
204
    &hf_ieee80211_rsn_cap_spp_amsdu_req,
22411
204
    &hf_ieee80211_rsn_cap_pbac,
22412
204
    &hf_ieee80211_rsn_cap_extended_key_id_iaf,
22413
204
    &hf_ieee80211_rsn_cap_ocvc,
22414
204
    NULL
22415
204
  };
22416
22417
204
  proto_tree_add_item(tree, hf_ieee80211_rsn_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
22418
204
  offset += 2;
22419
22420
204
  if (offset >= tag_end)
22421
9
    return offset;
22422
22423
  /* 7.3.2.25.1 Group Cipher suites */
22424
195
  rsn_gcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gcs, tvb, offset, 4, ENC_BIG_ENDIAN);
22425
195
  rsn_gcs_tree = proto_item_add_subtree(rsn_gcs_item, ett_rsn_gcs_tree);
22426
195
  proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
22427
22428
    /* Check if OUI is 00:0F:AC (ieee80211) */
22429
195
  if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
22430
0
  {
22431
0
    proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_80211_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
22432
0
    save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset + 3), GROUP_CIPHER_KEY);
22433
195
  } else {
22434
195
    proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
22435
195
  }
22436
195
  offset += 4;
22437
22438
195
  if (offset >= tag_end)
22439
6
    return offset;
22440
22441
  /* 7.3.2.25.2 Pairwise Cipher suites */
22442
189
  rsn_pcs_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
22443
189
  pcs_count = tvb_get_letohs(tvb, offset);
22444
189
  offset += 2;
22445
22446
189
  if (offset + (pcs_count * 4) > tag_end)
22447
132
  {
22448
132
    expert_add_info_format(pinfo, rsn_pcs_count, &ei_ieee80211_rsn_pcs_count,
22449
132
        "Pairwise Cipher Suite Count too large, 4*%u > %d", pcs_count, tag_end - offset);
22450
132
    pcs_count = (tag_end - offset) / 4;
22451
132
  }
22452
22453
189
  rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, ENC_NA);
22454
189
  rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree);
22455
1.70k
  for (ii = 0; ii < pcs_count; ii++)
22456
1.51k
  {
22457
1.51k
    rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, ENC_BIG_ENDIAN);
22458
1.51k
    rsn_sub_pcs_tree = proto_item_add_subtree(rsn_sub_pcs_item, ett_rsn_sub_pcs_tree);
22459
1.51k
    proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
22460
22461
    /* Check if OUI is 00:0F:AC (ieee80211) */
22462
1.51k
    if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
22463
0
    {
22464
0
      proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
22465
0
      proto_item_append_text(rsn_pcs_item, " %s", rsn_pcs_return(pinfo->pool, tvb_get_ntohl(tvb, offset)));
22466
0
      save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset + 3), CIPHER_KEY);
22467
1.51k
    } else {
22468
1.51k
      proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
22469
1.51k
    }
22470
1.51k
    offset += 4;
22471
1.51k
  }
22472
22473
189
  if (offset >= tag_end)
22474
118
  {
22475
118
    return offset;
22476
118
  }
22477
22478
  /* 7.3.2.25.2 AKM suites */
22479
71
  rsn_akms_count = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
22480
71
  akms_count = tvb_get_letohs(tvb, offset);
22481
71
  offset += 2;
22482
22483
71
  if (offset + (akms_count * 4) > tag_end)
22484
27
  {
22485
27
    expert_add_info_format(pinfo, rsn_akms_count, &ei_ieee80211_rsn_pmkid_count,
22486
27
        "Auth Key Management (AKM) Suite Count too large, 4*%u > %d", akms_count, tag_end - offset);
22487
27
    akms_count = (tag_end - offset) / 4;
22488
27
  }
22489
22490
71
  rsn_akms_item = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_list, tvb, offset, akms_count * 4, ENC_NA);
22491
71
  rsn_akms_tree = proto_item_add_subtree(rsn_akms_item, ett_rsn_akms_tree);
22492
22493
71
  ieee80211_packet_data_t *packet_data = get_or_create_packet_data(pinfo);
22494
22495
309
  for (ii = 0; ii < akms_count; ii++)
22496
238
  {
22497
238
    rsn_sub_akms_item = proto_tree_add_item(rsn_akms_tree, hf_ieee80211_rsn_akms, tvb, offset, 4, ENC_BIG_ENDIAN);
22498
238
    rsn_sub_akms_tree = proto_item_add_subtree(rsn_sub_akms_item, ett_rsn_sub_akms_tree);
22499
238
    proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
22500
22501
    /* Check if OUI is 00:0F:AC (ieee80211) */
22502
238
    if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
22503
0
    {
22504
0
      proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
22505
0
      proto_item_append_text(rsn_akms_item, " %s", rsn_akms_return(pinfo->pool, tvb_get_ntohl(tvb, offset)));
22506
0
      save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset + 3), AKM_KEY);
22507
22508
0
      set_packet_data_last_akm_suite(packet_data, tvb_get_ntohl(tvb, offset));
22509
0
      if (association_sanity_check) {
22510
0
        uint32_t akm_suite = tvb_get_ntohl(tvb, offset);
22511
0
        association_sanity_check->last_akm_suite = akm_suite;
22512
22513
0
        if (is_ft_akm_suite(akm_suite)) {
22514
          /* This is an FT AKM suite */
22515
0
          association_sanity_check->has_ft_akm_suite = true;
22516
0
          if (association_sanity_check->rsn_first_ft_akm_suite == NULL && rsn_sub_akms_tree != NULL) {
22517
0
            association_sanity_check->rsn_first_ft_akm_suite = rsn_sub_akms_tree->last_child;
22518
0
          }
22519
0
        } else {
22520
          /* This is a non-FT AKM suite */
22521
0
          association_sanity_check->has_non_ft_akm_suite = true;
22522
0
          if (association_sanity_check->rsn_first_non_ft_akm_suite == NULL && rsn_sub_akms_tree != NULL) {
22523
0
            association_sanity_check->rsn_first_non_ft_akm_suite = rsn_sub_akms_tree->last_child;
22524
0
          }
22525
0
        }
22526
0
      }
22527
238
    } else {
22528
238
      proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
22529
238
    }
22530
238
    offset += 4;
22531
238
  }
22532
22533
  /* 7.3.2.25.3 RSN capabilities */
22534
71
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_rsn_cap,
22535
71
                                    ett_rsn_cap_tree, ieee80211_rsn_cap,
22536
71
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22537
71
  offset += 2;
22538
71
  if (offset >= tag_end)
22539
11
  {
22540
11
    return offset;
22541
11
  }
22542
  /* 7.3.2.25.4 PMKID */
22543
60
  rsn_pmkid_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
22544
60
  pmkid_count = tvb_get_letohs(tvb, offset);
22545
60
  offset += 2;
22546
22547
60
  if (offset + (pmkid_count * 16) > tag_end)
22548
20
  {
22549
20
    expert_add_info_format(pinfo, rsn_pmkid_count, &ei_ieee80211_pmkid_count_too_large,
22550
20
        "PMKID Count too large, 16*%u > %d", pmkid_count, tag_end - offset);
22551
20
    pmkid_count = (tag_end - offset) / 16;
22552
20
  }
22553
22554
60
  rsn_pmkid_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_list, tvb, offset, pmkid_count * 16, ENC_NA);
22555
60
  rsn_pmkid_tree = proto_item_add_subtree(rsn_pmkid_item, ett_rsn_pmkid_tree);
22556
152
  for (ii = 0; ii < pmkid_count; ii++)
22557
92
  {
22558
92
    proto_tree_add_item(rsn_pmkid_tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, ENC_NA);
22559
92
    offset += 16;
22560
92
  }
22561
22562
60
  if (offset >= tag_end)
22563
6
  {
22564
6
    return offset;
22565
6
  }
22566
  /* Group Management Cipher Suite (802.11w)*/
22567
54
  rsn_gmcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gmcs, tvb, offset, 4, ENC_BIG_ENDIAN);
22568
54
  rsn_gmcs_tree = proto_item_add_subtree(rsn_gmcs_item, ett_rsn_gmcs_tree);
22569
54
  proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
22570
  /* Check if OUI is 00:0F:AC (ieee80211) */
22571
54
  if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
22572
0
  {
22573
0
    proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_80211_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
22574
54
  } else {
22575
54
    proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
22576
54
  }
22577
54
  offset += 4;
22578
22579
54
  return offset;
22580
60
}
22581
22582
/* 7.3.2.27 Extended Capabilities information element (127) */
22583
static int
22584
dissect_extended_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
22585
108
{
22586
108
  int tag_len = tvb_reported_length(tvb);
22587
108
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
22588
108
  int offset = 0;
22589
108
  proto_item *ti_ex_cap;
22590
108
  static int * const ieee80211_tag_extended_capabilities_byte1[] = {
22591
108
    &hf_ieee80211_tag_extended_capabilities_b0,
22592
108
    &hf_ieee80211_tag_extended_capabilities_b1,
22593
108
    &hf_ieee80211_tag_extended_capabilities_b2,
22594
108
    &hf_ieee80211_tag_extended_capabilities_b3,
22595
108
    &hf_ieee80211_tag_extended_capabilities_b4,
22596
108
    &hf_ieee80211_tag_extended_capabilities_b5,
22597
108
    &hf_ieee80211_tag_extended_capabilities_b6,
22598
108
    &hf_ieee80211_tag_extended_capabilities_b7,
22599
108
    NULL
22600
108
  };
22601
108
  static int * const ieee80211_tag_extended_capabilities_byte2[] = {
22602
108
    &hf_ieee80211_tag_extended_capabilities_b8,
22603
108
    &hf_ieee80211_tag_extended_capabilities_b9,
22604
108
    &hf_ieee80211_tag_extended_capabilities_b10,
22605
108
    &hf_ieee80211_tag_extended_capabilities_b11,
22606
108
    &hf_ieee80211_tag_extended_capabilities_b12,
22607
108
    &hf_ieee80211_tag_extended_capabilities_b13,
22608
108
    &hf_ieee80211_tag_extended_capabilities_b14,
22609
108
    &hf_ieee80211_tag_extended_capabilities_b15,
22610
108
    NULL
22611
108
  };
22612
108
  static int * const ieee80211_tag_extended_capabilities_byte3[] = {
22613
108
    &hf_ieee80211_tag_extended_capabilities_b16,
22614
108
    &hf_ieee80211_tag_extended_capabilities_b17,
22615
108
    &hf_ieee80211_tag_extended_capabilities_b18,
22616
108
    &hf_ieee80211_tag_extended_capabilities_b19,
22617
108
    &hf_ieee80211_tag_extended_capabilities_b20,
22618
108
    &hf_ieee80211_tag_extended_capabilities_b21,
22619
108
    &hf_ieee80211_tag_extended_capabilities_b22,
22620
108
    &hf_ieee80211_tag_extended_capabilities_b23,
22621
108
    NULL
22622
108
  };
22623
108
  static int * const ieee80211_tag_extended_capabilities_byte4[] = {
22624
108
    &hf_ieee80211_tag_extended_capabilities_b24,
22625
108
    &hf_ieee80211_tag_extended_capabilities_b25,
22626
108
    &hf_ieee80211_tag_extended_capabilities_b26,
22627
108
    &hf_ieee80211_tag_extended_capabilities_b27,
22628
108
    &hf_ieee80211_tag_extended_capabilities_b28,
22629
108
    &hf_ieee80211_tag_extended_capabilities_b29,
22630
108
    &hf_ieee80211_tag_extended_capabilities_b30,
22631
108
    &hf_ieee80211_tag_extended_capabilities_b31,
22632
108
    NULL
22633
108
  };
22634
108
  static int * const ieee80211_tag_extended_capabilities_byte5[] = {
22635
108
    &hf_ieee80211_tag_extended_capabilities_b32,
22636
108
    &hf_ieee80211_tag_extended_capabilities_b33,
22637
108
    &hf_ieee80211_tag_extended_capabilities_b34,
22638
108
    &hf_ieee80211_tag_extended_capabilities_b35,
22639
108
    &hf_ieee80211_tag_extended_capabilities_b36,
22640
108
    &hf_ieee80211_tag_extended_capabilities_b37,
22641
108
    &hf_ieee80211_tag_extended_capabilities_b38,
22642
108
    &hf_ieee80211_tag_extended_capabilities_b39,
22643
108
    NULL
22644
108
  };
22645
108
  static int * const ieee80211_tag_extended_capabilities_byte6[] = {
22646
108
    &hf_ieee80211_tag_extended_capabilities_b40,
22647
108
    &hf_ieee80211_tag_extended_capabilities_serv_int_granularity,
22648
108
    &hf_ieee80211_tag_extended_capabilities_b44,
22649
108
    &hf_ieee80211_tag_extended_capabilities_b45,
22650
108
    &hf_ieee80211_tag_extended_capabilities_b46,
22651
108
    &hf_ieee80211_tag_extended_capabilities_b47,
22652
108
    NULL
22653
108
  };
22654
108
  static int * const ieee80211_tag_extended_capabilities_byte7[] = {
22655
108
    &hf_ieee80211_tag_extended_capabilities_b48,
22656
108
    &hf_ieee80211_tag_extended_capabilities_b49,
22657
108
    &hf_ieee80211_tag_extended_capabilities_b50,
22658
108
    &hf_ieee80211_tag_extended_capabilities_b51,
22659
108
    &hf_ieee80211_tag_extended_capabilities_b52,
22660
108
    &hf_ieee80211_tag_extended_capabilities_b53,
22661
108
    &hf_ieee80211_tag_extended_capabilities_b54,
22662
108
    &hf_ieee80211_tag_extended_capabilities_b55,
22663
108
    NULL
22664
108
  };
22665
22666
108
  static int * const ieee80211_tag_extended_capabilities_byte8[] = {
22667
108
    &hf_ieee80211_tag_extended_capabilities_b56,
22668
108
    &hf_ieee80211_tag_extended_capabilities_b57,
22669
108
    &hf_ieee80211_tag_extended_capabilities_b58,
22670
108
    &hf_ieee80211_tag_extended_capabilities_b59,
22671
108
    &hf_ieee80211_tag_extended_capabilities_b60,
22672
108
    &hf_ieee80211_tag_extended_capabilities_b61,
22673
108
    &hf_ieee80211_tag_extended_capabilities_b62,
22674
108
    &hf_ieee80211_tag_extended_capabilities_b63,
22675
108
    NULL
22676
108
  };
22677
22678
108
  static int * const ieee80211_tag_extended_capabilities_bytes89[] = {
22679
108
    &hf_ieee80211_tag_extended_capabilities_b56_2,
22680
108
    &hf_ieee80211_tag_extended_capabilities_b57_2,
22681
108
    &hf_ieee80211_tag_extended_capabilities_b58_2,
22682
108
    &hf_ieee80211_tag_extended_capabilities_b59_2,
22683
108
    &hf_ieee80211_tag_extended_capabilities_b60_2,
22684
108
    &hf_ieee80211_tag_extended_capabilities_b61_2,
22685
108
    &hf_ieee80211_tag_extended_capabilities_b62_2,
22686
108
    &hf_ieee80211_tag_extended_capabilities_max_num_msdus,
22687
108
    &hf_ieee80211_tag_extended_capabilities_b65_2,
22688
108
    &hf_ieee80211_tag_extended_capabilities_b66_2,
22689
108
    &hf_ieee80211_tag_extended_capabilities_b67_2,
22690
108
    &hf_ieee80211_tag_extended_capabilities_b68_2,
22691
108
    &hf_ieee80211_tag_extended_capabilities_b69_2,
22692
108
    &hf_ieee80211_tag_extended_capabilities_b70_2,
22693
108
    &hf_ieee80211_tag_extended_capabilities_b71_2,
22694
108
    NULL
22695
108
  };
22696
22697
108
  static int * const ieee80211_tag_extended_capabilities_byte10[] = {
22698
108
    &hf_ieee80211_tag_extended_capabilities_b72,
22699
108
    &hf_ieee80211_tag_extended_capabilities_b73,
22700
108
    &hf_ieee80211_tag_extended_capabilities_b74,
22701
108
    &hf_ieee80211_tag_extended_capabilities_b75,
22702
108
    &hf_ieee80211_tag_extended_capabilities_b76,
22703
108
    &hf_ieee80211_tag_extended_capabilities_b77,
22704
108
    &hf_ieee80211_tag_extended_capabilities_b78,
22705
108
    &hf_ieee80211_tag_extended_capabilities_b79,
22706
108
    NULL
22707
108
  };
22708
22709
108
  static int * const ieee80211_tag_extended_capabilities_byte11[] = {
22710
108
    &hf_ieee80211_tag_extended_capabilities_b80,
22711
108
    &hf_ieee80211_tag_extended_capabilities_b81,
22712
108
    &hf_ieee80211_tag_extended_capabilities_b82,
22713
108
    &hf_ieee80211_tag_extended_capabilities_b83,
22714
108
    &hf_ieee80211_tag_extended_capabilities_b84,
22715
108
    &hf_ieee80211_tag_extended_capabilities_b85,
22716
108
    &hf_ieee80211_tag_extended_capabilities_b86,
22717
108
    &hf_ieee80211_tag_extended_capabilities_b87,
22718
108
    NULL
22719
108
  };
22720
22721
108
  static int * const ieee80211_tag_extended_capabilities_byte12[] = {
22722
108
    &hf_ieee80211_tag_extended_capabilities_b88,
22723
108
    &hf_ieee80211_tag_extended_capabilities_b89,
22724
108
    &hf_ieee80211_tag_extended_capabilities_b90,
22725
108
    &hf_ieee80211_tag_extended_capabilities_b91,
22726
108
    &hf_ieee80211_tag_extended_capabilities_b92,
22727
108
    &hf_ieee80211_tag_extended_capabilities_b93,
22728
108
    &hf_ieee80211_tag_extended_capabilities_b94,
22729
108
    &hf_ieee80211_tag_extended_capabilities_b95,
22730
108
    NULL
22731
108
  };
22732
22733
108
  static int * const ieee80211_tag_extended_capabilities_byte13[] = {
22734
108
    &hf_ieee80211_tag_extended_capabilities_b96,
22735
108
    &hf_ieee80211_tag_extended_capabilities_b97,
22736
108
    &hf_ieee80211_tag_extended_capabilities_b98,
22737
108
    &hf_ieee80211_tag_extended_capabilities_b99,
22738
108
    &hf_ieee80211_tag_extended_capabilities_b100,
22739
108
    &hf_ieee80211_tag_extended_capabilities_b101,
22740
108
    &hf_ieee80211_tag_extended_capabilities_b102,
22741
108
    &hf_ieee80211_tag_extended_capabilities_b103,
22742
108
    NULL
22743
108
  };
22744
22745
108
  static int * const ieee80211_tag_extended_capabilities_byte14[] = {
22746
108
    &hf_ieee80211_tag_extended_capabilities_b104,
22747
108
    &hf_ieee80211_tag_extended_capabilities_b105,
22748
108
    &hf_ieee80211_tag_extended_capabilities_reserved2,
22749
108
    NULL
22750
108
  };
22751
22752
108
  if (tag_len < 1)
22753
22
  {
22754
22
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be greater than 0", tag_len);
22755
22
    return 1;
22756
22
  }
22757
86
  proto_item_append_text(field_data->item_tag, " (%u octet%s)", tag_len, plurality(tag_len, "", "s"));
22758
22759
  /* Extended Capability octet 1 */
22760
86
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22761
86
                                    ett_tag_ex_cap1, ieee80211_tag_extended_capabilities_byte1,
22762
86
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22763
86
  proto_item_append_text(ti_ex_cap, " (octet 1)");
22764
86
  offset += 1;
22765
22766
  /* Extended Capability octet 2 */
22767
86
  if (offset >= tag_len) {
22768
2
    return offset;
22769
2
  }
22770
84
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22771
84
                                    ett_tag_ex_cap2, ieee80211_tag_extended_capabilities_byte2,
22772
84
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22773
84
  proto_item_append_text(ti_ex_cap, " (octet 2)");
22774
84
  offset += 1;
22775
22776
  /* Extended Capability octet 3 */
22777
84
  if (offset >= tag_len) {
22778
7
    return offset;
22779
7
  }
22780
77
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22781
77
                                    ett_tag_ex_cap3, ieee80211_tag_extended_capabilities_byte3,
22782
77
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22783
77
  proto_item_append_text(ti_ex_cap, " (octet 3)");
22784
77
  offset += 1;
22785
22786
  /* Extended Capability octet 4 */
22787
77
  if (offset >= tag_len) {
22788
2
    return offset;
22789
2
  }
22790
75
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22791
75
                                    ett_tag_ex_cap4, ieee80211_tag_extended_capabilities_byte4,
22792
75
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22793
75
  proto_item_append_text(ti_ex_cap, " (octet 4)");
22794
75
  offset += 1;
22795
22796
  /* Extended Capability octet 5 */
22797
75
  if (offset >= tag_len) {
22798
9
    return offset;
22799
9
  }
22800
66
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22801
66
                                    ett_tag_ex_cap5, ieee80211_tag_extended_capabilities_byte5,
22802
66
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22803
66
  proto_item_append_text(ti_ex_cap, " (octet 5)");
22804
66
  offset += 1;
22805
22806
  /* Extended Capability octet 6 */
22807
66
  if (offset >= tag_len) {
22808
4
    return offset;
22809
4
  }
22810
22811
62
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22812
62
                                    ett_tag_ex_cap6, ieee80211_tag_extended_capabilities_byte6,
22813
62
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22814
62
  proto_item_append_text(ti_ex_cap, " (octet 6)");
22815
62
  offset += 1;
22816
22817
22818
  /* Extended Capability octet 7 */
22819
62
  if (offset >= tag_len) {
22820
5
    return offset;
22821
5
  }
22822
57
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22823
57
                                    ett_tag_ex_cap7, ieee80211_tag_extended_capabilities_byte7,
22824
57
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22825
57
  proto_item_append_text(ti_ex_cap, " (octet 7)");
22826
57
  offset += 1;
22827
22828
  /* Extended Capability octet 8 & 9 since two bits cross the boundary */
22829
57
  if (offset >= tag_len) {
22830
1
    return offset;
22831
1
  }
22832
22833
  /* If only the first of the two bytes is present, do the best we can */
22834
56
  if (offset == tag_len - 1) {
22835
2
    ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22836
2
                                    ett_tag_ex_cap8, ieee80211_tag_extended_capabilities_byte8,
22837
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22838
2
    proto_item_append_text(ti_ex_cap, " (octet 8)");
22839
2
    offset += 1;
22840
54
  } else { /* Both bytes are there */
22841
54
    ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities_2,
22842
54
                                    ett_tag_ex_cap89, ieee80211_tag_extended_capabilities_bytes89,
22843
54
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22844
54
    proto_item_append_text(ti_ex_cap, " (octets 8 & 9)");
22845
54
    offset += 2;
22846
54
  }
22847
22848
56
  if (offset >= tag_len) {
22849
3
    return offset;
22850
3
  }
22851
22852
  /* Extended Capability octet 10 */
22853
53
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22854
53
                                    ett_tag_ex_cap10, ieee80211_tag_extended_capabilities_byte10,
22855
53
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22856
53
  proto_item_append_text(ti_ex_cap, " (octet 10)");
22857
53
  offset += 1;
22858
22859
53
  if (offset >= tag_len) {
22860
7
    return offset;
22861
7
  }
22862
22863
  /* Extended Capability octet 11 */
22864
#if 0
22865
  /* Added for SAE support */
22866
  sae_byte = tvb_get_uint8(tvb, offset);
22867
  /*
22868
   * If one of the SAE bits is set, assume we will see Password identifiers
22869
   */
22870
  if (sae_byte & 0x6) {
22871
    bool sae_val = true;
22872
    uint64_t *key = NULL;
22873
22874
    /* Must be for the source of the request */
22875
    key = (uint64_t *)wmem_new(wmem_file_scope(), uint64_t);
22876
    *key = *(uint64_t *)pinfo->src.data;
22877
    wmem_map_insert(sae_prop_hash, key, GINT_TO_POINTER(sae_val));
22878
  }
22879
#endif
22880
46
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
22881
46
                                    ett_tag_ex_cap11, ieee80211_tag_extended_capabilities_byte11,
22882
46
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22883
46
  proto_item_append_text(ti_ex_cap, " (octet 11)");
22884
46
  offset += 1;
22885
22886
46
  if (offset >= tag_len) {
22887
1
    return offset;
22888
1
  }
22889
22890
45
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
22891
45
                                    hf_ieee80211_tag_extended_capabilities,
22892
45
                                    ett_tag_ex_cap12,
22893
45
                                    ieee80211_tag_extended_capabilities_byte12,
22894
45
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22895
45
  proto_item_append_text(ti_ex_cap, " (octet 12)");
22896
45
  offset += 1;
22897
22898
45
  if (offset >= tag_len) {
22899
2
    return offset;
22900
2
  }
22901
22902
43
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
22903
43
                                    hf_ieee80211_tag_extended_capabilities,
22904
43
                                    ett_tag_ex_cap13,
22905
43
                                    ieee80211_tag_extended_capabilities_byte13,
22906
43
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22907
43
  proto_item_append_text(ti_ex_cap, " (octet 13)");
22908
43
  offset += 1;
22909
22910
43
  if (offset >= tag_len) {
22911
3
    return offset;
22912
3
  }
22913
22914
40
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
22915
40
                                    hf_ieee80211_tag_extended_capabilities,
22916
40
                                    ett_tag_ex_cap14,
22917
40
                                    ieee80211_tag_extended_capabilities_byte14,
22918
40
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22919
40
  proto_item_append_text(ti_ex_cap, " (octet 14)");
22920
40
  offset += 1;
22921
22922
40
  return offset;
22923
43
}
22924
22925
static int
22926
dissect_vht_mcs_set(proto_tree *tree, tvbuff_t *tvb, int offset)
22927
1
{
22928
1
  proto_item *ti;
22929
1
  proto_tree *mcs_tree;
22930
1
  static int * const ieee80211_vht_mcsset_rx_max_mcs[] = {
22931
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss,
22932
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss,
22933
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss,
22934
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss,
22935
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss,
22936
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss,
22937
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss,
22938
1
    &hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss,
22939
1
    NULL
22940
1
  };
22941
1
  static int * const ieee80211_vht_mcsset_tx_max_mcs[] = {
22942
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss,
22943
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss,
22944
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss,
22945
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss,
22946
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss,
22947
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss,
22948
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss,
22949
1
    &hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss,
22950
1
    NULL
22951
1
  };
22952
22953
  /* 8 byte Supported MCS set */
22954
1
  ti = proto_tree_add_item(tree, hf_ieee80211_vht_mcsset, tvb, offset, 8, ENC_NA);
22955
22956
1
  mcs_tree = proto_item_add_subtree(ti, ett_vht_mcsset_tree);
22957
22958
  /* B0 - B15 */
22959
1
  proto_tree_add_bitmask_with_flags(mcs_tree, tvb, offset, hf_ieee80211_vht_mcsset_rx_mcs_map,
22960
1
                                    ett_vht_rx_mcsbit_tree, ieee80211_vht_mcsset_rx_max_mcs,
22961
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22962
1
  offset += 2;
22963
22964
  /* B16 - B28 13 bits*/
22965
1
  proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_rx_highest_long_gi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
22966
22967
  /* B29 - B31 2 Max NSTS, total*/
22968
22969
1
  proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_max_nsts_total, tvb, offset,
22970
1
                                2, ENC_LITTLE_ENDIAN);
22971
1
  offset += 2;
22972
22973
  /* B32 - B47 */
22974
1
  proto_tree_add_bitmask_with_flags(mcs_tree, tvb, offset, hf_ieee80211_vht_mcsset_tx_mcs_map,
22975
1
                                    ett_vht_tx_mcsbit_tree, ieee80211_vht_mcsset_tx_max_mcs,
22976
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
22977
1
  offset += 2;
22978
  /* B48 - B60 13 bits */
22979
1
  proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_tx_highest_long_gi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
22980
  /* B61 */
22981
1
  proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_extended_nss_bw_capable,
22982
1
                                tvb, offset, 2, ENC_LITTLE_ENDIAN);
22983
22984
  /* B62 - B63 2 reserved bits*/
22985
1
  proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_reserved, tvb, offset, 2,
22986
1
                                ENC_LITTLE_ENDIAN);offset += 2;
22987
22988
1
  return offset;
22989
1
}
22990
22991
static int
22992
dissect_vht_capability_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
22993
38
{
22994
38
  int tag_len = tvb_reported_length(tvb);
22995
38
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
22996
38
  int offset = 0;
22997
38
  static int * const ieee80211_vht_caps[] = {
22998
38
    &hf_ieee80211_vht_max_mpdu_length,
22999
38
    &hf_ieee80211_vht_supported_chan_width_set,
23000
38
    &hf_ieee80211_vht_rx_ldpc,
23001
38
    &hf_ieee80211_vht_short_gi_for_80,
23002
38
    &hf_ieee80211_vht_short_gi_for_160,
23003
38
    &hf_ieee80211_vht_tx_stbc,
23004
    /* End of first byte */
23005
38
    &hf_ieee80211_vht_rx_stbc,
23006
38
    &hf_ieee80211_vht_su_beamformer_cap,
23007
38
    &hf_ieee80211_vht_su_beamformee_cap,
23008
38
    &hf_ieee80211_vht_beamformer_antennas,
23009
    /* End of second byte */
23010
38
    &hf_ieee80211_vht_sounding_dimensions,
23011
38
    &hf_ieee80211_vht_mu_beamformer_cap,
23012
38
    &hf_ieee80211_vht_mu_beamformee_cap,
23013
38
    &hf_ieee80211_vht_txop_ps,
23014
38
    &hf_ieee80211_vht_var_htc_field,
23015
38
    &hf_ieee80211_vht_max_ampdu,
23016
38
    &hf_ieee80211_vht_link_adaptation_cap,
23017
38
    &hf_ieee80211_vht_rx_pattern,
23018
38
    &hf_ieee80211_vht_tx_pattern,
23019
38
    &hf_ieee80211_vht_ext_nss_bw_support,
23020
38
    NULL
23021
38
  };
23022
23023
38
  if (tag_len != 12) {
23024
37
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23025
37
                           "VHT Capabilities IE length %u wrong, must be = 12", tag_len);
23026
37
    return 1;
23027
37
  }
23028
23029
  /* 4 byte VHT Capabilities  Info*/
23030
1
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_cap,
23031
1
                                    ett_vht_cap_tree, ieee80211_vht_caps,
23032
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
23033
1
  offset += 4;
23034
23035
  /* 8 byte MCS set */
23036
1
  offset = dissect_vht_mcs_set(tree, tvb, offset);
23037
23038
1
  return offset;
23039
38
}
23040
23041
static int
23042
dissect_vht_operation_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23043
85
{
23044
85
  int tag_len = tvb_reported_length(tvb);
23045
85
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23046
85
  int offset = 0;
23047
85
  proto_item *op_item;
23048
85
  proto_tree *op_tree;
23049
85
  static int * const ieee80211_vht_op_max_basic_mcs[] = {
23050
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_1_ss,
23051
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_2_ss,
23052
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_3_ss,
23053
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_4_ss,
23054
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_5_ss,
23055
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_6_ss,
23056
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_7_ss,
23057
85
    &hf_ieee80211_vht_op_max_basic_mcs_for_8_ss,
23058
85
    NULL
23059
85
  };
23060
23061
85
  if (tag_len != 5) {
23062
80
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23063
80
                           "VHT Operation IE length %u wrong, must be = 5", tag_len);
23064
80
    return 1;
23065
80
  }
23066
23067
  /* 3 byte VHT Operation Info*/
23068
5
  op_item = proto_tree_add_item(tree, hf_ieee80211_vht_op, tvb, offset, 3, ENC_NA);
23069
5
  op_tree = proto_item_add_subtree(op_item, ett_vht_op_tree);
23070
5
  proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_width, tvb, offset, 1, ENC_LITTLE_ENDIAN);
23071
5
  proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_center0, tvb, offset+1, 1, ENC_LITTLE_ENDIAN);
23072
5
  proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_center1, tvb, offset+2, 1, ENC_LITTLE_ENDIAN);
23073
23074
5
  offset += 3;
23075
  /* VHT Basic MCS Set */
23076
5
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_op_basic_mcs_map,
23077
5
                                    ett_vht_basic_mcsbit_tree, ieee80211_vht_op_max_basic_mcs,
23078
5
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
23079
5
  offset += 2;
23080
23081
5
  return offset;
23082
85
}
23083
23084
static int
23085
dissect_vht_tx_pwr_envelope(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23086
74
{
23087
74
  int tag_len = tvb_reported_length(tvb);
23088
74
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23089
74
  int offset = 0;
23090
74
  proto_item *tx_pwr_item, *ti, *unit_ti;
23091
74
  proto_tree *tx_pwr_info_tree;
23092
74
  uint8_t opt_ie_cnt=0;
23093
74
  uint8_t i;
23094
74
  unsigned mtpi;
23095
23096
74
  if (tag_len < 2 || tag_len > 18) {
23097
39
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23098
39
                           "VHT TX PWR Envelope IE length %u wrong, must be >= 2 and <= 18", tag_len);
23099
39
    return 1;
23100
39
  }
23101
23102
35
  mtpi = (tvb_get_uint8(tvb, offset) >> 3) & 0x7;
23103
35
  tx_pwr_item = proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_info, tvb, offset, 1, ENC_NA);
23104
35
  tx_pwr_info_tree =  proto_item_add_subtree(tx_pwr_item, ett_vht_tpe_info_tree);
23105
23106
35
  ti = proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
23107
35
  unit_ti = proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_unit, tvb, offset, 1, ENC_LITTLE_ENDIAN);
23108
35
  proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_category, tvb, offset, 1, ENC_LITTLE_ENDIAN);
23109
23110
35
  opt_ie_cnt = tvb_get_uint8(tvb, offset) & 0x07;
23111
23112
35
  offset += 1;
23113
23114
35
  switch (mtpi) {
23115
23116
14
  case 1:
23117
19
  case 3:
23118
22
  case 5:
23119
    /* Is it a power spectral density? */
23120
    /* Handle the zero case */
23121
22
    if (opt_ie_cnt == 0) {
23122
7
      proto_tree_add_item(tree, hf_ieee80211_vht_tpe_any_bw_psd, tvb, offset,
23123
7
                          1, ENC_NA);
23124
7
      offset += 1;
23125
7
      return offset;
23126
7
    }
23127
15
    switch (opt_ie_cnt) {
23128
0
    case 0:
23129
0
      opt_ie_cnt = 0;
23130
0
      break;
23131
2
    case 1:
23132
2
      opt_ie_cnt = 1;
23133
2
      break;
23134
1
    case 2:
23135
1
      opt_ie_cnt = 2;
23136
1
      break;
23137
2
    case 3:
23138
2
      opt_ie_cnt = 4;
23139
2
      break;
23140
7
    case 4:
23141
7
      opt_ie_cnt = 8;
23142
7
      break;
23143
3
    default:
23144
3
      opt_ie_cnt = 1; /* Add an expert info here ... */
23145
3
      break;
23146
15
    }
23147
86
    for (i = 0; i < opt_ie_cnt; i++) {
23148
71
      proto_tree *psd_tree;
23149
71
      psd_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1,
23150
71
                                               ett_tpe_psd, NULL,
23151
71
                                               "20 MHz Channel #%u", i);
23152
71
      proto_tree_add_item(psd_tree, hf_ieee80211_vht_tpe_psd,
23153
71
                          tvb, offset, 1, ENC_NA);
23154
71
      offset += 1;
23155
71
    }
23156
    /* Extension Max Tx Power */
23157
15
    if (offset < tag_len) {
23158
14
        proto_tree *psd_tree;
23159
14
        uint8_t j;
23160
14
        uint8_t ext_cnt = tvb_get_uint8(tvb, offset) & 0x0f;
23161
23162
14
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_ext_count, tvb, offset, 1, ENC_NA);
23163
14
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_ext_reserved, tvb, offset, 1, ENC_NA);
23164
14
        offset += 1;
23165
44
        for (j = 0; j < ext_cnt; j++) {
23166
30
          psd_tree = proto_tree_add_subtree_format(tree, tvb, offset, 1,
23167
30
                                                   ett_tpe_psd, NULL,
23168
30
                                                   "20 MHz Channel #%u", i+j);
23169
30
          proto_tree_add_item(psd_tree, hf_ieee80211_vht_tpe_psd,
23170
30
                              tvb, offset, 1, ENC_NA);
23171
30
          offset += 1;
23172
30
        }
23173
14
    }
23174
15
    break;
23175
23176
7
  case 0:
23177
9
  case 2:
23178
12
  case 4:
23179
    /* Power Constraint info is mandatory only for 20MHz, others are optional*/
23180
    /* Power is expressed in terms of 0.5dBm from -64 to 63 and is encoded
23181
     * as 8-bit 2's compliment */
23182
60
    for (i = 0; i <= opt_ie_cnt; i++) {
23183
52
      switch(i) {
23184
12
      case 0:
23185
12
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_20, tvb, offset, 1, ENC_NA);
23186
12
        offset += 1;
23187
12
        break;
23188
11
      case 1:
23189
11
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_40, tvb, offset, 1, ENC_NA);
23190
11
        offset += 1;
23191
11
        break;
23192
9
      case 2:
23193
9
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_80, tvb, offset, 1, ENC_NA);
23194
9
        offset += 1;
23195
9
        break;
23196
7
      case 3:
23197
7
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_160, tvb, offset, 1, ENC_NA);
23198
7
        offset += 1;
23199
7
        break;
23200
13
      default:
23201
13
        expert_add_info(pinfo, ti, &ei_ieee80211_vht_tpe_pwr_info_count);
23202
13
        offset += 1;
23203
13
        break;
23204
52
      }
23205
52
    }
23206
    /* Extension Max Tx Power */
23207
8
    if (offset < tag_len) {
23208
6
        proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_320, tvb, offset, 1, ENC_NA);
23209
6
        offset += 1;
23210
6
    }
23211
8
    break;
23212
1
  default:
23213
    /* Reserved in 802.11ax-2021. 802.11be? */
23214
1
    expert_add_info(pinfo, unit_ti, &ei_ieee80211_vht_tpe_pwr_info_unit);
23215
35
  }
23216
23217
21
  return offset;
23218
35
}
23219
23220
static int
23221
dissect_mobility_domain(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23222
131
{
23223
131
  int tag_len = tvb_reported_length(tvb);
23224
131
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23225
131
  int offset = 0;
23226
23227
131
  if (field_data->sanity_check != NULL) {
23228
87
    field_data->sanity_check->association_has_mobility_domain_element = true;
23229
87
  }
23230
23231
131
  if (tag_len < 3) {
23232
37
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23233
37
                          "MDIE content length must be at least 3 bytes");
23234
37
    return 1;
23235
37
  }
23236
23237
94
  save_proto_data(tvb, pinfo, offset, 2, MDID_KEY);
23238
94
  proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_mdid,
23239
94
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
23240
94
  proto_tree_add_bitmask_with_flags(tree, tvb, offset + 2,
23241
94
                                    hf_ieee80211_tag_mobility_domain_ft_capab,
23242
94
                                    ett_tag_mobility_domain_ft_capab_tree,
23243
94
                                    ieee80211_tag_mobility_domain_ft_capab_fields,
23244
94
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
23245
94
  return tvb_captured_length(tvb);
23246
131
}
23247
23248
0
static uint16_t get_mic_len_owe(uint16_t group) {
23249
0
  switch(group) {
23250
    // FFC, len(p) <= 2048
23251
0
    case 1:
23252
0
    case 2:
23253
0
    case 5:
23254
0
    case 14:
23255
0
    case 22:
23256
0
    case 23:
23257
0
    case 24:
23258
    // ECC, len(p) <= 256
23259
0
    case 19:
23260
0
    case 25:
23261
0
    case 26:
23262
0
    case 27:
23263
0
    case 28:
23264
0
    case 31:
23265
      // HMAC-SHA-256
23266
0
      return 16;
23267
23268
    // FFC, 2048 < len(p) <= 3072
23269
0
    case 15:
23270
    // ECC, 256 < len(p) <= 384
23271
0
    case 20:
23272
0
    case 29:
23273
      // HMAC-SHA-384
23274
0
      return 24;
23275
23276
    // FCC, 3072 < len(p)
23277
0
    case 16:
23278
0
    case 17:
23279
0
    case 18:
23280
    // ECC, 384 < len(p)
23281
0
    case 21:
23282
0
    case 30:
23283
0
    case 32:
23284
      // HMAC-SHA-512
23285
0
      return 32;
23286
23287
0
    default:
23288
0
      return 16;
23289
0
  }
23290
0
}
23291
23292
0
static uint16_t get_mic_len(uint32_t akm_suite) {
23293
0
  switch(akm_suite) {
23294
0
    case AKMS_WPA_SHA384_SUITEB:
23295
0
    case AKMS_FT_IEEE802_1X_SHA384:
23296
0
    case AKMS_FT_FILS_SHA384:
23297
      // HMAC-SHA-384
23298
0
      return 24;
23299
23300
0
    case AKMS_FILS_SHA256:
23301
0
    case AKMS_FILS_SHA384:
23302
      // AES-SIV-256 and AES-SIV-512
23303
0
      return 0;
23304
23305
0
    default:
23306
      // HMAC-SHA-1-128, AES-128-CMAC, HMAC-SHA-256, AKMS_FT_FILS_SHA256
23307
0
      return 16;
23308
0
  }
23309
0
}
23310
23311
static conversation_t *find_wlan_conversation_pinfo(packet_info *pinfo)
23312
218
{
23313
  /* HACK to avoid collision with conversation in EAP dissector */
23314
218
  pinfo->srcport = GPOINTER_TO_UINT(
23315
218
    p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, ASSOC_COUNTER_KEY));
23316
218
  pinfo->destport = pinfo->srcport;
23317
218
  return find_conversation_pinfo(pinfo, 0);
23318
218
}
23319
23320
0
static bool determine_nonce_is_set(tvbuff_t *tvb) {
23321
0
  int offset;
23322
23323
0
  for (offset = 12; offset < 12 + 32; offset++)
23324
0
    if (tvb_get_uint8(tvb, offset))
23325
0
      return true;
23326
0
  return false;
23327
0
}
23328
23329
static uint16_t determine_mic_len(packet_info *pinfo, bool assoc_frame,
23330
168
                                 bool *defaulted) {
23331
168
  uint16_t eapol_key_mic_len = 16; /* Default MIC length */
23332
168
  conversation_t *conversation = find_wlan_conversation_pinfo(pinfo);
23333
168
  ieee80211_conversation_data_t *conversation_data = NULL;
23334
168
  ieee80211_packet_data_t *packet_data =
23335
168
    (ieee80211_packet_data_t*)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, PACKET_DATA_KEY);
23336
168
  if (conversation) {
23337
4
      conversation_data = (ieee80211_conversation_data_t*)conversation_get_proto_data(conversation, proto_wlan);
23338
4
  }
23339
23340
168
  if (wlan_key_mic_len_enable) {
23341
    /* 1st - Use user overridden MIC length setting */
23342
0
    eapol_key_mic_len = wlan_key_mic_len;
23343
0
  }
23344
168
  else if (!assoc_frame && conversation_data &&
23345
168
           conversation_data->discovered_key_mic_len) {
23346
    /*
23347
     * 2nd - Use the discovered key mic len.
23348
     * We will only set the discovered key mic len if it was defaulted
23349
     * in an earlier call to determine_mic_len, so it should be tested second.
23350
     */
23351
0
      eapol_key_mic_len = conversation_data->discovered_key_mic_len;
23352
0
  }
23353
168
  else if (!assoc_frame && conversation_data &&
23354
168
           conversation_data->last_akm_suite_set) {
23355
    /* 3rd - Use AKMS negotiated during association to determine MIC length */
23356
0
    if (conversation_data->last_akm_suite == AKMS_OWE) {
23357
      /* For OWE the length of MIC depends on the selected group */
23358
0
      eapol_key_mic_len = get_mic_len_owe(conversation_data->owe_group);
23359
0
    } else if (conversation_data->last_akm_suite == AKMS_SAE_GROUP_DEPEND ||
23360
0
               conversation_data->last_akm_suite == AKMS_FT_SAE_GROUP_DEPEND) {
23361
0
      *defaulted = true;
23362
0
    }
23363
0
    else {
23364
0
      eapol_key_mic_len = get_mic_len(conversation_data->last_akm_suite);
23365
0
    }
23366
0
  }
23367
168
  else if (packet_data && packet_data->last_akm_suite_set) {
23368
    /* 3rd - Use AKMS from current packet to determine MIC length */
23369
0
    if (packet_data->last_akm_suite == AKMS_OWE) {
23370
      /* For OWE the length of MIC depends on the selected group */
23371
0
      eapol_key_mic_len = get_mic_len_owe(packet_data->owe_group);
23372
0
    } else if (packet_data->last_akm_suite == AKMS_SAE_GROUP_DEPEND ||
23373
0
               packet_data->last_akm_suite == AKMS_FT_SAE_GROUP_DEPEND) {
23374
0
      *defaulted = true;
23375
0
    }
23376
0
    else {
23377
0
      eapol_key_mic_len = get_mic_len(packet_data->last_akm_suite);
23378
0
    }
23379
168
  } else {
23380
    /*
23381
     * We used the default so say so.
23382
     */
23383
168
    *defaulted = true;
23384
168
  }
23385
168
  return eapol_key_mic_len;
23386
168
}
23387
23388
static int
23389
dissect_fast_bss_transition(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23390
225
{
23391
225
  int tag_len = tvb_reported_length(tvb);
23392
225
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23393
225
  bool assoc_frame = field_data->sanity_check != NULL;
23394
225
  int offset = 0;
23395
225
  if (tag_len < 82) {
23396
57
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23397
57
                          "FTIE content length must be at least 82 bytes");
23398
57
    return 1;
23399
57
  }
23400
23401
168
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_ft_mic_control,
23402
168
                                    ett_tag_ft_mic_control_tree,
23403
168
                                    ieee80211_tag_ft_mic_control_fields,
23404
168
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
23405
168
  offset += 2;
23406
23407
168
  bool defaulted_mic_len = false;
23408
168
  int mic_len = determine_mic_len(pinfo, assoc_frame, &defaulted_mic_len);
23409
168
  save_proto_data(tvb, pinfo, offset, mic_len, FTE_MIC_KEY);
23410
168
  save_proto_data_value(pinfo, mic_len, FTE_MIC_LEN_KEY);
23411
168
  proto_tree_add_item(tree, hf_ieee80211_tag_ft_mic,
23412
168
                      tvb, offset, mic_len, ENC_NA);
23413
168
  offset += mic_len;
23414
23415
168
  save_proto_data(tvb, pinfo, offset, 32, FTE_ANONCE_KEY);
23416
168
  proto_tree_add_item(tree, hf_ieee80211_tag_ft_anonce,
23417
168
                      tvb, offset, 32, ENC_NA);
23418
168
  offset += 32;
23419
23420
168
  save_proto_data(tvb, pinfo, offset, 32, FTE_SNONCE_KEY);
23421
168
  proto_tree_add_item(tree, hf_ieee80211_tag_ft_snonce,
23422
168
                      tvb, offset, 32, ENC_NA);
23423
168
  offset += 32;
23424
23425
1.60k
  while (offset + 2 <= tag_len) {
23426
1.57k
    uint8_t id, len;
23427
1.57k
    int s_end;
23428
1.57k
    proto_item *ti;
23429
1.57k
    proto_tree *subtree;
23430
1.57k
    const char *subtree_name;
23431
1.57k
    proto_keydata_t *proto;
23432
23433
1.57k
    id = tvb_get_uint8(tvb, offset);
23434
1.57k
    len = tvb_get_uint8(tvb, offset + 1);
23435
1.57k
    subtree_name = val_to_str_const(id, ft_subelem_id_vals, "Unknown");
23436
1.57k
    subtree = proto_tree_add_subtree_format(tree, tvb, offset, len + 2,
23437
1.57k
                                            ett_tag_ft_subelem_tree, NULL,
23438
1.57k
                                            "Subelement: %s", subtree_name);
23439
23440
1.57k
    proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_id,
23441
1.57k
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
23442
1.57k
    offset += 1;
23443
23444
1.57k
    ti = proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_len,
23445
1.57k
                             tvb, offset, 1, ENC_LITTLE_ENDIAN);
23446
1.57k
    offset += 1;
23447
23448
1.57k
    if (offset + len > tag_len) {
23449
136
      expert_add_info_format(pinfo, ti, &ei_ieee80211_tag_length,
23450
136
                            "FTIE subelement length is too large for the FTIE content length");
23451
136
      return offset;
23452
136
    }
23453
23454
1.43k
    s_end = offset + len;
23455
1.43k
    switch (id) {
23456
54
    case 1:
23457
54
      save_proto_data(tvb, pinfo, offset, len, FTE_R1KH_ID_KEY);
23458
54
      save_proto_data_value(pinfo, len, FTE_R1KH_ID_LEN_KEY);
23459
54
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_r1kh_id,
23460
54
                          tvb, offset, len, ENC_NA);
23461
54
      break;
23462
151
    case 2:
23463
151
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_gtk_key_info,
23464
151
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23465
151
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_gtk_key_id,
23466
151
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23467
151
      offset += 2;
23468
151
      if (offset > s_end)
23469
17
        break;
23470
134
      save_proto_data_value(pinfo, tvb_get_uint8(tvb, offset), GTK_SUBELEM_KEY_LEN_KEY);
23471
134
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_gtk_key_length,
23472
134
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23473
134
      offset += 1;
23474
134
      if (offset > s_end)
23475
125
        break;
23476
9
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_gtk_rsc,
23477
9
                          tvb, offset, 8, ENC_NA);
23478
9
      offset += 8;
23479
9
      if (offset > s_end)
23480
5
        break;
23481
4
      save_proto_data_value(pinfo, s_end - offset, GTK_LEN_KEY);
23482
4
      save_proto_data(tvb, pinfo, offset, s_end - offset, GTK_KEY);
23483
23484
4
      proto = (proto_keydata_t *)
23485
4
        p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, DECRYPTED_GTK_KEY);
23486
4
      if (proto) {
23487
0
        unsigned keydata_len = proto->keydata_len;
23488
0
        tvbuff_t *next_tvb = tvb_new_child_real_data(tvb, proto->keydata,
23489
0
                                                    keydata_len, keydata_len);
23490
0
        add_new_data_source(pinfo, next_tvb, "Decrypted GTK");
23491
0
        proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_gtk_key,
23492
0
                            next_tvb, 0, keydata_len, ENC_NA);
23493
0
        add_ptk_analysis(tvb, subtree, &proto->used_key);
23494
4
      } else {
23495
4
        proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_gtk_key_encrypted,
23496
4
                            tvb, offset, s_end - offset, ENC_NA);
23497
4
      }
23498
4
      break;
23499
24
    case 3:
23500
24
      save_proto_data(tvb, pinfo, offset, len, FTE_R0KH_ID_KEY);
23501
24
      save_proto_data_value(pinfo, len, FTE_R0KH_ID_LEN_KEY);
23502
24
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_r0kh_id,
23503
24
                          tvb, offset, len, ENC_NA);
23504
24
      break;
23505
107
    case 4:
23506
107
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_igtk_key_id,
23507
107
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23508
107
      offset += 2;
23509
107
      if (offset > s_end)
23510
7
        break;
23511
100
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_igtk_ipn,
23512
100
                          tvb, offset, 6, ENC_NA);
23513
100
      offset += 6;
23514
100
      if (offset > s_end)
23515
93
        break;
23516
7
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_igtk_key_length,
23517
7
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23518
7
      offset += 1;
23519
7
      if (offset > s_end)
23520
2
        break;
23521
5
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_igtk_key,
23522
5
                          tvb, offset, 24, ENC_NA);
23523
5
      break;
23524
61
    case 5:
23525
61
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_oci_op_class,
23526
61
                          tvb, offset, 1, ENC_NA);
23527
61
      offset += 1;
23528
61
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_oci_prim_chan_num,
23529
61
                          tvb, offset, 1, ENC_NA);
23530
61
      offset += 1;
23531
61
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_oci_freq_seg_1,
23532
61
                          tvb, offset, 1, ENC_NA);
23533
61
      offset += 1;
23534
61
      if (offset >= s_end)
23535
9
        break;
23536
52
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_oci_oct_op_class,
23537
52
                          tvb, offset, 1, ENC_NA);
23538
52
      offset += 1;
23539
52
      if (offset >= s_end)
23540
1
        break;
23541
51
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_oci_oct_prim_chan_num,
23542
51
                          tvb, offset, 1, ENC_NA);
23543
51
      offset += 1;
23544
51
      if (offset >= s_end)
23545
49
        break;
23546
2
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_oci_oct_freq_seg_1,
23547
2
                          tvb, offset, 1, ENC_NA);
23548
2
      break;
23549
22
    case 6:
23550
22
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_bigtk_key_id,
23551
22
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23552
22
      offset += 2;
23553
22
      if (offset > s_end)
23554
5
        break;
23555
17
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_bigtk_bipn,
23556
17
                          tvb, offset, 6, ENC_NA);
23557
17
      offset += 6;
23558
17
      if (offset > s_end)
23559
14
        break;
23560
3
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_bigtk_key_length,
23561
3
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23562
3
      offset += 1;
23563
3
      if (offset > s_end)
23564
0
        break;
23565
3
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_bigtk_key,
23566
3
                          tvb, offset, s_end - offset, ENC_NA);
23567
3
      break;
23568
34
    case 8: /* MLO GTK */
23569
34
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_key_info,
23570
34
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23571
34
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_key_id,
23572
34
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23573
34
      offset += 2;
23574
34
      if (offset > s_end)
23575
5
        break;
23576
29
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_link_id_info,
23577
29
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23578
29
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_link_id,
23579
29
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23580
29
      offset += 1;
23581
29
      if (offset > s_end)
23582
1
        break;
23583
28
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_key_length,
23584
28
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23585
28
      offset += 1;
23586
28
      if (offset > s_end)
23587
1
        break;
23588
27
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_rsc,
23589
27
                          tvb, offset, 8, ENC_NA);
23590
27
      offset += 8;
23591
27
      if (offset > s_end)
23592
23
        break;
23593
4
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_gtk_key,
23594
4
                          tvb, offset, s_end - offset, ENC_NA);
23595
4
      break;
23596
30
    case 9: /* MLO IGTK */
23597
30
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_igtk_key_id,
23598
30
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23599
30
      offset += 2;
23600
30
      if (offset > s_end)
23601
3
        break;
23602
27
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_igtk_ipn,
23603
27
                          tvb, offset, 6, ENC_NA);
23604
27
      offset += 6;
23605
27
      if (offset > s_end)
23606
3
        break;
23607
24
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_igtk_link_id_info,
23608
24
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23609
24
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_igtk_link_id,
23610
24
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23611
24
      offset += 1;
23612
24
      if (offset > s_end)
23613
1
        break;
23614
23
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_igtk_key_length,
23615
23
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23616
23
      offset += 1;
23617
23
      if (offset > s_end)
23618
18
        break;
23619
5
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_igtk_key,
23620
5
                          tvb, offset, s_end - offset, ENC_NA);
23621
5
      break;
23622
53
    case 10: /* MLO BIGTK */
23623
53
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_bigtk_key_id,
23624
53
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
23625
53
      offset += 2;
23626
53
      if (offset > s_end)
23627
1
        break;
23628
52
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_bigtk_bipn,
23629
52
                          tvb, offset, 6, ENC_NA);
23630
52
      offset += 6;
23631
52
      if (offset > s_end)
23632
1
        break;
23633
51
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_bigtk_link_id_info,
23634
51
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23635
51
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_bigtk_link_id,
23636
51
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23637
51
      offset += 1;
23638
51
      if (offset > s_end)
23639
2
        break;
23640
49
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_bigtk_key_length,
23641
49
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
23642
49
      offset += 1;
23643
49
      if (offset > s_end)
23644
0
        break;
23645
49
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_mlo_bigtk_key,
23646
49
                          tvb, offset, s_end - offset, ENC_NA);
23647
49
      break;
23648
900
    default:
23649
900
      proto_tree_add_item(subtree, hf_ieee80211_tag_ft_subelem_data,
23650
900
                          tvb, offset, len, ENC_NA);
23651
900
      break;
23652
1.43k
    }
23653
1.43k
    offset = s_end;
23654
1.43k
  }
23655
23656
30
  return tvb_captured_length(tvb);
23657
168
}
23658
23659
static int
23660
dissect_mmie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23661
43
{
23662
43
  int tag_len = tvb_reported_length(tvb);
23663
43
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23664
43
  int offset = 0;
23665
23666
43
  if (tag_len < 16) {
23667
10
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23668
10
                          "MMIE content length must be at least 16 bytes");
23669
10
    return 1;
23670
10
  }
23671
23672
33
  proto_tree_add_item(tree, hf_ieee80211_tag_mmie_keyid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
23673
33
  proto_tree_add_item(tree, hf_ieee80211_tag_mmie_ipn, tvb, offset + 2, 6,
23674
33
                      ENC_NA);
23675
33
  proto_tree_add_item(tree, hf_ieee80211_tag_mmie_mic, tvb, offset + 8, 8,
23676
33
                      ENC_NA);
23677
33
  return tvb_captured_length(tvb);
23678
43
}
23679
23680
static int
23681
ieee80211_tag_dmg_capabilities(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data);
23682
23683
static int
23684
dissect_no_bssid_capability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data)
23685
67
{
23686
67
  int tag_len = tvb_reported_length(tvb);
23687
67
  int offset = 0;
23688
23689
67
  static int * const ieee80211_tag_no_bssid_capability_dmg_bss_control[] = {
23690
67
    &hf_ieee80211_tag_no_bssid_capability_dmg_bss_control_type,
23691
67
    &hf_ieee80211_tag_no_bssid_capability_dmg_bss_control_reserved,
23692
67
    NULL
23693
67
  };
23694
23695
67
  add_ff_cap_info(tree, tvb, pinfo, offset);
23696
67
  offset += 2;
23697
67
  tag_len -= 2;
23698
23699
  /* On nontransmitted BSSID, there is only DMG Capability Info */
23700
67
  if (tag_len) {
23701
62
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_no_bssid_capability_dmg_bss_control,
23702
62
                                      ett_tag_no_bssid_capability_dmg_bss_control_tree,
23703
62
                                      ieee80211_tag_no_bssid_capability_dmg_bss_control,
23704
62
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
23705
    /* offset += 1; */
23706
23707
62
    ieee80211_tag_dmg_capabilities(tvb, pinfo, tree, data);
23708
62
  }
23709
23710
67
  return tvb_captured_length(tvb);
23711
67
}
23712
23713
static int
23714
dissect_ssid_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
23715
154
{
23716
154
  int tag_len = tvb_reported_length(tvb);
23717
154
  int offset = 0;
23718
154
  proto_tree *entry;
23719
154
  bool first = true;
23720
23721
447
  while (offset + 1 <= tag_len) {
23722
401
    uint8_t len = tvb_get_uint8(tvb, offset + 1);
23723
401
    uint8_t *str;
23724
23725
401
    if (offset + 2 + len > tag_len)
23726
108
      break;
23727
23728
293
    str = tvb_format_text(pinfo->pool, tvb, offset + 2, len);
23729
293
    proto_item_append_text(tree, "%c %s", (first ? ':' : ','), str);
23730
293
    first = false;
23731
293
    entry = proto_tree_add_subtree_format(tree, tvb, offset, 2 + len, ett_ssid_list, NULL, "SSID: %s", str);
23732
293
    proto_tree_add_item(entry, hf_ieee80211_tag_number, tvb, offset, 1,
23733
293
                        ENC_LITTLE_ENDIAN);
23734
293
    offset++;
23735
293
    proto_tree_add_uint(entry, hf_ieee80211_tag_length, tvb, offset, 1, len);
23736
293
    offset++;
23737
    /* XXX: IEEE 802.11-2020 seems to say that these SSIDs are also affected
23738
     * by the UTF-8 Encoding bit in the Extended Capabilities element
23739
     * (though at least SSID List comes after Extended Capabilities).
23740
     */
23741
293
    proto_tree_add_item(entry, hf_ieee80211_tag_ssid, tvb, offset, len,
23742
293
                        ENC_NA);
23743
293
    offset += len;
23744
293
  }
23745
23746
154
  return tvb_captured_length(tvb);
23747
154
}
23748
23749
static int
23750
dissect_multiple_bssid_index(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
23751
58
{
23752
58
  int tag_len = tvb_reported_length(tvb);
23753
58
  int offset = 0;
23754
23755
58
  proto_tree_add_item(tree, hf_ieee80211_tag_multiple_bssid_index_bssid_index, tvb, offset, 1, ENC_NA);
23756
58
  offset += 1;
23757
58
  tag_len -= 1;
23758
23759
58
  if (tag_len) {
23760
54
    proto_tree_add_item(tree, hf_ieee80211_tag_multiple_bssid_index_dtim_period, tvb, offset, 1, ENC_NA);
23761
54
    offset += 1;
23762
23763
54
    proto_tree_add_item(tree, hf_ieee80211_tag_multiple_bssid_index_dtim_count, tvb, offset, 1, ENC_NA);
23764
54
    offset += 1;
23765
54
  }
23766
23767
58
  return offset;
23768
58
}
23769
23770
static int
23771
dissect_link_identifier(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23772
81
{
23773
81
  int tag_len = tvb_reported_length(tvb);
23774
81
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23775
81
  int offset = 0;
23776
23777
81
  if (tag_len < 18) {
23778
30
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23779
30
                          "Link Identifier content length must be at least "
23780
30
                          "18 bytes");
23781
30
    return tvb_captured_length(tvb);
23782
30
  }
23783
23784
51
  proto_tree_add_item(tree, hf_ieee80211_tag_link_id_bssid, tvb,
23785
51
                      offset, 6, ENC_NA);
23786
51
  proto_tree_add_item(tree, hf_ieee80211_tag_link_id_init_sta, tvb,
23787
51
                      offset + 6, 6, ENC_NA);
23788
51
  proto_tree_add_item(tree, hf_ieee80211_tag_link_id_resp_sta, tvb,
23789
51
                      offset + 12, 6, ENC_NA);
23790
51
  return tvb_captured_length(tvb);
23791
81
}
23792
23793
static int
23794
dissect_wakeup_schedule(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23795
52
{
23796
52
  int tag_len = tvb_reported_length(tvb);
23797
52
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23798
52
  int offset = 0;
23799
23800
52
  if (tag_len < 18) {
23801
17
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23802
17
                          "Wakeup Schedule content length must be at least "
23803
17
                          "18 bytes");
23804
17
    return tvb_captured_length(tvb);
23805
17
  }
23806
23807
35
  proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_offset, tvb,
23808
35
                      offset, 4, ENC_LITTLE_ENDIAN);
23809
35
  offset += 4;
23810
23811
35
  proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_interval, tvb,
23812
35
                      offset, 4, ENC_LITTLE_ENDIAN);
23813
35
  offset += 4;
23814
23815
35
  proto_tree_add_item(tree,
23816
35
                      hf_ieee80211_tag_wakeup_schedule_awake_window_slots, tvb,
23817
35
                      offset, 4, ENC_LITTLE_ENDIAN);
23818
35
  offset += 4;
23819
23820
35
  proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_max_awake_dur,
23821
35
                      tvb, offset, 4, ENC_LITTLE_ENDIAN);
23822
35
  offset += 4;
23823
23824
35
  proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_idle_count, tvb,
23825
35
                      offset, 2, ENC_LITTLE_ENDIAN);
23826
35
  return tvb_captured_length(tvb);
23827
52
}
23828
23829
static int
23830
dissect_channel_switch_timing(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23831
94
{
23832
94
  int tag_len = tvb_reported_length(tvb);
23833
94
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23834
94
  int offset = 0;
23835
23836
94
  if (tag_len < 4) {
23837
34
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23838
34
                          "Channel Switch Timing content length must be at "
23839
34
                          "least 4 bytes");
23840
34
    return tvb_captured_length(tvb);
23841
34
  }
23842
23843
60
  proto_tree_add_item(tree, hf_ieee80211_tag_channel_switch_timing_switch_time,
23844
60
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
23845
60
  offset += 2;
23846
23847
60
  proto_tree_add_item(tree,
23848
60
                      hf_ieee80211_tag_channel_switch_timing_switch_timeout,
23849
60
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
23850
60
  return tvb_captured_length(tvb);
23851
94
}
23852
23853
static int
23854
dissect_pti_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23855
64
{
23856
64
  int tag_len = tvb_reported_length(tvb);
23857
64
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23858
64
  int offset = 0;
23859
23860
64
  if (tag_len < 3) {
23861
23
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "PTI Control content length must be at least 3 bytes");
23862
23
    return tvb_captured_length(tvb);
23863
23
  }
23864
23865
41
  proto_tree_add_item(tree, hf_ieee80211_tag_pti_control_tid, tvb,
23866
41
                      offset, 1, ENC_LITTLE_ENDIAN);
23867
41
  offset += 1;
23868
23869
41
  proto_tree_add_item(tree, hf_ieee80211_tag_pti_control_sequence_control, tvb,
23870
41
                      offset, 2, ENC_LITTLE_ENDIAN);
23871
41
  return tvb_captured_length(tvb);
23872
64
}
23873
23874
static int
23875
dissect_pu_buffer_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23876
53
{
23877
53
  int tag_len = tvb_reported_length(tvb);
23878
53
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23879
53
  int offset = 0;
23880
53
  static int * const ieee80211_pu_buffer_status[] = {
23881
53
    &hf_ieee80211_tag_pu_buffer_status_ac_bk,
23882
53
    &hf_ieee80211_tag_pu_buffer_status_ac_be,
23883
53
    &hf_ieee80211_tag_pu_buffer_status_ac_vi,
23884
53
    &hf_ieee80211_tag_pu_buffer_status_ac_vo,
23885
53
    NULL
23886
53
  };
23887
23888
53
  if (tag_len < 1) {
23889
13
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "PU Buffer Status content length must be at least 1 byte");
23890
13
    return tvb_captured_length(tvb);
23891
13
  }
23892
23893
40
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_pu_buffer_status, ENC_LITTLE_ENDIAN);
23894
40
  return tvb_captured_length(tvb);
23895
53
}
23896
23897
static int
23898
dissect_timeout_interval(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
23899
73
{
23900
73
  int tag_len = tvb_reported_length(tvb);
23901
73
  int offset = 0;
23902
73
  proto_item *pi;
23903
23904
73
  pi = proto_tree_add_item(tree, hf_ieee80211_tag_timeout_int_type, tvb,
23905
73
                           offset, 1, ENC_LITTLE_ENDIAN);
23906
73
  if (tag_len < 5) {
23907
11
    expert_add_info_format(pinfo, pi, &ei_ieee80211_tag_length,
23908
11
                           "Timeout Interval content length must be at least "
23909
11
                          "5 bytes");
23910
11
    return 1;
23911
11
  }
23912
23913
62
  proto_tree_add_item(tree, hf_ieee80211_tag_timeout_int_value, tvb,
23914
62
                      offset + 1, 4, ENC_LITTLE_ENDIAN);
23915
62
  return tvb_captured_length(tvb);
23916
73
}
23917
23918
static int
23919
dissect_ric_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23920
71
{
23921
71
  int tag_len = tvb_reported_length(tvb);
23922
71
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23923
71
  int offset = 0;
23924
71
  proto_tree  *sub_tree;
23925
71
  uint8_t      desc_cnt = 0;
23926
71
  uint32_t     next_ie;
23927
71
  int          offset_r = 0;
23928
71
  const uint8_t ids[] = { TAG_RIC_DESCRIPTOR };
23929
23930
71
  if (tag_len != 4)  {
23931
70
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23932
70
                           "RIC Data Length must be 4 bytes");
23933
70
    return 0;
23934
70
  }
23935
23936
1
  proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_id, tvb,
23937
1
                           offset, 1, ENC_LITTLE_ENDIAN);
23938
1
  offset += 1;
23939
23940
1
  desc_cnt = tvb_get_uint8(tvb, offset);
23941
1
  proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_desc_cnt, tvb,
23942
1
                           offset, 1, ENC_LITTLE_ENDIAN);
23943
1
  offset += 1;
23944
23945
1
  proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_status_code, tvb,
23946
1
                           offset, 2, ENC_LITTLE_ENDIAN);
23947
1
  offset += 2;
23948
23949
  /* Our Design is such that all the Resource request IE's part of the RIC
23950
   * must be in the sub tree of RIC for better readability
23951
   * Even omnipeek does the same way.
23952
   */
23953
1
  sub_tree = proto_item_add_subtree(tree, ett_tag_ric_data_desc_ie);
23954
23955
1
  proto_item_append_text(field_data->item_tag, " :Resource Descriptor List");
23956
1
  if (desc_cnt == 0) {
23957
1
    proto_item_append_text(field_data->item_tag, " :0 (Weird?)");
23958
1
  }
23959
23960
1
  while ( desc_cnt != 0 ) {
23961
23962
0
    next_ie = tvb_get_uint8(tvb, offset);
23963
0
    proto_item_append_text(field_data->item_tag, " :(%d:%s)", desc_cnt, val_to_str_ext(next_ie, &tag_num_vals_ext, "Reserved (%d)"));
23964
    /* Recursive call to avoid duplication of code*/
23965
0
    offset_r = add_tagged_field(pinfo, sub_tree, tvb, offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
23966
0
    if (offset_r == 0 )/* should never happen, returns a min of 2*/
23967
0
      break;
23968
    /* This will ensure that the IE after RIC is processed
23969
     * only once. This gives us a good looking RIC IE :-)
23970
     */
23971
0
    tag_len += offset_r;
23972
0
    desc_cnt--;
23973
0
  }
23974
23975
1
  return tvb_captured_length(tvb);
23976
71
}
23977
23978
/* Overlapping BSS Scan Parameters (74) */
23979
static int
23980
dissect_overlap_bss_scan_par(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
23981
58
{
23982
58
  int offset = 0;
23983
58
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
23984
58
  int tag_len = tvb_reported_length(tvb);
23985
23986
58
  if (tag_len != 14)  {
23987
56
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
23988
56
                           "OBSS Length must be 14 bytes");
23989
56
    return 1;
23990
56
  }
23991
23992
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_spd, tvb, offset, 2, ENC_LITTLE_ENDIAN);
23993
2
  offset += 2;
23994
23995
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_sad, tvb, offset, 2, ENC_LITTLE_ENDIAN);
23996
2
  offset += 2;
23997
23998
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_cwtsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
23999
2
  offset += 2;
24000
24001
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_sptpc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
24002
2
  offset += 2;
24003
24004
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_satpc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
24005
2
  offset += 2;
24006
24007
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_wctdf, tvb, offset, 2, ENC_LITTLE_ENDIAN);
24008
2
  offset += 2;
24009
24010
2
  proto_tree_add_item(tree, hf_ieee80211_tag_obss_sat, tvb, offset, 2, ENC_LITTLE_ENDIAN);
24011
2
  offset += 2;
24012
24013
2
  return offset;
24014
58
}
24015
24016
/* RIC Descriptor (75) */
24017
static int
24018
dissect_ric_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
24019
65
{
24020
65
  int offset = 0;
24021
65
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
24022
65
  int tag_len = tvb_reported_length(tvb);
24023
65
  uint8_t      rsrc_type = 0;
24024
24025
65
  if (tag_len < 1)  {
24026
16
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
24027
16
                           "RIC Data Length must be at least 1 byte");
24028
16
    return 1;
24029
16
  }
24030
24031
49
  rsrc_type = tvb_get_uint8(tvb, offset);
24032
49
  proto_tree_add_item(tree, hf_ieee80211_tag_ric_desc_rsrc_type, tvb,
24033
49
                           offset, 1, ENC_LITTLE_ENDIAN);
24034
49
  offset += 1;
24035
24036
49
  if (rsrc_type == 1) {
24037
    /* Block ACK params
24038
     * 802.11-2012: 8.4.2.53 RIC Descriptor element
24039
     * Block Ack parameter set as defined in 8.4.1.14,
24040
     * Block Ack timeout value as defined in 8.4.1.15, and
24041
     * Block Ack starting sequence control as defined in 8.3.1.8
24042
     */
24043
    /* TODO: Still figuring out how to parse these ones,
24044
     * need a sample capture with at least HEX Dump
24045
     */
24046
7
    proto_item_append_text(field_data->item_tag, " : Block ACK Params");
24047
7
    proto_tree_add_item(tree, hf_ieee80211_tag_ric_desc_var_params, tvb,
24048
7
                        offset, tag_len-1, ENC_NA);
24049
7
    offset += tag_len -1;
24050
42
  }else {
24051
    /* 0, 2-255 are reserved*/
24052
42
    proto_item_append_text(field_data->item_tag, " :Reserved (type != 1)");
24053
42
  }
24054
24055
49
  return offset;
24056
65
}
24057
24058
static int
24059
dissect_ext_bss_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24060
38
{
24061
38
  int offset = 0;
24062
38
  proto_tree_add_item(tree, hf_ieee80211_ext_bss_mu_mimo_capable_sta_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
24063
38
  offset += 2;
24064
38
  proto_tree_add_item(tree, hf_ieee80211_ext_bss_ss_underutilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24065
38
  offset += 1;
24066
38
  proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_20mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24067
38
  offset += 1;
24068
38
  proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_40mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24069
38
  offset += 1;
24070
38
  proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_80mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24071
38
  offset += 1;
24072
24073
38
  return offset;
24074
38
}
24075
24076
static int
24077
dissect_wide_bw_channel_switch(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24078
47
{
24079
47
  int offset = 0;
24080
24081
47
  proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_width, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24082
47
  offset += 1;
24083
47
  proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_center_freq_segment0, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24084
47
  offset += 1;
24085
47
  proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_center_freq_segment1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24086
47
  offset += 1;
24087
24088
47
  return offset;
24089
47
}
24090
24091
static int
24092
dissect_channel_switch_wrapper(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24093
70
{
24094
70
  int tag_len = tvb_reported_length(tvb);
24095
70
  int offset = 0;
24096
70
  int tmp_sublen;
24097
70
  const uint8_t ids[] = { TAG_COUNTRY_INFO, TAG_WIDE_BW_CHANNEL_SWITCH,
24098
70
    TAG_TX_PWR_ENVELOPE };
24099
70
  const uint8_t ext_ids[] = {ETAG_BANDWIDTH_INDICATION};
24100
24101
  /*
24102
  Decode three subelement in IE-196(Channel Switch Wrapper element):
24103
        (1) New Country subelement
24104
        (2) Wide Bandwidth Channel Switch subelement
24105
        (3) New VHT Transmit Power Envelope subelement
24106
        (4) Bandwidth Indication subelement
24107
  */
24108
350
  while (tag_len > 0){
24109
280
    tmp_sublen = tvb_get_uint8(tvb, offset + 1);
24110
280
    if (add_tagged_field_with_validation(pinfo, tree, tvb, offset, 0, ids,
24111
280
        G_N_ELEMENTS(ids), false, ext_ids, G_N_ELEMENTS(ext_ids), false, NULL) == 0) {
24112
0
      break;
24113
0
    }
24114
280
    tag_len -= (tmp_sublen + 2);
24115
280
    offset += (tmp_sublen + 2);
24116
280
  }
24117
70
  return offset;
24118
70
}
24119
24120
static int
24121
dissect_operating_mode_notification(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24122
26
{
24123
26
  int offset = 0;
24124
26
  static int * const ieee80211_operat_mode_field[] = {
24125
26
    &hf_ieee80211_operat_mode_field_channel_width,
24126
26
    &hf_ieee80211_operat_mode_field_160_80plus80_bw,
24127
26
    &hf_ieee80211_operat_mode_field_no_ldpc,
24128
26
    &hf_ieee80211_operat_mode_field_rxnss,
24129
26
    &hf_ieee80211_operat_mode_field_rxnsstype,
24130
26
    NULL
24131
26
  };
24132
24133
  /* Operating Mode field */
24134
26
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_operat_notification_mode,
24135
26
                                    ett_mcsbit_tree, ieee80211_operat_mode_field,
24136
26
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24137
26
  offset += 1;
24138
26
  return offset;
24139
26
}
24140
24141
static const range_string tbtt_info_length[] = {
24142
  { 0, 0, "Reserved" },
24143
  { 1, 1, "Neighbor AP TBTT Offset subfield" },
24144
  { 2, 2, "Neighbor AP TBTT Offset subfield and the BSS Parameters subfield" },
24145
  { 3, 4, "Reserved" },
24146
  { 5, 5, "Neighbor AP TBTT Offset subfield and the Short-SSID subfield" },
24147
  { 6, 6, "Neighbor AP TBTT offset subfield, the Short SSID subfield and the BSS Parameters subfield" },
24148
  { 7, 7, "Neighbor AP TBTT Offset subfield and the BSSID subfield" },
24149
  { 8, 8, "Neighbor AP TBTT Offset subfield, the BSSID subfield and the BSS Parameters subfield" },
24150
  { 9, 9, "Neighbor AP TBTT Offset subfield, the BSSID subfield, the BSS Parameters subfield and the 20 MHz PSD subfield" },
24151
  { 10, 10, "Reserved" },
24152
  { 11, 11, "Neighbor AP TBTT Offset subfield, the BSSID subfield and the Short-SSID subfield" },
24153
  { 12, 12, "Neighbor AP TBTT Offset subfield, the BSSID subfield, the Short SSID subfield and the BSS Parameters subfield" },
24154
  { 13, 13, "Neighbor AP TBTT Offset subfield, the BSSID subfield, the Short SSID subfield, the BSS Parameters subfield and the 20 MHz PSD subfield" },
24155
  { 14, 15, "Reserved" },
24156
  { 16, 16, "Neighbor AP TBTT Offset subfield, the BSSID subfield, the Short SSID subfield, the BSS Parameters subfield, the 20 MHz PSD subfield and the MLD Parameters subfield" },
24157
  { 17, 255, "First 16 octets contain Neighbor AP TBTT Offset, the BSSID, the Short SSID, the BSS Parameters, the 20 MHz PSD and the MLD Parameters subfield. The remaining octets are reserved"},
24158
  { 0, 0, NULL }
24159
};
24160
24161
static int * const bss_params_headers[] = {
24162
  &hf_ieee80211_rnr_oct_recommended,
24163
  &hf_ieee80211_rnr_same_ssid,
24164
  &hf_ieee80211_rnr_multiple_bssid,
24165
  &hf_ieee80211_rnr_transmitted_bssid,
24166
  &hf_ieee80211_rnr_ess_with_colocated_ap,
24167
  &hf_ieee80211_rnr_unsolicited_probe_responses,
24168
  &hf_ieee80211_rnr_same_colocated_ap,
24169
  &hf_ieee80211_rnr_same_reserved,
24170
  NULL
24171
};
24172
24173
static int * const mld_params_headers[] = {
24174
  &hf_ieee80211_rnr_mld_id,
24175
  &hf_ieee80211_rnr_mld_link_id,
24176
  &hf_ieee80211_rnr_mld_bss_params_change_count,
24177
  &hf_ieee80211_rnr_mld_all_updates_included,
24178
  &hf_ieee80211_rnr_mld_disabled_link_indication,
24179
  &hf_ieee80211_rnr_mld_reserved,
24180
  NULL
24181
};
24182
24183
static int
24184
dissect_neighbor_ap_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
24185
                         int offset)
24186
908
{
24187
908
  uint16_t tbtt_info_h;
24188
908
  uint16_t tbtt_info_len;
24189
908
  uint16_t tbtt_info_count;
24190
908
  uint16_t len_remain = 0;
24191
908
  int i = 0;
24192
908
  bool display_tbtt_offset = false;
24193
908
  bool display_bssid_subfield = false;
24194
908
  bool display_short_bssid_subfield = false;
24195
908
  bool display_bss_parameters_subfield = false;
24196
908
  bool display_20mhz_psd_subfield = false;
24197
908
  bool display_mld_params_subfield = false;
24198
908
  bool display_reserved = false;
24199
24200
908
  proto_item *item;
24201
908
  proto_tree *query;
24202
24203
908
  tbtt_info_h = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
24204
908
  tbtt_info_len = TBTT_INFO_LENGTH(tbtt_info_h);
24205
908
  tbtt_info_count = TBTT_INFO_COUNT(tbtt_info_h);
24206
908
  switch(tbtt_info_len) {
24207
480
  case 0: case 3: case 4: case 10: case 14: case 15:
24208
    /* Reserved cases */
24209
480
    display_reserved = true;
24210
480
    len_remain = tbtt_info_len;
24211
480
    break;
24212
89
  case 1:
24213
89
    display_tbtt_offset = true;
24214
89
    break;
24215
29
  case 2:
24216
29
    display_tbtt_offset = true;
24217
29
    display_bss_parameters_subfield = true;
24218
29
    break;
24219
35
  case 5:
24220
35
    display_tbtt_offset = true;
24221
35
    display_short_bssid_subfield = true;
24222
35
    break;
24223
30
  case 6:
24224
30
    display_tbtt_offset = true;
24225
30
    display_short_bssid_subfield = true;
24226
30
    display_bss_parameters_subfield = true;
24227
30
    break;
24228
24
  case 7:
24229
24
    display_tbtt_offset = true;
24230
24
    display_bssid_subfield = true;
24231
24
    break;
24232
15
  case 8:
24233
15
    display_tbtt_offset = true;
24234
15
    display_bssid_subfield = true;
24235
15
    display_bss_parameters_subfield = true;
24236
15
    break;
24237
20
  case 9:
24238
20
    display_tbtt_offset = true;
24239
20
    display_bssid_subfield = true;
24240
20
    display_bss_parameters_subfield = true;
24241
20
    display_20mhz_psd_subfield = true;
24242
20
    break;
24243
3
  case 11:
24244
3
    display_tbtt_offset = true;
24245
3
    display_bssid_subfield = true;
24246
3
    display_short_bssid_subfield = true;
24247
3
    break;
24248
21
  case 12:
24249
21
    display_tbtt_offset = true;
24250
21
    display_bssid_subfield = true;
24251
21
    display_short_bssid_subfield = true;
24252
21
    display_bss_parameters_subfield = true;
24253
21
    break;
24254
12
  case 13:
24255
12
    display_tbtt_offset = true;
24256
12
    display_bssid_subfield = true;
24257
12
    display_short_bssid_subfield = true;
24258
12
    display_bss_parameters_subfield = true;
24259
12
    display_20mhz_psd_subfield = true;
24260
12
    break;
24261
29
  case 16: /* EHT stuff */
24262
29
    display_tbtt_offset = true;
24263
29
    display_bssid_subfield = true;
24264
29
    display_short_bssid_subfield = true;
24265
29
    display_bss_parameters_subfield = true;
24266
29
    display_20mhz_psd_subfield = true;
24267
29
    display_mld_params_subfield = true;
24268
29
    break;
24269
114
  default: /* 17- 255: Same as 16 but the remaining bytes are reserved. */
24270
114
    display_tbtt_offset = true;
24271
114
    display_bssid_subfield = true;
24272
114
    display_short_bssid_subfield = true;
24273
114
    display_bss_parameters_subfield = true;
24274
114
    display_20mhz_psd_subfield = true;
24275
114
    display_mld_params_subfield = true;
24276
114
    display_reserved = true;
24277
114
    len_remain = tbtt_info_len - 16;
24278
114
    break;
24279
908
  }
24280
24281
901
  proto_tree_add_item(tree, hf_ieee80211_tbtt_info, tvb, offset, 2,
24282
901
                      ENC_LITTLE_ENDIAN);
24283
901
  proto_tree_add_item(tree, hf_ieee80211_tbtt_filtered_nap, tvb, offset, 2,
24284
901
                      ENC_LITTLE_ENDIAN);
24285
901
  item = proto_tree_add_item(tree, hf_ieee80211_tbtt_info_count, tvb, offset, 2,
24286
901
                      ENC_LITTLE_ENDIAN);
24287
901
  proto_tree_add_item(tree, hf_ieee80211_tbtt_info_length, tvb, offset, 2,
24288
901
                      ENC_LITTLE_ENDIAN);
24289
901
  offset+=2;
24290
24291
901
  proto_tree_add_item(tree, hf_ieee80211_tbtt_operating_class, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24292
901
  offset+=1;
24293
901
  proto_tree_add_item(tree, hf_ieee80211_tbtt_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24294
901
  offset+=1;
24295
24296
2.72k
  for (i=0; i < tbtt_info_count + 1; i++) {
24297
1.82k
    query = proto_tree_add_subtree(tree, tvb, offset, tbtt_info_len,
24298
1.82k
                                  ett_tbtt_infos, &item, "TBTT Information");
24299
24300
1.82k
    if (display_tbtt_offset) {
24301
834
      proto_tree_add_item(query, hf_ieee80211_tbtt_offset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
24302
834
      offset+=1;
24303
834
    }
24304
1.82k
    if (display_bssid_subfield) {
24305
412
      proto_tree_add_item(query, hf_ieee80211_tbtt_bssid, tvb, offset, 6, ENC_NA);
24306
412
      offset+=6;
24307
412
    }
24308
1.82k
    if (display_short_bssid_subfield) {
24309
389
      proto_tree_add_item(query, hf_ieee80211_tbtt_short_ssid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
24310
389
      offset+=4;
24311
389
    }
24312
1.82k
    if (display_bss_parameters_subfield) {
24313
24314
506
      proto_tree_add_bitmask_with_flags(query, tvb, offset,
24315
506
                                        hf_ieee80211_rnr_bss_params,
24316
506
                                        ett_rnr_bss_params_tree,
24317
506
                                        bss_params_headers,
24318
506
                                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24319
506
      offset += 1;
24320
506
    }
24321
1.82k
    if (display_20mhz_psd_subfield) {
24322
214
      proto_tree_add_item(query, hf_ieee80211_rnr_20mhz_psd_subfield, tvb,
24323
214
                          offset, 1, ENC_NA);
24324
214
      offset += 1;
24325
214
    }
24326
1.82k
    if (display_mld_params_subfield) {
24327
24328
145
      proto_tree_add_bitmask_with_flags(query, tvb, offset,
24329
145
                                        hf_ieee80211_rnr_mld_params,
24330
145
                                        ett_rnr_mld_params_tree,
24331
145
                                        mld_params_headers,
24332
145
                                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24333
145
      offset += 3;
24334
145
    }
24335
1.82k
    if (display_reserved) {
24336
1.09k
        proto_tree_add_item(query, hf_ieee80211_rnr_reserved_data, tvb, offset,
24337
1.09k
                            len_remain, ENC_NA);
24338
1.09k
    }
24339
24340
1.82k
    offset += len_remain;
24341
1.82k
  }
24342
24343
901
  return offset;
24344
908
}
24345
24346
static int
24347
dissect_reduced_neighbor_report(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24348
145
{
24349
145
  int offset = 0;
24350
24351
1.05k
  while (tvb_reported_length_remaining(tvb, offset)) {
24352
911
    int start_offset;
24353
911
    proto_tree *neighbor_ap_info = NULL;
24354
911
    proto_item *naii = NULL;
24355
24356
911
    start_offset = offset;
24357
911
    neighbor_ap_info = proto_tree_add_subtree(tree, tvb, offset, -1,
24358
911
                                              ett_neighbor_ap_info, &naii,
24359
911
                                              "Neighbor AP Information");
24360
911
    offset = dissect_neighbor_ap_info(tvb, pinfo, neighbor_ap_info, offset);
24361
24362
911
    proto_item_set_len(naii, offset - start_offset);
24363
911
  }
24364
24365
145
  return tvb_reported_length(tvb);
24366
145
}
24367
24368
static const value_string s1g_supported_channel_width_vals[] = {
24369
  { 0, "STA supports 1MHz and 2MHz operation" },
24370
  { 1, "STA supports 1MHz, 2MHz and 4MHz operation" },
24371
  { 2, "STA supports 1MHz, 2MHz, 4MHz and 8MHz operation" },
24372
  { 3, "STA supports 1MHz, 2MHz, 4MHz, 8MHz and 16MHz operation" },
24373
  { 0, NULL }
24374
};
24375
24376
static const value_string s1g_traveling_pilot_support_vals[] = {
24377
  { 0, "Traveling Pilot Support not activated" },
24378
  { 1, "Traveling Pilot Support activated for only one space-time stream" },
24379
  { 2, "Reserved" },
24380
  { 3, "Traveling Pilot Support activated for one and two space-time streams" },
24381
  { 0, NULL }
24382
};
24383
24384
static const value_string s1g_max_mpdu_length_vals[] = {
24385
  { 0, "3895" },
24386
  { 1, "7991" },
24387
  { 0, NULL }
24388
};
24389
24390
static const value_string s1g_min_mpdu_start_spacing_vals[] = {
24391
  { 0, "No restriction" },
24392
  { 1, "1/4 uS" },
24393
  { 2, "1/2 uS" },
24394
  { 3, "1 uS" },
24395
  { 4, "2 uS" },
24396
  { 5, "4 uS" },
24397
  { 6, "8 uS" },
24398
  { 7, "16 uS" },
24399
  { 0, NULL }
24400
};
24401
24402
static const value_string s1g_sta_type_support_vals[] = {
24403
  { 0, "AP-Only. Supports sensor and non-sensor STAs." },
24404
  { 1, "AP supports only sensor STAs. STA is a sensor STA." },
24405
  { 2, "AP supports only non-sensor STAs. STA is a non-sensor STA" },
24406
  { 3, "Reserved" },
24407
  { 0, NULL }
24408
};
24409
24410
static const value_string s1g_sectorized_beam_capable_vals[] = {
24411
  { 0, "AP or non-AP: Not supported" },
24412
  { 1, "AP: TXOP-based sectorization only. Non-AP: Both group and TXOP" },
24413
  { 2, "AP: Group sectorization only. Non-AP: Reserved" },
24414
  { 3, "AP: Both group and TXOP sectorization. Non-AP: Reserved" },
24415
  { 0, NULL }
24416
};
24417
24418
static const value_string s1g_vht_link_adaptation_vals[] = {
24419
  { 0, "STA does not provide VHT MFB" },
24420
  { 1, "Reserved" },
24421
  { 2, "STA can only provide unsolicited VHT MFB" },
24422
  { 3, "STA can provide unsolicited and solicited VHT MFB" },
24423
  { 0, NULL }
24424
};
24425
24426
#if 0
24427
static const value_string s1g_mcs_map[] = {
24428
  { 0, "Support for S1G-MCS 2 for n spatial streams" },
24429
  { 1, "Support for S1G-MCS 7 for n spatial streamS" },
24430
  { 2, "Support for S1G-MCS 9 for n spatial streams" },
24431
  { 3, "n spatial streams not supported" },
24432
  { 0, NULL }
24433
};
24434
#endif
24435
24436
static int * const ieee80211_s1g_cap_byte1[] = {
24437
  &hf_ieee80211_s1g_cap_s1g_long_support,
24438
  &hf_ieee80211_s1g_cap_short_gi_for_1_mhz,
24439
  &hf_ieee80211_s1g_cap_short_gi_for_2_mhz,
24440
  &hf_ieee80211_s1g_cap_short_gi_for_4_mhz,
24441
  &hf_ieee80211_s1g_cap_short_gi_for_8_mhz,
24442
  &hf_ieee80211_s1g_cap_short_gi_for_16_mhz,
24443
  &hf_ieee80211_s1g_cap_supported_channel_width,
24444
  NULL
24445
};
24446
24447
static int * const ieee80211_s1g_cap_byte2[] = {
24448
  &hf_ieee80211_s1g_cap_rx_ldpc,
24449
  &hf_ieee80211_s1g_cap_tx_stbc,
24450
  &hf_ieee80211_s1g_cap_rx_stbc,
24451
  &hf_ieee80211_s1g_cap_su_beamformer_capable,
24452
  &hf_ieee80211_s1g_cap_su_beamformee_capable,
24453
  &hf_ieee80211_s1g_cap_beamformee_sts_capability, /* Needs global */
24454
  NULL
24455
};
24456
24457
static int * const ieee80211_s1g_cap_byte3[] = {
24458
  &hf_ieee80211_s1g_cap_number_sounding_dimensions,
24459
  &hf_ieee80211_s1g_cap_mu_beamformer_capable,
24460
  &hf_ieee80211_s1g_cap_mu_beamformee_capable,
24461
  &hf_ieee80211_s1g_cap_htc_vht_capable,
24462
  &hf_ieee80211_s1g_cap_travelling_pilot_support,
24463
  NULL
24464
};
24465
24466
static int * const ieee80211_s1g_cap_byte4[] = {
24467
  &hf_ieee80211_s1g_cap_rd_responder,
24468
  &hf_ieee80211_s1g_cap_ht_delayed_block_ack,
24469
  &hf_ieee80211_s1g_cap_maximum_mpdu_length,
24470
  &hf_ieee80211_s1g_cap_maximum_a_mpdu_length_exp,
24471
  &hf_ieee80211_s1g_cap_minimum_mpdu_start_spacing,
24472
  NULL
24473
};
24474
24475
static int * const ieee80211_s1g_cap_byte5[] = {
24476
  &hf_ieee80211_s1g_cap_uplink_sync_capable,
24477
  &hf_ieee80211_s1g_cap_dynamic_aid,
24478
  &hf_ieee80211_s1g_cap_bat_support,
24479
  &hf_ieee80211_s1g_cap_tim_ade_support,
24480
  &hf_ieee80211_s1g_cap_non_tim_support,
24481
  &hf_ieee80211_s1g_cap_group_aid_support,
24482
  &hf_ieee80211_s1g_cap_sta_type_support,
24483
  NULL
24484
};
24485
24486
static int * const ieee80211_s1g_cap_byte6[] = {
24487
  &hf_ieee80211_s1g_cap_centralized_authentication_control,
24488
  &hf_ieee80211_s1g_cap_distributed_authentication_control,
24489
  &hf_ieee80211_s1g_cap_a_msdu_support,
24490
  &hf_ieee80211_s1g_cap_a_mpdu_support,
24491
  &hf_ieee80211_s1g_cap_asymmetic_block_ack_support,
24492
  &hf_ieee80211_s1g_cap_flow_control_support,
24493
  &hf_ieee80211_s1g_cap_sectorized_beam_capable,
24494
  NULL
24495
};
24496
24497
static int * const ieee80211_s1g_cap_byte7[] = {
24498
  &hf_ieee80211_s1g_cap_obss_mitigation_support,
24499
  &hf_ieee80211_s1g_cap_fragment_ba_support,
24500
  &hf_ieee80211_s1g_cap_ndp_ps_poll_supported,
24501
  &hf_ieee80211_s1g_cap_raw_operation_support,
24502
  &hf_ieee80211_s1g_cap_page_slicing_support,
24503
  &hf_ieee80211_s1g_cap_txop_sharing_implicit_ack_support,
24504
  &hf_ieee80211_s1g_cap_vht_link_adaptation_capable,
24505
  NULL
24506
};
24507
24508
static int * const ieee80211_s1g_cap_byte8[] = {
24509
  &hf_ieee80211_s1g_cap_tack_support_as_ps_poll_response,
24510
  &hf_ieee80211_s1g_cap_duplicate_1_mhz_support,
24511
  &hf_ieee80211_s1g_cap_mcs_negotiation_support,
24512
  &hf_ieee80211_s1g_cap_1_mhz_control_response_preamble_support,
24513
  &hf_ieee80211_s1g_cap_ndp_beamforming_report_poll_support,
24514
  &hf_ieee80211_s1g_cap_unsolicited_dynamic_aid,
24515
  &hf_ieee80211_s1g_cap_sector_training_operation_supported,
24516
  &hf_ieee80211_s1g_cap_temporary_ps_mode_switch,
24517
  NULL,
24518
};
24519
24520
static int * const ieee80211_s1g_cap_byte9[] = {
24521
  &hf_ieee80211_s1g_cap_twt_grouping_support,
24522
  &hf_ieee80211_s1g_cap_bdt_capable,
24523
  &hf_ieee80211_s1g_cap_color,
24524
  &hf_ieee80211_s1g_cap_twt_requester_support,
24525
  &hf_ieee80211_s1g_cap_twt_responder_support,
24526
  &hf_ieee80211_s1g_cap_pv1_frame_support,
24527
  NULL
24528
};
24529
24530
static int * const ieee80211_s1g_cap_byte10[] = {
24531
  &hf_ieee80211_s1g_cap_link_adaptation_per_normal_control_response_capable,
24532
  &hf_ieee80211_s1g_cap_reserved,
24533
  NULL
24534
};
24535
24536
static int * const ieee80211_s1g_mcs_and_nss_set[] = {
24537
  &hf_ieee80211_s1g_rx_s1g_mcs_map,
24538
  &hf_ieee80211_s1g_rx_highest_supported_long_gi_data_rate,
24539
  &hf_ieee80211_s1g_tx_s1g_mcs_map,
24540
  &hf_ieee80211_s1g_tx_highest_supported_long_gi_data_rate,
24541
  &hf_ieee80211_s1g_rx_single_spatial_stream_map_for_1_mhz,
24542
  &hf_ieee80211_s1g_tx_single_spatial_stream_map_for_1_mhz,
24543
  &hf_ieee80211_s1g_mcs_and_nss_reserved,
24544
  NULL
24545
};
24546
24547
static int
24548
dissect_s1g_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24549
11
{
24550
11
  int offset = 0;
24551
11
  proto_tree *s1g_cap_info = NULL;
24552
11
  proto_tree *s1g_caps = NULL;
24553
11
  proto_tree *sup_mcs_nss_set = NULL;
24554
24555
11
  s1g_cap_info = proto_tree_add_subtree(tree, tvb, offset, 15,
24556
11
                                ett_ieee80211_s1g_capabilities_info,
24557
11
                                NULL, "S1G Capabilities Information");
24558
24559
11
  s1g_caps = proto_tree_add_subtree(s1g_cap_info, tvb, offset, 10,
24560
11
                                ett_ieee80211_s1g_capabilities,
24561
11
                                NULL, "S1G Capabilities");
24562
24563
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24564
11
                                    hf_ieee80211_s1g_cap_byte1,
24565
11
                                    ett_s1g_cap_byte1,
24566
11
                                    ieee80211_s1g_cap_byte1,
24567
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24568
11
  offset += 1;
24569
24570
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24571
11
                                    hf_ieee80211_s1g_cap_byte2,
24572
11
                                    ett_s1g_cap_byte2,
24573
11
                                    ieee80211_s1g_cap_byte2,
24574
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24575
11
  offset += 1;
24576
24577
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24578
11
                                    hf_ieee80211_s1g_cap_byte3,
24579
11
                                    ett_s1g_cap_byte3,
24580
11
                                    ieee80211_s1g_cap_byte3,
24581
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24582
11
  offset += 1;
24583
24584
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24585
11
                                    hf_ieee80211_s1g_cap_byte4,
24586
11
                                    ett_s1g_cap_byte4,
24587
11
                                    ieee80211_s1g_cap_byte4,
24588
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24589
11
  offset += 1;
24590
24591
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24592
11
                                    hf_ieee80211_s1g_cap_byte5,
24593
11
                                    ett_s1g_cap_byte5,
24594
11
                                    ieee80211_s1g_cap_byte5,
24595
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24596
11
  offset += 1;
24597
24598
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24599
11
                                    hf_ieee80211_s1g_cap_byte6,
24600
11
                                    ett_s1g_cap_byte6,
24601
11
                                    ieee80211_s1g_cap_byte6,
24602
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24603
11
  offset += 1;
24604
24605
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24606
11
                                    hf_ieee80211_s1g_cap_byte7,
24607
11
                                    ett_s1g_cap_byte7,
24608
11
                                    ieee80211_s1g_cap_byte7,
24609
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24610
11
  offset += 1;
24611
24612
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24613
11
                                    hf_ieee80211_s1g_cap_byte8,
24614
11
                                    ett_s1g_cap_byte8,
24615
11
                                    ieee80211_s1g_cap_byte8,
24616
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24617
11
  offset += 1;
24618
24619
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24620
11
                                    hf_ieee80211_s1g_cap_byte9,
24621
11
                                    ett_s1g_cap_byte9,
24622
11
                                    ieee80211_s1g_cap_byte9,
24623
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24624
11
  offset += 1;
24625
24626
11
  proto_tree_add_bitmask_with_flags(s1g_caps, tvb, offset,
24627
11
                                    hf_ieee80211_s1g_cap_byte10,
24628
11
                                    ett_s1g_cap_byte10,
24629
11
                                    ieee80211_s1g_cap_byte10,
24630
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24631
11
  offset += 1;
24632
24633
11
  sup_mcs_nss_set = proto_tree_add_subtree(s1g_cap_info, tvb, offset, 5,
24634
11
                                    ett_ieee80211_s1g_sup_mcs_and_nss_set,
24635
11
                                    NULL, "Supported S1G-MCS and NSS Set");
24636
24637
11
  proto_tree_add_bitmask_with_flags(sup_mcs_nss_set, tvb, offset,
24638
11
                                    hf_ieee80211_s1g_mcs_and_nss_set,
24639
11
                                    ett_s1g_mcs_and_mcs_set,
24640
11
                                    ieee80211_s1g_mcs_and_nss_set,
24641
11
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24642
11
  offset += 5;
24643
24644
11
  return offset;
24645
11
}
24646
24647
static int * const s1g_subchannel_selective_transmission_headers0[] = {
24648
  &hf_ieee80211_s1g_sst_sounding_option,
24649
  &hf_ieee80211_s1g_channel_activity_bitmap,
24650
  &hf_ieee80211_s1g_ul_activity,
24651
  &hf_ieee80211_s1g_dl_activity,
24652
  &hf_ieee80211_s1g_max_trans_width,
24653
  &hf_ieee80211_s1g_activity_start_time,
24654
  NULL
24655
};
24656
24657
static const value_string max_trans_width_vals[] = {
24658
  { 0, "channel width unit" },
24659
  { 1, "4MHz" },
24660
  { 2, "8MHz" },
24661
  { 3, "16MHz" },
24662
  { 0, NULL }
24663
};
24664
24665
static int
24666
dissect_subchannel_selective_transmission(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24667
45
{
24668
45
  int offset = 0;
24669
45
  uint8_t control = tvb_get_uint8(tvb, offset);
24670
24671
  /* Different if sounding option is 0 or 1 */
24672
45
  if ((control & 0x01) == 0x00) {
24673
27
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
24674
27
                        hf_ieee80211_s1g_subchannel_selective_transmission,
24675
27
                        ett_s1g_subchannel_selective_transmission,
24676
27
                        s1g_subchannel_selective_transmission_headers0,
24677
27
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24678
27
    offset += 4;
24679
27
  } else {
24680
18
    uint8_t control2 = tvb_get_uint8(tvb, offset + 1);
24681
18
    proto_item *pi = NULL;
24682
18
    proto_tree *chan_tree = NULL;
24683
24684
18
    chan_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
24685
18
                                       ett_s1g_subchannel_selective_transmission,
24686
18
                                       &pi , "Channel Activity Schedule");
24687
18
    proto_tree_add_item(chan_tree, hf_ieee80211_s1g_sst_sounding_option1, tvb,
24688
18
                        offset, 2, ENC_LITTLE_ENDIAN);
24689
18
    proto_tree_add_item(chan_tree, hf_ieee80211_s1g_channel_activity_bitmap1,
24690
18
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
24691
18
    proto_tree_add_item(chan_tree, hf_ieee80211_s1g_sounding_start_time_present,
24692
18
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
24693
18
    proto_tree_add_item(chan_tree, hf_ieee80211_s1g_channel_activity_reserved,
24694
18
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
24695
18
    proto_tree_add_item(chan_tree, hf_ieee80211_s1g_max_trans_width1, tvb,
24696
18
                        offset, 2, ENC_LITTLE_ENDIAN);
24697
18
    offset += 2;
24698
    /* sounding_start_time_present */
24699
18
    if (control2 & 0x02) {
24700
8
      proto_tree_add_item(chan_tree, hf_ieee80211_s1g_sounding_start_time, tvb,
24701
8
                          offset, 2, ENC_LITTLE_ENDIAN);
24702
8
      offset += 2;
24703
8
      proto_item_set_len(pi, 4);
24704
10
    } else {
24705
10
      proto_item_set_len(pi, 2);
24706
10
    }
24707
18
  }
24708
24709
45
  return offset;
24710
45
}
24711
24712
static void
24713
s1g_open_loop_link_margin_custom(char *result, uint8_t ollm_index)
24714
0
{
24715
0
  snprintf(result, ITEM_LABEL_LENGTH, "%3.1f dB",
24716
0
                                        (-128.0 + ollm_index * 0.5));
24717
0
}
24718
24719
static int
24720
dissect_s1g_open_loop_link_margin_index(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24721
22
{
24722
22
  int offset = 0;
24723
24724
22
  proto_tree_add_item(tree, hf_ieee80211_s1g_open_loop_link_margin, tvb,
24725
22
                      offset, 1, ENC_NA);
24726
22
  offset += 1;
24727
24728
22
  return offset;
24729
22
}
24730
24731
2.10k
#define RAW_START_TIME_INDICATION       0x10
24732
2.10k
#define RAW_GROUP_INDICATION            0x20
24733
2.10k
#define RAW_CHANNEL_INDICATION_PRESENCE 0x40
24734
2.10k
#define RAW_PERIODIC_RAW_INDICATION     0x80
24735
24736
static const value_string s1g_raw_control_raw_type[] = {
24737
  { 0, "Generic RAW" },
24738
  { 1, "Sounding RAW" },
24739
  { 2, "Simplex RAW" },
24740
  { 3, "Triggering frame RAW" },
24741
  { 0, NULL }
24742
};
24743
24744
static uint8_t global_s1g_raw_type;
24745
24746
static void
24747
s1g_raw_type_options_custom(char *result, uint8_t raw_type)
24748
0
{
24749
0
  switch (global_s1g_raw_type) {
24750
0
  case 0x00:
24751
0
    switch (raw_type) {
24752
0
    case 0x00:
24753
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "None");
24754
0
      break;
24755
0
    case 0x01:
24756
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Paged STA");
24757
0
      break;
24758
0
    case 0x02:
24759
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "RA Frame");
24760
0
      break;
24761
0
    case 0x03:
24762
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Paged STA and RA Frame");
24763
0
      break;
24764
0
    }
24765
0
    break;
24766
0
  case 0x01:
24767
0
    switch (raw_type) {
24768
0
    case 0x00:
24769
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "SST sounding RAW");
24770
0
      break;
24771
0
    case 0x01:
24772
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "SST report RAW");
24773
0
      break;
24774
0
    case 0x02:
24775
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Sector sounding RAW");
24776
0
      break;
24777
0
    case 0x03:
24778
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Sector report RAW");
24779
0
      break;
24780
0
    }
24781
0
    break;
24782
0
  case 0x02:
24783
0
    switch (raw_type) {
24784
0
    case 0x00:
24785
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "AP PM RAW");
24786
0
      break;
24787
0
    case 0x01:
24788
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Non-TIM RAW");
24789
0
      break;
24790
0
    case 0x02:
24791
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Omni RAW");
24792
0
      break;
24793
0
    case 0x03:
24794
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Reserved");
24795
0
      break;
24796
0
    }
24797
0
    break;
24798
0
  case 0x03:
24799
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s", "Reserved");
24800
0
    break;
24801
0
  }
24802
0
}
24803
24804
static void s1g_raw_slot_duration_custom(char *result, uint16_t slot_def)
24805
0
{
24806
0
  snprintf(result, ITEM_LABEL_LENGTH, "%u (%u uS)", slot_def, (500 + slot_def * 120));
24807
0
}
24808
24809
static int * const s1g_raw_control_headers[] = {
24810
  &hf_ieee80211_s1g_raw_type,
24811
  &hf_ieee80211_s1g_raw_type_options,
24812
  &hf_ieee80211_s1g_raw_start_time_indication,
24813
  &hf_ieee80211_s1g_raw_raw_group_indication,
24814
  &hf_ieee80211_s1g_raw_channel_indication_preference,
24815
  &hf_ieee80211_s1g_raw_periodic_raw_indication,
24816
  NULL
24817
};
24818
24819
static int * const s1g_slot_def_8_bit[] = {
24820
  &hf_ieee80211_s1g_slot_def_format_indication,
24821
  &hf_ieee80211_s1g_slot_def_cross_slot_boundary,
24822
  &hf_ieee80211_s1g_slot_def_slot_duration_count8,
24823
  &hf_ieee80211_s1g_slot_def_num_slots6,
24824
  NULL
24825
};
24826
24827
static int * const s1g_slot_def_11_bit[] = {
24828
  &hf_ieee80211_s1g_slot_def_format_indication,
24829
  &hf_ieee80211_s1g_slot_def_cross_slot_boundary,
24830
  &hf_ieee80211_s1g_slot_def_slot_duration_count11,
24831
  &hf_ieee80211_s1g_slot_def_num_slots3,
24832
  NULL
24833
};
24834
24835
static int * const s1g_raw_group_fields[] = {
24836
  &hf_ieee80211_s1g_raw_group_page_index,
24837
  &hf_ieee80211_s1g_raw_group_start_aid,
24838
  &hf_ieee80211_s1g_raw_group_end_aid,
24839
  NULL
24840
};
24841
24842
static int * const s1g_raw_channel_indication_fields[] = {
24843
  &hf_ieee80211_s1g_raw_ci_channel_activity_bitmap,
24844
  &hf_ieee80211_s1g_raw_ci_max_trans_width,
24845
  &hf_ieee80211_s1g_raw_ci_ul_activity,
24846
  &hf_ieee80211_s1g_raw_ci_dl_activity,
24847
  &hf_ieee80211_s1g_raw_ci_reserved,
24848
  NULL
24849
};
24850
24851
static int
24852
dissect_rps(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24853
124
{
24854
124
  proto_tree *raw_assignment_tree;
24855
124
  proto_tree *assn_tree;
24856
124
  proto_item *rati;
24857
124
  int offset = 0;
24858
124
  int idx = 0;
24859
124
  uint8_t rps_len = tvb_reported_length_remaining(tvb, offset);
24860
24861
124
  raw_assignment_tree = proto_tree_add_subtree(tree, tvb, offset, rps_len,
24862
124
                                    ett_s1g_raw_assignment, NULL,
24863
124
                                    "RAW assignments");
24864
24865
2.22k
  while (tvb_reported_length_remaining(tvb, offset) > 0) {
24866
24867
2.10k
    assn_tree = proto_tree_add_subtree_format(raw_assignment_tree, tvb, offset, -1,
24868
2.10k
                                          ett_s1g_raw_assn_tree, &rati,
24869
2.10k
                                          "Assignment %d", idx);
24870
24871
2.10k
    uint8_t raw_control = tvb_get_uint8(tvb, offset);
24872
2.10k
    uint8_t raw_slot_def = tvb_get_uint8(tvb, offset + 1);
24873
24874
2.10k
    global_s1g_raw_type = raw_control & 0x03;
24875
24876
2.10k
    proto_tree_add_bitmask_with_flags(assn_tree, tvb, offset,
24877
2.10k
                                      hf_ieee80211_s1g_raw_control,
24878
2.10k
                                      ett_s1g_raw_control,
24879
2.10k
                                      s1g_raw_control_headers,
24880
2.10k
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24881
2.10k
    offset += 1;
24882
24883
2.10k
    if (((raw_slot_def & 0x01) == 0x00) || (global_s1g_raw_type == 0x01)) {
24884
1.47k
      proto_tree_add_bitmask_with_flags(assn_tree, tvb, offset,
24885
1.47k
                                      hf_ieee80211_s1g_raw_slot_def,
24886
1.47k
                                      ett_s1g_raw_slot_def,
24887
1.47k
                                      s1g_slot_def_8_bit,
24888
1.47k
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24889
1.47k
    } else {
24890
630
      proto_tree_add_bitmask_with_flags(assn_tree, tvb, offset,
24891
630
                                      hf_ieee80211_s1g_raw_slot_def,
24892
630
                                      ett_s1g_raw_slot_def,
24893
630
                                      s1g_slot_def_11_bit,
24894
630
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24895
630
    }
24896
24897
2.10k
    offset += 2;
24898
24899
2.10k
    if (raw_control & RAW_START_TIME_INDICATION) {
24900
614
      proto_tree_add_item(assn_tree, hf_ieee80211_s1g_raw_start_time, tvb, offset, 1,
24901
614
                          ENC_NA);
24902
614
      offset += 1;
24903
614
    }
24904
24905
2.10k
    if (raw_control & RAW_GROUP_INDICATION) {
24906
527
      uint32_t raw_group = tvb_get_letoh24(tvb, offset);
24907
24908
527
      if (raw_group == 0) {
24909
66
        proto_item *it = NULL;
24910
24911
66
        it = proto_tree_add_item(assn_tree, hf_ieee80211_s1g_raw_group_subfield, tvb,
24912
66
                                offset, 3, ENC_LITTLE_ENDIAN);
24913
66
        proto_item_append_text(it, ": All STAs allowed access within the RAW");
24914
461
      } else {
24915
461
        proto_tree_add_bitmask_with_flags(assn_tree, tvb, offset,
24916
461
                                      hf_ieee80211_s1g_raw_group_subfield,
24917
461
                                      ett_s1g_raw_group_subfield,
24918
461
                                      s1g_raw_group_fields,
24919
461
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24920
461
      }
24921
527
      offset += 3;
24922
527
    }
24923
24924
2.10k
    if (raw_control & RAW_CHANNEL_INDICATION_PRESENCE) {
24925
514
      proto_tree_add_bitmask_with_flags(assn_tree, tvb, offset,
24926
514
                                      hf_ieee80211_s1g_raw_channel_indication,
24927
514
                                      ett_s1g_raw_channel_indication,
24928
514
                                      s1g_raw_channel_indication_fields,
24929
514
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24930
514
      offset += 2;
24931
514
    }
24932
24933
2.10k
    if (raw_control & RAW_PERIODIC_RAW_INDICATION) {
24934
477
      proto_tree_add_item(assn_tree, hf_ieee80211_s1g_raw_praw_periodicity, tvb,
24935
477
                          offset, 1, ENC_NA);
24936
477
      offset += 1;
24937
477
      proto_tree_add_item(assn_tree, hf_ieee80211_s1g_raw_praw_validity, tvb,
24938
477
                          offset, 1, ENC_NA);
24939
477
      offset += 1;
24940
477
      proto_tree_add_item(assn_tree, hf_ieee80211_s1g_raw_praw_start_offset, tvb,
24941
477
                          offset, 1, ENC_NA);
24942
477
      offset += 1;
24943
477
    }
24944
24945
2.10k
    idx += 1;
24946
2.10k
  }
24947
124
  return offset;
24948
124
}
24949
24950
static int * const s1g_page_slice_headers[] = {
24951
  &hf_ieee80211_s1g_page_slice_page_index,
24952
  &hf_ieee80211_s1g_page_slice_page_slice_length,
24953
  &hf_ieee80211_s1g_page_slice_page_slice_count,
24954
  &hf_ieee80211_s1g_page_slice_block_offset,
24955
  &hf_ieee80211_s1g_page_slice_tim_offset,
24956
  &hf_ieee80211_s1g_page_slice_reserved,
24957
  NULL
24958
};
24959
24960
static int
24961
dissect_page_slice(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
24962
16
{
24963
16
  int offset = 0;
24964
16
  int len = 0;
24965
24966
16
  proto_tree_add_item(tree, hf_ieee80211_s1g_page_slice_page_period, tvb,
24967
16
                      offset, 1, ENC_NA);
24968
16
  offset += 1;
24969
24970
16
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
24971
16
                                    hf_ieee80211_s1g_page_slice_control,
24972
16
                                    ett_s1g_page_slice_control,
24973
16
                                    s1g_page_slice_headers,
24974
16
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
24975
24976
16
  offset += 3;
24977
24978
16
  len = tvb_reported_length_remaining(tvb, offset);
24979
16
  if (len > 0) {
24980
15
    proto_tree_add_item(tree, hf_ieee80211_s1g_page_slice_page_bitmap, tvb,
24981
15
                        offset, len, ENC_NA);
24982
15
    offset += len;
24983
15
  }
24984
24985
16
  return offset;
24986
16
}
24987
24988
59
#define AID_REQUEST_INTERVAL_PRESENT   0x01
24989
59
#define PER_STA_ADDRESS_PRESENT        0x02
24990
59
#define SERVICE_CHARACTERISTIC_PRESENT 0x04
24991
59
#define GROUP_ADDRESS_PRESENT          0x20
24992
24993
static int * const s1g_aid_request_mode_headers[] = {
24994
  &hf_ieee80211_s1g_aid_request_interval_present,
24995
  &hf_ieee80211_s1g_aid_request_per_sta_address_present,
24996
  &hf_ieee80211_s1g_aid_request_service_characteristic_present,
24997
  &hf_ieee80211_s1g_aid_request_non_tim_mode_switch,
24998
  &hf_ieee80211_s1g_aid_request_tim_mode_switch,
24999
  &hf_ieee80211_s1g_aid_request_group_address_present,
25000
  &hf_ieee80211_s1g_aid_request_reserved,
25001
  NULL
25002
};
25003
25004
static int * const s1g_aid_request_characteristic_headers[] = {
25005
  &hf_ieee80211_s1g_aid_request_characteristic_sensor,
25006
  &hf_ieee80211_s1g_aid_request_characteristic_offload,
25007
  &hf_ieee80211_s1g_aid_request_characteristic_official_service,
25008
  &hf_ieee80211_s1g_aid_request_characteristic_reserved,
25009
  NULL
25010
};
25011
25012
static int
25013
dissect_aid_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25014
59
{
25015
59
  int offset = 0;
25016
59
  uint8_t mode = tvb_get_uint8(tvb, offset);
25017
25018
59
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25019
59
                                    hf_ieee80211_s1g_aid_request_mode,
25020
59
                                    ett_s1g_aid_request_mode,
25021
59
                                    s1g_aid_request_mode_headers,
25022
59
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25023
59
  offset += 1;
25024
25025
59
  if (mode & AID_REQUEST_INTERVAL_PRESENT) {
25026
17
    proto_tree_add_item(tree, hf_ieee80211_s1g_aid_request_interval, tvb,
25027
17
                        offset, 2, ENC_LITTLE_ENDIAN);
25028
17
    offset += 2;
25029
17
  }
25030
25031
59
  if (mode & PER_STA_ADDRESS_PRESENT) {
25032
29
    proto_tree_add_item(tree, hf_ieee80211_s1g_aid_req_peer_sta_addr, tvb,
25033
29
                        offset, 6, ENC_NA);
25034
29
    offset += 6;
25035
29
  }
25036
25037
59
  if (mode & SERVICE_CHARACTERISTIC_PRESENT) {
25038
15
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25039
15
                                      hf_ieee80211_s1g_aid_request_characteristic,
25040
15
                                      ett_s1g_aid_characteristic,
25041
15
                                      s1g_aid_request_characteristic_headers,
25042
15
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25043
15
    offset += 1;
25044
15
  }
25045
25046
59
  if (mode & GROUP_ADDRESS_PRESENT) {
25047
8
    proto_tree_add_item(tree, hf_ieee80211_s1g_aid_req_group_addr, tvb, offset,
25048
8
                        6, ENC_NA);
25049
8
    offset += 6;
25050
8
  }
25051
25052
59
  return offset;
25053
59
}
25054
25055
static int
25056
dissect_aid_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25057
26
{
25058
26
  int offset = 0;
25059
25060
26
  proto_tree_add_item(tree, hf_ieee80211_s1g_aid_rsp_aid_group_aid, tvb,
25061
26
                      offset, 2, ENC_LITTLE_ENDIAN);
25062
26
  offset += 2;
25063
25064
26
  proto_tree_add_item(tree, hf_ieee80211_s1g_aid_rsp_aid_switch_count,
25065
26
                      tvb, offset, 1, ENC_NA);
25066
26
  offset += 1;
25067
25068
26
  proto_tree_add_item(tree, hf_ieee80211_s1g_aid_rsp_aid_response_interval,
25069
26
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
25070
26
  offset += 2;
25071
25072
26
  return offset;
25073
26
}
25074
25075
static int * const s1g_sector_op_control_headers[] = {
25076
  &hf_ieee80211_s1g_sector_op_sectorization_type,
25077
  &hf_ieee80211_s1g_sector_op_period,
25078
  &hf_ieee80211_s1g_sector_op_omni,
25079
  NULL
25080
};
25081
25082
static int * const s1g_txop_sector_op_control_headers[] = {
25083
  &hf_ieee80211_s1g_sector_op_sectorization_type_b16,
25084
  &hf_ieee80211_s1g_sector_op_periodic_training_indicator,
25085
  &hf_ieee80211_s1g_sector_op_training_period,
25086
  &hf_ieee80211_s1g_sector_op_remaining_beacon_interval,
25087
  &hf_ieee80211_s1g_sector_op_reserved_b16,
25088
  NULL
25089
};
25090
25091
static const true_false_string sectorization_type_tfs = {
25092
  "Reserved",
25093
  "Group Sectorization Operation"
25094
};
25095
25096
static const true_false_string sectorization_omni_tfs = {
25097
  "Omnidirectional",
25098
  "Sectorized"
25099
};
25100
25101
static int
25102
dissect_s1g_sector_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25103
34
{
25104
34
  int offset = 0;
25105
34
  int len = 0;
25106
34
  uint8_t control = tvb_get_uint8(tvb, offset);
25107
25108
34
  if (control & 0x01) {
25109
9
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25110
9
                                    hf_ieee80211_s1g_sector_op_control_16b,
25111
9
                                    ett_s1g_sector_operation,
25112
9
                                    s1g_txop_sector_op_control_headers,
25113
9
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25114
25115
9
    offset += 2;
25116
25
  } else {
25117
25
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25118
25
                                    hf_ieee80211_s1g_sector_op_control,
25119
25
                                    ett_s1g_sector_operation,
25120
25
                                    s1g_sector_op_control_headers,
25121
25
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25122
25
    offset += 1;
25123
25
  }
25124
25125
  /* Break this out more */
25126
34
  len = tvb_reported_length_remaining(tvb, offset);
25127
34
  proto_tree_add_item(tree, hf_ieee80211_s1g_sector_op_group_info, tvb,
25128
34
                      offset, len, ENC_NA);
25129
34
  offset += len;
25130
25131
34
  return offset;
25132
34
}
25133
25134
static int
25135
dissect_s1g_beacon_compatibility(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25136
27
{
25137
27
  int offset = 0;
25138
25139
27
  proto_tree_add_item(tree, hf_ieee80211_s1g_beacon_compatibility_info, tvb,
25140
27
                      offset, 2, ENC_LITTLE_ENDIAN);
25141
27
  offset += 2;
25142
25143
27
  proto_tree_add_item(tree, hf_ieee80211_s1g_beacon_interval, tvb, offset,
25144
27
                      2, ENC_LITTLE_ENDIAN);
25145
27
  offset += 2;
25146
25147
27
  proto_tree_add_item(tree, hf_ieee80211_s1g_tsf_completion, tvb, offset,
25148
27
                      4, ENC_LITTLE_ENDIAN);
25149
27
  offset += 4;
25150
25151
27
  return offset;
25152
27
}
25153
25154
static int
25155
dissect_s1g_short_beacon_interval(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25156
19
{
25157
19
  int offset = 0;
25158
25159
19
   proto_tree_add_item(tree, hf_ieee80211_s1g_short_beacon_interval, tvb,
25160
19
                       offset, 2, ENC_LITTLE_ENDIAN);
25161
19
   offset += 2;
25162
25163
19
   return offset;
25164
19
}
25165
25166
static int
25167
dissect_s1g_change_sequence(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25168
21
{
25169
21
  int offset = 0;
25170
25171
21
  proto_tree_add_item(tree, hf_ieee80211_s1g_change_sequence, tvb, offset, 1,
25172
21
                      ENC_NA);
25173
21
  offset += 1;
25174
25175
21
  return offset;
25176
21
}
25177
25178
static int
25179
dissect_authentication_control(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25180
27
{
25181
27
  int offset = 0;
25182
27
  uint16_t control_params = tvb_get_letohs(tvb, offset);
25183
27
  proto_tree *auth_tree = NULL;
25184
25185
27
  if ((control_params & 0x0001) == 0) {
25186
18
    auth_tree = proto_tree_add_subtree(tree, tvb, offset, 2,
25187
18
                        ett_ieee80211_s1g_auth_control,
25188
18
                        NULL,
25189
18
                        "Centralized Authentication Control Parameters");
25190
18
  } else {
25191
9
    auth_tree = proto_tree_add_subtree(tree, tvb, offset, 3,
25192
9
                        ett_ieee80211_s1g_auth_control,
25193
9
                        NULL,
25194
9
                        "Distributed Authentication Control Parameters");
25195
9
  }
25196
25197
27
  if ((control_params & 0x0001) == 0) { /* This is all there should be here */
25198
18
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_control_control,
25199
18
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
25200
18
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_control_deferral,
25201
18
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
25202
18
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_control_reserved,
25203
18
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
25204
25205
18
    if ((control_params & 0x0002) == 0) { /* Deferral or not */
25206
5
      proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_control_thresh,
25207
5
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
25208
13
    } else {
25209
13
      proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_control_thresh_tus,
25210
13
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
25211
13
    }
25212
18
    offset += 2;
25213
18
  } else {
25214
9
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_control_control,
25215
9
                        tvb, offset, 3, ENC_LITTLE_ENDIAN);
25216
9
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_slot_duration, tvb,
25217
9
                        offset, 3, ENC_LITTLE_ENDIAN);
25218
9
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_max_trans_int, tvb,
25219
9
                        offset, 3, ENC_LITTLE_ENDIAN);
25220
9
    proto_tree_add_item(auth_tree, hf_ieee80211_s1g_auth_min_trans_int, tvb,
25221
9
                        offset, 3, ENC_LITTLE_ENDIAN);
25222
9
    offset += 3;
25223
9
  }
25224
27
  return offset;
25225
27
}
25226
25227
static int
25228
dissect_tsf_timer_accuracy(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25229
31
{
25230
31
  int offset = 0;
25231
25232
31
  proto_tree_add_item(tree, hf_ieee80211_s1g_tsf_timer_accuracy, tvb, offset,
25233
31
                      1, ENC_NA);
25234
31
  offset += 1;
25235
25236
31
  return offset;
25237
31
}
25238
25239
static int * const relay_control_headers[] = {
25240
  &hf_ieee80211_s1g_relay_hierarchy_identifier,
25241
  &hf_ieee80211_s1g_relay_no_more_relay_flag,
25242
  NULL
25243
};
25244
25245
static const range_string relay_hierarchy_rstrs[] = {
25246
  { 0, 0,   "Root AP" },
25247
  { 1, 1,   "S1G Relay AP" },
25248
  { 2, 127, "Reserved" },
25249
  { 0, 0,   NULL }
25250
};
25251
25252
static const true_false_string no_more_relay_flag_tfs = {
25253
  "AP does not accept any requests for relaying",
25254
  "AP does accept requests for relaying"
25255
};
25256
25257
static int
25258
dissect_s1g_relay(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25259
52
{
25260
52
  int offset = 0;
25261
52
  uint8_t relay_control = tvb_get_uint8(tvb, offset);
25262
25263
52
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25264
52
                                    hf_ieee80211_s1g_relay_control,
25265
52
                                    ett_s1g_relay_control,
25266
52
                                    relay_control_headers,
25267
52
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25268
52
  offset += 1;
25269
52
  if ((relay_control & 0x7F) == 1) {
25270
10
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_rootap_bssid,
25271
10
                        tvb, offset, 6, ENC_NA);
25272
10
    offset += 6;
25273
10
  }
25274
25275
52
  return offset;
25276
52
}
25277
25278
static const true_false_string relay_activation_mode_tfs = {
25279
  "Relay Activation Request",
25280
  "Relay Activation Response"
25281
};
25282
25283
static const true_false_string relay_direction_tfs = {
25284
  "Sent by an AP",
25285
  "Sent by a non-AP STA"
25286
};
25287
25288
static unsigned relay_function_field;
25289
25290
static void
25291
enable_relay_function_custom(char *result, uint8_t enable_relay_function)
25292
0
{
25293
0
  switch (relay_function_field & 0x03) {
25294
0
  case 0x00: /* Relay Activation Mode == 0 && Direction == 0 */
25295
0
    if (enable_relay_function)
25296
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "non-AP STA activates its relay function");
25297
0
    else
25298
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "non-AP STA terminates its relay function");
25299
0
    break;
25300
0
  case 0x01: /* Relay Activation Mode == 1 && Direction == 0 */
25301
0
    if (enable_relay_function)
25302
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "non-AP STA requests to activate relay function");
25303
0
    else
25304
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "non-AP STA requests to terminate relay function");
25305
0
    break;
25306
0
  case 0x02: /* Relay Activation Mode == 0 && Direction == 1 */
25307
0
    if (enable_relay_function)
25308
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "non-AP STA is allowed to operate as a relay");
25309
0
    else
25310
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "non-AP STA must not operate as a relay");
25311
0
    break;
25312
0
  case 0x03: /* Relay Activation Mode == 1 && Direction == 1 */
25313
0
    if (enable_relay_function)
25314
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Non-AP STA can operate as a relay");
25315
0
    else
25316
0
      snprintf(result, ITEM_LABEL_LENGTH, "%s", "Non-AP STA must terminate relay function");
25317
0
    break;
25318
0
  }
25319
0
}
25320
25321
static int
25322
dissect_s1g_relay_activation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25323
41
{
25324
41
  int offset = 0;
25325
41
  proto_tree *relay_activ = NULL;
25326
25327
41
  relay_function_field = tvb_get_uint8(tvb, offset);
25328
25329
41
  relay_activ = proto_tree_add_subtree_format(tree, tvb, offset, 1,
25330
41
                                       ett_s1g_relay_function,
25331
41
                                       NULL, "Relay Activation: 0x%0x",
25332
41
                                       relay_function_field);
25333
25334
41
  proto_tree_add_item(relay_activ,
25335
41
                      hf_ieee80211_s1g_relay_function_activation_mode, tvb,
25336
41
                      offset, 1, ENC_NA);
25337
41
  proto_tree_add_item(relay_activ, hf_ieee80211_s1g_relay_function_direction,
25338
41
                      tvb, offset, 1, ENC_NA);
25339
41
  proto_tree_add_item(relay_activ,
25340
41
                      hf_ieee80211_s1g_relay_function_enable_relay_function,
25341
41
                      tvb, offset, 1, ENC_NA);
25342
41
  proto_tree_add_item(relay_activ,
25343
41
                      hf_ieee80211_s1g_relay_function_stas_present_indic,
25344
41
                      tvb, offset, 1, ENC_NA);
25345
41
  proto_tree_add_item(relay_activ, hf_ieee80211_s1g_relay_function_reserved,
25346
41
                      tvb, offset, 1, ENC_NA);
25347
41
  offset += 1;
25348
25349
41
  if (relay_function_field & 0x04) {
25350
20
    proto_tree_add_item(tree, hf_ieee80211_s1g_number_of_stas, tvb, offset,
25351
20
                        1, ENC_NA);
25352
20
    offset += 1;
25353
20
  }
25354
25355
41
  return offset;
25356
41
}
25357
25358
static const true_false_string reachable_address_add_remove_tfs = {
25359
  "STA joining the relay",
25360
  "STA leaving the relay"
25361
};
25362
25363
static int
25364
dissect_reachable_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25365
37
{
25366
37
  int offset = 0;
25367
37
  proto_tree *reach_list = NULL;
25368
37
  uint8_t addr_count = 0, addr_num = 0;
25369
25370
37
  proto_tree_add_item(tree, hf_ieee80211_s1g_initiator_mac_address, tvb,
25371
37
                      offset, 6, ENC_NA);
25372
37
  offset += 6;
25373
25374
37
  addr_count = tvb_get_uint8(tvb, offset);
25375
37
  proto_tree_add_item(tree, hf_ieee80211_s1g_address_count, tvb, offset, 1,
25376
37
                      ENC_NA);
25377
37
  offset++;
25378
25379
37
  reach_list = proto_tree_add_subtree(tree, tvb, offset, 7 * addr_count,
25380
37
                                      ett_ieee80211_s1g_addr_list,
25381
37
                                      NULL, "Reachable Addresses");
25382
312
  while (addr_count != 0) {
25383
275
    proto_tree *reach_addr = NULL;
25384
25385
275
    reach_addr = proto_tree_add_subtree_format(reach_list, tvb, offset, 7,
25386
275
                                        ett_ieee80211_s1g_reach_addr,
25387
275
                                        NULL, "Reachable Address %u", addr_num);
25388
25389
275
    proto_tree_add_item(reach_addr, hf_ieee80211_s1g_reachable_add_remove,
25390
275
                        tvb, offset, 1, ENC_NA);
25391
275
    proto_tree_add_item(reach_addr, hf_ieee80211_s1g_reachable_relay_capable,
25392
275
                        tvb, offset, 1, ENC_NA);
25393
275
    proto_tree_add_item(reach_addr, hf_ieee80211_s1g_reachable_reserved,
25394
275
                        tvb, offset, 1, ENC_NA);
25395
275
    offset += 1;
25396
25397
275
    proto_tree_add_item(reach_addr, hf_ieee80211_s1g_reachable_mac_address,
25398
275
                        tvb, offset, 6, ENC_NA);
25399
275
    offset += 6;
25400
25401
275
    addr_num++;
25402
275
    addr_count--;
25403
275
  }
25404
37
  return offset;
25405
37
}
25406
25407
static int * const relay_discovery_control_headers[] = {
25408
  &hf_ieee80211_s1g_min_data_rate_included,
25409
  &hf_ieee80211_s1g_mean_data_rate_included,
25410
  &hf_ieee80211_s1g_max_data_rate_included,
25411
  &hf_ieee80211_s1g_delay_and_min_phy_rate,
25412
  &hf_ieee80211_s1g_information_not_available,
25413
  &hf_ieee80211_s1g_relay_discovery_reserved,
25414
  NULL
25415
};
25416
25417
static int
25418
dissect_s1g_relay_discovery(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25419
63
{
25420
63
  int offset = 0;
25421
63
  uint8_t relay_discovery_control = tvb_get_uint8(tvb, offset);
25422
25423
63
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25424
63
                                    hf_ieee80211_s1g_relay_discovery_control,
25425
63
                                    ett_s1g_relay_discovery_control,
25426
63
                                    relay_discovery_control_headers,
25427
63
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25428
63
  offset += 1;
25429
25430
63
  if (relay_discovery_control & 0x01) {
25431
17
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_ul_min, tvb,
25432
17
                        offset, 1, ENC_NA);
25433
17
    offset += 1;
25434
17
  }
25435
25436
63
  if (relay_discovery_control & 0x02) {
25437
41
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_ul_mean, tvb,
25438
41
                        offset, 1, ENC_NA);
25439
41
    offset += 1;
25440
41
  }
25441
25442
63
  if (relay_discovery_control & 0x04) {
25443
18
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_ul_max, tvb,
25444
18
                        offset, 1, ENC_NA);
25445
18
    offset += 1;
25446
18
  }
25447
25448
63
  if (relay_discovery_control & 0x01) {
25449
17
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_dl_min, tvb,
25450
17
                        offset, 1, ENC_NA);
25451
17
    offset += 1;
25452
17
  }
25453
25454
63
  if (relay_discovery_control & 0x02) {
25455
41
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_dl_mean, tvb,
25456
41
                        offset, 1, ENC_NA);
25457
41
    offset += 1;
25458
41
  }
25459
25460
63
  if (relay_discovery_control & 0x04) {
25461
18
    proto_tree_add_item(tree, hf_ieee80211_s1g_relay_control_dl_max, tvb,
25462
18
                        offset, 1, ENC_NA);
25463
18
    offset += 1;
25464
18
  }
25465
25466
63
  if (relay_discovery_control & 0x08) {
25467
25468
16
  }
25469
25470
63
  return offset;
25471
63
}
25472
25473
static int
25474
dissect_aid_announcement(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25475
79
{
25476
79
  int offset = 0;
25477
79
  int entry_no = 0;
25478
25479
  /*
25480
   * There should be 8N bytes ...
25481
   */
25482
752
  while (tvb_reported_length_remaining(tvb, offset) >= 8) {
25483
673
    proto_tree *aid_entry = NULL;
25484
25485
673
    aid_entry = proto_tree_add_subtree_format(tree, tvb, offset, 8,
25486
673
                                ett_ieee80211_s1g_aid_entry,
25487
673
                                NULL, "AID Entry %d", entry_no++);
25488
673
    proto_tree_add_item(aid_entry, hf_ieee80211_s1g_aid_entry_mac_addr,
25489
673
                        tvb, offset, 6, ENC_NA);
25490
673
    offset += 6;
25491
25492
673
    proto_tree_add_item(aid_entry, hf_ieee80211_s1g_aid_entry_assoc_id,
25493
673
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
25494
673
    offset += 2;
25495
673
  }
25496
25497
  /* TODO: EI if bytes remaining. */
25498
25499
79
  return offset;
25500
79
}
25501
25502
static int * const subfield_0[] = {
25503
  &hf_ieee80211_pv1_probe_response_req_full_ssid,
25504
  &hf_ieee80211_pv1_probe_response_req_next_tbtt,
25505
  &hf_ieee80211_pv1_probe_response_req_access_network_option,
25506
  &hf_ieee80211_pv1_probe_response_req_s1g_beacon_compatibility,
25507
  &hf_ieee80211_pv1_probe_response_req_supported_rates,
25508
  &hf_ieee80211_pv1_probe_response_req_s1g_capability,
25509
  &hf_ieee80211_pv1_probe_response_req_s1g_operation,
25510
  &hf_ieee80211_pv1_probe_response_req_rsn,
25511
  NULL
25512
};
25513
25514
static int
25515
dissect_pv1_probe_response_option(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25516
40
{
25517
40
  int offset = 0;
25518
25519
  /*
25520
   * TODO: Check that the number of bytes matches what the probe response
25521
   * group bitmap says should be there.
25522
   */
25523
40
  if (tvb_reported_length_remaining(tvb, offset) == 1) {
25524
3
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25525
3
                                    hf_ieee80211_s1g_probe_resp_subfield_0,
25526
3
                                    ett_s1g_probe_resp_subfield_0,
25527
3
                                    subfield_0,
25528
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25529
3
    offset += 1;
25530
37
  } else if (tvb_reported_length_remaining(tvb, offset) > 1) {
25531
27
    uint8_t opt_bitmaps = tvb_get_uint8(tvb, offset);
25532
25533
27
    proto_tree_add_item(tree, hf_ieee80211_s1g_probe_response_group_bitmap,
25534
27
                        tvb, offset, 1, ENC_NA);
25535
27
    offset += 1;
25536
27
    if (opt_bitmaps & 0x01) { /* Default Bitmap */
25537
19
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25538
19
                                    hf_ieee80211_s1g_probe_resp_subfield_0,
25539
19
                                    ett_s1g_probe_resp_subfield_0,
25540
19
                                    subfield_0,
25541
19
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25542
19
      offset += 1;
25543
19
    }
25544
27
  }
25545
25546
40
  return offset;
25547
40
}
25548
25549
static void
25550
s1g_max_awake_duration_custom(char *result, uint16_t duration)
25551
0
{
25552
0
  if (duration == 0)
25553
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s", "No limit applies");
25554
0
  else
25555
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d uS", (int)duration * 40);
25556
0
}
25557
25558
static void
25559
s1g_recovery_time_duration_custom(char *result, uint16_t duration)
25560
0
{
25561
0
  snprintf(result, ITEM_LABEL_LENGTH, "%d uS", (int)duration * 40);
25562
0
}
25563
25564
static int
25565
dissect_el_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25566
24
{
25567
24
  int offset = 0;
25568
25569
24
  proto_tree_add_item(tree, hf_ieee80211_s1g_el_op_max_awake_duration, tvb,
25570
24
                      offset, 2, ENC_LITTLE_ENDIAN);
25571
24
  offset += 2;
25572
25573
24
  proto_tree_add_item(tree, hf_ieee80211_s1g_el_op_recovery_time_duration, tvb,
25574
24
                      offset, 2, ENC_LITTLE_ENDIAN);
25575
24
  offset += 2;
25576
25577
24
  return offset;
25578
24
}
25579
25580
static int
25581
dissect_sectorized_group_id_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25582
27
{
25583
27
  int offset = 0;
25584
27
  int len = tvb_reported_length_remaining(tvb, offset);
25585
25586
  /* Break this out some more */
25587
27
  proto_tree_add_item(tree, hf_ieee80211_s1g_sectorized_group_id_list, tvb,
25588
27
                      offset, len, ENC_NA);
25589
27
  offset += len;
25590
25591
27
  return offset;
25592
27
}
25593
25594
static int * const channel_width_fields[] = {
25595
  &hf_ieee80211_s1g_primary_channel_width,
25596
  &hf_ieee80211_s1g_bss_operating_channel_width,
25597
  &hf_ieee80211_s1g_primary_channel_location,
25598
  &hf_ieee80211_s1g_reserved_b6,
25599
  &hf_ieee80211_s1g_mcs10_use,
25600
  NULL
25601
};
25602
25603
static const value_string one_mhz_primary_channel_vals[] = {
25604
  { 0, "1 MHz BSS operating channel width" },
25605
  { 1, "2 MHz BSS operating channel width" },
25606
  { 3, "4 MHz BSS operating channel width" },
25607
  { 7, "8 MHz BSS operating channel width" },
25608
  { 15, "16 MHz BSS operating channel width" },
25609
  { 0, NULL },
25610
};
25611
25612
static const value_string two_mhz_primary_channel_vals[] = {
25613
  { 1, "2 MHz BSS operating channel width" },
25614
  { 3, "4 MHz BSS operating channel width" },
25615
  { 7, "8 MHz BSS operating channel width" },
25616
  { 15, "16 MHz BSS operating channel width" },
25617
  { 0, NULL },
25618
};
25619
25620
static const value_string primary_channel_width_vals[] = {
25621
  { 0, "2MHz BSS Primary Channel Width" },
25622
  { 1, "1MHz BSS Primary Channel Width" },
25623
  { 0, NULL }
25624
};
25625
25626
static const value_string one_mhz_primary_channel_location_vals[] = {
25627
  { 0, "Located on lower side of 2MHz primary channel" },
25628
  { 1, "Located on upper side of 2MHz primary channel" },
25629
  { 0, NULL }
25630
};
25631
25632
static const value_string mcs10_use_vals[] = {
25633
  { 0, "Use of MCS10 possible" },
25634
  { 1, "Use of MCS10 not recommended" },
25635
  { 0, NULL }
25636
};
25637
25638
static int
25639
dissect_s1g_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25640
28
{
25641
28
  int offset = 0;
25642
28
  proto_tree *s1g_op_info = NULL;
25643
28
  proto_item *cw_item = NULL;
25644
28
  uint8_t chan_width = 0;
25645
25646
28
  s1g_op_info = proto_tree_add_subtree(tree, tvb, offset, 4,
25647
28
                         ett_s1g_operation_info,
25648
28
                         NULL, "S1G Operation Information");
25649
25650
28
  chan_width = tvb_get_uint8(tvb, offset);
25651
28
  cw_item = proto_tree_add_bitmask_with_flags(s1g_op_info, tvb, offset,
25652
28
                                    hf_ieee80211_s1g_channel_width,
25653
28
                                    ett_s1g_channel_width,
25654
28
                                    channel_width_fields,
25655
28
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25656
28
  if (chan_width & 0x01) {
25657
16
        proto_item_append_text(cw_item, ": %s",
25658
16
                               val_to_str((chan_width >> 1) & 0x0F,
25659
16
                                          one_mhz_primary_channel_vals,
25660
16
                                          "Invalid BSS Channel Width value"));
25661
16
  } else {
25662
12
        proto_item_append_text(cw_item, ": %s",
25663
12
                               val_to_str((chan_width >> 1) & 0x0F,
25664
12
                                          two_mhz_primary_channel_vals,
25665
12
                                          "Invalid BSS Channel Width value"));
25666
12
  }
25667
28
  offset += 1;
25668
25669
28
  proto_tree_add_item(s1g_op_info, hf_ieee80211_s1g_operating_class, tvb,
25670
28
                      offset, 1, ENC_NA);
25671
28
  offset += 1;
25672
25673
28
  proto_tree_add_item(s1g_op_info, hf_ieee80211_s1g_primary_channel_number, tvb,
25674
28
                      offset, 1, ENC_NA);
25675
28
  offset += 1;
25676
25677
28
  proto_tree_add_item(s1g_op_info, hf_ieee80211_s1g_channel_center_frequency,
25678
28
                      tvb, offset, 1, ENC_NA);
25679
28
  offset += 1;
25680
25681
28
  proto_tree_add_item(s1g_op_info, hf_ieee80211_s1g_basic_mcs_and_nss_set,
25682
28
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
25683
28
  offset += 2;
25684
25685
28
  return offset;
25686
28
}
25687
25688
49
#define HEADER_COMP_STORE_A3    0x02
25689
49
#define HEADER_COMP_STORE_A4    0x04
25690
49
#define HEADER_COMP_CCMP_UPDATE 0x08
25691
25692
static int * const header_compression_control_headers[] = {
25693
  &hf_ieee80211_s1g_header_comp_req_resp,
25694
  &hf_ieee80211_s1g_header_comp_store_a3,
25695
  &hf_ieee80211_s1g_header_comp_store_a4,
25696
  &hf_ieee80211_s1g_header_comp_ccmp_update_present,
25697
  &hf_ieee80211_s1g_header_comp_pv1_data_type_3_supported,
25698
  &hf_ieee80211_s1g_header_comp_reserved,
25699
  NULL
25700
};
25701
25702
static int
25703
dissect_header_compression(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25704
49
{
25705
49
  int offset = 0;
25706
49
  uint8_t control = tvb_get_uint8(tvb, offset);
25707
25708
49
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
25709
49
                                    hf_ieee80211_s1g_header_comp_control,
25710
49
                                    ett_s1g_header_comp_control,
25711
49
                                    header_compression_control_headers,
25712
49
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25713
49
  offset += 1;
25714
25715
49
  if (control & HEADER_COMP_STORE_A3) {
25716
5
    proto_tree_add_item(tree, hf_ieee80211_s1g_header_comp_a3, tvb,
25717
5
                        offset, 6, ENC_NA);
25718
5
    offset += 6;
25719
5
  }
25720
25721
49
  if (control & HEADER_COMP_STORE_A4) {
25722
15
    proto_tree_add_item(tree, hf_ieee80211_s1g_header_comp_a4, tvb,
25723
15
                        offset, 6, ENC_NA);
25724
15
    offset += 6;
25725
15
  }
25726
25727
  /* TODO: Break this out */
25728
49
  if (control & HEADER_COMP_CCMP_UPDATE) {
25729
23
    proto_tree_add_item(tree, hf_ieee80211_s1g_header_comp_ccmp_update, tvb,
25730
23
                        offset, 5, ENC_NA);
25731
23
    offset += 5;
25732
23
  }
25733
25734
49
  return offset;
25735
49
}
25736
25737
static const value_string sst_channel_unit_vals[] = {
25738
  { 0, "Channel Width Unit is 2 MHz" },
25739
  { 1, "Channel Width Unit is 1 MHz" },
25740
  { 0, NULL }
25741
};
25742
25743
static int
25744
dissect_sst_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25745
25
{
25746
25
  int offset = 0;
25747
25748
25
  proto_tree_add_item(tree, hf_ieee80211_s1g_sst_enabled_channel_bitmap, tvb,
25749
25
                      offset, 1, ENC_NA);
25750
25
  offset += 1;
25751
25752
25
  proto_tree_add_item(tree, hf_ieee80211_s1g_sst_primary_channel_offset, tvb,
25753
25
                      offset, 1, ENC_NA);
25754
25
  proto_tree_add_item(tree, hf_ieee80211_s1g_sst_channel_unit, tvb, offset,
25755
25
                      1, ENC_NA);
25756
25
  proto_tree_add_item(tree, hf_ieee80211_s1g_sst_reserved, tvb, offset, 1,
25757
25
                      ENC_NA);
25758
25
  offset += 1;
25759
25760
25
  return offset;
25761
25
}
25762
25763
static int
25764
dissect_max_away_duration(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
25765
23
{
25766
23
  int offset = 0;
25767
25768
23
  proto_tree_add_item(tree, hf_ieee80211_s1g_max_away_duration, tvb, offset,
25769
23
                      2, ENC_LITTLE_ENDIAN);
25770
23
  offset += 2;
25771
25772
23
  return offset;
25773
23
}
25774
25775
static int
25776
dissect_mcs_set(proto_tree *tree, tvbuff_t *tvb, int offset, bool basic, bool vendorspecific)
25777
134
{
25778
134
  proto_item *ti;
25779
134
  proto_tree *mcs_tree, *bit_tree;
25780
134
  uint8_t rx_nss, tx_nss; /* 0-4 for HT and 0-8 for VHT*/
25781
134
  uint32_t value_mcs_0_31, value_mcs_32_52, value_mcs_53_76;
25782
134
  uint16_t tx_mcs_set;
25783
134
  rx_nss = tx_nss = 8;
25784
  /* 16 byte Supported MCS set */
25785
134
  if (vendorspecific)
25786
0
  {
25787
0
    ti = proto_tree_add_item(tree, hf_ieee80211_mcsset_vs, tvb, offset, 16, ENC_NA);
25788
0
  } else
25789
134
  {
25790
134
    ti = proto_tree_add_item(tree, hf_ieee80211_mcsset, tvb, offset, 16, ENC_NA);
25791
134
  }
25792
134
  proto_item_append_text(ti, ": %s", basic ? "Basic MCS Set" : "MCS Set");
25793
134
  mcs_tree = proto_item_add_subtree(ti, ett_mcsset_tree);
25794
25795
  /* Rx MCS Bitmask */
25796
134
  ti = proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_rx_bitmask, tvb, offset, 10, ENC_NA);
25797
134
  bit_tree = proto_item_add_subtree(ti, ett_mcsbit_tree);
25798
25799
  /* Bits 0 - 31 */
25800
134
  value_mcs_0_31 = tvb_get_letohl(tvb, offset);
25801
25802
  /* Handle all zeroes/ff's case..*/
25803
134
  if (value_mcs_0_31 != 0x0)
25804
114
  {
25805
114
    if (!(value_mcs_0_31 & (0xffffff00))) {
25806
      /*
25807
       * At least one MCS from 0-7 is supported, but no MCS from 8-31 are
25808
       * supported, so only 1 spatial stream is supported.
25809
       */
25810
8
      rx_nss = 0;
25811
106
    } else if (!(value_mcs_0_31 & (0xffff0000))) {
25812
      /*
25813
       * At least one MCS from 8-15 is supported, but no MCS from 16-31 are
25814
       * supported, so only 2 spatial streams are supported.
25815
       */
25816
10
      rx_nss = 1;
25817
96
    } else if (!(value_mcs_0_31 & (0xff000000))) {
25818
      /*
25819
       * At least one MCS from 16-23 is supported, but no MCS from 24-31 are
25820
       * supported, so only 3 spatial streams are supported.
25821
       */
25822
17
      rx_nss = 2;
25823
79
    } else {
25824
      /*
25825
       * At least one MCS from 24-31 is supported, so 4 spatial streams
25826
       * are supported.
25827
       */
25828
79
      rx_nss = 3;
25829
79
    }
25830
114
  }
25831
25832
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_0to7, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25833
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_8to15, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25834
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_16to23, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25835
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_24to31, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25836
134
  offset += 4;
25837
25838
  /* Should be we check UEQM Supported?*/
25839
  /* Bits 32 - 52 */
25840
134
  value_mcs_32_52 = tvb_get_letohl(tvb, offset);
25841
134
  if (!(value_mcs_32_52 & (0x1ffffe))) {
25842
    /*
25843
     * MCS 33-52 aren't supported, so the number of spatial streams we get
25844
     * from whichever MCSes from 0-31 that we support is the total number
25845
     * of spatial streams we support.
25846
     */
25847
32
    ;
25848
102
  } else if (!(value_mcs_32_52 & (0x1fff80))) {
25849
    /*
25850
     * At least one MCS from 33-38 is supported, but no MCS from 39-52 is
25851
     * supported, so we have at least 2 spatial streams, but none of the
25852
     * MCSs in that range give us any more.
25853
     */
25854
9
    rx_nss = MAX(1, rx_nss);
25855
93
  } else {
25856
    /*
25857
     * At least one MCS from 39-52 is supported, so we have at least 3
25858
     * spatial streams.
25859
     */
25860
93
    rx_nss = MAX(2, rx_nss);
25861
93
  }
25862
25863
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_32, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25864
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_33to38, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25865
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_39to52, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25866
134
  offset += 2;
25867
25868
  /* Bits 53 - 76 */
25869
134
  value_mcs_53_76 = tvb_get_letohl(tvb, offset);
25870
134
  if ((value_mcs_53_76 & (0x1fffffe0))) {
25871
    /*
25872
     * At least one MCS from 53-76 is supported, so we have at least 4
25873
     * spatial streams.
25874
     */
25875
108
    rx_nss = MAX(3, rx_nss);
25876
108
  }
25877
25878
134
  proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_53to76, tvb, offset, 4, ENC_LITTLE_ENDIAN);
25879
134
  offset += 4;
25880
25881
134
  proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_highest_data_rate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
25882
134
  offset += 2;
25883
25884
  /* Follow table 8-126 from 802.11-2012 */
25885
134
  tx_mcs_set = tvb_get_letohs(tvb, offset);
25886
25887
134
  if (!(tx_mcs_set & 0x0001) && !(tx_mcs_set & 0x0002))
25888
39
  {
25889
    /* TX MCS Set is not defined
25890
     * so there is no interpretation for Max Tx Spatial Streams
25891
     */
25892
39
     tx_nss = 4; /* Not Defined*/
25893
39
  }
25894
25895
134
  if ((tx_mcs_set & 0x0001) && !(tx_mcs_set & 0x0002))
25896
55
  {
25897
    /* TX MCS Set is defined to be equal to Rx MCS Set
25898
     * So, get the Max Spatial Streams from Rx
25899
     * MCS set
25900
     */
25901
55
     tx_nss = rx_nss;
25902
55
  }
25903
134
  proto_item_append_text(ti, ": %s", val_to_str(rx_nss, mcsset_tx_max_spatial_streams_flags, "Reserved:%d" ) );
25904
25905
134
  proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_mcs_set_defined, tvb, offset, 1,
25906
134
      ENC_LITTLE_ENDIAN);
25907
134
  proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal, tvb, offset, 1,
25908
134
      ENC_LITTLE_ENDIAN);
25909
134
  ti = proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_max_spatial_streams, tvb, offset, 1,
25910
134
      ENC_LITTLE_ENDIAN);
25911
134
  proto_item_append_text(ti, ", %s", val_to_str(tx_nss, mcsset_tx_max_spatial_streams_flags, "Reserved:%d" ) );
25912
134
  proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_unequal_modulation, tvb, offset, 1,
25913
134
      ENC_LITTLE_ENDIAN);
25914
134
  offset += 1;
25915
25916
134
  offset += 3;
25917
134
  return offset;
25918
134
}
25919
25920
/*  802.11n - HT Operation IE  */
25921
static int
25922
dissect_ht_operation_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
25923
260
{
25924
260
  int tag_len = tvb_reported_length(tvb);
25925
260
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
25926
260
  int offset = 0;
25927
260
  static int * const ieee80211_ht_operation_info1_field[] = {
25928
260
    &hf_ieee80211_ht_operation_info_secondary_channel_offset,
25929
260
    &hf_ieee80211_ht_operation_info_sta_channel_width,
25930
260
    &hf_ieee80211_ht_operation_info_rifs_mode,
25931
260
    &hf_ieee80211_ht_operation_info_reserved_b4_b7,
25932
260
    NULL
25933
260
  };
25934
25935
260
  static int * const ieee80211_ht_operation_info2_field[] = {
25936
260
    &hf_ieee80211_ht_operation_info_protection,
25937
260
    &hf_ieee80211_ht_operation_info_non_greenfield_sta_present,
25938
260
    &hf_ieee80211_ht_operation_info_reserved_b11,
25939
260
    &hf_ieee80211_ht_operation_info_obss_non_ht_stas_present,
25940
260
    &hf_ieee80211_ht_operation_info_channel_center_freq_seg_2,
25941
260
    &hf_ieee80211_ht_operation_info_reserved_b21_b23,
25942
260
    NULL
25943
260
  };
25944
25945
260
  static int * const ieee80211_ht_operation_info3_field[] = {
25946
260
    &hf_ieee80211_ht_operation_info_reserved_b24_b29,
25947
260
    &hf_ieee80211_ht_operation_info_dual_beacon,
25948
260
    &hf_ieee80211_ht_operation_info_dual_cts_protection,
25949
260
    &hf_ieee80211_ht_operation_info_stbc_beacon,
25950
260
    &hf_ieee80211_ht_operation_info_reserved_b33_b39,
25951
260
    NULL
25952
260
  };
25953
25954
260
  if (tag_len < 22) {
25955
47
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
25956
47
                           "HT Operation IE content length %u wrong, must be at least 22 bytes", tag_len);
25957
47
    return 1;
25958
47
  }
25959
25960
213
  proto_tree_add_item(tree, hf_ieee80211_ht_operation_primary_channel, tvb, offset, 1, ENC_LITTLE_ENDIAN);
25961
213
  offset += 1;
25962
25963
213
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_operation_info_delimiter1,
25964
213
                                    ett_ht_operation_info_delimiter1_tree, ieee80211_ht_operation_info1_field,
25965
213
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25966
213
  offset += 1;
25967
25968
25969
213
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_operation_info_delimiter2,
25970
213
                                    ett_ht_operation_info_delimiter2_tree, ieee80211_ht_operation_info2_field,
25971
213
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25972
213
  offset += 2;
25973
25974
213
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_operation_info_delimiter3,
25975
213
                                    ett_ht_operation_info_delimiter3_tree, ieee80211_ht_operation_info3_field,
25976
213
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
25977
213
  offset += 2;
25978
25979
  /* Basic HT-MCS Set present in Beacon, Probe Response, Mesh Peering Open and Mesh Peering
25980
   * Confirm frames. Otherwise reserved.
25981
   */
25982
213
  if ((field_data->ftype && (field_data->ftype == MGT_BEACON || field_data->ftype == MGT_PROBE_RESP)) ||
25983
213
      (field_data->sanity_check && field_data->sanity_check->ampe_frame &&
25984
79
       (field_data->sanity_check->ampe_frame == SELFPROT_ACTION_MESH_PEERING_OPEN ||
25985
134
        field_data->sanity_check->ampe_frame == SELFPROT_ACTION_MESH_PEERING_CONFIRM))) {
25986
134
    offset = dissect_mcs_set(tree, tvb, offset, true, false);
25987
134
  } else {
25988
79
    proto_tree_add_item(tree, hf_ieee80211_ht_operation_mcsset_reserved,
25989
79
                        tvb, offset, 16, ENC_NA);
25990
79
    offset += 16;
25991
79
  }
25992
25993
213
  return offset;
25994
260
}
25995
25996
static int
25997
dissect_wapi_param_set(tvbuff_t *tvb, packet_info *pinfo,
25998
                          proto_tree *tree, int offset, uint32_t tag_len, proto_item *ti_len,
25999
                          proto_item *ti, int ftype)
26000
53
{
26001
  /* Parse the WAPI Parameter Set IE Here*/
26002
53
  proto_item *item;
26003
53
  proto_tree *subtree;
26004
53
  uint16_t loop_cnt, version, akm_cnt  = 1, ucast_cnt = 1, bkid_cnt = 1;
26005
53
  uint8_t akm_suite_type = 0, ucast_cipher_type = 0, mcast_cipher_type = 0;
26006
53
  static int * const ieee80211_tag_wapi_param_set[] = {
26007
53
    &hf_ieee80211_tag_wapi_param_set_capab_preauth,
26008
53
    &hf_ieee80211_tag_wapi_param_set_capab_rsvd,
26009
53
    NULL
26010
53
  };
26011
26012
53
  version = tvb_get_letohs(tvb, offset);
26013
53
  proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26014
53
  offset += 2;
26015
26016
  /*MIN: 2 + (2+4)+ (2+4) + 4 + 2 + 0 (BKID CNT and LIST)  =20*/
26017
53
  if (tag_len < 20) {
26018
0
      expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
26019
0
                "tag_len is  %d, it's neither WAPI not BSS-AC-Access-Delay", tag_len);
26020
0
    return offset;
26021
0
  }
26022
26023
53
  if (version != 1) {
26024
44
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
26025
44
                           "Version of WAPI protocol is %d, must be = 1", version);
26026
44
    return offset;
26027
44
  }
26028
26029
  /* AKM Suites: list can't be 0*/
26030
9
  akm_cnt = tvb_get_letohs(tvb, offset);
26031
9
  item = proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_akm_suite_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26032
9
  offset += 2;
26033
9
  if (akm_cnt != 0) {
26034
7
    proto_item_append_text(ti, " : AKM Suite List:");
26035
78
    for (loop_cnt = 0; loop_cnt < akm_cnt; loop_cnt++) {
26036
71
      subtree = proto_item_add_subtree(item, ett_tag_wapi_param_set_akm_tree);
26037
71
      proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_akm_suite_oui, tvb, offset, 3, ENC_NA);
26038
71
      offset += 3;
26039
71
      akm_suite_type = tvb_get_uint8(tvb, offset);
26040
71
      proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_akm_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26041
71
      offset += 1;
26042
71
      proto_item_append_text(ti, " (%d,%s)", loop_cnt+1, val_to_str(akm_suite_type,
26043
71
      ieee80211_wapi_suite_type_short, "Reserved: %d"));
26044
71
    }
26045
7
    proto_item_append_text(ti, " /");
26046
7
  } else {
26047
2
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Number of AKM suites is 0, must be min 1");
26048
2
    return offset;
26049
26050
2
  }
26051
  /* Unicast Cipher Suites: list can't be 0*/
26052
7
  ucast_cnt = tvb_get_letohs(tvb, offset);
26053
7
  item = proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count,
26054
7
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
26055
7
  offset += 2;
26056
7
  if (ucast_cnt != 0) {
26057
2
    proto_item_append_text(ti, " Unicast Cipher List:");
26058
66
    for (loop_cnt = 0; loop_cnt < ucast_cnt; loop_cnt++) {
26059
64
      subtree = proto_item_add_subtree(item, ett_tag_wapi_param_set_ucast_tree);
26060
64
      proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
26061
64
      offset += 3;
26062
64
      ucast_cipher_type = tvb_get_uint8(tvb, offset);
26063
64
      proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26064
64
      offset += 1;
26065
64
      proto_item_append_text(ti, " (%d,%s)", loop_cnt+1, val_to_str(ucast_cipher_type, ieee80211_wapi_cipher_type, "Reserved: %d"));
26066
64
    }
26067
2
  proto_item_append_text(ti, " /");
26068
5
  } else {
26069
5
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Number of Unicast Cipher suites is 0, must be min 1");
26070
5
    return offset;
26071
26072
5
  }
26073
26074
  /* Multicast Cipher Suites*/
26075
2
  proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui, tvb, offset, 3, ENC_NA);
26076
2
  offset += 3;
26077
2
  mcast_cipher_type = tvb_get_uint8(tvb, offset);
26078
2
  proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26079
2
  offset += 1;
26080
2
  proto_item_append_text(ti, " Multicast Cipher: %s", val_to_str(mcast_cipher_type, ieee80211_wapi_cipher_type, "Reserved: %d"));
26081
26082
  /* WAPI capability */
26083
2
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_wapi_param_set_capab,
26084
2
                                    ett_tag_wapi_param_set_preauth_tree, ieee80211_tag_wapi_param_set,
26085
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26086
2
  offset += 2;
26087
26088
  /* BKID List: The list can be 0
26089
   * Applicable only for assoc/re-assoc
26090
   */
26091
2
  if (ftype == MGT_ASSOC_REQ || ftype == MGT_REASSOC_REQ ) {
26092
0
    bkid_cnt = tvb_get_letohs(tvb, offset);
26093
0
    proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_bkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26094
0
    offset += 2;
26095
0
    if (bkid_cnt != 0) {
26096
0
      for (loop_cnt = 0; loop_cnt < bkid_cnt; loop_cnt++) {
26097
0
        proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_bkid_list, tvb, offset, 16, ENC_NA);
26098
0
        offset += 16;
26099
0
      }
26100
0
    }
26101
0
  }
26102
2
  return offset;
26103
7
}
26104
26105
static int * const ieee80211_bss_max_idle_options[] = {
26106
  &hf_ieee80211_tag_bss_max_idle_options_protected,
26107
  &hf_ieee80211_tag_bss_idle_options_reserved,
26108
  NULL
26109
};
26110
26111
static int
26112
dissect_bss_max_idle_period(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
26113
35
{
26114
35
  int offset = 0;
26115
26116
35
  proto_tree_add_item(tree, hf_ieee80211_tag_bss_max_idle_period,
26117
35
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
26118
35
  offset += 2;
26119
26120
35
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
26121
35
                                    hf_ieee80211_tag_bss_max_idle_options,
26122
35
                                    ett_max_idle_period_options,
26123
35
                                    ieee80211_bss_max_idle_options,
26124
35
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26125
35
  offset++;
26126
26127
35
  return offset;
26128
35
}
26129
26130
enum tfs_request_subelem_id {
26131
  TFS_REQ_SUBELEM_TFS = 1,
26132
  TFS_REQ_SUBELEM_VENDOR_SPECIFIC = 221
26133
};
26134
26135
static const value_string tfs_request_subelem_ids[] = {
26136
  { TFS_REQ_SUBELEM_TFS, "TFS subelement" },
26137
  { TFS_REQ_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific subelement" },
26138
  { 0, NULL }
26139
};
26140
26141
static int
26142
dissect_tfs_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26143
150
{
26144
150
  int tag_len = tvb_reported_length(tvb);
26145
150
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26146
150
  int offset = 0;
26147
150
  const uint8_t ids[] = {
26148
150
    1, /* TFS Subelement */
26149
150
    TAG_VENDOR_SPECIFIC_IE
26150
150
  };
26151
26152
150
  proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_id,
26153
150
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
26154
150
  offset++;
26155
150
  proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_ac_delete_after_match,
26156
150
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
26157
150
  proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_ac_notify,
26158
150
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
26159
150
  offset++;
26160
150
  if (offset + 1 >= tag_len) {
26161
15
    expert_add_info_format(pinfo, tree, &ei_ieee80211_missing_data,
26162
15
                           "No TFS Request subelements in TFS Request");
26163
15
    return tvb_captured_length(tvb);
26164
15
  }
26165
26166
601
  while (offset + 1 < tag_len) {
26167
585
    uint8_t id, len;
26168
585
    int s_offset, s_end;
26169
26170
585
    id = tvb_get_uint8(tvb, offset);
26171
585
    proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem_id,
26172
585
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26173
585
    offset++;
26174
585
    len = tvb_get_uint8(tvb, offset);
26175
585
    proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem_len,
26176
585
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26177
585
    offset++;
26178
585
    if (offset + len > tag_len) {
26179
93
      expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
26180
93
                             "Not enough data for TFS Request subelement");
26181
93
      return tvb_captured_length(tvb);
26182
93
    }
26183
492
    switch (id) {
26184
127
    case TFS_REQ_SUBELEM_TFS:
26185
127
      s_offset = offset;
26186
127
      s_end = offset + len;
26187
350
      while (s_offset < s_end) {
26188
        /* TODO 1 is interpreted as TAG_SUPP_RATES, fix this! */
26189
223
        int tlen = add_tagged_field(pinfo, tree, tvb, s_offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
26190
223
        if (tlen==0)
26191
0
          break;
26192
223
        s_offset += tlen;
26193
223
      }
26194
127
      break;
26195
360
    default:
26196
360
      proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem,
26197
360
                          tvb, offset, len, ENC_NA);
26198
360
      break;
26199
492
    }
26200
466
    offset += len;
26201
466
  }
26202
26203
16
  if (offset < tag_len) {
26204
2
    proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
26205
2
                           tvb, offset, tag_len - offset, "Extra data after TFS Subelements");
26206
2
  }
26207
26208
16
  return tvb_captured_length(tvb);
26209
135
}
26210
26211
enum tfs_response_subelem_id {
26212
  TFS_RESP_SUBELEM_TFS_STATUS = 1,
26213
  TFS_RESP_SUBELEM_TFS = 2,
26214
  TFS_RESP_SUBELEM_VENDOR_SPECIFIC = 221
26215
};
26216
26217
static const value_string tfs_response_subelem_ids[] = {
26218
  { TFS_RESP_SUBELEM_TFS_STATUS, "TFS Status subelement" },
26219
  { TFS_RESP_SUBELEM_TFS, "TFS subelement" },
26220
  { TFS_RESP_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific subelement" },
26221
  { 0, NULL }
26222
};
26223
26224
static int
26225
dissect_tfs_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26226
128
{
26227
128
  int tag_len = tvb_reported_length(tvb);
26228
128
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26229
128
  int offset = 0;
26230
128
  const uint8_t ids[] = {
26231
128
    1, /* TFS Status subelement*/
26232
128
    2, /* TFS subelement */
26233
128
    TAG_VENDOR_SPECIFIC_IE
26234
128
  };
26235
26236
752
  while (offset + 3 <= tag_len) {
26237
710
    uint8_t id, len;
26238
710
    int s_offset, s_end;
26239
26240
710
    id = tvb_get_uint8(tvb, offset);
26241
710
    proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem_id,
26242
710
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26243
710
    offset++;
26244
710
    len = tvb_get_uint8(tvb, offset);
26245
710
    proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem_len,
26246
710
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26247
710
    offset++;
26248
710
    if (offset + len > tag_len) {
26249
75
      expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
26250
75
                             "Not enough data for TFS Request subelement");
26251
75
      return tvb_captured_length(tvb);
26252
75
    }
26253
635
    switch (id) {
26254
76
    case TFS_RESP_SUBELEM_TFS_STATUS:
26255
76
      proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_status,
26256
76
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
26257
76
      proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_id,
26258
76
                          tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
26259
76
      break;
26260
48
    case TFS_RESP_SUBELEM_TFS:
26261
48
      s_offset = offset;
26262
48
      s_end = offset + len;
26263
209
      while (s_offset < s_end) {
26264
        /* TODO Element IDs 1 and 2 are misinterpreted! */
26265
161
        int tlen = add_tagged_field(pinfo, tree, tvb, s_offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
26266
161
        if (tlen==0)
26267
0
          break;
26268
161
        s_offset += tlen;
26269
161
      }
26270
48
      break;
26271
507
    default:
26272
507
      proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem,
26273
507
                          tvb, offset, len, ENC_NA);
26274
507
      break;
26275
635
    }
26276
26277
624
    offset += len;
26278
624
  }
26279
26280
42
  if (offset < tag_len) {
26281
17
    proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
26282
17
                           tvb, offset, tag_len - offset, "Extra data after TFS Subelements");
26283
17
  }
26284
26285
42
  return tvb_captured_length(tvb);
26286
128
}
26287
26288
static const value_string wnm_sleep_mode_action_types[] = {
26289
  { 0, "Enter WNM-Sleep Mode" },
26290
  { 1, "Exit WNM-Sleep Mode" },
26291
  { 0, NULL }
26292
};
26293
26294
static const value_string wnm_sleep_mode_response_status_vals[] = {
26295
  { 0, "Enter/Exit WNM-Sleep Mode Accept" },
26296
  { 1, "Exit WNM-Sleep Mode Accept, GTK/IGTK update required" },
26297
  { 2, "Denied. The AP is unable to perform the requested action." },
26298
  { 3, "Denied temporarily. The AP is unable to perform the requested action "
26299
    "at the current time. The request can be submitted again at a later time."
26300
  },
26301
  { 4, "Denied. Due to the pending key expiration." },
26302
  { 5, "Denied. The requested action was not granted due to other WNM services "
26303
    "in use by the requesting STA." },
26304
  { 0, NULL }
26305
};
26306
26307
static int
26308
dissect_wnm_sleep_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
26309
65
{
26310
65
  int offset = 0;
26311
65
  proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_action_type,
26312
65
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
26313
65
  offset++;
26314
65
  proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_response_status,
26315
65
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
26316
65
  offset++;
26317
65
  proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_interval,
26318
65
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
26319
65
  offset += 2;
26320
65
  return offset;
26321
65
}
26322
26323
static const value_string time_adv_timing_capab_vals[] = {
26324
  { 0, "No standardized external time source" },
26325
  { 1, "Timestamp offset based on UTC" },
26326
  { 2, "UTC time at which the TSF timer is 0" },
26327
  { 0, NULL }
26328
};
26329
26330
static int
26331
dissect_time_adv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
26332
100
{
26333
100
  int offset = 0;
26334
100
  uint8_t capab;
26335
100
  proto_item *item;
26336
100
  proto_tree *subtree;
26337
100
  struct tm tm, *now;
26338
100
  time_t t;
26339
26340
100
  capab = tvb_get_uint8(tvb, offset);
26341
100
  proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_timing_capab,
26342
100
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
26343
100
  offset += 1;
26344
26345
100
  switch (capab) {
26346
8
  case 1:
26347
8
    proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_value,
26348
8
                        tvb, offset, 10, ENC_NA);
26349
8
    offset += 10;
26350
26351
8
    proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_error,
26352
8
                        tvb, offset, 5, ENC_NA);
26353
8
    offset += 5;
26354
8
    break;
26355
3
  case 2:
26356
3
    item = proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_value,
26357
3
                               tvb, offset, 10, ENC_NA);
26358
3
    subtree = proto_item_add_subtree(item, ett_tag_time_adv_tree);
26359
3
    memset(&tm, 0, sizeof(tm));
26360
3
    tm.tm_year = tvb_get_letohs(tvb, offset) - 1900;
26361
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_year,
26362
3
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
26363
3
    offset += 2;
26364
3
    tm.tm_mon = tvb_get_uint8(tvb, offset) - 1;
26365
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_month,
26366
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26367
3
    offset += 1;
26368
3
    tm.tm_mday = tvb_get_uint8(tvb, offset);
26369
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_day,
26370
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26371
3
    offset += 1;
26372
3
    tm.tm_hour = tvb_get_uint8(tvb, offset);
26373
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_hours,
26374
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26375
3
    offset += 1;
26376
3
    tm.tm_min = tvb_get_uint8(tvb, offset);
26377
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_minutes,
26378
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26379
3
    offset += 1;
26380
3
    tm.tm_sec = tvb_get_uint8(tvb, offset);
26381
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_seconds,
26382
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26383
3
    offset += 1;
26384
3
    proto_tree_add_item(subtree,
26385
3
                        hf_ieee80211_tag_time_adv_time_value_milliseconds,
26386
3
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
26387
3
    offset += 2;
26388
3
    proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_reserved,
26389
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26390
3
    offset += 1;
26391
26392
3
    tm.tm_isdst = -1;
26393
3
    t = mktime(&tm);
26394
3
    if (t != -1) {
26395
3
      t += (time_t)(last_timestamp / 1000000);
26396
3
      now = localtime(&t);
26397
3
      if (now)
26398
3
        proto_item_append_text(item,
26399
3
                               ": current time=%u-%02u-%02u %02u:%02u:%02u",
26400
3
                               now->tm_year + 1900, now->tm_mon + 1,
26401
3
                               now->tm_mday, now->tm_hour, now->tm_min,
26402
3
                               now->tm_sec);
26403
3
    }
26404
26405
3
    proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_error,
26406
3
                        tvb, offset, 5, ENC_NA);
26407
3
    offset += 5;
26408
26409
3
    proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_update_counter,
26410
3
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
26411
3
    offset += 1;
26412
3
    break;
26413
100
  }
26414
26415
90
  return offset;
26416
100
}
26417
26418
static int
26419
dissect_time_zone(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
26420
50
{
26421
50
  int tag_len = tvb_reported_length(tvb);
26422
50
  int offset = 0;
26423
26424
50
  proto_tree_add_item(tree, hf_ieee80211_tag_time_zone, tvb, offset, tag_len,
26425
50
                      ENC_ASCII);
26426
50
  return tvb_captured_length(tvb);
26427
50
}
26428
26429
static int
26430
dissect_ap_channel_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26431
145
{
26432
145
  int tag_len = tvb_reported_length(tvb);
26433
145
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26434
145
  int offset = 0;
26435
26436
145
  if (tag_len < 1) {
26437
27
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26438
27
                           "AP Channel Report length %u wrong, must be > 1", tag_len);
26439
27
    return tvb_captured_length(tvb);
26440
27
  }
26441
26442
118
  proto_tree_add_item(tree, hf_ieee80211_tag_ap_channel_report_operating_class, tvb,
26443
118
                      offset, 1, ENC_LITTLE_ENDIAN);
26444
118
  proto_item_append_text(field_data->item_tag, ": Operating Class %u, Channel List :", tvb_get_uint8(tvb, offset));
26445
118
  offset += 1;
26446
26447
4.08k
  while (offset < tag_len)
26448
3.97k
  {
26449
3.97k
    proto_tree_add_item(tree, hf_ieee80211_tag_ap_channel_report_channel_list, tvb, offset, 1, ENC_NA);
26450
3.97k
    proto_item_append_text(field_data->item_tag, " %u,", tvb_get_uint8(tvb, offset));
26451
3.97k
    offset += 1;
26452
3.97k
  }
26453
118
  return tvb_captured_length(tvb);
26454
145
}
26455
26456
static int
26457
dissect_secondary_channel_offset_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26458
65
{
26459
65
  int tag_len = tvb_reported_length(tvb);
26460
65
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26461
65
  int offset = 0;
26462
65
  if (tag_len != 1) {
26463
61
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26464
61
                           "Secondary Channel Offset length %u wrong, must be = 1", tag_len);
26465
61
    return 1;
26466
61
  }
26467
26468
4
  proto_tree_add_item(tree, hf_ieee80211_tag_secondary_channel_offset, tvb,
26469
4
                      offset, 1, ENC_LITTLE_ENDIAN);
26470
4
  return tvb_captured_length(tvb);
26471
65
}
26472
26473
/* RCPI (53) */
26474
static int
26475
dissect_rcpi_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26476
73
{
26477
73
  int tag_len = tvb_reported_length(tvb);
26478
73
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26479
73
  int offset = 0;
26480
26481
73
  if (tag_len != 1)
26482
54
  {
26483
54
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26484
54
                           "RCPI length %u wrong, must = 1", tag_len);
26485
54
    return 1;
26486
54
  }
26487
26488
19
  proto_tree_add_item(tree, hf_ieee80211_tag_rcpi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26489
19
  offset += 1;
26490
26491
19
  return offset;
26492
73
}
26493
26494
/* BSS Average Access Delay element (63) */
26495
static int
26496
dissect_bss_avg_access_delay_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26497
93
{
26498
93
  int tag_len = tvb_reported_length(tvb);
26499
93
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26500
93
  int offset = 0;
26501
93
  if (tag_len != 1) {
26502
68
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26503
68
                           "BSS Average Access Delay length %u wrong, must be = 1", tag_len);
26504
68
    return 1;
26505
68
  }
26506
26507
25
  proto_tree_add_item(tree, hf_ieee80211_tag_bss_ap_avg_access_delay, tvb,
26508
25
                      offset, 1, ENC_LITTLE_ENDIAN);
26509
25
  return tvb_captured_length(tvb);
26510
93
}
26511
26512
static int
26513
dissect_antenna_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26514
126
{
26515
126
  int tag_len = tvb_reported_length(tvb);
26516
126
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26517
126
  int offset = 0;
26518
26519
126
  if (tag_len != 1) {
26520
110
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26521
110
                           "Antenna length %u wrong, must be = 1", tag_len);
26522
110
    return 1;
26523
110
  }
26524
26525
16
  proto_tree_add_item(tree, hf_ieee80211_tag_antenna_id, tvb,
26526
16
                      offset, 1, ENC_LITTLE_ENDIAN);
26527
26528
16
  return tvb_captured_length(tvb);
26529
126
}
26530
26531
static int
26532
dissect_rsni_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26533
146
{
26534
146
  int tag_len = tvb_reported_length(tvb);
26535
146
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26536
146
  int offset = 0;
26537
26538
146
  if (tag_len != 1) {
26539
129
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26540
129
                           "RSNI length %u wrong, must be = 1", tag_len);
26541
129
    return 1;
26542
129
  }
26543
26544
17
  proto_tree_add_item(tree, hf_ieee80211_tag_rsni, tvb,
26545
17
                      offset, 1, ENC_LITTLE_ENDIAN);
26546
26547
17
  return tvb_captured_length(tvb);
26548
146
}
26549
26550
static int
26551
dissect_measurement_pilot_trans_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
26552
103
{
26553
103
  int tag_len = tvb_reported_length(tvb);
26554
103
  int offset = 0;
26555
103
  const uint8_t ids[] = { TAG_VENDOR_SPECIFIC_IE };
26556
26557
  /* The tag len can be 1 or more if there are sub-elements */
26558
26559
103
  proto_tree_add_item(tree, hf_ieee80211_ff_measurement_pilot_int, tvb, offset,
26560
103
                      1, ENC_NA);
26561
26562
103
  tag_len--;
26563
103
  offset++;
26564
26565
  /* Also handle the optional sub-elements */
26566
26567
103
  if (tag_len > 0) {
26568
491
    while (tag_len > 0) {
26569
407
      uint8_t elt_len;
26570
26571
407
      if (tvb_reported_length_remaining(tvb, offset) < 2) {
26572
10
        proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_bad_length,
26573
10
             tvb, offset, tag_len - offset,
26574
10
             "Remaining data does not include the tag length");
26575
10
        break;
26576
10
      }
26577
397
      elt_len = tvb_get_uint8(tvb, offset + 1);
26578
26579
397
      if(add_tagged_field(pinfo, tree, tvb, offset + 2, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
26580
        /* TODO: Add an expert info here and skip the field. */
26581
0
        break;
26582
0
      }
26583
26584
397
      tag_len -= elt_len + 2;
26585
397
      offset += elt_len + 2;
26586
397
    }
26587
94
  }
26588
26589
103
  return tvb_captured_length(tvb);
26590
103
}
26591
26592
static int
26593
dissect_bss_available_admission_capacity_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26594
138
{
26595
138
  int tag_len = tvb_reported_length(tvb);
26596
138
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26597
138
  int offset = 0;
26598
138
  uint16_t bitmask;
26599
138
  static int * const ieee80211_tag_bss_avb_adm_cap_bitmask[] = {
26600
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0,
26601
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1,
26602
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2,
26603
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3,
26604
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4,
26605
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5,
26606
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6,
26607
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7,
26608
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0,
26609
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1,
26610
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2,
26611
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3,
26612
138
    &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv,
26613
138
    NULL
26614
138
  };
26615
26616
138
  if (tag_len < 2) {
26617
17
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26618
17
                           "BSS Available Admission Capacity length %u wrong, must > = 2", tag_len);
26619
17
    return offset;
26620
17
  }
26621
26622
121
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_bss_avb_adm_cap_bitmask,
26623
121
                                    ett_tag_bss_bitmask_tree, ieee80211_tag_bss_avb_adm_cap_bitmask,
26624
121
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26625
121
  bitmask = tvb_get_letohs(tvb, offset);
26626
121
  offset += 2;
26627
26628
121
  if(bitmask & BSS_BITMASK_UP0)
26629
79
  {
26630
79
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up0, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26631
79
    offset += 2;
26632
79
  }
26633
121
  if(bitmask & BSS_BITMASK_UP1)
26634
64
  {
26635
64
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26636
64
    offset += 2;
26637
64
  }
26638
121
  if(bitmask & BSS_BITMASK_UP2)
26639
24
  {
26640
24
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up2, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26641
24
    offset += 2;
26642
24
  }
26643
121
  if(bitmask & BSS_BITMASK_UP3)
26644
19
  {
26645
19
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up3, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26646
19
    offset += 2;
26647
19
  }
26648
121
  if(bitmask & BSS_BITMASK_UP4)
26649
18
  {
26650
18
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up4, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26651
18
    offset += 2;
26652
18
  }
26653
121
  if(bitmask & BSS_BITMASK_UP5)
26654
16
  {
26655
16
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up5, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26656
16
    offset += 2;
26657
16
  }
26658
121
  if(bitmask & BSS_BITMASK_UP6)
26659
69
  {
26660
69
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up6, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26661
69
    offset += 2;
26662
69
  }
26663
121
  if(bitmask & BSS_BITMASK_UP7)
26664
10
  {
26665
10
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up7, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26666
10
    offset += 2;
26667
10
  }
26668
121
  if(bitmask & BSS_BITMASK_AC0)
26669
70
  {
26670
70
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac0, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26671
70
    offset += 2;
26672
70
  }
26673
121
  if(bitmask & BSS_BITMASK_AC1)
26674
64
  {
26675
64
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26676
64
    offset += 2;
26677
64
  }
26678
121
  if(bitmask & BSS_BITMASK_AC2)
26679
20
  {
26680
20
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac2, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26681
20
    offset += 2;
26682
20
  }
26683
121
  if(bitmask & BSS_BITMASK_AC3)
26684
27
  {
26685
27
    proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac3, tvb, offset, 2, ENC_LITTLE_ENDIAN);
26686
27
    offset += 2;
26687
27
  }
26688
121
  return offset;
26689
138
}
26690
26691
static int
26692
dissect_bss_ac_access_delay_ie(tvbuff_t *tvb, packet_info *pinfo,
26693
                                    proto_tree *tree, int offset, uint32_t tag_len, proto_item *ti_len)
26694
26
{
26695
26696
26
  if (tag_len != 4) {
26697
24
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
26698
24
                           "BSS AC Access Delay length %u wrong, must = 4", tag_len);
26699
24
    return offset;
26700
24
  }
26701
26702
  /* TODO: Display the scaled representation of the average
26703
    medium access delay (a big (precalculed) value_string ?)
26704
    See 8.4.2.46 BSS AC Access Delay element ... */
26705
26706
2
  proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_be, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26707
2
  offset += 1;
26708
2
  proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_bk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26709
2
  offset += 1;
26710
2
  proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_vi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26711
2
  offset += 1;
26712
2
  proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_vo, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26713
2
  offset += 1;
26714
26715
2
  return offset;
26716
26
}
26717
26718
/* RM Enabled Capabilities (70) */
26719
static int
26720
dissect_rm_enabled_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26721
71
{
26722
71
  int tag_len = tvb_reported_length(tvb);
26723
71
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26724
71
  int offset = 0;
26725
71
  proto_item *ti_ex_cap;
26726
71
  static int * const ieee80211_tag_rm_enabled_capabilities_octet1[] = {
26727
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b0,
26728
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b1,
26729
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b2,
26730
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b3,
26731
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b4,
26732
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b5,
26733
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b6,
26734
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b7,
26735
71
    NULL
26736
71
  };
26737
26738
71
  static int * const ieee80211_tag_rm_enabled_capabilities_octet2[] = {
26739
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b8,
26740
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b9,
26741
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b10,
26742
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b11,
26743
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b12,
26744
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b13,
26745
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b14,
26746
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b15,
26747
71
    NULL
26748
71
  };
26749
26750
71
  static int * const ieee80211_tag_rm_enabled_capabilities_octet3[] = {
26751
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b16,
26752
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b17,
26753
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b18to20,
26754
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b21to23,
26755
71
    NULL
26756
71
  };
26757
26758
71
  static int * const ieee80211_tag_rm_enabled_capabilities_octet4[] = {
26759
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b24to26,
26760
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b27,
26761
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b28,
26762
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b29,
26763
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b30,
26764
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b31,
26765
71
    NULL
26766
71
  };
26767
26768
71
  static int * const ieee80211_tag_rm_enabled_capabilities_octet5[] = {
26769
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b32,
26770
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b33,
26771
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b34,
26772
71
    &hf_ieee80211_tag_rm_enabled_capabilities_b35,
26773
71
    &hf_ieee80211_tag_rm_enabled_capabilities_o5,
26774
71
    NULL
26775
71
  };
26776
26777
71
  if (tag_len != 5)
26778
68
  {
26779
68
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "RM Enabled Capabilities length %u wrong, must = 5", tag_len);
26780
68
    return 1;
26781
68
  }
26782
3
  proto_item_append_text(field_data->item_tag, " (%d octets)", tag_len);
26783
26784
  /* RM Enabled Capability octet 1 */
26785
3
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
26786
3
                                    ett_tag_rm_cap1, ieee80211_tag_rm_enabled_capabilities_octet1,
26787
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26788
3
  proto_item_append_text(ti_ex_cap, " (octet 1)");
26789
3
  offset += 1;
26790
26791
  /* RM Enabled Capability octet 2 */
26792
3
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
26793
3
                                    ett_tag_rm_cap2, ieee80211_tag_rm_enabled_capabilities_octet2,
26794
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26795
3
  proto_item_append_text(ti_ex_cap, " (octet 2)");
26796
3
  offset += 1;
26797
26798
  /* RM Enabled Capability octet 3 */
26799
3
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
26800
3
                                    ett_tag_rm_cap3, ieee80211_tag_rm_enabled_capabilities_octet3,
26801
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26802
3
  proto_item_append_text(ti_ex_cap, " (octet 3)");
26803
3
  offset += 1;
26804
26805
  /* RM Enabled Capability octet 4 */
26806
3
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
26807
3
                                    ett_tag_rm_cap4, ieee80211_tag_rm_enabled_capabilities_octet4,
26808
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26809
3
  proto_item_append_text(ti_ex_cap, " (octet 4)");
26810
3
  offset += 1;
26811
26812
  /* RM Enabled Capability octet 5 */
26813
3
  ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
26814
3
                                    ett_tag_rm_cap5, ieee80211_tag_rm_enabled_capabilities_octet5,
26815
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26816
3
  proto_item_append_text(ti_ex_cap, " (octet 5)");
26817
3
  offset += 1;
26818
26819
3
  return offset;
26820
71
}
26821
26822
/* Multiple BSSID (71) */
26823
enum multiple_bssid_subelem_id {
26824
  MULTIPLE_BSSID_SUBELEM_NO_BSSID_PROFILE = 0,
26825
  MULTIPLE_BSSID_SUBELEM_VENDOR_SPECIFIC = 221
26826
};
26827
26828
static const value_string multiple_bssid_subelem_ids[] = {
26829
  { MULTIPLE_BSSID_SUBELEM_NO_BSSID_PROFILE, "Nontransmitted BSSID Profile" },
26830
  { MULTIPLE_BSSID_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific" },
26831
  { 0, NULL }
26832
};
26833
26834
static int
26835
dissect_multiple_bssid_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26836
262
{
26837
262
  unsigned tag_len = tvb_reported_length(tvb);
26838
262
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26839
262
  unsigned offset = 0;
26840
262
  uint8_t sub_tag_id, sub_tag_len;
26841
262
  const char *sub_tag_name;
26842
262
  proto_tree *sub_tag_tree;
26843
262
  const uint8_t valid_ids[] = { TAG_VENDOR_SPECIFIC_IE };
26844
262
  const uint8_t invalid_ids[] = { TAG_TIM, TAG_DS_PARAMETER, TAG_IBSS_PARAMETER,
26845
262
    TAG_COUNTRY_INFO, TAG_CHANNEL_SWITCH_ANN, TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT,
26846
262
    TAG_WIDE_BW_CHANNEL_SWITCH, TAG_TX_PWR_ENVELOPE, TAG_SUPPORTED_OPERATING_CLASSES, TAG_IBSS_DFS,
26847
262
    TAG_ERP_INFO, TAG_ERP_INFO_OLD, TAG_HT_CAPABILITY, TAG_HT_OPERATION, TAG_VHT_CAPABILITY,
26848
262
    TAG_VHT_OPERATION, TAG_S1G_BEACON_COMPATIBILITY, TAG_SHORT_BEACON_INTERVAL,
26849
262
    TAG_S1G_CAPABILITIES, TAG_S1G_OPERATION };
26850
262
  const uint8_t invalid_ext_ids[] = { ETAG_HE_CAPABILITIES, ETAG_HE_OPERATION,
26851
262
    ETAG_HE_6GHZ_BAND_CAPABILITIES, ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT, ETAG_SPATIAL_REUSE_PARAMETER_SET };
26852
262
  uint32_t s_offset, s_end;
26853
26854
262
  if (tag_len < 1)
26855
45
  {
26856
45
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Multiple BSSID length %u wrong, must be at least 1", tag_len);
26857
45
    return 1;
26858
45
  }
26859
26860
217
  proto_tree_add_item(tree, hf_ieee80211_tag_multiple_bssid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26861
217
  offset++;
26862
26863
  /* Optional sub-elements */
26864
26865
1.30k
  while (offset + 1 < tag_len) {
26866
1.25k
    sub_tag_id = tvb_get_uint8(tvb, offset);
26867
1.25k
    sub_tag_len = tvb_get_uint8(tvb, offset + 1);
26868
1.25k
    sub_tag_name = val_to_str_const(sub_tag_id, multiple_bssid_subelem_ids, "Unknown");
26869
26870
1.25k
    sub_tag_tree = proto_tree_add_subtree_format(tree, tvb, offset, sub_tag_len + 2, ett_tag_multiple_bssid_subelem_tree, NULL, "Subelement: %s", sub_tag_name);
26871
26872
1.25k
    proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26873
1.25k
    offset += 1;
26874
26875
1.25k
    proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_len, tvb, offset, 1, ENC_LITTLE_ENDIAN);
26876
1.25k
    offset += 1;
26877
26878
1.25k
    if (offset + sub_tag_len > tag_len) {
26879
139
      expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Not enough data for subelement");
26880
139
      break;
26881
139
    }
26882
26883
1.12k
    switch (sub_tag_id)
26884
1.12k
    {
26885
726
    case MULTIPLE_BSSID_SUBELEM_NO_BSSID_PROFILE:
26886
726
      proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_nontrans_profile, tvb, offset, sub_tag_len, ENC_NA);
26887
26888
726
      s_offset = offset;
26889
726
      s_end = offset + sub_tag_len;
26890
726
      beacon_padding = 0; /* this is for the beacon padding confused with ssid fix */
26891
1.27k
      while (s_offset < s_end) {
26892
548
        int tlen = add_tagged_field_with_validation(pinfo, sub_tag_tree, tvb, s_offset, 0,
26893
548
          invalid_ids, G_N_ELEMENTS(invalid_ids), true,
26894
548
          invalid_ext_ids, G_N_ELEMENTS(invalid_ext_ids), true, NULL);
26895
548
        if (tlen==0)
26896
0
          break;
26897
548
        s_offset += tlen;
26898
548
      }
26899
26900
726
      break;
26901
26902
1
    case MULTIPLE_BSSID_SUBELEM_VENDOR_SPECIFIC:
26903
      /*
26904
       * add_tagged_field will insert expert info if there is a problem so
26905
       * we ignore the return value.
26906
       */
26907
1
      add_tagged_field(pinfo, sub_tag_tree, tvb, offset, 0, valid_ids, G_N_ELEMENTS(valid_ids), NULL);
26908
1
      break;
26909
26910
385
    default:
26911
      /* RESERVED */
26912
385
      proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_reserved, tvb, offset, sub_tag_len, ENC_NA);
26913
385
      break;
26914
1.12k
    }
26915
26916
1.08k
    offset += sub_tag_len;
26917
26918
1.08k
  }
26919
26920
180
  if (offset < tag_len) {
26921
144
    proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
26922
144
      tvb, offset, tag_len - offset, "Extra data after subelements");
26923
144
  }
26924
26925
180
  return tvb_captured_length(tvb);
26926
217
}
26927
26928
/* 20/40 BSS Coexistence (72) */
26929
static int
26930
dissect_20_40_bss_coexistence(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26931
78
{
26932
78
  int tag_len = tvb_reported_length(tvb);
26933
78
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26934
78
  int offset = 0;
26935
78
  static int * const ieee80211_20_40_bss_coexistence_fields[] = {
26936
78
    &hf_ieee80211_tag_20_40_bc_information_request,
26937
78
    &hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant,
26938
78
    &hf_ieee80211_tag_20_40_bc_20_mhz_bss_width_request,
26939
78
    &hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request,
26940
78
    &hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant,
26941
78
    &hf_ieee80211_tag_20_40_bc_reserved,
26942
78
    NULL
26943
78
  };
26944
26945
78
  if (tag_len != 1)
26946
69
  {
26947
69
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "20/40 BSS Coexistence length %u wrong, must = 1", tag_len);
26948
69
    return 1;
26949
69
  }
26950
26951
9
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_20_40_bc,
26952
9
                                    ett_tag_20_40_bc, ieee80211_20_40_bss_coexistence_fields,
26953
9
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
26954
26955
9
  offset += 1;
26956
26957
9
  return offset;
26958
78
}
26959
26960
/* 20/40 BSS Intolerant Channel Report (73) */
26961
static int
26962
dissect_20_40_bss_intolerant(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
26963
99
{
26964
99
  proto_item *intolerant_item;
26965
99
  proto_tree *intolerant_tree;
26966
99
  int tag_len = tvb_reported_length(tvb);
26967
99
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
26968
99
  int offset = 0;
26969
99
  int channel_report_size = tag_len - 1; // minus regulator_class field
26970
99
  int i;
26971
26972
99
  if (tag_len < 2) {
26973
21
      expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
26974
21
                             "20/40 BSS Intolerant Channel Report length %u wrong, must > 1", tag_len);
26975
21
  }
26976
26977
99
  proto_tree_add_item(tree, hf_ieee80211_tag_intolerant_operating_class, tvb, offset, 1, ENC_NA);
26978
99
  offset += 1;
26979
26980
99
  intolerant_item = proto_tree_add_item(tree, hf_ieee80211_tag_intolerant_channel_list, tvb, offset, channel_report_size, ENC_NA);
26981
99
  intolerant_tree = proto_item_add_subtree(intolerant_item, ett_tag_intolerant_tree);
26982
4.12k
  for (i = 0; i < channel_report_size; i++)
26983
4.02k
  {
26984
4.02k
    proto_tree_add_item(intolerant_tree, hf_ieee80211_tag_intolerant_channel, tvb, offset, 1, ENC_NA);
26985
4.02k
    offset += 1;
26986
4.02k
  }
26987
26988
99
  return offset;
26989
99
}
26990
26991
static int
26992
dissect_ht_capability_ie_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
26993
                         uint32_t tag_len, proto_item *ti_len, bool vendorspecific)
26994
96
{
26995
96
  proto_item *cap_item, *ti;
26996
96
  proto_tree *cap_tree;
26997
96
  static int * const ieee80211_ht[] = {
26998
96
    &hf_ieee80211_ht_ldpc_coding,
26999
96
    &hf_ieee80211_ht_chan_width,
27000
96
    &hf_ieee80211_ht_sm_pwsave,
27001
96
    &hf_ieee80211_ht_green,
27002
96
    &hf_ieee80211_ht_short20,
27003
96
    &hf_ieee80211_ht_short40,
27004
96
    &hf_ieee80211_ht_tx_stbc,
27005
96
    &hf_ieee80211_ht_rx_stbc,
27006
96
    &hf_ieee80211_ht_reserved_b10,
27007
96
    &hf_ieee80211_ht_max_amsdu,
27008
96
    &hf_ieee80211_ht_dss_cck_40,
27009
96
    &hf_ieee80211_ht_reserved_b13,
27010
96
    &hf_ieee80211_ht_40_mhz_intolerant,
27011
96
    &hf_ieee80211_ht_reserved_b15,
27012
96
    NULL
27013
96
  };
27014
27015
96
  static int * const ieee80211_htex[] = {
27016
96
    &hf_ieee80211_htex_reserved_b0_b7,
27017
96
    &hf_ieee80211_htex_mcs,
27018
96
    &hf_ieee80211_htex_htc_support,
27019
96
    &hf_ieee80211_htex_rd_responder,
27020
96
    &hf_ieee80211_htex_reserved_b12_b15,
27021
96
    NULL
27022
96
  };
27023
27024
96
  static int * const ieee80211_txbf[] = {
27025
96
    &hf_ieee80211_txbf_cap,
27026
96
    &hf_ieee80211_txbf_rcv_ssc,
27027
96
    &hf_ieee80211_txbf_tx_ssc,
27028
96
    &hf_ieee80211_txbf_rcv_ndp,
27029
96
    &hf_ieee80211_txbf_tx_ndp,
27030
96
    &hf_ieee80211_txbf_impl_txbf,
27031
96
    &hf_ieee80211_txbf_calib,
27032
96
    &hf_ieee80211_txbf_expl_csi,
27033
96
    &hf_ieee80211_txbf_expl_uncomp_fm,
27034
96
    &hf_ieee80211_txbf_expl_comp_fm,
27035
96
    &hf_ieee80211_txbf_expl_bf_csi,
27036
96
    &hf_ieee80211_txbf_expl_uncomp_fm_feed,
27037
96
    &hf_ieee80211_txbf_expl_comp_fm_feed,
27038
96
    &hf_ieee80211_txbf_min_group,
27039
96
    &hf_ieee80211_txbf_csi_num_bf_ant,
27040
96
    &hf_ieee80211_txbf_uncomp_sm_bf_ant,
27041
96
    &hf_ieee80211_txbf_comp_sm_bf_ant,
27042
96
    &hf_ieee80211_txbf_csi_max_rows_bf,
27043
96
    &hf_ieee80211_txbf_chan_est,
27044
96
    &hf_ieee80211_txbf_resrv,
27045
96
    NULL
27046
96
  };
27047
27048
96
  static int * const ieee80211_antsel[] = {
27049
96
    &hf_ieee80211_antsel_b0,
27050
96
    &hf_ieee80211_antsel_b1,
27051
96
    &hf_ieee80211_antsel_b2,
27052
96
    &hf_ieee80211_antsel_b3,
27053
96
    &hf_ieee80211_antsel_b4,
27054
96
    &hf_ieee80211_antsel_b5,
27055
96
    &hf_ieee80211_antsel_b6,
27056
96
    &hf_ieee80211_antsel_b7,
27057
96
    NULL
27058
96
  };
27059
27060
96
  if (tag_len != 26) {
27061
96
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
27062
96
                           "HT Capabilities IE length %u wrong, must be = 26", tag_len);
27063
96
    return (offset > 0) ? offset : 1;
27064
96
  }
27065
27066
0
  if (wlan_ignore_draft_ht && vendorspecific)
27067
0
    return (offset > 0) ? offset : 1;
27068
27069
  /* 2 byte HT Capabilities  Info*/
27070
0
  if (vendorspecific)
27071
0
  {
27072
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_vs_cap,
27073
0
                                    ett_ht_cap_tree, ieee80211_ht,
27074
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27075
0
  }
27076
0
  else
27077
0
  {
27078
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_cap,
27079
0
                                    ett_ht_cap_tree, ieee80211_ht,
27080
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27081
0
  }
27082
0
  offset += 2;
27083
27084
  /* 1 byte A-MPDU Parameters */
27085
0
  if (vendorspecific)
27086
0
  {
27087
0
    cap_item = proto_tree_add_item(tree, hf_ieee80211_ampduparam_vs, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27088
0
  } else
27089
0
  {
27090
0
    cap_item = proto_tree_add_item(tree, hf_ieee80211_ampduparam, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27091
0
  }
27092
0
  cap_tree = proto_item_add_subtree(cap_item, ett_ampduparam_tree);
27093
0
  ti = proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_mpdu, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27094
0
  proto_item_append_text(ti, " (%04.0f[Bytes])", pow(2, 13+(tvb_get_uint8(tvb, offset) & 0x3))-1);
27095
0
  proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_mpdu_start_spacing, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27096
0
  proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27097
0
  offset += 1;
27098
27099
  /* 16 byte MCS set */
27100
0
  offset = dissect_mcs_set(tree, tvb, offset, false, vendorspecific);
27101
27102
27103
  /* 2 byte HT Extended Capabilities */
27104
0
  if (vendorspecific)
27105
0
  {
27106
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_htex_vs_cap,
27107
0
                                    ett_htex_cap_tree, ieee80211_htex,
27108
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27109
0
  } else {
27110
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_htex_cap,
27111
0
                                    ett_htex_cap_tree, ieee80211_htex,
27112
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27113
0
  }
27114
0
  offset += 2;
27115
27116
27117
  /* 4 byte TxBF capabilities */
27118
0
  if (vendorspecific)
27119
0
  {
27120
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_txbf_vs,
27121
0
                                    ett_txbf_tree, ieee80211_txbf,
27122
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27123
0
  } else {
27124
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_txbf,
27125
0
                                    ett_txbf_tree, ieee80211_txbf,
27126
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27127
0
  }
27128
0
  offset += 4;
27129
27130
  /* 1 byte Antenna Selection (ASEL) capabilities */
27131
0
  if (vendorspecific)
27132
0
  {
27133
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_antsel_vs,
27134
0
                                    ett_antsel_tree, ieee80211_antsel,
27135
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27136
0
  }
27137
0
  else
27138
0
  {
27139
0
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_antsel,
27140
0
                                    ett_antsel_tree, ieee80211_antsel,
27141
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27142
0
  }
27143
0
  offset += 1;
27144
27145
0
  return offset;
27146
0
}
27147
27148
static int
27149
dissect_ht_capability_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
27150
94
{
27151
94
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
27152
27153
94
  return dissect_ht_capability_ie_common(tvb, pinfo, tree, 0, tvb_reported_length(tvb),
27154
94
            field_data->item_tag_length, false);
27155
94
}
27156
27157
static int
27158
dissect_ht_info_ie_1_0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
27159
                       uint32_t tag_len, proto_item *ti_len)
27160
0
{
27161
0
  static int * const ieee80211_hta1[] = {
27162
0
    &hf_ieee80211_hta_ext_chan_offset,
27163
0
    &hf_ieee80211_hta_rec_tx_width,
27164
0
    &hf_ieee80211_hta_rifs_mode,
27165
0
    &hf_ieee80211_hta_controlled_access,
27166
0
    &hf_ieee80211_hta_service_interval,
27167
0
    NULL
27168
0
  };
27169
27170
0
  static int * const ieee80211_hta2[] = {
27171
0
    &hf_ieee80211_hta_operating_mode,
27172
0
    &hf_ieee80211_hta_non_gf_devices,
27173
0
    NULL
27174
0
  };
27175
27176
0
  static int * const ieee80211_hta3[] = {
27177
0
    &hf_ieee80211_hta_basic_stbc_mcs,
27178
0
    &hf_ieee80211_hta_dual_stbc_protection,
27179
0
    &hf_ieee80211_hta_secondary_beacon,
27180
0
    &hf_ieee80211_hta_lsig_txop_protection,
27181
0
    &hf_ieee80211_hta_pco_active,
27182
0
    &hf_ieee80211_hta_pco_phase,
27183
0
    NULL
27184
0
  };
27185
27186
0
  if (tag_len != 22) {
27187
0
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
27188
0
                           "Tag length %u wrong, must be = 22", tag_len);
27189
0
    return offset;
27190
0
  }
27191
27192
0
  if (wlan_ignore_draft_ht)
27193
0
    return offset;
27194
27195
  /* 1 HT Control Channel */
27196
0
  proto_tree_add_item(tree, hf_ieee80211_hta_cc, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27197
0
  offset += 1;
27198
27199
  /* 1 byte HT additional capabilities */
27200
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap1,
27201
0
                                    ett_hta_cap_tree, ieee80211_hta1,
27202
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27203
0
  offset += 1;
27204
27205
  /* 2 byte HT additional capabilities */
27206
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap2,
27207
0
                                    ett_hta_cap1_tree, ieee80211_hta2,
27208
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27209
0
  offset += 2;
27210
27211
  /* 2 byte HT additional capabilities */
27212
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap2,
27213
0
                                    ett_hta_cap2_tree, ieee80211_hta3,
27214
0
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
27215
0
  offset += 2;
27216
27217
  /* 16 byte Supported MCS set */
27218
0
  offset = dissect_mcs_set(tree, tvb, offset, false, true);
27219
27220
0
  return offset;
27221
0
}
27222
27223
/* 802.11n-D1.10 and 802.11n-D2.0, 7.1.3.5a */
27224
27225
/*
27226
 * IEEE 802.11-2016 section 9.2.4.6 "HT Control field" says that B0 of
27227
 * the field is 0 for HT and 1 for VHT, bits B1 through B29 are the
27228
 * "HT Control Middle" subfield, the format of which differs between
27229
 * HT and VHT, bit B30 is the "AC Constraint" subfield, and bit B31
27230
 * is the "RDG/More PPDU" subfield.
27231
 *
27232
 * 802.11ax changes the meaning of the first two bits:
27233
 *
27234
 *     B0 = 0         means High Throughput
27235
 *     B0 = 1, B1 = 0 means Very High Throughput
27236
 *     B0 = 1, B1 = 1 means High Efficiency
27237
 *
27238
 * taking a reserved bit from the VHT version of the "HT Control Middle"
27239
 * field.
27240
 */
27241
22
#define A_CONTROL_TRS 0
27242
22
#define A_CONTROL_OM   1
27243
4
#define A_CONTROL_HLA  2
27244
9
#define A_CONTROL_BSR  3
27245
27
#define A_CONTROL_UPH  4
27246
8
#define A_CONTROL_BQR  5
27247
13
#define A_CONTROL_CCI  6
27248
11
#define A_CONTROL_EHT_OM 7
27249
24
#define A_CONTROL_SRS 8
27250
15
#define A_CONTROL_AAR 9
27251
62
#define A_CONTROL_ONES 15
27252
27253
static const value_string a_control_control_id_vals[] = {
27254
  { A_CONTROL_TRS,  "Triggered response scheduling" },
27255
  { A_CONTROL_OM,   "Operating mode" },
27256
  { A_CONTROL_HLA,  "HE link adaptation" },
27257
  { A_CONTROL_BSR,  "Buffer status report" },
27258
  { A_CONTROL_UPH,  "UL power headroom" },
27259
  { A_CONTROL_BQR,  "Bandwidth query report" },
27260
  { A_CONTROL_CCI,  "Command Control Indication" },
27261
  { A_CONTROL_EHT_OM, "EHT operating mode" },
27262
  { A_CONTROL_SRS,  "Single response scheduling" },
27263
  { A_CONTROL_AAR,  "AP assistance request" },
27264
  { A_CONTROL_ONES,  "Ones need expansion surely" },
27265
  { 0, NULL }
27266
};
27267
27268
/*
27269
 * Print the UL target RSSI field as per the spec.
27270
 *  0->30 map to -90 to -30 dBm.
27271
 *  31 maps to Max ransmit power
27272
 */
27273
static void
27274
ul_target_rssi_base_custom(char *result, uint32_t target_rssi)
27275
0
{
27276
0
  if (target_rssi <= 30) {
27277
0
    snprintf(result, ITEM_LABEL_LENGTH, "%ddBm", -90 + (2 * target_rssi));
27278
0
  } else if (target_rssi == 31) {
27279
0
    snprintf(result, ITEM_LABEL_LENGTH, "Max transmit power");
27280
0
  }
27281
0
}
27282
27283
static void
27284
dissect_a_control_padding(proto_tree *tree, tvbuff_t *tvb, int offset,
27285
  uint32_t bits _U_, uint32_t start_bit)
27286
32
{
27287
32
  proto_tree *trs_tree = NULL;
27288
32
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
27289
32
  unsigned offset_in_bits = (offset << 3) + start_bit;
27290
27291
  /*
27292
   * We isolated the bits and moved them to the bottom ... so display them
27293
   */
27294
32
  trs_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27295
32
                                ett_ieee80211_a_control_padding,
27296
32
                                NULL, "Padding: 0x%x(%u bits)", the_bits, 32 - start_bit);
27297
27298
32
  proto_tree_add_bits_item(trs_tree, hf_ieee80211_he_a_control_padding, tvb, offset_in_bits,
27299
32
                           32 - start_bit, ENC_LITTLE_ENDIAN);
27300
32
}
27301
27302
static void
27303
dissect_a_control_ones(proto_tree *tree, tvbuff_t *tvb, int offset,
27304
  uint32_t bits _U_, uint32_t start_bit)
27305
59
{
27306
59
  proto_tree *trs_tree = NULL;
27307
59
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
27308
27309
  /*
27310
   * We isolated the bits and moved them to the bottom ... so display them
27311
   */
27312
59
  trs_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27313
59
                                ett_ieee80211_a_control_ones,
27314
59
                                NULL, "ONES: 0x%0x", the_bits);
27315
27316
59
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_a_control_ones, tvb,
27317
59
                        offset, 4, the_bits);
27318
59
}
27319
27320
static void
27321
dissect_a_control_trs(proto_tree *tree, tvbuff_t *tvb, int offset,
27322
  uint32_t bits _U_, uint32_t start_bit)
27323
11
{
27324
11
  proto_tree *trs_tree = NULL;
27325
11
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
27326
27327
  /*
27328
   * We isolated the bits and moved them to the bottom ... so display them
27329
   */
27330
11
  trs_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27331
11
                                ett_ieee80211_triggered_response_schedule,
27332
11
                                NULL, "TRS Control: 0x%08x", the_bits);
27333
27334
11
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_trs_he_tb_ppdu_len, tvb,
27335
11
                        offset, 4, the_bits);
27336
11
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_trs_ru_allocation, tvb,
27337
11
                        offset, 4, the_bits);
27338
11
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_dl_tx_power, tvb,
27339
11
                        offset, 4, the_bits);
27340
11
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_ul_target_rssi, tvb,
27341
11
                        offset, 4, the_bits);
27342
11
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_ul_mcs, tvb,
27343
11
                        offset, 4, the_bits);
27344
11
  proto_tree_add_uint(trs_tree, hf_ieee80211_he_ul_reserved, tvb,
27345
11
                        offset, 4, the_bits);
27346
11
}
27347
27348
static void
27349
dissect_a_control_om(proto_tree *tree, tvbuff_t *tvb, int offset,
27350
  uint32_t bits _U_, uint32_t start_bit)
27351
22
{
27352
22
  proto_tree *om_tree = NULL;
27353
22
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x00000FFF;
27354
27355
  /*
27356
   * We isolated the bits and moved them to the bottom ... so display them
27357
   */
27358
22
  om_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27359
22
                                ett_ieee80211_control_om,
27360
22
                                NULL, "OM Control: 0x%04x", the_bits);
27361
27362
22
  proto_tree_add_uint(om_tree, hf_ieee80211_he_om_rx_nss, tvb,
27363
22
                      offset, 4, the_bits);
27364
22
  proto_tree_add_uint(om_tree, hf_ieee80211_he_om_channel_width, tvb,
27365
22
                      offset, 4, the_bits);
27366
22
  proto_tree_add_boolean(om_tree, hf_ieee80211_he_om_ul_mu_disable, tvb,
27367
22
                         offset, 4, the_bits);
27368
22
  proto_tree_add_uint(om_tree, hf_ieee80211_he_om_tx_nsts, tvb,
27369
22
                      offset, 4, the_bits);
27370
22
  proto_tree_add_boolean(om_tree, hf_ieee80211_he_om_er_su_disable, tvb,
27371
22
                         offset, 4, the_bits);
27372
22
  proto_tree_add_boolean(om_tree, hf_ieee80211_he_om_dl_mu_mimo_resound, tvb,
27373
22
                         offset, 4, the_bits);
27374
22
  proto_tree_add_boolean(om_tree, hf_ieee80211_he_om_ul_mu_data_disable, tvb,
27375
22
                         offset, 4, the_bits);
27376
22
}
27377
27378
static const true_false_string he_hla_tx_bf_tfs = {
27379
  "beamformed PPDU",
27380
  "non-beamformed PPDU"
27381
};
27382
27383
static void
27384
dissect_a_control_hla(proto_tree *tree, tvbuff_t *tvb, int offset,
27385
  uint32_t bits _U_, uint32_t start_bit)
27386
4
{
27387
4
  proto_tree *hla_tree = NULL;
27388
4
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
27389
27390
  /*
27391
   * We isolated the bits and moved them to the bottom ... so display them
27392
   */
27393
4
  hla_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27394
4
                                ett_ieee80211_hla_control,
27395
4
                                NULL, "HLA Control: 0x%08x", the_bits);
27396
27397
4
  proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_unsolicited_mfb, tvb,
27398
4
                        offset, 4, the_bits);
27399
4
  proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_mrq, tvb,
27400
4
                        offset, 4, the_bits);
27401
4
  proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_nss, tvb,
27402
4
                        offset, 4, the_bits);
27403
4
  proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_he_mcs, tvb,
27404
4
                        offset, 4, the_bits);
27405
4
  proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_dcm, tvb,
27406
4
                        offset, 4, the_bits);
27407
4
  proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_ru, tvb,
27408
4
                        offset, 4, the_bits);
27409
4
  proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_bw, tvb,
27410
4
                        offset, 4, the_bits);
27411
4
  proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_msi_ppdu_type, tvb,
27412
4
                        offset, 4, the_bits);
27413
4
  proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_tx_bf, tvb,
27414
4
                        offset, 4, the_bits);
27415
4
  proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_reserved, tvb,
27416
4
                        offset, 4, the_bits);
27417
4
}
27418
27419
static void
27420
dissect_a_control_bsr(proto_tree *tree, tvbuff_t *tvb, int offset,
27421
  uint32_t bits _U_, uint32_t start_bit)
27422
9
{
27423
9
  proto_tree *bsr_tree = NULL;
27424
9
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
27425
27426
  /*
27427
   * We isolated the bits and moved them to the bottom ... so display them
27428
   */
27429
9
  bsr_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27430
9
                                ett_ieee80211_buffer_status_report,
27431
9
                                NULL, "Buffer Status Report: 0x%08x", the_bits);
27432
27433
9
  proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_aci_bitmap, tvb,
27434
9
                        offset, 4, the_bits);
27435
9
  proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_delta_tid, tvb,
27436
9
                        offset, 4, the_bits);
27437
9
  proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_aci_high, tvb,
27438
9
                        offset, 4, the_bits);
27439
9
  proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_scaling_factor, tvb,
27440
9
                        offset, 4, the_bits);
27441
9
  proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_queue_size_high, tvb,
27442
9
                        offset, 4, the_bits);
27443
9
  proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_queue_size_all, tvb,
27444
9
                        offset, 4, the_bits);
27445
9
}
27446
27447
static void
27448
dissect_a_control_uph(proto_tree *tree, tvbuff_t *tvb, int offset,
27449
  uint32_t bits _U_, uint32_t start_bit)
27450
27
{
27451
27
  proto_tree *uph_tree = NULL;
27452
27
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000000FF;
27453
27454
  /*
27455
   * We isolated the bits and moved them to the bottom ... so display them
27456
   */
27457
27
  uph_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27458
27
                                ett_ieee80211_control_uph,
27459
27
                                NULL, "UPH Control: 0x%02x", the_bits);
27460
27461
27
  proto_tree_add_uint(uph_tree, hf_ieee80211_he_uph_ul_power_headroom, tvb,
27462
27
                        offset, 4, the_bits);
27463
27
  proto_tree_add_boolean(uph_tree, hf_ieee80211_he_uph_ul_min_transmit_power_flag,
27464
27
                        tvb, offset, 4, the_bits);
27465
27
  proto_tree_add_uint(uph_tree, hf_ieee80211_he_uph_reserved,
27466
27
                        tvb, offset, 4, the_bits);
27467
27
}
27468
27469
static void
27470
dissect_a_control_bqr(proto_tree *tree, tvbuff_t *tvb, int offset,
27471
  uint32_t bits _U_, uint32_t start_bit)
27472
8
{
27473
8
  proto_tree *bqr_tree = NULL;
27474
8
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FF;
27475
27476
  /*
27477
   * We isolated the bits and moved them to the bottom ... so display them
27478
   */
27479
8
  bqr_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27480
8
                                ett_ieee80211_buffer_control_bqr,
27481
8
                                NULL, "BQR Control: 0x%04x", the_bits);
27482
27483
8
  proto_tree_add_uint(bqr_tree, hf_ieee80211_he_btc_avail_chan, tvb,
27484
8
                        offset, 4, the_bits);
27485
8
  proto_tree_add_uint(bqr_tree, hf_ieee80211_he_btc_reserved, tvb,
27486
8
                        offset, 4, the_bits);
27487
8
}
27488
27489
static void
27490
dissect_a_control_cci(proto_tree *tree, tvbuff_t *tvb, int offset,
27491
  uint32_t bits _U_, uint32_t start_bit)
27492
13
{
27493
13
  proto_tree *cci_tree = NULL;
27494
13
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000000FF;
27495
27496
  /*
27497
   * We isolated the bits and moved them to the bottom ... so display them
27498
   */
27499
13
  cci_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27500
13
                                ett_ieee80211_control_cci,
27501
13
                                NULL, "Command and status: 0x%02x", the_bits);
27502
27503
13
  proto_tree_add_boolean(cci_tree, hf_ieee80211_he_cci_ac_constraint, tvb,
27504
13
                        offset, 4, the_bits);
27505
13
  proto_tree_add_boolean(cci_tree, hf_ieee80211_he_cci_rdg_more_ppdu, tvb,
27506
13
                        offset, 4, the_bits);
27507
13
  proto_tree_add_boolean(cci_tree, hf_ieee80211_he_cci_sr_ppdu_indic, tvb,
27508
13
                        offset, 4, the_bits);
27509
13
  proto_tree_add_uint(cci_tree, hf_ieee80211_he_cci_reserved, tvb,
27510
13
                        offset, 4, the_bits);
27511
13
}
27512
27513
static void
27514
dissect_a_control_eht_om(proto_tree *tree, tvbuff_t *tvb, int offset,
27515
  uint32_t bits _U_, uint32_t start_bit)
27516
11
{
27517
11
  proto_tree *eht_om_tree = NULL;
27518
11
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x0000003F;
27519
27520
  /*
27521
   * We isolated the bits and moved them to the bottom ... so display them
27522
   */
27523
11
  eht_om_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27524
11
                                ett_ieee80211_control_eht_om,
27525
11
                                NULL, "EHT operating mode: 0x%02x", the_bits);
27526
11
  proto_tree_add_boolean(eht_om_tree, hf_ieee80211_he_eht_om_rx_nss_ext, tvb,
27527
11
                         offset, 4, the_bits);
27528
11
  proto_tree_add_boolean(eht_om_tree, hf_ieee80211_he_eht_om_chan_w_ext, tvb,
27529
11
                         offset, 4, the_bits);
27530
11
  proto_tree_add_boolean(eht_om_tree, hf_ieee80211_he_eht_om_tx_nsts_ext, tvb,
27531
11
                         offset, 4, the_bits);
27532
11
  proto_tree_add_uint(eht_om_tree, hf_ieee80211_he_eht_om_reserved, tvb,
27533
11
                        offset, 4, the_bits);
27534
27535
11
}
27536
27537
static void
27538
dissect_a_control_srs(proto_tree *tree, tvbuff_t *tvb, int offset,
27539
  uint32_t bits _U_, uint32_t start_bit)
27540
24
{
27541
24
  proto_tree *srs_tree = NULL;
27542
24
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000003FF;
27543
27544
24
  srs_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27545
24
                                ett_ieee80211_control_srs,
27546
24
                                NULL, "Simple response scheduling: 0x%02x",
27547
24
                                the_bits);
27548
24
  proto_tree_add_uint(srs_tree, hf_ieee80211_he_srs_ppdu_resp_dur, tvb,
27549
24
                        offset, 4, the_bits);
27550
24
  proto_tree_add_uint(srs_tree, hf_ieee80211_he_srs_reserved, tvb, offset, 4,
27551
24
                      the_bits);
27552
24
}
27553
27554
static void
27555
dissect_a_control_aar(proto_tree *tree, tvbuff_t *tvb, int offset,
27556
  uint32_t bits _U_, uint32_t start_bit)
27557
15
{
27558
15
  proto_tree *aar_tree = NULL;
27559
15
  unsigned the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000FFFFF;
27560
27561
15
  aar_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
27562
15
                                ett_ieee80211_control_aar,
27563
15
                                NULL, "AP assistance request: 0x%02x",
27564
15
                                the_bits);
27565
15
  proto_tree_add_uint(aar_tree, hf_ieee80211_he_aar_assisted_ap_bitmap, tvb,
27566
15
                      offset, 4, the_bits);
27567
15
  proto_tree_add_uint(aar_tree, hf_ieee80211_he_aar_reserved, tvb, offset, 4,
27568
15
                      the_bits);
27569
15
}
27570
27571
static void
27572
dissect_ht_control(packet_info* pinfo, proto_tree *tree, tvbuff_t *tvb, int offset)
27573
762
{
27574
762
  proto_item *ti;
27575
762
  proto_tree *htc_tree, *lac_subtree, *mfb_subtree;
27576
762
  uint32_t htc;
27577
762
  bool is_s1g = sta_is_s1g(pinfo);
27578
27579
762
  htc = tvb_get_letohl(tvb, offset);
27580
27581
762
  ti = proto_tree_add_item(tree, hf_ieee80211_htc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27582
762
  htc_tree = proto_item_add_subtree(ti, ett_htc_tree);
27583
27584
  /* Check the HT vs. VHT bit. */
27585
762
  proto_tree_add_item(htc_tree, hf_ieee80211_htc_vht, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27586
762
  if (htc & HTC_VHT) {
27587
    /* VHT or HE */
27588
308
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_he, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27589
308
    if (htc & HTC_HE) {
27590
      /*
27591
       * We have a 30-bit field, of which the first is a 4-bit Control ID which
27592
       * determines how the rest is handled. There can be multiple fields.
27593
       */
27594
190
      proto_tree *a_control_tree = NULL;
27595
190
      proto_item *pi = NULL;
27596
190
      uint8_t start_bit_offset = 2;
27597
27598
190
      a_control_tree = proto_tree_add_subtree_format(htc_tree, tvb, offset, 4,
27599
190
                                ett_htc_he_a_control, NULL,
27600
190
                                "Aggregate Control: 0x%0x", htc >> 2);
27601
464
      while (start_bit_offset < 32) {
27602
        /* No enough space for Control ID */
27603
295
        if (start_bit_offset >= 28) {
27604
21
            dissect_a_control_padding(a_control_tree, tvb, offset, htc,
27605
21
                                      start_bit_offset);
27606
21
            break;
27607
21
        }
27608
274
        uint8_t control_id = (htc >> start_bit_offset) & 0x0F;
27609
274
        start_bit_offset += 4;
27610
274
        if (control_id != 0 || start_bit_offset == 6) {
27611
263
          pi = proto_tree_add_uint(a_control_tree, hf_ieee80211_htc_he_ctrl_id,
27612
263
                        tvb, offset, 4, control_id);
27613
263
          proto_item_append_text(pi, ": %s",
27614
263
                        val_to_str(control_id, a_control_control_id_vals,
27615
263
                                        "Reserved (%u)"));
27616
263
        }
27617
274
        if (start_bit_offset > 31) {
27618
0
          expert_add_info(pinfo, a_control_tree, &ei_ieee80211_invalid_control_word);
27619
0
          break;
27620
0
        }
27621
274
        switch (control_id) {
27622
22
        case A_CONTROL_TRS:
27623
          /*
27624
           * Padding looks like TRS ... so distinguish. If there are not
27625
           * enough bits left it must be padding
27626
           */
27627
22
          if (start_bit_offset == 6)
27628
11
            dissect_a_control_trs(a_control_tree, tvb, offset, htc,
27629
11
                                  start_bit_offset);
27630
11
          else
27631
11
            dissect_a_control_padding(a_control_tree, tvb, offset, htc,
27632
11
                                      start_bit_offset - 4);
27633
22
          start_bit_offset += 26;
27634
22
          break;
27635
22
        case A_CONTROL_OM:
27636
22
          dissect_a_control_om(a_control_tree, tvb, offset, htc,
27637
22
                               start_bit_offset);
27638
22
          start_bit_offset += 12;
27639
22
          break;
27640
4
        case A_CONTROL_HLA:
27641
4
          dissect_a_control_hla(a_control_tree, tvb, offset, htc,
27642
4
                                start_bit_offset);
27643
4
          start_bit_offset += 26;
27644
4
          break;
27645
9
        case A_CONTROL_BSR:
27646
9
          dissect_a_control_bsr(a_control_tree, tvb, offset, htc,
27647
9
                                start_bit_offset);
27648
9
          start_bit_offset += 26;
27649
9
          break;
27650
27
        case A_CONTROL_UPH:
27651
27
          dissect_a_control_uph(a_control_tree, tvb, offset, htc,
27652
27
                                start_bit_offset);
27653
27
          start_bit_offset += 8;
27654
27
          break;
27655
8
        case A_CONTROL_BQR:
27656
8
          dissect_a_control_bqr(a_control_tree, tvb, offset, htc,
27657
8
                                start_bit_offset);
27658
8
          start_bit_offset += 10;
27659
8
          break;
27660
13
        case A_CONTROL_CCI:
27661
13
          dissect_a_control_cci(a_control_tree, tvb, offset, htc,
27662
13
                                start_bit_offset);
27663
13
          start_bit_offset += 8;
27664
13
          break;
27665
11
        case A_CONTROL_EHT_OM:
27666
11
          dissect_a_control_eht_om(a_control_tree, tvb, offset, htc,
27667
11
                                   start_bit_offset);
27668
11
          start_bit_offset += 6;
27669
11
          break;
27670
24
        case A_CONTROL_SRS:
27671
24
          dissect_a_control_srs(a_control_tree, tvb, offset, htc,
27672
24
                                start_bit_offset);
27673
24
          start_bit_offset += 10;
27674
24
          break;
27675
15
        case A_CONTROL_AAR:
27676
15
          dissect_a_control_aar(a_control_tree, tvb, offset, htc,
27677
15
                                start_bit_offset);
27678
15
          start_bit_offset += 20;
27679
15
          break;
27680
62
        case A_CONTROL_ONES:
27681
62
          if (start_bit_offset == 6) {
27682
59
            dissect_a_control_ones(a_control_tree, tvb, offset, htc,
27683
59
                                   start_bit_offset);
27684
59
          } else {
27685
3
            expert_add_info(pinfo, a_control_tree, &ei_ieee80211_invalid_control_length);
27686
3
          }
27687
62
          start_bit_offset += 26;
27688
62
          break;
27689
57
        default:
27690
57
          expert_add_info(pinfo, a_control_tree, &ei_ieee80211_invalid_control_id);
27691
57
          start_bit_offset += 32;  /* Abandon */
27692
57
          break;
27693
274
        }
27694
274
      }
27695
190
    } else {
27696
118
      proto_tree_add_item(htc_tree, hf_ieee80211_htc_mrq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27697
118
      if (!(htc & HTC_UNSOLICITED_MFB)) {
27698
73
        if (htc & HTC_MRQ) {
27699
36
          proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27700
37
        } else {
27701
37
          proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi_stbc_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27702
37
        }
27703
73
        proto_tree_add_item(htc_tree, hf_ieee80211_htc_mfsi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27704
73
      } else {
27705
45
        if (!HTC_NO_FEEDBACK_PRESENT(HTC_MFB(htc))) {
27706
37
          proto_tree_add_item(htc_tree, hf_ieee80211_htc_compressed_msi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27707
37
          proto_tree_add_item(htc_tree, hf_ieee80211_htc_ppdu_stbc_encoded, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27708
37
        } else {
27709
8
          proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi_stbc_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27710
8
        }
27711
45
        proto_tree_add_item(htc_tree, hf_ieee80211_htc_gid_l, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27712
45
      }
27713
118
      ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_mfb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27714
118
      mfb_subtree = proto_item_add_subtree(ti, ett_mfb_subtree);
27715
118
      if (is_s1g) {
27716
5
        proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_s1g_num_sts, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27717
5
        proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_s1g_vht_mcs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27718
5
        proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_s1g_bw, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27719
113
      } else {
27720
113
        proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_num_sts, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27721
113
        proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_vht_mcs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27722
113
        proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_bw, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27723
113
      }
27724
      /* This should be converted to dB by adding 22  */
27725
118
      proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_snr, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27726
118
      if (!HTC_NO_FEEDBACK_PRESENT(HTC_MFB(htc))) {
27727
105
        proto_tree_add_item(htc_tree, hf_ieee80211_htc_gid_h, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27728
105
        proto_tree_add_item(htc_tree, hf_ieee80211_htc_coding_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27729
105
        proto_tree_add_item(htc_tree, hf_ieee80211_htc_fb_tx_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27730
105
      } else {
27731
13
        proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved3, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27732
13
      }
27733
118
      proto_tree_add_item(htc_tree, hf_ieee80211_htc_unsolicited_mfb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27734
118
    }
27735
454
  } else {
27736
    /* Start: Link Adaptation Control */
27737
454
    ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_ht_lac, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27738
454
    lac_subtree = proto_item_add_subtree(ti, ett_lac_subtree);
27739
454
    proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_trq, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27740
27741
454
    if (HTC_IS_ASELI(htc)) {
27742
17
      proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_aseli, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27743
437
    } else {
27744
437
      proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_mrq, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27745
437
      if (HTC_LAC_MAI_MRQ(htc)) {
27746
65
        proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_msi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27747
372
      } else {
27748
372
        proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27749
372
      }
27750
437
    }
27751
27752
454
    proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mfsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27753
27754
454
    if (HTC_IS_ASELI(htc)) {
27755
17
      proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_asel_command, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27756
17
      proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_asel_data, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27757
437
    } else {
27758
437
      proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mfb, tvb, offset, 2, ENC_LITTLE_ENDIAN);
27759
437
    }
27760
    /* End: Link Adaptation Control */
27761
27762
454
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_cal_pos, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27763
454
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_cal_seq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27764
454
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved1, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27765
454
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_csi_steering, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27766
27767
454
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_ndp_announcement, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27768
454
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved2, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27769
454
  }
27770
27771
  /*
27772
   * These bits are part of the Aggregate Control field for 802.11ax
27773
   */
27774
762
  if (!(htc & HTC_HE)) {
27775
489
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_ac_constraint, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27776
489
    proto_tree_add_item(htc_tree, hf_ieee80211_htc_rdg_more_ppdu, tvb, offset, 4, ENC_LITTLE_ENDIAN);
27777
489
  }
27778
27779
  /* offset += 2; */
27780
762
}
27781
27782
31.6k
#define IEEE80211_COMMON_OPT_BROKEN_FC         0x00000001
27783
245
#define IEEE80211_COMMON_OPT_IS_CENTRINO       0x00000002
27784
14.6k
#define IEEE80211_COMMON_OPT_NORMAL_QOS        0x00000004
27785
27786
static void
27787
dissect_frame_control(proto_tree *tree, tvbuff_t *tvb, uint32_t option_flags,
27788
                      uint32_t offset, packet_info *pinfo, bool isDMG)
27789
5.91k
{
27790
5.91k
  uint16_t fcf, flags, frame_type_subtype;
27791
5.91k
  proto_tree *fc_tree, *flag_tree;
27792
5.91k
  proto_item *fc_item, *flag_item, *hidden_item, *ti;
27793
5.91k
  uint32_t swap_offset = 0;
27794
5.91k
  bool is_s1g = sta_is_s1g(pinfo);
27795
5.91k
  bool s1g_has_protected_htc_order;
27796
27797
5.91k
  fcf = FETCH_FCF(offset);
27798
27799
5.91k
  flags = FCF_FLAGS(fcf);
27800
5.91k
  frame_type_subtype = COMPOSE_FRAME_TYPE(fcf);
27801
27802
  /* Swap offset... */
27803
5.91k
  if(option_flags & IEEE80211_COMMON_OPT_BROKEN_FC)
27804
301
  {
27805
301
    swap_offset += 1;
27806
301
  }
27807
27808
5.91k
  proto_tree_add_uint(tree, hf_ieee80211_fc_frame_type_subtype, tvb, offset + swap_offset, 1, frame_type_subtype);
27809
27810
5.91k
  fc_item = proto_tree_add_item(tree, hf_ieee80211_fc_field, tvb, offset, 2, ENC_BIG_ENDIAN);
27811
27812
5.91k
  fc_tree = proto_item_add_subtree(fc_item, ett_fc_tree);
27813
27814
 /* at this point, we can permanently fix the offset, so that it will be used to parse the fcf first 8 bits */
27815
5.91k
  offset += swap_offset;
27816
27817
5.91k
  proto_tree_add_item(fc_tree, hf_ieee80211_fc_proto_version, tvb, offset, 1, ENC_NA);
27818
5.91k
  proto_tree_add_item(fc_tree, hf_ieee80211_fc_frame_type, tvb, offset, 1, ENC_NA);
27819
5.91k
  proto_tree_add_item(fc_tree, hf_ieee80211_fc_frame_subtype, tvb, offset, 1, ENC_NA);
27820
  /* Changing control frame extension for extension frames */
27821
5.91k
  if(IS_FRAME_EXTENSION(fcf) == 1) {
27822
33
    proto_tree_add_uint(fc_tree, hf_ieee80211_fc_frame_extension, tvb, offset, 1, FCF_FRAME_EXTENSION(fcf));
27823
33
  }
27824
27825
  /* Reswap offset...*/
27826
5.91k
  if(option_flags & IEEE80211_COMMON_OPT_BROKEN_FC)
27827
301
  {
27828
301
    offset -= 1;
27829
301
    proto_item_append_text(fc_item, "(Swapped)");
27830
5.61k
  } else {
27831
5.61k
    offset += 1;
27832
5.61k
  }
27833
27834
  /*
27835
   * S1G has a different format in the flags portion.
27836
   */
27837
5.91k
  if (frame_type_subtype == EXTENSION_S1G_BEACON) {
27838
558
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_s1g_next_tbtt_present, tvb,
27839
558
                        offset, 1, ENC_NA);
27840
558
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_s1g_compressed_ssid_present,
27841
558
                        tvb, offset, 1, ENC_NA);
27842
558
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_s1g_ano_present, tvb,
27843
558
                        offset, 1, ENC_NA);
27844
558
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_s1g_bss_bw, tvb, offset, 1,
27845
558
                        ENC_NA);
27846
558
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_s1g_security, tvb, offset, 1,
27847
558
                        ENC_NA);
27848
558
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_s1g_ap_pm, tvb, offset, 1,
27849
558
                        ENC_NA);
27850
27851
558
    return;
27852
558
  }
27853
27854
  /* Flags */
27855
5.35k
  flag_item = proto_tree_add_item(fc_tree, hf_ieee80211_fc_flags, tvb, offset, 1, ENC_NA);
27856
5.35k
  flag_tree = proto_item_add_subtree(flag_item, ett_proto_flags);
27857
5.35k
  if (is_s1g && FCF_FRAME_TYPE(fcf) == CONTROL_FRAME) {
27858
1
    proto_tree_add_item(flag_tree, hf_ieee80211_fc_s1g_bw_indication, tvb, offset, 1, ENC_LITTLE_ENDIAN);
27859
1
    proto_tree_add_item(flag_tree, hf_ieee80211_fc_s1g_dynamic_indication, tvb, offset, 1, ENC_NA);
27860
5.35k
  } else if(IS_FRAME_EXTENSION(fcf) == 0) {
27861
    /* Changing control frame flags for extension frames */
27862
5.31k
    proto_tree_add_item(flag_tree, hf_ieee80211_fc_data_ds, tvb, offset, 1, ENC_NA);
27863
5.31k
    hidden_item = proto_tree_add_item(flag_tree, hf_ieee80211_fc_to_ds, tvb, offset, 1, ENC_NA);
27864
5.31k
    proto_item_set_hidden(hidden_item);
27865
5.31k
    hidden_item = proto_tree_add_item(flag_tree, hf_ieee80211_fc_from_ds, tvb, offset, 1, ENC_NA);
27866
5.31k
    proto_item_set_hidden(hidden_item);
27867
5.31k
    proto_tree_add_item(flag_tree, hf_ieee80211_fc_more_frag, tvb, offset, 1, ENC_NA);
27868
5.31k
    ti = proto_tree_add_item(flag_tree, hf_ieee80211_fc_retry, tvb, offset, 1, ENC_NA);
27869
5.31k
    if( IS_RETRY(flags) )
27870
1.54k
    {
27871
1.54k
      expert_add_info(pinfo, ti, &ei_ieee80211_fc_retry);
27872
1.54k
      wlan_stats.fc_retry = 1;
27873
1.54k
    }
27874
5.31k
  }
27875
5.35k
  proto_tree_add_item(flag_tree, hf_ieee80211_fc_pwr_mgt, tvb, offset, 1, ENC_NA);
27876
5.35k
  proto_tree_add_item(flag_tree, hf_ieee80211_fc_more_data, tvb, offset, 1, ENC_NA);
27877
  /* Changing control frame flags for extension frames */
27878
  /* TODO: add support for S1G subtypes 3 and 10 fields: flow control, next TWT
27879
     info present, more data, poll type */
27880
  /* All S1G frames have the Protected Frame and +HTC/Order subfields except for
27881
     Control frames with subtypes 3 and 10 */
27882
5.35k
  s1g_has_protected_htc_order = is_s1g && (FCF_FRAME_TYPE(fcf) != CONTROL_FRAME
27883
2
                                           || (FCF_FRAME_SUBTYPE(fcf) != 3 && FCF_FRAME_SUBTYPE(fcf) != 10));
27884
5.35k
  if (s1g_has_protected_htc_order || (!is_s1g && IS_FRAME_EXTENSION(fcf) == 0)) {
27885
5.31k
    proto_tree_add_item(flag_tree, hf_ieee80211_fc_protected, tvb, offset, 1, ENC_NA);
27886
5.31k
  }
27887
5.35k
  if (s1g_has_protected_htc_order || !is_s1g) {
27888
5.35k
    ti = proto_tree_add_item(flag_tree, hf_ieee80211_fc_order, tvb, offset, 1, ENC_NA);
27889
5.35k
    if (option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) {
27890
5.31k
      if (DATA_FRAME_IS_QOS(frame_type_subtype)) {
27891
1.20k
        if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
27892
          /*
27893
           * IEEE 802.11-2016 section 9.2.4.1.10 "+HTC/Order subfield" says:
27894
           *
27895
           *  The +HTC/Order subfield is 1 bit in length. It is used for two
27896
           *  purposes:
27897
           *
27898
           *    -- It is set to 1 in a non-QoS Data frame transmitted by a
27899
           *       non-QoS STA to indicate that the frame contains an MSDU,
27900
           *       or fragment thereof, that is being transferred using the
27901
           *       StrictlyOrdered service class.
27902
           *
27903
           *    -- It is set to 1 in a QoS Data or Management frame transmitted
27904
           *       with a value of HT_GF, HT_MF, or VHT for the FORMAT parameter
27905
           *       of the TXVECTOR to indicate that the frame contains an
27906
           *       HT Control field.
27907
           *
27908
           *  Otherwise, the +HTC/Order subfield is set to 0.
27909
           *
27910
           *  NOTE -- The +HTC/Order subfield is always set to 0 for frames
27911
           *  transmitted by a DMG STA.
27912
           *
27913
           * and 802.11ax drafts appear to say that the +HTC/Order flag, for
27914
           * QoS frames, also indicates that there's an HT Control field.
27915
           *
27916
           * For DMG frames, we flag this as an error.
27917
           *
27918
           * XXX - as I read the above, this shouldn't be set except for
27919
           * HT, VHT, or HE PHYs; however, some QoS frames appear to have
27920
           * it set, and have an HT Control field, even though they don't
27921
           * have HT/VHT/HE radiotap fields.  That might be because the
27922
           * code that provided the header didn't provide those radiotap
27923
           * fields, or because there is no radiotap header, meaning that
27924
           * they might still be HT/VHT/HE frames, so we don't report it
27925
           * as an error.
27926
           */
27927
523
          if (isDMG) {
27928
            /*
27929
             * DMG, so flag this as having +HTC/Order set, as it's not supposed
27930
             * to be set.
27931
             */
27932
4
            expert_add_info(pinfo, ti, &ei_ieee80211_htc_in_dmg_packet);
27933
4
          }
27934
523
        }
27935
1.20k
      }
27936
5.31k
    }
27937
5.35k
  }
27938
5.35k
}
27939
27940
static void
27941
dissect_durid(proto_tree *hdr_tree, tvbuff_t *tvb, uint16_t fts, int offset)
27942
5.87k
{
27943
5.87k
  uint16_t durid = tvb_get_letohs(tvb, offset);
27944
27945
5.87k
  if (durid < 0x8000) {
27946
4.47k
    proto_tree_add_uint_format_value(hdr_tree, hf_ieee80211_did_duration, tvb,
27947
4.47k
      offset, 2, durid, "%u microseconds", durid);
27948
4.47k
  } else if (((durid & 0xC000) == 0xC000) &&
27949
1.39k
             ((durid & 0x3FFF) > 0) && ((durid & 0x3FFF) <= 2007) &&
27950
1.39k
             (fts == CTRL_PS_POLL)) {
27951
1
    proto_tree_add_item(hdr_tree, hf_ieee80211_assoc_id, tvb, offset, 2,
27952
1
      ENC_LITTLE_ENDIAN);
27953
1.39k
  } else if (durid == 0x8000) {
27954
9
    proto_tree_add_uint_format(hdr_tree, hf_ieee80211_did_duration, tvb,
27955
9
      offset, 2, durid, "Duration/ID: %u", durid);
27956
1.38k
  } else {
27957
1.38k
    proto_tree_add_uint_format(hdr_tree, hf_ieee80211_did_duration, tvb,
27958
1.38k
      offset, 2, durid, "Duration/ID: %u (reserved)", durid & 0x3FFF);
27959
1.38k
  }
27960
5.87k
}
27961
27962
27963
static void
27964
dissect_vendor_ie_ht(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
27965
                    unsigned offset, proto_item *item, proto_item *ti_len, int tag_len)
27966
0
{
27967
27968
0
  uint8_t type;
27969
27970
0
  proto_tree_add_item(tree, hf_ieee80211_ht_pren_type, tvb, offset, 1, ENC_NA);
27971
0
  type = tvb_get_uint8(tvb, offset);
27972
0
  offset += 1;
27973
0
  tag_len -= 1;
27974
27975
27976
0
  switch(type){
27977
0
    case 51:
27978
0
      dissect_ht_capability_ie_common(tvb, pinfo, tree, offset, tag_len, ti_len, true);
27979
0
      proto_item_append_text(item, ": HT Capabilities (802.11n D1.10)");
27980
0
    break;
27981
27982
0
    case 52:
27983
0
      dissect_ht_info_ie_1_0(tvb, pinfo, tree, offset, tag_len, ti_len);
27984
0
      proto_item_append_text(item, ": HT Additional Capabilities (802.11n D1.00)");
27985
0
    break;
27986
27987
0
    default:
27988
0
      proto_tree_add_item(tree, hf_ieee80211_ht_pren_unknown, tvb, offset, tag_len, ENC_NA);
27989
0
    break;
27990
0
  }
27991
27992
0
}
27993
27994
static int
27995
dissect_interworking(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
27996
166
{
27997
166
  int tag_len = tvb_reported_length(tvb);
27998
166
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
27999
166
  int offset = 0;
28000
166
  static int * const ieee80211_tag_interworking[] = {
28001
166
    &hf_ieee80211_tag_interworking_access_network_type,
28002
166
    &hf_ieee80211_tag_interworking_internet,
28003
166
    &hf_ieee80211_tag_interworking_asra,
28004
166
    &hf_ieee80211_tag_interworking_esr,
28005
166
    &hf_ieee80211_tag_interworking_uesa,
28006
166
    NULL
28007
166
  };
28008
28009
166
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_interworking, ENC_LITTLE_ENDIAN);
28010
166
  offset += 1;
28011
28012
166
  if ((tag_len == (1 + 2)) || (tag_len == (1 + 2 + 6))) {
28013
20
    dissect_venue_info(tree, tvb, offset);
28014
20
    offset += 2;
28015
20
  }
28016
28017
166
  if ((tag_len == (1 + 6)) || (tag_len == (1 + 2 + 6))) {
28018
8
    proto_tree_add_item(tree, hf_ieee80211_tag_interworking_hessid,
28019
8
                        tvb, offset, 6, ENC_NA);
28020
8
    offset += 6;
28021
8
  }
28022
28023
166
  if ((tag_len != 1) && (tag_len != (1 + 2)) && (tag_len != (1 + 6)) && (tag_len != (1 + 2 + 6))) {
28024
136
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
28025
136
                           "Invalid Interworking element length");
28026
136
  }
28027
28028
166
  return offset;
28029
166
}
28030
28031
static int
28032
dissect_qos_map_set(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
28033
261
{
28034
261
  int tag_len = tvb_reported_length(tvb);
28035
261
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
28036
261
  int offset = 0;
28037
261
  uint8_t left;
28038
261
  uint8_t val, val2;
28039
261
  int i;
28040
261
  proto_item *dscp_item, *item;
28041
261
  proto_tree *dscp_tree;
28042
28043
261
  if (tag_len < 16 || tag_len & 1) {
28044
54
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_bad_length,
28045
54
                                "Truncated QoS Map Set element");
28046
54
    return tvb_captured_length(tvb);
28047
54
  }
28048
28049
207
  left = tag_len - 16;
28050
7.62k
  while (left >= 2) {
28051
7.41k
    dscp_item = proto_tree_add_item(tree, hf_ieee80211_tag_qos_map_set_dscp_exc,
28052
7.41k
                                    tvb, offset, 2, ENC_LITTLE_ENDIAN);
28053
7.41k
    dscp_tree = proto_item_add_subtree(dscp_item, ett_qos_map_set_exception);
28054
28055
7.41k
    item = proto_tree_add_item(dscp_tree,
28056
7.41k
                               hf_ieee80211_tag_qos_map_set_dscp_exc_val,
28057
7.41k
                               tvb, offset, 1, ENC_NA);
28058
7.41k
    val = tvb_get_uint8(tvb, offset);
28059
7.41k
    if (val > 63 && val != 255) {
28060
3.72k
      expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
28061
3.72k
                                  "Invalid DSCP Value");
28062
3.72k
    }
28063
7.41k
    offset++;
28064
28065
7.41k
    item = proto_tree_add_item(dscp_tree,
28066
7.41k
                               hf_ieee80211_tag_qos_map_set_dscp_exc_up,
28067
7.41k
                               tvb, offset, 1, ENC_NA);
28068
7.41k
    val2 = tvb_get_uint8(tvb, offset);
28069
7.41k
    if (val2 > 7) {
28070
5.39k
      expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
28071
5.39k
                                  "Invalid User Priority");
28072
5.39k
    }
28073
7.41k
    offset++;
28074
28075
7.41k
    proto_item_append_text(dscp_item, " (0x%02x: UP %u)", val, val2);
28076
28077
7.41k
    left -= 2;
28078
7.41k
  }
28079
28080
1.43k
  for (i = 0; i < 8; i++) {
28081
1.23k
    dscp_item = proto_tree_add_item(tree, hf_ieee80211_tag_qos_map_set_range,
28082
1.23k
                                    tvb, offset, 2, ENC_NA);
28083
1.23k
    dscp_tree = proto_item_add_subtree(dscp_item, ett_qos_map_set_exception);
28084
28085
1.23k
    item = proto_tree_add_item(dscp_tree, hf_ieee80211_tag_qos_map_set_low,
28086
1.23k
                               tvb, offset, 1, ENC_NA);
28087
1.23k
    val = tvb_get_uint8(tvb, offset);
28088
1.23k
    if (val > 63 && val != 255) {
28089
554
      expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
28090
554
                                  "Invalid DSCP Value");
28091
554
    }
28092
1.23k
    offset++;
28093
28094
1.23k
    item = proto_tree_add_item(dscp_tree, hf_ieee80211_tag_qos_map_set_high,
28095
1.23k
                               tvb, offset, 1, ENC_NA);
28096
1.23k
    val2 = tvb_get_uint8(tvb, offset);
28097
1.23k
    if ((val2 > 63 && val2 != 255) || val2 < val ||
28098
1.23k
        (val == 255 && val2 != 255) || (val != 255 && val2 == 255)) {
28099
736
      expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
28100
736
                                  "Invalid DSCP Value");
28101
736
    }
28102
1.23k
    offset++;
28103
28104
1.23k
    if (val == 255 && val2 == 255) {
28105
124
      proto_item_append_text(dscp_item, " (UP %u not in use)", i);
28106
1.10k
    } else {
28107
1.10k
      proto_item_append_text(dscp_item, " (0x%02x-0x%02x: UP %u)",
28108
1.10k
                             val, val2, i);
28109
1.10k
    }
28110
1.23k
  }
28111
28112
207
  return tvb_captured_length(tvb);
28113
261
}
28114
28115
static int
28116
dissect_roaming_consortium(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
28117
166
{
28118
166
  int tag_len = tvb_reported_length(tvb);
28119
166
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
28120
166
  int offset = 0;
28121
166
  proto_item* item;
28122
166
  uint8_t oi_lens, oi1_len, oi2_len;
28123
28124
166
  proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_num_anqp_oi,
28125
166
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
28126
166
  offset += 1;
28127
28128
166
  oi_lens = tvb_get_uint8(tvb, offset);
28129
166
  oi1_len = oi_lens & 0x0f;
28130
166
  oi2_len = (oi_lens & 0xf0) >> 4;
28131
166
  proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi1_len,
28132
166
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
28133
166
  proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi2_len,
28134
166
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
28135
166
  offset += 1;
28136
28137
166
  if (offset + oi1_len > tag_len) {
28138
18
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
28139
18
                           "Truncated Roaming Consortium element");
28140
18
    return tvb_captured_length(tvb);
28141
18
  }
28142
28143
148
  item = proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi1,
28144
148
                             tvb, offset, oi1_len, ENC_NA);
28145
148
  add_manuf(item, tvb, offset);
28146
148
  offset += oi1_len;
28147
28148
148
  if (offset + oi2_len > tag_len) {
28149
10
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
28150
10
                           "Truncated Roaming Consortium element");
28151
10
    return tvb_captured_length(tvb);
28152
10
  }
28153
28154
138
  if (oi2_len > 0) {
28155
101
    item = proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi2,
28156
101
                        tvb, offset, oi2_len, ENC_NA);
28157
101
    add_manuf(item, tvb, offset);
28158
101
    offset += oi2_len;
28159
101
  }
28160
28161
138
  if (tag_len > offset) {
28162
124
    proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi3,
28163
124
                        tvb, offset, tag_len - offset, ENC_NA);
28164
124
  }
28165
28166
138
  return tvb_captured_length(tvb);
28167
148
}
28168
28169
static void
28170
dissect_extended_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int len)
28171
79
{
28172
79
  if (len < 2) {
28173
15
    expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
28174
15
                           "Extended Request must be at least 2 octets long");
28175
15
    return;
28176
15
  }
28177
28178
64
  proto_tree_add_item(tree, hf_ieee80211_tag_extended_request_id, tvb, offset, 1, ENC_NA);
28179
64
  offset += 1;
28180
64
  len -= 1;
28181
28182
1.52k
  while (len--) {
28183
1.45k
    proto_tree_add_item(tree, hf_ieee80211_tag_extended_request_extension, tvb, offset, 1, ENC_NA);
28184
1.45k
    offset += 1;
28185
1.45k
  }
28186
64
}
28187
28188
static void
28189
dissect_he_6ghz_band_capabilities(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int len)
28190
6
{
28191
6
  if (len != 2) {
28192
5
    expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
28193
5
                           "HE 6 GHz Band Capabilities must be at 2 octets long");
28194
5
    return;
28195
5
  }
28196
28197
1
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_he_6ghz_cap_inf,
28198
1
                         ett_tag_he_6ghz_cap_inf_tree,
28199
1
                         ieee80211_tag_he_6ghz_cap_inf,
28200
1
                         ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
28201
1
}
28202
28203
static void
28204
dissect_secure_ltf_parameters(tvbuff_t *tvb, packet_info *pinfo _U_,
28205
                              proto_tree *tree, int offset, int len _U_)
28206
2
{
28207
2
  proto_tree_add_item(tree, hf_ieee80211_tag_secure_ltf_params_counter, tvb,
28208
2
                      offset, 6, ENC_LITTLE_ENDIAN);
28209
2
  offset += 6;
28210
28211
2
  proto_tree_add_item(tree, hf_ieee80211_tag_secure_ltf_generation_sac, tvb,
28212
2
                      offset, 2, ENC_LITTLE_ENDIAN);
28213
2
  offset += 2;
28214
28215
2
  proto_tree_add_item(tree, hf_ieee80211_tag_secure_ltf_management_sac, tvb,
28216
2
                      offset, 2, ENC_LITTLE_ENDIAN);
28217
2
  offset += 2;
28218
28219
2
  proto_tree_add_item(tree, hf_ieee80211_tag_secure_ltf_result_ltf_ofs, tvb,
28220
2
                      offset, 1, ENC_NA);
28221
2
}
28222
28223
static void
28224
dissect_ista_availability_window(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, int len)
28225
29
{
28226
29
  uint16_t count = tvb_get_letohs(tvb, offset) & 0x1FF;
28227
29
  char avail_string[513];
28228
29
  char pad_string[8];
28229
29
  int i = 0, j;
28230
29
  int avail_bits_offset;
28231
29
  int8_t bits;
28232
28233
29
  memset(avail_string, 0x0, sizeof(avail_string));
28234
29
  memset(pad_string, 0x0, sizeof(pad_string));
28235
28236
  /* These are at the same level as the avail bits */
28237
29
  proto_tree_add_item(tree, hf_ieee80211_ftm_ista_availability_count,
28238
29
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
28239
29
  proto_tree_add_item(tree, hf_ieee80211_ftm_ista_availability_reserved,
28240
29
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
28241
29
  offset += 2;
28242
28243
29
  avail_bits_offset = offset;
28244
28245
  /* Now, extract count  bits and set up the string 8-bits at a time */
28246
385
  for (i = 1; i <= (count / 8); i++) {
28247
356
    bits = tvb_get_uint8(tvb, offset);
28248
28249
3.16k
    for (j = 0; j < 8; j++) {
28250
2.80k
      avail_string[(i - 1) * 8 + j] = (bits & 0x01) ? '1' : '0';
28251
2.80k
      bits = bits >> 1;
28252
2.80k
    }
28253
28254
356
    offset += 1;
28255
356
  }
28256
28257
29
  avail_string[i * 8] = 0;
28258
28259
29
  if (count % 8) {
28260
    /* Deal with the remaining bits */
28261
18
    bits = tvb_get_uint8(tvb, offset);
28262
28263
84
    for (j = (i - 1) * 8; j < count; j++) {
28264
66
      avail_string[j] = (bits & 0x01) ? '1' : '0';
28265
66
      bits = bits >> 1;
28266
66
    }
28267
28268
18
    avail_string[j] = 0;
28269
28270
    /* Deal with the padding */
28271
96
    for (j = 0; j < 8 - (count % 8); j++) {
28272
78
      pad_string[j] = (bits & 0x01) ? '1' : '0';
28273
78
      bits = bits >> 1;
28274
78
    }
28275
28276
18
    pad_string[j] = 0;
28277
18
  }
28278
28279
29
  proto_tree_add_string(tree, hf_ieee80211_ftm_ista_avail_bits, tvb,
28280
29
                        avail_bits_offset, (count + 7) / 8, avail_string);
28281
28282
29
  if (((len - 2) * 8) != count) {
28283
22
    proto_tree_add_string(tree, hf_ieee80211_ftm_ista_avail_pad, tvb,
28284
22
                          offset, 1, pad_string);
28285
22
  }
28286
29
}
28287
28288
static int * const rsta_avail_info_header[] = {
28289
  &hf_ieee80211_ftm_rsta_count,
28290
  &hf_ieee80211_ftm_rsta_avail_window_bcast_fmt,
28291
  NULL
28292
};
28293
28294
static int * const rsta_availability_subfield_hdr1[] = {
28295
  &hf_ieee80211_ftm_rsta_partial_tsf_timer1,
28296
  &hf_ieee80211_ftm_rsta_duration1,
28297
  &hf_ieee80211_ftm_rsta_passive_tb_ranging_reserved1,
28298
  &hf_ieee80211_ftm_rsta_periodicity1,
28299
  NULL
28300
};
28301
28302
static int * const rsta_availability_subfield_hdr2[] = {
28303
  &hf_ieee80211_ftm_rsta_partial_tsf_timer,
28304
  &hf_ieee80211_ftm_rsta_duration,
28305
  &hf_ieee80211_ftm_rsta_passive_tb_ranging_reserved,
28306
  &hf_ieee80211_ftm_rsta_periodicity,
28307
  &hf_ieee80211_ftm_rsta_format_and_bandwidth,
28308
  &hf_ieee80211_ftm_rsta_reserved,
28309
  NULL
28310
};
28311
28312
static void
28313
dissect_rsta_availability_window(tvbuff_t *tvb, packet_info *pinfo _U_,
28314
                                 proto_tree *tree, int offset, int len _U_)
28315
36
{
28316
36
  uint8_t count = tvb_get_uint8(tvb, offset) &0x7F;
28317
36
  int i;
28318
28319
36
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ftm_rsta_header,
28320
36
                         ett_rsta_avail_header, rsta_avail_info_header, ENC_NA);
28321
28322
36
  offset += 1;
28323
28324
902
  for (i = 0; i < count; i++) {
28325
866
    proto_tree *subfield_tree = NULL;
28326
866
    bool has_passive_ranging_params =
28327
866
                (tvb_get_letohl(tvb, offset) >> 23) & 1;
28328
28329
866
    subfield_tree = proto_tree_add_subtree_format(tree, tvb, offset,
28330
866
                                           has_passive_ranging_params ? 5 : 4,
28331
866
                                           ett_rsta_avail_tree, NULL,
28332
866
                                           "Availability Window Information %d",
28333
866
                                           i);
28334
866
    if (has_passive_ranging_params) {
28335
186
      proto_tree_add_bitmask(subfield_tree, tvb, offset,
28336
186
                             hf_ieee80211_ftm_rsta_avail_subfield_long,
28337
186
                             ett_rsta_avail_subfield,
28338
186
                             rsta_availability_subfield_hdr2,
28339
186
                             ENC_LITTLE_ENDIAN);
28340
186
      offset += 5;
28341
680
    } else {
28342
680
      proto_tree_add_bitmask(subfield_tree, tvb, offset,
28343
680
                             hf_ieee80211_ftm_rsta_avail_subfield_short,
28344
680
                             ett_rsta_avail_subfield,
28345
680
                             rsta_availability_subfield_hdr1,
28346
680
                             ENC_LITTLE_ENDIAN);
28347
680
      offset += 4;
28348
680
    }
28349
866
  }
28350
36
}
28351
28352
/*
28353
 * "Comeback after subfield shall not be present (ie, zero octets) in PASN
28354
 * authentication frames from a non-AP STA."
28355
 *
28356
 * Attempt to figure out if the Comeback After field is present.
28357
 */
28358
16
#define PASN_COMEBACK_INFO_PRESENT 0x01
28359
23
#define PASN_GROUP_KEY_PRESENT     0x02
28360
28361
static bool
28362
has_comeback_after(uint8_t flags, tvbuff_t *tvb, int offset, int len _U_)
28363
7
{
28364
7
  int tvb_left = tvb_captured_length_remaining(tvb, offset);
28365
7
  bool comeback_after = false;
28366
  //int cookie_len = 0;
28367
7
  int fixed_len = 0;
28368
28369
7
  if (flags & PASN_GROUP_KEY_PRESENT) { /* Group and Key present */
28370
3
    fixed_len += 2;
28371
3
  }
28372
28373
  /*
28374
   * If there is a comeback field and the comback_after is present ...
28375
   */
28376
7
  if (flags & 0x01) {
28377
        /* Check if the comeback_after field is there? */
28378
7
        if (tvb_get_letohs(tvb, offset) <= (tvb_left - fixed_len)) {
28379
2
                comeback_after = true;
28380
2
        }
28381
7
  }
28382
28383
7
  return comeback_after;
28384
7
}
28385
28386
static int * const pasn_params_fields[] = {
28387
  &hf_ieee80211_tag_pasn_params_comeback_info_present,
28388
  &hf_ieee80211_tag_pasn_params_group_and_key_present,
28389
  &hf_ieee80211_tag_pasn_parameters_reserved,
28390
  NULL
28391
};
28392
28393
static const range_string wrapped_data_fmt_rvals[] = {
28394
  { 0, 0, "No wrapped data" },
28395
  { 1, 1, "Fast BSS Transition Wrapped Data" },
28396
  { 2, 2, "FILS Shared Key authentication without PFS Wrapped Data" },
28397
  { 3, 3, "SAE Wrapped Data" },
28398
  { 4, 255, "Reserved" },
28399
  { 0, 0, NULL }
28400
};
28401
28402
static void
28403
dissect_pasn_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int len)
28404
19
{
28405
19
  int public_key_len = 0;
28406
19
  unsigned pasn_control = tvb_get_uint8(tvb, offset);
28407
28408
19
  if (len < 2) {
28409
3
    expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
28410
3
                           "PASN Parameters must be at least 2 octets long");
28411
3
    return;
28412
3
  }
28413
28414
16
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
28415
16
                                    hf_ieee80211_tag_pasn_parameters_control,
28416
16
                                    ett_pasn_parameters, pasn_params_fields,
28417
16
                                    ENC_LITTLE_ENDIAN,
28418
16
                                    BMT_NO_FALSE | BMT_NO_INT);
28419
16
  offset += 1;
28420
28421
16
  proto_tree_add_item(tree, hf_ieee80211_tag_pasn_parameters_wrapped_fmt,
28422
16
                      tvb, offset, 1, ENC_NA);
28423
16
  offset += 1;
28424
28425
  /*
28426
   * If the Comeback field is present, it might not have a Comeback After
28427
   * field. Use the following heuristic function to check.
28428
   */
28429
16
  if (pasn_control & PASN_COMEBACK_INFO_PRESENT) {
28430
7
    proto_tree *comeback_tree = NULL;
28431
7
    proto_item *cbi = NULL;
28432
7
    uint8_t cookie_len;
28433
28434
7
    comeback_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
28435
7
                    ett_pasn_comeback_tree, &cbi, "Comeback field");
28436
28437
7
    if (has_comeback_after(pasn_control, tvb, offset, len)) {
28438
2
      proto_tree_add_item(comeback_tree, hf_ieee80211_tag_pasn_comeback_after,
28439
2
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
28440
2
      offset += 2;
28441
2
    }
28442
28443
7
    cookie_len = tvb_get_uint8(tvb, offset);
28444
28445
7
    proto_tree_add_item(comeback_tree, hf_ieee80211_tag_pasn_cookie_length,
28446
7
                        tvb, offset, 1, ENC_NA);
28447
7
    offset += 1;
28448
28449
7
    if (cookie_len) {
28450
5
      proto_tree_add_item(comeback_tree, hf_ieee80211_tag_pasn_cookie,
28451
5
                          tvb, offset, cookie_len, ENC_NA);
28452
5
      offset += cookie_len;
28453
5
    }
28454
7
  }
28455
28456
16
  if (pasn_control & PASN_GROUP_KEY_PRESENT) {
28457
6
    public_key_len = tvb_get_uint8(tvb, offset + 2);
28458
28459
6
    proto_tree_add_item(tree, hf_ieee80211_tag_pasn_finite_cyclic_group_id, tvb,
28460
6
                        offset, 2, ENC_LITTLE_ENDIAN);
28461
6
    offset += 2;
28462
28463
6
    proto_tree_add_item(tree, hf_ieee80211_tag_pasn_ephemeral_public_key_len,
28464
6
                        tvb, offset, 1, ENC_NA);
28465
6
    offset += 1;
28466
28467
6
    if (public_key_len) {
28468
3
      proto_tree_add_item(tree, hf_ieee80211_tag_pasn_ephemeral_public_key, tvb,
28469
3
                        offset, public_key_len, ENC_NA);
28470
3
    }
28471
6
  }
28472
16
}
28473
28474
static int * const sta_control_hdrs[] = {
28475
  &hf_ieee80211_eht_profile_link_id,
28476
  &hf_ieee80211_eht_profile_complete_profile,
28477
  &hf_ieee80211_eht_profile_mac_address_present,
28478
  &hf_ieee80211_eht_profile_beacon_interval_present,
28479
  &hf_ieee80211_eht_profile_tsf_offset_present,
28480
  &hf_ieee80211_eht_profile_dtim_info_present,
28481
  &hf_ieee80211_eht_profile_nstr_link_pair_present,
28482
  &hf_ieee80211_eht_profile_nstr_bitmap_size,
28483
  &hf_ieee80211_eht_profile_bss_params_change_count_present,
28484
  &hf_ieee80211_eht_profile_reserved,
28485
  NULL
28486
};
28487
28488
static int * const probe_sta_control_hdrs[] = {
28489
  &hf_ieee80211_eht_profile_link_id,
28490
  &hf_ieee80211_eht_profile_complete_profile,
28491
  &hf_ieee80211_eht_profile_probe_reserved,
28492
  NULL
28493
};
28494
28495
static const range_string eht_reconfig_op_type_rvals[] = {
28496
  { 0, 0, "AP Removal" },
28497
  { 1, 1, "Operation Parameter Update" },
28498
  { 2, 2, "Add Link" },
28499
  { 3, 3, "Delete Link" },
28500
  { 4, 15, "Reserved" },
28501
  { 0, 0, NULL }
28502
};
28503
28504
static int * const reconfig_sta_control_hdrs[] = {
28505
  &hf_ieee80211_eht_profile_link_id,
28506
  &hf_ieee80211_eht_profile_complete_profile,
28507
  &hf_ieee80211_eht_profile_mac_address_present,
28508
  &hf_ieee80211_eht_profile_removal_timer_present,
28509
  &hf_ieee80211_eht_profile_reconfig_operation_type,
28510
  &hf_ieee80211_eht_profile_operation_para_present,
28511
  &hf_ieee80211_eht_profile_reconfig_nstr_bitmap_size,
28512
  &hf_ieee80211_eht_profile_reconfig_nstr_bitmap_present,
28513
  &hf_ieee80211_eht_profile_reconfig_reserved,
28514
  NULL
28515
};
28516
28517
static int * const prio_access_sta_control_hdrs[] = {
28518
  &hf_ieee80211_eht_profile_link_id,
28519
  &hf_ieee80211_eht_profile_prio_acc_reserved,
28520
  NULL
28521
};
28522
28523
static int * const reconfig_presence_indi_hdrs[] = {
28524
  &hf_ieee80211_eht_sta_profile_presence_indi_max_mpdu_length_present,
28525
  &hf_ieee80211_eht_sta_profile_presence_indi_max_amsdu_length_present,
28526
  &hf_ieee80211_eht_sta_profile_presence_indi_reserved,
28527
  NULL
28528
};
28529
28530
static int * const reconfig_operation_para_info_hdrs[] = {
28531
  &hf_ieee80211_eht_sta_profile_operation_para_info_max_mpdu_length,
28532
  &hf_ieee80211_eht_sta_profile_operation_para_info_amsdu_length,
28533
  &hf_ieee80211_eht_sta_profile_operation_para_info_pad,
28534
  NULL
28535
};
28536
28537
/* Presence Bitmap in ML Control */
28538
/* Basic */
28539
19
#define EHT_LINK_ID         0x01
28540
19
#define EHT_BSS_PARAMS      0x02
28541
19
#define EHT_MEDIUM_SYNC     0x04
28542
19
#define EHT_EML_CAPA        0x08
28543
19
#define EHT_MLD_CAPA        0x10
28544
19
#define EHT_MLD_ID          0x20
28545
19
#define EHT_EXT_MLD_CAPA    0x40
28546
/* Probe */
28547
12
#define EHT_PML_MLD_ID      0x01
28548
12
#define EHT_PML_MLD_MAC     0x02
28549
/* Reconf */
28550
25
#define EHT_RECONF_MLD_MAC      0x01
28551
25
#define EHT_RECONF_EML_CAPA     0x02
28552
25
#define EHT_RECONF_MLD_CAPA     0x04
28553
25
#define EHT_RECONF_EXT_MLD_CAPA 0x08
28554
28555
114
#define BASIC_MULTI_LINK           0
28556
73
#define PROBE_MULTI_LINK           1
28557
102
#define RECONFIGURATION_MULTI_LINK 2
28558
25
#define TDLS_MULTI_LINK            3
28559
82
#define PRIORITY_ACCESS_MULTI_LINK 4
28560
28561
/* Bits from the STA Control field */
28562
/* Basic */
28563
14
#define STA_CTRL_LINK_ID                         0x000F
28564
22
#define STA_CTRL_COMPLETE_PROFILE                0x0010
28565
57
#define STA_CTRL_MAC_ADDR_PRESENT                0x0020
28566
37
#define STA_CTRL_BEACON_INT_PRESENT              0x0040
28567
37
#define STA_CTRL_TSF_OFFSET_PRESENT              0x0080
28568
37
#define STA_CTRL_DTIM_INFO_PRESENT               0x0100
28569
37
#define STA_CTRL_NSTR_LINK_PAIR_PRESENT          0x0200
28570
19
#define STA_CTRL_NSTR_BITMAP_SIZE                0x0400
28571
37
#define STA_CTRL_BSS_PARAMS_CHANGE_CNT_PRESENT   0x0800
28572
14
#define STA_CTRL_RESERVED                        0xF000
28573
28574
/* Reconf */
28575
20
#define AP_REMOVAL_TIMER_PRESENT                 0x0040
28576
20
#define OPERATION_PARAMS_PRESENT                 0x0800
28577
1
#define RECONF_NSTR_BITMAP_SIZE                  0x1000
28578
20
#define RECONF_NSTR_BITMAP_PRESENT               0x2000
28579
28580
static int
28581
dissect_multi_link_per_sta(tvbuff_t *tvb, packet_info *pinfo _U_,
28582
                           proto_tree *tree,
28583
                           uint8_t multi_link_type,
28584
                           int *found_link_id)
28585
84
{
28586
84
  proto_tree *subelt_tree = NULL, *sta_info_tree = NULL;
28587
84
  int offset = 0;
28588
84
  int len = tvb_captured_length_remaining(tvb, offset);
28589
84
  uint16_t sta_control = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
28590
84
  uint8_t sta_info_len = 0;
28591
84
  int start_offset = offset;
28592
84
  uint8_t link_id;
28593
28594
84
  subelt_tree = proto_tree_add_subtree(tree, tvb, offset, len,
28595
84
                                       ett_eht_multi_link_per_sta,
28596
84
                                       NULL, "Per-STA Profile");
28597
28598
84
  switch (multi_link_type) {
28599
23
  case BASIC_MULTI_LINK:
28600
23
    link_id = tvb_get_uint8(tvb, offset) & 0x0F;
28601
23
    *found_link_id = link_id;
28602
23
    proto_item_append_text(subelt_tree, ", Link-ID = %d", link_id);
28603
28604
23
    proto_tree_add_bitmask(subelt_tree, tvb, offset,
28605
23
                           hf_ieee80211_eht_profile_sta_control,
28606
23
                           ett_eht_multi_link_sta_control,
28607
23
                           sta_control_hdrs, ENC_LITTLE_ENDIAN);
28608
23
    offset += 2;
28609
28610
    /* Check the length of STA Info is 0 */
28611
23
    if (offset >= start_offset + len) {
28612
0
      return len;
28613
0
    }
28614
28615
23
    sta_info_len = tvb_get_uint8(tvb, offset);
28616
23
    sta_info_tree = proto_tree_add_subtree(subelt_tree, tvb, offset,
28617
23
                                           sta_info_len,
28618
23
                                           ett_eht_multi_link_per_sta_info,
28619
23
                                           NULL, "STA Info");
28620
28621
23
    proto_tree_add_item(sta_info_tree, hf_ieee80211_eht_sta_profile_info_len,
28622
23
                        tvb, offset, 1, ENC_NA);
28623
23
    offset += 1;
28624
28625
23
    if (sta_control & STA_CTRL_MAC_ADDR_PRESENT) {
28626
9
      proto_tree_add_item(sta_info_tree, hf_ieee80211_eht_sta_profile_info_mac,
28627
9
                          tvb, offset, 6, ENC_NA);
28628
9
      offset += 6;
28629
9
    }
28630
28631
23
    if (sta_control & STA_CTRL_BEACON_INT_PRESENT) {
28632
4
      proto_tree_add_item(sta_info_tree,
28633
4
                          hf_ieee80211_eht_sta_profile_info_beacon,
28634
4
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
28635
4
      offset += 2;
28636
4
    }
28637
28638
23
    if (sta_control & STA_CTRL_TSF_OFFSET_PRESENT) {
28639
3
      proto_tree_add_item(sta_info_tree, hf_ieee80211_eht_sta_profile_info_tsf_offset,
28640
3
                          tvb, offset, 8, ENC_LITTLE_ENDIAN);
28641
3
      offset += 8;
28642
3
    }
28643
28644
23
    if (sta_control & STA_CTRL_DTIM_INFO_PRESENT) {
28645
4
      proto_tree * dtim_tree;
28646
28647
4
      dtim_tree = proto_tree_add_subtree(sta_info_tree, tvb, offset, 2,
28648
4
                             ett_eht_multi_link_sta_dtim, NULL, "DTIM Info");
28649
28650
4
      proto_tree_add_item(dtim_tree,
28651
4
                          hf_ieee80211_eht_sta_profile_info_dtim_count,
28652
4
                          tvb, offset, 1, ENC_NA);
28653
4
      offset += 1;
28654
28655
4
      proto_tree_add_item(dtim_tree,
28656
4
                          hf_ieee80211_eht_sta_profile_info_dtim_period,
28657
4
                          tvb, offset, 1, ENC_NA);
28658
4
      offset += 1;
28659
4
    }
28660
28661
23
    if (sta_control & STA_CTRL_NSTR_LINK_PAIR_PRESENT) {
28662
5
      int bitmap_size = (sta_control & STA_CTRL_NSTR_BITMAP_SIZE) ? 2 : 1;
28663
28664
5
      proto_tree_add_item(sta_info_tree,
28665
5
                          hf_ieee80211_eht_sta_profile_info_bitmap,
28666
5
                          tvb, offset, bitmap_size, ENC_NA);
28667
5
      offset += bitmap_size;
28668
5
    }
28669
28670
23
    if (sta_control & STA_CTRL_BSS_PARAMS_CHANGE_CNT_PRESENT) {
28671
7
      proto_tree_add_item(sta_info_tree,
28672
7
                      hf_ieee80211_eht_sta_profile_bss_params_change_count,
28673
7
                      tvb, offset, 1, ENC_NA);
28674
7
      offset += 1;
28675
7
    }
28676
23
    break;
28677
8
  case PROBE_MULTI_LINK:
28678
8
    link_id = tvb_get_uint8(tvb, offset) & 0x0F;
28679
8
    *found_link_id = link_id;
28680
28681
8
    proto_tree_add_bitmask(subelt_tree, tvb, offset,
28682
8
                           hf_ieee80211_eht_profile_sta_control,
28683
8
                           ett_eht_multi_link_sta_control,
28684
8
                           probe_sta_control_hdrs, ENC_LITTLE_ENDIAN);
28685
8
    offset += 2;
28686
28687
    /*
28688
     * Now there will be some elements if complete profile is 0
28689
     *
28690
     * There can be one Request element, one Extended Request Element or
28691
     * one of both.
28692
     */
28693
8
    if ((sta_control & STA_CTRL_COMPLETE_PROFILE) == 0) {
28694
3
      bool seen_request = false, seen_ext_request = false;
28695
28696
3
      while (tvb_captured_length_remaining(tvb, offset) >= 2) {
28697
2
        static const uint8_t ids[] = { TAG_TSPEC };
28698
2
        uint8_t elt_type = 0;
28699
28700
2
        if (tvb_captured_length_remaining(tvb, offset) < 2) {
28701
0
          expert_add_info_format(pinfo, subelt_tree,
28702
0
                           &ei_ieee80211_eht_invalid_multi_link,
28703
0
                           "Invalid Probe Request Multi-Link element "
28704
0
                           "STA Control field, should contain a Request "
28705
0
                           "element or an Extended Request element or both "
28706
0
                           "but there are insufficient bytes");
28707
28708
0
          return len;
28709
0
        }
28710
28711
2
        elt_type = tvb_get_uint8(tvb, offset);
28712
28713
2
        if ((elt_type != TAG_REQUEST && elt_type != TAG_ELEMENT_ID_EXTENSION) ||
28714
2
            (elt_type == TAG_ELEMENT_ID_EXTENSION &&
28715
0
             (tvb_get_uint8(tvb, offset + 1) < 3 ||
28716
2
              tvb_get_uint8(tvb, offset + 2) != ETAG_EXTENDED_REQUEST))) {
28717
          /* Add an expert Info */
28718
28719
2
          expert_add_info_format(pinfo, subelt_tree,
28720
2
                           &ei_ieee80211_eht_invalid_multi_link,
28721
2
                           "Invalid Probe Request Multi-Link element "
28722
2
                           "STA Control field, should contain a Request "
28723
2
                           "element or an Extended Request element or both "
28724
2
                           "but it contains other elements or there are "
28725
2
                           "insufficient bytes for an extended element");
28726
2
          return len;
28727
2
        }
28728
28729
0
        if (elt_type == TAG_REQUEST) {
28730
0
          if (!seen_request) {
28731
0
            offset += add_tagged_field(pinfo, tree, tvb, offset, 0, ids,
28732
0
                                       G_N_ELEMENTS(ids), NULL);
28733
0
            seen_request = true;
28734
0
          } else {
28735
0
            expert_add_info_format(pinfo, subelt_tree,
28736
0
                           &ei_ieee80211_eht_invalid_multi_link,
28737
0
                           "Invalid Probe Request Multi-Link element "
28738
0
                           "STA Control field. May only contain one Request "
28739
0
                           "element");
28740
28741
0
            return len;
28742
0
          }
28743
0
        } else { /* It can only be a ETAG_EXTENDED_REQUEST */
28744
0
          if (!seen_ext_request) {
28745
0
            uint8_t ext_tag_len = tvb_get_uint8(tvb, offset + 1);
28746
28747
0
            offset += 3;
28748
0
            dissect_extended_request(tvb, pinfo, tree, offset, ext_tag_len);
28749
28750
0
            offset += ext_tag_len;
28751
0
            seen_ext_request = true;
28752
0
          } else {
28753
0
            expert_add_info_format(pinfo, subelt_tree,
28754
0
                           &ei_ieee80211_eht_invalid_multi_link,
28755
0
                           "Invalid Probe Request Multi-Link element "
28756
0
                           "STA Control field. May only contain one Extended "
28757
0
                           "Request element");
28758
28759
0
            return len;
28760
0
          }
28761
0
        }
28762
0
      }
28763
3
    }
28764
6
    break;
28765
36
  case RECONFIGURATION_MULTI_LINK:
28766
36
    link_id = tvb_get_uint8(tvb, offset) & 0x0F;
28767
36
    *found_link_id = link_id;
28768
28769
36
    proto_tree_add_bitmask(subelt_tree, tvb, offset,
28770
36
                           hf_ieee80211_eht_profile_sta_control,
28771
36
                           ett_eht_multi_link_sta_control,
28772
36
                           reconfig_sta_control_hdrs, ENC_LITTLE_ENDIAN);
28773
36
    offset += 2;
28774
28775
    /* Check the length of STA Info is 0 */
28776
36
    if (offset >= start_offset + len) {
28777
16
      return len;
28778
16
    }
28779
28780
20
    sta_info_len = tvb_get_uint8(tvb, offset);
28781
20
    sta_info_tree = proto_tree_add_subtree(subelt_tree, tvb, offset, sta_info_len,
28782
20
                                           ett_eht_multi_link_per_sta_info,
28783
20
                                           NULL, "STA Info");
28784
28785
20
    proto_tree_add_item(sta_info_tree, hf_ieee80211_eht_sta_profile_info_len,
28786
20
                        tvb, offset, 1, ENC_NA);
28787
20
    offset += 1;
28788
28789
20
    if (sta_control & STA_CTRL_MAC_ADDR_PRESENT) {
28790
14
      proto_tree_add_item(sta_info_tree, hf_ieee80211_eht_sta_profile_info_mac,
28791
14
                          tvb, offset, 6, ENC_NA);
28792
14
      offset += 6;
28793
14
    }
28794
28795
20
    if (sta_control & AP_REMOVAL_TIMER_PRESENT) {
28796
13
      proto_tree_add_item(sta_info_tree,
28797
13
                          hf_ieee80211_eht_sta_profile_removal_timer,
28798
13
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
28799
13
      offset += 2;
28800
13
    }
28801
28802
20
    if (sta_control & OPERATION_PARAMS_PRESENT) {
28803
1
      proto_tree * oper_tree;
28804
28805
1
      oper_tree = proto_tree_add_subtree(sta_info_tree, tvb, offset, 3,
28806
1
                                         ett_eht_multi_link_reconf_oper_param, NULL, "Operation Parameters");
28807
28808
1
      proto_tree_add_bitmask_with_flags(oper_tree, tvb, offset,
28809
1
                             hf_ieee80211_eht_sta_profile_presence_indi,
28810
1
                             ett_eht_multi_link_reconfig_presence_indi,
28811
1
                             reconfig_presence_indi_hdrs, ENC_LITTLE_ENDIAN,
28812
1
                             BMT_NO_APPEND);
28813
1
      offset += 1;
28814
28815
1
      proto_tree_add_bitmask_with_flags(oper_tree, tvb, offset,
28816
1
                             hf_ieee80211_eht_sta_profile_operation_para_info,
28817
1
                             ett_eht_multi_link_reconfig_operation_para_info,
28818
1
                             reconfig_operation_para_info_hdrs, ENC_LITTLE_ENDIAN,
28819
1
                             BMT_NO_APPEND);
28820
1
      offset += 2;
28821
1
    }
28822
28823
20
    if (sta_control & RECONF_NSTR_BITMAP_PRESENT) {
28824
1
      int bitmap_size = (sta_control & RECONF_NSTR_BITMAP_SIZE) ? 2 : 1;
28825
28826
1
      proto_tree_add_item(sta_info_tree,
28827
1
                          hf_ieee80211_eht_sta_profile_info_bitmap,
28828
1
                          tvb, offset, bitmap_size, ENC_NA);
28829
1
      offset += bitmap_size;
28830
1
    }
28831
20
    break;
28832
4
  case TDLS_MULTI_LINK:
28833
4
    expert_add_info_format(pinfo, subelt_tree,
28834
4
                           &ei_ieee80211_eht_invalid_multi_link,
28835
4
                           "Invalid TDLS Multi-Link element. There should not "
28836
4
                           "be any Link Info fields.");
28837
28838
4
    break;
28839
8
  case PRIORITY_ACCESS_MULTI_LINK:
28840
8
    link_id = tvb_get_uint8(tvb, offset) & 0x0F;
28841
8
    *found_link_id = link_id;
28842
8
    proto_tree_add_bitmask(subelt_tree, tvb, offset,
28843
8
                           hf_ieee80211_eht_profile_sta_control,
28844
8
                           ett_eht_multi_link_sta_control,
28845
8
                           prio_access_sta_control_hdrs, ENC_LITTLE_ENDIAN);
28846
8
    offset += 2;
28847
28848
    /*
28849
     * Could contain the EDCA Parameter Set elt or the MU EDCA Parameter Set
28850
     * elt, or none.
28851
     */
28852
8
    if (tvb_captured_length_remaining(tvb, offset) > 2) {
28853
28854
6
    }
28855
8
    break;
28856
0
  default:
28857
0
    DISSECTOR_ASSERT_NOT_REACHED();
28858
0
    break;
28859
84
  }
28860
28861
  // Sta Profile
28862
  // Save HE capa settings
28863
59
  {
28864
59
    unsigned *p_channel_width_set =
28865
59
    (unsigned *)p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan,
28866
59
                              HE_CHANNEL_WIDTH_KEY);
28867
59
    unsigned channel_width_set = GPOINTER_TO_INT(p_channel_width_set);
28868
59
    uint32_t ftype = GPOINTER_TO_UINT(p_get_proto_data(wmem_file_scope(),
28869
59
                                                      pinfo, proto_wlan,
28870
59
                                                      FRAME_TYPE_KEY));
28871
28872
59
    int end_offset = start_offset + len;
28873
59
    if (offset < end_offset) {
28874
      /* Check CSA, EX CSA or MAX CST elements to skip parsing cap info */
28875
57
      uint8_t elem = tvb_get_uint8(tvb, offset);
28876
57
      uint8_t elem_len = tvb_get_uint8(tvb, offset+1);
28877
57
      uint8_t ext_elem = 0;
28878
57
      if (elem == TAG_ELEMENT_ID_EXTENSION) {
28879
4
        ext_elem = tvb_get_uint8(tvb, offset+2);
28880
4
      }
28881
57
      if (multi_link_type == PRIORITY_ACCESS_MULTI_LINK) {
28882
50
      } else if ((elem == TAG_CHANNEL_SWITCH_ANN && elem_len == 3) ||
28883
50
          (elem == TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT && elem_len == 4) ||
28884
50
          (ext_elem == ETAG_MAX_CHANNEL_SWITCH_TIME && elem_len == 4)) {
28885
50
      } else {
28886
50
        offset += add_ff_cap_info(subelt_tree, tvb, pinfo, offset);
28887
50
      }
28888
      /*
28889
       * If it is an association or re-association response, deal with the
28890
       * status code.
28891
       */
28892
57
      if ((ftype == MGT_ASSOC_RESP || ftype == MGT_REASSOC_RESP) &&
28893
57
          multi_link_type == BASIC_MULTI_LINK) {
28894
0
        offset += add_ff_status_code(subelt_tree, tvb, pinfo, offset);
28895
0
      }
28896
57
    }
28897
511
    while (offset < end_offset) {
28898
495
      int tag_len = tvb_get_uint8(tvb, offset+1);
28899
495
      if (offset + 1 + tag_len >= end_offset) {
28900
        /* Detect wrong format to avoid from corrupting default_context */
28901
43
        expert_add_info_format(pinfo, subelt_tree, &ei_ieee80211_eht_invalid_subelement,
28902
43
          "Per-STA Profile subelements had wrong element/length");
28903
43
        *found_link_id = -1;
28904
43
        return len;
28905
43
      }
28906
452
      offset += add_tagged_field(pinfo, subelt_tree, tvb, offset, ftype, NULL, 0, NULL);
28907
452
    }
28908
28909
    // Set he capa settings back
28910
16
    p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, HE_CHANNEL_WIDTH_KEY,
28911
16
                     GINT_TO_POINTER(channel_width_set | (1<<31)));
28912
16
  }
28913
0
  return len;
28914
59
}
28915
28916
static const value_string multi_link_type_vals[] = {
28917
  { BASIC_MULTI_LINK, "Basic" },
28918
  { PROBE_MULTI_LINK, "Probe Request" },
28919
  { RECONFIGURATION_MULTI_LINK, "Reconfiguration" },
28920
  { TDLS_MULTI_LINK, "TDLS" },
28921
  { PRIORITY_ACCESS_MULTI_LINK, "Priority Access" },
28922
  { 5, "Reserved" },
28923
  { 6, "Reserved" },
28924
  { 7, "Reserved" },
28925
  { 0, NULL }
28926
};
28927
28928
static const range_string multi_link_sub_elt_string[] = {
28929
  { 0,   0, "Per-STA Profile" },
28930
  { 1,   220, "Reserved" },
28931
  { 221, 221, "Vendor Specific" },
28932
  { 222, 255, "Reserved" },
28933
  { 0,   0, NULL }
28934
};
28935
28936
static int * const eht_link_id_hdrs[] = {
28937
  &hf_ieee80211_eht_common_info_link_id,
28938
  &hf_ieee80211_eht_common_info_link_id_reserved,
28939
  NULL
28940
};
28941
28942
static int * const eht_medium_sync_delay_hdrs[] = {
28943
  &hf_ieee80211_eht_common_info_medium_sync_duration,
28944
  &hf_ieee80211_eht_common_info_medium_sync_threshold,
28945
  &hf_ieee80211_eht_common_info_medium_sync_max_txops,
28946
  NULL
28947
};
28948
28949
static int * const eht_eml_capabilities_hdrs[] = {
28950
  &hf_ieee80211_eht_common_info_eml_capa_emlsr_support,
28951
  &hf_ieee80211_eht_common_info_eml_capa_emlsr_padding_delay,
28952
  &hf_ieee80211_eht_common_info_eml_capa_emlsr_transition_delay,
28953
  &hf_ieee80211_eht_common_info_eml_capa_emlmr_support,
28954
  &hf_ieee80211_eht_common_info_eml_capa_emlmr_delay,
28955
  &hf_ieee80211_eht_common_info_eml_capa_transition_timeout,
28956
  &hf_ieee80211_eht_common_info_eml_capa_reserved,
28957
  NULL
28958
};
28959
28960
static int * const eht_mld_capabilities_hdrs[] = {
28961
  &hf_ieee80211_eht_common_info_mld_max_simul_links,
28962
  &hf_ieee80211_eht_common_info_mld_srs_support,
28963
  &hf_ieee80211_eht_common_info_mld_tid_to_link_map_neg,
28964
  &hf_ieee80211_eht_common_info_mld_freq_sep_for_str,
28965
  &hf_ieee80211_eht_common_info_mld_aar_support,
28966
  &hf_ieee80211_eht_common_info_mld_link_reconf_op_support,
28967
  &hf_ieee80211_eht_common_info_mld_aligned_twt_support,
28968
  &hf_ieee80211_eht_common_info_mld_reserved,
28969
  NULL
28970
};
28971
28972
static int * const eht_ext_mld_capabilities_hdrs[] = {
28973
  &hf_ieee80211_eht_common_info_ext_mld_op_update_support,
28974
  &hf_ieee80211_eht_common_info_ext_mld_max_simul_links,
28975
  &hf_ieee80211_eht_common_info_ext_mld_nstr_status_support,
28976
  &hf_ieee80211_eht_common_info_ext_mld_emlsr_enable_one_link_support,
28977
  &hf_ieee80211_eht_common_info_ext_mld_btm_mld_recom_aps_support,
28978
  &hf_ieee80211_eht_common_info_ext_mld_reserved,
28979
  NULL
28980
};
28981
28982
/*
28983
 * Build a TVB containing the sub-elt. Offset will point to the subelt id in
28984
 * tvb, and the sub-elt might span several fragments. Subsequent fragments
28985
 * will have an id of 254.
28986
 */
28987
static tvbuff_t *
28988
get_subelt_tvb(tvbuff_t *tvb, packet_info *pinfo, int offset, int *overhead)
28989
84
{
28990
84
  uint8_t subelt_len = tvb_get_uint8(tvb, offset + 1);
28991
84
  tvbuff_t *tmp_tvb;
28992
84
  int ohead = 0;
28993
28994
84
  if (subelt_len == 255 &&
28995
84
      tvb_captured_length_remaining(tvb, offset) > 259 &&
28996
84
      tvb_get_uint8(tvb, offset + 255 + 2) == 0xfe) {
28997
0
    tvbuff_t *tvb_comp;
28998
0
    uint8_t frag_len;
28999
29000
0
    tvb_comp = tvb_new_composite();
29001
29002
0
    do {
29003
0
      offset += 1;
29004
0
      frag_len = tvb_get_uint8(tvb, offset);
29005
0
      offset += 1;
29006
0
      tmp_tvb = tvb_new_subset_length(tvb, offset, frag_len);
29007
      /* Insert this fragment ... */
29008
0
      tvb_composite_append(tvb_comp, tmp_tvb);
29009
0
      offset += frag_len;
29010
0
      ohead += 2;
29011
0
    } while (frag_len == 255 &&
29012
0
             tvb_captured_length_remaining(tvb, offset) > 2 &&
29013
0
             tvb_get_uint8(tvb, offset) == 0xfe);
29014
29015
0
    tvb_composite_finalize(tvb_comp);
29016
29017
0
    *overhead = ohead - 2;
29018
0
    add_new_data_source(pinfo, tvb_comp, "Reassembled Subelt");
29019
0
    return tvb_comp;
29020
84
  } else {
29021
84
    *overhead = 0;
29022
84
    return tvb_new_subset_length(tvb, offset + 2, subelt_len);
29023
84
  }
29024
84
}
29025
29026
static void
29027
dissect_multi_link(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
29028
                   int offset, int len _U_)
29029
72
{
29030
72
  proto_item *control = NULL, *type = NULL;
29031
72
  proto_tree *ctl_tree = NULL, *common_tree = NULL, *subelt_tree = NULL;
29032
72
  uint8_t common_info_len = 0;
29033
72
  uint16_t multi_link_control = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
29034
72
  uint8_t multi_link_type = multi_link_control & 0x0007;
29035
72
  uint16_t present = multi_link_control >> 4;
29036
72
  int elt = 0, hf_index;
29037
72
  int local_link_ids[16];
29038
72
  int is_ap;
29039
29040
72
  control = proto_tree_add_item(tree, hf_ieee80211_eht_multi_link_control, tvb,
29041
72
                                offset, 2, ENC_LITTLE_ENDIAN);
29042
72
  ctl_tree = proto_item_add_subtree(control, ett_eht_multi_link_control);
29043
29044
72
  type = proto_tree_add_item(ctl_tree, hf_ieee80211_eht_multi_link_control_type,
29045
72
                             tvb, offset, 2, ENC_LITTLE_ENDIAN);
29046
72
  proto_tree_add_item(ctl_tree, hf_ieee80211_eht_multi_link_control_reserved,
29047
72
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
29048
29049
  /* Handle the control elt here, separate items */
29050
72
  if (multi_link_type == BASIC_MULTI_LINK) {
29051
19
    proto_item_append_text(control, " Basic");
29052
19
    proto_tree_add_item(ctl_tree,
29053
19
                        hf_ieee80211_eht_multi_link_control_link_id_present,
29054
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29055
19
    proto_tree_add_item(ctl_tree,
29056
19
                        hf_ieee80211_eht_multi_link_control_bss_parms_ch_count,
29057
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29058
19
    proto_tree_add_item(ctl_tree,
29059
19
                        hf_ieee80211_eht_multi_link_control_medium_sync_delay,
29060
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29061
19
    proto_tree_add_item(ctl_tree,
29062
19
                        hf_ieee80211_eht_multi_link_control_eml_capa,
29063
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29064
19
    proto_tree_add_item(ctl_tree,
29065
19
                        hf_ieee80211_eht_multi_link_control_mld_capa,
29066
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29067
19
    proto_tree_add_item(ctl_tree,
29068
19
                        hf_ieee80211_eht_multi_link_control_basic_mld_id_present,
29069
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29070
19
    proto_tree_add_item(ctl_tree,
29071
19
                        hf_ieee80211_eht_multi_link_control_ext_mld_capa,
29072
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29073
19
    proto_tree_add_item(ctl_tree,
29074
19
                        hf_ieee80211_eht_multi_link_control_bitmap_reserved,
29075
19
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29076
19
    hf_index = hf_ieee80211_eht_multi_link_type_0_link_count;
29077
53
  } else if (multi_link_type == PROBE_MULTI_LINK) {
29078
12
    proto_item_append_text(control, " Probe Request");
29079
12
    proto_tree_add_item(ctl_tree,
29080
12
                        hf_ieee80211_eht_multi_link_control_probe_mld_id_present,
29081
12
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29082
12
    proto_tree_add_item(ctl_tree,
29083
12
                        hf_ieee80211_eht_multi_link_control_probe_mld_mac_addr_present,
29084
12
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29085
12
    proto_tree_add_item(ctl_tree,
29086
12
                        hf_ieee80211_eht_multi_link_control_probe_reserved,
29087
12
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29088
12
    hf_index = hf_ieee80211_eht_multi_link_type_1_link_count;
29089
41
  } else if (multi_link_type == RECONFIGURATION_MULTI_LINK) {
29090
25
    proto_item_append_text(control, " Reconfiguration");
29091
25
    proto_tree_add_item(ctl_tree,
29092
25
                        hf_ieee80211_eht_multi_link_control_reconfig_mld_mac,
29093
25
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29094
25
    proto_tree_add_item(ctl_tree,
29095
25
                        hf_ieee80211_eht_multi_link_control_reconfig_eml_capa,
29096
25
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29097
25
    proto_tree_add_item(ctl_tree,
29098
25
                        hf_ieee80211_eht_multi_link_control_reconfig_mld_capa_oper,
29099
25
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29100
25
    proto_tree_add_item(ctl_tree,
29101
25
                        hf_ieee80211_eht_multi_link_control_reconfig_ext_mld_capa_oper,
29102
25
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29103
25
    proto_tree_add_item(ctl_tree,
29104
25
                        hf_ieee80211_eht_multi_link_control_reconfig_reserved,
29105
25
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29106
25
    hf_index = hf_ieee80211_eht_multi_link_type_2_link_count;
29107
25
  } else if (multi_link_type == TDLS_MULTI_LINK) {
29108
5
    proto_item_append_text(control, " TDLS");
29109
    /* Presence bitmap is reserved */
29110
5
    proto_tree_add_item(ctl_tree,
29111
5
                        hf_ieee80211_eht_multi_link_control_tdls_reserved, tvb,
29112
5
                        offset, 2, ENC_LITTLE_ENDIAN);
29113
5
    hf_index = hf_ieee80211_eht_multi_link_type_3_link_count;
29114
11
  } else if (multi_link_type == PRIORITY_ACCESS_MULTI_LINK) {
29115
6
    proto_item_append_text(control, " Priority Access");
29116
6
    proto_tree_add_item(ctl_tree,
29117
6
                        hf_ieee80211_eht_multi_link_control_prio_access_reserved,
29118
6
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
29119
6
    hf_index = hf_ieee80211_eht_multi_link_type_4_link_count;
29120
6
  } else {
29121
5
    expert_add_info_format(pinfo, type, &ei_ieee80211_eht_invalid_multi_link,
29122
5
                           "Invalid Multi-Link Control type, value is %u",
29123
5
                           multi_link_type);
29124
5
    return;
29125
5
  }
29126
67
  offset += 2;
29127
29128
67
  switch (multi_link_type) {
29129
19
  case BASIC_MULTI_LINK:
29130
    /* Handle common info for basic element */
29131
19
    common_info_len = tvb_get_uint8(tvb, offset);
29132
19
    common_tree = proto_tree_add_subtree(tree, tvb, offset, common_info_len,
29133
19
                                         ett_eht_multi_link_common_info,
29134
19
                                         NULL, "Common Info");
29135
19
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_length, tvb,
29136
19
                        offset, 1, ENC_NA);
29137
19
    offset += 1;
29138
29139
19
    is_ap = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool,
29140
19
                                              pinfo, proto_wlan,
29141
19
                                              IS_AP_KEY));
29142
19
    if (assoc_counter_in_auth) {
29143
0
      conversation_t *conversation = find_wlan_conversation_pinfo(pinfo);
29144
0
      if (conversation) {
29145
0
        ieee80211_conversation_data_t *conversation_data =
29146
0
          (ieee80211_conversation_data_t*)conversation_get_proto_data(conversation, proto_wlan);
29147
0
        if (is_ap) {
29148
0
            tvb_memcpy(tvb, conversation_data->ap_mld, offset, 6);
29149
0
            conversation_data->mld_set = TRUE;
29150
0
        } else {
29151
0
            tvb_memcpy(tvb, conversation_data->sta_mld, offset, 6);
29152
0
            conversation_data->mld_set = TRUE;
29153
0
        }
29154
0
      }
29155
0
    }
29156
29157
19
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_mld_mac,
29158
19
                        tvb, offset, 6, ENC_NA);
29159
19
    offset += 6;
29160
29161
19
    if (present & EHT_LINK_ID) {
29162
2
      proto_tree_add_bitmask(common_tree, tvb, offset,
29163
2
                             hf_ieee80211_eht_common_field_link_id_field,
29164
2
                             ett_eht_multi_link_common_info_link_id,
29165
2
                             eht_link_id_hdrs, ENC_NA);
29166
2
      offset += 1;
29167
2
    }
29168
29169
19
    if (present & EHT_BSS_PARAMS) {
29170
2
      proto_tree_add_item(common_tree,
29171
2
                          hf_ieee80211_eht_common_field_bss_param_change_count,
29172
2
                          tvb, offset, 1, ENC_NA);
29173
2
      offset += 1;
29174
2
    }
29175
29176
19
    if (present & EHT_MEDIUM_SYNC) {
29177
2
      proto_tree_add_bitmask(common_tree, tvb, offset,
29178
2
                             hf_ieee80211_eht_common_field_medium_sync_field,
29179
2
                             ett_eht_multi_link_common_info_medium_sync,
29180
2
                             eht_medium_sync_delay_hdrs, ENC_LITTLE_ENDIAN);
29181
2
      offset += 2;
29182
2
    }
29183
29184
19
    if (present & EHT_EML_CAPA) {
29185
1
      proto_tree_add_bitmask(common_tree, tvb, offset,
29186
1
                             hf_ieee80211_eht_common_field_eml_capabilities,
29187
1
                             ett_eht_multi_link_common_info_eml_capa,
29188
1
                             eht_eml_capabilities_hdrs, ENC_LITTLE_ENDIAN);
29189
1
      offset += 2;
29190
1
    }
29191
29192
19
    if (present & EHT_MLD_CAPA) {
29193
4
      proto_tree_add_bitmask(common_tree, tvb, offset,
29194
4
                             hf_ieee80211_eht_common_field_mld_capabilities,
29195
4
                             ett_eht_multi_link_common_info_mld_capa,
29196
4
                             eht_mld_capabilities_hdrs, ENC_LITTLE_ENDIAN);
29197
4
      offset += 2;
29198
4
    }
29199
29200
19
    if (present & EHT_MLD_ID) {
29201
2
      proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_mld_id,
29202
2
                          tvb, offset, 1, ENC_NA);
29203
2
      offset += 1;
29204
2
    }
29205
29206
19
    if (present & EHT_EXT_MLD_CAPA) {
29207
10
      proto_tree_add_bitmask(common_tree, tvb, offset,
29208
10
                             hf_ieee80211_eht_common_field_ext_mld_capabilities,
29209
10
                             ett_eht_multi_link_common_info_ext_mld_capa,
29210
10
                             eht_ext_mld_capabilities_hdrs, ENC_LITTLE_ENDIAN);
29211
10
      offset += 2;
29212
10
    }
29213
19
    break;
29214
12
  case PROBE_MULTI_LINK:
29215
    /* Handle common info for probe request element */
29216
12
    common_info_len = tvb_get_uint8(tvb, offset);
29217
12
    common_tree = proto_tree_add_subtree(tree, tvb, offset, common_info_len,
29218
12
                                         ett_eht_multi_link_common_info,
29219
12
                                         NULL, "Common Info");
29220
12
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_length, tvb,
29221
12
                        offset, 1, ENC_NA);
29222
12
    offset += 1;
29223
29224
12
    if (present & EHT_PML_MLD_ID) {
29225
5
      proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_mld_id,
29226
5
                          tvb, offset, 1, ENC_NA);
29227
5
      offset += 1;
29228
5
    }
29229
29230
12
    if (present & EHT_PML_MLD_MAC) {
29231
5
      proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_mld_mac,
29232
5
                          tvb, offset, 6, ENC_NA);
29233
5
      offset += 6;
29234
5
    }
29235
12
    break;
29236
25
  case RECONFIGURATION_MULTI_LINK:
29237
25
    common_info_len = tvb_get_uint8(tvb, offset);
29238
25
    common_tree = proto_tree_add_subtree(tree, tvb, offset, common_info_len,
29239
25
                                         ett_eht_multi_link_common_info,
29240
25
                                         NULL, "Common Info");
29241
25
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_length, tvb,
29242
25
                        offset, 1, ENC_NA);
29243
25
    offset += 1;
29244
29245
25
    if (present & EHT_RECONF_MLD_MAC) {
29246
2
      proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_mld_mac,
29247
2
                          tvb, offset, 6, ENC_NA);
29248
2
      offset += 6;
29249
2
    }
29250
29251
25
    if (present & EHT_RECONF_EML_CAPA) {
29252
4
      proto_tree_add_bitmask(common_tree, tvb, offset,
29253
4
                             hf_ieee80211_eht_common_field_eml_capabilities,
29254
4
                             ett_eht_multi_link_common_info_eml_capa,
29255
4
                             eht_eml_capabilities_hdrs, ENC_LITTLE_ENDIAN);
29256
4
      offset += 2;
29257
4
    }
29258
29259
25
    if (present & EHT_RECONF_MLD_CAPA) {
29260
3
      proto_tree_add_bitmask(common_tree, tvb, offset,
29261
3
                             hf_ieee80211_eht_common_field_mld_capabilities,
29262
3
                             ett_eht_multi_link_common_info_mld_capa,
29263
3
                             eht_mld_capabilities_hdrs, ENC_LITTLE_ENDIAN);
29264
3
      offset += 2;
29265
3
    }
29266
25
    if (present & EHT_RECONF_EXT_MLD_CAPA) {
29267
2
      proto_tree_add_bitmask(common_tree, tvb, offset,
29268
2
                             hf_ieee80211_eht_common_field_ext_mld_capabilities,
29269
2
                             ett_eht_multi_link_common_info_ext_mld_capa,
29270
2
                             eht_ext_mld_capabilities_hdrs, ENC_LITTLE_ENDIAN);
29271
2
      offset += 2;
29272
2
    }
29273
25
    break;
29274
5
  case TDLS_MULTI_LINK:
29275
5
    common_info_len = tvb_get_uint8(tvb, offset);
29276
5
    common_tree = proto_tree_add_subtree(tree, tvb, offset, common_info_len,
29277
5
                                         ett_eht_multi_link_common_info,
29278
5
                                         NULL, "Common Info");
29279
5
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_length, tvb,
29280
5
                        offset, 1, ENC_NA);
29281
5
    offset += 1;
29282
5
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_ap_mld_mac,
29283
5
                        tvb, offset, 6, ENC_NA);
29284
5
    offset += 6;
29285
5
    break;
29286
6
  case PRIORITY_ACCESS_MULTI_LINK:
29287
6
    common_info_len = tvb_get_uint8(tvb, offset);
29288
6
    common_tree = proto_tree_add_subtree(tree, tvb, offset, common_info_len,
29289
6
                                         ett_eht_multi_link_common_info,
29290
6
                                         NULL, "Common Info");
29291
6
    proto_tree_add_item(common_tree, hf_ieee80211_eht_common_field_length, tvb,
29292
6
                        offset, 1, ENC_NA);
29293
6
    offset += 1;
29294
29295
6
    proto_tree_add_item(common_tree,
29296
6
                        hf_ieee80211_eht_common_field_ap_mld_mac, tvb,
29297
6
                        offset, 6, ENC_NA);
29298
6
    offset += 6;
29299
6
    break;
29300
0
  default:
29301
    /* We should not reach here as we filtered out non-valid values above */
29302
0
    DISSECTOR_ASSERT_NOT_REACHED();
29303
67
  }
29304
29305
  /* Handle the link info. It is 0 or more subelements */
29306
230
  while (tvb_reported_length_remaining(tvb, offset)) {
29307
190
    uint8_t tag, subelt_len;
29308
190
    int link_id = -1;
29309
29310
190
    if (tvb_reported_length_remaining(tvb, offset) < 2) {
29311
2
      expert_add_info_format(pinfo, tree, &ei_ieee80211_eht_invalid_subelement,
29312
2
                  "Per-STA Profile subelements must contain at least 2 bytes");
29313
2
      return;
29314
2
    }
29315
29316
188
    tag = tvb_get_uint8(tvb, offset);
29317
188
    subelt_len = tvb_get_uint8(tvb, offset + 1);
29318
29319
188
    tvbuff_t *new_tvb;
29320
188
    int overhead = 0;
29321
188
    int full_subelt_len;
29322
29323
188
    switch (tag) {
29324
84
    case 0:
29325
      /*
29326
       * We have to assemble the sub-elt if there is a continuations. And
29327
       * it will have to be a composite TVB etc.
29328
       */
29329
84
      new_tvb = get_subelt_tvb(tvb, pinfo, offset, &overhead);
29330
84
      full_subelt_len = tvb_captured_length_remaining(new_tvb, 0);
29331
29332
84
      proto_tree_add_item(tree,
29333
84
                          hf_ieee80211_eht_multi_link_subelt_tag, tvb,
29334
84
                          offset, 1, ENC_NA);
29335
84
      offset += 1;
29336
84
      if (full_subelt_len <= 255) {
29337
84
        proto_tree_add_item(tree,
29338
84
                            hf_ieee80211_eht_multi_link_subelt_len, tvb,
29339
84
                            offset, 1, ENC_NA);
29340
84
      } else {
29341
0
        proto_tree_add_uint(tree, hf_ieee80211_eht_multi_link_subelt_len, tvb,
29342
0
                            0, 0, full_subelt_len);
29343
0
      }
29344
84
      offset += 1;
29345
29346
84
      subelt_tree = proto_tree_add_subtree_format(tree, new_tvb, 0,
29347
84
                                       full_subelt_len,
29348
84
                                       ett_eht_multi_link_subelt,
29349
84
                                       NULL, "Per-STA Profile %d", elt + 1);
29350
      /*
29351
       * There might be some per-STA elements that do not contain link IDs.
29352
       */
29353
29354
      /*
29355
       * We use the sta profile num here. But we need to ensure it is not
29356
       * seen as NULL and we send it in zero based. Will be incremented
29357
       * before use.
29358
       */
29359
29360
84
      offset += dissect_multi_link_per_sta(new_tvb, pinfo, subelt_tree,
29361
84
                                           multi_link_type, &link_id);
29362
29363
84
      offset += overhead; /* Account for the overhead in the subelt */
29364
84
      if (link_id != -1) {
29365
26
        local_link_ids[elt] = link_id;
29366
26
      }
29367
84
      break;
29368
1
    case 221:
29369
      /* Add an expert info saying there are none so far? */
29370
1
      offset += subelt_len + 2;
29371
1
      break;
29372
92
    default:
29373
92
      offset += subelt_len + 2;
29374
92
      break;
29375
188
    }
29376
164
    if (link_id != -1) {
29377
26
      elt++;
29378
26
    }
29379
164
  }
29380
40
  proto_tree_add_uint(tree, hf_index, tvb, 0, 0, elt);
29381
29382
40
  if (elt) {
29383
14
    wmem_strbuf_t *link_id_list = wmem_strbuf_new_sized(pinfo->pool, elt * 2);
29384
32
    for (int i = 0; i < elt; i++) {
29385
18
      if (local_link_ids[i] != -1) {
29386
18
        wmem_strbuf_append_printf(link_id_list, (i == 0) ? "%d" : "_%d", local_link_ids[i]);
29387
18
      }
29388
18
    }
29389
14
    proto_tree_add_string(tree, hf_ieee80211_eht_multi_link_link_id_list, tvb,
29390
14
                          0, 0, link_id_list->str);
29391
14
  }
29392
40
}
29393
29394
static int * const eht_operation_hdrs[] = {
29395
  &hf_ieee80211_eht_operation_info_present,
29396
  &hf_ieee80211_eht_operation_subchannel_bitmap_present,
29397
  &hf_ieee80211_eht_operation_default_pe_duration,
29398
  &hf_ieee80211_eht_operation_group_addressed_bu_indication_limit,
29399
  &hf_ieee80211_eht_operation_group_addressed_bu_indication_exp,
29400
  &hf_ieee80211_eht_operation_mcs15_disable,
29401
  &hf_ieee80211_eht_operation_reserved,
29402
  NULL
29403
};
29404
29405
static int *const eht_op_control_hdrs[] = {
29406
  &hf_ieee80211_eht_operation_control_chan_width,
29407
  &hf_ieee80211_eht_operation_control_reserved,
29408
  NULL
29409
};
29410
29411
static const value_string eht_operation_control_chan_wid_vals[] = {
29412
  { 0, "20 MHz EHT BSS bandwidth" },
29413
  { 1, "40 MHz EHT BSS bandwidth" },
29414
  { 2, "80 MHz EHT BSS bandwidth" },
29415
  { 3, "160 MHz EHT BSS bandwidth" },
29416
  { 4, "320 MHz EHT BSS bandwidth" },
29417
  { 5, "Reserved" },
29418
  { 6, "Reserved" },
29419
  { 7, "Reserved" },
29420
  { 0, NULL },
29421
};
29422
29423
static void
29424
dissect_eht_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
29425
                      int offset, int len _U_)
29426
13
{
29427
13
  uint8_t params = tvb_get_uint8(tvb, offset);
29428
29429
13
  proto_tree_add_bitmask(tree, tvb, offset,
29430
13
                         hf_ieee80211_eht_operation_parameters,
29431
13
                         ett_eht_operation_params, eht_operation_hdrs,
29432
13
                         ENC_LITTLE_ENDIAN);
29433
13
  offset++;
29434
29435
13
  if (len < 5) {
29436
1
    expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
29437
1
                           "This IE appears to conform to an earlier draft than D2.0 and lacks the Basic EHT MCS And MSS Set, len=%d", len);
29438
1
    return;
29439
29440
12
  } else {
29441
12
    proto_tree_add_item(tree, hf_ieee80211_eht_basic_eht_mcs_nss_set, tvb,
29442
12
                        offset, 4, ENC_LITTLE_ENDIAN);
29443
29444
12
    offset += 4;
29445
12
  }
29446
29447
12
  if (params & 0x01) { /* EHT Operations Info present */
29448
4
    proto_tree_add_bitmask(tree, tvb, offset,
29449
4
                           hf_ieee80211_eht_operation_control,
29450
4
                           ett_eht_operation_control,
29451
4
                           eht_op_control_hdrs,
29452
4
                           ENC_NA);
29453
4
    offset++;
29454
29455
4
    proto_tree_add_item(tree, hf_ieee80211_eht_operation_ccfs0, tvb, offset, 1,
29456
4
                        ENC_NA);
29457
4
    offset++;
29458
29459
4
    proto_tree_add_item(tree, hf_ieee80211_eht_operation_ccfs1, tvb, offset, 1,
29460
4
                        ENC_NA);
29461
4
    offset++;
29462
4
  }
29463
29464
12
  if (params & 0x02) { /* Disabled subchannel bitmap present */
29465
4
    proto_tree_add_item(tree, hf_ieee80211_eht_operation_disabled_bitmap, tvb,
29466
4
                        offset, 2, ENC_LITTLE_ENDIAN);
29467
4
  }
29468
12
}
29469
29470
static const value_string eht_link_adaptation_vals[] = {
29471
  { 0, "No feedback" },
29472
  { 1, "Reserved" },
29473
  { 2, "Unsolicited" },
29474
  { 3, "Solicited and unsolicited" },
29475
  { 0, NULL },
29476
};
29477
29478
static int * const eht_mac_capa_hdrs[] = {
29479
  &hf_ieee80211_eht_mac_capa_epcs_prio_access_support,
29480
  &hf_ieee80211_eht_mac_capa_eht_om_control_support,
29481
  &hf_ieee80211_eht_mac_capa_trig_txop_sharing_mode_1_support,
29482
  &hf_ieee80211_eht_mac_capa_trig_txop_sharing_mode_2_support,
29483
  &hf_ieee80211_eht_mac_capa_restricted_twt_support,
29484
  &hf_ieee80211_eht_mac_capa_scs_traffic_description_support,
29485
  &hf_ieee80211_eht_mac_capa_maximum_mpdu_length,
29486
  &hf_ieee80211_eht_mac_capa_maximum_ampdu_length_exp_ext,
29487
  &hf_ieee80211_eht_mac_capa_eht_trs_support,
29488
  &hf_ieee80211_eht_mac_capa_txop_return_support_txop_sha_mode,
29489
  &hf_ieee80211_eht_mac_capa_two_bqrs_support,
29490
  &hf_ieee80211_eht_mac_capa_eht_link_adaptation_support,
29491
  &hf_ieee80211_eht_mac_capa_unsolicited_epcs_update,
29492
  &hf_ieee80211_eht_mac_capa_reserved,
29493
  NULL
29494
};
29495
29496
static int * const eht_phy_bits_0_15[] = {
29497
  &hf_ieee80211_eht_phy_bits_0_15_reserved,
29498
  &hf_ieee80211_eht_phy_bits_0_15_320_mhz_in_6ghz,
29499
  &hf_ieee80211_eht_phy_bits_0_15_242_tone_ru_bw_wider_20mhz,
29500
  &hf_ieee80211_eht_phy_bits_0_15_ndp_and_3_2_us_gi,
29501
  &hf_ieee80211_eht_phy_bits_0_15_partial_bw_ul_mu_mimo,
29502
  &hf_ieee80211_eht_phy_bits_0_15_su_beamformer,
29503
  &hf_ieee80211_eht_phy_bits_0_15_su_beamformee,
29504
  &hf_ieee80211_eht_phy_bits_0_15_su_beamformee_le_80mhz,
29505
  &hf_ieee80211_eht_phy_bits_0_15_su_beamformee_eq_160mhz,
29506
  &hf_ieee80211_eht_phy_bits_0_15_su_beamformee_eq_320mhz,
29507
  NULL
29508
};
29509
29510
static int * const eht_phy_bits_16_31[] = {
29511
  &hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_lt_80mhz,
29512
  &hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_eq_160mhz,
29513
  &hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_eq_320mhz,
29514
  &hf_ieee80211_eht_phy_bits_16_31_num_ng_eq_16_su_feedback,
29515
  &hf_ieee80211_eht_phy_bits_16_31_num_ng_eq_16_mu_feedback,
29516
  &hf_ieee80211_eht_phy_bits_16_31_codebook_size_4_2_su_fbck,
29517
  &hf_ieee80211_eht_phy_bits_16_31_codebook_size_7_5_mu_fbck,
29518
  &hf_ieee80211_eht_phy_bits_16_31_triggered_su_beemform_fbck,
29519
  &hf_ieee80211_eht_phy_bits_16_31_triggered_mu_beemform_p_bw_fbck,
29520
  &hf_ieee80211_eht_phy_bits_16_31_triggered_cqi_feedback,
29521
  NULL
29522
};
29523
29524
static int * const eht_phy_bits_32_39[] = {
29525
  &hf_ieee80211_eht_phy_bits_32_39_partial_bw_dl_mu_mimo,
29526
  &hf_ieee80211_eht_phy_bits_32_39_eht_psr_based_sr_support,
29527
  &hf_ieee80211_eht_phy_bits_32_39_power_boost_factor_support,
29528
  &hf_ieee80211_eht_phy_bits_32_39_eht_mu_ppdu_w_4x_eht_ltf_08_gi,
29529
  &hf_ieee80211_eht_phy_bits_32_39_max_nc,
29530
  NULL
29531
};
29532
29533
static int * const eht_phy_bits_40_63[] = {
29534
  &hf_ieee80211_eht_phy_bits_40_63_non_triggered_cqi_fbck,
29535
  &hf_ieee80211_eht_phy_bits_40_63_tx_1024_4096_qam_lt_242_ru_support,
29536
  &hf_ieee80211_eht_phy_bits_40_63_rx_1024_4096_qam_lt_242_ru_support,
29537
  &hf_ieee80211_eht_phy_bits_40_63_ppe_thresholds_present,
29538
  &hf_ieee80211_eht_phy_bits_40_63_common_nominal_packet_padding,
29539
  &hf_ieee80211_eht_phy_bits_40_63_max_num_supported_eht_ltfs,
29540
  &hf_ieee80211_eht_phy_bits_40_63_support_of_mcx_15,
29541
  &hf_ieee80211_eht_phy_bits_40_63_support_of_eht_dup_in_6_ghz,
29542
  &hf_ieee80211_eht_phy_bits_40_63_support_20_mhz_sta_ndp_wide_bw,
29543
  &hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_le_80_mhz,
29544
  &hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_eq_160_mhz,
29545
  &hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_eq_320_mhz,
29546
  &hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_le_80_mhz,
29547
  &hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_eq_160_mhz,
29548
  &hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_eq_320_mhz,
29549
  &hf_ieee80211_eht_phy_bits_40_63_tb_sounding_feedback_rate_limit,
29550
  NULL
29551
};
29552
29553
static int * const eht_phy_bits_64_71[] = {
29554
  &hf_ieee80211_eht_phy_bits_64_71_rx_1024_qam_wid_bw_dl_ofdma_sup,
29555
  &hf_ieee80211_eht_phy_bits_64_71_rx_4096_qam_wid_bw_dl_ofdma_sup,
29556
  &hf_ieee80211_eht_phy_bits_64_71_20m_limit_capa_support,
29557
  &hf_ieee80211_eht_phy_bits_64_71_20m_mu_beam_feedback_dl_mu_mimo,
29558
  &hf_ieee80211_eht_phy_bits_64_71_20m_mru_support,
29559
  &hf_ieee80211_eht_phy_bits_64_71_reserved,
29560
  NULL
29561
};
29562
29563
static int * const eht_mcs_20mhz_map_hdrs[] = {
29564
  &hf_ieee80211_eht_rx_max_nss_20mhz_0_7,
29565
  &hf_ieee80211_eht_tx_max_nss_20mhz_0_7,
29566
  &hf_ieee80211_eht_rx_max_nss_20mhz_8_9,
29567
  &hf_ieee80211_eht_tx_max_nss_20mhz_8_9,
29568
  &hf_ieee80211_eht_rx_max_nss_20mhz_10_11,
29569
  &hf_ieee80211_eht_tx_max_nss_20mhz_10_11,
29570
  &hf_ieee80211_eht_rx_max_nss_20mhz_12_13,
29571
  &hf_ieee80211_eht_tx_max_nss_20mhz_12_13,
29572
  NULL
29573
};
29574
29575
static void
29576
dissect_eht_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_,
29577
                         proto_tree *tree, int offset, int len _U_)
29578
18
{
29579
18
  proto_tree *eht_phy_capa = NULL, *eht_mcs_nss = NULL;
29580
18
  bool ch_320mhz_in_6ghz = false;
29581
18
  bool ppe_thresholds_present = false;
29582
29583
18
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_eht_mac_capabilities,
29584
18
                         ett_eht_mac_capa, eht_mac_capa_hdrs,
29585
18
                         ENC_LITTLE_ENDIAN);
29586
18
  offset += 2;
29587
29588
18
  ch_320mhz_in_6ghz = tvb_get_uint8(tvb, offset) & 0x02;
29589
29590
18
  eht_phy_capa = proto_tree_add_subtree(tree, tvb, offset, 9,
29591
18
                                        ett_eht_phy_capa, NULL,
29592
18
                                        "EHT PHY Capabilities Information");
29593
18
  proto_tree_add_bitmask_with_flags(eht_phy_capa, tvb, offset,
29594
18
                                    hf_ieee80211_eht_phy_bits_0_15,
29595
18
                                    ett_eht_phy_bits_0_15, eht_phy_bits_0_15,
29596
18
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
29597
18
  offset += 2;
29598
29599
18
  proto_tree_add_bitmask_with_flags(eht_phy_capa, tvb, offset,
29600
18
                                    hf_ieee80211_eht_phy_bits_16_31,
29601
18
                                    ett_eht_phy_bits_16_31, eht_phy_bits_16_31,
29602
18
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
29603
18
  offset += 2;
29604
29605
18
  proto_tree_add_bitmask_with_flags(eht_phy_capa, tvb, offset,
29606
18
                                    hf_ieee80211_eht_phy_bits_32_39,
29607
18
                                    ett_eht_phy_bits_32_39, eht_phy_bits_32_39,
29608
18
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
29609
18
  offset += 1;
29610
29611
18
  ppe_thresholds_present = tvb_get_uint8(tvb, offset) & 0x08;
29612
18
  proto_tree_add_bitmask_with_flags(eht_phy_capa, tvb, offset,
29613
18
                                    hf_ieee80211_eht_phy_bits_40_63,
29614
18
                                    ett_eht_phy_bits_40_63, eht_phy_bits_40_63,
29615
18
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
29616
18
  offset += 3;
29617
29618
18
  proto_tree_add_bitmask_with_flags(eht_phy_capa, tvb, offset,
29619
18
                                    hf_ieee80211_eht_phy_bits_64_71,
29620
18
                                    ett_eht_phy_bits_64_71, eht_phy_bits_64_71,
29621
18
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
29622
18
  offset += 1;
29623
29624
  /*
29625
   * We need to figure out the channel width set and frequency for this but it
29626
   * is only possible if we got the frequency info and the channel width set
29627
   * was added to the pinfo. If we don't have that simply add the rest as
29628
   * uninterpreted bytes.
29629
   */
29630
18
  eht_mcs_nss = proto_tree_add_subtree(tree, tvb, offset,
29631
18
                               tvb_captured_length_remaining(tvb, offset),
29632
18
                               ett_eht_phy_mcs_nss, NULL,
29633
18
                               "Supported EHT-MCS and NSS Set");
29634
29635
18
  if (pinfo->pseudo_header->ieee_802_11.has_frequency) {
29636
5
    unsigned *p_channel_width_set =
29637
5
      (unsigned *)p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan,
29638
5
                                HE_CHANNEL_WIDTH_KEY);
29639
5
    unsigned channel_width_set = 0;
29640
    /*
29641
     * If we got it, we can handle the rest, otherwise not. Note,
29642
     * we can determine if it was ever set by checking for non-zero because
29643
     * we set at least one bit when saving it..
29644
     */
29645
5
    if (p_channel_width_set) {
29646
0
      bool is_ap = GPOINTER_TO_UINT(p_get_proto_data(wmem_file_scope(),
29647
0
                                                         pinfo, proto_wlan,
29648
0
                                                         IS_AP_KEY));
29649
0
      channel_width_set = GPOINTER_TO_UINT(p_channel_width_set);
29650
29651
      /* Distinguish between the AP and the non-AP cases as the logis is easier
29652
       * even if that means some duplicate code.
29653
       */
29654
0
      if (is_ap) {
29655
        /* The EHT-MCS and NSS set for BW <= 80MHz Ap etc */
29656
0
        if (tvb_captured_length_remaining(tvb, offset) < 3) {
29657
0
          expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29658
0
                           "Insufficient bytes for EHT Capabilities. Need 3. "
29659
0
                           "Perhaps the EHT Capabilities field is malformed.");
29660
0
          return;
29661
0
        }
29662
0
        proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29663
0
                               hf_ieee80211_eht_mcs_and_nss_le_80mhz,
29664
0
                               ett_eht_phy_mcs_nss_set,
29665
0
                               eht_le_80_mcs_map_hdrs,
29666
0
                               ENC_LITTLE_ENDIAN);
29667
0
        offset += 3;
29668
29669
0
        if (channel_width_set & 0x04) { /* B2 is set */
29670
0
          if (tvb_captured_length_remaining(tvb, offset) < 3) {
29671
0
            expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29672
0
                           "Insufficient bytes for EHT Capabilities. Need 3 for AP 160MHz. "
29673
0
                           "Perhaps the EHT Capabilities field is malformed.");
29674
0
            return;
29675
0
          }
29676
0
          proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29677
0
                                 hf_ieee80211_eht_mcs_and_nss_eq_160mhz,
29678
0
                                 ett_eht_phy_mcs_nss_set,
29679
0
                                 eht_160_mcs_map_hdrs,
29680
0
                                 ENC_LITTLE_ENDIAN);
29681
0
          offset += 3;
29682
0
        }
29683
0
        if (ch_320mhz_in_6ghz &&
29684
0
            IS_6_GHZ(pinfo->pseudo_header->ieee_802_11.frequency)) {
29685
0
          if (tvb_captured_length_remaining(tvb, offset) < 3) {
29686
0
            expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29687
0
                           "Insufficient bytes for EHT Capabilities. Need 3. "
29688
0
                           "Perhaps the EHT Capabilities field is malformed.");
29689
0
            return;
29690
0
          }
29691
0
          proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29692
0
                                 hf_ieee80211_eht_mcs_and_nss_eq_320mhz,
29693
0
                                 ett_eht_phy_mcs_nss_set,
29694
0
                                 eht_320_mcs_map_hdrs,
29695
0
                                 ENC_LITTLE_ENDIAN);
29696
0
          offset += 3;
29697
0
        }
29698
0
      } else {
29699
        /* Add the info for a 20MHz-Only Non-AP. But have to check both
29700
         * frequency sets for some cases */
29701
0
        if ((channel_width_set & 0x07) == 0) {
29702
0
          if (tvb_captured_length_remaining(tvb, offset) < 4) {
29703
0
            expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29704
0
                           "Insufficient bytes for EHT Capabilities. Need 4. "
29705
0
                           "Perhaps the EHT Capabilities field is malformed.");
29706
0
           return;
29707
0
          }
29708
0
          proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29709
0
                                 hf_ieee80211_eht_mcs_and_nss_non_ap,
29710
0
                                 ett_eht_phy_mcs_nss_set,
29711
0
                                 eht_mcs_20mhz_map_hdrs,
29712
0
                                 ENC_LITTLE_ENDIAN);
29713
0
          offset += 4;
29714
0
        }
29715
        /* Now, the next set BW <= 80MHz except ...
29716
         * If 2.4GHz and B0 is 1, or 5GHz or 6GHz and B1 */
29717
0
        if ((IS_2_4_GHZ(pinfo->pseudo_header->ieee_802_11.frequency) &&
29718
0
             channel_width_set & 0x01) ||
29719
0
            (channel_width_set & 0x02)) {
29720
0
          if (tvb_captured_length_remaining(tvb, offset) < 3) {
29721
0
            expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29722
0
                           "Insufficient bytes for EHT Capabilities. Need 3 for le 80MHz. "
29723
0
                           "Perhaps the EHT Capabilities field is malformed.");
29724
0
            return;
29725
0
          }
29726
0
          proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29727
0
                                 hf_ieee80211_eht_mcs_and_nss_le_80mhz,
29728
0
                                 ett_eht_phy_mcs_nss_set,
29729
0
                                 eht_le_80_mcs_map_hdrs,
29730
0
                                 ENC_LITTLE_ENDIAN);
29731
0
          offset += 3;
29732
29733
0
        }
29734
0
        if (!IS_2_4_GHZ(pinfo->pseudo_header->ieee_802_11.frequency) &&
29735
0
            channel_width_set & 0x04) { /* B2 is set */
29736
0
          if (tvb_captured_length_remaining(tvb, offset) < 3) {
29737
0
            expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29738
0
                           "Insufficient bytes for EHT Capabilities. Need 3 for 160MHz. "
29739
0
                           "Perhaps the EHT Capabilities field is malformed.");
29740
0
            return;
29741
0
          }
29742
0
          proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29743
0
                                 hf_ieee80211_eht_mcs_and_nss_eq_160mhz,
29744
0
                                 ett_eht_phy_mcs_nss_set,
29745
0
                                 eht_160_mcs_map_hdrs,
29746
0
                                 ENC_LITTLE_ENDIAN);
29747
0
          offset += 3;
29748
0
        }
29749
0
        if (ch_320mhz_in_6ghz &&
29750
0
            IS_6_GHZ(pinfo->pseudo_header->ieee_802_11.frequency)) {
29751
0
          if (tvb_captured_length_remaining(tvb, offset) < 3) {
29752
0
            expert_add_info_format(pinfo, eht_mcs_nss, &ei_ieee80211_bad_length,
29753
0
                           "Insufficient bytes for EHT Capabilities. Need 3 for 320MHz. "
29754
0
                           "Perhaps the EHT Capabilities field is malformed.");
29755
0
            return;
29756
0
          }
29757
0
          proto_tree_add_bitmask(eht_mcs_nss, tvb, offset,
29758
0
                                 hf_ieee80211_eht_mcs_and_nss_eq_320mhz,
29759
0
                                 ett_eht_phy_mcs_nss_set,
29760
0
                                 eht_320_mcs_map_hdrs,
29761
0
                                 ENC_LITTLE_ENDIAN);
29762
0
          offset += 3;
29763
0
        }
29764
0
      }
29765
5
    } else {
29766
5
      proto_tree_add_item(eht_mcs_nss, hf_ieee80211_eht_supported_mcs_nss_bytes,
29767
5
                          tvb, offset,
29768
5
                          tvb_captured_length_remaining(tvb, offset), ENC_NA);
29769
5
      offset += tvb_captured_length_remaining(tvb, offset);
29770
5
    }
29771
5
  }
29772
29773
  /*
29774
   * If the PPE thresholds are present, add them.
29775
   */
29776
18
  if (ppe_thresholds_present) {
29777
3
    proto_tree_add_item(tree, hf_ieee80211_eht_ppe_thresholds, tvb, offset,
29778
3
                        tvb_captured_length_remaining(tvb, offset), ENC_NA);
29779
3
  }
29780
18
}
29781
29782
static const value_string tid_to_link_mapping_dirn_vals[] = {
29783
  { 0, "Uplink" },
29784
  { 1, "Downlink" },
29785
  { 2, "Bidirectional link" },
29786
  { 0, NULL }
29787
};
29788
29789
static const value_string ttl_link_mapping_size_vals[] = {
29790
  { 0, "2 octets" },
29791
  { 1, "1 octet" },
29792
  { 0, NULL }
29793
};
29794
29795
static int * const eht_ttl_mapping_control_hdrs[] = {
29796
  &hf_ieee80211_eht_ttl_mapping_direction,
29797
  &hf_ieee80211_eht_ttl_default_link_mapping,
29798
  &hf_ieee80211_eht_ttl_mapping_switch_time_pres,
29799
  &hf_ieee80211_eht_ttl_expected_dura_pres,
29800
  &hf_ieee80211_eht_ttl_link_mapping_size,
29801
  &hf_ieee80211_eht_ttl_mapping_reserved,
29802
  NULL
29803
};
29804
29805
static void
29806
dissect_tid_to_link_mapping(tvbuff_t *tvb, packet_info *pinfo _U_,
29807
                            proto_tree *tree, int offset, int len _U_)
29808
34
{
29809
34
  proto_item *control = NULL;
29810
34
  uint8_t presence;
29811
34
  uint8_t control_byte = tvb_get_uint8(tvb, offset);
29812
34
  uint8_t map_size = 2;
29813
34
  int hf_array[8] = {hf_ieee80211_eht_ttl_mapping_tid_0_link_mapping,
29814
34
                     hf_ieee80211_eht_ttl_mapping_tid_1_link_mapping,
29815
34
                     hf_ieee80211_eht_ttl_mapping_tid_2_link_mapping,
29816
34
                     hf_ieee80211_eht_ttl_mapping_tid_3_link_mapping,
29817
34
                     hf_ieee80211_eht_ttl_mapping_tid_4_link_mapping,
29818
34
                     hf_ieee80211_eht_ttl_mapping_tid_5_link_mapping,
29819
34
                     hf_ieee80211_eht_ttl_mapping_tid_6_link_mapping,
29820
34
                     hf_ieee80211_eht_ttl_mapping_tid_7_link_mapping};
29821
34
  int hf_index = 0;
29822
29823
  /*
29824
   * If the Default Link Mapping bit is set, we only have 1 byte, otherwise 2
29825
   */
29826
34
  control = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
29827
34
              hf_ieee80211_eht_ttl_mapping_control,
29828
34
              ett_eht_ttl_mapping,
29829
34
              eht_ttl_mapping_control_hdrs,
29830
34
              ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
29831
34
  offset += 1;
29832
29833
34
  if (len == 1) {
29834
2
    return;
29835
2
  }
29836
29837
32
  presence = tvb_get_uint8(tvb, offset);
29838
29839
32
  proto_tree_add_item(control, hf_ieee80211_eht_ttl_mapping_presence, tvb,
29840
32
                      offset, 1, ENC_LITTLE_ENDIAN);
29841
32
  offset += 1;
29842
29843
32
  if (control_byte & 0x08) {
29844
4
      proto_tree_add_item(tree, hf_ieee80211_eht_ttl_mapping_switch_time, tvb,
29845
4
                          offset, 2, ENC_LITTLE_ENDIAN);
29846
4
      offset += 2;
29847
4
  }
29848
29849
32
  if (control_byte & 0x10) {
29850
15
      proto_tree_add_item(tree, hf_ieee80211_eht_ttl_mapping_expected_duration, tvb,
29851
15
                          offset, 3, ENC_LITTLE_ENDIAN);
29852
15
      offset += 3;
29853
15
  }
29854
29855
32
  if (control_byte & 0x20) {
29856
12
    map_size = 1;
29857
12
  }
29858
209
  while (presence) {
29859
177
    if (presence & 0x01) {
29860
99
      proto_tree_add_item(tree, hf_array[hf_index], tvb,
29861
99
                          offset, map_size, ENC_LITTLE_ENDIAN);
29862
99
      offset += map_size;
29863
99
    }
29864
177
    hf_index++;
29865
177
    presence = presence >> 1;
29866
177
  }
29867
32
}
29868
29869
static int * const ml_traffic_control_hdrs[] = {
29870
  &hf_ieee80211_eht_multi_link_tc_bitmap_size,
29871
  &hf_ieee80211_eht_multi_link_tc_aid_offset,
29872
  &hf_ieee80211_eht_multi_link_tc_reserved,
29873
  NULL
29874
};
29875
29876
static void
29877
dissect_multi_link_traffic(tvbuff_t *tvb, packet_info *pinfo _U_,
29878
                           proto_tree *tree, int offset, int len _U_)
29879
6
{
29880
6
  proto_tree_add_bitmask(tree, tvb, offset,
29881
6
                         hf_ieee80211_eht_multi_link_traffic_control,
29882
6
                         ett_eht_eht_multi_link_tc,
29883
6
                         ml_traffic_control_hdrs,
29884
6
                         ENC_LITTLE_ENDIAN);
29885
6
  offset += 2;
29886
6
  len -= 2;
29887
29888
  /* If there is nothing more, bail. */
29889
6
  if (len <= 0)
29890
1
    return;
29891
29892
  /* Now, add the traffic indication list as a byte string for the moment */
29893
5
  proto_tree_add_item(tree, hf_ieee80211_eht_multi_link_traffic_indication,
29894
5
                      tvb, offset, tvb_captured_length_remaining(tvb, offset),
29895
5
                      ENC_NA);
29896
5
}
29897
29898
16
#define MAX_MSDU_SIZE_PRESENT           0x0001
29899
16
#define SERVICE_START_TIME_PRESENT      0x0002
29900
16
#define SERVICE_START_TIME_LID_PRESENT  0x0004
29901
16
#define MEAN_DATA_RATE_PRESENT          0x0008
29902
16
#define BURST_SIZE_PRESENT              0x0010
29903
16
#define MSDU_LIFETIME_PRESENT           0x0020
29904
16
#define MSDU_DELIVERY_INFO_PRESENT      0x0040
29905
16
#define MEDIUM_TIME_PRESENT             0x0080
29906
29907
static const value_string qos_chars_dirn_vals[] = {
29908
  { 0, "Uplink" },
29909
  { 1, "Downlink" },
29910
  { 2, "Direct link" },
29911
  { 3, "Reserved" },
29912
  { 0, NULL }
29913
};
29914
29915
static void
29916
dissect_qos_characteristics(tvbuff_t *tvb, packet_info *pinfo _U_,
29917
                            proto_tree *tree, int offset, int len _U_)
29918
16
{
29919
16
  proto_tree *control_tree = NULL;
29920
16
  uint16_t presence_bitmap = (tvb_get_letohl(tvb, offset) >> 9) & 0xFFFF;
29921
29922
16
  control_tree = proto_tree_add_subtree(tree, tvb, offset, 4,
29923
16
                                        ett_eht_qos_characteristics,
29924
16
                                        NULL, "Control Info");
29925
29926
16
  proto_tree_add_item(control_tree, hf_ieee80211_eht_qos_chars_dirn, tvb,
29927
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29928
16
  proto_tree_add_item(control_tree, hf_ieee80211_eht_qos_chars_tid, tvb,
29929
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29930
16
  proto_tree_add_item(control_tree, hf_ieee80211_eht_qos_chars_user_prio, tvb,
29931
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29932
16
  proto_tree_add_item(control_tree, hf_ieee80211_eht_qos_chars_bitmap, tvb,
29933
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29934
16
  proto_tree_add_item(control_tree, hf_ieee80211_eht_qos_chars_linkid, tvb,
29935
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29936
16
  proto_tree_add_item(control_tree, hf_ieee80211_eht_qos_chars_resrvd, tvb,
29937
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29938
16
  offset += 4;
29939
29940
  /* Now add the fields, including the optional ones. */
29941
16
  proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_min_svc_interval, tvb,
29942
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29943
16
  offset += 4;
29944
29945
16
  proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_max_svc_interval, tvb,
29946
16
                      offset, 4, ENC_LITTLE_ENDIAN);
29947
16
  offset += 4;
29948
29949
16
  proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_min_data_rate, tvb,
29950
16
                      offset, 3, ENC_LITTLE_ENDIAN);
29951
16
  offset += 3;
29952
29953
16
  proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_delay_bound, tvb,
29954
16
                      offset, 3, ENC_LITTLE_ENDIAN);
29955
16
  offset += 3;
29956
29957
  /* Now the optional ones */
29958
16
  if (presence_bitmap & MAX_MSDU_SIZE_PRESENT) {
29959
8
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_max_msdu_size, tvb,
29960
8
                        offset, 2, ENC_LITTLE_ENDIAN);
29961
8
    offset += 2;
29962
8
  }
29963
29964
16
  if (presence_bitmap & SERVICE_START_TIME_PRESENT) {
29965
5
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_service_start_time,
29966
5
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
29967
5
    offset += 4;
29968
5
  }
29969
29970
16
  if (presence_bitmap & SERVICE_START_TIME_LID_PRESENT) {
29971
5
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_service_start_time_linkid,
29972
5
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
29973
5
    offset += 1;
29974
5
  }
29975
29976
16
  if (presence_bitmap & MEAN_DATA_RATE_PRESENT) {
29977
8
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_mean_data_rate, tvb,
29978
8
                        offset, 3, ENC_LITTLE_ENDIAN);
29979
8
    offset += 3;
29980
8
  }
29981
29982
16
  if (presence_bitmap & BURST_SIZE_PRESENT) {
29983
9
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_burst_size, tvb,
29984
9
                        offset, 4, ENC_LITTLE_ENDIAN);
29985
9
    offset += 4;
29986
9
  }
29987
29988
16
  if (presence_bitmap & MSDU_LIFETIME_PRESENT) {
29989
4
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_msdu_lifetime, tvb,
29990
4
                        offset, 2, ENC_LITTLE_ENDIAN);
29991
4
    offset += 2;
29992
4
  }
29993
29994
16
  if (presence_bitmap & MSDU_DELIVERY_INFO_PRESENT) {
29995
2
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_msdu_delivery_ratio,
29996
2
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
29997
2
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_msdu_count_exponent,
29998
2
                        tvb, offset, 1, ENC_LITTLE_ENDIAN);
29999
2
    offset += 1;
30000
2
  }
30001
30002
16
  if (presence_bitmap & MEDIUM_TIME_PRESENT) {
30003
4
    proto_tree_add_item(tree, hf_ieee80211_eht_qos_chars_medium_time, tvb,
30004
4
                        offset, 2, ENC_LITTLE_ENDIAN);
30005
4
  }
30006
16
}
30007
30008
static void
30009
dissect_akm_suite_selector(tvbuff_t *tvb, packet_info *pinfo _U_,
30010
                           proto_tree *tree, int offset, int len _U_)
30011
4
{
30012
4
  proto_tree_add_item(tree, hf_ieee80211_rsn_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
30013
4
  if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
30014
0
  {
30015
0
    proto_tree_add_item(tree, hf_ieee80211_rsn_akms_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
30016
4
  } else {
30017
4
    proto_tree_add_item(tree, hf_ieee80211_rsn_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
30018
4
  }
30019
4
}
30020
30021
static void
30022
dissect_mlo_link_information(tvbuff_t *tvb, packet_info *pinfo _U_,
30023
                             proto_tree *tree, int offset, int len _U_)
30024
2
{
30025
2
  proto_tree_add_item(tree, hf_ieee80211_eht_link_id_bitmap, tvb, offset, 2,
30026
2
                      ENC_LITTLE_ENDIAN);
30027
2
}
30028
30029
static int * const ieee80211_eht_aid_bmapctl[] = {
30030
  &hf_ieee80211_eht_aid_bitmap_control_reserved,
30031
  &hf_ieee80211_eht_aid_bitmap_control_offset,
30032
  NULL
30033
};
30034
30035
static void
30036
dissect_aid_bitmap(tvbuff_t *tvb, packet_info *pinfo _U_,
30037
                   proto_tree *tree, int offset, int len _U_)
30038
70
{
30039
70
  unsigned aid, pab_len, n1, i, j, byte;
30040
30041
70
  pab_len = tvb_get_uint8(tvb, offset);
30042
70
  proto_tree_add_item(tree, hf_ieee80211_eht_aid_bitmap_length, tvb, offset, 1,
30043
70
                      ENC_LITTLE_ENDIAN);
30044
70
  offset += 1;
30045
30046
70
  n1 = tvb_get_uint8(tvb, offset) & 0xFE;
30047
70
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
30048
70
                                    hf_ieee80211_eht_aid_bitmap_control,
30049
70
                                    ett_eht_aid_bmapctl_tree,
30050
70
                                    ieee80211_eht_aid_bmapctl,
30051
70
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
30052
70
  offset += 1;
30053
30054
70
  proto_tree_add_item(tree, hf_ieee80211_eht_aid_bitmap_partial_aid_bitmap,
30055
70
                      tvb, offset, pab_len, ENC_NA);
30056
3.71k
  for (i = 0; i < pab_len; i++) {
30057
3.64k
    byte = tvb_get_uint8(tvb, offset + i);
30058
32.8k
    for (j = 0; j < 8; j++) {
30059
29.1k
      if (byte & (1 << j)) {
30060
13.3k
        aid = 8*n1 + 8*i + j;
30061
13.3k
        proto_tree_add_uint(tree, hf_ieee80211_eht_aid_bitmap_aid, tvb,
30062
13.3k
                            offset + i, 1, aid);
30063
13.3k
      }
30064
29.1k
    }
30065
3.64k
  }
30066
70
}
30067
30068
static int *const eht_bw_indi_param_hdrs[] = {
30069
  &hf_ieee80211_eht_bw_indi_param_reserved,
30070
  &hf_ieee80211_eht_bw_indi_param_disabled_subchan_bitmap,
30071
  &hf_ieee80211_eht_bw_indi_param_reserved1,
30072
  NULL
30073
};
30074
30075
static void
30076
dissect_bandwidth_indication(tvbuff_t *tvb, packet_info *pinfo _U_,
30077
                             proto_tree *tree, int offset, int len _U_)
30078
17
{
30079
17
  uint8_t params;
30080
30081
17
  params = tvb_get_uint8(tvb, offset);
30082
17
  proto_tree_add_bitmask(tree, tvb, offset,
30083
17
                         hf_ieee80211_eht_bw_indi_param,
30084
17
                         ett_eht_bw_indication_param,
30085
17
                         eht_bw_indi_param_hdrs,
30086
17
                         ENC_NA);
30087
17
  offset++;
30088
30089
17
  proto_tree_add_bitmask(tree, tvb, offset,
30090
17
                         hf_ieee80211_eht_operation_control,
30091
17
                         ett_eht_operation_control,
30092
17
                         eht_op_control_hdrs,
30093
17
                         ENC_NA);
30094
17
  offset++;
30095
30096
17
  proto_tree_add_item(tree, hf_ieee80211_eht_operation_ccfs0, tvb, offset, 1,
30097
17
                      ENC_NA);
30098
17
  offset++;
30099
30100
17
  proto_tree_add_item(tree, hf_ieee80211_eht_operation_ccfs1, tvb, offset, 1,
30101
17
                      ENC_NA);
30102
17
  offset++;
30103
30104
17
  if (params & 0x02) { /* Disabled subchannel bitmap present */
30105
10
    proto_item *item;
30106
10
    int8_t i;
30107
10
    char bitmap_binary[32];
30108
10
    uint16_t bitmap = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
30109
10
    item = proto_tree_add_item(tree, hf_ieee80211_eht_bw_indi_diabled_bitmap, tvb,
30110
10
                        offset, 2, ENC_LITTLE_ENDIAN);
30111
10
    memset(bitmap_binary, 0 ,sizeof(bitmap_binary));
30112
170
    for (i = 15; i >= 0; i--) {
30113
160
      if (bitmap & (1 << i))
30114
107
        bitmap_binary[15-i] = '1';
30115
53
      else
30116
53
        bitmap_binary[15-i] = '0';
30117
160
    }
30118
10
    proto_item_append_text(item, " (%s)", bitmap_binary);
30119
10
  }
30120
17
}
30121
30122
static int *const eht_nonap_sta_regu_conn_hdrs[] = {
30123
  &hf_ieee80211_nonap_sta_regu_conn_indoor_ap_valid,
30124
  &hf_ieee80211_nonap_sta_regu_conn_indoor_ap,
30125
  &hf_ieee80211_nonap_sta_regu_conn_sp_ap_valid,
30126
  &hf_ieee80211_nonap_sta_regu_conn_sp_ap,
30127
  &hf_ieee80211_nonap_sta_regu_conn_reserved,
30128
  NULL
30129
};
30130
30131
static void
30132
dissect_nonap_sta_regulatory_connect(tvbuff_t *tvb, packet_info *pinfo _U_,
30133
                                     proto_tree *tree, int offset, int len _U_)
30134
6
{
30135
6
  proto_tree_add_bitmask(tree, tvb, offset,
30136
6
                         hf_ieee80211_nonap_sta_regulatory_conn,
30137
6
                         ett_nonap_sta_regulatory_conn,
30138
6
                         eht_nonap_sta_regu_conn_hdrs,
30139
6
                         ENC_NA);
30140
6
}
30141
30142
static void
30143
add_min_max_time_between_measurements(proto_item *item, tvbuff_t *tvb, packet_info *pinfo, int offset, int sub_length)
30144
531
{
30145
531
  uint64_t ntb_specific, min, max;
30146
30147
531
  if (sub_length < 6) {
30148
478
      return;
30149
478
  }
30150
30151
53
  ntb_specific = tvb_get_int48(tvb, offset, ENC_LITTLE_ENDIAN);
30152
30153
53
  min = (ntb_specific >> 1) & GENMASK(22, 0);
30154
53
  max = (ntb_specific >> 24) & GENMASK(19, 0);
30155
30156
  /* convert to microseconds */
30157
53
  min *= 100; /* min time is in units of 100 microseconds */
30158
53
  max *= 10 * 1000; /* max time is in units of 10 milliseconds */
30159
30160
53
  float minf = (float)(min / 1E6);
30161
53
  float maxf = (float)(max / 1E6);
30162
30163
53
  proto_item_append_text(item, " (Min=%.6gs, Max=%.6gs)", minf, maxf);
30164
53
  col_append_fstr(pinfo->cinfo, COL_INFO, ", Min=%.6gs, Max=%.6gs", minf, maxf);
30165
53
}
30166
30167
static void
30168
dissect_ntb_specific(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int sub_length)
30169
538
{
30170
538
  static int * const nontb_fields[] = {
30171
538
    &hf_ieee80211_tag_ranging_ntb_reserved1,
30172
538
    &hf_ieee80211_tag_ranging_ntb_min_time_msmts,
30173
538
    &hf_ieee80211_tag_ranging_ntb_max_time_msmts,
30174
538
    &hf_ieee80211_tag_ranging_ntb_r2i_tx_power,
30175
538
    &hf_ieee80211_tag_ranging_ntb_i2r_tx_power,
30176
538
    &hf_ieee80211_tag_ranging_ntb_reserved2,
30177
538
    NULL};
30178
538
  proto_tree *item;
30179
30180
538
  item = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_ranging_ntb,
30181
538
                                           ett_tag_ranging_ntb, nontb_fields,
30182
538
                                           ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
30183
538
  col_append_str(pinfo->cinfo, COL_INFO, ", NTB");
30184
538
  add_min_max_time_between_measurements(item, tvb, pinfo, offset, sub_length);
30185
538
}
30186
30187
static const range_string ranging_subelt_types[] = {
30188
  { 0, 0, "Non-TB specific" },
30189
  { 1, 1, "TB-specific" },
30190
  { 2, 2, "Secure HE-LTF" },
30191
  { 3, 220, "Reserved" },
30192
  { 221, 221, "Vendor Specific" },
30193
  { 222, 255, "Reserved" },
30194
  { 0, 0, NULL }
30195
};
30196
30197
static int
30198
dissect_tb_specific(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
30199
    int offset, int sub_length _U_)
30200
29
{
30201
30202
    /* Now add the extra 32-bits of items */
30203
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_aid_rsid, tvb,
30204
29
                        offset, 4, ENC_LITTLE_ENDIAN);
30205
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_device_class, tvb,
30206
29
                        offset, 4, ENC_LITTLE_ENDIAN);
30207
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_full_bw_ul_mu_mimo, tvb,
30208
29
                        offset, 4, ENC_LITTLE_ENDIAN);
30209
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_trigger_frame_paddur,
30210
29
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
30211
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_max_sess_exp, tvb,
30212
29
                        offset, 4, ENC_LITTLE_ENDIAN);
30213
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_passive_tb_ranging, tvb,
30214
29
                        offset, 4, ENC_LITTLE_ENDIAN);
30215
29
    proto_tree_add_item(tree, hf_ieee80211_tag_ranging_tb_specific_reserved,
30216
29
                        tvb, offset, 4, ENC_LITTLE_ENDIAN);
30217
29
    offset += 4;
30218
30219
29
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
30220
30221
29
    return offset;
30222
29
}
30223
30224
static int * const ranging_subelement_secure_he_ltf_fields[] = {
30225
  &hf_ieee80211_tag_ranging_secure_he_ltf_version,
30226
  &hf_ieee80211_tag_ranging_secure_he_ltf_req,
30227
  &hf_ieee80211_tag_ranging_secure_he_ltf_r2i_tx_window,
30228
  &hf_ieee80211_tag_ranging_secure_he_ltf_i2r_tx_window,
30229
  &hf_ieee80211_tag_ranging_secure_he_ltf_reserved,
30230
  NULL};
30231
30232
static void
30233
dissect_ranging_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int len)
30234
71
{
30235
71
  int tag_len = tvb_reported_length(tvb);
30236
71
  unsigned subelt = 0;
30237
71
  static int * const ranging_params_fields[] = {
30238
71
    &hf_ieee80211_tag_ranging_status_indication,
30239
71
    &hf_ieee80211_tag_ranging_value,
30240
71
    &hf_ieee80211_tag_ranging_i2r_lmr_feedback,
30241
71
    &hf_ieee80211_tag_ranging_secure_ltf_required,
30242
71
    &hf_ieee80211_tag_ranging_secure_ltf_support,
30243
71
    &hf_ieee80211_tag_ranging_ranging_priority,
30244
71
    &hf_ieee80211_tag_ranging_r2i_toa_type,
30245
71
    &hf_ieee80211_tag_ranging_i2r_toa_type,
30246
71
    &hf_ieee80211_tag_ranging_r2i_aoa_requested,
30247
71
    &hf_ieee80211_tag_ranging_i2r_aoa_requested,
30248
71
    &hf_ieee80211_tag_ranging_format_and_bandwidth,
30249
71
    &hf_ieee80211_tag_ranging_immediate_r2i_feedback,
30250
71
    &hf_ieee80211_tag_ranging_immediate_i2r_feedback,
30251
71
    &hf_ieee80211_tag_ranging_max_i2r_repetition,
30252
71
    &hf_ieee80211_tag_ranging_max_r2i_repetition,
30253
71
    &hf_ieee80211_tag_ranging_reserved1,
30254
71
    &hf_ieee80211_tag_ranging_reserved2,
30255
71
    &hf_ieee80211_tag_ranging_max_r2i_sts_le_80_mhz,
30256
71
    &hf_ieee80211_tag_ranging_max_r2i_sts_gt_80_mhz,
30257
71
    &hf_ieee80211_tag_ranging_max_r2i_ltf_total,
30258
71
    &hf_ieee80211_tag_ranging_max_i2r_ltf_total,
30259
71
    &hf_ieee80211_tag_ranging_max_i2r_sts_le_80_mhz,
30260
71
    &hf_ieee80211_tag_ranging_max_i2r_sts_gt_80_mhz,
30261
71
    &hf_ieee80211_tag_ranging_bss_color_info,
30262
71
    NULL};
30263
71
  static const value_string short_status[] = {
30264
71
    { 0, "Reserved" },
30265
71
    { 1, "Successful" },
30266
71
    { 2, "Request incapable" },
30267
71
    { 3, "Request failed" },
30268
71
    { 0, NULL }
30269
71
  };
30270
30271
71
  if (len < 6) {
30272
4
    expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
30273
4
                           "Ranging Parameters must be at least 6 octets long");
30274
4
    return;
30275
4
  }
30276
30277
67
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_ranging_parameters,
30278
67
                                    ett_tag_ranging, ranging_params_fields,
30279
67
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
30280
67
  uint8_t status = tvb_get_uint8(tvb, offset) & GENMASK(1, 0);
30281
67
  if (status != 0) {
30282
52
    col_append_fstr(pinfo->cinfo, COL_INFO, ", Status=%d (%s)", status,
30283
52
                    val_to_str_const(status, short_status, "Unknown"));
30284
52
  }
30285
30286
67
  offset += 7;
30287
30288
765
  while (offset < len) {
30289
759
    uint8_t sub_id, sub_length;
30290
759
    proto_item *sub_elt_len, *rsti;
30291
759
    proto_tree *sub_tree;
30292
759
    unsigned start_offset = offset;
30293
30294
759
    sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
30295
759
                        ett_ranging_subelement_tree, &rsti,
30296
759
                        "Ranging Subelement %d", subelt);
30297
30298
30299
759
    sub_id = tvb_get_uint8(tvb, offset);
30300
759
    proto_item_append_text(sub_tree, ": %s",
30301
759
                           rval_to_str_const(sub_id, ranging_subelt_types, "Reserved"));
30302
759
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_ranging_subelt_tag, tvb,
30303
759
                        offset, 1, ENC_NA);
30304
759
    offset += 1;
30305
30306
759
    sub_length = tvb_get_uint8(tvb, offset);
30307
759
    sub_elt_len = proto_tree_add_item(sub_tree,
30308
759
                                      hf_ieee80211_tag_ranging_subelt_len,
30309
759
                                      tvb, offset, 1, ENC_NA);
30310
759
    offset += 1;
30311
30312
759
    if (offset + sub_length > tag_len) {
30313
41
      expert_add_info_format(pinfo, sub_elt_len, &ei_ieee80211_tag_length,
30314
41
          "Subelement length (%u) exceeds remaining tag length (%u)",
30315
41
          sub_length, tvb_captured_length_remaining(tvb, offset));
30316
41
      proto_item_set_len(rsti, offset - start_offset);
30317
41
      return;
30318
41
    }
30319
30320
718
    switch (sub_id) {
30321
538
      case 0:  /* non-TB specific */
30322
538
        dissect_ntb_specific(tvb, pinfo, tree, offset, sub_length);
30323
538
        break;
30324
29
      case 1: /* Ranging SUB_TB_SPECIFIC */
30325
        /* TODO: Specify the acceptable tagged elements */
30326
29
        offset = dissect_tb_specific(tvb, pinfo, tree, offset, sub_length);
30327
29
        break;
30328
26
      case 2: /* Secure HE-LTF */
30329
26
        proto_tree_add_bitmask_with_flags(sub_tree, tvb, offset,
30330
26
                        hf_ieee80211_tag_ranging_secure_he_ltf,
30331
26
                        ett_tag_ranging_secure_he_ltf,
30332
26
                        ranging_subelement_secure_he_ltf_fields,
30333
26
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
30334
26
        break;
30335
114
      default:  /* skip unknown elements which may be defined in the future */
30336
114
        break;
30337
718
    }
30338
30339
698
    offset += sub_length;
30340
698
    subelt++;
30341
698
    proto_item_set_len(rsti, offset - start_offset);
30342
698
  }
30343
67
}
30344
30345
static int * const aoa_results_fields[] = {
30346
  &hf_ieee80211_tag_ftm_aoa_results_aoa_azimuth,
30347
  &hf_ieee80211_tag_ftm_aoa_results_aoa_elevation,
30348
  &hf_ieee80211_tag_ftm_aoa_results_aoa_azimuth_accuracy,
30349
  &hf_ieee80211_tag_ftm_aoa_results_aoa_elevation_accuracy,
30350
  &hf_ieee80211_tag_ftm_aoa_results_best_awv_id,
30351
  &hf_ieee80211_tag_ftm_aoa_results_aoa_reference,
30352
  &hf_ieee80211_tag_ftm_aoa_results_reserved,
30353
  NULL
30354
};
30355
30356
static const true_false_string aoa_reference_tfs = {
30357
  "Earth coordinates",
30358
  "STA-relative coordinated"
30359
};
30360
30361
static void
30362
aoa_azimuth_custom(char *result, uint32_t aoa_azimuth)
30363
0
{
30364
0
  float az = aoa_azimuth * (360.0f / 2048.0f);
30365
30366
0
  snprintf(result, ITEM_LABEL_LENGTH, "%f7.3", az);
30367
0
}
30368
30369
static void
30370
aoa_elevation_custom(char *result, uint32_t aoa_elevation)
30371
0
{
30372
0
  float el = (aoa_elevation - 512) * (180.0f / 1024.0f);
30373
30374
0
  snprintf(result, ITEM_LABEL_LENGTH, "%f7.3", el);
30375
0
}
30376
30377
static void
30378
aoa_accuracy_custom(char *result, uint32_t aoa_accuracy)
30379
0
{
30380
0
  float ac = aoa_accuracy * (360.0f / 1024.0f);
30381
30382
0
  if (aoa_accuracy == 127) {
30383
0
    snprintf(result, ITEM_LABEL_LENGTH, "No ability to estimate accuracy");
30384
0
  } else if (aoa_accuracy == 126) {
30385
0
    snprintf(result, ITEM_LABEL_LENGTH, "No measurement");
30386
0
  } else if (aoa_accuracy == 125) {
30387
0
    snprintf(result, ITEM_LABEL_LENGTH, "Larger than %7.3f", ac);
30388
0
  } else {
30389
0
    snprintf(result, ITEM_LABEL_LENGTH, "%f7.3", ac);
30390
0
  }
30391
0
}
30392
30393
static void
30394
dissect_direction_measurement_results(tvbuff_t *tvb, packet_info *pinfo _U_,
30395
                                      proto_tree *tree, int offset, int len _U_)
30396
7
{
30397
7
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
30398
7
                                    hf_ieee80211_tag_dirn_meas_results_aoa_results,
30399
7
                                    ett_tag_direct_meas_results,
30400
7
                                    aoa_results_fields,
30401
7
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
30402
7
}
30403
30404
/* ************************************************************************* */
30405
/*           Dissect and add tagged (optional) fields to proto tree          */
30406
/* ************************************************************************* */
30407
30408
static int
30409
ieee80211_tag_ssid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
30410
40.0k
{
30411
40.0k
  int tag_len = tvb_reported_length(tvb);
30412
40.0k
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
30413
40.0k
  int offset = 0;
30414
  /* 7.3.2.1 SSID element (0) */
30415
40.0k
  char ssid[MAX_SSID_LEN]; /* The SSID may consist of arbitrary bytes */
30416
40.0k
  int ssid_len;
30417
30418
40.0k
  if (beacon_padding != 0) /* padding bug */
30419
36.9k
    return offset;
30420
30421
3.07k
  if (tag_len > MAX_SSID_LEN) {
30422
328
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
30423
328
                           "SSID length (%u) greater than maximum (%u)",
30424
328
                           tag_len, MAX_SSID_LEN);
30425
328
  }
30426
30427
  /*
30428
   * XXX - the 802.11 specs aren't particularly clear on how the SSID
30429
   * is to be interpreted.
30430
   *
30431
   * IEEE Std 802.11-1999, section 7.3.2.2 "Service Set Identity (SSID)
30432
   * element" says just
30433
   *
30434
   *    The length of the SSID information field is between 0 and 32
30435
   *    octets. A 0 length information field indicates the broadcast SSID.
30436
   *
30437
   * with no indication that those octets encode a string.
30438
   *
30439
   * IEEE Std 802.11-2012, section 8.4.2.2 "SSID element", says that *but*
30440
   * says after it
30441
   *
30442
   *    When the UTF-8 SSID subfield of the Extended Capabilities element
30443
   *    is equal to 1 in the frame that includes the SSID element, the
30444
   *    SSID is interpreted using UTF-8 encoding.
30445
   *
30446
   *    NOTE -- This is true for Beacon and Probe Response frames when the
30447
   *    MLME-START.request primitive was issued with the SSIDEncoding
30448
   *    parameter equal to UTF-8.
30449
   *
30450
   * and the SSIDEncoding parameter can either be UNSPECIFIED or UTF-8.
30451
   *
30452
   * IEEE Std 802.11-2020, section 9.4.2.2 "SSID element" changes the
30453
   * wording to:
30454
   *
30455
   *    When the UTF-8 SSID subfield of the Extended Capabilities element is
30456
   *    equal to 1 in the frame that includes the SSID element, or the Extended
30457
   *    Capabilities of the source of the SSID information is known to include
30458
   *    the UTF-8 SSID capability based on a previously received Extended
30459
   *    Capabilities element, the SSID is a sequence of UTF-8 encoded code
30460
   *    points. Otherwise, the character encoding of the octets in this SSID
30461
   *    element is unspecified.
30462
   *
30463
   *    NOTE—If the SSID is a sequence of UTF-8 encoded code points, a
30464
   *    terminating null might or might not be present.
30465
   *
30466
   * So I *guess* that means that, if the UTF-8 SSID subfield isn't
30467
   * equal to 1, the SSID is, in theory, just a bunch of octets, but
30468
   * in practice, *probably* UTF-8 as that's the typical convention,
30469
   * and, if it is equal to 1, it's a possibly null-terminated UTF-8
30470
   * string.  (Of course, a host can put anything there it wants to,
30471
   * so we shouldn't just assume that it's *valid* ASCII or *valid* UTF-8.)
30472
   *
30473
   * So we really should extract it as an array of ssid_len bytes,
30474
   * pass those bytes to Dot11DecryptSetLastSSID(), and:
30475
   *
30476
   *    If the UTF-8 SSID subfield isn't set to 1, put the SSID in
30477
   *    a FT_BYTES as BASE_SHOW_UTF_8_PRINTABLE;
30478
   *
30479
   *    If the UTF-8 SSID subfield is set to 1, put it in as an
30480
   *    ENC_UTF_8 string;
30481
   *
30482
   * XXX: Note that the Extended Capabilities tagged parameter is specified
30483
   * to come *after* the SSID parameter (and "Fields and elements appear
30484
   * in the specified, relative order" per 9.3.3.1 of IEEE 802.11 2020),
30485
   * isn't sent with Response frames, and isn't guaranteed to appear with
30486
   * Request frames (if none of the bits would be set, then it isn't
30487
   * mandatory). We could store the bit if it appears in the conversation
30488
   * data, which would handle Response frames and subsequent passes, but
30489
   * for the first pass we don't know the value of the subfield until later.
30490
   * We could store the proto_item with the ssid and add the string version
30491
   * later, or add the string always as a hidden item and make it visible
30492
   * later, or something else.
30493
   *
30494
   * Addendum: 802.11 2012 points out that a Zero-length SSID means
30495
   * the Wildcard SSID. Make it so. From 8.4.2.2 of 802.11 2012:
30496
   *
30497
   * "The length of the SSID field is between 0 and 32 octets. A SSID
30498
   *  field of length 0 is used within Probe Request management frames to
30499
   *  indicate the wildcard SSID. The wildcard SSID is also used in
30500
   *  Beacon and Probe Response frames transmitted by mesh STAs."
30501
   *
30502
   * Also, we have to return a non-zero value here to prevent an ugly
30503
   * undissected field warning. Since this code is only called from
30504
   * one place and is used in call to dissector_try_uint_with_data, it is
30505
   * OK to do so.
30506
   */
30507
3.07k
  ssid_len = tvb_get_raw_bytes_as_string(tvb_new_subset_length(tvb, offset, tag_len), offset, ssid, MAX_SSID_LEN);
30508
3.07k
  if (ssid_len == (int)tag_len) {
30509
2.72k
    Dot11DecryptSetLastSSID(&dot11decrypt_ctx, (char *) ssid, ssid_len);
30510
2.72k
  }
30511
3.07k
  char *s;
30512
  /* XXX: 802.11-2020 9.4.2.2 notes that it might or might not include
30513
   * a terminating null when the UTF-8 SSID bit is set; if we handle
30514
   * that properly and add it as a ENC_UTF_8 FT_STRING, that will work,
30515
   * but the FT_BYTES BASE_SHOW_*_PRINTABLE doesn't handle an optional
30516
   * terminating null. (Maybe it should?) */
30517
3.07k
  proto_tree_add_item_ret_display_string(tree, hf_ieee80211_tag_ssid, tvb,
30518
3.07k
        offset, tag_len, ENC_NA, pinfo->pool, &s);
30519
30520
3.07k
  if (ssid_len > 0) {
30521
624
    proto_item_append_text(field_data->item_tag, ": %s", s);
30522
624
    col_append_fstr(pinfo->cinfo, COL_INFO, ", SSID=%s", s);
30523
30524
    /* Wlan Stats */
30525
624
    memcpy(wlan_stats.ssid, ssid, MIN(ssid_len, MAX_SSID_LEN));
30526
624
    wlan_stats.ssid_len = ssid_len;
30527
2.44k
  } else {
30528
2.44k
    proto_item_append_text(field_data->item_tag, ": Wildcard SSID");
30529
30530
2.44k
    col_append_str(pinfo->cinfo, COL_INFO, ", SSID=Wildcard (Broadcast)");
30531
2.44k
    offset += 1; // Make sure we return non-zero
30532
2.44k
  }
30533
30534
3.07k
  beacon_padding += 1; /* padding bug */
30535
30536
3.07k
  return offset + tag_len;
30537
40.0k
}
30538
30539
static void
30540
dissect_he_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
30541
  int offset, int len);
30542
30543
static void
30544
dissect_he_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
30545
  int offset, int len _U_);
30546
30547
static int
30548
dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
30549
144
{
30550
144
  int tag_len = tvb_reported_length(tvb);
30551
144
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
30552
144
  int offset = 0;
30553
144
  uint8_t sub_tag_id;
30554
144
  uint32_t sub_tag_len;
30555
144
  const char *sub_tag_name;
30556
144
  proto_item *parent_item;
30557
144
  proto_tree *bssid_info_subtree, *bssid_info_cap_subtree, *sub_tag_tree;
30558
144
  tvbuff_t *sub_tag_tvb = NULL;
30559
30560
144
  if (tag_len < 13) {
30561
33
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
30562
33
                           "Neighbor Report length %u wrong, must be > 13", tag_len);
30563
33
    return tvb_captured_length(tvb);
30564
33
  }
30565
30566
111
  proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_bssid, tvb, offset, 6, ENC_NA);
30567
111
  offset += 6;
30568
30569
  /*** Begin: BSSID Information ***/
30570
30571
111
  parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_bssid_info, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30572
111
  bssid_info_subtree = proto_item_add_subtree(parent_item, ett_tag_neighbor_report_bssid_info_tree);
30573
30574
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_reachability, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30575
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_security, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30576
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_key_scope, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30577
111
  parent_item = proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30578
111
  bssid_info_cap_subtree = proto_item_add_subtree(parent_item, ett_tag_neighbor_report_bssid_info_capability_tree);
30579
111
  proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30580
111
  proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30581
111
  proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30582
111
  proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30583
111
  proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30584
111
  proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30585
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30586
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30587
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30588
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_ftm, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30589
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_high_efficiency, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30590
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_er_bss, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30591
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_colocated_ap, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30592
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_unsolicited_probe_responses_active, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30593
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_ess_with_colocated_ap, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30594
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_oct_supported_with_reporting_ap, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30595
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_colocated_6ghz_ap, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30596
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_eht, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30597
111
  proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
30598
111
  offset += 4;
30599
30600
111
  proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_ope_class, tvb, offset, 1, ENC_LITTLE_ENDIAN);
30601
111
  offset += 1;
30602
30603
111
  proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
30604
111
  offset += 1;
30605
30606
111
  proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_phy_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
30607
111
  offset += 1;
30608
30609
  /* The Optional Subelements field format contains zero or more subelements */
30610
111
  if (tag_len == 13){ /* tag_len == 13 => no Subelements */
30611
4
    return tvb_captured_length(tvb);
30612
4
  }
30613
30614
856
  while (offset < tag_len)
30615
820
  {
30616
820
    sub_tag_id = tvb_get_uint8(tvb, offset);
30617
820
    sub_tag_len = tvb_get_uint8(tvb, offset + 1);
30618
820
    sub_tag_name = val_to_str_const(sub_tag_id, ieee80211_neighbor_report_subelement_id_vals, "Unknown");
30619
30620
820
    sub_tag_tree = proto_tree_add_subtree_format(tree, tvb, offset, sub_tag_len + 2, ett_tag_neighbor_report_subelement_tree, NULL, "Subelement: %s", sub_tag_name);
30621
30622
820
    proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
30623
820
    offset += 1;
30624
30625
820
    proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
30626
820
    offset += 1;
30627
30628
820
    sub_tag_tvb = tvb_new_subset_length(tvb, offset, sub_tag_len);
30629
30630
820
    switch (sub_tag_id) {
30631
99
      case NR_SUB_ID_TSF_INFO:
30632
99
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_tsf_offset, tvb, offset, 2, ENC_NA);
30633
99
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_beacon_interval, tvb, offset + 2, 2, ENC_NA);
30634
99
        break;
30635
2
      case NR_SUB_ID_MEASUREMENT_PILOT_INFO:
30636
2
        dissect_measurement_pilot_trans_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
30637
2
        break;
30638
48
      case NR_SUB_ID_CON_COU_STR:
30639
48
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_country_code, tvb, offset, 2, ENC_ASCII);
30640
48
        break;
30641
63
      case NR_SUB_ID_BSS_TRN_CAN_PREF:
30642
63
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref, tvb, offset, 1, ENC_NA);
30643
63
        break;
30644
75
      case NR_SUB_ID_BSS_TER_DUR:
30645
75
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf, tvb, offset, 8, ENC_NA);
30646
75
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_bss_dur, tvb, offset + 8, 2, ENC_NA);
30647
75
        break;
30648
2
      case NR_SUB_ID_HT_CAPABILITIES:
30649
2
        dissect_ht_capability_ie_common(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len, field_data->item_tag_length, false);
30650
2
        break;
30651
7
      case NR_SUB_ID_HT_OPERATION:
30652
7
        dissect_ht_operation_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
30653
7
        break;
30654
10
      case NR_SUB_ID_SEC_CHANNEL_OFFSET:
30655
10
        dissect_secondary_channel_offset_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
30656
10
        break;
30657
14
      case NR_SUB_ID_HT_MULTIPLE_BSSID:
30658
14
        dissect_multiple_bssid_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
30659
14
        break;
30660
3
      case NR_SUB_ID_HE_CAPABILITIES:
30661
3
        dissect_he_capabilities(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
30662
3
        break;
30663
3
      case NR_SUB_ID_HE_OPERATION:
30664
3
        dissect_he_operation(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
30665
3
        break;
30666
2
      case NR_SUB_ID_EHT_CAPABILITIES:
30667
2
        dissect_eht_capabilities(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
30668
2
        break;
30669
4
      case NR_SUB_ID_EHT_OPERATION:
30670
4
        dissect_eht_operation(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
30671
4
        break;
30672
10
      case NR_SUB_ID_BASIC_MULTI_LINK:
30673
10
        dissect_multi_link(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
30674
10
        break;
30675
0
      case NR_SUB_ID_VENDOR_SPECIFIC:
30676
460
      default:
30677
460
        proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_data, tvb, offset, sub_tag_len, ENC_NA);
30678
460
        break;
30679
820
    }
30680
30681
749
    offset += sub_tag_len;
30682
749
  }
30683
30684
36
  return offset;
30685
107
}
30686
30687
static int
30688
ieee80211_tag_supp_rates(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
30689
2.57k
{
30690
2.57k
  int tag_len = tvb_reported_length(tvb);
30691
2.57k
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
30692
2.57k
  int offset = 0;
30693
  /* 7.3.2.2 Supported Rates element (1) */
30694
2.57k
  if (tag_len < 1) {
30695
376
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
30696
376
                           "Tag length %u too short, must be greater than 0",
30697
376
                           tag_len);
30698
376
    return offset;
30699
376
  }
30700
30701
19.3k
  while (offset < tag_len) {
30702
17.1k
    proto_tree_add_item(tree, hf_ieee80211_tag_supp_rates, tvb, offset, 1,
30703
17.1k
                        ENC_LITTLE_ENDIAN);
30704
17.1k
    proto_item_append_text(field_data->item_tag, " %s,",
30705
17.1k
                           val_to_str_ext_const(tvb_get_uint8(tvb, offset),
30706
17.1k
                                                &ieee80211_supported_rates_vals_ext,
30707
17.1k
                                                "Unknown Rate"));
30708
17.1k
    offset += 1;
30709
17.1k
  }
30710
30711
2.20k
  proto_item_append_text(field_data->item_tag, " [Mbit/sec]");
30712
30713
2.20k
  return offset;
30714
2.57k
}
30715
30716
static int
30717
ieee80211_tag_fh_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
30718
1.12k
{
30719
1.12k
  int tag_len = tvb_reported_length(tvb);
30720
1.12k
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
30721
1.12k
  int offset = 0;
30722
  /* 7.3.2.3 FH Parameter Set element (2) */
30723
1.12k
  if (tag_len < 5) {
30724
959
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
30725
959
                           "Tag length %u too short, must be >= 5", tag_len);
30726
959
    return 1;
30727
959
  }
30728
30729
163
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_dwell_time,
30730
163
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
30731
163
  offset += 2;
30732
30733
163
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_set,
30734
163
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
30735
163
  offset += 1;
30736
30737
163
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_pattern,
30738
163
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
30739
163
  offset += 1;
30740
30741
163
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_index,
30742
163
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
30743
163
  offset += 1;
30744
30745
163
  return offset;
30746
1.12k
}
30747
30748
static int
30749
ieee80211_tag_ds_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
30750
620
{
30751
620
  int tag_len = tvb_reported_length(tvb);
30752
620
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
30753
620
  int offset = 0;
30754
  /* 7.3.2.4 DS Parameter Set element (3) */
30755
620
  if (tag_len != 1) {
30756
582
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
30757
582
        "Tag length %u wrong, must be = 1", tag_len);
30758
582
    return 1;
30759
582
  }
30760
30761
38
  proto_tree_add_item(tree, hf_ieee80211_tag_ds_param_channel,
30762
38
        tvb, offset, 1, ENC_LITTLE_ENDIAN);
30763
30764
38
  proto_item_append_text(field_data->item_tag, ": Current Channel: %u",
30765
38
                         tvb_get_uint8(tvb, offset));
30766
30767
38
  wlan_stats.channel = tvb_get_uint8(tvb, offset);
30768
38
  offset += 1;
30769
30770
38
  return offset;
30771
620
}
30772
30773
static int
30774
ieee80211_tag_cf_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
30775
808
{
30776
808
  int tag_len = tvb_reported_length(tvb);
30777
808
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
30778
808
  int offset = 0;
30779
  /* 7.3.2.5 CF Parameter Set element (4) */
30780
808
  if (tag_len != 6) {
30781
801
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
30782
801
                           "Tag length %u wrong, must be = 6", tag_len);
30783
801
    return offset;
30784
801
  }
30785
30786
7
  proto_tree_add_item(tree, hf_ieee80211_tag_cfp_count,
30787
7
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
30788
7
  proto_item_append_text(field_data->item_tag, ": CFP count %u", tvb_get_uint8(tvb, offset));
30789
7
  offset += 1;
30790
30791
7
  proto_tree_add_item(tree, hf_ieee80211_tag_cfp_period,
30792
7
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
30793
7
  proto_item_append_text(field_data->item_tag, ": CFP Period %u", tvb_get_uint8(tvb, offset));
30794
7
  offset += 1;
30795
30796
7
  proto_tree_add_item(tree, hf_ieee80211_tag_cfp_max_duration,
30797
7
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
30798
7
  proto_item_append_text(field_data->item_tag, ": CFP Max Duration %u",
30799
7
                         tvb_get_letohs(tvb, offset));
30800
7
  offset += 2;
30801
30802
7
  proto_tree_add_item(tree, hf_ieee80211_tag_cfp_dur_remaining,
30803
7
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
30804
7
  proto_item_append_text(field_data->item_tag, ": CFP Dur Remaining %u",
30805
7
                         tvb_get_letohs(tvb, offset));
30806
7
  offset += 1;
30807
30808
7
  return offset;
30809
808
}
30810
30811
static int
30812
dissect_pvb_encoded_block_bitmap(tvbuff_t *tvb, packet_info *pinfo _U_,
30813
                                 proto_tree *tree, int offset,
30814
                                 bool inverse_bm _U_,
30815
                                 uint8_t block_offset _U_,
30816
                                 uint8_t page_index _U_)
30817
1.12k
{
30818
1.12k
  uint8_t block_bitmap = tvb_get_uint8(tvb, offset);
30819
1.12k
  proto_tree *bb_tree;
30820
1.12k
  proto_item *bbi;
30821
1.12k
  proto_item *bb;
30822
1.12k
  int start_offset = offset;
30823
1.12k
  uint8_t subblock = 0;
30824
30825
  /*
30826
   * Walk the block bitmap to figure out how many subblocks there are an
30827
   * handle each of them.
30828
   */
30829
1.12k
  bb_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
30830
1.12k
                                   ett_s1g_pvb_block_bitmap_tree, &bbi,
30831
1.12k
                                   "Block Bitmap");
30832
30833
1.12k
  bb = proto_tree_add_item(bb_tree, hf_ieee80211_s1g_block_bitmap, tvb, offset,
30834
1.12k
                           1, ENC_NA);
30835
1.12k
  offset += 1;
30836
30837
3.82k
  while (block_bitmap) {
30838
2.69k
    bool subblock_present = block_bitmap & 0x01;
30839
2.69k
    proto_tree *sb_tree;
30840
2.69k
    uint8_t bit_pos = 0;
30841
30842
2.69k
    if (subblock_present) {
30843
1.31k
      uint8_t subblock_val = tvb_get_uint8(tvb, offset);
30844
30845
1.31k
      sb_tree = proto_tree_add_subtree_format(bb_tree, tvb, offset, 1,
30846
1.31k
                                              ett_s1g_pvb_subblock_tree, NULL,
30847
1.31k
                                              "Subblock %u", subblock);
30848
8.22k
      while (subblock_val) {
30849
30850
6.90k
        if (subblock_val & 0x01) {
30851
3.67k
          proto_item_append_text(bb, ", Subblock %d present", bit_pos);
30852
3.67k
          uint16_t aid13 = (page_index << 11) | (block_offset << 6) |
30853
3.67k
                          (subblock << 3) | bit_pos;
30854
3.67k
          proto_tree_add_uint_bits_format_value(sb_tree,
30855
3.67k
                                hf_ieee80211_s1g_block_bitmap_sta_aid13,
30856
3.67k
                                tvb, offset * 8 + (7 - bit_pos), 1, 1,
30857
3.67k
                                ENC_BIG_ENDIAN, " 0x%0x", aid13);
30858
3.67k
        }
30859
30860
6.90k
        bit_pos += 1;
30861
6.90k
        subblock_val = subblock_val >> 1;
30862
6.90k
      }
30863
30864
1.31k
      offset += 1;
30865
1.31k
    }
30866
30867
2.69k
    block_bitmap = block_bitmap >> 1;
30868
2.69k
    subblock += 1;
30869
2.69k
  }
30870
30871
1.12k
  proto_item_set_len(bbi, offset - start_offset);
30872
1.12k
  return offset;
30873
1.12k
}
30874
30875
static int
30876
dissect_pvb_encoded_single_aid(tvbuff_t *tvb, packet_info *pinfo _U_,
30877
                                 proto_tree *tree, int offset,
30878
                                 bool inverse_bm _U_,
30879
                                 uint8_t block_offset,
30880
                                 uint8_t page_index)
30881
669
{
30882
669
  uint8_t single_aid = tvb_get_uint8(tvb, offset);
30883
669
  uint16_t aid13 = (page_index << 11) | (block_offset << 6) |
30884
669
                  (single_aid & 0x3F);
30885
30886
669
  proto_tree_add_uint_format(tree, hf_ieee80211_s1g_block_bitmap_single_aid,
30887
669
                             tvb, offset, 1, single_aid,
30888
669
                             "Single AID13: 0x%0x", aid13);
30889
669
  offset += 1;
30890
30891
669
  return offset;
30892
669
}
30893
30894
static int
30895
dissect_pvb_encoded_olb(tvbuff_t *tvb, packet_info *pinfo _U_,
30896
                        proto_tree *tree, int offset,
30897
                        bool inverse_bm _U_,
30898
                        uint8_t block_offset _U_,
30899
                        uint8_t page_index _U_)
30900
162
{
30901
162
  uint8_t length = tvb_get_uint8(tvb, offset);
30902
162
  proto_tree *olb_tree;
30903
162
  int k;
30904
30905
162
  olb_tree = proto_tree_add_subtree(tree, tvb, offset, length + 1,
30906
162
                                    ett_s1g_pvb_olb_tree, NULL,
30907
162
                                    "OLB Mode");
30908
30909
162
  proto_tree_add_item(olb_tree, hf_ieee80211_s1g_block_bitmap_olb_length,
30910
162
                      tvb, offset, 1, ENC_NA);
30911
162
  offset += 1;
30912
30913
3.26k
  for (k = 0; k < length; k++) {
30914
3.10k
    uint8_t subblock_val = tvb_get_uint8(tvb, offset);
30915
3.10k
    proto_tree *sb_tree;
30916
3.10k
    uint8_t bit_pos = 0;
30917
30918
3.10k
    sb_tree = proto_tree_add_subtree_format(olb_tree, tvb, offset, 1,
30919
3.10k
                                            ett_s1g_pvb_olb_subblock, NULL,
30920
3.10k
                                            "Subblock %u", k);
30921
15.7k
    while (subblock_val) {
30922
30923
12.6k
      if (subblock_val & 0x01) {
30924
7.79k
        uint16_t aid13 = (page_index << 11) | (block_offset << 6) |
30925
7.79k
                        (k << 3) | bit_pos;
30926
7.79k
        proto_tree_add_uint_bits_format_value(sb_tree,
30927
7.79k
                              hf_ieee80211_s1g_block_bitmap_sta_aid13,
30928
7.79k
                              tvb, offset * 8 + (7 - bit_pos), 1, 1,
30929
7.79k
                              ENC_BIG_ENDIAN, " 0x%0x", aid13);
30930
7.79k
      }
30931
30932
12.6k
      bit_pos += 1;
30933
12.6k
      subblock_val = subblock_val >> 1;
30934
12.6k
    }
30935
30936
3.10k
    offset += 1;
30937
3.10k
  }
30938
30939
162
  offset += length;
30940
30941
162
  return offset;
30942
162
}
30943
30944
static int
30945
dissect_pvb_encoded_ade(tvbuff_t *tvb, packet_info *pinfo _U_,
30946
                        proto_tree *tree, int offset,
30947
                        bool inverse_bm _U_,
30948
                        uint8_t block_offset _U_,
30949
                        uint8_t page_index _U_)
30950
210
{
30951
210
  uint8_t ade_control = tvb_get_uint8(tvb, offset);
30952
210
  uint8_t ewl = (ade_control & 0x03) + 1;
30953
210
  uint8_t ade_bytes = ade_control >> 3;
30954
210
  proto_tree *ade_tree;
30955
210
  proto_item *cntl_item;
30956
210
  proto_tree *cntl_tree;
30957
30958
210
  ade_tree = proto_tree_add_subtree(tree, tvb, offset, ade_bytes + 1,
30959
210
                                    ett_s1g_pvb_ade_tree, NULL,
30960
210
                                    "ADE Mode");
30961
30962
210
  cntl_item = proto_tree_add_item(ade_tree, hf_ieee80211_s1g_block_bitmap_ade,
30963
210
                                  tvb, offset, 1, ENC_NA);
30964
30965
210
  cntl_tree = proto_item_add_subtree(cntl_item, ett_s1g_pvb_ade_control);
30966
30967
210
  proto_tree_add_uint_bits_format_value(cntl_tree,
30968
210
                                        hf_ieee80211_s1g_block_bitmap_ewl,
30969
210
                                        tvb, offset *8, 3, ewl,
30970
210
                                        ENC_BIG_ENDIAN, "EWL: %u", ewl);
30971
210
  proto_tree_add_uint_bits_format_value(cntl_tree,
30972
210
                                        hf_ieee80211_s1g_block_bitmap_len,
30973
210
                                        tvb, offset * 8 + 3, 5, ade_bytes,
30974
210
                                        ENC_BIG_ENDIAN, "Length: %u", ade_bytes);
30975
210
  offset += 1;
30976
30977
  /* TODO: Add each subblock */
30978
210
  proto_tree_add_item(ade_tree, hf_ieee80211_s1g_block_bitmap_ade_bytes, tvb,
30979
210
                      offset, ade_bytes, ENC_NA);
30980
30981
210
  offset += ade_bytes;
30982
30983
210
  return offset;
30984
210
}
30985
30986
static int * const s1g_pvb_encoded_block_control[] = {
30987
  &hf_ieee80211_s1g_pvb_encoding_mode,
30988
  &hf_ieee80211_s1g_pvb_inverse_bitmap,
30989
  &hf_ieee80211_s1g_pvb_block_offset,
30990
  NULL
30991
};
30992
30993
1.12k
#define PVB_BLOCK_BITMAP 0x0
30994
669
#define PVB_SINGLE_AID   0x1
30995
162
#define PVB_OLB          0x2
30996
210
#define PVB_ADE          0x3
30997
30998
static const value_string s1g_block_control_encoding_mode_vals[] = {
30999
  { 0, "Block Bitmap" },
31000
  { 1, "Single AID" },
31001
  { 2, "OLB" },
31002
  { 3, "ADE" },
31003
  { 0, NULL }
31004
};
31005
31006
static int
31007
dissect_pvb_encoded_block(tvbuff_t *tvb, packet_info *pinfo,
31008
                          proto_tree *tree, int offset, int idx,
31009
                          uint8_t page_index)
31010
2.18k
{
31011
2.18k
  uint8_t block_control = tvb_get_uint8(tvb, offset);
31012
2.18k
  uint8_t enc_mode = block_control & 0x03;
31013
2.18k
  uint8_t inverse_bm = (enc_mode >> 2) & 0x01;
31014
2.18k
  uint8_t block_offset = block_control >> 3;
31015
2.18k
  proto_tree *eb_tree;
31016
2.18k
  proto_item *ebti;
31017
31018
2.18k
  eb_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
31019
2.18k
                                          ett_s1g_pvb_eb_tree, &ebti,
31020
2.18k
                                          "Encoded Block %d", idx);
31021
31022
2.18k
  proto_tree_add_bitmask_with_flags(eb_tree, tvb, offset,
31023
2.18k
                                    hf_ieee80211_s1g_pvb_block_control_byte,
31024
2.18k
                                    ett_s1g_pvb_block_control_byte,
31025
2.18k
                                    s1g_pvb_encoded_block_control,
31026
2.18k
                                    ENC_NA, BMT_NO_APPEND);
31027
2.18k
  offset += 1;
31028
31029
  /*
31030
   * If there are no bytes, add an EI and get out of here
31031
   */
31032
2.18k
  switch (enc_mode) {
31033
1.12k
    case PVB_BLOCK_BITMAP:
31034
1.12k
      offset = dissect_pvb_encoded_block_bitmap(tvb, pinfo, eb_tree, offset,
31035
1.12k
                                                inverse_bm, block_offset,
31036
1.12k
                                                page_index);
31037
1.12k
      break;
31038
669
    case PVB_SINGLE_AID:
31039
669
      offset = dissect_pvb_encoded_single_aid(tvb, pinfo, eb_tree, offset,
31040
669
                                              inverse_bm, block_offset,
31041
669
                                              page_index);
31042
669
      break;
31043
162
    case PVB_OLB:
31044
162
      offset = dissect_pvb_encoded_olb(tvb, pinfo, eb_tree, offset,
31045
162
                                       inverse_bm, block_offset, page_index);
31046
162
      break;
31047
210
    case PVB_ADE:
31048
210
      offset = dissect_pvb_encoded_ade(tvb, pinfo, eb_tree, offset, inverse_bm,
31049
210
                                       block_offset, page_index);
31050
210
      break;
31051
2.18k
  }
31052
31053
2.07k
  return offset;
31054
2.18k
}
31055
31056
static int
31057
dissect_partial_virtual_bitmap(tvbuff_t *tvb, packet_info *pinfo,
31058
                               proto_tree *tree, int offset, int pvb_len,
31059
                               uint8_t page_index)
31060
287
{
31061
287
  proto_tree *pvb_tree;
31062
287
  int idx = 0;
31063
31064
287
  pvb_tree = proto_tree_add_subtree(tree, tvb, offset, pvb_len,
31065
287
                                    ett_s1g_pvb_tree, NULL,
31066
287
                                    "Partial Virtual Bitmap");
31067
31068
2.46k
  while (tvb_reported_length_remaining(tvb, offset) > 0) {
31069
2.18k
    offset = dissect_pvb_encoded_block(tvb, pinfo, pvb_tree, offset, idx,
31070
2.18k
                                       page_index);
31071
2.18k
    idx++;
31072
2.18k
  }
31073
31074
287
  return offset;
31075
287
}
31076
31077
static int
31078
ieee80211_tag_tim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31079
1.21k
{
31080
1.21k
  int tag_len = tvb_reported_length(tvb);
31081
1.21k
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31082
1.21k
  int offset = 0;
31083
1.21k
  unsigned aid, pvb_len, n1, i, j, byte;
31084
1.21k
  bool is_s1g = sta_is_s1g(pinfo);
31085
1.21k
  static int * const ieee80211_tim_bmapctl[] = {
31086
1.21k
    &hf_ieee80211_tim_bmapctl_mcast,
31087
1.21k
    &hf_ieee80211_tim_bmapctl_offset,
31088
1.21k
    NULL
31089
1.21k
  };
31090
1.21k
  static int * const ieee80211_s1g_bmapctl[] = {
31091
1.21k
    &hf_ieee80211_s1g_tim_bmapctl_traffic_indicator,
31092
1.21k
    &hf_ieee80211_s1g_tim_page_slice_number,
31093
1.21k
    &hf_ieee80211_s1g_tim_page_index,
31094
1.21k
    NULL
31095
1.21k
  };
31096
31097
  /*
31098
   * 802.11-2012: 8.4.2.7 TIM element (5), however, if this is an S1G frame
31099
   * then it is different. S1G TIM elements can be 2, 3, or longer bytes.
31100
   */
31101
1.21k
  if (is_s1g) {
31102
338
    if (tag_len < 2) {
31103
34
      expert_add_info_format(pinfo, field_data->item_tag_length,
31104
34
                             &ei_ieee80211_tag_length,
31105
34
                            "Tag length %u too short for S1G frame, must be >= 3",
31106
34
                            tag_len);
31107
34
      return tag_len;
31108
34
    }
31109
880
  } else {
31110
880
    if (tag_len < 4) {
31111
95
      expert_add_info_format(pinfo, field_data->item_tag_length,
31112
95
                             &ei_ieee80211_tag_length,
31113
95
                            "Tag length %u too short for Non-S1G frame, must be >= 4",
31114
95
                            tag_len);
31115
95
      return tag_len;
31116
95
    }
31117
880
  }
31118
31119
1.08k
  proto_tree_add_item(tree, hf_ieee80211_tim_dtim_count,
31120
1.08k
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31121
1.08k
  proto_item_append_text(field_data->item_tag, ": DTIM %u of",
31122
1.08k
                         tvb_get_uint8(tvb, offset));
31123
1.08k
  offset += 1;
31124
31125
1.08k
  proto_tree_add_item(tree, hf_ieee80211_tim_dtim_period,
31126
1.08k
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31127
1.08k
  proto_item_append_text(field_data->item_tag, " %u bitmap",
31128
1.08k
                      tvb_get_uint8(tvb, offset));
31129
1.08k
  offset += 1;
31130
31131
1.08k
  if (offset >= tag_len)
31132
13
    return offset;
31133
31134
1.07k
  if (is_s1g) {
31135
289
    unsigned bitmap_len = 0;
31136
31137
289
    if (tag_len >= 3) {
31138
289
      uint8_t page_index = tvb_get_uint8(tvb, offset) >> 6;
31139
31140
289
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
31141
289
                                        hf_ieee80211_s1g_tim_bmapctrl,
31142
289
                                        ett_tag_bmapctl_tree,
31143
289
                                        ieee80211_s1g_bmapctl,
31144
289
                                        ENC_NA, BMT_NO_APPEND);
31145
289
      offset += 1;
31146
289
      bitmap_len = tvb_reported_length_remaining(tvb, offset);
31147
289
      if (bitmap_len > 0) {
31148
287
        offset = dissect_partial_virtual_bitmap(tvb, pinfo, tree, offset,
31149
287
                                                bitmap_len, page_index);
31150
287
      }
31151
289
    }
31152
787
  } else {
31153
787
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
31154
787
                                      hf_ieee80211_tim_bmapctl,
31155
787
                                      ett_tag_bmapctl_tree,
31156
787
                                      ieee80211_tim_bmapctl,
31157
787
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
31158
787
    pvb_len = tag_len - 3;
31159
787
    n1 = tvb_get_uint8(tvb, offset) & 0xFE;
31160
787
    offset += 1;
31161
787
    proto_tree_add_item(tree, hf_ieee80211_tim_partial_virtual_bitmap,
31162
787
                        tvb, offset, pvb_len, ENC_NA);
31163
    /* FIXME: Handles dot11MgmtOptionMultiBSSIDActivated = false only */
31164
8.40k
    for (i = 0; i < pvb_len; i++) {
31165
7.62k
      byte = tvb_get_uint8(tvb, offset + i);
31166
68.5k
      for (j = 0; j < 8; j++) {
31167
60.9k
        if (byte & (1 << j)) {
31168
21.5k
          aid = 8*n1 + 8*i + j;
31169
21.5k
          proto_tree_add_uint(tree, hf_ieee80211_tim_aid, tvb, offset + i,
31170
21.5k
                              1, aid);
31171
21.5k
        }
31172
60.9k
      }
31173
7.62k
    }
31174
787
    offset += pvb_len;
31175
787
  }
31176
31177
1.07k
  return offset;
31178
1.08k
}
31179
31180
static int
31181
ieee80211_tag_ibss_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31182
548
{
31183
548
  int tag_len = tvb_reported_length(tvb);
31184
548
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31185
548
  int offset = 0;
31186
  /* 7.3.2.7 IBSS Parameter Set element (6) */
31187
31188
548
  if (tag_len != 2) {
31189
539
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
31190
539
                           "Tag length %u wrong, must be = 2", tag_len);
31191
539
    return 1;
31192
539
  }
31193
31194
9
  proto_tree_add_item(tree, hf_ieee80211_tag_ibss_atim_window,
31195
9
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
31196
9
  proto_item_append_text(field_data->item_tag, ": ATIM window 0x%x",
31197
9
                         tvb_get_letohs(tvb, offset));
31198
9
  offset += 2;
31199
31200
9
  return offset;
31201
548
}
31202
31203
/* IEEE 802.11-2020, C.3 MIB detail, dot11CountryString */
31204
static const value_string environment_vals[] = {
31205
  { 0x1, "Operating classes in the United States" }, /* Table E-1 */
31206
  { 0x2, "Operating classes in Europe" }, /* Table E-2 */
31207
  { 0x3, "Operating classes in Japan" }, /* Table E-3 */
31208
  { 0x4, "Global operating classes" }, /* Table E-4 */
31209
  { 0x5, "S1G operating classes" }, /* Table E-5 */
31210
  { 0x6, "Operating classes in China" }, /* Table E-6 */
31211
  { ' ', "All" }, /* All environments for this band */
31212
  { 'I', "Indoor" },
31213
  { 'O', "Outdoor" },
31214
  { 'X', "Non Country Entity" },
31215
  { 0,    NULL }
31216
};
31217
31218
static int
31219
ieee80211_tag_country_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31220
763
{
31221
763
  int tag_len = tvb_reported_length(tvb);
31222
763
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31223
763
  int offset = 0;
31224
  /* 7.3.2.9 Country information element (7) */
31225
763
  proto_tree *sub_tree;
31226
763
  proto_item *sub_item;
31227
763
  const uint8_t* country_code;
31228
31229
763
  if (tag_len < 6) {
31230
142
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
31231
142
                           "Tag length %u too short, must be >= 6", tag_len);
31232
142
    return 1;
31233
142
  }
31234
31235
  /* FIXME: If environment is 'X', the only allowed CC is "XX" */
31236
621
  proto_tree_add_item_ret_string(tree, hf_ieee80211_tag_country_info_code,
31237
621
                      tvb, offset, 2, ENC_ASCII|ENC_NA, pinfo->pool, &country_code);
31238
621
  proto_item_append_text(field_data->item_tag, ": Country Code %s", country_code);
31239
621
  offset += 2;
31240
31241
621
  proto_tree_add_item(tree, hf_ieee80211_tag_country_info_env,
31242
621
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31243
621
  proto_item_append_text(field_data->item_tag, ", Environment %s",
31244
621
                         val_to_str(tvb_get_uint8(tvb, offset),
31245
621
                                    environment_vals, "0x%02x"));
31246
621
  offset += 1;
31247
31248
3.26k
  while (offset < tag_len) {
31249
    /* Padding ? */
31250
2.64k
    if ((tag_len - offset) < 3) {
31251
602
      proto_tree_add_item(tree, hf_ieee80211_tag_country_info_pad,
31252
602
                          tvb, offset, 1, ENC_NA);
31253
602
      offset += 1;
31254
602
      continue;
31255
602
    }
31256
2.04k
    if (tvb_get_uint8(tvb, offset) <= 200) { /* 802.11d */
31257
1.66k
      sub_item = proto_tree_add_item(tree, hf_ieee80211_tag_country_info_fnm,
31258
1.66k
                                     tvb, offset, 3, ENC_NA);
31259
1.66k
      sub_tree = proto_item_add_subtree(sub_item, ett_tag_country_fnm_tree);
31260
31261
1.66k
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_fcn,
31262
1.66k
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
31263
1.66k
      proto_item_append_text(sub_item, ": First Channel Number: %u",
31264
1.66k
                             tvb_get_uint8(tvb, offset));
31265
1.66k
      offset += 1;
31266
1.66k
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_nc,
31267
1.66k
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
31268
1.66k
      proto_item_append_text(sub_item, ", Number of Channels: %u",
31269
1.66k
                             tvb_get_uint8(tvb, offset));
31270
1.66k
      offset += 1;
31271
1.66k
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_mtpl,
31272
1.66k
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
31273
1.66k
      proto_item_append_text(sub_item,
31274
1.66k
                             ", Maximum Transmit Power Level: %d dBm",
31275
1.66k
                             tvb_get_uint8(tvb, offset));
31276
1.66k
      offset += 1;
31277
1.66k
    } else { /* 802.11j */
31278
384
      sub_item = proto_tree_add_item(tree, hf_ieee80211_tag_country_info_rrc,
31279
384
                                     tvb, offset, 3, ENC_NA);
31280
384
      sub_tree = proto_item_add_subtree(sub_item, ett_tag_country_rcc_tree);
31281
31282
384
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_oei,
31283
384
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
31284
384
      proto_item_append_text(sub_item,
31285
384
                             ": Operating Extension Identifier: %u",
31286
384
                             tvb_get_uint8(tvb, offset));
31287
384
      offset += 1;
31288
384
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_oc,
31289
384
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
31290
384
      proto_item_append_text(sub_item, ", Operating Class: %u",
31291
384
                             tvb_get_uint8(tvb, offset));
31292
384
      offset += 1;
31293
384
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_cc,
31294
384
                          tvb, offset, 1, ENC_LITTLE_ENDIAN);
31295
384
      proto_item_append_text(sub_item, ", Coverage Class: %u",
31296
384
                             tvb_get_uint8(tvb, offset));
31297
384
      offset += 1;
31298
384
    }
31299
2.04k
  }
31300
31301
621
  return offset;
31302
763
}
31303
31304
static int
31305
ieee80211_tag_fh_hopping_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31306
667
{
31307
667
  int tag_len = tvb_reported_length(tvb);
31308
667
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31309
667
  int offset = 0;
31310
31311
  /* 7.3.2.10 Hopping Pattern Parameters information element (8) */
31312
667
  if (tag_len < 2) {
31313
175
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
31314
175
                           "Tag length %u too short, must be >= 2", tag_len);
31315
175
    return 1;
31316
175
  }
31317
31318
492
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_parameter_prime_radix,
31319
492
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31320
492
  proto_item_append_text(field_data->item_tag, ": Prime Radix: %u", tvb_get_uint8(tvb, offset));
31321
492
  offset += 1;
31322
31323
492
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_parameter_nb_channels,
31324
492
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31325
492
  proto_item_append_text(field_data->item_tag, ", Number of Channels: %u",
31326
492
                         tvb_get_uint8(tvb, offset));
31327
492
  offset += 1;
31328
31329
492
  return offset;
31330
667
}
31331
31332
static int
31333
ieee80211_tag_fh_hopping_table(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31334
156
{
31335
156
  int tag_len = tvb_reported_length(tvb);
31336
156
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31337
156
  int offset = 0;
31338
31339
  /* 7.3.2.11 Hopping Pattern Table information element (9) */
31340
156
  if (tag_len < 4) {
31341
59
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
31342
59
                           "Tag length %u too short, must be >= 4", tag_len);
31343
59
    return 1;
31344
59
  }
31345
31346
97
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_flag,
31347
97
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31348
97
  offset += 1;
31349
31350
97
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_number_of_sets,
31351
97
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31352
97
  offset += 1;
31353
31354
97
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_modulus,
31355
97
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31356
97
  offset += 1;
31357
31358
97
  proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_offset,
31359
97
                      tvb, offset, 1, ENC_LITTLE_ENDIAN);
31360
97
  offset += 1;
31361
31362
1.48k
  while (offset < tag_len) {
31363
1.39k
    proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_random_table,
31364
1.39k
                        tvb, offset, 2, ENC_BIG_ENDIAN);
31365
1.39k
    offset += 2;
31366
1.39k
  }
31367
31368
97
  return offset;
31369
156
}
31370
31371
int
31372
add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, int ftype,
31373
                 const uint8_t *valid_element_ids, unsigned valid_element_ids_count,
31374
                 association_sanity_check_t *association_sanity_check)
31375
67.2k
{
31376
67.2k
  return add_tagged_field_with_validation(pinfo, tree, tvb, offset, ftype, valid_element_ids,
31377
67.2k
    valid_element_ids_count, false, NULL, 0, false, association_sanity_check);
31378
67.2k
}
31379
31380
/*
31381
 * Build a composite TVB from the current TVB and the next ones that are
31382
 * fragment elements.
31383
 *
31384
 * We also add the fragments to the tree. And add an expert info if there are
31385
 * problems.
31386
 *
31387
 * When called we know we have two fragments, at least.
31388
 */
31389
static tvbuff_t *
31390
build_defrag_tvb(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb,
31391
                 int offset, uint32_t *tag_len, uint32_t *tag_overhead)
31392
11
{
31393
11
  tvbuff_t *new_tvb = tvb_new_composite();
31394
11
  tvbuff_t *tmp_tvb = NULL;
31395
11
  uint32_t new_len = 0, overhead = 0;
31396
11
  uint8_t frag_len = 0;
31397
31398
  /*
31399
   * We come in here pointing to the first fragment and on each iteration
31400
   * We are pointing to the next fragment
31401
   */
31402
21
  do {
31403
21
    offset += 1;
31404
21
    frag_len = tvb_get_uint8(tvb, offset);
31405
21
    offset += 1;
31406
21
    tmp_tvb = tvb_new_subset_length(tvb, offset, frag_len);
31407
    /* Insert this fragment ... */
31408
21
    tvb_composite_append(new_tvb, tmp_tvb);
31409
21
    new_len += frag_len;
31410
21
    offset += frag_len;
31411
21
    overhead += 2;
31412
21
  } while (frag_len == 255 &&
31413
21
           tvb_captured_length_remaining(tvb, offset) > 2 &&
31414
21
           tvb_get_uint8(tvb, offset) == TAG_FRAGMENT);
31415
31416
11
  *tag_len = new_len;
31417
11
  *tag_overhead = overhead;
31418
11
  tvb_composite_finalize(new_tvb);
31419
31420
11
  return new_tvb;
31421
11
}
31422
31423
int
31424
add_tagged_field_with_validation(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, int ftype,
31425
                 const uint8_t *element_ids, unsigned element_ids_count, bool element_ids_assume_invalid,
31426
                 const uint8_t *ext_element_ids, unsigned ext_element_ids_count, bool ext_element_ids_assume_invalid,
31427
                 association_sanity_check_t *association_sanity_check)
31428
68.1k
{
31429
68.1k
  tvbuff_t     *tag_tvb;
31430
68.1k
  uint32_t      tag_no, tag_len, tag_overhead;
31431
68.1k
  uint32_t      ext_tag_no = 0;
31432
68.1k
  proto_tree   *orig_tree = tree;
31433
68.1k
  proto_item   *ti        = NULL;
31434
68.1k
  proto_item   *ti_len, *ti_tag;
31435
68.1k
  bool          isDMG;
31436
31437
68.1k
  isDMG = GPOINTER_TO_INT(p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY));
31438
31439
68.1k
  tag_no  = tvb_get_uint8(tvb, offset);
31440
68.1k
  tag_len = tvb_get_uint8(tvb, offset + 1);
31441
68.1k
  save_tag_for_dot11decrypt(tvb, pinfo, offset);
31442
31443
  /*
31444
   * If we have element fragmentation, construct a composite TVB with the
31445
   * fragments. Rules are:
31446
   * 1. Must be in the one MMPDU (so cannot exceed the TVB we are given.)
31447
   * 2. If the next element is a fragment, this one must have a length of 255.
31448
   * 3. We don't care about extensions here.
31449
   * 4. The fragment element has an id of 254.
31450
   */
31451
68.1k
  if (tag_len == 255 &&
31452
68.1k
      tvb_captured_length_remaining(tvb, offset) > (255 + 2) &&
31453
68.1k
      tvb_get_uint8(tvb, offset + 255 + 2) == TAG_FRAGMENT) {
31454
11
        tag_tvb = build_defrag_tvb(pinfo, tree, tvb, offset, &tag_len,
31455
11
                                   &tag_overhead);
31456
11
        add_new_data_source(pinfo, tag_tvb, "Reassembled IE");
31457
68.1k
  } else {
31458
68.1k
    tag_tvb = tvb_new_subset_length(tvb, offset+2, tag_len);
31459
68.1k
    tag_overhead = 2;
31460
68.1k
  }
31461
31462
68.1k
  if (tree) {
31463
67.9k
    if (tag_no == TAG_ELEMENT_ID_EXTENSION) {
31464
1.54k
      ext_tag_no  = tvb_get_uint8(tvb, offset + 2);
31465
1.54k
      ti = proto_tree_add_item(orig_tree, hf_ieee80211_ext_tag, tvb, offset + 2, tag_len + tag_overhead - 2, ENC_NA);
31466
1.54k
      proto_item_append_text(ti, ": %s", val_to_str_ext(ext_tag_no, &tag_num_vals_eid_ext_ext, "Unknown (%d)"));
31467
66.4k
    } else {
31468
66.4k
      ti = proto_tree_add_item(orig_tree, hf_ieee80211_tag, tvb, offset, 2 + tag_len + tag_overhead - 2, ENC_NA);
31469
66.4k
      proto_item_append_text(ti, ": %s", val_to_str_ext(tag_no, &tag_num_vals_ext, "Unknown (%d)"));
31470
66.4k
    }
31471
31472
67.9k
    tree = proto_item_add_subtree(ti, ett_80211_mgt_ie);
31473
31474
67.9k
  }
31475
31476
68.1k
  if (tag_no == TAG_ELEMENT_ID_EXTENSION) {
31477
1.53k
    ti_len = proto_tree_add_uint(tree, hf_ieee80211_ext_tag_length, tvb, offset + 1, 1, tag_len - 1);
31478
1.53k
    ti_tag = proto_tree_add_item(tree, hf_ieee80211_ext_tag_number, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
31479
1.53k
    proto_item_append_text(ti_len, " (Tag len: %u)", tag_len);
31480
66.6k
  } else {
31481
66.6k
    ti_tag = proto_tree_add_item(tree, hf_ieee80211_tag_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
31482
66.6k
    ti_len = proto_tree_add_uint(tree, hf_ieee80211_tag_length, tvb, offset + 1, 1, tag_len);
31483
66.6k
  }
31484
68.1k
  if (tag_len > (unsigned)tvb_reported_length_remaining(tvb, offset)) {
31485
4.38k
    expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
31486
4.38k
                           "Tag Length is longer than remaining payload");
31487
4.38k
  }
31488
31489
  /* If the list enumerates valid element IDs, require the Element ID to be
31490
   * present in that list, otherwise, if the list enumerates invalid element IDs,
31491
   * check the Element ID is not in the list. If either check fails, stop decoding
31492
   * the value to prevent possible infinite recursions due to unexpected elements. */
31493
68.1k
  if (element_ids_count) {
31494
1.60k
    bool current_tag_no = false;
31495
1.60k
    unsigned i;
31496
31497
13.4k
    for (i = 0; i < element_ids_count; i++) {
31498
12.0k
      current_tag_no = element_ids[i] == tag_no;
31499
12.0k
      if (current_tag_no)
31500
198
        break;
31501
12.0k
    }
31502
31503
1.60k
    if ((!current_tag_no && !element_ids_assume_invalid && !(ext_tag_no && ext_element_ids_count)) ||
31504
1.60k
          (current_tag_no && element_ids_assume_invalid)) {
31505
967
      expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_number,
31506
967
          "Unexpected Element ID %d", tag_no);
31507
967
        return tag_len + 1 + 1;
31508
967
    }
31509
1.60k
  }
31510
31511
  /* Same as above, but for Extended Element IDs */
31512
67.2k
  if (ext_tag_no && ext_element_ids_count) {
31513
24
    bool current_ext_tag_no = false;
31514
24
    unsigned i;
31515
31516
88
    for (i = 0; i < ext_element_ids_count; i++) {
31517
64
      current_ext_tag_no = ext_element_ids[i] == ext_tag_no;
31518
64
      if (current_ext_tag_no)
31519
0
        break;
31520
64
    }
31521
31522
24
    if ((!current_ext_tag_no && !ext_element_ids_assume_invalid) ||
31523
24
          (current_ext_tag_no && ext_element_ids_assume_invalid)) {
31524
14
      expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_number,
31525
14
          "Unexpected Extended Element ID %d", ext_tag_no);
31526
14
        return tag_len + tag_overhead;
31527
14
    }
31528
24
  }
31529
31530
67.2k
  ieee80211_tagged_field_data_t field_data = {
31531
67.2k
    .ftype = ftype,
31532
67.2k
    .sanity_check = association_sanity_check,
31533
67.2k
    .isDMG = isDMG,
31534
67.2k
    .item_tag = ti,
31535
67.2k
    .item_tag_length = ti_len
31536
67.2k
  };
31537
67.2k
  if (!dissector_try_uint_with_data(tagged_field_table, tag_no, tag_tvb, pinfo, tree, false, &field_data))
31538
42.5k
  {
31539
42.5k
      proto_tree_add_item(tree, hf_ieee80211_tag_data, tvb, offset + 2, tag_len, ENC_NA);
31540
42.5k
      expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_data,
31541
42.5k
                             "Dissector for 802.11 IE Tag"
31542
42.5k
                             " (%s) code not implemented, Contact"
31543
42.5k
                             " Wireshark developers if you want this supported", val_to_str_ext(tag_no,
31544
42.5k
                                            &tag_num_vals_ext, "(%d)"));
31545
42.5k
      proto_item_append_text(ti, ": Undecoded");
31546
42.5k
  }
31547
31548
67.2k
  return tag_len + tag_overhead;
31549
67.2k
}
31550
31551
/* 7.3.2.12 Request information element (10) */
31552
static int
31553
ieee80211_tag_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
31554
377
{
31555
377
  int tag_len = tvb_reported_length(tvb);
31556
377
  int offset = 0;
31557
31558
5.57k
  while (offset < tag_len)
31559
5.19k
  {
31560
5.19k
    proto_tree_add_item(tree, hf_ieee80211_tag_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
31561
5.19k
    offset += 1;
31562
5.19k
  }
31563
377
  return ((tag_len > 0) ? tag_len : 1);
31564
377
}
31565
31566
/* 7.3.2.28 BSS Load element (11) */
31567
/* 8.4.2.30 in 802.11-2012 */
31568
static int
31569
ieee80211_tag_qbss_load(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31570
385
{
31571
385
  int tag_len = tvb_reported_length(tvb);
31572
385
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31573
385
  int offset = 0;
31574
31575
385
  if ((tag_len < 4) || (tag_len > 5))
31576
369
  {
31577
369
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4 or 5", tag_len);
31578
369
    return tvb_captured_length(tvb);
31579
369
  }
31580
31581
16
  if (tag_len == 4)
31582
6
  {
31583
    /* QBSS Version 1 */
31584
6
    proto_item_append_text(field_data->item_tag, " Cisco QBSS Version 1 - non CCA");
31585
31586
    /* Extract Values */
31587
6
    proto_tree_add_uint(tree, hf_ieee80211_qbss_version, tvb, offset, tag_len, 1);
31588
6
    proto_tree_add_item(tree, hf_ieee80211_qbss_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31589
6
    proto_tree_add_item(tree, hf_ieee80211_qbss_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
31590
6
    proto_tree_add_item(tree, hf_ieee80211_qbss_adc, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
31591
6
  }
31592
10
  else if (tag_len == 5)
31593
10
  {
31594
10
    proto_item *base_item;
31595
31596
    /* QBSS Version 2 */
31597
10
    proto_item_append_text(field_data->item_tag, " 802.11e CCA Version");
31598
31599
    /* Extract Values */
31600
10
    proto_tree_add_uint(tree, hf_ieee80211_qbss_version, tvb, offset, tag_len, 2);
31601
10
    proto_tree_add_item(tree, hf_ieee80211_qbss_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31602
10
    base_item = proto_tree_add_item(tree, hf_ieee80211_qbss_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
31603
10
    proto_item_append_text(base_item, " (%d%%)", 100*tvb_get_uint8(tvb, offset + 2)/255);
31604
10
    base_item = proto_tree_add_item(tree, hf_ieee80211_qbss_adc, tvb, offset + 3, 2, ENC_LITTLE_ENDIAN);
31605
10
    proto_item_append_text(base_item, " (%d us/s)", tvb_get_letohs(tvb, offset + 3)*32);
31606
10
  }
31607
31608
16
  return tvb_captured_length(tvb);
31609
385
}
31610
31611
/* 8.4.2.31 in 802-11-2012 */
31612
static int
31613
ieee80211_tag_edca_param_set(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31614
296
{
31615
296
  int tag_len = tvb_reported_length(tvb);
31616
296
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31617
296
  int offset = 0;
31618
31619
296
  if ((tag_len != 18))
31620
270
  {
31621
270
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 18", tag_len);
31622
270
    return tvb_captured_length(tvb);
31623
270
  }
31624
31625
26
  decode_qos_parameter_set(tree, tvb, pinfo, offset, field_data->ftype);
31626
31627
26
  return tvb_captured_length(tvb);
31628
296
}
31629
31630
/* TSPEC element (13) */
31631
static int
31632
ieee80211_tag_tspec(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
31633
199
{
31634
199
  int tag_len = tvb_reported_length(tvb);
31635
199
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
31636
199
  int offset = 0;
31637
31638
199
  if (field_data->isDMG == false && tag_len != 55)
31639
196
  {
31640
196
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 55", tag_len);
31641
196
    return tvb_captured_length(tvb);
31642
196
  }
31643
3
  if (field_data->isDMG == true && tag_len != 57)
31644
1
  {
31645
1
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 57", tag_len);
31646
1
    return tvb_captured_length(tvb);
31647
1
  }
31648
31649
2
  add_ff_qos_ts_info(tree, tvb, pinfo, offset);
31650
2
  offset += 3;
31651
31652
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_nor_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31653
2
  offset += 2;
31654
31655
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_max_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31656
2
  offset += 2;
31657
31658
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_min_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31659
2
  offset += 4;
31660
31661
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_max_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31662
2
  offset += 4;
31663
31664
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_inact_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31665
2
  offset += 4;
31666
31667
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_susp_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31668
2
  offset += 4;
31669
31670
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31671
2
  offset += 4;
31672
31673
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_min_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31674
2
  offset += 4;
31675
31676
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_mean_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31677
2
  offset += 4;
31678
31679
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_peak_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31680
2
  offset += 4;
31681
31682
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_burst_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31683
2
  offset += 4;
31684
31685
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_delay_bound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31686
2
  offset += 4;
31687
31688
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_min_phy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
31689
2
  offset += 4;
31690
31691
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_surplus, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31692
2
  offset += 2;
31693
31694
2
  proto_tree_add_item(tree, hf_ieee80211_tspec_medium, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31695
2
  offset += 2;
31696
31697
2
  if(field_data->isDMG == true) {
31698
0
    proto_tree_add_item(tree, hf_ieee80211_tspec_dmg, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31699
    /*offset +=2;*/
31700
0
  }
31701
31702
2
  return tvb_captured_length(tvb);
31703
3
}
31704
31705
/* 7.3.2.31 TCLAS element (14) */
31706
static const range_string user_prio_rvals[] = {
31707
  { 0,  7,  "The User Priority value of an MSDU" },
31708
  { 8,  8,  "The AC value of an MPDU is AC-VO" },
31709
  { 9,  9,  "The AC value of an MPDU is AC-VI" },
31710
  { 10, 10, "The AC value of an MPDU is AC-BE" },
31711
  { 11, 11, "The AC value of an MPDU is AC-BK" },
31712
  { 0, 0, NULL }
31713
};
31714
31715
static int * const ieee80211_tclas_class_mask0[] = {
31716
  &hf_ieee80211_tclas_class_mask0_src_addr,
31717
  &hf_ieee80211_tclas_class_mask0_dst_addr,
31718
  &hf_ieee80211_tclas_class_mask0_type,
31719
  NULL
31720
};
31721
31722
static int * const ieee80211_tclas_class_mask1[] = {
31723
  &hf_ieee80211_tclas_class_mask1_ver,
31724
  &hf_ieee80211_tclas_class_mask1_src_ip,
31725
  &hf_ieee80211_tclas_class_mask1_dst_ip,
31726
  &hf_ieee80211_tclas_class_mask1_src_port,
31727
  &hf_ieee80211_tclas_class_mask1_dst_port,
31728
  &hf_ieee80211_tclas_class_mask1_ipv6_flow,
31729
  NULL
31730
};
31731
31732
static int * const ieee80211_tclas_class_mask1_4[] = {
31733
  &hf_ieee80211_tclas_class_mask1_ver,
31734
  &hf_ieee80211_tclas_class_mask1_src_ip,
31735
  &hf_ieee80211_tclas_class_mask1_dst_ip,
31736
  &hf_ieee80211_tclas_class_mask1_src_port,
31737
  &hf_ieee80211_tclas_class_mask1_dst_port,
31738
  &hf_ieee80211_tclas_class_mask1_ipv4_dscp,
31739
  &hf_ieee80211_tclas_class_mask1_ipv4_proto,
31740
  &hf_ieee80211_tclas_class_mask1_reserved,
31741
  NULL
31742
};
31743
31744
static int * const ieee80211_tclas_class_mask2[] = {
31745
  &hf_ieee80211_tclas_class_mask2_tci,
31746
  NULL
31747
};
31748
31749
static int * const ieee80211_tclas_class_mask4_4[] = {
31750
  &hf_ieee80211_tclas_class_mask4_ver,
31751
  &hf_ieee80211_tclas_class_mask4_4_src_ip,
31752
  &hf_ieee80211_tclas_class_mask4_4_dst_ip,
31753
  &hf_ieee80211_tclas_class_mask4_src_port,
31754
  &hf_ieee80211_tclas_class_mask4_dst_port,
31755
  &hf_ieee80211_tclas_class_mask4_dscp,
31756
  &hf_ieee80211_tclas_class_mask4_ipv4_proto,
31757
  &hf_ieee80211_tclas_class_mask4_reserved,
31758
  NULL
31759
};
31760
31761
static int * const ieee80211_tclas_class_mask4_6[] = {
31762
  &hf_ieee80211_tclas_class_mask4_ver,
31763
  &hf_ieee80211_tclas_class_mask4_6_src_ip,
31764
  &hf_ieee80211_tclas_class_mask4_6_dst_ip,
31765
  &hf_ieee80211_tclas_class_mask4_src_port,
31766
  &hf_ieee80211_tclas_class_mask4_dst_port,
31767
  &hf_ieee80211_tclas_class_mask4_dscp,
31768
  &hf_ieee80211_tclas_class_mask4_next_hdr,
31769
  &hf_ieee80211_tclas_class_mask4_flow_label,
31770
  NULL
31771
};
31772
31773
static int * const ieee80211_tclas_class_mask5[] = {
31774
  &hf_ieee80211_tclas_class_mask5_up_prio,
31775
  &hf_ieee80211_tclas_class_mask5_dei,
31776
  &hf_ieee80211_tclas_class_mask5_vid,
31777
  &hf_ieee80211_tclas_class_mask5_reserved,
31778
  NULL
31779
};
31780
31781
/*
31782
 * Two control bits in the next few. Lower bit specifies if the classifier
31783
 * uses the field (the match value is present, upper bit specifies is a
31784
 * mask is present.
31785
 */
31786
static const value_string frame_control_mask_vals[] = {
31787
  { 0x0 , "Frame Control is not included in the Classifier" },
31788
  { 0x1 , "Frame Control is included in the Classifier. A Match Spec is not included" },
31789
  { 0x2 , "Invalid Frame Control Classifier Mask Control value" },
31790
  { 0x3 , "Frame Control is included in the Classifier. A Match Spec is included" },
31791
  { 0,    NULL }
31792
};
31793
31794
static const value_string duration_id_mask_vals[] = {
31795
  { 0x0 , "Duration/ID is not included in the Classifier" },
31796
  { 0x1 , "Duration/ID is included in the Classifier. A Match Spec is not included" },
31797
  { 0x2 , "Invalid Duration/ID Classifier Mask Control value" },
31798
  { 0x3 , "Duration/ID is included in the Classifier. A Match Spec is included" },
31799
  { 0,    NULL }
31800
};
31801
31802
static const value_string address_1_mask_vals[] = {
31803
  { 0x0 , "Address 1 is not included in the Classifier" },
31804
  { 0x1 , "Address 1 is included in the Classifier. A Match Spec is not included" },
31805
  { 0x2 , "Invalid Address 1 Classifier Mask Control value" },
31806
  { 0x3 , "Address 1 is included in the Classifier. A Match Spec is included" },
31807
  { 0,    NULL }
31808
};
31809
31810
static const value_string address_2_mask_vals[] = {
31811
  { 0x0 , "Address 2 is not included in the Classifier" },
31812
  { 0x1 , "Address 2 is included in the Classifier. A Match Spec is not included" },
31813
  { 0x2 , "Invalid Address 2 Classifier Mask Control value" },
31814
  { 0x3 , "Address 2 is included in the Classifier. A Match Spec is included" },
31815
  { 0,    NULL }
31816
};
31817
31818
static const value_string address_3_mask_vals[] = {
31819
  { 0x0 , "Address 3 is not included in the Classifier" },
31820
  { 0x1 , "Address 3 is included in the Classifier. A Match Spec is not included" },
31821
  { 0x2 , "Invalid Address 3 Classifier Mask Control value" },
31822
  { 0x3 , "Address 3 is included in the Classifier. A Match Spec is included" },
31823
  { 0,    NULL }
31824
};
31825
31826
static const value_string sequence_control_mask_vals[] = {
31827
  { 0x0 , "Sequence Control is not included in the Classifier" },
31828
  { 0x1 , "Sequence Control is included in the Classifier. A Match Spec is not included" },
31829
  { 0x2 , "Invalid Sequence Control Classifier Mask Control value" },
31830
  { 0x3 , "Sequence Control is included in the Classifier. A Match Spec is included" },
31831
  { 0,    NULL }
31832
};
31833
31834
static const value_string address_4_mask_vals[] = {
31835
  { 0x0 , "Address 4 is not included in the Classifier" },
31836
  { 0x1 , "Address 4 is included in the Classifier. A Match Spec is not included" },
31837
  { 0x2 , "Invalid Address 4 Classifier Mask Control value" },
31838
  { 0x3 , "Address 4 is included in the Classifier. A Match Spec is included" },
31839
  { 0,    NULL }
31840
};
31841
31842
static const value_string qos_control_mask_vals[] = {
31843
  { 0x0 , "QoS Control is not included in the Classifier" },
31844
  { 0x1 , "QoS Control is included in the Classifier. A Match Spec is not included" },
31845
  { 0x2 , "Invalid QoS Control Classifier Mask Control value" },
31846
  { 0x3 , "QoS Control is included in the Classifier. A Match Spec is included" },
31847
  { 0,    NULL }
31848
};
31849
31850
static const value_string ht_control_mask_vals[] = {
31851
  { 0x0 , "HT Control is not included in the Classifier" },
31852
  { 0x1 , "HT Control is included in the Classifier. A Match Spec is not included" },
31853
  { 0x2 , "Invalid HT Control Classifier Mask Control value" },
31854
  { 0x3 , "HT Control is included in the Classifier. A Match Spec is included" },
31855
  { 0,    NULL }
31856
};
31857
31858
static const value_string address_1_sid_mask_vals[] = {
31859
  { 0x0 , "Address 1 (SID) is not included in the Classifier" },
31860
  { 0x1 , "Address 1 (SID) is included in the Classifier. A Match Spec is not included" },
31861
  { 0x2 , "Invalid Address 1 (SID) Classifier Mask Control value" },
31862
  { 0x3 , "Address 1 (SID) is included in the Classifier. A match spec is included" },
31863
  { 0,    NULL }
31864
};
31865
31866
static const value_string address_1_bssid_mask_vals[] = {
31867
  { 0x0 , "Address 1 (BSSID) is not included in the Classifier" },
31868
  { 0x1 , "Address 1 (BSSID) is included in the Classifier. A Match Spec is not included" },
31869
  { 0x2 , "Invalid Address 1 (SID) Classifier Mask Control value" },
31870
  { 0x3 , "Address 1 (BSSID) is included in the Classifier. A match spec is included" },
31871
  { 0,    NULL }
31872
};
31873
31874
static int * const ieee80211_tclas_class_mask6[] = {
31875
  &hf_ieee80211_tclas_class_mask6_frame_control_match_spec,
31876
  &hf_ieee80211_tclas_class_mask6_duration_id_match_spec,
31877
  &hf_ieee80211_tclas_class_mask6_address_1_match_spec,
31878
  &hf_ieee80211_tclas_class_mask6_address_2_match_spec,
31879
  &hf_ieee80211_tclas_class_mask6_address_3_match_spec,
31880
  &hf_ieee80211_tclas_class_mask6_sequence_control_spec,
31881
  &hf_ieee80211_tclas_class_mask6_address_4_match_spec,
31882
  &hf_ieee80211_tclas_class_mask6_qos_control_spec,
31883
  &hf_ieee80211_tclas_class_mask6_ht_control_spec,
31884
  &hf_ieee80211_tclas_class_mask6_reserved,
31885
  NULL
31886
};
31887
31888
static int * const ieee80211_tclas_class_mask7[] = {
31889
  &hf_ieee80211_tclas_class_mask7_frame_control_match_spec,
31890
  &hf_ieee80211_tclas_class_mask7_address_1_sid_match_spec,
31891
  &hf_ieee80211_tclas_class_mask7_address_2_match_spec,
31892
  &hf_ieee80211_tclas_class_mask7_sequence_control_spec,
31893
  &hf_ieee80211_tclas_class_mask7_address_3_match_spec,
31894
  &hf_ieee80211_tclas_class_mask7_address_4_match_spec,
31895
  &hf_ieee80211_tclas_class_mask7_reserved,
31896
  NULL
31897
};
31898
31899
static int * const ieee80211_tclas_class_mask8[] = {
31900
  &hf_ieee80211_tclas_class_mask8_frame_control_match_spec,
31901
  &hf_ieee80211_tclas_class_mask8_address_1_bssid_match_spec,
31902
  &hf_ieee80211_tclas_class_mask8_address_2_sid_match_spec,
31903
  &hf_ieee80211_tclas_class_mask8_sequence_control_spec,
31904
  &hf_ieee80211_tclas_class_mask8_address_3_match_spec,
31905
  &hf_ieee80211_tclas_class_mask8_address_4_match_spec,
31906
  &hf_ieee80211_tclas_class_mask8_reserved,
31907
  NULL
31908
};
31909
31910
/* TODO: the masks for these items are clearly wrong! */
31911
static int * const ieee80211_tclas_class_mask9[] = {
31912
  &hf_ieee80211_tclas_class_mask9_frame_control_match_spec,
31913
  &hf_ieee80211_tclas_class_mask9_address_1_match_spec,
31914
  &hf_ieee80211_tclas_class_mask9_address_2_match_spec,
31915
  &hf_ieee80211_tclas_class_mask9_sequence_control_spec,
31916
  &hf_ieee80211_tclas_class_mask9_reserved,
31917
  NULL
31918
};
31919
31920
static int
31921
ieee80211_frame_classifier(tvbuff_t *tvb, packet_info *pinfo _U_,
31922
                           proto_tree *tree, int offset, int tag_len)
31923
409
{
31924
409
  uint8_t type;
31925
409
  uint8_t version;
31926
409
  uint8_t filter_field_len;
31927
409
  uint32_t class_mask;
31928
31929
409
  type = tvb_get_uint8(tvb, offset);
31930
409
  proto_tree_add_item(tree, hf_ieee80211_tclas_class_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
31931
409
  offset += 1;
31932
31933
409
  switch (type)
31934
409
  {
31935
17
  case 0:
31936
17
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
31937
17
                                    ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask0,
31938
17
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
31939
17
    offset++;
31940
31941
17
    proto_tree_add_item(tree, hf_ieee80211_tclas_src_mac_addr, tvb, offset, 6, ENC_NA);
31942
17
    offset += 6;
31943
31944
17
    proto_tree_add_item(tree, hf_ieee80211_tclas_dst_mac_addr, tvb, offset, 6, ENC_NA);
31945
17
    offset += 6;
31946
31947
17
    proto_tree_add_item(tree, hf_ieee80211_tclas_ether_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
31948
    /*offset += 2;*/
31949
17
    break;
31950
31951
4
  case 1:
31952
4
    version = tvb_get_uint8(tvb, offset+1);
31953
4
    if (version == 4) {
31954
1
      proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
31955
1
                                    ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask1_4,
31956
1
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
31957
3
    } else {
31958
3
      proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
31959
3
                                    ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask1,
31960
3
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
31961
3
    }
31962
4
    offset += 1;
31963
31964
4
    proto_tree_add_item(tree, hf_ieee80211_tclas_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
31965
4
    offset += 1;
31966
4
    if (version == 4)
31967
1
    {
31968
1
      proto_tree_add_item(tree, hf_ieee80211_tclas_ipv4_src, tvb, offset, 4, ENC_BIG_ENDIAN);
31969
1
      offset += 4;
31970
1
      proto_tree_add_item(tree, hf_ieee80211_tclas_ipv4_dst, tvb, offset, 4, ENC_BIG_ENDIAN);
31971
1
      offset += 4;
31972
1
      proto_tree_add_item(tree, hf_ieee80211_tclas_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
31973
1
      offset += 2;
31974
1
      proto_tree_add_item(tree, hf_ieee80211_tclas_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
31975
1
      offset += 2;
31976
1
      proto_tree_add_item(tree, hf_ieee80211_tclas_dscp, tvb, offset, 1, ENC_NA);
31977
1
      offset += 1;
31978
1
      proto_tree_add_item(tree, hf_ieee80211_tclas_protocol, tvb, offset, 1, ENC_NA);
31979
      /*offset += 1;*/
31980
1
    }
31981
3
    else if (version == 6)
31982
0
    {
31983
0
      proto_tree_add_item(tree, hf_ieee80211_tclas_ipv6_src, tvb, offset, 16, ENC_NA);
31984
0
      offset += 16;
31985
0
      proto_tree_add_item(tree, hf_ieee80211_tclas_ipv6_dst, tvb, offset, 16, ENC_NA);
31986
0
      offset += 16;
31987
0
      proto_tree_add_item(tree, hf_ieee80211_tclas_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
31988
0
      offset += 2;
31989
0
      proto_tree_add_item(tree, hf_ieee80211_tclas_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
31990
0
      offset += 2;
31991
0
      proto_tree_add_item(tree, hf_ieee80211_tclas_flow, tvb, offset, 3, ENC_BIG_ENDIAN);
31992
      /*offset += 3;*/
31993
0
    }
31994
4
    break;
31995
31996
6
  case 2:
31997
6
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
31998
6
                                    ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask2,
31999
6
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32000
6
    offset++;
32001
32002
6
    proto_tree_add_item(tree, hf_ieee80211_tclas_tag_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32003
    /*offset += 2;*/
32004
6
    break;
32005
32006
7
  case 3:
32007
7
    proto_tree_add_item(tree, hf_ieee80211_tclas_mask_reserved, tvb, offset,
32008
7
                        1, ENC_NA);
32009
7
    offset += 1;
32010
32011
7
    proto_tree_add_item(tree, hf_ieee80211_tclas_filter_offset, tvb, offset,
32012
7
                        2, ENC_LITTLE_ENDIAN);
32013
7
    offset += 2;
32014
32015
7
    filter_field_len = (tag_len - 4) / 2;
32016
32017
7
    proto_tree_add_item(tree, hf_ieee80211_tclas_filter_value, tvb, offset,
32018
7
                        filter_field_len, ENC_NA);
32019
7
    offset += filter_field_len;
32020
32021
7
    proto_tree_add_item(tree, hf_ieee80211_tclas_filter_mask, tvb, offset,
32022
7
                        filter_field_len, ENC_NA);
32023
    /*offset += filter_field_len;*/
32024
7
    break;
32025
32026
4
  case 4:
32027
4
    version = tvb_get_uint8(tvb, offset+1);
32028
4
    if (version == 4) {
32029
2
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32030
2
                                    hf_ieee80211_tclas_class_mask,
32031
2
                                    ett_tag_tclas_mask_tree,
32032
2
                                    ieee80211_tclas_class_mask4_4,
32033
2
                                    ENC_BIG_ENDIAN, BMT_NO_APPEND);
32034
2
    } else if (version == 6) {
32035
0
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32036
0
                                    hf_ieee80211_tclas_class_mask,
32037
0
                                    ett_tag_tclas_mask_tree,
32038
0
                                    ieee80211_tclas_class_mask4_6,
32039
0
                                    ENC_BIG_ENDIAN, BMT_NO_APPEND);
32040
2
    } else {
32041
2
      proto_tree_add_item(tree, hf_ieee80211_tclas_class_mask, tvb, offset, 1,
32042
2
                          ENC_NA);
32043
2
      offset += 1;
32044
32045
2
      proto_tree_add_item(tree, hf_ieee80211_tclas_reserved_bytes, tvb, offset,
32046
2
                          tag_len - offset + 1, ENC_NA);
32047
2
      break;
32048
2
    }
32049
32050
2
    offset += 1;
32051
32052
2
    proto_tree_add_item(tree, hf_ieee80211_tclas4_version, tvb, offset, 1, ENC_NA);
32053
2
    offset += 1;
32054
32055
2
    if (version == 4)
32056
2
    {
32057
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_ipv4_src, tvb, offset, 4, ENC_BIG_ENDIAN);
32058
2
      offset += 4;
32059
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_ipv4_dst, tvb, offset, 4, ENC_BIG_ENDIAN);
32060
2
      offset += 4;
32061
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
32062
2
      offset += 2;
32063
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
32064
2
      offset += 2;
32065
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_dscp, tvb, offset, 1, ENC_NA);
32066
2
      offset += 1;
32067
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_protocol, tvb, offset, 1, ENC_NA);
32068
2
      offset += 1;
32069
2
      proto_tree_add_item(tree, hf_ieee80211_tclas4_reserved, tvb, offset, 1, ENC_NA);
32070
      /*offset += 1;*/
32071
2
    }
32072
0
    else if (version == 6)
32073
0
    {
32074
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_ipv6_src, tvb, offset, 16, ENC_NA);
32075
0
      offset += 16;
32076
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_ipv6_dst, tvb, offset, 16, ENC_NA);
32077
0
      offset += 16;
32078
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
32079
0
      offset += 2;
32080
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
32081
0
      offset += 2;
32082
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_dscp, tvb, offset, 1, ENC_NA);
32083
0
      offset += 1;
32084
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_next_hdr, tvb, offset, 1, ENC_NA);
32085
0
      proto_tree_add_item(tree, hf_ieee80211_tclas4_flow, tvb, offset, 3, ENC_BIG_ENDIAN);
32086
      /*offset += 3;*/
32087
0
    }
32088
2
    break;
32089
32090
4
  case 5:
32091
    /* Note, BIG Endian where more than one byte. */
32092
4
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32093
4
                                    hf_ieee80211_tclas_class_mask,
32094
4
                                    ett_tag_tclas_mask_tree,
32095
4
                                    ieee80211_tclas_class_mask5,
32096
4
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32097
4
    offset++;
32098
32099
4
    proto_tree_add_item(tree, hf_ieee80211_tclas_tclas_8021d_up_pcp, tvb,
32100
4
                        offset, 1, ENC_NA);
32101
4
    offset += 1;
32102
32103
4
    proto_tree_add_item(tree, hf_ieee80211_tclas_8021q_dei, tvb, offset, 1,
32104
4
                        ENC_NA);
32105
4
    offset += 1;
32106
32107
4
    proto_tree_add_item(tree, hf_ieee80211_tclas_8021q_vid, tvb, offset, 2,
32108
4
                        ENC_BIG_ENDIAN);
32109
4
    break;
32110
32111
39
  case 6:
32112
39
    class_mask = tvb_get_letoh24(tvb, offset);
32113
39
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32114
39
                                    hf_ieee80211_tclas_class_mask6_a_above,
32115
39
                                    ett_tag_tclas_mask_tree,
32116
39
                                    ieee80211_tclas_class_mask6,
32117
39
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32118
39
    offset += 3;
32119
32120
    /* Is the Frame Control info there? */
32121
39
    if (class_mask & 0x01) {
32122
14
      proto_tree_add_item(tree, hf_ieee80211_tclas6_frame_control_spec, tvb,
32123
14
                          offset, 2, ENC_LITTLE_ENDIAN);
32124
14
      offset += 2;
32125
32126
14
      if (class_mask & 0x02) {
32127
7
        proto_tree_add_item(tree, hf_ieee80211_tclas6_frame_control_mask, tvb,
32128
7
                            offset, 2, ENC_LITTLE_ENDIAN);
32129
7
        offset += 2;
32130
7
      }
32131
14
    }
32132
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32133
32134
    /* Is the Duration info there? */
32135
39
    if (class_mask & 0x01) {
32136
24
      proto_tree_add_item(tree, hf_ieee80211_tclas6_duration_spec, tvb,
32137
24
                          offset, 2, ENC_LITTLE_ENDIAN);
32138
24
      offset += 2;
32139
32140
24
      if (class_mask & 0x02) {
32141
10
        proto_tree_add_item(tree, hf_ieee80211_tclas6_duration_mask, tvb,
32142
10
                            offset, 2, ENC_LITTLE_ENDIAN);
32143
10
        offset += 2;
32144
10
      }
32145
24
    }
32146
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32147
32148
    /* Is the Address 1 info there? */
32149
39
    if (class_mask & 0x01) {
32150
12
      proto_tree_add_item(tree, hf_ieee80211_tclas6_address_1_spec, tvb,
32151
12
                          offset, 6, ENC_NA);
32152
12
      offset += 6;
32153
32154
12
      if (class_mask & 0x02) {
32155
7
        proto_tree_add_item(tree, hf_ieee80211_tclas6_address_1_mask, tvb,
32156
7
                            offset, 6, ENC_LITTLE_ENDIAN);
32157
7
        offset += 6;
32158
7
      }
32159
12
    }
32160
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32161
32162
    /* Is the Address 2 info there? */
32163
39
    if (class_mask & 0x01) {
32164
14
      proto_tree_add_item(tree, hf_ieee80211_tclas6_address_2_spec, tvb,
32165
14
                          offset, 6, ENC_NA);
32166
14
      offset += 6;
32167
32168
14
      if (class_mask & 0x02) {
32169
6
        proto_tree_add_item(tree, hf_ieee80211_tclas6_address_2_mask, tvb,
32170
6
                            offset, 6, ENC_LITTLE_ENDIAN);
32171
6
        offset += 6;
32172
6
      }
32173
14
    }
32174
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32175
32176
    /* Is the Address 3 info there? */
32177
39
    if (class_mask & 0x01) {
32178
10
      proto_tree_add_item(tree, hf_ieee80211_tclas6_address_3_spec, tvb,
32179
10
                          offset, 6, ENC_NA);
32180
10
      offset += 6;
32181
32182
10
      if (class_mask & 0x02) {
32183
5
        proto_tree_add_item(tree, hf_ieee80211_tclas6_address_3_mask, tvb,
32184
5
                            offset, 6, ENC_LITTLE_ENDIAN);
32185
5
        offset += 6;
32186
5
      }
32187
10
    }
32188
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32189
32190
    /* Is the Sequence Control info there? */
32191
39
    if (class_mask & 0x01) {
32192
22
      proto_tree_add_item(tree, hf_ieee80211_tclas6_sequence_control_spec, tvb,
32193
22
                          offset, 2, ENC_LITTLE_ENDIAN);
32194
22
      offset += 2;
32195
32196
22
      if (class_mask & 0x02) {
32197
6
        proto_tree_add_item(tree, hf_ieee80211_tclas6_sequence_control_mask,
32198
6
                            tvb, offset, 2, ENC_LITTLE_ENDIAN);
32199
6
        offset += 2;
32200
6
      }
32201
22
    }
32202
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32203
32204
    /* Is the Address 4 info there? */
32205
39
    if (class_mask & 0x01) {
32206
8
      proto_tree_add_item(tree, hf_ieee80211_tclas6_address_4_spec, tvb,
32207
8
                          offset, 6, ENC_NA);
32208
8
      offset += 6;
32209
32210
8
      if (class_mask & 0x02) {
32211
4
        proto_tree_add_item(tree, hf_ieee80211_tclas6_address_4_mask, tvb,
32212
4
                            offset, 6, ENC_LITTLE_ENDIAN);
32213
4
        offset += 6;
32214
4
      }
32215
8
    }
32216
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32217
32218
    /* Is the QoS Control info there? */
32219
39
    if (class_mask & 0x01) {
32220
6
      proto_tree_add_item(tree, hf_ieee80211_tclas6_qos_control_spec, tvb,
32221
6
                          offset, 2, ENC_LITTLE_ENDIAN);
32222
6
      offset += 2;
32223
32224
6
      if (class_mask & 0x02) {
32225
5
        proto_tree_add_item(tree, hf_ieee80211_tclas6_qos_control_mask, tvb,
32226
5
                            offset, 2, ENC_LITTLE_ENDIAN);
32227
5
        offset += 2;
32228
5
      }
32229
6
    }
32230
39
    class_mask = class_mask >> 2; /* Get the next two bits */
32231
32232
    /* Is the HT Control info there? */
32233
39
    if (class_mask & 0x01) {
32234
8
      proto_tree_add_item(tree, hf_ieee80211_tclas6_ht_control_spec, tvb,
32235
8
                          offset, 4, ENC_LITTLE_ENDIAN);
32236
8
      offset += 4;
32237
32238
8
      if (class_mask & 0x02) {
32239
8
        proto_tree_add_item(tree, hf_ieee80211_tclas6_ht_control_mask, tvb,
32240
8
                            offset, 4, ENC_LITTLE_ENDIAN);
32241
8
      }
32242
8
    }
32243
    /* class_mask = class_mask >> 2; Get the next two bits */
32244
32245
39
    break;
32246
32247
18
  case 7:
32248
18
    class_mask = tvb_get_letohs(tvb, offset);
32249
18
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32250
18
                                    hf_ieee80211_tclas_class_mask6_a_above,
32251
18
                                    ett_tag_tclas_mask_tree,
32252
18
                                    ieee80211_tclas_class_mask7,
32253
18
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32254
18
    offset += 3;
32255
32256
    /* Is the Frame Control info there */
32257
18
    if (class_mask & 0x01) {
32258
11
      proto_tree_add_item(tree, hf_ieee80211_tclas7_frame_control_spec, tvb,
32259
11
                          offset, 2, ENC_LITTLE_ENDIAN);
32260
11
      offset += 2;
32261
11
      if (class_mask & 0x02) {
32262
8
        proto_tree_add_item(tree, hf_ieee80211_tclas7_frame_control_mask, tvb,
32263
8
                            offset, 2, ENC_LITTLE_ENDIAN);
32264
8
        offset += 2;
32265
8
      }
32266
11
    }
32267
18
    class_mask = class_mask >> 2; /* Get the next two bits */
32268
32269
    /* Is the Address 1 (SID) info there */
32270
18
    if (class_mask & 0x01) {
32271
9
      proto_tree_add_item(tree, hf_ieee80211_tclas7_address_1_sid_spec, tvb,
32272
9
                          offset, 2, ENC_LITTLE_ENDIAN);
32273
9
      offset += 2;
32274
9
      if (class_mask & 0x02) {
32275
4
        proto_tree_add_item(tree, hf_ieee80211_tclas7_address_1_sid_mask, tvb,
32276
4
                            offset, 2, ENC_LITTLE_ENDIAN);
32277
4
        offset += 2;
32278
4
      }
32279
9
    }
32280
18
    class_mask = class_mask >> 2; /* Get the next two bits */
32281
32282
    /* Is the Address 2 info there */
32283
18
    if (class_mask & 0x01) {
32284
4
      proto_tree_add_item(tree, hf_ieee80211_tclas7_address_2_spec, tvb,
32285
4
                          offset, 6, ENC_NA);
32286
4
      offset += 6;
32287
4
      if (class_mask & 0x02) {
32288
0
        proto_tree_add_item(tree, hf_ieee80211_tclas7_address_2_mask, tvb,
32289
0
                            offset, 6, ENC_LITTLE_ENDIAN);
32290
0
        offset += 6;
32291
0
      }
32292
4
    }
32293
18
    class_mask = class_mask >> 2; /* Get the next two bits */
32294
32295
    /* Is the Sequence Control info there */
32296
18
    if (class_mask & 0x01) {
32297
6
      proto_tree_add_item(tree, hf_ieee80211_tclas7_sequence_control_spec, tvb,
32298
6
                          offset, 2, ENC_LITTLE_ENDIAN);
32299
6
      offset += 2;
32300
6
      if (class_mask & 0x02) {
32301
5
        proto_tree_add_item(tree, hf_ieee80211_tclas7_sequence_control_mask,
32302
5
                            tvb, offset, 2, ENC_LITTLE_ENDIAN);
32303
5
        offset += 2;
32304
5
      }
32305
6
    }
32306
18
    class_mask = class_mask >> 2; /* Get the next two bits */
32307
32308
    /* Is the Address 3 info there */
32309
18
    if (class_mask & 0x01) {
32310
4
      proto_tree_add_item(tree, hf_ieee80211_tclas7_address_3_spec, tvb,
32311
4
                          offset, 6, ENC_NA);
32312
4
      offset += 6;
32313
4
      if (class_mask & 0x02) {
32314
2
        proto_tree_add_item(tree, hf_ieee80211_tclas7_address_3_mask, tvb,
32315
2
                            offset, 6, ENC_LITTLE_ENDIAN);
32316
2
        offset += 6;
32317
2
      }
32318
4
    }
32319
18
    class_mask = class_mask >> 2; /* Get the next two bits */
32320
32321
    /* Is the Address 4 info there */
32322
18
    if (class_mask & 0x01) {
32323
8
      proto_tree_add_item(tree, hf_ieee80211_tclas7_address_4_spec, tvb,
32324
8
                          offset, 6, ENC_NA);
32325
8
      offset += 6;
32326
8
      if (class_mask & 0x02) {
32327
5
        proto_tree_add_item(tree, hf_ieee80211_tclas7_address_4_mask, tvb,
32328
5
                            offset, 6, ENC_LITTLE_ENDIAN);
32329
5
      }
32330
8
    }
32331
    /*class_mask = class_mask >> 2; Get the next two bits */
32332
32333
18
    break;
32334
32335
20
  case 8:
32336
20
    class_mask = tvb_get_letohs(tvb, offset);
32337
20
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32338
20
                                    hf_ieee80211_tclas_class_mask6_a_above,
32339
20
                                    ett_tag_tclas_mask_tree,
32340
20
                                    ieee80211_tclas_class_mask8,
32341
20
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32342
20
    offset += 3;
32343
32344
    /* Is the Frame Control info there */
32345
20
    if (class_mask & 0x01) {
32346
4
      proto_tree_add_item(tree, hf_ieee80211_tclas8_frame_control_spec, tvb,
32347
4
                          offset, 2, ENC_LITTLE_ENDIAN);
32348
4
      offset += 2;
32349
4
      if (class_mask & 0x02) {
32350
3
        proto_tree_add_item(tree, hf_ieee80211_tclas8_frame_control_mask, tvb,
32351
3
                            offset, 2, ENC_LITTLE_ENDIAN);
32352
3
        offset += 2;
32353
3
      }
32354
4
    }
32355
20
    class_mask = class_mask >> 2; /* Get the next two bits */
32356
32357
    /* Is the Address 1 (BSSID) info there */
32358
20
    if (class_mask & 0x01) {
32359
5
      proto_tree_add_item(tree, hf_ieee80211_tclas8_address_1_bssid_spec, tvb,
32360
5
                          offset, 6, ENC_NA);
32361
5
      offset += 6;
32362
5
      if (class_mask & 0x02) {
32363
3
        proto_tree_add_item(tree, hf_ieee80211_tclas8_address_1_bssid_mask, tvb,
32364
3
                            offset, 6, ENC_LITTLE_ENDIAN);
32365
3
        offset += 6;
32366
3
      }
32367
5
    }
32368
20
    class_mask = class_mask >> 2; /* Get the next two bits */
32369
32370
    /* Is the Address 2 (SID) info there */
32371
20
    if (class_mask & 0x01) {
32372
5
      proto_tree_add_item(tree, hf_ieee80211_tclas8_address_2_sid_spec, tvb,
32373
5
                          offset, 2, ENC_LITTLE_ENDIAN);
32374
5
      offset += 2;
32375
5
      if (class_mask & 0x02) {
32376
4
        proto_tree_add_item(tree, hf_ieee80211_tclas8_address_2_sid_mask, tvb,
32377
4
                            offset, 2, ENC_LITTLE_ENDIAN);
32378
4
        offset += 2;
32379
4
      }
32380
5
    }
32381
20
    class_mask = class_mask >> 2; /* Get the next two bits */
32382
32383
    /* Is the Sequence Control info there */
32384
20
    if (class_mask & 0x01) {
32385
3
      proto_tree_add_item(tree, hf_ieee80211_tclas8_sequence_control_spec, tvb,
32386
3
                          offset, 2, ENC_LITTLE_ENDIAN);
32387
3
      offset += 2;
32388
3
      if (class_mask & 0x02) {
32389
3
        proto_tree_add_item(tree, hf_ieee80211_tclas8_sequence_control_mask,
32390
3
                            tvb, offset, 2, ENC_LITTLE_ENDIAN);
32391
3
        offset += 2;
32392
3
      }
32393
3
    }
32394
20
    class_mask = class_mask >> 2; /* Get the next two bits */
32395
32396
    /* Is the Address 3 info there */
32397
20
    if (class_mask & 0x01) {
32398
4
      proto_tree_add_item(tree, hf_ieee80211_tclas8_address_3_spec, tvb,
32399
4
                          offset, 6, ENC_NA);
32400
4
      offset += 6;
32401
4
      if (class_mask & 0x02) {
32402
2
        proto_tree_add_item(tree, hf_ieee80211_tclas8_address_3_mask, tvb,
32403
2
                            offset, 6, ENC_LITTLE_ENDIAN);
32404
2
        offset += 6;
32405
2
      }
32406
4
    }
32407
20
    class_mask = class_mask >> 2; /* Get the next two bits */
32408
32409
    /* Is the Address 4 info there */
32410
20
    if (class_mask & 0x01) {
32411
10
      proto_tree_add_item(tree, hf_ieee80211_tclas8_address_4_spec, tvb,
32412
10
                          offset, 6, ENC_NA);
32413
10
      offset += 6;
32414
10
      if (class_mask & 0x02) {
32415
4
        proto_tree_add_item(tree, hf_ieee80211_tclas8_address_4_mask, tvb,
32416
4
                            offset, 6, ENC_LITTLE_ENDIAN);
32417
4
      }
32418
10
    }
32419
    /* class_mask = class_mask >> 2; Get the next two bits */
32420
32421
20
    break;
32422
32423
9
  case 9:
32424
9
    class_mask = tvb_get_letohs(tvb, offset);
32425
9
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
32426
9
                                    hf_ieee80211_tclas_class_mask6_a_above,
32427
9
                                    ett_tag_tclas_mask_tree,
32428
9
                                    ieee80211_tclas_class_mask9,
32429
9
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32430
9
    offset += 3;
32431
32432
    /* Is the Frame Control info there */
32433
9
    if (class_mask & 0x01) {
32434
4
      proto_tree_add_item(tree, hf_ieee80211_tclas9_frame_control_spec, tvb,
32435
4
                          offset, 2, ENC_LITTLE_ENDIAN);
32436
4
      offset += 2;
32437
4
      if (class_mask & 0x02) {
32438
2
        proto_tree_add_item(tree, hf_ieee80211_tclas9_frame_control_mask, tvb,
32439
2
                            offset, 2, ENC_LITTLE_ENDIAN);
32440
2
        offset += 2;
32441
2
      }
32442
4
    }
32443
9
    class_mask = class_mask >> 2; /* Get the next two bits */
32444
32445
    /* Is the Address 1 info there */
32446
9
    if (class_mask & 0x01) {
32447
3
      proto_tree_add_item(tree, hf_ieee80211_tclas9_address_1_spec, tvb,
32448
3
                          offset, 6, ENC_NA);
32449
3
      offset += 6;
32450
3
      if (class_mask & 0x02) {
32451
2
        proto_tree_add_item(tree, hf_ieee80211_tclas9_address_1_mask, tvb,
32452
2
                            offset, 6, ENC_LITTLE_ENDIAN);
32453
2
        offset += 6;
32454
2
      }
32455
3
    }
32456
9
    class_mask = class_mask >> 2; /* Get the next two bits */
32457
32458
    /* Is the Address 2 info there */
32459
9
    if (class_mask & 0x01) {
32460
2
      proto_tree_add_item(tree, hf_ieee80211_tclas9_address_2_spec, tvb,
32461
2
                          offset, 6, ENC_NA);
32462
2
      offset += 6;
32463
2
      if (class_mask & 0x02) {
32464
1
        proto_tree_add_item(tree, hf_ieee80211_tclas9_address_2_mask, tvb,
32465
1
                            offset, 6, ENC_LITTLE_ENDIAN);
32466
1
        offset += 6;
32467
1
      }
32468
2
    }
32469
9
    class_mask = class_mask >> 2; /* Get the next two bits */
32470
32471
    /* Is the Sequence Control info there */
32472
9
    if (class_mask & 0x01) {
32473
2
      proto_tree_add_item(tree, hf_ieee80211_tclas9_sequence_control_spec, tvb,
32474
2
                          offset, 2, ENC_LITTLE_ENDIAN);
32475
2
      offset += 2;
32476
2
      if (class_mask & 0x02) {
32477
1
        proto_tree_add_item(tree, hf_ieee80211_tclas9_sequence_control_mask,
32478
1
                            tvb, offset, 2, ENC_LITTLE_ENDIAN);
32479
1
      }
32480
2
    }
32481
    /* class_mask = class_mask >> 2; Get the next two bits */
32482
32483
9
    break;
32484
32485
5
  case 0x0A:
32486
5
    proto_tree_add_item(tree, hf_ieee80211_tclas10_protocol_instance, tvb,
32487
5
                        offset, 1, ENC_NA);
32488
5
    offset += 1;
32489
32490
5
    proto_tree_add_item(tree, hf_ieee80211_tclas10_protocol_num_next_hdr, tvb,
32491
5
                        offset, 1, ENC_NA);
32492
5
    offset += 1;
32493
32494
5
    filter_field_len = (tag_len - 4) / 2;
32495
32496
5
    proto_tree_add_item(tree, hf_ieee80211_tclas_filter_value, tvb, offset,
32497
5
                        filter_field_len, ENC_NA);
32498
5
    offset += filter_field_len;
32499
32500
5
    proto_tree_add_item(tree, hf_ieee80211_tclas_filter_mask, tvb, offset,
32501
5
                        filter_field_len, ENC_NA);
32502
    /*offset += filter_field_len;*/
32503
5
    break;
32504
32505
276
  default:
32506
276
    break;
32507
409
  }
32508
32509
380
  return tvb_captured_length(tvb);
32510
409
}
32511
32512
static int
32513
ieee80211_tag_tclas(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32514
444
{
32515
444
  int tag_len = tvb_reported_length(tvb);
32516
444
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32517
444
  int offset = 0;
32518
32519
444
  if (tag_len < 5)
32520
40
  {
32521
40
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 5", tag_len);
32522
40
    return 1;
32523
40
  }
32524
32525
404
  proto_tree_add_item(tree, hf_ieee80211_tclas_up, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32526
404
  offset += 1;
32527
32528
404
  return ieee80211_frame_classifier(tvb, pinfo, tree, offset, tag_len);
32529
444
}
32530
32531
/* 7.3.2.34 Schedule element (15) */
32532
static int
32533
ieee80211_tag_schedule(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32534
271
{
32535
271
  int tag_len = tvb_reported_length(tvb);
32536
271
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32537
271
  int offset = 0;
32538
271
  if (tag_len != 14)
32539
249
  {
32540
249
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 14", tag_len);
32541
249
    return 1;
32542
249
  }
32543
32544
22
  add_ff_schedule_info(tree, tvb, pinfo, offset);
32545
22
  offset += 2;
32546
32547
22
  proto_tree_add_item(tree, hf_ieee80211_sched_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
32548
22
  offset += 4;
32549
32550
22
  proto_tree_add_item(tree, hf_ieee80211_sched_srv_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
32551
22
  offset += 4;
32552
32553
22
  proto_tree_add_item(tree, hf_ieee80211_sched_spec_int, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32554
22
  return tvb_captured_length(tvb);
32555
271
}
32556
32557
/* 7.3.2.8 Challenge Text element (16) */
32558
static int
32559
ieee80211_tag_challenge_text(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
32560
326
{
32561
326
  int tag_len = tvb_reported_length(tvb);
32562
326
  int offset = 0;
32563
32564
326
  proto_tree_add_item(tree, hf_ieee80211_tag_challenge_text, tvb, offset, tag_len, ENC_NA);
32565
32566
326
  return ((tag_len > 0) ? tag_len : 1);
32567
326
}
32568
32569
/* 7.3.2.15 Power Constraint element (32) */
32570
static int
32571
ieee80211_tag_power_constraint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32572
294
{
32573
294
  int tag_len = tvb_reported_length(tvb);
32574
294
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32575
294
  int offset = 0;
32576
294
  if (tag_len != 1)
32577
277
  {
32578
277
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
32579
277
    return 1;
32580
277
  }
32581
32582
17
  proto_tree_add_item(tree, hf_ieee80211_tag_power_constraint_local, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32583
17
  proto_item_append_text(field_data->item_tag, ": %d", tvb_get_uint8(tvb, offset));
32584
17
  return tvb_captured_length(tvb);
32585
294
}
32586
32587
/* 7.3.2.16 Power Capability element (33) */
32588
static int
32589
ieee80211_tag_power_capability(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32590
176
{
32591
176
  int tag_len = tvb_reported_length(tvb);
32592
176
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32593
176
  int offset = 0;
32594
176
  if (tag_len != 2)
32595
162
  {
32596
162
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 2", tag_len);
32597
162
    return 1;
32598
162
  }
32599
32600
14
  proto_tree_add_item(tree, hf_ieee80211_tag_power_capability_min, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32601
14
  proto_item_append_text(field_data->item_tag, " Min: %d", tvb_get_int8(tvb, offset));
32602
14
  offset += 1;
32603
32604
14
  proto_tree_add_item(tree, hf_ieee80211_tag_power_capability_max, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32605
14
  proto_item_append_text(field_data->item_tag, ", Max: %d", tvb_get_int8(tvb, offset));
32606
14
  return tvb_captured_length(tvb);
32607
176
}
32608
32609
/* 7.3.2.18 TPC Request element (34) */
32610
static int
32611
ieee80211_tag_tpc_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void* data)
32612
127
{
32613
127
  int tag_len = tvb_reported_length(tvb);
32614
127
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32615
127
  if (tag_len != 0)
32616
101
  {
32617
101
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 0", tag_len);
32618
101
    return 1; /* Even with no data, we can't return 0 */
32619
101
  }
32620
32621
26
  return 1; /* Even with no data, we can't return 0 */
32622
127
}
32623
32624
/* TPC Report element (35)
32625
 * 7.3.2.18 (Std 802.11-2007), 8.4.2.19 (Std 802.11-2012),
32626
 * 9.4.2.17 (Std 802.11-2016), 9.4.2.16 (Std 802.11-2020)
32627
 */
32628
static int
32629
ieee80211_tag_tpc_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32630
127
{
32631
127
  int tag_len = tvb_reported_length(tvb);
32632
127
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32633
127
  int offset = 0;
32634
32635
127
  if (tag_len != 2)
32636
116
  {
32637
116
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 2", tag_len);
32638
116
    return 1;
32639
116
  }
32640
32641
11
  proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_trsmt_pow, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32642
11
  proto_item_append_text(field_data->item_tag, " Transmit Power: %d dBm", tvb_get_uint8(tvb, offset));
32643
11
  offset += 1;
32644
32645
  /*
32646
   * "The Link Margin field is reserved when a TPC Report element is
32647
   * included in a Beacon frame or Probe Response frame." - 2012 and later
32648
   */
32649
32650
11
  uint32_t ftype = GPOINTER_TO_UINT(p_get_proto_data(wmem_file_scope(),
32651
11
                                                     pinfo, proto_wlan,
32652
11
                                                     FRAME_TYPE_KEY));
32653
32654
11
  if (ftype == MGT_BEACON || ftype == MGT_PROBE_RESP) {
32655
0
    proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_reserved, tvb, offset, 1, ENC_NA);
32656
11
  } else {
32657
11
    proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_link_mrg, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32658
32659
11
    proto_item_append_text(field_data->item_tag, ", Link Margin: %d dBm", tvb_get_uint8(tvb, offset));
32660
11
  }
32661
11
  return tvb_captured_length(tvb);
32662
127
}
32663
32664
/* 7.3.2.19 Supported Channels element (36) */
32665
static int
32666
ieee80211_tag_supported_channels(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32667
163
{
32668
163
  int tag_len = tvb_reported_length(tvb);
32669
163
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32670
163
  int offset = 0;
32671
32672
163
  proto_item *chan_item;
32673
163
  proto_tree *chan_tree;
32674
163
  unsigned    i = 1;
32675
32676
163
  if (tag_len % 2 == 1) {
32677
33
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u must be even", tag_len);
32678
33
    return tvb_captured_length(tvb);
32679
33
  }
32680
32681
1.99k
  while (offset < tag_len)
32682
1.86k
  {
32683
1.86k
    chan_item = proto_tree_add_item(tree, hf_ieee80211_tag_supported_channels, tvb, offset, 2, ENC_NA);
32684
1.86k
    proto_item_append_text(chan_item, " #%d", i);
32685
1.86k
    i += 1;
32686
32687
1.86k
    chan_tree = proto_item_add_subtree(chan_item , ett_tag_supported_channels);
32688
32689
1.86k
    proto_tree_add_item(chan_tree, hf_ieee80211_tag_supported_channels_first, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32690
1.86k
    proto_item_append_text(chan_item, " First: %d", tvb_get_uint8(tvb, offset));
32691
1.86k
    offset += 1;
32692
32693
1.86k
    proto_tree_add_item(chan_tree, hf_ieee80211_tag_supported_channels_range, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32694
1.86k
    proto_item_append_text(chan_item, ", Range: %d ", tvb_get_uint8(tvb, offset));
32695
1.86k
    offset += 1;
32696
32697
1.86k
  }
32698
130
  return tvb_captured_length(tvb);
32699
163
}
32700
32701
/* 7.3.2.20 Channel Switch Announcement element (37) */
32702
static int
32703
ieee80211_tag_switch_ann(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32704
126
{
32705
126
  int tag_len = tvb_reported_length(tvb);
32706
126
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32707
126
  int offset = 0;
32708
126
  if (tag_len != 3)
32709
117
  {
32710
117
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 3", tag_len);
32711
117
    return 1;
32712
117
  }
32713
32714
9
  proto_tree_add_item(tree, hf_ieee80211_csa_channel_switch_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32715
9
  proto_item_append_text(field_data->item_tag, " Mode: %d", tvb_get_uint8(tvb, offset));
32716
9
  offset += 1;
32717
32718
9
  proto_tree_add_item(tree, hf_ieee80211_csa_new_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32719
9
  proto_item_append_text(field_data->item_tag, ", Number: %d ", tvb_get_uint8(tvb, offset));
32720
9
  offset += 1;
32721
32722
9
  proto_tree_add_item(tree, hf_ieee80211_csa_channel_switch_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32723
9
  proto_item_append_text(field_data->item_tag, ", Count: %d ", tvb_get_uint8(tvb, offset));
32724
9
  return tvb_captured_length(tvb);
32725
126
}
32726
32727
/* 7.3.2.21 Measurement Request element (38) with update from 802.11k-2008 */
32728
static int
32729
ieee80211_tag_measure_req(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
32730
331
{
32731
331
  int tag_len = tvb_reported_length(tvb);
32732
331
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
32733
331
  int offset = 0;
32734
331
  uint8_t request_type;
32735
331
  proto_item *parent_item;
32736
331
  proto_tree *sub_tree;
32737
331
  static int * const ieee80211_tag_measure_request_mode[] = {
32738
331
    &hf_ieee80211_tag_measure_request_mode_parallel,
32739
331
    &hf_ieee80211_tag_measure_request_mode_enable,
32740
331
    &hf_ieee80211_tag_measure_request_mode_request,
32741
331
    &hf_ieee80211_tag_measure_request_mode_report,
32742
331
    &hf_ieee80211_tag_measure_request_mode_duration_mandatory,
32743
331
    &hf_ieee80211_tag_measure_request_mode_reserved,
32744
331
    NULL
32745
331
  };
32746
32747
331
  if (tag_len < 3)
32748
62
  {
32749
62
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 3", tag_len);
32750
62
    return tvb_captured_length(tvb);
32751
62
  }
32752
269
  proto_tree_add_item(tree, hf_ieee80211_tag_measure_request_token, tvb, offset, 1, ENC_NA);
32753
269
  offset += 1;
32754
32755
269
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_request_mode,
32756
269
                                    ett_tag_measure_request_mode_tree, ieee80211_tag_measure_request_mode,
32757
269
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
32758
269
  offset += 1;
32759
32760
269
  parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_measure_request_type, tvb, offset, 1, ENC_NA);
32761
269
  sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_request_type_tree);
32762
269
  request_type = tvb_get_uint8(tvb, offset);
32763
269
  offset += 1;
32764
32765
269
  switch (request_type) {
32766
29
    case 0: /* Basic Request */
32767
33
    case 1: /* Clear channel assessment (CCA) request */
32768
35
    case 2: /* Receive power indication (RPI) histogram request */
32769
35
    {
32770
35
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
32771
35
      offset += 1;
32772
32773
35
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
32774
35
      offset += 8;
32775
32776
35
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32777
35
      offset += 2;
32778
35
      break;
32779
33
    }
32780
21
    case 3: /* Channel Load Request */
32781
21
    {
32782
21
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
32783
21
      offset += 1;
32784
32785
21
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
32786
21
      offset += 1;
32787
32788
21
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32789
21
      offset += 2;
32790
32791
21
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32792
21
      offset += 2;
32793
32794
862
      while (offset < tag_len)
32795
856
      {
32796
856
        uint8_t sub_id;
32797
856
        proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_id, tvb, offset, 1, ENC_NA);
32798
856
        sub_id = tvb_get_uint8(tvb, offset);
32799
856
        offset += 1;
32800
32801
856
        proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
32802
856
        offset += 1;
32803
32804
856
        switch (sub_id) {
32805
48
          case MEASURE_REQ_CHANNEL_LOAD_SUB_REPORTING_INFO: /* Channel Load Reporting Information (1) */
32806
48
            proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition, tvb, offset, 1, ENC_NA);
32807
48
            offset += 1;
32808
48
            proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref, tvb, offset, 1, ENC_NA);
32809
48
            offset += 1;
32810
48
            break;
32811
794
          default:
32812
            /* no default action */
32813
794
            break;
32814
856
          }
32815
856
     }
32816
6
     break;
32817
21
   }
32818
19
   case 4: /* Noise Histogram Request */
32819
19
   {
32820
19
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
32821
19
     offset += 1;
32822
32823
19
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
32824
19
     offset += 1;
32825
32826
19
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32827
19
     offset += 2;
32828
32829
19
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32830
19
     offset += 2;
32831
32832
545
     while (offset < tag_len)
32833
543
     {
32834
543
       uint8_t sub_id;
32835
543
       proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_id, tvb, offset, 1, ENC_NA);
32836
543
       sub_id = tvb_get_uint8(tvb, offset);
32837
543
       offset += 1;
32838
32839
543
       proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
32840
543
       offset += 1;
32841
32842
543
       switch (sub_id) {
32843
39
         case MEASURE_REQ_NOISE_HISTOGRAM_SUB_REPORTING_INFO: /* Noise Histogram Reporting Information (1) */
32844
39
           proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition, tvb, offset, 1, ENC_NA);
32845
39
           offset += 1;
32846
39
           proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref, tvb, offset, 1, ENC_NA);
32847
39
           offset += 1;
32848
39
           break;
32849
491
         default:
32850
           /* no default action */
32851
491
           break;
32852
543
       }
32853
543
     }
32854
2
     break;
32855
19
   }
32856
81
   case 5: /* Beacon Request */
32857
81
   {
32858
81
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
32859
81
     offset += 1;
32860
32861
81
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
32862
81
     offset += 1;
32863
32864
81
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32865
81
     offset += 2;
32866
32867
81
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32868
81
     offset += 2;
32869
32870
81
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_measurement_mode, tvb, offset, 1, ENC_NA);
32871
81
     offset += 1;
32872
32873
81
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_bssid, tvb, offset, 6, ENC_NA);
32874
81
     offset += 6;
32875
32876
1.33k
     while (offset < tag_len)
32877
1.31k
     {
32878
1.31k
       uint8_t sub_id, sub_length, sub_tag_end;
32879
1.31k
       proto_item *sub_elem_item, *sub_elem_len_item;
32880
1.31k
       proto_tree *sub_elem_tree;
32881
32882
1.31k
       sub_elem_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_id, tvb, offset, 1, ENC_NA);
32883
1.31k
       sub_id = tvb_get_uint8(tvb, offset);
32884
1.31k
       offset += 1;
32885
32886
1.31k
       sub_elem_tree = proto_item_add_subtree(sub_elem_item, ett_tag_measure_request_sub_element_tree);
32887
32888
1.31k
       sub_elem_len_item = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_subelement_length,
32889
1.31k
                                               tvb, offset, 1, ENC_NA);
32890
1.31k
       sub_length = tvb_get_uint8(tvb, offset);
32891
1.31k
       offset += 1;
32892
1.31k
       sub_tag_end = offset + sub_length;
32893
32894
1.31k
       if (sub_tag_end > tag_len)
32895
15
       {
32896
15
         expert_add_info_format(pinfo, sub_elem_len_item, &ei_ieee80211_tag_length, "Sub Element length exceed Tag length");
32897
15
         return tvb_captured_length(tvb);
32898
15
       }
32899
32900
1.30k
       switch (sub_id) {
32901
467
         case MEASURE_REQ_BEACON_SUB_SSID: /* SSID (0) */
32902
467
           proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_beacon_sub_ssid, tvb, offset, sub_length, ENC_ASCII);
32903
467
           offset += sub_length;
32904
467
           break;
32905
98
         case MEASURE_REQ_BEACON_SUB_BRI: /* Beacon Reporting Information (1) */
32906
98
           proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32907
98
           offset += 1;
32908
98
           proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32909
98
           offset += 1;
32910
98
           break;
32911
43
         case MEASURE_REQ_BEACON_SUB_RD: /* Reporting Detail (2) */
32912
43
           proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail, tvb, offset, 1, ENC_LITTLE_ENDIAN);
32913
43
           offset += 1;
32914
43
           break;
32915
22
         case MEASURE_REQ_BEACON_SUB_REQUEST: /* Request (10) */
32916
22
         {
32917
22
           tvbuff_t *sub_tvb = tvb_new_subset_length(tvb, offset, sub_length);
32918
22
           offset += ieee80211_tag_request(sub_tvb, pinfo, sub_elem_tree, NULL);
32919
22
           break;
32920
0
         }
32921
54
         case MEASURE_REQ_BEACON_SUB_REQUEST_EXT: /* Extended Request (11) */
32922
54
           dissect_extended_request(tvb, pinfo, sub_elem_tree, offset, sub_length);
32923
54
           offset += sub_length;
32924
54
           break;
32925
5
         case MEASURE_REQ_BEACON_SUB_APCP: /* AP Channel Report (51) */
32926
5
         {
32927
5
           tvbuff_t *sub_tvb = tvb_new_subset_length(tvb, offset, sub_length);
32928
5
           ieee80211_tagged_field_data_t sub_data = {
32929
5
             .ftype = 0,
32930
5
             .sanity_check = NULL,
32931
5
             .isDMG = false,
32932
5
             .item_tag_length = sub_elem_len_item,
32933
5
             .item_tag = sub_elem_item};
32934
5
           offset += dissect_ap_channel_report(sub_tvb, pinfo, sub_elem_tree, &sub_data);
32935
5
           break;
32936
0
         }
32937
12
         case MEASURE_REQ_BEACON_SUB_WIDE_BW_CHANNEL_SWITCH:
32938
12
         {
32939
12
           tvbuff_t *sub_tvb = tvb_new_subset_length(tvb, offset, sub_length);
32940
12
           offset += dissect_wide_bw_channel_switch(sub_tvb, pinfo, sub_elem_tree, NULL);
32941
12
           break;
32942
0
         }
32943
84
         case MEASURE_REQ_BEACON_SUB_LAST_REPORT_REQ:
32944
84
           proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_beacon_sub_last_report_indication_request,
32945
84
                               tvb, offset, 1, ENC_LITTLE_ENDIAN);
32946
84
           offset += 1;
32947
84
           break;
32948
505
         default:
32949
           /* no default action */
32950
505
           break;
32951
1.30k
       }
32952
1.25k
       if (offset < sub_tag_end)
32953
252
       {
32954
252
         proto_item *tix;
32955
252
         tix = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_request_beacon_unknown, tvb, offset, sub_tag_end - offset, ENC_NA);
32956
252
         expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_request_beacon_unknown);
32957
252
         offset = sub_tag_end;
32958
252
       }
32959
1.25k
     }
32960
32961
22
     break;
32962
81
   }
32963
22
   case 6: /* Frame Request */
32964
2
   {
32965
2
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
32966
2
     offset += 1;
32967
32968
2
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
32969
2
     offset += 1;
32970
32971
2
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32972
2
     offset += 2;
32973
32974
2
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32975
2
     offset += 2;
32976
32977
2
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_frame_request_type, tvb, offset, 1, ENC_NA);
32978
2
     offset += 1;
32979
32980
2
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_mac_address, tvb, offset, 6, ENC_NA);
32981
2
     offset += 6;
32982
32983
     /* TODO Add Optional Subelements */
32984
2
     break;
32985
81
   }
32986
4
   case 7: /* BSTA Statistics Request */
32987
4
   {
32988
4
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_peer_mac_address, tvb, offset, 6, ENC_NA);
32989
4
     offset += 6;
32990
32991
4
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32992
4
     offset += 2;
32993
32994
4
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
32995
4
     offset += 2;
32996
32997
4
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_group_id, tvb, offset, 1, ENC_NA);
32998
4
     offset += 1;
32999
33000
     /* TODO Add Optional Subelements */
33001
4
     break;
33002
81
   }
33003
9
   case 8: /* Location Configuration Indication (LCI) Request */
33004
9
     proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_location_subject, tvb, offset, 1, ENC_NA);
33005
9
     offset += 1;
33006
33007
     /* TODO Add Optional Subelements */
33008
9
     break;
33009
6
   case 9: /* Transmit Stream Measurement Request */
33010
    /* TODO */
33011
12
   case 10: /* Multicast Diagnostics Request */
33012
    /* TODO */
33013
16
   case 11: /* Location Civic Request */
33014
16
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_location_subject, tvb, offset, 1, ENC_NA);
33015
16
      offset += 1;
33016
33017
16
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_civic_location_type, tvb, offset, 1, ENC_NA);
33018
16
      offset += 1;
33019
33020
16
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_location_service_interval_units, tvb, offset, 1, ENC_NA);
33021
16
      offset += 1;
33022
33023
16
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_location_service_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33024
16
      offset += 2;
33025
     /* TODO Add Optional Subelements */
33026
16
      break;
33027
1
   case 12: /* Location Identifier Request */
33028
    /* TODO */
33029
1
   case 13: /* Directional Channel Quality Request */
33030
    /* TODO */
33031
1
   case 14: /* Directional Measurement Request */
33032
    /* TODO */
33033
2
   case 15: /* Directional Statistics Request */
33034
    /* TODO */
33035
2
   case 16: /* Fine Timing Measurement Range Request */
33036
    /* TODO */
33037
11
   case 255: /* Measurement Pause Request */
33038
    /* TODO */
33039
82
   default: /* unknown */
33040
82
    break;
33041
269
  }
33042
160
  if (offset < tag_len)
33043
143
  {
33044
143
    proto_item *tix;
33045
143
    tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_unknown, tvb, offset, tag_len - offset, ENC_NA);
33046
143
    expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_request_unknown);
33047
143
  }
33048
33049
160
  return tvb_captured_length(tvb);
33050
269
}
33051
33052
/* 7.3.2.22 Measurement Report element (39) with update from 802.11k-2008 */
33053
static int
33054
ieee80211_tag_measure_rep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33055
319
{
33056
319
  int tag_len = tvb_reported_length(tvb);
33057
319
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33058
319
  int offset = 0;
33059
319
  proto_item *parent_item;
33060
319
  proto_tree *sub_tree;
33061
319
  uint8_t report_type;
33062
319
  static int * const ieee80211_tag_measure_report_mode[] = {
33063
319
    &hf_ieee80211_tag_measure_report_mode_late,
33064
319
    &hf_ieee80211_tag_measure_report_mode_incapable,
33065
319
    &hf_ieee80211_tag_measure_report_mode_refused,
33066
319
    &hf_ieee80211_tag_measure_report_mode_reserved,
33067
319
    NULL
33068
319
  };
33069
319
  static int * const ieee80211_tag_measure_map_field[] = {
33070
319
    &hf_ieee80211_tag_measure_map_field_bss,
33071
319
    &hf_ieee80211_tag_measure_map_field_ofdm,
33072
319
    &hf_ieee80211_tag_measure_map_field_unident_signal,
33073
319
    &hf_ieee80211_tag_measure_map_field_radar,
33074
319
    &hf_ieee80211_tag_measure_map_field_unmeasured,
33075
319
    &hf_ieee80211_tag_measure_map_field_reserved,
33076
319
    NULL
33077
319
  };
33078
319
  static int * const ieee80211_tag_measure_report_frame_info[] = {
33079
319
    &hf_ieee80211_tag_measure_report_frame_info_phy_type,
33080
319
    &hf_ieee80211_tag_measure_report_frame_info_frame_type,
33081
319
    NULL
33082
319
  };
33083
33084
319
  if (tag_len < 3)
33085
33
  {
33086
33
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 3", tag_len);
33087
33
    return tvb_captured_length(tvb);
33088
33
  }
33089
286
  proto_tree_add_item(tree, hf_ieee80211_tag_measure_report_measurement_token, tvb, offset, 1, ENC_NA);
33090
286
  offset += 1;
33091
33092
286
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_report_mode,
33093
286
                                    ett_tag_measure_report_mode_tree, ieee80211_tag_measure_report_mode,
33094
286
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33095
286
  offset += 1;
33096
33097
286
  report_type = tvb_get_uint8(tvb, offset);
33098
286
  parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_measure_report_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
33099
286
  sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_report_type_tree);
33100
286
  offset += 1;
33101
33102
286
  if (tag_len == 3)
33103
5
    return tvb_captured_length(tvb);
33104
33105
281
  switch (report_type) {
33106
20
  case 0: /* Basic Report */
33107
20
  {
33108
20
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33109
20
    offset += 1;
33110
33111
20
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33112
20
    offset += 8;
33113
33114
20
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33115
20
    offset += 2;
33116
33117
20
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_basic_map_field,
33118
20
                                    ett_tag_measure_report_basic_map_tree, ieee80211_tag_measure_map_field,
33119
20
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33120
20
    break;
33121
0
  }
33122
12
  case 1: /* Clear channel assessment (CCA) report */
33123
12
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33124
12
    offset += 1;
33125
33126
12
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33127
12
    offset += 8;
33128
33129
12
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33130
12
    offset += 2;
33131
33132
12
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_cca_busy_fraction, tvb, offset, 1, ENC_NA);
33133
12
    offset += 1;
33134
12
    break;
33135
4
  case 2: /* Receive power indication (RPI) histogram report */
33136
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33137
4
    offset += 1;
33138
33139
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33140
4
    offset += 8;
33141
33142
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33143
4
    offset += 2;
33144
33145
4
    parent_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report, tvb, offset, 8, ENC_NA);
33146
4
    sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_report_rpi_tree);
33147
33148
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_0, tvb, offset, 1, ENC_NA);
33149
4
    offset += 1;
33150
33151
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_1, tvb, offset, 1, ENC_NA);
33152
4
    offset += 1;
33153
33154
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_2, tvb, offset, 1, ENC_NA);
33155
4
    offset += 1;
33156
33157
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_3, tvb, offset, 1, ENC_NA);
33158
4
    offset += 1;
33159
33160
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_4, tvb, offset, 1, ENC_NA);
33161
4
    offset += 1;
33162
33163
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_5, tvb, offset, 1, ENC_NA);
33164
4
    offset += 1;
33165
33166
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_6, tvb, offset, 1, ENC_NA);
33167
4
    offset += 1;
33168
33169
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_7, tvb, offset, 1, ENC_NA);
33170
4
    offset += 1;
33171
4
    break;
33172
4
  case 3: /* Channel Load Report */
33173
4
  {
33174
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
33175
4
    offset += 1;
33176
33177
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33178
4
    offset += 1;
33179
33180
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33181
4
    offset += 8;
33182
33183
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33184
4
    offset += 2;
33185
33186
4
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_load, tvb, offset, 1, ENC_NA);
33187
4
    offset += 1;
33188
33189
    /* TODO Add Optional Subelements */
33190
4
    break;
33191
0
  }
33192
3
  case 4: /* Noise Histogram Report */
33193
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
33194
3
    offset += 1;
33195
33196
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33197
3
    offset += 1;
33198
33199
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33200
3
    offset += 8;
33201
33202
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33203
3
    offset += 2;
33204
33205
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ant_id, tvb, offset, 1, ENC_NA);
33206
3
    offset += 1;
33207
33208
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_anpi, tvb, offset, 1, ENC_NA);
33209
3
    offset += 1;
33210
33211
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_0, tvb, offset, 1, ENC_NA);
33212
3
    offset += 1;
33213
33214
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_1, tvb, offset, 1, ENC_NA);
33215
3
    offset += 1;
33216
33217
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_2, tvb, offset, 1, ENC_NA);
33218
3
    offset += 1;
33219
33220
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_3, tvb, offset, 1, ENC_NA);
33221
3
    offset += 1;
33222
33223
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_4, tvb, offset, 1, ENC_NA);
33224
3
    offset += 1;
33225
33226
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_5, tvb, offset, 1, ENC_NA);
33227
3
    offset += 1;
33228
33229
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_6, tvb, offset, 1, ENC_NA);
33230
3
    offset += 1;
33231
33232
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_7, tvb, offset, 1, ENC_NA);
33233
3
    offset += 1;
33234
33235
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_8, tvb, offset, 1, ENC_NA);
33236
3
    offset += 1;
33237
33238
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_9, tvb, offset, 1, ENC_NA);
33239
3
    offset += 1;
33240
33241
3
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_10, tvb, offset, 1, ENC_NA);
33242
3
    offset += 1;
33243
33244
    /* TODO Add Optional Subelements */
33245
3
    break;
33246
56
  case 5: /* Beacon Report */
33247
56
  {
33248
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
33249
56
    offset += 1;
33250
33251
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33252
56
    offset += 1;
33253
33254
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33255
56
    offset += 8;
33256
33257
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33258
56
    offset += 2;
33259
33260
56
    proto_tree_add_bitmask_with_flags(sub_tree, tvb, offset, hf_ieee80211_tag_measure_report_frame_info,
33261
56
                                      ett_tag_measure_report_frame_tree, ieee80211_tag_measure_report_frame_info,
33262
56
                                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33263
56
    offset += 1;
33264
33265
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_rcpi, tvb, offset, 1, ENC_NA);
33266
56
    offset += 1;
33267
33268
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_rsni, tvb, offset, 1, ENC_NA);
33269
56
    offset += 1;
33270
33271
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_bssid, tvb, offset, 6, ENC_NA);
33272
56
    offset += 6;
33273
33274
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ant_id, tvb, offset, 1, ENC_NA);
33275
56
    offset += 1;
33276
33277
56
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_parent_tsf, tvb, offset, 4, ENC_LITTLE_ENDIAN);
33278
56
    offset += 4;
33279
33280
700
    while (offset < tag_len)
33281
682
    {
33282
682
      uint8_t sub_id, sub_length, sub_tag_end;
33283
682
      proto_item *sub_elem_item, *sub_elem_len_item;
33284
682
      proto_tree *sub_elem_tree;
33285
33286
682
      sub_elem_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_beacon_sub_id,
33287
682
                                          tvb, offset, 1, ENC_NA);
33288
682
      sub_id = tvb_get_uint8(tvb, offset);
33289
682
      offset += 1;
33290
33291
682
      sub_elem_tree = proto_item_add_subtree(sub_elem_item, ett_tag_measure_report_sub_element_tree);
33292
33293
682
      sub_elem_len_item = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_subelement_length,
33294
682
                                              tvb, offset, 1, ENC_NA);
33295
682
      sub_length = tvb_get_uint8(tvb, offset);
33296
682
      offset += 1;
33297
682
      sub_tag_end = offset + sub_length;
33298
33299
682
      if (sub_tag_end > tag_len)
33300
14
      {
33301
14
        expert_add_info_format(pinfo, sub_elem_len_item, &ei_ieee80211_tag_length, "Sub Element length exceed Tag length");
33302
14
        return tvb_captured_length(tvb);
33303
14
      }
33304
33305
668
      switch (sub_id) {
33306
30
        case MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY: /* Reported Frame Body (1) */
33307
30
        {
33308
30
          proto_tree *rep_tree;
33309
30
          bool fixed_fields = true;
33310
33311
30
          rep_tree = proto_tree_add_subtree(sub_elem_tree, tvb, offset, sub_length,
33312
30
                                            ett_tag_measure_reported_frame_tree, NULL, "Reported Frame Body");
33313
33314
          /* If reported frame body fragment ID sub element is present and this is not
33315
             the first fragment then there are no fixed size fields */
33316
30
          if (((tag_len - sub_tag_end) >= 4) &&
33317
30
              (tvb_get_uint8(tvb, sub_tag_end) == MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY_FRAG_ID) &&
33318
30
              ((tvb_get_uint8(tvb, sub_tag_end + 3) & 0x7f) > 0))
33319
1
            fixed_fields = false;
33320
33321
30
          if (fixed_fields) {
33322
29
            add_ff_timestamp(rep_tree, tvb, pinfo, offset);
33323
29
            offset += 8;
33324
29
            add_ff_beacon_interval(rep_tree, tvb, pinfo, offset);
33325
29
            offset += 2;
33326
29
            add_ff_cap_info(rep_tree, tvb, pinfo, offset);
33327
29
            offset += 2;
33328
29
            sub_length -= 12;
33329
29
          }
33330
33331
30
          ieee_80211_add_tagged_parameters(tvb, offset, pinfo, rep_tree, sub_length, MGT_PROBE_RESP, NULL);
33332
30
          offset += sub_length;
33333
30
          break;
33334
0
        }
33335
15
        case MEASURE_REP_BEACON_SUB_REPORTED_FRAME_BODY_FRAG_ID:
33336
15
        {
33337
15
          static int * const ieee80211_tag_measure_reported_frame_frag_id[] = {
33338
15
            &hf_ieee80211_tag_measure_reported_frame_frag_rep_id,
33339
15
            &hf_ieee80211_tag_measure_reported_frame_frag_number,
33340
15
            &hf_ieee80211_tag_measure_reported_frame_frag_more,
33341
15
            NULL
33342
15
          };
33343
15
          proto_tree_add_bitmask_with_flags(sub_elem_tree, tvb, offset,
33344
15
                                            hf_ieee80211_tag_measure_reported_frame_frag_id,
33345
15
                                            ett_tag_measure_reported_frame_frag_id_tree,
33346
15
                                            ieee80211_tag_measure_reported_frame_frag_id,
33347
15
                                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33348
15
          offset += 2;
33349
15
          break;
33350
0
        }
33351
0
        case MEASURE_REP_BEACON_SUB_WIDE_BW_CHANNEL_SWITCH:
33352
0
        {
33353
0
          tvbuff_t *sub_tvb = tvb_new_subset_length(tvb, offset, sub_length);
33354
0
          offset += dissect_wide_bw_channel_switch(sub_tvb, pinfo, sub_elem_tree, NULL);
33355
0
          break;
33356
0
        }
33357
1
        case MEASURE_REP_BEACON_SUB_LAST_REPORT_INDICATION:
33358
1
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_beacon_sub_last_report_indication,
33359
1
                              tvb, offset, 1, ENC_LITTLE_ENDIAN);
33360
1
          offset += 1;
33361
1
          break;
33362
617
        default:
33363
          /* no default action */
33364
617
          break;
33365
668
      }
33366
33367
644
      if (offset < sub_tag_end)
33368
194
      {
33369
194
        proto_item *tix;
33370
194
        tix = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_beacon_unknown,
33371
194
                                  tvb, offset, sub_tag_end - offset, ENC_NA);
33372
194
        expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_report_beacon_unknown);
33373
194
        offset = sub_tag_end;
33374
194
      }
33375
644
    }
33376
18
    break;
33377
56
  }
33378
18
  case 6: /* Frame Report */
33379
2
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
33380
2
    offset += 1;
33381
33382
2
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
33383
2
    offset += 1;
33384
33385
2
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
33386
2
    offset += 8;
33387
33388
2
    proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33389
2
    offset += 2;
33390
33391
    /* TODO Add Optional Subelements */
33392
2
    break;
33393
17
  case 7: /* BSTA Statistics Report */
33394
    /* TODO */
33395
45
  case 8: /* Location Configuration Information Report element */
33396
    //proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_parent_tsf, tvb, offset, 4, ENC_LITTLE_ENDIAN);
33397
    //offset += 4;
33398
33399
508
    while (offset < tag_len)
33400
499
    {
33401
499
      uint8_t sub_id, sub_length, sub_tag_end;
33402
499
      proto_item *sub_elem_item, *sub_elem_len_item;
33403
499
      proto_tree *sub_elem_tree;
33404
33405
499
      sub_elem_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_lci_sub_id,
33406
499
                                          tvb, offset, 1, ENC_NA);
33407
499
      sub_id = tvb_get_uint8(tvb, offset);
33408
499
      offset += 1;
33409
33410
499
      sub_elem_tree = proto_item_add_subtree(sub_elem_item, ett_tag_measure_report_sub_element_tree);
33411
33412
499
      sub_elem_len_item = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_subelement_length,
33413
499
                                              tvb, offset, 1, ENC_NA);
33414
499
      sub_length = tvb_get_uint8(tvb, offset);
33415
499
      offset += 1;
33416
499
      sub_tag_end = offset + sub_length;
33417
33418
499
      if (sub_tag_end > tag_len)
33419
20
      {
33420
20
        expert_add_info_format(pinfo, sub_elem_len_item, &ei_ieee80211_tag_length, "Sub Element length exceed Tag length");
33421
20
        return tvb_captured_length(tvb);
33422
20
      }
33423
33424
479
      switch (sub_id) {
33425
111
        case MEASURE_REP_LCI_SUB_REPORTED_LCI: /* Location Configuration Information (0) */
33426
111
        {
33427
111
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_lci_lci,
33428
111
                              tvb, offset, 16, ENC_NA);
33429
111
          offset += 16;
33430
111
          break;
33431
0
        }
33432
6
        case MEASURE_REP_LCI_SUB_REPORTED_Z: /* Z (4) */
33433
6
        {
33434
6
          static int * const ieee80211_tag_measure_reported_lci_z_sta_floor_info[] = {
33435
6
            &hf_ieee80211_tag_measure_report_lci_z_sta_floor_info_expected_to_move,
33436
6
            &hf_ieee80211_tag_measure_report_lci_z_sta_floor_info_sta_floor_number,
33437
6
            NULL
33438
6
          };
33439
6
          proto_tree_add_bitmask_with_flags(sub_elem_tree, tvb, offset,
33440
6
                                            hf_ieee80211_tag_measure_report_lci_z_sta_floor_info,
33441
6
                                            ett_tag_measure_reported_lci_z_tree,
33442
6
                                            ieee80211_tag_measure_reported_lci_z_sta_floor_info,
33443
6
                                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33444
6
          offset += 2;
33445
33446
6
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_lci_z_sta_height_above_floor,
33447
6
                              tvb, offset, 3, ENC_LITTLE_ENDIAN);
33448
6
          offset += 3;
33449
33450
6
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_lci_z_sta_height_above_floor_uncertainty,
33451
6
                              tvb, offset, 1, ENC_LITTLE_ENDIAN);
33452
6
          offset += 1;
33453
6
          break;
33454
0
        }
33455
18
        case MEASURE_REP_LCI_SUB_REPORTED_URP: /* Usage Rules/Policy (6) */
33456
18
        {
33457
18
          static int * const ieee80211_tag_measure_reported_lci_urp[] = {
33458
18
            &hf_ieee80211_tag_measure_report_lci_urp_retransmission_allowed,
33459
18
            &hf_ieee80211_tag_measure_report_lci_urp_retention_expires_relative_present,
33460
18
            &hf_ieee80211_tag_measure_report_lci_urp_sta_location_policy,
33461
18
            &hf_ieee80211_tag_measure_report_lci_urp_reserved,
33462
18
            NULL
33463
18
          };
33464
18
          proto_tree_add_bitmask_with_flags(sub_elem_tree, tvb, offset,
33465
18
                                            hf_ieee80211_tag_measure_report_lci_urp,
33466
18
                                            ett_tag_measure_reported_lci_urp_tree,
33467
18
                                            ieee80211_tag_measure_reported_lci_urp,
33468
18
                                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33469
18
          offset += 1;
33470
33471
          /* Retention Expires Relative (optional) */
33472
18
          if ((sub_tag_end - 1) == 2 ) {
33473
0
            proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_lci_urp_retention_expires_relative,
33474
0
                                  tvb, offset, 2, ENC_NA);
33475
0
            offset += 1;
33476
0
          }
33477
18
          break;
33478
0
        }
33479
341
        default:
33480
          /* no default action */
33481
341
          break;
33482
479
      }
33483
33484
463
      if (offset < sub_tag_end)
33485
175
      {
33486
175
        proto_item *tix;
33487
175
        tix = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_lci_unknown,
33488
175
                                  tvb, offset, sub_tag_end - offset, ENC_NA);
33489
175
        expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_report_lci_unknown);
33490
175
        offset = sub_tag_end;
33491
175
      }
33492
463
    }
33493
9
    break;
33494
9
  case 9: /* Transmit Stream Measurement Report */
33495
    /* TODO */
33496
22
  case 10: /* Multicast Diagnostics Report */
33497
    /* TODO */
33498
44
  case 11: /* Location Civic Report */
33499
44
      proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_civic_location_type, tvb, offset, 1, ENC_NA);
33500
44
      offset += 1;
33501
33502
517
    while (offset < tag_len)
33503
509
    {
33504
509
      uint8_t sub_id, sub_length, sub_tag_end;
33505
509
      proto_item *sub_elem_item, *sub_elem_len_item;
33506
509
      proto_tree *sub_elem_tree;
33507
33508
509
      sub_elem_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_civic_sub_id,
33509
509
                                          tvb, offset, 1, ENC_NA);
33510
509
      sub_id = tvb_get_uint8(tvb, offset);
33511
509
      offset += 1;
33512
33513
509
      sub_elem_tree = proto_item_add_subtree(sub_elem_item, ett_tag_measure_report_sub_element_tree);
33514
33515
509
      sub_elem_len_item = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_subelement_length,
33516
509
                                              tvb, offset, 1, ENC_NA);
33517
509
      sub_length = tvb_get_uint8(tvb, offset);
33518
509
      offset += 1;
33519
509
      sub_tag_end = offset + sub_length;
33520
33521
509
      if (sub_tag_end > tag_len)
33522
24
      {
33523
24
        expert_add_info_format(pinfo, sub_elem_len_item, &ei_ieee80211_tag_length, "Sub Element length exceed Tag length");
33524
24
        return tvb_captured_length(tvb);
33525
24
      }
33526
33527
485
      switch (sub_id) {
33528
155
        case MEASURE_REP_CIVIC_SUB_REPORTED_LOCATION_CIVIC: /* Location Civic (0) */
33529
155
        {
33530
155
          uint32_t length;
33531
155
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_location_civic_country,
33532
155
                              tvb, offset, 2, ENC_ASCII);
33533
155
          offset += 2;
33534
33535
155
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_location_civic_type,
33536
155
                              tvb, offset, 1, ENC_ASCII);
33537
155
          offset += 1;
33538
33539
155
          proto_tree_add_item_ret_uint(sub_elem_tree, hf_ieee80211_tag_measure_report_location_civic_length,
33540
155
                              tvb, offset, 1, ENC_LITTLE_ENDIAN, &length);
33541
155
          offset += 1;
33542
33543
155
          proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_location_civic,
33544
155
                              tvb, offset, length, ENC_ASCII);
33545
155
          offset += length;
33546
155
          break;
33547
0
        }
33548
328
        default:
33549
          /* no default action */
33550
328
          break;
33551
485
      }
33552
33553
473
      if (offset < sub_tag_end)
33554
87
      {
33555
87
        proto_item *tix;
33556
87
        tix = proto_tree_add_item(sub_elem_tree, hf_ieee80211_tag_measure_report_lci_unknown,
33557
87
                                  tvb, offset, sub_tag_end - offset, ENC_NA);
33558
87
        expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_report_lci_unknown);
33559
87
        offset = sub_tag_end;
33560
87
      }
33561
473
    }
33562
8
    break;
33563
8
  case 12: /* Location Identifier Report */
33564
    /* TODO */
33565
0
  case 13: /* Directional Channel Quality Report */
33566
    /* TODO */
33567
2
  case 14: /* Directional Measurement Report */
33568
    /* TODO */
33569
2
  case 15: /* Directional Statistics Report */
33570
    /* TODO */
33571
2
  case 16: /* Fine Timing Measurement range Report */
33572
    /* TODO */
33573
91
  default: /* unknown */
33574
91
    break;
33575
281
  }
33576
149
  if (offset < tag_len)
33577
130
  {
33578
130
    proto_item *tix;
33579
130
    tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_unknown, tvb, offset, tag_len - offset, ENC_NA);
33580
130
    expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_report_unknown);
33581
130
  }
33582
149
  return tvb_captured_length(tvb);
33583
281
}
33584
33585
/* 7.3.2.23 Quiet element (40) */
33586
static int
33587
ieee80211_tag_quiet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33588
88
{
33589
88
  int tag_len = tvb_reported_length(tvb);
33590
88
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33591
88
  int offset = 0;
33592
88
  if (tag_len != 6)
33593
80
  {
33594
80
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
33595
80
    return tvb_captured_length(tvb);
33596
80
  }
33597
33598
8
  proto_tree_add_item(tree, hf_ieee80211_tag_quiet_count, tvb, offset, 1, ENC_NA);
33599
8
  proto_item_append_text(field_data->item_tag, " Count: %d", tvb_get_uint8(tvb, offset));
33600
8
  offset += 1;
33601
33602
8
  proto_tree_add_item(tree, hf_ieee80211_tag_quiet_period, tvb, offset, 1, ENC_NA);
33603
8
  proto_item_append_text(field_data->item_tag, " Period: %d", tvb_get_uint8(tvb, offset));
33604
8
  offset += 1;
33605
33606
8
  proto_tree_add_item(tree, hf_ieee80211_tag_quiet_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33607
8
  proto_item_append_text(field_data->item_tag, " Duration: %d", tvb_get_letohs(tvb, offset));
33608
8
  offset += 2;
33609
33610
8
  proto_tree_add_item(tree, hf_ieee80211_tag_quiet_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33611
8
  proto_item_append_text(field_data->item_tag, " Offset: %d", tvb_get_letohs(tvb, offset));
33612
33613
8
  return tvb_captured_length(tvb);
33614
88
}
33615
33616
/* 7.3.2.24 IBSS DFS element (41) */
33617
static int
33618
ieee80211_tag_ibss_dfs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33619
152
{
33620
152
  int tag_len = tvb_reported_length(tvb);
33621
152
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33622
152
  int offset = 0;
33623
152
  proto_item *ti_sup_map;
33624
152
  proto_tree *sub_map_tree;
33625
152
  if (tag_len < 7)
33626
69
  {
33627
69
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 7", tag_len);
33628
69
    return tvb_captured_length(tvb);
33629
69
  }
33630
33631
83
  proto_tree_add_item(tree, hf_ieee80211_tag_dfs_owner, tvb, offset, 6, ENC_NA);
33632
83
  proto_item_append_text(field_data->item_tag, " Owner: %s", tvb_ether_to_str(pinfo->pool, tvb, offset));
33633
83
  offset += 6;
33634
33635
83
  proto_tree_add_item(tree, hf_ieee80211_tag_dfs_recovery_interval, tvb, offset, 1, ENC_NA);
33636
83
  offset += 1;
33637
33638
1.68k
  while (offset < tag_len)
33639
1.59k
  {
33640
1.59k
    ti_sup_map = proto_tree_add_item(tree, hf_ieee80211_tag_dfs_channel_map, tvb, offset, 2, ENC_NA);
33641
1.59k
    sub_map_tree = proto_item_add_subtree(ti_sup_map, ett_tag_dfs_map_tree);
33642
1.59k
    proto_tree_add_item(sub_map_tree, hf_ieee80211_tag_dfs_channel_number, tvb, offset, 1, ENC_NA);
33643
1.59k
    proto_tree_add_item(sub_map_tree, hf_ieee80211_tag_dfs_map, tvb, offset, 1, ENC_NA);
33644
1.59k
    offset += 2;
33645
1.59k
  }
33646
83
  return tvb_captured_length(tvb);
33647
152
}
33648
33649
/* 7.3.2.13 ERP Information element (42) */
33650
static int
33651
ieee80211_tag_erp_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33652
217
{
33653
217
  int tag_len = tvb_reported_length(tvb);
33654
217
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33655
217
  int offset = 0;
33656
217
  static int * const ieee80211_tag_erp_info_flags[] = {
33657
217
    &hf_ieee80211_tag_erp_info_erp_present,
33658
217
    &hf_ieee80211_tag_erp_info_use_protection,
33659
217
    &hf_ieee80211_tag_erp_info_barker_preamble_mode,
33660
217
    &hf_ieee80211_tag_erp_info_reserved,
33661
217
    NULL
33662
217
  };
33663
33664
217
  if (tag_len != 1)
33665
207
  {
33666
207
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
33667
207
    return tvb_captured_length(tvb);
33668
207
  }
33669
33670
10
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_erp_info,
33671
10
                                    ett_tag_erp_info_tree, ieee80211_tag_erp_info_flags,
33672
10
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
33673
33674
10
  return tvb_captured_length(tvb);
33675
217
}
33676
33677
/* 7.3.2.32 TS Delay element (43) */
33678
static int
33679
ieee80211_tag_ts_delay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33680
95
{
33681
95
  int tag_len = tvb_reported_length(tvb);
33682
95
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33683
95
  int offset = 0;
33684
95
  if (tag_len != 4)
33685
86
  {
33686
86
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
33687
86
    return tvb_captured_length(tvb);
33688
86
  }
33689
33690
9
  proto_tree_add_item(tree, hf_ieee80211_ts_delay, tvb, offset, 4, ENC_LITTLE_ENDIAN);
33691
9
  proto_item_append_text(field_data->item_tag, " : %d", tvb_get_ntohl(tvb, offset));
33692
9
  return tvb_captured_length(tvb);
33693
95
}
33694
33695
/* 7.3.2.33 TCLAS Processing element (44) */
33696
static int
33697
ieee80211_tag_tclas_process(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33698
127
{
33699
127
  int tag_len = tvb_reported_length(tvb);
33700
127
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33701
127
  int offset = 0;
33702
127
  if (tag_len != 1)
33703
119
  {
33704
119
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
33705
119
    return tvb_captured_length(tvb);
33706
119
  }
33707
33708
8
  proto_tree_add_item(tree, hf_ieee80211_tclas_process, tvb, offset, 1, ENC_LITTLE_ENDIAN);
33709
8
  proto_item_append_text(field_data->item_tag, " : %s", val_to_str(tvb_get_uint8(tvb, offset), ieee80211_tclas_process_flag, "Unknown %d"));
33710
8
  return tvb_captured_length(tvb);
33711
127
}
33712
33713
/* 802.11-2012 8.4.2.37 QoS Capability element (46) */
33714
static int
33715
ieee80211_tag_qos_capability(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33716
184
{
33717
184
  int tag_len = tvb_reported_length(tvb);
33718
184
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33719
184
  int offset = 0;
33720
184
  if (tag_len != 1)
33721
158
  {
33722
158
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
33723
158
    return tvb_captured_length(tvb);
33724
158
  }
33725
26
  dissect_qos_capability(tree, tvb, pinfo, offset, field_data->ftype);
33726
26
  return tvb_captured_length(tvb);
33727
184
}
33728
33729
static int
33730
ieee80211_tag_rsn_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33731
283
{
33732
283
  int tag_len = tvb_reported_length(tvb);
33733
283
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33734
283
  int offset = 0;
33735
283
  if (tag_len < 2)
33736
79
  {
33737
79
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 2", tag_len);
33738
79
    return tvb_captured_length(tvb);
33739
79
  }
33740
33741
204
  dissect_rsn_ie(pinfo, tree, tvb, offset, tag_len, field_data->sanity_check);
33742
204
  return tvb_captured_length(tvb);
33743
283
}
33744
33745
/* 7.3.2.14 Extended Supported Rates element (50) */
33746
static int
33747
ieee80211_tag_ext_supp_rates(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33748
149
{
33749
149
  int tag_len = tvb_reported_length(tvb);
33750
149
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33751
149
  int offset = 0;
33752
149
  if (tag_len < 1)
33753
47
  {
33754
47
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be greater than 0", tag_len);
33755
47
    return tvb_captured_length(tvb);
33756
47
  }
33757
33758
5.23k
  while (offset < tag_len)
33759
5.13k
  {
33760
5.13k
    proto_tree_add_item(tree, hf_ieee80211_tag_ext_supp_rates, tvb, offset, 1, ENC_NA);
33761
5.13k
    proto_item_append_text(field_data->item_tag, " %s,", val_to_str_ext_const(tvb_get_uint8(tvb, offset), &ieee80211_supported_rates_vals_ext, "Unknown Rate"));
33762
5.13k
    offset += 1;
33763
5.13k
  }
33764
102
  proto_item_append_text(field_data->item_tag, " [Mbit/sec]");
33765
102
  return tvb_captured_length(tvb);
33766
149
}
33767
33768
static int
33769
ieee80211_tag_cisco_ccx1_ckip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33770
49
{
33771
49
  int tag_len = tvb_reported_length(tvb);
33772
49
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33773
49
  int offset = 0;
33774
  /* From WCS manual:
33775
   * If Aironet IE support is enabled, the access point sends an Aironet
33776
   * IE 0x85 (which contains the access point name, load, number of
33777
   * associated clients, and so on) in the beacon and probe responses of
33778
   * this WLAN, and the controller sends Aironet IEs 0x85 and 0x95
33779
   * (which contains the management IP address of the controller and
33780
   * the IP address of the access point) in the reassociation response
33781
   * if it receives Aironet IE 0x85 in the reassociation request.
33782
   */
33783
33784
49
  if (tag_len < 26)
33785
10
  {
33786
10
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u too short, must be >= 26", tag_len);
33787
10
    return tvb_captured_length(tvb);
33788
10
  }
33789
39
  proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_unknown, tvb, offset, 10, ENC_NA);
33790
39
  offset += 10;
33791
33792
  /* The Name of the sending device starts at offset 10 and is up to
33793
     15 or 16 bytes in length, \0 padded */
33794
39
  proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_name, tvb, offset, 16, ENC_ASCII);
33795
39
  offset += 16;
33796
33797
  /* Total number off associated clients and repeater access points */
33798
39
  proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_clients, tvb, offset, 1, ENC_NA);
33799
39
  offset += 1;
33800
39
  proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_unknown2, tvb, offset, 3, ENC_NA);
33801
39
  return tvb_captured_length(tvb);
33802
49
}
33803
33804
static int
33805
ieee80211_tag_vendor_specific_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33806
89
{
33807
89
  int tag_len = tvb_reported_length(tvb);
33808
89
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33809
89
  int offset = 0;
33810
89
  uint32_t tag_vs_len = tag_len;
33811
89
  uint32_t      oui;
33812
33813
89
  if (tag_len < 3)
33814
28
  {
33815
28
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 3", tag_len);
33816
28
    return tvb_captured_length(tvb);
33817
28
  }
33818
33819
61
  proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
33820
61
  proto_item_append_text(field_data->item_tag, ": %s", uint_get_manuf_name_if_known(oui));
33821
33822
61
  offset += 3;
33823
61
  tag_vs_len -= 3;
33824
33825
61
  if (tag_len > 0) {
33826
61
    proto_tree_add_item(field_data->item_tag, hf_ieee80211_tag_vendor_oui_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
33827
61
  }
33828
33829
61
  switch (oui) {
33830
    /* 802.11 specific vendor ids */
33831
0
    case OUI_WPAWME:
33832
0
      dissect_vendor_ie_wpawme(tree, tvb, pinfo, offset, tag_vs_len, field_data->ftype);
33833
0
      break;
33834
0
    case OUI_RSN:
33835
0
      dissect_vendor_ie_rsn(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33836
0
      break;
33837
0
    case OUI_PRE11N:
33838
0
      dissect_vendor_ie_ht(tvb, pinfo, tree, offset, field_data->item_tag, field_data->item_tag_length, tag_vs_len);
33839
0
      break;
33840
0
    case OUI_WFA:
33841
0
      dissect_vendor_ie_wfa(pinfo, field_data->item_tag, tvb);
33842
0
      break;
33843
33844
    /* Normal IEEE vendor ids (from oui.h) */
33845
0
    case OUI_CISCOWL:  /* Cisco Wireless (Aironet) */
33846
0
      dissect_vendor_ie_aironet(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33847
0
      break;
33848
0
    case OUI_MARVELL:
33849
0
      dissect_vendor_ie_marvell(field_data->item_tag, tree, tvb, offset, tag_vs_len);
33850
0
      break;
33851
0
    case OUI_ATHEROS:
33852
0
      dissect_vendor_ie_atheros(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo, field_data->item_tag_length);
33853
0
      break;
33854
0
    case OUI_EXTREME_MESH:
33855
0
      dissect_vendor_ie_extreme_mesh(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo, field_data->item_tag_length);
33856
0
      break;
33857
0
    case OUI_ARUBA:
33858
0
      dissect_vendor_ie_aruba(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33859
0
      break;
33860
0
    case OUI_NINTENDO:
33861
0
      dissect_vendor_ie_nintendo(field_data->item_tag, tree, tvb, offset, tag_vs_len);
33862
0
      break;
33863
0
    case OUI_ROUTERBOARD:
33864
0
      dissect_vendor_ie_routerboard(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33865
0
      break;
33866
0
    case OUI_MERU:
33867
0
      dissect_vendor_ie_meru(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33868
0
      break;
33869
0
    case OUI_ZEBRA_EXTREME:
33870
0
      dissect_vendor_ie_extreme(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33871
0
      break;
33872
0
    case OUI_AEROHIVE:
33873
0
      dissect_vendor_ie_aerohive(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33874
0
      break;
33875
0
    case OUI_MIST:
33876
0
      dissect_vendor_ie_mist(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33877
0
      break;
33878
0
    case OUI_RUCKUS:
33879
0
      dissect_vendor_ie_ruckus(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33880
0
      break;
33881
0
    case OUI_ALCATEL_LUCENT:
33882
0
      dissect_vendor_ie_alcatel(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33883
0
      break;
33884
0
    case OUI_SGDSN:
33885
0
      dissect_vendor_ie_sgdsn(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33886
0
      break;
33887
0
    case OUI_FORTINET:
33888
0
      dissect_vendor_ie_fortinet(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33889
0
      break;
33890
0
    case OUI_MOJO_ARISTA:
33891
0
      dissect_vendor_ie_arista(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33892
0
      break;
33893
0
    case OUI_WISUN:
33894
0
      dissect_vendor_ie_wisun(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33895
0
      break;
33896
0
    case OUI_APPLE:
33897
0
      dissect_vendor_ie_apple(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33898
0
      break;
33899
61
    default:
33900
61
      proto_tree_add_item(tree, hf_ieee80211_tag_vendor_data, tvb, offset + 1, tag_vs_len - 1, ENC_NA);
33901
61
      break;
33902
61
  }
33903
33904
43
  return tvb_captured_length(tvb);
33905
61
}
33906
33907
static void
33908
dissect_symbol_proprietary_ie_extreme(proto_item *item _U_, proto_tree *ietree,
33909
                                      tvbuff_t *tvb, int offset, uint32_t tag_len _U_,
33910
                                      packet_info *pinfo _U_)
33911
0
{
33912
0
  proto_tree_add_item(ietree, hf_ieee80211_symbp_extreme_assoc_clients, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33913
0
  offset += 2;
33914
33915
0
  proto_tree_add_item(ietree, hf_ieee80211_symbp_extreme_load_kbps, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33916
0
  offset += 2;
33917
33918
0
  proto_tree_add_item(ietree, hf_ieee80211_symbp_extreme_load_pps, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33919
0
  offset += 2;
33920
33921
0
  proto_tree_add_item(ietree, hf_ieee80211_symbp_extreme_client_tx_power, tvb, offset, 2, ENC_LITTLE_ENDIAN);
33922
0
  offset += 2;
33923
33924
0
  proto_tree_add_item(ietree, hf_ieee80211_symbp_extreme_timestamp, tvb, offset, 4, ENC_TIME_SECS|ENC_LITTLE_ENDIAN);
33925
0
}
33926
33927
static int
33928
ieee80211_tag_symbol_proprietary_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
33929
52
{
33930
52
  int tag_len = tvb_reported_length(tvb);
33931
52
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
33932
52
  int offset = 0;
33933
52
  uint32_t tag_vs_len = tag_len;
33934
52
  uint32_t      oui;
33935
33936
52
  if (tag_len < 3)
33937
16
  {
33938
16
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 3", tag_len);
33939
16
    return tvb_captured_length(tvb);
33940
16
  }
33941
33942
36
  proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_symbol_proprietary_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
33943
36
  proto_item_append_text(field_data->item_tag, ": %s", uint_get_manuf_name_if_known(oui));
33944
33945
36
  offset += 3;
33946
36
  tag_vs_len -= 3;
33947
33948
36
  switch (oui) {
33949
    /* 802.11 specific vendor ids */
33950
0
    case OUI_ZEBRA_EXTREME:
33951
0
      dissect_symbol_proprietary_ie_extreme(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
33952
0
      break;
33953
35
    default:
33954
35
      proto_tree_add_item(tree, hf_ieee80211_tag_symbol_proprietary_data, tvb, offset, tag_vs_len, ENC_NA);
33955
35
      break;
33956
36
  }
33957
33958
26
  return tvb_captured_length(tvb);
33959
36
}
33960
33961
54
#define HE_HTC_HE_SUPPORT                0x00000001
33962
54
#define HE_DYNAMIC_FRAGMENTATION_SUPPORT 0x00000018
33963
#define HE_ALL_ACK_SUPPORT               0x00000200
33964
#define HE_UMRS_SUPPORT                  0x00000400
33965
#define HE_BSR_SUPPORT                   0x00000800
33966
33967
static const val64_string he_dynamic_fragmentation_support_vals[] = {
33968
  { 0, "No support for dynamic fragmentation" },
33969
  { 1, "Level 1 dynamic fragmentation support" },
33970
  { 2, "Level 2 dynamic fragmentation support" },
33971
  { 3, "Level 3 dynamic fragmentation support" },
33972
  { 0, NULL }
33973
};
33974
33975
static const val64_string he_minimum_fragmentation_size_vals[] = {
33976
  { 0, "No restriction on minimum payload size" },
33977
  { 1, "Minimum payload size of 128 bytes" },
33978
  { 2, "Minimum payload size of 256 bytes" },
33979
  { 3, "Minimum payload size of 512 bytes" },
33980
  { 0, NULL }
33981
};
33982
33983
static const val64_string he_trigger_mac_padding_dur_vals[] = {
33984
  { 0, "0" },
33985
  { 1, "8 uS" },
33986
  { 2, "16 uS" },
33987
  { 3, "Reserved" },
33988
  { 0, NULL }
33989
};
33990
33991
static void
33992
max_frag_msdus_base_custom(char *result, uint32_t max_frag_msdus_value)
33993
0
{
33994
0
  if (max_frag_msdus_value == 7)
33995
0
    snprintf(result, ITEM_LABEL_LENGTH, "No restriction");
33996
0
  else
33997
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u", 1 << max_frag_msdus_value);
33998
0
}
33999
34000
static const val64_string he_link_adaptation_support_vals[] = {
34001
  { 0, "No feedback if the STA does not provide HE MFB" },
34002
  { 1, "Reserved" },
34003
  { 2, "Unsolicited if the STA can receive and provide only unsolicited HE MFB" },
34004
  { 3, "Both" },
34005
  { 0, NULL }
34006
};
34007
34008
static const val64_string he_mimo_cntrl_nc_index_vals[] = {
34009
  {0x00, "1 Column"},
34010
  {0x01, "2 Columns"},
34011
  {0x02, "3 Columns"},
34012
  {0x03, "4 Columns"},
34013
  {0x04, "5 Columns"},
34014
  {0x05, "6 Columns"},
34015
  {0x06, "7 Columns"},
34016
  {0x07, "8 Columns"},
34017
  {0, NULL}
34018
};
34019
34020
static const val64_string he_mimo_cntrl_nr_index_vals[] = {
34021
  {0x00, "1 Row"},
34022
  {0x01, "2 Rows"},
34023
  {0x02, "3 Rows"},
34024
  {0x03, "4 Rows"},
34025
  {0x04, "5 Rows"},
34026
  {0x05, "6 Rows"},
34027
  {0x06, "7 Rows"},
34028
  {0x07, "8 Rows"},
34029
  {0, NULL}
34030
};
34031
34032
static const val64_string he_mimo_cntrl_grouping_flags[] = {
34033
  { 0x00, "Carrier Groups of 4" },
34034
  { 0x01, "Carrier Groups of 16" },
34035
  { 0, NULL }
34036
};
34037
34038
static const val64_string he_mimo_cntrl_feedback_vals[] = {
34039
  { 0x00, "SU" },
34040
  { 0x01, "MU" },
34041
  { 0x02, "CQI feedback" },
34042
  { 0x03, "Reserved" },
34043
  { 0, NULL }
34044
};
34045
34046
static int * const he_phy_first_byte_headers[] = {
34047
  &hf_ieee80211_he_phy_cap_reserved_b0,
34048
  NULL,
34049
};
34050
34051
static int * const he_phy_b8_to_b23_headers[] = {
34052
  &hf_ieee80211_he_phy_cap_punctured_preamble_rx,
34053
  &hf_ieee80211_he_phy_cap_device_class,
34054
  &hf_ieee80211_he_phy_cap_ldpc_coding_in_payload,
34055
  &hf_ieee80211_he_phy_cap_he_su_ppdu_1x_he_ltf_08us,
34056
  &hf_ieee80211_he_phy_cap_midamble_tx_rx_max_nsts,
34057
  &hf_ieee80211_he_phy_cap_ndp_with_4x_he_ltf_32us,
34058
  &hf_ieee80211_he_phy_cap_stbc_tx_lt_80mhz,
34059
  &hf_ieee80211_he_phy_cap_stbc_rx_lt_80mhz,
34060
  &hf_ieee80211_he_phy_cap_doppler_tx,
34061
  &hf_ieee80211_he_phy_cap_doppler_rx,
34062
  &hf_ieee80211_he_phy_cap_full_bw_ul_mu_mimo,
34063
  &hf_ieee80211_he_phy_cap_partial_bw_ul_mu_mimo,
34064
  NULL
34065
};
34066
34067
static int * const he_phy_b24_to_b39_headers[] = {
34068
  &hf_ieee80211_he_phy_cap_dcm_max_constellation_tx,
34069
  &hf_ieee80211_he_phy_cap_dcm_max_nss_tx,
34070
  &hf_ieee80211_he_phy_cap_dcm_max_constellation_rx,
34071
  &hf_ieee80211_he_phy_cap_dcm_max_nss_rx,
34072
  &hf_ieee80211_he_phy_cap_rx_partial_bw_su_20mhz_he_mu_ppdu,
34073
  &hf_ieee80211_he_phy_cap_su_beamformer,
34074
  &hf_ieee80211_he_phy_cap_su_beamformee,
34075
  &hf_ieee80211_he_phy_cap_mu_beamformer,
34076
  &hf_ieee80211_he_phy_cap_beamformee_sts_lte_80mhz,
34077
  &hf_ieee80211_he_phy_cap_beamformee_sts_gt_80mhz,
34078
  NULL
34079
};
34080
34081
static int * const he_phy_b40_to_b55_headers[] = {
34082
  &hf_ieee80211_he_phy_cap_number_of_sounding_dims_lte_80,
34083
  &hf_ieee80211_he_phy_cap_number_of_sounding_dims_gt_80,
34084
  &hf_ieee80211_he_phy_cap_ng_eq_16_su_fb,
34085
  &hf_ieee80211_he_phy_cap_ng_eq_16_mu_fb,
34086
  &hf_ieee80211_he_phy_cap_codebook_size_eq_4_2_fb,
34087
  &hf_ieee80211_he_phy_cap_codebook_size_eq_7_5_fb,
34088
  &hf_ieee80211_he_phy_cap_triggered_su_beamforming_fb,
34089
  &hf_ieee80211_he_phy_cap_triggered_mu_beamforming_fb,
34090
  &hf_ieee80211_he_phy_cap_triggered_cqi_fb,
34091
  &hf_ieee80211_he_phy_cap_partial_bw_extended_range,
34092
  &hf_ieee80211_he_phy_cap_partial_bw_dl_mu_mimo,
34093
  &hf_ieee80211_he_phy_cap_ppe_threshold_present,
34094
  NULL
34095
};
34096
34097
static int * const he_phy_b56_to_b71_headers[] = {
34098
  &hf_ieee80211_he_phy_cap_psr_based_sr_support,
34099
  &hf_ieee80211_he_phy_cap_power_boost_factor_ar_support,
34100
  &hf_ieee80211_he_phy_cap_he_su_ppdu_etc_gi,
34101
  &hf_ieee80211_he_phy_cap_max_nc,
34102
  &hf_ieee80211_he_phy_cap_stbc_tx_gt_80_mhz,
34103
  &hf_ieee80211_he_phy_cap_stbc_rx_gt_80_mhz,
34104
  &hf_ieee80211_he_phy_cap_he_er_su_ppdu_4xxx_gi,
34105
  &hf_ieee80211_he_phy_cap_20mhz_in_40mhz_24ghz_band,
34106
  &hf_ieee80211_he_phy_cap_20mhz_in_160_80p80_ppdu,
34107
  &hf_ieee80211_he_phy_cap_80mgz_in_160_80p80_ppdu,
34108
  &hf_ieee80211_he_phy_cap_he_er_su_ppdu_1xxx_gi,
34109
  &hf_ieee80211_he_phy_cap_midamble_tx_rx_2x_xxx_ltf,
34110
  &hf_ieee80211_he_phy_cap_dcm_max_ru,
34111
  NULL
34112
};
34113
34114
static int * const he_phy_b72_to_b87_headers[] = {
34115
  &hf_ieee80211_he_phy_cap_longer_than_16_he_sigb_ofdm_symbol_support,
34116
  &hf_ieee80211_he_phy_cap_non_triggered_cqi_feedback,
34117
  &hf_ieee80211_he_phy_cap_tx_1024_qam_242_tone_ru_support,
34118
  &hf_ieee80211_he_phy_cap_rx_1024_qam_242_tone_ru_support,
34119
  &hf_ieee80211_he_phy_cap_rx_full_bw_su_using_he_muppdu_w_compressed_sigb,
34120
  &hf_ieee80211_he_phy_cap_rx_full_bw_su_using_he_muppdu_w_non_compressed_sigb,
34121
  &hf_ieee80211_he_phy_cap_nominal_packet_padding,
34122
  &hf_ieee80211_he_phy_cap_he_mu_ppdu_ru_rx_max,
34123
  &hf_ieee80211_he_phy_cap_b81_b87_reserved,
34124
  NULL
34125
};
34126
34127
static int * const he_mcs_map_80_rx_headers [] = {
34128
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_1_ss,
34129
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_2_ss,
34130
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_3_ss,
34131
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_4_ss,
34132
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_5_ss,
34133
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_6_ss,
34134
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_7_ss,
34135
  &hf_ieee80211_he_mcs_max_he_mcs_80_rx_8_ss,
34136
  NULL
34137
};
34138
34139
static int * const he_mcs_map_80_tx_headers [] = {
34140
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_1_ss,
34141
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_2_ss,
34142
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_3_ss,
34143
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_4_ss,
34144
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_5_ss,
34145
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_6_ss,
34146
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_7_ss,
34147
  &hf_ieee80211_he_mcs_max_he_mcs_80_tx_8_ss,
34148
  NULL
34149
};
34150
34151
static int * const he_mcs_map_80p80_rx_headers [] = {
34152
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_1_ss,
34153
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_2_ss,
34154
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_3_ss,
34155
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_4_ss,
34156
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_5_ss,
34157
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_6_ss,
34158
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_7_ss,
34159
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_8_ss,
34160
  NULL
34161
};
34162
34163
static int * const he_mcs_map_80p80_tx_headers [] = {
34164
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_1_ss,
34165
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_2_ss,
34166
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_3_ss,
34167
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_4_ss,
34168
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_5_ss,
34169
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_6_ss,
34170
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_7_ss,
34171
  &hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_8_ss,
34172
  NULL
34173
};
34174
34175
static int * const he_mcs_map_160_rx_headers [] = {
34176
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_1_ss,
34177
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_2_ss,
34178
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_3_ss,
34179
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_4_ss,
34180
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_5_ss,
34181
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_6_ss,
34182
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_7_ss,
34183
  &hf_ieee80211_he_mcs_max_he_mcs_160_rx_8_ss,
34184
  NULL
34185
};
34186
34187
static int * const he_mcs_map_160_tx_headers [] = {
34188
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_1_ss,
34189
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_2_ss,
34190
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_3_ss,
34191
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_4_ss,
34192
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_5_ss,
34193
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_6_ss,
34194
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_7_ss,
34195
  &hf_ieee80211_he_mcs_max_he_mcs_160_tx_8_ss,
34196
  NULL
34197
};
34198
34199
static const value_string ru_alloc_vals[] = {
34200
  { 0, "242" },
34201
  { 1, "484" },
34202
  { 2, "996" },
34203
  { 3, "2x996" },
34204
  { 0, NULL }
34205
};
34206
34207
static const value_string constellation_vals[] = {
34208
  { 0, "BPSK" },
34209
  { 1, "QPSK" },
34210
  { 2, "16-QAM" },
34211
  { 3, "64-QAM" },
34212
  { 4, "256-QAM" },
34213
  { 5, "1024-QAM" },
34214
  { 6, "Reserved" },
34215
  { 7, "None" },
34216
  { 0, NULL }
34217
};
34218
34219
106
#define HE_CHANNEL_WIDTH_SET_B2 0x04
34220
106
#define HE_CHANNEL_WIDTH_SET_B3 0x08
34221
34222
static void
34223
dissect_he_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
34224
  int offset, int len)
34225
54
{
34226
54
  int *he_mac_headers[] = {
34227
54
    &hf_ieee80211_he_htc_he_support,                           /* 0 */
34228
54
    &hf_ieee80211_he_twt_requester_support,                    /* 1 */
34229
54
    &hf_ieee80211_he_twt_responder_support,                    /* 2 */
34230
54
    &hf_ieee80211_he_dynamic_fragmentation_support,            /* 3 */
34231
54
    &hf_ieee80211_he_max_number_fragmented_msdus,              /* 4 */
34232
54
    &hf_ieee80211_he_min_fragment_size,                        /* 5 */
34233
54
    &hf_ieee80211_he_trigger_frame_mac_padding_dur,            /* 6 */
34234
54
    &hf_ieee80211_he_multi_tid_aggregation_rx_support,         /* 7 */
34235
54
    &hf_ieee80211_he_he_link_adaptation_support,               /* 8 */
34236
54
    &hf_ieee80211_he_all_ack_support,                          /* 9 */
34237
54
    &hf_ieee80211_he_trs_support,                              /* 10 */
34238
54
    &hf_ieee80211_he_bsr_support,                              /* 11 */
34239
54
    &hf_ieee80211_he_broadcast_twt_support,                    /* 12 */
34240
54
    &hf_ieee80211_he_32_bit_ba_bitmap_support,                 /* 13 */
34241
54
    &hf_ieee80211_he_mu_cascading_support,                     /* 14 */
34242
54
    &hf_ieee80211_he_ack_enabled_aggregation_support,          /* 15 */
34243
54
    &hf_ieee80211_he_reserved_b24,                             /* 16 */
34244
54
    &hf_ieee80211_he_om_control_support,                       /* 17 */
34245
54
    &hf_ieee80211_he_ofdma_ra_support,                         /* 18 */
34246
54
    &hf_ieee80211_he_max_a_mpdu_length_exponent_ext,           /* 19 */
34247
54
    &hf_ieee80211_he_a_msdu_fragmentation_support,             /* 20 */
34248
54
    &hf_ieee80211_he_flexible_twt_schedule_support,            /* 21 */
34249
54
    &hf_ieee80211_he_rx_control_frame_to_multibss,             /* 22 */
34250
54
    &hf_ieee80211_he_bsrp_bqrp_a_mpdu_aggregation,             /* 23 */
34251
54
    &hf_ieee80211_he_qtp_support,                              /* 24 */
34252
54
    &hf_ieee80211_he_bqr_support,                              /* 25 */
34253
54
    &hf_ieee80211_he_psr_responder,                            /* 26 */
34254
54
    &hf_ieee80211_he_ndp_feedback_report_support,              /* 27 */
34255
54
    &hf_ieee80211_he_ops_support,                              /* 28 */
34256
54
    &hf_ieee80211_he_a_msdu_in_a_mpdu_support,                 /* 29 */
34257
54
    &hf_ieee80211_he_multi_tid_aggregation_tx_support,         /* 30 */
34258
54
    &hf_ieee80211_he_subchannel_selective_trans_support,       /* 31 */
34259
54
    &hf_ieee80211_he_2_996_tone_ru_support,                    /* 32 */
34260
54
    &hf_ieee80211_he_om_control_ul_mu_data_disable_rx_support, /* 33 */
34261
54
    &hf_ieee80211_he_dynamic_sm_power_save,                    /* 34 */
34262
54
    &hf_ieee80211_he_punctured_sounding_support,               /* 35 */
34263
54
    &hf_ieee80211_he_ht_and_vht_trigger_frame_rx_support,      /* 36 */
34264
54
    NULL
34265
54
  };
34266
54
  int * he_phy_channel_width_set_headers[] = {
34267
54
    &hf_ieee80211_he_40mhz_channel_2_4ghz,
34268
54
    &hf_ieee80211_he_40_and_80_mhz_5ghz,
34269
54
    &hf_ieee80211_he_160_mhz_5ghz,
34270
54
    &hf_ieee80211_he_160_80_plus_80_mhz_5ghz,
34271
54
    &hf_ieee80211_he_242_tone_rus_in_2_4ghz,
34272
54
    &hf_ieee80211_he_242_tone_rus_in_5ghz,
34273
54
    &hf_ieee80211_he_chan_width_reserved,
34274
54
    NULL
34275
54
  };
34276
34277
54
  uint64_t he_mac_caps = tvb_get_letoh40(tvb, offset);
34278
54
  uint8_t phy_channel_width_set = 0;
34279
54
  proto_tree *phy_cap_tree = NULL;
34280
54
  unsigned he_mcs_and_nss_len = 4;
34281
54
  proto_tree *sup_he_mcs_and_nss_tree = NULL;
34282
54
  proto_tree *rx_tx_he_mcs_map_80 = NULL;
34283
54
  proto_tree *rx_tx_he_mcs_map_160 = NULL;
34284
54
  proto_tree *rx_tx_he_mcs_map_80_80 = NULL;
34285
34286
  /* Is this 2.4GHz or 5GHz? */
34287
54
  if (pinfo->pseudo_header->ieee_802_11.has_frequency) {
34288
0
    if (IS_2_4_GHZ(pinfo->pseudo_header->ieee_802_11.frequency)) {
34289
0
        he_phy_channel_width_set_headers[1] = &hf_ieee80211_he_24ghz_b1_reserved;
34290
0
        he_phy_channel_width_set_headers[2] = &hf_ieee80211_he_24ghz_b2_reserved;
34291
0
        he_phy_channel_width_set_headers[3] = &hf_ieee80211_he_24ghz_b3_reserved;
34292
0
        he_phy_channel_width_set_headers[5] = &hf_ieee80211_he_24ghz_b5_reserved;
34293
0
    } else {
34294
0
        he_phy_channel_width_set_headers[0] = &hf_ieee80211_he_5ghz_b0_reserved;
34295
0
        he_phy_channel_width_set_headers[4] = &hf_ieee80211_he_5ghz_b4_reserved;
34296
0
    }
34297
0
  }
34298
34299
  /* Change some header fields depending on HE_HTC_HE_SUPPORT and FRAGMENTATION */
34300
54
  if (!(he_mac_caps & HE_HTC_HE_SUPPORT)) {
34301
15
    he_mac_headers[8]  = &hf_ieee80211_he_reserved_bits_15_16;
34302
15
    he_mac_headers[10] = &hf_ieee80211_he_reserved_bit_18;
34303
15
    he_mac_headers[11] = &hf_ieee80211_he_reserved_bit_19;
34304
15
    he_mac_headers[17] = &hf_ieee80211_he_reserved_bit_25;
34305
15
    he_mac_headers[25] = &hf_ieee80211_he_reserved_bit_34;
34306
15
  }
34307
54
  if (!(he_mac_caps & HE_DYNAMIC_FRAGMENTATION_SUPPORT)) {
34308
42
    he_mac_headers[4]  = &hf_ieee80211_he_reserved_bits_5_7;
34309
42
    he_mac_headers[5]  = &hf_ieee80211_he_reserved_bits_8_9;
34310
42
    he_mac_headers[20] = &hf_ieee80211_he_reserved_bit_29;
34311
42
  }
34312
34313
54
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_he_mac_capabilities,
34314
54
                        ett_he_mac_capabilities, he_mac_headers,
34315
54
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34316
54
  offset += 6;
34317
34318
  /* Get and isolate the phy channel width set */
34319
54
  phy_channel_width_set = tvb_get_uint8(tvb, offset) >> 1;
34320
  /* Save this info so we can refer to it later. It might need to be global */
34321
54
  p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, HE_CHANNEL_WIDTH_KEY,
34322
54
                   GINT_TO_POINTER(phy_channel_width_set | (1<<31)));
34323
34324
54
  phy_cap_tree = proto_tree_add_subtree(tree, tvb, offset, 11, ett_he_phy_capabilities,
34325
54
                        NULL,
34326
54
                        "HE PHY Capabilities Information");
34327
34328
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34329
54
                        hf_ieee80211_he_phy_reserved_b0, ett_he_phy_cap_first_byte,
34330
54
                        he_phy_first_byte_headers, ENC_NA, BMT_NO_APPEND);
34331
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34332
54
                        hf_ieee80211_he_phy_chan_width_set, ett_he_phy_cap_chan_width_set,
34333
54
                        he_phy_channel_width_set_headers, ENC_NA, BMT_NO_APPEND);
34334
54
  offset++;
34335
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34336
54
                        hf_ieee80211_he_phy_b8_to_b23, ett_he_phy_cap_b8_to_b23,
34337
54
                        he_phy_b8_to_b23_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34338
54
  offset += 2;
34339
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34340
54
                        hf_ieee80211_he_phy_b24_to_b39, ett_he_phy_cap_b24_to_b39,
34341
54
                        he_phy_b24_to_b39_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34342
54
  offset += 2;
34343
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34344
54
                        hf_ieee80211_he_phy_b40_to_b55, ett_he_phy_cap_b40_to_b55,
34345
54
                        he_phy_b40_to_b55_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34346
54
  offset += 2;
34347
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34348
54
                        hf_ieee80211_he_phy_b56_to_b71, ett_he_phy_cap_b56_to_b71,
34349
54
                        he_phy_b56_to_b71_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34350
54
  offset += 2;
34351
54
  proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
34352
54
                        hf_ieee80211_he_phy_b72_to_b87, ett_he_phy_cap_b72_to_b87,
34353
54
                        he_phy_b72_to_b87_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34354
54
  offset += 2;
34355
34356
54
  if (tvb_reported_length_remaining(tvb, offset) < 2) {
34357
1
    expert_add_info_format(pinfo, phy_cap_tree, &ei_ieee80211_tag_length,
34358
1
                           "Insufficient bytes for Phy Capabilities "
34359
1
                           "Rx and Tx Maps 80MHz!");
34360
1
    return;
34361
1
  }
34362
34363
  /* Need the length first */
34364
53
  if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B2)
34365
32
    he_mcs_and_nss_len += 4;
34366
34367
53
  if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B3)
34368
31
    he_mcs_and_nss_len += 4;
34369
34370
53
  sup_he_mcs_and_nss_tree = proto_tree_add_subtree(tree, tvb, offset,
34371
53
                        he_mcs_and_nss_len, ett_he_mcs_and_nss_set, NULL,
34372
53
                        "Supported HE-MCS and NSS Set");
34373
53
  rx_tx_he_mcs_map_80 = proto_tree_add_subtree(sup_he_mcs_and_nss_tree, tvb,
34374
53
                        offset, 4, ett_he_rx_tx_he_mcs_map_lte_80, NULL,
34375
53
                        "Rx and Tx MCS Maps <= 80 MHz");
34376
53
  proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80, tvb, offset,
34377
53
                        hf_ieee80211_he_rx_he_mcs_map_lte_80,
34378
53
                        ett_he_rx_mcs_map_lte_80, he_mcs_map_80_rx_headers,
34379
53
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34380
53
  offset += 2;
34381
34382
53
  if (tvb_reported_length_remaining(tvb, offset) < 2) {
34383
0
    expert_add_info_format(pinfo, phy_cap_tree, &ei_ieee80211_tag_length,
34384
0
                           "Insufficient bytes for Phy Capabilities "
34385
0
                           "Tx Maps 80MHz!");
34386
0
    return;
34387
0
  }
34388
34389
53
  proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80, tvb, offset,
34390
53
                        hf_ieee80211_he_tx_he_mcs_map_lte_80,
34391
53
                        ett_he_tx_mcs_map_lte_80, he_mcs_map_80_tx_headers,
34392
53
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34393
53
  offset += 2;
34394
34395
53
  if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B2) {
34396
32
    if (tvb_reported_length_remaining(tvb, offset) < 2) {
34397
0
      expert_add_info_format(pinfo, phy_cap_tree, &ei_ieee80211_tag_length,
34398
0
                             "Insufficient bytes for Phy Capabilities "
34399
0
                             "Rx and Tx MCS Maps 160MHz!");
34400
0
      return;
34401
0
    }
34402
32
    rx_tx_he_mcs_map_160 = proto_tree_add_subtree(sup_he_mcs_and_nss_tree,
34403
32
                        tvb, offset, 4, ett_he_rx_tx_he_mcs_map_160, NULL,
34404
32
                        "Rx and Tx MCS Maps 160 MHz");
34405
32
    proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_160, tvb, offset,
34406
32
                        hf_ieee80211_he_rx_he_mcs_map_160,
34407
32
                        ett_he_rx_mcs_map_160, he_mcs_map_160_rx_headers,
34408
32
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34409
32
    offset += 2;
34410
34411
32
    if (tvb_reported_length_remaining(tvb, offset) < 2) {
34412
0
      expert_add_info_format(pinfo, phy_cap_tree, &ei_ieee80211_tag_length,
34413
0
                             "Insufficient bytes for Phy Capabilities "
34414
0
                             "Tx MCS Maps 160MHz!");
34415
0
      return;
34416
0
    }
34417
34418
32
    proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_160, tvb, offset,
34419
32
                        hf_ieee80211_he_tx_he_mcs_map_160,
34420
32
                        ett_he_tx_mcs_map_160, he_mcs_map_160_tx_headers,
34421
32
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34422
32
    offset += 2;
34423
32
  }
34424
34425
53
  if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B3) {
34426
31
    if (tvb_reported_length_remaining(tvb, offset) < 2) {
34427
1
      expert_add_info_format(pinfo, phy_cap_tree, &ei_ieee80211_tag_length,
34428
1
                             "Insufficient bytes for Phy Capabilities "
34429
1
                             "Rx and Tx MCS Maps 80+80 MHz!");
34430
1
      return;
34431
1
    }
34432
34433
30
    rx_tx_he_mcs_map_80_80 = proto_tree_add_subtree(sup_he_mcs_and_nss_tree,
34434
30
                        tvb, offset, 4, ett_he_rx_tx_he_mcs_map_80_80, NULL,
34435
30
                        "Rx and Tx MCS Maps 80+80 MHz");
34436
30
    proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80_80, tvb, offset,
34437
30
                        hf_ieee80211_he_rx_he_mcs_map_80_80,
34438
30
                        ett_he_rx_mcs_map_80_80, he_mcs_map_80p80_rx_headers,
34439
30
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34440
30
    offset += 2;
34441
30
    proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80_80, tvb, offset,
34442
30
                        hf_ieee80211_he_tx_he_mcs_map_80_80,
34443
30
                        ett_he_tx_mcs_map_80_80, he_mcs_map_80p80_tx_headers,
34444
30
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34445
30
    offset += 2;
34446
30
  }
34447
34448
52
  if (offset < len) {
34449
52
    uint8_t ppe_thresholds_field = tvb_get_uint8(tvb, offset);
34450
52
    uint8_t nss_count = ppe_thresholds_field & 0x07, nss_index = 0;
34451
52
    uint8_t ru_index_bitmask = (ppe_thresholds_field >> 3) & 0x0F;
34452
52
    proto_tree *ppe_tree = NULL;
34453
52
    int i = 0;
34454
52
    int bit_offset = 7;  /* How many bits we are into the bytes */
34455
34456
52
    ppe_tree = proto_tree_add_subtree(tree, tvb, offset, len - offset + 1,
34457
52
                        ett_he_ppe_threshold, NULL,
34458
52
                        "PPE Thresholds");
34459
52
    proto_tree_add_item(ppe_tree, hf_ieee80211_he_ppe_thresholds_nss, tvb, offset,
34460
52
                        1, ENC_NA);
34461
52
    proto_tree_add_item(ppe_tree, hf_ieee80211_he_ppe_thresholds_ru_index_bitmask, tvb,
34462
52
                        offset, 1, ENC_NA);
34463
34464
    /*
34465
     * Now, for each of the nss values, add a sub-tree with its thresholds.
34466
     * The actual count is one more than the number in the first three bits.
34467
     */
34468
243
    while (nss_index < nss_count + 1) {
34469
191
      int start_offset = 0;
34470
191
      proto_tree *nss_tree = NULL;
34471
191
      proto_item *nssti = NULL;
34472
191
      uint8_t l_ru_bitmask = ru_index_bitmask;
34473
34474
191
      nss_tree = proto_tree_add_subtree_format(ppe_tree, tvb, offset, -1,
34475
191
                        ett_he_ppe_nss, &nssti, "NSS %d", nss_index);
34476
191
      start_offset = offset;
34477
34478
946
      for (i = 0; i < 4; i++) {
34479
755
        if (l_ru_bitmask & 0x01) {
34480
408
          int bits_avail = 8 - bit_offset, bits_needed = 6 - bits_avail;
34481
408
          uint8_t the_bits = 0;
34482
408
          int ru_start_offset = offset;
34483
408
          proto_tree *ru_alloc_tree = NULL;
34484
408
          proto_item *rualti = NULL;
34485
34486
408
          ru_alloc_tree = proto_tree_add_subtree_format(nss_tree, tvb, offset,
34487
408
                                        -1, ett_he_ppe_ru_alloc, &rualti,
34488
408
                                        "RU allocation: %s",
34489
408
                                        val_to_str_const(i, ru_alloc_vals, "Unk"));
34490
34491
          /*
34492
           * Assemble the bits we require ... we need 6, or 2x3
34493
           */
34494
408
          if (bits_avail >= 6) { /* We can use the current byte */
34495
87
            the_bits = (tvb_get_uint8(tvb, offset) >> bit_offset) & 0x3F;
34496
321
          } else { /* We need two adjacent bytes */
34497
321
            the_bits = (tvb_get_uint8(tvb, offset) >> bit_offset);
34498
321
            offset++;
34499
321
            the_bits = the_bits |
34500
321
                        ((tvb_get_uint8(tvb, offset) &
34501
321
                                ((1 << bits_needed) - 1)) << bits_avail);
34502
321
          }
34503
          /*
34504
           * Now we have two three bit fields, use them.
34505
           */
34506
408
          proto_tree_add_uint(ru_alloc_tree, hf_ieee80211_he_ppe_ppet16, tvb, ru_start_offset,
34507
408
                              offset - ru_start_offset + 1, the_bits & 0x07);
34508
408
          proto_tree_add_uint(ru_alloc_tree, hf_ieee80211_he_ppe_ppet8, tvb, ru_start_offset,
34509
408
                              offset - ru_start_offset + 1, the_bits >> 3);
34510
34511
408
          bit_offset = (bit_offset + 6) % 8;
34512
408
          proto_item_set_len(rualti, offset - ru_start_offset + 1);
34513
408
        }
34514
755
        l_ru_bitmask = l_ru_bitmask >> 1;
34515
755
      }
34516
34517
34518
191
      proto_item_set_len(nssti, offset - start_offset);
34519
191
      nss_index++;
34520
191
    }
34521
52
  }
34522
34523
  /* Add an Expert Info about extra bytes ... */
34524
34525
52
}
34526
34527
static int * const he_operation_headers[] = {
34528
  &hf_ieee80211_he_operation_default_pe_duration,
34529
  &hf_ieee80211_he_operation_twt_required,
34530
  &hf_ieee80211_he_operation_txop_duration_rts_threshold,
34531
  &hf_ieee80211_he_operation_vht_operation_information_present,
34532
  &hf_ieee80211_he_operation_co_hosted_bss,
34533
  &hf_ieee80211_he_operation_er_su_disable,
34534
  &hf_ieee80211_he_operation_6ghz_operation_information_present,
34535
  &hf_ieee80211_he_operation_reserved_b16_b23,
34536
  NULL
34537
};
34538
34539
static int * const he_bss_color_info_headers[] = {
34540
  &hf_ieee80211_he_bss_color_info_bss_color,
34541
  &hf_ieee80211_he_bss_color_partial_bss_color,
34542
  &hf_ieee80211_he_bss_color_bss_color_disabled,
34543
  NULL
34544
};
34545
34546
static int * const he_operation_6ghz_control[] = {
34547
  &hf_ieee80211_he_operation_6ghz_control_channel_width,
34548
  &hf_ieee80211_he_operation_6ghz_control_duplicate_beacon,
34549
  &hf_ieee80211_he_operation_6ghz_control_regulatory_info,
34550
  &hf_ieee80211_he_operation_6ghz_control_reserved,
34551
  NULL
34552
};
34553
34554
static const value_string he_mcs_map_vals[] = {
34555
  { 0, "Support for HE-MCS 0-7" },
34556
  { 1, "Support for HE-MCS 0-9" },
34557
  { 2, "Support for HE-MCS 0-11" },
34558
  { 3, "Not supported for HE PPDUs" },
34559
  { 0, NULL }
34560
};
34561
34562
static int * const he_basic_he_mcs_header[] = {
34563
  &hf_ieee80211_he_oper_max_he_mcs_for_1_ss,
34564
  &hf_ieee80211_he_oper_max_he_mcs_for_2_ss,
34565
  &hf_ieee80211_he_oper_max_he_mcs_for_3_ss,
34566
  &hf_ieee80211_he_oper_max_he_mcs_for_4_ss,
34567
  &hf_ieee80211_he_oper_max_he_mcs_for_5_ss,
34568
  &hf_ieee80211_he_oper_max_he_mcs_for_6_ss,
34569
  &hf_ieee80211_he_oper_max_he_mcs_for_7_ss,
34570
  &hf_ieee80211_he_oper_max_he_mcs_for_8_ss,
34571
  NULL
34572
};
34573
34574
18
#define VHT_OPERATION_INFORMATION_PRESENT    0x004000
34575
18
#define CO_HOSTED_BSS                        0x008000
34576
18
#define SIXGHZ_OPERATION_INFORMATION_PRESENT 0x020000
34577
34578
static const value_string channel_width_vals[] = {
34579
  { 0, "20 MHz or 40 MHz BSS Bandwidth" },
34580
  { 1, "80 MHz, 160 MHz or 80+80 MHz BSS Bandwidth" },
34581
  { 2, "160 MHz BSS Bandwidth (deprecated)" },
34582
  { 3, "Non-contiguous 80+80 MHz BSS Bandwidth (deprecated)" },
34583
  { 0, NULL }
34584
};
34585
34586
static void
34587
dissect_he_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
34588
  int offset, int len _U_)
34589
18
{
34590
18
    uint32_t op_params = tvb_get_letoh24(tvb, offset);
34591
34592
18
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
34593
18
                        hf_ieee80211_he_operation_parameter, ett_he_operation_params,
34594
18
                        he_operation_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34595
18
    offset += 3;
34596
34597
18
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
34598
18
                        hf_ieee80211_he_bss_color_information, ett_he_bss_color_information,
34599
18
                        he_bss_color_info_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34600
18
    offset += 1;
34601
34602
18
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
34603
18
                        hf_ieee80211_he_operation_basic_mcs, ett_he_oper_basic_mcs,
34604
18
                        he_basic_he_mcs_header, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34605
18
    offset += 2;
34606
34607
18
    if (op_params & VHT_OPERATION_INFORMATION_PRESENT) {
34608
12
      proto_tree *vht_op_info = NULL;
34609
34610
12
      vht_op_info = proto_tree_add_subtree(tree, tvb, offset, 3,
34611
12
                        ett_he_operation_vht_op_info, NULL,
34612
12
                        "VHT Operation Information");
34613
12
      proto_tree_add_item(vht_op_info, hf_ieee80211_he_operation_channel_width, tvb,
34614
12
                        offset, 1, ENC_NA);
34615
12
      offset++;
34616
34617
12
      proto_tree_add_item(vht_op_info, hf_ieee80211_he_operation_channel_center_freq_0,
34618
12
                        tvb, offset, 1, ENC_NA);
34619
12
      offset++;
34620
34621
12
      proto_tree_add_item(vht_op_info, hf_ieee80211_he_operation_channel_center_freq_1,
34622
12
                        tvb, offset, 1, ENC_NA);
34623
12
      offset++;
34624
12
    }
34625
34626
18
    if (op_params & CO_HOSTED_BSS) {
34627
13
      proto_tree_add_item(tree, hf_ieee80211_he_operation_max_co_hosted_bssid_indicator,
34628
13
                        tvb, offset, 1, ENC_NA);
34629
13
      offset++;
34630
13
    }
34631
34632
18
    if (op_params & SIXGHZ_OPERATION_INFORMATION_PRESENT) {
34633
13
      proto_tree *sixghz_tree = NULL;
34634
34635
13
      sixghz_tree = proto_tree_add_subtree(tree, tvb, offset, 5,
34636
13
                        ett_he_operation_6ghz, NULL,
34637
13
                        "6 GHz Operation Information");
34638
13
      proto_tree_add_item(sixghz_tree, hf_ieee80211_he_operation_6ghz_primary_channel, tvb,
34639
13
                          offset, 1, ENC_NA);
34640
13
      offset++;
34641
34642
13
      proto_tree_add_bitmask_with_flags(sixghz_tree, tvb, offset,
34643
13
                          hf_ieee80211_he_operation_6ghz_control, ett_he_operation_6ghz_control,
34644
13
                          he_operation_6ghz_control, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34645
13
      offset++;
34646
34647
13
      proto_tree_add_item(sixghz_tree, hf_ieee80211_he_operation_6ghz_channel_center_freq_0,
34648
13
                          tvb, offset, 1, ENC_NA);
34649
13
      offset++;
34650
34651
13
      proto_tree_add_item(sixghz_tree, hf_ieee80211_he_operation_6ghz_channel_center_freq_1,
34652
13
                          tvb, offset, 1, ENC_NA);
34653
13
      offset++;
34654
34655
13
      proto_tree_add_item(sixghz_tree, hf_ieee80211_he_operation_6ghz_minimum_rate,
34656
13
                          tvb, offset, 1, ENC_NA);
34657
13
      offset++;
34658
13
    }
34659
18
}
34660
34661
static int * const uora_headers[] = {
34662
  &hf_ieee80211_he_uora_eocwmin,
34663
  &hf_ieee80211_he_uora_owcwmax,
34664
  &hf_ieee80211_he_uora_reserved,
34665
  NULL
34666
};
34667
34668
static void
34669
dissect_uora_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
34670
  int offset)
34671
6
{
34672
6
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
34673
6
                        hf_ieee80211_he_uora_field, ett_he_uora_tree, uora_headers,
34674
6
                        ENC_NA, BMT_NO_APPEND);
34675
6
  offset++;
34676
6
}
34677
34678
static int * const muac_aci_aifsn_headers[] = {
34679
  &hf_ieee80211_he_muac_aifsn,
34680
  &hf_ieee80211_he_muac_acm,
34681
  &hf_ieee80211_he_muac_aci,
34682
  &hf_ieee80211_he_muac_reserved,
34683
  NULL
34684
};
34685
34686
static int
34687
dissect_muac_param_record(tvbuff_t *tvb, proto_tree *tree, int offset)
34688
21
{
34689
21
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
34690
21
                        hf_ieee80211_he_muac_aci_aifsn, ett_he_aic_aifsn,
34691
21
                        muac_aci_aifsn_headers, ENC_NA, BMT_NO_APPEND);
34692
21
  offset++;
34693
34694
21
  proto_tree_add_item(tree, hf_ieee80211_he_muac_ecwmin_ecwmax, tvb, offset, 1, ENC_NA);
34695
21
  offset++;
34696
34697
21
  proto_tree_add_item(tree, hf_ieee80211_he_mu_edca_timer, tvb, offset, 1, ENC_NA);
34698
21
  offset++;
34699
34700
21
  return offset;
34701
21
}
34702
34703
static int
34704
dissect_mu_edca_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
34705
  int offset, int len _U_)
34706
6
{
34707
6
  proto_tree *param_tree = NULL;
34708
34709
  /* Is this from an AP or an STA? */
34710
6
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_qos_info_ap,
34711
6
                                    ett_ff_qos_info, ieee80211_ff_qos_info_ap_fields,
34712
6
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34713
6
  offset++;
34714
34715
6
  param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
34716
6
                        NULL, "MUAC_BE Parameter Record");
34717
6
  offset = dissect_muac_param_record(tvb, param_tree, offset);
34718
34719
6
  param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
34720
6
                        NULL, "MUAC_BK Parameter Record");
34721
6
  offset = dissect_muac_param_record(tvb, param_tree, offset);
34722
34723
6
  param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
34724
6
                        NULL, "MUAC_VI Parameter Record");
34725
6
  offset = dissect_muac_param_record(tvb, param_tree, offset);
34726
34727
6
  param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
34728
6
                        NULL, "MUAC_VO Parameter Record");
34729
6
  offset = dissect_muac_param_record(tvb, param_tree, offset);
34730
34731
6
  return offset;
34732
6
}
34733
34734
#define SRP_DISALLOWED                     0x01
34735
#define NON_SRG_OBSS_PD_SR_DISALLOWED      0x02
34736
12
#define NON_SRG_OFFSET_PRESENT             0x04
34737
12
#define SRG_INFORMATION_PRESENT            0x08
34738
#define HESIGA_SPATIAL_REUSE_VAL15_ALLOWED 0x10
34739
34740
static int * const sr_control_field_headers[] = {
34741
  &hf_ieee80211_he_srp_disallowed,
34742
  &hf_ieee80211_he_non_srg_obss_pd_sr_disallowed,
34743
  &hf_ieee80211_he_non_srg_offset_present,
34744
  &hf_ieee80211_he_srg_information_present,
34745
  &hf_ieee80211_he_hesiga_spatial_reuse_value15_allowed,
34746
  &hf_ieee80211_he_sr_control_reserved,
34747
  NULL
34748
};
34749
34750
static int
34751
dissect_spatial_reuse_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_,
34752
  proto_tree *tree, int offset, int len _U_)
34753
12
{
34754
12
  uint8_t sr_control = tvb_get_uint8(tvb, offset);
34755
34756
12
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_he_spatial_reuse_sr_control,
34757
12
                                    ett_he_spatial_reuse_control,
34758
12
                                    sr_control_field_headers,
34759
12
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34760
12
  offset++;
34761
34762
12
  if (sr_control & NON_SRG_OFFSET_PRESENT) {
34763
4
    proto_tree_add_item(tree, hf_ieee80211_he_spatial_non_srg_obss_pd_max_offset,
34764
4
                        tvb, offset, 1, ENC_NA);
34765
4
    offset++;
34766
4
  }
34767
34768
12
  if (sr_control & SRG_INFORMATION_PRESENT) {
34769
4
    proto_tree_add_item(tree, hf_ieee80211_he_spatial_srg_obss_pd_min_offset, tvb,
34770
4
                        offset, 1, ENC_NA);
34771
4
    offset++;
34772
4
    proto_tree_add_item(tree, hf_ieee80211_he_spatial_srg_obss_pd_max_offset, tvb,
34773
4
                        offset, 1, ENC_NA);
34774
4
    offset++;
34775
4
    proto_tree_add_item(tree, hf_ieee80211_he_spatial_srg_bss_color_bitmap, tvb,
34776
4
                        offset, 8, ENC_NA);
34777
4
    offset += 8;
34778
4
    proto_tree_add_item(tree, hf_ieee80211_he_spatial_srg_partial_bssid_bitmap,
34779
4
                        tvb, offset, 8, ENC_NA);
34780
4
    offset += 8;
34781
4
  }
34782
34783
12
  return offset;
34784
12
}
34785
34786
static void
34787
dissect_ndp_feedback_report_set(tvbuff_t *tvb, packet_info *pinfo _U_,
34788
  proto_tree *tree, int offset, int len _U_)
34789
4
{
34790
4
  proto_tree_add_item(tree, hf_ieee80211_he_resource_request_buffer_thresh, tvb, offset,
34791
4
                        1, ENC_NA);
34792
4
}
34793
34794
static int * const bss_new_color_headers[] = {
34795
  &hf_ieee80211_he_new_bss_color_info_color,
34796
  &hf_ieee80211_he_new_bss_color_info_reserved,
34797
  NULL
34798
};
34799
34800
static void
34801
dissect_bss_color_change(tvbuff_t *tvb, packet_info *pinfo _U_,
34802
  proto_tree *tree, int offset, int len _U_)
34803
9
{
34804
9
  proto_tree_add_item(tree, hf_ieee80211_he_bss_color_change_switch_countdown, tvb, offset,
34805
9
                        1, ENC_NA);
34806
9
  offset++;
34807
34808
9
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
34809
9
                                hf_ieee80211_he_bss_color_change_new_color_info,
34810
9
                                ett_he_bss_new_color_info, bss_new_color_headers,
34811
9
                                ENC_NA, BMT_NO_APPEND);
34812
9
}
34813
34814
static int * const ess_info_field_headers[] = {
34815
  &hf_ieee80211_he_ess_report_planned_ess,
34816
  &hf_ieee80211_he_ess_report_edge_of_ess,
34817
  NULL
34818
};
34819
34820
static void
34821
dissect_ess_report(tvbuff_t *tvb, packet_info *pinfo _U_,
34822
  proto_tree *tree, int offset, int len _U_)
34823
4
{
34824
4
  uint8_t bss_trans_thresh = tvb_get_uint8(tvb, offset) >> 2;
34825
34826
34827
4
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_he_ess_report_info_field,
34828
4
                                    ett_he_ess_report_info_field,
34829
4
                                    ess_info_field_headers,
34830
4
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
34831
4
  if (bss_trans_thresh == 63)
34832
2
    proto_tree_add_int_format(tree, hf_ieee80211_he_ess_report_recommend_transition_thresh,
34833
2
                        tvb, offset, 1, bss_trans_thresh,
34834
2
                        "Recommended BSS Transition Threshold: %d (No recommendation)",
34835
2
                        bss_trans_thresh);
34836
2
  else
34837
2
    proto_tree_add_int_format(tree, hf_ieee80211_he_ess_report_recommend_transition_thresh, tvb,
34838
2
                        offset, 1, bss_trans_thresh,
34839
2
                        "Recommended BSS Transition Threshold: %d (%ddBm)",
34840
2
                        bss_trans_thresh, -100 + bss_trans_thresh);
34841
4
}
34842
34843
static void
34844
dissect_ops(tvbuff_t *tvb, packet_info *pinfo _U_,
34845
  proto_tree *tree, int offset, int len _U_)
34846
7
{
34847
7
  proto_tree_add_item(tree, hf_ieee80211_he_ops_duration, tvb, offset, 1,
34848
7
                      ENC_NA);
34849
7
}
34850
34851
static void
34852
dissect_max_channel_switch_time(tvbuff_t *tvb, packet_info *pinfo _U_,
34853
  proto_tree *tree, int offset, int len _U_)
34854
6
{
34855
6
  proto_tree_add_item(tree, hf_ieee80211_max_channel_switch_time, tvb, offset,
34856
6
                      3, ENC_LITTLE_ENDIAN);
34857
6
}
34858
34859
static void
34860
dissect_oci(tvbuff_t *tvb, packet_info *pinfo _U_,
34861
  proto_tree *tree, int offset, int len _U_)
34862
8
{
34863
8
  proto_tree_add_item(tree, hf_ieee80211_oci_operating_class, tvb, offset,
34864
8
                      1, ENC_NA);
34865
8
  offset += 1;
34866
34867
8
  proto_tree_add_item(tree, hf_ieee80211_oci_primary_channel_number, tvb,
34868
8
                      offset, 1, ENC_NA);
34869
8
  offset += 1;
34870
34871
8
  proto_tree_add_item(tree, hf_ieee80211_oci_frequency_segment_1, tvb,
34872
8
                      offset, 1, ENC_NA);
34873
8
  offset += 1;
34874
34875
  /* Does it have the OCT fields? */
34876
8
  if (len > 3) {
34877
7
    if (len != 6) {
34878
7
      expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
34879
7
                             "OCI element with OCT field length must be 6 bytes");
34880
7
    }
34881
34882
7
    proto_tree_add_item(tree, hf_ieee80211_oci_oct_operating_class, tvb,
34883
7
                        offset, 1, ENC_NA);
34884
7
    offset += 1;
34885
34886
7
    proto_tree_add_item(tree, hf_ieee80211_oci_oct_primary_channel_number, tvb,
34887
7
                        offset, 1, ENC_NA);
34888
7
    offset += 1;
34889
34890
7
    proto_tree_add_item(tree, hf_ieee80211_oci_oct_frequency_segment_1, tvb,
34891
7
                        offset, 1, ENC_NA);
34892
7
  }
34893
8
}
34894
34895
static void
34896
dissect_multiple_bssid_configuration(tvbuff_t *tvb, packet_info *pinfo _U_,
34897
  proto_tree *tree, int offset, int len _U_)
34898
4
{
34899
34900
4
  proto_tree_add_item(tree, hf_ieee80211_multiple_bssid_configuration_bssid_count, tvb, offset, 1, ENC_NA);
34901
4
  offset += 1;
34902
34903
4
  proto_tree_add_item(tree, hf_ieee80211_multiple_bssid_configuration_full_set_rx_periodicity, tvb, offset, 1, ENC_NA);
34904
  /*offset += 1;*/
34905
34906
4
}
34907
34908
static void
34909
dissect_non_inheritance(tvbuff_t *tvb, packet_info *pinfo _U_,
34910
  proto_tree *tree, int offset, int len _U_)
34911
28
{
34912
28
  proto_tree *element_id_list = NULL;
34913
28
  proto_tree *element_id_ext_list = NULL;
34914
34915
28
  uint8_t element_id_list_length = tvb_get_uint8(tvb, offset);
34916
34917
28
  element_id_list = proto_tree_add_subtree(tree, tvb, offset, element_id_list_length + 1,
34918
28
                                           ett_non_inheritance_element_id_list,
34919
28
                                           NULL, "Element ID List");
34920
34921
28
  proto_tree_add_item(element_id_list, hf_ieee80211_non_inheritance_element_id_list_length,
34922
28
    tvb, offset, 1, ENC_NA);
34923
28
  offset += 1;
34924
34925
1.38k
  while (element_id_list_length > 0) {
34926
1.35k
    proto_tree_add_item(element_id_list, hf_ieee80211_non_inheritance_element_id_list_element_id,
34927
1.35k
      tvb, offset, 1, ENC_NA);
34928
1.35k
    element_id_list_length--;
34929
1.35k
    offset++;
34930
1.35k
  }
34931
34932
28
  uint8_t element_id_ext_list_length = tvb_get_uint8(tvb, offset);
34933
34934
28
  element_id_ext_list = proto_tree_add_subtree(tree, tvb, offset, element_id_ext_list_length + 1,
34935
28
                                           ett_non_inheritance_element_id_ext_list,
34936
28
                                           NULL, "Element ID Extension List");
34937
34938
28
  proto_tree_add_item(element_id_ext_list, hf_ieee80211_non_inheritance_element_id_ext_list_length,
34939
28
    tvb, offset, 1, ENC_NA);
34940
28
  offset += 1;
34941
34942
743
  while (element_id_ext_list_length > 0) {
34943
715
    proto_tree_add_item(element_id_ext_list, hf_ieee80211_non_inheritance_element_id_ext_list_element_id_ext,
34944
715
      tvb, offset, 1, ENC_NA);
34945
715
    element_id_ext_list_length--;
34946
715
    offset++;
34947
715
  }
34948
28
}
34949
34950
static void
34951
dissect_known_bssid(tvbuff_t *tvb, packet_info *pinfo _U_,
34952
  proto_tree *tree, int offset, int len)
34953
2
{
34954
34955
2
  proto_tree_add_item(tree, hf_ieee80211_known_bssid_bitmap, tvb, offset, len, ENC_NA);
34956
34957
2
}
34958
34959
static void
34960
dissect_short_ssid(tvbuff_t *tvb, packet_info *pinfo _U_,
34961
  proto_tree *tree, int offset, int len _U_)
34962
14
{
34963
34964
238
  while(len > 0){
34965
34966
224
    proto_tree_add_item(tree, hf_ieee80211_short_ssid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
34967
224
    offset += 4;
34968
224
    len -=4;
34969
224
  }
34970
14
}
34971
34972
static int
34973
dissect_password_identifier(tvbuff_t *tvb, packet_info *pinfo _U_,
34974
  proto_tree *tree, int offset, int len _U_)
34975
19
{
34976
19
  proto_tree_add_item(tree, hf_ieee80211_sae_password_identifier, tvb, offset,
34977
19
                      len, ENC_ASCII);
34978
19
  offset += len;
34979
34980
19
  return offset;
34981
19
}
34982
34983
104
#define SCS_ADD    0
34984
12
#define SCS_REMOVE 1
34985
38
#define SCS_CHANGE 2
34986
34987
static const range_string scs_request_type_rvals[] = {
34988
  { SCS_ADD,    SCS_ADD,      "Add" },
34989
  { SCS_REMOVE, SCS_REMOVE,   "Remove" },
34990
  { SCS_CHANGE, SCS_CHANGE,   "Change" },
34991
  { 3,          255, "Reserved" },
34992
  { 0,          0, NULL }
34993
};
34994
34995
static int * const user_prio_bitmap_headers[] = {
34996
  &hf_ieee80211_user_prio_bitmap_bit0,
34997
  &hf_ieee80211_user_prio_bitmap_bit1,
34998
  &hf_ieee80211_user_prio_bitmap_bit2,
34999
  &hf_ieee80211_user_prio_bitmap_bit3,
35000
  &hf_ieee80211_user_prio_bitmap_bit4,
35001
  &hf_ieee80211_user_prio_bitmap_bit5,
35002
  &hf_ieee80211_user_prio_bitmap_bit6,
35003
  &hf_ieee80211_user_prio_bitmap_bit7,
35004
  NULL
35005
};
35006
35007
static void
35008
dissect_mscs_descriptor_element(tvbuff_t *tvb, packet_info *pinfo _U_,
35009
  proto_tree *tree, int offset, int len _U_)
35010
6
{
35011
6
  uint8_t request_type = tvb_get_uint8(tvb, offset);
35012
35013
6
  proto_tree_add_item(tree, hf_ieee80211_mscs_descriptor_type, tvb, offset, 1,
35014
6
                      ENC_NA);
35015
6
  offset += 1;
35016
35017
6
  if (request_type == SCS_REMOVE) {
35018
0
    proto_tree_add_item(tree, hf_ieee80211_mscs_user_prio_control_reserved,
35019
0
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
35020
0
    offset += 2;
35021
6
  } else {
35022
6
    proto_tree *user_prio_tree = NULL;
35023
35024
6
    user_prio_tree = proto_tree_add_subtree(tree, tvb, offset, 2,
35025
6
                                            ett_mscs_user_prio, NULL,
35026
6
                                            "User Priority Control");
35027
6
    proto_tree_add_bitmask_with_flags(user_prio_tree, tvb, offset,
35028
6
                                      hf_ieee80211_user_prio_bitmap,
35029
6
                                      ett_ieee80211_user_prio_bitmap,
35030
6
                                      user_prio_bitmap_headers,
35031
6
                                      ENC_NA, BMT_NO_APPEND);
35032
6
    offset += 1;
35033
35034
6
    proto_tree_add_item(user_prio_tree, hf_ieee80211_user_prio_limit, tvb,
35035
6
                        offset, 1, ENC_NA);
35036
6
    proto_tree_add_item(user_prio_tree, hf_ieee80211_user_prio_reserved, tvb,
35037
6
                        offset, 1, ENC_NA);
35038
6
    offset += 1;
35039
6
  }
35040
35041
6
  if (request_type == SCS_REMOVE) {
35042
0
    proto_tree_add_item(tree, hf_ieee80211_stream_timeout_reserved, tvb,
35043
0
                        offset, 4, ENC_LITTLE_ENDIAN);
35044
6
  } else {
35045
6
    proto_tree_add_item(tree, hf_ieee80211_stream_timeout, tvb,
35046
6
                        offset, 4, ENC_LITTLE_ENDIAN);
35047
6
  }
35048
6
  offset += 4;
35049
35050
  /*
35051
   * If there is nothing more in the TVB we are done.
35052
   */
35053
6
  if (tvb_reported_length_remaining(tvb, offset) == 0)
35054
1
    return;
35055
35056
  /*
35057
   * There may be tclas elements following and optional MSCS elements.
35058
   * A TCLAS Mask element will start with 0xFF <len> 0x89
35059
   */
35060
6
  while (tvb_reported_length_remaining(tvb, offset) &&
35061
6
         tvb_get_uint8(tvb, offset) == 0xFF) {
35062
1
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
35063
1
  }
35064
35065
  /*
35066
   * Any optional MSCS elements come next. Should be 1 byte ID, 1 byte len
35067
   * and len bytes.
35068
   */
35069
5
  if (offset < len) {
35070
4
    uint8_t sub_elt_len;
35071
35072
4
    proto_tree_add_item(tree, hf_ieee80211_mscs_subelement_id, tvb, offset, 1,
35073
4
                        ENC_NA);
35074
4
    offset += 1;
35075
35076
4
    sub_elt_len = tvb_get_uint8(tvb, offset);
35077
4
    proto_tree_add_item(tree, hf_ieee80211_mscs_subelement_len, tvb, offset, 1,
35078
4
                        ENC_NA);
35079
4
    offset += 1;
35080
35081
4
    proto_tree_add_item(tree, hf_ieee80211_mscs_subelement_data, tvb, offset,
35082
4
                        sub_elt_len, ENC_NA);
35083
4
  }
35084
5
}
35085
35086
static void
35087
dissect_tclas_mask_element(tvbuff_t *tvb, packet_info *pinfo _U_,
35088
                           proto_tree *tree, int offset, int len _U_)
35089
5
{
35090
5
  ieee80211_frame_classifier(tvb, pinfo, tree, offset, len);
35091
5
}
35092
35093
static int * const intra_access_prio_headers[] = {
35094
  &hf_ieee80211_intra_access_prio_user_prio,
35095
  &hf_ieee80211_intra_access_prio_alt_queue,
35096
  &hf_ieee80211_intra_access_prio_drop_elig,
35097
  &hf_ieee80211_intra_access_prio_reserved,
35098
  NULL
35099
};
35100
35101
static int
35102
ieee80211_tag_intra_access_cat_prio(tvbuff_t *tvb, packet_info *pinfo,
35103
                                    proto_tree *tree, void *data)
35104
30
{
35105
30
  int tag_len = tvb_reported_length(tvb);
35106
30
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t *)data;
35107
30
  int offset = 0;
35108
35109
30
  if (tag_len != 1) {
35110
28
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
35111
28
    return tvb_captured_length(tvb);
35112
28
  }
35113
35114
2
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35115
2
                                    hf_ieee80211_intra_access_prio,
35116
2
                                    ett_ieee80211_intra_access_prio,
35117
2
                                    intra_access_prio_headers,
35118
2
                                    ENC_NA, BMT_NO_APPEND);
35119
35120
2
  return tvb_captured_length(tvb);
35121
30
}
35122
35123
static int
35124
ieee80211_tag_scs_descriptor(tvbuff_t *tvb, packet_info *pinfo,
35125
                             proto_tree *tree, void *data _U_)
35126
52
{
35127
52
  int offset = 0;
35128
52
  uint8_t request_type = tvb_get_uint8(tvb, offset + 1);
35129
35130
52
  proto_tree_add_item(tree, hf_ieee80211_scs_descriptor_scsid, tvb, offset, 1,
35131
52
                      ENC_NA);
35132
52
  offset += 1;
35133
35134
52
  proto_tree_add_item(tree, hf_ieee80211_scs_descriptor_type, tvb, offset, 1,
35135
52
                      ENC_NA);
35136
52
  offset += 1;
35137
35138
52
  if (request_type == SCS_ADD || request_type == SCS_CHANGE) {
35139
    /* There will only be one intra access priority */
35140
20
    offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
35141
35142
    /* There will be at least one tclass element ... */
35143
27
    while ((tvb_captured_length_remaining(tvb, offset) > 0) &&
35144
27
           tvb_get_uint8(tvb, offset) == TAG_TCLAS) {
35145
7
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
35146
7
    }
35147
    /* There could be a TCLAS PROCESS element ... */
35148
20
    if ((tvb_captured_length_remaining(tvb, offset) > 0) &&
35149
20
        tvb_get_uint8(tvb, offset) == TAG_TCLAS_PROCESS) {
35150
0
      add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
35151
0
    }
35152
35153
    /* There could be one QoS Char element ... */
35154
20
    if ((tvb_captured_length_remaining(tvb, offset) > 0) &&
35155
20
        tvb_get_uint8(tvb, offset) == TAG_ELEMENT_ID_EXTENSION &&
35156
20
        tvb_get_uint8(tvb, offset+2) == ETAG_QOS_CHARACTERISTICS) {
35157
0
      offset += add_tagged_field(pinfo, tree, tvb, offset, 0, NULL, 0, NULL);
35158
0
    }
35159
35160
    /* There can be zero or one TSPEC elements */
35161
20
    if (tvb_captured_length_remaining(tvb, offset) > 0) {
35162
13
      static const uint8_t ids[] = { TAG_TSPEC };
35163
13
      if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
35164
        /* Add an expert info */
35165
0
      }
35166
13
    }
35167
35168
20
  }
35169
35170
  /* There could be Optional subelements here too ... */
35171
35172
52
  return tvb_captured_length(tvb);
35173
52
}
35174
35175
/*
35176
 * Just a list of finite cyclic group numbers as 16-bit uints.
35177
 */
35178
static void
35179
dissect_rejected_groups(tvbuff_t *tvb, packet_info *pinfo _U_,
35180
                         proto_tree *tree, int offset, int len _U_)
35181
11
{
35182
349
  while (tvb_reported_length_remaining(tvb, offset)) {
35183
338
    proto_tree_add_item(tree, hf_ieee80211_rejected_groups_group, tvb, offset,
35184
338
                        2, ENC_LITTLE_ENDIAN);
35185
338
    offset += 2;
35186
338
  }
35187
11
}
35188
35189
/*
35190
 * Just a string of bytes
35191
 */
35192
static void
35193
dissect_anti_clogging_token(tvbuff_t *tvb, packet_info *pinfo _U_,
35194
                            proto_tree *tree, int offset, int len)
35195
9
{
35196
9
  proto_tree_add_item(tree, hf_ieee80211_sae_anti_clogging_token, tvb, offset,
35197
9
                      len, ENC_NA);
35198
9
}
35199
35200
/*
35201
 * There will be from 1 to 4 24-bit fields in the order of AC=BK, AC=BE,
35202
 * AC=VI and AC=VO.
35203
 */
35204
35205
static int * const esp_headers[] = {
35206
  &hf_ieee80211_esp_access_category,
35207
  &hf_ieee80211_esp_reserved,
35208
  &hf_ieee80211_esp_data_format,
35209
  &hf_ieee80211_esp_ba_windows_size,
35210
  &hf_ieee80211_esp_est_air_time_frac,
35211
  &hf_ieee80211_esp_data_ppdu_duration_target,
35212
  NULL
35213
};
35214
35215
static const value_string esp_access_category_vals[] = {
35216
  { 0, "AC=BK" },
35217
  { 1, "AC=BE" },
35218
  { 2, "AC=VI" },
35219
  { 3, "AC=VO" },
35220
  { 0, NULL }
35221
};
35222
35223
static const value_string esp_data_format_vals[] = {
35224
  { 0, "No aggregation is expected to be performed" },
35225
  { 1, "A-MSDU aggregation is expected but not A-MPDUs when type is data" },
35226
  { 2, "A-MSDU aggregation is NOT expected but A-MPDUs aggregation is when type is data" },
35227
  { 3, "A-MSDU aggregation is expected and A-MPDU aggregation is when type is data" },
35228
  { 0, NULL }
35229
};
35230
35231
static const value_string esp_ba_window_size_vals[] = {
35232
  { 0, "Block Ack not expected to be used" },
35233
  { 1, "2" },
35234
  { 2, "4" },
35235
  { 3, "6" },
35236
  { 4, "8" },
35237
  { 5, "16" },
35238
  { 6, "32" },
35239
  { 7, "64" },
35240
  { 0, NULL }
35241
};
35242
35243
static int
35244
dissect_estimated_service_params(tvbuff_t *tvb, packet_info *pinfo _U_,
35245
  proto_tree *tree, int offset, int len)
35246
21
{
35247
359
  while (len > 0) {
35248
338
    proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35249
338
                        hf_ieee80211_estimated_service_params, ett_ieee80211_esp,
35250
338
                        esp_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
35251
338
    offset += 3;
35252
338
    len -= 3;
35253
338
  }
35254
35255
21
  return offset;
35256
21
}
35257
35258
static int
35259
dissect_future_channel_guidance(tvbuff_t *tvb, packet_info *pinfo _U_,
35260
  proto_tree *tree, int offset, int len _U_)
35261
27
{
35262
27
  proto_tree_add_item(tree, hf_ieee80211_fcg_new_channel_number, tvb, offset,
35263
27
                        4, ENC_LITTLE_ENDIAN);
35264
27
  offset += 4;
35265
35266
27
  if (len - 4 > 0) {
35267
24
    proto_tree_add_item(tree, hf_ieee80211_fcg_extra_info, tvb, offset, len - 4,
35268
24
                        ENC_NA);
35269
24
    offset += len - 4;
35270
24
  }
35271
35272
27
  return offset;
35273
27
}
35274
35275
/* IANA, "Transform Type 4 - Diffie-Hellman Group Transform IDs" */
35276
static const value_string owe_dh_parameter_group_vals[] = {
35277
  { 0, "None" },
35278
  { 1, "768-bit MODP Group" },
35279
  { 2, "1024-bit MODP Group" },
35280
  { 5, "1536-bit MODP Group" },
35281
  { 14, "2048-bit MODP Group"},
35282
  { 15, "3072-bit MODP Group"},
35283
  { 16, "4096-bit MODP Group"},
35284
  { 17, "6144-bit MODP Group"},
35285
  { 18, "8192-bit MODP Group"},
35286
  { 19, "256-bit random ECP group"},
35287
  { 20, "384-bit random ECP group"},
35288
  { 21, "521-bit random ECP group"},
35289
  { 22, "1024-bit MODP Group with 160-bit Prime Order Subgroup"},
35290
  { 23, "2048-bit MODP Group with 224-bit Prime Order Subgroup"},
35291
  { 24, "2048-bit MODP Group with 256-bit Prime Order Subgroup"},
35292
  { 25, "192-bit Random ECP Group"},
35293
  { 26, "224-bit Random ECP Group"},
35294
  { 27, "brainpoolP224r1"},
35295
  { 28, "brainpoolP256r1"},
35296
  { 29, "brainpoolP384r1"},
35297
  { 30, "brainpoolP512r1"},
35298
  { 31, "Curve25519"},
35299
  { 32, "Curve448"},
35300
  { 0, NULL }
35301
};
35302
35303
static int
35304
dissect_owe_dh_parameter(tvbuff_t *tvb, packet_info *pinfo,
35305
  proto_tree *tree, int offset, int len _U_, association_sanity_check_t* sanity_check)
35306
27
{
35307
27
  if (len < 2) {
35308
4
    expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
35309
4
                           "OWE: Diffie-Hellman Parameter must be at least 2 "
35310
4
                           "octets long");
35311
4
    return offset + len;
35312
4
  }
35313
35314
23
  ieee80211_packet_data_t *packet_data = get_or_create_packet_data(pinfo);
35315
23
  packet_data->owe_group = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
35316
23
  if (sanity_check != NULL) {
35317
9
    sanity_check->owe_group = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
35318
9
  }
35319
35320
23
  proto_tree_add_item(tree, hf_ieee80211_owe_dh_parameter_group, tvb, offset,
35321
23
                        2, ENC_LITTLE_ENDIAN);
35322
23
  proto_tree_add_item(tree, hf_ieee80211_owe_dh_parameter_public_key, tvb, offset + 2,
35323
23
                        len - 2, ENC_NA);
35324
23
  offset += len;
35325
35326
23
  return offset;
35327
27
}
35328
35329
static int * const ieee80211_twt_ctrl_field[] = {
35330
  &hf_ieee80211_tag_twt_ndp_paging_indicator,
35331
  &hf_ieee80211_tag_twt_responder_pm_mode,
35332
  &hf_ieee80211_tag_twt_neg_type,
35333
  &hf_ieee80211_tag_twt_info_frame_disabled,
35334
  &hf_ieee80211_tag_twt_wake_duration_unit,
35335
  &hf_ieee80211_tag_twt_link_id_bitmap_present,
35336
  &hf_ieee80211_tag_twt_aligned_twt,
35337
  NULL,
35338
};
35339
35340
static int * const ieee80211_twt_req_type_field[] = {
35341
  &hf_ieee80211_tag_twt_req_type_req,
35342
  &hf_ieee80211_tag_twt_req_type_setup_cmd,
35343
  &hf_ieee80211_tag_twt_req_type_trigger,
35344
  &hf_ieee80211_tag_twt_req_type_implicit,
35345
  &hf_ieee80211_tag_twt_req_type_flow_type,
35346
  &hf_ieee80211_tag_twt_req_type_flow_id,
35347
  &hf_ieee80211_tag_twt_req_type_wake_int_exp,
35348
  &hf_ieee80211_tag_twt_req_type_prot,
35349
  NULL,
35350
};
35351
35352
static int * const ieee80211_bcst_twt_req_type_field[] = {
35353
  &hf_ieee80211_tag_twt_req_type_req,
35354
  &hf_ieee80211_tag_twt_req_type_setup_cmd,
35355
  &hf_ieee80211_tag_twt_req_type_trigger,
35356
  &hf_ieee80211_tag_twt_req_type_last_bcst_parm_set,
35357
  &hf_ieee80211_tag_twt_req_type_flow_type,
35358
  &hf_ieee80211_tag_twt_req_type_bcst_twt_recom,
35359
  &hf_ieee80211_tag_twt_req_type_wake_int_exp,
35360
  &hf_ieee80211_tag_twt_req_type_aligned,
35361
  NULL,
35362
};
35363
35364
static int * const ieee80211_twt_ndp_paging_field[] = {
35365
  &hf_ieee80211_tag_twt_ndp_paging_p_id,
35366
  &hf_ieee80211_tag_twt_ndp_max_ndp_paging_period,
35367
  &hf_ieee80211_tag_twt_ndp_partial_tsf_offset,
35368
  &hf_ieee80211_tag_twt_ndp_action,
35369
  &hf_ieee80211_tag_twt_ndp_min_sleep_duration,
35370
  &hf_ieee80211_tag_twt_ndp_reserved,
35371
  NULL
35372
};
35373
35374
static int * const ieee80211_twt_broadcast_info_field[] = {
35375
  &hf_ieee80211_tag_twt_bcast_info_persistence,
35376
  &hf_ieee80211_tag_twt_bcast_info_id,
35377
  &hf_ieee80211_tag_twt_bcast_info_rtwt_sche_info,
35378
  &hf_ieee80211_tag_twt_bcast_info_rtwt_traffic_present,
35379
  NULL
35380
};
35381
35382
static int * const ieee80211_twt_traffic_info_control_field[] = {
35383
  &hf_ieee80211_tag_twt_traffic_info_dl_bitmap_valid,
35384
  &hf_ieee80211_tag_twt_traffic_info_ul_bitmap_valid,
35385
  &hf_ieee80211_tag_twt_traffic_info_reserved,
35386
  NULL
35387
};
35388
35389
static const value_string twt_ndp_action_vals[] = {
35390
  { 0, "Send a PD-Poll or uplink trigger frame" },
35391
  { 1, "Wake up at the time indicated by Min Sleep Duration" },
35392
  { 2, "Wake up to receive the Beacon" },
35393
  { 3, "Wake up to receive the DTIM Beacon" },
35394
  { 4, "Wake up at the time indicated by the sum of the Min Sleep Duration and the ASD" },
35395
  { 5, "Reserved" },
35396
  { 6, "Reserved" },
35397
  { 7, "Reserved" },
35398
  { 0, NULL }
35399
};
35400
35401
static int
35402
ieee80211_tag_twt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
35403
184
{
35404
184
  int tag_len;
35405
184
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35406
184
  int offset = 0;
35407
184
  proto_item *item = NULL;
35408
184
  bool twt_requester;
35409
184
  uint8_t setup_command;
35410
184
  uint8_t ctrl_field;
35411
184
  uint16_t req_type;
35412
184
  uint8_t neg_type;
35413
184
  bool last_bcast = false;
35414
35415
184
  ctrl_field = tvb_get_uint8(tvb, offset);
35416
184
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35417
184
                                    hf_ieee80211_tag_twt_control_field,
35418
184
                                    ett_twt_control_field_tree,
35419
184
                                    ieee80211_twt_ctrl_field,
35420
184
                                    ENC_LITTLE_ENDIAN, BMT_NO_FALSE);
35421
184
  offset += 1;
35422
184
  neg_type = (ctrl_field & 0xc) >> 2;
35423
35424
1.03k
  while (!last_bcast) {
35425
974
    tag_len = tvb_captured_length_remaining(tvb, offset);
35426
974
    if (tag_len < 2) {
35427
19
      expert_add_info(pinfo, item ? item : tree,
35428
19
                      &ei_ieee80211_twt_bcast_info_no_term);
35429
19
        return tvb_captured_length(tvb);
35430
19
    }
35431
955
    req_type = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
35432
955
    if (neg_type & 0x2) { /* If a bcast TWT */
35433
      // 2 bytes - request type
35434
      // 2 bytes - target wake time
35435
      // 1 byte  - nominal minimum interval TWT wake duration
35436
      // 2 bytes - TWT wake interval mantissa
35437
      // 2 byte  - Broadcast TWT info
35438
      // total: 10 bytes.
35439
906
      if (tag_len < 9) {
35440
19
        expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
35441
19
            "Tag Length %u wrong, must be >= 9", tag_len);
35442
19
        return tvb_captured_length(tvb);
35443
19
      }
35444
887
      item = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35445
887
                                    hf_ieee80211_tag_twt_req_type_field,
35446
887
                                    ett_twt_req_type_tree,
35447
887
                                    ieee80211_bcst_twt_req_type_field,
35448
887
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
35449
887
      last_bcast = (req_type & 0x20) >> 5;
35450
887
    } else {
35451
      // 2 bytes - request type
35452
      // 8 bytes - target wake time
35453
      // 1 byte  - nominal minimum interval TWT wake duration
35454
      // 2 bytes - TWT wake interval mantissa
35455
      // 1 byte  - channel
35456
      // total: 14 bytes.
35457
49
      if (tag_len < 14) {
35458
10
        expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
35459
10
            "Tag Length %u wrong, must be >= 14", tag_len);
35460
10
        return tvb_captured_length(tvb);
35461
10
      }
35462
39
      item = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35463
39
                                    hf_ieee80211_tag_twt_req_type_field,
35464
39
                                    ett_twt_req_type_tree,
35465
39
                                    ieee80211_twt_req_type_field,
35466
39
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
35467
39
      last_bcast = true;
35468
39
    }
35469
35470
926
    twt_requester = req_type & 0x1;
35471
926
    setup_command = (req_type & 0xe) >> 1;
35472
35473
926
    switch (setup_command) {
35474
93
      case REQUEST_TWT:
35475
155
      case SUGGEST_TWT:
35476
222
      case DEMAND_TWT:
35477
        // we must be TWT requester
35478
222
        if (!twt_requester) {
35479
46
          expert_add_info_format(pinfo, item,
35480
46
                         &ei_ieee80211_twt_setup_bad_command,
35481
46
                         "Command %d is not allowed if TWT Request is not set",
35482
46
                         setup_command);
35483
46
          return tvb_captured_length(tvb);
35484
46
        }
35485
176
        break;
35486
176
      case TWT_GROUPING:
35487
        // TODO: There are more tests needed here
35488
        //       Fall through since we can't be requester here as well.
35489
478
      case ACCEPT_TWT:
35490
594
      case ALTERNATE_TWT:
35491
        // we can't be TWT requester
35492
594
        if (twt_requester) {
35493
25
          expert_add_info_format(pinfo, item,
35494
25
                         &ei_ieee80211_twt_setup_bad_command,
35495
25
                         "Command %d is not allowed if TWT Request is set",
35496
25
                         setup_command);
35497
25
          return tvb_captured_length(tvb);
35498
25
        }
35499
569
        break;
35500
569
      case DICTATE_TWT:
35501
110
      case REJECT_TWT:
35502
        // TODO: Unclear what to do here. Looks like we can't be Requester, OTOH
35503
        //       the spec doesn't say anything
35504
110
        break;
35505
0
      default:
35506
0
        break;
35507
926
    }
35508
35509
855
    offset += 2;
35510
35511
855
    if (neg_type & 0x2) { /* If a bcast TWT */
35512
822
      uint16_t twt_info;
35513
35514
822
      proto_tree_add_item(tree, hf_ieee80211_tag_twt_target_wake_time_short,
35515
822
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
35516
822
      offset += 2;
35517
35518
822
      proto_tree_add_item(tree, hf_ieee80211_tag_twt_nom_min_twt_wake_dur, tvb,
35519
822
                          offset, 1, ENC_NA);
35520
822
      offset += 1;
35521
35522
822
      proto_tree_add_item(tree, hf_ieee80211_tag_twt_wake_interval_mantissa,
35523
822
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
35524
822
      offset += 2;
35525
35526
822
      twt_info = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
35527
822
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35528
822
                                        hf_ieee80211_tag_twt_broadcast_info,
35529
822
                                        ett_twt_broadcast_info_tree,
35530
822
                                        ieee80211_twt_broadcast_info_field,
35531
822
                                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
35532
822
      offset += 2;
35533
822
      if (twt_info & 0x01) { /* RTWT Traffic Info */
35534
225
        proto_tree *info_tree;
35535
225
        info_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_twt_traffic_info_tree,
35536
225
                                           NULL, "Restricted TWT Traffic Info");
35537
225
        proto_tree_add_bitmask_with_flags(info_tree, tvb, offset,
35538
225
                                          hf_ieee80211_tag_twt_traffic_info_control,
35539
225
                                          ett_twt_traffic_info_control_tree,
35540
225
                                          ieee80211_twt_traffic_info_control_field,
35541
225
                                          ENC_LITTLE_ENDIAN, BMT_NO_FALSE);
35542
225
        offset += 1;
35543
35544
225
        proto_tree_add_item(info_tree, hf_ieee80211_tag_twt_traffic_info_rtwt_dl_bitmap,
35545
225
                            tvb, offset, 1, ENC_NA);
35546
225
        offset += 1;
35547
35548
225
        proto_tree_add_item(info_tree, hf_ieee80211_tag_twt_traffic_info_rtwt_ul_bitmap,
35549
225
                            tvb, offset, 1, ENC_NA);
35550
225
        offset += 1;
35551
225
      }
35552
822
    } else {
35553
33
      proto_tree_add_item(tree, hf_ieee80211_tag_twt_target_wake_time, tvb,
35554
33
                          offset, 8, ENC_LITTLE_ENDIAN);
35555
33
      offset += 8;
35556
35557
33
      proto_tree_add_item(tree, hf_ieee80211_tag_twt_nom_min_twt_wake_dur, tvb,
35558
33
                          offset, 1, ENC_NA);
35559
33
      offset += 1;
35560
35561
33
      item = proto_tree_add_item(tree,
35562
33
                                 hf_ieee80211_tag_twt_wake_interval_mantissa,
35563
33
                                 tvb, offset, 2, ENC_LITTLE_ENDIAN);
35564
33
      offset += 2;
35565
35566
33
      proto_tree_add_item(tree, hf_ieee80211_tag_twt_channel, tvb, offset, 1,
35567
33
                          ENC_NA);
35568
33
      offset += 1;
35569
35570
33
      if (ctrl_field & 0x01) { /* NDP Paging */
35571
24
        proto_tree_add_bitmask_with_flags(tree, tvb, offset,
35572
24
                                        hf_ieee80211_tag_twt_ndp_paging_field,
35573
24
                                        ett_twt_ndp_paging_field_tree,
35574
24
                                        ieee80211_twt_ndp_paging_field,
35575
24
                                        ENC_LITTLE_ENDIAN, BMT_NO_FALSE);
35576
24
        offset += 4;
35577
24
      }
35578
35579
33
      if (ctrl_field & 0x40) { /* Link ID Bitmap */
35580
22
        proto_tree_add_item(tree, hf_ieee80211_tag_twt_link_id_bitmap, tvb, offset, 2,
35581
22
                            ENC_LITTLE_ENDIAN);
35582
22
        offset += 2;
35583
22
      }
35584
35585
33
      if (ctrl_field & 0x80) { /* Aligned TWT Link Bitmap */
35586
16
        proto_tree_add_item(tree, hf_ieee80211_tag_twt_aligned_twt_link_bitmap, tvb, offset, 2,
35587
16
                            ENC_LITTLE_ENDIAN);
35588
16
        offset += 2;
35589
16
      }
35590
33
    }
35591
855
  }
35592
35593
65
  return tvb_captured_length(tvb);
35594
184
}
35595
35596
static int
35597
dissect_rsnx_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int tag_len)
35598
73
{
35599
73
  int offset = 0;
35600
73
  proto_item *octet;
35601
73
  static int * const octet1[] = {
35602
73
    &hf_ieee80211_tag_rsnx_length,
35603
73
    &hf_ieee80211_tag_rsnx_protected_twt_operations_support,
35604
73
    &hf_ieee80211_tag_rsnx_sae_hash_to_element,
35605
73
    &hf_ieee80211_tag_rsnx_sae_pk,
35606
73
    &hf_ieee80211_tag_rsnx_protected_wur_frame_support,
35607
73
    NULL
35608
73
  };
35609
73
  static int * const octet2[] = {
35610
73
    &hf_ieee80211_tag_rsnx_secure_ltf_support,
35611
73
    &hf_ieee80211_tag_rsnx_secure_rtt_supported,
35612
73
    &hf_ieee80211_tag_rsnx_urnm_mfpr_x20,
35613
73
    &hf_ieee80211_tag_rsnx_protected_announce_support,
35614
73
    &hf_ieee80211_tag_rsnx_pbac,
35615
73
    &hf_ieee80211_tag_rsnx_extended_s1g_action_protection,
35616
73
    &hf_ieee80211_tag_rsnx_spp_amsdu_capable,
35617
73
    &hf_ieee80211_tag_rsnx_urnm_mfpr,
35618
73
    NULL
35619
73
  };
35620
35621
  /* octet 1 */
35622
73
  octet = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rsnx, ett_tag_rsnx_octet1, octet1, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
35623
73
  proto_item_append_text(octet, " (octet %d)", offset + 1);
35624
35625
73
  offset += 1;
35626
73
  if (offset >= tag_len) {
35627
16
      return offset;
35628
16
  }
35629
35630
  /* octet 2 */
35631
57
  octet = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rsnx, ett_tag_rsnx_octet2, octet2, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
35632
57
  proto_item_append_text(octet, " (octet %d)", offset + 1);
35633
35634
57
  offset += 1;
35635
57
  if (offset >= tag_len) {
35636
11
      return offset;
35637
11
  }
35638
35639
  /* all rest of payload is reserved... */
35640
3.03k
  while (offset < tag_len) {
35641
2.98k
    proto_tree_add_item(tree, hf_ieee80211_tag_rsnx_reserved, tvb, offset, 1,
35642
2.98k
                        ENC_LITTLE_ENDIAN);
35643
2.98k
    offset += 1;
35644
2.98k
  }
35645
35646
46
  return offset;
35647
57
}
35648
35649
static int
35650
ieee80211_tag_rsnx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
35651
89
{
35652
89
  int tag_len = tvb_reported_length(tvb);
35653
89
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35654
35655
89
  if (tag_len < 1) {
35656
16
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 1", tag_len);
35657
16
    return 0;
35658
16
  }
35659
73
  proto_item_append_text(field_data->item_tag, " (%u octet%s)", tag_len, plurality(tag_len, "", "s"));
35660
35661
73
  dissect_rsnx_ie(tvb, pinfo, tree, tag_len);
35662
35663
73
  return tvb_captured_length(tvb);
35664
89
}
35665
35666
static int
35667
ieee80211_tag_fils_indication(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
35668
81
{
35669
81
  int tag_len = tvb_reported_length(tvb);
35670
81
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35671
81
  int offset = 0;
35672
81
  uint16_t info;
35673
81
  uint8_t nr_realm, nr_pk, i, len;
35674
81
  proto_item *item;
35675
81
  proto_tree *subtree;
35676
35677
81
  if (tag_len < 2)
35678
18
  {
35679
18
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 2", tag_len);
35680
18
    return tvb_captured_length(tvb);
35681
18
  }
35682
35683
63
  static int * const ieee80211_tag_fils_indication_info[] = {
35684
63
    &hf_ieee80211_tag_fils_indication_info_nr_pk,
35685
63
    &hf_ieee80211_tag_fils_indication_info_nr_realm,
35686
63
    &hf_ieee80211_tag_fils_indication_info_ip_config,
35687
63
    &hf_ieee80211_tag_fils_indication_info_cache_id_included,
35688
63
    &hf_ieee80211_tag_fils_indication_info_hessid_included,
35689
63
    &hf_ieee80211_tag_fils_indication_info_ska_without_pfs,
35690
63
    &hf_ieee80211_tag_fils_indication_info_ska_with_pfs,
35691
63
    &hf_ieee80211_tag_fils_indication_info_pka,
35692
63
    &hf_ieee80211_tag_fils_indication_info_reserved,
35693
63
    NULL
35694
63
  };
35695
35696
63
  info = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN);
35697
63
  proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_fils_indication_info, ENC_LITTLE_ENDIAN);
35698
63
  offset += 2;
35699
35700
63
  nr_pk = info & 0x07;
35701
63
  nr_realm = (info >> 3) & 0x07;
35702
35703
  /* Cache identifier */
35704
63
  if (info & (1 << 7)) {
35705
39
    proto_tree_add_item(tree, hf_ieee80211_tag_fils_indication_cache_identifier, tvb, offset, 2, ENC_NA);
35706
39
    offset += 2;
35707
39
  }
35708
35709
  /* HESSID */
35710
63
  if (info & (1 << 8)) {
35711
15
    proto_tree_add_item(tree, hf_ieee80211_tag_fils_indication_hessid, tvb, offset, 6, ENC_NA);
35712
15
    offset += 6;
35713
15
  }
35714
35715
  /* Realm identifiers */
35716
63
  if (nr_realm > 0) {
35717
52
    item = proto_tree_add_item(tree, hf_ieee80211_tag_fils_indication_realm_list, tvb, offset, nr_realm * 2, ENC_NA);
35718
52
    subtree = proto_item_add_subtree(item, ett_fils_indication_realm_list);
35719
52
    proto_item_append_text(item, ": %u", nr_realm);
35720
35721
289
    for (i = 0; i < nr_realm; i++) {
35722
237
      proto_tree_add_item(subtree, hf_ieee80211_tag_fils_indication_realm_identifier, tvb, offset, 2, ENC_NA);
35723
237
      offset += 2;
35724
237
    }
35725
52
  }
35726
35727
  /* PK identifiers */
35728
63
  if (nr_pk > 0) {
35729
23
    item = proto_tree_add_item(tree, hf_ieee80211_tag_fils_indication_public_key_list, tvb, offset, tag_len - offset, ENC_NA);
35730
23
    subtree = proto_item_add_subtree(item, ett_fils_indication_public_key_list);
35731
23
    proto_item_append_text(item, ": %u", nr_pk);
35732
35733
107
    for (i = 0; i < nr_pk; i++) {
35734
84
      proto_tree_add_item(subtree, hf_ieee80211_tag_fils_indication_public_key_type, tvb, offset, 1, ENC_NA);
35735
84
      offset += 1;
35736
35737
84
      proto_tree_add_item(subtree, hf_ieee80211_tag_fils_indication_public_key_length, tvb, offset, 1, ENC_NA);
35738
84
      len = tvb_get_uint8(tvb, offset);
35739
84
      offset += 1;
35740
35741
84
      proto_tree_add_item(subtree, hf_ieee80211_tag_fils_indication_public_key_indicator, tvb, offset, len, ENC_NA);
35742
84
      offset += len;
35743
84
    }
35744
23
  }
35745
35746
63
  return tvb_captured_length(tvb);
35747
81
}
35748
35749
static int
35750
ieee80211_tag_element_id_extension(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
35751
1.49k
{
35752
1.49k
  int tag_len = tvb_reported_length(tvb);
35753
1.49k
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35754
1.49k
  int offset = 0;
35755
1.49k
  int ext_tag_len;
35756
1.49k
  uint8_t ext_tag_no;
35757
35758
1.49k
  if (tag_len < 1)
35759
136
  {
35760
136
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 1", tag_len);
35761
136
    return tvb_captured_length(tvb);
35762
136
  }
35763
1.35k
  ext_tag_no = tvb_get_uint8(tvb, offset++);
35764
1.35k
  ext_tag_len = tag_len - 1;
35765
35766
1.35k
  switch (ext_tag_no) {
35767
36
    case ETAG_FILS_REQ_PARAMS:
35768
36
      dissect_fils_req_params(tree, pinfo, tvb, offset, ext_tag_len);
35769
36
      break;
35770
16
    case ETAG_FILS_SESSION:
35771
16
      proto_tree_add_item(tree, hf_ieee80211_fils_session, tvb, offset, ext_tag_len, ENC_NA);
35772
16
      if (field_data->sanity_check != NULL) {
35773
3
        field_data->sanity_check->has_fils_session = true;
35774
3
      }
35775
16
      break;
35776
18
    case ETAG_FILS_WRAPPED_DATA:
35777
18
      dissect_wrapped_data(tree, pinfo, tvb, offset, ext_tag_len);
35778
18
      break;
35779
10
    case ETAG_FILS_NONCE:
35780
10
      proto_tree_add_item(tree, hf_ieee80211_fils_nonce, tvb, offset, ext_tag_len, ENC_NA);
35781
10
      break;
35782
21
    case ETAG_ESTIMATED_SERVICE_PARAM:
35783
21
      dissect_estimated_service_params(tvb, pinfo, tree, offset, ext_tag_len);
35784
21
      break;
35785
27
    case ETAG_FUTURE_CHANNEL_GUIDANCE:
35786
27
      dissect_future_channel_guidance(tvb, pinfo, tree, offset, ext_tag_len);
35787
27
      break;
35788
27
    case ETAG_OWE_DH_PARAMETER:
35789
27
      dissect_owe_dh_parameter(tvb, pinfo, tree, offset, ext_tag_len, field_data->sanity_check);
35790
27
      break;
35791
19
    case ETAG_PASSWORD_IDENTIFIER:
35792
19
      dissect_password_identifier(tvb, pinfo, tree, offset, ext_tag_len);
35793
19
      break;
35794
51
    case ETAG_HE_CAPABILITIES:
35795
51
      dissect_he_capabilities(tvb, pinfo, tree, offset, ext_tag_len);
35796
51
      break;
35797
15
    case ETAG_HE_OPERATION:
35798
15
      dissect_he_operation(tvb, pinfo, tree, offset, ext_tag_len);
35799
15
      break;
35800
6
    case ETAG_UORA_PARAMETER_SET:
35801
6
      dissect_uora_parameter_set(tvb, pinfo, tree, offset);
35802
6
      break;
35803
6
    case ETAG_MU_EDCA_PARAMETER_SET:
35804
6
      dissect_mu_edca_parameter_set(tvb, pinfo, tree, offset, ext_tag_len);
35805
6
      break;
35806
12
    case ETAG_SPATIAL_REUSE_PARAMETER_SET:
35807
12
      dissect_spatial_reuse_parameter_set(tvb, pinfo, tree, offset, ext_tag_len);
35808
12
      break;
35809
4
    case ETAG_NDP_FEEDBACK_REPORT_PARAMETER_SET:
35810
4
      dissect_ndp_feedback_report_set(tvb, pinfo, tree, offset, ext_tag_len);
35811
4
      break;
35812
6
    case ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT:
35813
6
      dissect_bss_color_change(tvb, pinfo, tree, offset, ext_tag_len);
35814
6
      break;
35815
31
    case ETAG_QUIET_TIME_PERIOD_SETUP:
35816
31
      dissect_quiet_time_period(tvb, pinfo, tree, offset, ext_tag_len);
35817
31
      break;
35818
4
    case ETAG_ESS_REPORT:
35819
4
      dissect_ess_report(tvb, pinfo, tree, offset, ext_tag_len);
35820
4
      break;
35821
7
    case ETAG_OPS:
35822
7
      dissect_ops(tvb, pinfo, tree, offset, ext_tag_len);
35823
7
      break;
35824
6
    case ETAG_MAX_CHANNEL_SWITCH_TIME:
35825
6
      dissect_max_channel_switch_time(tvb, pinfo, tree, offset, ext_tag_len);
35826
6
      break;
35827
8
    case ETAG_OCI:
35828
8
      dissect_oci(tvb, pinfo, tree, offset, ext_tag_len);
35829
8
      break;
35830
4
    case ETAG_MULTIPLE_BSSID_CONFIGURATION:
35831
4
      dissect_multiple_bssid_configuration(tvb, pinfo, tree, offset, ext_tag_len);
35832
4
      break;
35833
28
    case ETAG_NON_INHERITANCE:
35834
28
      dissect_non_inheritance(tvb, pinfo, tree, offset, ext_tag_len);
35835
28
      break;
35836
2
    case ETAG_KNOWN_BSSID:
35837
2
      dissect_known_bssid(tvb, pinfo, tree, offset, ext_tag_len);
35838
2
      break;
35839
14
    case ETAG_SHORT_SSID:
35840
14
      dissect_short_ssid(tvb, pinfo, tree, offset, ext_tag_len);
35841
14
      break;
35842
6
    case ETAG_MSCS_DESCRIPTOR_ELEMENT:
35843
6
      dissect_mscs_descriptor_element(tvb, pinfo, tree, offset, ext_tag_len);
35844
6
      break;
35845
5
    case ETAG_TCLAS_MASK:
35846
5
      dissect_tclas_mask_element(tvb, pinfo, tree, offset, ext_tag_len);
35847
5
      break;
35848
11
    case ETAG_REJECTED_GROUPS:
35849
11
      dissect_rejected_groups(tvb, pinfo, tree, offset, ext_tag_len);
35850
11
      break;
35851
9
    case ETAG_ANTI_CLOGGING_TOKEN:
35852
9
      dissect_anti_clogging_token(tvb, pinfo, tree, offset, ext_tag_len);
35853
9
      break;
35854
25
    case ETAG_EXTENDED_REQUEST:
35855
25
      dissect_extended_request(tvb, pinfo, tree, offset, ext_tag_len);
35856
25
      break;
35857
6
    case ETAG_HE_6GHZ_BAND_CAPABILITIES:
35858
6
      dissect_he_6ghz_band_capabilities(tvb, pinfo, tree, offset, ext_tag_len);
35859
6
      break;
35860
71
    case ETAG_RANGING_PARAMETERS:
35861
71
      dissect_ranging_parameters(tvb, pinfo, tree, offset, ext_tag_len);
35862
71
      break;
35863
7
    case ETAG_DIRECTION_MEASUREMENT_RESULTS:
35864
7
      dissect_direction_measurement_results(tvb, pinfo, tree, offset, ext_tag_len);
35865
7
      break;
35866
9
    case ETAG_FTM_SYNC_INFO:
35867
9
      proto_tree_add_item(tree, hf_ieee80211_tag_ftm_tsf_sync_info, tvb, offset, ext_tag_len, ENC_NA);
35868
9
      break;
35869
2
    case ETAG_SECURE_LTF_PARAMETERS:
35870
2
      dissect_secure_ltf_parameters(tvb, pinfo, tree, offset, ext_tag_len);
35871
2
      break;
35872
29
    case ETAG_ISTA_AVAILABILITY_WINDOW:
35873
29
      dissect_ista_availability_window(tvb, pinfo, tree, offset, ext_tag_len);
35874
29
      break;
35875
36
    case ETAG_RSTA_AVAILABILITY_WINDOW:
35876
36
      dissect_rsta_availability_window(tvb, pinfo, tree, offset, ext_tag_len);
35877
36
      break;
35878
19
    case ETAG_PASN_PARAMETERS:
35879
19
      dissect_pasn_parameters(tvb, pinfo, tree, offset, ext_tag_len);
35880
19
      break;
35881
62
    case ETAG_MULTI_LINK:
35882
62
      dissect_multi_link(tvb, pinfo, tree, offset, ext_tag_len);
35883
62
      break;
35884
9
    case ETAG_EHT_OPERATION:
35885
9
      dissect_eht_operation(tvb, pinfo, tree, offset, ext_tag_len);
35886
9
      break;
35887
16
    case ETAG_EHT_CAPABILITIES:
35888
16
      dissect_eht_capabilities(tvb, pinfo, tree, offset, ext_tag_len);
35889
16
      break;
35890
34
    case ETAG_TID_TO_LINK_MAPPING:
35891
34
      dissect_tid_to_link_mapping(tvb, pinfo, tree, offset, ext_tag_len);
35892
34
      break;
35893
6
    case ETAG_MULTI_LINK_TRAFFIC:
35894
6
      dissect_multi_link_traffic(tvb, pinfo, tree, offset, ext_tag_len);
35895
6
      break;
35896
16
    case ETAG_QOS_CHARACTERISTICS:
35897
16
      dissect_qos_characteristics(tvb, pinfo, tree, offset, ext_tag_len);
35898
16
      break;
35899
4
    case ETAG_AKM_SUITE_SELECTOR:
35900
4
      dissect_akm_suite_selector(tvb, pinfo, tree, offset, ext_tag_len);
35901
4
      break;
35902
2
    case ETAG_MLO_LINK_INFORMATION:
35903
2
      dissect_mlo_link_information(tvb, pinfo, tree, offset, ext_tag_len);
35904
2
      break;
35905
70
    case ETAG_AID_BITMAP:
35906
70
      dissect_aid_bitmap(tvb, pinfo, tree, offset, ext_tag_len);
35907
70
      break;
35908
17
    case ETAG_BANDWIDTH_INDICATION:
35909
17
      dissect_bandwidth_indication(tvb, pinfo, tree, offset, ext_tag_len);
35910
17
      break;
35911
6
    case ETAG_NONAP_STA_REGULATORY_CONNECT:
35912
6
      dissect_nonap_sta_regulatory_connect(tvb, pinfo, tree, offset, ext_tag_len);
35913
6
      break;
35914
499
    default:
35915
499
      proto_tree_add_item(tree, hf_ieee80211_ext_tag_data, tvb, offset, ext_tag_len, ENC_NA);
35916
499
      expert_add_info_format(pinfo, field_data->item_tag, &ei_ieee80211_tag_data,
35917
499
                             "Dissector for 802.11 Extension Tag"
35918
499
                             " (%s) code not implemented, Contact"
35919
499
                             " Wireshark developers if you want this supported", val_to_str_ext(ext_tag_no,
35920
499
                                            &tag_num_vals_eid_ext_ext, "%d"));
35921
499
      proto_item_append_text(field_data->item_tag, ": Undecoded");
35922
499
      break;
35923
1.35k
  }
35924
35925
952
  return tvb_captured_length(tvb);
35926
1.35k
}
35927
35928
/* Conflict: WAPI Vs. IEEE */
35929
static int
35930
ieee80211_tag_ie_68_conflict(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
35931
79
{
35932
79
  int tag_len = tvb_reported_length(tvb);
35933
79
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35934
79
  if (tag_len >= 20) { /* It Might be WAPI*/
35935
53
    dissect_wapi_param_set(tvb, pinfo, tree, 0, tag_len, field_data->item_tag_length, field_data->item_tag, field_data->ftype);
35936
53
  }
35937
26
  else { /* BSS AC Access Delay (68) */
35938
26
     dissect_bss_ac_access_delay_ie(tvb, pinfo, tree, 0, tag_len, field_data->item_tag_length);
35939
26
  }
35940
79
  return tvb_captured_length(tvb);
35941
79
}
35942
35943
static int
35944
ieee80211_tag_mesh_peering_mgmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
35945
19
{
35946
19
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35947
19
  int tag_len = tvb_reported_length(tvb);
35948
19
  int offset = 0;
35949
19
  int ampe_frame = 0;
35950
35951
19
  proto_tree_add_item(tree, hf_ieee80211_mesh_peering_proto, tvb, offset, 2, ENC_LITTLE_ENDIAN);
35952
19
  offset += 2;
35953
19
  proto_tree_add_item(tree, hf_ieee80211_mesh_peering_local_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
35954
19
  offset += 2;
35955
35956
19
  if (field_data && field_data->sanity_check)
35957
13
    ampe_frame = field_data->sanity_check->ampe_frame;
35958
35959
19
  switch (ampe_frame)
35960
19
  {                                         /* Self-protected action field */
35961
0
    case SELFPROT_ACTION_MESH_PEERING_OPEN:
35962
0
      break;
35963
35964
0
    case SELFPROT_ACTION_MESH_PEERING_CONFIRM:
35965
0
      proto_tree_add_item(tree, hf_ieee80211_mesh_peering_peer_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
35966
0
      break;
35967
35968
0
    case SELFPROT_ACTION_MESH_PEERING_CLOSE:
35969
0
      if ((tag_len == 8) || (tag_len == 24))
35970
0
      {
35971
0
        proto_tree_add_item(tree, hf_ieee80211_mesh_peering_peer_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
35972
0
        offset += 2;
35973
0
      }
35974
0
      add_ff_reason_code(tree, tvb, pinfo, offset);
35975
0
      break;
35976
35977
      /* unexpected values */
35978
18
    default:
35979
18
      proto_tree_add_expert(tree, pinfo, &ei_ieee80211_mesh_peering_unexpected , tvb, offset, tag_len);
35980
18
      break;
35981
19
  }
35982
0
  if (tag_len - offset == 16)
35983
0
  {
35984
0
    proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, ENC_NA);
35985
0
  }
35986
0
  return tvb_captured_length(tvb);
35987
19
}
35988
35989
static int
35990
ieee80211_tag_mesh_configuration(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
35991
48
{
35992
35993
48
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
35994
48
  int tag_len = tvb_reported_length(tvb);
35995
48
  if (tag_len != 7)
35996
46
  {
35997
46
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 7", tag_len);
35998
46
    return tvb_captured_length(tvb);
35999
46
  }
36000
36001
2
  int offset = 0;
36002
2
  proto_item *item;
36003
2
  proto_tree *subtree;
36004
2
  static int * const ieee80211_mesh_config_cap[] = {
36005
2
    &hf_ieee80211_mesh_config_cap_accepting,
36006
2
    &hf_ieee80211_mesh_config_cap_mcca_support,
36007
2
    &hf_ieee80211_mesh_config_cap_mcca_enabled,
36008
2
    &hf_ieee80211_mesh_config_cap_forwarding,
36009
2
    &hf_ieee80211_mesh_config_cap_mbca_enabled,
36010
2
    &hf_ieee80211_mesh_config_cap_tbtt_adjusting,
36011
2
    &hf_ieee80211_mesh_config_cap_power_save_level,
36012
2
    &hf_ieee80211_mesh_config_cap_reserved,
36013
2
    NULL
36014
2
  };
36015
36016
2
  proto_tree_add_item(tree, hf_ieee80211_mesh_config_path_sel_protocol, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36017
2
  proto_tree_add_item(tree, hf_ieee80211_mesh_config_path_sel_metric, tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
36018
2
  proto_tree_add_item(tree, hf_ieee80211_mesh_config_congestion_control, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
36019
2
  proto_tree_add_item(tree, hf_ieee80211_mesh_config_sync_method, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
36020
2
  proto_tree_add_item(tree, hf_ieee80211_mesh_config_auth_protocol, tvb, offset + 4, 1, ENC_LITTLE_ENDIAN);
36021
2
  item = proto_tree_add_item(tree, hf_ieee80211_mesh_config_formation_info, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
36022
2
  subtree = proto_item_add_subtree(item, ett_mesh_formation_info_tree);
36023
2
  proto_tree_add_item(subtree, hf_ieee80211_mesh_form_info_conn_to_mesh_gate, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
36024
2
  proto_tree_add_item(subtree, hf_ieee80211_mesh_form_info_num_of_peerings, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
36025
2
  proto_tree_add_item(subtree, hf_ieee80211_mesh_form_info_conn_to_as, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
36026
36027
2
  proto_tree_add_bitmask_with_flags(tree, tvb, offset + 6, hf_ieee80211_mesh_config_capability,
36028
2
                                    ett_mesh_config_cap_tree, ieee80211_mesh_config_cap,
36029
2
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
36030
2
  return tvb_captured_length(tvb);
36031
48
}
36032
36033
static int
36034
ieee80211_tag_mesh_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36035
81
{
36036
81
  int offset = 0;
36037
81
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36038
81
  int tag_len = tvb_reported_length(tvb);
36039
81
  const uint8_t* mesh_id;
36040
36041
81
  proto_tree_add_item_ret_string(tree, hf_ieee80211_mesh_id, tvb, offset, tag_len, ENC_ASCII|ENC_NA, pinfo->pool, &mesh_id);
36042
81
  if (tag_len > 0) {
36043
55
    char* s = format_text(pinfo->pool, mesh_id, tag_len);
36044
55
    col_append_fstr(pinfo->cinfo, COL_INFO, ", MESHID=%s", s);
36045
55
    proto_item_append_text(field_data->item_tag, ": %s", s);
36046
55
  }
36047
  /* Make sure dissector is accepted */
36048
81
  return ((tag_len > 0) ? tag_len : 1);
36049
81
}
36050
36051
static int
36052
ieee80211_tag_beacon_timing(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36053
45
{
36054
45
  int tag_len = tvb_reported_length(tvb);
36055
45
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36056
45
  int offset = 0;
36057
45
  uint32_t value;
36058
45
  proto_item *item;
36059
45
  proto_tree *subtree;
36060
36061
45
  static int * const ieee80211_beacon_timing_rctrl_byte[] = {
36062
45
    &hf_ieee80211_bcn_timing_rctrl_more,
36063
45
    &hf_ieee80211_bcn_timing_rctrl_element_num,
36064
45
    &hf_ieee80211_bcn_timing_rctrl_status_num,
36065
45
    NULL,
36066
45
  };
36067
36068
  /* Beacon timing element (120) */
36069
45
  if (tag_len < 1) {
36070
7
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
36071
7
                           "Tag length %u too short, must be greater than 1", tag_len);
36072
7
    return tvb_captured_length(tvb);
36073
7
  }
36074
36075
38
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_bcn_timing_rctrl,
36076
38
                      ett_bcn_timing_rctrl_tree, ieee80211_beacon_timing_rctrl_byte,
36077
38
                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
36078
38
  offset += 1;
36079
36080
452
  while (offset < tag_len) {
36081
414
    item = proto_tree_add_item(tree, hf_ieee80211_bcn_timing_info, tvb, offset, 6, ENC_NA);
36082
414
    subtree = proto_item_add_subtree(item, ett_bcn_timing_info_tree);
36083
414
    proto_item_append_text(item, " %u", ((offset / 6) + 1));
36084
36085
414
    proto_tree_add_item_ret_uint(subtree, hf_ieee80211_bcn_timing_info_nsta_id, tvb, offset, 1, ENC_LITTLE_ENDIAN, &value);
36086
414
    proto_item_append_text(item, ": STA ID: %u", value);
36087
414
    offset += 1;
36088
36089
414
    proto_tree_add_item_ret_uint(subtree, hf_ieee80211_bcn_timing_info_nsta_tbtt, tvb, offset, 3, ENC_LITTLE_ENDIAN, &value);
36090
414
    proto_item_append_text(item, ", STA TBTT: %u", value);
36091
414
    offset += 3;
36092
36093
414
    proto_tree_add_item_ret_uint(subtree, hf_ieee80211_bcn_timing_info_nsta_bi, tvb, offset, 2, ENC_LITTLE_ENDIAN, &value);
36094
414
    proto_item_append_text(item, ", STA BI: %u", value);
36095
414
    offset += 2;
36096
414
  }
36097
36098
38
  proto_item_append_text(field_data->item_tag, " (%d entr%s)", offset / 6, plurality(offset / 6, "y", "ies"));
36099
36100
38
  return tvb_captured_length(tvb);
36101
45
}
36102
36103
static int
36104
ieee80211_tag_gann(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36105
50
{
36106
50
  int tag_len = tvb_reported_length(tvb);
36107
50
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36108
50
  int offset = 0;
36109
36110
50
  static int * const ieee80211_gann_flags_byte[] = {
36111
50
    &hf_ieee80211_gann_flags_reserved,
36112
50
    NULL,
36113
50
  };
36114
36115
  /* Gate Announcement (125) */
36116
50
  if (tag_len != 15) {
36117
43
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
36118
43
                           "Tag length %u wrong, must be = 15", tag_len);
36119
43
    return tvb_captured_length(tvb);
36120
43
  }
36121
36122
7
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_gann_flags,
36123
7
                      ett_gann_flags_tree, ieee80211_gann_flags_byte,
36124
7
                      ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
36125
7
  offset += 1;
36126
36127
7
  proto_tree_add_item(tree, hf_ieee80211_gann_hop_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36128
7
  offset += 1;
36129
7
  proto_tree_add_item(tree, hf_ieee80211_gann_elem_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36130
7
  offset += 1;
36131
7
  proto_tree_add_item(tree, hf_ieee80211_gann_mesh_gate_addr, tvb, offset, 6, ENC_NA);
36132
7
  offset += 6;
36133
7
  proto_tree_add_item(tree, hf_ieee80211_gann_seq_num, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36134
7
  offset += 4;
36135
7
  proto_tree_add_item(tree, hf_ieee80211_gann_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36136
36137
7
  return tvb_captured_length(tvb);
36138
50
}
36139
36140
static int
36141
ieee80211_tag_mesh_preq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
36142
65
{
36143
65
  int offset = 0;
36144
36145
65
  uint32_t flags;
36146
65
  uint8_t targs, i;
36147
36148
65
  proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN, &flags);
36149
65
  offset += 1;
36150
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36151
65
  offset += 1;
36152
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36153
65
  offset += 1;
36154
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_pdid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36155
65
  offset += 4;
36156
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sta, tvb, offset, 6, ENC_NA);
36157
65
  offset += 6;
36158
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36159
65
  offset += 4;
36160
36161
65
  if (flags & (1<<6)) {
36162
23
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_ext, tvb, offset, 6, ENC_NA);
36163
23
    offset += 6;
36164
23
  }
36165
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36166
65
  offset += 4;
36167
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36168
65
  offset += 4;
36169
65
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36170
65
  targs = tvb_get_uint8(tvb, offset);
36171
65
  offset += 1;
36172
225
  for (i = 0; i < targs; i++) {
36173
160
    static int * const targ_flags[] = {
36174
160
      &hf_ieee80211_ff_hwmp_targ_to_flags,
36175
160
      &hf_ieee80211_ff_hwmp_targ_usn_flags,
36176
160
      NULL
36177
160
    };
36178
36179
160
    proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_hwmp_targ_flags,
36180
160
                                   ett_hwmp_targ_flags_tree, targ_flags, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
36181
36182
160
    offset += 1;
36183
160
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
36184
160
    offset += 6;
36185
160
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36186
160
    offset += 4;
36187
160
  }
36188
36189
65
  return tvb_captured_length(tvb);
36190
65
}
36191
36192
static int
36193
ieee80211_tag_mesh_prep(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
36194
51
{
36195
51
  int offset = 0;
36196
36197
51
  uint32_t flags;
36198
51
  proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN, &flags);
36199
51
  offset += 1;
36200
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36201
51
  offset += 1;
36202
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset , 1, ENC_LITTLE_ENDIAN);
36203
51
  offset += 1;
36204
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
36205
51
  offset += 6;
36206
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36207
51
  offset += 4;
36208
51
  if (flags & (1<<6)) {
36209
9
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_ext, tvb, offset, 6, ENC_NA);
36210
9
    offset += 6;
36211
9
  }
36212
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36213
51
  offset += 4;
36214
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36215
51
  offset += 4;
36216
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sta, tvb, offset, 6, ENC_NA);
36217
51
  offset += 6;
36218
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36219
51
  return tvb_captured_length(tvb);
36220
51
}
36221
36222
static int
36223
ieee80211_tag_mesh_perr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
36224
45
{
36225
45
  int offset = 0;
36226
45
  uint8_t targs, i;
36227
36228
45
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36229
45
  offset += 1;
36230
45
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36231
45
  targs = tvb_get_uint8(tvb, offset);
36232
45
  offset += 1;
36233
234
  for (i = 0; i < targs; i++) {
36234
189
    uint8_t flags = tvb_get_uint8(tvb, offset);
36235
36236
189
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36237
189
    offset += 1;
36238
189
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
36239
189
    offset += 6;
36240
189
    proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36241
189
    offset += 4;
36242
189
    if (flags & (1<<6)) {
36243
65
      proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_ext, tvb, offset, 6, ENC_NA);
36244
65
      offset += 6;
36245
65
    }
36246
189
    offset += add_ff_reason_code(tree, tvb, pinfo, offset);
36247
189
  }
36248
45
  return tvb_captured_length(tvb);
36249
45
}
36250
36251
static int
36252
ieee80211_tag_pxu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
36253
95
{
36254
95
  int tag_len = tvb_reported_length(tvb);
36255
95
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36256
95
  int offset = 0;
36257
95
  uint32_t pxu_count = 0, i, proxy_info_len;
36258
95
  uint8_t pxu_flag;
36259
95
  proto_item *item;
36260
95
  proto_tree *subtree;
36261
36262
95
  static int * const ieee80211_pxu_proxy_info_flags_byte[] = {
36263
95
    &hf_ieee80211_pxu_proxy_info_flags_delete,
36264
95
    &hf_ieee80211_pxu_proxy_info_flags_orig_is_proxy,
36265
95
    &hf_ieee80211_pxu_proxy_info_flags_lifetime,
36266
95
    &hf_ieee80211_pxu_proxy_info_flags_reserved,
36267
95
    NULL,
36268
95
  };
36269
36270
  /* PXU element (137) */
36271
95
  if (tag_len < 8) {
36272
24
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
36273
24
                           "Tag length %u wrong, must be at least 8", tag_len);
36274
24
    return tvb_captured_length(tvb);
36275
24
  }
36276
36277
71
  proto_tree_add_item(tree, hf_ieee80211_pxu_pxu_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36278
71
  offset += 1;
36279
71
  proto_tree_add_item(tree, hf_ieee80211_pxu_pxu_origin_mac, tvb, offset, 6, ENC_NA);
36280
71
  offset += 6;
36281
71
  proto_tree_add_item_ret_uint(tree, hf_ieee80211_pxu_no_proxy_info, tvb, offset, 1, ENC_LITTLE_ENDIAN, &pxu_count);
36282
71
  offset += 1;
36283
36284
372
  for (i = 0; i < pxu_count; i++) {
36285
301
    pxu_flag = tvb_get_uint8(tvb, offset);
36286
301
    proxy_info_len = 1 + 6 + 4 + ((pxu_flag & 0x2) ? 0 : 6) + ((pxu_flag & 0x4) ? 4 : 0);
36287
36288
301
    item = proto_tree_add_item(tree, hf_ieee80211_pxu_proxy_info, tvb, offset, proxy_info_len, ENC_NA);
36289
301
    subtree = proto_item_add_subtree(item, ett_pxu_proxy_info_tree);
36290
301
    proto_item_append_text(item, " #%u", (i + 1));
36291
36292
301
    proto_tree_add_bitmask_with_flags(subtree, tvb, offset, hf_ieee80211_pxu_proxy_info_flags,
36293
301
        ett_pxu_proxy_info_flags_tree, ieee80211_pxu_proxy_info_flags_byte,
36294
301
        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
36295
301
    offset += 1;
36296
36297
301
    proto_tree_add_item(subtree, hf_ieee80211_pxu_proxy_info_ext_mac, tvb, offset, 6, ENC_NA);
36298
301
    offset += 6;
36299
36300
301
    proto_tree_add_item(subtree, hf_ieee80211_pxu_proxy_info_seq_num, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36301
301
    offset += 4;
36302
36303
301
    if (!(pxu_flag & 0x2)) {
36304
148
      proto_tree_add_item(subtree, hf_ieee80211_pxu_proxy_info_proxy_mac, tvb, offset, 6, ENC_NA);
36305
148
      offset += 6;
36306
148
    }
36307
36308
301
    if (pxu_flag & 0x4) {
36309
109
      proto_tree_add_item(subtree, hf_ieee80211_pxu_proxy_info_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36310
109
      offset += 4;
36311
109
    }
36312
301
  }
36313
36314
71
  proto_item_append_text(field_data->item_tag, " (%d entr%s)", pxu_count, plurality(pxu_count, "y", "ies"));
36315
71
  return tvb_captured_length(tvb);
36316
95
}
36317
36318
static int
36319
ieee80211_tag_pxuc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
36320
31
{
36321
31
  int tag_len = tvb_reported_length(tvb);
36322
31
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36323
31
  int offset = 0;
36324
36325
  /* PXUC element (138) */
36326
31
  if (tag_len != 7) {
36327
26
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
36328
26
                           "Tag length %u wrong, must be = 7", tag_len);
36329
26
    return tvb_captured_length(tvb);
36330
26
  }
36331
36332
5
  proto_tree_add_item(tree, hf_ieee80211_pxuc_pxu_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36333
5
  offset += 1;
36334
5
  proto_tree_add_item(tree, hf_ieee80211_pxuc_pxu_recip_mac, tvb, offset, 6, ENC_NA);
36335
36336
5
  return tvb_captured_length(tvb);
36337
31
}
36338
36339
static int
36340
ieee80211_tag_mic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36341
65
{
36342
65
  int tag_len = tvb_reported_length(tvb);
36343
65
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36344
36345
65
  if ((tag_len != 16) && (tag_len != 24))
36346
61
  {
36347
61
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
36348
61
                           "MIC Tag Length %u wrong, must be 16 or 24", tag_len);
36349
61
    return tvb_captured_length(tvb);
36350
61
  }
36351
36352
4
  proto_tree_add_item(tree, hf_ieee80211_mesh_mic, tvb, 0, tag_len, ENC_NA);
36353
4
  return tvb_captured_length(tvb);
36354
65
}
36355
36356
static int
36357
ieee80211_tag_rann(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
36358
51
{
36359
51
  int offset = 0;
36360
51
  proto_tree_add_item(tree, hf_ieee80211_rann_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36361
51
  offset += 1;
36362
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36363
51
  offset += 1;
36364
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36365
51
  offset += 1;
36366
51
  proto_tree_add_item(tree, hf_ieee80211_rann_root_sta, tvb, offset, 6, ENC_NA);
36367
51
  offset += 6;
36368
51
  proto_tree_add_item(tree, hf_ieee80211_rann_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36369
51
  offset += 4;
36370
51
  proto_tree_add_item(tree, hf_ieee80211_rann_interval, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36371
51
  offset += 4;
36372
51
  proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36373
51
  return tvb_captured_length(tvb);
36374
51
}
36375
36376
/* Mesh Channel Switch Parameters (118) */
36377
static int
36378
ieee80211_tag_mesh_channel_switch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36379
45
{
36380
45
  int tag_len = tvb_reported_length(tvb);
36381
45
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36382
45
  int offset = 0;
36383
45
  static int * const ieee80211_mesh_chswitch_flag[] = {
36384
45
    &hf_ieee80211_mesh_chswitch_flag_initiator,
36385
45
    &hf_ieee80211_mesh_chswitch_flag_txrestrict,
36386
45
    NULL
36387
45
  };
36388
36389
45
  if (tag_len != 6)
36390
40
  {
36391
40
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
36392
40
    return tvb_captured_length(tvb);
36393
40
  }
36394
36395
5
  proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
36396
5
  proto_item_append_text(field_data->item_tag, " TTL: %d", tvb_get_uint8(tvb, offset));
36397
5
  offset += 1;
36398
36399
5
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_mesh_channel_switch_flag,
36400
5
                                   ett_mesh_chswitch_flag_tree, ieee80211_mesh_chswitch_flag, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
36401
5
  offset += 1;
36402
36403
5
  proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_reason_code, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36404
5
  offset += 2;
36405
36406
5
  proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_precedence_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36407
5
  return tvb_captured_length(tvb);
36408
45
}
36409
36410
/* Mesh Awake Window Parameters (119) */
36411
static int
36412
ieee80211_tag_mesh_awake_window(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36413
28
{
36414
28
  int tag_len = tvb_reported_length(tvb);
36415
28
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36416
28
  int offset = 0;
36417
36418
28
  if (tag_len != 2) {
36419
24
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
36420
24
        "Tag length %u wrong, must be = 2", tag_len);
36421
24
    return tvb_captured_length(tvb);
36422
24
  }
36423
36424
4
  proto_tree_add_item(tree, hf_ieee80211_mesh_awake_window, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36425
4
  return tvb_captured_length(tvb);
36426
28
}
36427
36428
static int
36429
ieee80211_tag_channel_switch_announcement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36430
49
{
36431
49
  int tag_len = tvb_reported_length(tvb);
36432
49
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36433
49
  int offset = 0;
36434
49
  if (tag_len != 4)
36435
46
  {
36436
46
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
36437
46
    return tvb_captured_length(tvb);
36438
46
  }
36439
36440
3
  add_ff_extended_channel_switch_announcement(tree, tvb, pinfo, offset);
36441
3
  return tvb_captured_length(tvb);
36442
49
}
36443
36444
static int
36445
ieee80211_tag_supported_operating_classes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36446
199
{
36447
199
  int tag_len = tvb_reported_length(tvb);
36448
199
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36449
199
  int offset = 0;
36450
199
  proto_item* item = NULL;
36451
199
  uint8_t field_len = 0;
36452
199
  uint8_t alt_op_class_field[256];
36453
36454
199
  if (tag_len < 2) {
36455
53
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 2", tag_len);
36456
53
    return tvb_captured_length(tvb);
36457
146
  } else if (tag_len > 255) {
36458
0
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, uint8 <= 255", tag_len);
36459
0
    return tvb_captured_length(tvb);
36460
0
  }
36461
36462
146
  proto_tree_add_item(tree, hf_ieee80211_tag_supported_ope_classes_current, tvb, offset++, 1, ENC_NA);
36463
36464
3.75k
  for (int i = offset; i < tag_len; i++) {
36465
3.70k
    uint8_t op_class =  tvb_get_uint8(tvb, i);
36466
    /* Field terminates immediately before OneHundredAndThirty or Zero delimiter */
36467
3.70k
    if (op_class == 130 || op_class == 0) {
36468
105
      break;
36469
105
    }
36470
3.60k
    alt_op_class_field[field_len++] = op_class;
36471
3.60k
  }
36472
146
  if (field_len) {
36473
128
    item = proto_tree_add_item(tree, hf_ieee80211_tag_supported_ope_classes_alternate, tvb, offset, field_len, ENC_NA);
36474
128
  }
36475
3.65k
  for (int i = 0; i < field_len; i++) {
36476
3.50k
    proto_item_append_text(item, i == 0 ? ": %d":", %d", alt_op_class_field[i]);
36477
3.50k
  }
36478
36479
  /* TODO parse optional Current Operating Class Extension Sequence field */
36480
  /* TODO parse optional Operating Class Duple Sequence field */
36481
146
  return tvb_captured_length(tvb);
36482
199
}
36483
36484
static int
36485
ieee80211_tag_bss_parameter_change(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36486
32
{
36487
32
  int tag_len = tvb_reported_length(tvb);
36488
32
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36489
32
  int offset = 0;
36490
32
  bool size;
36491
32
  if (tag_len != 7)
36492
30
  {
36493
30
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 7", tag_len);
36494
30
    return tvb_captured_length(tvb);
36495
30
  }
36496
2
  size = (tvb_get_uint8(tvb, offset) & 0x02) >> 1;
36497
2
  proto_tree_add_item(tree, hf_ieee80211_tag_move, tvb, offset, 1, ENC_NA);
36498
2
  proto_tree_add_item(tree, hf_ieee80211_tag_size, tvb, offset, 1, ENC_NA);
36499
2
  offset += 1;
36500
2
  proto_tree_add_item(tree, hf_ieee80211_tag_tbtt_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36501
2
  offset += 4;
36502
2
  if(size == true) { /* if size bit is 0, the field is reserved. */
36503
1
    proto_tree_add_item(tree, hf_ieee80211_tag_bi_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36504
1
  }
36505
2
  return tvb_captured_length(tvb);
36506
32
}
36507
36508
static int
36509
ieee80211_tag_dmg_capabilities(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36510
103
{
36511
103
  int tag_len = tvb_reported_length(tvb);
36512
103
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36513
103
  int offset = 0;
36514
103
  static int * const ieee80211_tag_dmg_cap1[] = {
36515
103
    &hf_ieee80211_tag_reverse_direction,
36516
103
    &hf_ieee80211_tag_hlts,
36517
103
    &hf_ieee80211_tag_tpc,
36518
103
    &hf_ieee80211_tag_spsh,
36519
103
    &hf_ieee80211_tag_rx_antenna,
36520
103
    &hf_ieee80211_tag_fast_link,
36521
103
    &hf_ieee80211_tag_num_sectors,
36522
103
    &hf_ieee80211_tag_rxss_length,
36523
103
    &hf_ieee80211_tag_reciprocity,
36524
103
    &hf_ieee80211_tag_max_ampdu_exp,
36525
103
    NULL
36526
103
  };
36527
36528
103
  static int * const ieee80211_tag_dmg_cap2[] = {
36529
103
    &hf_ieee80211_tag_min_mpdu_spacing,
36530
103
    &hf_ieee80211_tag_ba_flow_control,
36531
103
    &hf_ieee80211_tag_max_sc_rx_mcs,
36532
103
    &hf_ieee80211_tag_max_ofdm_rx_mcs,
36533
103
    &hf_ieee80211_tag_max_sc_tx_mcs,
36534
103
    &hf_ieee80211_tag_max_ofdm_tx_mcs,
36535
103
    NULL
36536
103
  };
36537
36538
103
  static int * const ieee80211_tag_dmg_cap3[] = {
36539
103
    &hf_ieee80211_tag_low_power_supported,
36540
103
    &hf_ieee80211_tag_code_rate,
36541
103
    &hf_ieee80211_tag_dtp,
36542
103
    &hf_ieee80211_tag_appdu_supp,
36543
103
    &hf_ieee80211_tag_heartbeat,
36544
103
    &hf_ieee80211_tag_other_aid,
36545
103
    &hf_ieee80211_tag_pattern_recip,
36546
103
    &hf_ieee80211_tag_heartbeat_elapsed,
36547
103
    &hf_ieee80211_tag_grant_ack_supp,
36548
103
    &hf_ieee80211_tag_RXSSTxRate_supp,
36549
103
    NULL
36550
103
  };
36551
36552
103
  static int * const ieee80211_tag_dmg_cap4[] = {
36553
103
    &hf_ieee80211_tag_pcp_tddti,
36554
103
    &hf_ieee80211_tag_pcp_PSA,
36555
103
    &hf_ieee80211_tag_pcp_handover,
36556
103
    &hf_ieee80211_tag_pcp_max_assoc,
36557
103
    &hf_ieee80211_tag_pcp_power_src,
36558
103
    &hf_ieee80211_tag_pcp_decenter,
36559
103
    &hf_ieee80211_tag_pcp_forwarding,
36560
103
    &hf_ieee80211_tag_pcp_center,
36561
103
    NULL
36562
103
  };
36563
36564
103
  static int * const ieee80211_tag_dmg_cap5[] = {
36565
103
    &hf_ieee80211_tag_ext_sc_mcs_max_tx,
36566
103
    &hf_ieee80211_tag_ext_sc_mcs_tx_code_7_8,
36567
103
    &hf_ieee80211_tag_ext_sc_mcs_max_rx,
36568
103
    &hf_ieee80211_tag_ext_sc_mcs_rx_code_7_8,
36569
103
    NULL
36570
103
  };
36571
36572
  /*
36573
   * Plenty of devices still do not conform to the older version of this
36574
   * field. So, it must be at least 17 bytes in length.
36575
   */
36576
103
  if (tag_len < 17)
36577
28
  {
36578
28
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must contain at least 17 bytes", tag_len);
36579
28
    return tvb_captured_length(tvb);
36580
28
  }
36581
36582
75
  proto_tree_add_item(tree, hf_ieee80211_tag_dmg_capa_sta_addr, tvb, offset, 6, ENC_NA);
36583
75
  offset += 6;
36584
75
  proto_tree_add_item(tree, hf_ieee80211_tag_dmg_capa_aid, tvb, offset, 1, ENC_NA);
36585
75
  offset += 1;
36586
75
  proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_dmg_cap1, ENC_LITTLE_ENDIAN);
36587
75
  offset += 3;
36588
75
  proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_dmg_cap2, ENC_LITTLE_ENDIAN);
36589
75
  offset += 3;
36590
75
  proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_dmg_cap3, ENC_LITTLE_ENDIAN);
36591
75
  offset += 2;
36592
75
  proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_dmg_cap4, ENC_LITTLE_ENDIAN);
36593
75
  offset += 2;
36594
36595
  /*
36596
   * There are many captures out there that do not conform to the 2016
36597
   * version, so give them a malformed IE message now after we have dissected
36598
   * the above
36599
   */
36600
75
  if (tag_len != 22)
36601
64
  {
36602
64
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u does not conform to IEEE802.11-2016, should contain 22 bytes", tag_len);
36603
64
    return tvb_captured_length(tvb);
36604
64
  }
36605
36606
11
  proto_tree_add_item(tree, hf_ieee80211_tag_sta_beam_track, tvb, offset, 2, ENC_NA);
36607
11
  offset += 2;
36608
11
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_dmg_cap5, ENC_LITTLE_ENDIAN);
36609
11
  offset += 1;
36610
11
  proto_tree_add_item(tree, hf_ieee80211_tag_max_basic_sf_amsdu, tvb, offset, 1, ENC_NA);
36611
11
  offset += 1;
36612
11
  proto_tree_add_item(tree, hf_ieee80211_tag_max_short_sf_amsdu, tvb, offset, 1, ENC_NA);
36613
36614
11
  return tvb_captured_length(tvb);
36615
75
}
36616
36617
static int
36618
ieee80211_tag_dmg_operation(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36619
36
{
36620
36
  int tag_len = tvb_reported_length(tvb);
36621
36
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36622
36
  int offset = 0;
36623
36
  static int * const ieee80211_tag_dmg_operation_flags[] = {
36624
36
    &hf_ieee80211_tag_pcp_tddti,
36625
36
    &hf_ieee80211_tag_pcp_PSA,
36626
36
    &hf_ieee80211_tag_pcp_handover,
36627
36
    NULL
36628
36
  };
36629
36630
36
  if (tag_len != 10)
36631
32
  {
36632
32
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 10", tag_len);
36633
32
    return tvb_captured_length(tvb);
36634
32
  }
36635
4
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_dmg_operation_flags, ENC_LITTLE_ENDIAN);
36636
4
  offset += 2;
36637
4
  proto_tree_add_item(tree, hf_ieee80211_tag_PSRSI, tvb, offset, 1, ENC_NA);
36638
4
  offset += 1;
36639
4
  proto_tree_add_item(tree, hf_ieee80211_tag_min_BHI_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36640
4
  offset += 2;
36641
4
  proto_tree_add_item(tree, hf_ieee80211_tag_brdct_sta_info_dur, tvb, offset, 1, ENC_NA);
36642
4
  offset += 1;
36643
4
  proto_tree_add_item(tree, hf_ieee80211_tag_assoc_resp_confirm_time, tvb, offset, 1, ENC_NA);
36644
4
  offset += 1;
36645
4
  proto_tree_add_item(tree, hf_ieee80211_tag_min_pp_duration, tvb, offset, 1, ENC_NA);
36646
4
  offset += 1;
36647
4
  proto_tree_add_item(tree, hf_ieee80211_tag_SP_idle_timeout, tvb, offset, 1, ENC_NA);
36648
4
  offset += 1;
36649
4
  proto_tree_add_item(tree, hf_ieee80211_tag_max_lost_beacons, tvb, offset, 1, ENC_NA);
36650
4
  return tvb_captured_length(tvb);
36651
36
}
36652
36653
static int
36654
ieee80211_tag_antenna_section_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36655
56
{
36656
56
  int tag_len = tvb_reported_length(tvb);
36657
56
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36658
56
  int offset = 0;
36659
56
  static int * const ieee80211_tag_antenna[] = {
36660
56
    &hf_ieee80211_tag_type,
36661
56
    &hf_ieee80211_tag_tap1,
36662
56
    &hf_ieee80211_tag_state1,
36663
56
    &hf_ieee80211_tag_tap2,
36664
56
    &hf_ieee80211_tag_state2,
36665
56
    NULL
36666
56
  };
36667
36668
56
  if (tag_len != 4)
36669
42
  {
36670
42
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
36671
42
    return tvb_captured_length(tvb);
36672
42
  }
36673
14
  proto_tree_add_bitmask_list(tree, tvb, offset, 4, ieee80211_tag_antenna, ENC_LITTLE_ENDIAN);
36674
14
  return tvb_captured_length(tvb);
36675
56
}
36676
36677
static int
36678
ieee80211_tag_extended_schedule(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36679
104
{
36680
104
  int tag_len = tvb_reported_length(tvb);
36681
104
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36682
104
  int offset = 0;
36683
104
  int i;
36684
104
  bool isGrant;
36685
104
  proto_tree * alloc_tree;
36686
104
  if ((tag_len%15) != 0)
36687
48
  {
36688
48
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be N*15 where 0<=N<=17", tag_len);
36689
48
    return tvb_captured_length(tvb);
36690
48
  }
36691
56
  isGrant = ((field_data->ftype==CTRL_GRANT)||(field_data->ftype==CTRL_GRANT_ACK));
36692
369
  for(i=0; i < tag_len; i+=15) {
36693
313
    alloc_tree = proto_tree_add_subtree_format(tree, tvb, offset, 15, ett_allocation_tree, NULL, "Allocation %d", i/15);
36694
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_allocation_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36695
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_allocation_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36696
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_pseudo_static, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36697
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_truncatable, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36698
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_extendable, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36699
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_pcp_active, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36700
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_lp_sc_used, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36701
313
    offset += 2;
36702
313
    offset += add_ff_beamforming_ctrl(alloc_tree, tvb, pinfo, offset, isGrant);
36703
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_src_aid, tvb, offset, 1, ENC_NA);
36704
313
    offset += 1;
36705
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_dest_aid, tvb, offset, 1, ENC_NA);
36706
313
    offset += 1;
36707
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36708
313
    offset += 4;
36709
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_block_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36710
313
    offset += 2;
36711
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_num_blocks, tvb, offset, 1, ENC_NA);
36712
313
    offset += 1;
36713
313
    proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_block_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36714
313
    offset += 2;
36715
313
  }
36716
56
  return tvb_captured_length(tvb);
36717
104
}
36718
36719
static int
36720
ieee80211_tag_sta_availability(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36721
68
{
36722
68
  int tag_len = tvb_reported_length(tvb);
36723
68
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36724
68
  int offset = 0;
36725
68
  int i;
36726
68
  proto_tree * sta_info_tree;
36727
68
  if ((tag_len%2) != 0)
36728
27
  {
36729
27
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be N*2 where N>=0", tag_len);
36730
27
    return tvb_captured_length(tvb);
36731
27
  }
36732
619
  for(i=0; i < tag_len; i+=2) {
36733
578
    sta_info_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_sta_info, NULL, "STA Info %d", i/2);
36734
578
    proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36735
578
    proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_cbap, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36736
578
    proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_pp_avail, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36737
578
    offset += 2;
36738
578
  }
36739
41
  return tvb_captured_length(tvb);
36740
68
}
36741
36742
static int
36743
ieee80211_tag_next_dmg_ati(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36744
45
{
36745
45
  int tag_len = tvb_reported_length(tvb);
36746
45
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36747
45
  int offset = 0;
36748
45
  if (tag_len != 6)
36749
41
  {
36750
41
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
36751
41
    return tvb_captured_length(tvb);
36752
41
  }
36753
4
  proto_tree_add_item(tree, hf_ieee80211_tag_next_ati_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36754
4
  offset += 4;
36755
4
  proto_tree_add_item(tree, hf_ieee80211_tag_next_ati_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36756
4
  return tvb_captured_length(tvb);
36757
45
}
36758
36759
static int
36760
ieee80211_tag_nextpcp_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36761
101
{
36762
101
  int tag_len = tvb_reported_length(tvb);
36763
101
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36764
101
  int offset = 0;
36765
101
  int i;
36766
101
  if (tag_len < 1)
36767
33
  {
36768
33
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 1", tag_len);
36769
33
    return tvb_captured_length(tvb);
36770
33
  }
36771
68
  proto_tree_add_item(tree, hf_ieee80211_tag_nextpcp_token, tvb, offset, 1, ENC_NA);
36772
68
  offset += 1;
36773
5.52k
  for(i=0; i < tag_len-1; i+=1) {
36774
5.45k
    proto_tree_add_item(tree, hf_ieee80211_tag_nextpcp_list, tvb, offset, 1, ENC_NA);
36775
5.45k
    offset += 1;
36776
5.45k
  }
36777
68
  return tvb_captured_length(tvb);
36778
101
}
36779
36780
static int
36781
ieee80211_tag_pcp_handover(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36782
52
{
36783
52
  int tag_len = tvb_reported_length(tvb);
36784
52
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36785
52
  int offset = 0;
36786
52
  if (tag_len != 13)
36787
48
  {
36788
48
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 13", tag_len);
36789
48
    return tvb_captured_length(tvb);
36790
48
  }
36791
4
  proto_tree_add_item(tree, hf_ieee80211_tag_old_bssid, tvb, offset, 6, ENC_NA);
36792
4
  offset += 6;
36793
4
  proto_tree_add_item(tree, hf_ieee80211_tag_new_pcp_addr, tvb, offset, 6, ENC_NA);
36794
4
  offset += 6;
36795
4
  proto_tree_add_item(tree, hf_ieee80211_tag_remaining_BI, tvb, offset, 1, ENC_NA);
36796
4
  return tvb_captured_length(tvb);
36797
52
}
36798
36799
static int
36800
ieee80211_tag_beamlink_maintenance(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36801
27
{
36802
27
  int tag_len = tvb_reported_length(tvb);
36803
27
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36804
27
  int offset = 0;
36805
27
  if (tag_len != 1)
36806
23
  {
36807
23
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
36808
23
    return tvb_captured_length(tvb);
36809
23
  }
36810
4
  add_ff_beamformed_link(tree, tvb, pinfo, offset);
36811
4
  return tvb_captured_length(tvb);
36812
27
}
36813
36814
static int
36815
ieee80211_tag_quiet_period_res(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36816
23
{
36817
23
  int tag_len = tvb_reported_length(tvb);
36818
23
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36819
23
  int offset = 0;
36820
23
  if (tag_len != 10)
36821
22
  {
36822
22
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 10", tag_len);
36823
22
    return tvb_captured_length(tvb);
36824
22
  }
36825
1
  proto_tree_add_item(tree, hf_ieee80211_tag_request_token, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36826
1
  offset += 2;
36827
1
  proto_tree_add_item(tree, hf_ieee80211_tag_bssid, tvb, offset, 6, ENC_NA);
36828
1
  offset += 6;
36829
1
  add_ff_sta_address(tree, tvb, pinfo, offset);
36830
1
  return tvb_captured_length(tvb);
36831
23
}
36832
36833
static int
36834
ieee80211_tag_relay_transfer_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36835
44
{
36836
44
  int tag_len = tvb_reported_length(tvb);
36837
44
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36838
44
  int offset = 0;
36839
36840
44
  if (tag_len != 8)
36841
42
  {
36842
42
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
36843
42
    return tvb_captured_length(tvb);
36844
42
  }
36845
2
  proto_tree_add_item(tree, hf_ieee80211_tag_duplex_relay, tvb, offset, 1, ENC_NA);
36846
2
  proto_tree_add_item(tree, hf_ieee80211_tag_cooperation_relay, tvb, offset, 1, ENC_NA);
36847
2
  proto_tree_add_item(tree, hf_ieee80211_tag_tx_mode, tvb, offset, 1, ENC_NA);
36848
2
  proto_tree_add_item(tree, hf_ieee80211_tag_link_change_interval, tvb, offset+1, 1, ENC_NA);
36849
2
  proto_tree_add_item(tree, hf_ieee80211_tag_data_sensing_time, tvb, offset+2, 1, ENC_NA);
36850
2
  proto_tree_add_item(tree, hf_ieee80211_tag_first_period, tvb, offset+3, 2, ENC_LITTLE_ENDIAN);
36851
2
  proto_tree_add_item(tree, hf_ieee80211_tag_second_period, tvb, offset+5, 2, ENC_LITTLE_ENDIAN);
36852
2
  return tvb_captured_length(tvb);
36853
44
}
36854
36855
static int
36856
ieee80211_tag_dmg_beam_refinement(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36857
72
{
36858
72
  int tag_len = tvb_reported_length(tvb);
36859
72
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36860
72
  int offset = 0;
36861
72
  static int * const ieee80211_dmg_beam_refinement_fields[] = {
36862
72
    &hf_ieee80211_tag_initiator,
36863
72
    &hf_ieee80211_tag_tx_train_res,
36864
72
    &hf_ieee80211_tag_rx_train_res,
36865
72
    &hf_ieee80211_tag_tx_trn_ok,
36866
72
    &hf_ieee80211_tag_txss_fbck_req,
36867
72
    &hf_ieee80211_tag_bs_fbck,
36868
72
    &hf_ieee80211_tag_bs_fbck_antenna_id,
36869
72
    &hf_ieee80211_tag_snr_requested,
36870
72
    &hf_ieee80211_tag_channel_measurement_requested,
36871
72
    &hf_ieee80211_tag_number_of_taps_requested,
36872
72
    &hf_ieee80211_tag_sector_id_order_req,
36873
72
    &hf_ieee80211_tag_snr_present,
36874
72
    &hf_ieee80211_tag_channel_measurement_present,
36875
72
    &hf_ieee80211_tag_tap_delay_present,
36876
72
    &hf_ieee80211_tag_number_of_taps_present,
36877
72
    &hf_ieee80211_tag_number_of_measurement,
36878
72
    &hf_ieee80211_tag_sector_id_order_present,
36879
72
    &hf_ieee80211_tag_number_of_beams,
36880
72
    &hf_ieee80211_tag_mid_extension,
36881
72
    &hf_ieee80211_tag_capability_request,
36882
72
    &hf_ieee80211_tag_beam_refine_reserved,
36883
72
    NULL
36884
72
  };
36885
36886
72
  if (tag_len != 5)
36887
70
  {
36888
70
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 5", tag_len);
36889
70
    return tvb_captured_length(tvb);
36890
70
  }
36891
36892
2
  proto_tree_add_bitmask_list(tree, tvb, offset, 5, ieee80211_dmg_beam_refinement_fields, ENC_LITTLE_ENDIAN);
36893
2
  return tvb_captured_length(tvb);
36894
72
}
36895
36896
static int
36897
ieee80211_tag_wakeup_schedule_ad(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36898
58
{
36899
58
  int tag_len = tvb_reported_length(tvb);
36900
58
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36901
58
  int offset = 0;
36902
36903
58
  if (tag_len != 8)
36904
54
  {
36905
54
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
36906
54
    return tvb_captured_length(tvb);
36907
54
  }
36908
4
  proto_tree_add_item(tree, hf_ieee80211_tag_bi_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36909
4
  offset += 4;
36910
4
  proto_tree_add_item(tree, hf_ieee80211_tag_sleep_cycle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36911
4
  offset += 2;
36912
4
  proto_tree_add_item(tree, hf_ieee80211_tag_num_awake_bis, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36913
4
  return tvb_captured_length(tvb);
36914
58
}
36915
36916
static int
36917
ieee80211_tag_dmg_tspec(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36918
55
{
36919
55
  int tag_len = tvb_reported_length(tvb);
36920
55
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36921
55
  int offset = 0;
36922
36923
55
  bool isGrant;
36924
55
  int num_constraints;
36925
55
  if (tag_len < 14)
36926
17
  {
36927
17
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 14", tag_len);
36928
17
    return tvb_captured_length(tvb);
36929
17
  }
36930
38
  static int * const ieee80211_tag_tspec_flags[] = {
36931
38
    &hf_ieee80211_tag_tspec_allocation_id,
36932
38
    &hf_ieee80211_tag_tspec_allocation_type,
36933
38
    &hf_ieee80211_tag_tspec_allocation_format,
36934
38
    &hf_ieee80211_tag_tspec_pseudo_static,
36935
38
    &hf_ieee80211_tag_tspec_truncatable,
36936
38
    &hf_ieee80211_tag_tspec_extendable,
36937
38
    &hf_ieee80211_tag_tspec_lp_sc_used,
36938
38
    &hf_ieee80211_tag_tspec_up,
36939
38
    &hf_ieee80211_tag_tap2,
36940
38
    &hf_ieee80211_tag_tspec_dest_aid,
36941
38
    NULL
36942
38
  };
36943
36944
38
  proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_tspec_flags, ENC_LITTLE_ENDIAN);
36945
38
  offset += 3;
36946
38
  isGrant = ((field_data->ftype==CTRL_GRANT)||(field_data->ftype==CTRL_GRANT_ACK));
36947
38
  offset += add_ff_beamforming_ctrl(tree, tvb, pinfo, 2, isGrant);
36948
38
  proto_tree_add_item(tree, hf_ieee80211_tag_tspec_allocation_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36949
38
  offset += 2;
36950
38
  proto_tree_add_item(tree, hf_ieee80211_tag_tspec_min_allocation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36951
38
  offset += 2;
36952
38
  proto_tree_add_item(tree, hf_ieee80211_tag_tspec_max_allocation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36953
38
  offset += 2;
36954
38
  proto_tree_add_item(tree, hf_ieee80211_tag_tspec_min_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36955
38
  offset += 2;
36956
38
  num_constraints = tvb_get_uint8(tvb, offset);
36957
38
  proto_tree_add_item(tree, hf_ieee80211_tag_tspec_num_of_constraints, tvb, offset, 1, ENC_NA);
36958
38
  offset += 1;
36959
53
  while(num_constraints > 0) {
36960
15
    proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
36961
15
    offset += 4;
36962
15
    proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36963
15
    offset += 2;
36964
15
    proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
36965
15
    offset += 2;
36966
15
    proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_interferer_mac, tvb, offset, 2, ENC_NA);
36967
15
    offset += 6;
36968
15
    num_constraints--;
36969
15
  }
36970
38
  return tvb_captured_length(tvb);
36971
55
}
36972
36973
static int
36974
ieee80211_tag_channel_measurement_fb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
36975
51
{
36976
51
  int tag_len = tvb_reported_length(tvb);
36977
51
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
36978
51
  int offset = 0;
36979
36980
51
  int num_measurement;
36981
51
  if (tag_len%5 != 0)
36982
32
  {
36983
32
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be multiple of 5", tag_len);
36984
32
    return tvb_captured_length(tvb);
36985
32
  }
36986
19
  num_measurement = tvb_get_uint8(tvb, offset+1);
36987
19
  offset += 2;
36988
254
  while(num_measurement > 0) {
36989
235
    proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset, 1, ENC_NA);
36990
235
    offset += 1;
36991
235
    proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_relative_I, tvb, offset, 1, ENC_NA);
36992
235
    offset += 1;
36993
235
    proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_relative_Q, tvb, offset, 1, ENC_NA);
36994
235
    offset += 1;
36995
235
    proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_tap_delay, tvb, offset, 1, ENC_NA);
36996
235
    offset += 1;
36997
235
    proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_sector_id, tvb, offset, 1, ENC_NA);
36998
235
    proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_antenna_id, tvb, offset, 1, ENC_NA);
36999
235
    offset += 1;
37000
235
    num_measurement--;
37001
235
  }
37002
19
  return tvb_captured_length(tvb);
37003
51
}
37004
37005
static int
37006
ieee80211_tag_awake_window(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37007
30
{
37008
30
  int tag_len = tvb_reported_length(tvb);
37009
30
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37010
37011
30
  if (tag_len != 2)
37012
26
  {
37013
26
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 2", tag_len);
37014
26
  }
37015
4
  else
37016
4
  {
37017
4
    proto_tree_add_item(tree, hf_ieee80211_tag_awake_window, tvb, 0, 2, ENC_LITTLE_ENDIAN);
37018
4
  }
37019
30
  return tvb_captured_length(tvb);
37020
30
}
37021
37022
static int
37023
ieee80211_tag_addba_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37024
37
{
37025
37
  int tag_len = tvb_reported_length(tvb);
37026
37
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37027
37028
37
  if (tag_len != 1)
37029
26
  {
37030
26
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
37031
26
  }
37032
11
  else
37033
11
  {
37034
11
    proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_no_frag, tvb, 0, 1, ENC_NA);
37035
11
    proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_he_fragmentation_operation, tvb, 0, 1, ENC_NA);
37036
11
    proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_reserved, tvb, 0, 1, ENC_NA);
37037
11
    proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_buffer_size, tvb, 0, 1, ENC_NA);
37038
11
  }
37039
37
  return tvb_captured_length(tvb);
37040
37
}
37041
37042
static int
37043
ieee80211_tag_multi_band(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37044
109
{
37045
109
  int tag_len = tvb_reported_length(tvb);
37046
109
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37047
109
  int offset = 0;
37048
109
  bool chiper_present, addr_present;
37049
109
  static int * const ieee80211_tag_multi_band_ctrl[] = {
37050
109
    &hf_ieee80211_tag_multi_band_ctrl_sta_role,
37051
109
    &hf_ieee80211_tag_multi_band_ctrl_addr_present,
37052
109
    &hf_ieee80211_tag_multi_band_ctrl_cipher_present,
37053
109
    NULL
37054
109
  };
37055
109
  static int * const ieee80211_tag_multi_band_conn[] = {
37056
109
    &hf_ieee80211_tag_multi_band_conn_ap,
37057
109
    &hf_ieee80211_tag_multi_band_conn_pcp,
37058
109
    &hf_ieee80211_tag_multi_band_conn_dls,
37059
109
    &hf_ieee80211_tag_multi_band_conn_tdls,
37060
109
    &hf_ieee80211_tag_multi_band_conn_ibss,
37061
109
    NULL
37062
109
  };
37063
37064
109
  if (tag_len < 22)
37065
24
  {
37066
24
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 22", tag_len);
37067
24
    return tvb_captured_length(tvb);
37068
24
  }
37069
85
  chiper_present = (tvb_get_letohs(tvb, offset) & 0x08) >> 3;
37070
85
  addr_present = (tvb_get_letohs(tvb, offset) & 0x10) >> 4;
37071
85
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_multi_band_ctrl, ENC_NA);
37072
85
  offset += 1;
37073
85
  offset += add_ff_band_id(tree, tvb, pinfo, 1);
37074
85
  proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_oper_class, tvb, offset, 1, ENC_NA);
37075
85
  offset += 1;
37076
85
  proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_channel_number, tvb, offset, 1, ENC_NA);
37077
85
  offset += 1;
37078
85
  proto_tree_add_item(tree, hf_ieee80211_tag_bssid, tvb, offset, 6, ENC_NA);
37079
85
  offset += 6;
37080
85
  offset += add_ff_beacon_interval(tree, tvb, pinfo, 2);
37081
85
  proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_tsf_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN);
37082
85
  offset += 8;
37083
37084
85
  proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_multi_band_conn, ENC_NA);
37085
85
  offset += 1;
37086
85
  proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_fst_timeout, tvb, offset, 1, ENC_NA);
37087
85
  offset += 1;
37088
85
  if(addr_present)
37089
58
  {
37090
58
    proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_sta_mac, tvb, offset, 6, ENC_NA);
37091
58
    offset += 6;
37092
58
  }
37093
85
  if(chiper_present)
37094
64
  {
37095
64
    proto_item *rsn_pcs_count, *rsn_pcs_item, *rsn_sub_pcs_item;
37096
64
    proto_tree *rsn_pcs_tree, *rsn_sub_pcs_tree;
37097
64
    int ii;
37098
64
    uint16_t    pcs_count;
37099
64
    int tag_end = tvb_reported_length(tvb);
37100
64
    rsn_pcs_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
37101
64
    pcs_count = tvb_get_letohs(tvb, offset);
37102
64
    offset += 2;
37103
37104
64
    if (offset + (pcs_count * 4) > tag_end)
37105
47
    {
37106
47
        expert_add_info_format(pinfo, rsn_pcs_count, &ei_ieee80211_rsn_pcs_count,
37107
47
        "Pairwise Cipher Suite Count too large, 4*%u > %d", pcs_count, tag_end - offset);
37108
47
        pcs_count = (tag_end - offset) / 4;
37109
47
    }
37110
37111
64
    rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, ENC_NA);
37112
64
    rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree);
37113
1.19k
    for (ii = 0; ii < pcs_count; ii++)
37114
1.13k
    {
37115
1.13k
      rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, ENC_BIG_ENDIAN);
37116
1.13k
      rsn_sub_pcs_tree = proto_item_add_subtree(rsn_sub_pcs_item, ett_rsn_sub_pcs_tree);
37117
1.13k
      proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
37118
37119
      /* Check if OUI is 00:0F:AC (ieee80211) */
37120
1.13k
      if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
37121
0
      {
37122
0
        proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
37123
0
        proto_item_append_text(rsn_pcs_item, " %s", rsn_pcs_return(pinfo->pool, tvb_get_ntohl(tvb, offset)));
37124
1.13k
      } else {
37125
1.13k
        proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
37126
1.13k
      }
37127
1.13k
      offset += 4;
37128
1.13k
    }
37129
64
  }
37130
37131
85
  return tvb_captured_length(tvb);
37132
109
}
37133
37134
static int
37135
ieee80211_tag_dmg_link_margin(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37136
36
{
37137
36
  int tag_len = tvb_reported_length(tvb);
37138
36
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37139
36
  int offset = 0;
37140
37141
36
  if (tag_len != 8)
37142
35
  {
37143
35
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
37144
35
    return tvb_captured_length(tvb);
37145
35
  }
37146
1
  proto_tree_add_item(tree, hf_ieee80211_tag_activity, tvb, offset, 1, ENC_NA);
37147
1
  offset += 1;
37148
1
  proto_tree_add_item(tree, hf_ieee80211_tag_dmg_link_adapt_mcs, tvb, offset, 1, ENC_NA);
37149
1
  offset += 1;
37150
1
  proto_tree_add_item(tree, hf_ieee80211_tag_dmg_link_adapt_link_margin, tvb, offset, 1, ENC_NA);
37151
1
  offset += 1;
37152
1
  proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset, 1, ENC_NA);
37153
1
  offset += 1;
37154
1
  proto_tree_add_item(tree, hf_ieee80211_tag_ref_timestamp, tvb, offset, 3, ENC_LITTLE_ENDIAN);
37155
1
  return tvb_captured_length(tvb);
37156
36
}
37157
37158
static int
37159
ieee80211_tag_dmg_link_adaption_ack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37160
33
{
37161
33
  int tag_len = tvb_reported_length(tvb);
37162
33
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37163
33
  int offset = 0;
37164
37165
33
  if (tag_len != 5)
37166
29
  {
37167
29
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 5", tag_len);
37168
29
    return tvb_captured_length(tvb);
37169
29
  }
37170
4
  proto_tree_add_item(tree, hf_ieee80211_tag_activity, tvb, offset, 1, ENC_NA);
37171
4
  offset += 1;
37172
4
  proto_tree_add_item(tree, hf_ieee80211_tag_ref_timestamp, tvb, offset, 3, ENC_LITTLE_ENDIAN);
37173
4
  return tvb_captured_length(tvb);
37174
33
}
37175
37176
static int
37177
ieee80211_tag_switching_stream(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37178
39
{
37179
39
  int tag_len = tvb_reported_length(tvb);
37180
39
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37181
39
  int offset = 0;
37182
39
  static int * const ieee80211_tag_switching_stream_flags[] = {
37183
39
    &hf_ieee80211_tag_switching_stream_old_tid,
37184
39
    &hf_ieee80211_tag_switching_stream_old_direction,
37185
39
    &hf_ieee80211_tag_switching_stream_new_tid,
37186
39
    &hf_ieee80211_tag_switching_stream_new_direction,
37187
39
    &hf_ieee80211_tag_switching_stream_new_valid_id,
37188
39
    &hf_ieee80211_tag_switching_stream_llt_type,
37189
39
    NULL
37190
39
  };
37191
37192
39
  int param_num;
37193
39
  if (tag_len < 4)
37194
8
  {
37195
8
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 4", tag_len);
37196
8
    return tvb_captured_length(tvb);
37197
8
  }
37198
31
  offset += add_ff_band_id(tree, tvb, pinfo, 1);
37199
31
  offset += add_ff_band_id(tree, tvb, pinfo, 1);
37200
31
  proto_tree_add_item(tree, hf_ieee80211_tag_switching_stream_non_qos, tvb, offset, 1, ENC_NA);
37201
31
  offset += 1;
37202
31
  param_num = tvb_get_letohs(tvb, offset);
37203
31
  proto_tree_add_item(tree, hf_ieee80211_tag_switching_stream_param_num, tvb, offset, 1, ENC_NA);
37204
31
  offset += 1;
37205
399
  while(param_num > 0)
37206
368
  {
37207
368
    proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_switching_stream_flags, ENC_NA);
37208
368
    param_num--;
37209
368
    offset += 2;
37210
368
  }
37211
31
  return tvb_captured_length(tvb);
37212
39
}
37213
37214
static const range_string channel_usage_mode[] = {
37215
  { 0, 0, "Channel-usage-aidable BSS" },
37216
  { 1, 1, "Off-channel TDLS Direct Link" },
37217
  { 2, 2, "Channel-usage-aidable BSS in which none of the channel-usage-aiding BSSs that belong to the same ESS" },
37218
  { 3, 3, "Unavailability Indication" },
37219
  { 4, 4, "Channel-usage-aidable BSS Channel Switch Request" },
37220
  { 5, 5, "Capability Notification" },
37221
  { 6, 254, "Reserved" },
37222
  { 255, 255, "Unknown Request" },
37223
  { 0, 0, NULL }
37224
};
37225
37226
static int
37227
ieee80211_tag_channel_usage(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
37228
130
{
37229
130
  int tag_len = tvb_reported_length(tvb);
37230
130
  ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
37231
130
  int offset = 0;
37232
37233
130
  if (tag_len < 1)
37234
27
  {
37235
27
    expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 1", tag_len);
37236
27
    return tvb_captured_length(tvb);
37237
27
  }
37238
37239
103
  proto_tree_add_item(tree, hf_ieee80211_tag_channel_usage_mode, tvb, offset, 1, ENC_NA);
37240
103
  offset += 1;
37241
37242
3.48k
  while (offset < tag_len) {
37243
3.37k
    offset += add_ff_operating_class(tree, tvb, pinfo, offset);
37244
3.37k
    offset += add_ff_channel(tree, tvb, pinfo, offset);
37245
3.37k
  }
37246
37247
103
  return tvb_captured_length(tvb);
37248
130
}
37249
37250
static void
37251
ieee_80211_add_tagged_parameters(tvbuff_t *tvb, int offset, packet_info *pinfo,
37252
                                  proto_tree *tree, int tagged_parameters_len, int ftype,
37253
                                  association_sanity_check_t *association_sanity_check)
37254
4.93k
{
37255
4.93k
  int next_len;
37256
4.93k
  beacon_padding = 0; /* this is for the beacon padding confused with ssid fix */
37257
70.0k
  while (tagged_parameters_len > 0) {
37258
65.1k
    uint8_t tag_no = tvb_get_uint8(tvb, offset);
37259
37260
    /* TODO make callers optionally specify the list of valid IE IDs? */
37261
65.1k
    if ((next_len=add_tagged_field (pinfo, tree, tvb, offset, ftype, NULL, 0, association_sanity_check)) == 0)
37262
0
      break;
37263
65.1k
    if (next_len > tagged_parameters_len) {
37264
      /* XXX - flag this as an error? */
37265
1.62k
      next_len = tagged_parameters_len;
37266
1.62k
    }
37267
65.1k
    offset                += next_len;
37268
65.1k
    tagged_parameters_len -= next_len;
37269
37270
    /* If FILS is used, all data after the FILS Session tag in a (re)association message is encrypted */
37271
65.1k
    if (association_sanity_check != NULL && association_sanity_check->has_fils_session) {
37272
3
      proto_tree_add_item(tree, hf_ieee80211_fils_encrypted_data, tvb, offset, tagged_parameters_len, ENC_NA);
37273
3
      break;
37274
3
    }
37275
37276
    /* In an AMPE frame the data following the MIC element is encrypted */
37277
65.1k
    if ((tag_no == TAG_MIC) && (association_sanity_check != NULL) && association_sanity_check->ampe_frame) {
37278
0
      proto_tree_add_item(tree, hf_ieee80211_mesh_ampe_encrypted_data, tvb, offset, tagged_parameters_len, ENC_NA);
37279
0
      break;
37280
0
    }
37281
65.1k
  }
37282
4.93k
}
37283
37284
static void
37285
ieee_80211_do_association_sanity_check(packet_info *pinfo, association_sanity_check_t *sanity_check)
37286
734
{
37287
  /* Given a [re-]association request frame, consider it in its totality and
37288
     add expert information as appropriate */
37289
37290
734
  if (sanity_check->association_has_mobility_domain_element) {
37291
    /* This is an FT association, warn about any non-FT AKM suites */
37292
16
    if (sanity_check->has_non_ft_akm_suite) {
37293
0
      expert_add_info_format(pinfo, sanity_check->rsn_first_non_ft_akm_suite, &ei_ieee80211_mismatched_akm_suite,
37294
0
                             "Non-FT AKM suite is prohibited for FT association request");
37295
0
    }
37296
718
  } else {
37297
    /* This is a non-FT association, warn about any FT AKM suites */
37298
718
    if (sanity_check->has_ft_akm_suite) {
37299
0
      expert_add_info_format(pinfo, sanity_check->rsn_first_ft_akm_suite, &ei_ieee80211_mismatched_akm_suite,
37300
0
                             "FT AKM suite is prohibited for non-FT association request");
37301
0
    }
37302
718
  }
37303
734
}
37304
37305
/* ************************************************************************* */
37306
/*                     Dissect 802.11 management frame                       */
37307
/* ************************************************************************* */
37308
static void dissect_mgt_action(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned offset, association_sanity_check_t *sanity_check)
37309
1.37k
{
37310
1.37k
  proto_item *lcl_fixed_hdr;
37311
1.37k
  proto_tree *lcl_fixed_tree;
37312
1.37k
  proto_tree *tagged_tree;
37313
1.37k
  int         tagged_parameter_tree_len;
37314
37315
1.37k
  lcl_fixed_tree = proto_tree_add_subtree(tree, tvb, 0, 0, ett_fixed_parameters, &lcl_fixed_hdr, "Fixed parameters");
37316
1.37k
  offset += add_ff_action(lcl_fixed_tree, tvb, pinfo, 0, sanity_check);
37317
37318
1.37k
  proto_item_set_len(lcl_fixed_hdr, offset);
37319
1.37k
  if (ieee80211_tvb_invalid)
37320
1
    return; /* Buffer not available for further processing */
37321
1.36k
  tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
37322
1.36k
  if (tagged_parameter_tree_len > 0) {
37323
1.26k
    tagged_tree = get_tagged_parameter_tree(tree, tvb, offset,
37324
1.26k
                                            tagged_parameter_tree_len);
37325
1.26k
    ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37326
1.26k
                                     tagged_parameter_tree_len, MGT_ACTION,
37327
1.26k
                                     sanity_check);
37328
1.26k
    }
37329
1.36k
}
37330
37331
static void
37332
dissect_ieee80211_mgt(uint16_t fcf, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
37333
2.90k
{
37334
2.90k
  proto_item *ti;
37335
2.90k
  proto_tree *mgt_tree;
37336
2.90k
  proto_tree *fixed_tree;
37337
2.90k
  proto_tree *tagged_tree;
37338
2.90k
  int         offset = 0;
37339
2.90k
  int         tagged_parameter_tree_len;
37340
2.90k
  bool        is_s1g = sta_is_s1g(pinfo);
37341
37342
2.90k
  conversation_t *conversation;
37343
2.90k
  ieee80211_conversation_data_t *conversation_data;
37344
37345
2.90k
  association_sanity_check_t association_sanity_check;
37346
2.90k
  memset(&association_sanity_check, 0, sizeof(association_sanity_check));
37347
37348
37349
2.90k
  ieee80211_tvb_invalid = false;
37350
37351
2.90k
  ti = proto_tree_add_item(tree, hf_ieee80211_mgt, tvb, 0, -1, ENC_NA);
37352
2.90k
  mgt_tree = proto_item_add_subtree(ti, ett_80211_mgt);
37353
  /*
37354
   * Add the frame type to the pinfo for those cases where it is needed
37355
   * to determine other things.
37356
   * XXX - Is there any reason why this is file scoped? Couldn't this
37357
   * be pinfo->pool?
37358
   */
37359
2.90k
  p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, FRAME_TYPE_KEY, GINT_TO_POINTER(COMPOSE_FRAME_TYPE(fcf)));
37360
37361
2.90k
  switch (COMPOSE_FRAME_TYPE(fcf))
37362
2.90k
  {
37363
37364
1.94k
    case MGT_ASSOC_REQ:
37365
1.94k
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 4, false);
37366
1.94k
      add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
37367
1.94k
      add_ff_listen_ival(fixed_tree, tvb, pinfo, 2);
37368
1.94k
      offset = 4;  /* Size of fixed fields */
37369
37370
1.94k
      tagged_parameter_tree_len =
37371
1.94k
          tvb_reported_length_remaining(tvb, offset);
37372
1.94k
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37373
1.94k
                 tagged_parameter_tree_len);
37374
1.94k
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37375
1.94k
          tagged_parameter_tree_len, MGT_ASSOC_REQ, &association_sanity_check);
37376
1.94k
      ieee_80211_do_association_sanity_check(pinfo, &association_sanity_check);
37377
37378
1.94k
      if (!pinfo->fd->visited) {
37379
702
        if (!assoc_counter_in_auth) {
37380
702
          association_counter++;
37381
702
          p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, ASSOC_COUNTER_KEY,
37382
702
                           GUINT_TO_POINTER(association_counter));
37383
702
        } else {
37384
0
          assoc_counter_in_auth = 0;
37385
0
        }
37386
702
      }
37387
1.94k
      conversation = find_or_create_wlan_conversation(pinfo);
37388
1.94k
      conversation_data = get_or_create_conversation_data(conversation);
37389
1.94k
      set_conversation_last_akm_suite(conversation_data,
37390
1.94k
                                      association_sanity_check.last_akm_suite);
37391
1.94k
      conversation_data->owe_group = association_sanity_check.owe_group;
37392
1.94k
      break;
37393
37394
37395
63
    case MGT_ASSOC_RESP:
37396
63
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, is_s1g ? 4 : 6,
37397
63
                                            false);
37398
63
      add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
37399
63
      add_ff_status_code(fixed_tree, tvb, pinfo, 2);
37400
63
      if (!is_s1g) {
37401
56
        add_ff_assoc_id(fixed_tree, tvb, pinfo, 4);
37402
56
        offset = 6;  /* Size of fixed fields */
37403
56
      } else {
37404
7
        offset = 4;
37405
7
      }
37406
37407
63
      tagged_parameter_tree_len =
37408
63
          tvb_reported_length_remaining(tvb, offset);
37409
63
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37410
63
                 tagged_parameter_tree_len);
37411
63
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37412
63
          tagged_parameter_tree_len, MGT_ASSOC_RESP, &association_sanity_check);
37413
63
      break;
37414
37415
37416
67
    case MGT_REASSOC_REQ:
37417
67
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 10, false);
37418
67
      add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
37419
67
      add_ff_listen_ival(fixed_tree, tvb, pinfo, 2);
37420
67
      add_ff_current_ap_addr(fixed_tree, tvb, pinfo, 4);
37421
67
      offset = 10;  /* Size of fixed fields */
37422
37423
67
      tagged_parameter_tree_len =
37424
67
          tvb_reported_length_remaining(tvb, offset);
37425
67
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37426
67
                 tagged_parameter_tree_len);
37427
67
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37428
67
          tagged_parameter_tree_len, MGT_REASSOC_REQ, &association_sanity_check);
37429
67
      ieee_80211_do_association_sanity_check(pinfo, &association_sanity_check);
37430
37431
67
      if (!pinfo->fd->visited) {
37432
32
        if (!assoc_counter_in_auth) {
37433
32
          association_counter++;
37434
32
          p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, ASSOC_COUNTER_KEY,
37435
32
                           GUINT_TO_POINTER(association_counter));
37436
32
        } else {
37437
0
          assoc_counter_in_auth = 0;
37438
0
        }
37439
32
      }
37440
67
      conversation = find_or_create_wlan_conversation(pinfo);
37441
67
      conversation_data = get_or_create_conversation_data(conversation);
37442
67
      set_conversation_last_akm_suite(conversation_data,
37443
67
                                      association_sanity_check.last_akm_suite);
37444
67
      conversation_data->owe_group = association_sanity_check.owe_group;
37445
67
      break;
37446
37447
41
    case MGT_REASSOC_RESP:
37448
41
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 6, false);
37449
41
      add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
37450
41
      add_ff_status_code(fixed_tree, tvb, pinfo, 2);
37451
41
      if (!is_s1g) {
37452
36
        add_ff_assoc_id(fixed_tree, tvb, pinfo, 4);
37453
36
        offset = 6;  /* Size of fixed fields */
37454
36
      } else {
37455
5
        offset = 4;
37456
5
      }
37457
37458
41
      tagged_parameter_tree_len =
37459
41
          tvb_reported_length_remaining(tvb, offset);
37460
41
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37461
41
                 tagged_parameter_tree_len);
37462
41
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37463
41
          tagged_parameter_tree_len, MGT_REASSOC_RESP, &association_sanity_check);
37464
41
      break;
37465
37466
37467
77
    case MGT_PROBE_REQ:
37468
77
      offset = 0;
37469
77
      tagged_parameter_tree_len =
37470
77
          tvb_reported_length_remaining(tvb, offset);
37471
77
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37472
77
                 tagged_parameter_tree_len);
37473
77
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37474
77
          tagged_parameter_tree_len, MGT_PROBE_REQ, NULL);
37475
77
      break;
37476
37477
76
    case MGT_PROBE_RESP:
37478
76
    {
37479
76
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12, false);
37480
76
      add_ff_timestamp(fixed_tree, tvb, pinfo, 0);
37481
76
      add_ff_beacon_interval(fixed_tree, tvb, pinfo, 8);
37482
76
      add_ff_cap_info(fixed_tree, tvb, pinfo, 10);
37483
76
      offset = 12;  /* Size of fixed fields */
37484
37485
76
      tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
37486
76
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset, tagged_parameter_tree_len);
37487
76
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, MGT_PROBE_RESP, NULL);
37488
76
      break;
37489
0
    }
37490
33
    case MGT_MEASUREMENT_PILOT:
37491
33
    {
37492
33
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12, false);
37493
33
      offset += add_ff_timestamp(fixed_tree, tvb, pinfo, offset);
37494
33
      offset += add_ff_measurement_pilot_int(fixed_tree, tvb, pinfo, offset);
37495
33
      offset += add_ff_beacon_interval(fixed_tree, tvb, pinfo, offset);
37496
33
      offset += add_ff_cap_info(fixed_tree, tvb, pinfo, offset);
37497
33
      offset += add_ff_country_str(fixed_tree, tvb, pinfo, offset);
37498
33
      offset += add_ff_max_reg_pwr(fixed_tree, tvb, pinfo, offset);
37499
33
      offset += add_ff_max_tx_pwr(fixed_tree, tvb, pinfo, offset);
37500
33
      offset += add_ff_tx_pwr_used(fixed_tree, tvb, pinfo, offset);
37501
33
      offset += add_ff_transceiver_noise_floor(fixed_tree, tvb, pinfo, offset);
37502
      /* TODO DS Parameter Set ??? */
37503
37504
33
      tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
37505
33
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset, tagged_parameter_tree_len);
37506
33
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, MGT_MEASUREMENT_PILOT, NULL);
37507
33
      break;
37508
0
    }
37509
75
    case MGT_BEACON:    /* Dissect protocol payload fields  */
37510
75
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12, false);
37511
75
      add_ff_timestamp(fixed_tree, tvb, pinfo, 0);
37512
75
      add_ff_beacon_interval(fixed_tree, tvb, pinfo, 8);
37513
75
      add_ff_cap_info(fixed_tree, tvb, pinfo, 10);
37514
75
      offset = 12;  /* Size of fixed fields */
37515
37516
75
      tagged_parameter_tree_len =
37517
75
          tvb_reported_length_remaining(tvb, offset);
37518
75
      tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37519
75
      tagged_parameter_tree_len);
37520
75
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37521
75
      tagged_parameter_tree_len, MGT_BEACON, NULL);
37522
75
      break;
37523
37524
0
    case MGT_ATIM:
37525
0
      break;
37526
37527
69
    case MGT_DISASS:
37528
69
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 2, false);
37529
69
      add_ff_reason_code(fixed_tree, tvb, pinfo, 0);
37530
69
      offset = 2; /* Size of fixed fields */
37531
69
      tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
37532
69
      if (tagged_parameter_tree_len > 0) {
37533
67
        tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37534
67
                                                tagged_parameter_tree_len);
37535
67
        ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37536
67
                                         tagged_parameter_tree_len, MGT_DISASS, NULL);
37537
67
      }
37538
37539
69
      conversation = find_wlan_conversation_pinfo(pinfo);
37540
69
      if (conversation) {
37541
2
        conversation_delete_proto_data(conversation, proto_wlan);
37542
2
      }
37543
69
      break;
37544
37545
44
    case MGT_AUTHENTICATION:
37546
44
      offset = 6;  /* Size of fixed fields */
37547
37548
44
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, offset, true);
37549
44
      offset = dissect_auth_frame(fixed_tree, pinfo, tvb);
37550
44
      proto_item_append_text(fixed_tree, " (%d bytes)", offset);
37551
44
      proto_item_set_len(fixed_tree, offset);
37552
37553
44
      tagged_parameter_tree_len =
37554
44
        tvb_reported_length_remaining(tvb, offset);
37555
44
      if (tagged_parameter_tree_len > 0)
37556
37
      {
37557
37
        tagged_tree = get_tagged_parameter_tree(mgt_tree,
37558
37
            tvb,
37559
37
            offset,
37560
37
            tagged_parameter_tree_len);
37561
37
        ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37562
37
        tagged_parameter_tree_len, MGT_AUTHENTICATION, NULL);
37563
37
      }
37564
44
      break;
37565
37566
38
    case MGT_DEAUTHENTICATION:
37567
38
      fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 2, false);
37568
38
      add_ff_reason_code(fixed_tree, tvb, pinfo, 0);
37569
38
      offset = 2; /* Size of fixed fields */
37570
38
      tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
37571
38
      if (tagged_parameter_tree_len > 0) {
37572
37
        tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37573
37
                                                tagged_parameter_tree_len);
37574
37
        ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37575
37
                                         tagged_parameter_tree_len, MGT_DEAUTHENTICATION, NULL);
37576
37
      }
37577
37578
38
      conversation = find_wlan_conversation_pinfo(pinfo);
37579
38
      if (conversation) {
37580
0
        conversation_delete_proto_data(conversation, proto_wlan);
37581
0
      }
37582
38
      break;
37583
37584
81
    case MGT_ACTION:
37585
81
      dissect_mgt_action(tvb, pinfo, mgt_tree, offset, &association_sanity_check);
37586
81
      break;
37587
37588
287
    case MGT_ACTION_NO_ACK:
37589
287
    {
37590
287
      proto_item *lcl_fixed_hdr;
37591
287
      proto_tree *lcl_fixed_tree;
37592
287
      lcl_fixed_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, &lcl_fixed_hdr, "Fixed parameters");
37593
37594
287
      offset += add_ff_action(lcl_fixed_tree, tvb, pinfo, 0, NULL);
37595
37596
287
      proto_item_set_len(lcl_fixed_hdr, offset);
37597
287
      if (ieee80211_tvb_invalid)
37598
0
        break; /* Buffer not available for further processing */
37599
287
      tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
37600
287
      if (tagged_parameter_tree_len > 0)
37601
140
      {
37602
140
        tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
37603
140
          tagged_parameter_tree_len);
37604
140
        ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
37605
140
          tagged_parameter_tree_len, MGT_ACTION_NO_ACK, NULL);
37606
140
      }
37607
287
      break;
37608
287
    }
37609
3
    case MGT_ARUBA_WLAN:
37610
3
    {
37611
3
      proto_tree *aruba_tree;
37612
3
      uint16_t type;
37613
3
      type = tvb_get_ntohs(tvb, offset);
37614
37615
3
      aruba_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, NULL, "Aruba Management");
37616
37617
3
      proto_tree_add_item(aruba_tree, hf_ieee80211_aruba, tvb, offset, 2, ENC_BIG_ENDIAN);
37618
3
      offset += 2;
37619
3
      switch(type){
37620
0
        case 0x0003: /* MTU Size */
37621
0
          proto_tree_add_item(aruba_tree, hf_ieee80211_aruba_mtu, tvb, offset, 2, ENC_BIG_ENDIAN);
37622
0
        break;
37623
0
        case 0x0005: /* HeartBeat Sequence */
37624
0
          proto_tree_add_item(aruba_tree, hf_ieee80211_aruba_hb_seq, tvb, offset, 8, ENC_BIG_ENDIAN);
37625
0
        break;
37626
3
      }
37627
2
      break;
37628
3
    }
37629
2.90k
  }
37630
2.90k
}
37631
37632
/*
37633
 * Dissect a Block Ack request (which is also used in Trigger frames).
37634
 */
37635
static int * const block_ack_control_headers[] = {
37636
  &hf_ieee80211_block_ack_control_ack_policy,
37637
  &hf_ieee80211_block_ack_control_type,
37638
  &hf_ieee80211_block_ack_control_reserved,
37639
  &hf_ieee80211_block_ack_control_tid_info,
37640
  NULL
37641
};
37642
37643
static int * const multi_sta_aid_tid_headers[] = {
37644
  &hf_ieee80211_block_ack_multi_sta_aid11,
37645
  &hf_ieee80211_block_ack_multi_sta_ack_type,
37646
  &hf_ieee80211_block_ack_multi_sta_tid,
37647
 NULL
37648
};
37649
37650
/*
37651
 * These bits are shown in reverse order in the spec.
37652
 */
37653
515
#define BASIC_BLOCK_ACK               0x0
37654
210
#define EXTENDED_COMPRESSED_BLOCK_ACK 0x1
37655
209
#define COMPRESSED_BLOCK_ACK          0x2
37656
140
#define MULTI_TID_BLOCK_ACK           0x3
37657
154
#define GCR_BLOCK_ACK                 0x6
37658
#define GLK_GCR_BLOCK_ACK             0xA
37659
126
#define MULTI_STA_BLOCK_ACK           0xB
37660
37661
static const value_string block_ack_type_vals[] = {
37662
  { BASIC_BLOCK_ACK,               "Basic BlockAck" },
37663
  { EXTENDED_COMPRESSED_BLOCK_ACK, "Extended Compressed BlockAck" },
37664
  { COMPRESSED_BLOCK_ACK,          "Compressed BlockAck" },
37665
  { MULTI_TID_BLOCK_ACK,           "Multi-TID BlockAck" },
37666
  { GCR_BLOCK_ACK,                 "GCR BlockAck" },
37667
  { GLK_GCR_BLOCK_ACK,             "GLK-GCR BlockAck" },
37668
  { MULTI_STA_BLOCK_ACK,           "Multi-STA BlockAck" },
37669
  { 0, NULL }
37670
};
37671
37672
static int
37673
dissect_ieee80211_block_ack_bitmap(tvbuff_t *tvb, packet_info *pinfo _U_,
37674
  proto_tree *tree, int offset, uint16_t ssn, unsigned bitmap_size)
37675
1.41k
{
37676
1.41k
  uint64_t    bitmap;
37677
1.41k
  uint16_t    last_ack_frame_pos = 0;
37678
1.41k
  int         f;
37679
1.41k
  int         i;
37680
1.41k
  unsigned    j;
37681
37682
1.41k
  proto_item *ba_bitmap_item = proto_tree_add_item(tree,
37683
1.41k
                          hf_ieee80211_block_ack_bitmap,
37684
1.41k
                          tvb, offset, bitmap_size, ENC_NA);
37685
1.41k
  proto_item *ba_bitmap_tree = proto_item_add_subtree(ba_bitmap_item,
37686
1.41k
                          ett_block_ack_bitmap);
37687
1.41k
  proto_item * last_ack_frame_item;
37688
37689
  /* Handle bitmap_size = 4 for Multi-STA block ack */
37690
1.41k
  if (bitmap_size == 4)
37691
454
  {
37692
454
     bitmap = tvb_get_letohl(tvb, offset);
37693
37694
454
    if (bitmap != 0)
37695
436
      last_ack_frame_pos = ws_ilog2(bitmap);
37696
37697
12.3k
    for (f = 0; f < last_ack_frame_pos && f < 32; f++) {
37698
11.9k
      if (bitmap & (UINT64_C(1) << f))
37699
5.99k
        continue;
37700
5.91k
      proto_tree_add_uint_format_value(ba_bitmap_tree,
37701
5.91k
                    hf_ieee80211_block_ack_bitmap_missing_frame,
37702
5.91k
                    tvb, offset + (f/8), 1, ssn + f, "%u",
37703
5.91k
                    (ssn + f) & 0x0fff);
37704
5.91k
    }
37705
37706
962
  } else {
37707
    /* Browse the bitmap backwards to find the last acknowledged frame */
37708
1.13k
    for (i = bitmap_size - 8; i >= 0; i -= 8) {
37709
907
      bitmap = tvb_get_letoh64(tvb, offset + i);
37710
37711
907
      if (bitmap == 0)
37712
176
        continue;
37713
37714
731
      last_ack_frame_pos = i * 8 + ws_ilog2(bitmap);
37715
731
      break;
37716
907
    }
37717
37718
    /* Browse the bitmap up to the last the last acknowledged frame */
37719
2.78k
      for (j = 0; j < bitmap_size * 8; j += 64) {
37720
1.82k
      bitmap = tvb_get_letoh64(tvb, offset + j/8);
37721
101k
      for (f = 0; f < 64 && (f + j) < last_ack_frame_pos; f++) {
37722
99.2k
        if (bitmap & (UINT64_C(1) << f))
37723
35.3k
          continue;
37724
63.9k
        proto_tree_add_uint_format_value(ba_bitmap_tree,
37725
63.9k
                      hf_ieee80211_block_ack_bitmap_missing_frame,
37726
63.9k
                      tvb, offset + ((f + j)/8), 1, ssn + f + j, "%u",
37727
63.9k
                      (ssn + f + j) & 0x0fff);
37728
63.9k
      }
37729
1.82k
    }
37730
962
  }
37731
37732
1.41k
  last_ack_frame_item = proto_tree_add_uint_format_value(ba_bitmap_tree,
37733
1.41k
    hf_ieee80211_block_ack_bitmap_last_ack_frame,
37734
1.41k
    tvb, offset + (last_ack_frame_pos/8), 1, ssn + last_ack_frame_pos, "%u",
37735
1.41k
    (ssn + last_ack_frame_pos) & 0x0fff);
37736
1.41k
  proto_item_set_generated(last_ack_frame_item);
37737
37738
1.41k
  return offset + bitmap_size;
37739
1.41k
}
37740
37741
static int
37742
dissect_ieee80211_block_ack_details(tvbuff_t *tvb, packet_info *pinfo _U_,
37743
  proto_tree *tree, int offset, bool isDMG, bool is_req, bool has_fcs)
37744
2.03k
{
37745
2.03k
  proto_item     *pi;
37746
2.03k
  uint16_t        ba_control;
37747
2.03k
  uint8_t         block_ack_type;
37748
2.03k
  proto_tree     *ba_tree;
37749
2.03k
  uint8_t         tid_count, frag_num;
37750
2.03k
  unsigned        i;
37751
2.03k
  proto_tree     *ba_mtid_tree, *ba_mtid_sub_tree;
37752
2.03k
  uint16_t        ssn;
37753
2.03k
  uint16_t        aid_tid;
37754
2.03k
  proto_tree     *ba_multi_sta_tree;
37755
2.03k
  int             ba_start = offset;
37756
37757
2.03k
  ba_control = tvb_get_letohs(tvb, offset);
37758
2.03k
  block_ack_type = (ba_control & 0x001E) >> 1;
37759
2.03k
  ba_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_block_ack,
37760
2.03k
                        &pi, is_req ? "%s Request" : "%s Response",
37761
2.03k
                        val_to_str(block_ack_type, block_ack_type_vals,
37762
2.03k
                                "Reserved (%d)"));
37763
2.03k
  proto_tree_add_bitmask_with_flags(ba_tree, tvb, offset,
37764
2.03k
                        hf_ieee80211_block_ack_control,
37765
2.03k
                        ett_block_ack_request_control,
37766
2.03k
                        block_ack_control_headers,
37767
2.03k
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
37768
2.03k
  offset += 2;
37769
37770
2.03k
  switch (block_ack_type) {
37771
515
  case BASIC_BLOCK_ACK:
37772
515
    if (isDMG == true) {
37773
0
      expert_add_info_format(pinfo, ba_tree, &ei_ieee80211_dmg_subtype,
37774
0
                        "DMG STAs shouldn't transmit BlockAckReq frames "
37775
0
                        "with Basic BlockAckReqs");
37776
0
    }
37777
37778
    /* Both request and response have an SSC */
37779
515
    offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
37780
37781
515
    if (!is_req) {
37782
2
      proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_bitmap, tvb, offset,
37783
2
                        128, ENC_NA);
37784
2
      offset += 128;
37785
2
    }
37786
515
    break;
37787
37788
209
  case COMPRESSED_BLOCK_ACK:
37789
209
    ssn = tvb_get_letohs(tvb, offset);
37790
209
    frag_num = ssn & 0x0F;
37791
209
    ssn >>= 4;
37792
209
    offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
37793
37794
209
    if (!is_req) {
37795
18
      unsigned bytes = 0;
37796
18
      if (((frag_num & 0x06) >> 1) == 2) {
37797
3
        bytes = 32;
37798
15
      } else if ((frag_num & 0x0f) == 0x08) {
37799
2
        bytes = 64;
37800
13
      } else if ((frag_num & 0x0f) == 0x0A) {
37801
2
        bytes = 128;
37802
11
      } else { /* Default length */
37803
11
        bytes = 8;
37804
11
      }
37805
37806
18
      offset = dissect_ieee80211_block_ack_bitmap(tvb, pinfo, ba_tree, offset, ssn, bytes);
37807
18
    }
37808
209
    break;
37809
37810
210
  case EXTENDED_COMPRESSED_BLOCK_ACK:
37811
210
    if (isDMG == false) {
37812
210
      expert_add_info_format(pinfo, ba_tree, &ei_ieee80211_dmg_subtype,
37813
210
                        "Non-DMG STAs shouldn't transmit BlockAckReq "
37814
210
                        "frames with Extended Compressed BlockAckReqs");
37815
210
    }
37816
37817
210
    offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
37818
37819
210
    if (!is_req) {
37820
8
      ssn = tvb_get_letohs(tvb, offset);
37821
8
      ssn >>= 4;
37822
37823
8
      dissect_ieee80211_block_ack_bitmap(tvb, pinfo, ba_tree, offset, ssn, 8);
37824
8
      offset += 8;
37825
8
      proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_RBUFCAP, tvb, offset,
37826
8
                        1, ENC_LITTLE_ENDIAN);
37827
8
      offset += 1;
37828
8
    }
37829
210
    break;
37830
37831
140
  case MULTI_TID_BLOCK_ACK:
37832
37833
140
    if (isDMG == true) {
37834
1
      expert_add_info_format(pinfo, ba_tree, &ei_ieee80211_dmg_subtype,
37835
1
                        "DMG STAs shouldn't transmit BlockAckReq frames "
37836
1
                        "with Multi-TID BlockAckReqs");
37837
1
    }
37838
37839
140
    tid_count = ((ba_control & 0xF000) >> 12) + 1;
37840
140
    if (is_req) {
37841
127
      ba_mtid_tree = proto_tree_add_subtree(ba_tree, tvb, offset, tid_count*4,
37842
127
                ett_block_ack, NULL, "TID List");
37843
495
      for (i = 0; i < tid_count; i++) {
37844
368
        uint8_t tid = tvb_get_uint8(tvb, offset) & 0x0F;
37845
368
        ba_mtid_sub_tree = proto_tree_add_subtree_format(ba_mtid_tree, tvb,
37846
368
                                offset, 4, ett_block_ack_tid, NULL,
37847
368
                                "TID %u details", tid);
37848
37849
368
        proto_tree_add_item(ba_mtid_sub_tree,
37850
368
                hf_ieee80211_block_ack_multi_tid_reserved, tvb, offset, 2,
37851
368
                ENC_LITTLE_ENDIAN);
37852
368
        proto_tree_add_item(ba_mtid_sub_tree,
37853
368
                hf_ieee80211_block_ack_multi_tid_value, tvb, offset, 2,
37854
368
                ENC_LITTLE_ENDIAN);
37855
368
        offset += 2;
37856
37857
368
        offset += add_ff_block_ack_ssc(ba_mtid_sub_tree, tvb, pinfo, offset);
37858
368
      }
37859
127
    } else {
37860
13
      ba_mtid_tree = proto_tree_add_subtree(ba_tree, tvb, offset, tid_count*4,
37861
13
                ett_block_ack, NULL, "TID List");
37862
78
      for (i = 0; i < tid_count; i++) {
37863
65
        uint8_t tid = tvb_get_uint8(tvb, offset) & 0x0F;
37864
65
        ba_mtid_sub_tree = proto_tree_add_subtree_format(ba_mtid_tree, tvb,
37865
65
                                offset, 4, ett_block_ack_tid, NULL,
37866
65
                                "TID %u details", tid);
37867
37868
65
        proto_tree_add_item(ba_mtid_sub_tree,
37869
65
                        hf_ieee80211_block_ack_multi_tid_reserved,
37870
65
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
37871
65
        proto_tree_add_item(ba_mtid_sub_tree,
37872
65
                        hf_ieee80211_block_ack_multi_tid_value, tvb,
37873
65
                        offset, 2, ENC_LITTLE_ENDIAN);
37874
65
        offset += 2;
37875
37876
65
        offset += add_ff_block_ack_ssc(ba_mtid_sub_tree, tvb, pinfo, offset);
37877
65
        proto_tree_add_item(ba_mtid_sub_tree,
37878
65
                        hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
37879
65
        offset += 8;
37880
65
      }
37881
13
    }
37882
140
    break;
37883
37884
154
  case GCR_BLOCK_ACK:
37885
154
    offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
37886
37887
154
    proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_gcr_addr, tvb,
37888
154
                        offset, 6, ENC_NA);
37889
154
    offset += 6;
37890
37891
154
    if (!is_req) {
37892
2
      proto_tree_add_item(ba_tree,
37893
2
                        hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
37894
2
      offset += 8;
37895
2
    }
37896
154
    break;
37897
37898
126
  case MULTI_STA_BLOCK_ACK:
37899
4.23k
    while (tvb_reported_length_remaining(tvb, offset) > (has_fcs ? 4 : 0)) {
37900
4.10k
        int start = offset;
37901
4.10k
        proto_item *msta_ti = NULL;
37902
4.10k
        aid_tid = tvb_get_letohs(tvb, offset);
37903
4.10k
        ba_multi_sta_tree = proto_tree_add_subtree_format(ba_tree, tvb, offset, -1,
37904
4.10k
                                ett_multi_sta_block_ack, &msta_ti,
37905
4.10k
                                "Per AID TID Info: 0x%0x", aid_tid & 0x07ff);
37906
4.10k
        proto_tree_add_bitmask_with_flags(ba_multi_sta_tree, tvb, offset,
37907
4.10k
                        hf_ieee80211_block_ack_multi_sta_aid_tid,
37908
4.10k
                        ett_block_ack_request_multi_sta_aid_tid,
37909
4.10k
                        multi_sta_aid_tid_headers,
37910
4.10k
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
37911
4.10k
        offset += 2;
37912
37913
4.10k
        if ((aid_tid & 0x07ff) != 2045) {
37914
4.07k
          if (((aid_tid & 0x0800) == 0) && ((aid_tid & 0xf000) >> 12) <= 7) {
37915
1.40k
            unsigned bitmap_size;
37916
1.40k
            ssn = tvb_get_letohs(tvb, offset);
37917
1.40k
            frag_num = ssn & 0x0F;
37918
1.40k
            ssn >>= 4;
37919
1.40k
            offset += add_ff_block_ack_ssc(ba_multi_sta_tree, tvb, pinfo, offset);
37920
1.40k
            if ((frag_num & 0x0f) == 0x8 || (frag_num & 0x0f) == 0xA) {
37921
69
              bitmap_size = (frag_num & 0x0f) == 8 ? 64 : 128;
37922
1.33k
            } else {
37923
1.33k
              bitmap_size = ((frag_num + 2) & 0x6) >> 1;  /* Turn into an exponent */
37924
1.33k
              bitmap_size = 4 << bitmap_size;  /* It goes 4, 8, 16, 32 */
37925
1.33k
            }
37926
1.40k
            offset = dissect_ieee80211_block_ack_bitmap(tvb, pinfo, ba_multi_sta_tree, offset, ssn, bitmap_size);
37927
1.40k
          }
37928
4.07k
        } else {
37929
33
          offset += add_ff_block_ack_ssc(ba_multi_sta_tree, tvb, pinfo, offset);
37930
33
          proto_tree_add_item(ba_multi_sta_tree, hf_ieee80211_block_ack_multi_sta_reserved,
37931
33
                                tvb, offset, 2, ENC_LITTLE_ENDIAN);
37932
33
          offset += 2;
37933
33
          proto_tree_add_item(ba_multi_sta_tree, hf_ieee80211_block_ack_multi_sta_ra,
37934
33
                                tvb, offset, 6, ENC_NA);
37935
33
          offset += 6;
37936
33
        }
37937
4.10k
        proto_item_set_len(msta_ti, offset - start);
37938
4.10k
    }
37939
126
    break;
37940
2.03k
  }
37941
1.87k
  proto_item_set_len(pi, offset - ba_start);
37942
37943
1.87k
  return offset;
37944
2.03k
}
37945
37946
static void
37947
dissect_ieee80211_block_ack(tvbuff_t *tvb, packet_info *pinfo _U_,
37948
  proto_tree *tree, int offset, bool isDMG, bool is_req, bool has_fcs)
37949
88
{
37950
88
  proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, tree, offset);
37951
88
  offset += 6;
37952
37953
88
  dissect_ieee80211_block_ack_details(tvb, pinfo, tree, offset, isDMG, is_req, has_fcs);
37954
88
}
37955
37956
/*
37957
 * Dissect an 802.11ax HE Trigger frame and return the actual len including
37958
 * padding!
37959
 */
37960
37961
typedef enum he_trigger_type {
37962
  TRIGGER_TYPE_BASIC = 0,
37963
  TRIGGER_TYPE_BRP,
37964
  TRIGGER_TYPE_MU_BAR,
37965
  TRIGGER_TYPE_MU_RTS,
37966
  TRIGGER_TYPE_BSRP,
37967
  TRIGGER_TYPE_GCR_MU_BAR,
37968
  TRIGGER_TYPE_BQRP,
37969
  TRIGGER_TYPE_NFRP,
37970
  TRIGGER_TYPE_RANGING,
37971
  TRIGGER_TYPE_MIN_RESERVED,
37972
} he_trigger_type_t;
37973
37974
typedef enum he_trigger_subtype {
37975
  TRIGGER_SUBTYPE_POLL = 0,
37976
  TRIGGER_SUBTYPE_SOUNDING,
37977
  TRIGGER_SUBTYPE_SECURE_SOUNDING,
37978
  TRIGGER_SUBTYPE_REPORT,
37979
  TRIGGER_SUBTYPE_PASSIVE_TB_MEAS_EXCHANGE,
37980
  TRIGGER_SUBTYPE_MIN_RESERVED,
37981
} he_trigger_subtype_t;
37982
37983
static const val64_string trigger_type_vals[] = {
37984
  { 0, "Basic" },
37985
  { 1, "Beamforming Report Poll (BRP)" },
37986
  { 2, "MU-BAR" },
37987
  { 3, "MU-RTS" },
37988
  { 4, "Buffer Status Report Poll (BSRP)" },
37989
  { 5, "GCR MU-BAR" },
37990
  { 6, "Bandwidth Query Report Poll (BQRP)" },
37991
  { 7, "NDP Feedback Report Poll (NFRP)" },
37992
  { 8, "Ranging" },
37993
  /* 9-15 reserved */
37994
  { 0, NULL }
37995
};
37996
37997
static const val64_string bw_subfield_vals[] = {
37998
  { 0, "20 MHz" },
37999
  { 1, "40 MHz" },
38000
  { 2, "80 MHz" },
38001
  { 3, "80+80 MHz or 160 MHz" },
38002
  { 0, NULL }
38003
};
38004
38005
static const val64_string gi_and_ltf_type_subfield_vals[] = {
38006
  { 0, "1x LTF + 1.6 us GI" },
38007
  { 1, "2x LTF + 1.6 us GI" },
38008
  { 2, "4x LTF + 3.2 us GI" },
38009
  { 3, "Reserved" },
38010
  { 0, NULL }
38011
};
38012
38013
static const true_false_string mu_mimo_ltf_mode_tfs = {
38014
  "HE masked HE LTF sequence mode",
38015
  "HE single stream pilot HE LTF mode"
38016
};
38017
38018
static int * const he_trig_frm_bar_ctrl_fields[] = {
38019
  &hf_ieee80211_he_trigger_bar_ctrl_ba_ack_policy,
38020
  &hf_ieee80211_he_trigger_bar_ctrl_ba_type,
38021
  &hf_ieee80211_he_trigger_bar_ctrl_reserved,
38022
  &hf_ieee80211_he_trigger_bar_ctrl_tid_info,
38023
  NULL
38024
};
38025
38026
static int * const he_trig_frm_bar_info_fields[] = {
38027
  &hf_ieee80211_he_trigger_bar_info_blk_ack_seq_ctrl,
38028
  NULL
38029
};
38030
38031
#define PRE_FEC_PADDING_FACTOR 0x3
38032
#define PE_DISAMBIGUITY 0x4
38033
38034
static void
38035
ap_tx_power_custom(char *result, uint32_t ap_tx_power)
38036
0
{
38037
0
  if (ap_tx_power > 60)
38038
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s", "Reserved");
38039
0
  else
38040
0
    snprintf(result, ITEM_LABEL_LENGTH, "%d dBm", -20 + ap_tx_power);
38041
0
}
38042
38043
static void
38044
add_gcr_mu_bar_trigger_frame_common_info(proto_tree *tree, tvbuff_t *tvb,
38045
  int offset)
38046
45
{
38047
38048
45
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
38049
45
                        hf_ieee80211_he_trigger_bar_ctrl,
38050
45
                        ett_he_trigger_bar_ctrl,
38051
45
                        he_trig_frm_bar_ctrl_fields,
38052
45
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38053
45
  offset += 2;
38054
38055
45
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
38056
45
                        hf_ieee80211_he_trigger_bar_info,
38057
45
                        ett_he_trigger_bar_info,
38058
45
                        he_trig_frm_bar_info_fields,
38059
45
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38060
45
}
38061
38062
static int * const common_info_headers[] = {
38063
  &hf_ieee80211_he_trigger_type,
38064
  &hf_ieee80211_he_trigger_ul_length,
38065
  &hf_ieee80211_he_trigger_more_tf,
38066
  &hf_ieee80211_he_trigger_cs_required,
38067
  &hf_ieee80211_he_trigger_ul_bw,
38068
  &hf_ieee80211_he_trigger_gi_and_ltf_type,
38069
  &hf_ieee80211_he_trigger_mu_mimo_ltf_mode,
38070
  &hf_ieee80211_he_trigger_num_he_ltf_syms_etc,
38071
  &hf_ieee80211_he_trigger_ul_stbc,
38072
  &hf_ieee80211_he_trigger_ldpc_extra_sym_seg,
38073
  &hf_ieee80211_he_trigger_ap_tx_power,
38074
  &hf_ieee80211_he_trigger_pre_fec_padding_factor,
38075
  &hf_ieee80211_he_trigger_pe_disambiguity,
38076
  &hf_ieee80211_he_trigger_ul_spatial_reuse,
38077
  &hf_ieee80211_he_trigger_doppler,
38078
  &hf_ieee80211_he_trigger_ul_he_sig_a_reserved,
38079
  &hf_ieee80211_he_trigger_reserved,
38080
  NULL
38081
};
38082
38083
static int * const eht_common_info_headers[] = {
38084
  &hf_ieee80211_eht_trigger_type,
38085
  &hf_ieee80211_eht_trigger_ul_length,
38086
  &hf_ieee80211_eht_trigger_more_tf,
38087
  &hf_ieee80211_eht_trigger_cs_required,
38088
  &hf_ieee80211_eht_trigger_ul_bw,
38089
  &hf_ieee80211_eht_trigger_gi_and_eht_ltf_type,
38090
  &hf_ieee80211_eht_trigger_reserved2,
38091
  &hf_ieee80211_eht_trigger_num_he_eht_ltf_syms_etc,
38092
  &hf_ieee80211_eht_trigger_reserved3,
38093
  &hf_ieee80211_eht_trigger_ldpc_extra_sym_seg,
38094
  &hf_ieee80211_eht_trigger_ap_tx_power,
38095
  &hf_ieee80211_eht_trigger_pre_fec_padding_factor,
38096
  &hf_ieee80211_eht_trigger_pe_disambiguity,
38097
  &hf_ieee80211_eht_trigger_ul_spatial_reuse,
38098
  &hf_ieee80211_eht_trigger_reserved4,
38099
  &hf_ieee80211_eht_trigger_he_eht_p160,
38100
  &hf_ieee80211_eht_trigger_special_user_info_flag,
38101
  &hf_ieee80211_eht_trigger_eht_reserved,
38102
  &hf_ieee80211_eht_trigger_reserved,
38103
  NULL
38104
};
38105
38106
static int* const uhr_common_info_headers[] = {
38107
  &hf_ieee80211_uhr_trigger_type,
38108
  &hf_ieee80211_uhr_trigger_ul_length,
38109
  &hf_ieee80211_uhr_trigger_more_tf,
38110
  &hf_ieee80211_uhr_trigger_cs_required,
38111
  &hf_ieee80211_uhr_trigger_ul_bw,
38112
  &hf_ieee80211_uhr_trigger_gi_and_he_uhr_ltf_type,
38113
  &hf_ieee80211_uhr_trigger_reserved2,
38114
  &hf_ieee80211_uhr_trigger_num_he_uhr_ltf_syms_etc,
38115
  &hf_ieee80211_uhr_trigger_reserved3,
38116
  &hf_ieee80211_uhr_trigger_ldpc_extra_sym_seg,
38117
  &hf_ieee80211_uhr_trigger_ap_tx_power,
38118
  &hf_ieee80211_uhr_trigger_pre_fec_padding_factor,
38119
  &hf_ieee80211_uhr_trigger_pe_disambiguity,
38120
  &hf_ieee80211_uhr_trigger_ul_spatial_reuse,
38121
  &hf_ieee80211_uhr_trigger_reserved4,
38122
  &hf_ieee80211_uhr_trigger_he_uhr_p160,
38123
  &hf_ieee80211_uhr_trigger_special_user_info_flag,
38124
  &hf_ieee80211_uhr_trigger_dru_rru,
38125
  &hf_ieee80211_uhr_trigger_ifcs,
38126
  &hf_ieee80211_uhr_trigger_uhr_reserved,
38127
  &hf_ieee80211_uhr_trigger_reserved,
38128
  NULL
38129
};
38130
38131
static const val64_string pre_fec_padding_factor_vals[] = {
38132
  { 0, "pre-FEC Padding Factor of 4" },
38133
  { 1, "pre-FEC Padding Factor of 1" },
38134
  { 2, "pre-FEC Padding Factor of 2" },
38135
  { 3, "pre-FEC Padding Factor of 3" },
38136
  { 0, NULL }
38137
};
38138
38139
static true_false_string pe_disambiguity_tfs = {
38140
  "PE Disambiguity ",
38141
  "no PE Disambiguity"
38142
 };
38143
38144
static int
38145
add_trigger_common_info(proto_tree *tree, tvbuff_t *tvb, int offset,
38146
  packet_info *pinfo _U_, uint8_t trigger_type, int *frame_len,
38147
  proto_tree **common_tree)
38148
787
{
38149
787
  proto_item     *pi = NULL;
38150
787
  proto_tree     *common_info = NULL;
38151
787
  int            length = 0;
38152
787
  int            start_offset = offset;
38153
787
  uint64_t       bw_etc = tvb_get_letoh64(tvb, offset);
38154
787
  uint64_t       special_user = tvb_get_letoh64(tvb, offset+8);
38155
787
  bool           is_uhr = (((bw_etc >> 54) & 0x03) != 0x03) && (((special_user >> 12) & 0x01) == 0x01);
38156
787
  bool           is_eht = (((bw_etc >> 54) & 0x03) != 0x03) && (((special_user >> 12) & 0x01) == 0x00);
38157
38158
787
  global_he_trigger_bw = (bw_etc >> 18) & 0x03;
38159
38160
787
  common_info = proto_tree_add_subtree(tree, tvb, offset, -1,
38161
787
                        ett_he_trigger_common_info, &pi, "Common Info");
38162
787
  *common_tree = common_info;
38163
38164
787
  if (is_eht) {
38165
514
    proto_tree_add_bitmask_with_flags(common_info, tvb, offset,
38166
514
                        hf_ieee80211_eht_trigger_common_info,
38167
514
                        ett_he_trigger_base_common_info,
38168
514
                        eht_common_info_headers,
38169
514
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38170
514
  } else if (is_uhr) {
38171
174
    proto_tree_add_bitmask_with_flags(common_info, tvb, offset,
38172
174
                        hf_ieee80211_uhr_trigger_common_info,
38173
174
                        ett_he_trigger_base_common_info,
38174
174
                        uhr_common_info_headers,
38175
174
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38176
174
  } else {
38177
99
    proto_tree_add_bitmask_with_flags(common_info, tvb, offset,
38178
99
                        hf_ieee80211_he_trigger_common_info,
38179
99
                        ett_he_trigger_base_common_info,
38180
99
                        common_info_headers,
38181
99
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38182
99
  }
38183
787
  offset += 8;
38184
787
  length += 8;
38185
38186
  /*
38187
   * Handle the trigger dependent common info
38188
   */
38189
787
  switch (trigger_type) {
38190
45
    case TRIGGER_TYPE_GCR_MU_BAR: /* Actually two uint16 fields */
38191
45
      add_gcr_mu_bar_trigger_frame_common_info(common_info, tvb, offset);
38192
45
      offset += 4;
38193
45
      length += 4;
38194
45
      break;
38195
734
    default: /* No other type has a trigger dependent common info subfield */
38196
734
      break;
38197
787
  }
38198
779
  proto_item_set_len(pi, offset - start_offset);
38199
38200
779
  *frame_len += length;
38201
779
  return length;
38202
787
}
38203
38204
static const char * he_trigger_ru_allocation_region_values[] = {
38205
  "primary 80MHz channel for 80+80 and 160MHz",
38206
  "secondary 80MHz channel for 80+80 and 160MHz",
38207
};
38208
38209
/*
38210
 * Format the ru allocation region bit
38211
 */
38212
static void
38213
he_trigger_ru_allocation_region_custom(char *result, uint32_t ru_alloc_val)
38214
13.6k
{
38215
13.6k
  if (global_he_trigger_bw == 3) {
38216
1.83k
    snprintf(result, ITEM_LABEL_LENGTH, "%s",
38217
1.83k
      he_trigger_ru_allocation_region_values[ru_alloc_val & 0x01]);
38218
11.8k
  } else {
38219
11.8k
    snprintf(result, ITEM_LABEL_LENGTH, "Not used for 20, 40 or 80MHz");
38220
11.8k
  }
38221
13.6k
}
38222
38223
static void
38224
he_trigger_minus_one_custom(char *result, unsigned ss_alloc_value)
38225
29.9k
{
38226
29.9k
  snprintf(result, ITEM_LABEL_LENGTH, "%d", ss_alloc_value + 1);
38227
29.9k
}
38228
38229
static const true_false_string he_trigger_ul_fec_coding_type_tfs = {
38230
  "LDPC",
38231
  "BCC"
38232
};
38233
38234
static const value_string preferred_ac_vals[] = {
38235
  { 0, "AC_BE" },
38236
  { 1, "AC_BK" },
38237
  { 2, "AC_VI" },
38238
  { 3, "AC_VO" },
38239
  { 0, NULL }
38240
};
38241
38242
static int * const basic_trigger_dependent_user_headers[] = {
38243
  &hf_ieee80211_he_trigger_mpdu_mu_spacing,
38244
  &hf_ieee80211_he_trigger_tid_aggregation_limit,
38245
  &hf_ieee80211_he_trigger_dependent_reserved1,
38246
  &hf_ieee80211_he_trigger_preferred_ac,
38247
  NULL
38248
};
38249
38250
static void
38251
add_basic_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
38252
  int offset)
38253
1.60k
{
38254
1.60k
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
38255
1.60k
                        hf_ieee80211_he_trigger_dep_basic_user_info,
38256
1.60k
                        ett_he_trigger_dep_basic_user_info,
38257
1.60k
                        basic_trigger_dependent_user_headers,
38258
1.60k
                        ENC_NA, BMT_NO_APPEND);
38259
1.60k
}
38260
38261
static void
38262
add_brp_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
38263
  int offset)
38264
347
{
38265
347
  proto_tree_add_item(tree, hf_ieee80211_he_trigger_feedback_seg_retrans_bm,
38266
347
                        tvb, offset, 1, ENC_NA);
38267
347
}
38268
38269
static int
38270
add_mu_bar_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
38271
  int offset, packet_info *pinfo, int *frame_len)
38272
1.94k
{
38273
1.94k
  int start_offset = offset;
38274
38275
  /*
38276
   * It's a request and not DMG, I think. Also, it is only supposed to be
38277
   * a compressed block ack or a multi-tid block ack request.
38278
   */
38279
1.94k
  offset = dissect_ieee80211_block_ack_details(tvb, pinfo, tree, offset,
38280
1.94k
                        false, true, false);
38281
38282
1.94k
  *frame_len += offset - start_offset;
38283
38284
1.94k
  return offset;
38285
1.94k
}
38286
38287
38288
static int * const nfrp_trigger_dependent_user_headers[] = {
38289
  &hf_ieee80211_he_trigger_starting_aid,
38290
  &hf_ieee80211_he_trigger_dependent_reserved2,
38291
  &hf_ieee80211_he_trigger_feedback_type,
38292
  &hf_ieee80211_he_trigger_dependent_reserved3,
38293
  &hf_ieee80211_he_trigger_nfrp_target_rssi,
38294
  &hf_ieee80211_he_trigger_multiplexing_flag,
38295
  NULL
38296
};
38297
38298
static void
38299
add_nfrp_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
38300
  int offset)
38301
459
{
38302
459
  proto_tree_add_bitmask_with_flags(tree, tvb, offset,
38303
459
                        hf_ieee80211_he_trigger_dep_nfrp_user_info,
38304
459
                        ett_he_trigger_dep_nfrp_user_info,
38305
459
                        nfrp_trigger_dependent_user_headers,
38306
459
                        ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38307
459
}
38308
38309
/*
38310
 * Dissect one of the ranging trigger types ...
38311
 */
38312
static int * const poll_rpt_hdrs[] = {
38313
  &hf_ieee80211_ranging_pol_rpt_aid12_rsid12,
38314
  &hf_ieee80211_ranging_pol_rpt_ru_alloc_region,
38315
  &hf_ieee80211_ranging_pol_rpt_ru_alloc,
38316
  &hf_ieee80211_ranging_pol_rpt_ul_fec_coding_type,
38317
  &hf_ieee80211_ranging_pol_rpt_ulmcs,
38318
  &hf_ieee80211_ranging_pol_rpt_uldcm,
38319
  &hf_ieee80211_ranging_pol_rpt_starting_spatial_stream,
38320
  &hf_ieee80211_ranging_pol_rpt_number_spatial_streams,
38321
  &hf_ieee80211_ranging_pol_rpt_ul_target_rssi,
38322
  &hf_ieee80211_ranging_pol_rpt_reserved,
38323
  NULL
38324
};
38325
38326
static int * const sounding_hdrs[] = {
38327
  &hf_ieee80211_ranging_sounding_aid12_rsid12,
38328
  &hf_ieee80211_ranging_sounding_reserved1,
38329
  &hf_ieee80211_ranging_sounding_i2r_rep,
38330
  &hf_ieee80211_ranging_sounding_reserved2,
38331
  &hf_ieee80211_ranging_sounding_starting_spatial_stream,
38332
  &hf_ieee80211_ranging_sounding_number_spatial_streams,
38333
  &hf_ieee80211_ranging_sounding_ul_target_rssi,
38334
  &hf_ieee80211_ranging_sounding_reserved3,
38335
  NULL
38336
};
38337
38338
static int * const sec_sound_hdrs[] = {
38339
  &hf_ieee80211_ranging_sec_sound_aid12_rsid12,
38340
  &hf_ieee80211_ranging_sec_sound_reserved1,
38341
  &hf_ieee80211_ranging_sec_sound_i2r_rep,
38342
  &hf_ieee80211_ranging_sec_sound_reserved2,
38343
  &hf_ieee80211_ranging_sec_sound_starting_spatial_stream,
38344
  &hf_ieee80211_ranging_sec_sound_number_spatial_streams,
38345
  &hf_ieee80211_ranging_sec_sound_ul_target_rssi,
38346
  &hf_ieee80211_ranging_sec_sound_reserved3,
38347
  NULL
38348
};
38349
38350
static int
38351
dissect_ieee80211_ranging_trigger_variant(proto_tree *tree, tvbuff_t *tvb,
38352
                                          int offset, packet_info *pinfo _U_,
38353
                                          uint8_t subtype)
38354
14.9k
{
38355
14.9k
  int saved_offset = offset;
38356
38357
14.9k
  switch (subtype) {
38358
10.8k
  case TRIGGER_SUBTYPE_POLL:
38359
13.6k
  case TRIGGER_SUBTYPE_REPORT:
38360
13.6k
    proto_tree_add_bitmask(tree, tvb, offset,
38361
13.6k
                           hf_ieee80211_he_trigger_ranging_trigger_poll_rpt,
38362
13.6k
                           ett_he_trigger_ranging_poll, poll_rpt_hdrs,
38363
13.6k
                           ENC_LITTLE_ENDIAN);
38364
13.6k
    offset += 5;
38365
13.6k
    break;
38366
494
  case TRIGGER_SUBTYPE_SOUNDING: /* Sounding subvariant */
38367
494
    proto_tree_add_bitmask(tree, tvb, offset,
38368
494
                           hf_ieee80211_he_trigger_ranging_trigger_sounding,
38369
494
                           ett_he_trigger_ranging_poll, sounding_hdrs,
38370
494
                           ENC_LITTLE_ENDIAN);
38371
494
    offset += 5;
38372
494
    break;
38373
293
  case TRIGGER_SUBTYPE_SECURE_SOUNDING:
38374
293
    proto_tree_add_bitmask(tree, tvb, offset,
38375
293
                           hf_ieee80211_he_trigger_ranging_trigger_sec_sound,
38376
293
                           ett_he_trigger_ranging_poll, sec_sound_hdrs,
38377
293
                           ENC_LITTLE_ENDIAN);
38378
293
    offset += 5;
38379
38380
293
    proto_tree_add_item(tree, hf_ieee80211_he_trigger_ranging_user_info_sac,
38381
293
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
38382
293
    offset += 2;
38383
293
    break;
38384
531
  case TRIGGER_SUBTYPE_PASSIVE_TB_MEAS_EXCHANGE:
38385
    /* This is much the same as SOUNDING subtype */
38386
531
    proto_tree_add_bitmask(tree, tvb, offset,
38387
531
                           hf_ieee80211_he_trigger_ranging_trigger_sounding,
38388
531
                           ett_he_trigger_ranging_poll, sounding_hdrs,
38389
531
                           ENC_LITTLE_ENDIAN);
38390
531
    offset += 5;
38391
531
    break;
38392
0
  default:
38393
    /* Unknown subtypes are filtered out above us. Should not get here! */
38394
0
    DISSECTOR_ASSERT_NOT_REACHED();
38395
0
    break;
38396
14.9k
  }
38397
38398
14.9k
  return offset - saved_offset;
38399
14.9k
}
38400
38401
/*
38402
 * Print the target RSSI field as per the spec.
38403
 *  0->90 map to -110 to -20 dBm.
38404
 *  127 maps to Max ransmit power for assigned MCS
38405
 *  rest are reserved.
38406
 */
38407
static void
38408
target_rssi_base_custom(char *result, uint32_t target_rssi)
38409
14.6k
{
38410
14.6k
  if (target_rssi <= 90) {
38411
12.0k
    snprintf(result, ITEM_LABEL_LENGTH, "%ddBm", -110 + target_rssi);
38412
12.0k
  } else if (target_rssi == 127) {
38413
335
    snprintf(result, ITEM_LABEL_LENGTH, "Max transmit power");
38414
2.32k
  } else {
38415
2.32k
    snprintf(result, ITEM_LABEL_LENGTH, "Reserved");
38416
2.32k
  }
38417
14.6k
}
38418
38419
static int * const user_info_headers_no_2045[] = {
38420
  &hf_ieee80211_he_trigger_aid12,
38421
  &hf_ieee80211_he_trigger_ru_allocation_region,
38422
  &hf_ieee80211_he_trigger_ru_allocation,
38423
  &hf_ieee80211_he_trigger_ul_fec_coding_type,
38424
  &hf_ieee80211_he_trigger_ul_mcs,
38425
  &hf_ieee80211_he_trigger_ul_dcm,
38426
  &hf_ieee80211_he_trigger_ru_starting_spatial_stream,
38427
  &hf_ieee80211_he_trigger_ru_number_spatial_streams,
38428
  &hf_ieee80211_he_trigger_ul_target_rssi,
38429
  &hf_ieee80211_he_trigger_user_reserved,
38430
  NULL
38431
};
38432
38433
static int * const user_info_headers_2045[] = {
38434
  &hf_ieee80211_he_trigger_aid12,
38435
  &hf_ieee80211_he_trigger_ru_allocation_region,
38436
  &hf_ieee80211_he_trigger_ru_allocation,
38437
  &hf_ieee80211_he_trigger_ul_fec_coding_type,
38438
  &hf_ieee80211_he_trigger_ul_mcs,
38439
  &hf_ieee80211_he_trigger_ul_dcm,
38440
  &hf_ieee80211_he_trigger_ru_number_ra_ru,
38441
  &hf_ieee80211_he_trigger_ru_no_more_ra_ru,
38442
  &hf_ieee80211_he_trigger_ul_target_rssi,
38443
  &hf_ieee80211_he_trigger_user_reserved,
38444
  NULL
38445
};
38446
38447
static int * const user_info_headers_eht[] = {
38448
  &hf_ieee80211_eht_trigger_aid12,
38449
  &hf_ieee80211_eht_trigger_ru_allocation_region,
38450
  &hf_ieee80211_eht_trigger_ru_allocation,
38451
  &hf_ieee80211_eht_trigger_ul_fec_coding_type,
38452
  &hf_ieee80211_eht_trigger_ul_eht_mcs,
38453
  &hf_ieee80211_eht_trigger_user_info_reserved,
38454
  &hf_ieee80211_eht_trigger_ru_starting_spatial_stream,
38455
  &hf_ieee80211_eht_trigger_ru_number_spatial_streams,
38456
  &hf_ieee80211_eht_trigger_ul_target_recv_power,
38457
  &hf_ieee80211_eht_trigger_ps160,
38458
  NULL
38459
};
38460
38461
static int * const special_user_info_headers_eht[] = {
38462
  &hf_ieee80211_eht_trigger_aid12,
38463
  &hf_ieee80211_eht_trigger_phy_version_identifier,
38464
  &hf_ieee80211_eht_trigger_ul_bw_extenstion,
38465
  &hf_ieee80211_eht_trigger_eht_spatial_reuse_1,
38466
  &hf_ieee80211_eht_trigger_eht_spatial_reuse_2,
38467
  &hf_ieee80211_eht_trigger_disregard_u_sig_1,
38468
  &hf_ieee80211_eht_trigger_validate_u_sig_2,
38469
  &hf_ieee80211_eht_trigger_disregard_u_sig_2_4lsb,
38470
  &hf_ieee80211_eht_trigger_disregard_u_sig_2_msb,
38471
  &hf_ieee80211_eht_trigger_special_reserved,
38472
  NULL
38473
};
38474
38475
static int* const user_info_headers_uhr_rru[] = {
38476
  &hf_ieee80211_uhr_trigger_aid12,
38477
  &hf_ieee80211_uhr_trigger_ru_allocation_region,
38478
  &hf_ieee80211_uhr_trigger_ru_allocation,
38479
  &hf_ieee80211_uhr_trigger_ul_fec_coding_type,
38480
  &hf_ieee80211_uhr_trigger_ul_uhr_mcs,
38481
  &hf_ieee80211_uhr_trigger_2xldpc,
38482
  &hf_ieee80211_uhr_trigger_ru_starting_spatial_stream,
38483
  &hf_ieee80211_uhr_trigger_ru_number_spatial_streams,
38484
  &hf_ieee80211_uhr_trigger_ul_target_recv_power,
38485
  &hf_ieee80211_uhr_trigger_ps160,
38486
  NULL
38487
};
38488
38489
static int* const user_info_headers_uhr_dru[] = {
38490
  &hf_ieee80211_uhr_trigger_aid12,
38491
  &hf_ieee80211_uhr_trigger_ru_allocation_region,
38492
  &hf_ieee80211_uhr_trigger_ru_allocation,
38493
  &hf_ieee80211_uhr_trigger_ul_fec_coding_type,
38494
  &hf_ieee80211_uhr_trigger_ul_uhr_mcs,
38495
  &hf_ieee80211_uhr_trigger_2xldpc,
38496
  &hf_ieee80211_uhr_trigger_dru_distribution_bw,
38497
  &hf_ieee80211_uhr_trigger_dru_reserved,
38498
  &hf_ieee80211_uhr_trigger_ru_number_spatial_streams,
38499
  &hf_ieee80211_uhr_trigger_ul_target_recv_power,
38500
  &hf_ieee80211_uhr_trigger_ps160,
38501
  NULL
38502
};
38503
38504
#define HE_USER_INFO      0
38505
#define EHT_USER_INFO     1
38506
#define SPECIAL_USER_INFO 2
38507
38508
static int
38509
add_trigger_user_info(proto_tree *tree, tvbuff_t *tvb, int offset,
38510
  packet_info *pinfo, uint8_t trigger_type, uint8_t subtype,
38511
  uint8_t common_info_b54_55 _U_, int *frame_len, unsigned fcs_len)
38512
774
{
38513
774
  proto_item     *pi = NULL;
38514
774
  proto_tree     *user_info = NULL;
38515
774
  int            length = 0, range_len = 0;
38516
774
  int            start_offset = offset;
38517
774
  uint16_t        aid12_subfield = 0;
38518
774
  uint16_t        phy_version_subfield = 0;
38519
774
  unsigned       len_remaining = 0;
38520
774
  bool           special_user_info;
38521
774
  uint8_t        user_info_b39;
38522
774
  bool           eht_variant = false;
38523
774
  uint8_t        ddru_indication;
38524
38525
  /*
38526
   * If the AID12 subfield has the value 4095 it indicates the start of
38527
   * the padding field.
38528
   *
38529
   * If the AID12 subfield has the value 2007, it indicates a special user
38530
   * info field and combined with the common_info_b54_55 and B39 of the user
38531
   * info field determines whether this field is an HE User Info field or an
38532
   * EHT User Info field.
38533
   */
38534
774
  user_info = proto_tree_add_subtree(tree, tvb, offset, -1,
38535
774
                        ett_he_trigger_user_info, &pi, "User Info");
38536
774
  aid12_subfield = tvb_get_letohs(tvb, offset) & 0x0FFF;
38537
774
  phy_version_subfield = (tvb_get_letohs(tvb, offset) >> 12) & 0x01;
38538
  /*9.3.1.22.2 of 802.11bn and Figure 9-90e1—DRU/RRU Indication subfield format*/
38539
774
  ddru_indication = (tvb_get_letohs(tvb, offset - 1)) & 0x0F;
38540
38541
22.4k
  while (aid12_subfield != 4095) {
38542
    /* Compute the special user info and EHT Variant for each one. */
38543
21.8k
    special_user_info = aid12_subfield == 2007;
38544
21.8k
    user_info_b39 = tvb_get_uint8(tvb, offset + 4) >> 7;
38545
38546
    /* 9.3.1.22.4 of 802.11be and table 9-45a */
38547
21.8k
    if ((common_info_b54_55 == 0x01 && special_user_info && user_info_b39) ||
38548
21.8k
        (common_info_b54_55 == 0x00 && special_user_info))
38549
629
      eht_variant = true;
38550
38551
21.8k
    switch (trigger_type) {
38552
1.60k
      case TRIGGER_TYPE_BASIC:
38553
1.94k
      case TRIGGER_TYPE_BRP:
38554
3.89k
      case TRIGGER_TYPE_MU_BAR:
38555
4.76k
      case TRIGGER_TYPE_MU_RTS:
38556
5.27k
      case TRIGGER_TYPE_BSRP:
38557
6.03k
      case TRIGGER_TYPE_GCR_MU_BAR:
38558
6.40k
      case TRIGGER_TYPE_BQRP:
38559
6.40k
        if (!eht_variant) {
38560
5.55k
          if (aid12_subfield != 0 && aid12_subfield != 2045) {
38561
4.21k
            proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
38562
4.21k
                                hf_ieee80211_he_trigger_user_info,
38563
4.21k
                                ett_he_trigger_base_user_info,
38564
4.21k
                                user_info_headers_no_2045,
38565
4.21k
                                ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38566
4.21k
          } else {
38567
1.33k
            proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
38568
1.33k
                                hf_ieee80211_he_trigger_user_info,
38569
1.33k
                                ett_he_trigger_base_user_info,
38570
1.33k
                                user_info_headers_2045,
38571
1.33k
                                ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38572
1.33k
          }
38573
5.55k
        } else {
38574
          /* Is it a special user info? */
38575
856
          if (special_user_info) {
38576
254
            proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
38577
254
                                hf_ieee80211_eht_trigger_special_user_info,
38578
254
                                ett_he_trigger_base_user_info,
38579
254
                                special_user_info_headers_eht,
38580
254
                                ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38581
602
          } else {
38582
602
            if (!phy_version_subfield) {
38583
470
              proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
38584
470
                                  hf_ieee80211_eht_trigger_user_info,
38585
470
                                  ett_he_trigger_base_user_info,
38586
470
                                  user_info_headers_eht,
38587
470
                                  ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38588
470
            } else {
38589
              /* 9.3.1.22.6 of 802.11bn and Figure 9-90j2 and Figure 9-90j3 */
38590
132
              if(ddru_indication != 0) {
38591
70
                proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
38592
70
                                    hf_ieee80211_uhr_trigger_user_info,
38593
70
                                    ett_he_trigger_base_user_info,
38594
70
                                    user_info_headers_uhr_rru,
38595
70
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38596
70
              } else {
38597
62
                proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
38598
62
                                    hf_ieee80211_uhr_trigger_user_info,
38599
62
                                    ett_he_trigger_base_user_info,
38600
62
                                    user_info_headers_uhr_dru,
38601
62
                                    ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38602
62
              }
38603
132
            }
38604
602
          }
38605
856
        }
38606
6.40k
        offset += 5;
38607
6.40k
        length += 5;
38608
6.40k
        break;
38609
459
      case TRIGGER_TYPE_NFRP:
38610
459
        add_nfrp_trigger_dependent_user_info(user_info, tvb, offset);
38611
459
        offset += 5;
38612
459
        length += 5;
38613
459
        break;
38614
14.9k
      case TRIGGER_TYPE_RANGING:
38615
14.9k
        range_len = dissect_ieee80211_ranging_trigger_variant(user_info, tvb,
38616
14.9k
                                                offset, pinfo, subtype);
38617
14.9k
        if (range_len == 0) {
38618
          /* XXX - unknown subtype, report this somehow */
38619
0
          goto out;
38620
0
        }
38621
14.9k
        offset += range_len;
38622
14.9k
        length += range_len;
38623
14.9k
        break;
38624
0
      default:
38625
        /* Should never get here */
38626
0
        break;
38627
21.8k
    }
38628
38629
38630
    /*
38631
     * Handle the trigger dependent user info
38632
     */
38633
21.8k
    switch (trigger_type) {
38634
1.60k
      case TRIGGER_TYPE_BASIC:
38635
1.60k
        add_basic_trigger_dependent_user_info(user_info, tvb, offset);
38636
1.60k
        offset++;
38637
1.60k
        length++;
38638
1.60k
        break;
38639
347
      case TRIGGER_TYPE_BRP:
38640
347
        add_brp_trigger_dependent_user_info(user_info, tvb, offset);
38641
347
        offset++;
38642
347
        length++;
38643
347
        break;
38644
1.94k
      case TRIGGER_TYPE_MU_BAR:
38645
        /* This is variable length so we need it to update the length */
38646
1.94k
        offset = add_mu_bar_trigger_dependent_user_info(user_info, tvb,
38647
1.94k
                                offset, pinfo, &length);
38648
1.94k
        break;
38649
17.9k
      default:
38650
17.9k
        break;
38651
21.8k
    }
38652
38653
21.7k
    len_remaining = tvb_reported_length_remaining(tvb, offset);
38654
21.7k
    if (len_remaining < 5)
38655
549
      aid12_subfield = 4095;
38656
21.1k
    else
38657
21.1k
      aid12_subfield = tvb_get_letohs(tvb, offset) & 0xFFF;
38658
21.7k
  }
38659
38660
642
out:
38661
38662
642
  if (aid12_subfield == 4095 && len_remaining >= 5) {
38663
    /* Show the Start of Padding field. */
38664
87
    proto_tree_add_item(user_info,
38665
87
                        hf_ieee80211_he_trigger_user_info_padding_start,
38666
87
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
38667
87
    offset += 2;
38668
38669
87
  }
38670
38671
642
  proto_item_set_len(pi, offset - start_offset);
38672
38673
  /* Now, treat all the rest of the frame as padding */
38674
642
  if (aid12_subfield == 4095 && len_remaining >= 5) {
38675
87
    proto_tree_add_item(tree, hf_ieee80211_he_trigger_padding, tvb, offset,
38676
87
                        tvb_reported_length_remaining(tvb, offset) - fcs_len,
38677
87
                        ENC_NA);
38678
87
  }
38679
38680
642
  *frame_len += length;
38681
642
  return length;
38682
774
}
38683
38684
static const range_string ranging_trigger_subtype_vals[] = {
38685
  { 0, 0, "Poll" },
38686
  { 1, 1, "Sounding" },
38687
  { 2, 2, "Secured Sounding" },
38688
  { 3, 3, "Report" },
38689
  { 4, 4, "Passive TB Measurement Exchange" },
38690
  { 5, 15, "Reserved" },
38691
  { 0, 0, NULL},
38692
};
38693
38694
static int * const ranging_headers1[] = {
38695
  &hf_ieee80211_ranging_trigger_subtype1,
38696
  &hf_ieee80211_ranging_trigger_reserved1,
38697
  &hf_ieee80211_ranging_trigger_token,
38698
  NULL
38699
};
38700
38701
static int * const ranging_headers2[] = {
38702
  &hf_ieee80211_ranging_trigger_subtype2,
38703
  &hf_ieee80211_ranging_trigger_reserved2,
38704
  &hf_ieee80211_ranging_trigger_sounding_dialog_token,
38705
  NULL
38706
};
38707
38708
static int
38709
dissect_ieee80211_he_eht_trigger(tvbuff_t *tvb, packet_info *pinfo,
38710
  proto_tree *tree, int offset, unsigned fcs_len)
38711
814
{
38712
814
  proto_tree        *common_tree = NULL;
38713
814
  uint8_t           trigger_type;
38714
814
  uint8_t           phy_version;
38715
814
  uint8_t           subtype = 0;
38716
814
  int               length = 0;
38717
814
  uint8_t           common_info_b54_55;
38718
814
  bool              eht_trigger = true;
38719
38720
814
  proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, tree, offset);
38721
38722
814
  offset += 6;
38723
814
  length += 6;
38724
38725
814
  if (tvb_captured_length_remaining(tvb, offset) < 8) {
38726
20
    expert_add_info_format(pinfo, tree, &ei_ieee80211_missing_data,
38727
20
                           "Invalid Trigger frame, not enough data for the "
38728
20
                           "Common Info field.");
38729
20
    return tvb_captured_length(tvb);
38730
20
  }
38731
38732
794
  trigger_type = tvb_get_uint8(tvb, offset) & 0x0F;
38733
794
  common_info_b54_55 = tvb_get_uint8(tvb, offset + 6);
38734
794
  phy_version = (tvb_get_letohs(tvb, offset + 8) >> 12) & 0x01;
38735
794
  if ((common_info_b54_55 >> 6) == 0x03)
38736
96
    eht_trigger = false;
38737
38738
794
  col_append_fstr(pinfo->cinfo, COL_INFO, " %s %s",
38739
794
                eht_trigger ? (phy_version ? "UHR": "EHT") : "HE",
38740
794
                val64_to_str_wmem(pinfo->pool, trigger_type, trigger_type_vals, "Reserved"));
38741
38742
794
  if (trigger_type >= TRIGGER_TYPE_MIN_RESERVED) {
38743
    /* Add an Expert Info and forget it */
38744
6
    proto_item *item;
38745
38746
6
    item = proto_tree_add_item(tree, hf_ieee80211_he_trigger_type, tvb, offset,
38747
6
                               1, ENC_NA);
38748
6
    expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
38749
6
                           "Trigger type too large: %u", trigger_type);
38750
6
    return tvb_captured_length_remaining(tvb, offset) + length;
38751
6
  }
38752
38753
  /*
38754
   * Deal with the common Info and then any user info after that.
38755
   */
38756
788
  offset += add_trigger_common_info(tree, tvb, offset, pinfo,
38757
788
                        trigger_type, &length, &common_tree);
38758
38759
  /*
38760
   * If the trigger type is Ranging Trigger type, then deal with it separately.
38761
   */
38762
788
  if (trigger_type == TRIGGER_TYPE_RANGING) {
38763
395
    subtype = tvb_get_uint8(tvb, offset) & 0x0f;
38764
38765
395
    col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
38766
395
                    rval_to_str_const(subtype, ranging_trigger_subtype_vals, "Reserved"));
38767
38768
395
    if (subtype >= TRIGGER_SUBTYPE_MIN_RESERVED) {
38769
5
      proto_item *item;
38770
38771
5
      item = proto_tree_add_item(tree, hf_ieee80211_ranging_trigger_subtype1,
38772
5
                                 tvb, offset, 1, ENC_NA);
38773
5
      expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
38774
5
                             "Ranging trigger subtype too large: %u", subtype);
38775
5
      return tvb_captured_length_remaining(tvb, offset) + length;
38776
5
    }
38777
38778
390
    switch (subtype) {
38779
272
    case TRIGGER_SUBTYPE_POLL:
38780
289
    case TRIGGER_SUBTYPE_SOUNDING:
38781
304
    case TRIGGER_SUBTYPE_SECURE_SOUNDING:
38782
369
    case TRIGGER_SUBTYPE_REPORT:
38783
369
      proto_tree_add_bitmask(common_tree, tvb, offset,
38784
369
                             hf_ieee80211_he_trigger_ranging_common_info_1,
38785
369
                             ett_he_trigger_ranging, ranging_headers1,
38786
369
                             ENC_NA);
38787
369
      offset += 1;
38788
369
      break;
38789
21
    case TRIGGER_SUBTYPE_PASSIVE_TB_MEAS_EXCHANGE:
38790
21
      proto_tree_add_bitmask(common_tree, tvb, offset,
38791
21
                             hf_ieee80211_he_trigger_ranging_common_info_2,
38792
21
                             ett_he_trigger_ranging, ranging_headers2,
38793
21
                             ENC_NA);
38794
21
      offset += 2;
38795
21
      break;
38796
0
    default:
38797
      /* We should never get here! */
38798
0
      DISSECTOR_ASSERT_NOT_REACHED();
38799
0
      break;
38800
390
    }
38801
390
  }
38802
38803
783
  add_trigger_user_info(tree, tvb, offset, pinfo, trigger_type, subtype,
38804
783
                        common_info_b54_55, &length, fcs_len);
38805
38806
  /*
38807
   *  Padding should commence here ... TODO, deal with it.
38808
   */
38809
38810
783
  return length;
38811
788
}
38812
38813
static int * const tack_headers[] = {
38814
  &hf_ieee80211_tack_next_twt,
38815
  &hf_ieee80211_tack_flow_identifier,
38816
  NULL
38817
};
38818
38819
static int
38820
dissect_ieee80211_s1g_tack(tvbuff_t *tvb, packet_info *pinfo _U_,
38821
  proto_tree *tree, int offset, uint16_t flags)
38822
6
{
38823
6
  int             length = 0;
38824
38825
6
  proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, tree, offset);
38826
38827
6
  offset += 6;
38828
6
  length += 6;
38829
38830
6
  proto_tree_add_item(tree, hf_ieee80211_beacon_sequence, tvb, offset, 1,
38831
6
                      ENC_NA);
38832
6
  offset += 1;
38833
6
  length += 1;
38834
38835
6
  proto_tree_add_item(tree, hf_ieee80211_pentapartial_timestamp, tvb, offset,
38836
6
                      5, ENC_NA);
38837
6
  offset += 5;
38838
6
  length += 5;
38839
38840
6
   if ((flags & 0xC0) == 0xC0)  {
38841
3
     proto_tree_add_bitmask_with_flags(tree, tvb, offset,
38842
3
                        hf_ieee80211_tack_next_twt_info, ett_tack_info,
38843
3
                        tack_headers, ENC_NA, BMT_NO_APPEND);
38844
3
     length += 6;
38845
3
   }
38846
38847
6
   return length;
38848
6
}
38849
38850
/*
38851
 * Dissect a VHT or an HE NDP accouncement frame. They differ past
38852
 * the sounding dialog token with a bit in the SDT indicating VHT vs HE.
38853
 */
38854
#define NDP_ANNC_VHT_HE 0x02
38855
38856
static const value_string ndp_annc_variant_vals[] = {
38857
  { 0, "VHT NDP Announcement" },
38858
  { 1, "Ranging NDP Announcement" },
38859
  { 2, "HE NDP Announcement" },
38860
  { 3, "EHT NDP Announcement" },
38861
  { 0, NULL }
38862
};
38863
38864
static int * const sta_info_ranging_2008[] = {
38865
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_aid11,
38866
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_ltf_offset,
38867
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_r2i_n_sts,
38868
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_r2i_rep,
38869
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_i2r_n_sts,
38870
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_reserved1,
38871
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_disambiguation,
38872
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_i2r_rep,
38873
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_reserved2,
38874
  NULL
38875
};
38876
38877
static int * const sta_info_ranging_2043[] = {
38878
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_aid11,
38879
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_sac,
38880
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_disambiguation,
38881
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_reserved,
38882
  NULL
38883
};
38884
38885
static int * const sta_info_ranging_2044[] = {
38886
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_aid11,
38887
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_partial_tsf,
38888
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_disambiguation,
38889
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_reserved,
38890
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_token,
38891
  NULL
38892
};
38893
38894
static int * const sta_info_ranging_2045[] = {
38895
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_aid11,
38896
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_i2r_ndp_tx_power,
38897
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_r2i_ndp_target_rssi,
38898
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_disambiguation,
38899
  &hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_reserved,
38900
  NULL
38901
};
38902
38903
static int
38904
dissect_ieee80211_ranging_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
38905
  proto_tree *tree, int offset, bool has_fcs)
38906
52
{
38907
52
  uint8_t          len_fcs = 0;
38908
52
  proto_tree      *sta_list;
38909
52
  proto_item      *sta_info_item, *pi;
38910
52
  int              saved_offset = 0;
38911
52
  int              sta_index = 0;
38912
38913
52
  if (has_fcs){
38914
4
    len_fcs = 4;
38915
4
  }
38916
38917
52
  sta_list = proto_tree_add_subtree(tree, tvb, offset, -1,
38918
52
                        ett_ndp_ranging_annc_sta_list, &pi, "STA list");
38919
52
  saved_offset = offset;
38920
38921
2.05k
  while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
38922
2.00k
    uint16_t aid11;
38923
38924
2.00k
    sta_info_item = proto_tree_add_subtree_format(sta_list, tvb, offset, 2,
38925
2.00k
                        ett_ndp_ranging_annc_sta_info, NULL, "STA %d",
38926
2.00k
                        sta_index++);
38927
38928
2.00k
    aid11 = tvb_get_uint16(tvb, offset, ENC_LITTLE_ENDIAN) & 0x7ff;
38929
2.00k
    if (aid11 < 2008) {
38930
1.69k
      proto_tree_add_bitmask_with_flags(sta_info_item, tvb, offset,
38931
1.69k
                            hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008,
38932
1.69k
                            ett_vht_ranging_annc, sta_info_ranging_2008,
38933
1.69k
                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38934
1.69k
    } else if (aid11 == 2043) {
38935
9
      proto_tree_add_bitmask_with_flags(sta_info_item, tvb, offset,
38936
9
                            hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043,
38937
9
                            ett_vht_ranging_annc, sta_info_ranging_2043,
38938
9
                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38939
297
    } else if (aid11 == 2044) {
38940
14
      proto_tree_add_bitmask_with_flags(sta_info_item, tvb, offset,
38941
14
                            hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044,
38942
14
                            ett_vht_ranging_annc, sta_info_ranging_2044,
38943
14
                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38944
283
    } else if (aid11 == 2045) {
38945
12
      proto_tree_add_bitmask_with_flags(sta_info_item, tvb, offset,
38946
12
                            hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045,
38947
12
                            ett_vht_ranging_annc, sta_info_ranging_2045,
38948
12
                            ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
38949
12
    }
38950
2.00k
    offset += 4;
38951
2.00k
  }
38952
38953
52
  proto_item_set_len(pi, offset - saved_offset);
38954
52
  return offset;
38955
52
}
38956
38957
static int
38958
dissect_ieee80211_vht_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
38959
  proto_tree *tree, int offset, bool has_fcs)
38960
47
{
38961
47
  uint16_t         sta_info;
38962
47
  uint8_t          len_fcs = 0;
38963
47
  proto_tree      *sta_list;
38964
47
  proto_item      *sta_info_item, *pi;
38965
47
  int              saved_offset = 0;
38966
47
  int              sta_index = 0;
38967
38968
47
  if (has_fcs){
38969
2
    len_fcs = 4;
38970
2
  }
38971
38972
47
  sta_list = proto_tree_add_subtree(tree, tvb, offset, -1,
38973
47
                        ett_ndp_vht_annc_sta_list, &pi, "STA list");
38974
47
  saved_offset = offset;
38975
38976
1.87k
  while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
38977
1.82k
    sta_info_item = proto_tree_add_subtree_format(sta_list, tvb, offset, 2,
38978
1.82k
                        ett_ndp_vht_annc_sta_info_tree, NULL, "STA %d",
38979
1.82k
                        sta_index++);
38980
38981
1.82k
    proto_tree_add_item(sta_info_item, hf_ieee80211_vht_ndp_annc_sta_info_aid12,
38982
1.82k
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
38983
1.82k
    proto_tree_add_item(sta_info_item,
38984
1.82k
                        hf_ieee80211_vht_ndp_annc_sta_info_feedback_type,
38985
1.82k
                        tvb, offset, 2, ENC_LITTLE_ENDIAN);
38986
38987
1.82k
    sta_info = tvb_get_letohs(tvb, offset);
38988
38989
1.82k
    if (sta_info & 0x1000)
38990
713
      proto_tree_add_uint(sta_info_item,
38991
713
                          hf_ieee80211_vht_ndp_annc_sta_info_nc_index,
38992
713
                          tvb, offset, 2, sta_info);
38993
1.11k
    else
38994
1.11k
      proto_tree_add_item(sta_info_item,
38995
1.11k
                          hf_ieee80211_vht_ndp_annc_sta_info_reserved,
38996
1.11k
                          tvb, offset, 2, ENC_LITTLE_ENDIAN);
38997
1.82k
    offset += 2;
38998
1.82k
  }
38999
39000
47
  proto_item_set_len(pi, offset - saved_offset);
39001
47
  return offset;
39002
47
}
39003
39004
static int * const he_ndp_sta_headers[] = {
39005
  &hf_ieee80211_he_ndp_annc_aid11,
39006
  &hf_ieee80211_he_ndp_annc_ru_start,
39007
  &hf_ieee80211_he_ndp_annc_ru_end,
39008
  &hf_ieee80211_he_ndp_annc_feedback_type_and_ng,
39009
  &hf_ieee80211_he_ndp_annc_disambiguation,
39010
  &hf_ieee80211_he_ndp_annc_codebook_size,
39011
  &hf_ieee80211_he_ndp_annc_nc,
39012
  NULL
39013
};
39014
39015
static int * const he_ndp_annc_2047_hdrs[] = {
39016
  &hf_ieee80211_he_ndp_annc_aid11,
39017
  &hf_ieee80211_he_ndp_annc_disallowed_bitmap,
39018
  &hf_ieee80211_he_ndp_annc_reserved1,
39019
  &hf_ieee80211_he_ndp_annc_disambiguation,
39020
  &hf_ieee80211_he_ndp_annc_reserved2,
39021
  NULL
39022
};
39023
39024
static int
39025
dissect_ieee80211_he_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
39026
  proto_tree *tree, int offset, bool has_fcs)
39027
50
{
39028
50
  uint8_t          len_fcs = 0;
39029
50
  proto_tree      *sta_list;
39030
50
  proto_item      *pi;
39031
50
  int              saved_offset;
39032
50
  int              sta_index = 0;
39033
39034
50
  if (has_fcs){
39035
3
    len_fcs = 4;
39036
3
  }
39037
39038
50
  saved_offset = offset;
39039
50
  sta_list = proto_tree_add_subtree(tree, tvb, offset, -1,
39040
50
                        ett_ndp_he_annc_sta_list, &pi, "STA list");
39041
39042
1.46k
  while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
39043
1.41k
    proto_tree *sta_item;
39044
1.41k
    uint32_t sta_info = tvb_get_letohl(tvb, offset);
39045
39046
1.41k
    sta_item = proto_tree_add_subtree_format(sta_list, tvb, offset, 4,
39047
1.41k
                        ett_ndp_he_annc_sta_item, NULL, "STA %d", sta_index++);
39048
1.41k
    if ((sta_info & 0x000007ff) < 2047) {
39049
1.18k
      proto_tree_add_bitmask_with_flags(sta_item, tvb, offset,
39050
1.18k
                        hf_ieee80211_he_ndp_annc_sta,
39051
1.18k
                        ett_ndp_he_annc_sta_info,
39052
1.18k
                        he_ndp_sta_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
39053
1.18k
    } else {
39054
231
      proto_tree_add_bitmask_with_flags(tree, tvb, offset,
39055
231
                        hf_ieee80211_he_ndp_annc_sta,
39056
231
                        ett_ndp_he_annc_sta_info,
39057
231
                        he_ndp_annc_2047_hdrs, ENC_LITTLE_ENDIAN,
39058
231
                        BMT_NO_APPEND);
39059
231
    }
39060
39061
1.41k
    offset += 4;
39062
1.41k
  }
39063
39064
50
  proto_item_set_len(pi, offset - saved_offset);
39065
50
  return offset;
39066
50
}
39067
39068
static int * const eht_ndp_annc_hdrs[] = {
39069
  &hf_ieee80211_ndp_eht_annc_aid11,
39070
  &hf_ieee80211_ndp_eht_annc_resolution,
39071
  &hf_ieee80211_ndp_eht_annc_feedback_map,
39072
  &hf_ieee80211_ndp_eht_annc_reserved1,
39073
  &hf_ieee80211_ndp_eht_annc_nc_index,
39074
  &hf_ieee80211_ndp_eht_annc_feedback_type,
39075
  &hf_ieee80211_ndp_eht_annc_disambiguation,
39076
  &hf_ieee80211_ndp_eht_annc_codebook_size,
39077
  &hf_ieee80211_ndp_eht_annc_reserved2,
39078
  NULL
39079
};
39080
39081
static int
39082
dissect_ieee80211_eht_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
39083
  proto_tree *tree, int offset, bool has_fcs)
39084
32
{
39085
32
  uint8_t          len_fcs = 0;
39086
32
  proto_tree      *sta_list;
39087
32
  proto_item      *pi;
39088
32
  int              saved_offset;
39089
39090
32
  if (has_fcs){
39091
3
    len_fcs = 4;
39092
3
  }
39093
39094
32
  saved_offset = offset;
39095
32
  sta_list = proto_tree_add_subtree(tree, tvb, offset, -1,
39096
32
                        ett_ndp_eht_annc_sta_list, &pi, "STA list");
39097
39098
696
  while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
39099
39100
664
    proto_tree_add_bitmask_with_flags(sta_list, tvb, offset,
39101
664
                            hf_ieee80211_ndp_eht_annc_sta_info,
39102
664
                            ett_ndp_eht_annc_sta_info,
39103
664
                            eht_ndp_annc_hdrs, ENC_LITTLE_ENDIAN,
39104
664
                            BMT_NO_APPEND);
39105
664
    offset += 4;
39106
664
  }
39107
39108
32
  proto_item_set_len(pi, offset - saved_offset);
39109
32
  return offset;
39110
32
}
39111
39112
static int * const ndp_annc_headers[] = {
39113
  &hf_ieee80211_ndp_annc_variant,
39114
  &hf_ieee80211_ndp_annc_token_number,
39115
  NULL
39116
};
39117
39118
static int
39119
dissect_ieee80211_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
39120
  proto_tree *tree, int offset, bool has_fcs)
39121
181
{
39122
181
  proto_item      *dialog;
39123
181
  uint8_t          dialog_token;
39124
39125
181
  proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, tree, offset);
39126
181
  offset += 6;
39127
39128
181
  dialog_token = tvb_get_uint8(tvb, offset);
39129
181
  col_append_fstr(pinfo->cinfo, COL_INFO, ", Sounding Dialog Token=%d",
39130
181
                  dialog_token);
39131
39132
181
  dialog = proto_tree_add_bitmask_with_flags(tree, tvb, offset,
39133
181
                        hf_ieee80211_ndp_annc_token, ett_ndp_annc,
39134
181
                        ndp_annc_headers, ENC_NA, BMT_NO_APPEND);
39135
39136
181
  offset++;
39137
39138
181
  if ((dialog_token & 0x03) == 0x00) {
39139
47
    proto_item_append_text(dialog, " VHT NDP Announcement");
39140
47
    return dissect_ieee80211_vht_ndp_annc(tvb, pinfo, tree, offset, has_fcs);
39141
134
  } else if ((dialog_token & 0x03) == 0x01) {
39142
52
    proto_item_append_text(dialog, " Ranging NDP Announcement");
39143
52
    return dissect_ieee80211_ranging_ndp_annc(tvb, pinfo, tree, offset,
39144
52
                                              has_fcs);
39145
82
  } else if ((dialog_token & 0x03) == 0x02) {
39146
50
    proto_item_append_text(dialog, " HE NDP Announcement");
39147
50
    return dissect_ieee80211_he_ndp_annc(tvb, pinfo, tree, offset, has_fcs);
39148
50
  } else if ((dialog_token & 0x03) == 0x03) {
39149
32
    proto_item_append_text(dialog, " EHT NDP Announcement");
39150
32
    return dissect_ieee80211_eht_ndp_annc(tvb, pinfo, tree, offset, has_fcs);
39151
32
  } else {
39152
0
    DISSECTOR_ASSERT_NOT_REACHED();
39153
0
  }
39154
39155
0
  return offset;
39156
181
}
39157
39158
static void
39159
set_src_addr_cols(packet_info *pinfo, tvbuff_t *tvb, int offset, int type)
39160
6.09k
{
39161
6.09k
  set_address_tvb(&pinfo->dl_src, type, 6, tvb, offset);
39162
6.09k
  copy_address_shallow(&pinfo->src, &pinfo->dl_src);
39163
  // Should we call proto_tree_add_mac48_detail here?
39164
6.09k
}
39165
39166
static void
39167
set_dst_addr_cols(packet_info *pinfo, tvbuff_t *tvb, int offset, int type)
39168
5.76k
{
39169
5.76k
  set_address_tvb(&pinfo->dl_dst, type, 6, tvb, offset);
39170
5.76k
  copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
39171
  // Should we call proto_tree_add_mac48_detail here?
39172
5.76k
}
39173
39174
static uint32_t
39175
crc32_802_tvb_padded(tvbuff_t *tvb, unsigned hdr_len, unsigned hdr_size, unsigned len)
39176
0
{
39177
0
  uint32_t c_crc;
39178
39179
0
  c_crc = crc32_ccitt_tvb(tvb, hdr_len);
39180
0
  c_crc = crc32_ccitt_tvb_offset_seed(tvb, hdr_size, len, ~c_crc);
39181
39182
0
  return (c_crc);
39183
0
}
39184
39185
/*
39186
 * Check if the SA at offset is that of an S1G STA, and if so, and the
39187
 * IS_S1G_KEY with true.
39188
 */
39189
static void
39190
check_s1g_setting(packet_info *pinfo, tvbuff_t *tvb, int offset)
39191
3.68k
{
39192
3.68k
  uint8_t *src_addr[6];
39193
3.68k
  tvb_memcpy(tvb, src_addr, offset, 6);
39194
3.68k
  unsigned result = GPOINTER_TO_UINT(wmem_map_lookup(sta_prop_hash, &src_addr));
39195
3.68k
  if (result == STA_IS_S1G) {
39196
1.18k
    p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_S1G_KEY, GINT_TO_POINTER(true));
39197
1.18k
  }
39198
3.68k
}
39199
39200
typedef enum {
39201
    ENCAP_802_2,
39202
    ENCAP_IPX,
39203
    ENCAP_ETHERNET,
39204
    ENCAP_EPD
39205
} encap_t;
39206
39207
/*
39208
 * Dissect a Protocol Version 1 frame
39209
 */
39210
39211
static const value_string pv1_frame_type_vals[] = {
39212
  { 0, "PV1 QoS Data - with one SID" },
39213
  { 1, "PV1 Management" },
39214
  { 2, "PV1 Control" } ,
39215
  { 3, "PV1 QoS Data - no SIDs" },
39216
  { 4, "PV1 Reserved" },
39217
  { 5, "PV1 Reserved" },
39218
  { 6, "PV1 Reserved" },
39219
  { 7, "PV1 Extension (currently reserved)" },
39220
  { 0, NULL }
39221
};
39222
39223
static const value_string pv1_control_frame_type_vals[] = {
39224
  { 0, "STACK" },
39225
  { 1, "BAT" },
39226
  { 2, "Reserved" },
39227
  { 3, "Reserved" },
39228
  { 4, "Reserved" },
39229
  { 5, "Reserved" },
39230
  { 6, "Reserved" },
39231
  { 7, "Reserved" },
39232
  { 0, NULL }
39233
};
39234
39235
static const value_string pv1_management_frame_type_vals[] = {
39236
  { 0, "Action" },
39237
  { 1, "Action No Ack" },
39238
  { 2, "PV1 Probe Response" },
39239
  { 3, "Resource Allocation" },
39240
  { 4, "Reserved" },
39241
  { 5, "Reserved" },
39242
  { 6, "Reserved" },
39243
  { 7, "Reserved" },
39244
  { 0, NULL }
39245
};
39246
39247
/* Also used for S1G PV0 */
39248
static const value_string pv1_bandwidth_indic_vals[] = {
39249
  { 0, "1 MHz" },
39250
  { 1, "2 MHz" },
39251
  { 2, "4 MHz" },
39252
  { 3, "8 MHz" },
39253
  { 4, "16 MHz" },
39254
  { 5, "Reserved" },
39255
  { 6, "Reserved" },
39256
  { 7, "Reserved" },
39257
  { 0, NULL },
39258
};
39259
39260
/*
39261
 * Extract the three interesting flags from an SID, however, only set
39262
 * the respective booleans if the flag is set in the SID.
39263
 */
39264
static void
39265
extract_a3_a4_amsdu(uint16_t sid, bool *a3_present, bool *a4_present,
39266
                    bool *a_msdu)
39267
1.44k
{
39268
1.44k
  if (sid & SID_A3_PRESENT)
39269
470
    *a3_present = true;
39270
1.44k
  if (sid & SID_A4_PRESENT)
39271
382
    *a4_present = true;
39272
1.44k
  if (sid & SID_A_MSDU)
39273
377
    *a_msdu = true;
39274
1.44k
}
39275
39276
static int
39277
wlan_aid_to_str(const address* addr, char* buf, int buf_len)
39278
1
{
39279
1
    int ret;
39280
39281
1
    ret = snprintf(buf, buf_len, "0x%04"PRIx16, *(uint16_t *)addr->data);
39282
39283
1
    return ret + 1;
39284
1
}
39285
39286
static int
39287
wlan_aid_str_len(const address* addr _U_)
39288
1
{
39289
1
    return sizeof("0x0000");
39290
1
}
39291
39292
#if 0
39293
/* The length is 2 bytes, but tvb_address_to_str() etc. don't have a way of
39294
 * dealing with addresses that need to mask out bits in the tvb. */
39295
static int
39296
wlan_aid_len(void)
39297
{
39298
    return 2;
39299
}
39300
#endif
39301
39302
/*
39303
 * If we know the AID, then translated it to an Ethernet addr, otherwise
39304
 * just place the AID in the correct col
39305
 */
39306
static void
39307
set_sid_addr_cols(packet_info *pinfo, uint16_t sid, bool dst)
39308
1.44k
{
39309
1.44k
  uint16_t* aid = wmem_new0(pinfo->pool, uint16_t);
39310
1.44k
  *aid = sid & SID_AID_MASK;
39311
1.44k
  if (dst) {
39312
794
    set_address(&pinfo->dl_dst, wlan_aid_address_type, (int)sizeof(*aid), aid);
39313
794
    copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
39314
794
  } else {
39315
649
    set_address(&pinfo->dl_src, wlan_aid_address_type, (int)sizeof(*aid), aid);
39316
649
    copy_address_shallow(&pinfo->src, &pinfo->dl_src);
39317
649
  }
39318
1.44k
}
39319
39320
static int * const sid_headers[] = {
39321
  &hf_ieee80211_pv1_sid_association_id,
39322
  &hf_ieee80211_pv1_sid_a3_present,
39323
  &hf_ieee80211_pv1_sid_a4_present,
39324
  &hf_ieee80211_pv1_sid_a_msdu,
39325
  NULL
39326
};
39327
39328
static void
39329
dissect_pv1_sid(proto_tree *tree, packet_info *pinfo _U_, tvbuff_t *tvb,
39330
                unsigned offset)
39331
1.44k
{
39332
1.44k
  proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_pv1_sid,
39333
1.44k
                         ett_pv1_sid_field, sid_headers, ENC_LITTLE_ENDIAN);
39334
39335
1.44k
}
39336
39337
static void
39338
dissect_pv1_sequence_control(proto_tree *tree, packet_info *pinfo _U_,
39339
                             tvbuff_t *tvb, unsigned offset)
39340
1.35k
{
39341
1.35k
  proto_tree *seq_ctrl_tree = NULL;
39342
39343
1.35k
  seq_ctrl_tree = proto_tree_add_subtree(tree, tvb, offset, 2,
39344
1.35k
                                         ett_pv1_seq_control, NULL,
39345
1.35k
                                         "Sequence Control");
39346
1.35k
  proto_tree_add_item(seq_ctrl_tree, hf_ieee80211_frag_number, tvb, offset, 2,
39347
1.35k
                      ENC_LITTLE_ENDIAN);
39348
1.35k
  proto_tree_add_item(seq_ctrl_tree, hf_ieee80211_seq_number, tvb, offset, 2,
39349
1.35k
                      ENC_LITTLE_ENDIAN);
39350
1.35k
}
39351
39352
static int
39353
dissect_pv1_data(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_,
39354
                 int offset, bool a_msdu _U_, struct ieee_802_11_phdr *phdr _U_,
39355
                 unsigned len_no_fcs _U_)
39356
37
{
39357
39358
37
  return offset;
39359
37
}
39360
39361
static int
39362
dissect_pv1_mgmt_action(tvbuff_t *tvb _U_, packet_info *pinfo _U_,
39363
                        proto_tree *tree _U_, int offset _U_,
39364
                        struct ieee_802_11_phdr *phdr _U_,
39365
                        unsigned len _U_)
39366
769
{
39367
769
  proto_tree *mgmt_action_tree = NULL;
39368
39369
769
  mgmt_action_tree = proto_tree_add_subtree(tree, tvb, offset, 4,
39370
769
                                            ett_pv1_mgmt_action, NULL,
39371
769
                                            "Action");
39372
769
  dissect_mgt_action(tvb, pinfo, mgmt_action_tree, offset, NULL);
39373
39374
769
  return offset;
39375
769
}
39376
39377
static int
39378
dissect_pv1_mgmt_action_no_ack(tvbuff_t *tvb _U_, packet_info *pinfo _U_,
39379
                               proto_tree *tree _U_, int offset _U_,
39380
                               struct ieee_802_11_phdr *phdr _U_,
39381
                               unsigned len _U_)
39382
520
{
39383
520
  proto_tree *mgmt_action_tree = NULL;
39384
39385
520
  mgmt_action_tree = proto_tree_add_subtree(tree, tvb, offset, 4,
39386
520
                                            ett_pv1_mgmt_action, NULL,
39387
520
                                            "Action No Ack");
39388
520
  dissect_mgt_action(tvb, pinfo, mgmt_action_tree, offset, NULL);
39389
39390
520
  return offset;
39391
520
}
39392
39393
#define PV1_NEXT_TBTT_PRESENT 0x0100
39394
#define PV1_FULL_SSID_PRESENT 0x0200
39395
#define PV1_ANO_PRESENT       0x0400
39396
39397
static int
39398
dissect_pv1_mgmt_probe_response(tvbuff_t *tvb _U_, packet_info *pinfo _U_,
39399
                                proto_tree *tree _U_, int offset _U_,
39400
                                struct ieee_802_11_phdr *phdr _U_,
39401
                                unsigned len _U_, uint16_t frame_control _U_)
39402
5
{
39403
39404
5
  return offset;
39405
5
}
39406
39407
static int
39408
dissect_pv1_mgmt_resource_alloc(tvbuff_t *tvb _U_, packet_info *pinfo _U_,
39409
                                proto_tree *tree _U_, int offset _U_,
39410
                                struct ieee_802_11_phdr *phdr _U_,
39411
                                unsigned len _U_, uint16_t frame_control _U_)
39412
4
{
39413
39414
4
  return offset;
39415
4
}
39416
39417
static int
39418
dissect_pv1_management(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_,
39419
                 int offset, struct ieee_802_11_phdr *phdr _U_, uint8_t subtype,
39420
                 unsigned len_no_fcs, uint16_t frame_control _U_)
39421
1.30k
{
39422
39423
  /*
39424
   * XXX - We add COMPOSE_FRAME_TYPE(fcf) (which doesn't work for PV1) as
39425
   * proto_data FRAME_TYPE_KEY for PV0. Do we need to put something here?
39426
   */
39427
1.30k
  switch (subtype) {
39428
769
    case PV1_MANAGEMENT_ACTION:
39429
769
      offset = dissect_pv1_mgmt_action(tvb, pinfo, tree, offset, phdr, len_no_fcs);
39430
769
      break;
39431
520
    case PV1_MANAGEMENT_ACTION_NO_ACK:
39432
520
      offset = dissect_pv1_mgmt_action_no_ack(tvb, pinfo, tree, offset, phdr, len_no_fcs);
39433
520
      break;
39434
5
    case PV1_MANAGEMENT_PROBE_RESPONSE:
39435
5
      offset = dissect_pv1_mgmt_probe_response(tvb, pinfo, tree, offset, phdr, len_no_fcs, frame_control);
39436
5
      break;
39437
4
    case PV1_MANAGEMENT_RESOURCE_ALLOC:
39438
4
      offset = dissect_pv1_mgmt_resource_alloc(tvb, pinfo, tree, offset, phdr, len_no_fcs, frame_control);
39439
4
      break;
39440
5
    default:
39441
5
      proto_tree_add_item(tree, hf_ieee80211_pv1_mgmt_reserved, tvb, offset,
39442
5
                          len_no_fcs, ENC_NA);
39443
5
      offset = len_no_fcs;
39444
1.30k
  }
39445
39446
467
  return offset;
39447
1.30k
}
39448
39449
static int
39450
dissect_pv1_control_stack(tvbuff_t *tvb, packet_info *pinfo _U_,
39451
                          proto_tree *tree, int offset,
39452
                          struct ieee_802_11_phdr *phdr _U_,
39453
                          unsigned len _U_, uint16_t frame_control _U_)
39454
14
{
39455
14
  proto_tree *stack_tree = NULL;
39456
39457
14
  stack_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_pv1_cntl_stack,
39458
14
                                      NULL, "STACK");
39459
14
  proto_tree_add_item(stack_tree, hf_ieee80211_pv1_cnt_stack_tetra_timest,
39460
14
                      tvb, offset, 4, ENC_LITTLE_ENDIAN);
39461
14
  offset += 4;
39462
39463
14
  return offset;
39464
14
}
39465
39466
static int
39467
dissect_pv1_control_bat(tvbuff_t *tvb, packet_info *pinfo _U_,
39468
                        proto_tree *tree, int offset,
39469
                        struct ieee_802_11_phdr *phdr _U_,
39470
                        unsigned len _U_,
39471
                        uint16_t frame_control _U_)
39472
2
{
39473
2
  proto_tree *bat_tree = NULL;
39474
39475
2
  bat_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_pv1_cntl_stack,
39476
2
                                      NULL, "BAT");
39477
39478
2
  proto_tree_add_item(bat_tree, hf_ieee80211_pv1_cnt_bat_beacon_seq, tvb,
39479
2
                      offset, 1, ENC_NA);
39480
2
  offset += 1;
39481
39482
2
  proto_tree_add_item(bat_tree, hf_ieee80211_pv1_cnt_bat_penta_timest, tvb,
39483
2
                      offset, 5, ENC_LITTLE_ENDIAN);
39484
2
  offset += 5;
39485
39486
2
  proto_tree_add_item(bat_tree, hf_ieee80211_pv1_cnt_bat_next_twt_info, tvb,
39487
2
                      offset, 6, ENC_LITTLE_ENDIAN);
39488
2
  offset += 6;
39489
39490
2
  proto_tree_add_item(bat_tree, hf_ieee80211_pv1_cnt_bat_stating_seq_cntl, tvb,
39491
2
                      offset, 2, ENC_LITTLE_ENDIAN);
39492
2
  offset += 6;
39493
39494
2
  proto_tree_add_item(bat_tree, hf_ieee80211_pv1_cnt_bat_bitmap, tvb, offset,
39495
2
                      4, ENC_LITTLE_ENDIAN);
39496
2
  offset += 4;
39497
39498
2
  return offset;
39499
2
}
39500
39501
static int
39502
dissect_pv1_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
39503
                 int offset, struct ieee_802_11_phdr *phdr, uint8_t subtype,
39504
                 unsigned len_no_fcs, uint16_t frame_control)
39505
35
{
39506
35
  switch (subtype) {
39507
14
    case PV1_CONTROL_STACK:
39508
14
      offset = dissect_pv1_control_stack(tvb, pinfo, tree, offset, phdr, len_no_fcs, frame_control);
39509
14
      break;
39510
39511
2
    case PV1_CONTROL_BAT:
39512
2
      offset = dissect_pv1_control_bat(tvb, pinfo, tree, offset, phdr, len_no_fcs, frame_control);
39513
2
      break;
39514
39515
19
    default:
39516
19
      proto_tree_add_item(tree, hf_ieee80211_pv1_cntl_reserved, tvb, offset,
39517
19
                          len_no_fcs, ENC_NA);
39518
19
      offset = len_no_fcs;
39519
35
  }
39520
39521
12
  return offset;
39522
35
}
39523
39524
static int
39525
dissect_ieee80211_pv1(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
39526
                      struct ieee_802_11_phdr *phdr)
39527
1.46k
{
39528
1.46k
  uint16_t     fcf;
39529
1.46k
  uint8_t      type, subtype, from_ds;
39530
1.46k
  unsigned     offset = 0;
39531
1.46k
  const char *fts_str = NULL;
39532
1.46k
  proto_item  *ti;
39533
1.46k
  proto_tree  *hdr_tree;
39534
1.46k
  proto_item  *fc_item = NULL;
39535
1.46k
  proto_tree  *fc_tree = NULL;
39536
1.46k
  bool        a1_is_sid = false;
39537
1.46k
  bool        a2_is_sid = false;
39538
1.46k
  bool        a3_present = false;
39539
1.46k
  bool        a4_present = false;
39540
1.46k
  bool        a_msdu = false;
39541
1.46k
  unsigned    len = tvb_reported_length_remaining(tvb, offset);
39542
1.46k
  unsigned    len_no_fcs = len;
39543
1.46k
  proto_tree  *mgt_tree;
39544
39545
1.46k
  fcf = tvb_get_letohs(tvb, offset);
39546
39547
1.46k
  type = FCF_PV1_TYPE(fcf);
39548
1.46k
  subtype = FCF_PV1_SUBTYPE(fcf);
39549
39550
1.46k
  fts_str = val_to_str(type, pv1_frame_type_vals, "Unrecognized frame type (%d)");
39551
1.46k
  col_set_str(pinfo->cinfo, COL_INFO, fts_str);
39552
39553
  /* Create the protocol tree */
39554
1.46k
  ti = proto_tree_add_protocol_format (tree, proto_wlan, tvb, 0, -1,
39555
1.46k
                                       "IEEE 802.11 %s", fts_str);
39556
1.46k
  hdr_tree = proto_item_add_subtree(ti, ett_80211);
39557
39558
  /* Add the FC and duration/id to the current tree */
39559
1.46k
  fc_item = proto_tree_add_item(hdr_tree, hf_ieee80211_fc_field, tvb, offset, 2, ENC_LITTLE_ENDIAN);
39560
39561
1.46k
  fc_tree = proto_item_add_subtree(fc_item, ett_fc_tree);
39562
39563
1.46k
  proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_proto_version, tvb, offset,
39564
1.46k
                      2, ENC_LITTLE_ENDIAN);
39565
1.46k
  proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_type, tvb, offset, 2,
39566
1.46k
                      ENC_LITTLE_ENDIAN);
39567
  /*
39568
   * PDID/Subtype depends on ... whether it is a QoS data frame or Control
39569
   * or Management frames
39570
   */
39571
1.46k
  switch (type) {
39572
38
  case PV1_QOS_DATA_1MAC:
39573
57
  case PV1_QOS_DATA_2MAC:
39574
57
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_ptid, tvb, offset, 2,
39575
57
                        ENC_LITTLE_ENDIAN);
39576
57
    break;
39577
39578
1.31k
  case PV1_MANAGEMENT:
39579
1.31k
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_subtype, tvb, offset,
39580
1.31k
                        2, ENC_LITTLE_ENDIAN);
39581
1.31k
    break;
39582
39583
39
  case PV1_CONTROL:
39584
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_cntl_subtype, tvb, offset,
39585
39
                        2, ENC_LITTLE_ENDIAN);
39586
39
    break;
39587
39588
56
  default: /* Assume all else just a 3-bit field */
39589
56
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_unk_field, tvb, offset, 2,
39590
56
                        ENC_LITTLE_ENDIAN);
39591
56
    break;
39592
1.46k
  }
39593
39594
1.46k
  from_ds = (fcf >> 8) & 0x01; /* It's also the slot assignment field */
39595
39596
1.46k
  switch (type) {
39597
39
  case PV1_CONTROL:
39598
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_bw_indication, tvb,
39599
39
                        offset, 2, ENC_LITTLE_ENDIAN);
39600
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_dynamic_indication, tvb,
39601
39
                        offset, 2, ENC_LITTLE_ENDIAN);
39602
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_cntl_power_mgmt, tvb,
39603
39
                        offset, 2, ENC_LITTLE_ENDIAN);
39604
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_cntl_more_data, tvb,
39605
39
                        offset, 2, ENC_LITTLE_ENDIAN);
39606
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_cntl_flow_control, tvb,
39607
39
                        offset, 2, ENC_LITTLE_ENDIAN);
39608
39
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_cntl_next_twt_info, tvb,
39609
39
                        offset, 2, ENC_LITTLE_ENDIAN);
39610
39
    break;
39611
1.31k
  case PV1_MANAGEMENT:
39612
1.31k
    if (subtype == PV1_MANAGEMENT_PROBE_RESPONSE) {
39613
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_next_tbt, tvb,
39614
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39615
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_full_ssid, tvb,
39616
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39617
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_ano, tvb,
39618
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39619
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_bss_bw, tvb,
39620
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39621
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_security, tvb,
39622
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39623
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_1mhz_pc, tvb,
39624
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39625
1.31k
    } else if (subtype == PV1_MANAGEMENT_RESOURCE_ALLOC) {
39626
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_slot_assign, tvb,
39627
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39628
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_more_frag, tvb,
39629
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39630
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_pwr_mgmt, tvb,
39631
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39632
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_grp_indic, tvb,
39633
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39634
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_protected, tvb,
39635
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39636
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_end_of_svc, tvb,
39637
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39638
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_relayed_frm, tvb,
39639
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39640
6
      proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_mgmt_pr_ack_policy, tvb,
39641
6
                          offset, 2, ENC_LITTLE_ENDIAN);
39642
1.30k
    } else {
39643
      // TODO: What about the rest
39644
1.30k
    }
39645
1.31k
    break;
39646
39647
113
  default:
39648
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_from_ds, tvb, offset, 2,
39649
113
                        ENC_LITTLE_ENDIAN);
39650
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_more_fragments, tvb,
39651
113
                        offset, 2, ENC_LITTLE_ENDIAN);
39652
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_power_mgmt, tvb, offset, 2,
39653
113
                        ENC_LITTLE_ENDIAN);
39654
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_more_data, tvb, offset, 2,
39655
113
                        ENC_LITTLE_ENDIAN);
39656
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_protected_frame, tvb,
39657
113
                        offset, 2, ENC_LITTLE_ENDIAN);
39658
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_end_service_per, tvb,
39659
113
                        offset, 2, ENC_LITTLE_ENDIAN);
39660
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_relayed_frame, tvb, offset,
39661
113
                        2, ENC_LITTLE_ENDIAN);
39662
113
    proto_tree_add_item(fc_tree, hf_ieee80211_fc_pv1_ack_policy, tvb, offset, 2,
39663
113
                        ENC_LITTLE_ENDIAN);
39664
1.46k
  }
39665
39666
1.46k
  offset += 2;
39667
39668
  /*
39669
   * Now, handle the MAC addresses or SIDs, which is dependent on the
39670
   * Type and From DS etc.
39671
   */
39672
39673
1.46k
  if (from_ds == 0x0) {
39674
673
    a2_is_sid = true;
39675
796
  } else {
39676
796
    a1_is_sid = true;
39677
796
  }
39678
39679
  /* Now override where needed */
39680
1.46k
  switch (type) {
39681
1.31k
  case PV1_MANAGEMENT:
39682
1.31k
    if (subtype == PV1_MANAGEMENT_PROBE_RESPONSE) {
39683
6
      a1_is_sid = false;
39684
6
      a2_is_sid = false;
39685
6
    }
39686
1.31k
    break;
39687
39
  case PV1_CONTROL:
39688
39
    a1_is_sid = true;
39689
39
    break;
39690
19
  case PV1_QOS_DATA_2MAC:
39691
19
    a1_is_sid = false;
39692
19
    a2_is_sid = false;
39693
19
    break;
39694
1.46k
  }
39695
39696
  /*
39697
   * Now handle the address fields.
39698
   * If one of them is a SID, then it tells us if A3 and/or A4 is there.
39699
   *
39700
   * Also, add the SID (with MAC address if we know it), or the MAC
39701
   * addr depending on type.
39702
   *
39703
   * XXX - For PV1_CONTROL frames (IEEE 802.11-2020 9.8.4), the A3 Present,
39704
   * A4 Present, and A-MSDU subfields of the SID are reserved. Should
39705
   * they be dissected differently, and ignored / expert info if set?
39706
   *
39707
   * For PV1_MANAGMENT frames (9.8.5), A4 and A-MSDU cannot be present.
39708
   * Ignore / expert info if set?
39709
   */
39710
1.46k
  if (a1_is_sid) {
39711
797
    uint16_t a1 = tvb_get_letohs(tvb, offset);
39712
797
    proto_tree *dst_sid = NULL;
39713
39714
797
    extract_a3_a4_amsdu(a1, &a3_present, &a4_present, &a_msdu);
39715
797
    set_sid_addr_cols(pinfo, a1, true); /* Set the R SID address from A1 */
39716
39717
797
    dst_sid = proto_tree_add_subtree(hdr_tree, tvb, offset, 2, ett_pv1_sid,
39718
797
                                      NULL, "Receiver SID");
39719
797
    dissect_pv1_sid(dst_sid, pinfo, tvb, offset);
39720
797
    offset += 2;
39721
797
  } else {
39722
672
    set_dst_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
39723
672
    proto_tree_add_mac48_detail(&mac_ra, &mac_addr, ett_addr, tvb, hdr_tree, offset);
39724
672
    offset += 6;
39725
672
  }
39726
39727
1.46k
  if (a2_is_sid) {
39728
655
    uint16_t a2 = tvb_get_letohs(tvb, offset);
39729
655
    proto_tree *src_sid = NULL;
39730
39731
655
    extract_a3_a4_amsdu(a2, &a3_present, &a4_present, &a_msdu);
39732
655
    set_sid_addr_cols(pinfo, a2, false); /* Set the T SID address from A2 */
39733
39734
655
    src_sid = proto_tree_add_subtree(hdr_tree, tvb, offset, 2, ett_pv1_sid,
39735
655
                                      NULL, "Transmitter SID");
39736
655
    dissect_pv1_sid(src_sid, pinfo, tvb, offset);
39737
655
    offset += 2;
39738
814
  } else {
39739
814
    set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
39740
814
    proto_tree_add_mac48_detail(&mac_ta, NULL, ett_addr, tvb, hdr_tree, offset);
39741
814
    offset += 6;
39742
814
  }
39743
39744
  /* Now, add the sequence control field if present */
39745
1.46k
  switch (type) {
39746
32
  case PV1_QOS_DATA_1MAC:
39747
46
  case PV1_QOS_DATA_2MAC:
39748
46
    dissect_pv1_sequence_control(hdr_tree, pinfo, tvb, offset);
39749
46
    offset += 2;
39750
46
    break;
39751
1.30k
  case PV1_MANAGEMENT:
39752
1.30k
    if (subtype != PV1_MANAGEMENT_PROBE_RESPONSE) {
39753
1.30k
      dissect_pv1_sequence_control(hdr_tree, pinfo, tvb, offset);
39754
1.30k
      offset += 2;
39755
1.30k
    }
39756
1.30k
    break;
39757
1.46k
  }
39758
  /* Now, add A3 and A4 if present */
39759
1.43k
  if (a3_present) {
39760
466
    set_dst_addr_cols(pinfo, tvb, offset, wlan_address_type);
39761
466
    proto_tree_add_mac48_detail(&mac_da, &mac_addr, ett_addr, tvb, hdr_tree, offset);
39762
466
    offset += 6;
39763
466
  }
39764
39765
1.43k
  if (a4_present) {
39766
370
    set_src_addr_cols(pinfo, tvb, offset, wlan_address_type);
39767
370
    proto_tree_add_mac48_detail(&mac_sa, &mac_addr, ett_addr, tvb, hdr_tree, offset);
39768
370
    offset += 6;
39769
370
  }
39770
39771
  /* TODO: Properly handle the FCS len */
39772
1.43k
  if (phdr->fcs_len == 4)
39773
42
    len_no_fcs -= 4;
39774
39775
  /* Now, handle the body */
39776
1.43k
  switch (type) {
39777
24
  case PV1_QOS_DATA_1MAC:
39778
37
  case PV1_QOS_DATA_2MAC:
39779
37
    offset = dissect_pv1_data(tvb, pinfo, tree, offset, a_msdu, phdr, len_no_fcs);
39780
37
    break;
39781
1.30k
  case PV1_MANAGEMENT:
39782
1.30k
    ti = proto_tree_add_item(tree, hf_ieee80211_mgt, tvb, 0, -1, ENC_NA);
39783
1.30k
    mgt_tree = proto_item_add_subtree(ti, ett_80211_mgt);
39784
1.30k
    offset = dissect_pv1_management(tvb, pinfo, mgt_tree, offset, phdr, subtype, len_no_fcs, fcf);
39785
1.30k
    break;
39786
35
  case PV1_CONTROL:
39787
35
    offset = dissect_pv1_control(tvb, pinfo, fc_tree, offset, phdr, subtype, len_no_fcs, fcf);
39788
35
    break;
39789
41
  default:
39790
    /* Invalid so far. Insert as data and add an Expert Info */
39791
41
    break;
39792
1.43k
  }
39793
39794
  /* Now, handle the FCS, if present */
39795
557
  if (phdr->fcs_len == 4) {
39796
31
    proto_tree_add_checksum(hdr_tree, tvb, len - 4, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
39797
31
  }
39798
39799
557
  return offset;
39800
1.43k
}
39801
39802
static int
39803
dissect_ieee80211_pv0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
39804
                      uint32_t option_flags, wlan_hdr_t *whdr,
39805
                      struct ieee_802_11_phdr *phdr)
39806
5.89k
{
39807
5.89k
  uint16_t         fcf, flags, frame_type_subtype, ctrl_fcf, ctrl_type_subtype;
39808
5.89k
  uint16_t         cw_fcf;
39809
5.89k
  uint16_t         seq_control;
39810
5.89k
  uint32_t         seq_number, frag_number;
39811
5.89k
  bool             more_frags;
39812
5.89k
  proto_item      *ti          = NULL;
39813
5.89k
  proto_item      *cw_item     = NULL;
39814
5.89k
  proto_tree      *flags_item;
39815
5.89k
  proto_item      *hidden_item;
39816
5.89k
  proto_tree      *cw_tree     = NULL;
39817
5.89k
  uint16_t         hdr_len, ohdr_len;
39818
5.89k
  uint16_t         htc_len     = 0;
39819
5.89k
  bool             has_fcs;
39820
5.89k
  int              len, reported_len, ivlen;
39821
5.89k
  int              sta_addr_offset = 0;
39822
5.89k
  bool             is_amsdu    = 0;
39823
5.89k
  bool             save_fragmented;
39824
5.89k
  uint32_t         addr_type;
39825
5.89k
  uint8_t          octet1, octet2;
39826
5.89k
  uint16_t         etype;
39827
5.89k
  char             out_buff[SHORT_STR];
39828
5.89k
  int              is_iv_bad;
39829
5.89k
  unsigned char    iv_buff[4];
39830
5.89k
  int              addr1_type = wlan_ra_ta_address_type;
39831
5.89k
  unsigned         offset = 0;
39832
5.89k
  const char      *fts_str;
39833
5.89k
  char             flag_str[]  = "opmPRMFTC";
39834
5.89k
  int              ii;
39835
5.89k
  uint16_t         qosoff      = 0;
39836
5.89k
  uint16_t         qos_control = 0;
39837
5.89k
  int              meshctl_len = 0;
39838
5.89k
  uint8_t          mesh_flags;
39839
5.89k
  uint16_t         meshoff     = 0;
39840
5.89k
  bool             retransmitted;
39841
5.89k
  bool             isDMG = (phdr->phy == PHDR_802_11_PHY_11AD);
39842
39843
5.89k
  encap_t     encap_type;
39844
5.89k
  proto_tree *hdr_tree = NULL;
39845
5.89k
  tvbuff_t   *next_tvb = NULL;
39846
39847
5.89k
#define PROTECTION_ALG_WEP  DOT11DECRYPT_KEY_TYPE_WEP
39848
5.89k
#define PROTECTION_ALG_TKIP  DOT11DECRYPT_KEY_TYPE_TKIP
39849
5.89k
#define PROTECTION_ALG_CCMP  DOT11DECRYPT_KEY_TYPE_CCMP
39850
5.89k
#define PROTECTION_ALG_CCMP_256  DOT11DECRYPT_KEY_TYPE_CCMP_256
39851
5.89k
#define PROTECTION_ALG_GCMP  DOT11DECRYPT_KEY_TYPE_GCMP
39852
5.89k
#define PROTECTION_ALG_GCMP_256  DOT11DECRYPT_KEY_TYPE_GCMP_256
39853
5.89k
#define PROTECTION_ALG_RSNA  PROTECTION_ALG_CCMP | PROTECTION_ALG_TKIP
39854
5.89k
#define IS_TKIP(tvb, hdr_len)  (tvb_get_uint8(tvb, hdr_len + 1) == \
39855
82
  ((tvb_get_uint8(tvb, hdr_len) | 0x20) & 0x7f))
39856
5.89k
#define IS_CCMP(tvb, hdr_len)  (tvb_get_uint8(tvb, hdr_len + 2) == 0)
39857
5.89k
  uint8_t algorithm=UINT8_MAX;
39858
5.89k
  uint32_t sec_trailer=0;
39859
39860
5.89k
  fcf = FETCH_FCF(0);
39861
39862
5.89k
  frame_type_subtype = COMPOSE_FRAME_TYPE(fcf);
39863
5.89k
  whdr->type = frame_type_subtype;
39864
5.89k
  if (frame_type_subtype == CTRL_CONTROL_WRAPPER)
39865
40
    ctrl_fcf = FETCH_FCF(10);
39866
5.85k
  else
39867
5.85k
    ctrl_fcf = 0;
39868
39869
5.89k
  fts_str = val_to_str_ext_const(frame_type_subtype, &frame_type_subtype_vals_ext,
39870
5.89k
                                 "Unrecognized (Reserved frame)");
39871
5.89k
  col_set_str(pinfo->cinfo, COL_INFO, fts_str);
39872
39873
39874
7.06k
# define FROM_TO_DS 3
39875
5.89k
  flags = FCF_FLAGS(fcf);
39876
5.89k
  more_frags = HAVE_FRAGMENTS(flags);
39877
39878
53.0k
  for (ii = 0; ii < 8; ii++) {
39879
47.1k
    if (! (flags & 0x80 >> ii)) {
39880
34.9k
      flag_str[ii] = '.';
39881
34.9k
    }
39882
47.1k
  }
39883
39884
5.89k
  switch (FCF_FRAME_TYPE (fcf)) {
39885
39886
3.21k
  case MGT_FRAME:
39887
3.21k
    hdr_len = MGT_FRAME_HDR_LEN;
39888
39889
    /*
39890
     * IEEE 802.11-2016 section 9.2.4.1.10 "+HTC/Order subfield" says:
39891
     *
39892
     *  The +HTC/Order subfield is 1 bit in length. It is used for two
39893
     *  purposes:
39894
     *
39895
     *    -- It is set to 1 in a non-QoS Data frame transmitted by a
39896
     *       non-QoS STA to indicate that the frame contains an MSDU,
39897
     *       or fragment thereof, that is being transferred using the
39898
     *       StrictlyOrdered service class.
39899
     *
39900
     *    -- It is set to 1 in a QoS Data or Management frame transmitted
39901
     *       with a value of HT_GF, HT_MF, or VHT for the FORMAT parameter
39902
     *       of the TXVECTOR to indicate that the frame contains an
39903
     *       HT Control field.
39904
     *
39905
     *  Otherwise, the +HTC/Order subfield is set to 0.
39906
     *
39907
     *  NOTE -- The +HTC/Order subfield is always set to 0 for frames
39908
     *  transmitted by a DMG STA.
39909
     *
39910
     * and 802.11ax drafts appear to say that the +HTC/Order flag, for
39911
     * QoS frames, also indicates that there's an HT Control field.
39912
     */
39913
3.21k
    if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
39914
      /*
39915
       * For the DMG PHY, do *not* treat the +HTC field as an indication
39916
       * that there's an HT Control field, because, in the ns-3 capture
39917
       * in issue 11277, it's set in packets with a channel frequency
39918
       * in the 60 GHz band, meaning DMG (802.11ad), but it's not
39919
       * supposed to be set, and those packets lack an HT Control
39920
       * field, so they would be dissected incorrectly if we treated
39921
       * them as if they had an HT Control field.
39922
       */
39923
482
      if (!isDMG) {
39924
        /*
39925
         * Non-DMG PHY; treat this field as hving an HT Control field.
39926
         *
39927
         * XXX - as I read the above, this shouldn't be set except for
39928
         * HT, VHT, or HE PHYs; however, in the capture in issue 11351,
39929
         * a frame with an HT Control field, with a radiotap header,
39930
         * has no MCS, VHT, or HE field in that header, so Wireshark
39931
         * has no clue that it's an HT, VHT, or HE field. assumed that
39932
         * this meant that it wouldn't have an HT Control field even
39933
         * if it's a QoS field with +HTC/Order set, and misdissected
39934
         * it.  Omnipeek, which also appeared to have no clue that it
39935
         * was an HT or VHT field - it called it an 802.11b frame - *did*
39936
         * dissect the HT Control field.  Therefore, we must not require
39937
         * an indication that a QoS frame is an HT, VHT, or HE frame
39938
         * in order to dissect it a having an HT Control field.
39939
         */
39940
478
        hdr_len += 4;
39941
478
        htc_len = 4;
39942
478
      }
39943
482
    }
39944
3.21k
    break;
39945
39946
1.23k
  case CONTROL_FRAME:
39947
1.23k
    if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
39948
39
      hdr_len = 6;
39949
39
      cw_fcf = ctrl_fcf;
39950
1.19k
    } else {
39951
1.19k
      hdr_len = 0;
39952
1.19k
      cw_fcf = fcf;
39953
1.19k
    }
39954
1.23k
    switch (COMPOSE_FRAME_TYPE (cw_fcf)) {
39955
39956
821
    case CTRL_TRIGGER:
39957
      /*
39958
       * This is a variable length frame ... we set the real length below
39959
       * and since the common info is variable, just set the hdr len to
39960
       * the fixed portion, 16. There can also be one or more user-info
39961
       * sections, followed by padding.
39962
       */
39963
821
      hdr_len = 16;
39964
821
      break;
39965
39966
7
    case CTRL_TACK:
39967
      /*
39968
       * This also is a variable length frame. Set to 22, the common portion
39969
       */
39970
7
      hdr_len = 22;
39971
7
      break;
39972
39973
14
    case CTRL_BEAMFORM_RPT_POLL:
39974
14
      hdr_len += 17;
39975
14
      break;
39976
39977
198
    case CTRL_VHT_NDP_ANNC:
39978
198
      hdr_len += 17;
39979
      /* TODO: for now we only consider a single STA, add support for more */
39980
198
      hdr_len += 2;
39981
198
      break;
39982
39983
3
    case CTRL_CTS:
39984
6
    case CTRL_ACKNOWLEDGEMENT:
39985
6
      hdr_len += 10;
39986
6
      break;
39987
39988
3
    case CTRL_POLL:
39989
3
      hdr_len += 18;
39990
3
      break;
39991
39992
4
    case CTRL_SPR:
39993
9
    case CTRL_GRANT:
39994
11
    case CTRL_GRANT_ACK:
39995
11
      hdr_len += 23;
39996
11
      break;
39997
39998
2
    case CTRL_DMG_CTS:
39999
2
      hdr_len += 16;
40000
2
      break;
40001
40002
1
    case CTRL_DMG_DTS:
40003
5
    case CTRL_SSW:
40004
5
      hdr_len += 22;
40005
5
      break;
40006
40007
2
    case CTRL_SSW_FEEDBACK:
40008
5
    case CTRL_SSW_ACK:
40009
5
      hdr_len += 24;
40010
5
      break;
40011
40012
13
    case CTRL_RTS:
40013
18
    case CTRL_PS_POLL:
40014
32
    case CTRL_CFP_END:
40015
51
    case CTRL_CFP_ENDACK:
40016
76
    case CTRL_BLOCK_ACK_REQ:
40017
142
    case CTRL_BLOCK_ACK:
40018
142
      hdr_len += 16;
40019
142
      break;
40020
40021
20
    default:
40022
20
      hdr_len += 4;  /* XXX */
40023
20
      break;
40024
1.23k
    }
40025
1.23k
    break;
40026
40027
1.23k
  case DATA_FRAME:
40028
592
    hdr_len = (FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) ? DATA_LONG_HDR_LEN : DATA_SHORT_HDR_LEN;
40029
40030
592
    if (option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) {
40031
      /*
40032
       * IEEE 802.11-2016 section 9.2.4.1.10 "+HTC/Order subfield" says:
40033
       *
40034
       *  The +HTC/Order subfield is 1 bit in length. It is used for two
40035
       *  purposes:
40036
       *
40037
       *    -- It is set to 1 in a non-QoS Data frame transmitted by a
40038
       *       non-QoS STA to indicate that the frame contains an MSDU,
40039
       *       or fragment thereof, that is being transferred using the
40040
       *       StrictlyOrdered service class.
40041
       *
40042
       *    -- It is set to 1 in a QoS Data or Management frame transmitted
40043
       *       with a value of HT_GF, HT_MF, or VHT for the FORMAT parameter
40044
       *       of the TXVECTOR to indicate that the frame contains an
40045
       *       HT Control field.
40046
       *
40047
       *  Otherwise, the +HTC/Order subfield is set to 0.
40048
       *
40049
       *  NOTE -- The +HTC/Order subfield is always set to 0 for frames
40050
       *  transmitted by a DMG STA.
40051
       *
40052
       * and 802.11ax drafts appear to say that the +HTC/Order flag, for
40053
       * QoS frames, also indicates that there's an HT Control field.
40054
       */
40055
592
      if (DATA_FRAME_IS_QOS(frame_type_subtype)) {
40056
        /* QoS frame */
40057
411
        qosoff = hdr_len;
40058
411
        qos_control = tvb_get_letohs(tvb, qosoff);
40059
411
        hdr_len += 2; /* Include the QoS field in the header length */
40060
40061
411
        if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
40062
          /*
40063
           * For the DMG PHY, do *not* treat the +HTC field as an indication
40064
           * that there's an HT Control field, because, in the ns-3 capture
40065
           * in issue 11277, it's set in packets with a channel frequency
40066
           * in the 60 GHz band, meaning DMG (802.11ad), but it's not
40067
           * supposed to be set, and those packets lack an HT Control
40068
           * field, so they would be dissected incorrectly if we treated
40069
           * them as if they had an HT Control field.
40070
           */
40071
267
          if (!isDMG) {
40072
            /*
40073
             * Non-DMG PHY; treat this field as hving an HT Control field.
40074
             *
40075
             * XXX - as I read the above, this shouldn't be set except for
40076
             * HT, VHT, or HE PHYs; however, in the capture in issue 11351,
40077
             * a frame with an HT Control field, with a radiotap header,
40078
             * has no MCS, VHT, or HE field in that header, so Wireshark
40079
             * has no clue that it's an HT, VHT, or HE field. assumed that
40080
             * this meant that it wouldn't have an HT Control field even
40081
             * if it's a QoS field with +HTC/Order set, and misdissected
40082
             * it.  Omnipeek, which also appeared to have no clue that it
40083
             * was an HT or VHT field - it called it an 802.11b frame - *did*
40084
             * dissect the HT Control field.  Therefore, we must not require
40085
             * an indication that a QoS frame is an HT, VHT, or HE frame
40086
             * in order to dissect it a having an HT Control field.
40087
             */
40088
266
            hdr_len += 4;
40089
266
            htc_len = 4;
40090
266
          }
40091
267
        }
40092
411
      }
40093
592
    }
40094
592
    break;
40095
40096
846
  case EXTENSION_FRAME:
40097
846
    hdr_len = 10;
40098
846
    break;
40099
40100
0
  default:
40101
0
    hdr_len = 4;  /* XXX */
40102
0
    break;
40103
5.89k
  }
40104
40105
  /*
40106
   * Some portions of this code calculate offsets relative to the end of the
40107
   * header.  But when the header has been padded to align the data this must
40108
   * be done relative to true header size, not the padded/aligned value.  To
40109
   * simplify this work we stash the original header size in ohdr_len instead
40110
   * of recalculating it every time we need it.
40111
   */
40112
5.87k
  ohdr_len = hdr_len;
40113
5.87k
  if (phdr->datapad) {
40114
    /*
40115
     * Add in Atheros padding between the 802.11 header and body.
40116
     *
40117
     * In the Atheros mesh capture sample we have, the padding
40118
     * is before the mesh header, possibly because it doesn't
40119
     * recognize the mesh header.
40120
     */
40121
98
    hdr_len = WS_ROUNDUP_4(hdr_len);
40122
98
  }
40123
40124
5.87k
  if (FCF_FRAME_TYPE (fcf) == DATA_FRAME) {
40125
    /*
40126
     * Does it look as if we have a mesh header?
40127
     *
40128
     * For locally originated mesh frames, the QoS header may be added
40129
     * by the hardware, and no present in wireshark captures.  This
40130
     * poses a problem as the QoS header indicates the presence of the
40131
     * mesh control header.
40132
     *
40133
     * In addition, we have examples of mesh captures where the QoS
40134
     * field indicates that there is no mesh control header, yet there
40135
     * is one.
40136
     *
40137
     * Instead of QoS, we use a few heuristics to determine the presence
40138
     * of the mesh control header, which is tricky because it can have a
40139
     * variable length. We fall back to using the QoS field if it exists
40140
     * and the packet isn't long enough (due to truncation or something
40141
     * malformed that should be flagged.)
40142
     *
40143
     * Assume minimal length, and then correct if wrong.
40144
     */
40145
574
    if (tvb_bytes_exist(tvb, hdr_len, 1)) {
40146
512
      meshoff = hdr_len;
40147
512
      mesh_flags = tvb_get_uint8(tvb, meshoff);
40148
512
      meshctl_len = find_mesh_control_length(mesh_flags);
40149
      /* ... and try to read two bytes of next header */
40150
512
      if (tvb_bytes_exist(tvb, hdr_len, meshctl_len + 2)) {
40151
341
        uint16_t next_header = tvb_get_letohs(tvb, meshoff + meshctl_len);
40152
341
        if (!has_mesh_control_local(fcf, mesh_flags, next_header)) {
40153
341
          meshctl_len = 0;
40154
341
        }
40155
341
      } else {
40156
171
        if (DATA_FRAME_IS_QOS(frame_type_subtype)) {
40157
          /* QoS frame */
40158
          /*
40159
           * Look at the Mesh Control subfield of the QoS field and at the
40160
           * purported mesh flag fields.
40161
           */
40162
133
          if (!has_mesh_control(fcf, qos_control, mesh_flags)) {
40163
125
            meshctl_len = 0;
40164
125
          }
40165
133
        } else {
40166
          /* Not QoS frame, can't do the other heuristic, so assume no mesh */
40167
38
          meshctl_len = 0;
40168
38
        }
40169
171
      }
40170
512
    }
40171
574
    hdr_len += meshctl_len;
40172
574
  }
40173
40174
  /* Create the protocol tree */
40175
5.87k
  ti = proto_tree_add_protocol_format(tree, proto_wlan, tvb, 0, hdr_len,
40176
5.87k
                                      "IEEE 802.11 %s", fts_str);
40177
5.87k
  hdr_tree = proto_item_add_subtree(ti, ett_80211);
40178
40179
  /* Add the FC and duration/id to the current tree */
40180
5.87k
  dissect_frame_control(hdr_tree, tvb, option_flags, 0, pinfo, isDMG);
40181
5.87k
  dissect_durid(hdr_tree, tvb, frame_type_subtype, 2);
40182
40183
5.87k
  switch (phdr->fcs_len)
40184
5.87k
    {
40185
5.43k
      case 0: /* Definitely has no FCS */
40186
5.43k
        has_fcs = false;
40187
5.43k
        break;
40188
40189
357
      case 4: /* Definitely has an FCS */
40190
357
        has_fcs = true;
40191
357
        break;
40192
40193
0
      case -2: /* Data frames have no FCS, other frames may have an FCS */
40194
               /* XXX: -2 currently used only in wiretap/netmon.c       */
40195
0
        if (FCF_FRAME_TYPE (fcf) == DATA_FRAME)
40196
0
          has_fcs = false;
40197
0
        else /* Management, Control, Extension */
40198
0
          has_fcs = wlan_check_fcs;
40199
0
        break;
40200
40201
60
      default: /* Don't know - use "wlan_check_fcs" */
40202
60
        has_fcs = wlan_check_fcs;
40203
60
        break;
40204
5.87k
    }
40205
40206
  /*
40207
   * Decode the part of the frame header that isn't the same for all
40208
   * frame types.
40209
   */
40210
5.84k
  seq_control = 0;
40211
5.84k
  frag_number = 0;
40212
5.84k
  seq_number = 0;
40213
40214
  /* all frames have address 1 = RA */
40215
5.84k
  proto_tree_add_mac48_detail(&mac_ra, &mac_addr, ett_addr, tvb, hdr_tree, 4);
40216
40217
5.84k
  switch (FCF_FRAME_TYPE (fcf))
40218
5.84k
  {
40219
40220
3.18k
    case MGT_FRAME:
40221
      /*
40222
       * All management frame types have the same header.
40223
       */
40224
3.18k
      set_dst_addr_cols(pinfo, tvb, 4, wlan_address_type);
40225
3.18k
      set_src_addr_cols(pinfo, tvb, 10, wlan_address_type);
40226
40227
      /* for tap */
40228
3.18k
      set_address_tvb(&whdr->bssid, wlan_bssid_address_type, 6, tvb, 16);
40229
3.18k
      copy_address_shallow(&whdr->src, &pinfo->dl_src);
40230
3.18k
      copy_address_shallow(&whdr->dst, &pinfo->dl_dst);
40231
3.18k
      if (addresses_data_equal(&whdr->bssid, &whdr->src)) {
40232
471
        p_add_proto_data(pinfo->pool, pinfo, proto_wlan, IS_AP_KEY, GINT_TO_POINTER(true));
40233
471
      }
40234
40235
3.18k
      seq_control = tvb_get_letohs(tvb, 22);
40236
3.18k
      frag_number = SEQCTL_FRAGMENT_NUMBER(seq_control);
40237
3.18k
      seq_number = SEQCTL_SEQUENCE_NUMBER(seq_control);
40238
40239
3.18k
      col_append_fstr(pinfo->cinfo, COL_INFO,
40240
3.18k
            ", SN=%d", seq_number);
40241
40242
3.18k
      col_append_fstr(pinfo->cinfo, COL_INFO,
40243
3.18k
            ", FN=%d", frag_number);
40244
40245
3.18k
      if (tree)
40246
3.13k
      {
40247
3.13k
        proto_tree_add_mac48_detail(&mac_da, NULL, ett_addr, tvb, hdr_tree, 4);
40248
3.13k
        proto_tree_add_mac48_detail(&mac_ta, NULL, ett_addr, tvb, hdr_tree, 10);
40249
3.13k
        proto_tree_add_mac48_detail(&mac_sa, NULL, ett_addr, tvb, hdr_tree, 10);
40250
3.13k
        check_s1g_setting(pinfo, tvb, 10);
40251
3.13k
        proto_tree_add_mac48_detail(&mac_bssid, NULL, ett_addr, tvb, hdr_tree, 16);
40252
40253
        /* FIXME: With mgmt frames FROM_TO_DS is always 0, perhaps compare address to bssid instead? */
40254
3.13k
        if ((flags & FROM_TO_DS) == FLAG_FROM_DS) { /* Receiver address */
40255
285
          sta_addr_offset = 4;
40256
2.84k
        } else if ((flags & FROM_TO_DS) == FLAG_TO_DS) { /* Transmitter address */
40257
345
          sta_addr_offset = 10;
40258
345
        }
40259
3.13k
        if (sta_addr_offset > 0) {
40260
630
          proto_tree_add_mac48_detail(&mac_staa, NULL, ett_addr, tvb, hdr_tree, sta_addr_offset);
40261
630
        }
40262
        /* add items for wlan.addr filter */
40263
3.13k
        hidden_item = proto_tree_add_mac48_detail(&mac_addr_hidden, NULL, -1, tvb, hdr_tree, 10);
40264
3.13k
        proto_item_set_hidden(hidden_item);
40265
3.13k
        hidden_item = proto_tree_add_mac48_detail(&mac_addr_hidden, NULL, -1, tvb, hdr_tree, 16);
40266
3.13k
        proto_item_set_hidden(hidden_item);
40267
3.13k
        proto_tree_add_item(hdr_tree, hf_ieee80211_frag_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
40268
3.13k
        proto_tree_add_item(hdr_tree, hf_ieee80211_seq_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
40269
3.13k
      }
40270
3.18k
      break;
40271
40272
1.21k
    case CONTROL_FRAME:
40273
1.21k
    {
40274
      /*
40275
       * Control Wrapper frames insert themselves between address 1
40276
       * and address 2 in a normal control frame.  Process address 1
40277
       * first, then handle the rest of the frame in dissect_control.
40278
       */
40279
1.21k
      if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
40280
39
        offset = 10; /* FC + D/ID + Address 1 + CFC + HTC */
40281
39
        ctrl_fcf = FETCH_FCF(10);
40282
39
        ctrl_type_subtype = COMPOSE_FRAME_TYPE(ctrl_fcf);
40283
1.17k
      } else {
40284
1.17k
        offset = 10; /* FC + D/ID + Address 1 */
40285
1.17k
        ctrl_type_subtype = frame_type_subtype;
40286
1.17k
      }
40287
      /* Added to disallow DMG STA to transfer packets of certain forbidden types. */
40288
1.21k
      switch (ctrl_type_subtype)
40289
1.21k
      {
40290
5
        case CTRL_PS_POLL:
40291
8
        case CTRL_CTS:
40292
27
        case CTRL_CFP_ENDACK:
40293
27
        if(isDMG == true) {
40294
1
          expert_add_info_format(pinfo, hdr_tree, &ei_ieee80211_dmg_subtype,
40295
1
              "DMG STA shouldn't transmit control frame of type contention-free period end+ack");
40296
1
        }
40297
27
        break;
40298
1.18k
        default:
40299
1.18k
          break;
40300
1.21k
      }
40301
40302
1.21k
      if (ctrl_type_subtype == CTRL_PS_POLL) {
40303
5
        addr1_type = wlan_bssid_address_type;
40304
5
        proto_tree_add_mac48_detail(&mac_bssid, NULL, ett_addr, tvb, hdr_tree, 4);
40305
5
      }
40306
40307
      /* Add address 1 */
40308
1.21k
      set_dst_addr_cols(pinfo, tvb, 4, addr1_type);
40309
40310
      /*
40311
       * Start shoving in other fields if needed.
40312
       */
40313
1.21k
      if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
40314
        /* if (tree) */
40315
39
        {
40316
39
          cw_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2,
40317
39
                      ett_cntrl_wrapper_fc, NULL, "Contained Frame Control");
40318
39
          dissect_frame_control(cw_tree, tvb, 0, offset, pinfo, isDMG);
40319
39
          dissect_ht_control(pinfo, hdr_tree, tvb, offset + 2);
40320
39
          offset += 6;
40321
39
          hdr_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2,
40322
39
                      ett_cntrl_wrapper_fc, &cw_item, "Carried Frame");
40323
39
          if (isDMG) {
40324
0
            expert_add_info_format(pinfo, cw_item, &ei_ieee80211_dmg_subtype,
40325
0
                                   "DMG STA shouldn't transmit Control Wrapper frame");
40326
0
          }
40327
39
        }
40328
39
      }
40329
40330
1.21k
      switch (ctrl_type_subtype)
40331
1.21k
      {
40332
5
        case CTRL_PS_POLL:
40333
24
        case CTRL_CFP_ENDACK:
40334
24
        {
40335
24
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40336
24
          proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, hdr_tree, offset);
40337
24
          offset += 6;
40338
24
          break;
40339
5
        }
40340
40341
12
        case CTRL_CFP_END:
40342
12
        {
40343
12
          if (isDMG)
40344
1
            set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40345
11
          else
40346
11
            set_src_addr_cols(pinfo, tvb, offset, wlan_bssid_address_type);
40347
          /* if (tree) */
40348
12
          {
40349
12
            if (isDMG) {
40350
1
              proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, hdr_tree, offset);
40351
11
            } else {
40352
11
              proto_tree_add_mac48_detail(&mac_bssid, &mac_addr, ett_addr, tvb, hdr_tree, offset);
40353
11
            }
40354
12
            offset += 6;
40355
12
          }
40356
12
          break;
40357
5
        }
40358
40359
815
        case CTRL_TRIGGER:
40360
815
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40361
          /*
40362
           * The len returned will be adjusted to include any padding required
40363
           */
40364
815
          hdr_len = dissect_ieee80211_he_eht_trigger(tvb, pinfo, hdr_tree, offset,
40365
815
                                                     phdr->fcs_len);
40366
815
          ohdr_len = hdr_len;
40367
815
          break;
40368
40369
6
        case CTRL_TACK:
40370
6
         set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40371
6
         hdr_len = dissect_ieee80211_s1g_tack(tvb, pinfo, hdr_tree, offset,
40372
6
                                        flags);
40373
6
         break;
40374
40375
13
        case CTRL_BEAMFORM_RPT_POLL:
40376
13
        {
40377
13
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40378
13
          proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, hdr_tree, offset);
40379
13
          offset += 6;
40380
13
          proto_tree_add_item(hdr_tree, hf_ieee80211_beamform_feedback_seg_retrans_bitmap, tvb, offset, 1, ENC_NA);
40381
13
          break;
40382
5
        }
40383
40384
196
        case CTRL_VHT_NDP_ANNC:
40385
196
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40386
40387
196
          dissect_ieee80211_ndp_annc(tvb, pinfo, hdr_tree, offset, has_fcs);
40388
196
          break;
40389
40390
1
        case CTRL_GRANT_ACK:
40391
5
        case CTRL_SSW:
40392
7
        case CTRL_SSW_FEEDBACK:
40393
9
        case CTRL_SSW_ACK:
40394
11
        case CTRL_DMG_CTS:
40395
16
        case CTRL_GRANT:
40396
20
        case CTRL_SPR:
40397
22
        case CTRL_POLL:
40398
33
        case CTRL_RTS:
40399
33
        {
40400
33
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40401
33
          proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, hdr_tree, offset);
40402
33
          offset += 6;
40403
33
          break;
40404
22
        }
40405
40406
0
        case CTRL_CONTROL_WRAPPER:
40407
          /* XXX - We shouldn't see this.  Should we throw an error? */
40408
0
          break;
40409
40410
24
        case CTRL_BLOCK_ACK_REQ:
40411
24
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40412
40413
24
          dissect_ieee80211_block_ack(tvb, pinfo, hdr_tree, offset, isDMG, true, has_fcs);
40414
24
          break;
40415
40416
64
        case CTRL_BLOCK_ACK:
40417
64
          set_src_addr_cols(pinfo, tvb, offset, wlan_ra_ta_address_type);
40418
40419
64
          dissect_ieee80211_block_ack(tvb, pinfo, hdr_tree, offset, isDMG, false, has_fcs);
40420
64
          break;
40421
1.21k
      }
40422
/*
40423
 * 802.11ad : Used for extension types.
40424
 */
40425
868
      switch (ctrl_type_subtype) {
40426
2
        case CTRL_POLL: {
40427
2
                proto_tree_add_item(hdr_tree, hf_ieee80211_cf_response_offset,
40428
2
                      tvb, offset, 2, ENC_LITTLE_ENDIAN);
40429
40430
2
                break;
40431
0
        }
40432
5
        case CTRL_GRANT:
40433
6
        case CTRL_GRANT_ACK:
40434
10
        case CTRL_SPR: {
40435
10
          bool isGrant;
40436
10
          if(ctrl_type_subtype != CTRL_GRANT_ACK) {
40437
9
            offset += add_ff_dynamic_allocation(hdr_tree, tvb, pinfo, offset);
40438
9
          } else { /* CTRL_GRANT_ACK have 5 octets that are reserved*/
40439
1
            proto_tree_add_item(hdr_tree, hf_ieee80211_grant_ack_reserved, tvb, offset, 5, ENC_NA);
40440
1
            offset += 5;
40441
1
          }
40442
10
          isGrant = ((ctrl_type_subtype==CTRL_GRANT)||(ctrl_type_subtype==CTRL_GRANT_ACK));
40443
10
          add_ff_beamforming_ctrl(hdr_tree, tvb, pinfo, offset, isGrant);
40444
          /* offset += 2; */
40445
10
          break;
40446
6
        }
40447
4
        case CTRL_SSW: {
40448
4
          uint32_t sector_sweep;
40449
40450
4
          sector_sweep = tvb_get_letoh24(tvb, offset);
40451
4
          offset += add_ff_sector_sweep(hdr_tree, tvb, pinfo, offset);
40452
          /* if Sector Sweep Direction = Responder, use SW Feedback field format when not transmitted as part of an ISS */
40453
4
          if(sector_sweep & 0x00001) {
40454
2
            add_ff_sector_sweep_feedback_to_iss(hdr_tree, tvb, pinfo, offset);
40455
2
          } else {
40456
2
            add_ff_sector_sweep_feedback_from_iss(hdr_tree, tvb, pinfo, offset);
40457
2
          }
40458
          /* offset += 3; */
40459
4
          break;
40460
6
        }
40461
2
        case CTRL_SSW_ACK:
40462
4
        case CTRL_SSW_FEEDBACK: {
40463
4
          offset += add_ff_sector_sweep_feedback_to_iss(hdr_tree, tvb, pinfo, offset);
40464
4
          offset += add_ff_BRP_request(hdr_tree, tvb, pinfo, offset);
40465
4
          add_ff_beamformed_link(hdr_tree, tvb, pinfo, offset);
40466
          /* offset += 1; */
40467
4
          break;
40468
2
        }
40469
1
        case CTRL_DMG_DTS: {
40470
1
          proto_tree_add_item(hdr_tree, hf_ieee80211_addr_nav_sa, tvb, offset, 6, ENC_NA);
40471
1
          offset += 6;
40472
1
          proto_tree_add_item(hdr_tree, hf_ieee80211_addr_nav_da, tvb, offset, 6, ENC_NA);
40473
          /* offset += 6; */
40474
1
          break;
40475
2
        }
40476
847
        default:
40477
847
                break;
40478
868
      }
40479
862
      break;
40480
868
    }
40481
40482
862
    case DATA_FRAME:
40483
566
    {
40484
566
      uint32_t src_offset, dst_offset, da_offset, sa_offset, ta_offset = 10, bssid_offset;
40485
566
      addr_type = FCF_ADDR_SELECTOR(fcf);
40486
566
      if ((option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) && DATA_FRAME_IS_QOS(frame_type_subtype)) {
40487
393
        if (!phdr->no_a_msdus && !DATA_FRAME_IS_NULL(frame_type_subtype)) {
40488
336
          is_amsdu = QOS_AMSDU_PRESENT(qos_control);
40489
336
        }
40490
393
      }
40491
40492
      /* In order to show src/dst address we must always do the following */
40493
566
      switch (addr_type)
40494
566
      {
40495
40496
241
        case DATA_ADDR_T1:
40497
241
          da_offset = 4;
40498
241
          sa_offset = 10;
40499
241
          bssid_offset = 16;
40500
241
          dst_offset = da_offset;
40501
241
          src_offset = sa_offset;
40502
241
          break;
40503
40504
48
        case DATA_ADDR_T2:
40505
48
          da_offset = 4;
40506
48
          sa_offset = !is_amsdu ? 16 : 0;
40507
48
          bssid_offset = 10;
40508
48
          dst_offset = da_offset;
40509
48
          src_offset = sa_offset;
40510
48
          break;
40511
40512
107
        case DATA_ADDR_T3:
40513
107
          da_offset = !is_amsdu ? 16 : 0;
40514
107
          sa_offset = 10;
40515
107
          bssid_offset = 4;
40516
107
          dst_offset = da_offset;
40517
107
          src_offset = sa_offset;
40518
107
          break;
40519
40520
170
        case DATA_ADDR_T4:
40521
170
          if (!is_amsdu) {
40522
121
            da_offset = 16;
40523
121
            sa_offset = 24;
40524
121
            bssid_offset = 0;
40525
121
            dst_offset = da_offset;
40526
121
            src_offset = sa_offset;
40527
121
          } else {
40528
49
            da_offset = 0;
40529
49
            sa_offset = 0;
40530
            // The second BSSID (Addr4) is handled below.
40531
49
            bssid_offset = 16;
40532
49
            dst_offset = 4;     // RA
40533
49
            src_offset = 10;    // TA
40534
49
          }
40535
170
          break;
40536
40537
0
        default:
40538
          /* All four cases are covered above. */
40539
0
          DISSECTOR_ASSERT_NOT_REACHED();
40540
566
      }
40541
40542
566
      if (src_offset) {
40543
554
        set_address_tvb(&pinfo->dl_src, wlan_address_type, 6, tvb, src_offset);
40544
554
        copy_address_shallow(&pinfo->src, &pinfo->dl_src);
40545
554
      }
40546
566
      if (dst_offset) {
40547
548
        set_address_tvb(&pinfo->dl_dst, wlan_address_type, 6, tvb, dst_offset);
40548
548
        copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
40549
548
      }
40550
40551
566
      if (bssid_offset) {
40552
        /* for tap */
40553
438
        set_address_tvb(&whdr->bssid, wlan_bssid_address_type, 6, tvb, bssid_offset);
40554
        /* for dot11decrypt */
40555
438
        save_proto_data(tvb, pinfo, bssid_offset, 6, BSSID_KEY);
40556
438
      }
40557
40558
566
      if (src_offset) {
40559
542
        copy_address_shallow(&whdr->src, &pinfo->dl_src);
40560
542
      }
40561
566
      if (dst_offset) {
40562
544
        copy_address_shallow(&whdr->dst, &pinfo->dl_dst);
40563
544
      }
40564
40565
566
      if ((flags & FROM_TO_DS) == FLAG_FROM_DS) { /* Receiver address */
40566
47
        sta_addr_offset = 4;
40567
519
      } else if ((flags & FROM_TO_DS) == FLAG_TO_DS) { /* Transmitter address */
40568
103
        sta_addr_offset = ta_offset;
40569
103
      }
40570
40571
      /* for dot11decrypt */
40572
566
      if (sta_addr_offset > 0) {
40573
150
        save_proto_data(tvb, pinfo, sta_addr_offset, 6, STA_KEY);
40574
150
      }
40575
40576
566
      seq_control = tvb_get_letohs(tvb, 22);
40577
566
      frag_number = SEQCTL_FRAGMENT_NUMBER(seq_control);
40578
566
      seq_number = SEQCTL_SEQUENCE_NUMBER(seq_control);
40579
40580
566
      col_append_fstr(pinfo->cinfo, COL_INFO,
40581
566
            ", SN=%d, FN=%d", seq_number, frag_number);
40582
40583
      /* Now if we have a tree we start adding stuff */
40584
566
      if (tree)
40585
554
      {
40586
554
        switch (addr_type)
40587
554
        {
40588
237
          case DATA_ADDR_T1:
40589
284
          case DATA_ADDR_T2:
40590
387
          case DATA_ADDR_T3:
40591
554
          case DATA_ADDR_T4:
40592
554
            proto_tree_add_mac48_detail(&mac_ta, &mac_addr, ett_addr, tvb, hdr_tree, ta_offset);
40593
40594
554
            if (da_offset) {
40595
495
              bool add_mac = (da_offset >= 16 && da_offset != sa_offset);
40596
495
              proto_tree_add_mac48_detail(&mac_da, add_mac ? &mac_addr : NULL, ett_addr, tvb, hdr_tree, da_offset);
40597
495
            }
40598
40599
554
            if (sa_offset) {
40600
493
              bool add_mac = (sa_offset >= 16);
40601
493
              proto_tree_add_mac48_detail(&mac_sa, add_mac ? &mac_addr : NULL, ett_addr, tvb, hdr_tree, sa_offset);
40602
493
            }
40603
40604
554
            if (bssid_offset) {
40605
436
              bool add_mac = (bssid_offset >= 16 && bssid_offset != sa_offset && bssid_offset != da_offset);
40606
436
              proto_tree_add_mac48_detail(&mac_bssid, add_mac ? &mac_addr : NULL, ett_addr, tvb, hdr_tree, bssid_offset);
40607
436
            }
40608
40609
554
            if (addr_type == DATA_ADDR_T4 && is_amsdu) {
40610
49
              proto_tree_add_mac48_detail(&mac_bssid, NULL, ett_addr, tvb, hdr_tree, 24);
40611
49
            }
40612
40613
554
            if (sta_addr_offset > 0) {
40614
150
              proto_tree_add_mac48_detail(&mac_staa, NULL, ett_addr, tvb, hdr_tree, sta_addr_offset);
40615
150
            }
40616
554
            proto_tree_add_item(hdr_tree, hf_ieee80211_frag_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
40617
554
            proto_tree_add_item(hdr_tree, hf_ieee80211_seq_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
40618
40619
554
            break;
40620
554
        }
40621
40622
554
      }
40623
566
      break;
40624
566
    }
40625
838
    case EXTENSION_FRAME: {
40626
838
      switch (frame_type_subtype) {
40627
239
        case EXTENSION_DMG_BEACON: {
40628
239
          set_dst_addr_cols(pinfo, tvb, 4, wlan_bssid_address_type);
40629
239
          proto_tree_add_mac48_detail(&mac_bssid, &mac_addr, ett_addr, tvb, hdr_tree, 4);
40630
239
          break;
40631
0
        }
40632
557
        case EXTENSION_S1G_BEACON: {
40633
557
          uint8_t *src_addr[6];
40634
557
          tvb_memcpy(tvb, src_addr, 4, 6);
40635
40636
          /* Insert this src_addr into the s1g sta hash */
40637
557
          if (!wmem_map_lookup(sta_prop_hash, src_addr)) {
40638
299
            wmem_map_insert(sta_prop_hash, wmem_memdup(wmem_file_scope(), src_addr, 6), GUINT_TO_POINTER(STA_IS_S1G));
40639
299
          }
40640
40641
557
          check_s1g_setting(pinfo, tvb, 4);
40642
40643
557
          set_src_addr_cols(pinfo, tvb, 4, wlan_address_type);
40644
557
          proto_tree_add_mac48_detail(&mac_sa, &mac_addr, ett_addr, tvb, hdr_tree, 4);
40645
557
          break;
40646
0
        }
40647
838
      }
40648
838
    }
40649
5.84k
  }
40650
40651
5.38k
  len = tvb_captured_length_remaining(tvb, hdr_len);
40652
5.38k
  reported_len = tvb_reported_length_remaining(tvb, hdr_len);
40653
40654
5.38k
  if (has_fcs)
40655
315
    {
40656
      /*
40657
       * Well, this packet should, in theory, have an FCS.
40658
       * Do we have the entire packet, and does it have enough data for
40659
       * the FCS?
40660
       */
40661
315
      if (reported_len < 4)
40662
12
      {
40663
        /*
40664
         * The packet is claimed not to even have enough data for a 4-byte
40665
         * FCS.
40666
         * Pretend it doesn't have an FCS.
40667
         */
40668
12
        ;
40669
12
      }
40670
303
      else if (len < reported_len)
40671
0
      {
40672
        /*
40673
         * The packet is claimed to have enough data for a 4-byte FCS, but
40674
         * we didn't capture all of the packet.
40675
         * Slice off the 4-byte FCS from the reported length, and trim the
40676
         * captured length so it's no more than the reported length; that
40677
         * will slice off what of the FCS, if any, is in the captured
40678
         * length.
40679
         */
40680
0
        reported_len -= 4;
40681
0
        if (len > reported_len)
40682
0
            len = reported_len;
40683
0
      }
40684
303
      else
40685
303
      {
40686
        /*
40687
         * We have the entire packet, and it includes a 4-byte FCS.
40688
         * Slice it off, and put it into the tree.
40689
         */
40690
303
        len          -= 4;
40691
303
        reported_len -= 4;
40692
303
        if (wlan_check_checksum)
40693
0
        {
40694
0
          uint32_t sent_fcs = tvb_get_letohl(tvb, hdr_len + len);
40695
0
          uint32_t fcs;
40696
40697
0
          if (phdr->datapad)
40698
0
            fcs = crc32_802_tvb_padded(tvb, ohdr_len, hdr_len, len);
40699
0
          else
40700
0
            fcs = crc32_ccitt_tvb(tvb, hdr_len + len);
40701
0
          if (fcs != sent_fcs) {
40702
0
            flag_str[8] = '.';
40703
0
          }
40704
40705
0
          proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, fcs, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
40706
303
        } else {
40707
303
          proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
40708
303
        }
40709
303
      }
40710
315
    }
40711
5.07k
  else
40712
5.07k
    {
40713
5.07k
      flag_str[8] = '\0';
40714
5.07k
    }
40715
40716
5.38k
  proto_item_append_text(ti, ", Flags: %s", flag_str);
40717
5.38k
  col_append_fstr(pinfo->cinfo, COL_INFO, ", Flags=%s", flag_str);
40718
40719
5.38k
  flags_item = proto_tree_add_string(hdr_tree, hf_ieee80211_fc_flags_str, tvb, 0, 0, flag_str);
40720
5.38k
  proto_item_set_generated(flags_item);
40721
40722
  /*
40723
   * Only management and data frames have a body, so we don't have
40724
   * anything more to do for other types of frames.
40725
   */
40726
5.38k
  switch (FCF_FRAME_TYPE (fcf))
40727
5.38k
    {
40728
40729
3.13k
    case MGT_FRAME:
40730
3.13k
      if (htc_len == 4) {
40731
457
        dissect_ht_control(pinfo, hdr_tree, tvb, ohdr_len - 4);
40732
457
      }
40733
3.13k
      break;
40734
40735
554
    case DATA_FRAME:
40736
554
      if ((option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) && tree && DATA_FRAME_IS_QOS(frame_type_subtype))
40737
393
      {
40738
393
        proto_item *qos_fields, *qos_ti;
40739
393
        proto_tree *qos_tree;
40740
40741
393
        uint16_t qos_eosp;
40742
393
        uint16_t qos_field_content;
40743
40744
393
        qos_fields = proto_tree_add_item(hdr_tree, hf_ieee80211_qos, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40745
393
        qos_tree = proto_item_add_subtree(qos_fields, ett_qos_parameters);
40746
40747
393
        qos_eosp = QOS_EOSP(qos_control);
40748
393
        qos_field_content = QOS_FIELD_CONTENT(qos_control);
40749
40750
393
        proto_tree_add_item(qos_tree, hf_ieee80211_qos_tid, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40751
40752
393
        qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_priority, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40753
393
        proto_item_set_generated(qos_ti);
40754
40755
393
        if (FLAGS_DS_STATUS(flags) == (FLAG_FROM_DS|FLAG_TO_DS)) {
40756
          /* mesh frame */
40757
131
          proto_tree_add_item(qos_tree, hf_ieee80211_qos_eosp, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40758
262
        } else {
40759
          /*
40760
           * Table 9-3 from IEEE802.11-2016 tells us that FROM DS means from
40761
           * an AP. And Table 9-6 tells us that we should treat bit 4 as
40762
           * EOSP if from an AP otherwise as simply bit 4.
40763
           */
40764
262
          if (flags & FLAG_FROM_DS) {
40765
29
            proto_tree_add_item(qos_tree, hf_ieee80211_qos_eosp, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40766
233
          } else {
40767
233
            proto_tree_add_item(qos_tree, hf_ieee80211_qos_bit4, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40768
233
          }
40769
262
        }
40770
40771
393
        proto_tree_add_item(qos_tree, hf_ieee80211_qos_ack_policy, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40772
40773
393
        if (!DATA_FRAME_IS_NULL(frame_type_subtype)) {
40774
336
          proto_tree_add_item(qos_tree, hf_ieee80211_qos_amsdu_present, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40775
336
          if (!phdr->no_a_msdus)
40776
336
            is_amsdu = QOS_AMSDU_PRESENT(qos_control);
40777
336
        }
40778
40779
393
        if (meshctl_len) {
40780
8
          proto_tree_add_item(qos_tree, hf_ieee80211_qos_mesh_ctl_present, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40781
8
          if (POWER_MGT_STATUS(flags)) {
40782
5
            if (tvb_get_uint8(tvb, 4) & 0x1)
40783
3
              proto_tree_add_item(qos_tree, hf_ieee80211_qos_mesh_ps_multicast, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40784
2
            else
40785
2
              proto_tree_add_item(qos_tree, hf_ieee80211_qos_mesh_ps_unicast, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40786
5
          } else {
40787
3
            proto_tree_add_item(qos_tree, hf_ieee80211_qos_mesh_ps_rsvd, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40788
3
          }
40789
8
          proto_tree_add_item(qos_tree, hf_ieee80211_qos_mesh_rspi, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40790
385
        } else if (flags & FLAG_FROM_DS) {
40791
152
          if (DATA_FRAME_IS_CF_POLL(frame_type_subtype)) {
40792
            /* txop limit */
40793
17
              qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_txop_limit, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40794
17
            if (qos_field_content == 0) {
40795
5
              proto_item_append_text(qos_ti, " (transmit one frame immediately)");
40796
5
            }
40797
135
          } else {
40798
            /* qap ps buffer state */
40799
135
            proto_item *qos_ps_buf_state_fields;
40800
135
            proto_tree *qos_ps_buf_state_tree;
40801
40802
135
            qos_ps_buf_state_fields = proto_tree_add_item(qos_tree, hf_ieee80211_qos_ps_buf_state, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40803
135
            qos_ps_buf_state_tree = proto_item_add_subtree(qos_ps_buf_state_fields, ett_qos_ps_buf_state);
40804
40805
135
            proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_buf_state_indicated, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40806
40807
135
            if (QOS_PS_BUF_STATE_INDICATED(qos_field_content)) {
40808
83
              proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_highest_pri_buf_ac, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40809
83
              qos_ti = proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_qap_buf_load, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40810
83
              switch (QOS_PS_QAP_BUF_LOAD(qos_field_content)) {
40811
40812
20
              case 0:
40813
20
                proto_item_append_text(qos_ti, " (no buffered traffic)");
40814
20
                break;
40815
40816
40
              default:
40817
40
                proto_item_append_text(qos_ti, " (%d octets)", QOS_PS_QAP_BUF_LOAD(qos_field_content)*4096);
40818
40
                break;
40819
40820
23
              case 15:
40821
23
                proto_item_append_text(qos_ti, " (greater than 57344 octets)");
40822
23
                break;
40823
83
              }
40824
40825
83
            }
40826
135
          }
40827
233
        } else {
40828
          /*
40829
           * Only QoS Data, Qos CF-ACK and NULL frames To-DS have a Queue Size
40830
           * field.
40831
           */
40832
233
          uint16_t scaling_factor = QOS_SCALING_FACTOR(qos_field_content);
40833
233
          uint16_t unscaled_value = QOS_UNSCALED_VALUE(qos_field_content);
40834
40835
233
          if ((DATA_FRAME_IS_NULL(frame_type_subtype) ||
40836
233
               (frame_type_subtype & 0x7) == 0 ||
40837
233
               DATA_FRAME_IS_CF_ACK(frame_type_subtype))) {
40838
208
            if (qos_eosp) {
40839
              /* queue size */
40840
105
              qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_queue_size, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40841
105
              switch (qos_field_content) {
40842
27
              case 0:
40843
27
                proto_item_append_text(qos_ti, " (no buffered traffic in the queue)");
40844
27
                break;
40845
40846
2
              case 254:
40847
2
                proto_item_append_text(qos_ti, " (more than 64768 octets)");
40848
2
                break;
40849
40850
7
              case 255:
40851
7
                proto_item_append_text(qos_ti, " (unspecified or unknown)");
40852
7
                break;
40853
40854
69
              default:
40855
69
                switch (scaling_factor) {
40856
24
                case 0:
40857
24
                  proto_item_append_text(qos_ti, " (%u bytes)", 16 * unscaled_value);
40858
24
                  break;
40859
16
                case 1:
40860
16
                  proto_item_append_text(qos_ti, " (%u bytes)", (1024 + (256 * unscaled_value)));
40861
16
                  break;
40862
21
                case 2:
40863
21
                  proto_item_append_text(qos_ti, " (%u bytes)", (17408 + (2048 * unscaled_value)));
40864
21
                  break;
40865
8
                case 3:
40866
8
                  if (unscaled_value < 62)
40867
8
                    proto_item_append_text(qos_ti, " (%u bytes)", (148480 + (32768 * unscaled_value)));
40868
0
                  else if (unscaled_value == 62)
40869
0
                    proto_item_append_text(qos_ti, " (> 2147328)");
40870
0
                  else if (unscaled_value == 63)
40871
0
                    proto_item_append_text(qos_ti, " (unspecified or unknown)");
40872
8
                  break;
40873
0
                default:
40874
0
                  proto_item_append_text(qos_ti, " (unspecified or unknown)");
40875
0
                  break;
40876
69
                }
40877
69
                break;
40878
105
              }
40879
105
            } else {
40880
              /* txop duration requested */
40881
103
              qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_txop_dur_req,
40882
103
                                   tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
40883
103
              if (qos_field_content == 0) {
40884
36
                proto_item_append_text(qos_ti, " (no TXOP requested)");
40885
36
              }
40886
103
            }
40887
208
          }
40888
233
        }
40889
40890
        /* Do we have +HTC? */
40891
393
        if (htc_len == 4) {
40892
266
          dissect_ht_control(pinfo, hdr_tree, tvb, ohdr_len - 4);
40893
266
        }
40894
40895
393
      } /* end of qos control field */
40896
40897
554
      if (meshctl_len != 0) {
40898
8
        proto_item *msh_fields;
40899
8
        proto_tree *msh_tree;
40900
40901
8
        msh_fields = proto_tree_add_item(hdr_tree, hf_ieee80211_mesh_control_field, tvb, meshoff, meshctl_len, ENC_NA);
40902
8
        msh_tree = proto_item_add_subtree(msh_fields, ett_msh_control);
40903
8
        add_ff_mesh_control(msh_tree, tvb, pinfo, meshoff);
40904
8
      }
40905
40906
      /*
40907
       * No-data frames don't have a body.
40908
       */
40909
554
      if (DATA_FRAME_IS_NULL(frame_type_subtype))
40910
54
        goto end_of_wlan;
40911
40912
500
      if (!wlan_subdissector) {
40913
0
        unsigned fnum = 0;
40914
40915
        /* key: bssid:src
40916
         * data: last seq_control seen and frame number
40917
         */
40918
0
        retransmitted = false;
40919
0
        if (!pinfo->fd->visited) {
40920
0
          retransmit_key key;
40921
0
          retransmit_key *result;
40922
40923
0
          if (whdr->bssid.type == wlan_bssid_address_type) {
40924
0
            memcpy(key.bssid, whdr->bssid.data, 6);
40925
0
          } else {
40926
0
            memset(key.bssid, 0, 6);
40927
0
          }
40928
0
          if (whdr->src.type != AT_NONE) {
40929
0
            memcpy(key.src, whdr->src.data, 6);
40930
0
          } else {
40931
0
            memset(key.src, 0, 6);
40932
0
          }
40933
0
          key.seq_control = 0;
40934
0
          result = (retransmit_key *)g_hash_table_lookup(fc_analyse_retransmit_table, &key);
40935
0
          if (result && (result->seq_control == seq_control)) {
40936
            /* keep a pointer to the first seen frame, could be done with proto data? */
40937
0
            fnum = result->fnum;
40938
0
            g_hash_table_insert(fc_first_frame_table, GINT_TO_POINTER(pinfo->num),
40939
0
                                GINT_TO_POINTER(fnum));
40940
0
            retransmitted = true;
40941
0
          } else {
40942
            /* first time or new seq*/
40943
0
            if (!result) {
40944
0
              result = wmem_new(wmem_file_scope(), retransmit_key);
40945
0
              *result = key;
40946
0
              g_hash_table_insert(fc_analyse_retransmit_table, result, result);
40947
0
            }
40948
0
            result->seq_control = seq_control;
40949
0
            result->fnum =  pinfo->num;
40950
0
          }
40951
0
        }
40952
0
        else if ((fnum = GPOINTER_TO_UINT(g_hash_table_lookup(fc_first_frame_table, GINT_TO_POINTER(pinfo->num))))) {
40953
0
          retransmitted = true;
40954
0
        }
40955
40956
0
        if (retransmitted) {
40957
0
          col_append_str(pinfo->cinfo, COL_INFO, " [retransmitted]");
40958
0
          if (tree) {
40959
0
            proto_item *item;
40960
40961
0
            item=proto_tree_add_none_format(hdr_tree, hf_ieee80211_fc_analysis_retransmission, tvb, 0, 0,
40962
0
                                            "Retransmitted frame");
40963
0
            proto_item_set_generated(item);
40964
0
            item=proto_tree_add_uint(hdr_tree, hf_ieee80211_fc_analysis_retransmission_frame, tvb, 0, 0, fnum);
40965
0
            proto_item_set_generated(item);
40966
0
          }
40967
0
          next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len, len, reported_len);
40968
0
          call_data_dissector(next_tvb, pinfo, tree);
40969
0
          goto end_of_wlan;
40970
0
        }
40971
0
      }
40972
500
      break;
40973
40974
862
    case CONTROL_FRAME:
40975
862
      goto end_of_wlan;
40976
40977
838
    case EXTENSION_FRAME:
40978
838
      break;
40979
40980
0
    default:
40981
0
      goto end_of_wlan;
40982
5.38k
    }
40983
40984
4.43k
  if (IS_PROTECTED(FCF_FLAGS(fcf))
40985
4.43k
      && (frame_type_subtype != EXTENSION_S1G_BEACON)
40986
4.43k
      && !phdr->decrypted
40987
4.43k
      && (wlan_ignore_prot != WLAN_IGNORE_PROT_WO_IV)) {
40988
    /*
40989
     * It's a WEP or WPA encrypted frame, and it hasn't already been
40990
     * decrypted; dissect the protections parameters and decrypt the data,
40991
     * if we have a matching key. Otherwise display it as data.
40992
     */
40993
272
    bool        can_decrypt = false;
40994
272
    proto_tree *wep_tree    = NULL;
40995
272
    uint32_t    iv;
40996
272
    uint8_t     wep_key, keybyte;
40997
272
    DOT11DECRYPT_KEY_ITEM  used_key = { 0 };
40998
40999
272
    if (len == reported_len) {
41000
272
      next_tvb = try_decrypt(tvb, pinfo, hdr_len, reported_len,
41001
272
                             &algorithm, &sec_trailer, &used_key);
41002
272
    }
41003
41004
272
    keybyte = tvb_get_uint8(tvb, hdr_len + 3);
41005
272
    wep_key = KEY_OCTET_WEP_KEY(keybyte);
41006
272
    if ((keybyte & KEY_EXTIV) && (len >= EXTIV_LEN)) {
41007
      /* Extended IV; this frame is likely encrypted with TKIP or CCMP */
41008
82
      if (tree) {
41009
82
        if (algorithm==PROTECTION_ALG_TKIP)
41010
0
          wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
41011
0
              ett_wep_parameters, NULL, "TKIP parameters");
41012
82
        else if (algorithm == PROTECTION_ALG_CCMP || algorithm == PROTECTION_ALG_CCMP_256)
41013
0
          wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
41014
0
            ett_wep_parameters, NULL, "CCMP parameters");
41015
82
        else if (algorithm == PROTECTION_ALG_GCMP || algorithm == PROTECTION_ALG_GCMP_256)
41016
0
          wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
41017
0
            ett_wep_parameters, NULL, "GCMP parameters");
41018
82
        else {
41019
82
          if (IS_TKIP(tvb, hdr_len)) {
41020
8
            algorithm=PROTECTION_ALG_TKIP;
41021
8
            wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
41022
8
                ett_wep_parameters, NULL, "TKIP parameters");
41023
74
          } else if (IS_CCMP(tvb, hdr_len)) {
41024
19
            algorithm=PROTECTION_ALG_CCMP;
41025
19
            wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
41026
19
                ett_wep_parameters, NULL, "CCMP parameters");
41027
19
          } else
41028
55
            wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
41029
55
                ett_wep_parameters, NULL, "TKIP/CCMP parameters");
41030
82
        }
41031
82
        proto_item_set_len(ti, hdr_len + 8);
41032
41033
82
        if (algorithm==PROTECTION_ALG_TKIP) {
41034
8
          snprintf(out_buff, SHORT_STR, "0x%08X%02X%02X",
41035
8
              tvb_get_letohl(tvb, hdr_len + 4),
41036
8
              tvb_get_uint8(tvb, hdr_len),
41037
8
              tvb_get_uint8(tvb, hdr_len + 2));
41038
8
          proto_tree_add_string(wep_tree, hf_ieee80211_tkip_extiv, tvb, hdr_len,
41039
8
              EXTIV_LEN, out_buff);
41040
74
        } else if (algorithm == PROTECTION_ALG_CCMP || algorithm == PROTECTION_ALG_CCMP_256 ||
41041
74
                   algorithm == PROTECTION_ALG_GCMP || algorithm == PROTECTION_ALG_GCMP_256) {
41042
19
          snprintf(out_buff, SHORT_STR, "0x%08X%02X%02X",
41043
19
              tvb_get_letohl(tvb, hdr_len + 4),
41044
19
              tvb_get_uint8(tvb, hdr_len + 1),
41045
19
              tvb_get_uint8(tvb, hdr_len));
41046
19
          proto_tree_add_string(wep_tree, hf_ieee80211_ccmp_extiv, tvb, hdr_len,
41047
19
              EXTIV_LEN, out_buff);
41048
19
        }
41049
41050
82
        proto_tree_add_uint(wep_tree, hf_ieee80211_wep_key, tvb, hdr_len + 3, 1, wep_key);
41051
82
      }
41052
41053
      /* Subtract out the length of the IV. */
41054
82
      len          -= EXTIV_LEN;
41055
82
      reported_len -= EXTIV_LEN;
41056
82
      ivlen         = EXTIV_LEN;
41057
      /* It is unknown whether this is TKIP or CCMP, so let's not even try to
41058
       * parse TKIP Michael MIC+ICV or CCMP MIC. */
41059
41060
82
      const uint8_t *key = NULL;
41061
82
      int key_len;
41062
41063
      /* checking for the trailer                            */
41064
82
      if (next_tvb!=NULL) {
41065
0
        if (reported_len < (int) sec_trailer) {
41066
          /* There is no space for a trailer, ignore it and don't decrypt  */
41067
0
          ;
41068
0
        } else if (len < reported_len) {
41069
          /* There is space for a trailer, but we haven't capture all the  */
41070
          /* packet. Slice off the trailer, but don't try to decrypt      */
41071
0
          reported_len -= sec_trailer;
41072
0
          if (len > reported_len)
41073
0
            len = reported_len;
41074
0
        } else {
41075
          /* Ok, we have a trailer and the whole packet. Decrypt it!      */
41076
          /* TODO: At the moment we won't add the trailer to the tree,    */
41077
          /* so don't remove the trailer from the packet                  */
41078
0
          len          -= sec_trailer;
41079
0
          reported_len -= sec_trailer;
41080
0
          can_decrypt   = true;
41081
41082
          /* Add Key information to packet */
41083
0
          if (!tvb_get_bits8(tvb, 39, 1)) { /* RA is unicast, encrypted with pairwise key */
41084
0
            key_len = Dot11DecryptGetTK(&used_key, &key);
41085
0
            bytes_to_hexstr(out_buff, key, key_len);
41086
0
            out_buff[2 * key_len] = '\0';
41087
0
            ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_tk, tvb, 0, 0, out_buff);
41088
0
            proto_item_set_generated(ti);
41089
41090
            /* Also add the PMK used to decrypt the packet. (PMK==PSK) */
41091
0
            if (used_key.KeyData.Wpa.PskLen > 0) {
41092
41093
0
              bytes_to_hexstr(out_buff, used_key.KeyData.Wpa.Psk, used_key.KeyData.Wpa.PskLen);
41094
0
              out_buff[2*used_key.KeyData.Wpa.PskLen] = '\0';
41095
0
              ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_pmk, tvb, 0, 0, out_buff);
41096
0
              proto_item_set_generated(ti);
41097
0
            }
41098
41099
0
          } else { /* Encrypted with Group Key */
41100
0
            key_len = Dot11DecryptGetGTK(&used_key, &key);
41101
0
            bytes_to_hexstr(out_buff, key, key_len);
41102
0
            out_buff[2 * key_len] = '\0';
41103
0
            ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_gtk, tvb, 0, 0, out_buff);
41104
0
            proto_item_set_generated(ti);
41105
0
          }
41106
0
        }
41107
0
      }
41108
190
    } else {
41109
      /* No Ext. IV - WEP packet */
41110
      /*
41111
       * XXX - pass the IV and key to "try_decrypt_wep()", and have it pass
41112
       * them to "wep_decrypt()", rather than having "wep_decrypt()" extract
41113
       * them itself.
41114
       *
41115
       * Also, just pass the data *following* the WEP parameters as the
41116
       * buffer to decrypt.
41117
       */
41118
190
      iv = tvb_get_ntoh24(tvb, hdr_len);
41119
190
      if (tree) {
41120
161
        wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 4,
41121
161
            ett_wep_parameters, NULL, "WEP parameters");
41122
41123
161
        proto_tree_add_uint(wep_tree, hf_ieee80211_wep_iv, tvb, hdr_len, 3, iv);
41124
161
        tvb_memcpy(tvb, iv_buff, hdr_len, 3);
41125
161
        is_iv_bad = weak_iv(iv_buff);
41126
161
        if (is_iv_bad != -1) {
41127
10
          proto_tree_add_boolean_format (wep_tree, hf_ieee80211_wep_iv_weak,
41128
10
              tvb, 0, 0, true,
41129
10
              "Weak IV for key byte %d",
41130
10
              is_iv_bad);
41131
10
        }
41132
161
      }
41133
190
      if (tree)
41134
161
        proto_tree_add_uint(wep_tree, hf_ieee80211_wep_key, tvb, hdr_len + 3, 1, wep_key);
41135
41136
      /* Subtract out the length of the IV. */
41137
190
      len          -= 4;
41138
190
      reported_len -= 4;
41139
190
      ivlen         = 4;
41140
41141
      /* Even if the decryption was not successful, set the algorithm */
41142
190
      algorithm=PROTECTION_ALG_WEP;
41143
41144
      /*
41145
       * Well, this packet should, in theory, have an ICV.
41146
       * Do we have the entire packet, and does it have enough data for
41147
       * the ICV?
41148
       */
41149
190
      if (reported_len < 4) {
41150
        /*
41151
         * The packet is claimed not to even have enough data for a
41152
         * 4-byte ICV.
41153
         * Pretend it doesn't have an ICV.
41154
         */
41155
42
        ;
41156
148
      } else if (len < reported_len) {
41157
        /*
41158
         * The packet is claimed to have enough data for a 4-byte ICV,
41159
         * but we didn't capture all of the packet.
41160
         * Slice off the 4-byte ICV from the reported length, and trim
41161
         * the captured length so it's no more than the reported length;
41162
         * that will slice off what of the ICV, if any, is in the
41163
         * captured length.
41164
         */
41165
0
        reported_len -= 4;
41166
0
        if (len > reported_len)
41167
0
          len         = reported_len;
41168
148
      } else {
41169
        /*
41170
         * We have the entire packet, and it includes a 4-byte ICV.
41171
         * Slice it off, and put it into the tree.
41172
         *
41173
         * We only support decrypting if we have the ICV.
41174
         *
41175
         * XXX - the ICV is encrypted; we're putting the encrypted
41176
         * value, not the decrypted value, into the tree.
41177
         */
41178
148
        len          -= 4;
41179
148
        reported_len -= 4;
41180
148
        can_decrypt   = true;
41181
148
      }
41182
190
    }
41183
41184
272
    if (algorithm == PROTECTION_ALG_WEP) {
41185
161
      (void) g_strlcpy(wlan_stats.protection, "WEP", MAX_PROTECT_LEN);
41186
161
    } else if (algorithm == PROTECTION_ALG_TKIP) {
41187
8
      (void) g_strlcpy(wlan_stats.protection, "TKIP", MAX_PROTECT_LEN);
41188
103
    } else if (algorithm == PROTECTION_ALG_CCMP || algorithm == PROTECTION_ALG_CCMP_256) {
41189
19
      (void) g_strlcpy(wlan_stats.protection, "CCMP", MAX_PROTECT_LEN);
41190
84
    } else if (algorithm == PROTECTION_ALG_GCMP || algorithm == PROTECTION_ALG_GCMP_256) {
41191
0
      (void) g_strlcpy(wlan_stats.protection, "GCMP", MAX_PROTECT_LEN);
41192
84
    } else {
41193
84
      (void) g_strlcpy(wlan_stats.protection, "Unknown", MAX_PROTECT_LEN);
41194
84
    }
41195
41196
    /* protection header                                  */
41197
272
    if (!can_decrypt || (next_tvb == NULL)) {
41198
      /*
41199
       * WEP decode impossible or failed, treat payload as raw data
41200
       * and don't attempt fragment reassembly or further dissection.
41201
       */
41202
243
      next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len + ivlen, len, reported_len);
41203
41204
243
      if (tree) {
41205
242
        if (algorithm == PROTECTION_ALG_WEP) {
41206
160
          if (can_decrypt)
41207
119
            proto_tree_add_uint_format_value(wep_tree, hf_ieee80211_wep_icv, tvb,
41208
119
                hdr_len + ivlen + len, 4,
41209
119
                tvb_get_ntohl(tvb, hdr_len + ivlen + len),
41210
119
                "0x%08x (not verified)",
41211
119
                tvb_get_ntohl(tvb, hdr_len + ivlen + len));
41212
160
        } else if (algorithm == PROTECTION_ALG_CCMP) {
41213
63
        } else if (algorithm == PROTECTION_ALG_TKIP) {
41214
8
        }
41215
242
      }
41216
41217
243
      if ((!(option_flags & IEEE80211_COMMON_OPT_IS_CENTRINO)) && (wlan_ignore_prot == WLAN_IGNORE_PROT_NO)) {
41218
        /* Some wireless drivers (such as Centrino) WEP payload already decrypted */
41219
241
        call_data_dissector(next_tvb, pinfo, tree);
41220
241
        goto end_of_wlan;
41221
241
      }
41222
243
    } else {
41223
29
      if (algorithm == PROTECTION_ALG_WEP) {
41224
0
        if (tree)
41225
0
          proto_tree_add_uint_format_value(wep_tree, hf_ieee80211_wep_icv, tvb,
41226
0
              hdr_len + ivlen + len, 4,
41227
0
              tvb_get_ntohl(tvb, hdr_len + ivlen + len),
41228
0
              "0x%08x (correct)",
41229
0
              tvb_get_ntohl(tvb, hdr_len + ivlen + len));
41230
41231
0
        add_new_data_source(pinfo, next_tvb, "Decrypted WEP data");
41232
29
      } else if (algorithm == PROTECTION_ALG_CCMP || algorithm == PROTECTION_ALG_CCMP_256) {
41233
0
        add_new_data_source(pinfo, next_tvb, "Decrypted CCMP data");
41234
29
      } else if (algorithm == PROTECTION_ALG_GCMP || algorithm == PROTECTION_ALG_GCMP_256) {
41235
0
        add_new_data_source(pinfo, next_tvb, "Decrypted GCMP data");
41236
29
      } else if (algorithm==PROTECTION_ALG_TKIP) {
41237
0
        add_new_data_source(pinfo, next_tvb, "Decrypted TKIP data");
41238
0
      }
41239
29
#undef IS_TKIP
41240
29
#undef IS_CCMP
41241
29
#undef PROTECTION_ALG_CCMP
41242
29
#undef PROTECTION_ALG_TKIP
41243
29
#undef PROTECTION_ALG_WEP
41244
29
    }
41245
41246
    /*
41247
     * WEP decryption successful!
41248
     *
41249
     * Use the tvbuff we got back from the decryption; the data starts at
41250
     * the beginning.  The lengths are already correct for the decoded WEP
41251
     * payload.
41252
     */
41253
31
    hdr_len = 0;
41254
41255
4.16k
  } else {
41256
    /*
41257
     * Not a WEP-encrypted frame; just use the data from the tvbuff
41258
     * handed to us.
41259
     *
41260
     * The payload starts at "hdr_len" (i.e., just past the 802.11
41261
     * MAC header), the length of data in the tvbuff following the
41262
     * 802.11 header is "len", and the length of data in the packet
41263
     * following the 802.11 header is "reported_len".
41264
     */
41265
4.16k
    next_tvb = tvb;
41266
4.16k
  }
41267
41268
  /*
41269
   * Do defragmentation if "wlan_defragment" is true, and we have more
41270
   * fragments or this isn't the first fragment.
41271
   *
41272
   * We have to do some special handling to catch frames that
41273
   * have the "More Fragments" indicator not set but that
41274
   * don't show up as reassembled and don't have any other
41275
   * fragments present.  Some networking interfaces appear
41276
   * to do reassembly even when you're capturing raw packets
41277
   * *and* show the reassembled packet without the "More
41278
   * Fragments" indicator set *but* with a non-zero fragment
41279
   * number.
41280
   *
41281
   * "fragment_add_seq_802_11()" handles that; we want to call it
41282
   * even if we have a short frame, so that it does those checks - if
41283
   * the frame is short, it doesn't do reassembly on it.
41284
   *
41285
   * (This could get some false positives if we really *did* only
41286
   * capture the last fragment of a fragmented packet, but that's
41287
   * life.)
41288
   */
41289
4.19k
  save_fragmented = pinfo->fragmented;
41290
4.19k
  if (wlan_defragment && (more_frags || (frag_number != 0))) {
41291
0
    fragment_head *fd_head;
41292
41293
    /*
41294
     * If we've already seen this frame, look it up in the
41295
     * table of reassembled packets, otherwise add it to
41296
     * whatever reassembly is in progress, if any, and see
41297
     * if it's done.
41298
     */
41299
0
    if (reported_len < 0)
41300
0
      THROW(ReportedBoundsError);
41301
0
    fd_head = fragment_add_seq_802_11(&wlan_reassembly_table,
41302
0
        next_tvb, hdr_len, pinfo, seq_number, NULL,
41303
0
        frag_number,
41304
0
        reported_len,
41305
0
        more_frags);
41306
0
    next_tvb = process_reassembled_data(tvb, hdr_len, pinfo,
41307
0
        "Reassembled 802.11", fd_head,
41308
0
        &frag_items, NULL, hdr_tree);
41309
4.19k
  } else {
41310
    /*
41311
     * If this is the first fragment, dissect its contents, otherwise
41312
     * just show it as a fragment.
41313
     */
41314
4.19k
    if (frag_number != 0) {
41315
      /* Not the first fragment - don't dissect it. */
41316
212
      next_tvb = NULL;
41317
3.98k
    } else {
41318
      /* First fragment, or not fragmented.  Dissect what we have here. */
41319
41320
      /* Get a tvbuff for the payload. */
41321
3.98k
      next_tvb = tvb_new_subset_length_caplen(next_tvb, hdr_len, len, reported_len);
41322
41323
      /*
41324
       * If this is the first fragment, but not the only fragment,
41325
       * tell the next protocol that.
41326
       */
41327
3.98k
      if (more_frags)
41328
836
        pinfo->fragmented = true;
41329
3.14k
      else
41330
3.14k
        pinfo->fragmented = false;
41331
3.98k
    }
41332
4.19k
  }
41333
41334
4.19k
  if (next_tvb == NULL) {
41335
    /* Just show this as an incomplete fragment. */
41336
212
    col_set_str(pinfo->cinfo, COL_INFO, "Fragmented IEEE 802.11 frame");
41337
212
    next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len, len, reported_len);
41338
212
    call_data_dissector(next_tvb, pinfo, tree);
41339
212
    pinfo->fragmented = save_fragmented;
41340
212
    goto end_of_wlan;
41341
212
  }
41342
41343
3.98k
  switch (FCF_FRAME_TYPE (fcf))
41344
3.98k
    {
41345
41346
2.90k
    case MGT_FRAME:
41347
2.90k
      dissect_ieee80211_mgt(fcf, next_tvb, pinfo, tree);
41348
2.90k
      try_scan_ft_assoc_keys(pinfo, whdr);
41349
2.90k
      break;
41350
41351
259
    case DATA_FRAME:
41352
259
      if (is_amsdu && (tvb_reported_length_remaining(next_tvb, 0) > 4)) {
41353
46
        proto_item   *parent_item;
41354
46
        proto_tree   *mpdu_tree;
41355
46
        uint32_t      msdu_offset = 0;
41356
46
        unsigned      i           = 1;
41357
41358
46
        parent_item = proto_tree_add_protocol_format(tree, proto_aggregate, next_tvb, 0,
41359
46
                                    tvb_reported_length_remaining(next_tvb, 0), "IEEE 802.11 Aggregate MSDU");
41360
46
        mpdu_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_parent_tree);
41361
41362
56
        do {
41363
56
          tvbuff_t           *msdu_tvb;
41364
56
          uint16_t            msdu_length;
41365
56
          proto_tree         *subframe_tree;
41366
56
          bool                last_subframe = false;
41367
56
          uint16_t            subframe_length;
41368
41369
          /*
41370
           * IEEE Std 802.11-2012 says, in section 8.3.2.2 "A-MSDU format":
41371
           *
41372
           *  The A-MSDU subframe header contains three fields: DA, SA, and
41373
           *  Length. The order of these fields and the bits within these
41374
           *  fields are the same as the IEEE 802.3 frame format.
41375
           *
41376
           * which means that the length field is big-endian, not
41377
           * little-endian.
41378
           */
41379
56
          msdu_length = tvb_get_ntohs(next_tvb, msdu_offset+12);
41380
41381
56
          if (tvb_reported_length_remaining(next_tvb, msdu_offset+14+msdu_length) <= 14)
41382
31
            last_subframe = true;
41383
41384
          /* The last A-MSDU subframe has no padding. */
41385
56
          if (last_subframe)
41386
31
            subframe_length = 14+msdu_length;
41387
25
          else
41388
25
            subframe_length = WS_ROUNDUP_4(14+msdu_length);
41389
41390
56
          parent_item = proto_tree_add_item(mpdu_tree, hf_ieee80211_amsdu_subframe, next_tvb,
41391
56
                            msdu_offset, subframe_length, ENC_NA);
41392
56
          proto_item_append_text(parent_item, " #%u", i);
41393
56
          subframe_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_subframe_tree);
41394
56
          i += 1;
41395
41396
56
          proto_tree_add_mac48_detail(&mac_da, NULL, ett_addr, tvb, subframe_tree, msdu_offset);
41397
56
          proto_tree_add_mac48_detail(&mac_sa, NULL, ett_addr, tvb, subframe_tree, msdu_offset+6);
41398
56
          proto_tree_add_item(subframe_tree, hf_ieee80211_amsdu_length, next_tvb, msdu_offset+12, 2, ENC_BIG_ENDIAN);
41399
41400
56
          msdu_offset += 14;
41401
56
          msdu_tvb = tvb_new_subset_length(next_tvb, msdu_offset, msdu_length);
41402
56
          call_dissector(llc_handle, msdu_tvb, pinfo, subframe_tree);
41403
56
          if (!last_subframe) {
41404
10
            uint8_t padding = (4-((msdu_offset+msdu_length)&3))&3;
41405
10
            if (padding > 0)
41406
8
              proto_tree_add_item(subframe_tree, hf_ieee80211_amsdu_padding, next_tvb, msdu_offset+msdu_length, padding, ENC_NA);
41407
10
          }
41408
41409
56
          msdu_offset = WS_ROUNDUP_4(msdu_offset+msdu_length);
41410
56
        } while (tvb_reported_length_remaining(next_tvb, msdu_offset) > 14);
41411
213
      } else {
41412
        /* I guess some bridges take Netware Ethernet_802_3 frames,
41413
           which are 802.3 frames (with a length field rather than
41414
           a type field, but with no 802.2 header in the payload),
41415
           and just stick the payload into an 802.11 frame.  I've seen
41416
           captures that show frames of that sort.
41417
41418
           We also handle some odd form of encapsulation in which a
41419
           complete Ethernet frame is encapsulated within an 802.11
41420
           data frame, with no 802.2 header.  This has been seen
41421
           from some hardware.
41422
41423
           On top of that, at least at some point it appeared that
41424
           the OLPC XO sent out frames with two bytes of 0 between
41425
           the "end" of the 802.11 header and the beginning of
41426
           the payload. Something similar has also been observed
41427
           with Atheros chipsets. There the sequence control field
41428
           seems repeated.
41429
41430
           And, on top of *that*, IEEE Std 802.11-2018 section
41431
           5.1.4 "MSDU format" says:
41432
41433
             Logical Link Control (LLC) sublayer entities use the MAC
41434
             sublayer service to exchange PDUs with peer LLC sublayer
41435
             entities. These PDUs are termed MAC sublayer SDUs (MSDUs)
41436
             when sent to the MAC sublayer. There are two LLC sublayer
41437
             protocols used (see IEEE Std 802-2014); LLC Protocol
41438
             Discrimination (LPD) (see ISO/IEC 8802-2:1998) and EtherType
41439
             Protocol Discrimination (EPD) (see IEEE Std 802.3-2012).
41440
             LPD is used for transmission of all IEEE 802.11 MSDUs with
41441
             the exception of the 5.9 GHz bands where EPD is used
41442
             (see E.2.3 and E.2.4).
41443
41444
           and IEEE Std 1609.3-2016, section 5.2 "Logical link control",
41445
           subsection 5.2.1 "General", says:
41446
41447
             A Networking Services implementation shall use EPD in the
41448
             LLC sublayer as described in IEEE Std 802, using an EtherType
41449
             in the LLC sublayer header Type9 field (see Figure 5 and
41450
             Figure 28). The LLC sublayer header consists solely of a
41451
             2-octet field that contains an EtherType that identifies
41452
             the higher layer protocol.
41453
41454
           and ISO 21215, second edition, 2018-06, "Intelligent transport
41455
           systems -- Localized communications -- ITS-M5", section 6.3
41456
           "Logical link control sub-layer" says:
41457
41458
             IEEE Std 802.11TM-2016 does not specify a logical link control
41459
             sub-layer protocol. Related functionality is part of the
41460
             communication adaptation sub-layer specified in 6.4.
41461
41462
             The Length/Type field specified in IEEE 802.3-2015 contains
41463
             a 2-octet unsigned Integer number. Dependent on the value,
41464
             the field provides either length information or EtherType
41465
             information. If the value contained in this field is equal
41466
             to or larger than 1 536 = 0x06.00, the field contains an
41467
             EtherType address. Ethertype addresses are assigned by the
41468
             IEEE Registration Authority, and are used to identify the
41469
             protocol employed directly above the ITS-S access layer.
41470
             This method of addressing is named "EtherType Protocol
41471
             Discrimination" (EPD). An ITS-M5 CI shall support EPD
41472
             specified in IEEE Std 802.
41473
41474
                 ...
41475
41476
             NOTE 2    EPD replaces LLC Protocol Discrimination (LPD).
41477
             ETSI ITS-G5 is the only known ITS access technology still
41478
             using LPD.
41479
41480
             Different to the information in IEEE Std 802.11-2016, 5.1.4,
41481
             EPD is applicable in all frequency bands as long as
41482
             dot11OCBActivated is set to true, i.e. activating the operation
41483
             mode "outside the context of a BSS" (OCB).
41484
41485
           meaning that a packet might just begin with an Ethertype.
41486
41487
           So, if the packet doesn't start with 0xaa 0xaa:
41488
41489
             we first use the same scheme that linux-wlan-ng does to detect
41490
             those encapsulated Ethernet frames, namely looking to see whether
41491
             the frame either starts with 6 octets that match the destination
41492
             address from the 802.11 header or has 6 octets that match the
41493
             source address from the 802.11 header following the first 6 octets,
41494
             and, if so, treat it as an encapsulated Ethernet frame;
41495
41496
             otherwise, we use the same scheme that we use in the Ethernet
41497
             dissector to recognize Netware 802.3 frames, namely checking
41498
             whether the packet starts with 0xff 0xff and, if so, treat it
41499
             as an encapsulated IPX frame;
41500
41501
             otherwise, we check whether the packet starts with 0x00 0x00
41502
             or with a copy of the sequence control field and, if so, treat
41503
             those two octets as mysterious extra stuff preceding the
41504
             payload (possibly OLPC stuff, possibly Ruckus Wireless stuff,
41505
             possibly Atheros stuff), and treat what follows as a frame
41506
             using LPD;
41507
41508
             otherwise, we check whether the first two octets, treated
41509
             as an Ethertype, has a dissector and, if so, treat this as
41510
             a frame using EPD;
41511
41512
             otherwise, we treat this as a frame using LPD. */
41513
213
        heur_dtbl_entry_t  *hdtbl_entry;
41514
213
        if (dissector_try_heuristic(heur_subdissector_list, next_tvb, pinfo, tree, &hdtbl_entry, NULL)) {
41515
0
          pinfo->fragmented = save_fragmented;
41516
0
          goto end_of_wlan; /* heuristics dissector handled it. */
41517
0
        }
41518
213
        encap_type = ENCAP_802_2;
41519
213
        if (tvb_bytes_exist(next_tvb, 0, 2)) {
41520
192
          octet1 = tvb_get_uint8(next_tvb, 0);
41521
192
          octet2 = tvb_get_uint8(next_tvb, 1);
41522
192
          if ((octet1 != 0xaa) || (octet2 != 0xaa)) {
41523
191
            if ((tvb_memeql(next_tvb, 6, (const uint8_t *)pinfo->dl_src.data, 6) == 0) ||
41524
191
                (tvb_memeql(next_tvb, 0, (const uint8_t *)pinfo->dl_dst.data, 6) == 0))
41525
10
              encap_type = ENCAP_ETHERNET;
41526
181
            else if ((octet1 == 0xff) && (octet2 == 0xff))
41527
15
              encap_type = ENCAP_IPX;
41528
166
            else if (((octet1 == 0x00) && (octet2 == 0x00)) &&
41529
166
              tvb_bytes_exist(next_tvb, 0, 18) &&
41530
166
              (tvb_memeql(next_tvb, 6, (const uint8_t*)pinfo->dl_dst.data, 6) == 0) &&
41531
166
              (tvb_memeql(next_tvb, 12, (const uint8_t*)pinfo->dl_src.data, 6) == 0)) {
41532
0
              proto_tree_add_item(tree, hf_ieee80211_mysterious_extra_stuff, next_tvb, 0, 6, ENC_NA);
41533
0
              next_tvb = tvb_new_subset_remaining(next_tvb, 6);
41534
0
              encap_type = ENCAP_ETHERNET;
41535
166
            } else if (((octet1 == 0x00) && (octet2 == 0x00)) ||
41536
166
                     (((octet2 << 8) | octet1) == seq_control)) {
41537
31
              proto_tree_add_item(tree, hf_ieee80211_mysterious_extra_stuff, next_tvb, 0, 2, ENC_NA);
41538
31
              next_tvb = tvb_new_subset_remaining(next_tvb, 2);
41539
135
            } else if ((etype = ((octet1 << 8) | octet2)) > ETHERNET_II_MIN_LEN) {
41540
              /*
41541
               * This might be an Ethertype, so maybe this is 802.11
41542
               * using EPD rather than LPD.  Is this a *known* Ethertype?
41543
               */
41544
121
              if (dissector_get_uint_handle(ethertype_subdissector_table,
41545
121
                                            etype) != NULL) {
41546
                /* Yes. */
41547
28
                encap_type = ENCAP_EPD;
41548
28
              }
41549
121
            }
41550
191
          }
41551
192
        }
41552
41553
213
        switch (encap_type) {
41554
41555
160
        case ENCAP_802_2:
41556
          /* 802.2 LPD */
41557
160
          call_dissector(llc_handle, next_tvb, pinfo, tree);
41558
160
          break;
41559
41560
10
        case ENCAP_ETHERNET:
41561
10
          call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree);
41562
10
          break;
41563
41564
15
        case ENCAP_IPX:
41565
15
          call_dissector(ipx_handle, next_tvb, pinfo, tree);
41566
15
          break;
41567
41568
28
        case ENCAP_EPD:
41569
          /* EPD */
41570
28
          call_dissector(epd_llc_handle, next_tvb, pinfo, tree);
41571
28
          break;
41572
213
        }
41573
213
      }
41574
203
      break;
41575
41576
789
    case EXTENSION_FRAME:
41577
789
    {
41578
789
      dissect_ieee80211_extension(fcf, next_tvb, pinfo, tree, flags);
41579
789
      break;
41580
259
    }
41581
3.98k
  }
41582
1.52k
  pinfo->fragmented = save_fragmented;
41583
41584
2.89k
end_of_wlan:
41585
2.89k
  whdr->stats = wlan_stats;
41586
2.89k
  tap_queue_packet(wlan_tap, pinfo, whdr);
41587
2.89k
  memset(&wlan_stats, 0, sizeof wlan_stats);
41588
41589
2.89k
  return tvb_captured_length(tvb);
41590
1.52k
}
41591
41592
static int
41593
dissect_ieee80211_unknown_pv(tvbuff_t *tvb, packet_info *pinfo _U_,
41594
                             proto_tree *tree, uint8_t pv,
41595
                             struct ieee_802_11_phdr *phdr)
41596
192
{
41597
192
  proto_item *ti;
41598
192
  int         len;
41599
192
  unsigned    offset = 0;
41600
192
  proto_tree *hdr_tree;
41601
192
  tvbuff_t   *next_tvb;
41602
41603
192
  col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown protocol version: %u", pv);
41604
41605
  /* Create the protocol tree */
41606
192
  len = tvb_reported_length_remaining(tvb, offset);
41607
192
  ti = proto_tree_add_protocol_format(tree, proto_wlan, tvb, offset, len,
41608
192
                                      "IEEE 802.11 Unknown Protocol Version:"
41609
192
                                      "%d", pv);
41610
192
  hdr_tree = proto_item_add_subtree(ti, ett_80211);
41611
192
  proto_tree_add_item(hdr_tree, hf_ieee80211_fc_proto_version, tvb, offset, 1, ENC_NA);
41612
192
  if (phdr->fcs_len == 4)
41613
59
    len -= 4;
41614
192
  len -= 2;  /* We have already dealt with two bytes */
41615
192
  next_tvb = tvb_new_subset_length(tvb, 2, len);
41616
192
  call_data_dissector(next_tvb, pinfo, hdr_tree);
41617
192
  proto_tree_add_checksum(hdr_tree, tvb, len + 2, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
41618
41619
192
  return tvb_captured_length(tvb);
41620
192
}
41621
41622
/* ************************************************************************* */
41623
/*                          Dissect 802.11 frame                             */
41624
/* ************************************************************************* */
41625
/*
41626
 * The 802.11n specification makes some fairly significant changes to the
41627
 * layout of the MAC header.  The first two bits of the MAC header are the
41628
 * protocol version.  You'd think that the 802.11 committee would have
41629
 * bumped the version to indicate a different MAC layout, but NOOOO -- we
41630
 * have to go digging for bits in various locations instead.
41631
 */
41632
static int
41633
dissect_ieee80211_common(tvbuff_t *tvb, packet_info *pinfo,
41634
                          proto_tree *tree, uint32_t option_flags,
41635
                          struct ieee_802_11_phdr *phdr)
41636
7.57k
{
41637
7.57k
  uint8_t          pv = 0;
41638
7.57k
  bool             isDMG = (phdr->phy == PHDR_802_11_PHY_11AD);
41639
7.57k
  bool             isS1G = (phdr->phy == PHDR_802_11_PHY_11AH);
41640
7.57k
  uint16_t         fcf;
41641
7.57k
  static wlan_hdr_t whdrs[4];
41642
7.57k
  wlan_hdr_t *whdr;
41643
41644
  /* Update these so the info is available down the line */
41645
7.57k
  if (pinfo->pseudo_header) {
41646
7.57k
    pinfo->pseudo_header->ieee_802_11.has_frequency = phdr->has_frequency;
41647
7.57k
    pinfo->pseudo_header->ieee_802_11.frequency = phdr->frequency;
41648
7.57k
  }
41649
41650
7.57k
  p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY, GINT_TO_POINTER(isDMG));
41651
41652
7.57k
  memset(&whdrs[0], 0, sizeof(wlan_hdr_t) * 4);
41653
7.57k
  whdr= &whdrs[0];
41654
41655
7.57k
  p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_S1G_KEY, GINT_TO_POINTER(isS1G));
41656
41657
  /* Handling for one-one mapping between associations and conversations */
41658
7.57k
  if (!pinfo->fd->visited) {
41659
7.57k
    p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, ASSOC_COUNTER_KEY,
41660
7.57k
                     GUINT_TO_POINTER(association_counter));
41661
7.57k
  }
41662
41663
7.57k
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "802.11");
41664
7.57k
  col_clear(pinfo->cinfo, COL_INFO);
41665
41666
7.57k
  fcf = FETCH_FCF(0);
41667
41668
  /*
41669
   * Handle PV0 and PV1 in separate functions.
41670
   */
41671
7.57k
  pv = FCF_PROT_VERSION(fcf);
41672
7.57k
  switch (pv) {
41673
5.89k
  case PV0:
41674
5.89k
    dissect_ieee80211_pv0(tvb, pinfo, tree, option_flags, whdr, phdr);
41675
5.89k
    break;
41676
1.46k
  case PV1:
41677
1.46k
    dissect_ieee80211_pv1(tvb, pinfo, tree, phdr);
41678
1.46k
    break;
41679
192
  default: /* Unknown protocol version */
41680
192
    dissect_ieee80211_unknown_pv(tvb, pinfo, tree, pv, phdr);
41681
192
    break;
41682
7.57k
  }
41683
3.50k
  return tvb_captured_length(tvb);
41684
7.57k
}
41685
41686
/*
41687
 * Dissect 802.11 with a variable-length link-layer header and with the FCS
41688
 * presence or absence indicated by the pseudo-header, if there is one.
41689
 */
41690
static int
41691
dissect_ieee80211(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
41692
728
{
41693
728
  struct ieee_802_11_phdr *phdr = (struct ieee_802_11_phdr *)data;
41694
728
  struct ieee_802_11_phdr ourphdr;
41695
41696
728
  if (phdr == NULL) {
41697
    /*
41698
     * Fake a pseudo-header.
41699
     * XXX - what are we supposed to do if the FCS length is unknown?
41700
     */
41701
17
    memset(&ourphdr, 0, sizeof(ourphdr));
41702
17
    ourphdr.fcs_len = -1;
41703
17
    ourphdr.decrypted = false;
41704
17
    ourphdr.datapad = false;
41705
17
    ourphdr.phy = PHDR_802_11_PHY_UNKNOWN;
41706
17
    phdr = &ourphdr;
41707
17
  }
41708
728
  return dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, phdr);
41709
728
}
41710
41711
/*
41712
 * Dissect 802.11 with a variable-length link-layer header and with an
41713
 * FCS, but no pseudo-header.
41714
 */
41715
static int
41716
dissect_ieee80211_withfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
41717
0
{
41718
0
  struct ieee_802_11_phdr phdr;
41719
41720
  /* Construct a pseudo-header to hand to the common code. */
41721
0
  memset(&phdr, 0, sizeof(phdr));
41722
0
  phdr.fcs_len = 4;
41723
0
  phdr.decrypted = false;
41724
0
  phdr.datapad = false;
41725
0
  phdr.phy = PHDR_802_11_PHY_UNKNOWN;
41726
0
  dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
41727
0
  return tvb_captured_length(tvb);
41728
0
}
41729
41730
/*
41731
 * Dissect 802.11 with a variable-length link-layer header and without an
41732
 * FCS, but no pseudo-header.
41733
 */
41734
static int
41735
dissect_ieee80211_withoutfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
41736
6.51k
{
41737
6.51k
  struct ieee_802_11_phdr phdr;
41738
41739
  /* Construct a pseudo-header to hand to the common code. */
41740
6.51k
  memset(&phdr, 0, sizeof(phdr));
41741
6.51k
  phdr.decrypted = false;
41742
6.51k
  phdr.datapad = false;
41743
6.51k
  phdr.phy = PHDR_802_11_PHY_UNKNOWN;
41744
6.51k
  dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
41745
6.51k
  return tvb_captured_length(tvb);
41746
6.51k
}
41747
41748
/*
41749
 * Dissect 802.11 from an Intel 2200BG adapter in a Centrino laptop
41750
 * running Windows XP.
41751
 *
41752
 * From
41753
 *
41754
 *   https://www.wireshark.org/lists/ethereal-dev/200407/msg00184.html
41755
 *
41756
 * and
41757
 *
41758
 *   https://www.wireshark.org/lists/ethereal-dev/200407/msg00393.html:
41759
 *
41760
 *  I tried capturing from a Centrino laptop with the Intel 2200BG 802.11g
41761
 *  chipset. I saw a lot of "Ethernet II" frames with 0x2452 as ethertype.
41762
 *
41763
 *    ...
41764
 *
41765
 *  This behaviour has been observed on Windows XP. In my opinion it is
41766
 *  a "proprietary" behaviour of either the Centrino driver or the Centrino
41767
 *  hardware. Currently I have no Linux distro installed on the machine to
41768
 *  verify whether it is also the case.
41769
 *
41770
 *  These packets are seen only in a promiscuous capture:
41771
 *    - Packets normally received by the Centrino computer have the normal
41772
 *      structure (no 802.11/LLC header but directly IP header).
41773
 *    - Packets that are supposed to be received by another computer have
41774
 *      the 802.11/LLC headers. ... Also I noticed that when WEP is enabled,
41775
 *      the 802.11 header has the flag "WEP" set to true, but the packet
41776
 *      is already decrypted. I added a test in the code to accommodate this.
41777
 *      For TKIP it seems to stay encrypted.
41778
 */
41779
static int
41780
dissect_ieee80211_centrino(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
41781
2
{
41782
2
  struct ieee_802_11_phdr phdr;
41783
41784
  /* Construct a pseudo-header to hand to the common code. */
41785
2
  memset(&phdr, 0, sizeof(phdr));
41786
2
  phdr.decrypted = false;
41787
2
  phdr.datapad = false;
41788
2
  phdr.phy = PHDR_802_11_PHY_UNKNOWN;
41789
2
  dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_IS_CENTRINO|IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
41790
2
  return tvb_captured_length(tvb);
41791
2
}
41792
41793
/*
41794
 * Dissect 802.11 with a variable-length link-layer header and a byte-swapped
41795
 * control field and with no FCS (some hardware sends out LWAPP-encapsulated
41796
 * 802.11 packets with the control field byte swapped).
41797
 */
41798
static int
41799
dissect_ieee80211_bsfc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
41800
334
{
41801
334
  struct ieee_802_11_phdr phdr;
41802
41803
  /* Construct a pseudo-header to hand to the common code. */
41804
334
  memset(&phdr, 0, sizeof(phdr));
41805
334
  phdr.decrypted = false;
41806
334
  phdr.datapad = false;
41807
334
  phdr.phy = PHDR_802_11_PHY_UNKNOWN;
41808
334
  dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_BROKEN_FC|IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
41809
334
  return tvb_captured_length(tvb);
41810
334
}
41811
41812
/*
41813
 * Dissect 802.11 with a variable-length link-layer header without qos elements
41814
 * in data+qos frames and with no FCS (sent as WIDS frames by Cisco standalone
41815
 * APs).
41816
 */
41817
static int
41818
dissect_ieee80211_noqos(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
41819
0
{
41820
0
  struct ieee_802_11_phdr phdr;
41821
41822
  /* Construct a pseudo-header to hand to the common code. */
41823
0
  memset(&phdr, 0, sizeof(phdr));
41824
0
  phdr.decrypted = false;
41825
0
  phdr.datapad = false;
41826
0
  phdr.phy = PHDR_802_11_PHY_UNKNOWN;
41827
0
  dissect_ieee80211_common(tvb, pinfo, tree, 0, &phdr);
41828
0
  return tvb_captured_length(tvb);
41829
0
}
41830
41831
41832
/* ------------- */
41833
static unsigned
41834
retransmit_hash(const void *k)
41835
0
{
41836
0
  const retransmit_key *key = (const retransmit_key *)k;
41837
0
  unsigned hash_val;
41838
0
  int   i;
41839
41840
0
  hash_val = 0;
41841
0
  for (i = 0; i < 6; i++)
41842
0
    hash_val += key->bssid[i];
41843
41844
0
  for (i = 0; i < 6; i++)
41845
0
    hash_val += key->src[i];
41846
41847
0
  return hash_val;
41848
0
}
41849
41850
static int
41851
retransmit_equal(const void *k1, const void *k2)
41852
0
{
41853
0
  const retransmit_key *key1 = (const retransmit_key *)k1;
41854
0
  const retransmit_key *key2 = (const retransmit_key *)k2;
41855
41856
0
  return ((!memcmp(key1->bssid, key2->bssid, 6) && !memcmp(key1->src, key2->src, 6)) ? true:false);
41857
0
}
41858
41859
static unsigned
41860
frame_hash(const void *k)
41861
0
{
41862
0
  uint32_t frame = GPOINTER_TO_UINT(k);
41863
41864
0
  return frame;
41865
0
}
41866
41867
static int
41868
frame_equal(const void *k1, const void *k2)
41869
0
{
41870
0
  uint32_t frame1 = GPOINTER_TO_UINT(k1);
41871
0
  uint32_t frame2 = GPOINTER_TO_UINT(k2);
41872
41873
0
  return frame1==frame2;
41874
0
}
41875
41876
/*
41877
 * EAPOL key description dissectors.
41878
 */
41879
14
#define KEY_INFO_KEYDES_VERSION_MASK        0x0007
41880
14
#define KEY_INFO_KEY_TYPE_MASK              0x0008
41881
14
#define KEY_INFO_KEY_INDEX_MASK             0x0030
41882
14
#define KEY_INFO_INSTALL_MASK               0x0040
41883
14
#define KEY_INFO_KEY_ACK_MASK               0x0080
41884
14
#define KEY_INFO_KEY_MIC_MASK               0x0100
41885
14
#define KEY_INFO_SECURE_MASK                0x0200
41886
14
#define KEY_INFO_ERROR_MASK                 0x0400
41887
14
#define KEY_INFO_REQUEST_MASK               0x0800
41888
14
#define KEY_INFO_ENCRYPTED_KEY_DATA_MASK    0x1000
41889
14
#define KEY_INFO_SMK_MESSAGE_MASK           0x2000
41890
41891
0
#define KEYDES_VER_TYPE1        0x01
41892
#define KEYDES_VER_TYPE2        0x02
41893
#define KEYDES_VER_TYPE3        0x03
41894
41895
static const value_string keydes_version_vals[] = {
41896
  { KEYDES_VER_TYPE1,     "RC4 Cipher, HMAC-MD5 MIC" },
41897
  { KEYDES_VER_TYPE2,     "AES Cipher, HMAC-SHA1 MIC" },
41898
  { KEYDES_VER_TYPE3,     "AES Cipher, AES-128-CMAC MIC" },
41899
  { 0, NULL }
41900
};
41901
41902
static int proto_wlan_rsna_eapol;
41903
41904
static int hf_wlan_rsna_eapol_wpa_keydes_msgnr;
41905
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo;
41906
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version;
41907
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type;
41908
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index;
41909
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install;
41910
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack;
41911
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic;
41912
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure;
41913
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error;
41914
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request;
41915
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data;
41916
static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message;
41917
static int hf_wlan_rsna_eapol_keydes_key_len;
41918
static int hf_wlan_rsna_eapol_keydes_replay_counter;
41919
static int hf_wlan_rsna_eapol_keydes_key_iv;
41920
static int hf_wlan_rsna_eapol_wpa_keydes_nonce;
41921
static int hf_wlan_rsna_eapol_wpa_keydes_rsc;
41922
static int hf_wlan_rsna_eapol_wpa_keydes_id;
41923
static int hf_wlan_rsna_eapol_wpa_keydes_mic;
41924
static int hf_wlan_rsna_eapol_wpa_keydes_data_len;
41925
static int hf_wlan_rsna_eapol_wpa_keydes_data;
41926
static int hf_wlan_rsna_eapol_wpa_keydes_padding;
41927
static int hf_wlan_rsna_eapol_wpa_extraneous;
41928
41929
static int ett_keyinfo;
41930
static int ett_wlan_rsna_eapol_keydes_data;
41931
41932
static const true_false_string keyinfo_key_type_tfs = { "Pairwise Key", "Group Key" };
41933
41934
static int
41935
keydata_padding_len(tvbuff_t *tvb)
41936
0
{
41937
0
  int keydata_len = tvb_reported_length(tvb);
41938
0
  int len_no_padding = keydata_len;
41939
0
  const uint8_t *keydata = tvb_get_ptr(tvb, 0, keydata_len);
41940
0
  while (len_no_padding > 0 && (keydata[len_no_padding - 1] == 0x00)) {
41941
0
    len_no_padding--;
41942
0
  }
41943
0
  if (len_no_padding > 0 && keydata[len_no_padding - 1] == 0xdd) {
41944
0
    len_no_padding--;
41945
0
    return keydata_len - len_no_padding;
41946
0
  }
41947
0
  return 0;
41948
0
}
41949
41950
static void
41951
get_eapol_parsed(packet_info *pinfo, PDOT11DECRYPT_EAPOL_PARSED eapol_parsed,
41952
                 ieee80211_conversation_data_t *conv_data)
41953
0
{
41954
0
  if (!eapol_parsed) {
41955
0
    return;
41956
0
  }
41957
41958
0
  proto_eapol_key_frame_t *eapol_key =
41959
0
    (proto_eapol_key_frame_t *)p_get_proto_data(pinfo->pool, pinfo, proto_eapol,
41960
0
                                                EAPOL_KEY_FRAME_KEY);
41961
0
  if (!eapol_key) {
41962
0
    return;
41963
0
  }
41964
0
  eapol_parsed->len = eapol_key->len;
41965
0
  eapol_parsed->key_type = eapol_key->type;
41966
0
  eapol_parsed->key_version = (uint8_t)
41967
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, KEY_VERSION_KEY));
41968
0
  eapol_parsed->key_len = (uint16_t)
41969
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, KEY_LEN_KEY));
41970
0
  eapol_parsed->key_iv = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, KEY_IV_KEY);
41971
0
  eapol_parsed->key_data = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, KEY_DATA_KEY);
41972
0
  eapol_parsed->key_data_len = (uint16_t)
41973
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, KEY_DATA_LEN_KEY));
41974
0
  eapol_parsed->nonce = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, NONCE_KEY);
41975
0
  eapol_parsed->group_cipher = (uint8_t)
41976
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GROUP_CIPHER_KEY));
41977
0
  eapol_parsed->cipher = (uint8_t)
41978
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, CIPHER_KEY));
41979
0
  eapol_parsed->akm = (uint8_t)
41980
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, AKM_KEY));
41981
0
  eapol_parsed->mic = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, MIC_KEY);
41982
0
  eapol_parsed->mic_len =
41983
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, MIC_LEN_KEY));
41984
0
  eapol_parsed->gtk = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GTK_KEY);
41985
0
  eapol_parsed->gtk_len = (uint16_t)
41986
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GTK_LEN_KEY));
41987
41988
  /* For fast bss transition akms */
41989
0
  eapol_parsed->mdid = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, MDID_KEY);
41990
0
  eapol_parsed->fte.r0kh_id =
41991
0
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R0KH_ID_KEY);
41992
0
  eapol_parsed->fte.r0kh_id_len = (uint8_t)
41993
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R0KH_ID_LEN_KEY));
41994
0
  eapol_parsed->fte.r1kh_id =
41995
0
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R1KH_ID_KEY);
41996
0
  eapol_parsed->fte.r1kh_id_len = (uint8_t)
41997
0
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R1KH_ID_LEN_KEY));
41998
41999
0
  if (conv_data) {
42000
0
    eapol_parsed->dh_group = conv_data->sae_group;
42001
0
  }
42002
0
}
42003
42004
static void
42005
get_assoc_parsed(packet_info *pinfo, PDOT11DECRYPT_ASSOC_PARSED assoc_parsed)
42006
782
{
42007
782
  if (!assoc_parsed) {
42008
0
    return;
42009
0
  }
42010
42011
782
  assoc_parsed->group_cipher = (uint8_t)
42012
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GROUP_CIPHER_KEY));
42013
782
  assoc_parsed->cipher = (uint8_t)
42014
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, CIPHER_KEY));
42015
782
  assoc_parsed->akm = (uint8_t)
42016
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, AKM_KEY));
42017
782
  assoc_parsed->fte.mic = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_MIC_KEY);
42018
782
  assoc_parsed->fte.mic_len =
42019
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_MIC_LEN_KEY));
42020
782
  assoc_parsed->mdid = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, MDID_KEY);
42021
782
  assoc_parsed->fte.anonce =
42022
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_ANONCE_KEY);
42023
782
  assoc_parsed->fte.snonce =
42024
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_SNONCE_KEY);
42025
782
  assoc_parsed->fte.r0kh_id =
42026
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R0KH_ID_KEY);
42027
782
  assoc_parsed->fte.r0kh_id_len = (uint8_t)
42028
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R0KH_ID_LEN_KEY));
42029
782
  assoc_parsed->fte.r1kh_id =
42030
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R1KH_ID_KEY);
42031
782
  assoc_parsed->fte.r1kh_id_len = (uint8_t)
42032
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_R1KH_ID_LEN_KEY));
42033
782
  assoc_parsed->rsne_tag =
42034
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, RSNE_TAG_KEY);
42035
782
  assoc_parsed->rsnxe_tag =
42036
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, RSNXE_TAG_KEY);
42037
782
  assoc_parsed->mde_tag =
42038
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, MDE_TAG_KEY);
42039
782
  assoc_parsed->fte_tag =
42040
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, FTE_TAG_KEY);
42041
782
  assoc_parsed->rde_tag =
42042
782
    (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, RDE_TAG_KEY);
42043
782
  assoc_parsed->gtk = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GTK_KEY);
42044
782
  assoc_parsed->gtk_len = (uint16_t)
42045
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GTK_LEN_KEY));
42046
782
  assoc_parsed->gtk_subelem_key_len = (uint16_t)
42047
782
    GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_wlan, GTK_SUBELEM_KEY_LEN_KEY));
42048
782
}
42049
42050
static void
42051
try_decrypt_keydata(packet_info *pinfo)
42052
0
{
42053
0
  uint32_t dec_caplen;
42054
0
  unsigned char dec_data[DOT11DECRYPT_EAPOL_MAX_LEN];
42055
0
  DOT11DECRYPT_EAPOL_PARSED eapol_parsed;
42056
0
  DOT11DECRYPT_KEY_ITEM used_key;
42057
42058
0
  if (!enable_decryption) {
42059
0
    return;
42060
0
  }
42061
42062
0
  uint8_t *bssid = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, BSSID_KEY);
42063
0
  uint8_t *sta = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, STA_KEY);
42064
0
  if (!bssid || !sta) {
42065
0
    return;
42066
0
  }
42067
42068
0
  conversation_t *conversation = find_wlan_conversation_pinfo(pinfo);
42069
0
  ieee80211_conversation_data_t *conversation_data = NULL;
42070
0
  if (conversation) {
42071
0
      conversation_data = (ieee80211_conversation_data_t*)conversation_get_proto_data(conversation, proto_wlan);
42072
      /* Use MLD MAC in EAPOL */
42073
0
      if (conversation_data && conversation_data->mld_set) {
42074
0
        bssid = conversation_data->ap_mld;
42075
0
        sta = conversation_data->sta_mld;
42076
0
      }
42077
0
  }
42078
42079
0
  memset(&eapol_parsed, 0, sizeof(eapol_parsed));
42080
0
  get_eapol_parsed(pinfo, &eapol_parsed, conversation_data);
42081
42082
0
  int ret = Dot11DecryptDecryptKeyData(&dot11decrypt_ctx,
42083
0
                                        &eapol_parsed,
42084
0
                                        bssid, sta,
42085
0
                                        dec_data, &dec_caplen,
42086
0
                                        &used_key);
42087
0
  if (ret == DOT11DECRYPT_RET_SUCCESS && dec_caplen > 0) {
42088
0
    proto_keydata_t *eapol = wmem_new(wmem_file_scope(), proto_keydata_t);
42089
0
    eapol->used_key = used_key;
42090
0
    eapol->keydata_len = dec_caplen;
42091
0
    eapol->keydata = (uint8_t *)wmem_memdup(wmem_file_scope(), dec_data, dec_caplen);
42092
42093
    /* Save decrypted eapol keydata for rsna dissector */
42094
0
    p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, DECRYPTED_EAPOL_KEY, eapol);
42095
0
  }
42096
0
}
42097
42098
static void
42099
try_scan_eapol_keys(packet_info *pinfo, DOT11DECRYPT_HS_MSG_TYPE msg_type)
42100
0
{
42101
0
  DOT11DECRYPT_EAPOL_PARSED eapol_parsed;
42102
42103
0
  if (!enable_decryption) {
42104
0
    return;
42105
0
  }
42106
42107
0
  proto_eapol_key_frame_t *eapol_key =
42108
0
    (proto_eapol_key_frame_t *)p_get_proto_data(pinfo->pool, pinfo, proto_eapol,
42109
0
                                                EAPOL_KEY_FRAME_KEY);
42110
0
  uint8_t *bssid = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, BSSID_KEY);
42111
0
  uint8_t *sta = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, STA_KEY);
42112
42113
0
  if (!eapol_key || !bssid || !sta) {
42114
0
    return;
42115
0
  }
42116
42117
0
  conversation_t *conversation = find_wlan_conversation_pinfo(pinfo);
42118
0
  ieee80211_conversation_data_t *conversation_data = NULL;
42119
0
  if (conversation) {
42120
0
      conversation_data = (ieee80211_conversation_data_t*)conversation_get_proto_data(conversation, proto_wlan);
42121
      /* Use MLD MAC in EAPOL */
42122
0
      if (conversation_data && conversation_data->mld_set) {
42123
0
        bssid = conversation_data->ap_mld;
42124
0
        sta = conversation_data->sta_mld;
42125
0
      }
42126
0
  }
42127
42128
0
  memset(&eapol_parsed, 0, sizeof(eapol_parsed));
42129
0
  get_eapol_parsed(pinfo, &eapol_parsed, conversation_data);
42130
0
  eapol_parsed.msg_type = msg_type;
42131
42132
0
  Dot11DecryptScanEapolForKeys(&dot11decrypt_ctx,
42133
0
                               &eapol_parsed,
42134
0
                               eapol_key->data, eapol_key->len,
42135
0
                               bssid, sta);
42136
0
}
42137
42138
static void
42139
try_scan_ft_assoc_keys(packet_info *pinfo, const wlan_hdr_t *whdr)
42140
1.07k
{
42141
1.07k
  DOT11DECRYPT_ASSOC_PARSED assoc_parsed;
42142
1.07k
  uint8_t decrypted_buf[DOT11DECRYPT_WPA_PTK_MAX_LEN];
42143
1.07k
  size_t decrypted_len = 0;
42144
1.07k
  DOT11DECRYPT_KEY_ITEM used_key;
42145
1.07k
  int ret;
42146
42147
1.07k
  if (!enable_decryption || pinfo->fd->visited || !whdr) {
42148
0
    return;
42149
0
  }
42150
1.07k
  if (whdr->type != MGT_ASSOC_REQ && whdr->type != MGT_ASSOC_RESP &&
42151
1.07k
      whdr->type != MGT_REASSOC_REQ && whdr->type != MGT_REASSOC_RESP) {
42152
288
    return;
42153
288
  }
42154
42155
782
  memset(&assoc_parsed, 0, sizeof(assoc_parsed));
42156
782
  get_assoc_parsed(pinfo, &assoc_parsed);
42157
  /* Implicit conversion from MGT_ASSOC_xxx to DOT11DECRYPT_SUBTYPE_xxx */
42158
782
  assoc_parsed.frame_subtype = (uint8_t)whdr->type;
42159
782
  memcpy(assoc_parsed.bssid, whdr->bssid.data, 6);
42160
782
  memcpy(assoc_parsed.sa, whdr->src.data, 6);
42161
782
  memcpy(assoc_parsed.da, whdr->dst.data, 6);
42162
42163
782
  ret = Dot11DecryptScanFtAssocForKeys(&dot11decrypt_ctx, &assoc_parsed,
42164
782
                                       decrypted_buf, &decrypted_len,
42165
782
                                       &used_key);
42166
782
  if (ret == DOT11DECRYPT_RET_SUCCESS_HANDSHAKE && decrypted_len > 0) {
42167
0
    proto_keydata_t *proto = wmem_new(wmem_file_scope(), proto_keydata_t);
42168
0
    proto->used_key = used_key;
42169
0
    proto->keydata_len = (unsigned)decrypted_len;
42170
0
    proto->keydata = (uint8_t *)wmem_memdup(wmem_file_scope(), decrypted_buf, decrypted_len);
42171
42172
    /* Save decrypted GTK keydata for tag dissector */
42173
0
    p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, DECRYPTED_GTK_KEY, proto);
42174
0
  }
42175
782
}
42176
42177
/*
42178
 * In some cases we do not know the key mic len from other sources, however
42179
 * we can figure it out from the first frame in the four-way handshake.
42180
 *
42181
 * It defaults to 16 bytes, but if there are more than 16 bytes of zeros before
42182
 * the eapol data len, then we can adjust upwards. We used steps of 8 bytes
42183
 * because the MIC len is usually a multiple of 8 in length.
42184
 *
42185
 * If we find it, set it in the conversation data for the wlan conversation
42186
 * found via the pinfo.
42187
 */
42188
static void
42189
discover_key_mic_len1(tvbuff_t *tvb, packet_info *pinfo, unsigned offset)
42190
0
{
42191
0
  conversation_t *conversation = find_or_create_wlan_conversation(pinfo);
42192
0
  ieee80211_conversation_data_t *conversation_data = get_or_create_conversation_data(conversation);
42193
0
  uint16_t mic_len = 16;
42194
42195
  /*
42196
   * The first sixteen bytes at offset should 0. If not, get out of here
42197
   */
42198
0
  if (tvb_get_letoh64(tvb, offset) != 0 ||
42199
0
      tvb_get_letoh64(tvb, offset + 8) != 0) {
42200
0
    return;
42201
0
  }
42202
42203
0
  offset += 16;
42204
  /*
42205
   * Do we have another 8 bytes of zeros? But do not fall off the end!
42206
   */
42207
0
  while ((tvb_captured_length(tvb) > (offset + 8)) &&
42208
0
         tvb_get_letoh64(tvb, offset) == 0) {
42209
    /*
42210
     * equal to the rest of the data.
42211
     */
42212
0
    mic_len += 8;
42213
0
    offset += 8;
42214
42215
0
  }
42216
42217
  /*
42218
   * Do the next two bytes give us the length of the remainder?
42219
   */
42220
0
  if (tvb_get_uint16(tvb, offset, ENC_BIG_ENDIAN) + 2 ==
42221
0
      tvb_reported_length_remaining(tvb, offset)) {
42222
0
    conversation_data->discovered_key_mic_len = mic_len;
42223
0
  }
42224
0
}
42225
42226
/*
42227
 * Sometimes we cannot discover it from the first frame of the four-way
42228
 * handshake, however, we can still determine it from the second frame.
42229
 */
42230
static void
42231
discover_key_mic_len2(tvbuff_t *tvb, packet_info *pinfo, unsigned offset)
42232
0
{
42233
0
  conversation_t *conversation = find_or_create_wlan_conversation(pinfo);
42234
0
  ieee80211_conversation_data_t *conversation_data = get_or_create_conversation_data(conversation);
42235
0
  uint16_t mic_len = 16;
42236
42237
  /*
42238
   * The KeyMIC should have a 2-byte length field following it, and that
42239
   * should cover the rest of the captured data ...
42240
   */
42241
0
  offset += 16;
42242
42243
0
  while ((tvb_captured_length(tvb) > (offset + 2)) &&
42244
0
          tvb_get_uint16(tvb, offset, ENC_BIG_ENDIAN) !=
42245
0
            tvb_reported_length_remaining(tvb, offset + 2)) {
42246
42247
    /*
42248
     * Add 8 more bytes.
42249
     */
42250
0
    mic_len +=8;
42251
0
    offset+= 8;
42252
0
  }
42253
42254
  /*
42255
   * Check that we are correct ... ie, the two bytes where we are is the length
42256
   * of the remaining data, because we might have walked off the end of the
42257
   * tvb.
42258
   *
42259
   * We check against the reported length remaining because the capture might
42260
   * have been truncated beyond the key data length field.
42261
   */
42262
0
  if (tvb_captured_length_remaining(tvb, offset) >= 2 &&
42263
0
      tvb_get_uint16(tvb, offset, ENC_BIG_ENDIAN) + 2 ==
42264
0
        tvb_reported_length_remaining(tvb, offset)) {
42265
0
    conversation_data->discovered_key_mic_len = mic_len;
42266
0
  }
42267
0
}
42268
42269
static int
42270
dissect_wlan_rsna_eapol_wpa_or_rsn_key(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
42271
0
{
42272
0
  unsigned    offset = 0;
42273
0
  uint16_t    keyinfo;
42274
0
  uint16_t    eapol_data_len;
42275
0
  proto_tree *keydes_tree;
42276
0
  proto_tree *ti = NULL;
42277
0
  static int * const wlan_rsna_eapol_wpa_keydes_keyinfo[] = {
42278
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version,
42279
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type,
42280
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index,
42281
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install,
42282
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack,
42283
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic,
42284
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure,
42285
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error,
42286
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request,
42287
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data,
42288
0
    &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message,
42289
0
    NULL
42290
0
  };
42291
42292
0
  keyinfo = tvb_get_ntohs(tvb, offset);
42293
0
  conversation_t *conversation = find_wlan_conversation_pinfo(pinfo);
42294
  /* Use link address to get correct conversation in MLD case */
42295
0
  if (conversation == NULL) {
42296
0
    uint8_t *bssid = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, BSSID_KEY);
42297
0
    uint8_t *sta = (uint8_t *)p_get_proto_data(pinfo->pool, pinfo, proto_wlan, STA_KEY);
42298
    /* bssid and sta might not be present if this is Bluetooth AMP (removed
42299
     * in Bluetooth v5.3), because all data packets have ToDS and FromDS set.
42300
     * XXX - Decryption might not work properly with AMP as a result. */
42301
0
    if (bssid && sta) {
42302
0
      if (keyinfo & KEY_INFO_KEY_ACK_MASK) { /* From AP */
42303
0
            set_address(&pinfo->src, wlan_address_type, 6, bssid);
42304
0
            set_address(&pinfo->dst, wlan_address_type, 6, sta);
42305
42306
0
      } else {
42307
0
            set_address(&pinfo->src, wlan_address_type, 6, sta);
42308
0
            set_address(&pinfo->dst, wlan_address_type, 6, bssid);
42309
0
      }
42310
0
    }
42311
0
  }
42312
42313
0
  uint16_t eapol_data_offset = 76;  /* 92 - 16 */
42314
0
  bool has_nonce = determine_nonce_is_set(tvb);
42315
0
  bool defaulted_mic_len = false;
42316
0
  uint16_t eapol_key_mic_len = determine_mic_len(pinfo, false, &defaulted_mic_len);
42317
0
  save_proto_data_value(pinfo, eapol_key_mic_len, MIC_LEN_KEY);
42318
0
  eapol_data_offset += eapol_key_mic_len;
42319
0
  DOT11DECRYPT_HS_MSG_TYPE msg_type = DOT11DECRYPT_HS_MSG_TYPE_INVALID;
42320
42321
  /*
42322
   * RSNA key descriptors.
42323
   */
42324
0
  eapol_data_len = tvb_get_ntohs(tvb, offset+eapol_data_offset);
42325
0
  if (keyinfo & KEY_INFO_REQUEST_MASK) {
42326
0
    col_set_str(pinfo->cinfo, COL_INFO, "Key (Request)");
42327
0
    if (keyinfo & KEY_INFO_ERROR_MASK)
42328
0
      col_set_str(pinfo->cinfo, COL_INFO, "Key (Request, Error)");
42329
0
  } else if (keyinfo & KEY_INFO_KEY_TYPE_MASK) {
42330
0
    uint16_t masked;
42331
    /* Windows is setting the Secure Bit on message 2 when rekeying, so we'll ignore it */
42332
    /* When an AEAD cipher is used no MIC is included, so we cannot rely on the MIC flag */
42333
0
    masked = keyinfo &
42334
0
      (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK);
42335
42336
0
    switch (masked) {
42337
0
    case KEY_INFO_KEY_ACK_MASK:
42338
0
    {
42339
0
      ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 1);
42340
42341
0
      col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 1 of 4)");
42342
      /*
42343
       * If we defaulted it, then try to determine the mic len and update
42344
       * structures.
42345
       */
42346
0
      if (defaulted_mic_len) {
42347
0
        discover_key_mic_len1(tvb, pinfo, 76);
42348
        /* Must reset the MIC len */
42349
0
        eapol_key_mic_len = determine_mic_len(pinfo, false, &defaulted_mic_len);
42350
0
        save_proto_data_value(pinfo, eapol_key_mic_len, MIC_LEN_KEY);
42351
0
        eapol_data_offset = 76 + eapol_key_mic_len;
42352
0
        eapol_data_len = tvb_get_ntohs(tvb, offset + eapol_data_offset);
42353
0
      }
42354
0
      msg_type = DOT11DECRYPT_HS_MSG_TYPE_4WHS_1;
42355
0
      break;
42356
0
    }
42357
42358
0
    case (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK):
42359
0
    {
42360
0
      ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 3);
42361
42362
0
      col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 3 of 4)");
42363
      /* Get correct MIC LEN if there is no M1 and M2 */
42364
0
      if (defaulted_mic_len) {
42365
0
        discover_key_mic_len2(tvb, pinfo, 76);
42366
0
        eapol_key_mic_len = determine_mic_len(pinfo, false, &defaulted_mic_len);
42367
0
        save_proto_data_value(pinfo, eapol_key_mic_len, MIC_LEN_KEY);
42368
0
        eapol_data_offset = 76 + eapol_key_mic_len;
42369
0
        eapol_data_len = tvb_get_ntohs(tvb, offset + eapol_data_offset);
42370
0
      }
42371
0
      msg_type = DOT11DECRYPT_HS_MSG_TYPE_4WHS_3;
42372
0
      break;
42373
0
    }
42374
42375
0
    default:
42376
      /* We check the key length to differentiate between message 2 and 4 and just hope that
42377
      there are no strange implementations with key data and non-zero key length in message 4.
42378
      According to the IEEE specification, sections 11.6.6.3 and 11.6.6.5 we should
42379
      use the Secure Bit and/or the Nonce, but there are implementations ignoring the spec.
42380
      The Secure Bit is incorrectly set on rekeys for Windows clients for Message 2 and the Nonce is non-zero
42381
      in Message 4 in Bug 11994 (Apple?) */
42382
      /* In Wi-SUN protocol, message 2 does not contains any data. However, all the implementations
42383
       * respect 802.11X, so Secure Bit is set only on message 2 and Nonce is set only on message 4
42384
       * (see section 6.5.2.3 of Wi-SUN specification) */
42385
      /* When using AES-SIV without plaintext (i.e. only for integrity), the ciphertext has length 16 */
42386
      /* With MLO message 4 will have 12 bytes of data */
42387
0
      if (((eapol_key_mic_len == 0) && (eapol_data_len > 16)) ||
42388
0
          ((eapol_key_mic_len > 0) && (eapol_data_len == 0) && !(keyinfo & KEY_INFO_SECURE_MASK) && has_nonce) ||
42389
0
          ((eapol_key_mic_len > 0) && (eapol_data_len != 0) && (eapol_data_len != 12))) {
42390
0
        ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 2);
42391
42392
0
        col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 2 of 4)");
42393
0
        if (defaulted_mic_len) {
42394
0
          discover_key_mic_len2(tvb, pinfo, 76);
42395
0
          eapol_key_mic_len = determine_mic_len(pinfo, false, &defaulted_mic_len);
42396
0
          save_proto_data_value(pinfo, eapol_key_mic_len, MIC_LEN_KEY);
42397
0
          eapol_data_offset = 76 + eapol_key_mic_len;
42398
0
          eapol_data_len = tvb_get_ntohs(tvb, offset + eapol_data_offset);
42399
0
        }
42400
0
        msg_type = DOT11DECRYPT_HS_MSG_TYPE_4WHS_2;
42401
0
      } else {
42402
0
        ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 4);
42403
42404
0
        col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 4 of 4)");
42405
0
        msg_type = DOT11DECRYPT_HS_MSG_TYPE_4WHS_4;
42406
0
      }
42407
0
      break;
42408
0
    }
42409
0
  } else {
42410
0
    if (keyinfo & KEY_INFO_KEY_ACK_MASK) {
42411
0
      ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 1);
42412
42413
0
      col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 1 of 2)");
42414
0
      msg_type = DOT11DECRYPT_HS_MSG_TYPE_GHS_1;
42415
0
    } else {
42416
0
      ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 2);
42417
42418
0
      col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 2 of 2)");
42419
0
      msg_type = DOT11DECRYPT_HS_MSG_TYPE_GHS_2;
42420
0
    }
42421
0
  }
42422
0
  proto_item_set_generated(ti);
42423
42424
0
  uint16_t keydes_version = tvb_get_ntohs(tvb, offset) & KEY_INFO_KEYDES_VERSION_MASK;
42425
0
  save_proto_data_value(pinfo, keydes_version, KEY_VERSION_KEY);
42426
0
  proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_wlan_rsna_eapol_wpa_keydes_keyinfo,
42427
0
                                    ett_keyinfo, wlan_rsna_eapol_wpa_keydes_keyinfo,
42428
0
                                    ENC_BIG_ENDIAN, BMT_NO_APPEND);
42429
0
  offset += 2;
42430
42431
0
  uint16_t key_len = tvb_get_ntohs(tvb, offset);
42432
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_key_len, tvb, offset,
42433
0
                      2, ENC_BIG_ENDIAN);
42434
0
  save_proto_data_value(pinfo, tvb_get_ntohs(tvb, offset), KEY_LEN_KEY);
42435
0
  offset += 2;
42436
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_replay_counter, tvb,
42437
0
                      offset, 8, ENC_BIG_ENDIAN);
42438
0
  offset += 8;
42439
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_nonce, tvb, offset,
42440
0
                      32, ENC_NA);
42441
0
  save_proto_data(tvb, pinfo, offset, 32, NONCE_KEY);
42442
42443
0
  offset += 32;
42444
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_key_iv, tvb,
42445
0
                      offset, 16, ENC_NA);
42446
0
  save_proto_data(tvb, pinfo, offset, 16, KEY_IV_KEY);
42447
0
  offset += 16;
42448
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_rsc, tvb, offset,
42449
0
                      8, ENC_NA);
42450
0
  offset += 8;
42451
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_id, tvb, offset, 8,
42452
0
                      ENC_NA);
42453
0
  offset += 8;
42454
42455
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_mic, tvb, offset,
42456
0
                      eapol_key_mic_len, ENC_NA);
42457
0
  save_proto_data(tvb, pinfo, offset, eapol_key_mic_len, MIC_KEY);
42458
0
  offset += eapol_key_mic_len;
42459
42460
0
  proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_data_len, tvb,
42461
0
                      offset, 2, ENC_BIG_ENDIAN);
42462
0
  save_proto_data_value(pinfo, tvb_get_ntohs(tvb, offset), KEY_DATA_LEN_KEY);
42463
0
  offset += 2;
42464
42465
0
  if (eapol_data_len != 0) {
42466
0
    save_proto_data(tvb, pinfo, offset, eapol_data_len, KEY_DATA_KEY);
42467
0
    ti = proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_data,
42468
0
                             tvb, offset, eapol_data_len, ENC_NA);
42469
0
    if ((keyinfo & KEY_INFO_ENCRYPTED_KEY_DATA_MASK) ||
42470
0
        (!(keyinfo & KEY_INFO_KEY_TYPE_MASK) && key_len)) {
42471
      /* RSN: EAPOL-Key Key Data is encrypted.
42472
       * WPA: Group Keys use encrypted Key Data.
42473
       * IEEE 802.11i-2004 8.5.2.
42474
       * Having an encrypted data field without the Encrypted Key Data set
42475
       * is not standard, but there are WPA implementation which assume
42476
       * encryption when Key Type = 0. In Wi-SUN, the EAPOL-Key frame has
42477
       * Key Type = 0 and Encrypted Key Data = 0, but the Key Data is not
42478
       * encrypted. To differentiate this case from non standard WPA, we
42479
       * check the Key Length, which is 0 for Wi-SUN.
42480
       * Let decryption engine try to decrypt this and if successful it's
42481
       * stored in EAPOL_KEY proto data.
42482
       */
42483
0
      if (!pinfo->fd->visited) {
42484
0
        try_decrypt_keydata(pinfo);
42485
0
      }
42486
42487
0
      proto_keydata_t *eapol;
42488
0
      eapol = (proto_keydata_t*)
42489
0
        p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, DECRYPTED_EAPOL_KEY);
42490
42491
0
      if (eapol) {
42492
0
        int keydata_len = eapol->keydata_len;
42493
0
        tvbuff_t *next_tvb = tvb_new_child_real_data(tvb, eapol->keydata,
42494
0
                                                     keydata_len, keydata_len);
42495
0
        keydes_tree = proto_item_add_subtree(ti, ett_wlan_rsna_eapol_keydes_data);
42496
42497
0
        if (keydes_version == KEYDES_VER_TYPE1) {
42498
0
          add_new_data_source(pinfo, next_tvb, "Decrypted RC4 keydata");
42499
0
          save_proto_data(next_tvb, pinfo, 0, keydata_len, GTK_KEY);
42500
0
          save_proto_data_value(pinfo, keydata_len, GTK_LEN_KEY);
42501
0
        } else {
42502
0
          add_new_data_source(pinfo, next_tvb, "Decrypted AES keydata");
42503
0
          int padding_len = keydata_padding_len(next_tvb);
42504
0
          ieee_80211_add_tagged_parameters(next_tvb, 0, pinfo, keydes_tree,
42505
0
                                          keydata_len - padding_len,
42506
0
                                          -1, NULL);
42507
0
          if (padding_len) {
42508
0
            proto_tree_add_item(keydes_tree, hf_wlan_rsna_eapol_wpa_keydes_padding,
42509
0
                                next_tvb, keydata_len - padding_len,
42510
0
                                padding_len, ENC_NA);
42511
0
          }
42512
0
        }
42513
        /* Also add the PTK used to decrypt and validate the keydata. */
42514
0
        add_ptk_analysis(tvb, keydes_tree, &eapol->used_key);
42515
0
      }
42516
0
    } else {
42517
0
      keydes_tree = proto_item_add_subtree(ti, ett_wlan_rsna_eapol_keydes_data);
42518
0
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, keydes_tree,
42519
0
                                       tvb_reported_length_remaining(tvb, offset),
42520
0
                                       -1, NULL);
42521
0
    }
42522
42523
0
    offset += eapol_data_len;
42524
0
  }
42525
0
  if (!pinfo->fd->visited && msg_type != DOT11DECRYPT_HS_MSG_TYPE_INVALID) {
42526
    /* Key data at this pointer was either not encrypted or dot11decrypt
42527
     * engine has tried to decrypt keydata. Try to extract the keys now that
42528
     * all fields from the EAPOL frame have been parsed.
42529
     */
42530
0
    try_scan_eapol_keys(pinfo, msg_type);
42531
0
  }
42532
42533
  /*
42534
   * Do we have extraneous data at the end?
42535
   */
42536
0
  if (offset < (tvb_captured_length(tvb) - 1)) {
42537
0
    proto_item *extra;
42538
0
    extra = proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_extraneous, tvb,
42539
0
                                offset,
42540
0
                                tvb_captured_length_remaining(tvb, offset),
42541
0
                                ENC_NA);
42542
0
    expert_add_info_format(pinfo, extra, &ei_ieee80211_inv_val,
42543
0
                           "Extraneous and invalid data in EAPOL frame");
42544
0
  }
42545
0
  return tvb_captured_length(tvb);
42546
0
}
42547
42548
static void try_scan_tdls_keys(tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
42549
51
{
42550
51
  if (!enable_decryption) {
42551
0
    return;
42552
0
  }
42553
51
  int len = tvb_captured_length(tvb) - offset;
42554
51
  const uint8_t *action = tvb_get_ptr(tvb, offset, len);
42555
51
  if (action) {
42556
51
    Dot11DecryptScanTdlsForKeys(&dot11decrypt_ctx, action, len);
42557
51
  }
42558
51
}
42559
42560
/* It returns the algorithm used for decryption and trailer length. */
42561
static tvbuff_t *
42562
try_decrypt(tvbuff_t *tvb, packet_info *pinfo, unsigned offset, unsigned len,
42563
            uint8_t *algorithm, uint32_t *sec_trailer,
42564
            PDOT11DECRYPT_KEY_ITEM used_key)
42565
272
{
42566
272
  const uint8_t     *enc_data;
42567
272
  tvbuff_t          *decr_tvb = NULL;
42568
272
  uint32_t           dec_caplen;
42569
272
  unsigned char      dec_data[DOT11DECRYPT_MAX_CAPLEN];
42570
42571
272
  if (!enable_decryption)
42572
0
    return NULL;
42573
42574
  /* get the entire packet                                  */
42575
272
  enc_data = tvb_get_ptr(tvb, 0, len+offset);
42576
42577
  /* decrypt packet with Dot11Decrypt */
42578
272
  int ret = Dot11DecryptDecryptPacket(&dot11decrypt_ctx, enc_data, offset, offset+len,
42579
272
                                       dec_data, &dec_caplen, used_key);
42580
272
  if (ret == DOT11DECRYPT_RET_SUCCESS) {
42581
0
    uint8_t *tmp;
42582
0
    *algorithm=used_key->KeyType;
42583
0
    switch (*algorithm) {
42584
0
      case DOT11DECRYPT_KEY_TYPE_WEP:
42585
0
        *sec_trailer=DOT11DECRYPT_WEP_TRAILER;
42586
0
        break;
42587
0
      case DOT11DECRYPT_KEY_TYPE_CCMP:
42588
0
        *sec_trailer=DOT11DECRYPT_CCMP_TRAILER;
42589
0
        break;
42590
0
      case DOT11DECRYPT_KEY_TYPE_CCMP_256:
42591
0
        *sec_trailer = DOT11DECRYPT_CCMP_256_TRAILER;
42592
0
        break;
42593
0
      case DOT11DECRYPT_KEY_TYPE_GCMP:
42594
0
      case DOT11DECRYPT_KEY_TYPE_GCMP_256:
42595
0
        *sec_trailer = DOT11DECRYPT_GCMP_TRAILER;
42596
0
        break;
42597
0
      case DOT11DECRYPT_KEY_TYPE_TKIP:
42598
0
        *sec_trailer=DOT11DECRYPT_TKIP_TRAILER;
42599
0
        break;
42600
0
      default:
42601
0
        return NULL;
42602
0
    }
42603
0
    if (dec_caplen > offset) {
42604
        /* allocate buffer for decrypted payload */
42605
0
        tmp = (uint8_t *)wmem_memdup(pinfo->pool, dec_data+offset, dec_caplen-offset);
42606
0
        len = dec_caplen-offset;
42607
42608
        /* decrypt successful, let's set up a new data tvb. */
42609
0
        decr_tvb = tvb_new_child_real_data(tvb, tmp, len, len);
42610
0
    }
42611
0
  }
42612
272
  return decr_tvb;
42613
272
}
42614
42615
/* Collect our WEP and WPA keys */
42616
static void
42617
set_dot11decrypt_keys(void)
42618
28
{
42619
28
  unsigned                  i;
42620
28
  DOT11DECRYPT_KEYS_COLLECTION  *keys = g_new(DOT11DECRYPT_KEYS_COLLECTION, 1);
42621
42622
28
  keys->nKeys = 0;
42623
42624
28
  for (i = 0; (uat_wep_key_records != NULL) && (i < num_wepkeys_uat) && (i < MAX_ENCRYPTION_KEYS); i++)
42625
0
  {
42626
0
    decryption_key_t *dk;
42627
0
    dk = parse_key_string(uat_wep_key_records[i].string, uat_wep_key_records[i].key, NULL);
42628
42629
0
    if (dk != NULL)
42630
0
    {
42631
      /* parse_key_string() does vaildation, so if it doesn't
42632
       * return NULL, we can just copy the results.
42633
       */
42634
0
      DOT11DECRYPT_KEY_ITEM key = { 0 };
42635
0
      if (dk->type == DOT11DECRYPT_KEY_TYPE_WEP)
42636
0
      {
42637
0
        key.KeyType = DOT11DECRYPT_KEY_TYPE_WEP;
42638
42639
        /*
42640
         * WEP key is correct (well, at least no longer than
42641
         * DOT11DECRYPT_WEP_KEY_MAXLEN)
42642
         */
42643
0
        memcpy(key.KeyData.Wep.WepKey, dk->key->data, dk->key->len);
42644
0
        key.KeyData.Wep.WepKeyLen = dk->key->len;
42645
0
        keys->Keys[keys->nKeys] = key;
42646
0
        keys->nKeys += 1;
42647
0
      }
42648
0
      else if (dk->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
42649
0
      {
42650
0
        key.KeyType = DOT11DECRYPT_KEY_TYPE_WPA_PWD;
42651
42652
        /*
42653
         * dk->key has a valid length, because otherwise
42654
         * parse_key_string() would have returned NULL.
42655
         */
42656
0
        memcpy(key.UserPwd.Passphrase, dk->key->data, dk->key->len);
42657
0
        key.UserPwd.PassphraseLen = dk->key->len;
42658
42659
0
        key.UserPwd.SsidLen = 0;
42660
0
        if ((dk->ssid != NULL) && (dk->ssid->len <= DOT11DECRYPT_WPA_SSID_MAX_LEN))
42661
0
        {
42662
0
          memcpy(key.UserPwd.Ssid, dk->ssid->data, dk->ssid->len);
42663
0
          key.UserPwd.SsidLen = dk->ssid->len;
42664
0
        }
42665
42666
0
        keys->Keys[keys->nKeys] = key;
42667
0
        keys->nKeys += 1;
42668
0
      }
42669
0
      else if (dk->type == DOT11DECRYPT_KEY_TYPE_WPA_PSK)
42670
0
      {
42671
0
        key.KeyType = DOT11DECRYPT_KEY_TYPE_WPA_PSK;
42672
42673
0
        memcpy(key.KeyData.Wpa.Psk, dk->key->data, dk->key->len);
42674
0
        key.KeyData.Wpa.PskLen = dk->key->len;
42675
0
        keys->Keys[keys->nKeys] = key;
42676
0
        keys->nKeys += 1;
42677
0
      }
42678
0
      else if (dk->type == DOT11DECRYPT_KEY_TYPE_TK)
42679
0
      {
42680
0
        key.KeyType = DOT11DECRYPT_KEY_TYPE_TK;
42681
42682
0
        memcpy(key.Tk.Tk, dk->key->data, dk->key->len);
42683
0
        key.Tk.Len = dk->key->len;
42684
0
        keys->Keys[keys->nKeys] = key;
42685
0
        keys->nKeys += 1;
42686
0
      }
42687
0
      else if (dk->type == DOT11DECRYPT_KEY_TYPE_MSK)
42688
0
      {
42689
0
        key.KeyType = DOT11DECRYPT_KEY_TYPE_MSK;
42690
42691
0
        memcpy(key.Msk.Msk, dk->key->data, dk->key->len);
42692
0
        key.Msk.Len = dk->key->len;
42693
0
        keys->Keys[keys->nKeys] = key;
42694
0
        keys->nKeys += 1;
42695
0
      }
42696
0
      free_key_string(dk);
42697
0
    }
42698
0
  }
42699
42700
  /* Now set the keys */
42701
28
  Dot11DecryptSetKeys(&dot11decrypt_ctx, keys->Keys, keys->nKeys);
42702
28
  g_free(keys);
42703
28
}
42704
42705
static void
42706
init_wepkeys(void)
42707
28
{
42708
42709
  /*
42710
   * XXX - Dot11Decrypt - That God sends it to us beautiful (che dio ce la mandi bona)
42711
   * The next lines will add a key to the Dot11Decrypt context. The keystring will be added
42712
   * to the old WEP array too, but we don't care, because the packets will come here
42713
   * already decrypted... One of these days we will fix this too
42714
   */
42715
28
  set_dot11decrypt_keys();
42716
28
}
42717
42718
/*
42719
 * This code had been taken from AirSnort crack.c function classify()
42720
 * Permission granted by snax <at> shmoo dot com
42721
 * weak_iv - determine which key byte an iv is useful in resolving
42722
 * parm     - p, pointer to the first byte of an IV
42723
 * return   -  n - this IV is weak for byte n of a WEP key
42724
 *            -1 - this IV is not weak for any key bytes
42725
 *
42726
 * This function tests for IVs that are known to satisfy the criteria
42727
 * for a weak IV as specified in FMS section 7.1
42728
 *
42729
 */
42730
static int
42731
weak_iv(unsigned char *iv)
42732
161
{
42733
161
  unsigned char sum, k;
42734
42735
161
  if ((iv[1] == 255) && (iv[0] > 2) && (iv[0] < 16)) {
42736
2
    return iv[0] -3;
42737
2
  }
42738
42739
159
  sum = iv[0] + iv[1];
42740
159
  if (sum == 1) {
42741
10
    if (iv[2] <= 0x0a) {
42742
3
      return iv[2] +2;
42743
3
    }
42744
7
    else if (iv[2] == 0xff) {
42745
4
      return 0;
42746
4
    }
42747
10
  }
42748
152
  k = 0xfe - iv[2];
42749
152
  if ((sum == k)  && ((iv[2] >= 0xf2) && (iv[2] <= 0xfe) && (iv[2] != 0xfd))) {
42750
1
    return k;
42751
1
  }
42752
151
  return -1;
42753
152
}
42754
42755
static void
42756
wlan_retransmit_init(void)
42757
14
{
42758
14
  if (fc_analyse_retransmit_table) {
42759
0
    g_hash_table_destroy(fc_analyse_retransmit_table);
42760
0
    fc_analyse_retransmit_table = NULL;
42761
0
  }
42762
42763
14
  if (fc_first_frame_table) {
42764
0
    g_hash_table_destroy(fc_first_frame_table);
42765
0
    fc_first_frame_table = NULL;
42766
0
  }
42767
42768
14
  if (wlan_subdissector)
42769
14
    return;
42770
42771
0
  fc_analyse_retransmit_table= g_hash_table_new(retransmit_hash, retransmit_equal);
42772
0
  fc_first_frame_table = g_hash_table_new(frame_hash, frame_equal);
42773
42774
0
}
42775
42776
static int
42777
dissect_data_encap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
42778
403
{
42779
403
  int         offset = 0;
42780
403
  uint8_t     type;
42781
403
  int         tagged_parameter_tree_len;
42782
403
  proto_tree *tagged_tree;
42783
42784
403
  type = tvb_get_uint8(tvb, offset);
42785
403
  proto_tree_add_item(tree, hf_ieee80211_data_encap_payload_type, tvb, offset,
42786
403
                      1, ENC_LITTLE_ENDIAN);
42787
403
  offset += 1;
42788
403
  switch (type) {
42789
2
  case 1:
42790
2
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "RRB");
42791
    /* TODO: IEEE 802.11r */
42792
2
    break;
42793
398
  case 2:
42794
398
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "TDLS");
42795
398
    col_clear(pinfo->cinfo, COL_INFO);
42796
398
    offset += add_ff_action(tree, tvb, pinfo, offset, NULL);
42797
398
    tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
42798
398
    if (tagged_parameter_tree_len > 0) {
42799
233
      tagged_tree = get_tagged_parameter_tree(tree, tvb, offset,
42800
233
                                              tagged_parameter_tree_len);
42801
233
      ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
42802
233
                                       tagged_parameter_tree_len, -1, NULL);
42803
233
    }
42804
398
    break;
42805
403
  }
42806
114
  return tvb_captured_length(tvb);
42807
403
}
42808
42809
void
42810
proto_register_ieee80211(void)
42811
14
{
42812
42813
14
  static hf_register_info hf[] = {
42814
14
    {&hf_ieee80211_fc_field,
42815
14
     {"Frame Control Field", "wlan.fc",
42816
14
      FT_UINT16, BASE_HEX, NULL, 0,
42817
14
      "MAC Frame control", HFILL }},
42818
42819
14
    {&hf_ieee80211_fc_proto_version,
42820
14
     {"Version", "wlan.fc.version",
42821
14
      FT_UINT8, BASE_DEC, NULL, 0x03,
42822
14
      "MAC Protocol version", HFILL }},  /* 0 */
42823
42824
14
    {&hf_ieee80211_fc_frame_type,
42825
14
     {"Type", "wlan.fc.type",
42826
14
      FT_UINT8, BASE_DEC, VALS(frame_type), 0x0C,
42827
14
      "Frame type", HFILL }},
42828
42829
14
    {&hf_ieee80211_fc_frame_subtype,
42830
14
     {"Subtype", "wlan.fc.subtype",
42831
14
      FT_UINT8, BASE_DEC, NULL, 0xF0,
42832
14
      "Frame subtype", HFILL }},  /* 2 */
42833
42834
14
    {&hf_ieee80211_fc_frame_type_subtype,
42835
14
     {"Type/Subtype", "wlan.fc.type_subtype",
42836
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &frame_type_subtype_vals_ext, 0x0,
42837
14
      "Type and subtype combined (as bytes (for Control Frame Extension subtypes) or nibbles)", HFILL }},
42838
42839
14
    {&hf_ieee80211_fc_frame_extension,
42840
14
     {"Control Frame Extension", "wlan.fc.extension",
42841
14
      FT_UINT8, BASE_DEC, NULL, 0,
42842
14
      NULL, HFILL }},
42843
42844
14
    {&hf_ieee80211_fc_flags,
42845
14
     {"Flags", "wlan.flags",
42846
14
      FT_UINT8, BASE_HEX, NULL, 0,
42847
14
      NULL, HFILL }},
42848
42849
14
    {&hf_ieee80211_fc_flags_str,
42850
14
     {"WLAN Flags", "wlan.flags.str",
42851
14
      FT_STRING, BASE_NONE, NULL, 0,
42852
14
      NULL, HFILL }},
42853
42854
14
    {&hf_ieee80211_fc_data_ds,
42855
14
     {"DS status", "wlan.fc.ds",
42856
14
      FT_UINT8, BASE_HEX, VALS(tofrom_ds), (FLAG_FROM_DS|FLAG_TO_DS),
42857
14
      "Data-frame DS-traversal status", HFILL }},  /* 3 */
42858
42859
14
    {&hf_ieee80211_fc_to_ds,
42860
14
     {"To DS", "wlan.fc.tods",
42861
14
      FT_BOOLEAN, 8, TFS(&tods_flag), FLAG_TO_DS,
42862
14
      "To DS flag", HFILL }},    /* 4 */
42863
42864
14
    {&hf_ieee80211_fc_from_ds,
42865
14
     {"From DS", "wlan.fc.fromds",
42866
14
      FT_BOOLEAN, 8, TFS(&fromds_flag), FLAG_FROM_DS,
42867
14
      "From DS flag", HFILL }},    /* 5 */
42868
42869
14
    {&hf_ieee80211_fc_more_frag,
42870
14
     {"More Fragments", "wlan.fc.frag",
42871
14
      FT_BOOLEAN, 8, TFS(&more_fragments), FLAG_MORE_FRAGMENTS,
42872
14
      "More Fragments flag", HFILL }},  /* 6 */
42873
42874
14
    {&hf_ieee80211_fc_retry,
42875
14
     {"Retry", "wlan.fc.retry",
42876
14
      FT_BOOLEAN, 8, TFS(&retry_flags), FLAG_RETRY,
42877
14
      "Retransmission flag", HFILL }},
42878
42879
14
    {&hf_ieee80211_fc_analysis_retransmission,
42880
14
     {"Retransmission", "wlan.analysis.retransmission",
42881
14
      FT_NONE, BASE_NONE, NULL, 0x0,
42882
14
      "This frame is a suspected wireless retransmission", HFILL }},
42883
42884
14
    {&hf_ieee80211_fc_analysis_retransmission_frame,
42885
14
     {"Retransmission of frame", "wlan.analysis.retransmission_frame",
42886
14
      FT_FRAMENUM, BASE_NONE, NULL, 0x0,
42887
14
      "This is a retransmission of frame #", HFILL }},
42888
42889
14
    {&hf_ieee80211_fc_pwr_mgt,
42890
14
     {"PWR MGT", "wlan.fc.pwrmgt",
42891
14
      FT_BOOLEAN, 8, TFS(&pm_flags), FLAG_POWER_MGT,
42892
14
      "Power management status", HFILL }},
42893
42894
14
    {&hf_ieee80211_fc_more_data,
42895
14
     {"More Data", "wlan.fc.moredata",
42896
14
      FT_BOOLEAN, 8, TFS(&md_flags), FLAG_MORE_DATA,
42897
14
      "More data flag", HFILL }},
42898
42899
14
    {&hf_ieee80211_fc_protected,
42900
14
     {"Protected flag", "wlan.fc.protected",
42901
14
      FT_BOOLEAN, 8, TFS(&protected_flags), FLAG_PROTECTED,
42902
14
      NULL, HFILL }},
42903
42904
14
    {&hf_ieee80211_fc_order,
42905
14
     {"+HTC/Order flag", "wlan.fc.order",
42906
14
      FT_BOOLEAN, 8, TFS(&order_flags), FLAG_ORDER,
42907
14
      "HT Control present/strictly ordered flag", HFILL }},
42908
42909
14
   {&hf_ieee80211_fc_s1g_bw_indication,
42910
14
     {"Bandwidth Indication", "wlan.fc.control.bandwidth_indication",
42911
14
      FT_UINT8, BASE_DEC, VALS(pv1_bandwidth_indic_vals),
42912
14
      0x07, NULL, HFILL }},
42913
42914
14
   {&hf_ieee80211_fc_s1g_dynamic_indication,
42915
14
     {"Dynamic Indication", "wlan.fc.control.dynamic_indication",
42916
14
      FT_BOOLEAN, 8, TFS(&s1g_dynamic_indication_flags), FLAG_RETRY,
42917
14
      "Static/dynamic bandwidth negotiation", HFILL }},
42918
42919
14
    {&hf_ieee80211_fc_pv1_proto_version,
42920
14
     {"Version", "wlan.fc.version",
42921
14
      FT_UINT16, BASE_HEX, NULL, 0x0003, NULL, HFILL }},
42922
42923
14
    {&hf_ieee80211_fc_pv1_type,
42924
14
     {"Type", "wlan.fc.type",
42925
14
      FT_UINT16, BASE_HEX, VALS(pv1_frame_type_vals), 0x001C, NULL, HFILL }},
42926
42927
14
    {&hf_ieee80211_fc_pv1_ptid,
42928
14
     {"PTID", "wlan.fc.ptid",
42929
14
      FT_UINT16, BASE_HEX, NULL, 0x00E0, NULL, HFILL }},
42930
42931
14
    {&hf_ieee80211_fc_pv1_mgmt_subtype,
42932
14
     {"Subtype", "wlan.fc.subtype",
42933
14
      FT_UINT16, BASE_HEX, VALS(pv1_management_frame_type_vals),
42934
14
      0x00E0, NULL, HFILL }},
42935
42936
14
    {&hf_ieee80211_fc_pv1_cntl_subtype,
42937
14
     {"Subtype", "wlan.fc.subtype",
42938
14
      FT_UINT16, BASE_HEX, VALS(pv1_control_frame_type_vals),
42939
14
      0x00E0, NULL, HFILL }},
42940
42941
14
    {&hf_ieee80211_fc_pv1_unk_field,
42942
14
     {"Unknown Subtype", "wlan.fc.unknown_subtype",
42943
14
      FT_UINT16, BASE_HEX, NULL, 0x00E0, NULL, HFILL }},
42944
42945
14
    {&hf_ieee80211_fc_pv1_bw_indication,
42946
14
     {"Bandwidth Indication", "wlan.fc.control.bandwidth_indication",
42947
14
      FT_UINT16, BASE_DEC, VALS(pv1_bandwidth_indic_vals),
42948
14
      0x0700, NULL, HFILL }},
42949
42950
14
    {&hf_ieee80211_fc_pv1_dynamic_indication,
42951
14
     {"Dynamic Indication", "wlan.fc.control.dynamic_indication",
42952
14
      FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL }},
42953
42954
14
    {&hf_ieee80211_fc_pv1_cntl_power_mgmt,
42955
14
     {"Power Management", "wlan.fc.control.power_management",
42956
14
      FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL }},
42957
42958
14
    {&hf_ieee80211_fc_pv1_cntl_more_data,
42959
14
     {"More Data", "wlan.fc.control.more_data",
42960
14
      FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL }},
42961
42962
14
    {&hf_ieee80211_fc_pv1_cntl_flow_control,
42963
14
     {"Flow Control", "wlan.fc.control.flow_control",
42964
14
      FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL }},
42965
42966
14
    {&hf_ieee80211_fc_pv1_cntl_next_twt_info,
42967
14
     {"Next TWT Info Present", "wlan.fc.control.next_twt_info_present",
42968
14
      FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
42969
42970
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_next_tbt,
42971
14
     {"Next TBTT Present", "wlan.fc.mgmt.next_tbtt_present",
42972
14
      FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL }},
42973
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_full_ssid,
42974
14
     {"Full SSID Present", "wlan.fc.mgmt.full_ssid_present",
42975
14
      FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL }},
42976
42977
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_ano,
42978
14
     {"AMO Present", "wlan.fc.mgmt.amo_present",
42979
14
      FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL }},
42980
42981
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_bss_bw,
42982
14
     {"BSS BW", "wlan.fc.mgmt.bss_bw",
42983
14
      FT_UINT16, BASE_DEC, NULL, 0x3800, NULL, HFILL }},
42984
42985
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_security,
42986
14
     {"Security", "wlan.fc.mgmt.security",
42987
14
      FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL }},
42988
42989
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_1mhz_pc,
42990
14
     {"1MHz Primary Channel Location",
42991
14
      "wlan.fc.mgmt.1mhz_primary_channel_location",
42992
14
      FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
42993
42994
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_slot_assign,
42995
14
     {"Slot Assignment Mode", "wlan.fc.mgmt.slot_assignment_mode",
42996
14
      FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL }},
42997
42998
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_more_frag,
42999
14
     {"More Fragments", "wlan.fc.mgmt.more_fragments",
43000
14
      FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL }},
43001
43002
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_pwr_mgmt,
43003
14
     {"Power Management", "wlan.fc.mgmt.power_management",
43004
14
      FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL }},
43005
43006
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_grp_indic,
43007
14
     {"Group Indication", "wlan.fc.mgmt.group_indication",
43008
14
      FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL }},
43009
43010
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_protected,
43011
14
     {"Protected Frame", "wlan.fc.mgmt.protected_frame",
43012
14
      FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL }},
43013
43014
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_end_of_svc,
43015
14
     {"End of Service Period", "wlan.fc.mgmt.end_of_service_period",
43016
14
      FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL }},
43017
43018
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_relayed_frm,
43019
14
     {"Relayed Frame", "wlan.fc.mgmt.relayed_frame",
43020
14
      FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL }},
43021
43022
14
    {&hf_ieee80211_fc_pv1_mgmt_pr_ack_policy,
43023
14
     {"Ack Policy", "wlan.fc.mgmt.ack_policy",
43024
14
      FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
43025
43026
14
    {&hf_ieee80211_fc_pv1_from_ds,
43027
14
     {"From DS", "wlan.fc.from_ds",
43028
14
      FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL }},
43029
43030
14
    {&hf_ieee80211_fc_pv1_more_fragments,
43031
14
     {"More Fragments", "wlan.fc.more_fragments",
43032
14
      FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL }},
43033
43034
14
    {&hf_ieee80211_fc_pv1_power_mgmt,
43035
14
     {"Power Management", "wlan.fc.power_management",
43036
14
      FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL }},
43037
43038
14
    {&hf_ieee80211_fc_pv1_more_data,
43039
14
     {"More Data", "wlan.fc.more_data",
43040
14
      FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL }},
43041
43042
14
    {&hf_ieee80211_fc_pv1_protected_frame,
43043
14
     {"Protected Frame", "wlan.fc.protected_frame",
43044
14
      FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL }},
43045
43046
14
    {&hf_ieee80211_fc_pv1_end_service_per,
43047
14
     {"End of Service Period", "wlan.fc.end_of_service_period",
43048
14
      FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL }},
43049
43050
14
    {&hf_ieee80211_fc_pv1_relayed_frame,
43051
14
     {"Relayed Frame", "wlan.fc.relayed_frame",
43052
14
      FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL }},
43053
43054
14
    {&hf_ieee80211_fc_pv1_ack_policy,
43055
14
     {"Ack Policy", "wlan.fc.ack_policy",
43056
14
      FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
43057
43058
14
    {&hf_ieee80211_pv1_sid,
43059
14
     {"SID", "wlan.fc.sid",
43060
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
43061
43062
14
    {&hf_ieee80211_pv1_sid_association_id,
43063
14
     {"Association ID", "wlan.fc.sid.association_id",
43064
14
      FT_UINT16, BASE_HEX, NULL, SID_AID_MASK, NULL, HFILL }},
43065
43066
14
    {&hf_ieee80211_pv1_sid_a3_present,
43067
14
     {"A3 Present", "wlan.fc.sid.a3_present",
43068
14
      FT_BOOLEAN, 16, NULL, SID_A3_PRESENT, NULL, HFILL }},
43069
43070
14
    {&hf_ieee80211_pv1_sid_a4_present,
43071
14
     {"A4 Present", "wlan.fc.sid.a4_present",
43072
14
      FT_BOOLEAN, 16, NULL, SID_A4_PRESENT, NULL, HFILL }},
43073
43074
14
    {&hf_ieee80211_pv1_sid_a_msdu,
43075
14
     {"A MSDU", "wlan.fc.sid.a_msdu",
43076
14
      FT_BOOLEAN, 16, NULL, SID_A_MSDU, NULL, HFILL }},
43077
43078
14
    {&hf_ieee80211_pv1_cnt_stack_tetra_timest,
43079
14
     {"Tetrapartial Timestamp", "wlan.pv1.control.stack.tetrapartial_timestamp",
43080
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
43081
43082
14
    {&hf_ieee80211_pv1_cnt_bat_beacon_seq,
43083
14
     {"Beacon Sequence", "wlan.pv1.control.bat.beacon_sequence",
43084
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
43085
43086
14
    {&hf_ieee80211_pv1_cnt_bat_penta_timest,
43087
14
     {"Pentapartial Timestamp", "wlan.pv1.control.bat.pentapartial_timestamp",
43088
14
      FT_UINT40, BASE_HEX, NULL, 0, NULL, HFILL }},
43089
43090
14
    {&hf_ieee80211_pv1_cnt_bat_next_twt_info,
43091
14
     {"Next TWT Info", "wlan.pv1.control.bat.next_twt_info",
43092
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
43093
43094
14
    {&hf_ieee80211_pv1_cnt_bat_stating_seq_cntl,
43095
14
     {"Starting Sequence Control", "wlan.pv1.control.bat.starting_sequence_control",
43096
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
43097
43098
14
    {&hf_ieee80211_pv1_cnt_bat_bitmap,
43099
14
     {"BAT Bitmap", "wlan.pv1.control.bat.bat_bitmap",
43100
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
43101
43102
14
    {&hf_ieee80211_pv1_mgmt_reserved,
43103
14
     {"PV1 Reserved Management frame", "wlan.pv1.management.reserved",
43104
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
43105
43106
14
    {&hf_ieee80211_pv1_cntl_reserved,
43107
14
     {"PV1 Reserved Control frame", "wlan.pv1.control.reserved",
43108
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
43109
43110
14
    {&hf_ieee80211_fc_s1g_next_tbtt_present,
43111
14
     {"Next TBTT Present", "wlan.fc.s1g.next_tbtt_present",
43112
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL }},
43113
43114
14
    {&hf_ieee80211_fc_s1g_compressed_ssid_present,
43115
14
     {"Compressed SSID Present", "wlan.fc.s1g.compressed_ssid_present",
43116
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL }},
43117
43118
14
    {&hf_ieee80211_fc_s1g_ano_present,
43119
14
     {"ANO Present", "wlan.fc.s1g.ano_present",
43120
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL }},
43121
43122
14
    {&hf_ieee80211_fc_s1g_bss_bw,
43123
14
     {"BSS BW", "wlan.fc.s1g.bss_bw",
43124
14
      FT_UINT8, BASE_DEC, NULL, 0x38, NULL, HFILL }},
43125
43126
14
    {&hf_ieee80211_fc_s1g_security,
43127
14
     {"Security", "wlan.fc.s1g.security",
43128
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL }},
43129
43130
14
    {&hf_ieee80211_fc_s1g_ap_pm,
43131
14
     {"AP PM", "wlan.fc.s1g.ap_pm",
43132
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL }},
43133
43134
14
    {&hf_ieee80211_assoc_id,
43135
14
     {"Association ID", "wlan.aid",
43136
14
      FT_UINT16, BASE_DEC, NULL, 0x3FFF,
43137
14
      NULL, HFILL }},
43138
43139
14
    {&hf_ieee80211_did_duration,
43140
14
     {"Duration", "wlan.duration",
43141
14
      FT_UINT16, BASE_DEC, NULL, 0x7FFF,
43142
14
      NULL, HFILL }},
43143
43144
14
    {&hf_ieee80211_addr_da,
43145
14
     {"Destination address", "wlan.da",
43146
14
      FT_ETHER, BASE_NONE, NULL, 0,
43147
14
      "Destination Hardware Address", HFILL }},
43148
43149
14
    {&hf_ieee80211_addr_da_resolved,
43150
14
      {"Destination address (resolved)", "wlan.da_resolved", FT_STRING,
43151
14
        BASE_NONE, NULL, 0x0,
43152
14
        "Destination Hardware Address (resolved)", HFILL }},
43153
43154
14
    {&hf_ieee80211_addr_da_oui,
43155
14
     {"Destination OUI", "wlan.da.oui",
43156
14
      FT_UINT24, BASE_OUI, NULL, 0,
43157
14
      "Destination Organizationally Unique Identifier", HFILL }},
43158
43159
14
    {&hf_ieee80211_addr_da_oui_resolved,
43160
14
     {"Destination OUI (resolved)", "wlan.da.oui_resolved",
43161
14
      FT_STRING, BASE_NONE, NULL, 0,
43162
14
      "Destination Organizationally Unique Identifier (resolved)", HFILL }},
43163
43164
14
    { &hf_ieee80211_addr_da_lg,
43165
14
      { "LG bit", "wlan.da.lg",
43166
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43167
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43168
43169
14
    { &hf_ieee80211_addr_da_ig,
43170
14
      { "IG bit", "wlan.da.ig",
43171
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43172
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43173
43174
14
    {&hf_ieee80211_addr_sa,
43175
14
     {"Source address", "wlan.sa",
43176
14
      FT_ETHER, BASE_NONE, NULL, 0,
43177
14
      "Source Hardware Address", HFILL }},
43178
43179
14
    {&hf_ieee80211_addr_sa_resolved,
43180
14
      {"Source address (resolved)", "wlan.sa_resolved", FT_STRING,
43181
14
       BASE_NONE, NULL, 0x0,
43182
14
       "Source Hardware Address (resolved)", HFILL }},
43183
43184
14
    {&hf_ieee80211_addr_sa_oui,
43185
14
     {"Source OUI", "wlan.sa.oui",
43186
14
      FT_UINT24, BASE_OUI, NULL, 0,
43187
14
      "Source Organizationally Unique Identifier", HFILL }},
43188
43189
14
    {&hf_ieee80211_addr_sa_oui_resolved,
43190
14
     {"Source OUI (resolved)", "wlan.sa.oui_resolved",
43191
14
      FT_STRING, BASE_NONE, NULL, 0,
43192
14
      "Source Organizationally Unique Identifier (resolved)", HFILL }},
43193
43194
14
    { &hf_ieee80211_addr_sa_lg,
43195
14
      { "LG bit", "wlan.sa.lg",
43196
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43197
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43198
43199
14
    { &hf_ieee80211_addr_sa_ig,
43200
14
      { "IG bit", "wlan.sa.ig",
43201
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43202
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43203
43204
14
    {&hf_ieee80211_addr,
43205
14
      {"Hardware address", "wlan.addr",
43206
14
       FT_ETHER, BASE_NONE, NULL, 0,
43207
14
       "SA, DA, BSSID, RA or TA Hardware Address", HFILL }},
43208
43209
14
    {&hf_ieee80211_addr_resolved,
43210
14
      { "Hardware address (resolved)", "wlan.addr_resolved", FT_STRING,
43211
14
        BASE_NONE, NULL, 0x0,
43212
14
        "SA, DA, BSSID, RA or TA Hardware Address (resolved)", HFILL }},
43213
43214
14
    {&hf_ieee80211_addr_oui,
43215
14
     {"Hardware OUI", "wlan.oui",
43216
14
      FT_UINT24, BASE_OUI, NULL, 0,
43217
14
      "Hardware Organizationally Unique Identifier", HFILL }},
43218
43219
14
    {&hf_ieee80211_addr_oui_resolved,
43220
14
     {"Hardware OUI (resolved)", "wlan.oui_resolved",
43221
14
      FT_STRING, BASE_NONE, NULL, 0,
43222
14
      "Hardware Organizationally Unique Identifier (resolved)", HFILL }},
43223
43224
14
    { &hf_ieee80211_addr_lg,
43225
14
      { "LG bit", "wlan.addr.lg",
43226
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43227
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43228
43229
14
    { &hf_ieee80211_addr_ig,
43230
14
      { "IG bit", "wlan.addr.ig",
43231
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43232
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43233
43234
14
    {&hf_ieee80211_addr_ra,
43235
14
     {"Receiver address", "wlan.ra",
43236
14
      FT_ETHER, BASE_NONE, NULL, 0,
43237
14
      "Receiving Station Hardware Address", HFILL }},
43238
43239
14
    {&hf_ieee80211_addr_ra_resolved,
43240
14
      {"Receiver address (resolved)", "wlan.ra_resolved", FT_STRING, BASE_NONE,
43241
14
        NULL, 0x0, "Receiving Station Hardware Address (resolved)", HFILL }},
43242
43243
14
    {&hf_ieee80211_addr_ra_oui,
43244
14
     {"Receiver OUI", "wlan.ra.oui",
43245
14
      FT_UINT24, BASE_OUI, NULL, 0,
43246
14
      "Receiver Organizationally Unique Identifier", HFILL }},
43247
43248
14
    {&hf_ieee80211_addr_ra_oui_resolved,
43249
14
     {"Receiver OUI (resolved)", "wlan.ra.oui_resolved",
43250
14
      FT_STRING, BASE_NONE, NULL, 0,
43251
14
      "Receiver Organizationally Unique Identifier (resolved)", HFILL }},
43252
43253
14
    { &hf_ieee80211_addr_ra_lg,
43254
14
      { "LG bit", "wlan.ra.lg",
43255
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43256
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43257
43258
14
    { &hf_ieee80211_addr_ra_ig,
43259
14
      { "IG bit", "wlan.ra.ig",
43260
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43261
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43262
43263
14
    {&hf_ieee80211_addr_ta,
43264
14
     {"Transmitter address", "wlan.ta",
43265
14
      FT_ETHER, BASE_NONE, NULL, 0,
43266
14
      "Transmitting Station Hardware Address", HFILL }},
43267
43268
14
    {&hf_ieee80211_addr_ta_resolved,
43269
14
      {"Transmitter address (resolved)", "wlan.ta_resolved", FT_STRING,
43270
14
        BASE_NONE, NULL, 0x0,
43271
14
        "Transmitting Station Hardware Address (resolved)", HFILL }},
43272
43273
14
    {&hf_ieee80211_addr_ta_oui,
43274
14
     {"Transmitter OUI", "wlan.ta.oui",
43275
14
      FT_UINT24, BASE_OUI, NULL, 0,
43276
14
      "Transmitter Organizationally Unique Identifier", HFILL }},
43277
43278
14
    {&hf_ieee80211_addr_ta_oui_resolved,
43279
14
     {"Transmitter OUI (resolved)", "wlan.ta.oui_resolved",
43280
14
      FT_STRING, BASE_NONE, NULL, 0,
43281
14
      "Transmitter Organizationally Unique Identifier (resolved)", HFILL }},
43282
43283
14
    { &hf_ieee80211_addr_ta_lg,
43284
14
      { "LG bit", "wlan.ta.lg",
43285
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43286
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43287
43288
14
    { &hf_ieee80211_addr_ta_ig,
43289
14
      { "IG bit", "wlan.ta.ig",
43290
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43291
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43292
43293
14
    {&hf_ieee80211_addr_bssid,
43294
14
     {"BSS Id", "wlan.bssid",
43295
14
      FT_ETHER, BASE_NONE, NULL, 0,
43296
14
      "Basic Service Set ID", HFILL }},
43297
43298
14
    {&hf_ieee80211_addr_bssid_resolved,
43299
14
      {"BSS Id (resolved)", "wlan.bssid_resolved", FT_STRING, BASE_NONE, NULL,
43300
14
        0x0, "Basic Service Set ID (resolved)", HFILL }},
43301
43302
14
    {&hf_ieee80211_addr_bssid_oui,
43303
14
     {"BSS Id OUI", "wlan.bssid.oui",
43304
14
      FT_UINT24, BASE_OUI, NULL, 0,
43305
14
      "BSS Id Organizationally Unique Identifier", HFILL }},
43306
43307
14
    {&hf_ieee80211_addr_bssid_oui_resolved,
43308
14
     {"BSS Id OUI (resolved)", "wlan.bssid.oui_resolved",
43309
14
      FT_STRING, BASE_NONE, NULL, 0,
43310
14
      "BSS Id Organizationally Unique Identifier (resolved)", HFILL }},
43311
43312
14
    { &hf_ieee80211_addr_bssid_lg,
43313
14
      { "LG bit", "wlan.bssid.lg",
43314
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43315
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43316
43317
14
    { &hf_ieee80211_addr_bssid_ig,
43318
14
      { "IG bit", "wlan.bssid.ig",
43319
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43320
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43321
43322
14
    {&hf_ieee80211_addr_staa,
43323
14
     {"STA address", "wlan.staa",
43324
14
      FT_ETHER, BASE_NONE, NULL, 0,
43325
14
      "Station Hardware Address", HFILL }},
43326
43327
14
    {&hf_ieee80211_addr_staa_resolved,
43328
14
      {"STA address (resolved)", "wlan.staa_resolved", FT_STRING, BASE_NONE, NULL,
43329
14
        0x0, "Station Hardware Address (resolved)", HFILL }},
43330
43331
14
    {&hf_ieee80211_addr_staa_oui,
43332
14
     {"STA OUI", "wlan.staa.oui",
43333
14
      FT_UINT24, BASE_OUI, NULL, 0,
43334
14
      "STA Organizationally Unique Identifier", HFILL }},
43335
43336
14
    {&hf_ieee80211_addr_staa_oui_resolved,
43337
14
     {"STA OUI (resolved)", "wlan.staa.oui_resolved",
43338
14
      FT_STRING, BASE_NONE, NULL, 0,
43339
14
      "STA Organizationally Unique Identifier (resolved)", HFILL }},
43340
43341
14
    { &hf_ieee80211_addr_staa_lg,
43342
14
      { "LG bit", "wlan.staa.lg",
43343
14
        FT_BOOLEAN, 24, TFS(&lg_tfs), 0x020000,
43344
14
        "Specifies if this is a locally administered or globally unique (IEEE assigned) address", HFILL }},
43345
43346
14
    { &hf_ieee80211_addr_staa_ig,
43347
14
      { "IG bit", "wlan.staa.ig",
43348
14
        FT_BOOLEAN, 24, TFS(&ig_tfs), 0x010000,
43349
14
        "Specifies if this is an individual (unicast) or group (broadcast/multicast) address", HFILL }},
43350
43351
14
    {&hf_ieee80211_frag_number,
43352
14
     {"Fragment number", "wlan.frag",
43353
14
      FT_UINT16, BASE_DEC, NULL, 0x000F,
43354
14
      NULL, HFILL }},
43355
43356
14
    {&hf_ieee80211_seq_number,
43357
14
     {"Sequence number", "wlan.seq",
43358
14
      FT_UINT16, BASE_DEC, NULL, 0xFFF0,
43359
14
      NULL, HFILL }},
43360
43361
14
    {&hf_ieee80211_mesh_control_field,
43362
14
     {"Mesh Control Field", "wlan.mesh.control_field",
43363
14
      FT_NONE, BASE_NONE, NULL, 0,
43364
14
      NULL, HFILL }},
43365
43366
14
    {&hf_ieee80211_qos,
43367
14
     {"Qos Control", "wlan.qos",
43368
14
      FT_UINT16, BASE_HEX, NULL, 0,
43369
14
      NULL, HFILL }},
43370
43371
14
    {&hf_ieee80211_qos_tid,
43372
14
     {"TID", "wlan.qos.tid",
43373
14
      FT_UINT16, BASE_DEC, NULL, 0x000F,
43374
14
      NULL, HFILL }},
43375
43376
14
    {&hf_ieee80211_qos_priority,
43377
14
     {"Priority", "wlan.qos.priority",
43378
14
      FT_UINT16, BASE_DEC, VALS(ieee80211_qos_tags_acs), 0x0007,
43379
14
      "802.1D Tag", HFILL }},
43380
43381
14
    {&hf_ieee80211_qos_eosp,
43382
14
     {"EOSP", "wlan.qos.eosp",
43383
14
      FT_BOOLEAN, 16, TFS(&eosp_flag), QOS_FLAG_EOSP,
43384
14
      "EOSP Field", HFILL }},
43385
43386
14
    {&hf_ieee80211_qos_bit4,
43387
14
     {"QoS bit 4", "wlan.qos.bit4",
43388
14
      FT_BOOLEAN, 16, TFS(&bit4_flag), QOS_FLAG_EOSP,
43389
14
      NULL, HFILL }},
43390
43391
14
    {&hf_ieee80211_qos_ack_policy,
43392
14
     {"Ack Policy", "wlan.qos.ack",
43393
14
      FT_UINT16, BASE_HEX,  VALS(ack_policy), 0x0060,
43394
14
      NULL, HFILL }},
43395
43396
14
    {&hf_ieee80211_qos_amsdu_present,
43397
14
     {"Payload Type", "wlan.qos.amsdupresent",
43398
14
      FT_BOOLEAN, 16, TFS(&ieee80211_qos_amsdu_present_flag), 0x0080,
43399
14
      NULL, HFILL }},
43400
43401
14
    {&hf_ieee80211_qos_txop_limit,
43402
14
     {"TXOP Limit", "wlan.qos.txop_limit",
43403
14
      FT_UINT16, BASE_DEC, NULL, 0xFF00,
43404
14
      NULL, HFILL }},
43405
43406
14
    {&hf_ieee80211_qos_ps_buf_state,
43407
14
     {"QAP PS Buffer State", "wlan.qos.ps_buf_state",
43408
14
      FT_UINT16, BASE_HEX, NULL, 0xFF00,
43409
14
      NULL, HFILL }},
43410
43411
14
    {&hf_ieee80211_qos_buf_state_indicated,
43412
14
     {"Buffer State Indicated", "wlan.qos.buf_state_indicated",
43413
14
      FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0200,
43414
14
      NULL, HFILL }},
43415
43416
14
    {&hf_ieee80211_qos_highest_pri_buf_ac,
43417
14
     {"Highest-Priority Buffered AC", "wlan.qos.highest_pri_buf_ac",
43418
14
       FT_UINT16, BASE_DEC, VALS(wme_acs), 0x0C00,
43419
14
      NULL, HFILL }},
43420
43421
14
    {&hf_ieee80211_qos_qap_buf_load,
43422
14
     {"QAP Buffered Load", "wlan.qos.qap_buf_load",
43423
14
      FT_UINT16, BASE_DEC, NULL, 0xF000,
43424
14
      NULL, HFILL }},
43425
43426
14
    {&hf_ieee80211_qos_txop_dur_req,
43427
14
     {"TXOP Duration Requested", "wlan.qos.txop_dur_req",
43428
14
      FT_UINT16, BASE_DEC, NULL, 0xFF00,
43429
14
      NULL, HFILL }},
43430
43431
14
    {&hf_ieee80211_qos_queue_size,
43432
14
     {"Queue Size", "wlan.qos.queue_size",
43433
14
      FT_UINT16, BASE_DEC, NULL, 0xFF00,
43434
14
      NULL, HFILL }},
43435
43436
14
    {&hf_ieee80211_qos_mesh_ctl_present,
43437
14
     {"Mesh Control Present", "wlan.qos.mesh_ctl_present",
43438
14
      FT_UINT16, BASE_DEC, NULL, 0x0100,
43439
14
      NULL, HFILL }},
43440
43441
14
    {&hf_ieee80211_qos_mesh_ps_rsvd,
43442
14
     {"Mesh Power Save Level (reserved)", "wlan.qos.mesh_ps.reserved",
43443
14
      FT_UINT16, BASE_DEC, NULL, 0x0200,
43444
14
      NULL, HFILL }},
43445
43446
14
    {&hf_ieee80211_qos_mesh_ps_unicast,
43447
14
     {"Mesh Power Save Level (for the receiving peer)", "wlan.qos.mesh_ps.unicast",
43448
14
      FT_BOOLEAN, 16, TFS(&ieee80211_qos_mesh_ps), 0x0200,
43449
14
      NULL, HFILL }},
43450
43451
14
    {&hf_ieee80211_qos_mesh_ps_multicast,
43452
14
     {"Mesh Power Save Level (for all receiving peers)", "wlan.qos.mesh_ps.multicast",
43453
14
      FT_BOOLEAN, 16, TFS(&mesh_config_cap_power_save_level_flags), 0x0200,
43454
14
      NULL, HFILL }},
43455
43456
14
    {&hf_ieee80211_qos_mesh_rspi,
43457
14
     {"Receiver Service Period Initiated (RSPI)", "wlan.qos.mesh_rspi",
43458
14
      FT_UINT16, BASE_DEC, NULL, 0x0400,
43459
14
      NULL, HFILL }},
43460
43461
14
    {&hf_ieee80211_fcs,
43462
14
     {"Frame check sequence", "wlan.fcs",
43463
14
      FT_UINT32, BASE_HEX, NULL, 0,
43464
14
      "Frame Check Sequence (FCS)", HFILL }},
43465
43466
14
    {&hf_ieee80211_fcs_status,
43467
14
     {"FCS Status", "wlan.fcs.status",
43468
14
      FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
43469
14
      NULL, HFILL }},
43470
43471
14
    {&hf_ieee80211_fragment_overlap,
43472
14
      {"Fragment overlap", "wlan.fragment.overlap",
43473
14
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
43474
14
       "Fragment overlaps with other fragments", HFILL }},
43475
43476
14
    {&hf_ieee80211_fragment_overlap_conflict,
43477
14
      {"Conflicting data in fragment overlap", "wlan.fragment.overlap.conflict",
43478
14
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
43479
14
       "Overlapping fragments contained conflicting data", HFILL }},
43480
43481
14
    {&hf_ieee80211_fragment_multiple_tails,
43482
14
      {"Multiple tail fragments found", "wlan.fragment.multipletails",
43483
14
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
43484
14
       "Several tails were found when defragmenting the packet", HFILL }},
43485
43486
14
    {&hf_ieee80211_fragment_too_long_fragment,
43487
14
      {"Fragment too long", "wlan.fragment.toolongfragment",
43488
14
       FT_BOOLEAN, BASE_NONE, NULL, 0x0,
43489
14
       "Fragment contained data past end of packet", HFILL }},
43490
43491
14
    {&hf_ieee80211_fragment_error,
43492
14
      {"Defragmentation error", "wlan.fragment.error",
43493
14
       FT_FRAMENUM, BASE_NONE, NULL, 0x0,
43494
14
       "Defragmentation error due to illegal fragments", HFILL }},
43495
43496
14
    {&hf_ieee80211_fragment_count,
43497
14
      {"Fragment count", "wlan.fragment.count",
43498
14
       FT_UINT32, BASE_DEC, NULL, 0x0,
43499
14
       NULL, HFILL }},
43500
43501
14
    {&hf_ieee80211_fragment,
43502
14
      {"802.11 Fragment", "wlan.fragment",
43503
14
       FT_FRAMENUM, BASE_NONE, NULL, 0x0,
43504
14
       NULL, HFILL }},
43505
43506
14
    {&hf_ieee80211_fragments,
43507
14
      {"802.11 Fragments", "wlan.fragments",
43508
14
       FT_NONE, BASE_NONE, NULL, 0x0,
43509
14
       NULL, HFILL }},
43510
43511
14
    {&hf_ieee80211_reassembled_in,
43512
14
      {"Reassembled 802.11 in frame", "wlan.reassembled_in",
43513
14
       FT_FRAMENUM, BASE_NONE, NULL, 0x0,
43514
14
       "This 802.11 packet is reassembled in this frame", HFILL }},
43515
43516
14
    {&hf_ieee80211_reassembled_length,
43517
14
      {"Reassembled 802.11 length", "wlan.reassembled.length",
43518
14
       FT_UINT32, BASE_DEC, NULL, 0x0,
43519
14
       "The total length of the reassembled payload", HFILL }},
43520
43521
14
    {&hf_ieee80211_wep_iv,
43522
14
     {"Initialization Vector", "wlan.wep.iv",
43523
14
      FT_UINT24, BASE_HEX, NULL, 0,
43524
14
      NULL, HFILL }},
43525
43526
14
    {&hf_ieee80211_wep_iv_weak,
43527
14
     {"Weak IV", "wlan.wep.weakiv",
43528
14
      FT_BOOLEAN, BASE_NONE, NULL, 0x0,
43529
14
       NULL, HFILL}},
43530
43531
14
    {&hf_ieee80211_tkip_extiv,
43532
14
     {"TKIP Ext. Initialization Vector", "wlan.tkip.extiv",
43533
14
      FT_STRING, BASE_NONE, NULL, 0,
43534
14
      "TKIP Extended Initialization Vector", HFILL }},
43535
43536
14
    {&hf_ieee80211_ccmp_extiv,
43537
14
     {"CCMP Ext. Initialization Vector", "wlan.ccmp.extiv",
43538
14
      FT_STRING, BASE_NONE, NULL, 0,
43539
14
      "CCMP Extended Initialization Vector", HFILL }},
43540
43541
14
    {&hf_ieee80211_wep_key,
43542
14
     {"Key Index", "wlan.wep.key",
43543
14
      FT_UINT8, BASE_DEC, NULL, 0,
43544
14
      NULL, HFILL }},
43545
43546
14
    {&hf_ieee80211_wep_icv,
43547
14
     {"WEP ICV", "wlan.wep.icv",
43548
14
      FT_UINT32, BASE_HEX, NULL, 0,
43549
14
      NULL, HFILL }},
43550
43551
14
    {&hf_ieee80211_fc_analysis_pmk,
43552
14
     {"PMK", "wlan.analysis.pmk",
43553
14
      FT_STRING, BASE_NONE, NULL, 0x0,
43554
14
      NULL, HFILL }},
43555
43556
14
    {&hf_ieee80211_fc_analysis_kck,
43557
14
     {"KCK", "wlan.analysis.kck",
43558
14
      FT_STRING, BASE_NONE, NULL, 0x0,
43559
14
      NULL, HFILL }},
43560
43561
14
    {&hf_ieee80211_fc_analysis_kek,
43562
14
     {"KEK", "wlan.analysis.kek",
43563
14
      FT_STRING, BASE_NONE, NULL, 0x0,
43564
14
      NULL, HFILL }},
43565
43566
14
    {&hf_ieee80211_fc_analysis_tk,
43567
14
     {"TK", "wlan.analysis.tk",
43568
14
      FT_STRING, BASE_NONE, NULL, 0x0,
43569
14
      NULL, HFILL }},
43570
43571
14
    {&hf_ieee80211_fc_analysis_gtk,
43572
14
     {"GTK", "wlan.analysis.gtk",
43573
14
      FT_STRING, BASE_NONE, NULL, 0x0,
43574
14
      NULL, HFILL }},
43575
43576
14
    {&hf_ieee80211_mgt,
43577
14
     {"IEEE 802.11 Wireless Management", "wlan.mgt",
43578
14
      FT_PROTOCOL, BASE_NONE, NULL, 0x0,
43579
14
      NULL, HFILL }},
43580
43581
14
    {&hf_ieee80211_block_ack_control,
43582
14
     {"Block Ack Control", "wlan.ba.control",
43583
14
      FT_UINT16, BASE_HEX, NULL, 0,
43584
14
      NULL, HFILL }},
43585
43586
14
    {&hf_ieee80211_block_ack_control_ack_policy,
43587
14
     {"BA Ack Policy", "wlan.ba.control.ackpolicy",
43588
14
      FT_BOOLEAN, 16, TFS(&ieee80211_block_ack_control_ack_policy_flag), 0x0001,
43589
14
      "Block Ack Request (BAR) Ack Policy", HFILL }},
43590
43591
14
    {&hf_ieee80211_block_ack_control_type,
43592
14
     {"BA Type", "wlan.ba.control.ba_type",
43593
14
      FT_UINT16, BASE_HEX, VALS(block_ack_type_vals), 0x001e, NULL, HFILL }},
43594
43595
14
    {&hf_ieee80211_block_ack_control_reserved,
43596
14
     {"Reserved", "wlan.ba.control.reserved",
43597
14
      FT_UINT16, BASE_HEX, NULL, 0x0fe0,
43598
14
      NULL, HFILL }},
43599
43600
14
    {&hf_ieee80211_block_ack_control_tid_info,
43601
14
     {"TID for which a Basic BlockAck frame is requested", "wlan.ba.basic.tidinfo",
43602
14
      FT_UINT16, BASE_HEX, NULL, 0xf000,
43603
14
      "Traffic Identifier (TID) for which a Basic BlockAck frame is requested", HFILL }},
43604
43605
14
    {&hf_ieee80211_block_ack_multi_sta_aid11,
43606
14
     {"AID11", "wlan.ba.multi_sta.aid11",
43607
14
      FT_UINT16, BASE_HEX, NULL, 0x07ff, NULL, HFILL }},
43608
43609
14
    {&hf_ieee80211_block_ack_multi_sta_ack_type,
43610
14
     {"Ack Type", "wlan.ba.multi_sta.ack_type",
43611
14
      FT_UINT16, BASE_HEX, NULL, 0x0800, NULL, HFILL }},
43612
43613
14
    {&hf_ieee80211_block_ack_multi_sta_tid,
43614
14
     {"TID", "wlan.ba.multi_sta.tid",
43615
14
      FT_UINT16, BASE_HEX, NULL, 0xf000, NULL, HFILL }},
43616
43617
14
    {&hf_ieee80211_block_ack_multi_sta_aid_tid,
43618
14
     {"AID TID Info", "wlan.ba.multi_sta.aid_tid_info",
43619
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
43620
43621
14
    {&hf_ieee80211_block_ack_multi_sta_reserved,
43622
14
     {"Reserved", "wlan.ba.multi_sta.reserved",
43623
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
43624
43625
14
    {&hf_ieee80211_block_ack_multi_sta_ra,
43626
14
     {"RA", "wlan.ba.multi_sta.ra",
43627
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
43628
43629
14
    {&hf_ieee80211_block_ack_multi_tid_reserved,
43630
14
     {"Reserved", "wlan.bar.mtid.tidinfo.reserved",
43631
14
      FT_UINT16, BASE_HEX, NULL, 0x0fff,
43632
14
      NULL, HFILL }},
43633
43634
14
    {&hf_ieee80211_block_ack_multi_tid_value,
43635
14
     {"Multi-TID Value", "wlan.bar.mtid.tidinfo.value",
43636
14
      FT_UINT16, BASE_HEX, NULL, 0xf000,
43637
14
      NULL, HFILL }},
43638
43639
14
    {&hf_ieee80211_block_ack_bitmap,
43640
14
     {"Block Ack Bitmap", "wlan.ba.bm",
43641
14
      FT_BYTES, BASE_NONE, NULL, 0,
43642
14
      NULL, HFILL }},
43643
43644
    /* Used for Extended compressed BlockAck */
43645
14
    {&hf_ieee80211_block_ack_RBUFCAP,
43646
14
     {"Block Ack RBUFCAP", "wlan.ba.RBUFCAP",
43647
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
43648
14
      NULL, HFILL }},
43649
43650
14
    {&hf_ieee80211_block_ack_bitmap_missing_frame,
43651
14
     {"Not acknowledged frame", "wlan.ba.bm.missing_frame",
43652
14
      FT_UINT32, BASE_DEC, NULL, 0,
43653
14
      NULL, HFILL }},
43654
43655
14
    {&hf_ieee80211_block_ack_bitmap_last_ack_frame,
43656
14
     {"Last acknowledged frame", "wlan.ba.bm.last_ack_frame",
43657
14
      FT_UINT32, BASE_DEC, NULL, 0,
43658
14
      NULL, HFILL }},
43659
43660
14
    {&hf_ieee80211_block_ack_gcr_addr,
43661
14
     {"GCR Group Address", "wlan.ba.gcr_group_addr",
43662
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
43663
43664
14
    {&hf_ieee80211_beamform_feedback_seg_retrans_bitmap,
43665
14
     {"Feedback segment Retransmission Bitmap", "wlan.beamform.feedback_seg_retrans_bitmap",
43666
14
      FT_UINT8, BASE_HEX, NULL, 0,
43667
14
      NULL, HFILL }},
43668
43669
14
    {&hf_ieee80211_ndp_annc_token,
43670
14
     {"Sounding Dialog Token", "wlan.ndp.token",
43671
14
      FT_UINT8, BASE_HEX, NULL, 0,
43672
14
      NULL, HFILL }},
43673
43674
14
    {&hf_ieee80211_ndp_annc_variant,
43675
14
     {"NDP Announcement Variant", "wlan.ndp.token.variant",
43676
14
      FT_UINT8, BASE_HEX, VALS(ndp_annc_variant_vals), 0x03,
43677
14
      NULL, HFILL }},
43678
43679
14
    {&hf_ieee80211_ndp_annc_token_number,
43680
14
     {"Sounding Dialog Token", "wlan.ndp.token.number",
43681
14
      FT_UINT8, BASE_HEX, NULL, 0xFC,
43682
14
      NULL, HFILL }},
43683
43684
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_aid12,
43685
14
     {"AID12", "wlan.vht_ndp.sta_info.aid12",
43686
14
      FT_UINT16, BASE_HEX, NULL, 0x0FFF,
43687
14
      "12 least significant bits of the AID of the target STA", HFILL }},
43688
43689
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_feedback_type,
43690
14
     {"Feedback Type", "wlan.vht_ndp.sta_info.feedback_type",
43691
14
      FT_BOOLEAN, 16, TFS(&vht_ndp_annc_sta_info_feedback_type), 0x1000,
43692
14
      NULL, HFILL }},
43693
43694
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_nc_index,
43695
14
     {"Nc Index", "wlan.vht_ndp.sta_info.nc_index",
43696
14
      FT_UINT16, BASE_DEC, VALS(num_plus_one_3bit_flag), 0xE000,
43697
14
      NULL, HFILL }},
43698
43699
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_reserved,
43700
14
     {"Reserved", "wlan.vht_ndp.sta_info.reserved",
43701
14
      FT_UINT32, BASE_HEX, NULL, 0xE000,
43702
14
      NULL, HFILL }},
43703
43704
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008,
43705
14
     {"STA Info, AID11 < 2008", "wlan.vht_ndp.sta_info.ranging_2008",
43706
14
      FT_UINT32, BASE_HEX, NULL, 0,
43707
14
      NULL, HFILL }},
43708
43709
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_aid11,
43710
14
     {"AID11", "wlan.vht_ndp.sta_info.ranging_2008.aid11",
43711
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(10, 0),
43712
14
      NULL, HFILL }},
43713
43714
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_ltf_offset,
43715
14
     {"LTF Offset", "wlan.vht_ndp.sta_info.ranging_2008.ltf_offset",
43716
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(16, 11),
43717
14
      NULL, HFILL }},
43718
43719
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_r2i_n_sts,
43720
14
     {"R2I N STS", "wlan.vht_ndp.sta_info.ranging_2008.r2i_n_sts",
43721
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(sts_custom), GENMASK(19, 17),
43722
14
      NULL, HFILL }},
43723
43724
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_r2i_rep,
43725
14
     {"R2I Rep", "wlan.vht_ndp.sta_info.ranging_2008.r2i_rep",
43726
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(rep_custom), GENMASK(22, 20),
43727
14
      NULL, HFILL }},
43728
43729
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_i2r_n_sts,
43730
14
     {"I2R N STS", "wlan.vht_ndp.sta_info.ranging_2008.i2r_n_sts",
43731
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(sts_custom), GENMASK(25, 23),
43732
14
      NULL, HFILL }},
43733
43734
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_reserved1,
43735
14
     {"Reserved", "wlan.vht_ndp.sta_info.ranging_2008.reserved1",
43736
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(26, 26),
43737
14
      NULL, HFILL }},
43738
43739
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_disambiguation,
43740
14
     {"Disambiguation", "wlan.vht_ndp.sta_info.ranging_2008.disambiguation",
43741
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(27, 27),
43742
14
      NULL, HFILL }},
43743
43744
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_i2r_rep,
43745
14
     {"I2R Rep", "wlan.vht_ndp.sta_info.ranging_2008.i2r_rep",
43746
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(rep_custom), GENMASK(30, 28),
43747
14
      NULL, HFILL }},
43748
43749
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2008_reserved2,
43750
14
     {"Reserved", "wlan.vht_ndp.sta_info.ranging_2008.reserved2",
43751
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(31, 31),
43752
14
      NULL, HFILL }},
43753
43754
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043,
43755
14
     {"STA Info, AID11 == 2043", "wlan.sta_info_ranging_2043",
43756
14
      FT_UINT32, BASE_HEX, NULL, 0,
43757
14
      NULL, HFILL }},
43758
43759
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_aid11,
43760
14
     {"AID11", "wlan.sta_info_ranging_2043.aid11",
43761
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(10, 1),
43762
14
      NULL, HFILL }},
43763
43764
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_sac,
43765
14
     {"SAC", "wlan.sta_info_ranging_2043.sac",
43766
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(26, 11),
43767
14
      NULL, HFILL }},
43768
43769
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_disambiguation,
43770
14
     {"Disambiguation", "wlan.sta_info_ranging_2043.disambiguation",
43771
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(27, 27),
43772
14
      NULL, HFILL }},
43773
43774
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2043_reserved,
43775
14
     {"Reserved", "wlan.sta_info_ranging_2043.reserved",
43776
14
      FT_UINT32, BASE_HEX, NULL, GENMASK(31, 28),
43777
14
      NULL, HFILL }},
43778
43779
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044,
43780
14
     {"STA Info, AID11 == 2044", "wlan.sta_info_ranging_2044",
43781
14
      FT_UINT32, BASE_HEX, NULL, 0,
43782
14
      NULL, HFILL }},
43783
43784
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_aid11,
43785
14
     {"AID11", "wlan.sta_info_ranging_2044.aid11",
43786
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(10, 1),
43787
14
      NULL, HFILL }},
43788
43789
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_partial_tsf,
43790
14
     {"Partial TSF", "wlan.sta_info_ranging_2044.partial_tsf",
43791
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(partial_tsf_custom), GENMASK(26, 11),
43792
14
      NULL, HFILL }},
43793
43794
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_disambiguation,
43795
14
     {"Disambiguation", "wlan.sta_info_ranging_2044.disambiguation",
43796
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(27, 27),
43797
14
      NULL, HFILL }},
43798
43799
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_reserved,
43800
14
     {"Reserved", "wlan.sta_info_ranging_2044.reserved",
43801
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(28, 28),
43802
14
      NULL, HFILL }},
43803
43804
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2044_token,
43805
14
     {"Token", "wlan.sta_info_ranging_2044.token",
43806
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(31, 29),
43807
14
      NULL, HFILL }},
43808
43809
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045,
43810
14
     {"STA Info Ranging, AID11 == 2045", "wlan.sta_info_ranging_2045",
43811
14
      FT_UINT32, BASE_HEX, NULL, 0,
43812
14
      NULL, HFILL }},
43813
43814
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_aid11,
43815
14
     {"AID11", "wlan.sta_info_ranging_2045.aid11",
43816
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(10, 1),
43817
14
      NULL, HFILL }},
43818
43819
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_i2r_ndp_tx_power,
43820
14
     {"I2R NDP Tx Power", "wlan.sta_info_ranging_2045.i2r_ndp_tx_power",
43821
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(18, 11),
43822
14
      NULL, HFILL }},
43823
43824
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_r2i_ndp_target_rssi,
43825
14
     {"R2I NDP Target RSSI", "wlan.sta_info_ranging_2045.r2i_ndp_target_rssi",
43826
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(26, 19),
43827
14
      NULL, HFILL }},
43828
43829
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_disambiguation,
43830
14
     {"Disambiguation", "wlan.sta_info_ranging_2045.disambiguation",
43831
14
      FT_UINT32, BASE_DEC, NULL, GENMASK(27, 27),
43832
14
      NULL, HFILL }},
43833
43834
14
    {&hf_ieee80211_vht_ndp_annc_sta_info_ranging_2045_reserved,
43835
14
     {"Reserved", "wlan.sta_info_ranging_2045.reserved",
43836
14
      FT_UINT32, BASE_HEX, NULL, GENMASK(31, 28),
43837
14
      NULL, HFILL }},
43838
43839
14
    {&hf_ieee80211_ndp_eht_annc_sta_info,
43840
14
     {"STA Info", "wlan.ndp_eht.sta_info",
43841
14
      FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
43842
43843
14
    {&hf_ieee80211_ndp_eht_annc_aid11,
43844
14
     {"AID11", "wlan.ndp_eht.sta_info.aid11",
43845
14
      FT_UINT32, BASE_HEX, NULL, 0x000007ff, NULL, HFILL }},
43846
43847
14
    {&hf_ieee80211_ndp_eht_annc_resolution,
43848
14
     {"Resolution", "wlan.ndp_eht.sta_info.resolution",
43849
14
      FT_UINT32, BASE_HEX, NULL, 0x00000800, NULL, HFILL }},
43850
43851
14
    {&hf_ieee80211_ndp_eht_annc_feedback_map,
43852
14
     {"Feedback Bitmap", "wlan.ndp_eht.sta_info.feedback_bitmap",
43853
14
      FT_UINT32, BASE_HEX, NULL, 0x000ff000, NULL, HFILL }},
43854
43855
14
    {&hf_ieee80211_ndp_eht_annc_reserved1,
43856
14
     {"Reserved", "wlan.ndp_eht.sta_info.reserved1",
43857
14
      FT_UINT32, BASE_HEX, NULL, 0x00100000, NULL, HFILL }},
43858
43859
14
    {&hf_ieee80211_ndp_eht_annc_nc_index,
43860
14
     {"Nc Index", "wlan.ndp_eht.sta_info.nc_index",
43861
14
      FT_UINT32, BASE_HEX, NULL, 0x01e00000, NULL, HFILL }},
43862
43863
14
    {&hf_ieee80211_ndp_eht_annc_feedback_type,
43864
14
     {"Feedback Type And Ng", "wlan.ndp_eht.sta_info.feedback_type_and_ng",
43865
14
      FT_UINT32, BASE_HEX, NULL, 0x06000000, NULL, HFILL }},
43866
43867
14
    {&hf_ieee80211_ndp_eht_annc_disambiguation,
43868
14
     {"Disambiguation", "wlan.ndp_eht.sta_info.disambiguation",
43869
14
      FT_UINT32, BASE_HEX, NULL, 0x08000000, NULL, HFILL }},
43870
43871
14
    {&hf_ieee80211_ndp_eht_annc_codebook_size,
43872
14
     {"Codebook Size", "wlan.ndp_eht.sta_info.codebook_size",
43873
14
      FT_UINT32, BASE_HEX, NULL, 0x10000000, NULL, HFILL }},
43874
43875
14
    {&hf_ieee80211_ndp_eht_annc_reserved2,
43876
14
     {"Reserved", "wlan.ndp_eht.sta_info.reserved2",
43877
14
      FT_UINT32, BASE_HEX, NULL, 0xe0000000, NULL, HFILL }},
43878
43879
14
    {&hf_ieee80211_data_encap_payload_type,
43880
14
     {"Payload Type", "wlan.data_encap.payload_type",
43881
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_data_encap_payload_types), 0,
43882
14
      NULL, HFILL }},
43883
43884
14
    {&hf_ieee80211_ff_tdls_action_code,
43885
14
     {"Action code", "wlan.fixed.action_code",
43886
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tdls_action_codes_ext, 0,
43887
14
      "Management action code", HFILL }},
43888
43889
14
    {&hf_ieee80211_ff_target_channel,
43890
14
     {"Target Channel", "wlan.fixed.target_channel",
43891
14
      FT_UINT8, BASE_DEC, NULL, 0,
43892
14
      NULL, HFILL }},
43893
43894
14
    {&hf_ieee80211_ff_operating_class,
43895
14
     {"Operating Class", "wlan.fixed.operating_class",
43896
14
      FT_UINT8, BASE_DEC, NULL, 0,
43897
14
      NULL, HFILL }},
43898
43899
14
    {&hf_ieee80211_ff_channel,
43900
14
     {"Channel", "wlan.fixed.channel",
43901
14
      FT_UINT8, BASE_DEC, NULL, 0,
43902
14
      NULL, HFILL }},
43903
43904
14
    {&hf_ieee80211_ff_wnm_action_code,
43905
14
     {"Action code", "wlan.fixed.action_code",
43906
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &wnm_action_codes_ext, 0,
43907
14
      "Management action code", HFILL }},
43908
43909
14
    {&hf_ieee80211_ff_unprotected_wnm_action_code,
43910
14
     {"Action code", "wlan.fixed.action_code",
43911
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &unprotected_wnm_action_codes_ext, 0,
43912
14
      "Management action code", HFILL }},
43913
43914
14
    {&hf_ieee80211_ff_key_data,
43915
14
     {"Key Data", "wlan.fixed.key_data",
43916
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
43917
43918
14
    {&hf_ieee80211_ff_key_data_length,
43919
14
     {"Key Data Length", "wlan.fixed.key_data_length",
43920
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
43921
43922
14
    {&hf_ieee80211_ff_wnm_notification_type,
43923
14
     {"WNM-Notification type", "wlan.fixed.wnm_notification_type",
43924
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &wnm_notification_types_ext, 0,
43925
14
      NULL, HFILL }},
43926
43927
14
    {&hf_ieee80211_ff_wnm_notification_response_status,
43928
14
     {"Response Status", "wlan.fixed.wnm_notification_response_status",
43929
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(wnm_notification_response_code), 0,
43930
14
      NULL, HFILL }},
43931
43932
14
    {&hf_ieee80211_ff_rm_action_code,
43933
14
     {"Action code", "wlan.fixed.action_code",
43934
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rm_action_codes_ext, 0,
43935
14
      "Radio Measurement Action", HFILL }},
43936
43937
14
    {&hf_ieee80211_ff_rm_dialog_token,
43938
14
     {"Dialog token", "wlan.rm.dialog_token",
43939
14
      FT_UINT8, BASE_DEC, NULL, 0,
43940
14
      "Non-zero Dialog Token identifies request/report transaction", HFILL }},
43941
43942
14
    {&hf_ieee80211_ff_rm_repetitions,
43943
14
     {"Repetitions", "wlan.rm.repetitions",
43944
14
      FT_UINT16, BASE_DEC, NULL, 0,
43945
14
      "Number of Repetitions, 65535 indicates repeat until cancellation", HFILL }},
43946
43947
14
    {&hf_ieee80211_ff_rm_tx_power,
43948
14
     {"Transmit Power Used", "wlan.rm.tx_power",
43949
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
43950
14
      NULL, HFILL }},
43951
43952
14
    {&hf_ieee80211_ff_rm_max_tx_power,
43953
14
     {"Max Transmit Power", "wlan.rm.max_tx_power",
43954
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
43955
14
      NULL, HFILL }},
43956
43957
14
    {&hf_ieee80211_ff_tpc,
43958
14
     {"TPC Report", "wlan.rm.tpc",
43959
14
      FT_NONE, BASE_NONE, NULL, 0,
43960
14
      NULL, HFILL }},
43961
43962
14
    {&hf_ieee80211_ff_tpc_element_id,
43963
14
     {"TPC Element ID", "wlan.rm.tpc.element_id",
43964
14
      FT_UINT8, BASE_DEC, NULL, 0,
43965
14
      NULL, HFILL }},
43966
43967
14
    {&hf_ieee80211_ff_tpc_length,
43968
14
     {"TPC Length", "wlan.rm.tpc.length",
43969
14
      FT_UINT8, BASE_DEC, NULL, 0,
43970
14
      "Length of TPC Report element (always 2)", HFILL }},
43971
43972
14
    {&hf_ieee80211_ff_tpc_tx_power,
43973
14
     {"TPC Transmit Power", "wlan.rm.tpc.tx_power",
43974
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
43975
14
      NULL, HFILL }},
43976
43977
14
    {&hf_ieee80211_ff_tpc_link_margin,
43978
14
     {"TPC Link Margin", "wlan.rm.tpc.link_margin",
43979
14
      FT_INT8, BASE_DEC, NULL, 0,
43980
14
      NULL, HFILL }},
43981
43982
14
    {&hf_ieee80211_ff_rm_rx_antenna_id,
43983
14
     {"Receive Antenna ID", "wlan.rm.rx_antenna_id",
43984
14
      FT_UINT8, BASE_DEC, NULL, 0,
43985
14
      NULL, HFILL }},
43986
43987
14
    {&hf_ieee80211_ff_rm_tx_antenna_id,
43988
14
     {"Transmit Antenna ID", "wlan.rm.tx_antenna_id",
43989
14
      FT_UINT8, BASE_DEC, NULL, 0,
43990
14
      NULL, HFILL }},
43991
43992
14
    {&hf_ieee80211_ff_rm_rcpi,
43993
14
     {"Received Channel Power", "wlan.rm.rcpi",
43994
14
      FT_UINT8, BASE_DEC, NULL, 0,
43995
14
      NULL, HFILL }},
43996
43997
14
    {&hf_ieee80211_ff_rm_rsni,
43998
14
     {"Received Signal to noise indication", "wlan.rm.rsni",
43999
14
      FT_UINT8, BASE_DEC, NULL, 0,
44000
14
      NULL, HFILL }},
44001
44002
14
    {&hf_ieee80211_ff_request_mode_pref_cand,
44003
14
     {"Preferred Candidate List Included", "wlan.fixed.request_mode.pref_cand",
44004
14
      FT_UINT8, BASE_DEC, NULL, 0x01,
44005
14
      NULL, HFILL }},
44006
44007
14
    {&hf_ieee80211_ff_request_mode_abridged,
44008
14
     {"Abridged", "wlan.fixed.request_mode.abridged",
44009
14
      FT_UINT8, BASE_DEC, NULL, 0x02,
44010
14
      NULL, HFILL }},
44011
44012
14
    {&hf_ieee80211_ff_request_mode_disassoc_imminent,
44013
14
     {"Disassociation Imminent", "wlan.fixed.request_mode.disassoc_imminent",
44014
14
      FT_UINT8, BASE_DEC, NULL, 0x04,
44015
14
      NULL, HFILL }},
44016
44017
14
    {&hf_ieee80211_ff_request_mode_bss_term_included,
44018
14
     {"BSS Termination Included", "wlan.fixed.request_mode.bss_term_included",
44019
14
      FT_UINT8, BASE_DEC, NULL, 0x08,
44020
14
      NULL, HFILL }},
44021
44022
14
    {&hf_ieee80211_ff_request_mode_ess_disassoc_imminent,
44023
14
     {"ESS Disassociation Imminent", "wlan.fixed.request_mode.ess_disassoc_imminent",
44024
14
      FT_UINT8, BASE_DEC, NULL, 0x10,
44025
14
      NULL, HFILL }},
44026
44027
14
    {&hf_ieee80211_ff_request_mode_link_removal_imminent,
44028
14
     {"Link Removal Imminent", "wlan.fixed.request_mode.link_removal_imminent",
44029
14
      FT_UINT8, BASE_DEC, NULL, 0x20,
44030
14
      NULL, HFILL }},
44031
44032
14
    {&hf_ieee80211_ff_request_mode_reserved,
44033
14
     {"Reserved", "wlan.fixed.request_mode.reserved",
44034
14
      FT_UINT8, BASE_HEX, NULL, 0xc0,
44035
14
      NULL, HFILL }},
44036
44037
14
    {&hf_ieee80211_ff_disassoc_timer,
44038
14
     {"Disassociation Timer", "wlan.fixed.disassoc_timer",
44039
14
      FT_UINT16, BASE_DEC, NULL, 0,
44040
14
      NULL, HFILL }},
44041
44042
14
    {&hf_ieee80211_ff_bss_termination_delay,
44043
14
     {"BSS Termination Delay", "wlan.fixed.bss_termination_delay",
44044
14
      FT_UINT8, BASE_DEC, NULL, 0,
44045
14
      NULL, HFILL }},
44046
44047
14
    {&hf_ieee80211_ff_bss_transition_status_code,
44048
14
     {"BSS Transition Status Code", "wlan.fixed.bss_transition_status_code",
44049
14
      FT_UINT8, BASE_DEC, NULL, 0,
44050
14
      NULL, HFILL }},
44051
44052
14
    {&hf_ieee80211_ff_validity_interval,
44053
14
     {"Validity Interval", "wlan.fixed.validity_interval",
44054
14
      FT_UINT8, BASE_DEC, NULL, 0,
44055
14
      NULL, HFILL }},
44056
44057
14
    {&hf_ieee80211_ff_url_len,
44058
14
     {"Session Information URL Length",
44059
14
      "wlan.fixed.session_information.url_length",
44060
14
      FT_UINT8, BASE_DEC, NULL, 0,
44061
14
      NULL, HFILL }},
44062
44063
14
    {&hf_ieee80211_ff_url,
44064
14
     {"Session Information URL", "wlan.fixed.session_information.url",
44065
14
      FT_STRING, BASE_NONE, NULL, 0,
44066
14
      NULL, HFILL }},
44067
44068
14
    {&hf_ieee80211_ff_target_bss,
44069
14
     {"BSS Transition Target BSS", "wlan.fixed.bss_transition_target_bss",
44070
14
      FT_ETHER, BASE_NONE, NULL, 0,
44071
14
      NULL, HFILL }},
44072
44073
14
    {&hf_ieee80211_ff_bss_transition_query_reason,
44074
14
     {"BSS Transition Query Reason", "wlan.fixed.bss_transition_query_reason",
44075
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_transition_reasons), 0,
44076
14
      NULL, HFILL }},
44077
44078
14
    {&hf_ieee80211_ff_bss_transition_candidate_list_entries,
44079
14
     {"BSS Transition Candidate List Entries", "wlan.fixed.bss_transition_candidate_list_entries",
44080
14
      FT_BYTES, BASE_NONE, NULL, 0,
44081
14
      NULL, HFILL }},
44082
44083
/* 802.11ai */
44084
44085
14
    {&hf_ieee80211_ff_fils_discovery_frame_control,
44086
14
     {"Frame Control", "wlan.fils_discovery.frame_control",
44087
14
      FT_UINT16, BASE_HEX, NULL, 0,
44088
14
      NULL, HFILL }},
44089
44090
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_ssid_length,
44091
14
     {"SSID Length", "wlan.fils_discovery.frame_control.ssid_length",
44092
14
      FT_UINT16, BASE_HEX, NULL, PA_FILS_FC_SSID_LENGTH,
44093
14
      NULL, HFILL }},
44094
44095
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_capability,
44096
14
     {"Capability", "wlan.fils_discovery.frame_control.capability",
44097
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_CAPABILITY,
44098
14
      NULL, HFILL }},
44099
44100
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_short_ssid,
44101
14
     {"Short SSID", "wlan.fils_discovery.frame_control.short_ssid",
44102
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_SHORT_SSID,
44103
14
      NULL, HFILL }},
44104
44105
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_ap_csn,
44106
14
     {"AP-CSN", "wlan.fils_discovery.frame_control.ap_csn",
44107
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_AP_CSN,
44108
14
      NULL, HFILL }},
44109
44110
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_ano,
44111
14
     {"ANO", "wlan.fils_discovery.frame_control.ano",
44112
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_ANO,
44113
14
      NULL, HFILL }},
44114
44115
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_channel_center_frequency,
44116
14
     {"Channel Center Frequency Segment 1", "wlan.fils_discovery.frame_control.channel_center_frequency",
44117
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_CCFS1,
44118
14
      NULL, HFILL }},
44119
44120
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_primary_channel,
44121
14
     {"Primary Channel", "wlan.fils_discovery.frame_control.primary_channel",
44122
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_PC,
44123
14
      NULL, HFILL }},
44124
44125
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_rsn_info,
44126
14
     {"RSN Info", "wlan.fils_discovery.frame_control.rsn_info",
44127
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_RSN_INFO,
44128
14
      NULL, HFILL }},
44129
44130
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_length,
44131
14
     {"Length", "wlan.fils_discovery.frame_control.length",
44132
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_LENGTH,
44133
14
      NULL, HFILL }},
44134
44135
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_md,
44136
14
     {"MD", "wlan.fils_discovery.frame_control.md",
44137
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_MD,
44138
14
      NULL, HFILL }},
44139
44140
14
    {&hf_ieee80211_ff_fils_discovery_frame_control_reserved,
44141
14
     {"Reserved", "wlan.fils_discovery.frame_control.reserved",
44142
14
      FT_BOOLEAN, 16, TFS(&tfs_present_not_present), PA_FILS_FC_RESERVED,
44143
14
      NULL, HFILL }},
44144
44145
14
    {&hf_ieee80211_ff_fils_discovery_ssid,
44146
14
     {"SSID", "wlan.fils_discovery.ssid_length",
44147
14
      FT_STRING, BASE_NONE, NULL, 0x0,
44148
14
      NULL, HFILL }},
44149
44150
14
    {&hf_ieee80211_ff_fils_discovery_capability,
44151
14
     {"Capability", "wlan.fils_discovery.capability",
44152
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
44153
14
      NULL, HFILL }},
44154
44155
14
    {&hf_ieee80211_ff_fils_discovery_capability_ess,
44156
14
     {"ESS", "wlan.fils_discovery.capability.ess",
44157
14
      FT_UINT16, BASE_HEX, NULL, 0x0001,
44158
14
      NULL, HFILL }},
44159
44160
14
    {&hf_ieee80211_ff_fils_discovery_capability_privacy,
44161
14
     {"Privacy", "wlan.fils_discovery.capability.privacy",
44162
14
      FT_UINT16, BASE_HEX, NULL, 0x0002,
44163
14
      NULL, HFILL }},
44164
44165
14
    {&hf_ieee80211_ff_fils_discovery_capability_bss_operating_channel_width,
44166
14
     {"BSS Operating Channel width", "wlan.fils_discovery.capability.bss_operating_channel_width",
44167
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_bss_operating_channel_width), 0x001C,
44168
14
      NULL, HFILL }},
44169
44170
14
    {&hf_ieee80211_ff_fils_discovery_capability_max_number_of_spatial_streams,
44171
14
     {"Maximum Number of Spatial Streams", "wlan.fils_discovery.maximum_number_of_spatial_streams",
44172
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_max_number_of_spatial_streams), 0x00E0,
44173
14
      NULL, HFILL }},
44174
44175
14
    {&hf_ieee80211_ff_fils_discovery_capability_reserved,
44176
14
     {"Reserved", "wlan.fils_discovery.capability.reserved",
44177
14
      FT_UINT16, BASE_HEX, NULL, 0x0100,
44178
14
      NULL, HFILL }},
44179
44180
14
    {&hf_ieee80211_ff_fils_discovery_capability_multiple_bssid,
44181
14
     {"Multiple BSSID", "wlan.fils_discovery.capability.multiple_bssid",
44182
14
      FT_UINT16, BASE_HEX, NULL, 0x0200,
44183
14
      NULL, HFILL }},
44184
44185
14
    {&hf_ieee80211_ff_fils_discovery_capability_phy_index,
44186
14
     {"PHY Index", "wlan.fils_discovery.capability.phy_index",
44187
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_phy_index), 0x1C00,
44188
14
      NULL, HFILL }},
44189
44190
14
    {&hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_dsss,
44191
14
     {"FILS Minimum Rate", "wlan.fils_discovery.capability.minimum_rate",
44192
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_fils_minimum_rate_dsss), 0xE000,
44193
14
      NULL, HFILL }},
44194
44195
14
    {&hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_ofdm,
44196
14
     {"FILS Minimum Rate", "wlan.fils_discovery.capability.minimum_rate",
44197
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_fils_minimum_rate_ofdm), 0xE000,
44198
14
      NULL, HFILL }},
44199
44200
14
    {&hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_ht_vht_tvht,
44201
14
     {"FILS Minimum Rate", "wlan.fils_discovery.capability.minimum_rate",
44202
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_fils_minimum_rate_ht_vht_tvht), 0xE000,
44203
14
      NULL, HFILL }},
44204
44205
14
    {&hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate_he,
44206
14
     {"FILS Minimum Rate", "wlan.fils_discovery.capability.minimum_rate",
44207
14
      FT_UINT16, BASE_HEX, VALS(fils_discovery_capability_fils_minimum_rate_he), 0xE000,
44208
14
      NULL, HFILL }},
44209
44210
14
    {&hf_ieee80211_ff_fils_discovery_capability_fils_minimum_rate,
44211
14
     {"FILS Minimum Rate", "wlan.fils_discovery.capability.minimum_rate",
44212
14
      FT_UINT16, BASE_HEX, NULL, 0xE000,
44213
14
      NULL, HFILL }},
44214
44215
14
    {&hf_ieee80211_ff_fils_discovery_short_ssid,
44216
14
     {"Short SSID", "wlan.fils_discovery.short_ssid",
44217
14
      FT_UINT32, BASE_HEX, NULL, 0x0,
44218
14
      NULL, HFILL }},
44219
44220
14
    {&hf_ieee80211_ff_fils_discovery_ap_csn,
44221
14
     {"AP Configuration Sequence Number", "wlan.fils_discovery.ap_csn",
44222
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
44223
14
      NULL, HFILL }},
44224
44225
14
    {&hf_ieee80211_ff_fils_discovery_ano,
44226
14
     {"Access Network Options", "wlan.fils_discovery.ano",
44227
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
44228
14
      NULL, HFILL }},
44229
44230
14
    {&hf_ieee80211_ff_fils_discovery_ccfs1,
44231
14
     {"Channel Center Frequency Segment 1", "wlan.fils_discovery.channel_center_frequency",
44232
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
44233
14
      NULL, HFILL }},
44234
44235
14
    {&hf_ieee80211_ff_fils_discovery_operating_class,
44236
14
     {"Operating Class", "wlan.fils_discovery.operating_class",
44237
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
44238
14
      NULL, HFILL }},
44239
44240
14
    {&hf_ieee80211_ff_fils_discovery_primary_channel,
44241
14
     {"Primary Channel", "wlan.fils_discovery.primary_channel",
44242
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
44243
14
      NULL, HFILL }},
44244
44245
14
    {&hf_ieee80211_ff_fils_discovery_rsn_info,
44246
14
     {"RSN Info", "wlan.fils_discovery.rsn_info",
44247
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
44248
14
      NULL, HFILL }},
44249
44250
14
    {&hf_ieee80211_ff_fils_discovery_length,
44251
14
     {"Length", "wlan.fils_discovery.length",
44252
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
44253
14
      NULL, HFILL }},
44254
44255
14
    {&hf_ieee80211_ff_fils_discovery_md,
44256
14
     {"MD", "wlan.fils_discovery.md",
44257
14
      FT_UINT24, BASE_HEX, NULL, 0x0,
44258
14
      NULL, HFILL }},
44259
44260
/* 802.11ad */
44261
14
    {&hf_ieee80211_cf_response_offset,
44262
14
     {"Response Offset", "wlan.res_offset",
44263
14
      FT_UINT16, BASE_DEC, NULL, 0,
44264
14
      NULL, HFILL }},
44265
44266
14
    {&hf_ieee80211_grant_ack_reserved,
44267
14
     {"Reserved", "wlan.grant_ack.reserved",
44268
14
      FT_BYTES, BASE_NONE, NULL, 0,
44269
14
      NULL, HFILL }},
44270
44271
14
    {&hf_ieee80211_ff_dynamic_allocation,
44272
14
     {"Dynamic Allocation", "wlan.dynamic_allocation",
44273
14
      FT_UINT40, BASE_HEX, NULL, 0,
44274
14
      NULL, HFILL }},
44275
44276
14
    {&hf_ieee80211_ff_TID,
44277
14
     {"TID", "wlan.dynamic_allocation.tid",
44278
14
      FT_UINT40, BASE_DEC, NULL, 0x000000000F,
44279
14
      NULL, HFILL }},
44280
44281
14
    {&hf_ieee80211_ff_alloc_type,
44282
14
     {"Allocation Type", "wlan.dynamic_allocation.alloc_type",
44283
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000070,
44284
14
      NULL, HFILL }},
44285
44286
14
    {&hf_ieee80211_ff_src_aid,
44287
14
     {"Source AID", "wlan.dynamic_allocation.src_aid",
44288
14
      FT_UINT40, BASE_DEC, NULL, 0x0000007F80,
44289
14
      NULL, HFILL }},
44290
44291
14
    {&hf_ieee80211_ff_dest_aid,
44292
14
     {"Destination AID", "wlan.dynamic_allocation.dest_aid",
44293
14
      FT_UINT40, BASE_DEC, NULL, 0x00007f8000,
44294
14
      NULL, HFILL }},
44295
44296
14
    {&hf_ieee80211_ff_alloc_duration,
44297
14
     {"Allocation Duration", "wlan.dynamic_allocation.alloc_duration",
44298
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0x7FFF800000,
44299
14
      NULL, HFILL }},
44300
44301
14
    {&hf_ieee80211_ff_b39,
44302
14
     {"Reserved (b39)", "wlan.dynamic_allocation.b39",
44303
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000,
44304
14
      NULL, HFILL }},
44305
44306
14
    {&hf_ieee80211_ff_ssw,
44307
14
     {"Sector Sweep", "wlan.ssw",
44308
14
      FT_UINT24, BASE_HEX, NULL, 0,
44309
14
      NULL, HFILL }},
44310
44311
14
    {&hf_ieee80211_ff_ssw_direction,
44312
14
     {"Sector Sweep Direction", "wlan.ssw.direction",
44313
14
      FT_BOOLEAN, 24, TFS(&ieee80211_cf_ssw_direction), 0x000001,
44314
14
      NULL, HFILL}},
44315
44316
14
    {&hf_ieee80211_ff_ssw_cdown,
44317
14
     {"Sector Sweep CDOWN", "wlan.ssw.cdown",
44318
14
      FT_UINT24, BASE_DEC, NULL, 0x0003fe,
44319
14
      NULL, HFILL }},
44320
44321
14
    {&hf_ieee80211_ff_ssw_sector_id,
44322
14
     {"Sector Sweep Sector ID", "wlan.ssw.sector_id",
44323
14
      FT_UINT24, BASE_DEC, NULL, 0x00fc00,
44324
14
      NULL, HFILL }},
44325
44326
14
    {&hf_ieee80211_ff_ssw_dmg_ant_id,
44327
14
     {"Sector Sweep DMG Antenna ID", "wlan.ssw.dmg_ant_id",
44328
14
      FT_UINT24, BASE_DEC, NULL, 0x030000,
44329
14
      NULL, HFILL }},
44330
44331
14
    {&hf_ieee80211_ff_ssw_rxss_len,
44332
14
     {"Sector Sweep RXSS Length", "wlan.ssw.rxss_len",
44333
14
      FT_UINT24, BASE_DEC, NULL, 0xfc0000,
44334
14
      NULL, HFILL }},
44335
44336
14
    {&hf_ieee80211_ff_bf,
44337
14
     {"Beam Forming", "wlan.bf",
44338
14
      FT_UINT16, BASE_HEX, NULL, 0,
44339
14
      NULL, HFILL }},
44340
44341
14
    {&hf_ieee80211_ff_bf_train,
44342
14
     {"Beam Forming Training", "wlan.bf.train",
44343
14
      FT_BOOLEAN, 16, NULL, 0x0001,
44344
14
      NULL, HFILL }},
44345
44346
14
    {&hf_ieee80211_ff_bf_is_init,
44347
14
     {"Beam Forming Is InitiatorTXSS", "wlan.bf.isInit",
44348
14
      FT_BOOLEAN, 16, NULL, 0x0002,
44349
14
      NULL, HFILL }},
44350
44351
14
    {&hf_ieee80211_ff_bf_is_resp,
44352
14
     {"Beam Forming Is ResponderTXSS", "wlan.bf.isResp",
44353
14
      FT_BOOLEAN, 16, NULL, 0x0004,
44354
14
      NULL, HFILL }},
44355
44356
14
    {&hf_ieee80211_ff_bf_rxss_len,
44357
14
     {"Beam Forming RXSS Length", "wlan.bf.rxss_len",
44358
14
      FT_UINT16, BASE_DEC, NULL, 0x01f8,
44359
14
      NULL, HFILL }},
44360
44361
14
    {&hf_ieee80211_ff_bf_rxss_rate,
44362
14
     {"Beam Forming RXSS Rate", "wlan.bf.rxss_rate",
44363
14
      FT_BOOLEAN, 16, NULL, 0x0200,
44364
14
      NULL, HFILL }},
44365
44366
14
    {&hf_ieee80211_ff_bf_b10b15,
44367
14
     {"Reserved (B10-B15)", "wlan.bf.reserved",
44368
14
      FT_UINT16, BASE_HEX, NULL, 0xFC00,
44369
14
      NULL, HFILL }},
44370
44371
14
    {&hf_ieee80211_ff_bf_num_sectors,
44372
14
     {"Beam Forming Total Number of Sectors", "wlan.bf.num_sectors",
44373
14
      FT_UINT16, BASE_DEC, NULL, 0x03f8,
44374
14
      NULL, HFILL }},
44375
44376
14
    {&hf_ieee80211_ff_bf_num_rx_dmg_ants,
44377
14
     {"Beam Forming Number of DMG Antennas", "wlan.bf.num_dmg_ants",
44378
14
      FT_UINT16, BASE_DEC, NULL, 0x0c00,
44379
14
      NULL, HFILL }},
44380
44381
14
    {&hf_ieee80211_ff_bf_b12b15,
44382
14
     {"Reserved (B12-B15)", "wlan.bf.reserved",
44383
14
      FT_UINT16, BASE_HEX, NULL, 0xF000,
44384
14
      NULL, HFILL }},
44385
44386
14
    {&hf_ieee80211_addr_nav_da,
44387
14
     {"Destination address of STA that caused NAV update", "wlan.nav_da",
44388
14
      FT_ETHER, BASE_NONE, NULL, 0,
44389
14
      "DMG Destination Hardware Address", HFILL }},
44390
44391
14
    {&hf_ieee80211_addr_nav_sa,
44392
14
     {"Source address of STA that caused NAV update", "wlan.nav_sa",
44393
14
      FT_ETHER, BASE_NONE, NULL, 0,
44394
14
      "DMG Source Hardware Address", HFILL }},
44395
44396
14
    {&hf_ieee80211_ff_sswf,
44397
14
     {"Sector Sweep Feedback", "wlan.sswf",
44398
14
      FT_UINT24, BASE_HEX, NULL, 0,
44399
14
      NULL, HFILL }},
44400
44401
14
    {&hf_ieee80211_ff_sswf_total_sectors,
44402
14
     {"Sector Sweep Feedback total number of sectors", "wlan.sswf.num_sectors",
44403
14
      FT_UINT24, BASE_DEC, NULL, 0x0001ff,
44404
14
      NULL, HFILL }},
44405
44406
14
    {&hf_ieee80211_ff_sswf_num_rx_dmg_ants,
44407
14
     {"Sector Sweep Feedback Number of receive DMG Antennas", "wlan.sswf.num_dmg_ants",
44408
14
      FT_UINT24, BASE_DEC, NULL, 0x000600,
44409
14
      NULL, HFILL }},
44410
44411
14
    {&hf_ieee80211_ff_sswf_poll_required,
44412
14
     {"Sector Sweep Feedback Poll required", "wlan.sswf.poll",
44413
14
      FT_BOOLEAN, 24, NULL, 0x010000,
44414
14
      NULL, HFILL }},
44415
44416
14
    {&hf_ieee80211_ff_sswf_reserved1,
44417
14
     {"Sector Sweep Feedback Reserved", "wlan.sswf.reserved",
44418
14
      FT_UINT24, BASE_HEX, NULL, 0x00F800,
44419
14
      NULL, HFILL }},
44420
44421
14
    {&hf_ieee80211_ff_sswf_reserved2,
44422
14
     {"Sector Sweep Feedback Reserved", "wlan.sswf.reserved",
44423
14
      FT_UINT24, BASE_HEX, NULL, 0xFE0000,
44424
14
      NULL, HFILL }},
44425
44426
14
    {&hf_ieee80211_ff_sswf_sector_select,
44427
14
     {"Sector Sweep Feedback Sector Select", "wlan.sswf.sector_select",
44428
14
      FT_UINT24, BASE_DEC, NULL, 0x00003F,
44429
14
      NULL, HFILL }},
44430
44431
14
    {&hf_ieee80211_ff_sswf_dmg_antenna_select,
44432
14
     {"Sector Sweep Feedback DMG Antenna Select", "wlan.sswf.dmg_antenna_select",
44433
14
      FT_UINT24, BASE_DEC, NULL, 0x0000C0,
44434
14
      NULL, HFILL }},
44435
44436
14
    {&hf_ieee80211_ff_sswf_snr_report,
44437
14
     {"Sector Sweep Feedback SNR Report", "wlan.sswf.snr_report",
44438
14
      FT_UINT24, BASE_DEC, NULL, 0x00FF00,
44439
14
      NULL, HFILL }},
44440
44441
44442
14
    {&hf_ieee80211_ff_brp,
44443
14
     {"BRP Request", "wlan.brp",
44444
14
      FT_UINT32, BASE_HEX, NULL, 0,
44445
14
      NULL, HFILL }},
44446
44447
14
    {&hf_ieee80211_ff_brp_L_RX,
44448
14
     {"BRP Request L-RX", "wlan.brp.l_rx",
44449
14
      FT_UINT32, BASE_DEC, NULL, 0x0000001f,
44450
14
      NULL, HFILL }},
44451
44452
14
    {&hf_ieee80211_ff_brp_TX_TRN_REQ,
44453
14
     {"BRP Request TX-TRN-REQ", "wlan.brp.tx_trn_req",
44454
14
      FT_BOOLEAN, 32, NULL, 0x00000020,
44455
14
      NULL, HFILL }},
44456
44457
14
    {&hf_ieee80211_ff_brp_MID_REQ,
44458
14
     {"BRP Request MID-REQ", "wlan.brp.mid_req",
44459
14
      FT_BOOLEAN, 32, NULL, 0x00000040,
44460
14
      NULL, HFILL }},
44461
44462
14
    {&hf_ieee80211_ff_brp_BC_REQ,
44463
14
     {"BRP Request BC-REQ", "wlan.brp.bc_req",
44464
14
      FT_BOOLEAN, 32, NULL, 0x00000080,
44465
14
      NULL, HFILL }},
44466
44467
14
    {&hf_ieee80211_ff_brp_MID_GRANT,
44468
14
     {"BRP Request MID-GRANT", "wlan.brp.mid_grant",
44469
14
      FT_BOOLEAN, 32, NULL, 0x00000100,
44470
14
      NULL, HFILL }},
44471
44472
14
    {&hf_ieee80211_ff_brp_BC_GRANT,
44473
14
     {"BRP Request BC-GRANT", "wlan.brp.bc_grant",
44474
14
      FT_BOOLEAN, 32, NULL, 0x00000200,
44475
14
      NULL, HFILL }},
44476
44477
14
    {&hf_ieee80211_ff_brp_chan_FBCK_CAP,
44478
14
     {"BRP Request Chan FBCK-CAP", "wlan.brp.chan_fbck_cap",
44479
14
      FT_BOOLEAN, 32, NULL, 0x00000400,
44480
14
      NULL, HFILL }},
44481
44482
14
    {&hf_ieee80211_ff_brp_tx_sector,
44483
14
     {"BRP Request TX Sector ID", "wlan.brp.tx_sector_id",
44484
14
      FT_UINT32, BASE_DEC, NULL, 0x0001f800,
44485
14
      NULL, HFILL }},
44486
44487
14
    {&hf_ieee80211_ff_brp_other_aid,
44488
14
     {"BRP Request Other AID", "wlan.brp.other_aid",
44489
14
      FT_UINT32, BASE_DEC, NULL, 0x01fe0000,
44490
14
      NULL, HFILL }},
44491
44492
14
    {&hf_ieee80211_ff_brp_tx_antenna,
44493
14
     {"BRP Request TX Antenna ID", "wlan.brp.tx_antenna_id",
44494
14
      FT_UINT32, BASE_DEC, NULL, 0x06000000,
44495
14
      NULL, HFILL }},
44496
44497
14
    {&hf_ieee80211_ff_brp_reserved,
44498
14
     {"BRP Request Reserved", "wlan.brp.reserved",
44499
14
      FT_UINT32, BASE_HEX, NULL, 0xF8000000,
44500
14
      NULL, HFILL }},
44501
44502
14
    {&hf_ieee80211_ff_blm,
44503
14
     {"Beamformed Link Maintenance", "wlan.blm",
44504
14
      FT_UINT8, BASE_HEX, NULL, 0,
44505
14
      NULL, HFILL }},
44506
44507
14
    {&hf_ieee80211_ff_blm_unit_index,
44508
14
     {"BeamLink Maintenance Uint Index", "wlan.blm.uint_index",
44509
14
      FT_BOOLEAN, 8, NULL, 0x01,
44510
14
      NULL, HFILL }},
44511
44512
14
    {&hf_ieee80211_ff_blm_maint_value,
44513
14
     {"BeamLink Maintenance Value", "wlan.blm.value",
44514
14
      FT_UINT8, BASE_DEC, NULL, 0x7e,
44515
14
      NULL, HFILL }},
44516
44517
14
    {&hf_ieee80211_ff_blm_is_master,
44518
14
     {"BeamLink Is Master", "wlan.blm.is_master",
44519
14
      FT_BOOLEAN, 8, NULL, 0x80,
44520
14
      NULL, HFILL }},
44521
44522
14
    {&hf_ieee80211_ff_bic,
44523
14
     {"Beacon Interval Control", "wlan.bic",
44524
14
      FT_UINT48, BASE_HEX, NULL, 0,
44525
14
      NULL, HFILL }},
44526
44527
14
    {&hf_ieee80211_ff_bic_cc_present,
44528
14
     {"Clustering Control Present", "wlan.bic.cc",
44529
14
      FT_BOOLEAN, 48, NULL, 0x000000000001,
44530
14
      NULL, HFILL }},
44531
44532
14
    {&hf_ieee80211_ff_bic_discovery_mode,
44533
14
     {"Discovery Mode", "wlan.bic.discovery_mode",
44534
14
      FT_BOOLEAN, 48, NULL, 0x000000000002,
44535
14
      NULL, HFILL }},
44536
44537
14
    {&hf_ieee80211_ff_bic_next_beacon,
44538
14
     {"Next Beacon", "wlan.bic.next_beacon",
44539
14
      FT_UINT48, BASE_DEC, NULL, 0x00000000003c,
44540
44541
14
      NULL, HFILL }},
44542
44543
14
    {&hf_ieee80211_ff_bic_ati_present,
44544
14
     {"ATI Present", "wlan.bic.ati",
44545
14
      FT_BOOLEAN, 48, NULL, 0x000000000040,
44546
14
      NULL, HFILL }},
44547
44548
14
    {&hf_ieee80211_ff_bic_abft_len,
44549
14
     {"A-BFT length", "wlan.bic.abft_len",
44550
14
      FT_UINT48, BASE_DEC, NULL, 0x000000000380,
44551
14
      NULL, HFILL }},
44552
44553
14
    {&hf_ieee80211_ff_bic_fss,
44554
14
     {"FSS", "wlan.bic.fss",
44555
14
      FT_UINT48, BASE_DEC, NULL, 0x000000003c00,
44556
14
      NULL, HFILL }},
44557
44558
14
    {&hf_ieee80211_ff_bic_is_resp,
44559
14
     {"Is TXSS Responder", "wlan.bic.is_responder",
44560
14
      FT_BOOLEAN, 48, NULL, 0x000000004000,
44561
14
      NULL, HFILL }},
44562
44563
14
    {&hf_ieee80211_ff_bic_next_abft,
44564
14
     {"Next A-BFT", "wlan.bic.next_abft",
44565
14
      FT_UINT48, BASE_DEC, NULL, 0x000000078000,
44566
14
      NULL, HFILL }},
44567
44568
14
    {&hf_ieee80211_ff_bic_frag_txss,
44569
14
     {"Fragmented TXSS", "wlan.bic.frag_txss",
44570
14
      FT_BOOLEAN, 48, NULL, 0x000000080000,
44571
14
      NULL, HFILL }},
44572
44573
14
    {&hf_ieee80211_ff_bic_txss_span,
44574
14
     {"TXSS span", "wlan.bic.txss_span",
44575
14
      FT_UINT48, BASE_DEC, NULL, 0x000007f00000,
44576
14
      NULL, HFILL }},
44577
44578
14
    {&hf_ieee80211_ff_bic_NBI_abft,
44579
14
     {"Number of Beacon Intervals that are needed to allocate A-BFT", "wlan.bic.NBI_abft",
44580
14
      FT_UINT48, BASE_DEC, NULL, 0x000078000000,
44581
14
      NULL, HFILL }},
44582
44583
14
    {&hf_ieee80211_ff_bic_abft_count,
44584
14
     {"A-BFT Count", "wlan.bic.abft_count",
44585
14
      FT_UINT48, BASE_DEC, NULL, 0x001f80000000,
44586
14
      NULL, HFILL }},
44587
44588
14
    {&hf_ieee80211_ff_bic_nabft,
44589
14
     {"Number of A-BFT's received from each Antenna", "wlan.bic.nabft",
44590
14
      FT_UINT48, BASE_DEC, NULL, 0x07e000000000,
44591
14
      NULL, HFILL }},
44592
44593
14
    {&hf_ieee80211_ff_bic_pcp,
44594
14
     {"PCP Association Ready", "wlan.bic.pcp",
44595
14
      FT_BOOLEAN, 48, NULL, 0x080000000000,
44596
14
      NULL, HFILL }},
44597
44598
14
    {&hf_ieee80211_ff_bic_reserved,
44599
14
     {"Reserved", "wlan.bic.reserved",
44600
14
      FT_UINT48, BASE_HEX, NULL, 0xF00000000000,
44601
14
      NULL, HFILL }},
44602
44603
14
    {&hf_ieee80211_ff_dmg_params,
44604
14
     {"DMG Parameters", "wlan.dmg_params",
44605
14
      FT_UINT8, BASE_HEX , NULL, 0,
44606
14
      NULL, HFILL }},
44607
44608
14
    {&hf_ieee80211_ff_dmg_params_bss,
44609
14
     {"BSS Type", "wlan.dmg_params.bss",
44610
14
      FT_UINT8, BASE_DEC, VALS(bss_type), 0x03,
44611
14
      NULL, HFILL }},
44612
44613
14
    {&hf_ieee80211_ff_dmg_params_cbap_only,
44614
14
     {"CBAP Only", "wlan.dmg_params.cbap_only",
44615
14
      FT_BOOLEAN, 8, NULL, 0x04,
44616
14
      NULL, HFILL }},
44617
44618
14
    {&hf_ieee80211_ff_dmg_params_cbap_src,
44619
14
     {"CBAP Source", "wlan.dmg_params.cbap_src",
44620
14
      FT_BOOLEAN, 8, NULL, 0x08,
44621
14
      NULL, HFILL }},
44622
44623
14
    {&hf_ieee80211_ff_dmg_params_privacy,
44624
14
     {"DMG Privacy", "wlan.dmg_params.privacy",
44625
14
      FT_BOOLEAN, 8, NULL, 0x10,
44626
14
      NULL, HFILL }},
44627
44628
14
    {&hf_ieee80211_ff_dmg_params_policy,
44629
14
     {"ECAPC Policy Enforced", "wlan.dmg_params.policy",
44630
14
      FT_BOOLEAN, 8, NULL, 0x20,
44631
14
      NULL, HFILL }},
44632
44633
14
    {&hf_ieee80211_ff_dmg_params_spec_mgmt,
44634
14
     {"Spectrum Management", "wlan.dmg_params.spec_mgmt",
44635
14
      FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x40,
44636
14
      NULL, HFILL }},
44637
44638
14
    {&hf_ieee80211_ff_dmg_params_radio_measure,
44639
14
     {"Radio Measurement", "wlan.dmg_params.radio_measure",
44640
14
      FT_BOOLEAN, 8, TFS(&tfs_implemented_not_implemented), 0x80,
44641
14
      NULL, HFILL }},
44642
44643
14
    {&hf_ieee80211_ff_cc,
44644
14
     {"Clustering Control", "wlan.cc",
44645
14
      FT_UINT64, BASE_HEX , NULL, 0,
44646
14
      NULL, HFILL }},
44647
44648
14
    {&hf_ieee80211_ff_cc_abft_resp_addr,
44649
14
     {"A-BFT Responder Address", "wlan.cc.abft_resp_addr",
44650
14
      FT_ETHER, BASE_NONE , NULL, 0,
44651
14
      NULL, HFILL }},
44652
44653
14
    {&hf_ieee80211_ff_cc_sp_duration,
44654
14
     {"Beacon SP Duration", "wlan.cc.sp_duration",
44655
14
      FT_UINT8, BASE_DEC , NULL, 0,
44656
14
      NULL, HFILL }},
44657
44658
14
    {&hf_ieee80211_ff_cc_cluster_id,
44659
14
     {"Cluster ID", "wlan.cc.cluster_id",
44660
14
      FT_UINT64, BASE_DEC , NULL, 0,
44661
14
      NULL, HFILL }},
44662
44663
14
    {&hf_ieee80211_ff_cc_role,
44664
14
     {"Cluster Member Role", "wlan.cc.rold",
44665
14
      FT_UINT8, BASE_DEC , NULL, 0,
44666
14
      NULL, HFILL }},
44667
44668
14
    {&hf_ieee80211_ff_cc_max_mem,
44669
14
     {"Cluster MaxMem", "wlan.cc.max_mem",
44670
14
      FT_UINT8, BASE_DEC , NULL, 0,
44671
14
      NULL, HFILL }},
44672
44673
14
    {&hf_ieee80211_tag_relay_support,
44674
14
     {"Relay Supportability", "wlan.relay_capabilities.relay_support",
44675
14
      FT_BOOLEAN, 8, NULL, 0x01,
44676
14
      NULL, HFILL }},
44677
44678
14
    {&hf_ieee80211_tag_relay_use,
44679
14
     {"Relay Usability", "wlan.relay_capabilities.relay_use",
44680
14
      FT_BOOLEAN, 8, NULL, 0x02,
44681
14
      NULL, HFILL }},
44682
44683
14
    {&hf_ieee80211_tag_relay_permission,
44684
14
     {"Relay Permission", "wlan.relay_capabilities.relay_permission",
44685
14
      FT_BOOLEAN, 8, NULL, 0x04,
44686
14
      NULL, HFILL }},
44687
44688
14
    {&hf_ieee80211_tag_AC_power,
44689
14
     {"A/C Power", "wlan.relay_capabilities.AC_power",
44690
14
      FT_BOOLEAN, 8, NULL, 0x08,
44691
14
      NULL, HFILL }},
44692
44693
14
    {&hf_ieee80211_tag_relay_prefer,
44694
14
     {"Relay Preference", "wlan.relay_capabilities.relay_prefer",
44695
14
      FT_BOOLEAN, 8, NULL, 0x10,
44696
14
      NULL, HFILL }},
44697
44698
14
    {&hf_ieee80211_tag_duplex,
44699
14
     {"Duplex", "wlan.relay_capabilities.duplex",
44700
14
      FT_UINT8, BASE_DEC, NULL, 0x60,
44701
14
      NULL, HFILL }},
44702
44703
14
    {&hf_ieee80211_tag_cooperation,
44704
14
     {"Cooperation", "wlan.relay_capabilities.cooperation",
44705
14
      FT_BOOLEAN, 8, NULL, 0x80,
44706
14
      NULL, HFILL }},
44707
44708
#if 0
44709
    {&hf_ieee80211_ff_rcsi,
44710
     {"Relay Capable STA Info", "wlan.rcsi",
44711
      FT_UINT24, BASE_HEX, NULL, 0,
44712
      NULL, HFILL }},
44713
44714
    {&hf_ieee80211_ff_rcsi_aid,
44715
     {"AID", "wlan.rcsi.aid",
44716
      FT_UINT8, BASE_DEC, NULL, 0xff,
44717
      NULL, HFILL }},
44718
#endif
44719
44720
14
    {&hf_ieee80211_ff_band_id,
44721
14
     {"Band ID", "wlan.band_id",
44722
14
      FT_UINT8, BASE_DEC, VALS(band_id), 0x0,
44723
14
      NULL, HFILL }},
44724
44725
14
    {&hf_ieee80211_tag_move,
44726
14
     {"Move", "wlan.dmg_bss_param_change.move",
44727
14
      FT_BOOLEAN, 8, NULL, 0x01,
44728
14
      NULL, HFILL }},
44729
44730
14
    {&hf_ieee80211_tag_size,
44731
14
     {"Size", "wlan.dmg_bss_param_change.size",
44732
14
      FT_BOOLEAN, 8, NULL, 0x02,
44733
14
      NULL, HFILL }},
44734
44735
14
    {&hf_ieee80211_tag_tbtt_offset,
44736
14
     {"TBTT Offset", "wlan.dmg_bss_param_change.tbtt_offset",
44737
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0x0,
44738
14
      NULL, HFILL }},
44739
44740
14
    {&hf_ieee80211_tag_bi_duration,
44741
14
     {"BI Duration", "wlan.dmg_bss_param_change.bi_duration",
44742
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
44743
14
      NULL, HFILL }},
44744
44745
14
    {&hf_ieee80211_tag_dmg_capa_sta_addr,
44746
14
     {"STA Address", "wlan.dmg_capa.sta_addr",
44747
14
      FT_ETHER, BASE_NONE, NULL, 0,
44748
14
      "STA_Address", HFILL }},
44749
44750
14
    {&hf_ieee80211_tag_dmg_capa_aid,
44751
14
     {"AID", "wlan.dmg_capa.aid",
44752
14
      FT_UINT16, BASE_DEC, NULL, 0,
44753
14
      NULL, HFILL }},
44754
/* 8.4.2.127.2 DMG STA Capability Information field */
44755
14
    {&hf_ieee80211_tag_reverse_direction, /* DMG STA capa, bits [0] */
44756
14
     {"Reverse Direction", "wlan.dmg_capa.reverse_direction",
44757
14
      FT_BOOLEAN, 24, NULL, GENMASK(0, 0),
44758
14
      NULL, HFILL }},
44759
44760
14
    {&hf_ieee80211_tag_hlts, /* DMG STA capa, bits [1] */
44761
14
     {"Higher Layer Timer Synchronization", "wlan.dmg_capa.htls",
44762
14
      FT_BOOLEAN, 24, NULL, GENMASK(1, 1),
44763
14
      NULL, HFILL }},
44764
44765
14
    {&hf_ieee80211_tag_tpc, /* DMG STA capa, bits [2] */
44766
14
     {"TPC", "wlan.dmg_capa.tpc",
44767
14
      FT_BOOLEAN, 24, NULL, GENMASK(2, 2),
44768
14
      NULL, HFILL }},
44769
44770
14
    {&hf_ieee80211_tag_spsh, /* DMG STA capa, bits [3] */
44771
14
     {"SPSH and Interference Mitigation", "wlan.dmg_capa.spsh",
44772
14
      FT_BOOLEAN, 24, NULL, GENMASK(3, 3),
44773
14
      NULL, HFILL }},
44774
44775
14
    {&hf_ieee80211_tag_rx_antenna, /* DMG STA capa, bits [4..5] */
44776
14
     {"Number of RX DMG Antennas", "wlan.dmg_capa.num_rx",
44777
14
      FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), GENMASK(5, 4),
44778
14
      NULL, HFILL }},
44779
44780
14
    {&hf_ieee80211_tag_fast_link, /* DMG STA capa, bits [6] */
44781
14
     {"Fast Link Adaptation", "wlan.dmg_capa.fast_link",
44782
14
      FT_BOOLEAN, 24, NULL, GENMASK(6, 6),
44783
14
      NULL, HFILL }},
44784
44785
14
    {&hf_ieee80211_tag_num_sectors, /* DMG STA capa, bits [7..13] */
44786
14
     {"Total Number of Sectors", "wlan.dmg_capa.num_sectors",
44787
14
      FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), GENMASK(13, 7),
44788
14
      NULL, HFILL }},
44789
44790
14
    {&hf_ieee80211_tag_rxss_length, /* DMG STA capa, bits [14..19] */
44791
14
     {"RXSS Length", "wlan.dmg_capa.rxss_len",
44792
14
      FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_mul_two_base_custom), GENMASK(19, 14),
44793
14
      NULL, HFILL }},
44794
44795
14
    {&hf_ieee80211_tag_reciprocity, /* DMG STA capa, bits [20] */
44796
14
     {"DMG Antenna Reciprocity", "wlan.dmg_capa.reciprocity",
44797
14
      FT_BOOLEAN, 24, NULL, GENMASK(20, 20),
44798
14
      NULL, HFILL }},
44799
/* DMG STA capa, A-MPDU params, bits [21..26] */
44800
14
    {&hf_ieee80211_tag_max_ampdu_exp, /* DMG STA capa, bits [21..23] */
44801
14
     {"Maximum A-MPDU Length Exponent", "wlan.dmg_capa.max_ampdu_exp",
44802
14
      FT_UINT24, BASE_DEC, NULL, GENMASK(23, 21),
44803
14
      NULL, HFILL }},
44804
44805
14
    {&hf_ieee80211_tag_min_mpdu_spacing, /* DMG STA capa, bits [24..26] */
44806
14
     {"Minimum MPDU Start Spacing", "wlan.dmg_capa.min_mpdu_spacing",
44807
14
      FT_UINT24, BASE_DEC, NULL, GENMASK(26-24, 24-24),
44808
14
      NULL, HFILL }},
44809
44810
14
    {&hf_ieee80211_tag_ba_flow_control , /* DMG STA capa, bits [27] */
44811
14
     {"BA with Flow Control", "wlan.dmg_capa.bs_flow_ctrl",
44812
14
      FT_BOOLEAN, 24, NULL, GENMASK(27-24, 27-24),
44813
14
      NULL, HFILL }},
44814
/* DMG STA capa, supported MCS set, bits [28..51] */
44815
14
    {&hf_ieee80211_tag_max_sc_rx_mcs, /* DMG STA capa, bits [28..32] */
44816
14
     {"Maximum SC Rx MCS", "wlan.dmg_capa.max_sc_rx_mcs",
44817
14
      FT_UINT24, BASE_DEC, NULL, GENMASK(32-24, 28-24),
44818
14
      NULL, HFILL }},
44819
44820
14
    {&hf_ieee80211_tag_max_ofdm_rx_mcs, /* DMG STA capa, bits [33..37] */
44821
14
     {"Maximum OFDM Rx MCS", "wlan.dmg_capa.max_ofdm_rx_mcs",
44822
14
      FT_UINT24, BASE_DEC, NULL, GENMASK(37-24, 33-24),
44823
14
      NULL, HFILL }},
44824
44825
14
    {&hf_ieee80211_tag_max_sc_tx_mcs, /* DMG STA capa, bits [38..42] */
44826
14
     {"Maximum SC Tx MCS", "wlan.dmg_capa.max_sc_tx_mcs",
44827
14
      FT_UINT24, BASE_DEC, NULL, GENMASK(42-24, 38-24),
44828
14
      NULL, HFILL }},
44829
44830
14
    {&hf_ieee80211_tag_max_ofdm_tx_mcs, /* DMG STA capa, bits [43..47] */
44831
14
     {"Maximum OFDM Tx MCS", "wlan.dmg_capa.max_ofdm_tx_mcs",
44832
14
      FT_UINT24, BASE_DEC, NULL, GENMASK(47-24, 43-24),
44833
14
      NULL, HFILL }},
44834
44835
14
    {&hf_ieee80211_tag_low_power_supported, /* DMG STA capa, bits [48] */
44836
14
     {"Low Power SC PHY Supported", "wlan.dmg_capa.low_power_supported",
44837
14
      FT_BOOLEAN, 16, NULL, GENMASK(48-48, 48-48),
44838
14
      NULL, HFILL }},
44839
44840
14
    {&hf_ieee80211_tag_code_rate, /* DMG STA capa, bits [49] */
44841
14
     {"Code Rate 13/16", "wlan.dmg_capa.code_rate",
44842
14
      FT_BOOLEAN, 16, NULL, GENMASK(49-48, 49-48),
44843
14
      NULL, HFILL }},
44844
44845
14
    {&hf_ieee80211_tag_dtp, /* DMG STA capa, bits [52] */
44846
14
     {"DTP Supported", "wlan.dmg_capa.dtp",
44847
14
      FT_BOOLEAN, 16, NULL, GENMASK(52-48, 52-48),
44848
14
      NULL, HFILL }},
44849
44850
14
    {&hf_ieee80211_tag_appdu_supp, /* DMG STA capa, bits [53] */
44851
14
     {"A-PPDU Supported", "wlan.dmg_capa.appdu_supp",
44852
14
      FT_BOOLEAN, 16, NULL, GENMASK(53-48, 53-48),
44853
14
      NULL, HFILL }},
44854
44855
14
    {&hf_ieee80211_tag_heartbeat, /* DMG STA capa, bits [54] */
44856
14
     {"HeartBeat", "wlan.dmg_capa.heartbeat",
44857
14
      FT_BOOLEAN, 16, NULL, GENMASK(54-48, 54-48),
44858
14
      NULL, HFILL }},
44859
44860
14
    {&hf_ieee80211_tag_other_aid, /* DMG STA capa, bits [55] */
44861
14
     {"Supports Other_AID", "wlan.dmg_capa.other_aid",
44862
14
      FT_BOOLEAN, 16, NULL, GENMASK(55-48, 55-48),
44863
14
      NULL, HFILL }},
44864
44865
14
    {&hf_ieee80211_tag_pattern_recip, /* DMG STA capa, bits [56] */
44866
14
     {"Antenna Pattern Reciprocity", "wlan.dmg_capa.pattern_recip",
44867
14
      FT_BOOLEAN, 16, NULL, GENMASK(56-48, 56-48),
44868
14
      NULL, HFILL }},
44869
44870
14
    {&hf_ieee80211_tag_heartbeat_elapsed, /* DMG STA capa, bits [57..59] */
44871
14
     {"Heartbeat Elapsed Indication", "wlan.dmg_capa.heartbeat_elapsed",
44872
14
      FT_UINT16, BASE_DEC, NULL, GENMASK(59-48, 57-48),
44873
14
      NULL, HFILL }},
44874
44875
14
    {&hf_ieee80211_tag_grant_ack_supp, /* DMG STA capa, bits [60] */
44876
14
     {"Grant ACK Supported", "wlan.dmg_capa.grant_ack_supp",
44877
14
      FT_BOOLEAN, 16, NULL, GENMASK(60-48, 60-48),
44878
14
      NULL, HFILL }},
44879
44880
14
    {&hf_ieee80211_tag_RXSSTxRate_supp, /* DMG STA capa, bits [61] */
44881
14
     {"RXSSTxRate Supported", "wlan.dmg_capa.RXSSTxRate",
44882
14
      FT_BOOLEAN, 16, NULL, GENMASK(61-48, 61-48),
44883
14
      NULL, HFILL }},
44884
/* 8.4.2.127.3 DMG PCP/AP Capability Information field */
44885
14
    {&hf_ieee80211_tag_pcp_tddti, /* DMG PCP/AP capa, bits [0] */
44886
14
     {"TDDTI", "wlan.dmg_capa.pcp_tdtti",
44887
14
      FT_BOOLEAN, 16, NULL, GENMASK(0, 0),
44888
14
      NULL, HFILL }},
44889
44890
14
    {&hf_ieee80211_tag_pcp_PSA, /* DMG PCP/AP capa, bits [1] */
44891
14
     {"Pseudo-static Allocations", "wlan.dmg_capa.pcp_psa",
44892
14
      FT_BOOLEAN, 16, NULL, GENMASK(1, 1),
44893
14
      NULL, HFILL }},
44894
44895
14
    {&hf_ieee80211_tag_pcp_handover, /* DMG PCP/AP capa, bits [2] */
44896
14
     {"PDP Handover", "wlan.dmg_capa.pcp_handover",
44897
14
      FT_BOOLEAN, 16, NULL, GENMASK(2, 2),
44898
14
      NULL, HFILL }},
44899
44900
14
    {&hf_ieee80211_tag_pcp_max_assoc, /* DMG PCP/AP capa, bits [3..10] */
44901
14
     {"Max Associated STA Number", "wlan.dmg_capa.pcp_max_assoc",
44902
14
      FT_UINT16, BASE_DEC, NULL, GENMASK(10, 3),
44903
14
      NULL, HFILL }},
44904
44905
14
    {&hf_ieee80211_tag_pcp_power_src, /* DMG PCP/AP capa, bits [11] */
44906
14
     {"Power Source", "wlan.dmg_capa.pcp_power_src",
44907
14
      FT_BOOLEAN, 16, NULL, GENMASK(11, 11),
44908
14
      NULL, HFILL }},
44909
44910
14
    {&hf_ieee80211_tag_pcp_decenter, /* DMG PCP/AP capa, bits [12] */
44911
14
     {"Decentralized PCP/AP Clustering", "wlan.dmg_capa.pcp_decenter",
44912
14
      FT_BOOLEAN, 16, NULL, GENMASK(12, 12),
44913
14
      NULL, HFILL }},
44914
44915
14
    {&hf_ieee80211_tag_pcp_forwarding, /* DMG PCP/AP capa, bits [13] */
44916
14
     {"PCP Forwarding", "wlan.dmg_capa.pcp_forwarding",
44917
14
      FT_BOOLEAN, 16, NULL, GENMASK(13, 13),
44918
14
      NULL, HFILL }},
44919
44920
14
    {&hf_ieee80211_tag_pcp_center, /* DMG PCP/AP capa, bits [14] */
44921
14
     {"Centralized PCP/AP Clustering", "wlan.dmg_capa.pcp_center",
44922
14
      FT_BOOLEAN, 16, NULL, GENMASK(14, 14),
44923
14
      NULL, HFILL }},
44924
44925
14
    {&hf_ieee80211_tag_sta_beam_track, /* DMG STA beam track capa*/
44926
14
     {"STA Beam Tracking Time Limit", "wlan.dmg_capa.beam_track",
44927
14
      FT_UINT16, BASE_DEC | BASE_UNIT_STRING, UNS(&units_microseconds), 0,
44928
14
      NULL, HFILL }},
44929
44930
14
    {&hf_ieee80211_tag_ext_sc_mcs_max_tx, /* DMG STA Ext SC MCS Capa: Max TX*/
44931
14
     {"Extended SC Max Tx MCS Name", "wlan.dmg_capa.ext_sc_mcs_capa_max_tx",
44932
14
      FT_UINT8, BASE_DEC, VALS(extended_sc_mcs), GENMASK(2, 0),
44933
14
      NULL, HFILL }},
44934
44935
14
    {&hf_ieee80211_tag_ext_sc_mcs_tx_code_7_8, /* DMG STA Ext SC MCS Capa: Tx code rate 7/8*/
44936
14
     {"Extended SC Tx MCS code rate 7/8", "wlan.dmg_capa.ext_sc_mcs_tx_code_7_8",
44937
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), GENMASK(3, 3),
44938
14
      NULL, HFILL }},
44939
44940
14
    {&hf_ieee80211_tag_ext_sc_mcs_max_rx, /* DMG STA Ext SC MCS Capa: Max RX*/
44941
14
     {"Extended SC Max Rx MCS Name", "wlan.dmg_capa.ext_sc_mcs_capa_max_rx",
44942
14
      FT_UINT8, BASE_DEC, VALS(extended_sc_mcs), GENMASK(6, 4),
44943
14
      NULL, HFILL }},
44944
44945
14
    {&hf_ieee80211_tag_ext_sc_mcs_rx_code_7_8, /* DMG STA Ext SC MCS Capa: Rx code rate 7/8*/
44946
14
     {"Extended SC Rx MCS code rate 7/8", "wlan.dmg_capa.ext_sc_mcs_rx_code_7_8",
44947
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), GENMASK(7, 7),
44948
14
      NULL, HFILL }},
44949
44950
14
    {&hf_ieee80211_tag_max_basic_sf_amsdu, /* DMG Max Number of Basic Subframes in an A-MSDU*/
44951
14
     {"Max Number of Basic Subframes in an A-MSDU", "wlan.dmg_capa.max_basic_sf_amsdu",
44952
14
      FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(max_basic_sf_amsdu), 0,
44953
14
      NULL, HFILL }},
44954
44955
14
    {&hf_ieee80211_tag_max_short_sf_amsdu, /* DMG Max Number of short Subframes in an A-MSDU*/
44956
14
     {"Max Number of short Subframes in an A-MSDU", "wlan.dmg_capa.max_short_sf_amsdu",
44957
14
      FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(max_short_sf_amsdu), 0,
44958
14
      NULL, HFILL }},
44959
44960
14
    {&hf_ieee80211_tag_PSRSI,
44961
14
     {"PS Request Suspension Interval", "wlan.dmg_oper.psrsi",
44962
14
      FT_UINT8, BASE_DEC, NULL, 0,
44963
14
      NULL, HFILL }},
44964
44965
14
    {&hf_ieee80211_tag_min_BHI_duration,
44966
14
     {"Min BHI Duration", "wlan.dmg_oper.min_BHI_duration",
44967
14
      FT_UINT16, BASE_DEC, NULL, 0,
44968
14
      NULL, HFILL }},
44969
44970
14
    {&hf_ieee80211_tag_brdct_sta_info_dur,
44971
14
     {"Broadcast STA Info Duration", "wlan.dmg_oper.brdcst_sta_info_dur",
44972
14
      FT_UINT8, BASE_DEC, NULL, 0,
44973
14
      NULL, HFILL }},
44974
44975
14
    {&hf_ieee80211_tag_assoc_resp_confirm_time,
44976
14
     {"Associated Response Confirm Time", "wlan.dmg_oper.assoc_resp_confirm_time",
44977
14
      FT_UINT8, BASE_DEC, NULL, 0,
44978
14
      NULL, HFILL }},
44979
44980
14
    {&hf_ieee80211_tag_min_pp_duration,
44981
14
     {"Min PP Duration", "wlan.dmg_oper.min_pp_duration",
44982
14
      FT_UINT8, BASE_DEC, NULL, 0,
44983
14
      NULL, HFILL }},
44984
44985
14
    {&hf_ieee80211_tag_SP_idle_timeout,
44986
14
     {"SP Idle Timeout", "wlan.dmg_oper.SP_idle_timeout",
44987
14
      FT_UINT8, BASE_DEC, NULL, 0,
44988
14
      NULL, HFILL }},
44989
44990
14
    {&hf_ieee80211_tag_max_lost_beacons,
44991
14
     {"Max Lost Beacons", "wlan.dmg_oper.max_lost_beacons",
44992
14
      FT_UINT8, BASE_DEC, NULL, 0,
44993
14
      NULL, HFILL }},
44994
44995
14
    {&hf_ieee80211_tag_type,
44996
14
     {"Type", "wlan.sctor_id.type",
44997
14
      FT_UINT32, BASE_HEX, NULL, 0x0000000f,
44998
14
      NULL, HFILL }},
44999
45000
14
    {&hf_ieee80211_tag_tap1,
45001
14
     {"Tap 1", "wlan.sctor_id.tap1",
45002
14
      FT_UINT32, BASE_HEX, NULL, 0x000003f0,
45003
14
      NULL, HFILL }},
45004
45005
14
    {&hf_ieee80211_tag_state1,
45006
14
     {"State 1", "wlan.sctor_id.state1",
45007
14
      FT_UINT32, BASE_HEX, NULL, 0x0000fc00,
45008
14
      NULL, HFILL }},
45009
45010
14
    {&hf_ieee80211_tag_tap2,
45011
14
     {"Tap 2", "wlan.sctor_id.tap2",
45012
14
      FT_UINT32, BASE_HEX, NULL, 0x00ff0000,
45013
14
      NULL, HFILL }},
45014
45015
14
    {&hf_ieee80211_tag_state2,
45016
14
     {"State 2", "wlan.sctor_id.state2",
45017
14
      FT_UINT32, BASE_HEX, NULL, 0xff000000,
45018
14
      NULL, HFILL }},
45019
45020
14
    {&hf_ieee80211_tag_allocation_id,
45021
14
     {"Allocation ID", "wlan.ext_sched.alloc_id",
45022
14
      FT_UINT16, BASE_DEC, NULL, 0x000f,
45023
14
      NULL, HFILL }},
45024
45025
14
    {&hf_ieee80211_tag_allocation_type,
45026
14
     {"Allocation Type", "wlan.ext_sched.alloc_type",
45027
14
      FT_UINT16, BASE_DEC, VALS(allocation_type), 0x0070,
45028
14
      NULL, HFILL }},
45029
45030
14
    {&hf_ieee80211_tag_pseudo_static,
45031
14
     {"Pseudo-static", "wlan.ext_sched.p_static",
45032
14
      FT_BOOLEAN, 16, NULL, 0x0080,
45033
14
      NULL, HFILL }},
45034
45035
14
    {&hf_ieee80211_tag_truncatable,
45036
14
     {"Truncatable", "wlan.ext_sched.truncatable",
45037
14
      FT_BOOLEAN, 16, NULL, 0x0100,
45038
14
      NULL, HFILL }},
45039
45040
14
    {&hf_ieee80211_tag_extendable,
45041
14
     {"Extendable", "wlan.ext_sched.extendable",
45042
14
      FT_BOOLEAN, 16, NULL, 0x0200,
45043
14
      NULL, HFILL }},
45044
45045
14
    {&hf_ieee80211_tag_pcp_active,
45046
14
     {"PCP Active", "wlan.ext_sched.pcp_active",
45047
14
      FT_BOOLEAN, 16, NULL, 0x0400,
45048
14
      NULL, HFILL }},
45049
45050
14
    {&hf_ieee80211_tag_lp_sc_used,
45051
14
     {"LP SC Used", "wlan.ext_sched.lp_sc_used",
45052
14
      FT_BOOLEAN, 16, NULL, 0x0800,
45053
14
      NULL, HFILL }},
45054
45055
14
    {&hf_ieee80211_tag_src_aid,
45056
14
     {"Source AID", "wlan.ext_sched.src_id",
45057
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45058
14
      NULL, HFILL }},
45059
45060
14
    {&hf_ieee80211_tag_dest_aid,
45061
14
     {"Destination AID", "wlan.ext_sched.dest_id",
45062
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45063
14
      NULL, HFILL }},
45064
45065
14
    {&hf_ieee80211_tag_alloc_start,
45066
14
     {"Allocation Start", "wlan.ext_sched.alloc_start",
45067
14
      FT_UINT32, BASE_DEC, NULL, 0,
45068
14
      NULL, HFILL }},
45069
45070
14
    {&hf_ieee80211_tag_alloc_block_duration,
45071
14
     {"Allocation Block Duration", "wlan.ext_sched.block_duration",
45072
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
45073
14
      NULL, HFILL }},
45074
45075
14
    {&hf_ieee80211_tag_num_blocks,
45076
14
     {"Number of Blocks", "wlan.ext_sched.num_blocks",
45077
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45078
14
      NULL, HFILL }},
45079
45080
14
    {&hf_ieee80211_tag_alloc_block_period,
45081
14
     {"Allocation Block Period", "wlan.ext_sched.alloc_block_period",
45082
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
45083
14
      NULL, HFILL }},
45084
45085
14
    {&hf_ieee80211_tag_aid,
45086
14
     {"AID", "wlan.sta_avail.aid",
45087
14
      FT_UINT16, BASE_DEC, NULL, 0x00ff,
45088
14
      NULL, HFILL }},
45089
45090
14
    {&hf_ieee80211_tag_cbap,
45091
14
     {"CBAP", "wlan.sta_avail.cbap",
45092
14
      FT_BOOLEAN, 16, NULL, 0x0100,
45093
14
      NULL, HFILL }},
45094
45095
14
    {&hf_ieee80211_tag_pp_avail,
45096
14
     {"PP Available", "wlan.sta_avail.pp_avail",
45097
14
      FT_BOOLEAN, 16, NULL, 0x0200,
45098
14
      NULL, HFILL }},
45099
45100
14
    {&hf_ieee80211_tag_next_ati_start_time,
45101
14
     {"Start Time", "wlan.next_ati.start_time",
45102
14
      FT_UINT32, BASE_DEC, NULL, 0,
45103
14
      NULL, HFILL }},
45104
45105
14
    {&hf_ieee80211_tag_next_ati_duration,
45106
14
     {"ATI Duration", "wlan.next_ati.duration",
45107
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
45108
14
      NULL, HFILL }},
45109
45110
14
    {&hf_ieee80211_tag_old_bssid,
45111
14
     {"Old BSSID", "wlan.pcp_handover.old_bssid",
45112
14
      FT_ETHER, BASE_NONE, NULL, 0,
45113
14
      "OLD_BSSID", HFILL }},
45114
45115
14
    {&hf_ieee80211_tag_new_pcp_addr,
45116
14
     {"New PCP Address", "wlan.pcp_handover.new_pcp_addr",
45117
14
      FT_ETHER, BASE_NONE, NULL, 0,
45118
14
      "New_PCP_Address", HFILL }},
45119
45120
14
    {&hf_ieee80211_tag_bssid,
45121
14
     {"BSSID", "wlan.quiet_res.bssid",
45122
14
      FT_ETHER, BASE_NONE, NULL, 0,
45123
14
      "BSS-ID", HFILL }},
45124
45125
14
    {&hf_ieee80211_tag_duplex_relay,
45126
14
     {"Duplex", "wlan.relay_capabilities.duplex",
45127
14
      FT_UINT8, BASE_DEC, NULL, 0x01,
45128
14
      NULL, HFILL }},
45129
45130
14
    {&hf_ieee80211_tag_cooperation_relay,
45131
14
     {"Cooperation", "wlan.relay_capabilities.cooperation",
45132
14
      FT_BOOLEAN, 8, NULL, 0x02,
45133
14
      NULL, HFILL }},
45134
45135
14
    {&hf_ieee80211_tag_tx_mode,
45136
14
     {"TX-Mode", "wlan.relay_trans_param.tx_mode",
45137
14
      FT_BOOLEAN, 8, NULL, 0x04,
45138
14
      NULL, HFILL }},
45139
45140
14
    {&hf_ieee80211_tag_link_change_interval,
45141
14
     {"Link Change Interval", "wlan.relay_trans_param.link_change_interval",
45142
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0x0,
45143
14
      NULL, HFILL }},
45144
45145
14
    {&hf_ieee80211_tag_data_sensing_time,
45146
14
     {"Data Sensing Time", "wlan.relay_trans_param.data_sensing_time",
45147
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45148
14
      NULL, HFILL }},
45149
45150
14
    {&hf_ieee80211_tag_first_period,
45151
14
     {"First Period", "wlan.relay_trans_param.first_period",
45152
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
45153
14
      NULL, HFILL }},
45154
45155
14
    {&hf_ieee80211_tag_second_period,
45156
14
     {"Second Period", "wlan.relay_trans_param.second_period",
45157
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
45158
14
      NULL, HFILL }},
45159
45160
14
    {&hf_ieee80211_tag_initiator,
45161
14
     {"Initiator", "wlan.beam_refine.initiator",
45162
14
      FT_BOOLEAN, 40, NULL, 0x0000000001,
45163
14
      NULL, HFILL }},
45164
45165
14
    {&hf_ieee80211_tag_tx_train_res,
45166
14
     {"TX-train-response", "wlan.beam_refine.tx_train_res",
45167
14
      FT_BOOLEAN, 40, NULL, 0x0000000002,
45168
14
      NULL, HFILL }},
45169
45170
14
    {&hf_ieee80211_tag_rx_train_res,
45171
14
     {"RX-train-response", "wlan.beam_refine.rx_train_res",
45172
14
      FT_BOOLEAN, 40, NULL, 0x0000000004,
45173
14
      NULL, HFILL }},
45174
45175
14
    {&hf_ieee80211_tag_tx_trn_ok,
45176
14
     {"TX-TRN-OK", "wlan.beam_refine.tx_trn_ok",
45177
14
      FT_BOOLEAN, 40, NULL, 0x0000000008,
45178
14
      NULL, HFILL }},
45179
45180
14
    {&hf_ieee80211_tag_txss_fbck_req,
45181
14
     {"TXSS-FBCK-REQ", "wlan.beam_refine.txss_fbck_req",
45182
14
      FT_BOOLEAN, 40, NULL, 0x0000000010,
45183
14
      NULL, HFILL }},
45184
45185
14
    {&hf_ieee80211_tag_bs_fbck,
45186
14
     {"BS-FBCK", "wlan.beam_refine.bs_fbck",
45187
14
      FT_UINT40, BASE_DEC, NULL, 0x00000007e0,
45188
14
      NULL, HFILL }},
45189
45190
14
    {&hf_ieee80211_tag_bs_fbck_antenna_id,
45191
14
     {"BS-FBCK Antenna ID", "wlan.beam_refine.bs_fbck_antenna_id",
45192
14
      FT_UINT40, BASE_DEC, NULL, 0x0000001800,
45193
14
      NULL, HFILL }},
45194
45195
14
    {&hf_ieee80211_tag_snr_requested,
45196
14
     {"SNR Requested", "wlan.beam_refine.snr_req",
45197
14
      FT_BOOLEAN, 40, NULL, 0x0000002000,
45198
14
      NULL, HFILL }},
45199
45200
14
    {&hf_ieee80211_tag_channel_measurement_requested,
45201
14
     {"Channel Measurement Requested", "wlan.beam_refine.ch_measure_req",
45202
14
      FT_BOOLEAN, 40, NULL, 0x0000004000,
45203
14
      NULL, HFILL }},
45204
45205
14
    {&hf_ieee80211_tag_number_of_taps_requested,
45206
14
     {"Number of Taps Requested", "wlan.beam_refine.taps_req",
45207
14
      FT_UINT40, BASE_DEC | BASE_VAL64_STRING, VALS64(number_of_taps_values), 0x0000018000,
45208
14
      NULL, HFILL }},
45209
45210
14
    {&hf_ieee80211_tag_sector_id_order_req,
45211
14
     {"Sector ID Order Requested", "wlan.beam_refine.sector_id_req",
45212
14
      FT_BOOLEAN, 40, NULL, 0x0000020000,
45213
14
      NULL, HFILL }},
45214
45215
14
    {&hf_ieee80211_tag_snr_present,
45216
14
     {"SNR Present", "wlan.beam_refine.snr_present",
45217
14
      FT_BOOLEAN, 40, NULL, 0x0000040000,
45218
14
      NULL, HFILL }},
45219
45220
14
    {&hf_ieee80211_tag_channel_measurement_present,
45221
14
     {"Channel Measurement Present", "wlan.beam_refine.ch_measure_present",
45222
14
      FT_BOOLEAN, 40, NULL, 0x0000080000,
45223
14
      NULL, HFILL }},
45224
45225
14
    {&hf_ieee80211_tag_tap_delay_present,
45226
14
     {"Tap Delay Present", "wlan.beam_refine.tap_delay_present",
45227
14
      FT_BOOLEAN, 40, NULL, 0x0000100000,
45228
14
      NULL, HFILL }},
45229
45230
14
    {&hf_ieee80211_tag_number_of_taps_present,
45231
14
     {"Number of Taps Present", "wlan.beam_refine.taps_present",
45232
14
      FT_UINT40, BASE_DEC | BASE_VAL64_STRING, VALS64(number_of_taps_values), 0x0000600000,
45233
14
      NULL, HFILL }},
45234
45235
14
    {&hf_ieee80211_tag_number_of_measurement,
45236
14
     {"Number of Measurements", "wlan.beam_refine.num_measurement",
45237
14
      FT_UINT40, BASE_DEC, NULL, 0x003f800000,
45238
14
      NULL, HFILL }},
45239
45240
14
    {&hf_ieee80211_tag_sector_id_order_present,
45241
14
     {"Sector ID Order Present", "wlan.beam_refine.sector_id_present",
45242
14
      FT_BOOLEAN, 40, NULL, 0x0040000000,
45243
14
      NULL, HFILL }},
45244
45245
14
    {&hf_ieee80211_tag_number_of_beams,
45246
14
     {"Number of Beams", "wlan.beam_refine.num_beams",
45247
14
      FT_UINT40, BASE_DEC, NULL, 0x0f80000000,
45248
14
      NULL, HFILL }},
45249
45250
14
    {&hf_ieee80211_tag_mid_extension,
45251
14
     {"MID Extension", "wlan.beam_refine.mid_ext",
45252
14
      FT_BOOLEAN, 40, NULL, 0x1000000000,
45253
14
      NULL, HFILL }},
45254
45255
14
    {&hf_ieee80211_tag_capability_request,
45256
14
     {"Capability Request", "wlan.beam_refine.cap_req",
45257
14
      FT_BOOLEAN, 40, NULL, 0x2000000000,
45258
14
      NULL, HFILL }},
45259
45260
14
    {&hf_ieee80211_tag_beam_refine_reserved,
45261
14
     {"Reserved", "wlan.beam_refine.reserved",
45262
14
      FT_UINT40, BASE_HEX, NULL, 0xc000000000,
45263
14
      NULL, HFILL }},
45264
45265
14
    {&hf_ieee80211_tag_nextpcp_list,
45266
14
      {"AID of NextPCP", "wlan.next_pcp.list",
45267
14
       FT_UINT8, BASE_DEC, NULL, 0,
45268
14
       NULL, HFILL }},
45269
45270
14
    {&hf_ieee80211_tag_nextpcp_token,
45271
14
      {"NextPCP List Token", "wlan.next_pcp.token",
45272
14
       FT_UINT8, BASE_DEC, NULL, 0,
45273
14
       NULL, HFILL }},
45274
45275
14
    {&hf_ieee80211_tag_remaining_BI,
45276
14
      {"Remaining BI's", "wlan.pcp_handover.remaining_BIs",
45277
14
       FT_UINT8, BASE_DEC, NULL, 0,
45278
14
       NULL, HFILL }},
45279
45280
14
    {&hf_ieee80211_tag_request_token,
45281
14
      {"Request Token", "wlan.request_token",
45282
14
       FT_UINT16, BASE_DEC, NULL, 0,
45283
14
       NULL, HFILL }},
45284
45285
14
    {&hf_ieee80211_tag_bi_start_time,
45286
14
      {"BI Start Time", "wlan.bi_start_time",
45287
14
       FT_UINT32, BASE_DEC, NULL, 0,
45288
14
       NULL, HFILL }},
45289
45290
14
    {&hf_ieee80211_tag_sleep_cycle,
45291
14
      {"Sleep Cycle", "wlan.sleep_cycle",
45292
14
       FT_UINT16, BASE_DEC, NULL, 0,
45293
14
       NULL, HFILL }},
45294
45295
14
    {&hf_ieee80211_tag_num_awake_bis,
45296
14
      {"Number of Awake/Doze BIs", "wlan.num_awake_bis",
45297
14
       FT_UINT16, BASE_DEC, NULL, 0,
45298
14
       NULL, HFILL }},
45299
45300
14
    {&hf_ieee80211_ff_dmg_action_code,
45301
14
     {"DMG Action", "wlan.fixed.dmg_act",
45302
14
      FT_UINT8, BASE_HEX, VALS(ff_dmg_action_flags), 0,
45303
14
      "Action Code", HFILL }},
45304
45305
14
    {&hf_ieee80211_ff_unprotected_dmg_action_code,
45306
14
     {"Unprotected DMG Action", "wlan.fixed.unprotected_dmg_act",
45307
14
      FT_UINT8, BASE_HEX, VALS(ff_unprotected_dmg_action_flags), 0,
45308
14
      "Action Code", HFILL }},
45309
45310
14
    {&hf_ieee80211_ff_dmg_pwr_mgmt,
45311
14
      {"DMG Power Management", "wlan.dmg.pwr_mgmt",
45312
14
       FT_BOOLEAN, 8, NULL, 0x01,
45313
14
       NULL, HFILL }},
45314
45315
14
    {&hf_ieee80211_ff_subject_address,
45316
14
      {"Subject Address", "wlan.dmg.subject_addr",
45317
14
       FT_ETHER, BASE_NONE, NULL, 0,
45318
14
       "MAC address of requested STA", HFILL }},
45319
45320
14
    {&hf_ieee80211_ff_handover_reason,
45321
14
      {"Handover Reason", "wlan.dmg.handover_reason",
45322
14
       FT_UINT8, BASE_DEC, NULL, 0x03,
45323
14
       NULL, HFILL }},
45324
45325
14
    {&hf_ieee80211_ff_handover_remaining_bi,
45326
14
      {"Handover Remaining BI", "wlan.dmg.handover_remaining_bi",
45327
14
       FT_UINT8, BASE_DEC, NULL, 0x01,
45328
14
       NULL, HFILL }},
45329
45330
14
    {&hf_ieee80211_ff_handover_result,
45331
14
      {"Handover Result", "wlan.dmg.handover_result",
45332
14
       FT_UINT8, BASE_DEC, NULL, 0x01,
45333
14
       NULL, HFILL }},
45334
45335
14
    {&hf_ieee80211_ff_handover_reject_reason,
45336
14
      {"Handover Reject Reason", "wlan.dmg.handover_reject_reason",
45337
14
       FT_UINT8, BASE_DEC, NULL, 0x03,
45338
14
       NULL, HFILL }},
45339
45340
14
    {&hf_ieee80211_ff_destination_reds_aid,
45341
14
      {"Destination REDS AID", "wlan.dmg.destination_reds_aid",
45342
14
       FT_UINT16, BASE_DEC, NULL, 0,
45343
14
       NULL, HFILL }},
45344
45345
14
    {&hf_ieee80211_ff_destination_aid,
45346
14
      {"Destination AID", "wlan.dmg.destination_aid",
45347
14
       FT_UINT16, BASE_DEC, NULL, 0,
45348
14
       NULL, HFILL }},
45349
45350
14
    {&hf_ieee80211_ff_relay_aid,
45351
14
      {"Relay AID", "wlan.dmg.relay_aid",
45352
14
       FT_UINT16, BASE_DEC, NULL, 0,
45353
14
       NULL, HFILL }},
45354
45355
14
    {&hf_ieee80211_ff_source_aid,
45356
14
      {"Source AID", "wlan.dmg.source_aid",
45357
14
       FT_UINT16, BASE_DEC, NULL, 0,
45358
14
       NULL, HFILL }},
45359
45360
14
    {&hf_ieee80211_ff_timing_offset,
45361
14
      {"Timing Offset", "wlan.dmg.timing_offset",
45362
14
       FT_UINT16, BASE_DEC, NULL, 0,
45363
14
       NULL, HFILL }},
45364
45365
14
    {&hf_ieee80211_ff_sampling_frequency_offset,
45366
14
      {"Sampling Frequency Offset", "wlan.dmg.sampling_frequency_offset",
45367
14
       FT_UINT16, BASE_DEC, NULL, 0,
45368
14
       NULL, HFILL }},
45369
45370
14
    {&hf_ieee80211_ff_relay_operation_type,
45371
14
      {"Relay Operation Type", "wlan.dmg.relay_operation_type",
45372
14
       FT_UINT8, BASE_DEC, NULL, 0x03,
45373
14
       NULL, HFILL }},
45374
45375
14
    {&hf_ieee80211_ff_peer_sta_aid,
45376
14
      {"Peer STA AID", "wlan.dmg.peer_sta_aid",
45377
14
       FT_UINT8, BASE_DEC, NULL, 0,
45378
14
       NULL, HFILL }},
45379
45380
14
    {&hf_ieee80211_ff_snr,
45381
14
      {"SNR", "wlan.dmg.snr",
45382
14
       FT_UINT8, BASE_DEC, NULL, 0,
45383
14
       NULL, HFILL }},
45384
45385
14
    {&hf_ieee80211_ff_internal_angle,
45386
14
      {"Internal Angle", "wlan.dmg.internal_angle",
45387
14
       FT_UINT8, BASE_DEC, NULL, 0xfe,
45388
14
       NULL, HFILL }},
45389
45390
14
    {&hf_ieee80211_ff_recommend,
45391
14
      {"Recommend", "wlan.dmg.recommend",
45392
14
       FT_UINT8, BASE_DEC, NULL, 0x01,
45393
14
       NULL, HFILL }},
45394
45395
14
    {&hf_ieee80211_ff_fst_action_code,
45396
14
      {"FST Action Code", "wlan.fst.action_code",
45397
14
       FT_UINT8, BASE_HEX, VALS(ff_fst_action_flags), 0,
45398
14
       NULL, HFILL }},
45399
45400
14
    {&hf_ieee80211_ff_robust_av_streaming_action_code,
45401
14
     {"Robust AV Streaming Action Code", "wlan.robust_av_streaming.action_code",
45402
14
      FT_UINT8, BASE_HEX, VALS(ff_robust_av_streaming_action_flags), 0,
45403
14
      NULL, HFILL }},
45404
45405
14
    {&hf_ieee80211_ff_llt,
45406
14
      {"Link Loss Timeout", "wlan.fst.llt",
45407
14
       FT_UINT32, BASE_DEC, NULL, 0,
45408
14
       NULL, HFILL }},
45409
45410
14
    {&hf_ieee80211_ff_fsts_id,
45411
14
      {"FSTS ID", "wlan.session_trans.fsts_id",
45412
14
       FT_UINT32, BASE_DEC, NULL, 0,
45413
14
       NULL, HFILL }},
45414
45415
14
    {&hf_ieee80211_ff_mmpdu_len,
45416
14
      {"MMPDU Length", "wlan.fst.mmpdu_length",
45417
14
       FT_UINT16, BASE_DEC, NULL, 0,
45418
14
       NULL, HFILL }},
45419
45420
14
    {&hf_ieee80211_ff_mmpdu_ctrl,
45421
14
      {"MMPDU Control", "wlan.fst.mmpdu_ctrl",
45422
14
       FT_UINT16, BASE_HEX, NULL, 0,
45423
14
       NULL, HFILL }},
45424
45425
14
    {&hf_ieee80211_ff_oct_mmpdu,
45426
14
      {"OCT MMPDU", "wlan.fst.oct_mmpdu",
45427
14
       FT_BYTES, BASE_NONE, NULL, 0,
45428
14
       NULL, HFILL }},
45429
45430
14
    {&hf_ieee80211_ff_scs_scsid,
45431
14
     {"SCSID", "wlan.scs.scs_status_list.scsid",
45432
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
45433
45434
14
    {&hf_ieee80211_ff_scs_status,
45435
14
     {"Status", "wlan.scs.scs_status_list.status",
45436
14
      FT_UINT16, BASE_DEC|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
45437
14
      NULL, HFILL }},
45438
45439
14
    {&hf_ieee80211_ff_scs_response_count,
45440
14
     {"Count", "wlan.scs.scs_response.count",
45441
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
45442
45443
14
    {&hf_ieee80211_ff_vht_mimo_cntrl,
45444
14
     {"VHT MIMO Control", "wlan.vht.mimo_control.control",
45445
14
      FT_UINT24, BASE_HEX, NULL, 0x0,
45446
14
      NULL, HFILL }},
45447
45448
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_nc_index,
45449
14
     {"Nc Index", "wlan.vht.mimo_control.ncindex",
45450
14
      FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_nc_index_vals), 0x000007,
45451
14
      "Number of Columns Less One", HFILL }},
45452
45453
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_nr_index,
45454
14
     {"Nr Index", "wlan.vht.mimo_control.nrindex",
45455
14
      FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_nr_index_vals), 0x000038,
45456
14
      "Number of Rows Less One", HFILL }},
45457
45458
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_channel_width,
45459
14
     {"Channel Width", "wlan.vht.mimo_control.chanwidth",
45460
14
      FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_channel_width_vals), 0x0000C0,
45461
14
      NULL, HFILL }},
45462
45463
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_grouping,
45464
14
     {"Grouping (Ng)", "wlan.vht.mimo_control.grouping",
45465
14
      FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_grouping_vals), 0x000300,
45466
14
      NULL, HFILL }},
45467
45468
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_codebook_info,
45469
14
     {"Codebook Information", "wlan.vht.mimo_control.codebookinfo",
45470
14
      FT_UINT24, BASE_HEX, NULL, 0x000400,
45471
14
      NULL, HFILL }},
45472
45473
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_feedback_type,
45474
14
     {"Feedback Type", "wlan.vht.mimo_control.feedbacktype",
45475
14
      FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_feedback_vals), 0x000800,
45476
14
      NULL, HFILL }},
45477
45478
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_remaining_feedback_seg,
45479
14
     {"Remaining Feedback Segments", "wlan.vht.mimo_control.remainingfeedbackseg",
45480
14
      FT_UINT24, BASE_HEX, NULL, 0x007000,
45481
14
      NULL, HFILL }},
45482
45483
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_first_feedback_seg,
45484
14
     {"First Feedback Segments", "wlan.vht.mimo_control.firstfeedbackseg",
45485
14
      FT_UINT24, BASE_HEX, NULL, 0x008000,
45486
14
      NULL, HFILL }},
45487
45488
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_reserved,
45489
14
     {"Reserved", "wlan.vht.mimo_control.reserved",
45490
14
      FT_UINT24, BASE_HEX, NULL, 0x030000,
45491
14
      NULL, HFILL }},
45492
45493
14
    {&hf_ieee80211_ff_vht_mimo_cntrl_sounding_dialog_token_number,
45494
14
     {"Sounding Dialog Token Number", "wlan.vht.mimo_control.sounding_dialog_token_nbr",
45495
14
      FT_UINT24, BASE_HEX, NULL, 0xFC0000,
45496
14
      NULL, HFILL }},
45497
45498
14
    {&hf_ieee80211_ff_vht_action,
45499
14
      {"VHT Action", "wlan.vht.action",
45500
14
       FT_UINT8, BASE_DEC, VALS(vht_action_vals), 0,
45501
14
       NULL, HFILL }},
45502
45503
14
    {&hf_ieee80211_vht_compressed_beamforming_report,
45504
14
      {"VHT Compressed Beamforming Report", "wlan.vht.compressed_beamforming_report",
45505
14
       FT_BYTES, BASE_NONE, NULL, 0,
45506
14
       NULL, HFILL }},
45507
45508
14
    {&hf_ieee80211_vht_mu_exclusive_beamforming_report,
45509
14
      {"VHT MU Exclusive Beamforming Report","wlan.vht.exclusive_beamforming_report",
45510
14
       FT_BYTES, BASE_NONE, NULL, 0,
45511
14
       NULL, HFILL }},
45512
45513
14
    {&hf_ieee80211_vht_compressed_beamforming_report_snr,
45514
14
      {"Signal to Noise Ratio (SNR)", "wlan.vht.compressed_beamforming_report.snr",
45515
14
       FT_INT8, BASE_DEC, NULL, 0,
45516
14
       NULL, HFILL }},
45517
45518
14
    {&hf_ieee80211_vht_compressed_beamform_scidx,
45519
14
     {"SCIDX", "wlan.vht.compressed_beamforming_report.scidx",
45520
14
      FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
45521
45522
14
    {&hf_ieee80211_vht_mu_exclusive_beamforming_delta_snr,
45523
14
      {"Delta SNR for space-time stream Nc for subcarrier k", "wlan.vht.exclusive_beamforming_report.delta_snr",
45524
14
       FT_NONE, BASE_NONE, NULL, 0,
45525
14
       NULL, HFILL }},
45526
45527
14
    {&hf_ieee80211_vht_group_id_management,
45528
14
      {"Group ID Management", "wlan.vht.group_id_management",
45529
14
       FT_BYTES, BASE_NONE, NULL, 0,
45530
14
       NULL, HFILL }},
45531
45532
14
    {&hf_ieee80211_vht_membership_status_array,
45533
14
      {"Membership Status Array", "wlan.vht.membership_status_array",
45534
14
       FT_BYTES, BASE_NONE, NULL, 0,
45535
14
       NULL, HFILL }},
45536
45537
14
      {&hf_ieee80211_vht_user_position_array,
45538
14
        {"User Position Array", "wlan.vht.user_position_array",
45539
14
         FT_BYTES, BASE_NONE, NULL, 0,
45540
14
         NULL, HFILL }},
45541
45542
14
      {&hf_ieee80211_vht_membership_status_field,
45543
14
        {"Membership Status Field", "wlan.vht.membership_status_array.field",
45544
14
         FT_UINT8, BASE_DEC, NULL, 0,
45545
14
         NULL, HFILL }},
45546
45547
14
      {&hf_ieee80211_vht_user_position_field,
45548
14
        {"User Position Field", "wlan.vht.user_position_array.field",
45549
14
         FT_UINT8, BASE_DEC, NULL, 0,
45550
14
         NULL, HFILL }},
45551
45552
14
    {&hf_ieee80211_vht_operation_mode_notification,
45553
14
      {"Operation Mode Notification", "wlan.vht.operation_mode_notification",
45554
14
       FT_BYTES, BASE_NONE, NULL, 0,
45555
14
       NULL, HFILL }},
45556
45557
14
    {&hf_ieee80211_ff_he_action,
45558
14
      {"HE Action", "wlan.he.action",
45559
14
       FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(he_action_rvals), 0,
45560
14
       NULL, HFILL }},
45561
45562
14
    {&hf_ieee80211_ff_protected_he_action,
45563
14
      {"Protected HE Action", "wlan.he.protected_action",
45564
14
       FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(protected_he_action_rvals), 0,
45565
14
       NULL, HFILL }},
45566
45567
14
    {&hf_ieee80211_ff_protected_eht_action,
45568
14
      {"Protected EHT Action", "wlan.eht.protected_action",
45569
14
       FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(protected_eht_action_rvals), 0,
45570
14
       NULL, HFILL }},
45571
45572
14
    {&hf_ieee80211_ff_protected_ftm_action,
45573
14
      {"Protected FTM Action", "wlan.ftm.protected_action",
45574
14
       FT_UINT8, BASE_DEC, VALS(protected_ftm_action_vals), 0,
45575
14
       NULL, HFILL }},
45576
45577
14
    {&hf_ieee80211_ff_eht_action,
45578
14
     {"EHT Action", "wlan.eht.action",
45579
14
      FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(eht_action_rvals), 0,
45580
14
      NULL, HFILL }},
45581
45582
14
    {&hf_ieee80211_he_mimo_control_nc_index,
45583
14
     {"Nc Index", "wlan.he.mimo.nc_index",
45584
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(he_mimo_cntrl_nc_index_vals),
45585
14
      0x0000000007, NULL, HFILL }},
45586
45587
14
    {&hf_ieee80211_he_mimo_control_nr_index,
45588
14
     {"Nr Index", "wlan.he.mimo.nr_index",
45589
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(he_mimo_cntrl_nr_index_vals),
45590
14
      0x0000000038, NULL, HFILL }},
45591
45592
14
    {&hf_ieee80211_he_mimo_control_bw,
45593
14
     {"BW", "wlan.he.mimo.bw",
45594
14
      FT_UINT40, BASE_DEC, NULL, 0x00000000C0, NULL, HFILL }},
45595
45596
14
    {&hf_ieee80211_he_mimo_control_grouping,
45597
14
     {"Grouping", "wlan.he.mimo.grouping",
45598
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(he_mimo_cntrl_grouping_flags),
45599
14
      0x0000000100, NULL, HFILL }},
45600
45601
14
    {&hf_ieee80211_he_mimo_control_codebook_info,
45602
14
     {"Codebook Information", "wlan.he.mimo.codebook_info",
45603
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000200, NULL, HFILL }},
45604
45605
14
    {&hf_ieee80211_he_mimo_control_feedback_type,
45606
14
     {"Feedback Type", "wlan.he.mimo.feedback_type",
45607
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(he_mimo_cntrl_feedback_vals),
45608
14
      0x0000000C00, NULL, HFILL }},
45609
45610
14
    {&hf_ieee80211_he_mimo_control_remaining_feedback_segs,
45611
14
     {"Remaining Feedback Segments", "wlan.he.mimo.remaining_feedback_segs",
45612
14
      FT_UINT40, BASE_DEC, NULL, 0x0000007000, NULL, HFILL }},
45613
45614
14
    {&hf_ieee80211_he_mimo_control_first_feedback_seg,
45615
14
     {"First Feedback Segment", "wlan.he.mimo.first_feedback_seg",
45616
14
      FT_UINT40, BASE_DEC, NULL, 0x0000008000, NULL, HFILL }},
45617
45618
14
    {&hf_ieee80211_he_mimo_control_ru_start_index,
45619
14
     {"RU Start Index", "wlan.he.mimo.ru_start_index",
45620
14
      FT_UINT40, BASE_HEX, NULL, 0x00007F0000, NULL, HFILL }},
45621
45622
14
    {&hf_ieee80211_he_mimo_control_ru_end_index,
45623
14
     {"RU End Index", "wlan.he.mimo.ru_end_index",
45624
14
      FT_UINT40, BASE_HEX, NULL, 0x003F800000, NULL, HFILL }},
45625
45626
14
    {&hf_ieee80211_he_mimo_control_sounding_dialog_token_num,
45627
14
     {"Sounding Dialog Token Number", "wlan.he.mimo.sounding_dialog_token_num",
45628
14
      FT_UINT40, BASE_DEC, NULL, 0x0FC0000000, NULL, HFILL }},
45629
45630
14
    {&hf_ieee80211_he_mimo_control_reserved,
45631
14
     {"Reserved", "wlan.he.mimo.reserved",
45632
14
      FT_UINT40, BASE_HEX, NULL, 0xF000000000, NULL, HFILL }},
45633
45634
14
    {&hf_ieee80211_he_mimo_control_field,
45635
14
     {"HE MIMO Control", "wlan.he.action.he_mimo_control",
45636
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
45637
45638
14
    {&hf_ieee80211_he_compressed_beamforming_report_snr,
45639
14
     {"AvgSNR", "wlan.he.mimo.beamforming_report.avgsnr",
45640
14
      FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
45641
45642
14
    {&hf_ieee80211_he_compressed_beamform_scidx,
45643
14
     {"SCIDX", "wlan.he.action.he_mimo_control.scidx",
45644
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
45645
45646
14
    {&hf_ieee80211_he_beamforming_report_len,
45647
14
     {"Report Len", "wlan.he.action.he_mimo_control.report_len",
45648
14
      FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
45649
45650
14
    {&hf_ieee80211_tag_tspec_allocation_id,
45651
14
      {"Allocation ID", "wlan.dmg_tspec.allocation_id",
45652
14
       FT_UINT24, BASE_DEC, NULL, 0x00000f,
45653
14
       NULL, HFILL }},
45654
45655
14
    {&hf_ieee80211_tag_tspec_allocation_type,
45656
14
      {"Allocation Type", "wlan.dmg_tspec.allocation_type",
45657
14
       FT_UINT24, BASE_DEC, NULL, 0x000070,
45658
14
       NULL, HFILL }},
45659
45660
14
    {&hf_ieee80211_tag_tspec_allocation_format,
45661
14
      {"Allocation Format", "wlan.dmg_tspec.allocation_format",
45662
14
       FT_BOOLEAN, 24, NULL, 0x000080,
45663
14
       NULL, HFILL }},
45664
45665
14
    {&hf_ieee80211_tag_tspec_pseudo_static,
45666
14
      {"Pseudo Static", "wlan.dmg_tspec.pseudo_static",
45667
14
       FT_BOOLEAN, 24, NULL, 0x000100,
45668
14
       NULL, HFILL }},
45669
45670
14
    {&hf_ieee80211_tag_tspec_truncatable,
45671
14
      {"Truncatable", "wlan.dmg_tspec.truncatable",
45672
14
       FT_BOOLEAN, 24, NULL, 0x000200,
45673
14
       NULL, HFILL }},
45674
45675
14
    {&hf_ieee80211_tag_tspec_extendable,
45676
14
      {"Extendable", "wlan.dmg_tspec.extendable",
45677
14
       FT_BOOLEAN, 24, NULL, 0x000400,
45678
14
       NULL, HFILL }},
45679
45680
14
    {&hf_ieee80211_tag_tspec_lp_sc_used,
45681
14
      {"LP SC Usec", "wlan.dmg_tspec.lp_sc_used",
45682
14
       FT_BOOLEAN, 24, NULL, 0x000800,
45683
14
       NULL, HFILL }},
45684
45685
14
    {&hf_ieee80211_tag_tspec_up,
45686
14
      {"UP", "wlan.dmg_tspec.up",
45687
14
       FT_UINT24, BASE_HEX, NULL, 0x007000,
45688
14
       NULL, HFILL }},
45689
45690
14
    {&hf_ieee80211_tag_tspec_dest_aid,
45691
14
      {"Destination AID", "wlan.dmg_tspec.dest_aid",
45692
14
       FT_UINT24, BASE_HEX, NULL, 0x7f8000,
45693
14
       NULL, HFILL }},
45694
45695
14
    {&hf_ieee80211_tag_tspec_allocation_period,
45696
14
      {"Allocation Period", "wlan.dmg_tspec.allocation_period",
45697
14
       FT_UINT16, BASE_DEC, NULL, 0,
45698
14
       NULL, HFILL }},
45699
45700
14
    {&hf_ieee80211_tag_tspec_min_allocation,
45701
14
      {"Minimal Allocation", "wlan.dmg_tspec.min_allocation",
45702
14
       FT_UINT16, BASE_DEC, NULL, 0,
45703
14
       NULL, HFILL }},
45704
45705
14
    {&hf_ieee80211_tag_tspec_max_allocation,
45706
14
      {"Maximal Allocation", "wlan.dmg_tspec.max_allocation",
45707
14
       FT_UINT16, BASE_DEC, NULL, 0,
45708
14
       NULL, HFILL }},
45709
45710
14
    {&hf_ieee80211_tag_tspec_min_duration,
45711
14
      {"Minimal Duration", "wlan.dmg_tspec.min_duration",
45712
14
       FT_UINT16, BASE_DEC, NULL, 0,
45713
14
       NULL, HFILL }},
45714
45715
14
    {&hf_ieee80211_tag_tspec_num_of_constraints,
45716
14
      {"Number Of Constraints", "wlan.dmg_tspec.num_of_constraints",
45717
14
       FT_UINT8, BASE_DEC, NULL, 0,
45718
14
       NULL, HFILL }},
45719
45720
14
    {&hf_ieee80211_tag_tspec_tsconst_start_time,
45721
14
      {"TS Constraint Start Time", "wlan.dmg_tspec.tsconst.start_time",
45722
14
       FT_UINT32, BASE_DEC, NULL, 0,
45723
14
       NULL, HFILL }},
45724
45725
14
    {&hf_ieee80211_tag_tspec_tsconst_duration,
45726
14
      {"TS Constraint Duration", "wlan.dmg_tspec.tsconst.duration",
45727
14
       FT_UINT16, BASE_DEC, NULL, 0,
45728
14
       NULL, HFILL }},
45729
45730
14
    {&hf_ieee80211_tag_tspec_tsconst_period,
45731
14
      {"TS Constraint Period", "wlan.dmg_tspec.tsconst.period",
45732
14
       FT_UINT16, BASE_DEC, NULL, 0,
45733
14
       NULL, HFILL }},
45734
45735
14
    {&hf_ieee80211_tag_tspec_tsconst_interferer_mac,
45736
14
      {"TS Constraint Interferer MAC Address", "wlan.dmg_tspec.tsconst.interferer_mac",
45737
14
       FT_ETHER, BASE_NONE, NULL, 0,
45738
14
       NULL, HFILL }},
45739
45740
14
    {&hf_ieee80211_tag_channel_measurement_feedback_relative_I,
45741
14
      {"Channel Measurement Feedback Relative I", "wlan.ch_meas_fb.relative_I",
45742
14
       FT_UINT8, BASE_DEC, NULL, 0,
45743
14
       NULL, HFILL }},
45744
45745
14
    {&hf_ieee80211_tag_channel_measurement_feedback_relative_Q,
45746
14
      {"Channel Measurement Feedback Relative Q", "wlan.ch_meas_fb.relative_Q",
45747
14
       FT_UINT8, BASE_DEC, NULL, 0,
45748
14
       NULL, HFILL }},
45749
45750
14
    {&hf_ieee80211_tag_channel_measurement_feedback_tap_delay,
45751
14
      {"Channel Measurement Feedback Tap Delay", "wlan.ch_meas_fb.tap_delay",
45752
14
       FT_UINT8, BASE_DEC, NULL, 0,
45753
14
       NULL, HFILL }},
45754
45755
14
    {&hf_ieee80211_tag_channel_measurement_feedback_sector_id,
45756
14
      {"Channel Measurement Feedback Sector ID", "wlan.ch_meas_fb.sector_id",
45757
14
       FT_UINT8, BASE_DEC, NULL, 0xfc,
45758
14
       NULL, HFILL }},
45759
45760
14
    {&hf_ieee80211_tag_channel_measurement_feedback_antenna_id,
45761
14
      {"Channel Measurement Feedback Antenna ID", "wlan.ch_meas_fb.antenna_id",
45762
14
       FT_UINT8, BASE_DEC, NULL, 0x03,
45763
14
       NULL, HFILL }},
45764
45765
14
    {&hf_ieee80211_tag_awake_window,
45766
14
      {"Awake Window", "wlan.awake_window",
45767
14
       FT_UINT16, BASE_DEC, NULL, 0,
45768
14
       NULL, HFILL }},
45769
45770
14
    {&hf_ieee80211_tag_addba_ext_no_frag,
45771
14
      {"ADDBA No Fragmentation", "wlan.addba.no_frag",
45772
14
       FT_BOOLEAN, 8, NULL, 0x01,
45773
14
       NULL, HFILL }},
45774
45775
14
    {&hf_ieee80211_tag_addba_ext_he_fragmentation_operation,
45776
14
      {"ADDBA HE Fragmentation Operation", "wlan.addba.he_frag_oper",
45777
14
       FT_UINT8, BASE_HEX, NULL, 0x06,
45778
14
       NULL, HFILL }},
45779
45780
14
    {&hf_ieee80211_tag_addba_ext_reserved,
45781
14
      {"Reserved", "wlan.addba.reserved",
45782
14
       FT_UINT8, BASE_HEX, NULL, 0x18,
45783
14
       NULL, HFILL }},
45784
45785
14
    {&hf_ieee80211_tag_addba_ext_buffer_size,
45786
14
     {"Extended Buffer Size", "wlan.addba.extended_buffer_size",
45787
14
      FT_UINT8, BASE_DEC, NULL, 0xE0, NULL, HFILL }},
45788
45789
14
    {&hf_ieee80211_tag_multi_band_ctrl_sta_role,
45790
14
      {"STA Rold", "wlan.multi_band.ctrl_sta_role",
45791
14
       FT_UINT8, BASE_DEC, NULL, 0xe0,
45792
14
       NULL, HFILL }},
45793
45794
14
    {&hf_ieee80211_tag_multi_band_ctrl_addr_present,
45795
14
      {"STA MAC Address Present", "wlan.multi_band.ctrl_addr_present",
45796
14
       FT_BOOLEAN, 8, NULL, 0x10,
45797
14
       NULL, HFILL }},
45798
45799
14
    {&hf_ieee80211_tag_multi_band_ctrl_cipher_present,
45800
14
      {"PCS Present", "wlan.multi_band.ctrl_cipher_present",
45801
14
       FT_BOOLEAN, 8, NULL, 0x08,
45802
14
       NULL, HFILL }},
45803
45804
14
    {&hf_ieee80211_tag_multi_band_oper_class,
45805
14
      {"Operating Class", "wlan.multi_band.oper_class",
45806
14
       FT_UINT8, BASE_DEC, NULL, 0,
45807
14
       NULL, HFILL }},
45808
45809
14
    {&hf_ieee80211_tag_multi_band_channel_number,
45810
14
      {"Channel Number", "wlan.multi_band.channel_number",
45811
14
       FT_UINT8, BASE_DEC, NULL, 0,
45812
14
       NULL, HFILL }},
45813
45814
14
    {&hf_ieee80211_tag_multi_band_tsf_offset,
45815
14
      {"TSF Offset", "wlan.multi_band.tsf_offset",
45816
14
       FT_UINT64, BASE_DEC, NULL, 0,
45817
14
       NULL, HFILL }},
45818
45819
14
    {&hf_ieee80211_tag_multi_band_conn_ap,
45820
14
      {"Connection Capability AP", "wlan.multi_band.conn_ap",
45821
14
       FT_BOOLEAN, 8, NULL, 0x80,
45822
14
       NULL, HFILL }},
45823
45824
14
    {&hf_ieee80211_tag_multi_band_conn_pcp,
45825
14
      {"Connection Capability PCP", "wlan.multi_band.conn_pcp",
45826
14
       FT_BOOLEAN, 8, NULL, 0x40,
45827
14
       NULL, HFILL }},
45828
45829
14
    {&hf_ieee80211_tag_multi_band_conn_dls,
45830
14
      {"Connection Capability DLS", "wlan.multi_band.conn_dls",
45831
14
       FT_BOOLEAN, 8, NULL, 0x20,
45832
14
       NULL, HFILL }},
45833
45834
14
    {&hf_ieee80211_tag_multi_band_conn_tdls,
45835
14
      {"Connection Capability TDLS", "wlan.multi_band.conn_tdls",
45836
14
       FT_BOOLEAN, 8, NULL, 0x10,
45837
14
       NULL, HFILL }},
45838
45839
14
    {&hf_ieee80211_tag_multi_band_conn_ibss,
45840
14
      {"Connection Capability IBSS", "wlan.multi_band.conn_ibss",
45841
14
       FT_BOOLEAN, 8, NULL, 0x08,
45842
14
       NULL, HFILL }},
45843
45844
14
    {&hf_ieee80211_tag_multi_band_fst_timeout,
45845
14
      {"FST Session Timeout", "wlan.multi_band.fst_timeout",
45846
14
       FT_UINT8, BASE_DEC, NULL, 0,
45847
14
       NULL, HFILL }},
45848
45849
14
    {&hf_ieee80211_tag_multi_band_sta_mac,
45850
14
      {"Transmitting STA MAC Address", "wlan.multi_band.sta_mac",
45851
14
       FT_ETHER, BASE_NONE, NULL, 0,
45852
14
       NULL, HFILL }},
45853
45854
14
    {&hf_ieee80211_tag_activity,
45855
14
      {"Activity", "wlan.activity",
45856
14
       FT_UINT8, BASE_DEC, NULL, 0,
45857
14
       NULL, HFILL }},
45858
45859
14
    {&hf_ieee80211_tag_dmg_link_adapt_mcs,
45860
14
      {"MCS", "wlan.dmg_link_adapt.mcs",
45861
14
       FT_UINT8, BASE_DEC, NULL, 0,
45862
14
       NULL, HFILL }},
45863
45864
14
    {&hf_ieee80211_tag_dmg_link_adapt_link_margin,
45865
14
      {"Link Margin", "wlan.dmg_link_adapt.link_margin",
45866
14
       FT_UINT8, BASE_DEC, NULL, 0,
45867
14
       NULL, HFILL }},
45868
45869
14
    {&hf_ieee80211_tag_ref_timestamp,
45870
14
      {"Reference Timestamp", "wlan.ref_timestamp",
45871
14
       FT_UINT32, BASE_DEC, NULL, 0,
45872
14
       NULL, HFILL }},
45873
45874
14
    {&hf_ieee80211_tag_switching_stream_non_qos,
45875
14
      {"Non-Qos Data Frames", "wlan.switching_stream.non_qos",
45876
14
       FT_BOOLEAN, BASE_NONE, NULL, 0,
45877
14
       NULL, HFILL }},
45878
45879
14
    {&hf_ieee80211_tag_switching_stream_param_num,
45880
14
      {"Number Of Switching Stream Elements", "wlan.switching_stream.param_num",
45881
14
       FT_UINT8, BASE_DEC, NULL, 0,
45882
14
       NULL, HFILL }},
45883
45884
14
    {&hf_ieee80211_tag_switching_stream_old_tid,
45885
14
      {"Old Band TID", "wlan.switching_stream.old_tid",
45886
14
       FT_UINT16, BASE_DEC, NULL, 0xf000,
45887
14
       NULL, HFILL }},
45888
45889
14
    {&hf_ieee80211_tag_switching_stream_old_direction,
45890
14
      {"Old Band Direction", "wlan.switching_stream.old_direction",
45891
14
       FT_BOOLEAN, 16, NULL, 0x0800,
45892
14
       NULL, HFILL }},
45893
45894
14
    {&hf_ieee80211_tag_switching_stream_new_tid,
45895
14
      {"New Band TID", "wlan.switching_stream.new_tid",
45896
14
       FT_UINT16, BASE_DEC, NULL, 0x0780,
45897
14
       NULL, HFILL }},
45898
45899
14
    {&hf_ieee80211_tag_switching_stream_new_direction,
45900
14
      {"New Band Direction", "wlan.switching_stream.new_direction",
45901
14
       FT_BOOLEAN, 16, NULL, 0x0040,
45902
14
       NULL, HFILL }},
45903
45904
14
    {&hf_ieee80211_tag_switching_stream_new_valid_id,
45905
14
      {"Stream ID in New Band Valid", "wlan.switching_stream.new_valid_id",
45906
14
       FT_BOOLEAN, 16, NULL, 0x0020,
45907
14
       NULL, HFILL }},
45908
45909
14
    {&hf_ieee80211_tag_switching_stream_llt_type,
45910
14
      {"LLT Type", "wlan.switching_stream.llt_type",
45911
14
       FT_BOOLEAN, 16, NULL, 0x0010,
45912
14
       NULL, HFILL }},
45913
45914
14
    {&hf_ieee80211_ff_timestamp,
45915
14
     {"Timestamp", "wlan.fixed.timestamp",
45916
14
      FT_UINT64, BASE_DEC, NULL, 0,
45917
14
      NULL, HFILL }},
45918
45919
14
    {&hf_ieee80211_ff_auth_alg,
45920
14
     {"Authentication Algorithm", "wlan.fixed.auth.alg",
45921
14
      FT_UINT16, BASE_DEC, VALS(auth_alg), 0,
45922
14
      NULL, HFILL }},
45923
45924
14
    {&hf_ieee80211_ff_beacon_interval,
45925
14
     {"Beacon Interval", "wlan.fixed.beacon",
45926
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
45927
14
      NULL, HFILL }},
45928
45929
14
    {&hf_ieee80211_fixed_parameters,
45930
14
     {"Fixed parameters", "wlan.fixed.all",
45931
14
      FT_NONE, BASE_NONE, NULL, 0,
45932
14
      NULL, HFILL }},
45933
45934
14
    {&hf_ieee80211_tagged_parameters,
45935
14
     {"Tagged parameters", "wlan.tagged.all",
45936
14
      FT_NONE, BASE_NONE, NULL, 0,
45937
14
      NULL, HFILL }},
45938
45939
14
    {&hf_ieee80211_tag_ssid,
45940
14
     {"SSID", "wlan.ssid",
45941
14
      FT_BYTES, BASE_SHOW_UTF_8_PRINTABLE, NULL, 0,
45942
14
      "Indicates the identity of an ESS or IBSS", HFILL }},
45943
45944
14
    {&hf_ieee80211_tag_supp_rates,
45945
14
     {"Supported Rates", "wlan.supported_rates",
45946
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_supported_rates_vals_ext, 0x0,
45947
14
      "In Mbit/sec, (B) for Basic Rates", HFILL }},
45948
45949
14
    {&hf_ieee80211_tag_fh_dwell_time,
45950
14
     {"Dwell Time", "wlan.fh.dwell_time",
45951
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
45952
14
      "In Time Unit (TU)", HFILL }},
45953
45954
14
    {&hf_ieee80211_tag_fh_hop_set,
45955
14
     {"Hop Set", "wlan.fh.hop_set",
45956
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45957
14
      NULL, HFILL }},
45958
45959
14
    {&hf_ieee80211_tag_fh_hop_pattern,
45960
14
     {"Hop Pattern", "wlan.fh.hop_pattern",
45961
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45962
14
      NULL, HFILL }},
45963
45964
14
    {&hf_ieee80211_tag_fh_hop_index,
45965
14
     {"Hop Index", "wlan.fh.hop_index",
45966
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
45967
14
      NULL, HFILL }},
45968
45969
14
    {&hf_ieee80211_ff_block_ack_params,
45970
14
     {"Block Ack Parameters", "wlan.fixed.baparams",
45971
14
      FT_UINT16, BASE_HEX, NULL, 0,
45972
14
      NULL, HFILL }},
45973
45974
14
    {&hf_ieee80211_ff_block_ack_params_amsdu_permitted,
45975
14
     {"A-MSDUs", "wlan.fixed.baparams.amsdu",
45976
14
      FT_BOOLEAN, 16, TFS(&ff_block_ack_params_amsdu_permitted_flag), 0x0001,
45977
14
      "A-MSDU Permitted in QoS Data MPDUs", HFILL }},
45978
45979
14
    {&hf_ieee80211_ff_block_ack_params_policy,
45980
14
     {"Block Ack Policy", "wlan.fixed.baparams.policy",
45981
14
      FT_BOOLEAN, 16, TFS(&ff_block_ack_params_policy_flag), 0x0002,
45982
14
      NULL, HFILL }},
45983
45984
14
    {&hf_ieee80211_ff_block_ack_params_tid,
45985
14
     {"Traffic Identifier", "wlan.fixed.baparams.tid",
45986
14
      FT_UINT16, BASE_HEX, NULL, 0x003C,
45987
14
      NULL, HFILL }},
45988
45989
14
    {&hf_ieee80211_ff_block_ack_params_buffer_size,
45990
14
     {"Number of Buffers (1 Buffer = 2304 Bytes)", "wlan.fixed.baparams.buffersize",
45991
14
      FT_UINT16, BASE_DEC, NULL, 0xFFC0,
45992
14
      NULL, HFILL }},
45993
45994
14
    {&hf_ieee80211_ff_block_ack_timeout,
45995
14
     {"Block Ack Timeout", "wlan.fixed.batimeout",
45996
14
      FT_UINT16, BASE_HEX, NULL, 0,
45997
14
      NULL, HFILL }},
45998
45999
14
    {&hf_ieee80211_ff_block_ack_ssc,
46000
14
     {"Block Ack Starting Sequence Control (SSC)", "wlan.fixed.ssc",
46001
14
      FT_UINT16, BASE_HEX, NULL, 0,
46002
14
      NULL, HFILL }},
46003
46004
14
    {&hf_ieee80211_ff_block_ack_ssc_fragment,
46005
14
     {"Fragment", "wlan.fixed.ssc.fragment",
46006
14
      FT_UINT16, BASE_DEC, NULL, 0x000f,
46007
14
      NULL, HFILL }},
46008
46009
14
    {&hf_ieee80211_ff_block_ack_ssc_sequence,
46010
14
     {"Starting Sequence Number", "wlan.fixed.ssc.sequence",
46011
14
      FT_UINT16, BASE_DEC, NULL, 0xfff0,
46012
14
      NULL, HFILL }},
46013
46014
14
    {&hf_ieee80211_ff_delba_param,
46015
14
     {"Delete Block Ack (DELBA) Parameter Set", "wlan.fixed.delba.param",
46016
14
      FT_UINT16, BASE_HEX, NULL, 0,
46017
14
      NULL, HFILL }},
46018
46019
14
    {&hf_ieee80211_ff_delba_param_reserved,
46020
14
     {"Reserved", "wlan.fixed.delba.param.reserved",
46021
14
      FT_UINT16, BASE_HEX, NULL, 0x07ff,
46022
14
      NULL, HFILL }},
46023
46024
14
    {&hf_ieee80211_ff_delba_param_init,
46025
14
     {"Initiator", "wlan.fixed.delba.param.initiator",
46026
14
      FT_BOOLEAN, 16, NULL, 0x0800,
46027
14
      NULL, HFILL }},
46028
46029
14
    {&hf_ieee80211_ff_delba_param_tid,
46030
14
     {"TID", "wlan.fixed.delba.param.tid",
46031
14
      FT_UINT16, BASE_HEX, NULL, 0xf000,
46032
14
      "Traffic Identifier (TID)", HFILL }},
46033
46034
14
    {&hf_ieee80211_ff_max_reg_pwr,
46035
14
     {"Maximum Regulation Power", "wlan.fixed.maxregpwr",
46036
14
      FT_UINT16, BASE_HEX, NULL, 0,
46037
14
      NULL, HFILL }},
46038
46039
14
    {&hf_ieee80211_ff_measurement_pilot_int,
46040
14
     {"Measurement Pilot Interval", "wlan.fixed.msmtpilotint",
46041
14
      FT_UINT8, BASE_DEC, NULL, 0,
46042
14
      "Measurement Pilot Interval Fixed Field (in TUs)", HFILL }},
46043
46044
14
    {&hf_ieee80211_ff_country_str,
46045
14
     {"Country String", "wlan.fixed.country",
46046
14
      FT_STRING, BASE_NONE, NULL, 0,
46047
14
      NULL, HFILL }},
46048
46049
14
    {&hf_ieee80211_ff_max_tx_pwr,
46050
14
     {"Maximum Transmit Power", "wlan.fixed.maxtxpwr",
46051
14
      FT_UINT8, BASE_HEX, NULL, 0,
46052
14
      NULL, HFILL }},
46053
46054
14
    {&hf_ieee80211_ff_tx_pwr_used,
46055
14
     {"Transmit Power Used", "wlan.fixed.txpwr",
46056
14
      FT_UINT8, BASE_HEX, NULL, 0,
46057
14
      NULL, HFILL }},
46058
46059
14
    {&hf_ieee80211_ff_transceiver_noise_floor,
46060
14
     {"Transceiver Noise Floor", "wlan.fixed.tnoisefloor",
46061
14
      FT_UINT8, BASE_HEX, NULL, 0,
46062
14
      NULL, HFILL }},
46063
46064
14
    {&hf_ieee80211_ff_channel_width,
46065
14
     {"Supported Channel Width", "wlan.fixed.chanwidth",
46066
14
      FT_UINT8, BASE_HEX, VALS(ff_channel_width_vals), 0,
46067
14
      NULL, HFILL }},
46068
46069
14
    {&hf_ieee80211_ff_qos_info_ap,
46070
14
     {"QoS Information (AP)", "wlan.fixed.qosinfo.ap",
46071
14
      FT_UINT8, BASE_HEX, NULL, 0,
46072
14
      NULL, HFILL }},
46073
46074
14
    {&hf_ieee80211_ff_qos_info_ap_edca_param_set_counter,
46075
14
     {"EDCA Parameter Set Update Count", "wlan.fixed.qosinfo.ap.edcaupdate",
46076
14
      FT_UINT8, BASE_HEX, NULL, 0x0F,
46077
14
      "Enhanced Distributed Channel Access (EDCA) Parameter Set Update Count", HFILL }},
46078
46079
14
    {&hf_ieee80211_ff_qos_info_ap_q_ack,
46080
14
     {"Q-Ack", "wlan.fixed.qosinfo.ap.qack",
46081
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_q_ack_flag), 0x10,
46082
14
      "QoS Ack", HFILL }},
46083
46084
14
    {&hf_ieee80211_ff_qos_info_ap_queue_req,
46085
14
     {"Queue Request", "wlan.fixed.qosinfo.ap.queue_req",
46086
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_queue_req_flag), 0x20,
46087
14
      NULL, HFILL }},
46088
46089
14
    {&hf_ieee80211_ff_qos_info_ap_txop_request,
46090
14
     {"TXOP Request", "wlan.fixed.qosinfo.ap.txopreq",
46091
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_txop_request_flag), 0x40,
46092
14
      "Transmit Opportunity (TXOP) Request", HFILL }},
46093
46094
14
    {&hf_ieee80211_ff_qos_info_ap_more_data_ack,
46095
14
     {"More Data Ack", "wlan.fixed.qosinfo.ap.more_data_ack",
46096
14
      FT_BOOLEAN, 8, NULL, 0x80,
46097
14
      NULL, HFILL }},
46098
46099
14
    {&hf_ieee80211_ff_qos_info_sta,
46100
14
     {"QoS Information (STA)", "wlan.fixed.qosinfo.sta",
46101
14
      FT_UINT8, BASE_HEX, NULL, 0,
46102
14
      "TCLAS Processing", HFILL }},
46103
46104
14
    {&hf_ieee80211_ff_qos_info_sta_ac_vo,
46105
14
     {"AC_VO U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_vo",
46106
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x01,
46107
14
      NULL, HFILL }},
46108
46109
14
    {&hf_ieee80211_ff_qos_info_sta_ac_vi,
46110
14
     {"AC_VI U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_vi",
46111
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x02,
46112
14
      NULL, HFILL }},
46113
46114
14
    {&hf_ieee80211_ff_qos_info_sta_ac_bk,
46115
14
     {"AC_BK U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_bk",
46116
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x04,
46117
14
      NULL, HFILL }},
46118
46119
14
    {&hf_ieee80211_ff_qos_info_sta_ac_be,
46120
14
     {"AC_BE U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_be",
46121
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x08,
46122
14
      NULL, HFILL }},
46123
46124
14
    {&hf_ieee80211_ff_qos_info_sta_q_ack,
46125
14
     {"Q-Ack", "wlan.fixed.qosinfo.sta.qack",
46126
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_q_ack_flag), 0x10,
46127
14
      "QoS Ack", HFILL }},
46128
46129
14
    {&hf_ieee80211_ff_qos_info_sta_max_sp_length,
46130
14
     {"Max SP Length", "wlan.fixed.qosinfo.sta.max_sp_length",
46131
14
      FT_UINT8, BASE_HEX, VALS(ff_qos_info_sta_max_sp_len_flags) , 0x60,
46132
14
      NULL, HFILL }},
46133
46134
14
    {&hf_ieee80211_ff_qos_info_sta_more_data_ack,
46135
14
     {"More Data Ack", "wlan.fixed.qosinfo.sta.more_data_ack",
46136
14
      FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_more_data_ack_flag), 0x80,
46137
14
      NULL, HFILL }},
46138
46139
14
    {&hf_ieee80211_ff_sm_pwr_save,
46140
14
     {"Spatial Multiplexing (SM) Power Control", "wlan.fixed.sm.powercontrol",
46141
14
      FT_UINT8, BASE_HEX, NULL, 0,
46142
14
      NULL, HFILL }},
46143
46144
14
    {&hf_ieee80211_ff_sm_pwr_save_enabled,
46145
14
     {"SM Power Save", "wlan.fixed.sm.powercontrol.enabled",
46146
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
46147
14
      "Spatial Multiplexing (SM) Power Save", HFILL }},
46148
46149
14
    {&hf_ieee80211_ff_sm_pwr_save_sm_mode,
46150
14
     {"SM Mode", "wlan.fixed.sm.powercontrol.mode",
46151
14
      FT_BOOLEAN, 8, TFS(&ff_sm_pwr_save_sm_mode_flag), 0x02,
46152
14
      "Spatial Multiplexing (SM) Mode", HFILL }},
46153
46154
14
    {&hf_ieee80211_ff_sm_pwr_save_reserved,
46155
14
     {"Reserved", "wlan.fixed.sm.powercontrol.reserved",
46156
14
      FT_UINT8, BASE_HEX, NULL, 0xFC,
46157
14
      NULL, HFILL }},
46158
46159
14
    {&hf_ieee80211_ff_pco_phase_cntrl,
46160
14
     {"Phased Coexistence Operation (PCO) Phase Control", "wlan.fixed.pco.phasecntrl",
46161
14
      FT_BOOLEAN, BASE_NONE, TFS(&ff_pco_phase_cntrl_flag), 0x0,
46162
14
      NULL, HFILL }},
46163
46164
14
    {&hf_ieee80211_ff_psmp_param_set,
46165
14
     {"Power Save Multi-Poll (PSMP) Parameter Set", "wlan.fixed.psmp.paramset",
46166
14
      FT_UINT16, BASE_HEX, NULL, 0,
46167
14
      NULL, HFILL }},
46168
46169
14
    {&hf_ieee80211_ff_psmp_param_set_n_sta,
46170
14
     {"Number of STA Info Fields Present", "wlan.fixed.psmp.paramset.nsta",
46171
14
      FT_UINT16, BASE_HEX, NULL, 0x000F,
46172
14
      NULL, HFILL }},
46173
46174
14
    {&hf_ieee80211_ff_psmp_param_set_more_psmp,
46175
14
     {"More PSMP", "wlan.fixed.psmp.paramset.more",
46176
14
      FT_BOOLEAN, 16, TFS(&ff_psmp_param_set_more_psmp_flag), 0x0010,
46177
14
      "More Power Save Multi-Poll (PSMP)", HFILL }},
46178
46179
14
    {&hf_ieee80211_ff_psmp_param_set_psmp_sequence_duration,
46180
14
     {"PSMP Sequence Duration [us]", "wlan.fixed.psmp.paramset.seqduration",
46181
14
      FT_UINT16, BASE_DEC, NULL, 0xFFE0,
46182
14
      "Power Save Multi-Poll (PSMP) Sequence Duration", HFILL }},
46183
46184
14
    {&hf_ieee80211_ff_mimo_cntrl,
46185
14
     {"MIMO Control", "wlan.fixed.mimo.control",
46186
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
46187
14
      NULL, HFILL }},
46188
46189
14
    {&hf_ieee80211_ff_mimo_cntrl_nc_index,
46190
14
     {"Nc Index", "wlan.fixed.mimo.control.ncindex",
46191
14
      FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_nc_index_flags), 0x0003,
46192
14
      "Number of Columns Less One", HFILL }},
46193
46194
14
    {&hf_ieee80211_ff_mimo_cntrl_nr_index,
46195
14
     {"Nr Index", "wlan.fixed.mimo.control.nrindex",
46196
14
      FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_nr_index_flags), 0x000C,
46197
14
      "Number of Rows Less One", HFILL }},
46198
46199
14
    {&hf_ieee80211_ff_mimo_cntrl_channel_width,
46200
14
     {"Channel Width", "wlan.fixed.mimo.control.chanwidth",
46201
14
      FT_BOOLEAN, 16, TFS(&ff_mimo_cntrl_channel_width_flag), 0x0010,
46202
14
      NULL, HFILL }},
46203
46204
14
    {&hf_ieee80211_ff_mimo_cntrl_grouping,
46205
14
     {"Grouping (Ng)", "wlan.fixed.mimo.control.grouping",
46206
14
      FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_grouping_flags), 0x0060,
46207
14
      NULL, HFILL }},
46208
46209
14
    {&hf_ieee80211_ff_mimo_cntrl_coefficient_size,
46210
14
     {"Coefficient Size (Nb)", "wlan.fixed.mimo.control.cosize",
46211
14
      FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_coefficient_size_flags), 0x0180,
46212
14
      NULL, HFILL }},
46213
46214
14
    {&hf_ieee80211_ff_mimo_cntrl_codebook_info,
46215
14
     {"Codebook Information", "wlan.fixed.mimo.control.codebookinfo",
46216
14
      FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_codebook_info_flags), 0x0600,
46217
14
      NULL, HFILL }},
46218
46219
14
    {&hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment,
46220
14
     {"Remaining Matrix Segment", "wlan.fixed.mimo.control.matrixseg",
46221
14
      FT_UINT16, BASE_HEX, NULL, 0x3800,
46222
14
      NULL, HFILL }},
46223
46224
14
    {&hf_ieee80211_ff_mimo_cntrl_reserved,
46225
14
     {"Reserved", "wlan.fixed.mimo.control.reserved",
46226
14
      FT_UINT16, BASE_HEX, NULL, 0xC000,
46227
14
      NULL, HFILL }},
46228
46229
14
    {&hf_ieee80211_ff_mimo_cntrl_sounding_timestamp,
46230
14
     {"Sounding Timestamp", "wlan.fixed.mimo.control.soundingtime",
46231
14
      FT_UINT32, BASE_HEX, NULL, 0,
46232
14
      NULL, HFILL }},
46233
46234
14
    {&hf_ieee80211_ff_ftm_param_delim1,
46235
14
     {"FTM Params (Subset 1 of 3)", "wlan.fixed.ftm.param.delim1",
46236
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
46237
14
      NULL, HFILL }},
46238
46239
14
    {&hf_ieee80211_ff_ftm_param_status_indication,
46240
14
     {"Status Indication", "wlan.fixed.ftm.param.status_indication",
46241
14
      FT_UINT16, BASE_HEX, NULL, 0x0003,
46242
14
      NULL, HFILL }},
46243
46244
14
    {&hf_ieee80211_ff_ftm_param_value,
46245
14
     {"Value", "wlan.fixed.ftm.param.value",
46246
14
      FT_UINT16, BASE_HEX, NULL, 0x007C,
46247
14
      NULL, HFILL }},
46248
46249
14
    {&hf_ieee80211_ff_ftm_param_reserved1,
46250
14
     {"Reserved1", "wlan.fixed.ftm.param.reserved1",
46251
14
      FT_UINT16, BASE_HEX, NULL, 0x0080,
46252
14
      NULL, HFILL }},
46253
46254
14
    {&hf_ieee80211_ff_ftm_param_burst_exponent,
46255
14
     {"Number of Burst Exponent", "wlan.fixed.ftm.param.burst_exponent",
46256
14
      FT_UINT16, BASE_HEX, NULL, 0x0F00,
46257
14
      NULL, HFILL }},
46258
46259
14
    {&hf_ieee80211_ff_ftm_param_burst_duration,
46260
14
     {"Burst Duration", "wlan.fixed.ftm.param.burst_duration",
46261
14
      FT_UINT16, BASE_HEX, NULL, 0xF000,
46262
14
      NULL, HFILL }},
46263
46264
14
    {&hf_ieee80211_ff_ftm_param_delim2,
46265
14
     {"FTM Params (Subset 2 of 3)", "wlan.fixed.ftm.param.delim2",
46266
14
      FT_UINT32, BASE_HEX, NULL, 0x0,
46267
14
      NULL, HFILL }},
46268
46269
14
    {&hf_ieee80211_ff_ftm_param_min_delta_ftm,
46270
14
     {"Min Delta FTM", "wlan.fixed.ftm.param.min_delta_ftm",
46271
14
      FT_UINT32, BASE_HEX, NULL, 0x000000FF,
46272
14
      NULL, HFILL }},
46273
46274
14
    {&hf_ieee80211_ff_ftm_param_partial_tsf_timer,
46275
14
     {"Partial TSF timer", "wlan.fixed.ftm.param.partial_tsf_timer",
46276
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(partial_tsf_custom), 0x00FFFF00,
46277
14
      NULL, HFILL }},
46278
46279
14
    {&hf_ieee80211_ff_ftm_param_partial_tsf_no_pref,
46280
14
     {"Partial TSF no pref", "wlan.fixed.ftm.param.partial_tsf_no_pref",
46281
14
      FT_UINT32, BASE_HEX, NULL, 0x01000000,
46282
14
      NULL, HFILL }},
46283
46284
14
    {&hf_ieee80211_ff_ftm_param_asap_capable,
46285
14
     {"ASAP Capable", "wlan.fixed.ftm.param.asap_capable",
46286
14
      FT_UINT32, BASE_HEX, NULL, 0x02000000,
46287
14
      NULL, HFILL }},
46288
46289
14
    {&hf_ieee80211_ff_ftm_param_asap,
46290
14
     {"ASAP", "wlan.fixed.ftm.param.asap",
46291
14
      FT_UINT32, BASE_HEX, NULL, 0x04000000,
46292
14
      NULL, HFILL }},
46293
46294
14
    {&hf_ieee80211_ff_ftm_param_ftm_per_burst,
46295
14
     {"FTM per burst", "wlan.fixed.ftm.param.ftm_per_burst",
46296
14
      FT_UINT32, BASE_HEX, NULL, 0xF8000000,
46297
14
      NULL, HFILL }},
46298
46299
14
    {&hf_ieee80211_ff_ftm_param_delim3,
46300
14
     {"FTM Params (Subset 3 of 3)", "wlan.fixed.ftm.param.delim3",
46301
14
      FT_UINT24, BASE_HEX, NULL, 0x0,
46302
14
      NULL, HFILL }},
46303
46304
14
    {&hf_ieee80211_ff_ftm_param_reserved2,
46305
14
     {"Reserved2", "wlan.fixed.ftm.param.reserved2",
46306
14
      FT_UINT24, BASE_HEX, NULL, 0x000003,
46307
14
      NULL, HFILL }},
46308
46309
14
    {&hf_ieee80211_ff_ftm_param_format_and_bw,
46310
14
     {"Format and Bandwidth", "wlan.fixed.ftm.param.format_and_bw",
46311
14
      FT_UINT24, BASE_HEX, NULL, 0x0000FC,
46312
14
      NULL, HFILL }},
46313
46314
14
    {&hf_ieee80211_ff_ftm_param_burst_period,
46315
14
     {"Burst Period", "wlan.fixed.ftm.param.burst_period",
46316
14
      FT_UINT24, BASE_HEX, NULL, 0xFFFF00,
46317
14
      NULL, HFILL }},
46318
46319
14
    {&hf_ieee80211_ff_ftm_tod_err1,
46320
14
     {"FTM TOD Error", "wlan.fixed.ftm.tod_error",
46321
14
      FT_UINT8, BASE_HEX, NULL, 0,
46322
14
      "Management action FTM LMR TOD Error", HFILL }},
46323
46324
    /* az: Ranging Parameters element */
46325
46326
14
    {&hf_ieee80211_tag_ranging_parameters,
46327
14
     {"Ranging Parameters", "wlan.ranging",
46328
14
      FT_UINT56, BASE_HEX, NULL, 0,
46329
14
      NULL, HFILL }},
46330
46331
14
    {&hf_ieee80211_tag_ranging_subelt_tag,
46332
14
     {"Subelement Tag", "wlan.tag.ranging.subelt_tag",
46333
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
46334
46335
14
    {&hf_ieee80211_tag_ranging_subelt_len,
46336
14
     {"Subelement Len", "wlan.tag.ranging.subelt_len",
46337
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
46338
46339
14
    {&hf_ieee80211_tag_ranging_status_indication,
46340
14
     {"Status Indication", "wlan.ranging.status",
46341
14
      FT_UINT56, BASE_DEC | BASE_VAL64_STRING, VALS64(ieee80211_ranging_status_vals), GENMASK(1, 0),
46342
14
      "Status Indication", HFILL }},
46343
46344
14
    {&hf_ieee80211_tag_ranging_value,
46345
14
     {"Value", "wlan.ranging.value",
46346
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(6, 2),
46347
14
      "When Status Indication is 3, the Value field contains a duration in units of seconds", HFILL }},
46348
46349
14
    {&hf_ieee80211_tag_ranging_i2r_lmr_feedback,
46350
14
     {"I2R LMR Feedback", "wlan.ranging.i2r_lmr_feedback",
46351
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(7, 7),
46352
14
      NULL, HFILL }},
46353
46354
14
    {&hf_ieee80211_tag_ranging_secure_ltf_required,
46355
14
     {"Secure LTF Required", "wlan.ranging.secure_ltf_required",
46356
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(8, 8),
46357
14
      NULL, HFILL }},
46358
46359
14
    {&hf_ieee80211_tag_ranging_secure_ltf_support,
46360
14
     {"Secure LTF Support", "wlan.ranging.secure_ltf_support",
46361
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(9, 9),
46362
14
      NULL, HFILL }},
46363
46364
14
    {&hf_ieee80211_tag_ranging_ranging_priority,
46365
14
     {"Ranging Priority", "wlan.ranging.priority",
46366
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(11, 10),
46367
14
      NULL, HFILL }},
46368
46369
14
    {&hf_ieee80211_tag_ranging_r2i_toa_type,
46370
14
     {"R2I TOA Type", "wlan.ranging.r2i_toa_type",
46371
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(12, 12),
46372
14
      NULL, HFILL }},
46373
46374
14
    {&hf_ieee80211_tag_ranging_i2r_toa_type,
46375
14
     {"I2R TOA Type", "wlan.ranging.i2r_toa_type",
46376
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(13, 13),
46377
14
      NULL, HFILL }},
46378
46379
14
    {&hf_ieee80211_tag_ranging_r2i_aoa_requested,
46380
14
     {"R2I AOA Requested", "wlan.ranging.r2i_aoa_requested",
46381
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(14, 14),
46382
14
      NULL, HFILL }},
46383
46384
14
    {&hf_ieee80211_tag_ranging_i2r_aoa_requested,
46385
14
     {"I2R AOA Requested", "wlan.ranging.i2r_aoa_requested",
46386
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(15, 15),
46387
14
      NULL, HFILL }},
46388
46389
14
    {&hf_ieee80211_tag_ranging_format_and_bandwidth,
46390
14
     {"Format and Bandwidth", "wlan.ranging.format_and_bandwidth",
46391
14
      FT_UINT56, BASE_DEC | BASE_VAL64_STRING, VALS64(ieee80211_ranging_fmt_bw_vals), GENMASK(21, 16),
46392
14
      NULL, HFILL }},
46393
46394
14
    {&hf_ieee80211_tag_ranging_immediate_r2i_feedback,
46395
14
     {"Immediate R2I Feedback", "wlan.ranging.immediate_r2i_feedback",
46396
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(22, 22),
46397
14
      NULL, HFILL }},
46398
46399
14
    {&hf_ieee80211_tag_ranging_immediate_i2r_feedback,
46400
14
     {"Immediate I2R Feedback", "wlan.ranging.immediate_i2r_feedback",
46401
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(23, 23),
46402
14
      NULL, HFILL }},
46403
46404
14
    {&hf_ieee80211_tag_ranging_max_i2r_repetition,
46405
14
     {"Max I2R Repetition", "wlan.ranging.max_i2r_repetition",
46406
14
      FT_UINT56, BASE_CUSTOM, CF_FUNC(rep_custom), GENMASK(26, 24),
46407
14
      NULL, HFILL }},
46408
46409
14
    {&hf_ieee80211_tag_ranging_max_r2i_repetition,
46410
14
     {"Max R2I Repetition", "wlan.ranging.max_r2i_repetition",
46411
14
      FT_UINT56, BASE_CUSTOM, CF_FUNC(rep_custom), GENMASK(29, 27),
46412
14
      NULL, HFILL }},
46413
46414
14
    {&hf_ieee80211_tag_ranging_reserved1,
46415
14
     {"Reserved", "wlan.ranging.reserved1",
46416
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(30, 30),
46417
14
      NULL, HFILL }},
46418
46419
14
    {&hf_ieee80211_tag_ranging_reserved2,
46420
14
     {"Reserved", "wlan.ranging.reserved2",
46421
14
      FT_UINT56, BASE_DEC, NULL, GENMASK(31, 31),
46422
14
      NULL, HFILL }},
46423
46424
14
    {&hf_ieee80211_tag_ranging_max_r2i_sts_le_80_mhz,
46425
14
     {"Max R2I STS <= 80 MHz", "wlan.ranging.max_r2i_sts_le_80_mhz",
46426
14
      FT_UINT56, BASE_CUSTOM, CF_FUNC(sts_custom), GENMASK64(34, 32),
46427
14
      NULL, HFILL }},
46428
46429
14
    {&hf_ieee80211_tag_ranging_max_r2i_sts_gt_80_mhz,
46430
14
     {"Max R2I STS > 80 MHz", "wlan.ranging.max_r2i_sts_gt_80_mhz",
46431
14
      FT_UINT56, BASE_CUSTOM, CF_FUNC(sts_custom), GENMASK64(37, 35),
46432
14
      NULL, HFILL }},
46433
46434
14
    {&hf_ieee80211_tag_ranging_max_r2i_ltf_total,
46435
14
     {"Max R2I LTF Total", "wlan.ranging.max_r2i_ltf_total",
46436
14
      FT_UINT56, BASE_DEC | BASE_VAL64_STRING, VALS64(ieee80211_ranging_ltf_total_vals), GENMASK64(39, 38),
46437
14
      NULL, HFILL }},
46438
46439
14
    {&hf_ieee80211_tag_ranging_max_i2r_ltf_total,
46440
14
     {"Max I2R LTF Total", "wlan.ranging.max_i2r_ltf_total",
46441
14
      FT_UINT56, BASE_DEC | BASE_VAL64_STRING, VALS64(ieee80211_ranging_ltf_total_vals), GENMASK64(41, 40),
46442
14
      NULL, HFILL }},
46443
46444
14
    {&hf_ieee80211_tag_ranging_max_i2r_sts_le_80_mhz,
46445
14
     {"Max I2R STS <= 80 MHz", "wlan.ranging.max_i2r_sts_le_80_mhz",
46446
14
      FT_UINT56, BASE_CUSTOM, CF_FUNC(sts_custom), GENMASK64(44, 42),
46447
14
      NULL, HFILL }},
46448
46449
14
    {&hf_ieee80211_tag_ranging_max_i2r_sts_gt_80_mhz,
46450
14
     {"Max I2R STS > 80 MHz", "wlan.ranging.max_i2r_sts_gt_80_mhz",
46451
14
      FT_UINT56, BASE_CUSTOM, CF_FUNC(sts_custom), GENMASK64(47, 45),
46452
14
      NULL, HFILL }},
46453
46454
14
    {&hf_ieee80211_tag_ranging_bss_color_info,
46455
14
     {"BSS Color Information",
46456
14
      "wlan.tag.ftm.param.ranging.bss_color_information",
46457
14
      FT_UINT56, BASE_HEX, NULL, GENMASK64(55, 48), NULL, HFILL }},
46458
46459
    /* az: non-TB-specific subelement */
46460
46461
14
    {&hf_ieee80211_tag_ranging_ntb,
46462
14
     {"Non-TB specific subelement", "wlan.ranging.ntb",
46463
14
      FT_UINT48, BASE_HEX, NULL, 0,
46464
14
      NULL, HFILL }},
46465
46466
14
    {&hf_ieee80211_tag_ranging_ntb_reserved1,
46467
14
     {"Reserved", "wlan.ranging.ntb.reserved1",
46468
14
      FT_UINT48, BASE_DEC, NULL, GENMASK(0, 0),
46469
14
      NULL, HFILL }},
46470
46471
14
    {&hf_ieee80211_tag_ranging_ntb_min_time_msmts,
46472
14
     {"Min Time Between Measurements", "wlan.ranging.ntb.min_time",
46473
14
      FT_UINT48, BASE_DEC | BASE_UNIT_STRING, UNS(&units_100_us), GENMASK(23, 1),
46474
14
      NULL, HFILL }},
46475
46476
14
    {&hf_ieee80211_tag_ranging_ntb_max_time_msmts,
46477
14
     {"Max Time Between Measurements", "wlan.ranging.ntb.max_time",
46478
14
      FT_UINT48, BASE_DEC | BASE_UNIT_STRING, UNS(&units_10_ms), GENMASK64(43, 24),
46479
14
      NULL, HFILL }},
46480
46481
14
    {&hf_ieee80211_tag_ranging_ntb_r2i_tx_power,
46482
14
     {"R2I Tx Power", "wlan.ranging.ntb.r2i_tx_power",
46483
14
      FT_UINT48, BASE_DEC, NULL, GENMASK64(44, 44),
46484
14
      NULL, HFILL }},
46485
46486
14
    {&hf_ieee80211_tag_ranging_ntb_i2r_tx_power,
46487
14
     {"I2R Tx Power", "wlan.ranging.ntb.i2r_tx_power",
46488
14
      FT_UINT48, BASE_DEC, NULL, GENMASK64(45, 45),
46489
14
      NULL, HFILL }},
46490
46491
14
    {&hf_ieee80211_tag_ranging_ntb_reserved2,
46492
14
     {"Reserved", "wlan.ranging.ntb.reserved2",
46493
14
      FT_UINT48, BASE_HEX, NULL, GENMASK64(47, 46),
46494
14
      NULL, HFILL }},
46495
46496
14
    {&hf_ieee80211_tag_ranging_aid_rsid,
46497
14
     {"AID/RSID", "wlan.ranging.tb.aid_rsid",
46498
14
      FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL }},
46499
46500
14
    {&hf_ieee80211_tag_ranging_device_class,
46501
14
     {"Device Class", "wlan.ranging.tb.device_class",
46502
14
      FT_UINT32, BASE_DEC, NULL, 0x00010000, NULL, HFILL }},
46503
46504
14
    {&hf_ieee80211_tag_ranging_full_bw_ul_mu_mimo,
46505
14
     {"Full Bandwidth UL MU-MIMO", "wlan.ranging.tb.full_bw_ul_mu_mimo",
46506
14
      FT_UINT32, BASE_DEC, NULL, 0x00020000, NULL, HFILL }},
46507
46508
14
    {&hf_ieee80211_tag_ranging_trigger_frame_paddur,
46509
14
     {"Trigger Frame Padding Duration",
46510
14
      "wlan.ranging.tb.trigger_frame_padding_duration",
46511
14
      FT_BOOLEAN, 32, NULL, 0x000C0000, NULL, HFILL }},
46512
46513
14
    {&hf_ieee80211_tag_ranging_max_sess_exp,
46514
14
     {"Max Session Exp", "wlan.ranging.tb.max_session.exp",
46515
14
      FT_UINT32, BASE_DEC, NULL, 0x00f00000, NULL, HFILL }},
46516
46517
14
    {&hf_ieee80211_tag_ranging_passive_tb_ranging,
46518
14
     {"Passive TB Ranging", "wlan.ranging.tb.passive_tb_ranging",
46519
14
      FT_BOOLEAN, 32, NULL, 0x01000000, NULL, HFILL }},
46520
46521
14
    {&hf_ieee80211_tag_ranging_tb_specific_reserved,
46522
14
     {"Reserved", "wlan.ranging.tb.reserved",
46523
14
      FT_UINT32, BASE_HEX, NULL, 0xFE000000, NULL, HFILL }},
46524
46525
14
    {&hf_ieee80211_tag_ranging_secure_he_ltf,
46526
14
     {"Secure HE-LTF subelement", "wlan.ranging.secure_he_ltf",
46527
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
46528
14
      NULL, HFILL }},
46529
46530
14
    {&hf_ieee80211_tag_ranging_secure_he_ltf_version,
46531
14
     {"Protocol Version", "wlan.ranging.secure_he_ltf.version",
46532
14
      FT_UINT8, BASE_DEC, NULL, 0x07,
46533
14
      NULL, HFILL }},
46534
46535
14
    {&hf_ieee80211_tag_ranging_secure_he_ltf_req,
46536
14
     {"Secure HE-LTF Req", "wlan.ranging.secure_he_ltf.req",
46537
14
      FT_UINT8, BASE_DEC, NULL, 0x08,
46538
14
      NULL, HFILL }},
46539
46540
14
    {&hf_ieee80211_tag_ranging_secure_he_ltf_r2i_tx_window,
46541
14
     {"R2I Tx Window", "wlan.ranging.secure_he_ltf.r2i_tx_window",
46542
14
      FT_UINT8, BASE_DEC, NULL, 0x10,
46543
14
      NULL, HFILL }},
46544
46545
14
    {&hf_ieee80211_tag_ranging_secure_he_ltf_i2r_tx_window,
46546
14
     {"I2R Tx Window", "wlan.ranging.secure_he_ltf.i2r_tx_window",
46547
14
      FT_UINT8, BASE_DEC, NULL, 0x20,
46548
14
      NULL, HFILL }},
46549
46550
14
    {&hf_ieee80211_tag_ranging_secure_he_ltf_reserved,
46551
14
     {"Reserved", "wlan.ranging.secure_he_ltf.reserved",
46552
14
      FT_UINT8, BASE_HEX, NULL, 0xc0,
46553
14
      NULL, HFILL }},
46554
46555
14
    {&hf_ieee80211_tag_dirn_meas_results_aoa_results,
46556
14
     {"AOA Results", "wlan.etag.direction_measurement_results.aoa_results",
46557
14
      FT_UINT48, BASE_HEX, NULL, 0x0, NULL, HFILL }},
46558
46559
14
    {&hf_ieee80211_tag_ftm_aoa_results_aoa_azimuth,
46560
14
     {"AOA Azimuth", "wlan.etag.direction_measurement_results.aoa_azimuth",
46561
14
      FT_UINT48, BASE_CUSTOM, CF_FUNC(aoa_azimuth_custom),
46562
14
      0x0000000007ff, NULL, HFILL }},
46563
46564
14
    {&hf_ieee80211_tag_ftm_aoa_results_aoa_elevation,
46565
14
     {"AOA Elevation", "wlan.etag.direction_measurement_results.aoa_elevation",
46566
14
      FT_UINT48, BASE_CUSTOM, CF_FUNC(aoa_elevation_custom),
46567
14
      0x0000001ff800, NULL, HFILL }},
46568
46569
14
    {&hf_ieee80211_tag_ftm_aoa_results_aoa_azimuth_accuracy,
46570
14
     {"AOA Azimuth Accuracy",
46571
14
      "wlan.etag.direction_measurement_results.aoa_azimuth_accuracy",
46572
14
      FT_UINT48, BASE_CUSTOM, CF_FUNC(aoa_accuracy_custom),
46573
14
      0x00000fe00000, NULL, HFILL }},
46574
46575
14
    {&hf_ieee80211_tag_ftm_aoa_results_aoa_elevation_accuracy,
46576
14
     {"AOA Elevation Accuracy",
46577
14
      "wlan.etag.direction_measurement_results.aoa_elevation_accuracy",
46578
14
      FT_UINT48, BASE_CUSTOM, CF_FUNC(aoa_accuracy_custom),
46579
14
      0x0007f0000000, NULL, HFILL }},
46580
46581
14
    {&hf_ieee80211_tag_ftm_aoa_results_best_awv_id,
46582
14
     {"Best AWV ID", "wlan.etag.direction_measurement_results.best_awv_id",
46583
14
      FT_UINT48, BASE_DEC, NULL, 0x3ff800000000, NULL, HFILL }},
46584
46585
14
    {&hf_ieee80211_tag_ftm_aoa_results_aoa_reference,
46586
14
     {"AOA Reference", "wlan.etag.direction_measurement_results.aoa_reference",
46587
14
      FT_BOOLEAN, 48, TFS(&aoa_reference_tfs), 0x400000000000, NULL, HFILL }},
46588
46589
14
    {&hf_ieee80211_tag_ftm_aoa_results_reserved,
46590
14
     {"Reserved", "wlan.etag.direction_measurement_results.reserved",
46591
14
      FT_UINT48, BASE_DEC, NULL, 0x800000000000, NULL, HFILL }},
46592
46593
14
    {&hf_ieee80211_ff_ftm_max_tod_error_exponent,
46594
14
     {"Max TOD Error Exponent", "wlan.fixed.ftm.max_tod_error_exponent",
46595
14
      FT_UINT8, BASE_DEC, NULL, GENMASK(4, 0), NULL, HFILL }},
46596
46597
14
    {&hf_ieee80211_ff_ftm_tod_err_reserved,
46598
14
     {"Reserved", "wlan.fixed.ftm.tod_reserved",
46599
14
      FT_UINT8, BASE_HEX, NULL, GENMASK(6, 5), NULL, HFILL }},
46600
46601
14
    {&hf_ieee80211_ff_ftm_tod_not_continuous,
46602
14
     {"TOD Not Continuous", "wlan.fixed.ftm.tod_not_continuous",
46603
14
      FT_BOOLEAN, 8, NULL, GENMASK(7, 7), NULL, HFILL }},
46604
46605
14
    {&hf_ieee80211_ff_ftm_toa_err1,
46606
14
     {"FTM TOA Error", "wlan.fixed.ftm_toa_err",
46607
14
      FT_UINT8, BASE_HEX, NULL, 0,
46608
14
      "Management action FTM LMR TOA Error", HFILL }},
46609
46610
14
    {&hf_ieee80211_ff_ftm_max_toa_error_exponent,
46611
14
     {"Max TOA Error Exponent", "wlan.fixed.ftm_max_toa_error_exponent",
46612
14
      FT_UINT8, BASE_DEC, NULL, GENMASK(4, 0), NULL, HFILL }},
46613
46614
14
    {&hf_ieee80211_ff_ftm_toa_err_reserved,
46615
14
     {"Reserved", "wlan.fixed.ftm_toa_reserved",
46616
14
      FT_UINT8, BASE_HEX, NULL, GENMASK(5, 5), NULL, HFILL }},
46617
46618
14
    {&hf_ieee80211_ff_ftm_invalid_measurement,
46619
14
     {"Invalid Measurement", "wlan.fixed.ftm_invalid_measurement",
46620
14
      FT_BOOLEAN, 8, NULL, GENMASK(6, 6), NULL, HFILL }},
46621
46622
14
    {&hf_ieee80211_ff_ftm_toa_type,
46623
14
     {"TOA Type", "wlan.fixed.ftm_toa_type",
46624
14
      FT_UINT8, BASE_DEC, NULL, GENMASK(7, 7), NULL, HFILL }},
46625
46626
14
    {&hf_ieee80211_ff_ftm_cfo,
46627
14
     {"CFO", "wlan.fixed.ftm.param.cfo",
46628
14
      FT_UINT16, BASE_HEX, NULL, 0,
46629
14
      NULL, HFILL }},
46630
46631
14
    {&hf_ieee80211_ff_ftm_r2i_ndp_tx_power,
46632
14
     {"R2I NDP Tx Power", "wlan.fixed.ftm.param.r2i_ndp_tx_power",
46633
14
      FT_UINT8, BASE_DEC, NULL, 0,
46634
14
      NULL, HFILL }},
46635
46636
14
    {&hf_ieee80211_ff_ftm_i2r_ndp_target_rssi,
46637
14
     {"I2R NDP Target RSSI", "wlan.fixed.ftm.param.i2r_ndp_target_rssi",
46638
14
      FT_UINT8, BASE_DEC, NULL, 0,
46639
14
      NULL, HFILL }},
46640
46641
14
    {&hf_ieee80211_tag_secure_ltf_params_counter,
46642
14
     {"Secure LTF Counter", "wlan.etag.secure_ltf_params.secure_ltf_counter",
46643
14
      FT_UINT48, BASE_DEC, NULL, 0x0, NULL, HFILL }},
46644
46645
14
    {&hf_ieee80211_tag_secure_ltf_generation_sac,
46646
14
     {"LTF Generation SAC", "wlan.etag.secure_ltf_params.ltf_generation_sac",
46647
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
46648
46649
14
    {&hf_ieee80211_tag_secure_ltf_management_sac,
46650
14
     {"Ranging Management SAC",
46651
14
      "wlan.etag.secure_ltf_params.ranging_management_sac",
46652
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
46653
46654
14
    {&hf_ieee80211_tag_secure_ltf_result_ltf_ofs,
46655
14
     {"Measurement Result LTF Offset",
46656
14
      "wlan.etag.secure_ltf_params.measurement_result_ltf_offset",
46657
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
46658
46659
14
    {&hf_ieee80211_ftm_ista_availability_count,
46660
14
     {"ISTA Availability Count", "wlan.ranging.ista.availability_count",
46661
14
      FT_UINT16, BASE_DEC, NULL, 0x01FF, NULL, HFILL }},
46662
46663
14
    {&hf_ieee80211_ftm_ista_availability_reserved,
46664
14
     {"Reserved", "wlan.ranging.ista.availability_reserved",
46665
14
      FT_UINT16, BASE_HEX, NULL, 0xFE00, NULL, HFILL }},
46666
46667
14
    {&hf_ieee80211_ftm_ista_avail_bits,
46668
14
     {"ISTA Availability", "wlan.ranging.ista.availability_bits",
46669
14
      FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
46670
46671
14
    {&hf_ieee80211_ftm_ista_avail_pad,
46672
14
     {"Padding", "wlan.ranging.ista.availability_pad",
46673
14
      FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
46674
46675
14
    {&hf_ieee80211_ftm_rsta_header,
46676
14
     {"Header", "wlan.ftm.rsta.header",
46677
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
46678
46679
14
    {&hf_ieee80211_ftm_rsta_count,
46680
14
     {"RSTA Count", "wlan.ranging.rsta.count",
46681
14
      FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL }},
46682
46683
14
    {&hf_ieee80211_ftm_rsta_avail_window_bcast_fmt,
46684
14
     {"Availability Window Broadcast Format",
46685
14
      "wlan.ftm.rsta.availability_window_broadcast_format",
46686
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
46687
46688
14
    {&hf_ieee80211_ftm_rsta_partial_tsf_timer1,
46689
14
     {"Partial TSF Timer", "wlan.ranging.rsta.partial_tsf_timer",
46690
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(partial_tsf_custom), 0x0000ffff, NULL, HFILL }},
46691
46692
14
    {&hf_ieee80211_ftm_rsta_duration1,
46693
14
     {"Duration", "wlan.ranging.rsta.duration",
46694
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(hundred_us_base_custom), 0x7f0000, NULL, HFILL }},
46695
46696
14
    {&hf_ieee80211_ftm_rsta_passive_tb_ranging_reserved1,
46697
14
     {"Reserved", "wlan.ranging.rsta.reserved1",
46698
14
      FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL }},
46699
46700
14
    {&hf_ieee80211_ftm_rsta_periodicity1,
46701
14
     {"Periodicity", "wlan.ranging.rsta.periodicity1",
46702
14
      FT_UINT32, BASE_DEC, NULL, 0xff000000, NULL, HFILL }},
46703
46704
14
    {&hf_ieee80211_ftm_rsta_partial_tsf_timer,
46705
14
     {"Partial TSF Timer", "wlan.ranging.rsta.partial_tsf_timer_long",
46706
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(partial_tsf_custom), 0xffff, NULL, HFILL }},
46707
46708
14
    {&hf_ieee80211_ftm_rsta_duration,
46709
14
     {"Duration", "wlan.ranging.rsta.duration_long",
46710
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(hundred_us_base_custom), 0x7f0000, NULL, HFILL }},
46711
46712
14
    {&hf_ieee80211_ftm_rsta_passive_tb_ranging_reserved,
46713
14
     {"Reserved", "wlan.ranging.rsta.reserved",
46714
14
      FT_BOOLEAN, 40, NULL, 0x0000800000, NULL, HFILL }},
46715
46716
14
    {&hf_ieee80211_ftm_rsta_periodicity,
46717
14
     {"Periodicity", "wlan.ranging.rsta.periodicity",
46718
14
      FT_UINT40, BASE_DEC, NULL, 0x00ff000000, NULL, HFILL }},
46719
46720
14
    {&hf_ieee80211_ftm_rsta_format_and_bandwidth,
46721
14
      {"Format and Bandwidth", "wlan.ftm.rsta.format_and_bandwidth",
46722
14
       FT_UINT40, BASE_HEX, NULL, 0x3F00000000, NULL, HFILL }},
46723
46724
14
    {&hf_ieee80211_ftm_rsta_reserved,
46725
14
     {"Reserved", "wlan.ftm.rsta.reserved",
46726
14
      FT_UINT40, BASE_HEX, NULL, 0xC000000000, NULL, HFILL }},
46727
46728
14
    {&hf_ieee80211_ftm_rsta_avail_subfield_short,
46729
14
     {"RSTA Availability Information", "wlan.ranging.rsta.availability_window",
46730
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
46731
46732
14
    {&hf_ieee80211_ftm_rsta_avail_subfield_long,
46733
14
     {"RSTA Availability Information",
46734
14
      "wlan.ranging.rsta.availability_window_long",
46735
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
46736
46737
14
    {&hf_ieee80211_ff_psmp_sta_info,
46738
14
     {"Power Save Multi-Poll (PSMP) Station Information", "wlan.fixed.psmp.stainfo",
46739
14
      FT_UINT64, BASE_HEX, NULL, 0,
46740
14
      NULL, HFILL }},
46741
46742
14
    {&hf_ieee80211_ff_psmp_sta_info_type,
46743
14
     {"Sta Info Type", "wlan.fixed.psmp.stainfo.type",
46744
14
      FT_UINT32, BASE_HEX, VALS(ff_psmp_sta_info_flags), PSMP_STA_INFO_FLAG_TYPE,
46745
14
      NULL, HFILL }},
46746
46747
14
    {&hf_ieee80211_ff_psmp_sta_info_dtt_start_offset,
46748
14
     {"DTT Start Offset", "wlan.fixed.psmp.stainfo.dttstart",
46749
14
      FT_UINT32, BASE_HEX, NULL, PSMP_STA_INFO_FLAG_DTT_START,
46750
14
      NULL, HFILL }},
46751
46752
14
    {&hf_ieee80211_ff_psmp_sta_info_dtt_duration,
46753
14
     {"DTT Duration", "wlan.fixed.psmp.stainfo.dttduration",
46754
14
      FT_UINT32, BASE_HEX, NULL, PSMP_STA_INFO_FLAG_DTT_DURATION,
46755
14
      NULL, HFILL }},
46756
46757
14
    {&hf_ieee80211_ff_psmp_sta_info_sta_id,
46758
14
     {"Target Station ID", "wlan.fixed.psmp.stainfo.staid",
46759
14
      FT_UINT32, BASE_HEX, NULL, PSMP_STA_INFO_FLAG_STA_ID,
46760
14
      NULL, HFILL }},
46761
46762
14
    {&hf_ieee80211_ff_psmp_sta_info_utt_start_offset,
46763
14
     {"UTT Start Offset", "wlan.fixed.psmp.stainfo.uttstart",
46764
14
      FT_UINT32, BASE_HEX, NULL, PSMP_STA_INFO_FLAG_UTT_START,
46765
14
      NULL, HFILL }},
46766
46767
14
    {&hf_ieee80211_ff_psmp_sta_info_utt_duration,
46768
14
     {"UTT Duration", "wlan.fixed.psmp.stainfo.uttduration",
46769
14
      FT_UINT32, BASE_HEX, NULL, PSMP_STA_INFO_FLAG_UTT_DURATION,
46770
14
      NULL, HFILL }},
46771
46772
14
    {&hf_ieee80211_ff_psmp_sta_info_reserved_small,
46773
14
     {"Reserved", "wlan.fixed.psmp.stainfo.reserved",
46774
14
      FT_UINT32, BASE_HEX, NULL, PSMP_STA_INFO_FLAG_IA_RESERVED,
46775
14
      NULL, HFILL }},
46776
46777
14
    {&hf_ieee80211_ff_psmp_sta_info_reserved_large,
46778
14
     {"Reserved", "wlan.fixed.psmp.stainfo.reserved64",
46779
14
      FT_UINT64, BASE_HEX, NULL, 0,
46780
14
      NULL, HFILL }},
46781
46782
14
    {&hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id,
46783
14
     {"Power Save Multi-Poll (PSMP) Multicast ID", "wlan.fixed.psmp.stainfo.multicastid",
46784
14
      FT_UINT64, BASE_HEX, NULL, 0,
46785
14
      NULL, HFILL }},
46786
46787
14
    {&hf_ieee80211_ff_ant_selection,
46788
14
     {"Antenna Selection", "wlan.fixed.antsel",
46789
14
      FT_UINT8, BASE_HEX, NULL, 0,
46790
14
      NULL, HFILL }},
46791
46792
14
    {&hf_ieee80211_ff_ant_selection_0,
46793
14
     {"Antenna 0", "wlan.fixed.antsel.ant0",
46794
14
      FT_UINT8, BASE_HEX, NULL, 0x01,
46795
14
      NULL, HFILL }},
46796
46797
14
    {&hf_ieee80211_ff_ant_selection_1,
46798
14
     {"Antenna 1", "wlan.fixed.antsel.ant1",
46799
14
      FT_UINT8, BASE_HEX, NULL, 0x02,
46800
14
      NULL, HFILL }},
46801
46802
14
    {&hf_ieee80211_ff_ant_selection_2,
46803
14
     {"Antenna 2", "wlan.fixed.antsel.ant2",
46804
14
      FT_UINT8, BASE_HEX, NULL, 0x04,
46805
14
      NULL, HFILL }},
46806
46807
14
    {&hf_ieee80211_ff_ant_selection_3,
46808
14
     {"Antenna 3", "wlan.fixed.antsel.ant3",
46809
14
      FT_UINT8, BASE_HEX, NULL, 0x08,
46810
14
      NULL, HFILL }},
46811
46812
14
    {&hf_ieee80211_ff_ant_selection_4,
46813
14
     {"Antenna 4", "wlan.fixed.antsel.ant4",
46814
14
      FT_UINT8, BASE_HEX, NULL, 0x10,
46815
14
      NULL, HFILL }},
46816
46817
14
    {&hf_ieee80211_ff_ant_selection_5,
46818
14
     {"Antenna 5", "wlan.fixed.antsel.ant5",
46819
14
      FT_UINT8, BASE_HEX, NULL, 0x20,
46820
14
      NULL, HFILL }},
46821
46822
14
    {&hf_ieee80211_ff_ant_selection_6,
46823
14
     {"Antenna 6", "wlan.fixed.antsel.ant6",
46824
14
      FT_UINT8, BASE_HEX, NULL, 0x40,
46825
14
      NULL, HFILL }},
46826
46827
14
    {&hf_ieee80211_ff_ant_selection_7,
46828
14
     {"Antenna 7", "wlan.fixed.antsel.ant7",
46829
14
      FT_UINT8, BASE_HEX, NULL, 0x80,
46830
14
      NULL, HFILL }},
46831
46832
14
    {&hf_ieee80211_ff_ext_channel_switch_announcement,
46833
14
     {"Extended Channel Switch Announcement", "wlan.fixed.extchansw",
46834
14
      FT_UINT32, BASE_HEX, NULL, 0,
46835
14
      NULL, HFILL }},
46836
46837
14
    {&hf_ieee80211_ff_ext_channel_switch_announcement_switch_mode,
46838
14
     {"Channel Switch Mode", "wlan.fixed.extchansw.switchmode",
46839
14
      FT_UINT32, BASE_HEX, VALS(ieee80211_tag_ext_channel_switch_announcement_switch_mode_flags), 0x000000FF,
46840
14
      NULL, HFILL }},
46841
46842
14
    {&hf_ieee80211_ff_ext_channel_switch_announcement_new_ope_class,
46843
14
     {"New Operating Class", "wlan.fixed.extchansw.new.opeclass",
46844
14
      FT_UINT32, BASE_HEX, NULL, 0x0000FF00,
46845
14
      NULL, HFILL }},
46846
46847
14
    {&hf_ieee80211_ff_ext_channel_switch_announcement_new_chan_number,
46848
14
     {"New Channel Number", "wlan.fixed.extchansw.new.channumber",
46849
14
      FT_UINT32, BASE_HEX, NULL, 0x00FF0000,
46850
14
      NULL, HFILL }},
46851
46852
14
    {&hf_ieee80211_ff_ext_channel_switch_announcement_switch_count,
46853
14
     {"Channel Switch Count", "wlan.extchansw.switchcount",
46854
14
      FT_UINT32, BASE_HEX, NULL, 0xFF000000,
46855
14
      NULL, HFILL }},
46856
46857
14
    {&hf_ieee80211_ff_ht_info,
46858
14
     {"HT Information", "wlan.fixed.mimo",
46859
14
      FT_UINT8, BASE_HEX, NULL, 0,
46860
14
      "HT Information Fixed Field", HFILL }},
46861
46862
14
    {&hf_ieee80211_ff_ht_info_information_request,
46863
14
     {"Information Request", "wlan.fixed.mimo.control.inforequest",
46864
14
      FT_BOOLEAN, 8, TFS(&ff_ht_info_information_request_flag), 0x01,
46865
14
      NULL, HFILL }},
46866
46867
14
    {&hf_ieee80211_ff_ht_info_40_mhz_intolerant,
46868
14
     {"40 MHz Intolerant", "wlan.fixed.mimo.control.intolerant",
46869
14
      FT_BOOLEAN, 8, TFS(&ff_ht_info_40_mhz_intolerant_flag), 0x02,
46870
14
      NULL, HFILL }},
46871
46872
14
    {&hf_ieee80211_ff_ht_info_sta_chan_width,
46873
14
     {"Station Channel Width", "wlan.fixed.mimo.control.chanwidth",
46874
14
      FT_BOOLEAN, 8, TFS(&ff_ht_info_sta_chan_width_flag), 0x04,
46875
14
      NULL, HFILL }},
46876
46877
14
    {&hf_ieee80211_ff_ht_info_reserved,
46878
14
     {"Reserved", "wlan.fixed.reserved",
46879
14
      FT_UINT8, BASE_HEX, 0, 0xF8,
46880
14
      "Reserved Field", HFILL }},
46881
46882
14
    {&hf_ieee80211_ff_ht_action,
46883
14
     {"HT Action", "wlan.fixed.htact",
46884
14
      FT_UINT8, BASE_HEX, VALS(ff_ht_action_flags), 0,
46885
14
      "HT Action Code", HFILL }},
46886
46887
14
    {&hf_ieee80211_ff_mimo_csi_snr,
46888
14
     {"Signal to Noise Ratio (SNR)", "wlan.mimo.csimatrices.snr",
46889
14
      FT_UINT8, BASE_HEX, NULL, 0,
46890
14
      NULL, HFILL }},
46891
46892
14
    {&hf_ieee80211_ff_mimo_csi_matrices,
46893
14
     {"CSI Matrices", "wlan.mimo.csimatrices",
46894
14
      FT_NONE, BASE_NONE, NULL, 0,
46895
14
      NULL, HFILL }},
46896
46897
14
    {&hf_ieee80211_ff_mimo_csi_bf_matrices,
46898
14
     {"Beamforming Feedback Matrices", "wlan.mimo.csimatrices.bf",
46899
14
      FT_NONE, BASE_NONE, NULL, 0,
46900
14
      NULL, HFILL }},
46901
46902
14
    {&hf_ieee80211_ff_mimo_csi_cbf_matrices,
46903
14
     {"Compressed Beamforming Feedback Matrices", "wlan.mimo.csimatrices.cbf",
46904
14
      FT_NONE, BASE_NONE, NULL, 0,
46905
14
      NULL, HFILL }},
46906
46907
14
    {&hf_ieee80211_ff_public_action,
46908
14
     {"Public Action", "wlan.fixed.publicact",
46909
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ff_pa_action_codes_ext, 0,
46910
14
      "Public Action Code", HFILL }},
46911
46912
14
    {&hf_ieee80211_ff_protected_public_action,
46913
14
     {"Protected Public Action", "wlan.fixed.protectedpublicact",
46914
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ff_ppa_action_codes_ext, 0,
46915
14
      "Protected Public Action Code", HFILL }},
46916
46917
14
    {&hf_ieee80211_ff_capture,
46918
14
     {"Capabilities Information", "wlan.fixed.capabilities",
46919
14
      FT_UINT16, BASE_HEX, NULL, 0,
46920
14
      "Capability information", HFILL }},
46921
46922
14
    {&hf_ieee80211_ff_cf_ess,
46923
14
     {"ESS capabilities", "wlan.fixed.capabilities.ess",
46924
14
      FT_BOOLEAN, 16, TFS(&cf_ess_flags), 0x0001,
46925
14
      NULL, HFILL }},
46926
46927
14
    {&hf_ieee80211_ff_cf_ibss,
46928
14
     {"IBSS status", "wlan.fixed.capabilities.ibss",
46929
14
      FT_BOOLEAN, 16, TFS(&cf_ibss_flags), 0x0002,
46930
14
      "IBSS participation", HFILL }},
46931
46932
14
    {&hf_ieee80211_ff_cf_reserved1,
46933
14
     {"Reserved", "wlan.fixed.capabilities.reserved1",
46934
14
      FT_UINT16, BASE_DEC, NULL, 0x0004, NULL, HFILL }},
46935
46936
14
    {&hf_ieee80211_ff_cf_reserved2,
46937
14
     {"Reserved", "wlan.fixed.capabilities.reserved2",
46938
14
      FT_UINT16, BASE_DEC, NULL, 0x0008, NULL, HFILL }},
46939
46940
14
    {&hf_ieee80211_ff_cf_privacy,
46941
14
     {"Privacy", "wlan.fixed.capabilities.privacy",
46942
14
      FT_BOOLEAN, 16, TFS(&cf_privacy_flags), 0x0010,
46943
14
      "Data privacy", HFILL }},
46944
46945
14
    {&hf_ieee80211_ff_cf_preamble,
46946
14
     {"Short Preamble", "wlan.fixed.capabilities.short_preamble",
46947
14
      FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x0020,
46948
14
      NULL, HFILL }},
46949
46950
14
    {&hf_ieee80211_ff_cf_critical_update_flag,
46951
14
     {"Critical Update Flag", "wlan.fixed.capabilities.critical_update_flag",
46952
14
      FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL }},
46953
46954
14
    {&hf_ieee80211_ff_cf_nontran_bss_critical_update_flag,
46955
14
     {"Nontransmitted BSSIDs Critical Update Flag", "wlan.fixed.capabilities.nontran_bss_critical_update_flag",
46956
14
      FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL }},
46957
46958
14
    {&hf_ieee80211_ff_cf_spec_man,
46959
14
     {"Spectrum Management", "wlan.fixed.capabilities.spec_man",
46960
14
      FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0100,
46961
14
      NULL, HFILL }},
46962
46963
14
    {&hf_ieee80211_ff_cf_qos,
46964
14
     {"QoS", "wlan.fixed.capabilities.qos",
46965
14
      FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0200,
46966
14
      NULL, HFILL }},
46967
46968
14
    {&hf_ieee80211_ff_cf_short_slot_time,
46969
14
     {"Short Slot Time", "wlan.fixed.capabilities.short_slot_time",
46970
14
      FT_BOOLEAN, 16, TFS(&tfs_inuse_not_inuse), 0x0400,
46971
14
      NULL, HFILL }},
46972
46973
14
    {&hf_ieee80211_ff_cf_apsd,
46974
14
     {"Automatic Power Save Delivery", "wlan.fixed.capabilities.apsd",
46975
14
      FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0800,
46976
14
      NULL, HFILL }},
46977
46978
14
    {&hf_ieee80211_ff_cf_radio_measurement,
46979
14
     {"Radio Measurement", "wlan.fixed.capabilities.radio_measurement",
46980
14
      FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x1000,
46981
14
      NULL, HFILL }},
46982
46983
14
    {&hf_ieee80211_ff_cf_epd,
46984
14
     {"EPD", "wlan.fixed.capabilities.epd",
46985
14
      FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x2000,
46986
14
      NULL, HFILL }},
46987
46988
14
    {&hf_ieee80211_ff_cf_reserved5,
46989
14
     {"Reserved", "wlan.fixed.capabilities.reserved5",
46990
14
      FT_UINT16, BASE_DEC, NULL, 0x4000, NULL, HFILL }},
46991
46992
14
    {&hf_ieee80211_ff_cf_reserved6,
46993
14
     {"Reserved", "wlan.fixed.capabilities.reserved6",
46994
14
      FT_UINT16, BASE_DEC, NULL, 0x8000, NULL, HFILL }},
46995
46996
14
    {&hf_ieee80211_ff_auth_seq,
46997
14
     {"Authentication SEQ", "wlan.fixed.auth_seq",
46998
14
      FT_UINT16, BASE_HEX, NULL, 0,
46999
14
      "Authentication Sequence Number", HFILL }},
47000
47001
14
    {&hf_ieee80211_ff_assoc_id,
47002
14
     {"Association ID", "wlan.fixed.aid",
47003
14
      FT_UINT16, BASE_HEX, NULL, 0x3FFF,
47004
14
      NULL, HFILL }},
47005
47006
14
    {&hf_ieee80211_ff_listen_ival,
47007
14
     {"Listen Interval", "wlan.fixed.listen_ival",
47008
14
      FT_UINT16, BASE_HEX, NULL, 0,
47009
14
      NULL, HFILL }},
47010
47011
14
    {&hf_ieee80211_ff_current_ap,
47012
14
     {"Current AP", "wlan.fixed.current_ap",
47013
14
      FT_ETHER, BASE_NONE, NULL, 0,
47014
14
      "MAC address of current AP", HFILL }},
47015
47016
14
    {&hf_ieee80211_ff_reason,
47017
14
     {"Reason code", "wlan.fixed.reason_code",
47018
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_reason_code_ext, 0,
47019
14
      "Reason for unsolicited notification", HFILL }},
47020
47021
14
    {&hf_ieee80211_ff_status_code,
47022
14
     {"Status code", "wlan.fixed.status_code",
47023
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
47024
14
      "Status of requested event", HFILL }},
47025
47026
14
    {&hf_ieee80211_ff_category_code,
47027
14
     {"Category code", "wlan.fixed.category_code",
47028
14
      FT_UINT16, BASE_DEC|BASE_EXT_STRING, &category_codes_ext, 0,
47029
14
      "Management action category", HFILL }},
47030
47031
14
    {&hf_ieee80211_ff_action_code,
47032
14
     {"Action code", "wlan.fixed.action_code",
47033
14
      FT_UINT16, BASE_DEC, VALS(action_codes), 0,
47034
14
      "Management action code", HFILL }},
47035
47036
14
    {&hf_ieee80211_ff_dialog_token,
47037
14
     {"Dialog token", "wlan.fixed.dialog_token",
47038
14
      FT_UINT8, BASE_HEX, NULL, 0,
47039
14
      "Management action dialog token", HFILL }},
47040
47041
14
    {&hf_ieee80211_ff_trigger,
47042
14
     {"Trigger", "wlan.fixed.trigger",
47043
14
      FT_UINT8, BASE_DEC, VALS(ftm_trigger_vals), 0,
47044
14
      "FTM action trigger", HFILL }},
47045
47046
14
    {&hf_ieee80211_ff_ftm_tod,
47047
14
     {"FTM TOD", "wlan.fixed.ftm_tod",
47048
14
      FT_UINT48, BASE_DEC, NULL, 0,
47049
14
      "Management action FTM TOD", HFILL }},
47050
47051
14
    {&hf_ieee80211_ff_ftm_toa,
47052
14
     {"FTM TOA", "wlan.fixed.ftm_toa",
47053
14
      FT_UINT48, BASE_DEC, NULL, 0,
47054
14
      "Management action FTM TOA", HFILL }},
47055
47056
14
    {&hf_ieee80211_ff_ftm_tod_err,
47057
14
     {"FTM TOD Error", "wlan.fixed.ftm_tod_err",
47058
14
      FT_UINT16, BASE_DEC, NULL, 0,
47059
14
      "Management action FTM TOD Error", HFILL }},
47060
47061
14
    {&hf_ieee80211_ff_ftm_toa_err,
47062
14
     {"FTM TOA Error", "wlan.fixed.ftm_toa_err",
47063
14
      FT_UINT16, BASE_DEC, NULL, 0,
47064
14
      "Management action FTM TOA Error", HFILL }},
47065
47066
14
    {&hf_ieee80211_ff_followup_dialog_token,
47067
14
     {"Followup Dialog token", "wlan.fixed.followup_dialog_token",
47068
14
      FT_UINT8, BASE_HEX, NULL, 0,
47069
14
      "Management action followup dialog token", HFILL }},
47070
47071
14
    {&hf_ieee80211_ff_marvell_action_type,
47072
14
     {"Marvell Action type", "wlan.fixed.mrvl_action_type",
47073
14
      FT_UINT8, BASE_DEC, VALS(vendor_action_types_mrvl), 0,
47074
14
      "Vendor Specific Action Type (Marvell)", HFILL }},
47075
47076
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_action_code,
47077
14
     {"Mesh action(Marvell)", "wlan.fixed.mrvl_mesh_action",
47078
14
      FT_UINT8, BASE_HEX, VALS(mesh_mgt_action_codes_mrvl), 0,
47079
14
      "Mesh action code(Marvell)", HFILL }},
47080
47081
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_length,
47082
14
     {"Message Length", "wlan.fixed.length",
47083
14
      FT_UINT8, BASE_DEC, NULL, 0,
47084
14
      NULL, HFILL }},
47085
47086
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_mode,
47087
14
     {"Message Mode", "wlan.fixed.mode",
47088
14
      FT_UINT8, BASE_HEX, NULL, 0,
47089
14
      NULL, HFILL }},
47090
47091
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_ttl,
47092
14
     {"Message TTL", "wlan.fixed.ttl",
47093
14
      FT_UINT8, BASE_DEC, NULL, 0,
47094
14
      NULL, HFILL }},
47095
47096
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_dstcount,
47097
14
     {"Destination Count", "wlan.fixed.dstcount",
47098
14
      FT_UINT8, BASE_DEC, NULL, 0,
47099
14
      NULL, HFILL }},
47100
47101
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_hopcount,
47102
14
     {"Hop Count", "wlan.fixed.hopcount",
47103
14
      FT_UINT8, BASE_DEC, NULL, 0,
47104
14
      NULL, HFILL }},
47105
47106
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_rreqid,
47107
14
     {"RREQ ID", "wlan.fixed.rreqid",
47108
14
      FT_UINT32, BASE_DEC, NULL, 0,
47109
14
      NULL, HFILL }},
47110
47111
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_sa,
47112
14
     {"Source Address", "wlan.fixed.sa",
47113
14
      FT_ETHER, BASE_NONE, NULL, 0,
47114
14
      "Source MAC address", HFILL }},
47115
47116
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_ssn,
47117
14
     {"SSN", "wlan.fixed.ssn",
47118
14
      FT_UINT32, BASE_DEC, NULL, 0,
47119
14
      "Source Sequence Number", HFILL }},
47120
47121
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_metric,
47122
14
     {"Metric", "wlan.fixed.metric",
47123
14
      FT_UINT32, BASE_DEC, NULL, 0,
47124
14
      "Route Metric", HFILL }},
47125
47126
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_flags,
47127
14
     {"RREQ Flags", "wlan.fixed.flags",
47128
14
      FT_UINT8, BASE_HEX, NULL, 0,
47129
14
      NULL, HFILL }},
47130
47131
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_da,
47132
14
     {"Destination Address", "wlan.fixed.da",
47133
14
      FT_ETHER, BASE_NONE, NULL, 0,
47134
14
      "Destination MAC address", HFILL }},
47135
47136
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_dsn,
47137
14
     {"DSN", "wlan.fixed.dsn",
47138
14
      FT_UINT32, BASE_DEC, NULL, 0,
47139
14
      "Destination Sequence Number", HFILL }},
47140
47141
14
    {&hf_ieee80211_ff_marvell_mesh_mgt_lifetime,
47142
14
     {"Lifetime", "wlan.fixed.lifetime",
47143
14
      FT_UINT32, BASE_DEC, NULL, 0,
47144
14
      "Route Lifetime", HFILL }},
47145
47146
14
    {&hf_ieee80211_ff_wme_action_code,
47147
14
     {"Action code", "wlan.fixed.action_code",
47148
14
      FT_UINT16, BASE_HEX, VALS(wme_action_codes), 0,
47149
14
      "Management notification action code", HFILL }},
47150
47151
14
    {&hf_ieee80211_ff_wme_status_code,
47152
14
     {"Status code", "wlan.fixed.status_code",
47153
14
      FT_UINT16, BASE_HEX, VALS(wme_status_codes), 0,
47154
14
      "Management notification setup response status code", HFILL }},
47155
47156
14
    {&hf_ieee80211_ff_mesh_action,
47157
14
     {"Mesh Action code", "wlan.fixed.mesh_action",
47158
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &mesh_action_ext, 0,
47159
14
      NULL, HFILL }},
47160
47161
14
    {&hf_ieee80211_ff_multihop_action,
47162
14
     {"Multihop Action code", "wlan.fixed.multihop_action",
47163
14
      FT_UINT8, BASE_HEX, VALS(multihop_action), 0,
47164
14
      NULL, HFILL }},
47165
47166
14
    {&hf_ieee80211_ff_mesh_flags,
47167
14
     {"Mesh Flags", "wlan.fixed.mesh_flags",
47168
14
      FT_UINT8, BASE_HEX, NULL, 0,
47169
14
      NULL, HFILL }},
47170
47171
14
    {&hf_ieee80211_ff_mesh_ttl,
47172
14
     {"Mesh TTL", "wlan.fixed.mesh_ttl",
47173
14
      FT_UINT8, BASE_HEX, NULL, 0,
47174
14
      NULL, HFILL }},
47175
47176
14
    {&hf_ieee80211_ff_mesh_sequence,
47177
14
     {"Sequence Number", "wlan.fixed.mesh_sequence",
47178
14
      FT_UINT32, BASE_HEX, NULL, 0,
47179
14
      NULL, HFILL }},
47180
47181
14
    {&hf_ieee80211_ff_mesh_addr4,
47182
14
     {"Mesh Extended Address 4", "wlan.fixed.mesh_addr4",
47183
14
      FT_ETHER, BASE_NONE, NULL, 0,
47184
14
      NULL, HFILL }},
47185
47186
14
    {&hf_ieee80211_ff_mesh_addr5,
47187
14
     {"Mesh Extended Address 5", "wlan.fixed.mesh_addr5",
47188
14
      FT_ETHER, BASE_NONE, NULL, 0,
47189
14
      NULL, HFILL }},
47190
47191
14
    {&hf_ieee80211_ff_mesh_addr6,
47192
14
     {"Mesh Extended Address 6", "wlan.fixed.mesh_addr6",
47193
14
      FT_ETHER, BASE_NONE, NULL, 0,
47194
14
      NULL, HFILL }},
47195
47196
14
    {&hf_ieee80211_ff_selfprot_action,
47197
14
     {"Self-protected Action code", "wlan.fixed.selfprot_action",
47198
14
      FT_UINT8, BASE_HEX, VALS(selfprot_action), 0,
47199
14
      NULL, HFILL }},
47200
47201
14
    {&hf_ieee80211_mesh_peering_proto,
47202
14
     {"Mesh Peering Protocol ID", "wlan.peering.proto",
47203
14
      FT_UINT16, BASE_HEX, VALS(mesh_peering_proto_ids), 0,
47204
14
      NULL, HFILL }},
47205
47206
14
    {&hf_ieee80211_mesh_peering_local_link_id,
47207
14
     {"Local Link ID", "wlan.peering.local_id",
47208
14
      FT_UINT16, BASE_HEX, NULL, 0,
47209
14
      "Mesh Peering Management Local Link ID", HFILL }},
47210
47211
14
    {&hf_ieee80211_mesh_peering_peer_link_id,
47212
14
     {"Peer Link ID", "wlan.peering.peer_id",
47213
14
      FT_UINT16, BASE_HEX, NULL, 0,
47214
14
      "Mesh Peering Management Peer Link ID", HFILL }},
47215
47216
14
    {&hf_ieee80211_ff_hwmp_flags,
47217
14
     {"HWMP Flags", "wlan.hwmp.flags",
47218
14
      FT_UINT8, BASE_HEX, NULL, 0,
47219
14
      NULL, HFILL }},
47220
47221
14
    {&hf_ieee80211_ff_hwmp_hopcount,
47222
14
     {"HWMP Hop Count", "wlan.hwmp.hopcount",
47223
14
      FT_UINT8, BASE_DEC, NULL, 0,
47224
14
      NULL, HFILL }},
47225
47226
14
    {&hf_ieee80211_ff_hwmp_ttl,
47227
14
     {"HWMP TTL", "wlan.hwmp.ttl",
47228
14
      FT_UINT8, BASE_DEC, NULL, 0,
47229
14
      NULL, HFILL }},
47230
47231
14
    {&hf_ieee80211_ff_hwmp_pdid,
47232
14
     {"HWMP Path Discovery ID", "wlan.hwmp.pdid",
47233
14
      FT_UINT32, BASE_DEC, NULL, 0,
47234
14
      NULL, HFILL }},
47235
47236
14
    {&hf_ieee80211_ff_hwmp_orig_sta,
47237
14
     {"Originator STA Address", "wlan.hwmp.orig_sta",
47238
14
      FT_ETHER, BASE_NONE, NULL, 0,
47239
14
      NULL, HFILL }},
47240
47241
14
    {&hf_ieee80211_ff_hwmp_orig_sn,
47242
14
     {"HWMP Originator Sequence Number", "wlan.hwmp.orig_sn",
47243
14
      FT_UINT32, BASE_DEC, NULL, 0,
47244
14
      NULL, HFILL}},
47245
47246
14
    {&hf_ieee80211_ff_hwmp_orig_ext,
47247
14
     {"Originator External Address", "wlan.hwmp.orig_ext",
47248
14
      FT_ETHER, BASE_NONE, NULL, 0,
47249
14
      NULL, HFILL }},
47250
47251
14
    {&hf_ieee80211_ff_hwmp_lifetime,
47252
14
     {"HWMP Lifetime", "wlan.hwmp.lifetime",
47253
14
      FT_UINT32, BASE_DEC, NULL, 0,
47254
14
      NULL, HFILL }},
47255
47256
14
    {&hf_ieee80211_ff_hwmp_metric,
47257
14
     {"HWMP Metric", "wlan.hwmp.metric",
47258
14
      FT_UINT32, BASE_DEC, NULL, 0,
47259
14
      NULL, HFILL }},
47260
47261
14
    {&hf_ieee80211_ff_hwmp_targ_count,
47262
14
     {"HWMP Target Count", "wlan.hwmp.targ_count",
47263
14
      FT_UINT8, BASE_DEC, NULL, 0,
47264
14
      NULL, HFILL }},
47265
47266
14
    {&hf_ieee80211_ff_hwmp_targ_flags,
47267
14
     {"HWMP Per-Target Flags", "wlan.hwmp.targ_flags",
47268
14
      FT_UINT8, BASE_HEX, NULL, 0,
47269
14
      NULL, HFILL }},
47270
47271
14
    {&hf_ieee80211_ff_hwmp_targ_to_flags,
47272
14
     {"TO Flag", "wlan.hwmp.to_flag",
47273
14
      FT_BOOLEAN, 8, TFS(&hwmp_targ_to_flags), 0x01,
47274
14
      "Target Only Flag", HFILL }},
47275
47276
14
    {&hf_ieee80211_ff_hwmp_targ_usn_flags,
47277
14
     {"USN Flag", "wlan.hwmp.usn_flag",
47278
14
      FT_BOOLEAN, 8, TFS(&hwmp_targ_usn_flags), 0x04,
47279
14
      "Unknown Target HWMP Sequence Number Flag", HFILL }},
47280
47281
14
    {&hf_ieee80211_ff_hwmp_targ_sta,
47282
14
     {"Target STA Address", "wlan.hwmp.targ_sta",
47283
14
      FT_ETHER, BASE_NONE, NULL, 0,
47284
14
      NULL, HFILL }},
47285
47286
14
    {&hf_ieee80211_ff_hwmp_targ_ext,
47287
14
     {"Target External Address", "wlan.hwmp.targ_ext",
47288
14
      FT_ETHER, BASE_NONE, NULL, 0,
47289
14
      NULL, HFILL }},
47290
47291
14
    {&hf_ieee80211_ff_hwmp_targ_sn,
47292
14
     {"Target HWMP Sequence Number", "wlan.hwmp.targ_sn",
47293
14
      FT_UINT32, BASE_DEC, NULL, 0,
47294
14
      NULL, HFILL }},
47295
47296
14
    {&hf_ieee80211_mesh_config_path_sel_protocol,
47297
14
     {"Path Selection Protocol", "wlan.mesh.config.ps_protocol",
47298
14
      FT_UINT8, BASE_HEX, NULL, 0,
47299
14
      "Mesh Configuration Path Selection Protocol", HFILL }},
47300
47301
14
    {&hf_ieee80211_mesh_config_path_sel_metric,
47302
14
     {"Path Selection Metric", "wlan.mesh.config.ps_metric",
47303
14
      FT_UINT8, BASE_HEX, NULL, 0,
47304
14
      "Mesh Configuration Path Selection Metric", HFILL }},
47305
47306
14
    {&hf_ieee80211_mesh_config_congestion_control,
47307
14
     {"Congestion Control", "wlan.mesh.config.cong_ctl",
47308
14
      FT_UINT8, BASE_HEX, NULL, 0,
47309
14
      "Mesh Configuration Congestion Control", HFILL }},
47310
47311
14
    {&hf_ieee80211_mesh_config_sync_method,
47312
14
     {"Synchronization Method", "wlan.mesh.config.sync_method",
47313
14
      FT_UINT8, BASE_HEX, NULL, 0,
47314
14
      "Mesh Configuration Synchronization Method", HFILL }},
47315
47316
14
    {&hf_ieee80211_mesh_config_auth_protocol,
47317
14
     {"Authentication Protocol", "wlan.mesh.config.auth_protocol",
47318
14
      FT_UINT8, BASE_HEX, NULL, 0,
47319
14
      "Mesh Configuration Authentication Protocol", HFILL }},
47320
47321
14
    {&hf_ieee80211_mesh_config_formation_info,
47322
14
     {"Formation Info", "wlan.mesh.config.formation_info",
47323
14
      FT_UINT8, BASE_HEX, NULL, 0,
47324
14
      "Mesh Configuration Formation Info", HFILL }},
47325
47326
14
    {&hf_ieee80211_mesh_form_info_conn_to_mesh_gate,
47327
14
     {"Connected to Mesh Gate", "wlan.mesh.formation_info.connect_to_mesh_gate",
47328
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
47329
14
      NULL, HFILL }},
47330
47331
14
    {&hf_ieee80211_mesh_form_info_num_of_peerings,
47332
14
     {"Number of Peerings", "wlan.mesh.config.formation_info.num_peers",
47333
14
      FT_UINT8, BASE_DEC, NULL, 0x7E,
47334
14
      NULL, HFILL }},
47335
47336
14
    {&hf_ieee80211_mesh_form_info_conn_to_as,
47337
14
     {"Connected to AS", "wlan.mesh.formation_info.connect_to_as",
47338
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
47339
14
      NULL, HFILL }},
47340
47341
14
    {&hf_ieee80211_mesh_config_capability,
47342
14
     {"Capability", "wlan.mesh.config.cap",
47343
14
      FT_UINT8, BASE_HEX, NULL, 0,
47344
14
      "Mesh Configuration Capability", HFILL }},
47345
47346
14
    {&hf_ieee80211_mesh_config_cap_accepting,
47347
14
     {"Accepting Additional Mesh Peerings", "wlan.mesh.config.cap.accept",
47348
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
47349
14
      NULL, HFILL }},
47350
47351
14
    {&hf_ieee80211_mesh_config_cap_mcca_support,
47352
14
     {"MCCA Support", "wlan.mesh.config.cap.mcca_support",
47353
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
47354
14
      NULL, HFILL }},
47355
47356
14
    {&hf_ieee80211_mesh_config_cap_mcca_enabled,
47357
14
     {"MCCA Enabled", "wlan.mesh.config.cap.mcca_enabled",
47358
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
47359
14
      NULL, HFILL }},
47360
47361
14
    {&hf_ieee80211_mesh_config_cap_forwarding,
47362
14
     {"Mesh Forwarding", "wlan.mesh.config.cap.forwarding",
47363
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
47364
14
      NULL, HFILL }},
47365
47366
14
    {&hf_ieee80211_mesh_config_cap_mbca_enabled,
47367
14
     {"MBCA Enabled", "wlan.mesh.config.cap.mbca_enabled",
47368
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
47369
14
      NULL, HFILL }},
47370
47371
14
    {&hf_ieee80211_mesh_config_cap_tbtt_adjusting,
47372
14
     {"TBTT Adjustment", "wlan.mesh.config.cap.tbtt_adjusting",
47373
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
47374
14
      NULL, HFILL }},
47375
47376
14
    {&hf_ieee80211_mesh_config_cap_power_save_level,
47377
14
     {"Power Save", "wlan.mesh.config.cap.power_save_level",
47378
14
      FT_BOOLEAN, 8, TFS(&mesh_config_cap_power_save_level_flags), 0x40,
47379
14
      NULL, HFILL }},
47380
47381
14
    {&hf_ieee80211_mesh_config_cap_reserved,
47382
14
     {"Reserved", "wlan.mesh.config.cap.reserved",
47383
14
      FT_UINT8, BASE_HEX, NULL, 0x80,
47384
14
      NULL, HFILL }},
47385
47386
14
    {&hf_ieee80211_mesh_id,
47387
14
     {"Mesh ID", "wlan.mesh.id",
47388
14
      FT_STRING, BASE_NONE, NULL, 0,
47389
14
      NULL, HFILL }},
47390
47391
14
    {&hf_ieee80211_bcn_timing_rctrl,
47392
14
     {"Report Control", "wlan.bcntime.rctrl",
47393
14
      FT_UINT8, BASE_HEX, NULL, 0,
47394
14
      NULL, HFILL }},
47395
47396
14
    {&hf_ieee80211_bcn_timing_rctrl_more,
47397
14
     {"More Beacon Timing Elements", "wlan.bcntime.rctrl.more",
47398
14
      FT_BOOLEAN, 8, TFS(&tfs_more_nomore), 0x01,
47399
14
      NULL, HFILL }},
47400
47401
14
    {&hf_ieee80211_bcn_timing_rctrl_element_num,
47402
14
     {"Beacon Timing Element Number", "wlan.bcntime.rctrl.elem_num",
47403
14
      FT_UINT8, BASE_HEX, NULL, 0x0E,
47404
14
      NULL, HFILL }},
47405
47406
14
    {&hf_ieee80211_bcn_timing_rctrl_status_num,
47407
14
     {"Status Number", "wlan.bcntime.rctrl.status_num",
47408
14
      FT_UINT8, BASE_HEX, NULL, 0xF0,
47409
14
      NULL, HFILL }},
47410
47411
14
    {&hf_ieee80211_bcn_timing_info,
47412
14
     {"Beacon Timing Info", "wlan.bcntime.info",
47413
14
      FT_NONE, BASE_NONE, NULL, 0,
47414
14
      NULL, HFILL }},
47415
47416
14
    {&hf_ieee80211_bcn_timing_info_nsta_id,
47417
14
     {"Neighbor STA ID", "wlan.bcntime.info.nstaid",
47418
14
      FT_UINT8, BASE_HEX, NULL, 0,
47419
14
      NULL, HFILL }},
47420
47421
14
    {&hf_ieee80211_bcn_timing_info_nsta_tbtt,
47422
14
     {"Neighbor STA TBTT", "wlan.bcntime.info.nstatbtt",
47423
14
      FT_UINT24, BASE_DEC, NULL, 0,
47424
14
      NULL, HFILL }},
47425
47426
14
    {&hf_ieee80211_bcn_timing_info_nsta_bi,
47427
14
     {"Neighbor STA Beacon Interval", "wlan.bcntime.info.nstabi",
47428
14
       FT_UINT16, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
47429
14
      NULL, HFILL }},
47430
47431
14
    {&hf_ieee80211_gann_flags,
47432
14
     {"GANN Flags", "wlan.gann.flags",
47433
14
       FT_UINT8, BASE_HEX, NULL, 0,
47434
14
      NULL, HFILL }},
47435
47436
14
    {&hf_ieee80211_gann_flags_reserved,
47437
14
     {"Reserved", "wlan.gann.flags.reserved",
47438
14
       FT_UINT8, BASE_HEX, NULL, 0xff,
47439
14
      NULL, HFILL }},
47440
47441
14
    {&hf_ieee80211_gann_hop_count,
47442
14
     {"GANN Hop count", "wlan.gann.hop_count",
47443
14
       FT_UINT8, BASE_DEC, NULL, 0,
47444
14
      NULL, HFILL }},
47445
47446
14
    {&hf_ieee80211_gann_elem_ttl,
47447
14
     {"GANN Element TTL", "wlan.gann.elem_ttl",
47448
14
       FT_UINT8, BASE_DEC, NULL, 0,
47449
14
      NULL, HFILL }},
47450
47451
14
    {&hf_ieee80211_gann_mesh_gate_addr,
47452
14
     {"GANN Mesh Gate Address", "wlan.gann.gate_addr",
47453
14
       FT_BYTES, SEP_COLON, NULL, 0,
47454
14
      NULL, HFILL }},
47455
47456
14
    {&hf_ieee80211_gann_seq_num,
47457
14
     {"GANN Sequence Number", "wlan.gann.seq_num",
47458
14
       FT_UINT32, BASE_DEC, NULL, 0,
47459
14
      NULL, HFILL }},
47460
47461
14
    {&hf_ieee80211_gann_interval,
47462
14
     {"GANN Interval", "wlan.gann.interval",
47463
14
       FT_UINT16, BASE_DEC, NULL, 0,
47464
14
      NULL, HFILL }},
47465
47466
14
    {&hf_ieee80211_mesh_mic,
47467
14
     {"Mesh Peering Management MIC", "wlan.mesh.mic",
47468
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
47469
47470
14
    {&hf_ieee80211_mesh_ampe_encrypted_data,
47471
14
     {"Authenticated Mesh Peering Exchange Encrypted Data", "wlan.mesh.ampe.encrypted_data",
47472
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
47473
47474
14
    {&hf_ieee80211_rann_flags,
47475
14
     {"RANN Flags", "wlan.rann.flags",
47476
14
      FT_UINT8, BASE_HEX, NULL, 0,
47477
14
      "Root Announcement Flags", HFILL }},
47478
47479
14
    {&hf_ieee80211_rann_root_sta,
47480
14
     {"Root STA Address", "wlan.rann.root_sta", FT_ETHER, BASE_NONE, NULL, 0,
47481
14
      "Root Mesh STA Address", HFILL }},
47482
47483
14
    {&hf_ieee80211_rann_sn,
47484
14
     {"Root STA Sequence Number", "wlan.rann.rann_sn",
47485
14
      FT_UINT32, BASE_DEC, NULL, 0,
47486
14
      "Root Mesh STA Sequence Number", HFILL }},
47487
47488
14
    {&hf_ieee80211_rann_interval,
47489
14
     {"RANN Interval", "wlan.rann.interval",
47490
14
      FT_UINT32, BASE_DEC, NULL, 0,
47491
14
      "Root Announcement Interval", HFILL }},
47492
47493
14
    {&hf_ieee80211_pxu_pxu_id,
47494
14
     {"PXU ID", "wlan.pxu.pxu_id",
47495
14
      FT_UINT8, BASE_DEC, NULL, 0,
47496
14
      NULL, HFILL }},
47497
47498
14
    {&hf_ieee80211_pxu_pxu_origin_mac,
47499
14
     {"PXU Originator MAC Address", "wlan.pxu.origin_mac",
47500
14
      FT_ETHER, BASE_NONE, NULL, 0,
47501
14
      NULL, HFILL }},
47502
47503
14
    {&hf_ieee80211_pxu_no_proxy_info,
47504
14
     {"Number of Proxy Information", "wlan.pxu.no_proxy_info",
47505
14
      FT_UINT8, BASE_DEC, NULL, 0,
47506
14
      NULL, HFILL }},
47507
47508
14
    {&hf_ieee80211_pxu_proxy_info,
47509
14
     {"Proxy Information", "wlan.pxu.proxy_info",
47510
14
      FT_NONE, BASE_NONE, NULL, 0,
47511
14
      NULL, HFILL }},
47512
47513
14
    {&hf_ieee80211_pxu_proxy_info_flags,
47514
14
     {"Flags", "wlan.pxu.pxu_info.flags",
47515
14
      FT_UINT8, BASE_HEX, NULL, 0,
47516
14
      NULL, HFILL }},
47517
47518
14
    {&hf_ieee80211_pxu_proxy_info_flags_delete,
47519
14
     {"Delete", "wlan.pxu.pxu_info.flags.delete",
47520
14
      FT_BOOLEAN, 8, NULL, 0x01,
47521
14
      NULL, HFILL }},
47522
47523
14
    {&hf_ieee80211_pxu_proxy_info_flags_orig_is_proxy,
47524
14
     {"Originator is Proxy", "wlan.pxu.pxu_info.flags.orig_is_proxy",
47525
14
      FT_BOOLEAN, 8, NULL, 0x02,
47526
14
      NULL, HFILL }},
47527
47528
14
    {&hf_ieee80211_pxu_proxy_info_flags_lifetime,
47529
14
     {"Lifetime", "wlan.pxu.pxu_info.flags.lifetime",
47530
14
      FT_BOOLEAN, 8, NULL, 0x04,
47531
14
      NULL, HFILL }},
47532
47533
14
    {&hf_ieee80211_pxu_proxy_info_flags_reserved,
47534
14
     {"Reserved", "wlan.pxu.pxu_info.flags.reserved",
47535
14
      FT_UINT8, BASE_HEX, NULL, 0xF8,
47536
14
      NULL, HFILL }},
47537
47538
14
    {&hf_ieee80211_pxu_proxy_info_ext_mac,
47539
14
     {"External MAC Address", "wlan.pxu.pxu_info.ext_mac",
47540
14
      FT_ETHER, BASE_NONE, NULL, 0,
47541
14
      NULL, HFILL }},
47542
47543
14
    {&hf_ieee80211_pxu_proxy_info_seq_num,
47544
14
     {"Proxy Information Sequence Number", "wlan.pxu.pxu_info.seq_num",
47545
14
      FT_UINT32, BASE_DEC, NULL, 0,
47546
14
      NULL, HFILL }},
47547
47548
14
    {&hf_ieee80211_pxu_proxy_info_proxy_mac,
47549
14
     {"Proxy MAC Address", "wlan.pxu.pxu_info.proxy_mac",
47550
14
      FT_ETHER, BASE_NONE, NULL, 0,
47551
14
      NULL, HFILL }},
47552
47553
14
    {&hf_ieee80211_pxu_proxy_info_lifetime,
47554
14
     {"Proxy Information Lifetime", "wlan.pxu.pxu_info.lifetime",
47555
14
      FT_UINT32, BASE_DEC, NULL, 0,
47556
14
      NULL, HFILL }},
47557
47558
14
    {&hf_ieee80211_pxuc_pxu_id,
47559
14
     {"PXU ID", "wlan.pxuc.pxu_id",
47560
14
      FT_UINT8, BASE_DEC, NULL, 0,
47561
14
      NULL, HFILL }},
47562
47563
14
    {&hf_ieee80211_pxuc_pxu_recip_mac,
47564
14
     {"PXU Recipient MAC Address", "wlan.pxuc.recip_mac",
47565
14
      FT_BYTES, SEP_COLON, NULL, 0,
47566
14
      NULL, HFILL }},
47567
47568
14
    {&hf_ieee80211_ff_qos_action_code,
47569
14
     {"Action code", "wlan.fixed.action_code",
47570
14
      FT_UINT16, BASE_HEX, VALS(qos_action_codes), 0,
47571
14
      "QoS management action code", HFILL }},
47572
47573
14
    {&hf_ieee80211_ff_ba_action,
47574
14
     {"Action code", "wlan.fixed.action_code",
47575
14
      FT_UINT8, BASE_HEX, VALS(ba_action_codes), 0,
47576
14
      "Block Ack action code", HFILL }},
47577
47578
14
    {&hf_ieee80211_ff_check_beacon,
47579
14
     {"Check Beacon", "wlan.fixed.check_beacon",
47580
14
      FT_UINT8, BASE_DEC, NULL, 0,
47581
14
      "Unprotected WNM Check Beacon", HFILL }},
47582
47583
14
    {&hf_ieee80211_ff_tod,
47584
14
     {"TOD", "wlan.fixed.tod",
47585
14
      FT_UINT32, BASE_DEC, NULL, 0,
47586
14
      "Previous TS of transmit antenna port", HFILL }},
47587
47588
14
    {&hf_ieee80211_ff_toa,
47589
14
     {"TOA", "wlan.fixed.toa",
47590
14
      FT_UINT32, BASE_DEC, NULL, 0,
47591
14
      "Previous TS of receive antenna port", HFILL }},
47592
47593
14
    {&hf_ieee80211_ff_max_tod_err,
47594
14
     {"MAX TOD ERROR", "wlan.fixed.max_tod_err",
47595
14
      FT_UINT8, BASE_DEC, NULL, 0,
47596
14
      "Maximal Error at Previous TS of transmit antenna port", HFILL }},
47597
47598
14
    {&hf_ieee80211_ff_max_toa_err,
47599
14
     {"MAX TOA ERROR", "wlan.fixed.max_toa_err",
47600
14
      FT_UINT8, BASE_DEC, NULL, 0,
47601
14
      "Maximal Error at Previous TS of receive antenna port", HFILL }},
47602
47603
14
    {&hf_ieee80211_ff_dls_action_code,
47604
14
     {"Action code", "wlan.fixed.action_code",
47605
14
      FT_UINT16, BASE_HEX, VALS(dls_action_codes), 0,
47606
14
      "DLS management action code", HFILL }},
47607
47608
14
    {&hf_ieee80211_ff_dst_mac_addr,
47609
14
     {"Destination address", "wlan.fixed.dst_mac_addr",
47610
14
      FT_ETHER, BASE_NONE, NULL, 0,
47611
14
      "Destination MAC address", HFILL }},
47612
47613
14
    {&hf_ieee80211_ff_src_mac_addr,
47614
14
     {"Source address", "wlan.fixed.src_mac_addr",
47615
14
      FT_ETHER, BASE_NONE, NULL, 0,
47616
14
      "Source MAC address", HFILL }},
47617
47618
14
    {&hf_ieee80211_ff_req_ap_addr,
47619
14
     {"RequesterAP address", "wlan.fixed.req_ap_addr",
47620
14
      FT_ETHER, BASE_NONE, NULL, 0,
47621
14
      NULL, HFILL }},
47622
47623
14
    {&hf_ieee80211_ff_res_ap_addr,
47624
14
     {"ResponderAP address", "wlan.fixed.res_ap_addr",
47625
14
      FT_ETHER, BASE_NONE, NULL, 0,
47626
14
      NULL, HFILL }},
47627
47628
14
    {&hf_ieee80211_ff_ft_action_code,
47629
14
     {"Action code", "wlan.fixed.action_code",
47630
14
      FT_UINT8, BASE_DEC, VALS(ft_action_codes), 0,
47631
14
      "Management action code", HFILL }},
47632
47633
14
    {&hf_ieee80211_ff_sta_address,
47634
14
     {"STA Address", "wlan.fixed.sta_address",
47635
14
      FT_ETHER, BASE_NONE, NULL, 0,
47636
14
      NULL, HFILL }},
47637
47638
14
    {&hf_ieee80211_ff_target_ap_address,
47639
14
     {"Target AP Address", "wlan.fixed.target_ap_address",
47640
14
      FT_ETHER, BASE_NONE, NULL, 0,
47641
14
      "Target AP MAC address", HFILL }},
47642
47643
14
    {&hf_ieee80211_ff_gas_comeback_delay,
47644
14
     {"GAS Comeback Delay", "wlan.fixed.gas_comeback_delay",
47645
14
      FT_UINT16, BASE_DEC, NULL, 0,
47646
14
      NULL, HFILL }},
47647
47648
14
    {&hf_ieee80211_ff_gas_fragment_id,
47649
14
     {"GAS Query Response Fragment ID", "wlan.fixed.gas_fragment_id",
47650
14
      FT_UINT8, BASE_DEC, NULL, 0x7f,
47651
14
      NULL, HFILL }},
47652
47653
14
    {&hf_ieee80211_ff_more_gas_fragments,
47654
14
     {"More GAS Fragments", "wlan.fixed.more_gas_fragments",
47655
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
47656
14
      NULL, HFILL }},
47657
47658
14
    {&hf_ieee80211_ff_query_request_length,
47659
14
     {"Query Request Length", "wlan.fixed.query_request_length",
47660
14
      FT_UINT16, BASE_DEC, NULL, 0,
47661
14
      NULL, HFILL }},
47662
47663
14
    {&hf_ieee80211_ff_query_request,
47664
14
     {"Query Request", "wlan.fixed.query_request",
47665
14
      FT_BYTES, BASE_NONE, NULL, 0,
47666
14
      NULL, HFILL }},
47667
47668
14
    {&hf_ieee80211_ff_query_response_length,
47669
14
     {"Query Response Length", "wlan.fixed.query_response_length",
47670
14
      FT_UINT16, BASE_DEC, NULL, 0,
47671
14
      NULL, HFILL }},
47672
47673
14
    {&hf_ieee80211_ff_query_response,
47674
14
     {"Query Response", "wlan.fixed.query_response",
47675
14
      FT_BYTES, BASE_NONE, NULL, 0,
47676
14
      NULL, HFILL }},
47677
47678
14
    {&hf_ieee80211_gas_resp_fragments,
47679
14
     {"GAS Query Response fragments", "wlan.fixed.fragments",
47680
14
      FT_NONE, BASE_NONE, NULL, 0x00,
47681
14
      NULL, HFILL } },
47682
47683
14
    {&hf_ieee80211_gas_resp_fragment,
47684
14
     {"GAS Query Response fragment", "wlan.fixed.fragment",
47685
14
      FT_FRAMENUM, BASE_NONE, NULL, 0x00,
47686
14
      NULL, HFILL } },
47687
47688
14
    {&hf_ieee80211_gas_resp_fragment_overlap,
47689
14
     {"GAS Query Response fragment overlap", "wlan.fixed.fragment.overlap",
47690
14
      FT_BOOLEAN, BASE_NONE, NULL, 0x00,
47691
14
      NULL, HFILL } },
47692
47693
14
    {&hf_ieee80211_gas_resp_fragment_overlap_conflict,
47694
14
     {"GAS Query Response fragment overlapping with conflicting data", "wlan.fixed.fragment.overlap.conflicts",
47695
14
      FT_BOOLEAN, BASE_NONE, NULL, 0x00,
47696
14
      NULL, HFILL } },
47697
47698
14
    {&hf_ieee80211_gas_resp_fragment_multiple_tails,
47699
14
     {"GAS Query Response has multiple tail fragments",  "wlan.fixed.fragment.multiple_tails",
47700
14
      FT_BOOLEAN, BASE_NONE, NULL, 0x00,
47701
14
      NULL, HFILL } },
47702
47703
14
    {&hf_ieee80211_gas_resp_fragment_too_long_fragment,
47704
14
     {"GAS Query Response fragment too long", "wlan.fixed.fragment.too_long_fragment",
47705
14
      FT_BOOLEAN, BASE_NONE, NULL, 0x00,
47706
14
      NULL, HFILL } },
47707
47708
14
    {&hf_ieee80211_gas_resp_fragment_error,
47709
14
     {"GAS Query Response reassembly error", "wlan.fixed.fragment.error",
47710
14
      FT_FRAMENUM, BASE_NONE, NULL, 0x00,
47711
14
      NULL, HFILL } },
47712
47713
14
    {&hf_ieee80211_gas_resp_fragment_count,
47714
14
     {"GAS Query Response fragment count", "wlan.fixed.fragment.count",
47715
14
      FT_UINT32, BASE_DEC, NULL, 0x00,
47716
14
      NULL, HFILL } },
47717
47718
14
    {&hf_ieee80211_gas_resp_reassembled_in,
47719
14
     {"Reassembled in", "wlan.fixed.reassembled.in",
47720
14
      FT_FRAMENUM, BASE_NONE, NULL, 0x00,
47721
14
      NULL, HFILL } },
47722
47723
14
    {&hf_ieee80211_gas_resp_reassembled_length,
47724
14
     {"Reassembled length", "wlan.fixed.reassembled.length",
47725
14
      FT_UINT32, BASE_DEC, NULL, 0x00,
47726
14
      NULL, HFILL } },
47727
47728
14
    {&hf_ieee80211_ff_anqp_info_id,
47729
14
     {"Info ID", "wlan.fixed.anqp.info_id",
47730
14
      FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
47731
14
      "Access Network Query Protocol Info ID", HFILL }},
47732
47733
14
    {&hf_ieee80211_ff_anqp_info_length,
47734
14
     {"Length", "wlan.fixed.anqp.info_length",
47735
14
      FT_UINT16, BASE_DEC, NULL, 0,
47736
14
      "Access Network Query Protocol Length", HFILL }},
47737
47738
14
    {&hf_ieee80211_ff_anqp_info,
47739
14
     {"Information", "wlan.fixed.anqp.info",
47740
14
      FT_BYTES, BASE_NONE, NULL, 0,
47741
14
      "Access Network Query Protocol Information", HFILL }},
47742
47743
14
    {&hf_ieee80211_ff_anqp_query_id,
47744
14
     {"ANQP Query ID", "wlan.fixed.anqp.query_id",
47745
14
      FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
47746
14
      "Access Network Query Protocol Query ID", HFILL }},
47747
47748
14
    {&hf_ieee80211_ff_anqp_capability,
47749
14
     {"ANQP Capability", "wlan.fixed.anqp.capability",
47750
14
      FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
47751
14
      "Access Network Query Protocol Capability", HFILL }},
47752
47753
14
    {&hf_ieee80211_ff_anqp_capability_vlen,
47754
14
     {"Vendor-specific Capability Length", "wlan.fixed.anqp.capability_vlen",
47755
14
      FT_UINT16, BASE_DEC, NULL, 0,
47756
14
      NULL, HFILL }},
47757
47758
14
    {&hf_ieee80211_ff_anqp_capability_vendor,
47759
14
     {"Vendor-specific Capability", "wlan.fixed.anqp.capability_vendor",
47760
14
      FT_BYTES, BASE_NONE, NULL, 0,
47761
14
      NULL, HFILL }},
47762
47763
14
    {&hf_ieee80211_ff_venue_info_group,
47764
14
     {"Venue Group", "wlan.fixed.venue_info.group",
47765
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &venue_group_vals_ext, 0,
47766
14
      NULL, HFILL }},
47767
47768
14
    {&hf_ieee80211_ff_venue_info_type,
47769
14
     {"Venue Type", "wlan.fixed.venue_info.type",
47770
14
      FT_UINT8, BASE_DEC, NULL, 0,
47771
14
      NULL, HFILL }},
47772
47773
14
    {&hf_ieee80211_ff_anqp_venue_length,
47774
14
     {"Venue Name Duple Length", "wlan.fixed.anqp.venue.length",
47775
14
      FT_UINT8, BASE_DEC, NULL, 0,
47776
14
      NULL, HFILL }},
47777
47778
14
    {&hf_ieee80211_ff_anqp_venue_language,
47779
14
     {"Language Code", "wlan.fixed.anqp.venue.language",
47780
14
      FT_STRING, BASE_NONE, NULL, 0,
47781
14
      "Venue Name Language Code", HFILL }},
47782
47783
14
    {&hf_ieee80211_ff_anqp_venue_name,
47784
14
     {"Venue Name", "wlan.fixed.anqp.venue.name",
47785
14
      FT_STRING, BASE_NONE, NULL, 0,
47786
14
      NULL, HFILL }},
47787
47788
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_indicator,
47789
14
     {"Network Authentication Type Indicator", "wlan.fixed.anqp.nw_auth_type.indicator",
47790
14
      FT_UINT8, BASE_DEC, VALS(nw_auth_type_vals), 0,
47791
14
      NULL, HFILL }},
47792
47793
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_url_len,
47794
14
     {"Re-direct URL Length", "wlan.fixed.anqp.nw_auth_type.url_len",
47795
14
      FT_UINT16, BASE_DEC, NULL, 0,
47796
14
      NULL, HFILL }},
47797
47798
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_url,
47799
14
     {"Re-direct URL", "wlan.fixed.anqp.nw_auth_type.url",
47800
14
      FT_STRING, BASE_NONE, NULL, 0,
47801
14
      NULL, HFILL }},
47802
47803
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_indicator,
47804
14
     {"Network Authentication Type w/ Timestamp Indicator",
47805
14
      "wlan.fixed.anqp.nw_auth_type_ts.indicator",
47806
14
      FT_UINT8, BASE_DEC, VALS(nw_auth_type_vals), 0,
47807
14
      NULL, HFILL }},
47808
47809
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_url_len,
47810
14
     {"Re-direct URL Length", "wlan.fixed.anqp.nw_auth_type_ts.url_len",
47811
14
      FT_UINT8, BASE_DEC, NULL, 0,
47812
14
      NULL, HFILL }},
47813
47814
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_url,
47815
14
     {"Re-direct URL", "wlan.fixed.anqp.nw_auth_type_ts.url",
47816
14
      FT_STRING, BASE_NONE, NULL, 0,
47817
14
      NULL, HFILL }},
47818
47819
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_year,
47820
14
     {"Timestamp (Year)", "wlan.fixed.anqp.nw_auth_type_ts.year",
47821
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
47822
14
      NULL, HFILL }},
47823
47824
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_mon,
47825
14
     {"Timestamp (Month)", "wlan.fixed.anqp.nw_auth_type_ts.mon",
47826
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
47827
14
      NULL, HFILL }},
47828
47829
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_day,
47830
14
     {"Timestamp (Day)", "wlan.fixed.anqp.nw_auth_type_ts.day",
47831
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
47832
14
      NULL, HFILL }},
47833
47834
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_hr,
47835
14
     {"Timestamp (Hours)", "wlan.fixed.anqp.nw_auth_type_ts.hr",
47836
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
47837
14
      NULL, HFILL }},
47838
47839
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_min,
47840
14
     {"Timestamp (Minutes)", "wlan.fixed.anqp.nw_auth_type_ts.min",
47841
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
47842
14
      NULL, HFILL }},
47843
47844
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_sec,
47845
14
     {"Timestamp (Seconds)", "wlan.fixed.anqp.nw_auth_type_ts.sec",
47846
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
47847
14
      NULL, HFILL }},
47848
47849
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_msec,
47850
14
     {"Timestamp (Milliseconds)", "wlan.fixed.anqp.nw_auth_type_ts.msec",
47851
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
47852
14
      NULL, HFILL }},
47853
47854
14
    {&hf_ieee80211_ff_anqp_nw_auth_type_ts_rsvd,
47855
14
     {"Timestamp (Reserved)", "wlan.fixed.anqp.nw_auth_type_ts.rsvd",
47856
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
47857
14
      NULL, HFILL }},
47858
47859
14
    {&hf_ieee80211_ff_anqp_roaming_consortium_oi_len,
47860
14
     {"OI Length", "wlan.fixed.anqp.roaming_consortium.oi_len",
47861
14
      FT_UINT8, BASE_DEC, NULL, 0,
47862
14
      "Roaming Consortium OI Length", HFILL }},
47863
47864
14
    {&hf_ieee80211_ff_anqp_roaming_consortium_oi,
47865
14
     {"OI", "wlan.fixed.anqp.roaming_consortium.oi",
47866
14
      FT_BYTES, BASE_NONE, NULL, 0,
47867
14
      "Roaming Consortium OI", HFILL }},
47868
47869
14
    {&hf_ieee80211_ff_anqp_ip_addr_avail_ipv6,
47870
14
     {"IPv6 Address", "wlan.fixed.anqp.ip_addr_availability.ipv6",
47871
14
      FT_UINT8, BASE_DEC, VALS(ip_addr_avail_ipv6_vals), 0x03,
47872
14
      "IP Address Type Availability information for IPv6", HFILL }},
47873
47874
14
    {&hf_ieee80211_ff_anqp_ip_addr_avail_ipv4,
47875
14
     {"IPv4 Address", "wlan.fixed.anqp.ip_addr_availability.ipv4",
47876
14
      FT_UINT8, BASE_DEC, VALS(ip_addr_avail_ipv4_vals), 0xfc,
47877
14
      "IP Address Type Availability information for IPv4", HFILL }},
47878
47879
14
    {&hf_ieee80211_ff_anqp_nai_realm_count,
47880
14
     {"NAI Realm Count", "wlan.fixed.anqp.nai_realm_list.count",
47881
14
      FT_UINT16, BASE_DEC, NULL, 0,
47882
14
      NULL, HFILL }},
47883
47884
14
    {&hf_ieee80211_ff_anqp_nai_field_len,
47885
14
     {"NAI Realm Data Field Length", "wlan.fixed.anqp.nai_realm_list.field_len",
47886
14
      FT_UINT16, BASE_DEC, NULL, 0,
47887
14
      NULL, HFILL }},
47888
47889
14
    {&hf_ieee80211_ff_anqp_nai_realm_encoding,
47890
14
     {"NAI Realm Encoding", "wlan.fixed.anqp_nai_realm_list.encoding",
47891
14
      FT_UINT8, BASE_DEC, VALS(nai_realm_encoding_vals), 0x01,
47892
14
      NULL, HFILL }},
47893
47894
14
    {&hf_ieee80211_ff_anqp_nai_realm_length,
47895
14
     {"NAI Realm Length", "wlan.fixed.anqp_nai_realm_list.realm_length",
47896
14
      FT_UINT8, BASE_DEC, NULL, 0,
47897
14
      NULL, HFILL }},
47898
47899
14
    {&hf_ieee80211_ff_anqp_nai_realm,
47900
14
     {"NAI Realm", "wlan.fixed.anqp_nai_realm_list.realm",
47901
14
      FT_STRING, BASE_NONE, NULL, 0,
47902
14
      NULL, HFILL }},
47903
47904
14
    {&hf_ieee80211_ff_anqp_nai_realm_eap_count,
47905
14
     {"EAP Method Count", "wlan.fixed.anqp_nai_realm_list.eap_method_count",
47906
14
      FT_UINT8, BASE_DEC, NULL, 0,
47907
14
      NULL, HFILL }},
47908
47909
14
    {&hf_ieee80211_ff_anqp_nai_realm_eap_len,
47910
14
     {"EAP Method subfield Length", "wlan.fixed.anqp_nai_realm_list.eap_method_len",
47911
14
      FT_UINT8, BASE_DEC, NULL, 0,
47912
14
      NULL, HFILL }},
47913
47914
14
    {&hf_ieee80211_ff_anqp_nai_realm_eap_method,
47915
14
     {"EAP Method", "wlan.fixed.anqp_nai_realm_list.eap_method",
47916
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &eap_type_vals_ext, 0,
47917
14
      NULL, HFILL }},
47918
47919
14
    {&hf_ieee80211_ff_anqp_nai_realm_auth_param_count,
47920
14
     {"Authentication Parameter Count", "wlan.fixed.anqp_nai_realm_list.auth_param_count",
47921
14
      FT_UINT8, BASE_DEC, NULL, 0,
47922
14
      NULL, HFILL }},
47923
47924
14
    {&hf_ieee80211_ff_anqp_nai_realm_auth_param_id,
47925
14
     {"Authentication Parameter ID", "wlan.fixed.anqp_nai_realm_list.auth_param_id",
47926
14
      FT_UINT8, BASE_DEC, VALS(nai_realm_auth_param_id_vals), 0,
47927
14
      NULL, HFILL }},
47928
47929
14
    {&hf_ieee80211_ff_anqp_nai_realm_auth_param_len,
47930
14
     {"Authentication Parameter Length", "wlan.fixed.anqp_nai_realm_list.auth_param_len",
47931
14
      FT_UINT8, BASE_DEC, NULL, 0,
47932
14
      NULL, HFILL }},
47933
47934
14
    {&hf_ieee80211_ff_anqp_nai_realm_auth_param_value,
47935
14
     {"Authentication Parameter Value", "wlan.fixed.anqp_nai_realm_list.auth_param_value",
47936
14
      FT_BYTES, BASE_NONE, NULL, 0,
47937
14
      NULL, HFILL }},
47938
47939
14
    {&hf_ieee80211_3gpp_gc_gud,
47940
14
     {"GUD", "wlan.fixed.anqp.3gpp_cellular_info.gud",
47941
14
      FT_UINT8, BASE_DEC, NULL, 0,
47942
14
      "Generic container User Data", HFILL }},
47943
47944
14
    {&hf_ieee80211_3gpp_gc_udhl,
47945
14
     {"UDHL", "wlan.fixed.anqp.3gpp_cellular_info.udhl",
47946
14
      FT_UINT8, BASE_DEC, NULL, 0,
47947
14
      "User Data Header Length", HFILL }},
47948
47949
14
    {&hf_ieee80211_3gpp_gc_iei,
47950
14
     {"IEI", "wlan.fixed.anqp.3gpp_cellular_info.iei",
47951
14
      FT_UINT8, BASE_DEC, NULL, 0,
47952
14
      "Information Element Identity", HFILL }},
47953
47954
14
    {&hf_ieee80211_3gpp_gc_plmn_len,
47955
14
     {"PLMN Length", "wlan.fixed.anqp.3gpp_cellular_info.plmn_len",
47956
14
      FT_UINT8, BASE_DEC, NULL, 0,
47957
14
      "Length of PLMN List value contents", HFILL }},
47958
47959
14
    {&hf_ieee80211_3gpp_gc_num_plmns,
47960
14
     {"Number of PLMNs", "wlan.fixed.anqp.3gpp_cellular_info.num_plmns",
47961
14
      FT_UINT8, BASE_DEC, NULL, 0,
47962
14
      NULL, HFILL }},
47963
47964
14
    {&hf_ieee80211_3gpp_gc_plmn,
47965
14
     {"PLMN", "wlan.fixed.anqp.3gpp_cellular_info.plmn_info",
47966
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
47967
47968
14
    {&hf_ieee80211_ff_anqp_domain_name_len,
47969
14
     {"Domain Name Length", "wlan.fixed.anqp.domain_name_list.len",
47970
14
      FT_UINT8, BASE_DEC, NULL, 0,
47971
14
      NULL, HFILL }},
47972
47973
14
    {&hf_ieee80211_ff_anqp_domain_name,
47974
14
     {"Domain Name", "wlan.fixed.anqp.domain_name_list.name",
47975
14
      FT_STRING, BASE_NONE, NULL, 0,
47976
14
      NULL, HFILL }},
47977
47978
14
    {&hf_ieee80211_ff_dls_timeout,
47979
14
     {"DLS timeout", "wlan.fixed.dls_timeout",
47980
14
      FT_UINT16, BASE_HEX, NULL, 0,
47981
14
      "DLS timeout value", HFILL }},
47982
47983
14
    {&hf_ieee80211_ff_sa_query_action_code,
47984
14
     {"Action code", "wlan.fixed.action_code",
47985
14
      FT_UINT8, BASE_DEC, VALS(sa_query_action_codes), 0,
47986
14
      "Management action code", HFILL }},
47987
47988
14
    {&hf_ieee80211_ff_transaction_id,
47989
14
     {"Transaction Id", "wlan.fixed.transaction_id",
47990
14
      FT_UINT16, BASE_HEX, NULL, 0,
47991
14
      NULL, HFILL }},
47992
47993
14
    {&hf_ieee80211_ff_send_confirm,
47994
14
     {"Send-Confirm", "wlan.fixed.send_confirm",
47995
14
      FT_UINT16, BASE_DEC, NULL, 0,
47996
14
      NULL, HFILL }},
47997
47998
14
    {&hf_ieee80211_ff_scalar,
47999
14
     {"Scalar", "wlan.fixed.scalar",
48000
14
      FT_BYTES, BASE_NONE, NULL, 0,
48001
14
      NULL, HFILL }},
48002
48003
14
    {&hf_ieee80211_ff_finite_field_element,
48004
14
     {"Finite Field Element", "wlan.fixed.finite_field_element",
48005
14
      FT_BYTES, BASE_NONE, NULL, 0,
48006
14
      NULL, HFILL }},
48007
48008
14
    {&hf_ieee80211_ff_confirm,
48009
14
     {"Confirm", "wlan.fixed.confirm",
48010
14
      FT_BYTES, BASE_NONE, NULL, 0,
48011
14
      NULL, HFILL }},
48012
48013
14
    {&hf_ieee80211_ff_finite_cyclic_group,
48014
14
     {"Group Id", "wlan.fixed.finite_cyclic_group",
48015
14
      FT_UINT16, BASE_DEC, VALS(ff_finite_cyclic_group_vals), 0,
48016
14
      NULL, HFILL }},
48017
48018
14
    {&hf_ieee80211_ff_sae_message_type,
48019
14
     {"SAE Message Type", "wlan.fixed.sae_message_type",
48020
14
      FT_UINT16, BASE_DEC, VALS(ff_sae_message_type_vals), 0,
48021
14
      NULL, HFILL }},
48022
48023
14
    {&hf_ieee80211_ff_sae_anti_clogging_token,
48024
14
     {"Anti-Clogging Token", "wlan.fixed.anti_clogging_token",
48025
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
48026
48027
14
    {&hf_ieee80211_anqp_wfa_subtype,
48028
14
     {"WFA Subtype", "wlan.anqp.wfa.subtype",
48029
14
      FT_UINT8, BASE_DEC, VALS(wfa_anqp_subtype_vals), 0, NULL, HFILL }},
48030
48031
14
    {&hf_ieee80211_dpp_subtype,
48032
14
     {"DPP Subtype", "wlan.wfa.dpp.subtype",
48033
14
      FT_UINT8, BASE_DEC, VALS(dpp_subtype_vals), 0, NULL, HFILL }},
48034
48035
14
    {&hf_ieee80211_hs20_indication_dgaf_disabled,
48036
14
     {"DGAF Disabled", "wlan.hs20.indication.dgaf_disabled",
48037
14
      FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
48038
48039
14
    {&hf_ieee80211_hs20_indication_pps_mo_id_present,
48040
14
     {"PPS MO ID Present", "wlan.hs20.indication.pps_mo_id_present",
48041
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL }},
48042
48043
14
    {&hf_ieee80211_hs20_indication_anqp_domain_id_present,
48044
14
     {"ANQP Domain ID Present", "wlan.hs20.indication.anqp_domain_id_present",
48045
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL }},
48046
48047
14
    {&hf_ieee80211_hs20_reserved,
48048
14
      { "Reserved", "wlan.hs20.indication.reserved",
48049
14
       FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x08, NULL, HFILL }},
48050
48051
14
    {&hf_ieee80211_hs20_indication_version_number,
48052
14
     {"Version Number", "wlan.hs20.indication.version_number",
48053
14
      FT_UINT8, BASE_DEC, VALS(hs20_indication_version_number_vals), 0xF0, NULL, HFILL }},
48054
48055
14
    {&hf_ieee80211_hs20_indication_pps_mo_id,
48056
14
     {"PPS MO ID", "wlan.hs20.indication.pps_mo_id",
48057
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48058
48059
14
    {&hf_ieee80211_hs20_indication_anqp_domain_id,
48060
14
     {"ANQP Domain ID", "wlan.hs20.indication.domain_id",
48061
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48062
48063
14
    {&hf_ieee80211_hs20_anqp_subtype,
48064
14
     {"Subtype", "wlan.hs20.anqp.subtype",
48065
14
      FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
48066
14
      "Hotspot 2.0 ANQP Subtype", HFILL }},
48067
48068
14
    {&hf_ieee80211_hs20_anqp_reserved,
48069
14
     {"Reserved", "wlan.hs20.anqp.reserved",
48070
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48071
48072
14
    {&hf_ieee80211_hs20_anqp_payload,
48073
14
     {"Payload", "wlan.hs20.anqp.payload",
48074
14
      FT_BYTES, BASE_NONE, NULL, 0,
48075
14
      "Hotspot 2.0 ANQP Payload", HFILL }},
48076
48077
14
    {&hf_ieee80211_hs20_anqp_hs_query_list,
48078
14
     {"Queried Subtype", "wlan.hs20.anqp.hs_query_list",
48079
14
      FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
48080
14
      "Queried HS 2.0 Element Subtype", HFILL }},
48081
48082
14
    {&hf_ieee80211_hs20_anqp_hs_capability_list,
48083
14
     {"Capability", "wlan.hs20.anqp.hs_capability_list",
48084
14
      FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
48085
14
      "Hotspot 2.0 ANQP Subtype Capability", HFILL }},
48086
48087
14
    {&hf_ieee80211_hs20_anqp_ofn_length,
48088
14
     {"Length", "wlan.hs20.anqp.ofn.length",
48089
14
      FT_UINT8, BASE_DEC, NULL, 0,
48090
14
      "Operator Friendly Name Length", HFILL }},
48091
48092
14
    {&hf_ieee80211_hs20_anqp_ofn_language,
48093
14
     {"Language Code", "wlan.hs20.anqp.ofn.language",
48094
14
      FT_STRING, BASE_NONE, NULL, 0,
48095
14
      "Operator Friendly Name Language Code", HFILL }},
48096
48097
14
    {&hf_ieee80211_hs20_anqp_ofn_name,
48098
14
     {"Operator Friendly Name", "wlan.hs20.anqp.ofn.name",
48099
14
      FT_STRING, BASE_NONE, NULL, 0,
48100
14
      NULL, HFILL }},
48101
48102
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_link_status,
48103
14
     {"Link Status", "wlan.hs20.anqp.wan_metrics.link_status",
48104
14
      FT_UINT8, BASE_DEC, VALS(hs20_wm_link_status_vals), 0x03, NULL, HFILL }},
48105
48106
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_symmetric_link,
48107
14
     {"Symmetric Link", "wlan.hs20.anqp.wan_metrics.symmetric_link",
48108
14
      FT_UINT8, BASE_DEC, NULL, 0x04, NULL, HFILL }},
48109
48110
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_at_capacity,
48111
14
     {"At Capacity", "wlan.hs20.anqp.wan_metrics.at_capacity",
48112
14
      FT_UINT8, BASE_DEC, NULL, 0x08, NULL, HFILL }},
48113
48114
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_reserved,
48115
14
     {"Reserved", "wlan.hs20.anqp.wan_metrics.reserved",
48116
14
      FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL }},
48117
48118
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_downlink_speed,
48119
14
     {"Downlink Speed", "wlan.hs20.anqp.wan_metrics.downlink_speed",
48120
14
      FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
48121
48122
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_uplink_speed,
48123
14
     {"Uplink Speed", "wlan.hs20.anqp.wan_metrics.uplink_speed",
48124
14
      FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
48125
48126
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_downlink_load,
48127
14
     {"Downlink Load", "wlan.hs20.anqp.wan_metrics.downlink_load",
48128
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48129
48130
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_uplink_load,
48131
14
     {"Uplink Load", "wlan.hs20.anqp.wan_metrics.uplink_load",
48132
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48133
48134
14
    {&hf_ieee80211_hs20_anqp_wan_metrics_lmd,
48135
14
     {"LMD", "wlan.hs20.anqp.wan_metrics.lmd",
48136
14
      FT_UINT16, BASE_DEC, NULL, 0, "Load Measurement Duration", HFILL }},
48137
48138
14
    {&hf_ieee80211_hs20_anqp_cc_proto_ip_proto,
48139
14
     {"IP Protocol", "wlan.hs20.anqp.cc.ip_proto",
48140
14
      FT_UINT8, BASE_DEC, VALS(hs20_cc_proto_vals), 0,
48141
14
      "ProtoPort Tuple - IP Protocol", HFILL }},
48142
48143
14
    {&hf_ieee80211_hs20_anqp_cc_proto_port_num,
48144
14
     {"Port Number", "wlan.hs20.anqp.cc.port_num",
48145
14
      FT_UINT16, BASE_DEC, VALS(hs20_cc_port_vals), 0,
48146
14
      "ProtoPort Tuple - Port Number", HFILL }},
48147
48148
14
    {&hf_ieee80211_hs20_anqp_cc_proto_status,
48149
14
     {"Status", "wlan.hs20.anqp.cc.status",
48150
14
      FT_UINT8, BASE_DEC, VALS(hs20_cc_status_vals), 0,
48151
14
      "ProtoPort Tuple - Status", HFILL }},
48152
48153
14
    {&hf_ieee80211_hs20_anqp_nai_hrq_count,
48154
14
     {"NAI Home Realm Count", "wlan.hs20.anqp.nai_hrq.count",
48155
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48156
48157
14
    {&hf_ieee80211_hs20_anqp_nai_hrq_encoding_type,
48158
14
     {"NAI Home Realm Encoding Type",
48159
14
      "wlan.hs20.anqp.nai_hrq.encoding_type",
48160
14
      FT_UINT8, BASE_DEC, VALS(nai_realm_encoding_vals),
48161
14
      0x01, NULL, HFILL }},
48162
48163
14
    {&hf_ieee80211_hs20_anqp_nai_hrq_length,
48164
14
     {"NAI Home Realm Name Length", "wlan.hs20.anqp.nai_hrq.length",
48165
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48166
48167
14
    {&hf_ieee80211_hs20_anqp_nai_hrq_realm_name,
48168
14
     {"NAI Home Realm Name", "wlan.hs20.anqp.nai_hrq.name",
48169
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48170
48171
14
    {&hf_ieee80211_hs20_anqp_oper_class_indic,
48172
14
     {"Operating Class", "wlan.hs20.anqp.oper_class_indic.oper_class",
48173
14
      FT_UINT8, BASE_DEC | BASE_RANGE_STRING, RVALS(oper_class_rvals),
48174
14
      0, NULL, HFILL }},
48175
48176
14
    {&hf_ieee80211_hs20_osu_friendly_names_len,
48177
14
     {"OSU Friendly Name Length", "wlan.hs20.osu_friendly_names_len",
48178
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48179
48180
14
    {&hf_ieee80211_hs20_osu_friendly_name_length,
48181
14
     {"Length", "wlan.hs20.osu_friendly_name.len",
48182
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48183
48184
14
    {&hf_ieee80211_hs20_osu_friendly_name_language,
48185
14
     {"Language Code", "wlan.hs20.osu_friendly_name.language",
48186
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48187
48188
14
    {&hf_ieee80211_hs20_osu_friendly_name_name,
48189
14
     {"OSU Friendly Name", "wlan.hs20.osu_friendly_name.name",
48190
14
     FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48191
48192
14
    {&hf_ieee80211_hs20_osu_server_uri_len,
48193
14
     {"OSU Server URI Length", "wlan.hs20.osu_server_uri_len",
48194
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48195
48196
14
    {&hf_ieee80211_hs20_osu_server_uri,
48197
14
     {"OSU Server URI", "wlan.hs20.osu_server_uri",
48198
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48199
48200
14
    {&hf_ieee80211_hs20_osu_method_list_len,
48201
14
     {"OSU Method List Length", "wlan.hs20.osu_method_list_len",
48202
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48203
48204
14
    {&hf_ieee80211_hs20_osu_method_val,
48205
14
     {"OSU Method", "wlan.hs20.osu_method_list.method",
48206
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48207
48208
14
    {&hf_ieee80211_hs20_icons_avail_len,
48209
14
     {"Icons Available Length", "wlan.hs20.osu_icons_avail_len",
48210
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48211
48212
14
    {&hf_ieee80211_hs20_osu_providers_list_ssid_len,
48213
14
     {"SSID Length", "wlan.hs20.anqp_osu_prov_list.ssid_len",
48214
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48215
48216
14
    {&hf_ieee80211_hs20_osu_providers_ssid,
48217
14
     {"SSID", "wlan.hs20.anqp_osu_prov_list.ssid",
48218
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48219
48220
14
    {&hf_ieee80211_hs20_osu_providers_count,
48221
14
     {"Number of OSU Providers", "wlan.hs20.anqp_osu_prov_list.number",
48222
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48223
48224
14
    {&hf_ieee80211_hs20_osu_prov_length,
48225
14
     {"OSU Provider Length", "wlan.hs20.anqp_osu_prov.len",
48226
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48227
48228
14
    {&hf_ieee80211_hs20_icon_request_filename,
48229
14
     {"Icon Filename", "wlan.hs20.anqp_icon_request.icon_filename",
48230
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48231
48232
14
    {&hf_ieee80211_osu_icon_avail_width,
48233
14
     {"Icon Width", "wlan.hs20.osu_icons_avail.icon_width",
48234
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48235
48236
14
    {&hf_ieee80211_osu_icon_avail_height,
48237
14
     {"Icon Height", "wlan.hs20.osu_icons_avail.icon_height",
48238
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48239
48240
14
    {&hf_ieee80211_osu_icon_avail_lang_code,
48241
14
     {"Language Code", "wlan.hs20.osu_icons_avail.lang_code",
48242
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48243
48244
14
    {&hf_ieee80211_osu_icon_avail_icon_type_len,
48245
14
     {"Icon Type Length", "wlan.hs20.osu_icons_avail.icon_type_len",
48246
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48247
48248
14
    {&hf_ieee80211_osu_icon_avail_icon_type,
48249
14
     {"Icon Type", "wlan.hs20.osu_icons_avail.icon_type",
48250
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48251
48252
14
    {&hf_ieee80211_osu_icon_avail_filename_len,
48253
14
     {"Icon Filename Length", "wlan.hs20.osu_icons_avail.icon_filename_len",
48254
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48255
48256
14
    {&hf_ieee80211_osu_icon_avail_filename,
48257
14
     {"Icon Filename", "wlan.hs20.osu_icons_avail.icon_filename",
48258
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48259
48260
14
    {&hf_ieee80211_hs20_osu_nai_len,
48261
14
     {"OSU_NAI Length", "wlan.hs20.osu_nai.len",
48262
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48263
48264
14
    {&hf_ieee80211_hs20_osu_nai,
48265
14
     {"OSU_NAI", "wlan.hs20.osu_nai",
48266
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48267
48268
14
    {&hf_ieee80211_hs20_osu_service_desc_len,
48269
14
     {"OSU Service Description Length", "wlan.hs20.osu_service_desc_len",
48270
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48271
48272
14
    {&hf_ieee80211_hs20_osu_service_desc_duple_len,
48273
14
     {"Length", "wlan.hs20.osu_service_desc.duple.len",
48274
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48275
48276
14
    {&hf_ieee80211_hs20_osu_service_desc_lang,
48277
14
     {"Language Code", "wlan.hs20.osu_service_desc.duple.lang",
48278
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48279
48280
14
    {&hf_ieee80211_hs20_osu_service_desc,
48281
14
     {"OSU Service Description", "wlan.hs20.osu_service_desc.duple.desc",
48282
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48283
48284
14
    {&hf_ieee80211_hs20_icon_binary_file_status,
48285
14
     {"Download Status Code", "wlan.hs20.anqp_icon_request.download_status",
48286
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48287
48288
14
    {&hf_ieee80211_hs20_icon_type_length,
48289
14
     {"Icon Type Length", "wlan.hs20.anqp_icon_request.icon_type_len",
48290
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48291
48292
14
    {&hf_ieee80211_hs20_icon_type,
48293
14
     {"Icon Type", "wlan.hs20.anqp_icon_request.icon_type",
48294
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48295
48296
14
    {&hf_ieee80211_hs20_icon_binary_data_len,
48297
14
     {"Icon Binary Data Length", "wlan.anqp_icon_request.icon_binary_data_len",
48298
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48299
48300
14
    {&hf_ieee80211_hs20_icon_binary_data,
48301
14
     {"Icon Binary Data", "wlan.h220.anqp_icon_request.icon_binary_data",
48302
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
48303
48304
14
    {&hf_ieee80211_hs20_subscription_remediation_url_len,
48305
14
     {"Server URL Length", "wlan.hs20.subs_remediation.server_url_len",
48306
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48307
48308
14
    {&hf_ieee80211_hs20_subscription_remediation_server_url,
48309
14
     {"Server URL", "wlan.hs20.subs_remediation.server_url",
48310
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48311
48312
14
    {&hf_ieee80211_hs20_subscription_remediation_server_method,
48313
14
     {"Server Method", "wlan.hs20.subs_remediation.server_method",
48314
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48315
48316
14
    {&hf_ieee80211_hs20_deauth_reason_code,
48317
14
     {"De-Auth Reason Code", "wlan.hs20.deauth.reason_code",
48318
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48319
48320
14
    {&hf_ieee80211_hs20_reauth_delay,
48321
14
     {"Re-Auth Delay", "wlan.hs20.deauth.reauth_delay",
48322
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0, NULL, HFILL }},
48323
48324
14
    {&hf_ieee80211_hs20_deauth_reason_url_len,
48325
14
     {"Reason URL Length", "wlan.hs20.deauth.reason_url_len",
48326
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48327
48328
14
    {&hf_ieee80211_hs20_deauth_imminent_reason_url,
48329
14
     {"Reason URL", "wlan.hs20.deauth.reason_url",
48330
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48331
48332
14
    {&hf_ieee80211_hs20_anqp_venue_url_length,
48333
14
     {"Length", "wlan.hs20.venue_url.len",
48334
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48335
48336
14
    {&hf_ieee80211_hs20_anqp_venue_number,
48337
14
     {"Venue number", "wlan.hs20.venue_url.venue_num",
48338
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48339
48340
14
    {&hf_ieee80211_hs20_anqp_venue_url,
48341
14
     {"Venue URL", "wlan.hs20.venue_url.url",
48342
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48343
48344
14
    {&hf_ieee80211_hs20_anqp_advice_of_charge_length,
48345
14
     {"Length", "wlan.hs20.advice_of_charge.len",
48346
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48347
48348
14
    {&hf_ieee80211_hs20_anqp_advice_of_charge_type,
48349
14
     {"Advice of Charge Type", "wlan.hs20.advice_of_charge.type",
48350
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48351
48352
14
    {&hf_ieee80211_hs20_anqp_aoc_nai_realm_encoding,
48353
14
     {"NAI Realm Encoding", "wlan.hs20.advice_of_charge.nai_realm_enc",
48354
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
48355
48356
14
    {&hf_ieee80211_hs20_anqp_aoc_nai_realm_len,
48357
14
     {"NAI Realm Length", "wlan.hs20.advice_of_charge.nai_realm_len",
48358
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48359
48360
14
    {&hf_ieee80211_hs20_anqp_aoc_nai_realm,
48361
14
     {"NAI Realm", "wlan.hs20.advice_of_charge.nai_realm",
48362
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48363
48364
14
    {&hf_ieee80211_hs20_anqp_aoc_plan_len,
48365
14
     {"Plan length", "wlan.hs20.advice_of_charge.plan_info_tuples.plan_len",
48366
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48367
48368
14
    {&hf_ieee80211_hs20_anqp_aoc_plan_lang,
48369
14
     {"Plan language", "wlan.hs20.advice_of_charge.plan_info_tuples.plan_lang",
48370
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48371
48372
14
    {&hf_ieee80211_hs20_anqp_aoc_plan_curcy,
48373
14
     {"Plan currency", "wlan.hs20.advice_of_charge.plan_info_tuples.plan_curcy",
48374
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48375
48376
14
    {&hf_ieee80211_hs20_anqp_aoc_plan_information,
48377
14
     {"Plan information", "wlan.hs20.advice_of_charge.plan_info_tuples.info",
48378
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
48379
48380
14
    {&hf_ieee80211_tag,
48381
14
     {"Tag", "wlan.tag",
48382
14
      FT_NONE, BASE_NONE, NULL, 0,
48383
14
      NULL, HFILL }},
48384
48385
14
    {&hf_ieee80211_tag_number,
48386
14
     {"Tag Number", "wlan.tag.number",
48387
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
48388
14
      "Element ID", HFILL }},
48389
48390
14
    {&hf_ieee80211_tag_length,
48391
14
     {"Tag length", "wlan.tag.length",
48392
14
      FT_UINT32, BASE_DEC, NULL, 0,
48393
14
      "Length of tag", HFILL }},
48394
48395
14
    {&hf_ieee80211_tag_data,
48396
14
     {"Tag Data", "wlan.tag.data",
48397
14
      FT_BYTES, BASE_NONE, NULL, 0,
48398
14
      "Data Interpretation of tag", HFILL }},
48399
48400
14
    {&hf_ieee80211_tag_oui,
48401
14
     {"OUI", "wlan.tag.oui",
48402
14
      FT_UINT24, BASE_OUI, NULL, 0,
48403
14
      "OUI of vendor specific IE", HFILL }},
48404
48405
14
    {&hf_ieee80211_tag_oui_wfa_subtype,
48406
14
     {"WFA Subtype", "wlan.tag.oui.wfa_subtype",
48407
14
      FT_UINT8, BASE_DEC, VALS(wfa_subtype_vals), 0,
48408
14
      NULL, HFILL }},
48409
48410
14
    {&hf_ieee80211_tag_ds_param_channel,
48411
14
     {"Current Channel", "wlan.ds.current_channel",
48412
14
      FT_UINT8, BASE_DEC, NULL, 0,
48413
14
      "DS Parameter Set - Current Channel", HFILL }},
48414
48415
14
    {&hf_ieee80211_tag_cfp_count,
48416
14
     {"CFP Count", "wlan.cfp.count",
48417
14
      FT_UINT8, BASE_DEC, NULL, 0,
48418
14
      "Indicates how many delivery traffic indication messages (DTIMs)", HFILL }},
48419
48420
14
    {&hf_ieee80211_tag_cfp_period,
48421
14
     {"CFP Period", "wlan.cfp.period",
48422
14
      FT_UINT8, BASE_DEC, NULL, 0,
48423
14
      "Indicates the number of DTIM intervals between the start of CFPs", HFILL }},
48424
48425
14
    {&hf_ieee80211_tag_cfp_max_duration,
48426
14
     {"CFP Max Duration", "wlan.cfp.max_duration",
48427
14
      FT_UINT16, BASE_DEC, NULL, 0,
48428
14
      "Indicates the maximum duration (in TU) of the CFP that may be generated by this PCF", HFILL }},
48429
48430
14
    {&hf_ieee80211_tag_cfp_dur_remaining,
48431
14
     {"CFP Dur Remaining", "wlan.cfp.dur_remaining",
48432
14
      FT_UINT16, BASE_DEC, NULL, 0,
48433
14
      "Indicates the maximum time (in TU) remaining in the present CFP", HFILL }},
48434
48435
14
    {&hf_ieee80211_tag_vendor_oui_type,
48436
14
     {"Vendor Specific OUI Type", "wlan.tag.vendor.oui.type",
48437
14
      FT_UINT8, BASE_DEC, NULL, 0,
48438
14
      NULL, HFILL }},
48439
48440
14
    {&hf_ieee80211_tag_vendor_data,
48441
14
     {"Vendor Specific Data", "wlan.tag.vendor.data",
48442
14
      FT_BYTES, BASE_NONE, NULL, 0,
48443
14
      "Unknown/undecoded Vendor Specific Data", HFILL }},
48444
48445
14
    {&hf_ieee80211_symbp_extreme_assoc_clients,
48446
14
     {"Associated clients", "wlan.tag.symbol_proprietary.extreme.assoc_clients",
48447
14
      FT_UINT16, BASE_DEC, NULL, 0,
48448
14
      NULL, HFILL }},
48449
48450
14
    {&hf_ieee80211_symbp_extreme_load_kbps,
48451
14
     {"Load", "wlan.tag.symbol_proprietary.extreme.load_kbps",
48452
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_kbps), 0,
48453
14
      NULL, HFILL }},
48454
48455
14
    {&hf_ieee80211_symbp_extreme_load_pps,
48456
14
     {"Load", "wlan.tag.symbol_proprietary.extreme.load_pps",
48457
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_pkts_per_sec), 0,
48458
14
      NULL, HFILL }},
48459
48460
14
    {&hf_ieee80211_symbp_extreme_client_tx_power,
48461
14
     {"Desired client Tx power", "wlan.tag.symbol_proprietary.extreme.client_txpower",
48462
14
      FT_UINT16, BASE_DEC, NULL, 0,
48463
14
      NULL, HFILL }},
48464
48465
14
    {&hf_ieee80211_symbp_extreme_timestamp,
48466
14
     {"Timestamp", "wlan.tag.symbol_proprietary.extreme.timestamp",
48467
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
48468
14
      NULL, HFILL }},
48469
48470
14
    {&hf_ieee80211_tag_symbol_proprietary_oui,
48471
14
     {"Symbol Proprietary OUI", "wlan.tag.symbol_proprietary.oui",
48472
14
      FT_UINT24, BASE_OUI, NULL, 0,
48473
14
      NULL, HFILL }},
48474
48475
14
    {&hf_ieee80211_tag_symbol_proprietary_data,
48476
14
     {"Symbol Proprietary Data", "wlan.tag.symbol_proprietary.data",
48477
14
      FT_BYTES, BASE_NONE, NULL, 0,
48478
14
      "Unknown/undecoded Symbol Proprietary Data", HFILL }},
48479
48480
14
    {&hf_ieee80211_tim_dtim_count,
48481
14
     {"DTIM count", "wlan.tim.dtim_count",
48482
14
      FT_UINT8, BASE_DEC, NULL, 0,
48483
14
      "Indicates how many Beacon frames (including the current frame) appear before the next DTIM", HFILL }},
48484
48485
14
    {&hf_ieee80211_tim_dtim_period,
48486
14
     {"DTIM period", "wlan.tim.dtim_period",
48487
14
      FT_UINT8, BASE_DEC, NULL, 0,
48488
14
      "Indicates the number of beacon intervals between successive DTIMs", HFILL }},
48489
48490
14
    {&hf_ieee80211_tim_bmapctl,
48491
14
     {"Bitmap control", "wlan.tim.bmapctl",
48492
14
      FT_UINT8, BASE_HEX, NULL, 0,
48493
14
      NULL, HFILL }},
48494
48495
14
    {&hf_ieee80211_tim_bmapctl_mcast,
48496
14
     {"Multicast", "wlan.tim.bmapctl.multicast",
48497
14
      FT_BOOLEAN, 8, NULL, 0x1,
48498
14
      "Contains the Traffic Indicator bit associated with Association ID 0", HFILL }},
48499
48500
14
    {&hf_ieee80211_tim_bmapctl_offset,
48501
14
     {"Bitmap Offset", "wlan.tim.bmapctl.offset",
48502
14
      FT_UINT8, BASE_HEX, NULL, 0xFE,
48503
14
      NULL, HFILL }},
48504
48505
14
    {&hf_ieee80211_tim_partial_virtual_bitmap,
48506
14
     {"Partial Virtual Bitmap", "wlan.tim.partial_virtual_bitmap",
48507
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
48508
14
      NULL, HFILL }},
48509
48510
14
    {&hf_ieee80211_tim_aid,
48511
14
     {"Association ID", "wlan.tim.aid",
48512
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
48513
14
      NULL, HFILL }},
48514
48515
14
    {&hf_ieee80211_tag_ibss_atim_window,
48516
14
     {"Atim Windows", "wlan.ibss.atim_windows",
48517
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
48518
14
      "Contains the ATIM Window length in TU", HFILL }},
48519
48520
14
    {&hf_ieee80211_tag_country_info_code,
48521
14
     {"Code", "wlan.country_info.code",
48522
14
      FT_STRING, BASE_NONE, NULL, 0x0,
48523
14
      NULL, HFILL }},
48524
48525
14
    {&hf_ieee80211_tag_country_info_env,
48526
14
     {"Environment", "wlan.country_info.environment",
48527
14
      FT_UINT8, BASE_DEC|BASE_SPECIAL_VALS, VALS(environment_vals), 0x0,
48528
14
      NULL, HFILL }},
48529
48530
14
    {&hf_ieee80211_tag_country_info_pad,
48531
14
     {"Padding", "wlan.country_info.padding",
48532
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
48533
14
      NULL, HFILL }},
48534
48535
14
    {&hf_ieee80211_tag_country_info_fnm,
48536
14
     {"Country Info", "wlan.country_info.fnm",
48537
14
      FT_NONE, BASE_NONE, NULL, 0x0,
48538
14
      NULL, HFILL }},
48539
48540
14
    {&hf_ieee80211_tag_country_info_fnm_fcn,
48541
14
     {"First Channel Number", "wlan.country_info.fnm.fcn",
48542
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48543
14
      NULL, HFILL }},
48544
48545
14
    {&hf_ieee80211_tag_country_info_fnm_nc,
48546
14
     {"Number of Channels", "wlan.country_info.fnm.nc",
48547
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48548
14
      NULL, HFILL }},
48549
48550
14
    {&hf_ieee80211_tag_country_info_fnm_mtpl,
48551
14
     {"Maximum Transmit Power Level", "wlan.country_info.fnm.mtpl",
48552
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
48553
14
      NULL, HFILL }},
48554
48555
14
    {&hf_ieee80211_tag_country_info_rrc,
48556
14
     {"Country Info", "wlan.country_info.rrc",
48557
14
      FT_NONE, BASE_NONE, NULL, 0x0,
48558
14
      NULL, HFILL }},
48559
48560
14
    {&hf_ieee80211_tag_country_info_rrc_oei,
48561
14
     {"Operating Extension Identifier", "wlan.country_info.rrc.oei",
48562
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48563
14
      NULL, HFILL }},
48564
48565
14
    {&hf_ieee80211_tag_country_info_rrc_oc,
48566
14
     {"Operating Class", "wlan.country_info.rrc.oc",
48567
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48568
14
      NULL, HFILL }},
48569
48570
14
    {&hf_ieee80211_tag_country_info_rrc_cc,
48571
14
     {"Coverage Class", "wlan.country_info.rrc.cc",
48572
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48573
14
      NULL, HFILL }},
48574
48575
14
    {&hf_ieee80211_tag_fh_hopping_parameter_prime_radix,
48576
14
     {"Prime Radix", "wlan.fh_hopping.parameter.prime_radix",
48577
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48578
14
      NULL, HFILL }},
48579
48580
14
    {&hf_ieee80211_tag_fh_hopping_parameter_nb_channels,
48581
14
     {"Number of Channels", "wlan.fh_hopping.parameter.nb_channels",
48582
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48583
14
      NULL, HFILL }},
48584
48585
14
    {&hf_ieee80211_tag_fh_hopping_table_flag,
48586
14
     {"Flag", "wlan.fh_hopping.table.flag",
48587
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
48588
14
      "Indicates that a Random Table is present when the value is 1", HFILL }},
48589
48590
14
    {&hf_ieee80211_tag_fh_hopping_table_number_of_sets,
48591
14
     {"Number of Sets", "wlan.fh_hopping.table.number_of_sets",
48592
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
48593
14
      "Indicates the total number of sets within the hopping patterns", HFILL }},
48594
48595
14
    {&hf_ieee80211_tag_fh_hopping_table_modulus,
48596
14
     {"Modulus", "wlan.fh_hopping.table.modulus",
48597
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
48598
14
      "Indicate the values to be used in the equations to create a hopping sequence from the Random Table information", HFILL }},
48599
48600
14
    {&hf_ieee80211_tag_fh_hopping_table_offset,
48601
14
     {"Offset", "wlan.fh_hopping.table.offset",
48602
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
48603
14
      "Indicate the values to be used in the equations to create a hopping sequence from the Random Table information", HFILL }},
48604
48605
14
    {&hf_ieee80211_tag_fh_hopping_random_table,
48606
14
     {"Random Table", "wlan.fh_hopping.table.random_table",
48607
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
48608
14
      "It is a vector of single octet values that indicate the random sequence to be followed during a hopping sequence", HFILL }},
48609
48610
14
    {&hf_ieee80211_tag_request,
48611
14
     {"Requested Element ID", "wlan.tag.request",
48612
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
48613
14
      "The list of elements that are to be included in the responding STA Probe Response frame", HFILL }},
48614
48615
14
    {&hf_ieee80211_tag_extended_request_id,
48616
14
     {"Requested Element ID", "wlan.tag.extended_request.id",
48617
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
48618
14
      "The Element ID used to indicate an extended element", HFILL }},
48619
48620
14
    {&hf_ieee80211_tag_extended_request_extension,
48621
14
     {"Requested Element ID Extensions", "wlan.tag.extended_request.ext",
48622
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_eid_ext_ext, 0,
48623
14
      "The list of elements extensions that are to be included in the responding STA Probe Response frame", HFILL }},
48624
48625
14
    {&hf_ieee80211_tclas_up,
48626
14
     {"User Priority", "wlan.tclas.user_priority",
48627
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(user_prio_rvals), 0,
48628
14
      "Contains the value of the UP of the associated MSDUs", HFILL }},
48629
48630
14
    {&hf_ieee80211_tclas_class_type,
48631
14
     {"Classifier Type", "wlan.tclas.class_type",
48632
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(classifier_type), 0,
48633
14
      "Specifies the type of classifier parameters", HFILL }},
48634
48635
14
    {&hf_ieee80211_tclas_class_mask,
48636
14
     {"Classifier Mask", "wlan.tclas.class_mask",
48637
14
      FT_UINT8, BASE_HEX,  NULL, 0,
48638
14
      "Specifies a bitmap where bits that are set to 1 identify a subset of the classifier parameters", HFILL }},
48639
48640
14
    {&hf_ieee80211_tclas_mask_reserved,
48641
14
     {"Reserved", "wlan.tclas.class_mask.reserved",
48642
14
      FT_UINT8, BASE_HEX, NULL, 0, "Class mask is reserved", HFILL }},
48643
48644
14
    {&hf_ieee80211_tclas_class_mask0_src_addr,
48645
14
     {"Source Address", "wlan.tclas.class_mask.src_addr",
48646
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
48647
48648
14
    {&hf_ieee80211_tclas_class_mask0_dst_addr,
48649
14
     {"Destination Address", "wlan.tclas.class_mask.dst_addr",
48650
14
      FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
48651
48652
14
    {&hf_ieee80211_tclas_class_mask0_type,
48653
14
     {"Type", "wlan.tclas.class_mask.type",
48654
14
      FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
48655
48656
14
    {&hf_ieee80211_tclas_class_mask1_ver,
48657
14
     {"Version", "wlan.tclas.class_mask.version",
48658
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
48659
48660
14
    {&hf_ieee80211_tclas_class_mask1_src_ip,
48661
14
     {"Source IP Address", "wlan.tclas.class_mask.src_ip",
48662
14
      FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
48663
48664
14
    {&hf_ieee80211_tclas_class_mask1_dst_ip,
48665
14
     {"Destination IP Address", "wlan.tclas.class_mask.dst_ip",
48666
14
      FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
48667
48668
14
    {&hf_ieee80211_tclas_class_mask1_src_port,
48669
14
     {"Source Port", "wlan.tclas.class_mask.src_port",
48670
14
      FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL }},
48671
48672
14
    {&hf_ieee80211_tclas_class_mask1_dst_port,
48673
14
     {"Destination Port", "wlan.tclas.class_mask.dst_port",
48674
14
      FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL }},
48675
48676
14
    {&hf_ieee80211_tclas_class_mask1_ipv4_dscp,
48677
14
     {"DSCP", "wlan.tclas.class_mask.dscp",
48678
14
      FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
48679
48680
14
    {&hf_ieee80211_tclas_class_mask1_ipv4_proto,
48681
14
     {"Protocol", "wlan.tclas.class_mask.proto",
48682
14
      FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL }},
48683
48684
14
    {&hf_ieee80211_tclas_class_mask1_ipv6_flow,
48685
14
     {"Flow Label", "wlan.tclas.class_mask.flow_label",
48686
14
      FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
48687
48688
14
    {&hf_ieee80211_tclas_class_mask1_reserved,
48689
14
     {"Reserved", "wlan.tclas.class_mask.reserved",
48690
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
48691
48692
14
    {&hf_ieee80211_tclas_class_mask2_tci,
48693
14
     {"802.1Q CLAN TCI", "wlan.tclas.class_mask.tci",
48694
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
48695
48696
14
    {&hf_ieee80211_tclas_src_mac_addr,
48697
14
     {"Source address", "wlan.tclas.src_mac_addr",
48698
14
      FT_ETHER, BASE_NONE, NULL, 0,
48699
14
      "Classifier Parameters Ethernet Type", HFILL }},
48700
48701
14
    {&hf_ieee80211_tclas_dst_mac_addr,
48702
14
     {"Destination address", "wlan.tclas.dat_mac_addr",
48703
14
      FT_ETHER, BASE_NONE, NULL, 0,
48704
14
      NULL, HFILL }},
48705
48706
14
    {&hf_ieee80211_tclas_ether_type,
48707
14
     {"Ethernet Type", "wlan.tclas.ether_type",
48708
14
      FT_UINT16, BASE_DEC, NULL, 0,
48709
14
      NULL, HFILL }},
48710
48711
14
    {&hf_ieee80211_tclas_version,
48712
14
     {"IP Version", "wlan.tclas.version",
48713
14
      FT_UINT8, BASE_DEC, NULL, 0,
48714
14
      NULL, HFILL }},
48715
48716
14
    {&hf_ieee80211_tclas_ipv4_src,
48717
14
     {"IPv4 Src Addr", "wlan.tclas.ipv4_src",
48718
14
      FT_IPv4, BASE_NONE, NULL, 0,
48719
14
      NULL, HFILL }},
48720
48721
14
    {&hf_ieee80211_tclas_ipv4_dst,
48722
14
     {"IPv4 Dst Addr", "wlan.tclas.ipv4_dst",
48723
14
      FT_IPv4, BASE_NONE, NULL, 0,
48724
14
      NULL, HFILL }},
48725
48726
14
    {&hf_ieee80211_tclas_src_port,
48727
14
     {"Source Port", "wlan.tclas.src_port",
48728
14
      FT_UINT16, BASE_DEC, NULL, 0,
48729
14
      NULL, HFILL }},
48730
48731
14
    {&hf_ieee80211_tclas_dst_port,
48732
14
     {"Destination Port", "wlan.tclas.dst_port",
48733
14
      FT_UINT16, BASE_DEC, NULL, 0,
48734
14
      NULL, HFILL }},
48735
48736
14
    {&hf_ieee80211_tclas_dscp,
48737
14
     {"IPv4 DSCP", "wlan.tclas.dscp",
48738
14
      FT_UINT8, BASE_HEX, NULL, 0,
48739
14
      "IPv4 Differentiated Services Code Point (DSCP) Field", HFILL }},
48740
48741
14
    {&hf_ieee80211_tclas_protocol,
48742
14
     {"Protocol", "wlan.tclas.protocol",
48743
14
      FT_UINT8, BASE_HEX, NULL, 0,
48744
14
      "IPv4 Protocol", HFILL }},
48745
48746
14
    {&hf_ieee80211_tclas_ipv6_src,
48747
14
     {"IPv6 Src Addr", "wlan.tclas.ipv6_src",
48748
14
      FT_IPv6, BASE_NONE, NULL, 0,
48749
14
      NULL, HFILL }},
48750
48751
14
    {&hf_ieee80211_tclas_ipv6_dst,
48752
14
     {"IPv6 Dst Addr", "wlan.tclas.ipv6_dst",
48753
14
      FT_IPv6, BASE_NONE, NULL, 0,
48754
14
      NULL, HFILL }},
48755
48756
14
    {&hf_ieee80211_tclas_flow,
48757
14
     {"Flow Label", "wlan.tclas.flow",
48758
14
      FT_UINT24, BASE_HEX, NULL, 0,
48759
14
      "IPv6 Flow Label", HFILL }},
48760
48761
14
    {&hf_ieee80211_tclas_tag_type,
48762
14
     {"802.1Q Tag Type", "wlan.tclas.tag_type",
48763
14
      FT_UINT16, BASE_HEX, NULL, 0,
48764
14
      NULL, HFILL }},
48765
48766
14
    {&hf_ieee80211_tclas_filter_offset,
48767
14
     {"Filter Offset", "wlan.tclas.filter_offset",
48768
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48769
48770
14
    {&hf_ieee80211_tclas_filter_value,
48771
14
     {"Filter Value", "wlan.tclas.filter_value",
48772
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
48773
48774
14
    {&hf_ieee80211_tclas_filter_mask,
48775
14
     {"Filter Mask", "wlan.tclas.filter_mask",
48776
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
48777
48778
14
    {&hf_ieee80211_tclas4_version,
48779
14
     {"Version", "wlan.tclas.class4.version",
48780
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48781
48782
14
    {&hf_ieee80211_tclas_class_mask4_ver,
48783
14
     {"Version", "wlan.tclas.class4.mask.version",
48784
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x01, NULL, HFILL }},
48785
48786
14
    {&hf_ieee80211_tclas_class_mask4_4_src_ip,
48787
14
     {"Source IP (IPv4)", "wlan.tclas.class4.mask.ipv4_src",
48788
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x02, NULL, HFILL }},
48789
48790
14
    {&hf_ieee80211_tclas_class_mask4_4_dst_ip,
48791
14
     {"Destination IP (IPv4)", "wlan.tclas.class4.mask.ipv4_dst",
48792
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x04, NULL, HFILL }},
48793
48794
14
    {&hf_ieee80211_tclas_class_mask4_src_port,
48795
14
     {"Source Port", "wlan.tclas.class4.mask.src_port",
48796
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x08, NULL, HFILL }},
48797
48798
14
    {&hf_ieee80211_tclas_class_mask4_dst_port,
48799
14
     {"Destination Port", "wlan.tclas.class4.mask.dst_port",
48800
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x10, NULL, HFILL }},
48801
48802
14
    {&hf_ieee80211_tclas_class_mask4_dscp,
48803
14
     {"DSCP", "wlan.tclas.class4.mask.dscp",
48804
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x20, NULL, HFILL }},
48805
48806
14
    {&hf_ieee80211_tclas_class_mask4_ipv4_proto,
48807
14
     {"Protocol", "wlan.tclas.class4.mask.protocol",
48808
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x40, NULL, HFILL }},
48809
48810
14
    {&hf_ieee80211_tclas_class_mask4_reserved,
48811
14
     {"Reserved", "wlan.tclas.class4.mask.reserved",
48812
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
48813
48814
14
    {&hf_ieee80211_tclas_class_mask4_6_src_ip,
48815
14
     {"Source IP (IPv6)", "wlan.tclas.class4.mask.ipv6_src",
48816
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x02, NULL, HFILL }},
48817
48818
14
    {&hf_ieee80211_tclas_class_mask4_6_dst_ip,
48819
14
     {"Destination IP (IPv6)", "wlan.tclas.class4.mask.ipv6_dst",
48820
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x04, NULL, HFILL }},
48821
48822
14
    {&hf_ieee80211_tclas_reserved_bytes,
48823
14
     {"Reserved", "wlan.tclas.reserved",
48824
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
48825
48826
14
    {&hf_ieee80211_tclas_class_mask4_next_hdr,
48827
14
     {"Next Header", "wlan.tclas.class4.mask.next_header",
48828
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x40, NULL, HFILL }},
48829
48830
14
    {&hf_ieee80211_tclas_class_mask4_flow_label,
48831
14
     {"Flow Label", "wlan.tclas.class4.mask.flow_label",
48832
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x80, NULL, HFILL }},
48833
48834
14
    {&hf_ieee80211_tclas4_ipv4_src,
48835
14
     {"Source IP (IPv4)", "wlan.tclas.class4.ipv4_src_ip",
48836
14
      FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL }},
48837
48838
14
    {&hf_ieee80211_tclas4_ipv4_dst,
48839
14
     {"Destination IP (IPv4)", "wlan.tclas.class4.ipv4_dst_ip",
48840
14
      FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL }},
48841
48842
14
    {&hf_ieee80211_tclas4_src_port,
48843
14
     {"Source Port", "wlan.tclas.class4.src_port",
48844
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48845
48846
14
    {&hf_ieee80211_tclas4_dst_port,
48847
14
     {"Destination Port", "wlan.tclas.class4.dst_port",
48848
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
48849
48850
14
    {&hf_ieee80211_tclas4_dscp,
48851
14
     {"DSCP", "wlan.tclas.class4.dscp",
48852
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48853
48854
14
    {&hf_ieee80211_tclas4_protocol,
48855
14
     {"Protocol", "wlan.tclas.class4.protocol",
48856
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48857
48858
14
    {&hf_ieee80211_tclas4_reserved,
48859
14
     {"Reserved", "wlan.tclas.class4.reserved",
48860
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48861
48862
14
    {&hf_ieee80211_tclas4_ipv6_src,
48863
14
     {"Source IP (IPv6)", "wlan.tclas.class4.ipv6_src_ip",
48864
14
      FT_IPv6, BASE_NONE, NULL, 0, NULL, HFILL }},
48865
48866
14
    {&hf_ieee80211_tclas4_ipv6_dst,
48867
14
     {"Destination IP (IPv6)", "wlan.tclas.class4.ipv6_dst_ip",
48868
14
      FT_IPv6, BASE_NONE, NULL, 0, NULL, HFILL }},
48869
48870
14
    {&hf_ieee80211_tclas4_next_hdr,
48871
14
     {"Next Header", "wlan.tclas.class4.next_header",
48872
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
48873
48874
14
    {&hf_ieee80211_tclas4_flow,
48875
14
     {"Flow Label", "wlan.tclas.class4.flow_label",
48876
14
      FT_UINT24, BASE_DEC, NULL, 0, NULL, HFILL }},
48877
48878
14
    {&hf_ieee80211_tclas_tclas_8021d_up_pcp,
48879
14
     {"802.1D UP/802.1Q Priority Code Point", "wlan.tclas.class4.8021dq_up_pcp",
48880
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
48881
48882
14
    {&hf_ieee80211_tclas_8021q_dei,
48883
14
     {"802.1Q DEI", "wlan.tclas.class4.8021q_dei",
48884
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
48885
48886
14
    {&hf_ieee80211_tclas_8021q_vid,
48887
14
     {"802.1Q VID", "wlan.tclas.class4.8021q_vid",
48888
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
48889
48890
14
    {&hf_ieee80211_tclas_class_mask5_up_prio,
48891
14
     {"802.1D UP/802.1Q PCP", "wlan.tclas.class5.mask.8021dq_up_prio",
48892
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x01, NULL, HFILL }},
48893
48894
14
    {&hf_ieee80211_tclas_class_mask5_dei,
48895
14
     {"802.1Q DEI", "wlan.tclas.class4.mask.8021q_dei",
48896
14
      FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x02, NULL, HFILL }},
48897
48898
14
    {&hf_ieee80211_tclas_class_mask5_vid,
48899
14
     {"802.1Q VID", "wlan.tclas.class4.mask.8021q_vid",
48900
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
48901
48902
14
    {&hf_ieee80211_tclas_class_mask5_reserved,
48903
14
     {"Reserved", "wlan.tclas.class5.mask.reserved",
48904
14
      FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL }},
48905
48906
14
    {&hf_ieee80211_tclas_class_mask6_a_above,
48907
14
     {"Classifier Mask", "wlan.tclas.class6-9.mask",
48908
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
48909
48910
14
    {&hf_ieee80211_tclas_class_mask6_frame_control_match_spec,
48911
14
     {"Frame Control", "wlan.tclas.class6.mask.frame_control",
48912
14
      FT_UINT24, BASE_HEX, VALS(frame_control_mask_vals),
48913
14
      0x000003, NULL, HFILL }},
48914
48915
14
    {&hf_ieee80211_tclas_class_mask6_duration_id_match_spec,
48916
14
     {"Duration ID", "wlan.tclas.class6.mask.duration_id",
48917
14
      FT_UINT24, BASE_HEX, VALS(duration_id_mask_vals),
48918
14
      0x0000C0, NULL, HFILL }},
48919
48920
14
    {&hf_ieee80211_tclas_class_mask6_address_1_match_spec,
48921
14
     {"Address 1", "wlan.tclas.class6.mask.address_1",
48922
14
      FT_UINT24, BASE_HEX, VALS(address_1_mask_vals), 0x000300, NULL, HFILL }},
48923
48924
14
    {&hf_ieee80211_tclas_class_mask6_address_2_match_spec,
48925
14
     {"Address 2", "wlan.tclas.class6.mask.address_2",
48926
14
      FT_UINT24, BASE_HEX, VALS(address_2_mask_vals), 0x000C00, NULL, HFILL }},
48927
48928
14
    {&hf_ieee80211_tclas_class_mask6_address_3_match_spec,
48929
14
     {"Address 3", "wlan.tclas.class6.mask.address_3",
48930
14
      FT_UINT24, BASE_HEX, VALS(address_3_mask_vals), 0x003000, NULL, HFILL }},
48931
48932
14
    {&hf_ieee80211_tclas_class_mask6_sequence_control_spec,
48933
14
     {"Sequence Control", "wlan.tclas.class6.mask.sequence_control",
48934
14
      FT_UINT24, BASE_HEX, VALS(sequence_control_mask_vals),
48935
14
      0x00C000, NULL, HFILL }},
48936
48937
14
    {&hf_ieee80211_tclas_class_mask6_address_4_match_spec,
48938
14
     {"Address 4", "wlan.tclas.class6.mask.address_4",
48939
14
      FT_UINT24, BASE_HEX, VALS(address_4_mask_vals), 0x030000, NULL, HFILL }},
48940
48941
14
    {&hf_ieee80211_tclas_class_mask6_qos_control_spec,
48942
14
     {"QoS Control", "wlan.tclas.class6.mask.qos_control",
48943
14
      FT_UINT24, BASE_HEX, VALS(qos_control_mask_vals),
48944
14
      0x0C0000, NULL, HFILL }},
48945
48946
14
    {&hf_ieee80211_tclas_class_mask6_ht_control_spec,
48947
14
     {"HT Control", "wlan.tclas.class6.mask.ht_control",
48948
14
      FT_UINT24, BASE_HEX, VALS(ht_control_mask_vals), 0x300000, NULL, HFILL }},
48949
48950
14
    {&hf_ieee80211_tclas_class_mask6_reserved,
48951
14
     {"Reserved", "wlan.tclas.class6.mask.reserved",
48952
14
      FT_UINT24, BASE_HEX, NULL, 0xC00000, NULL, HFILL }},
48953
48954
14
    {&hf_ieee80211_tclas6_frame_control_spec,
48955
14
     {"Frame Control Spec", "wlan.tclas.class6.frame_control_spec",
48956
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
48957
48958
14
    {&hf_ieee80211_tclas6_frame_control_mask,
48959
14
     {"Frame Control Mask", "wlan.tclas.class6.frame_control_mask",
48960
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
48961
48962
14
    {&hf_ieee80211_tclas6_duration_spec,
48963
14
     {"Duration Spec", "wlan.tclas.class6.duration_spec",
48964
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
48965
48966
14
    {&hf_ieee80211_tclas6_duration_mask,
48967
14
     {"Duration Mask", "wlan.tclas.class6.duration_mask",
48968
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
48969
48970
14
    {&hf_ieee80211_tclas6_address_1_spec,
48971
14
     {"Address 1 Spec", "wlan.tclas.class6.address_1_spec",
48972
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
48973
48974
14
    {&hf_ieee80211_tclas6_address_1_mask,
48975
14
     {"Address 1 Mask", "wlan.tclas.class6.address_1_mask",
48976
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
48977
48978
14
    {&hf_ieee80211_tclas6_address_2_spec,
48979
14
     {"Address 2 Spec", "wlan.tclas.class6.address_2_spec",
48980
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
48981
48982
14
    {&hf_ieee80211_tclas6_address_2_mask,
48983
14
     {"Address 2 Mask", "wlan.tclas.class6.address_2_mask",
48984
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
48985
48986
14
    {&hf_ieee80211_tclas6_address_3_spec,
48987
14
     {"Address 3 Spec", "wlan.tclas.class6.address_3_spec",
48988
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
48989
48990
14
    {&hf_ieee80211_tclas6_address_3_mask,
48991
14
     {"Address 3 Mask", "wlan.tclas.class6.address_3_mask",
48992
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
48993
48994
14
    {&hf_ieee80211_tclas6_sequence_control_spec,
48995
14
     {"Sequence Control Spec", "wlan.tclas.class6.sequence_control_spec",
48996
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
48997
48998
14
    {&hf_ieee80211_tclas6_sequence_control_mask,
48999
14
     {"Sequence Control Mask", "wlan.tclas.class6.sequence_control_mask",
49000
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49001
49002
14
    {&hf_ieee80211_tclas6_address_4_spec,
49003
14
     {"Address 4 Spec", "wlan.tclas.class6.address_4_spec",
49004
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49005
49006
14
    {&hf_ieee80211_tclas6_address_4_mask,
49007
14
     {"Address 4 Mask", "wlan.tclas.class6.address_4_mask",
49008
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49009
49010
14
    {&hf_ieee80211_tclas6_qos_control_spec,
49011
14
     {"QoS Control Spec", "wlan.tclas.class6.qos_control_spes",
49012
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49013
49014
14
    {&hf_ieee80211_tclas6_qos_control_mask,
49015
14
     {"QoS Control Mask", "wlan.tclas.class6.qos_control_mask",
49016
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49017
49018
14
    {&hf_ieee80211_tclas6_ht_control_spec,
49019
14
     {"HT Control Spec", "wlan.tclas.class6.ht_control_spec",
49020
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
49021
49022
14
    {&hf_ieee80211_tclas6_ht_control_mask,
49023
14
     {"HT Control Mask", "wlan.tclas.class6.ht_control_mask",
49024
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
49025
49026
14
    {&hf_ieee80211_tclas_class_mask7_frame_control_match_spec,
49027
14
     {"Frame Control Match", "wlan.tclas.class7.frame_control_spec",
49028
14
      FT_UINT24, BASE_HEX, VALS(frame_control_mask_vals),
49029
14
      0x000003, NULL, HFILL }},
49030
49031
14
    {&hf_ieee80211_tclas_class_mask7_address_1_sid_match_spec,
49032
14
     {"Address 1 (SID) Spec", "wlan.tclas.class4.address_1_sid_spec",
49033
14
      FT_UINT24, BASE_HEX, VALS(address_1_sid_mask_vals),
49034
14
      0x00000C, NULL, HFILL }},
49035
49036
14
    {&hf_ieee80211_tclas_class_mask7_address_2_match_spec,
49037
14
     {"Address 2 Spec", "wlan.tclas.class7.address_2i_match_spec",
49038
14
      FT_UINT24, BASE_HEX, VALS(address_2_mask_vals), 0x000030, NULL, HFILL }},
49039
49040
14
    {&hf_ieee80211_tclas_class_mask7_sequence_control_spec,
49041
14
     {"Sequence Control Spec", "wlan.tclas.class7.sequence_control_spec",
49042
14
      FT_UINT24, BASE_HEX, VALS(sequence_control_mask_vals),
49043
14
      0x0000C0, NULL, HFILL }},
49044
49045
14
    {&hf_ieee80211_tclas_class_mask7_address_3_match_spec,
49046
14
     {"Address 3 Spec", "wlan.tclas.class7.address_3_match_spec",
49047
14
      FT_UINT24, BASE_HEX, VALS(address_3_mask_vals), 0x000c00, NULL, HFILL }},
49048
49049
14
    {&hf_ieee80211_tclas_class_mask7_address_4_match_spec,
49050
14
     {"Address 4 Spec", "wlan.tclas.class7.address_4_match_spec",
49051
14
      FT_UINT24, BASE_HEX, VALS(address_4_mask_vals), 0x003000, NULL, HFILL }},
49052
49053
14
    {&hf_ieee80211_tclas_class_mask7_reserved,
49054
14
     {"Reserved", "wlan.tclas.class7.reserved",
49055
14
      FT_UINT24, BASE_HEX, NULL, 0xFFC000, NULL, HFILL }},
49056
49057
14
    {&hf_ieee80211_tclas7_frame_control_spec,
49058
14
     {"Frame Control Spec", "wlan.tclas.class7.frame_control_spec",
49059
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49060
49061
14
    {&hf_ieee80211_tclas7_frame_control_mask,
49062
14
     {"Frame Control Mask", "wlan.tclas.class7.frame_control_mask",
49063
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49064
49065
14
    {&hf_ieee80211_tclas7_address_1_sid_spec,
49066
14
     {"Address 1 (SID) Spec", "wlan.tclas.class7.address_1_sid_spec",
49067
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49068
49069
14
    {&hf_ieee80211_tclas7_address_1_sid_mask,
49070
14
     {"Address 1 (SID) Mask", "wlan.tclas.class7.address_1_sid_mask",
49071
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49072
49073
14
    {&hf_ieee80211_tclas7_address_2_spec,
49074
14
     {"Address 2 Spec", "wlan.tclas.class7.address_2_spec",
49075
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49076
49077
14
    {&hf_ieee80211_tclas7_address_2_mask,
49078
14
     {"Address 2 Mask", "wlan.tclas.class7.address_2_mask",
49079
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49080
49081
14
    {&hf_ieee80211_tclas7_sequence_control_spec,
49082
14
     {"Sequence Control Spec", "wlan.tclas.class7.sequence_control_spec",
49083
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49084
49085
14
    {&hf_ieee80211_tclas7_sequence_control_mask,
49086
14
     {"Sequence Control Mask", "wlan.tclas.class7.sequence_control_mask",
49087
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49088
49089
14
    {&hf_ieee80211_tclas7_address_3_spec,
49090
14
     {"Address 3 Spec", "wlan.tclas.class7.address_3_spec",
49091
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49092
49093
14
    {&hf_ieee80211_tclas7_address_3_mask,
49094
14
     {"Address 3 Mask", "wlan.tclas.class7.address_3_mask",
49095
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49096
49097
14
    {&hf_ieee80211_tclas7_address_4_spec,
49098
14
     {"Address 4 Spec", "wlan.tclas.class4.address_4_spec",
49099
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49100
49101
14
    {&hf_ieee80211_tclas7_address_4_mask,
49102
14
     {"Address 4 Mask", "wlan.tclas.class4.address_4_mask",
49103
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49104
49105
14
    {&hf_ieee80211_tclas_class_mask8_frame_control_match_spec,
49106
14
     {"Frame Control Spec", "wlan.tclas.class8.mask.frame_control_spec",
49107
14
      FT_UINT24, BASE_HEX, VALS(frame_control_mask_vals),
49108
14
      0x000003, NULL, HFILL }},
49109
49110
14
    {&hf_ieee80211_tclas_class_mask8_address_1_bssid_match_spec,
49111
14
     {"Address 1 (BSSID) Spec", "wlan.tclas.class8.mask.address_1_bssid_spec",
49112
14
      FT_UINT24, BASE_HEX, VALS(address_1_bssid_mask_vals),
49113
14
      0x00000C, NULL, HFILL }},
49114
49115
14
    {&hf_ieee80211_tclas_class_mask8_address_2_sid_match_spec,
49116
14
     {"Address 2 (SID) Spec", "wlan.tclas.class8.mask.address_2_sid_spec",
49117
14
      FT_UINT24, BASE_HEX, VALS(address_2_mask_vals), 0x000030, NULL, HFILL }},
49118
49119
14
    {&hf_ieee80211_tclas_class_mask8_sequence_control_spec,
49120
14
     {"Sequence Control Spec", "wlan.tclas.class8.mask.sequence_control_spec",
49121
14
      FT_UINT24, BASE_HEX, VALS(sequence_control_mask_vals),
49122
14
      0x0000C0, NULL, HFILL }},
49123
49124
14
    {&hf_ieee80211_tclas_class_mask8_address_3_match_spec,
49125
14
     {"Address 3 Spec", "wlan.tclas.class8.mask.address_3_spec",
49126
14
      FT_UINT24, BASE_HEX, VALS(address_3_mask_vals), 0x000300, NULL, HFILL }},
49127
49128
14
    {&hf_ieee80211_tclas_class_mask8_address_4_match_spec,
49129
14
     {"Address 4 Spec", "wlan.tclas.class8.mask.address_4_spec",
49130
14
      FT_UINT24, BASE_HEX, VALS(address_4_mask_vals), 0x000C00, NULL, HFILL }},
49131
49132
14
    {&hf_ieee80211_tclas_class_mask8_reserved,
49133
14
     {"Reserved", "wlan.tclas.class8.reserved",
49134
14
      FT_UINT24, BASE_HEX, NULL, 0xFFF000, NULL, HFILL }},
49135
49136
14
    {&hf_ieee80211_tclas8_frame_control_spec,
49137
14
     {"Frame Control Spec", "wlan.tclas.class8.frame_control_spec",
49138
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49139
49140
14
    {&hf_ieee80211_tclas8_frame_control_mask,
49141
14
     {"Frame Control Mask", "wlan.tclas.class8.frame_control_mask",
49142
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49143
49144
14
    {&hf_ieee80211_tclas8_address_1_bssid_spec,
49145
14
     {"Address 1 (BSSID) Spec", "wlan.tclas.class8.address_1_bssid_spec",
49146
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49147
49148
14
    {&hf_ieee80211_tclas8_address_1_bssid_mask,
49149
14
     {"Address 1 (BSSID) Mask", "wlan.tclas.class8.address_1_bssid_mask",
49150
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49151
49152
14
    {&hf_ieee80211_tclas8_address_2_sid_spec,
49153
14
     {"Address 2 (SID) Spec", "wlan.tclas.class8.address_2_sid_spec",
49154
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49155
49156
14
    {&hf_ieee80211_tclas8_address_2_sid_mask,
49157
14
     {"Address 2 (SID) Spec", "wlan.tclas.class8.address_2_sid_spec",
49158
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49159
49160
14
    {&hf_ieee80211_tclas8_sequence_control_spec,
49161
14
     {"Sequence Control Spec", "wlan.tclas.class8.sequence_control_spec",
49162
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49163
49164
14
    {&hf_ieee80211_tclas8_sequence_control_mask,
49165
14
     {"Sequence Control Mask", "wlan.tclas.class8.sequence_control_mask",
49166
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49167
49168
14
    {&hf_ieee80211_tclas8_address_3_spec,
49169
14
     {"Address 3 Spec", "wlan.tclas.class8.address_3_spec",
49170
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49171
49172
14
    {&hf_ieee80211_tclas8_address_3_mask,
49173
14
     {"Address 3 Mask", "wlan.tclas.class8.address_3_mask",
49174
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49175
49176
14
    {&hf_ieee80211_tclas8_address_4_spec,
49177
14
     {"Address 4 Spec", "wlan.tclas.class8.address_4_spec",
49178
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49179
49180
14
    {&hf_ieee80211_tclas8_address_4_mask,
49181
14
     {"Address 4 Mask", "wlan.tclas.class8.address_4_mask",
49182
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49183
49184
14
    {&hf_ieee80211_tclas_class_mask9_frame_control_match_spec,
49185
14
     {"Frame Control Spec", "wlan.tclas.class9.frame_control_spec",
49186
14
      FT_UINT24, BASE_HEX, VALS(frame_control_mask_vals), 0x000003, NULL, HFILL }},
49187
49188
14
    {&hf_ieee80211_tclas_class_mask9_address_1_match_spec,
49189
14
     {"Address 1 Spec", "wlan.tclas.class9.mask.address_1_spec",
49190
14
      FT_UINT24, BASE_HEX, VALS(address_1_mask_vals), 0x00000C, NULL, HFILL }},
49191
49192
14
    {&hf_ieee80211_tclas_class_mask9_address_2_match_spec,
49193
14
     {"Address 2 Spec", "wlan.tclas.class9.mask.address_2_spec",
49194
14
      FT_UINT24, BASE_HEX, VALS(address_2_mask_vals), 0x000030, NULL, HFILL }},
49195
49196
14
    {&hf_ieee80211_tclas_class_mask9_sequence_control_spec,
49197
14
     {"Sequence Control Spec", "wlan.tclas.class9.mask.sequence_control_spec",
49198
14
      FT_UINT24, BASE_HEX, VALS(sequence_control_mask_vals),
49199
14
      0x0000C0, NULL, HFILL }},
49200
49201
14
    {&hf_ieee80211_tclas_class_mask9_reserved,
49202
14
     {"Reserved", "wlan.tclas.class9.mask.reserved",
49203
14
      FT_UINT24, BASE_HEX, NULL, 0xFFFF00, NULL, HFILL }},
49204
49205
14
    {&hf_ieee80211_tclas9_frame_control_spec,
49206
14
     {"Frame Control Spec", "wlan.tclas.class9.frame_control_spec",
49207
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49208
49209
14
    {&hf_ieee80211_tclas9_frame_control_mask,
49210
14
     {"Frame Control Mask", "wlan.tclas.class9.frame_control_mask",
49211
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49212
49213
14
    {&hf_ieee80211_tclas9_address_1_spec,
49214
14
     {"Address 1 Spec", "wlan.tclas.class9.address_1_spec",
49215
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49216
49217
14
    {&hf_ieee80211_tclas9_address_1_mask,
49218
14
     {"Address 1 Mask", "wlan.tclas.class9.address_1_mask",
49219
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49220
49221
14
    {&hf_ieee80211_tclas9_address_2_spec,
49222
14
     {"Address 2 Spec", "wlan.tclas.class9.address_2_spec",
49223
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
49224
49225
14
    {&hf_ieee80211_tclas9_address_2_mask,
49226
14
     {"Address 2 Mask", "wlan.tclas.class9.address_2_mask",
49227
14
      FT_UINT48, BASE_HEX, NULL, 0, NULL, HFILL }},
49228
49229
14
    {&hf_ieee80211_tclas9_sequence_control_spec,
49230
14
     {"Sequence Control Spec", "wlan.tclas.class9.sequence_control_spec",
49231
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49232
49233
14
    {&hf_ieee80211_tclas9_sequence_control_mask,
49234
14
     {"Sequence Control Mask", "wlan.tclas.class9.sequence_control_mask",
49235
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
49236
49237
14
    {&hf_ieee80211_tclas10_protocol_instance,
49238
14
     {"Protocol Instance", "wlan.tclas.class10.protocol_instance",
49239
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
49240
49241
14
    {&hf_ieee80211_tclas10_protocol_num_next_hdr,
49242
14
     {"Protocol Number or Next Header",
49243
14
       "wlan.tclas.class10.proto_num_or_next_hdr",
49244
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
49245
49246
14
    {&hf_ieee80211_tag_challenge_text,
49247
14
     {"Challenge Text", "wlan.tag.challenge_text",
49248
14
      FT_BYTES, BASE_NONE, NULL, 0,
49249
14
      NULL, HFILL }},
49250
49251
14
    {&hf_ieee80211_tag_oui_wfa_action_type,
49252
14
     {"OUI Type", "wlan.action.oui_type",
49253
14
      FT_UINT8, BASE_HEX, VALS(wfa_action_subtype_vals), 0x0, NULL, HFILL }},
49254
49255
14
    {&hf_ieee80211_oui_qos_subtype,
49256
14
     {"OUI Subtype", "wlan.action.dscp_policy.oui_subtype",
49257
14
      FT_UINT8, BASE_HEX, VALS(wfa_qos_subtype_vals), 0x0, NULL, HFILL }},
49258
49259
14
    {&hf_ieee80211_oui_qos_mgmt_dialog_token,
49260
14
     {"Dialog Token", "wlan.action.dscp_policy.dialog_token",
49261
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49262
49263
14
    {&hf_ieee80211_oui_qos_mgmt_rqst_control,
49264
14
     {"Request Control", "wlan.action.dscp_policy.request.control",
49265
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49266
49267
14
    {&hf_ieee80211_oui_qos_mgmt_rq_ctrl_more,
49268
14
     {"More", "wlan.action.dscp_policy.request.control.more",
49269
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
49270
49271
14
    {&hf_ieee80211_oui_qos_mgmt_rq_ctrl_reset,
49272
14
     {"Reset", "wlan.action.dscp_policy.request.control.reset",
49273
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
49274
49275
14
    {&hf_ieee80211_oui_qos_mgmt_rq_reserved,
49276
14
     {"Reserved", "wlan.action.dscp_policy.request.control.reserved",
49277
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
49278
49279
14
    {&hf_ieee80211_dscp_policy_id,
49280
14
     {"Policy ID", "wlan.action.dscp_policy_response.policy_id",
49281
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
49282
49283
14
    {&hf_ieee80211_dscp_policy_status,
49284
14
     {"Status", "wlan.action.dscp_policy_response.policy_status",
49285
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
49286
49287
14
    {&hf_ieee80211_oui_qos_mgmt_resp_control,
49288
14
     {"Response Control", "wlan.action.dscp_policy.request.control",
49289
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49290
49291
14
    {&hf_ieee80211_oui_qos_mgmt_rsp_ctrl_more,
49292
14
     {"More", "wlan.action.dscp_policy.response.control.more",
49293
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
49294
49295
14
    {&hf_ieee80211_oui_qos_mgmt_rsp_ctrl_reset,
49296
14
     {"Reset", "wlan.action.dscp_policy.response.control.reset",
49297
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
49298
49299
14
    {&hf_ieee80211_oui_qos_mgmt_rsp_reserved,
49300
14
     {"Reserved", "wlan.action.dscp_policy.response.control.reserved",
49301
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
49302
49303
14
    {&hf_ieee80211_dscp_policy_scs_sts_list,
49304
14
     {"Status List", "wlan.action.dscp_policy_response.policy_status_list",
49305
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
49306
49307
14
    {&hf_ieee80211_oui_qos_mgmt_count,
49308
14
     {"Count", "wlan.action.dscp_policy.response.count",
49309
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
49310
49311
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf,
49312
14
     {"Capabilities Information", "wlan.tag.he_6ghz.cap_inf",
49313
14
      FT_UINT16, BASE_HEX, NULL, 0,
49314
14
      NULL, HFILL }},
49315
49316
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b0_b2,
49317
14
     {"Minimum MPDU Start Spacing", "wlan.tag.he_6ghz.cap_inf.b0_b2",
49318
14
      FT_UINT16, BASE_HEX, VALS(s1g_min_mpdu_start_spacing_vals), 0x0007,
49319
14
      NULL, HFILL }},
49320
49321
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b3_b5,
49322
14
     {"Maximum A-MPDU Length Exponent", "wlan.tag.he_6ghz.cap_inf.b3_b5",
49323
14
      FT_UINT16, BASE_HEX, VALS(vht_max_ampdu_flag), 0x0038,
49324
14
      "Octets", HFILL }},
49325
49326
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b6_b7,
49327
14
     {"Maximum MPDU Length", "wlan.tag.he_6ghz.cap_inf.b6_b7",
49328
14
      FT_UINT16, BASE_HEX, VALS(vht_max_mpdu_length_flag), 0x00C0,
49329
14
      "Octets", HFILL }},
49330
49331
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b8,
49332
14
     {"Reserved", "wlan.tag.he_6ghz.cap_inf.b8",
49333
14
      FT_UINT16, BASE_HEX, NULL, 0x0100,
49334
14
      NULL, HFILL }},
49335
49336
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b9_b10,
49337
14
     {"SM Power Save", "wlan.tag.he_6ghz.cap_inf.b9b_b10",
49338
14
      FT_UINT16, BASE_HEX, VALS(ht_sm_pwsave_flag), 0x0600,
49339
14
      NULL, HFILL }},
49340
49341
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b11,
49342
14
     {"RD Responder", "wlan.tag.he_6ghz.cap_inf.b11",
49343
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800,
49344
14
      NULL, HFILL }},
49345
49346
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b12,
49347
14
     {"Rx Antenna Pattern Consistency", "wlan.tag.he_6ghz.cap_inf.b12",
49348
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000,
49349
14
      NULL, HFILL }},
49350
49351
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b13,
49352
14
     {"Tx Antenna Pattern Consistency", "wlan.tag.he_6ghz.cap_inf.b13",
49353
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000,
49354
14
      NULL, HFILL }},
49355
49356
14
    {&hf_ieee80211_tag_he_6ghz_cap_inf_b14_b15,
49357
14
     {"Reserved", "wlan.tag.he_6ghz.cap_inf.b14_b15",
49358
14
      FT_UINT16, BASE_HEX, NULL, 0xC000,
49359
14
      NULL, HFILL }},
49360
49361
14
    {&hf_ieee80211_tag_ftm_tsf_sync_info,
49362
14
     {"TSF Sync Info", "wlan.tag.ftm_tsf_sync_info",
49363
14
      FT_BYTES, BASE_NONE, NULL, 0,
49364
14
      NULL, HFILL }},
49365
49366
14
    {&hf_ieee80211_rsn_version,
49367
14
     {"RSN Version", "wlan.rsn.version",
49368
14
      FT_UINT16, BASE_DEC, NULL, 0,
49369
14
      "Indicates the version number of the RSNA protocol", HFILL }},
49370
49371
14
    {&hf_ieee80211_rsn_gcs,
49372
14
     {"Group Cipher Suite", "wlan.rsn.gcs",
49373
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_gcs_base_custom), 0,
49374
14
      "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }},
49375
49376
14
    {&hf_ieee80211_rsn_gcs_oui,
49377
14
     {"Group Cipher Suite OUI", "wlan.rsn.gcs.oui",
49378
14
      FT_UINT24, BASE_OUI, NULL, 0,
49379
14
      NULL, HFILL }},
49380
49381
14
    {&hf_ieee80211_rsn_gcs_type,
49382
14
     {"Group Cipher Suite type", "wlan.rsn.gcs.type",
49383
14
      FT_UINT8, BASE_DEC, NULL, 0,
49384
14
      NULL, HFILL }},
49385
49386
14
    {&hf_ieee80211_rsn_gcs_80211_type,
49387
14
     {"Group Cipher Suite type", "wlan.rsn.gcs.type",
49388
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
49389
14
      NULL, HFILL }},
49390
49391
14
    {&hf_ieee80211_rsn_pcs_count,
49392
14
     {"Pairwise Cipher Suite Count", "wlan.rsn.pcs.count",
49393
14
      FT_UINT16, BASE_DEC,  NULL, 0,
49394
14
      "Indicates the number of pairwise cipher suite selectors that are contained in the Pairwise Cipher Suite List", HFILL }},
49395
49396
14
    {&hf_ieee80211_rsn_pcs_list,
49397
14
     {"Pairwise Cipher Suite List", "wlan.rsn.pcs.list",
49398
14
      FT_NONE, BASE_NONE, NULL, 0,
49399
14
      "Contains a series of cipher suite selectors that indicate the pairwisecipher suites", HFILL }},
49400
49401
14
    {&hf_ieee80211_rsn_pcs,
49402
14
     {"Pairwise Cipher Suite", "wlan.rsn.pcs",
49403
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_pcs_base_custom), 0,
49404
14
      NULL, HFILL }},
49405
49406
14
    {&hf_ieee80211_rsn_pcs_oui,
49407
14
     {"Pairwise Cipher Suite OUI", "wlan.rsn.pcs.oui",
49408
14
      FT_UINT24, BASE_OUI, NULL, 0,
49409
14
      NULL, HFILL }},
49410
49411
14
    {&hf_ieee80211_rsn_pcs_type,
49412
14
     {"Pairwise Cipher Suite type", "wlan.rsn.pcs.type",
49413
14
      FT_UINT8, BASE_DEC, NULL, 0,
49414
14
      NULL, HFILL }},
49415
49416
14
    {&hf_ieee80211_rsn_pcs_80211_type,
49417
14
     {"Pairwise Cipher Suite type", "wlan.rsn.pcs.type",
49418
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
49419
14
      NULL, HFILL }},
49420
49421
14
    {&hf_ieee80211_rsn_akms_count,
49422
14
     {"Auth Key Management (AKM) Suite Count", "wlan.rsn.akms.count",
49423
14
      FT_UINT16, BASE_DEC, NULL, 0,
49424
14
      "Indicates the number of Auth Key Management suite selectors that are contained in the Auth Key Management Suite List", HFILL }},
49425
49426
14
    {&hf_ieee80211_rsn_akms_list,
49427
14
     {"Auth Key Management (AKM) List", "wlan.rsn.akms.list",
49428
14
      FT_NONE, BASE_NONE, NULL, 0,
49429
14
      "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
49430
49431
14
    {&hf_ieee80211_rsn_akms,
49432
14
     {"Auth Key Management (AKM) Suite", "wlan.rsn.akms",
49433
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_akms_base_custom), 0,
49434
14
      NULL, HFILL }},
49435
49436
14
    {&hf_ieee80211_rsn_akms_oui,
49437
14
     {"Auth Key Management (AKM) OUI", "wlan.rsn.akms.oui",
49438
14
      FT_UINT24, BASE_OUI, NULL, 0,
49439
14
      NULL, HFILL }},
49440
49441
14
    {&hf_ieee80211_rsn_akms_type,
49442
14
     {"Auth Key Management (AKM) type", "wlan.rsn.akms.type",
49443
14
      FT_UINT8, BASE_DEC, NULL, 0,
49444
14
      NULL, HFILL }},
49445
49446
14
    {&hf_ieee80211_rsn_akms_80211_type,
49447
14
     {"Auth Key Management (AKM) type", "wlan.rsn.akms.type",
49448
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_keymgmt_vals), 0,
49449
14
      NULL, HFILL }},
49450
49451
14
    {&hf_ieee80211_rsn_cap,
49452
14
     {"RSN Capabilities", "wlan.rsn.capabilities",
49453
14
      FT_UINT16, BASE_HEX, NULL, 0,
49454
14
      "RSN Capability information", HFILL }},
49455
49456
14
    {&hf_ieee80211_rsn_cap_preauth,
49457
14
     {"RSN Pre-Auth capabilities", "wlan.rsn.capabilities.preauth",
49458
14
      FT_BOOLEAN, 16, TFS(&rsn_preauth_flags), 0x0001,
49459
14
      NULL, HFILL }},
49460
49461
14
    {&hf_ieee80211_rsn_cap_no_pairwise,
49462
14
     {"RSN No Pairwise capabilities", "wlan.rsn.capabilities.no_pairwise",
49463
14
      FT_BOOLEAN, 16, TFS(&rsn_no_pairwise_flags), 0x0002,
49464
14
      NULL, HFILL }},
49465
49466
14
    {&hf_ieee80211_rsn_cap_ptksa_replay_counter,
49467
14
     {"RSN PTKSA Replay Counter capabilities", "wlan.rsn.capabilities.ptksa_replay_counter",
49468
14
      FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x000C,
49469
14
      NULL, HFILL }},
49470
49471
14
    {&hf_ieee80211_rsn_cap_gtksa_replay_counter,
49472
14
     {"RSN GTKSA Replay Counter capabilities", "wlan.rsn.capabilities.gtksa_replay_counter",
49473
14
      FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x0030,
49474
14
      NULL, HFILL }},
49475
49476
14
    {&hf_ieee80211_rsn_cap_mfpr,
49477
14
     {"Management Frame Protection Required", "wlan.rsn.capabilities.mfpr",
49478
14
      FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0040,
49479
14
      NULL, HFILL }},
49480
49481
14
    {&hf_ieee80211_rsn_cap_mfpc,
49482
14
     {"Management Frame Protection Capable", "wlan.rsn.capabilities.mfpc",
49483
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x0080,
49484
14
      NULL, HFILL }},
49485
49486
14
    {&hf_ieee80211_rsn_cap_jmr,
49487
14
     {"Joint Multi-band RSNA", "wlan.rsn.capabilities.jmr",
49488
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100,
49489
14
      NULL, HFILL }},
49490
49491
14
    {&hf_ieee80211_rsn_cap_peerkey,
49492
14
     {"PeerKey Enabled", "wlan.rsn.capabilities.peerkey",
49493
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200,
49494
14
      NULL, HFILL }},
49495
49496
14
    {&hf_ieee80211_rsn_cap_spp_amsdu_cap,
49497
14
     {"SPP A-MSDU Capable", "wlan.rsn.capabilities.spp_amsdu_cap",
49498
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x0400,
49499
14
      NULL, HFILL }},
49500
49501
14
    {&hf_ieee80211_rsn_cap_spp_amsdu_req,
49502
14
     {"SPP A-MSDU Required", "wlan.rsn.capabilities.spp_amsdu_req",
49503
14
      FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0800,
49504
14
      NULL, HFILL }},
49505
49506
14
    {&hf_ieee80211_rsn_cap_pbac,
49507
14
     {"PBAC (protected block ack agreement capable)", "wlan.rsn.capabilities.pbac",
49508
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x1000,
49509
14
      NULL, HFILL }},
49510
49511
14
    {&hf_ieee80211_rsn_cap_extended_key_id_iaf,
49512
14
     {"Extended Key ID for Individually Addressed Frames",
49513
14
      "wlan.rsn.capabilities.extended_key_id_iaf",
49514
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
49515
49516
14
    {&hf_ieee80211_rsn_cap_ocvc,
49517
14
     {"OCVC", "wlan.rsn.capabilities.ocvc",
49518
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x4000,
49519
14
      NULL, HFILL }},
49520
49521
14
    {&hf_ieee80211_rsn_pmkid_count,
49522
14
     {"PMKID Count", "wlan.rsn.pmkid.count",
49523
14
      FT_UINT16, BASE_DEC, NULL, 0,
49524
14
      "Indicates the number of PMKID  selectors that are contained in the PMKID Suite List", HFILL }},
49525
49526
14
    {&hf_ieee80211_rsn_pmkid_list,
49527
14
     {"PMKID List", "wlan.rsn.pmkid.list",
49528
14
      FT_NONE, BASE_NONE, NULL, 0,
49529
14
      "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
49530
49531
14
    {&hf_ieee80211_rsn_pmkid,
49532
14
     {"PMKID", "wlan.pmkid.akms",
49533
14
      FT_BYTES, BASE_NONE, NULL, 0,
49534
14
      NULL, HFILL }},
49535
49536
14
    {&hf_ieee80211_rsn_gmcs,
49537
14
     {"Group Management Cipher Suite", "wlan.rsn.gmcs",
49538
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_gmcs_base_custom), 0,
49539
14
      "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }},
49540
49541
14
    {&hf_ieee80211_rsn_gmcs_oui,
49542
14
     {"Group Management Cipher Suite OUI", "wlan.rsn.gmcs.oui",
49543
14
      FT_UINT24, BASE_OUI, NULL, 0,
49544
14
      NULL, HFILL }},
49545
49546
14
    {&hf_ieee80211_rsn_gmcs_type,
49547
14
     {"Group Management Cipher Suite type", "wlan.rsn.gmcs.type",
49548
14
      FT_UINT8, BASE_DEC, NULL, 0,
49549
14
      NULL, HFILL }},
49550
49551
14
    {&hf_ieee80211_rsn_gmcs_80211_type,
49552
14
     {"Group Management Cipher Suite type", "wlan.rsn.gmcs.type",
49553
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
49554
14
      NULL, HFILL }},
49555
49556
14
    {&hf_ieee80211_ht_pren_type,
49557
14
     {"802.11n (Pre) Type", "wlan.vs.pren.type",
49558
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_ht_pren_type_vals), 0,
49559
14
      "Vendor Specific HT Type", HFILL }},
49560
14
    {&hf_ieee80211_ht_pren_unknown,
49561
14
     {"802.11n (Pre) Unknown Data", "wlan.vs.pren.unknown_data",
49562
14
      FT_BYTES, BASE_NONE, NULL, 0,
49563
14
      NULL, HFILL }},
49564
49565
14
    {&hf_ieee80211_ht_cap,
49566
14
     {"HT Capabilities Info", "wlan.ht.capabilities",
49567
14
      FT_UINT16, BASE_HEX, NULL, 0,
49568
14
      "HT Capabilities information", HFILL }},
49569
49570
14
    {&hf_ieee80211_ht_vs_cap,
49571
14
     {"HT Capabilities Info (VS)", "wlan.vs.ht.capabilities",
49572
14
      FT_UINT16, BASE_HEX, NULL, 0,
49573
14
      "Vendor Specific HT Capabilities information", HFILL }},
49574
49575
14
    {&hf_ieee80211_ht_ldpc_coding,
49576
14
     {"HT LDPC coding capability", "wlan.ht.capabilities.ldpccoding",
49577
14
      FT_BOOLEAN, 16, TFS(&ht_ldpc_coding_flag), 0x0001,
49578
14
      NULL, HFILL }},
49579
49580
14
    {&hf_ieee80211_ht_chan_width,
49581
14
     {"HT Support channel width", "wlan.ht.capabilities.width",
49582
14
      FT_BOOLEAN, 16, TFS(&ht_chan_width_flag), 0x0002,
49583
14
      NULL, HFILL }},
49584
49585
14
    {&hf_ieee80211_ht_sm_pwsave,
49586
14
     {"HT SM Power Save", "wlan.ht.capabilities.sm",
49587
14
      FT_UINT16, BASE_HEX, VALS(ht_sm_pwsave_flag), 0x000c,
49588
14
      NULL, HFILL }},
49589
49590
14
    {&hf_ieee80211_ht_green,
49591
14
     {"HT Green Field", "wlan.ht.capabilities.green",
49592
14
      FT_BOOLEAN, 16, TFS(&ht_green_flag), 0x0010,
49593
14
      NULL, HFILL }},
49594
49595
14
    {&hf_ieee80211_ht_short20,
49596
14
     {"HT Short GI for 20MHz", "wlan.ht.capabilities.short20",
49597
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020,
49598
14
      NULL, HFILL }},
49599
49600
14
    {&hf_ieee80211_ht_short40,
49601
14
     {"HT Short GI for 40MHz", "wlan.ht.capabilities.short40",
49602
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040,
49603
14
      NULL, HFILL }},
49604
49605
14
    {&hf_ieee80211_ht_tx_stbc,
49606
14
     {"HT Tx STBC", "wlan.ht.capabilities.txstbc",
49607
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080,
49608
14
      NULL, HFILL }},
49609
49610
14
    {&hf_ieee80211_ht_rx_stbc,
49611
14
     {"HT Rx STBC", "wlan.ht.capabilities.rxstbc",
49612
14
      FT_UINT16, BASE_HEX, VALS(ht_rx_stbc_flag), 0x0300,
49613
14
      NULL, HFILL }},
49614
49615
14
    {&hf_ieee80211_ht_reserved_b10,
49616
14
     {"Reserved", "wlan.ht.capabilities.info_reserved_b10",
49617
14
      FT_UINT16, BASE_HEX, NULL, 0x0400,
49618
14
      NULL, HFILL }},
49619
49620
14
    {&hf_ieee80211_ht_max_amsdu,
49621
14
     {"HT Max A-MSDU length", "wlan.ht.capabilities.amsdu",
49622
14
      FT_BOOLEAN, 16, TFS(&ht_max_amsdu_flag), 0x0800,
49623
14
      NULL, HFILL }},
49624
49625
14
    {&hf_ieee80211_ht_dss_cck_40,
49626
14
     {"HT DSSS/CCK mode in 40MHz", "wlan.ht.capabilities.dsscck",
49627
14
      FT_BOOLEAN, 16, TFS(&ht_dss_cck_40_flag), 0x1000,
49628
14
      "HT DSS/CCK mode in 40MHz", HFILL }},
49629
49630
14
    {&hf_ieee80211_ht_reserved_b13,
49631
14
     {"Reserved", "wlan.ht.capabilities.info_reserved_b13",
49632
14
      FT_UINT16, BASE_HEX, NULL, 0x2000,
49633
14
      NULL, HFILL }},
49634
49635
14
    {&hf_ieee80211_ht_40_mhz_intolerant,
49636
14
     {"HT Forty MHz Intolerant", "wlan.ht.capabilities.40mhzintolerant",
49637
14
      FT_BOOLEAN, 16, TFS(&ht_40_mhz_intolerant_flag), 0x4000,
49638
14
      NULL, HFILL }},
49639
49640
14
    {&hf_ieee80211_ht_reserved_b15,
49641
14
     {"Reserved", "wlan.ht.capabilities.info_reserved_b15",
49642
14
      FT_UINT16, BASE_HEX, NULL, 0x8000,
49643
14
      NULL, HFILL }},
49644
49645
14
    {&hf_ieee80211_ext_bss_mu_mimo_capable_sta_count,
49646
14
     {"MU-MIMO Capable STA Count", "wlan.ext_bss.mu_mimo_capable_sta_count",
49647
14
      FT_UINT16, BASE_DEC, NULL, 0,
49648
14
      NULL, HFILL }},
49649
49650
14
    {&hf_ieee80211_ext_bss_ss_underutilization,
49651
14
     {"Spatial Stream Underutilization", "wlan.ext_bss.ss_underutilization",
49652
14
      FT_UINT8, BASE_HEX, NULL, 0,
49653
14
      NULL, HFILL }},
49654
49655
14
    {&hf_ieee80211_ext_bss_observable_sec_20mhz_utilization,
49656
14
     {"Observable Secondary 20MHz Utilization", "wlan.ext_bss.observable_sec_20mhz_utilization",
49657
14
      FT_UINT8, BASE_HEX, NULL, 0,
49658
14
      NULL, HFILL }},
49659
49660
14
    {&hf_ieee80211_ext_bss_observable_sec_40mhz_utilization,
49661
14
     {"Observable Secondary 40MHz Utilization", "wlan.ext_bss.observable_sec_40mhz_utilization",
49662
14
      FT_UINT8, BASE_HEX, NULL, 0,
49663
14
      NULL, HFILL }},
49664
49665
14
    {&hf_ieee80211_ext_bss_observable_sec_80mhz_utilization,
49666
14
     {"Observable Secondary 80MHz Utilization", "wlan.ext_bss.observable_sec_80mhz_utilization",
49667
14
      FT_UINT8, BASE_HEX, NULL, 0,
49668
14
      NULL, HFILL }},
49669
49670
14
    {&hf_ieee80211_wide_bw_new_channel_width,
49671
14
     {"New Channel Width", "wlan.wide_bw.new_channel_width",
49672
14
      FT_UINT8, BASE_HEX, VALS(vht_operation_info_channel_width), 0x0,
49673
14
      NULL, HFILL }},
49674
49675
14
    {&hf_ieee80211_wide_bw_new_channel_center_freq_segment0,
49676
14
     {"New Channel Center Frequency Segment 0", "wlan.wide_bw.new_channel_center_freq_segment0",
49677
14
      FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
49678
14
      NULL, HFILL }},
49679
49680
14
    {&hf_ieee80211_wide_bw_new_channel_center_freq_segment1,
49681
14
     {"New Channel Center Frequency Segment 1", "wlan.wide_bw.new_channel_center_freq_segment1",
49682
14
      FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
49683
14
      NULL, HFILL }},
49684
49685
14
    {&hf_ieee80211_operat_notification_mode,
49686
14
     {"Operating Mode Notification", "wlan.operat_notification_mode",
49687
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
49688
14
      NULL, HFILL }},
49689
49690
14
    {&hf_ieee80211_operat_mode_field_channel_width,
49691
14
     {"Channel Width", "wlan.operat_mode_field.channelwidth",
49692
14
      FT_UINT8, BASE_HEX, NULL, 0x03,
49693
14
      NULL, HFILL }},
49694
49695
14
    {&hf_ieee80211_operat_mode_field_160_80plus80_bw,
49696
14
     {"160/80+80 BW", "wlan.operat_mode_field.160_80plus80_bw",
49697
14
      FT_UINT8, BASE_HEX, NULL, 0x04,
49698
14
      NULL, HFILL }},
49699
49700
14
    {&hf_ieee80211_operat_mode_field_no_ldpc,
49701
14
     {"No LDPC", "wlan.operat_mode_field.no_ldpc",
49702
14
      FT_UINT8, BASE_HEX, NULL, 0x08,
49703
14
      NULL, HFILL }},
49704
49705
14
    {&hf_ieee80211_operat_mode_field_rxnss,
49706
14
     {"Rx NSS", "wlan.operat_mode_field.rxnss",
49707
14
      FT_UINT8, BASE_HEX, VALS(operat_mode_field_rxnss), 0x70,
49708
14
      NULL, HFILL }},
49709
49710
14
    {&hf_ieee80211_operat_mode_field_rxnsstype,
49711
14
     {"Rx NSS Type", "wlan.operat_mode_field.rxnsstype",
49712
14
      FT_UINT8, BASE_HEX, NULL, 0x80,
49713
14
      "Indicate that the Rx NSS subfield carries the maximum number of spatial streams that the STA can receive", HFILL }},
49714
49715
14
     {&hf_ieee80211_tbtt_info,
49716
14
      {"TBTT Information Field", "wlan.rnr.tbtt_info",
49717
14
       FT_UINT16, BASE_DEC, NULL, 0x03, NULL, HFILL }},
49718
49719
14
     {&hf_ieee80211_tbtt_filtered_nap,
49720
14
      {"TBTT Filtered Neighbor AP", "wlan.rnr.tbtt_info.fna",
49721
14
       FT_UINT16, BASE_DEC, NULL, 1<<2, NULL, HFILL }},
49722
49723
14
     {&hf_ieee80211_tbtt_info_count,
49724
14
      {"TBTT Information Count", "wlan.rnr.tbtt_info.info_count",
49725
14
       FT_UINT16, BASE_DEC, NULL, 0xf<<4, NULL, HFILL }},
49726
49727
14
     {&hf_ieee80211_tbtt_info_length,
49728
14
      {"TBTT Information Length", "wlan.rnr.tbtt_info.info_len",
49729
14
       FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(tbtt_info_length),
49730
14
       0xff<<8, NULL, HFILL }},
49731
49732
14
     {&hf_ieee80211_tbtt_operating_class,
49733
14
      {"Operating Class", "wlan.rnr.tbtt_info.operating_class",
49734
14
       FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
49735
49736
14
     {&hf_ieee80211_tbtt_channel_number,
49737
14
      {"Channel Number", "wlan.rnr.tbtt_info.channel_num",
49738
14
       FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
49739
49740
14
     {&hf_ieee80211_tbtt_offset,
49741
14
      {"Neighbor AP TBTT Offset", "wlan.rnr.tbtt_info.tbtt_offset",
49742
14
       FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
49743
49744
14
     {&hf_ieee80211_tbtt_bssid,
49745
14
      {"BSSID", "wlan.rnr.tbtt_info.bssid",
49746
14
       FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
49747
49748
14
    {&hf_ieee80211_tbtt_short_ssid,
49749
14
      {"Short SSID", "wlan.rnr.tbtt_info.sh_ssid",
49750
14
       FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
49751
49752
14
    {&hf_ieee80211_rnr_bss_params,
49753
14
     {"BSS Parameters", "wlan.rnr.tbtt_info.bss_parameters",
49754
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
49755
49756
14
    {&hf_ieee80211_rnr_oct_recommended,
49757
14
     {"OCT Recommended", "wlan.rnr.tbtt_info.bss_parameters.oct_recommended",
49758
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
49759
49760
14
    {&hf_ieee80211_rnr_same_ssid,
49761
14
     {"Same SSID", "wlan.rnr.tbtt_info.bss_parameters.same_ssid",
49762
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
49763
49764
14
    {&hf_ieee80211_rnr_multiple_bssid,
49765
14
     {"Multiple BSSID", "wlan.rnr.tbtt_info.bss_parameters.multiple_bssid",
49766
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
49767
49768
14
    {&hf_ieee80211_rnr_transmitted_bssid,
49769
14
     {"Transmitted BSSID", "wlan.rnr.tbtt_info.bss_parameters.transmitted_bssid",
49770
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
49771
49772
14
    {&hf_ieee80211_rnr_ess_with_colocated_ap,
49773
14
     {"Member of ESS with 2.4/5 GHz Co-Located AP",
49774
14
      "wlan.rnr.tbtt_info.bss_parameters.member_of_ess_with_2p4_5_ghz_colocated_ap",
49775
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
49776
49777
14
    {&hf_ieee80211_rnr_unsolicited_probe_responses,
49778
14
     {"Unsolicited Probe Responses",
49779
14
      "wlan.rnr.tbtt_info.bss_parameters.unsolicited_probe_responses",
49780
14
      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
49781
49782
14
    {&hf_ieee80211_rnr_same_colocated_ap,
49783
14
     {"Co-Located AP", "wlan.rnr.tbtt_info.bss_parameters.colocated_ap",
49784
14
      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
49785
49786
14
    {&hf_ieee80211_rnr_same_reserved,
49787
14
     {"Reserved", "wlan.rnr.tbtt_info.bss_parameters.reserved",
49788
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
49789
49790
14
    {&hf_ieee80211_rnr_20mhz_psd_subfield,
49791
14
     {"PSD Subfield", "wlan.rnr.tbtt_info.psd_subfield",
49792
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(tpe_psd_custom), 0, NULL, HFILL }},
49793
49794
14
    {&hf_ieee80211_rnr_reserved_data,
49795
14
     {"Reserved", "wlan.rnr.tbtt_info.reserved",
49796
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
49797
49798
14
    {&hf_ieee80211_rnr_mld_params,
49799
14
     {"MLD Parameters", "wlan.rnr.tbtt_info.mld_parameters",
49800
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
49801
49802
14
    {&hf_ieee80211_rnr_mld_id,
49803
14
     {"MLD ID", "wlan.rnr.tbtt_info.mld_parameters.mld_id",
49804
14
      FT_UINT24, BASE_HEX, NULL, 0x0000FF, NULL, HFILL }},
49805
49806
14
    {&hf_ieee80211_rnr_mld_link_id,
49807
14
     {"Link ID", "wlan.rnr.tbtt_info.mld_parameters.link_id",
49808
14
      FT_UINT24, BASE_HEX, NULL, 0x000F00, NULL, HFILL }},
49809
49810
14
    {&hf_ieee80211_rnr_mld_bss_params_change_count,
49811
14
     {"BSS Parameters Change Count",
49812
14
      "wlan.rnr.tbtt_info.mld_parameters.bss_params_change_count",
49813
14
      FT_UINT24, BASE_HEX, NULL, 0x0FF000, NULL, HFILL }},
49814
49815
14
    {&hf_ieee80211_rnr_mld_all_updates_included,
49816
14
     {"All Updates Included",
49817
14
      "wlan.rnr.tbtt_info.mld_parameters.all_updates_included",
49818
14
      FT_BOOLEAN, 24, NULL, 0x100000, NULL, HFILL }},
49819
49820
14
    {&hf_ieee80211_rnr_mld_disabled_link_indication,
49821
14
     {"Disabled Link Indication",
49822
14
      "wlan.rnr.tbtt_info.mld_parameters.disabled_link_indication",
49823
14
      FT_BOOLEAN, 24, NULL, 0x200000, NULL, HFILL }},
49824
49825
14
    {&hf_ieee80211_rnr_mld_reserved,
49826
14
     {"Reserved", "wlan.rnr.tbtt_info.mld_parameters.reserved",
49827
14
      FT_UINT24, BASE_HEX, NULL, 0xC00000, NULL, HFILL }},
49828
49829
14
    {&hf_ieee80211_s1g_cap_byte1,
49830
14
     {"S1G Capabilities Byte 1", "wlan.s1g.capabilities.byte1",
49831
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49832
49833
14
    {&hf_ieee80211_s1g_cap_byte2,
49834
14
     {"S1G Capabilities Byte 2", "wlan.s1g.capabilities.byte2",
49835
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49836
49837
14
    {&hf_ieee80211_s1g_cap_byte3,
49838
14
     {"S1G Capabilities Byte 3", "wlan.s1g.capabilities.byte3",
49839
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49840
49841
14
    {&hf_ieee80211_s1g_cap_byte4,
49842
14
     {"S1G Capabilities Byte 4", "wlan.s1g.capabilities.byte4",
49843
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49844
49845
14
    {&hf_ieee80211_s1g_cap_byte5,
49846
14
     {"S1G Capabilities Byte 5", "wlan.s1g.capabilities.byte5",
49847
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49848
49849
14
    {&hf_ieee80211_s1g_cap_byte6,
49850
14
     {"S1G Capabilities Byte 6", "wlan.s1g.capabilities.byte6",
49851
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49852
49853
14
    {&hf_ieee80211_s1g_cap_byte7,
49854
14
     {"S1G Capabilities Byte 7", "wlan.s1g.capabilities.byte7",
49855
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49856
49857
14
    {&hf_ieee80211_s1g_cap_byte8,
49858
14
     {"S1G Capabilities Byte 8", "wlan.s1g.capabilities.byte8",
49859
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49860
49861
14
    {&hf_ieee80211_s1g_cap_byte9,
49862
14
     {"S1G Capabilities Byte 9", "wlan.s1g.capabilities.byte9",
49863
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49864
49865
14
    {&hf_ieee80211_beacon_sequence,
49866
14
     {"Beacon Sequence", "wlan.s1g.beacon_sequence",
49867
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
49868
49869
14
    {&hf_ieee80211_pentapartial_timestamp,
49870
14
     {"Pentapartial Timestamp", "wlan.s1g.pentapartial_timestamp",
49871
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49872
49873
14
    {&hf_ieee80211_tack_next_twt_info,
49874
14
     {"Next TWT Info/Suspend Duration", "wlan.s1g.next_twt_info",
49875
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49876
49877
14
    {&hf_ieee80211_tack_next_twt,
49878
14
     {"Next TWT", "wlan.s1g.next_twt",
49879
14
      FT_UINT40, BASE_HEX, NULL, 0x1FFFFFFFFF, NULL, HFILL }},
49880
49881
14
    {&hf_ieee80211_tack_flow_identifier,
49882
14
     {"TWT Flow Identifier", "wlan.s1g.twt_flow_identifier",
49883
14
      FT_UINT40, BASE_HEX, NULL, 0xE000000000, NULL, HFILL }},
49884
49885
14
    {&hf_ieee80211_s1g_cap_byte10,
49886
14
     {"S1G Capabilities Byte 10", "wlan.s1g.capabilities.byte10",
49887
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
49888
49889
14
    {&hf_ieee80211_s1g_cap_s1g_long_support,
49890
14
     {"S1G_LONG Support", "wlan.s1g.capabilities.s1g_long_support",
49891
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
49892
49893
14
    {&hf_ieee80211_s1g_cap_short_gi_for_1_mhz,
49894
14
     {"Short GI for 1MHz", "wlan.s1g.capabilities.short_gi_for_1_mhz",
49895
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
49896
49897
14
    {&hf_ieee80211_s1g_cap_short_gi_for_2_mhz,
49898
14
     {"Short GI for 2MHz", "wlan.s1g.capabilities.short_gi_for_2_mhz",
49899
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
49900
49901
14
    {&hf_ieee80211_s1g_cap_short_gi_for_4_mhz,
49902
14
     {"Short GI for 4MHz", "wlan.s1g.capabilities.short_gi_for_4_mhz",
49903
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
49904
49905
14
    {&hf_ieee80211_s1g_cap_short_gi_for_8_mhz,
49906
14
     {"Short GI for 8MHz", "wlan.s1g.capabilities.short_gi_for_8_mhz",
49907
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
49908
49909
14
    {&hf_ieee80211_s1g_cap_short_gi_for_16_mhz,
49910
14
     {"Short GI for 16MHz", "wlan.s1g.capabilities.short_gi_for_16_mhz",
49911
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
49912
49913
14
    {&hf_ieee80211_s1g_cap_supported_channel_width,
49914
14
     {"Supported Channel Width", "wlan.s1g.capabilities.supported_channel_width",
49915
14
      FT_UINT8, BASE_HEX, VALS(s1g_supported_channel_width_vals), 0xC0,
49916
14
      NULL, HFILL }},
49917
49918
14
    {&hf_ieee80211_s1g_cap_rx_ldpc,
49919
14
     {"Rx LDPC", "wlan.s1g.capabilities.rx_ldpc",
49920
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
49921
49922
14
    {&hf_ieee80211_s1g_cap_tx_stbc,
49923
14
     {"Tx STBC", "wlan.s1g.capabilities.tx_stbc",
49924
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
49925
49926
14
    {&hf_ieee80211_s1g_cap_rx_stbc,
49927
14
     {"Rx STBC", "wlan.s1g.capabilities.rx_stbc",
49928
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
49929
49930
14
    {&hf_ieee80211_s1g_cap_su_beamformer_capable,
49931
14
     {"SU Beamformer Capable", "wlan.s1g.capabilities.su_beamformer_capable",
49932
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
49933
49934
14
    {&hf_ieee80211_s1g_cap_su_beamformee_capable,
49935
14
     {"SU Beamformee Capable", "wlan.s1g.capabilities.su_beamformee_capable",
49936
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
49937
49938
14
    {&hf_ieee80211_s1g_cap_beamformee_sts_capability,
49939
14
     {"Beamformee STS Capability", "wlan.s1g.capabilities.sts_beamformee_capability",
49940
14
      FT_UINT8, BASE_DEC, NULL, 0xE0, NULL, HFILL }},
49941
49942
14
    {&hf_ieee80211_s1g_cap_number_sounding_dimensions,
49943
14
     {"Number of Sounding Dimensions", "wlan.s1g.capabilities.number_sounding_dimensions",
49944
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
49945
49946
14
    {&hf_ieee80211_s1g_cap_mu_beamformer_capable,
49947
14
     {"MU Beamformer Capable", "wlan.s1g.capabilities.beamformer_capable",
49948
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
49949
49950
14
    {&hf_ieee80211_s1g_cap_mu_beamformee_capable,
49951
14
     {"MU Beamformee Capable", "wlan.s1g.capabilities.beamformee_capable",
49952
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
49953
49954
14
    {&hf_ieee80211_s1g_cap_htc_vht_capable,
49955
14
     {"+HTC-VHT Capable", "wlan.s1g.capabilities.htc_vht_capable",
49956
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
49957
49958
14
    {&hf_ieee80211_s1g_cap_travelling_pilot_support,
49959
14
     {"Traveling Pilot Support", "wlan.s1g.capabilities.traveling_pilot_support",
49960
14
      FT_UINT8, BASE_HEX, VALS(s1g_traveling_pilot_support_vals), 0xC0,
49961
14
      NULL, HFILL }},
49962
49963
14
    {&hf_ieee80211_s1g_cap_rd_responder,
49964
14
     {"RD Responder", "wlan.s1g.capabilities.rd_responder",
49965
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
49966
49967
14
    {&hf_ieee80211_s1g_cap_ht_delayed_block_ack,
49968
14
     {"HT Delayed Block Ack", "wlan.s1g.capabilities.ht_delayed_block_ack",
49969
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
49970
49971
14
    {&hf_ieee80211_s1g_cap_maximum_mpdu_length,
49972
14
     {"Maximum MPDU Length", "wlan.s1g.capabilities.max_mpdu_length",
49973
14
      FT_UINT8, BASE_DEC, VALS(s1g_max_mpdu_length_vals), 0x04, NULL, HFILL }},
49974
49975
14
    {&hf_ieee80211_s1g_cap_maximum_a_mpdu_length_exp,
49976
14
     {"Maximum A-MPDU Length Exponent", "wlan.s1g.capabilities.max_a_mpdu_length_exp",
49977
14
      FT_UINT8, BASE_DEC, NULL, 0x18, NULL, HFILL }},
49978
49979
14
    {&hf_ieee80211_s1g_cap_minimum_mpdu_start_spacing,
49980
14
     {"Minimum MPDU Start Spacing", "wlan.s1g.capabilities.min_mpdu_start_spacing",
49981
14
      FT_UINT8, BASE_DEC, VALS(s1g_min_mpdu_start_spacing_vals), 0xE0,
49982
14
      NULL, HFILL }},
49983
49984
14
    {&hf_ieee80211_s1g_cap_uplink_sync_capable,
49985
14
     {"Uplink Sync Capable", "wlan.s1g.capabilities.uplink_sync_capable",
49986
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
49987
49988
14
    {&hf_ieee80211_s1g_cap_dynamic_aid,
49989
14
     {"Dynamic AID", "wlan.s1g.capabilities.dynamic_aid",
49990
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
49991
49992
14
    {&hf_ieee80211_s1g_cap_bat_support,
49993
14
     {"BAT Support", "wlan.s1g.capabilities.bat_support",
49994
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
49995
49996
14
    {&hf_ieee80211_s1g_cap_tim_ade_support,
49997
14
     {"TIM AID Support", "wlan.s1g.capabilities.tim_aid_support",
49998
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
49999
50000
14
    {&hf_ieee80211_s1g_cap_non_tim_support,
50001
14
     {"Non TIM Support", "wlan.s1g.capabilities.non_tim_support",
50002
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
50003
50004
14
    {&hf_ieee80211_s1g_cap_group_aid_support,
50005
14
     {"Group AID Support", "wlan.s1g.capabilities.group_aid_support",
50006
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
50007
50008
14
    {&hf_ieee80211_s1g_cap_sta_type_support,
50009
14
     {"STA Type Support", "wlan.s1g.capabilities.sta_type_support",
50010
14
      FT_UINT8, BASE_HEX, VALS(s1g_sta_type_support_vals), 0xC0, NULL, HFILL }},
50011
50012
14
    {&hf_ieee80211_s1g_cap_centralized_authentication_control,
50013
14
     {"Centralized Authentication Control", "wlan.s1g.capabilities.centralized_authentication_control",
50014
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
50015
50016
14
    {&hf_ieee80211_s1g_cap_distributed_authentication_control,
50017
14
     {"Distributed Authentication Control", "wlan.s1g.capabilities.distributed_authentication_control",
50018
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
50019
50020
14
    {&hf_ieee80211_s1g_cap_a_msdu_support,
50021
14
     {"A-MSDU Supported", "wlan.s1g.capabilities.a_msdu_supported",
50022
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
50023
50024
14
    {&hf_ieee80211_s1g_cap_a_mpdu_support,
50025
14
     {"A-MPDU Support", "wlan.s1g.capabilities.a_mpdu_support",
50026
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
50027
50028
14
    {&hf_ieee80211_s1g_cap_asymmetic_block_ack_support,
50029
14
     {"Asymmetric Block Ack Supported", "wlan.s1g.capabilities.asymmetric_block_ack_supported",
50030
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
50031
50032
14
    {&hf_ieee80211_s1g_cap_flow_control_support,
50033
14
     {"Flow Control Supported", "wlan.s1g.capabilities.flow_control_supported",
50034
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
50035
50036
14
    {&hf_ieee80211_s1g_cap_sectorized_beam_capable,
50037
14
     {"Sectorized Beam Capable", "wlan.s1g.capabilities.sectorized_beam_capable",
50038
14
      FT_UINT8, BASE_HEX, VALS(s1g_sectorized_beam_capable_vals), 0xC0,
50039
14
      NULL, HFILL }},
50040
50041
14
    {&hf_ieee80211_s1g_cap_obss_mitigation_support,
50042
14
     {"OBSS Mitigation Support", "wlan.s1g.capabilities.obss_mitigation_support",
50043
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
50044
50045
14
    {&hf_ieee80211_s1g_cap_fragment_ba_support,
50046
14
     {"Fragment BA Support", "wlan.s1g.capabilities.fragment_ba_support",
50047
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
50048
50049
14
    {&hf_ieee80211_s1g_cap_ndp_ps_poll_supported,
50050
14
     {"NDS PS-Poll Supported", "wlan.s1g.capabilities.nds_ps_poll_supported",
50051
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
50052
50053
14
    {&hf_ieee80211_s1g_cap_raw_operation_support,
50054
14
     {"Raw Operation Support", "wlan.s1g.capabilities.raw_operation_support",
50055
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
50056
50057
14
    {&hf_ieee80211_s1g_cap_page_slicing_support,
50058
14
     {"Page Slicing Support", "wlan.s1g.capabilities.page_slicing_support",
50059
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
50060
50061
14
    {&hf_ieee80211_s1g_cap_txop_sharing_implicit_ack_support,
50062
14
     {"TXOP Sharing Implicit Ack Support", "wlan.s1g.capabilities.txop_sharing_implicit_ack_support",
50063
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
50064
50065
14
    {&hf_ieee80211_s1g_cap_vht_link_adaptation_capable,
50066
14
     {"VHT Link Adaptation Capable", "wlan.s1g.capabilities.vht_link_adaptation_capable",
50067
14
      FT_UINT8, BASE_HEX, VALS(s1g_vht_link_adaptation_vals), 0xC0,
50068
14
      NULL, HFILL}},
50069
50070
14
    {&hf_ieee80211_s1g_cap_tack_support_as_ps_poll_response,
50071
14
     {"TACK Support as PS-Poll Response", "wlan.s1g.capabilities.tack_support_as_ps_poll_response",
50072
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
50073
50074
14
    {&hf_ieee80211_s1g_cap_duplicate_1_mhz_support,
50075
14
     {"Duplicate 1 MHz Support", "wlan.s1g.capabilities.duplicate_1_mhz_support",
50076
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
50077
50078
14
    {&hf_ieee80211_s1g_cap_mcs_negotiation_support,
50079
14
     {"MCS Negotiation Support", "wlan.s1g.capabilities.ms_negotiation_support",
50080
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
50081
50082
14
    {&hf_ieee80211_s1g_cap_1_mhz_control_response_preamble_support,
50083
14
     {"1 MHz Control Response Preamble Supported",
50084
14
      "wlan.s1g.capabilities.1_mhz_control_response_preamble_supported",
50085
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
50086
50087
14
    {&hf_ieee80211_s1g_cap_ndp_beamforming_report_poll_support,
50088
14
     {"NDP Beamforming Report Poll Supported",
50089
14
      "wlan.s1g.capabilities.ndp_beamforming_report_poll_supported",
50090
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
50091
50092
14
    {&hf_ieee80211_s1g_cap_unsolicited_dynamic_aid,
50093
14
     {"Unsolicited Dynamic AID", "wlan.s1g.capabilities.unsolicited_dynamic_aid",
50094
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
50095
50096
14
    {&hf_ieee80211_s1g_cap_sector_training_operation_supported,
50097
14
     {"Sector Training Operation Supported",
50098
14
      "wlan.s1g.capabilities.sector_training_operation_supported",
50099
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL }},
50100
50101
14
    {&hf_ieee80211_s1g_cap_temporary_ps_mode_switch,
50102
14
     {"Temporary PS Mode Switch",
50103
14
      "wlan.s1g.capabilities.temporary_ps_mode_switch",
50104
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL }},
50105
50106
14
    {&hf_ieee80211_s1g_cap_twt_grouping_support,
50107
14
     {"TWT Grouping Support", "wlan.s1g.capabilities.twt_grouping_support",
50108
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
50109
50110
14
    {&hf_ieee80211_s1g_cap_bdt_capable,
50111
14
     {"BDT Capable", "wlan.s1g.capabilities.bdt_capable",
50112
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
50113
50114
14
    {&hf_ieee80211_s1g_cap_color,
50115
14
     {"COLOR", "wlan.s1g.capabilities.color",
50116
14
      FT_UINT8, BASE_DEC, NULL, 0x1C, NULL, HFILL }},
50117
50118
14
    {&hf_ieee80211_s1g_cap_twt_requester_support,
50119
14
     {"TWT Requester Support", "wlan.s1g.capabilities.twt_requester_support",
50120
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
50121
50122
14
    {&hf_ieee80211_s1g_cap_twt_responder_support,
50123
14
     {"TWT Responder Support", "wlan.s1g.capabilities.twt_responder_support",
50124
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL }},
50125
50126
14
    {&hf_ieee80211_s1g_cap_pv1_frame_support,
50127
14
     {"PV1 Frame Support", "wlan.s1g.capabilities.pv1_frame_support",
50128
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80, NULL, HFILL }},
50129
50130
14
    {&hf_ieee80211_s1g_cap_link_adaptation_per_normal_control_response_capable,
50131
14
     {"Link Adaptation per Normal Control Response Capable",
50132
14
      "wlan.s1g.capabilities.link_adaptation_per_normal_control_response_capable",
50133
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
50134
50135
14
    {&hf_ieee80211_s1g_cap_reserved,
50136
14
     {"Reserved", "wlan.s1g.capabilities.reserved",
50137
14
      FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
50138
50139
14
    {&hf_ieee80211_s1g_mcs_and_nss_set,
50140
14
     {"Supported S1G-MCS and NSS Set", "wlan.s1g.supported_mcs_nss_set",
50141
14
      FT_UINT40, BASE_HEX, NULL, 0, NULL, HFILL }},
50142
50143
14
    {&hf_ieee80211_s1g_rx_s1g_mcs_map,
50144
14
     {"Rx S1G-MCS Map", "wlan.s1g.supported_mcs_nss_set.rx_s1g_mcs_map",
50145
14
      FT_UINT40, BASE_HEX, NULL, 0x00000000FF, NULL, HFILL }},
50146
50147
14
    {&hf_ieee80211_s1g_rx_highest_supported_long_gi_data_rate,
50148
14
     {"Rx Highest Supported Long GI Data Rate",
50149
14
      "wlan.s1g.supported_mcs_nss_set.rx_highest_supported_long_gi_data_rate",
50150
14
     FT_UINT40, BASE_HEX, NULL, 0x000001FF00, NULL, HFILL }},
50151
50152
14
    {&hf_ieee80211_s1g_tx_s1g_mcs_map,
50153
14
     {"Tx S1G-MCS Map", "wlan.s1g.supported_mcs_nss_set.tx_s1g_mcs_map",
50154
14
      FT_UINT40, BASE_HEX, NULL, 0x0001FE0000, NULL, HFILL }},
50155
50156
14
    {&hf_ieee80211_s1g_tx_highest_supported_long_gi_data_rate,
50157
14
     {"Tx Highest Supported Long GI Data Rate",
50158
14
      "wlan.s1g.supported_mcs_nss_set.tx_highest_supported_long_gi_data_rate",
50159
14
      FT_UINT40, BASE_HEX, NULL, 0x03FE000000, NULL, HFILL }},
50160
50161
14
    {&hf_ieee80211_s1g_rx_single_spatial_stream_map_for_1_mhz,
50162
14
     {"Rx Single Spatial Stream and S1G-MCS Map for 1MHz",
50163
14
      "wlan.s1g.supported_mcs_nss_set.rx_single_spatial_stream_1_mhz",
50164
14
      FT_UINT40, BASE_HEX, NULL, 0x0C00000000, NULL, HFILL }},
50165
50166
14
    {&hf_ieee80211_s1g_tx_single_spatial_stream_map_for_1_mhz,
50167
14
     {"Tx Single Spatial Stream and S1G-MCS Map for 1MHz",
50168
14
      "wlan.s1g.supported_mcs_nss_set.tx_single_spatial_stream_1_mhz",
50169
14
      FT_UINT40, BASE_HEX, NULL, 0x3000000000, NULL, HFILL }},
50170
50171
14
    {&hf_ieee80211_s1g_mcs_and_nss_reserved,
50172
14
     {"Reserved", "wlan.s1g.supported_mcs_nss_set.reserved",
50173
14
     FT_UINT40, BASE_HEX, NULL, 0xC000000000, NULL, HFILL }},
50174
50175
14
    {&hf_ieee80211_s1g_subchannel_selective_transmission,
50176
14
     {"Channel Activity Schedule", "wlan.sst.channel_activity_schedule",
50177
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
50178
50179
14
    {&hf_ieee80211_s1g_sst_sounding_option,
50180
14
     {"Sounding Option", "wlan.sst.channel_activity_schedule.sounding_option",
50181
14
      FT_UINT32, BASE_HEX, NULL, 0x00000001, NULL, HFILL }},
50182
50183
14
    {&hf_ieee80211_s1g_channel_activity_bitmap,
50184
14
     {"Channel Activity Bitmap", "wlan.sst.channel_activity_schedule.channel_activity_bitmap",
50185
14
      FT_UINT32, BASE_HEX, NULL, 0x000001FE, NULL, HFILL }},
50186
50187
14
    {&hf_ieee80211_s1g_ul_activity,
50188
14
     {"UL Activity", "wlan.sst.channel_activity_schedule.ul_activity",
50189
14
      FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL }},
50190
50191
14
    {&hf_ieee80211_s1g_dl_activity,
50192
14
     {"DL Activity", "wlan.sst.channel_activity_schedule.dl_activity",
50193
14
      FT_BOOLEAN, 32, NULL, 0x00000400, NULL, HFILL }},
50194
50195
14
    {&hf_ieee80211_s1g_max_trans_width,
50196
14
     {"Maximum Transmission Width", "wlan.sst.channel_activity_schedule.max_trans_width",
50197
14
      FT_UINT32, BASE_DEC, VALS(max_trans_width_vals),
50198
14
      0x00001800, NULL, HFILL }},
50199
50200
14
    {&hf_ieee80211_s1g_activity_start_time,
50201
14
     {"Activity Start Time", "wlan.sst.channel_activity_schedule.activity_start_time",
50202
14
      FT_UINT32, BASE_DEC, NULL, 0xFFFFE000, NULL, HFILL }},
50203
50204
14
    {&hf_ieee80211_s1g_sst_sounding_option1,
50205
14
     {"Sounding Option", "wlan.sst.channel_activity_schedule.sounding_option",
50206
14
      FT_UINT16, BASE_HEX, NULL, 0x0001, NULL, HFILL }},
50207
50208
14
    {&hf_ieee80211_s1g_channel_activity_bitmap1,
50209
14
     {"Channel Activity Bitmap", "wlan.sst.channel_activity_schedule.channel_activity_bitmap",
50210
14
      FT_UINT16, BASE_HEX, NULL, 0x01FE, NULL, HFILL }},
50211
50212
14
    {&hf_ieee80211_s1g_sounding_start_time_present,
50213
14
     {"Sounding Start Time Present", "wlan.sst.channel_activity_schedule.sounding_start_time_present",
50214
14
      FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL }},
50215
50216
14
    {&hf_ieee80211_s1g_channel_activity_reserved,
50217
14
     { "Reserved", "wlan.sst.channel_activity_schedule.reserved",
50218
14
      FT_UINT16, BASE_HEX, NULL, 0x3C00, NULL, HFILL }},
50219
50220
14
    {&hf_ieee80211_s1g_max_trans_width1,
50221
14
     {"Maximum Transmission Width", "wlan.sst.channel_activity_schedule.max_trans_width",
50222
14
      FT_UINT16, BASE_DEC, VALS(max_trans_width_vals),
50223
14
      0xC000, NULL, HFILL }},
50224
50225
14
    {&hf_ieee80211_s1g_sounding_start_time,
50226
14
     {"Sounding Start Time",
50227
14
      "wlan.sst.channel_activity_schedule.sounding_start_time",
50228
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
50229
50230
14
    {&hf_ieee80211_s1g_open_loop_link_margin,
50231
14
     {"Open-Loop Link Margin Index", "wlan.s1g.open_loop_link_margin_index",
50232
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(s1g_open_loop_link_margin_custom),
50233
14
      0x0, NULL, HFILL }},
50234
50235
14
    {&hf_ieee80211_s1g_raw_control,
50236
14
     {"RAW Control", "wlan.s1g.rps.raw_control",
50237
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50238
50239
14
    {&hf_ieee80211_s1g_raw_type,
50240
14
     {"RAW Type", "wlan.s1g.rps.raw_control.raw_type",
50241
14
      FT_UINT8, BASE_DEC, VALS(s1g_raw_control_raw_type), 0x03, NULL, HFILL }},
50242
50243
14
    {&hf_ieee80211_s1g_raw_type_options,
50244
14
     {"RAW Type Options", "wlan.s1g.rps.raw_control.raw_type_options",
50245
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(s1g_raw_type_options_custom),
50246
14
      0x0C, NULL, HFILL }},
50247
50248
14
    {&hf_ieee80211_s1g_raw_start_time_indication,
50249
14
     {"Start Time Indication", "wlan.s1g.rps.raw_control.start_time_indication",
50250
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10, NULL, HFILL }},
50251
50252
14
    {&hf_ieee80211_s1g_raw_raw_group_indication,
50253
14
     {"RAW Group Indication", "wlan.s1g.rps.raw_control.raw_group_indication",
50254
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20, NULL, HFILL }},
50255
50256
14
    {&hf_ieee80211_s1g_raw_channel_indication_preference,
50257
14
     {"Channel Indication Preference",
50258
14
      "wlan.s1g.rps.raw_control.channel_indication_preference",
50259
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40, NULL, HFILL }},
50260
50261
14
    {&hf_ieee80211_s1g_raw_periodic_raw_indication,
50262
14
     {"Periodic RAW Indication",
50263
14
      "wlan.s1g.rps.raw_control.periodic_raw_indication",
50264
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80, NULL, HFILL }},
50265
50266
14
    {&hf_ieee80211_s1g_raw_slot_def,
50267
14
     {"RAW Slot Definition", "wlan.s1g.rps.raw_slot_definition",
50268
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50269
50270
14
    {&hf_ieee80211_s1g_slot_def_format_indication,
50271
14
     {"Slot Definition Format Indication",
50272
14
      "wlan.s1g.rps.raw_slot_definition.slot_definition_format_indication",
50273
14
      FT_UINT16, BASE_DEC, NULL, 0x0001, NULL, HFILL }},
50274
50275
14
    {&hf_ieee80211_s1g_slot_def_cross_slot_boundary,
50276
14
     {"Cross Slot Boundary",
50277
14
      "wlan.s1g.rps.raw_slot_definition.cross_slot_boundary",
50278
14
      FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x0002, NULL, HFILL }},
50279
50280
14
    {&hf_ieee80211_s1g_slot_def_slot_duration_count8,
50281
14
     {"Slot Duration Count",
50282
14
      "wlan.s1g.rps.raw_slot_definition.slot_duration_count",
50283
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(s1g_raw_slot_duration_custom), 0x03FC, NULL, HFILL }},
50284
50285
14
    {&hf_ieee80211_s1g_slot_def_num_slots6,
50286
14
     {"Number of Slots",
50287
14
      "wlan.s1g.rps.raw_slot_definition.number_of_slots",
50288
14
      FT_UINT16, BASE_DEC, NULL, 0xFC00, NULL, HFILL }},
50289
50290
14
    {&hf_ieee80211_s1g_slot_def_slot_duration_count11,
50291
14
     {"Slot Duration Count",
50292
14
      "wlan.s1g.rps.raw_slot_definition.slot_duration_count",
50293
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(s1g_raw_slot_duration_custom), 0x1FFC, NULL, HFILL }},
50294
50295
14
    {&hf_ieee80211_s1g_slot_def_num_slots3,
50296
14
     {"Number of Slots",
50297
14
      "wlan.s1g.rps.raw_slot_definition.number_of_slots",
50298
14
      FT_UINT16, BASE_DEC, NULL, 0xE000, NULL, HFILL }},
50299
50300
14
    {&hf_ieee80211_s1g_raw_start_time,
50301
14
     {"RAW Start Time", "wlan.s1g.raw_slot_definition.raw_start_time",
50302
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50303
50304
14
    {&hf_ieee80211_s1g_raw_group_subfield,
50305
14
     {"RAW Group", "wlan.s1g.rps.raw_group",
50306
14
      FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50307
50308
14
    {&hf_ieee80211_s1g_raw_group_page_index,
50309
14
     {"Page Index", "wlan.s1g.rps.raw_group.page_index",
50310
14
      FT_UINT24, BASE_DEC, NULL, 0x000003, NULL, HFILL }},
50311
50312
14
    {&hf_ieee80211_s1g_raw_group_start_aid,
50313
14
     {"RAW Start AID", "wlan.s1g.rps.raw_group.raw_start_aid",
50314
14
      FT_UINT24, BASE_DEC, NULL, 0x001FFC, NULL, HFILL }},
50315
50316
14
    {&hf_ieee80211_s1g_raw_group_end_aid,
50317
14
     {"RAW End AID", "wlan.s1g.rps.raw_group.raw_end_aid",
50318
14
      FT_UINT24, BASE_DEC, NULL, 0xFFE000, NULL, HFILL }},
50319
50320
14
    {&hf_ieee80211_s1g_raw_channel_indication,
50321
14
     {"Channel Indication", "wlan.s1g.rps.channel_indication",
50322
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50323
50324
14
    {&hf_ieee80211_s1g_raw_ci_channel_activity_bitmap,
50325
14
     {"Channel Activity Bitmap",
50326
14
      "wlan.s1g.rps.channel_indication.channel_activity_bitmap",
50327
14
      FT_UINT16, BASE_HEX, NULL, 0x00FF, NULL, HFILL }},
50328
50329
14
    {&hf_ieee80211_s1g_raw_ci_max_trans_width,
50330
14
     {"Maximum Transmission Width",
50331
14
      "wlan.s1g.rps.channel_indication.maximum_transmission_width",
50332
14
      FT_UINT16, BASE_DEC, VALS(max_trans_width_vals), 0x0300, NULL, HFILL }},
50333
50334
14
    {&hf_ieee80211_s1g_raw_ci_ul_activity,
50335
14
     {"UL Activity", "wlan.s1g.rps.channel_indication.ul_activity",
50336
14
      FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL }},
50337
50338
14
    {&hf_ieee80211_s1g_raw_ci_dl_activity,
50339
14
     {"DL Activity", "wlan.s1g.rps.channel_indication.dl_activity",
50340
14
      FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL }},
50341
50342
14
    {&hf_ieee80211_s1g_raw_ci_reserved,
50343
14
     {"Reserved", "wlan.s1g.rps.channel_indication.reserved",
50344
14
      FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL }},
50345
50346
14
    {&hf_ieee80211_s1g_raw_praw_periodicity,
50347
14
     {"PRAW Periodicity",
50348
14
      "wlan.s1g.rps.periodic_operation_parameters.praw_periodicity",
50349
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50350
50351
14
    {&hf_ieee80211_s1g_raw_praw_validity,
50352
14
     {"PRAW Validity",
50353
14
      "wlan.s1g.rps.periodic_operation_parameters.praw_validity",
50354
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50355
50356
14
    {&hf_ieee80211_s1g_raw_praw_start_offset,
50357
14
     {"PRAW Start Offset",
50358
14
      "wlan.s1g.rps.periodic_operation_parameters.praw_start_offset",
50359
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50360
50361
50362
14
    {&hf_ieee80211_s1g_page_slice_page_period,
50363
14
     {"Page Period", "wlan.page_slice.page_period",
50364
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
50365
50366
14
    {&hf_ieee80211_s1g_page_slice_control,
50367
14
     {"Page Slice Control", "wlan.page_slice.page_slice_control",
50368
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
50369
50370
14
    {&hf_ieee80211_s1g_page_slice_page_index,
50371
14
     {"Page Index", "wlan.page_slice.page_slice_control.page_index",
50372
14
      FT_UINT24, BASE_DEC, NULL, 0x000003, NULL, HFILL }},
50373
50374
14
    {&hf_ieee80211_s1g_page_slice_page_slice_length,
50375
14
     {"Page Slice Length", "wlan.page_slice.page_slice_control.page_slice_len",
50376
14
      FT_UINT24, BASE_DEC, NULL, 0x00007C, NULL, HFILL }},
50377
50378
14
    {&hf_ieee80211_s1g_page_slice_page_slice_count,
50379
14
     {"Page Slice Count", "wlan.page_slice.page_slice_control.page_slice_count",
50380
14
      FT_UINT24, BASE_DEC, NULL, 0x000F80, NULL, HFILL }},
50381
50382
14
    {&hf_ieee80211_s1g_page_slice_block_offset,
50383
14
     {"Block Offset", "wlan.page_slice.page_slice_control.block_offset",
50384
14
      FT_UINT24, BASE_DEC, NULL, 0x01F000, NULL, HFILL }},
50385
50386
14
    {&hf_ieee80211_s1g_page_slice_tim_offset,
50387
14
     {"TIM Offset", "wlan.page_slice.page_slice_control.tim_offset",
50388
14
      FT_UINT24, BASE_DEC, NULL, 0x1E0000, NULL, HFILL }},
50389
50390
14
    {&hf_ieee80211_s1g_page_slice_reserved,
50391
14
     {"Reserved", "wlan.page_slice.page_slice_control.reserved",
50392
14
      FT_UINT24, BASE_HEX, NULL, 0xE00000, NULL, HFILL }},
50393
50394
14
    {&hf_ieee80211_s1g_page_slice_page_bitmap,
50395
14
     {"Page Bitmap", "wlan.page_slice.page_bitmap",
50396
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50397
50398
14
    {&hf_ieee80211_s1g_aid_request_mode,
50399
14
     {"AID Request Mode", "wlan.s1g.aid_request.aid_request_mode",
50400
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50401
50402
14
    {&hf_ieee80211_s1g_aid_request_interval_present,
50403
14
     {"AID Request Interval Present",
50404
14
      "wlan.s1g.aid_request.aid_request_mode.aid_request_interval_present",
50405
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01, NULL, HFILL }},
50406
50407
14
    {&hf_ieee80211_s1g_aid_request_per_sta_address_present,
50408
14
     {"Per STA Address Present",
50409
14
      "wlan.s1g.aid_request.aid_request_mode.per_sta_address_present",
50410
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL }},
50411
50412
14
    {&hf_ieee80211_s1g_aid_request_service_characteristic_present,
50413
14
     {"Service Characteristic Present",
50414
14
      "wlan.s1g.aid_request.aid_request_mode.service_characteristic_present",
50415
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL }},
50416
50417
14
    {&hf_ieee80211_s1g_aid_request_non_tim_mode_switch,
50418
14
     {"Non-TIM Mode Switch",
50419
14
      "wlan.s1g.aid_request.aid_request_mode.non_tim_mode_switch",
50420
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08, NULL, HFILL }},
50421
50422
14
    {&hf_ieee80211_s1g_aid_request_tim_mode_switch,
50423
14
     {"TIM Mode Switch",
50424
14
      "wlan.s1g.aid_request.aid_request_mode.tim_mode_switch",
50425
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10, NULL, HFILL }},
50426
50427
14
    {&hf_ieee80211_s1g_aid_request_group_address_present,
50428
14
     {"Group Address Present",
50429
14
      "wlan.s1g.aid_request.aid_request_mode.group_address_present",
50430
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20, NULL, HFILL }},
50431
50432
14
    {&hf_ieee80211_s1g_aid_request_reserved,
50433
14
     {"Reserved", "wlan.s1g.aid_request.aid_request_mode.reserved",
50434
14
      FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL }},
50435
50436
14
    {&hf_ieee80211_s1g_aid_request_interval,
50437
14
     {"AID Request Interval", "wlan.s1g.aid_request.aid_request_interval",
50438
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50439
50440
14
    {&hf_ieee80211_s1g_aid_request_characteristic_sensor,
50441
14
     {"Sensor", "wlan.s1g.aid_request.service_characteristic.sensor",
50442
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
50443
50444
14
    {&hf_ieee80211_s1g_aid_request_characteristic_offload,
50445
14
     {"Offload", "wlan.s1g.aid_request.service_characteristic.offload",
50446
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
50447
50448
14
    {&hf_ieee80211_s1g_aid_request_characteristic_official_service,
50449
14
     {"Critical Service",
50450
14
      "wlan.s1g.aid_request.service_characteristic.critical_service",
50451
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
50452
50453
14
    {&hf_ieee80211_s1g_aid_request_characteristic_reserved,
50454
14
     {"Reserved", "wlan.s1g.aid_request.service_characteristic.reserved",
50455
14
      FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL }},
50456
50457
14
    {&hf_ieee80211_s1g_aid_req_peer_sta_addr,
50458
14
     {"Peer STA Address", "wlan.s1g.aid_request.peer_sta_address",
50459
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50460
50461
14
    {&hf_ieee80211_s1g_aid_request_characteristic,
50462
14
     {"Service Characteristic", "wlan.s1g.aid_request.service_characteristic",
50463
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50464
50465
14
    {&hf_ieee80211_s1g_aid_req_group_addr,
50466
14
     {"Group Mac Address", "wlan.s1g.aid_request.group_mac_address",
50467
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50468
50469
14
    {&hf_ieee80211_s1g_aid_rsp_aid_group_aid,
50470
14
     {"AID/Group AID", "wlan.s1g.aid_response.aid_group_aid",
50471
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50472
50473
14
    {&hf_ieee80211_s1g_aid_rsp_aid_switch_count,
50474
14
     {"AID Switch Count", "wlan.s1g.aid_response.aid_switch_count",
50475
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50476
50477
14
    {&hf_ieee80211_s1g_aid_rsp_aid_response_interval,
50478
14
     {"AID Response Interval", "wlan.s1g.aid_response.aid_response_interval",
50479
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50480
50481
14
    {&hf_ieee80211_s1g_sector_op_control_16b,
50482
14
     {"Sector Operation Control", "wlan.s1g.sector_operation.control",
50483
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50484
50485
14
    {&hf_ieee80211_s1g_sector_op_sectorization_type_b16,
50486
14
     {"Sectorization Type",
50487
14
      "wlan.s1g.sector_operation.control.sectorization_type",
50488
14
      FT_BOOLEAN, 16, TFS(&sectorization_type_tfs), 0x0001, NULL, HFILL }},
50489
50490
14
    {&hf_ieee80211_s1g_sector_op_periodic_training_indicator,
50491
14
     {"Periodic Training Indicator",
50492
14
      "wlan.s1g.sector_operation.control.periodic_training_indicator",
50493
14
      FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL }},
50494
50495
14
    {&hf_ieee80211_s1g_sector_op_training_period,
50496
14
     {"Training Period",
50497
14
      "wlan.s1g.sector_operation.control.training_interval",
50498
14
      FT_UINT16, BASE_DEC, NULL, 0x00FC, NULL, HFILL }},
50499
50500
14
    {&hf_ieee80211_s1g_sector_op_remaining_beacon_interval,
50501
14
     {"Remaining Beacon Interval",
50502
14
      "wlan.s1g.sector_operation.control.remaining_beacon_interval",
50503
14
      FT_UINT16, BASE_DEC, NULL, 0x3F00, NULL, HFILL }},
50504
50505
14
    {&hf_ieee80211_s1g_sector_op_reserved_b16,
50506
14
     {"Reserved", "wlan.s1g.sector_operation.reserved",
50507
14
      FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
50508
50509
14
    {&hf_ieee80211_s1g_sector_op_control,
50510
14
     {"Sector Operation Control", "wlan.s1g.sector_operation.control",
50511
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50512
50513
14
    {&hf_ieee80211_s1g_sector_op_sectorization_type,
50514
14
     {"Sectorization Type",
50515
14
      "wlan.s1g.sector_operation.control.sectorization_type",
50516
14
      FT_BOOLEAN, 8, TFS(&sectorization_type_tfs), 0x01, NULL, HFILL }},
50517
50518
14
    {&hf_ieee80211_s1g_sector_op_period,
50519
14
     {"Period", "wlan.s1g.sector_operation.control.period",
50520
14
      FT_UINT8, BASE_DEC, NULL, 0x7E, NULL, HFILL }},
50521
50522
14
    {&hf_ieee80211_s1g_sector_op_omni,
50523
14
     {"Omni", "wlan.s1g.sector_operation.control.omni",
50524
14
      FT_BOOLEAN, 8, TFS(&sectorization_omni_tfs), 0x80, NULL, HFILL }},
50525
50526
14
    {&hf_ieee80211_s1g_sector_op_group_info,
50527
14
     {"Group Info", "wlan.s1g.sector_operation.group_info",
50528
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50529
50530
14
    {&hf_ieee80211_s1g_short_beacon_interval,
50531
14
     {"Short Beacon Interval", "wlan.sig.short_beacon_interval",
50532
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50533
50534
14
    {&hf_ieee80211_s1g_change_sequence,
50535
14
     {"Change Sequence", "wlan.s1g.change_sequence",
50536
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50537
50538
    /* Need to add a TFS for this and perhaps two versions */
50539
14
    {&hf_ieee80211_s1g_auth_control_control,
50540
14
     {"Control", "wlan.s1g.auth_control.control",
50541
14
      FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL }},
50542
50543
14
    {&hf_ieee80211_s1g_auth_control_deferral,
50544
14
     {"Deferral", "wlan.s1g.auth_control.deferral",
50545
14
      FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL }},
50546
50547
14
    {&hf_ieee80211_s1g_auth_control_reserved,
50548
14
     {"Reserved", "wlan.s1g.auth_control.reserved",
50549
14
      FT_UINT16, BASE_HEX, NULL, 0x003C, NULL, HFILL }},
50550
50551
14
    {&hf_ieee80211_s1g_auth_control_thresh,
50552
14
     {"Authentication Control Threshold", "wlan.s1g.auth_control.threshold",
50553
14
      FT_UINT16, BASE_DEC, NULL, 0xFFC0, NULL, HFILL }},
50554
50555
14
    {&hf_ieee80211_s1g_auth_control_thresh_tus,
50556
14
     {"Authentication Control Threshold", "wlan.s1g.auth_control.threshold",
50557
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_tu_tus),
50558
14
      0xFFC0, NULL, HFILL }},
50559
50560
14
    {&hf_ieee80211_s1g_auth_slot_duration,
50561
14
     {"Authentication Slot Duration", "wlan.s1g.auth_control.slot_duration",
50562
14
      FT_UINT24, BASE_DEC|BASE_UNIT_STRING, UNS(&units_di_dis), 0x0000FE,
50563
14
      NULL, HFILL }},
50564
50565
14
    {&hf_ieee80211_s1g_auth_max_trans_int,
50566
14
     {"Maximum Transmission Interval",
50567
14
      "wlan.s1g.distributed_auth_control.max_xmit_int",
50568
14
      FT_UINT24, BASE_DEC|BASE_UNIT_STRING, UNS(&units_tu_tus), 0x00FF00,
50569
14
      NULL, HFILL }},
50570
50571
14
    {&hf_ieee80211_s1g_auth_min_trans_int,
50572
14
     {"Minimum Transmission Interval",
50573
14
      "wlan.s1g.distributed_auth_control.min_xmit_int",
50574
14
      FT_UINT24, BASE_DEC|BASE_UNIT_STRING, UNS(&units_tu_tus), 0xFF0000,
50575
14
      NULL, HFILL }},
50576
50577
14
    {&hf_ieee80211_s1g_tsf_timer_accuracy,
50578
14
     {"TSF Timer Accuracy", "wlan.s1g.tsf_timer_accuracy",
50579
14
      FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_ppm), 0x0, NULL, HFILL }},
50580
50581
14
    {&hf_ieee80211_s1g_relay_control,
50582
14
     {"Relay Control", "wlan.s1g.relay_control",
50583
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50584
50585
14
    {&hf_ieee80211_s1g_relay_control_rootap_bssid,
50586
14
     {"RootAP BSSID", "wlan.s1g.relay_control.rootap_bssid",
50587
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50588
50589
14
    {&hf_ieee80211_s1g_relay_function_activation_mode,
50590
14
     {"Relay Activation Mode",
50591
14
      "wlan.s1g.relay_activation.relay_activation_mode",
50592
14
      FT_BOOLEAN, 8, TFS(&relay_activation_mode_tfs), 0x01, NULL, HFILL }},
50593
50594
14
    {&hf_ieee80211_s1g_relay_function_direction,
50595
14
     {"Direction", "wlan.s1g.relay_activation.direction",
50596
14
      FT_BOOLEAN, 8, TFS(&relay_direction_tfs), 0x02, NULL, HFILL }},
50597
50598
14
    {&hf_ieee80211_s1g_relay_function_enable_relay_function,
50599
14
     {"Enable Relay Function",
50600
14
      "wlan.s1g.relay_activation.enable_relay_function",
50601
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(enable_relay_function_custom), 0x04,
50602
14
      NULL, HFILL }},
50603
50604
14
    {&hf_ieee80211_s1g_relay_function_stas_present_indic,
50605
14
     {"Number of STAs Presence Indicator",
50606
14
      "wlan.s1g.relay_activation.number_of_stas_presence_indicator",
50607
14
      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
50608
50609
14
    {&hf_ieee80211_s1g_relay_function_reserved,
50610
14
     {"Reserved", "wlan.s1g.relay_activation.reserved",
50611
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
50612
50613
14
    {&hf_ieee80211_s1g_number_of_stas,
50614
14
     {"Number of STAs", "wlan.s1g.relay_activation.number_of_stas",
50615
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50616
50617
14
    {&hf_ieee80211_s1g_initiator_mac_address,
50618
14
     {"Initiator MAC Address",
50619
14
      "wlan.s1g.reachable_address.initiator_mac_address",
50620
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50621
50622
14
    {&hf_ieee80211_s1g_address_count,
50623
14
     {"Address Count", "wlan.s1g.reachable_address.address_count",
50624
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50625
50626
14
    {&hf_ieee80211_s1g_reachable_add_remove,
50627
14
     {"Add/Remove", "wlan.s1g.reachable_address.add_remove",
50628
14
      FT_BOOLEAN, 8, TFS(&reachable_address_add_remove_tfs),
50629
14
      0x01, NULL, HFILL }},
50630
50631
14
    {&hf_ieee80211_s1g_reachable_relay_capable,
50632
14
     {"Relay Capable", "wlan.s1g.reachable_address.relay_capable",
50633
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
50634
50635
14
    {&hf_ieee80211_s1g_reachable_reserved,
50636
14
     {"Reserved", "wlan.s1g.reachable_address.reserved",
50637
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
50638
50639
14
    {&hf_ieee80211_s1g_reachable_mac_address,
50640
14
     {"MAC Address", "wlan.s1g.reachable_address.mac_address",
50641
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50642
50643
14
    {&hf_ieee80211_s1g_relay_discovery_control,
50644
14
     {"Relay Discovery Control", "wlan.s1g.relay_discovery_control",
50645
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50646
50647
14
    {&hf_ieee80211_s1g_min_data_rate_included,
50648
14
     {"Min Data Rate Included",
50649
14
      "wlan.s1g.relay_discovery_control.min_data_rate_included",
50650
14
      FT_BOOLEAN, 8, TFS(&tfs_included_not_included), 0x01, NULL, HFILL }},
50651
50652
14
    {&hf_ieee80211_s1g_mean_data_rate_included,
50653
14
     {"Mean Data Rate Included",
50654
14
      "wlan.s1g.relay_discovery_control.mean_data_rate_included",
50655
14
      FT_BOOLEAN, 8, TFS(&tfs_included_not_included), 0x02, NULL, HFILL }},
50656
50657
14
    {&hf_ieee80211_s1g_max_data_rate_included,
50658
14
     {"Max Data Rate Included",
50659
14
      "wlan.s1g.relay_discovery_control.max_data_rate_included",
50660
14
      FT_BOOLEAN, 8, TFS(&tfs_included_not_included), 0x04, NULL, HFILL }},
50661
50662
14
    {&hf_ieee80211_s1g_delay_and_min_phy_rate,
50663
14
     {"Delay and Min Phy Rate Included",
50664
14
      "wlan.s1g.relay_discovery_control.delay_and_min_phy_rate_included",
50665
14
      FT_BOOLEAN, 8, TFS(&tfs_included_not_included), 0x08, NULL, HFILL }},
50666
50667
14
    {&hf_ieee80211_s1g_information_not_available,
50668
14
     {"Information Not Available",
50669
14
      "wlan.s1g.relay_discovery_control.information_not_available",
50670
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
50671
50672
14
    {&hf_ieee80211_s1g_relay_control_ul_min,
50673
14
     {"UL Min Data Rate (100kbps)", "wlan.s1g.relay_discovery.ul_min_data_rate",
50674
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50675
50676
14
    {&hf_ieee80211_s1g_relay_control_ul_mean,
50677
14
     {"UL Mean Data Rate (100kbps)",
50678
14
      "wlan.s1g.relay_discovery.ul_mean_data_rate",
50679
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50680
50681
14
    {&hf_ieee80211_s1g_relay_control_ul_max,
50682
14
     {"UL Max Data Rate (100kbps)", "wlan.s1g.relay_discovery.ul_max_data_rate",
50683
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50684
50685
14
    {&hf_ieee80211_s1g_relay_control_dl_min,
50686
14
     {"DL Min Data Rate (100kbps)", "wlan.s1g.relay_discovery.dl_min_data_rate",
50687
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50688
50689
14
    {&hf_ieee80211_s1g_relay_control_dl_mean,
50690
14
     {"DL Mean Data Rate (100kbps)",
50691
14
      "wlan.s1g.relay_discovery.dl_mean_data_rate",
50692
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50693
50694
14
    {&hf_ieee80211_s1g_relay_control_dl_max,
50695
14
     {"DL Max Data Rate (100kbps)", "wlan.s1g.relay_discovery.dl_max_data_rate",
50696
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50697
50698
14
    {&hf_ieee80211_s1g_relay_discovery_reserved,
50699
14
     {"Reserved", "wlan.s1g.relay_discovery_control.reserved",
50700
14
      FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL }},
50701
50702
14
    {&hf_ieee80211_s1g_relay_hierarchy_identifier,
50703
14
     {"Relay Hierarchy Identifier",
50704
14
      "wlan.s1g.relay_control.relay_hierarchy_identifier",
50705
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(relay_hierarchy_rstrs),
50706
14
      0x7F, NULL, HFILL }},
50707
50708
14
    {&hf_ieee80211_s1g_relay_no_more_relay_flag,
50709
14
     {"No More Relay Flag", "wlan.s1g.relay_control.no_more_relay_flag",
50710
14
      FT_BOOLEAN, 8, TFS(&no_more_relay_flag_tfs), 0x80, NULL, HFILL }},
50711
50712
14
    {&hf_ieee80211_s1g_aid_entry_mac_addr,
50713
14
     {"STA MAC Address", "wlan.s1g.aid_entry.sta_mac_address",
50714
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50715
50716
14
    {&hf_ieee80211_s1g_aid_entry_assoc_id,
50717
14
     {"Association ID", "wlan.s1g.aid_entry.association_id",
50718
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50719
50720
14
    {&hf_ieee80211_s1g_beacon_compatibility_info,
50721
14
     {"Compatibility Information", "wlan.s1g.beacon_compatibility_info",
50722
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50723
50724
14
    {&hf_ieee80211_s1g_beacon_interval,
50725
14
     {"Beacon Interval", "wlan.s1g.beacon_interval",
50726
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50727
50728
14
    {&hf_ieee80211_s1g_tsf_completion,
50729
14
     {"TSF Completion", "wlan.s1g.tsf_completion",
50730
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50731
50732
14
    {&hf_ieee80211_s1g_channel_width,
50733
14
     {"Channel Width", "wlan.s1g.channel_width",
50734
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50735
50736
14
    {&hf_ieee80211_s1g_primary_channel_width,
50737
14
     {"Primary Channel Width", "wlan.s1g.channel_width.primary_channel_width",
50738
14
      FT_UINT8, BASE_DEC, VALS(primary_channel_width_vals),
50739
14
      0x01, NULL, HFILL }},
50740
50741
14
    {&hf_ieee80211_s1g_bss_operating_channel_width,
50742
14
     {"BSS Operating Channel Width",
50743
14
      "wlan.s1g.channel_width.bss_operating_channel_width",
50744
14
      FT_UINT8, BASE_DEC, NULL, 0x1e, NULL, HFILL }},
50745
50746
14
    {&hf_ieee80211_s1g_primary_channel_location,
50747
14
     {"1MHz Primary Channel Location",
50748
14
      "wlan.s1g.channel_width.1mhz_primary_channel_location",
50749
14
      FT_UINT8, BASE_DEC,
50750
14
      VALS(one_mhz_primary_channel_location_vals), 0x20, NULL, HFILL }},
50751
50752
14
    {&hf_ieee80211_s1g_reserved_b6,
50753
14
     {"Reserved", "wlan.s1g.channel_width.reserved_b6",
50754
14
      FT_UINT8, BASE_DEC, NULL, 0x40, NULL, HFILL }},
50755
50756
14
    {&hf_ieee80211_s1g_mcs10_use,
50757
14
     {"MCS10 Use", "wlan.s1g.channel_width.mcs10_use",
50758
14
      FT_UINT8, BASE_DEC, VALS(mcs10_use_vals), 0x80,
50759
14
      NULL, HFILL }},
50760
50761
14
    {&hf_ieee80211_s1g_operating_class,
50762
14
     {"Operating Class", "wlan.s1g.operating_class",
50763
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50764
50765
14
    {&hf_ieee80211_s1g_primary_channel_number,
50766
14
     {"Primary Channel Number", "wlan.s1g.primary_channel_number",
50767
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50768
50769
14
    {&hf_ieee80211_s1g_channel_center_frequency,
50770
14
     {"Channel Center Frequency", "wlan.s1g.channel_center_frequency",
50771
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50772
50773
14
    {&hf_ieee80211_s1g_basic_mcs_and_nss_set,
50774
14
     {"Basic S1G-MCS and NSS Set", "wlan.s1g.basic_s1g_mcs_and_nss",
50775
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50776
50777
14
    {&hf_ieee80211_s1g_sst_enabled_channel_bitmap,
50778
14
     {"SST Enabled Channel Bitmap", "wlan.s1g.sst_enabled_channel_bitmap",
50779
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50780
50781
14
    {&hf_ieee80211_s1g_sst_primary_channel_offset,
50782
14
     {"Primary Channel Offset", "wlan.s1g.primary_channel_offset",
50783
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
50784
50785
14
    {&hf_ieee80211_s1g_sst_channel_unit,
50786
14
     {"SST Channel Unit", "wlan.s1g.sst_channel_unit",
50787
14
      FT_UINT8, BASE_DEC, VALS(sst_channel_unit_vals), 0x08, NULL, HFILL }},
50788
50789
14
    {&hf_ieee80211_s1g_sst_reserved,
50790
14
     {"Reserved", "wlan.s1g.sst_reserved",
50791
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
50792
50793
14
    {&hf_ieee80211_s1g_max_away_duration,
50794
14
     {"Max Away Duration", "wlan.s1g.max_away_duration",
50795
14
      FT_UINT16, BASE_DEC | BASE_UNIT_STRING, UNS(&units_tu_tus),
50796
14
      0x0, NULL, HFILL }},
50797
50798
14
    {&hf_ieee80211_s1g_tim_bmapctrl,
50799
14
     {"Bitmap Control", "wlan.s1g.tim.bitmap_control",
50800
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50801
50802
14
    {&hf_ieee80211_s1g_tim_bmapctl_traffic_indicator,
50803
14
     {"Traffic Indication", "wlan.s1g.tim.traffic_indication",
50804
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
50805
50806
14
    {&hf_ieee80211_s1g_tim_page_slice_number,
50807
14
     {"Page Slice Number", "wlan.s1g.tim.page_slice_number",
50808
14
      FT_UINT8, BASE_DEC, NULL, 0x3E, NULL, HFILL }},
50809
50810
14
    {&hf_ieee80211_s1g_tim_page_index,
50811
14
     {"Page Index", "wlan.s1g.tim.page_index",
50812
14
      FT_UINT8, BASE_DEC, NULL, 0xC0, NULL, HFILL }},
50813
50814
14
    {&hf_ieee80211_s1g_pvb_block_control_byte,
50815
14
     {"Block Control Byte", "wlan.s1g.tim.pvb.block_control",
50816
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50817
50818
14
    {&hf_ieee80211_s1g_pvb_encoding_mode,
50819
14
     {"Encoding Mode", "wlan.s1g.tim.pvb.block_control.encoding_mode",
50820
14
      FT_UINT8, BASE_HEX, VALS(s1g_block_control_encoding_mode_vals),
50821
14
      0x03, NULL, HFILL }},
50822
50823
14
    {&hf_ieee80211_s1g_pvb_inverse_bitmap,
50824
14
     {"Inverse Bitmap", "wlan.s1g.tim.pvb.block_control.inverse_bitmap",
50825
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
50826
50827
14
    {&hf_ieee80211_s1g_pvb_block_offset,
50828
14
     {"Block Offset", "wlan.s1g.tim.pvb.block_offset",
50829
14
      FT_UINT8, BASE_DEC, NULL, 0xF8, NULL, HFILL }},
50830
50831
14
    {&hf_ieee80211_s1g_block_bitmap,
50832
14
     {"Block Bitmap", "wlan.s1g.tim.pvb.block_bitmap.bitmap",
50833
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50834
50835
14
    {&hf_ieee80211_s1g_block_bitmap_sta_aid13,
50836
14
     {"STA AID13", "wlan.s1g.tim.pvb.block_bitmap.subblock.aid13",
50837
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50838
50839
14
    {&hf_ieee80211_s1g_block_bitmap_ade,
50840
14
     {"ADE Control", "wlan.s1g.tim.pvb.block_bitmap.ade.control",
50841
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50842
50843
14
    {&hf_ieee80211_s1g_block_bitmap_ewl,
50844
14
     {"EWL", "wlan.s1g.tim.pvb.block_bitmap.ade.ewl",
50845
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50846
50847
14
    {&hf_ieee80211_s1g_block_bitmap_len,
50848
14
     {"Length", "wlan.s1g.tim.pvb.block_bitmap.ade.length",
50849
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50850
50851
14
    {&hf_ieee80211_s1g_block_bitmap_ade_bytes,
50852
14
     {"Bitmap", "wlan.s1g.tim.pvb.block_bitmap.ade.bitmap",
50853
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50854
50855
14
    {&hf_ieee80211_s1g_block_bitmap_single_aid,
50856
14
     {"Single AID13", "wlan.s1g.tim.pvb.single_aid",
50857
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50858
50859
14
    {&hf_ieee80211_s1g_block_bitmap_olb_length,
50860
14
     {"Length", "wlan.s1g.tim.pvb.olb.length",
50861
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
50862
50863
14
    {&hf_ieee80211_s1g_probe_response_group_bitmap,
50864
14
     {"Probe Response Group Bitmap", "wlan.s1g.probe_response_group_bitmap",
50865
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50866
50867
14
    {&hf_ieee80211_s1g_probe_resp_subfield_0,
50868
14
     {"Probe Response Option Default Bitmap",
50869
14
      "wlan.s1g.probe_response_option_default_bitmap",
50870
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50871
50872
14
    {&hf_ieee80211_pv1_probe_response_req_full_ssid,
50873
14
     {"Request Full SSID", "wlan.s1g.probe_response_option_request_full_ssid",
50874
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x01, NULL, HFILL }},
50875
50876
14
    {&hf_ieee80211_pv1_probe_response_req_next_tbtt,
50877
14
     {"Request Next TBTT", "wlan.s1g.probe_response_option_request_next_tbtt",
50878
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x02, NULL, HFILL }},
50879
50880
14
    {&hf_ieee80211_pv1_probe_response_req_access_network_option,
50881
14
     {"Request Access Network Options",
50882
14
      "wlan.s1g.probe_response_option_request_access_network_options",
50883
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x04, NULL, HFILL }},
50884
50885
14
    {&hf_ieee80211_pv1_probe_response_req_s1g_beacon_compatibility,
50886
14
     {"Request S1G Beacon Compatibility",
50887
14
      "wlan.s1g.probe_response_option_request_s1g_beacon_compatibility",
50888
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x08, NULL, HFILL }},
50889
50890
14
    {&hf_ieee80211_pv1_probe_response_req_supported_rates,
50891
14
     {"Request Supported Rates",
50892
14
      "wlan.s1g.probe_response_option_request_supported_rates",
50893
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x10, NULL, HFILL }},
50894
50895
14
    {&hf_ieee80211_pv1_probe_response_req_s1g_capability,
50896
14
     {"Request S1G Capability",
50897
14
      "wlan.s1g.probe_response_option_request_s1g_capability",
50898
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x20, NULL, HFILL }},
50899
50900
14
    {&hf_ieee80211_pv1_probe_response_req_s1g_operation,
50901
14
     {"Request S1G Operation",
50902
14
      "wlan.s1g.probe_response_option_request_s1g_operation",
50903
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x40, NULL, HFILL }},
50904
50905
14
    {&hf_ieee80211_pv1_probe_response_req_rsn,
50906
14
     {"Request RSN", "wlan.s1g.probe_response_option_request_rsn",
50907
14
      FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested), 0x80, NULL, HFILL }},
50908
50909
14
    {&hf_ieee80211_s1g_el_op_max_awake_duration,
50910
14
     {"Max Awake Duration", "wlan.s1g.el_operation.max_awake_duration",
50911
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(s1g_max_awake_duration_custom),
50912
14
      0x0, NULL, HFILL }},
50913
50914
14
    {&hf_ieee80211_s1g_el_op_recovery_time_duration,
50915
14
     {"Recovery Time Duration", "wlan.s1g.el_operation.recovery_time_duration",
50916
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(s1g_recovery_time_duration_custom),
50917
14
      0x0, NULL, HFILL }},
50918
50919
14
    {&hf_ieee80211_s1g_sectorized_group_id_list,
50920
14
     {"Sectorized Group List", "wlan.s1g.sectorized_group_list",
50921
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50922
50923
14
    {&hf_ieee80211_s1g_header_comp_control,
50924
14
     {"Header Compression Control",
50925
14
      "wlan.s1g.header_compression.header_compression_control",
50926
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
50927
50928
14
    {&hf_ieee80211_s1g_header_comp_req_resp,
50929
14
     {"Request/Response",
50930
14
      "wlan.s1g.header_compression.header_compression_control.request_response",
50931
14
      FT_BOOLEAN, 8, TFS(&tfs_response_request), 0x01, NULL, HFILL }},
50932
50933
14
    {&hf_ieee80211_s1g_header_comp_store_a3,
50934
14
     {"Store A3",
50935
14
      "wlan.s1g.header_compression.header_compression_control.store_a3",
50936
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
50937
50938
14
    {&hf_ieee80211_s1g_header_comp_store_a4,
50939
14
     {"Store A4",
50940
14
      "wlan.s1g.header_compression.header_compression_control.store_a4",
50941
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
50942
50943
14
    {&hf_ieee80211_s1g_header_comp_ccmp_update_present,
50944
14
     {"CCMP Update Present",
50945
14
      "wlan.s1g.header_compression.header_compression_control.ccmp_update_present",
50946
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
50947
50948
14
    {&hf_ieee80211_s1g_header_comp_pv1_data_type_3_supported,
50949
14
     {"PV1 Data Type 3 Supported",
50950
14
      "wlan.s1g.header_compression.header_compression_control.pv1_data_type_3_supported",
50951
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
50952
50953
14
    {&hf_ieee80211_s1g_header_comp_reserved,
50954
14
     {"Reserved",
50955
14
      "wlan.s1g.header_compression.header_compression_control.reserved",
50956
14
      FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL }},
50957
50958
14
    {&hf_ieee80211_s1g_header_comp_a3,
50959
14
     {"A3", "wlan.s1g.header_compression.a3",
50960
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50961
50962
14
    {&hf_ieee80211_s1g_header_comp_a4,
50963
14
     {"A4", "wlan.s1g.header_compression.a4",
50964
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50965
50966
14
    {&hf_ieee80211_s1g_header_comp_ccmp_update,
50967
14
     {"CCMP Update", "wlan.s1g.header_compression.ccmp_update",
50968
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
50969
50970
14
    {&hf_ieee80211_ampduparam,
50971
14
     {"A-MPDU Parameters", "wlan.ht.ampduparam",
50972
14
      FT_UINT8, BASE_HEX, NULL, 0,
50973
14
      NULL, HFILL }},
50974
50975
14
    {&hf_ieee80211_ampduparam_vs,
50976
14
     {"A-MPDU Parameters (VS)", "wlan.vs.ht.ampduparam",
50977
14
      FT_UINT8, BASE_HEX, NULL, 0,
50978
14
      "Vendor Specific A-MPDU Parameters", HFILL }},
50979
50980
14
    {&hf_ieee80211_ampduparam_mpdu,
50981
14
     {"Maximum Rx A-MPDU Length Exponent", "wlan.ht.ampduparam.maxlength",
50982
14
      FT_UINT8, BASE_HEX, NULL, 0x03,
50983
14
      NULL, HFILL }},
50984
50985
14
    {&hf_ieee80211_ampduparam_mpdu_start_spacing,
50986
14
     {"Minimum MPDU Start Spacing", "wlan.ht.ampduparam.mpdu_start_spacing",
50987
14
      FT_UINT8, BASE_HEX, VALS(ampduparam_mpdu_start_spacing_flags), 0x1c,
50988
14
      NULL, HFILL }},
50989
50990
14
    {&hf_ieee80211_ampduparam_reserved,
50991
14
     {"Reserved", "wlan.ht.ampduparam.reserved",
50992
14
      FT_UINT8, BASE_HEX, NULL, 0xE0,
50993
14
      NULL, HFILL }},
50994
50995
14
    {&hf_ieee80211_mcsset,
50996
14
     {"Rx Supported Modulation and Coding Scheme Set", "wlan.ht.mcsset",
50997
14
      FT_NONE, BASE_NONE, NULL, 0,
50998
14
      NULL, HFILL }},
50999
51000
14
    {&hf_ieee80211_mcsset_vs,
51001
14
     {"Rx Supported Modulation and Coding Scheme Set (VS)", "wlan.vs.ht.mcsset",
51002
14
      FT_NONE, BASE_NONE, NULL, 0,
51003
14
      "Vendor Specific Rx Supported Modulation and Coding Scheme Set", HFILL }},
51004
51005
14
    {&hf_ieee80211_mcsset_rx_bitmask,
51006
14
     {"Rx Modulation and Coding Scheme (One bit per modulation)", "wlan.ht.mcsset.rxbitmask",
51007
14
      FT_NONE, BASE_NONE, NULL, 0,
51008
14
      "One bit per modulation", HFILL }},
51009
51010
14
    {&hf_ieee80211_mcsset_rx_bitmask_0to7,
51011
14
     {"Rx Bitmask Bits 0-7", "wlan.ht.mcsset.rxbitmask.0to7",
51012
14
      FT_UINT32, BASE_HEX, NULL, 0x000000ff,
51013
14
      NULL, HFILL }},
51014
51015
14
    {&hf_ieee80211_mcsset_rx_bitmask_8to15,
51016
14
     {"Rx Bitmask Bits 8-15", "wlan.ht.mcsset.rxbitmask.8to15",
51017
14
      FT_UINT32, BASE_HEX, NULL, 0x0000ff00,
51018
14
      NULL, HFILL }},
51019
51020
14
    {&hf_ieee80211_mcsset_rx_bitmask_16to23,
51021
14
     {"Rx Bitmask Bits 16-23", "wlan.ht.mcsset.rxbitmask.16to23",
51022
14
      FT_UINT32, BASE_HEX, NULL, 0x00ff0000,
51023
14
      NULL, HFILL }},
51024
51025
14
    {&hf_ieee80211_mcsset_rx_bitmask_24to31,
51026
14
     {"Rx Bitmask Bits 24-31", "wlan.ht.mcsset.rxbitmask.24to31",
51027
14
      FT_UINT32, BASE_HEX, NULL, 0xff000000,
51028
14
      NULL, HFILL }},
51029
51030
14
    {&hf_ieee80211_mcsset_rx_bitmask_32,
51031
14
     {"Rx Bitmask Bit 32", "wlan.ht.mcsset.rxbitmask.32",
51032
14
      FT_UINT32, BASE_HEX, NULL, 0x000001,
51033
14
      NULL, HFILL }},
51034
51035
14
    {&hf_ieee80211_mcsset_rx_bitmask_33to38,
51036
14
     {"Rx Bitmask Bits 33-38", "wlan.ht.mcsset.rxbitmask.33to38",
51037
14
      FT_UINT32, BASE_HEX, NULL, 0x00007e,
51038
14
      NULL, HFILL }},
51039
51040
14
    {&hf_ieee80211_mcsset_rx_bitmask_39to52,
51041
14
     {"Rx Bitmask Bits 39-52", "wlan.ht.mcsset.rxbitmask.39to52",
51042
14
      FT_UINT32, BASE_HEX, NULL, 0x1fff80,
51043
14
      NULL, HFILL }},
51044
51045
14
    {&hf_ieee80211_mcsset_rx_bitmask_53to76,
51046
14
     {"Rx Bitmask Bits 53-76", "wlan.ht.mcsset.rxbitmask.53to76",
51047
14
      FT_UINT32, BASE_HEX, NULL, 0x1fffffe0,
51048
14
      NULL, HFILL }},
51049
51050
14
    {&hf_ieee80211_mcsset_highest_data_rate,
51051
14
     {"Highest Supported Data Rate", "wlan.ht.mcsset.highestdatarate",
51052
14
      FT_UINT16, BASE_HEX, NULL, 0x03ff,
51053
14
      NULL, HFILL }},
51054
51055
14
    {&hf_ieee80211_mcsset_tx_mcs_set_defined,
51056
14
     {"Tx Supported MCS Set", "wlan.ht.mcsset.txsetdefined",
51057
14
      FT_BOOLEAN, 16, TFS(&tfs_defined_not_defined), 0x0001,
51058
14
      NULL, HFILL }},
51059
51060
14
    {&hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal,
51061
14
     {"Tx and Rx MCS Set", "wlan.ht.mcsset.txrxmcsnotequal",
51062
14
      FT_BOOLEAN, 16, TFS(&mcsset_tx_rx_mcs_set_not_equal_flag), 0x0002,
51063
14
      NULL, HFILL }},
51064
51065
14
    {&hf_ieee80211_mcsset_tx_max_spatial_streams,
51066
14
     {"Maximum Number of Tx Spatial Streams Supported", "wlan.ht.mcsset.txmaxss",
51067
14
      FT_UINT16, BASE_HEX, NULL, 0x000c,
51068
14
      NULL, HFILL }},
51069
51070
14
    {&hf_ieee80211_mcsset_tx_unequal_modulation,
51071
14
     {"Unequal Modulation", "wlan.ht.mcsset.txunequalmod",
51072
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010,
51073
14
      NULL, HFILL }},
51074
51075
14
    {&hf_ieee80211_htex_cap,
51076
14
     {"HT Extended Capabilities", "wlan.htex.capabilities",
51077
14
      FT_UINT16, BASE_HEX, NULL, 0,
51078
14
      "HT Extended Capability information", HFILL }},
51079
51080
14
    {&hf_ieee80211_htex_vs_cap,
51081
14
     {"HT Extended Capabilities (VS)", "wlan.vs.htex.capabilities",
51082
14
      FT_UINT16, BASE_HEX, NULL, 0,
51083
14
      "Vendor Specific HT Extended Capability information", HFILL }},
51084
51085
14
    {&hf_ieee80211_htex_reserved_b0_b7,
51086
14
     {"Reserved", "wlan.htex.capabilities.reserved_b0_b7",
51087
14
      FT_UINT16, BASE_HEX, NULL, 0x00ff,
51088
14
      NULL, HFILL }},
51089
51090
14
    {&hf_ieee80211_htex_mcs,
51091
14
     {"MCS Feedback capability", "wlan.htex.capabilities.mcs",
51092
14
      FT_UINT16, BASE_HEX, VALS(htex_mcs_flags), 0x0300,
51093
14
      NULL, HFILL }},
51094
51095
14
    {&hf_ieee80211_htex_htc_support,
51096
14
     {"HT variant HT Control field", "wlan.htex.capabilities.htc",
51097
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400,
51098
14
      NULL, HFILL }},
51099
51100
14
    {&hf_ieee80211_htex_rd_responder,
51101
14
     {"Reverse Direction Responder", "wlan.htex.capabilities.rdresponder",
51102
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800,
51103
14
      NULL, HFILL }},
51104
51105
14
    {&hf_ieee80211_htex_reserved_b12_b15,
51106
14
     {"Reserved", "wlan.htex.capabilities.reserved_b12_b15",
51107
14
      FT_UINT16, BASE_HEX, NULL, 0xf000,
51108
14
      NULL, HFILL }},
51109
51110
14
    {&hf_ieee80211_txbf,
51111
14
     {"Transmit Beam Forming (TxBF) Capabilities", "wlan.txbf",
51112
14
      FT_UINT32, BASE_HEX, NULL, 0,
51113
14
      NULL, HFILL }},
51114
51115
14
    {&hf_ieee80211_txbf_vs,
51116
14
     {"Transmit Beam Forming (TxBF) Capabilities (VS)", "wlan.vs.txbf",
51117
14
      FT_UINT32, BASE_HEX, NULL, 0,
51118
14
      "Vendor Specific Transmit Beam Forming (TxBF) Capabilities", HFILL }},
51119
51120
14
    {&hf_ieee80211_txbf_cap,
51121
14
     {"Implicit Transmit Beamforming Receiving", "wlan.txbf.txbf",
51122
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000001,
51123
14
      NULL, HFILL }},
51124
51125
14
    {&hf_ieee80211_txbf_rcv_ssc,
51126
14
     {"Receive Staggered Sounding", "wlan.txbf.rxss",
51127
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000002,
51128
14
      NULL, HFILL }},
51129
51130
14
    {&hf_ieee80211_txbf_tx_ssc,
51131
14
     {"Transmit Staggered Sounding", "wlan.txbf.txss",
51132
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000004,
51133
14
      NULL, HFILL }},
51134
51135
14
    {&hf_ieee80211_txbf_rcv_ndp,
51136
14
     {"Receive Null Data packet (NDP)", "wlan.txbf.rxndp",
51137
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000008,
51138
14
      NULL, HFILL }},
51139
51140
14
    {&hf_ieee80211_txbf_tx_ndp,
51141
14
     {"Transmit Null Data packet (NDP)", "wlan.txbf.txndp",
51142
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
51143
14
      NULL, HFILL }},
51144
51145
14
    {&hf_ieee80211_txbf_impl_txbf,
51146
14
     {"Implicit Transmit Beamforming", "wlan.txbf.impltxbf",
51147
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
51148
14
      NULL, HFILL }},
51149
51150
14
    {&hf_ieee80211_txbf_calib,
51151
14
     {"Calibration", "wlan.txbf.calibration",
51152
14
      FT_UINT32, BASE_HEX, VALS(txbf_calib_flag), 0x000000c0,
51153
14
      NULL, HFILL }},
51154
51155
14
    {&hf_ieee80211_txbf_expl_csi,
51156
14
     {"Explicit CSI Transmit Beamforming", "wlan.txbf.csi",
51157
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000100,
51158
14
      "Station can apply TxBF using CSI explicit feedback", HFILL }},
51159
51160
14
    {&hf_ieee80211_txbf_expl_uncomp_fm,
51161
14
     {"Explicit Noncompressed Steering", "wlan.txbf.fm.uncompressed.tbf",
51162
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000200,
51163
14
      "Station can apply TxBF using uncompressed beamforming feedback matrix", HFILL }},
51164
51165
14
    {&hf_ieee80211_txbf_expl_comp_fm,
51166
14
     {"Explicit Compressed Steering", "wlan.txbf.fm.compressed.tbf",
51167
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000400,
51168
14
      "Station can apply TxBF using compressed beamforming feedback matrix", HFILL }},
51169
51170
14
    {&hf_ieee80211_txbf_expl_bf_csi,
51171
14
     {"Explicit Transmit Beamforming CSI Feedback", "wlan.txbf.rcsi",
51172
14
      FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00001800,
51173
14
      "Receiver can return explicit CSI feedback", HFILL }},
51174
51175
14
    {&hf_ieee80211_txbf_expl_uncomp_fm_feed,
51176
14
     {"Explicit Noncompressed Beamforming Feedback", "wlan.txbf.fm.uncompressed.rbf",
51177
14
      FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00006000,
51178
14
      "Receiver can return explicit uncompressed Beamforming Feedback Matrix", HFILL }},
51179
51180
14
    {&hf_ieee80211_txbf_expl_comp_fm_feed,
51181
14
     {"Explicit Noncompressed Beamforming Feedback", "wlan.txbf.fm.compressed.bf",
51182
14
      FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00018000,
51183
14
      "Station can compress and use compressed Beamforming Feedback Matrix", HFILL }},
51184
51185
14
    {&hf_ieee80211_txbf_min_group,
51186
14
     {"Minimal Grouping", "wlan.txbf.mingroup",
51187
14
      FT_UINT32, BASE_HEX, VALS(txbf_min_group_flags), 0x00060000,
51188
14
      "Minimal grouping used for explicit feedback reports", HFILL }},
51189
51190
14
    {&hf_ieee80211_vht_cap,
51191
14
     {"VHT Capabilities Info", "wlan.vht.capabilities",
51192
14
      FT_UINT32, BASE_HEX, NULL, 0,
51193
14
      "VHT Capabilities information", HFILL }},
51194
51195
14
    {&hf_ieee80211_vht_max_mpdu_length,
51196
14
     {"Maximum MPDU Length", "wlan.vht.capabilities.maxmpdulength",
51197
14
      FT_UINT32, BASE_HEX, VALS(vht_max_mpdu_length_flag), 0x00000003,
51198
14
      "Octets", HFILL }},
51199
51200
14
    {&hf_ieee80211_vht_supported_chan_width_set,
51201
14
     {"Supported Channel Width Set", "wlan.vht.capabilities.supportedchanwidthset",
51202
14
      FT_UINT32, BASE_HEX, VALS(vht_supported_chan_width_set_flag), 0x0000000c,
51203
14
      NULL, HFILL }},
51204
51205
14
    {&hf_ieee80211_vht_rx_ldpc,
51206
14
     {"Rx LDPC", "wlan.vht.capabilities.rxldpc",
51207
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
51208
14
      NULL, HFILL }},
51209
51210
14
    {&hf_ieee80211_vht_short_gi_for_80,
51211
14
     {"Short GI for 80MHz/TVHT_MODE_4C", "wlan.vht.capabilities.short80",
51212
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
51213
14
      NULL, HFILL }},
51214
51215
14
    {&hf_ieee80211_vht_short_gi_for_160,
51216
14
     {"Short GI for 160MHz and 80+80MHz", "wlan.vht.capabilities.short160",
51217
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000040,
51218
14
      NULL, HFILL }},
51219
51220
14
    {&hf_ieee80211_vht_tx_stbc,
51221
14
     {"Tx STBC", "wlan.vht.capabilities.txstbc",
51222
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000080,
51223
14
      NULL, HFILL }},
51224
51225
14
    {&hf_ieee80211_vht_rx_stbc,
51226
14
     {"Rx STBC", "wlan.vht.capabilities.rxstbc",
51227
14
      FT_UINT32, BASE_HEX, VALS(vht_rx_stbc_flag), 0x00000700,
51228
14
      NULL, HFILL }},
51229
51230
14
    {&hf_ieee80211_vht_su_beamformer_cap,
51231
14
     {"SU Beamformer Capable", "wlan.vht.capabilities.subeamformer",
51232
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000800,
51233
14
      NULL, HFILL }},
51234
51235
14
    {&hf_ieee80211_vht_su_beamformee_cap,
51236
14
     {"SU Beamformee Capable", "wlan.vht.capabilities.subeamformee",
51237
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00001000,
51238
14
      NULL, HFILL }},
51239
51240
14
    {&hf_ieee80211_vht_beamformer_antennas,
51241
14
     {"Beamformee STS Capability", "wlan.vht.capabilities.beamformee_sts_cap",
51242
14
      FT_UINT32, BASE_HEX, VALS(num_plus_one_3bit_flag), 0x0000e000,
51243
14
      NULL, HFILL }},
51244
51245
14
    {&hf_ieee80211_vht_sounding_dimensions,
51246
14
     {"Number of Sounding Dimensions", "wlan.vht.capabilities.soundingdimensions",
51247
14
      FT_UINT32, BASE_HEX, VALS(num_plus_one_3bit_flag), 0x00070000,
51248
14
      NULL, HFILL }},
51249
51250
14
    {&hf_ieee80211_vht_mu_beamformer_cap,
51251
14
     {"MU Beamformer Capable", "wlan.vht.capabilities.mubeamformer",
51252
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00080000,
51253
14
      NULL, HFILL }},
51254
51255
14
    {&hf_ieee80211_vht_mu_beamformee_cap,
51256
14
     {"MU Beamformee Capable", "wlan.vht.capabilities.mubeamformee",
51257
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00100000,
51258
14
      NULL, HFILL }},
51259
51260
14
    {&hf_ieee80211_vht_txop_ps,
51261
14
     {"TXOP PS", "wlan.vht.capabilities.vhttxopps",
51262
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00200000,
51263
14
      NULL, HFILL }},
51264
51265
14
    {&hf_ieee80211_vht_var_htc_field,
51266
14
     {"+HTC-VHT Capable", "wlan.vht.capabilities.vhthtc",
51267
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00400000,
51268
14
      NULL, HFILL }},
51269
51270
14
    {&hf_ieee80211_vht_max_ampdu,
51271
14
     {"Max A-MPDU Length Exponent", "wlan.vht.capabilities.maxampdu",
51272
14
      FT_UINT32, BASE_HEX, VALS(vht_max_ampdu_flag), 0x03800000,
51273
14
      "Octets", HFILL }},
51274
51275
14
    {&hf_ieee80211_vht_link_adaptation_cap,
51276
14
     {"VHT Link Adaptation", "wlan.vht.capabilities.linkadapt",
51277
14
      FT_UINT32, BASE_HEX, VALS(vht_link_adapt_flag), 0x0c000000,
51278
14
      NULL, HFILL }},
51279
51280
14
    {&hf_ieee80211_vht_rx_pattern,
51281
14
     {"Rx Antenna Pattern Consistency", "wlan.vht.capabilities.rxpatconsist",
51282
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x10000000,
51283
14
      NULL, HFILL }},
51284
51285
14
    {&hf_ieee80211_vht_tx_pattern,
51286
14
     {"Tx Antenna Pattern Consistency", "wlan.vht.capabilities.txpatconsist",
51287
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x20000000,
51288
14
      NULL, HFILL }},
51289
51290
14
    {&hf_ieee80211_vht_ext_nss_bw_support,
51291
14
     {"Extended NSS BW Support", "wlan.vht.capabilities.ext_nss_bw_support",
51292
14
      FT_UINT32, BASE_HEX, NULL, 0xc0000000,
51293
14
      NULL, HFILL }},
51294
51295
14
    {&hf_ieee80211_vht_mcsset,
51296
14
     {"VHT Supported MCS Set", "wlan.vht.mcsset",
51297
14
      FT_NONE, BASE_NONE, NULL, 0,
51298
14
      NULL, HFILL }},
51299
51300
14
    {&hf_ieee80211_vht_mcsset_rx_mcs_map,
51301
14
     {"Rx MCS Map", "wlan.vht.mcsset.rxmcsmap",
51302
14
      FT_UINT16, BASE_HEX, NULL, 0,
51303
14
      NULL, HFILL }},
51304
51305
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss,
51306
14
     {"Rx 1 SS", "wlan.vht.mcsset.rxmcsmap.ss1",
51307
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
51308
14
      NULL, HFILL }},
51309
51310
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss,
51311
14
     {"Rx 2 SS", "wlan.vht.mcsset.rxmcsmap.ss2",
51312
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
51313
14
      NULL, HFILL }},
51314
51315
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss,
51316
14
     {"Rx 3 SS", "wlan.vht.mcsset.rxmcsmap.ss3",
51317
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
51318
14
      NULL, HFILL }},
51319
51320
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss,
51321
14
     {"Rx 4 SS", "wlan.vht.mcsset.rxmcsmap.ss4",
51322
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
51323
14
      NULL, HFILL }},
51324
51325
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss,
51326
14
     {"Rx 5 SS", "wlan.vht.mcsset.rxmcsmap.ss5",
51327
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
51328
14
      NULL, HFILL }},
51329
51330
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss,
51331
14
     {"Rx 6 SS", "wlan.vht.mcsset.rxmcsmap.ss6",
51332
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
51333
14
      NULL, HFILL }},
51334
51335
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss,
51336
14
     {"Rx 7 SS", "wlan.vht.mcsset.rxmcsmap.ss7",
51337
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
51338
14
      NULL, HFILL }},
51339
51340
14
    {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss,
51341
14
     {"Rx 8 SS", "wlan.vht.mcsset.rxmcsmap.ss8",
51342
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
51343
14
      NULL, HFILL }},
51344
51345
14
    {&hf_ieee80211_vht_mcsset_max_nsts_total,
51346
14
     {"MaX NSTS Total", "wlan.vht.mcsset.max_nsts_total",
51347
14
      FT_UINT16, BASE_DEC, NULL, 0xe000, NULL, HFILL }},
51348
51349
14
    {&hf_ieee80211_vht_mcsset_rx_highest_long_gi,
51350
14
     {"Rx Highest Long GI Data Rate (in Mb/s, 0 = subfield not in use)", "wlan.vht.mcsset.rxhighestlonggirate",
51351
14
      FT_UINT16, BASE_HEX, NULL, 0x1fff,
51352
14
      NULL, HFILL }},
51353
51354
14
    {&hf_ieee80211_vht_mcsset_tx_mcs_map,
51355
14
     {"Tx MCS Map", "wlan.vht.mcsset.txmcsmap",
51356
14
      FT_UINT16, BASE_HEX, NULL, 0,
51357
14
      NULL, HFILL }},
51358
51359
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss,
51360
14
     {"Tx 1 SS", "wlan.vht.mcsset.txmcsmap.ss1",
51361
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
51362
14
      NULL, HFILL }},
51363
51364
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss,
51365
14
     {"Tx 2 SS", "wlan.vht.mcsset.txmcsmap.ss2",
51366
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
51367
14
      NULL, HFILL }},
51368
51369
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss,
51370
14
     {"Tx 3 SS", "wlan.vht.mcsset.txmcsmap.ss3",
51371
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
51372
14
      NULL, HFILL }},
51373
51374
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss,
51375
14
     {"Tx 4 SS", "wlan.vht.mcsset.txmcsmap.ss4",
51376
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
51377
14
      NULL, HFILL }},
51378
51379
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss,
51380
14
     {"Tx 5 SS", "wlan.vht.mcsset.txmcsmap.ss5",
51381
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
51382
14
      NULL, HFILL }},
51383
51384
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss,
51385
14
     {"Tx 6 SS", "wlan.vht.mcsset.txmcsmap.ss6",
51386
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
51387
14
      NULL, HFILL }},
51388
51389
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss,
51390
14
     {"Tx 7 SS", "wlan.vht.mcsset.txmcsmap.ss7",
51391
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
51392
14
      NULL, HFILL }},
51393
51394
14
    {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss,
51395
14
     {"Tx 8 SS", "wlan.vht.mcsset.txmcsmap.ss8",
51396
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
51397
14
      NULL, HFILL }},
51398
51399
14
    {&hf_ieee80211_vht_mcsset_tx_highest_long_gi,
51400
14
     {"Tx Highest Long GI Data Rate  (in Mb/s, 0 = subfield not in use)", "wlan.vht.mcsset.txhighestlonggirate",
51401
14
      FT_UINT16, BASE_HEX, NULL, 0x1fff,
51402
14
      NULL, HFILL }},
51403
51404
14
    {&hf_ieee80211_vht_mcsset_extended_nss_bw_capable,
51405
14
     {"VHT Extended NSS BW Capable", "wlan.vht.mcsset.vht_ext_nss_bw_capable",
51406
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x2000, NULL, HFILL }},
51407
51408
14
    {&hf_ieee80211_vht_mcsset_reserved,
51409
14
     {"Reserved", "wlan.vht.mcsset.reserved",
51410
14
      FT_UINT16, BASE_HEX, NULL, 0xc000, NULL, HFILL }},
51411
51412
14
    {&hf_ieee80211_vht_op,
51413
14
     {"VHT Operation Info", "wlan.vht.op",
51414
14
      FT_NONE, BASE_NONE, NULL, 0,
51415
14
      NULL, HFILL }},
51416
51417
14
    {&hf_ieee80211_vht_op_channel_width,
51418
14
     {"Channel Width", "wlan.vht.op.channelwidth",
51419
14
      FT_UINT8, BASE_DEC, VALS(channel_width_vals), 0,
51420
14
      NULL, HFILL }},
51421
51422
14
    {&hf_ieee80211_vht_op_channel_center0,
51423
14
     {"Channel Center Segment 0", "wlan.vht.op.channelcenter0",
51424
14
      FT_UINT8, BASE_DEC, NULL, 0,
51425
14
      NULL, HFILL }},
51426
51427
14
    {&hf_ieee80211_vht_op_channel_center1,
51428
14
     {"Channel Center Segment 1", "wlan.vht.op.channelcenter1",
51429
14
      FT_UINT8, BASE_DEC, NULL, 0,
51430
14
      NULL, HFILL }},
51431
51432
14
    {&hf_ieee80211_vht_op_basic_mcs_map,
51433
14
     {"Basic MCS Map", "wlan.vht.op.basicmcsmap",
51434
14
      FT_UINT16, BASE_HEX, NULL, 0,
51435
14
      NULL, HFILL }},
51436
51437
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_1_ss,
51438
14
     {"Basic 1 SS", "wlan.vht.op.basicmcsmap.ss1",
51439
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
51440
14
      NULL, HFILL }},
51441
51442
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_2_ss,
51443
14
     {"Basic 2 SS", "wlan.vht.op.basicmcsmap.ss2",
51444
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
51445
14
      NULL, HFILL }},
51446
51447
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_3_ss,
51448
14
     {"Basic 3 SS", "wlan.vht.op.basicmcsmap.ss3",
51449
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
51450
14
      NULL, HFILL }},
51451
51452
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_4_ss,
51453
14
     {"Basic 4 SS", "wlan.vht.op.basicmcsmap.ss4",
51454
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
51455
14
      NULL, HFILL }},
51456
51457
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_5_ss,
51458
14
     {"Basic 5 SS", "wlan.vht.op.basicmcsmap.ss5",
51459
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
51460
14
      NULL, HFILL }},
51461
51462
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_6_ss,
51463
14
     {"Basic 6 SS", "wlan.vht.op.basicmcsmap.ss6",
51464
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
51465
14
      NULL, HFILL }},
51466
51467
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_7_ss,
51468
14
     {"Basic 7 SS", "wlan.vht.op.basicmcsmap.ss7",
51469
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
51470
14
      NULL, HFILL }},
51471
51472
14
    {&hf_ieee80211_vht_op_max_basic_mcs_for_8_ss,
51473
14
     {"Basic 8 SS", "wlan.vht.op.basicmcsmap.ss8",
51474
14
      FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
51475
14
      NULL, HFILL }},
51476
51477
14
    {&hf_ieee80211_vht_tpe_pwr_info,
51478
14
     {"Tx Pwr Info", "wlan.vht.tpe.pwr_info",
51479
14
      FT_UINT8, BASE_HEX, NULL, 0,
51480
14
      NULL, HFILL }},
51481
51482
14
    {&hf_ieee80211_vht_tpe_pwr_info_count,
51483
14
     {"Max Tx Pwr Count", "wlan.vht.tpe.pwr_info.count",
51484
14
      FT_UINT8, BASE_DEC, NULL , 0x07,
51485
14
      NULL, HFILL }},
51486
51487
14
    {&hf_ieee80211_vht_tpe_pwr_info_unit,
51488
14
     {"Max Tx Pwr Unit Interpretation", "wlan.vht.tpe.pwr_info.unit",
51489
14
      FT_UINT8, BASE_DEC, VALS(vht_tpe_pwr_units) , 0x38,
51490
14
      NULL, HFILL }},
51491
51492
14
    {&hf_ieee80211_vht_tpe_pwr_info_category,
51493
14
     {"Max Tx Pwr Category", "wlan.vht.tpe.pwr_info.category",
51494
14
      FT_UINT8, BASE_DEC, NULL , 0xC0,
51495
14
      NULL, HFILL }},
51496
51497
14
    {&hf_ieee80211_vht_tpe_pwr_constr_20,
51498
14
     {"Local Max Tx Pwr Constraint 20MHz", "wlan.vht.tpe.pwr_constr_20",
51499
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
51500
14
      NULL, HFILL }},
51501
51502
14
    {&hf_ieee80211_vht_tpe_pwr_constr_40,
51503
14
     {"Local Max Tx Pwr Constraint 40MHz", "wlan.vht.tpe.pwr_constr_40",
51504
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
51505
14
      NULL, HFILL }},
51506
51507
14
    {&hf_ieee80211_vht_tpe_pwr_constr_80,
51508
14
     {"Local Max Tx Pwr Constraint 80MHz", "wlan.vht.tpe.pwr_constr_80",
51509
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
51510
14
      NULL, HFILL }},
51511
51512
14
    {&hf_ieee80211_vht_tpe_pwr_constr_160,
51513
14
     {"Local Max Tx Pwr Constraint 160MHz/80+80 MHz", "wlan.vht.tpe.pwr_constr_160",
51514
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
51515
14
      NULL, HFILL }},
51516
51517
14
    {&hf_ieee80211_vht_tpe_pwr_constr_320,
51518
14
     {"Local Max Tx Pwr Constraint 320 MHz", "wlan.vht.tpe.pwr_constr_320",
51519
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
51520
14
      NULL, HFILL }},
51521
51522
14
    {&hf_ieee80211_vht_tpe_any_bw_psd,
51523
14
     {"Max Tx Power Spectral Density", "wlan.vht.tpe.max_tx_psd",
51524
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(tpe_psd_custom), 0, NULL, HFILL }},
51525
51526
14
    {&hf_ieee80211_vht_tpe_psd,
51527
14
     {"Power Spectral Density", "wlan.vht.tpe.psd",
51528
14
      FT_INT8, BASE_CUSTOM, CF_FUNC(tpe_psd_custom), 0, NULL, HFILL }},
51529
51530
14
    {&hf_ieee80211_vht_tpe_ext_count,
51531
14
     {"Extension Count", "wlan.vht.tpe.extension_count",
51532
14
      FT_UINT8, BASE_DEC, NULL , 0x0f,
51533
14
      NULL, HFILL }},
51534
51535
14
    {&hf_ieee80211_vht_tpe_ext_reserved,
51536
14
     {"Reserved", "wlan.vht.tpe.extension_reserved",
51537
14
      FT_UINT8, BASE_HEX, NULL , 0xf0,
51538
14
      NULL, HFILL }},
51539
51540
14
    {&hf_ieee80211_txbf_csi_num_bf_ant,
51541
14
     {"CSI Number of Beamformer Antennas", "wlan.txbf.csinumant",
51542
14
      FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x00180000,
51543
14
      "Max antennae station can support when CSI feedback required", HFILL }},
51544
51545
14
    {&hf_ieee80211_txbf_uncomp_sm_bf_ant,
51546
14
     {"Noncompressed Steering Number of Beamformer Antennas", "wlan.txbf.fm.uncompressed.maxant",
51547
14
      FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x00600000,
51548
14
      "Max antennae station can support when uncompressed Beamforming feedback required", HFILL }},
51549
51550
14
    {&hf_ieee80211_txbf_comp_sm_bf_ant,
51551
14
     {"Compressed Steering Number of Beamformer Antennas", "wlan.txbf.fm.compressed.maxant",
51552
14
      FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x01800000,
51553
14
      "Max antennae station can support when compressed Beamforming feedback required", HFILL }},
51554
51555
14
    {&hf_ieee80211_txbf_csi_max_rows_bf,
51556
14
     {"CSI Max Number of Rows Beamformer", "wlan.txbf.csi.maxrows",
51557
14
      FT_UINT32, BASE_HEX, VALS(txbf_csi_max_rows_bf_flags), 0x06000000,
51558
14
      "Maximum number of rows of CSI explicit feedback", HFILL }},
51559
51560
14
    {&hf_ieee80211_txbf_chan_est,
51561
14
     {"Channel Estimation", "wlan.txbf.channelest",
51562
14
      FT_UINT32, BASE_HEX, VALS(txbf_chan_est_flags), 0x18000000,
51563
14
      "Maximum number of space time streams for which channel dimensions can be simultaneously estimated", HFILL }},
51564
51565
14
    {&hf_ieee80211_txbf_resrv,
51566
14
     {"Reserved", "wlan.txbf.reserved",
51567
14
      FT_UINT32, BASE_HEX, NULL, 0xe0000000,
51568
14
      NULL, HFILL }},
51569
51570
14
    {&hf_ieee80211_hta_cc,
51571
14
     {"HT Control Channel", "wlan.hta.control_channel",
51572
14
      FT_UINT8, BASE_DEC, NULL, 0,
51573
14
      NULL, HFILL }},
51574
51575
14
    {&hf_ieee80211_hta_cap1,
51576
14
     {"HT Additional Capabilities", "wlan.hta.capabilities",
51577
14
      FT_UINT8, BASE_HEX, NULL, 0,
51578
14
      "HT Additional Capability information", HFILL }},
51579
51580
14
    {&hf_ieee80211_hta_cap2,
51581
14
     {"HT Additional Capabilities", "wlan.hta.capabilities",
51582
14
      FT_UINT16, BASE_HEX, NULL, 0,
51583
14
      "HT Additional Capability information", HFILL }},
51584
51585
14
    {&hf_ieee80211_hta_ext_chan_offset,
51586
14
     {"Extension Channel Offset", "wlan.hta.capabilities.ext_chan_offset",
51587
14
      FT_UINT16, BASE_HEX, VALS(hta_ext_chan_offset_flag), 0x0003,
51588
14
      NULL, HFILL }},
51589
51590
14
    {&hf_ieee80211_hta_rec_tx_width,
51591
14
     {"Recommended Tx Channel Width", "wlan.hta.capabilities.rec_tx_width",
51592
14
      FT_BOOLEAN, 16, TFS(&hta_rec_tx_width_flag), 0x0004,
51593
14
      "Recommended Transmit Channel Width", HFILL }},
51594
51595
14
    {&hf_ieee80211_hta_rifs_mode,
51596
14
     {"Reduced Interframe Spacing (RIFS) Mode", "wlan.hta.capabilities.rifs_mode",
51597
14
      FT_BOOLEAN, 16, TFS(&hta_rifs_mode_flag), 0x0008,
51598
14
      NULL, HFILL }},
51599
51600
14
    {&hf_ieee80211_hta_controlled_access,
51601
14
     {"Controlled Access Only", "wlan.hta.capabilities.controlled_access",
51602
14
      FT_BOOLEAN, 16, TFS(&hta_controlled_access_flag), 0x0010,
51603
14
      NULL, HFILL }},
51604
51605
14
    {&hf_ieee80211_hta_service_interval,
51606
14
     {"Service Interval Granularity", "wlan.hta.capabilities.service_interval",
51607
14
      FT_UINT16, BASE_HEX, VALS(hta_service_interval_flag), 0x00E0,
51608
14
      NULL, HFILL }},
51609
51610
14
    {&hf_ieee80211_hta_operating_mode,
51611
14
     {"Operating Mode", "wlan.hta.capabilities.operating_mode",
51612
14
      FT_UINT16, BASE_HEX, VALS(hta_operating_mode_flag), 0x0003,
51613
14
      NULL, HFILL }},
51614
51615
14
    {&hf_ieee80211_hta_non_gf_devices,
51616
14
     {"Non Greenfield (GF) devices Present", "wlan.hta.capabilities.non_gf_devices",
51617
14
      FT_BOOLEAN, 16, TFS(&hta_non_gf_devices_flag), 0x0004,
51618
14
      "on Greenfield (GF) devices Present", HFILL }},
51619
51620
14
    {&hf_ieee80211_hta_basic_stbc_mcs,
51621
14
     {"Basic STB Modulation and Coding Scheme (MCS)", "wlan.hta.capabilities.basic_stbc_mcs",
51622
14
      FT_UINT16, BASE_HEX, NULL , 0x007f,
51623
14
      NULL, HFILL }},
51624
51625
14
    {&hf_ieee80211_hta_dual_stbc_protection,
51626
14
     {"Dual Clear To Send (CTS) Protection", "wlan.hta.capabilities.dual_stbc_protection",
51627
14
      FT_BOOLEAN, 16, TFS(&hta_dual_stbc_protection_flag), 0x0080,
51628
14
      NULL, HFILL }},
51629
51630
14
    {&hf_ieee80211_hta_secondary_beacon,
51631
14
     {"Secondary Beacon", "wlan.hta.capabilities.secondary_beacon",
51632
14
      FT_BOOLEAN, 16, TFS(&hta_secondary_beacon_flag), 0x0100,
51633
14
      NULL, HFILL }},
51634
51635
14
    {&hf_ieee80211_hta_lsig_txop_protection,
51636
14
     {"L-SIG TXOP Protection Support", "wlan.hta.capabilities.lsig_txop_protection",
51637
14
      FT_BOOLEAN, 16, TFS(&hta_lsig_txop_protection_flag), 0x0200,
51638
14
      NULL, HFILL }},
51639
51640
14
    {&hf_ieee80211_hta_pco_active,
51641
14
     {"Phased Coexistence Operation (PCO) Active", "wlan.hta.capabilities.pco_active",
51642
14
      FT_BOOLEAN, 16, TFS(&hta_pco_active_flag), 0x0400,
51643
14
      NULL, HFILL }},
51644
51645
14
    {&hf_ieee80211_hta_pco_phase,
51646
14
     {"Phased Coexistence Operation (PCO) Phase", "wlan.hta.capabilities.pco_phase",
51647
14
      FT_BOOLEAN, 16, TFS(&hta_pco_phase_flag), 0x0800,
51648
14
      NULL, HFILL }},
51649
51650
14
    {&hf_ieee80211_antsel,
51651
14
     {"Antenna Selection (ASEL) Capabilities", "wlan.asel",
51652
14
      FT_UINT8, BASE_HEX, NULL, 0,
51653
14
      NULL, HFILL }},
51654
51655
14
    {&hf_ieee80211_antsel_vs,
51656
14
     {"Antenna Selection (ASEL) Capabilities (VS)", "wlan.vs.asel",
51657
14
      FT_UINT8, BASE_HEX, NULL, 0,
51658
14
      "Vendor Specific Antenna Selection (ASEL) Capabilities", HFILL }},
51659
51660
14
    {&hf_ieee80211_antsel_b0,
51661
14
     {"Antenna Selection Capable", "wlan.asel.capable",
51662
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
51663
14
      NULL, HFILL }},
51664
51665
14
    {&hf_ieee80211_antsel_b1,
51666
14
     {"Explicit CSI Feedback Based Tx ASEL", "wlan.asel.txcsi",
51667
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
51668
14
      NULL, HFILL }},
51669
51670
14
    {&hf_ieee80211_antsel_b2,
51671
14
     {"Antenna Indices Feedback Based Tx ASEL", "wlan.asel.txif",
51672
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
51673
14
      NULL, HFILL }},
51674
51675
14
    {&hf_ieee80211_antsel_b3,
51676
14
     {"Explicit CSI Feedback", "wlan.asel.csi",
51677
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
51678
14
      NULL, HFILL }},
51679
51680
14
    {&hf_ieee80211_antsel_b4,
51681
14
     {"Antenna Indices Feedback", "wlan.asel.if",
51682
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
51683
14
      NULL, HFILL }},
51684
51685
14
    {&hf_ieee80211_antsel_b5,
51686
14
     {"Rx ASEL", "wlan.asel.rx",
51687
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
51688
14
      NULL, HFILL }},
51689
51690
14
    {&hf_ieee80211_antsel_b6,
51691
14
     {"Tx Sounding PPDUs", "wlan.asel.sppdu",
51692
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
51693
14
      NULL, HFILL }},
51694
51695
14
    {&hf_ieee80211_antsel_b7,
51696
14
     {"Reserved", "wlan.asel.reserved",
51697
14
      FT_UINT8, BASE_HEX, NULL, 0x80,
51698
14
      NULL, HFILL }},
51699
51700
14
    {&hf_ieee80211_ht_operation_info_delimiter1,
51701
14
     {"HT Operation Information Subset (1 of 3)", "wlan.ht.info.delim1",
51702
14
      FT_UINT8, BASE_HEX, NULL, 0,
51703
14
      NULL, HFILL }},
51704
51705
14
    {&hf_ieee80211_ht_operation_primary_channel,
51706
14
     {"Primary Channel", "wlan.ht.info.primarychannel",
51707
14
      FT_UINT8, BASE_DEC, NULL, 0,
51708
14
      NULL, HFILL }},
51709
51710
14
    {&hf_ieee80211_ht_operation_info_secondary_channel_offset,
51711
14
     {"Secondary channel offset", "wlan.ht.info.secchanoffset",
51712
14
      FT_UINT8, BASE_HEX, VALS(ht_info_secondary_channel_offset_flags), 0x03,
51713
14
      NULL, HFILL }},
51714
51715
14
    {&hf_ieee80211_ht_operation_info_sta_channel_width,
51716
14
     {"Supported channel width", "wlan.ht.info.chanwidth",
51717
14
      FT_BOOLEAN, 8, TFS(&ht_info_channel_sta_width_flag), 0x04,
51718
14
      NULL, HFILL }},
51719
51720
14
    {&hf_ieee80211_ht_operation_info_rifs_mode,
51721
14
     {"Reduced Interframe Spacing (RIFS)", "wlan.ht.info.rifs",
51722
14
      FT_BOOLEAN, 8, TFS(&ht_info_rifs_mode_flag), 0x08,
51723
14
      NULL, HFILL }},
51724
51725
14
    {&hf_ieee80211_ht_operation_info_reserved_b4_b7,
51726
14
     {"Reserved", "wlan.ht.info.reserved_b4_b7",
51727
14
      FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL }},
51728
51729
14
    {&hf_ieee80211_ht_operation_info_delimiter2,
51730
14
     {"HT Operation Information Subset (2 of 3)", "wlan.ht.info.delim2",
51731
14
      FT_UINT16, BASE_HEX, NULL, 0,
51732
14
      NULL, HFILL }},
51733
51734
14
    {&hf_ieee80211_ht_operation_info_protection,
51735
14
     {"HT Protection", "wlan.ht.info.ht_protection",
51736
14
      FT_UINT16, BASE_HEX, VALS(ht_info_operating_protection_mode_flags), 0x0003,
51737
14
      NULL, HFILL }},
51738
51739
14
    {&hf_ieee80211_ht_operation_info_non_greenfield_sta_present,
51740
14
     {"Non-greenfield STAs present", "wlan.ht.info.greenfield",
51741
14
      FT_BOOLEAN, 16, TFS(&ht_info_non_greenfield_sta_present_flag), 0x0004,
51742
14
      NULL, HFILL }},
51743
51744
14
    {&hf_ieee80211_ht_operation_info_reserved_b11,
51745
14
     {"Reserved", "wlan.ht.info.reserved_b11",
51746
14
      FT_UINT16, BASE_HEX, NULL, 0x0008, NULL, HFILL }},
51747
51748
14
    {&hf_ieee80211_ht_operation_info_obss_non_ht_stas_present,
51749
14
     {"OBSS non-HT STAs present", "wlan.ht.info.obssnonht",
51750
14
      FT_BOOLEAN, 16, TFS(&ht_info_obss_non_ht_stas_present_flag), 0x0010,
51751
14
      NULL, HFILL }},
51752
51753
14
    {&hf_ieee80211_ht_operation_info_channel_center_freq_seg_2,
51754
14
     {"Channel Center Frequency Segment 2", "wlan.ht.info.chan_center_freq_seg_2",
51755
14
      FT_UINT16, BASE_DEC, NULL, 0x1fe0, NULL, HFILL }},
51756
51757
14
    {&hf_ieee80211_ht_operation_info_reserved_b21_b23,
51758
14
     {"Reserved", "wlan.ht.info.reserved_b21_b23",
51759
14
      FT_UINT16, BASE_HEX, NULL, 0xe000,
51760
14
      NULL, HFILL }},
51761
51762
14
    {&hf_ieee80211_ht_operation_info_delimiter3,
51763
14
     {"HT Operation Information Subset (3 of 3)", "wlan.ht.info.delim3",
51764
14
      FT_UINT16, BASE_HEX, NULL, 0,
51765
14
      NULL, HFILL }},
51766
51767
14
    {&hf_ieee80211_ht_operation_info_reserved_b24_b29,
51768
14
     {"Reserved", "wlan.ht.info.reserved_b24_b29",
51769
14
      FT_UINT16, BASE_HEX, NULL, 0x003f, NULL, HFILL }},
51770
51771
14
    {&hf_ieee80211_ht_operation_info_dual_beacon,
51772
14
     {"Dual beacon", "wlan.ht.info.dualbeacon",
51773
14
      FT_BOOLEAN, 16, TFS(&ht_info_dual_beacon_flag), 0x0040,
51774
14
      NULL, HFILL }},
51775
51776
14
    {&hf_ieee80211_ht_operation_info_dual_cts_protection,
51777
14
     {"Dual Clear To Send (CTS) protection", "wlan.ht.info.dualcts",
51778
14
      FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0080,
51779
14
      NULL, HFILL }},
51780
51781
14
    {&hf_ieee80211_ht_operation_info_stbc_beacon,
51782
14
     {"STBC Beacon", "wlan.ht.info.stbcbeacon",
51783
14
      FT_BOOLEAN, 16, TFS(&ht_info_stbc_beacon_flag), 0x0100,
51784
14
      NULL, HFILL }},
51785
51786
14
    {&hf_ieee80211_ht_operation_info_reserved_b33_b39,
51787
14
     {"Reserved", "wlan.ht.info.reserved_b33_b39",
51788
14
      FT_UINT16, BASE_HEX, NULL, 0xfe00,
51789
14
      NULL, HFILL }},
51790
51791
14
    {&hf_ieee80211_ht_operation_mcsset_reserved,
51792
14
     {"Basic HT-MCS Set: Reserved", "wlan.ht.info.mcsset_reserved",
51793
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
51794
14
      NULL, HFILL }},
51795
51796
14
    {&hf_ieee80211_tag_ap_channel_report_operating_class,
51797
14
     {"Operating Class", "wlan.ap_channel_report.operating_class",
51798
14
      FT_UINT8, BASE_DEC, NULL, 0,
51799
14
      NULL, HFILL }},
51800
51801
14
    {&hf_ieee80211_tag_ap_channel_report_channel_list,
51802
14
     {"Channel List", "wlan.ap_channel_report.channel_list",
51803
14
      FT_UINT8, BASE_DEC, NULL, 0,
51804
14
      NULL, HFILL }},
51805
51806
14
    {&hf_ieee80211_tag_secondary_channel_offset,
51807
14
     {"Secondary Channel Offset", "wlan.secchanoffset",
51808
14
      FT_UINT8, BASE_HEX, VALS(ieee80211_tag_secondary_channel_offset_flags), 0,
51809
14
      NULL, HFILL }},
51810
51811
14
    {&hf_ieee80211_tag_bss_ap_avg_access_delay,
51812
14
     {"AP Average Access Delay", "wlan.bss_ap_avg_access_delay",
51813
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
51814
14
      NULL, HFILL }},
51815
51816
14
    {&hf_ieee80211_tag_antenna_id,
51817
14
     {"Antenna ID", "wlan.antenna.id",
51818
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
51819
14
      NULL, HFILL }},
51820
51821
14
    {&hf_ieee80211_tag_rsni,
51822
14
     {"RSNI", "wlan.rsni",
51823
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(rsni_base_custom), 0x0,
51824
14
      NULL, HFILL }},
51825
51826
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask,
51827
14
     {"Available Admission Capacity Bitmask", "wlan.bss_avb_adm_cap.bitmask",
51828
14
      FT_UINT16, BASE_HEX, NULL, 0,
51829
14
      NULL, HFILL }},
51830
51831
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0,
51832
14
     {"UP0 (bit0)", "wlan.bss_avb_adm_cap.bitmask.up0",
51833
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP0,
51834
14
      NULL, HFILL }},
51835
51836
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1,
51837
14
     {"UP1 (bit1)", "wlan.bss_avb_adm_cap.bitmask.up1",
51838
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP1,
51839
14
      NULL, HFILL }},
51840
51841
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2,
51842
14
     {"UP2 (bit2)", "wlan.bss_avb_adm_cap.bitmask.up2",
51843
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP2,
51844
14
      NULL, HFILL }},
51845
51846
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3,
51847
14
     {"UP3 (bit3)", "wlan.bss_avb_adm_cap.bitmask.up3",
51848
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP3,
51849
14
      NULL, HFILL }},
51850
51851
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4,
51852
14
     {"UP4 (bit4)", "wlan.bss_avb_adm_cap.bitmask.up4",
51853
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP4,
51854
14
      NULL, HFILL }},
51855
51856
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5,
51857
14
     {"UP5 (bit5)", "wlan.bss_avb_adm_cap.bitmask.up5",
51858
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP5,
51859
14
      NULL, HFILL }},
51860
51861
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6,
51862
14
     {"UP6 (bit6)", "wlan.bss_avb_adm_cap.bitmask.up6",
51863
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP6,
51864
14
      NULL, HFILL }},
51865
51866
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7,
51867
14
     {"UP7 (bit7)", "wlan.bss_avb_adm_cap.bitmask.up7",
51868
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP7,
51869
14
      NULL, HFILL }},
51870
51871
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0,
51872
14
     {"AC0 (bit8)", "wlan.bss_avb_adm_cap.bitmask.ac0",
51873
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC0,
51874
14
      NULL, HFILL }},
51875
51876
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1,
51877
14
     {"AC1 (bit9)", "wlan.bss_avb_adm_cap.bitmask.AC1",
51878
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC1,
51879
14
      NULL, HFILL }},
51880
51881
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2,
51882
14
     {"AC2 (bit10)", "wlan.bss_avb_adm_cap.bitmask.ac2",
51883
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC2,
51884
14
      NULL, HFILL }},
51885
51886
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3,
51887
14
     {"AC3 (bit11)", "wlan.bss_avb_adm_cap.bitmask.ac3",
51888
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC3,
51889
14
      NULL, HFILL }},
51890
51891
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv,
51892
14
     {"Reserved", "wlan.bss_avb_adm_cap.bitmask.rsv",
51893
14
      FT_UINT16, BASE_HEX, NULL, BSS_BITMASK_RSV,
51894
14
      NULL, HFILL }},
51895
51896
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up0,
51897
14
     {"UP0", "wlan.bss_avb_adm_cap.up0",
51898
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51899
14
      NULL, HFILL }},
51900
51901
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up1,
51902
14
     {"UP1", "wlan.bss_avb_adm_cap.up1",
51903
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51904
14
      NULL, HFILL }},
51905
51906
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up2,
51907
14
     {"UP2", "wlan.bss_avb_adm_cap.up2",
51908
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51909
14
      NULL, HFILL }},
51910
51911
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up3,
51912
14
     {"UP3", "wlan.bss_avb_adm_cap.up3",
51913
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51914
14
      NULL, HFILL }},
51915
51916
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up4,
51917
14
     {"UP4", "wlan.bss_avb_adm_cap.up4",
51918
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51919
14
      NULL, HFILL }},
51920
51921
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up5,
51922
14
     {"UP5", "wlan.bss_avb_adm_cap.up5",
51923
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51924
14
      NULL, HFILL }},
51925
51926
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up6,
51927
14
     {"UP6", "wlan.bss_avb_adm_cap.up6",
51928
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51929
14
      NULL, HFILL }},
51930
51931
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_up7,
51932
14
     {"UP7", "wlan.bss_avb_adm_cap.up7",
51933
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51934
14
      NULL, HFILL }},
51935
51936
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_ac0,
51937
14
     {"AC0", "wlan.bss_avb_adm_cap.ac0",
51938
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51939
14
      NULL, HFILL }},
51940
51941
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_ac1,
51942
14
     {"AC1", "wlan.bss_avb_adm_cap.ac1",
51943
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51944
14
      NULL, HFILL }},
51945
51946
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_ac2,
51947
14
     {"AC2", "wlan.bss_avb_adm_cap.ac2",
51948
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51949
14
      NULL, HFILL }},
51950
51951
14
    {&hf_ieee80211_tag_bss_avb_adm_cap_ac3,
51952
14
     {"AC3", "wlan.bss_avb_adm_cap.ac3",
51953
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
51954
14
      NULL, HFILL }},
51955
51956
14
    {&hf_ieee80211_tag_bss_avg_ac_access_delay_be,
51957
14
     {"AC Average Access Delay for Best Effort", "wlan.bss_avg_ac_access_delay.be",
51958
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
51959
14
      NULL, HFILL }},
51960
51961
14
    {&hf_ieee80211_tag_bss_avg_ac_access_delay_bk,
51962
14
     {"AC Average Access Delay for Best Background", "wlan.bss_avg_ac_access_delay.bk",
51963
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
51964
14
      NULL, HFILL }},
51965
51966
14
    {&hf_ieee80211_tag_bss_avg_ac_access_delay_vi,
51967
14
     {"AC Average Access Delay for Video", "wlan.bss_avg_ac_access_delay_vi",
51968
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
51969
14
      NULL, HFILL }},
51970
51971
14
    {&hf_ieee80211_tag_bss_avg_ac_access_delay_vo,
51972
14
     {"AC Average Access Delay for Voice", "wlan.bss_avg_ac_access_delay_vo",
51973
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
51974
14
      NULL, HFILL }},
51975
51976
51977
    /* 802.11-2012 Table 8-119-RM Enabled Capabilities definition */
51978
14
    {&hf_ieee80211_tag_rm_enabled_capabilities,
51979
14
     {"RM Capabilities", "wlan.rmcap",
51980
14
      FT_UINT8, BASE_HEX, NULL, 0,
51981
14
      "Signals support for radio measurements in a device", HFILL }},
51982
51983
    /* RM Enabled Capability octet 1 */
51984
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b0,
51985
14
     {"Link Measurement", "wlan.rmcap.b0",
51986
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
51987
14
      NULL, HFILL }},
51988
51989
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b1,
51990
14
     {"Neighbor Report", "wlan.rmcap.b1",
51991
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
51992
14
      NULL, HFILL }},
51993
51994
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b2,
51995
14
     {"Parallel Measurements", "wlan.rmcap.b2",
51996
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
51997
14
      NULL, HFILL }},
51998
51999
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b3,
52000
14
     {"Repeated Measurements", "wlan.rmcap.b3",
52001
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
52002
14
      NULL, HFILL }},
52003
52004
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b4,
52005
14
     {"Beacon Passive Measurement", "wlan.rmcap.b4",
52006
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
52007
14
      NULL, HFILL }},
52008
52009
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b5,
52010
14
     {"Beacon Active Measurement", "wlan.rmcap.b5",
52011
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
52012
14
      NULL, HFILL }},
52013
52014
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b6,
52015
14
     {"Beacon Table Measurement", "wlan.rmcap.b6",
52016
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
52017
14
      NULL, HFILL }},
52018
52019
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b7,
52020
14
     {"Beacon Measurement Reporting Conditions", "wlan.rmcap.b7",
52021
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
52022
14
      NULL, HFILL }},
52023
52024
    /* RM Enabled Capability octet 2 */
52025
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b8,
52026
14
     {"Frame Measurement", "wlan.rmcap.b8",
52027
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
52028
14
      NULL, HFILL }},
52029
52030
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b9,
52031
14
     {"Channel Load Measurement", "wlan.rmcap.b9",
52032
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
52033
14
      NULL, HFILL }},
52034
52035
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b10,
52036
14
     {"Noise Histogram Measurement", "wlan.rmcap.b10",
52037
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
52038
14
      NULL, HFILL }},
52039
52040
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b11,
52041
14
     {"Statistics Measurement", "wlan.rmcap.b11",
52042
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
52043
14
      NULL, HFILL }},
52044
52045
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b12,
52046
14
     {"LCI Measurement", "wlan.rmcap.b12",
52047
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
52048
14
      NULL, HFILL }},
52049
52050
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b13,
52051
14
     {"LCI Azimuth capability", "wlan.rmcap.b13",
52052
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
52053
14
      NULL, HFILL }},
52054
52055
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b14,
52056
14
     {"Transmit Stream/Category Measurement", "wlan.rmcap.b14",
52057
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
52058
14
      NULL, HFILL }},
52059
52060
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b15,
52061
14
     {"Triggered Transmit Stream/Category Measurement", "wlan.rmcap.b15",
52062
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
52063
14
      NULL, HFILL }},
52064
52065
    /* RM Enabled Capability octet 3 */
52066
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b16,
52067
14
     {"AP Channel Report capability", "wlan.rmcap.b16",
52068
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
52069
14
      NULL, HFILL }},
52070
52071
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b17,
52072
14
     {"RM MIB capability", "wlan.rmcap.b17",
52073
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
52074
14
      NULL, HFILL }},
52075
52076
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b18to20,
52077
14
     {"Operating Channel Max Measurement Duration", "wlan.rmcap.b18to20",
52078
14
      FT_UINT8, BASE_DEC, NULL, 0x1C,
52079
14
      NULL, HFILL }},
52080
52081
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b21to23,
52082
14
     {"Nonoperating Channel Max Measurement Duration", "wlan.rmcap.b21to23",
52083
14
      FT_UINT8, BASE_DEC, NULL, 0xE0,
52084
14
      NULL, HFILL }},
52085
52086
    /* RM Enabled Capability octet 4 */
52087
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b24to26,
52088
14
     {"Measurement Pilotcapability", "wlan.rmcap.b24to26",
52089
14
      FT_UINT8, BASE_DEC, NULL, 0x07,
52090
14
      NULL, HFILL }},
52091
52092
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b27,
52093
14
     {"Measurement Pilot Transmission Information", "wlan.rmcap.b27",
52094
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
52095
14
      NULL, HFILL }},
52096
52097
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b28,
52098
14
     {"Neighbor Report TSF Offset", "wlan.rmcap.b28",
52099
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
52100
14
      NULL, HFILL }},
52101
52102
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b29,
52103
14
     {"RCPI Measurement capability", "wlan.rmcap.b29",
52104
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
52105
14
      NULL, HFILL }},
52106
52107
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b30,
52108
14
     {"RSNI Measurement capability", "wlan.rmcap.b30",
52109
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
52110
14
      NULL, HFILL }},
52111
52112
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b31,
52113
14
     {"BSS Average Access Delay capability", "wlan.rmcap.b31",
52114
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
52115
14
      NULL, HFILL }},
52116
52117
    /* RM Enabled Capability octet 5 */
52118
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b32,
52119
14
     {"BSS Available Admission Capacity capability", "wlan.rmcap.b32",
52120
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
52121
14
      NULL, HFILL }},
52122
52123
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b33,
52124
14
     {"Antenna capability", "wlan.rmcap.b33",
52125
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
52126
14
      NULL, HFILL }},
52127
52128
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b34,
52129
14
     {"FTM Range Report Capability", "wlan.rmcap.b34",
52130
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
52131
14
      NULL, HFILL }},
52132
52133
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_b35,
52134
14
     {"Civic Location Measurement Capability", "wlan.rmcap.b35",
52135
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
52136
14
      NULL, HFILL }},
52137
52138
14
    {&hf_ieee80211_tag_rm_enabled_capabilities_o5,
52139
14
     {"Reserved", "wlan.rmcap.o5",
52140
14
      FT_UINT8, BASE_HEX, NULL, 0xF0,
52141
14
      "Must be zero", HFILL }},
52142
52143
14
    {&hf_ieee80211_tag_rcpi,
52144
14
     {"RCPI", "wlan.rcpi",
52145
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(rcpi_and_power_level_custom), 0,
52146
14
      "Received channel power indicator", HFILL }},
52147
52148
    /* Multiple BSSID */
52149
14
    {&hf_ieee80211_tag_multiple_bssid,
52150
14
     {"Max BSSID Indicator", "wlan.multiple_bssid",
52151
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
52152
14
      NULL, HFILL }},
52153
52154
14
    {&hf_ieee80211_tag_multiple_bssid_subelem_id,
52155
14
     {"Subelement ID", "wlan.multiple_bssid.subelem.id",
52156
14
      FT_UINT8, BASE_DEC, VALS(multiple_bssid_subelem_ids), 0x0,
52157
14
      NULL, HFILL }},
52158
52159
14
    {&hf_ieee80211_tag_multiple_bssid_subelem_len,
52160
14
     {"Length", "wlan.multiple_bssid.subelem.len",
52161
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
52162
14
      NULL, HFILL }},
52163
52164
14
    {&hf_ieee80211_tag_multiple_bssid_subelem_reserved,
52165
14
     {"Reserved", "wlan.multiple_bssid.subelem.reserved",
52166
14
      FT_BYTES, BASE_NONE, NULL, 0,
52167
14
      NULL, HFILL }},
52168
52169
14
    {&hf_ieee80211_tag_multiple_bssid_subelem_nontrans_profile,
52170
14
     {"Nontransmitted Profile", "wlan.multiple_bssid.subelem.nontrans_profile",
52171
14
      FT_BYTES, BASE_NONE, NULL, 0,
52172
14
      NULL, HFILL }},
52173
52174
    /* 20/40 BSS Coexistence */
52175
14
    {&hf_ieee80211_tag_20_40_bc,
52176
14
     {"20/40 BSS Coexistence Flags", "wlan.20_40_bc",
52177
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
52178
14
      NULL, HFILL }},
52179
52180
14
    {&hf_ieee80211_tag_20_40_bc_information_request,
52181
14
     {"Information Request", "wlan.20_40_bc.information_request",
52182
14
      FT_BOOLEAN, 8, NULL, 0x01,
52183
14
      NULL, HFILL }},
52184
52185
14
    {&hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant,
52186
14
     {"Forty MHz Intolerant", "wlan.20_40_bc.forty_mhz_intolerant",
52187
14
      FT_BOOLEAN, 8, NULL, 0x02,
52188
14
      NULL, HFILL }},
52189
52190
14
    {&hf_ieee80211_tag_20_40_bc_20_mhz_bss_width_request,
52191
14
     {"20 MHz BSS Width Request", "wlan.20_40_bc.20_mhz_bss_width_request",
52192
14
      FT_BOOLEAN, 8, NULL, 0x04,
52193
14
      NULL, HFILL }},
52194
52195
14
    {&hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request,
52196
14
     {"OBSS Scanning Exemption Request", "wlan.20_40_bc.obss_scanning_exemption_request",
52197
14
      FT_BOOLEAN, 8, NULL, 0x08,
52198
14
      NULL, HFILL }},
52199
52200
14
    {&hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant,
52201
14
     {"OBSS Scanning Exemption Grant", "wlan.20_40_bc.obss_scanning_exemption_grant",
52202
14
      FT_BOOLEAN, 8, NULL, 0x10,
52203
14
      NULL, HFILL }},
52204
52205
14
    {&hf_ieee80211_tag_20_40_bc_reserved,
52206
14
     {"Reserved", "wlan.20_40_bc.reserved",
52207
14
      FT_UINT8, BASE_HEX, NULL, 0xE0,
52208
14
      "Must be zero", HFILL }},
52209
52210
14
    {&hf_ieee80211_tag_intolerant_operating_class,
52211
14
     {"Intolerant Operating Class", "wlan.tag.intolerant.operating_class",
52212
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
52213
52214
14
    {&hf_ieee80211_tag_intolerant_channel_list,
52215
14
     {"Intolerant Channel List", "wlan.tag.intolerant.channel_list",
52216
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
52217
52218
14
    {&hf_ieee80211_tag_intolerant_channel,
52219
14
     {"Intolerant Channel", "wlan.tag.intolerant.channel",
52220
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
52221
52222
14
    {&hf_ieee80211_tag_power_constraint_local,
52223
14
     {"Local Power Constraint", "wlan.powercon.local",
52224
14
      FT_UINT8, BASE_DEC, NULL, 0,
52225
14
      "Value that allows the mitigation requirements to be satisfied in the current channel", HFILL }},
52226
52227
14
    {&hf_ieee80211_tag_power_capability_min,
52228
14
     {"Minimum Transmit Power", "wlan.powercap.min",
52229
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
52230
14
      "The nominal minimum transmit power with which the STA is capable of transmitting in the current channel", HFILL }},
52231
52232
14
    {&hf_ieee80211_tag_power_capability_max,
52233
14
     {"Maximum Transmit Power", "wlan.powercap.max",
52234
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
52235
14
      "The nominal maximum transmit power with which the STA is capable of transmitting in the current channel", HFILL }},
52236
52237
14
    {&hf_ieee80211_tag_tpc_report_trsmt_pow,
52238
14
     {"Transmit Power", "wlan.tpcrep.trsmt_pow",
52239
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
52240
14
      NULL, HFILL }},
52241
52242
14
    {&hf_ieee80211_tag_tpc_report_link_mrg,
52243
14
     {"Link Margin", "wlan.tpcrep.link_mrg",
52244
14
      FT_INT8, BASE_DEC, NULL, 0,
52245
14
      NULL, HFILL }},
52246
52247
14
    {&hf_ieee80211_tag_tpc_report_reserved,
52248
14
     {"Reserved", "wlan.tpcrep.reserved",
52249
14
      FT_INT8, BASE_DEC, NULL, 0,
52250
14
      "TPC Link Margin field is reserved in a Beacon or Probe Response frame", HFILL }},
52251
52252
14
    {&hf_ieee80211_tag_supported_channels,
52253
14
     {"Supported Channels Set", "wlan.supchan",
52254
14
      FT_NONE, BASE_NONE, NULL, 0,
52255
14
      NULL, HFILL }},
52256
52257
14
    {&hf_ieee80211_tag_supported_channels_first,
52258
14
     {"First Supported Channel", "wlan.supchan.first",
52259
14
      FT_UINT8, BASE_DEC, NULL, 0,
52260
14
      NULL, HFILL }},
52261
52262
14
    {&hf_ieee80211_tag_supported_channels_range,
52263
14
     {"Supported Channel Range", "wlan.supchan.range",
52264
14
      FT_UINT8, BASE_DEC, NULL, 0,
52265
14
      NULL, HFILL }},
52266
52267
14
    {&hf_ieee80211_csa_channel_switch_mode,
52268
14
     {"Channel Switch Mode", "wlan.csa.channel_switch_mode",
52269
14
      FT_UINT8, BASE_DEC, NULL, 0,
52270
14
      "Indicates any restrictions on transmission until a channel switch", HFILL }},
52271
52272
14
    {&hf_ieee80211_csa_new_channel_number,
52273
14
     {"New Channel Number", "wlan.csa.new_channel_number",
52274
14
      FT_UINT8, BASE_DEC, NULL, 0,
52275
14
      "Set to the number of the channel to which the STA is moving", HFILL }},
52276
52277
14
    {&hf_ieee80211_csa_channel_switch_count,
52278
14
     {"Channel Switch Count", "wlan.csa.channel_switch.count",
52279
14
      FT_UINT8, BASE_DEC, NULL, 0,
52280
14
      "Set to the number of TBTTs until the STA sending the Channel Switch Announcement element switches to the new channel or shall be set to 0", HFILL }},
52281
52282
14
    {&hf_ieee80211_mesh_channel_switch_ttl,
52283
14
     {"Mesh Channel Switch TTL", "wlan.csa.mesh_channel_switch.ttl",
52284
14
      FT_UINT8, BASE_DEC, NULL, 0,
52285
14
      NULL, HFILL }},
52286
52287
14
    {&hf_ieee80211_mesh_channel_switch_flag,
52288
14
     {"Mesh Channel Switch Flag", "wlan.csa.mesh_channel_switch.flag",
52289
14
      FT_UINT8, BASE_HEX, NULL, 0,
52290
14
      NULL, HFILL }},
52291
52292
14
    {&hf_ieee80211_mesh_chswitch_flag_txrestrict,
52293
14
     {"CSA Tx Restrict", "wlan.csa.mesh_channel_switch.flag.txrestrict",
52294
14
      FT_BOOLEAN, 16, TFS(&csa_txrestrict_flags), 0x0001,
52295
14
      NULL, HFILL }},
52296
52297
14
    {&hf_ieee80211_mesh_chswitch_flag_initiator,
52298
14
     {"CSA Initiator", "wlan.csa.mesh_channel_switch.flag.initiator",
52299
14
      FT_BOOLEAN, 16, TFS(&csa_initiator_flags), 0x0002,
52300
14
      NULL, HFILL }},
52301
52302
14
    {&hf_ieee80211_mesh_channel_switch_reason_code,
52303
14
     {"Mesh Channel Switch Reason Code", "wlan.csa.mesh_channel_switch.reason_code",
52304
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_reason_code_ext, 0,
52305
14
      NULL, HFILL }},
52306
52307
14
    {&hf_ieee80211_mesh_channel_switch_precedence_value,
52308
14
     {"Mesh Channel Switch Precedence Value", "wlan.csa.mesh_channel_switch.pre_value",
52309
14
      FT_UINT16, BASE_DEC, NULL, 0,
52310
14
      NULL, HFILL }},
52311
52312
14
    {&hf_ieee80211_mesh_awake_window,
52313
14
     {"Mesh Awake Window", "wlan.mesh.mesh_awake_window",
52314
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(mesh_active_window_base_custom), 0,
52315
14
      NULL, HFILL }},
52316
52317
14
    {&hf_ieee80211_tag_measure_request_token,
52318
14
     {"Measurement Token", "wlan.measure.req.token",
52319
14
      FT_UINT8, BASE_HEX, NULL, 0,
52320
14
      NULL, HFILL }},
52321
52322
14
    {&hf_ieee80211_tag_measure_request_mode,
52323
14
     {"Measurement Request Mode", "wlan.measure.req.mode",
52324
14
      FT_UINT8, BASE_HEX, NULL, 0,
52325
14
      NULL, HFILL }},
52326
52327
14
    {&hf_ieee80211_tag_measure_request_mode_parallel,
52328
14
     {"Parallel", "wlan.measure.req.reqmode.parallel",
52329
14
      FT_BOOLEAN, 8, NULL, 0x01,
52330
14
      NULL, HFILL }},
52331
52332
14
    {&hf_ieee80211_tag_measure_request_mode_enable,
52333
14
     {"Measurement Request Mode Field", "wlan.measure.req.reqmode.enable",
52334
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
52335
14
      NULL, HFILL }},
52336
52337
14
    {&hf_ieee80211_tag_measure_request_mode_request,
52338
14
     {"Measurement Reports", "wlan.measure.req.reqmode.request",
52339
14
      FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x04,
52340
14
      NULL, HFILL }},
52341
52342
14
    {&hf_ieee80211_tag_measure_request_mode_report,
52343
14
     {"Autonomous Measurement Reports", "wlan.measure.req.reqmode.report",
52344
14
      FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x08,
52345
14
      NULL, HFILL }},
52346
52347
14
    {&hf_ieee80211_tag_measure_request_mode_duration_mandatory,
52348
14
     {"Duration Mandatory", "wlan.measure.req.reqmode.duration_mandatory",
52349
14
      FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x10,
52350
14
      NULL, HFILL }},
52351
52352
14
    {&hf_ieee80211_tag_measure_request_mode_reserved,
52353
14
     {"Reserved", "wlan.measure.req.reqmode.reserved",
52354
14
      FT_UINT8, BASE_HEX, NULL, 0xE0,
52355
14
      NULL, HFILL }},
52356
52357
14
    {&hf_ieee80211_tag_measure_request_type,
52358
14
     {"Measurement Request Type", "wlan.measure.req.reqtype",
52359
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_request_type_flags_ext, 0x00,
52360
14
      NULL, HFILL }},
52361
52362
14
    {&hf_ieee80211_tag_measure_request_channel_number,
52363
14
     {"Measurement Channel Number", "wlan.measure.req.channelnumber",
52364
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
52365
14
      NULL, HFILL }},
52366
52367
14
    {&hf_ieee80211_tag_measure_request_start_time,
52368
14
     {"Measurement Start Time", "wlan.measure.req.starttime",
52369
14
      FT_UINT64, BASE_HEX, NULL, 0,
52370
14
      NULL, HFILL }},
52371
52372
14
    {&hf_ieee80211_tag_measure_request_duration,
52373
14
     {"Measurement Duration", "wlan.measure.req.duration",
52374
14
      FT_UINT16, BASE_HEX, NULL, 0,
52375
14
      "in TU (1 TU = 1024 us)", HFILL }},
52376
52377
14
    {&hf_ieee80211_tag_measure_request_operating_class,
52378
14
     {"Operating Class", "wlan.measure.req.operatingclass",
52379
14
      FT_UINT8, BASE_DEC, NULL, 0,
52380
14
      NULL, HFILL }},
52381
52382
14
    {&hf_ieee80211_tag_measure_request_randomization_interval,
52383
14
     {"Randomization Interval", "wlan.measure.req.randint",
52384
14
      FT_UINT16, BASE_HEX, NULL, 0,
52385
14
      "in TU (1 TU = 1024 us)", HFILL }},
52386
52387
14
    {&hf_ieee80211_tag_measure_request_measurement_mode,
52388
14
     {"Measurement Mode", "wlan.measure.req.measurementmode",
52389
14
      FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_measurement_mode_flags), 0,
52390
14
      NULL, HFILL }},
52391
52392
14
    {&hf_ieee80211_tag_measure_request_bssid,
52393
14
     {"BSSID", "wlan.measure.req.bssid",
52394
14
      FT_ETHER, BASE_NONE, NULL, 0,
52395
14
      NULL, HFILL }},
52396
52397
14
    {&hf_ieee80211_tag_measure_request_subelement_length,
52398
14
     {"Length", "wlan.measure.req.sub.length",
52399
14
      FT_UINT8, BASE_DEC, NULL, 0,
52400
14
      NULL, HFILL }},
52401
52402
14
    {&hf_ieee80211_tag_measure_request_beacon_sub_id,
52403
14
     {"SubElement ID", "wlan.measure.req.beacon.sub.id",
52404
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_beacon_sub_id_flags), 0,
52405
14
      NULL, HFILL }},
52406
52407
14
    {&hf_ieee80211_tag_measure_request_beacon_sub_ssid,
52408
14
     {"SSID", "wlan.measure.req.beacon.sub.ssid",
52409
14
      FT_STRING, BASE_NONE, NULL, 0,
52410
14
      NULL, HFILL }},
52411
52412
14
    {&hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition,
52413
14
     {"Reporting Condition", "wlan.measure.req.beacon.sub.bri.repcond",
52414
14
      FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition_flags), 0,
52415
14
      NULL, HFILL }},
52416
52417
14
    {&hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset,
52418
14
     {"Threshold/Offset", "wlan.measure.req.beacon.sub.bri.threshold_offset",
52419
14
      FT_UINT8, BASE_HEX, NULL, 0,
52420
14
      NULL, HFILL }},
52421
52422
14
    {&hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail,
52423
14
     {"Reporting Detail", "wlan.measure.req.beacon.sub.bri.reporting_detail",
52424
14
      FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_beacon_sub_reporting_detail_flags), 0,
52425
14
      NULL, HFILL }},
52426
52427
14
    {&hf_ieee80211_tag_measure_request_beacon_sub_last_report_indication_request,
52428
14
     {"Request Indication", "wlan.measure.req.beacon.sub.last_report_ind_req",
52429
14
      FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0,
52430
14
      NULL, HFILL }},
52431
52432
14
    {&hf_ieee80211_tag_measure_request_beacon_unknown,
52433
14
     {"Unknown Data", "wlan.measure.req.beacon.unknown",
52434
14
      FT_BYTES, BASE_NONE, NULL, 0,
52435
14
      "(not interpreted)", HFILL }},
52436
52437
14
    {&hf_ieee80211_tag_measure_request_channel_load_sub_id,
52438
14
     {"SubElement ID", "wlan.measure.req.channel_load.sub.id",
52439
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_channel_load_sub_id_vals), 0,
52440
14
      NULL, HFILL }},
52441
52442
14
    {&hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition,
52443
14
     {"Reporting Condition", "wlan.measure.req.channel_load.sub.repcond",
52444
14
      FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_channel_load_sub_reporting_condition_vals), 0,
52445
14
      NULL, HFILL }},
52446
52447
14
    {&hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref,
52448
14
     {"Reference Value", "wlan.measure.req.channel_load.sub.ref",
52449
14
      FT_UINT8, BASE_HEX, NULL, 0,
52450
14
      NULL, HFILL }},
52451
52452
52453
14
    {&hf_ieee80211_tag_measure_request_noise_histogram_sub_id,
52454
14
     {"SubElement ID", "wlan.measure.req.noise_histogram.sub.id",
52455
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_noise_histogram_sub_id_vals), 0,
52456
14
      NULL, HFILL }},
52457
52458
14
    {&hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition,
52459
14
     {"Reporting Condition", "wlan.measure.reqnoise_histogram.sub.repcond",
52460
14
      FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition_vals), 0,
52461
14
      NULL, HFILL }},
52462
52463
14
    {&hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref,
52464
14
     {"ANPI Reference Value", "wlan.measure.req.noise_histogram.sub.anpiref",
52465
14
      FT_UINT8, BASE_HEX, NULL, 0,
52466
14
      NULL, HFILL }},
52467
52468
52469
14
    {&hf_ieee80211_tag_measure_request_frame_request_type,
52470
14
     {"Frame Request Type", "wlan.measure.req.frame_request_type",
52471
14
      FT_UINT8, BASE_HEX, NULL, 0,
52472
14
      NULL, HFILL }},
52473
52474
14
    {&hf_ieee80211_tag_measure_request_mac_address,
52475
14
     {"MAC Address", "wlan.measure.req.mac_address",
52476
14
      FT_BYTES, BASE_NONE, NULL, 0,
52477
14
      NULL, HFILL }},
52478
52479
14
    {&hf_ieee80211_tag_measure_request_peer_mac_address,
52480
14
     {"Peer MAC Address", "wlan.measure.req.peer_mac_address",
52481
14
      FT_BYTES, BASE_NONE, NULL, 0,
52482
14
      NULL, HFILL }},
52483
52484
14
    {&hf_ieee80211_tag_measure_request_group_id,
52485
14
     {"Group ID", "wlan.measure.req.groupid",
52486
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_request_group_id_flags_ext, 0,
52487
14
      NULL, HFILL }},
52488
52489
14
    {&hf_ieee80211_tag_measure_request_location_subject,
52490
14
     {"Location Subject", "wlan.measure.req.location_subject",
52491
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_location_subject), 0,
52492
14
      NULL, HFILL }},
52493
52494
14
    {&hf_ieee80211_tag_measure_request_civic_location_type,
52495
14
     {"Civic Location Type", "wlan.measure.req.location_type",
52496
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_civic_location_type), 0,
52497
14
      NULL, HFILL }},
52498
52499
14
    {&hf_ieee80211_tag_measure_request_location_service_interval_units,
52500
14
     {"Location Service Interval Units", "wlan.measure.req.location_service_interval_units",
52501
14
      FT_UINT8, BASE_DEC, NULL, 0,
52502
14
      NULL, HFILL }},
52503
52504
14
    {&hf_ieee80211_tag_measure_request_location_service_interval,
52505
14
     {"Location Service Interval", "wlan.measure.req.location_service_interval",
52506
14
      FT_UINT16, BASE_DEC, NULL, 0,
52507
14
      NULL, HFILL }},
52508
52509
14
    {&hf_ieee80211_tag_measure_request_unknown,
52510
14
     {"Unknown Data", "wlan.measure.req.unknown",
52511
14
      FT_BYTES, BASE_NONE, NULL, 0,
52512
14
      "(not interpreted)", HFILL }},
52513
52514
14
    {&hf_ieee80211_tag_measure_report_measurement_token,
52515
14
     {"Measurement Token", "wlan.measure.rep.token",
52516
14
      FT_UINT8, BASE_HEX, NULL, 0,
52517
14
      NULL, HFILL }},
52518
52519
14
    {&hf_ieee80211_tag_measure_report_mode,
52520
14
     {"Measurement Report Mode", "wlan.measure.rep.mode",
52521
14
      FT_UINT8, BASE_HEX, NULL, 0,
52522
14
      NULL, HFILL }},
52523
52524
14
    {&hf_ieee80211_tag_measure_report_mode_late,
52525
14
     {"Late", "wlan.measure.rep.repmode.late",
52526
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
52527
14
      NULL, HFILL }},
52528
52529
14
    {&hf_ieee80211_tag_measure_report_mode_incapable,
52530
14
     {"Incapable", "wlan.measure.rep.repmode.incapable",
52531
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
52532
14
      NULL, HFILL }},
52533
52534
14
    {&hf_ieee80211_tag_measure_report_mode_refused,
52535
14
     {"Refused", "wlan.measure.rep.repmode.refused",
52536
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
52537
14
      NULL, HFILL }},
52538
52539
14
    {&hf_ieee80211_tag_measure_report_mode_reserved,
52540
14
     {"Reserved", "wlan.measure.rep.repmode.reserved",
52541
14
      FT_UINT8, BASE_HEX, NULL, 0xf8,
52542
14
      NULL, HFILL }},
52543
52544
14
    {&hf_ieee80211_tag_measure_report_type,
52545
14
     {"Measurement Report Type", "wlan.measure.rep.reptype",
52546
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_report_type_flags_ext, 0x00,
52547
14
      NULL, HFILL }},
52548
52549
14
    {&hf_ieee80211_tag_measure_report_channel_number,
52550
14
     {"Measurement Channel Number", "wlan.measure.rep.channelnumber",
52551
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
52552
14
      NULL, HFILL }},
52553
52554
14
    {&hf_ieee80211_tag_measure_report_start_time,
52555
14
     {"Measurement Start Time", "wlan.measure.rep.starttime",
52556
14
      FT_UINT64, BASE_HEX, NULL, 0,
52557
14
      NULL, HFILL }},
52558
52559
14
    {&hf_ieee80211_tag_measure_report_duration,
52560
14
     {"Measurement Duration", "wlan.measure.rep.duration",
52561
14
      FT_UINT16, BASE_HEX, NULL, 0,
52562
14
      NULL, HFILL }},
52563
52564
14
    {&hf_ieee80211_tag_measure_report_beacon_unknown,
52565
14
     {"Unknown Data", "wlan.measure.rep.beacon.unknown",
52566
14
      FT_BYTES, BASE_NONE, NULL, 0,
52567
14
      "(not interpreted)", HFILL }},
52568
52569
14
    {&hf_ieee80211_tag_measure_reported_frame_frag_id,
52570
14
     {"Fragment ID", "wlan.measure.rep.beacon.frag_id",
52571
14
      FT_UINT16, BASE_HEX, NULL, 0,
52572
14
      NULL, HFILL}},
52573
52574
14
    {&hf_ieee80211_tag_measure_reported_frame_frag_rep_id,
52575
14
     {"Beacon Report ID", "wlan.measure.rep.beacon.frag_id.report_id",
52576
14
      FT_UINT16, BASE_HEX, NULL, 0x00ff,
52577
14
      NULL, HFILL}},
52578
52579
14
    {&hf_ieee80211_tag_measure_reported_frame_frag_number,
52580
14
     {"Fragment ID Number", "wlan.measure.rep.beacon.frag_id.number",
52581
14
      FT_UINT16, BASE_HEX, NULL, 0x7f00,
52582
14
      NULL, HFILL}},
52583
52584
14
    {&hf_ieee80211_tag_measure_reported_frame_frag_more,
52585
14
     {"More Frame Body Fragments", "wlan.measure.rep.beacon.frag_id.more",
52586
14
      FT_UINT16, BASE_HEX, NULL, 0x8000,
52587
14
      NULL, HFILL}},
52588
52589
14
    {&hf_ieee80211_tag_measure_cca_busy_fraction,
52590
14
     {"CCA Busy Fraction", "wlan.measure.rep.ccabusy",
52591
14
      FT_UINT8, BASE_HEX, NULL, 0,
52592
14
      NULL, HFILL }},
52593
52594
14
    {&hf_ieee80211_tag_measure_basic_map_field,
52595
14
     {"Map Field", "wlan.measure.rep.mapfield",
52596
14
      FT_UINT8, BASE_HEX, NULL, 0,
52597
14
      NULL, HFILL }},
52598
52599
14
    {&hf_ieee80211_tag_measure_map_field_bss,
52600
14
     {"BSS", "wlan.measure.rep.repmode.mapfield.bss",
52601
14
      FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_map_field_bss_flag), 0x01,
52602
14
      NULL, HFILL }},
52603
52604
14
    {&hf_ieee80211_tag_measure_map_field_ofdm,
52605
14
     {"Orthogonal Frequency Division Multiplexing (OFDM) Preamble", "wlan.measure.rep.repmode.mapfield.ofdm_preamble",
52606
14
      FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02,
52607
14
      NULL, HFILL }},
52608
52609
14
    {&hf_ieee80211_tag_measure_map_field_unident_signal,
52610
14
     {"Unidentified Signal", "wlan.measure.rep.repmode.mapfield.unidentsig",
52611
14
      FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x04,
52612
14
      NULL, HFILL }},
52613
52614
14
    {&hf_ieee80211_tag_measure_map_field_radar,
52615
14
     {"Radar", "wlan.measure.rep.repmode.mapfield.radar",
52616
14
      FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x08,
52617
14
      NULL, HFILL }},
52618
52619
14
    {&hf_ieee80211_tag_measure_map_field_unmeasured,
52620
14
     {"Unmeasured", "wlan.measure.rep.repmode.mapfield.unmeasured",
52621
14
      FT_BOOLEAN, 8, NULL, 0x10,
52622
14
      NULL, HFILL }},
52623
52624
14
    {&hf_ieee80211_tag_measure_map_field_reserved,
52625
14
     {"Reserved", "wlan.measure.rep.repmode.mapfield.reserved",
52626
14
      FT_UINT8, BASE_HEX, NULL, 0xe0,
52627
14
      NULL, HFILL }},
52628
52629
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report,
52630
14
     {"Receive Power Indicator (RPI) Histogram Report", "wlan.measure.rep.rpi.histogram_report",
52631
14
      FT_BYTES, BASE_NONE, NULL, 0,
52632
14
      NULL, HFILL }},
52633
52634
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_0,
52635
14
     {"RPI 0 Density", "wlan.measure.rep.rpi.rpi0density",
52636
14
      FT_UINT8, BASE_HEX, NULL, 0,
52637
14
      "Receive Power Indicator (RPI) 0 Density", HFILL }},
52638
52639
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_1,
52640
14
     {"RPI 1 Density", "wlan.measure.rep.rpi.rpi1density",
52641
14
      FT_UINT8, BASE_HEX, NULL, 0,
52642
14
      "Receive Power Indicator (RPI) 1 Density", HFILL }},
52643
52644
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_2,
52645
14
     {"RPI 2 Density", "wlan.measure.rep.rpi.rpi2density",
52646
14
      FT_UINT8, BASE_HEX, NULL, 0,
52647
14
      "Receive Power Indicator (RPI) 2 Density", HFILL }},
52648
52649
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_3,
52650
14
     {"RPI 3 Density", "wlan.measure.rep.rpi.rpi3density",
52651
14
      FT_UINT8, BASE_HEX, NULL, 0,
52652
14
      "Receive Power Indicator (RPI) 3 Density", HFILL }},
52653
52654
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_4,
52655
14
     {"RPI 4 Density", "wlan.measure.rep.rpi.rpi4density",
52656
14
      FT_UINT8, BASE_HEX, NULL, 0,
52657
14
      "Receive Power Indicator (RPI) 4 Density", HFILL }},
52658
52659
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_5,
52660
14
     {"RPI 5 Density", "wlan.measure.rep.rpi.rpi5density",
52661
14
      FT_UINT8, BASE_HEX, NULL, 0,
52662
14
      "Receive Power Indicator (RPI) 5 Density", HFILL }},
52663
52664
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_6,
52665
14
     {"RPI 6 Density", "wlan.measure.rep.rpi.rpi6density",
52666
14
      FT_UINT8, BASE_HEX, NULL, 0,
52667
14
      "Receive Power Indicator (RPI) 6 Density", HFILL }},
52668
52669
14
    {&hf_ieee80211_tag_measure_rpi_histogram_report_7,
52670
14
     {"RPI 7 Density", "wlan.measure.rep.rpi.rpi7density",
52671
14
      FT_UINT8, BASE_HEX, NULL, 0,
52672
14
      "Receive Power Indicator (RPI) 7 Density", HFILL }},
52673
52674
14
    {&hf_ieee80211_tag_measure_report_operating_class,
52675
14
     {"Operating Class", "wlan.measure.rep.operatingclass",
52676
14
      FT_UINT8, BASE_DEC, NULL, 0,
52677
14
      NULL, HFILL }},
52678
52679
14
    {&hf_ieee80211_tag_measure_report_channel_load,
52680
14
     {"Channel Load", "wlan.measure.rep.chanload",
52681
14
      FT_UINT8, BASE_HEX, NULL, 0,
52682
14
      NULL, HFILL }},
52683
52684
14
    {&hf_ieee80211_tag_measure_report_frame_info,
52685
14
     {"Reported Frame Information", "wlan.measure.rep.frameinfo",
52686
14
      FT_UINT8, BASE_HEX, NULL, 0,
52687
14
      NULL, HFILL }},
52688
52689
14
    {&hf_ieee80211_tag_measure_report_frame_info_phy_type,
52690
14
     {"Condensed PHY", "wlan.measure.rep.frameinfo.phytype",
52691
14
      FT_UINT8, BASE_HEX, NULL, 0x7F,
52692
14
      NULL, HFILL }},
52693
52694
14
    {&hf_ieee80211_tag_measure_report_frame_info_frame_type,
52695
14
     {"Reported Frame Type", "wlan.measure.rep.frameinfo.frametype",
52696
14
      FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_report_frame_info_frame_type_flag), 0x80,
52697
14
      NULL, HFILL }},
52698
52699
14
    {&hf_ieee80211_tag_measure_report_rcpi,
52700
14
     {"Received Channel Power Indicator (RCPI)", "wlan.measure.rep.rcpi",
52701
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(rcpi_and_power_level_custom), 0,
52702
14
      "in dBm", HFILL }},
52703
52704
14
    {&hf_ieee80211_tag_measure_report_rsni,
52705
14
     {"Received Signal to Noise Indicator (RSNI)", "wlan.measure.rep.rsni",
52706
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(rsni_base_custom), 0,
52707
14
      "in dB", HFILL }},
52708
52709
14
    {&hf_ieee80211_tag_measure_report_bssid,
52710
14
     {"BSSID Being Reported", "wlan.measure.rep.bssid",
52711
14
      FT_ETHER, BASE_NONE, NULL, 0,
52712
14
      NULL, HFILL }},
52713
52714
14
    {&hf_ieee80211_tag_measure_report_ant_id,
52715
14
     {"Antenna ID", "wlan.measure.rep.antid",
52716
14
      FT_UINT8, BASE_HEX, NULL, 0,
52717
14
      NULL, HFILL }},
52718
52719
14
    {&hf_ieee80211_tag_measure_report_anpi,
52720
14
     {"ANPI", "wlan.measure.rep.anpi",
52721
14
      FT_UINT8, BASE_HEX, NULL, 0,
52722
14
      NULL, HFILL }},
52723
52724
14
    {&hf_ieee80211_tag_measure_report_ipi_density_0,
52725
14
     {"IPI Density 0", "wlan.measure.rep.ipi_density0",
52726
14
      FT_UINT8, BASE_HEX, NULL, 0,
52727
14
      NULL, HFILL }},
52728
52729
14
    {&hf_ieee80211_tag_measure_report_ipi_density_1,
52730
14
     {"IPI Density 1", "wlan.measure.rep.ipi_density1",
52731
14
      FT_UINT8, BASE_HEX, NULL, 0,
52732
14
      NULL, HFILL }},
52733
52734
14
    {&hf_ieee80211_tag_measure_report_ipi_density_2,
52735
14
     {"IPI Density 2", "wlan.measure.rep.ipi_density2",
52736
14
      FT_UINT8, BASE_HEX, NULL, 0,
52737
14
      NULL, HFILL }},
52738
52739
14
    {&hf_ieee80211_tag_measure_report_ipi_density_3,
52740
14
     {"IPI Density 3", "wlan.measure.rep.ipi_density3",
52741
14
      FT_UINT8, BASE_HEX, NULL, 0,
52742
14
      NULL, HFILL }},
52743
52744
14
    {&hf_ieee80211_tag_measure_report_ipi_density_4,
52745
14
     {"IPI Density 4", "wlan.measure.rep.ipi_density4",
52746
14
      FT_UINT8, BASE_HEX, NULL, 0,
52747
14
      NULL, HFILL }},
52748
52749
14
    {&hf_ieee80211_tag_measure_report_ipi_density_5,
52750
14
     {"IPI Density 5", "wlan.measure.rep.ipi_density5",
52751
14
      FT_UINT8, BASE_HEX, NULL, 0,
52752
14
      NULL, HFILL }},
52753
52754
14
    {&hf_ieee80211_tag_measure_report_ipi_density_6,
52755
14
     {"IPI Density 6", "wlan.measure.rep.ipi_density6",
52756
14
      FT_UINT8, BASE_HEX, NULL, 0,
52757
14
      NULL, HFILL }},
52758
52759
14
    {&hf_ieee80211_tag_measure_report_ipi_density_7,
52760
14
     {"IPI Density 7", "wlan.measure.rep.ipi_density7",
52761
14
      FT_UINT8, BASE_HEX, NULL, 0,
52762
14
      NULL, HFILL }},
52763
52764
14
    {&hf_ieee80211_tag_measure_report_ipi_density_8,
52765
14
     {"IPI Density 8", "wlan.measure.rep.ipi_density8",
52766
14
      FT_UINT8, BASE_HEX, NULL, 0,
52767
14
      NULL, HFILL }},
52768
52769
14
    {&hf_ieee80211_tag_measure_report_ipi_density_9,
52770
14
     {"IPI Density 9", "wlan.measure.rep.ipi_density9",
52771
14
      FT_UINT8, BASE_HEX, NULL, 0,
52772
14
      NULL, HFILL }},
52773
52774
14
    {&hf_ieee80211_tag_measure_report_ipi_density_10,
52775
14
     {"IPI Density 10", "wlan.measure.rep.ipi_density10",
52776
14
      FT_UINT8, BASE_HEX, NULL, 0,
52777
14
      NULL, HFILL }},
52778
52779
14
    {&hf_ieee80211_tag_measure_report_parent_tsf,
52780
14
     {"Parent Timing Synchronization Function (TSF)", "wlan.measure.rep.parenttsf",
52781
14
      FT_UINT32, BASE_HEX, NULL, 0,
52782
14
      NULL, HFILL }},
52783
52784
14
    {&hf_ieee80211_tag_measure_report_subelement_length,
52785
14
     {"Length", "wlan.measure.rep.sub.length",
52786
14
      FT_UINT8, BASE_DEC, NULL, 0,
52787
14
      NULL, HFILL }},
52788
52789
14
    {&hf_ieee80211_tag_measure_report_beacon_sub_id,
52790
14
     {"SubElement ID", "wlan.measure.rep.beacon.sub.id",
52791
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_report_beacon_sub_id_vals), 0,
52792
14
      NULL, HFILL }},
52793
52794
14
    {&hf_ieee80211_tag_measure_report_unknown,
52795
14
     {"Unknown Data", "wlan.measure.rep.unknown",
52796
14
      FT_BYTES, BASE_NONE, NULL, 0,
52797
14
      "(not interpreted)", HFILL }},
52798
52799
14
    {&hf_ieee80211_tag_measure_report_beacon_sub_last_report_indication,
52800
14
     {"Last Report", "wlan.measure.rep.beacon.sub.last_report",
52801
14
      FT_BOOLEAN, BASE_NONE, TFS(&tfs_yes_no), 0,
52802
14
      NULL, HFILL }},
52803
52804
14
    {&hf_ieee80211_tag_measure_report_lci_sub_id,
52805
14
     {"SubElement ID", "wlan.measure.rep.lci.sub.id",
52806
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_report_lci_sub_id_vals), 0,
52807
14
      NULL, HFILL }},
52808
52809
14
    {&hf_ieee80211_tag_measure_report_lci_lci,
52810
14
     {"LCI", "wlan.measure.rep.lci.lci",
52811
14
      FT_BYTES, BASE_NONE, NULL, 0,
52812
14
      "Location Configuration Information", HFILL }},
52813
52814
14
    {&hf_ieee80211_tag_measure_report_lci_z_sta_floor_info,
52815
14
     {"STA Floor Info", "wlan.measure.rep.lci.z.sta_floor_info",
52816
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
52817
14
      NULL, HFILL }},
52818
52819
14
    {&hf_ieee80211_tag_measure_report_lci_z_sta_floor_info_expected_to_move,
52820
14
     {"Expected To Move", "wlan.measure.rep.lci.z.sta_floor_info.expected_to_move",
52821
14
      FT_UINT16, BASE_DEC, NULL, 0x0003,
52822
14
      NULL, HFILL }},
52823
52824
14
    {&hf_ieee80211_tag_measure_report_lci_z_sta_floor_info_sta_floor_number,
52825
14
     {"STA Floor Number", "wlan.measure.rep.lci.z.sta_floor_info.sta_floor_number",
52826
14
      FT_UINT16, BASE_DEC, NULL, 0xFFFC,
52827
14
      NULL, HFILL }},
52828
52829
14
    {&hf_ieee80211_tag_measure_report_lci_z_sta_height_above_floor,
52830
14
     {"STA Height Above Floor", "wlan.measure.rep.lci.z.sta_height_above_floor",
52831
14
      FT_UINT24, BASE_DEC, NULL, 0x0,
52832
14
      NULL, HFILL }},
52833
52834
14
    {&hf_ieee80211_tag_measure_report_lci_z_sta_height_above_floor_uncertainty,
52835
14
     {"STA Height Above Floor Uncertainty", "wlan.measure.rep.lci.z.sta_height_above_floor_uncertainty",
52836
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
52837
14
      NULL, HFILL }},
52838
52839
14
    {&hf_ieee80211_tag_measure_report_lci_urp,
52840
14
     {"Usage Rules/Policy Parameters", "wlan.measure.rep.lci.urp",
52841
14
      FT_UINT8, BASE_HEX, NULL, 0x0,
52842
14
      NULL, HFILL }},
52843
52844
14
    {&hf_ieee80211_tag_measure_report_lci_urp_retransmission_allowed,
52845
14
     {"Retransmission Allowed", "wlan.measure.rep.lci.urp.retransmission_allowed",
52846
14
      FT_BOOLEAN, 8, NULL, 0x01,
52847
14
      NULL, HFILL }},
52848
52849
14
    {&hf_ieee80211_tag_measure_report_lci_urp_retention_expires_relative_present,
52850
14
     {"Retention Expires Relative Present", "wlan.measure.rep.lci.urp.retention_expires_relative_present",
52851
14
      FT_BOOLEAN, 8, NULL, 0x02,
52852
14
      NULL, HFILL }},
52853
52854
14
    {&hf_ieee80211_tag_measure_report_lci_urp_sta_location_policy,
52855
14
     {"STA Location Policy", "wlan.measure.rep.lci.urp.sta_location_policy",
52856
14
      FT_BOOLEAN, 8, NULL, 0x04,
52857
14
      NULL, HFILL }},
52858
52859
14
    {&hf_ieee80211_tag_measure_report_lci_urp_reserved,
52860
14
     {"Reserved", "wlan.measure.rep.lci.urp.reserved",
52861
14
      FT_UINT8, BASE_HEX, NULL, 0xF8,
52862
14
      NULL, HFILL }},
52863
52864
14
    {&hf_ieee80211_tag_measure_report_lci_urp_retention_expires_relative,
52865
14
     {"Retention Expires Relative", "wlan.measure.rep.lci.urp.retention_expires_relative",
52866
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
52867
14
      NULL, HFILL }},
52868
52869
14
    {&hf_ieee80211_tag_measure_report_lci_unknown,
52870
14
     {"Unknown Data", "wlan.measure.rep.lci.unknown",
52871
14
      FT_BYTES, BASE_NONE, NULL, 0,
52872
14
      "(not interpreted)", HFILL }},
52873
52874
14
    {&hf_ieee80211_tag_measure_report_civic_location_type,
52875
14
     {"Civic Location Type", "wlan.measure.rep.location_subject",
52876
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_civic_location_type), 0,
52877
14
      NULL, HFILL }},
52878
52879
14
    {&hf_ieee80211_tag_measure_report_civic_sub_id,
52880
14
     {"SubElement ID", "wlan.measure.rep.civic.sub.id",
52881
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_report_civic_sub_id_vals), 0,
52882
14
      NULL, HFILL }},
52883
52884
14
    {&hf_ieee80211_tag_measure_report_location_civic_country,
52885
14
     {"Country", "wlan.measure.rep.civic.sub.country",
52886
14
      FT_STRING, BASE_NONE, NULL, 0,
52887
14
      NULL, HFILL }},
52888
52889
14
    {&hf_ieee80211_tag_measure_report_location_civic_type,
52890
14
     {"Type", "wlan.measure.rep.civic.sub.type",
52891
14
      FT_UINT8, BASE_DEC, NULL, 0,
52892
14
      NULL, HFILL }},
52893
52894
14
    {&hf_ieee80211_tag_measure_report_location_civic_length,
52895
14
     {"Length", "wlan.measure.rep.civic.sub.length",
52896
14
      FT_UINT8, BASE_DEC, NULL, 0,
52897
14
      NULL, HFILL }},
52898
52899
14
    {&hf_ieee80211_tag_measure_report_location_civic,
52900
14
     {"Location Civic", "wlan.measure.rep.civic.sub.location_civic",
52901
14
      FT_STRING, BASE_NONE, NULL, 0,
52902
14
      NULL, HFILL }},
52903
52904
14
    {&hf_ieee80211_tag_quiet_count,
52905
14
     {"Count", "wlan.quiet.count",
52906
14
      FT_UINT8, BASE_DEC, NULL, 0,
52907
14
      "Set to the number of TBTTs until the beacon interval during which the next quiet interval shall start", HFILL }},
52908
52909
14
    {&hf_ieee80211_tag_quiet_period,
52910
14
     {"Period", "wlan.quiet.period",
52911
14
      FT_UINT8, BASE_DEC, NULL, 0,
52912
14
      "Set to the number of beacon intervals between the start of regularly scheduled quiet intervals", HFILL }},
52913
52914
14
    {&hf_ieee80211_tag_quiet_duration,
52915
14
     {"Duration", "wlan.quiet.duration",
52916
14
      FT_UINT16, BASE_DEC, NULL, 0,
52917
14
      "Set to the duration of the quiet interval", HFILL }},
52918
52919
14
    {&hf_ieee80211_tag_quiet_offset,
52920
14
     {"Offset", "wlan.quiet.offset",
52921
14
      FT_UINT16, BASE_DEC, NULL, 0,
52922
14
      "Set to the offset of the start of the quiet interval from the TBTT", HFILL }},
52923
52924
14
    {&hf_ieee80211_tag_dfs_owner,
52925
14
     {"Owner", "wlan.dfs.owner",
52926
14
      FT_ETHER, BASE_NONE, NULL, 0,
52927
14
      "Set to the individual IEEE MAC address of the STA that is the currently known DFS Owner in the IBSS", HFILL  }},
52928
52929
14
    {&hf_ieee80211_tag_dfs_recovery_interval,
52930
14
     {"Recovery Interval", "wlan.dfs.recovery_interval",
52931
14
      FT_UINT8, BASE_DEC, NULL, 0,
52932
14
      "Indicates the time interval that shall be used for DFS owner recovery", HFILL  }},
52933
52934
14
    {&hf_ieee80211_tag_dfs_channel_map,
52935
14
     {"Channel Map", "wlan.dfs.channel_map",
52936
14
      FT_NONE, BASE_NONE, NULL, 0,
52937
14
      NULL, HFILL  }},
52938
52939
14
    {&hf_ieee80211_tag_dfs_channel_number,
52940
14
     {"Channel Number", "wlan.dfs.channel_number",
52941
14
      FT_UINT8, BASE_DEC, NULL, 0,
52942
14
      NULL, HFILL  }},
52943
52944
14
    {&hf_ieee80211_tag_dfs_map,
52945
14
     {"Map", "wlan.dfs.map",
52946
14
      FT_UINT8, BASE_HEX, NULL, 0,
52947
14
      NULL, HFILL  }},
52948
52949
14
    {&hf_ieee80211_tag_erp_info,
52950
14
     {"ERP Information", "wlan.erp_info",
52951
14
      FT_UINT8, BASE_HEX, NULL, 0,
52952
14
      NULL, HFILL  }},
52953
52954
14
    {&hf_ieee80211_tag_erp_info_erp_present,
52955
14
     {"Non ERP Present", "wlan.erp_info.erp_present",
52956
14
      FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
52957
14
      NULL, HFILL  }},
52958
52959
14
    {&hf_ieee80211_tag_erp_info_use_protection,
52960
14
     {"Use Protection", "wlan.erp_info.use_protection",
52961
14
      FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
52962
14
      NULL, HFILL  }},
52963
52964
14
    {&hf_ieee80211_tag_erp_info_barker_preamble_mode,
52965
14
     {"Barker Preamble Mode", "wlan.erp_info.barker_preamble_mode",
52966
14
      FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
52967
14
      NULL, HFILL  }},
52968
52969
14
    {&hf_ieee80211_tag_erp_info_reserved,
52970
14
     {"Reserved", "wlan.erp_info.reserved",
52971
14
      FT_UINT8, BASE_HEX, NULL, 0xF8,
52972
14
      NULL, HFILL  }},
52973
52974
    /* IEEE Std 802.11 2016 */
52975
    /* Table 9-135-Extended Capabilities field */
52976
14
    {&hf_ieee80211_tag_extended_capabilities,
52977
14
     {"Extended Capabilities", "wlan.extcap",
52978
14
      FT_UINT8, BASE_HEX, NULL, 0,
52979
14
      NULL, HFILL }},
52980
52981
    /* Extended Capability octet 1 */
52982
14
    {&hf_ieee80211_tag_extended_capabilities_b0,
52983
14
     {"20/40 BSS Coexistence Management Support", "wlan.extcap.b0",
52984
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
52985
14
      "HT Information Exchange Support", HFILL }},
52986
52987
14
    {&hf_ieee80211_tag_extended_capabilities_b1,
52988
14
     {"General Link (GLK)", "wlan.extcap.b1",
52989
14
      FT_UINT8, BASE_HEX, NULL, 0x02,
52990
14
      NULL, HFILL }},
52991
52992
14
    {&hf_ieee80211_tag_extended_capabilities_b2,
52993
14
     {"Extended Channel Switching", "wlan.extcap.b2",
52994
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
52995
14
      NULL, HFILL }},
52996
52997
14
    {&hf_ieee80211_tag_extended_capabilities_b3,
52998
14
     {"GLK-GCR", "wlan.extcap.b3",
52999
14
      FT_UINT8, BASE_HEX, NULL, 0x08,
53000
14
      NULL, HFILL }},
53001
53002
14
    {&hf_ieee80211_tag_extended_capabilities_b4,
53003
14
     {"PSMP Capability", "wlan.extcap.b4",
53004
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
53005
14
      NULL, HFILL }},
53006
53007
14
    {&hf_ieee80211_tag_extended_capabilities_b5,
53008
14
     {"Reserved", "wlan.extcap.b5",
53009
14
      FT_UINT8, BASE_HEX, NULL, 0x20,
53010
14
      "Must be zero", HFILL }},
53011
53012
14
    {&hf_ieee80211_tag_extended_capabilities_b6,
53013
14
     {"S-PSMP Support", "wlan.extcap.b6",
53014
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53015
14
      NULL, HFILL }},
53016
53017
14
    {&hf_ieee80211_tag_extended_capabilities_b7,
53018
14
     {"Event", "wlan.extcap.b7",
53019
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
53020
14
      NULL, HFILL }},
53021
53022
53023
    /* Extended Capability octet 2 */
53024
14
    {&hf_ieee80211_tag_extended_capabilities_b8,
53025
14
     {"Diagnostics", "wlan.extcap.b8",
53026
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
53027
14
      NULL, HFILL }},
53028
53029
14
    {&hf_ieee80211_tag_extended_capabilities_b9,
53030
14
     {"Multicast Diagnostics", "wlan.extcap.b9",
53031
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
53032
14
      NULL, HFILL }},
53033
53034
14
    {&hf_ieee80211_tag_extended_capabilities_b10,
53035
14
     {"Location Tracking", "wlan.extcap.b10",
53036
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
53037
14
      NULL, HFILL }},
53038
53039
14
    {&hf_ieee80211_tag_extended_capabilities_b11,
53040
14
     {"FMS", "wlan.extcap.b11",
53041
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
53042
14
      NULL, HFILL }},
53043
53044
14
    {&hf_ieee80211_tag_extended_capabilities_b12,
53045
14
     {"Proxy ARP Service", "wlan.extcap.b12",
53046
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
53047
14
      NULL, HFILL }},
53048
53049
14
    {&hf_ieee80211_tag_extended_capabilities_b13,
53050
14
     {"Colocated Interference Reporting", "wlan.extcap.b13",
53051
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
53052
14
      NULL, HFILL }},
53053
53054
14
    {&hf_ieee80211_tag_extended_capabilities_b14,
53055
14
     {"Civic Location", "wlan.extcap.b14",
53056
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53057
14
      NULL, HFILL }},
53058
53059
14
    {&hf_ieee80211_tag_extended_capabilities_b15,
53060
14
     {"Geospatial Location", "wlan.extcap.b15",
53061
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
53062
14
      NULL, HFILL }},
53063
53064
53065
    /* Extended Capability octet 3 */
53066
14
    {&hf_ieee80211_tag_extended_capabilities_b16,
53067
14
     {"TFS", "wlan.extcap.b16",
53068
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
53069
14
      NULL, HFILL }},
53070
53071
14
    {&hf_ieee80211_tag_extended_capabilities_b17,
53072
14
     {"WNM Sleep Mode", "wlan.extcap.b17",
53073
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
53074
14
      NULL, HFILL }},
53075
53076
14
    {&hf_ieee80211_tag_extended_capabilities_b18,
53077
14
     {"TIM Broadcast", "wlan.extcap.b18",
53078
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
53079
14
      NULL, HFILL }},
53080
53081
14
    {&hf_ieee80211_tag_extended_capabilities_b19,
53082
14
     {"BSS Transition", "wlan.extcap.b19",
53083
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
53084
14
      NULL, HFILL }},
53085
53086
14
    {&hf_ieee80211_tag_extended_capabilities_b20,
53087
14
     {"QoS Traffic Capability", "wlan.extcap.b20",
53088
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
53089
14
      NULL, HFILL }},
53090
53091
14
    {&hf_ieee80211_tag_extended_capabilities_b21,
53092
14
     {"AC Station Count", "wlan.extcap.b21",
53093
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
53094
14
      NULL, HFILL }},
53095
53096
14
    {&hf_ieee80211_tag_extended_capabilities_b22,
53097
14
     {"Multiple BSSID", "wlan.extcap.b22",
53098
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53099
14
      NULL, HFILL }},
53100
53101
14
    {&hf_ieee80211_tag_extended_capabilities_b23,
53102
14
     {"Timing Measurement", "wlan.extcap.b23",
53103
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
53104
14
      NULL, HFILL }},
53105
53106
53107
    /* Extended Capability octet 4 */
53108
14
    {&hf_ieee80211_tag_extended_capabilities_b24,
53109
14
     {"Channel Usage", "wlan.extcap.b24",
53110
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
53111
14
      NULL, HFILL }},
53112
53113
14
    {&hf_ieee80211_tag_extended_capabilities_b25,
53114
14
     {"SSID List", "wlan.extcap.b25",
53115
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
53116
14
      NULL, HFILL }},
53117
53118
14
    {&hf_ieee80211_tag_extended_capabilities_b26,
53119
14
     {"DMS", "wlan.extcap.b26",
53120
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
53121
14
      NULL, HFILL }},
53122
53123
14
    {&hf_ieee80211_tag_extended_capabilities_b27,
53124
14
     {"UTC TSF Offset", "wlan.extcap.b27",
53125
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
53126
14
      NULL, HFILL }},
53127
53128
14
    {&hf_ieee80211_tag_extended_capabilities_b28,
53129
14
     {"TPU Buffer STA Support", "wlan.extcap.b28",
53130
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
53131
14
      NULL, HFILL }},
53132
53133
14
    {&hf_ieee80211_tag_extended_capabilities_b29,
53134
14
     {"TDLS Peer PSM Support", "wlan.extcap.b29",
53135
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
53136
14
      NULL, HFILL }},
53137
53138
14
    {&hf_ieee80211_tag_extended_capabilities_b30,
53139
14
     {"TDLS Channel Switching", "wlan.extcap.b30",
53140
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53141
14
      NULL, HFILL }},
53142
53143
14
    {&hf_ieee80211_tag_extended_capabilities_b31,
53144
14
     {"Interworking", "wlan.extcap.b31",
53145
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
53146
14
      NULL, HFILL }},
53147
53148
53149
    /* Extended Capability octet 5 */
53150
14
    {&hf_ieee80211_tag_extended_capabilities_b32,
53151
14
     {"QoS Map", "wlan.extcap.b32",
53152
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
53153
14
      NULL, HFILL }},
53154
53155
14
    {&hf_ieee80211_tag_extended_capabilities_b33,
53156
14
     {"EBR", "wlan.extcap.b33",
53157
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
53158
14
      NULL, HFILL }},
53159
53160
14
    {&hf_ieee80211_tag_extended_capabilities_b34,
53161
14
     {"SSPN Interface", "wlan.extcap.b34",
53162
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
53163
14
      NULL, HFILL }},
53164
53165
14
    {&hf_ieee80211_tag_extended_capabilities_b35,
53166
14
     {"Reserved", "wlan.extcap.b35",
53167
14
      FT_UINT8, BASE_HEX, NULL, 0x08,
53168
14
      "Must be zero", HFILL }},
53169
53170
14
    {&hf_ieee80211_tag_extended_capabilities_b36,
53171
14
     {"MSGCF Capability", "wlan.extcap.b36",
53172
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
53173
14
      NULL, HFILL }},
53174
53175
14
    {&hf_ieee80211_tag_extended_capabilities_b37,
53176
14
     {"TDLS Support", "wlan.extcap.b37",
53177
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
53178
14
      NULL, HFILL }},
53179
53180
14
    {&hf_ieee80211_tag_extended_capabilities_b38,
53181
14
     {"TDLS Prohibited", "wlan.extcap.b38",
53182
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53183
14
      NULL, HFILL }},
53184
53185
14
    {&hf_ieee80211_tag_extended_capabilities_b39,
53186
14
     {"TDLS Channel Switching Prohibited", "wlan.extcap.b39",
53187
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
53188
14
      NULL, HFILL }},
53189
53190
    /* Extended Capability octet 6 */
53191
14
    {&hf_ieee80211_tag_extended_capabilities_b40,
53192
14
     {"Reject Unadmitted Frame", "wlan.extcap.b40",
53193
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
53194
14
      NULL, HFILL }},
53195
53196
14
    {&hf_ieee80211_tag_extended_capabilities_serv_int_granularity,
53197
14
     {"Service Interval Granularity",
53198
14
      "wlan.extcap.serv_int_granularity",
53199
14
      FT_UINT8, BASE_DEC, VALS(service_interval_granularity_vals), 0x0e,
53200
14
      NULL, HFILL }},
53201
53202
14
    {&hf_ieee80211_tag_extended_capabilities_b44,
53203
14
     {"Identifier Location", "wlan.extcap.b44",
53204
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
53205
14
      NULL, HFILL }},
53206
53207
14
    {&hf_ieee80211_tag_extended_capabilities_b45,
53208
14
     {"U-APSD Coexistence", "wlan.extcap.b45",
53209
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
53210
14
      NULL, HFILL }},
53211
53212
14
    {&hf_ieee80211_tag_extended_capabilities_b46,
53213
14
     {"WNM Notification", "wlan.extcap.b46",
53214
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53215
14
      NULL, HFILL }},
53216
53217
14
    {&hf_ieee80211_tag_extended_capabilities_b47,
53218
14
     {"QAB Capability", "wlan.extcap.b47",
53219
14
      FT_UINT8, BASE_HEX, NULL, 0x80,
53220
14
      "AP supports QAB", HFILL }},
53221
53222
    /* Extended Capability octet 7 */
53223
14
    {&hf_ieee80211_tag_extended_capabilities_b48,
53224
14
     {"UTF-8 SSID", "wlan.extcap.b48",
53225
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
53226
14
      "The SSID in this BSS is interpreted using UTF-8 encoding", HFILL }},
53227
53228
14
    {&hf_ieee80211_tag_extended_capabilities_b49,
53229
14
     {"QMF Activated", "wlan.extcap.b49",
53230
14
      FT_BOOLEAN, 8, NULL, 0x02,
53231
14
      NULL, HFILL }},
53232
53233
14
    {&hf_ieee80211_tag_extended_capabilities_b50,
53234
14
     {"QMF Reconfiguration Activated", "wlan.extcap.b50",
53235
14
      FT_BOOLEAN, 8, NULL, 0x04,
53236
14
      NULL, HFILL }},
53237
53238
14
    {&hf_ieee80211_tag_extended_capabilities_b51,
53239
14
     {"Robust AV Streaming", "wlan.extcap.b51",
53240
14
      FT_BOOLEAN, 8, NULL, 0x08,
53241
14
      NULL, HFILL }},
53242
53243
14
    {&hf_ieee80211_tag_extended_capabilities_b52,
53244
14
     {"Advanced GCR", "wlan.extcap.b52",
53245
14
      FT_BOOLEAN, 8, NULL, 0x10,
53246
14
      NULL, HFILL }},
53247
53248
14
    {&hf_ieee80211_tag_extended_capabilities_b53,
53249
14
     {"Mesh GCR", "wlan.extcap.b53",
53250
14
      FT_BOOLEAN, 8, NULL, 0x20,
53251
14
      NULL, HFILL }},
53252
53253
14
    {&hf_ieee80211_tag_extended_capabilities_b54,
53254
14
     {"SCS", "wlan.extcap.b54",
53255
14
      FT_BOOLEAN, 8, NULL, 0x40,
53256
14
      NULL, HFILL }},
53257
53258
14
    {&hf_ieee80211_tag_extended_capabilities_b55,
53259
14
     {"QLoad Report", "wlan.extcap.b55",
53260
14
      FT_BOOLEAN, 8, NULL, 0x80,
53261
14
      NULL, HFILL }},
53262
53263
    /* Extended Capability octet 8 */
53264
14
    {&hf_ieee80211_tag_extended_capabilities_b56,
53265
14
     {"Alternate EDCA", "wlan.extcap.b56",
53266
14
      FT_BOOLEAN, 8, NULL, 0x01,
53267
14
      NULL, HFILL }},
53268
53269
14
    {&hf_ieee80211_tag_extended_capabilities_b57,
53270
14
     {"Unprotected TXOP Negotiation", "wlan.extcap.b57",
53271
14
      FT_BOOLEAN, 8, NULL, 0x02,
53272
14
      NULL, HFILL }},
53273
53274
14
    {&hf_ieee80211_tag_extended_capabilities_b58,
53275
14
     {"Protected TXOP Negotiation", "wlan.extcap.b58",
53276
14
      FT_BOOLEAN, 8, NULL, 0x04,
53277
14
      NULL, HFILL }},
53278
53279
14
    {&hf_ieee80211_tag_extended_capabilities_b59,
53280
14
     {"Reserved", "wlan.extcap.b59",
53281
14
      FT_UINT8, BASE_HEX, NULL, 0x08,
53282
14
      NULL, HFILL }},
53283
53284
14
    {&hf_ieee80211_tag_extended_capabilities_b60,
53285
14
     {"Protected QLoad Report", "wlan.extcap.b60",
53286
14
      FT_BOOLEAN, 8, NULL, 0x10,
53287
14
      NULL, HFILL }},
53288
53289
14
    {&hf_ieee80211_tag_extended_capabilities_b61,
53290
14
     {"TDLS Wider Bandwidth", "wlan.extcap.b61",
53291
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
53292
14
      NULL, HFILL }},
53293
53294
14
    {&hf_ieee80211_tag_extended_capabilities_b62,
53295
14
     {"Operating Mode Notification", "wlan.extcap.b62",
53296
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
53297
14
      NULL, HFILL }},
53298
53299
14
    {&hf_ieee80211_tag_extended_capabilities_b63,
53300
14
     {"Max Number Of MSDUs In A-MSDU", "wlan.extcap.b63",
53301
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
53302
14
      "Part 1 (bit63)", HFILL }},
53303
53304
    /* Extended Capability octets 8 & 9 */
53305
14
    {&hf_ieee80211_tag_extended_capabilities_2,
53306
14
     {"Extended Capabilities", "wlan.extcap",
53307
14
      FT_UINT16, BASE_HEX, NULL, 0,
53308
14
      NULL, HFILL }},
53309
53310
14
    {&hf_ieee80211_tag_extended_capabilities_b56_2,
53311
14
     {"Alternate EDCA", "wlan.extcap.b56",
53312
14
      FT_BOOLEAN, 16, NULL, 0x0001,
53313
14
      NULL, HFILL }},
53314
53315
14
    {&hf_ieee80211_tag_extended_capabilities_b57_2,
53316
14
     {"Unprotected TXOP Negotiation", "wlan.extcap.b57",
53317
14
      FT_BOOLEAN, 16, NULL, 0x0002,
53318
14
      NULL, HFILL }},
53319
53320
14
    {&hf_ieee80211_tag_extended_capabilities_b58_2,
53321
14
     {"Protected TXOP Negotiation", "wlan.extcap.b58",
53322
14
      FT_BOOLEAN, 16, NULL, 0x0004,
53323
14
      NULL, HFILL }},
53324
53325
14
    {&hf_ieee80211_tag_extended_capabilities_b59_2,
53326
14
     {"Reserved", "wlan.extcap.b59",
53327
14
      FT_UINT16, BASE_HEX, NULL, 0x0008,
53328
14
      NULL, HFILL }},
53329
53330
14
    {&hf_ieee80211_tag_extended_capabilities_b60_2,
53331
14
     {"Protected QLoad Report", "wlan.extcap.b60",
53332
14
      FT_BOOLEAN, 16, NULL, 0x0010,
53333
14
      NULL, HFILL }},
53334
53335
14
    {&hf_ieee80211_tag_extended_capabilities_b61_2,
53336
14
     {"TDLS Wider Bandwidth", "wlan.extcap.b61",
53337
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020,
53338
14
      NULL, HFILL }},
53339
53340
14
    {&hf_ieee80211_tag_extended_capabilities_b62_2,
53341
14
     {"Operating Mode Notification", "wlan.extcap.b62",
53342
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040,
53343
14
      NULL, HFILL }},
53344
53345
14
    {&hf_ieee80211_tag_extended_capabilities_max_num_msdus,
53346
14
     {"Max Number Of MSDUs In A-MSDU", "wlan.extcap.b63",
53347
14
      FT_UINT16, BASE_DEC, VALS(vht_max_mpdu_in_amsdu), 0x0180,
53348
14
      NULL, HFILL }},
53349
53350
14
    {&hf_ieee80211_tag_extended_capabilities_b65_2,
53351
14
     {"Channel Schedule Management", "wlan.extcap.b65",
53352
14
      FT_BOOLEAN, 16, NULL, 0x0200,
53353
14
      NULL, HFILL }},
53354
53355
14
    {&hf_ieee80211_tag_extended_capabilities_b66_2,
53356
14
     {"Geodatabase Inband Enabling Signal", "wlan.extcap.b66",
53357
14
      FT_BOOLEAN, 16, NULL, 0x0400,
53358
14
      NULL, HFILL }},
53359
53360
14
    {&hf_ieee80211_tag_extended_capabilities_b67_2,
53361
14
     {"Network Channel Control", "wlan.extcap.b67",
53362
14
      FT_BOOLEAN, 16, NULL, 0x0800,
53363
14
      NULL, HFILL }},
53364
53365
14
    {&hf_ieee80211_tag_extended_capabilities_b68_2,
53366
14
     {"White Space Map", "wlan.extcap.b68",
53367
14
      FT_BOOLEAN, 16, NULL, 0x1000,
53368
14
      NULL, HFILL }},
53369
53370
14
    {&hf_ieee80211_tag_extended_capabilities_b69_2,
53371
14
     {"Channel Availability Query", "wlan.extcap.b69",
53372
14
      FT_BOOLEAN, 16, NULL, 0x2000,
53373
14
      NULL, HFILL }},
53374
53375
14
    {&hf_ieee80211_tag_extended_capabilities_b70_2,
53376
14
     {"Fine Timing Measurement Responder", "wlan.extcap.b70",
53377
14
      FT_BOOLEAN, 16, NULL, 0x4000,
53378
14
      NULL, HFILL }},
53379
53380
14
    {&hf_ieee80211_tag_extended_capabilities_b71_2,
53381
14
     {"Fine Timing Measurement Initiator", "wlan.extcap.b71",
53382
14
      FT_BOOLEAN, 16, NULL, 0x8000,
53383
14
      NULL, HFILL }},
53384
53385
    /* Extended Capability Octet 10 */
53386
14
    {&hf_ieee80211_tag_extended_capabilities_b72,
53387
14
     {"FILS Capability", "wlan.extcap.b72",
53388
14
      FT_BOOLEAN, 8, NULL, 0x01,
53389
14
      NULL, HFILL }},
53390
53391
14
    {&hf_ieee80211_tag_extended_capabilities_b73,
53392
14
     {"Extended Spectrum Management Capable", "wlan.extcap.b73",
53393
14
      FT_BOOLEAN, 8, NULL, 0x02,
53394
14
      NULL, HFILL }},
53395
53396
14
    {&hf_ieee80211_tag_extended_capabilities_b74,
53397
14
     {"Future Channel Guidance", "wlan.extcap.b74",
53398
14
      FT_BOOLEAN, 8, NULL, 0x04,
53399
14
      NULL, HFILL }},
53400
53401
14
    {&hf_ieee80211_tag_extended_capabilities_b75,
53402
14
     {"Preassociation discovery (PAD)", "wlan.extcap.b75",
53403
14
      FT_UINT8, BASE_HEX, NULL, 0x08,
53404
14
      NULL, HFILL }},
53405
53406
14
    {&hf_ieee80211_tag_extended_capabilities_b76,
53407
14
     {"Reserved", "wlan.extcap.b76",
53408
14
      FT_UINT8, BASE_HEX, NULL, 0x10,
53409
14
      NULL, HFILL }},
53410
53411
14
    {&hf_ieee80211_tag_extended_capabilities_b77,
53412
14
     {"TWT Requester Support", "wlan.extcap.b77",
53413
14
      FT_BOOLEAN, 8, NULL, 0x20,
53414
14
      NULL, HFILL }},
53415
53416
14
    {&hf_ieee80211_tag_extended_capabilities_b78,
53417
14
     {"TWT Responder Support", "wlan.extcap.b78",
53418
14
      FT_BOOLEAN, 8, NULL, 0x40,
53419
14
      NULL, HFILL }},
53420
53421
14
    {&hf_ieee80211_tag_extended_capabilities_b79,
53422
14
     {"OBSS Narrow Bandwidth RU in OFDMA Tolerance Support", "wlan.extcap.b79",
53423
14
      FT_BOOLEAN, 8, NULL, 0x80,
53424
14
      NULL, HFILL }},
53425
53426
14
    {&hf_ieee80211_tag_extended_capabilities_b80,
53427
14
     {"Complete List of NonTxBSSID Profiles", "wlan.extcap.b80",
53428
14
      FT_BOOLEAN, 8, NULL, 0x01,
53429
14
      NULL, HFILL }},
53430
53431
14
    {&hf_ieee80211_tag_extended_capabilities_b81,
53432
14
     {"SAE Password Identifiers In Use", "wlan.extcap.b81",
53433
14
      FT_BOOLEAN, 8, NULL, 0x02,
53434
14
      NULL, HFILL }},
53435
53436
14
    {&hf_ieee80211_tag_extended_capabilities_b82,
53437
14
     {"SAE Passwords Used Exclusively", "wlan.extcap.b82",
53438
14
      FT_BOOLEAN, 8, NULL, 0x04,
53439
14
      NULL, HFILL }},
53440
53441
14
    {&hf_ieee80211_tag_extended_capabilities_b83,
53442
14
     {"Enhanced Multi-BSSID Advertisement Support", "wlan.extcap.b83",
53443
14
      FT_BOOLEAN, 8, NULL, 0x08,
53444
14
      NULL, HFILL }},
53445
53446
14
    {&hf_ieee80211_tag_extended_capabilities_b84,
53447
14
     {"Beacon Protection Enabled", "wlan.extcap.b84",
53448
14
      FT_BOOLEAN, 8, NULL, 0x10,
53449
14
      NULL, HFILL }},
53450
53451
14
    {&hf_ieee80211_tag_extended_capabilities_b85,
53452
14
     {"Mirrored SCS", "wlan.extcap.b85",
53453
14
      FT_BOOLEAN, 8, NULL, 0x20,
53454
14
      NULL, HFILL }},
53455
53456
14
    {&hf_ieee80211_tag_extended_capabilities_b86,
53457
14
     {"OCT", "wlan.extcap.b86",
53458
14
      FT_BOOLEAN, 8, NULL, 0x40,
53459
14
      NULL, HFILL }},
53460
53461
14
    {&hf_ieee80211_tag_extended_capabilities_b87,
53462
14
     {"Local MAC Address Policy", "wlan.extcap.b87",
53463
14
      FT_BOOLEAN, 8, NULL, 0x80,
53464
14
      NULL, HFILL }},
53465
53466
14
    {&hf_ieee80211_tag_extended_capabilities_b88,
53467
14
     {"SAE-PK Passwords Used Exclusively", "wlan.extcap.b88",
53468
14
      FT_BOOLEAN, 8, NULL, 0x01,
53469
14
      NULL, HFILL }},
53470
53471
14
    {&hf_ieee80211_tag_extended_capabilities_b89,
53472
14
     {"TWT Parameters Range Support", "wlan.extcap.b89",
53473
14
      FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
53474
53475
14
    {&hf_ieee80211_tag_extended_capabilities_b90,
53476
14
     {"non-TB Ranging Responder", "wlan.extcap.b90",
53477
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
53478
53479
14
    {&hf_ieee80211_tag_extended_capabilities_b91,
53480
14
     {"TB Ranging Responder", "wlan.extcap.b91",
53481
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
53482
53483
14
    {&hf_ieee80211_tag_extended_capabilities_b92,
53484
14
     {"TB Ranging Responder Measurement Support", "wlan.extcap.b92",
53485
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
53486
53487
14
    {&hf_ieee80211_tag_extended_capabilities_b93,
53488
14
     {"TB Ranging Initiator Measurement Support", "wlan.extcap.b93",
53489
14
      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
53490
53491
14
    {&hf_ieee80211_tag_extended_capabilities_b94,
53492
14
     {"AOA Measurement Available", "wlan.extcap.b94",
53493
14
      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
53494
53495
14
    {&hf_ieee80211_tag_extended_capabilities_b95,
53496
14
     {"Phase Shift Feedback Support", "wlan.extcap.b95",
53497
14
      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
53498
53499
14
    {&hf_ieee80211_tag_extended_capabilities_b96,
53500
14
     {"DMG/location supporting APs in the area", "wlan.extcap.dmg_location",
53501
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
53502
53503
14
    {&hf_ieee80211_tag_extended_capabilities_b97,
53504
14
     {"I2R LMR Feedback Policy", "wlan.extcap.i2r_lmr_feedback_policy",
53505
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
53506
53507
14
    {&hf_ieee80211_tag_extended_capabilities_b98,
53508
14
     {"EBCS Support", "wlan.extcap.b98",
53509
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
53510
53511
14
    {&hf_ieee80211_tag_extended_capabilities_b99,
53512
14
     {"EBCS Relaying Support", "wlan.extcap.b99",
53513
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
53514
53515
14
    {&hf_ieee80211_tag_extended_capabilities_b100,
53516
14
     {"Peer-to-peer TWT Support", "wlan.extcap.b100",
53517
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
53518
53519
14
    {&hf_ieee80211_tag_extended_capabilities_b101,
53520
14
     {"Multiple BSSID Role Switch Support", "wlan.extcap.b101",
53521
14
      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
53522
53523
14
    {&hf_ieee80211_tag_extended_capabilities_b102,
53524
14
     {"Known STA Identification Enabled", "wlan.extcap.b102",
53525
14
      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
53526
53527
14
    {&hf_ieee80211_tag_extended_capabilities_b103,
53528
14
     {"Reserved", "wlan.extcap.b103",
53529
14
      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
53530
53531
14
    {&hf_ieee80211_tag_extended_capabilities_b104,
53532
14
     {"Capability Notification Support", "wlan.extcap.b104",
53533
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
53534
53535
14
    {&hf_ieee80211_tag_extended_capabilities_b105,
53536
14
     {"GAS Query Request Fragmentation", "wlan.extcap.b105",
53537
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
53538
53539
14
    {&hf_ieee80211_tag_extended_capabilities_reserved2,
53540
14
     {"Reserved", "wlan.extcap.reserved2",
53541
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
53542
53543
14
    {&hf_ieee80211_tag_cisco_ccx1_unknown,
53544
14
     {"Unknown", "wlan.cisco.ccx1.unknown",
53545
14
      FT_BYTES, BASE_NONE, NULL, 0,
53546
14
      NULL, HFILL }},
53547
53548
14
    {&hf_ieee80211_tag_cisco_ccx1_name,
53549
14
     {"Name", "wlan.cisco.ccx1.name",
53550
14
      FT_STRING, BASE_NONE, NULL, 0,
53551
14
      NULL, HFILL }},
53552
53553
14
    {&hf_ieee80211_tag_cisco_ccx1_clients,
53554
14
     {"Clients", "wlan.cisco.ccx1.clients",
53555
14
      FT_UINT8, BASE_DEC, NULL, 0,
53556
14
      NULL, HFILL }},
53557
53558
14
    {&hf_ieee80211_tag_cisco_ccx1_unknown2,
53559
14
     {"Unknown2", "wlan.cisco.ccx1.unknown2",
53560
14
      FT_BYTES, BASE_NONE, NULL, 0,
53561
14
      NULL, HFILL }},
53562
53563
14
    {&hf_ieee80211_tag_neighbor_report_bssid,
53564
14
     {"BSSID", "wlan.nreport.bssid",
53565
14
      FT_ETHER, BASE_NONE, NULL, 0,
53566
14
      NULL, HFILL }},
53567
53568
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info,
53569
14
     {"BSSID Information", "wlan.nreport.bssid.info",
53570
14
      FT_UINT32, BASE_HEX, NULL, 0,
53571
14
      NULL, HFILL }},
53572
53573
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_reachability,
53574
14
     {"AP Reachability", "wlan.nreport.bssid.info.reachability",
53575
14
      FT_UINT32, BASE_HEX, VALS(ieee80211_neighbor_report_bssid_info_reachability_vals), 0x00000003,
53576
14
      "Indicates whether the AP identified by this BSSID is reachable by the STA that requested the neighbor report", HFILL }},
53577
53578
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_security,
53579
14
     {"Security", "wlan.nreport.bssid.info.security",
53580
14
      FT_BOOLEAN, 32, NULL, 0x00000004,
53581
14
      "Indicates that the AP identified by this BSSID supports the same security provisioning as used by the STA in its current association", HFILL }},
53582
53583
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_key_scope,
53584
14
     {"Key Scope", "wlan.nreport.bssid.info.keyscope",
53585
14
      FT_BOOLEAN, 32, NULL, 0x00000008,
53586
14
      "indicates the AP indicated by this BSSID has the same authenticator as the AP sending the report", HFILL }},
53587
53588
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability,
53589
14
     {"Capability", "wlan.nreport.bssid.info.capability",
53590
14
      FT_UINT32, BASE_HEX, NULL, 0x000003F0,
53591
14
      "Contains selected capability information for the AP indicated by this BSSID", HFILL }},
53592
53593
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng,
53594
14
     {"Spectrum Management", "wlan.nreport.bssid.info.capability.specmngt",
53595
14
      FT_BOOLEAN, 32, NULL, 0x00000010,
53596
14
      NULL, HFILL }},
53597
53598
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos,
53599
14
     {"QoS", "wlan.nreport.bssid.info.capability.qos",
53600
14
      FT_BOOLEAN, 32, NULL, 0x00000020,
53601
14
      NULL, HFILL }},
53602
53603
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd,
53604
14
     {"APSD", "wlan.nreport.bssid.info.capability.apsd",
53605
14
      FT_BOOLEAN, 32, NULL, 0x00000040,
53606
14
      NULL, HFILL }},
53607
53608
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt,
53609
14
     {"Radio Measurement", "wlan.nreport.bssid.info.capability.radiomsnt",
53610
14
      FT_BOOLEAN, 32, NULL, 0x00000080,
53611
14
      NULL, HFILL }},
53612
53613
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback,
53614
14
     {"Delayed Block Ack", "wlan.nreport.bssid.info.capability.dback",
53615
14
      FT_BOOLEAN, 32, NULL, 0x00000100,
53616
14
      NULL, HFILL }},
53617
53618
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback,
53619
14
     {"Immediate Block Ack", "wlan.nreport.bssid.info.capability.iback",
53620
14
      FT_BOOLEAN, 32, NULL, 0x00000200,
53621
14
      NULL, HFILL }},
53622
53623
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain,
53624
14
     {"Mobility Domain", "wlan.nreport.bssid.info.mobilitydomain",
53625
14
      FT_BOOLEAN, 32, NULL, 0x00000400,
53626
14
      NULL, HFILL }},
53627
53628
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput,
53629
14
     {"High Throughput Control (+HTC)", "wlan.nreport.bssid.info.hthroughput",
53630
14
      FT_BOOLEAN, 32, NULL, 0x00000800,
53631
14
      NULL, HFILL }},
53632
53633
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput,
53634
14
     {"Very High Throughput (+VHT)", "wlan.nreport.bssid.info.vht",
53635
14
      FT_BOOLEAN, 32, NULL, 0x00001000,
53636
14
      NULL, HFILL }},
53637
53638
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_ftm,
53639
14
     {"Fine Timing Measurement (FTM)", "wlan.nreport.bssid.info.ftm",
53640
14
      FT_BOOLEAN, 32, NULL, 0x00002000,
53641
14
      NULL, HFILL }},
53642
53643
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_high_efficiency,
53644
14
     {"High Efficiency (HE AP)", "wlan.nreport.bssid.info.he",
53645
14
      FT_BOOLEAN, 32, NULL, 0x00004000,
53646
14
      NULL, HFILL }},
53647
53648
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_er_bss,
53649
14
     {"Extended Range BSS", "wlan.nreport.bssid.info.er_bss",
53650
14
      FT_BOOLEAN, 32, NULL, 0x00008000,
53651
14
      NULL, HFILL }},
53652
53653
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_colocated_ap,
53654
14
     {"Co-Located AP", "wlan.nreport.bssid.info.colocated_ap",
53655
14
      FT_BOOLEAN, 32, NULL, 0x00010000,
53656
14
      NULL, HFILL }},
53657
53658
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_unsolicited_probe_responses_active,
53659
14
     {"Unsolicited Probe Responses Active", "wlan.nreport.bssid.info.unsolicited_probe_responses",
53660
14
      FT_BOOLEAN, 32, NULL, 0x00020000,
53661
14
      NULL, HFILL }},
53662
53663
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_ess_with_colocated_ap,
53664
14
     {"Members Of ESS With 2.4/5 GHz Co-Located AP", "wlan.nreport.bssid.info.member_of_ess_with_2p4_5_ghz_colocated_ap",
53665
14
      FT_BOOLEAN, 32, NULL, 0x00040000,
53666
14
      NULL, HFILL }},
53667
53668
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_oct_supported_with_reporting_ap,
53669
14
     {"OCT Supported With Reporting AP", "wlan.nreport.bssid.info.oct_supported_with_reporting_ap",
53670
14
      FT_BOOLEAN, 32, NULL, 0x00080000,
53671
14
      NULL, HFILL }},
53672
53673
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_colocated_6ghz_ap,
53674
14
     {"Co-Located With 6 GHz AP", "wlan.nreport.bssid.info.colocated_6ghz_ap",
53675
14
      FT_BOOLEAN, 32, NULL, 0x00100000,
53676
14
      NULL, HFILL }},
53677
53678
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_eht,
53679
14
     {"Extremely High Throughput", "wlan.nreport.bssid.info.eht",
53680
14
      FT_BOOLEAN, 32, NULL, 0x00200000,
53681
14
      NULL, HFILL }},
53682
53683
14
    {&hf_ieee80211_tag_neighbor_report_bssid_info_reserved,
53684
14
     {"Reserved", "wlan.nreport.bssid.info.reserved",
53685
14
      FT_UINT32, BASE_HEX, NULL, 0xFFC00000,
53686
14
      "Must be zero", HFILL }},
53687
53688
14
    {&hf_ieee80211_tag_neighbor_report_ope_class,
53689
14
     {"Operating Class", "wlan.nreport.opeclass",
53690
14
      FT_UINT8, BASE_DEC, NULL, 0,
53691
14
      NULL, HFILL }},
53692
53693
14
    {&hf_ieee80211_tag_neighbor_report_channel_number,
53694
14
     {"Channel Number", "wlan.nreport.channumber",
53695
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
53696
14
      NULL, HFILL }},
53697
53698
14
    {&hf_ieee80211_tag_neighbor_report_phy_type,
53699
14
     {"PHY Type", "wlan.nreport.phytype",
53700
14
      FT_UINT8, BASE_HEX, NULL, 0,
53701
14
      NULL, HFILL }},
53702
53703
14
    {&hf_ieee80211_tag_neighbor_report_subelement_id,
53704
14
     {"ID", "wlan.nreport.subelem.id",
53705
14
      FT_UINT8, BASE_DEC, NULL, 0,
53706
14
      NULL, HFILL }},
53707
53708
14
    {&hf_ieee80211_tag_neighbor_report_subelement_length,
53709
14
     {"Length", "wlan.nreport.subelem.len",
53710
14
      FT_UINT8, BASE_DEC, NULL, 0,
53711
14
      NULL, HFILL }},
53712
53713
14
    {&hf_ieee80211_tag_neighbor_report_subelement_data,
53714
14
     {"Data", "wlan.nreport.subelem.data",
53715
14
      FT_BYTES, BASE_NONE, NULL, 0,
53716
14
      NULL, HFILL }},
53717
53718
14
    {&hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref,
53719
14
     {"Preference", "wlan.nreport.subelem.bss_trn_can_pref",
53720
14
      FT_UINT8, BASE_DEC, NULL, 0,
53721
14
      NULL, HFILL }},
53722
53723
14
    {&hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf,
53724
14
     {"BSS Termination TSF", "wlan.nreport.subelem.bss_ter_tsf",
53725
14
      FT_UINT64, BASE_DEC, NULL, 0,
53726
14
      NULL, HFILL }},
53727
53728
14
    {&hf_ieee80211_tag_neighbor_report_subelement_bss_dur,
53729
14
     {"Duration", "wlan.nreport.subelem.bss_dur",
53730
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_minutes), 0,
53731
14
      NULL, HFILL }},
53732
53733
14
    {&hf_ieee80211_tag_neighbor_report_subelement_tsf_offset,
53734
14
     {"TSF Offset", "wlan.nreport.subelem.tsf_offset",
53735
14
      FT_UINT16, BASE_DEC, NULL, 0,
53736
14
      "TSF Offset in TU units", HFILL } },
53737
53738
14
    {&hf_ieee80211_tag_neighbor_report_subelement_beacon_interval,
53739
14
     {"Beacon Interval", "wlan.nreport.subelem.beacon_interval",
53740
14
      FT_UINT16, BASE_DEC, NULL, 0,
53741
14
      "Beacon Interval in TUs", HFILL } },
53742
53743
14
    {&hf_ieee80211_tag_neighbor_report_subelement_country_code,
53744
14
     {"Country Code", "wlan.nreport.subelem.country_code",
53745
14
      FT_STRING, BASE_NONE, NULL, 0x0,
53746
14
      "ISO 3166-1 Alpha-2 Country Code", HFILL }},
53747
53748
14
    {&hf_ieee80211_tag_supported_ope_classes_current,
53749
14
     {"Current Operating Class", "wlan.supopeclass.current",
53750
14
      FT_UINT8, BASE_DEC | BASE_RANGE_STRING, RVALS(oper_class_rvals), 0,
53751
14
      NULL, HFILL }},
53752
53753
14
    {&hf_ieee80211_tag_supported_ope_classes_alternate,
53754
14
     {"Alternate Operating Classes", "wlan.supopeclass.alt",
53755
14
      FT_NONE, BASE_NONE, NULL, 0,
53756
14
      NULL, HFILL }},
53757
53758
14
    {&hf_ieee80211_wfa_ie_type,
53759
14
     {"Type", "wlan.wfa.ie.type",
53760
14
      FT_UINT8, BASE_HEX, VALS(ieee802111_wfa_ie_type_vals), 0,
53761
14
      NULL, HFILL }},
53762
53763
14
    {&hf_ieee80211_wfa_ie_wpa_version,
53764
14
     {"WPA Version", "wlan.wfa.ie.wpa.version",
53765
14
      FT_UINT16, BASE_DEC, NULL, 0,
53766
14
      NULL, HFILL }},
53767
53768
14
    {&hf_ieee80211_wfa_ie_wpa_mcs,
53769
14
     {"Multicast Cipher Suite", "wlan.wfa.ie.wpa.mcs",
53770
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_mcs_base_custom), 0,
53771
14
      "Contains the cipher suite selector used by the BSS to protect broadcast/multicasttraffic", HFILL }},
53772
53773
14
    {&hf_ieee80211_wfa_ie_wpa_mcs_oui,
53774
14
     {"Multicast Cipher Suite OUI", "wlan.wfa.ie.wpa.mcs.oui",
53775
14
      FT_UINT24, BASE_OUI, NULL, 0,
53776
14
      NULL, HFILL }},
53777
53778
14
    {&hf_ieee80211_wfa_ie_wpa_mcs_type,
53779
14
     {"Multicast Cipher Suite type", "wlan.wfa.ie.wpa.mcs.type",
53780
14
      FT_UINT8, BASE_DEC, NULL, 0,
53781
14
      NULL, HFILL }},
53782
53783
14
    {&hf_ieee80211_wfa_ie_wpa_mcs_wfa_type,
53784
14
     {"Multicast Cipher Suite type", "wlan.wfa.ie.wpa.mcs.type",
53785
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_cipher_vals), 0,
53786
14
      NULL, HFILL }},
53787
53788
14
    {&hf_ieee80211_wfa_ie_wpa_ucs_count,
53789
14
     {"Unicast Cipher Suite Count", "wlan.wfa.ie.wpa.ucs.count",
53790
14
      FT_UINT16, BASE_DEC, NULL, 0,
53791
14
      "Indicates the number of pairwise cipher suite selectors that are contained in the Unicast Cipher Suite List", HFILL }},
53792
53793
14
    {&hf_ieee80211_wfa_ie_wpa_ucs_list,
53794
14
     {"Unicast Cipher Suite List", "wlan.wfa.ie.wpa.ucs.list",
53795
14
      FT_NONE, BASE_NONE, NULL, 0,
53796
14
      "Contains a series of cipher suite selectors that indicate the Unicast cipher suites", HFILL }},
53797
53798
14
    {&hf_ieee80211_wfa_ie_wpa_ucs,
53799
14
     {"Unicast Cipher Suite", "wlan.wfa.ie.wpa.ucs",
53800
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_ucs_base_custom), 0,
53801
14
      NULL, HFILL }},
53802
53803
14
    {&hf_ieee80211_wfa_ie_wpa_ucs_oui,
53804
14
     {"Unicast Cipher Suite OUI", "wlan.wfa.ie.wpa.ucs.oui",
53805
14
      FT_UINT24, BASE_OUI, NULL, 0,
53806
14
      NULL, HFILL }},
53807
53808
14
    {&hf_ieee80211_wfa_ie_wpa_ucs_type,
53809
14
     {"Unicast Cipher Suite type", "wlan.wfa.ie.wpa.ucs.type",
53810
14
      FT_UINT8, BASE_DEC, NULL, 0,
53811
14
      NULL, HFILL }},
53812
53813
14
    {&hf_ieee80211_wfa_ie_wpa_ucs_wfa_type,
53814
14
     {"Unicast Cipher Suite type", "wlan.wfa.ie.wpa.ucs.type",
53815
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_cipher_vals), 0,
53816
14
      NULL, HFILL }},
53817
53818
14
    {&hf_ieee80211_wfa_ie_wpa_akms_count,
53819
14
     {"Auth Key Management (AKM) Suite Count", "wlan.wfa.ie.wpa.akms.count",
53820
14
      FT_UINT16, BASE_DEC, NULL, 0,
53821
14
      "Indicates the number of Auth Key Management suite selectors that are contained in the Auth Key Management Suite List", HFILL }},
53822
53823
14
    {&hf_ieee80211_wfa_ie_wpa_akms_list,
53824
14
     {"Auth Key Management (AKM) List", "wlan.wfa.ie.wpa.akms.list",
53825
14
      FT_NONE, BASE_NONE, NULL, 0,
53826
14
      "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
53827
53828
14
    {&hf_ieee80211_wfa_ie_wpa_akms,
53829
14
     {"Auth Key Management (AKM) Suite", "wlan.wfa.ie.wpa.akms",
53830
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_akms_base_custom), 0,
53831
14
      NULL, HFILL }},
53832
53833
14
    {&hf_ieee80211_wfa_ie_wpa_akms_oui,
53834
14
     {"Auth Key Management (AKM) OUI", "wlan.wfa.ie.wpa.akms.oui",
53835
14
      FT_UINT24, BASE_OUI, NULL, 0,
53836
14
      NULL, HFILL }},
53837
53838
14
    {&hf_ieee80211_wfa_ie_wpa_akms_type,
53839
14
     {"Auth Key Management (AKM) type", "wlan.wfa.ie.wpa.akms.type",
53840
14
      FT_UINT8, BASE_DEC, NULL, 0,
53841
14
      NULL, HFILL }},
53842
53843
14
    {&hf_ieee80211_wfa_ie_wpa_akms_wfa_type,
53844
14
     {"Auth Key Management (AKM) type", "wlan.wfa.ie.wpa.akms.type",
53845
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_keymgmt_vals), 0,
53846
14
      NULL, HFILL }},
53847
53848
14
    {&hf_ieee80211_wfa_ie_wme_subtype,
53849
14
     {"WME Subtype", "wlan.wfa.ie.wme.subtype",
53850
14
      FT_UINT8, BASE_DEC, VALS(ieee802111_wfa_ie_wme_type), 0,
53851
14
      NULL, HFILL }},
53852
53853
14
    {&hf_ieee80211_wfa_ie_wme_version,
53854
14
     {"WME Version", "wlan.wfa.ie.wme.version",
53855
14
      FT_UINT8, BASE_DEC, NULL, 0,
53856
14
      NULL, HFILL }},
53857
53858
14
    {&hf_ieee80211_wfa_ie_wme_qos_info,
53859
14
     {"WME QoS Info", "wlan.wfa.ie.wme.qos_info",
53860
14
      FT_UINT8, BASE_HEX, NULL, 0,
53861
14
      NULL, HFILL }},
53862
53863
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length,
53864
14
     {"Max SP Length", "wlan.wfa.ie.wme.qos_info.sta.max_sp_length",
53865
14
      FT_UINT8, BASE_HEX, VALS(ieee802111_wfa_ie_wme_qos_info_sta_max_sp_length_vals), 0x60,
53866
14
      NULL, HFILL }},
53867
53868
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be,
53869
14
     {"AC_BE", "wlan.wfa.ie.wme.qos_info.sta.ac_be",
53870
14
      FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x08,
53871
14
      NULL, HFILL }},
53872
53873
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk,
53874
14
     {"AC_BK", "wlan.wfa.ie.wme.qos_info.sta.ac_bk",
53875
14
      FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x04,
53876
14
      NULL, HFILL }},
53877
53878
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi,
53879
14
     {"AC_VI", "wlan.wfa.ie.wme.qos_info.sta.ac_vi",
53880
14
      FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x02,
53881
14
      NULL, HFILL }},
53882
53883
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo,
53884
14
     {"AC_VO", "wlan.wfa.ie.wme.qos_info.sta.ac_vo",
53885
14
      FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x01,
53886
14
      NULL, HFILL }},
53887
53888
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved,
53889
14
     {"Reserved", "wlan.wfa.ie.wme.qos_info.sta.reserved",
53890
14
      FT_UINT8, BASE_HEX, NULL, 0x90,
53891
14
      "Must Be Zero", HFILL }},
53892
53893
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd,
53894
14
     {"U-APSD", "wlan.wfa.ie.wme.qos_info.ap.u_apsd",
53895
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
53896
14
      "Indicates the WMM AP is currently supporting unscheduled automatic power save delivery", HFILL }},
53897
53898
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count,
53899
14
     {"Parameter Set Count", "wlan.wfa.ie.wme.qos_info.ap.parameter_set_count",
53900
14
      FT_UINT8, BASE_HEX, NULL, 0x0F,
53901
14
      NULL, HFILL }},
53902
53903
14
    {&hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved,
53904
14
     {"Reserved", "wlan.wfa.ie.wme.qos_info.ap.reserved",
53905
14
      FT_UINT8, BASE_HEX, NULL, 0x70,
53906
14
      "Must Be Zero", HFILL }},
53907
53908
14
    {&hf_ieee80211_wfa_ie_wme_reserved,
53909
14
     {"Reserved", "wlan.wfa.ie.wme.reserved",
53910
14
      FT_BYTES, BASE_NONE, NULL, 0,
53911
14
      "Must Be Zero", HFILL }},
53912
53913
14
    {&hf_ieee80211_wfa_ie_wme_ac_parameters,
53914
14
     {"Ac Parameters", "wlan.wfa.ie.wme.acp",
53915
14
      FT_NONE, BASE_NONE, NULL, 0,
53916
14
      NULL, HFILL }},
53917
53918
14
    {&hf_ieee80211_wfa_ie_wme_acp_aci_aifsn,
53919
14
     {"ACI / AIFSN Field", "wlan.wfa.ie.wme.acp.aci_aifsn",
53920
14
      FT_UINT8, BASE_HEX, NULL, 0,
53921
14
      NULL, HFILL }},
53922
53923
14
    {&hf_ieee80211_wfa_ie_wme_acp_aci_be,
53924
14
     {"ACI", "wlan.wfa.ie.wme.acp.aci_be",
53925
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
53926
14
      NULL, HFILL }},
53927
53928
14
    {&hf_ieee80211_wfa_ie_wme_acp_aci_bk,
53929
14
     {"ACI", "wlan.wfa.ie.wme.acp.aci_bk",
53930
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
53931
14
      NULL, HFILL }},
53932
53933
14
    {&hf_ieee80211_wfa_ie_wme_acp_aci_vi,
53934
14
     {"ACI", "wlan.wfa.ie.wme.acp.aci_vi",
53935
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
53936
14
      NULL, HFILL }},
53937
53938
14
    {&hf_ieee80211_wfa_ie_wme_acp_aci_vo,
53939
14
     {"ACI", "wlan.wfa.ie.wme.acp.aci_vo",
53940
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
53941
14
      NULL, HFILL }},
53942
53943
14
    {&hf_ieee80211_wfa_ie_wme_acp_acm_be,
53944
14
     {"Admission Control Mandatory", "wlan.wfa.ie.wme.acp.acm_be",
53945
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
53946
14
      NULL, HFILL }},
53947
53948
14
    {&hf_ieee80211_wfa_ie_wme_acp_acm_bk,
53949
14
     {"Admission Control Mandatory", "wlan.wfa.ie.wme.acp.acm_bk",
53950
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
53951
14
      NULL, HFILL }},
53952
53953
14
    {&hf_ieee80211_wfa_ie_wme_acp_acm_vi,
53954
14
     {"Admission Control Mandatory", "wlan.wfa.ie.wme.acp.acm_vi",
53955
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
53956
14
      NULL, HFILL }},
53957
53958
14
    {&hf_ieee80211_wfa_ie_wme_acp_acm_vo,
53959
14
     {"Admission Control Mandatory", "wlan.wfa.ie.wme.acp.acm_vo",
53960
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
53961
14
      NULL, HFILL }},
53962
53963
14
    {&hf_ieee80211_wfa_ie_wme_acp_aifsn_be,
53964
14
     {"AIFSN", "wlan.wfa.ie.wme.acp.aifsn_be",
53965
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
53966
14
      NULL, HFILL }},
53967
53968
14
    {&hf_ieee80211_wfa_ie_wme_acp_aifsn_bk,
53969
14
     {"AIFSN", "wlan.wfa.ie.wme.acp.aifsn_bk",
53970
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
53971
14
      NULL, HFILL }},
53972
53973
14
    {&hf_ieee80211_wfa_ie_wme_acp_aifsn_vi,
53974
14
     {"AIFSN", "wlan.wfa.ie.wme.acp.aifsn_vi",
53975
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
53976
14
      NULL, HFILL }},
53977
53978
14
    {&hf_ieee80211_wfa_ie_wme_acp_aifsn_vo,
53979
14
     {"AIFSN", "wlan.wfa.ie.wme.acp.aifsn_vo",
53980
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
53981
14
      NULL, HFILL }},
53982
53983
14
    {&hf_ieee80211_wfa_ie_wme_acp_reserved_be,
53984
14
     {"Reserved", "wlan.wfa.ie.wme.acp.reserved_be",
53985
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
53986
14
      "Must be Zero", HFILL }},
53987
53988
14
    {&hf_ieee80211_wfa_ie_wme_acp_reserved_bk,
53989
14
     {"Reserved", "wlan.wfa.ie.wme.acp.reserved_bk",
53990
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
53991
14
      "Must be Zero", HFILL }},
53992
53993
14
    {&hf_ieee80211_wfa_ie_wme_acp_reserved_vi,
53994
14
     {"Reserved", "wlan.wfa.ie.wme.acp.reserved_vi",
53995
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
53996
14
      "Must be Zero", HFILL }},
53997
53998
14
    {&hf_ieee80211_wfa_ie_wme_acp_reserved_vo,
53999
14
     {"Reserved", "wlan.wfa.ie.wme.acp.reserved_vo",
54000
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
54001
14
      "Must be Zero", HFILL }},
54002
54003
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw,
54004
14
     {"ECW", "wlan.wfa.ie.wme.acp.ecw",
54005
14
      FT_UINT8, BASE_HEX, NULL, 0x00,
54006
14
      NULL, HFILL }},
54007
54008
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_max_be,
54009
14
     {"ECW Max", "wlan.wfa.ie.wme.acp.ecw.max_be",
54010
14
      FT_UINT8, BASE_DEC, NULL, 0xF0,
54011
14
      NULL, HFILL }},
54012
54013
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_max_bk,
54014
14
     {"ECW Max", "wlan.wfa.ie.wme.acp.ecw.max_bk",
54015
14
      FT_UINT8, BASE_DEC, NULL, 0xF0,
54016
14
      NULL, HFILL }},
54017
54018
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_max_vo,
54019
14
     {"ECW Max", "wlan.wfa.ie.wme.acp.ecw.max_vo",
54020
14
      FT_UINT8, BASE_DEC, NULL, 0xF0,
54021
14
      NULL, HFILL }},
54022
54023
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_max_vi,
54024
14
     {"ECW Max", "wlan.wfa.ie.wme.acp.ecw.max_vi",
54025
14
      FT_UINT8, BASE_DEC, NULL, 0xF0,
54026
14
      NULL, HFILL }},
54027
54028
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_min_be,
54029
14
     {"ECW Min", "wlan.wfa.ie.wme.acp.ecw.min_be",
54030
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
54031
14
      NULL, HFILL }},
54032
54033
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_min_bk,
54034
14
     {"ECW Min", "wlan.wfa.ie.wme.acp.ecw.min_bk",
54035
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
54036
14
      NULL, HFILL }},
54037
54038
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_min_vo,
54039
14
     {"ECW Min", "wlan.wfa.ie.wme.acp.ecw.min_vo",
54040
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
54041
14
      NULL, HFILL }},
54042
54043
14
    {&hf_ieee80211_wfa_ie_wme_acp_ecw_min_vi,
54044
14
     {"ECW Min", "wlan.wfa.ie.wme.acp.ecw.min_vi",
54045
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
54046
14
      NULL, HFILL }},
54047
54048
14
    {&hf_ieee80211_wfa_ie_wme_acp_txop_limit_be,
54049
14
     {"TXOP Limit", "wlan.wfa.ie.wme.acp.txop_limit_be",
54050
14
      FT_UINT16, BASE_DEC, NULL, 0x00,
54051
14
      NULL, HFILL }},
54052
54053
14
    {&hf_ieee80211_wfa_ie_wme_acp_txop_limit_bk,
54054
14
     {"TXOP Limit", "wlan.wfa.ie.wme.acp.txop_limit_bk",
54055
14
      FT_UINT16, BASE_DEC, NULL, 0x00,
54056
14
      NULL, HFILL }},
54057
54058
14
    {&hf_ieee80211_wfa_ie_wme_acp_txop_limit_vo,
54059
14
     {"TXOP Limit", "wlan.wfa.ie.wme.acp.txop_limit_vo",
54060
14
      FT_UINT16, BASE_DEC, NULL, 0x00,
54061
14
      NULL, HFILL }},
54062
54063
14
    {&hf_ieee80211_wfa_ie_wme_acp_txop_limit_vi,
54064
14
     {"TXOP Limit", "wlan.wfa.ie.wme.acp.txop_limit_vi",
54065
14
      FT_UINT16, BASE_DEC, NULL, 0x00,
54066
14
      NULL, HFILL }},
54067
54068
14
    {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo,
54069
14
     {"TS Info", "wlan.wfa.ie.wme.tspec.ts_info",
54070
14
      FT_UINT24, BASE_HEX, NULL, 0,
54071
14
      "Traffic Stream (TS) Info", HFILL }},
54072
54073
14
    {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid,
54074
14
     {"TID", "wlan.wfa.ie.wme.tspec.ts_info.tid",
54075
14
      FT_UINT24, BASE_DEC, NULL, 0x00001E,
54076
14
      "Traffic Stream Info ID (TID)", HFILL }},
54077
54078
14
    {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction,
54079
14
     {"Direction", "wlan.wfa.ie.wme.tspec.ts_info.dir",
54080
14
      FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_direction_vals), 0x000060,
54081
14
      "Traffic Stream (TS) Info Direction", HFILL }},
54082
54083
14
    {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb,
54084
14
     {"PSB", "wlan.wfa.ie.wme.tspec.ts_info.psb",
54085
14
      FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_psb_vals), 0x000400,
54086
14
      "Traffic Stream (TS) Info Power Save Behavior (PSB)", HFILL }},
54087
54088
14
    {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up,
54089
14
     {"UP", "wlan.wfa.ie.wme.tspec.ts_info.up",
54090
14
      FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_up_vals), 0x003800,
54091
14
      "Traffic Stream (TS) Info User Priority (UP)", HFILL }},
54092
54093
14
    {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved,
54094
14
     {"Reserved", "wlan.wfa.ie.wme.tspec.ts_info.reserved",
54095
14
      FT_UINT24, BASE_HEX, NULL, 0xFFC381,
54096
14
      "Must be Zero", HFILL }},
54097
54098
14
    {&hf_ieee80211_wfa_ie_wme_tspec_nor_msdu,
54099
14
     {"Normal MSDU Size", "wlan.wfa.ie.wme.tspec.nor_msdu",
54100
14
      FT_UINT16, BASE_DEC, NULL, 0,
54101
14
      NULL, HFILL }},
54102
54103
14
    {&hf_ieee80211_wfa_ie_wme_tspec_max_msdu,
54104
14
     {"Maximum MSDU Size", "wlan.wfa.ie.wme.tspec.max_msdu",
54105
14
      FT_UINT16, BASE_DEC, NULL, 0,
54106
14
      NULL, HFILL }},
54107
54108
14
    {&hf_ieee80211_wfa_ie_wme_tspec_min_srv,
54109
14
     {"Minimum Service Interval", "wlan.wfa.ie.wme.tspec.min_srv",
54110
14
      FT_UINT32, BASE_DEC, NULL, 0,
54111
14
      NULL, HFILL }},
54112
54113
14
    {&hf_ieee80211_wfa_ie_wme_tspec_max_srv,
54114
14
     {"Maximum Service Interval", "wlan.wfa.ie.wme.tspec.max_srv",
54115
14
      FT_UINT32, BASE_DEC, NULL, 0,
54116
14
      NULL, HFILL }},
54117
54118
14
    {&hf_ieee80211_wfa_ie_wme_tspec_inact_int,
54119
14
     {"Inactivity Interval", "wlan.wfa.ie.wme.tspec.inact_int",
54120
14
      FT_UINT32, BASE_DEC, NULL, 0,
54121
14
      NULL, HFILL }},
54122
54123
14
    {&hf_ieee80211_wfa_ie_wme_tspec_susp_int,
54124
14
     {"Suspension Interval", "wlan.wfa.ie.wme.tspec.susp_int",
54125
14
      FT_UINT32, BASE_DEC, NULL, 0,
54126
14
      NULL, HFILL }},
54127
54128
14
    {&hf_ieee80211_wfa_ie_wme_tspec_srv_start,
54129
14
     {"Service Start Time", "wlan.wfa.ie.wme.tspec.srv_start",
54130
14
      FT_UINT32, BASE_DEC, NULL, 0,
54131
14
      NULL, HFILL }},
54132
54133
14
    {&hf_ieee80211_wfa_ie_wme_tspec_min_data,
54134
14
     {"Minimum Data Rate", "wlan.wfa.ie.wme.tspec.min_data",
54135
14
      FT_UINT32, BASE_DEC, NULL, 0,
54136
14
      NULL, HFILL }},
54137
54138
14
    {&hf_ieee80211_wfa_ie_wme_tspec_mean_data,
54139
14
     {"Mean Data Rate", "wlan.wfa.ie.wme.tspec.mean_data",
54140
14
      FT_UINT32, BASE_DEC, NULL, 0,
54141
14
      NULL, HFILL }},
54142
54143
14
    {&hf_ieee80211_wfa_ie_wme_tspec_peak_data,
54144
14
     {"Peak Data Rate", "wlan.wfa.ie.wme.tspec.peak_data",
54145
14
      FT_UINT32, BASE_DEC, NULL, 0,
54146
14
      NULL, HFILL }},
54147
54148
14
    {&hf_ieee80211_wfa_ie_wme_tspec_burst_size,
54149
14
     {"Burst Size", "wlan.wfa.ie.wme.tspec.burst_size",
54150
14
      FT_UINT32, BASE_DEC, NULL, 0,
54151
14
      NULL, HFILL }},
54152
54153
14
    {&hf_ieee80211_wfa_ie_wme_tspec_delay_bound,
54154
14
     {"Delay Bound", "wlan.wfa.ie.wme.tspec.delay_bound",
54155
14
      FT_UINT32, BASE_DEC, NULL, 0,
54156
14
      NULL, HFILL }},
54157
54158
14
    {&hf_ieee80211_wfa_ie_wme_tspec_min_phy,
54159
14
     {"Minimum PHY Rate", "wlan.wfa.ie.wme.tspec.min_phy",
54160
14
      FT_UINT32, BASE_DEC, NULL, 0,
54161
14
      NULL, HFILL }},
54162
54163
14
    {&hf_ieee80211_wfa_ie_wme_tspec_surplus,
54164
14
     {"Surplus Bandwidth Allowance", "wlan.wfa.ie.wme.tspec.surplus",
54165
14
      FT_UINT16, BASE_DEC, NULL, 0,
54166
14
      NULL, HFILL }},
54167
54168
14
    {&hf_ieee80211_wfa_ie_wme_tspec_medium,
54169
14
     {"Medium Time", "wlan.wfa.ie.wme.tspec.medium",
54170
14
      FT_UINT16, BASE_DEC, NULL, 0,
54171
14
      NULL, HFILL }},
54172
54173
14
    {&hf_ieee80211_wfa_ie_nc_cost_level,
54174
14
     {"Cost Level", "wlan.wfa.ie.nc.cost_level",
54175
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_nc_cost_level_vals), 0,
54176
14
      NULL, HFILL }},
54177
54178
14
    {&hf_ieee80211_wfa_ie_nc_reserved,
54179
14
     {"Reserved", "wlan.wfa.ie.nc.reserved",
54180
14
      FT_UINT8, BASE_HEX, NULL, 0,
54181
14
      NULL, HFILL }},
54182
54183
14
    {&hf_ieee80211_wfa_ie_nc_cost_flags,
54184
14
     {"Cost Flags", "wlan.wfa.ie.nc.cost_flags",
54185
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_nc_cost_flags_vals), 0,
54186
14
      NULL, HFILL }},
54187
54188
14
    {&hf_ieee80211_wfa_ie_tethering_type,
54189
14
     {"Type", "wlan.wfa.ie.tethering.type",
54190
14
      FT_UINT16, BASE_DEC, VALS(ieee80211_wfa_ie_tethering_type_vals), 0,
54191
14
      NULL, HFILL }},
54192
54193
14
    {&hf_ieee80211_wfa_ie_tethering_mac_length,
54194
14
     {"MAC Length", "wlan.wfa.ie.tethering.mac_length",
54195
14
      FT_UINT16, BASE_DEC, NULL, 0,
54196
14
      NULL, HFILL }},
54197
54198
14
      {&hf_ieee80211_wfa_ie_tethering_mac,
54199
14
     {"MAC Address", "wlan.wfa.ie.tethering.mac",
54200
14
      FT_ETHER, BASE_NONE, NULL, 0,
54201
14
      NULL, HFILL }},
54202
54203
14
    {&hf_ieee80211_wfa_ie_owe_bssid,
54204
14
     {"BSSID", "wlan.wfa.ie.owe.bssid",
54205
14
      FT_ETHER, BASE_NONE, NULL, 0,
54206
14
      NULL, HFILL }},
54207
54208
14
    {&hf_ieee80211_wfa_ie_owe_ssid_length,
54209
14
     {"SSID length", "wlan.wfa.ie.owe.ssid_length",
54210
14
      FT_UINT16, BASE_DEC, NULL, 0,
54211
14
      NULL, HFILL }},
54212
54213
14
    {&hf_ieee80211_wfa_ie_owe_ssid,
54214
14
     {"SSID", "wlan.wfa.ie.owe.ssid",
54215
14
      FT_STRING, BASE_NONE, NULL, 0,
54216
14
      NULL, HFILL }},
54217
54218
14
    {&hf_ieee80211_wfa_ie_owe_band_info,
54219
14
     {"Band info", "wlan.wfa.ie.owe.band_info",
54220
14
      FT_UINT16, BASE_DEC, NULL, 0,
54221
14
      NULL, HFILL }},
54222
54223
14
    {&hf_ieee80211_wfa_ie_owe_channel_info,
54224
14
     {"Channel info", "wlan.wfa.ie.owe.channel_info",
54225
14
      FT_UINT16, BASE_DEC, NULL, 0,
54226
14
      NULL, HFILL }},
54227
54228
14
    {&hf_ieee80211_wfa_ie_mbo_oce_attr,
54229
14
     {"MBO/OCE attribute", "wlan.wfa.ie.mbo_oce.attr",
54230
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
54231
54232
14
    {&hf_ieee80211_wfa_ie_mbo_oce_attr_id,
54233
14
     {"ID", "wlan.wfa.ie.mbo_oce.attr_id",
54234
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_oce_attr_id_vals), 0, NULL, HFILL }},
54235
54236
14
    {&hf_ieee80211_wfa_ie_mbo_oce_attr_len,
54237
14
     {"Length", "wlan.wfa.ie.mbo_oce.attr_len",
54238
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
54239
54240
14
    {&hf_ieee80211_wfa_ie_mbo_ap_cap,
54241
14
     {"MBO Capability Indication", "wlan.wfa.ie.mbo_oce.ap_cap",
54242
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
54243
54244
14
    {&hf_ieee80211_wfa_ie_mbo_ap_cap_cell,
54245
14
     {"AP is cellular data aware", "wlan.wfa.ie.mbo.ap_cap.cell",
54246
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40, NULL, HFILL }},
54247
54248
14
    {&hf_ieee80211_wfa_ie_mbo_ap_cap_reserved,
54249
14
     {"Reserved", "wlan.wfa.ie.mbo.ap_cap.reserved",
54250
14
      FT_UINT8, BASE_HEX, NULL, 0xBF, NULL, HFILL }},
54251
54252
14
    {&hf_ieee80211_wfa_ie_mbo_non_pref_chan_op_class,
54253
14
     {"Operating Class", "wlan.wfa.ie.mbo.non_pref_chan.op_class",
54254
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
54255
54256
14
    {&hf_ieee80211_wfa_ie_mbo_non_pref_chan_chan,
54257
14
     {"Channel", "wlan.wfa.ie.mbo.non_pref_chan.chan",
54258
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
54259
54260
14
    {&hf_ieee80211_wfa_ie_mbo_non_pref_chan_pref,
54261
14
     {"Preference", "wlan.wfa.ie.mbo.non_pref_chan.pref",
54262
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_non_pref_chan_pref_vals), 0, NULL, HFILL }},
54263
54264
14
    {&hf_ieee80211_wfa_ie_mbo_non_pref_chan_reason,
54265
14
     {"Reason Code", "wlan.wfa.ie.mbo.non_pref_chan.reason",
54266
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_non_pref_chan_reason_vals), 0, NULL, HFILL }},
54267
54268
14
    {&hf_ieee80211_wfa_ie_mbo_cellular_cap,
54269
14
     {"Cellular Data Connectivity", "wlan.wfa.ie.mbo.cellular_cap",
54270
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_cellular_cap_vals), 0, NULL, HFILL }},
54271
54272
14
    {&hf_ieee80211_wfa_ie_mbo_assoc_disallow_reason,
54273
14
     {"Reason Code", "wlan.wfa.ie.mbo.assoc_disallow.reason",
54274
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_assoc_dissallow_reason_vals),
54275
14
      0, NULL, HFILL }},
54276
54277
14
    {&hf_ieee80211_wfa_ie_mbo_cellular_pref,
54278
14
     {"Cellular Data Preference", "wlan.wfa.ie.mbo.cellular_pref",
54279
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_cellular_pref_vals), 0, NULL, HFILL }},
54280
54281
14
    {&hf_ieee80211_wfa_ie_mbo_transition_reason,
54282
14
     {"Transition Reason Code", "wlan.wfa.ie.mbo.transition.reason",
54283
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_transition_reason_vals), 0, NULL, HFILL }},
54284
54285
14
    {&hf_ieee80211_wfa_ie_mbo_transition_rej_reason,
54286
14
     {"Transition Rejection Reason Code", "wlan.wfa.ie.mbo.transition_rej.reason",
54287
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_transition_rej_reason_vals), 0, NULL, HFILL }},
54288
54289
14
    {&hf_ieee80211_wfa_ie_mbo_assoc_retry_delay,
54290
14
     {"Re-association Delay", "wlan.wfa.ie.mbo.assoc_retry.delay",
54291
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0, NULL, HFILL }},
54292
54293
14
    {&hf_ieee80211_wfa_ie_oce_cap_ctrl,
54294
14
     {"OCE Control", "wlan.wfa.ie.oce.cap.ctrl",
54295
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
54296
54297
14
    {&hf_ieee80211_wfa_ie_oce_cap_release,
54298
14
     {"OCE Release", "wlan.wfa.ie.oce.cap.release",
54299
14
      FT_UINT8, BASE_HEX, NULL, 0x3, NULL, HFILL }},
54300
54301
14
    {&hf_ieee80211_wfa_ie_oce_cap_sta_cfon,
54302
14
     {"is STA CFON", "wlan.wfa.ie.oce.cap.sta_cfon",
54303
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x4, NULL, HFILL }},
54304
54305
14
    {&hf_ieee80211_wfa_ie_oce_cap_11b_only_ap,
54306
14
     {"11b only AP present on operating channel", "wlan.wfa.ie.oce.cap.11b_only_ap",
54307
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10, NULL, HFILL }},
54308
54309
14
    {&hf_ieee80211_wfa_ie_oce_cap_hlp,
54310
14
     {"FILS Higher Layer Setup with Higher Layer Protocol Encapsulation enabled",
54311
14
      "wlan.wfa.ie.oce.cap.hlp", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20, NULL, HFILL }},
54312
54313
14
    {&hf_ieee80211_wfa_ie_oce_cap_non_oce_ap,
54314
14
     {"non OCE AP present on operating channel", "wlan.wfa.ie.oce.cap.non_oce_ap",
54315
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40, NULL, HFILL }},
54316
54317
14
    {&hf_ieee80211_wfa_ie_oce_cap_reserved,
54318
14
     {"Reserved", "wlan.wfa.ie.oce.cap.reserved",
54319
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
54320
54321
14
    {&hf_ieee80211_wfa_ie_oce_rssi_assoc_rej_delta,
54322
14
     {"Delta RSSI", "wlan.wfa.ie.oce.rssi_assoc_rej.delta",
54323
14
      FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_decibels), 0, NULL, HFILL }},
54324
54325
14
    {&hf_ieee80211_wfa_ie_oce_rssi_assoc_rej_delay,
54326
14
     {"Retry Delay", "wlan.wfa.ie.oce.rssi_assoc_rej.delay",
54327
14
      FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0, NULL, HFILL }},
54328
54329
14
    {&hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap,
54330
14
     {"Available Capacity", "wlan.wfa.ie.oce.wan_metrics.avail_cap",
54331
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
54332
54333
14
    {&hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap_downlink,
54334
14
     {"Downlink", "wlan.wfa.ie.oce.wan_metrics.avail_cap_downlink",
54335
14
      FT_UINT8, BASE_HEX, NULL, 0xf, NULL, HFILL }},
54336
54337
14
    {&hf_ieee80211_wfa_ie_oce_wan_metrics_avail_cap_uplink,
54338
14
     {"Uplink", "wlan.wfa.ie.oce.wan_metrics.avail_cap_uplink",
54339
14
      FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL }},
54340
54341
14
    {&hf_ieee80211_wfa_ie_oce_rnr_completeness_short_ssid,
54342
14
     {"Short SSID", "wlan.wfa.ie.oce.rnr_completeness.short_ssid",
54343
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
54344
54345
14
    {&hf_ieee80211_wfa_ie_oce_probe_suppr_bssid,
54346
14
     {"BSSID", "wlan.wfa.ie.oce.probe_suppr.bssid",
54347
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
54348
54349
14
    {&hf_ieee80211_wfa_ie_oce_probe_suppr_ssid,
54350
14
     {"SSID", "wlan.wfa.ie.oce.probe_suppr.ssid",
54351
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
54352
54353
14
    {&hf_ieee80211_wfa_anqp_mbo_subtype,
54354
14
     {"Subtype", "wlan.wfa.anqp.mbo.subtype",
54355
14
      FT_UINT8, BASE_DEC, VALS(mbo_anqp_subtype_vals), 0, NULL, HFILL }},
54356
54357
14
    {&hf_ieee80211_wfa_anqp_mbo_query,
54358
14
     {"Query Subtype", "wlan.wfa.anqp.mbo.query",
54359
14
      FT_UINT8, BASE_DEC, VALS(mbo_anqp_subtype_vals), 0, NULL, HFILL }},
54360
54361
14
    {&hf_ieee80211_wfa_anqp_mbo_cellular_pref,
54362
14
     {"Cellular Data Preference", "wlan.wfa.anqp.mbo.cellular_pref",
54363
14
      FT_UINT8, BASE_DEC, VALS(wfa_mbo_cellular_pref_vals), 0x0, NULL, HFILL }},
54364
54365
14
    {&hf_ieee80211_rsn_ie_ptk_keyid,
54366
14
     {"KeyID", "wlan.rsn.ie.ptk.keyid",
54367
14
      FT_UINT8, BASE_DEC, NULL, 0x03,
54368
14
      NULL, HFILL }},
54369
54370
14
    {&hf_ieee80211_rsn_ie_pmkid,
54371
14
     {"PMKID", "wlan.rsn.ie.pmkid",
54372
14
      FT_BYTES, BASE_NONE, NULL, 0,
54373
14
      NULL, HFILL }},
54374
54375
14
    {&hf_ieee80211_rsn_ie_gtk_kde_data_type,
54376
14
     {"Data Type", "wlan.rsn.ie.data_type",
54377
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(kde_selectors_rvals),
54378
14
      0, NULL, HFILL }},
54379
54380
14
    {&hf_ieee80211_rsn_ie_gtk_kde_key_id,
54381
14
     {"Key ID", "wlan.rsn.ie.gtk_kde.key_id",
54382
14
      FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL }},
54383
54384
14
    {&hf_ieee80211_rsn_ie_gtk_kde_tx,
54385
14
     {"Tx", "wlan.rsn.ie.gtk_kde.tx",
54386
14
      FT_BOOLEAN, 8, TFS(&tfs_rsn_gtk_kde_tx), 0x04, NULL, HFILL }},
54387
54388
14
    {&hf_ieee80211_rsn_ie_gtk_kde_reserved1,
54389
14
     {"Reserved", "wlan.rsn.ie.gtk_kde.res1",
54390
14
      FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL }},
54391
54392
14
    {&hf_ieee80211_rsn_ie_gtk_kde_reserved2,
54393
14
     {"Reserved", "wlan.rsn.ie.gtk_kde.res2",
54394
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
54395
54396
14
    {&hf_ieee80211_rsn_ie_gtk_kde_gtk,
54397
14
     {"GTK", "wlan.rsn.ie.gtk_kde.gtk",
54398
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54399
54400
14
    {&hf_ieee80211_rsn_ie_mac_address_kde_mac,
54401
14
     {"MAC Address", "wlan.rsn.ie.mac_address_kde.mac_address",
54402
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54403
54404
14
    {&hf_ieee80211_rsn_ie_gtk_kde_nonce,
54405
14
     {"Key Nonce", "wlan.rsn.ie.key_nonce_kde.nonce",
54406
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54407
54408
14
    {&hf_ieee80211_rsn_ie_gtk_kde_lifetime,
54409
14
     {"Key Lifetime", "wlan.rsn.ie.key_lifetime_kde.lifetime",
54410
14
      FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_seconds), 0x0, NULL, HFILL }},
54411
54412
14
    {&hf_ieee80211_rsn_ie_error_kde_res,
54413
14
     {"Reserved", "wlan.rsn.ie.error_kde.reserved",
54414
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
54415
54416
14
    {&hf_ieee80211_rsn_ie_error_kde_error_type,
54417
14
     {"Error Type", "wlan.rsn.ie.error_kde.error_type",
54418
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
54419
54420
14
    {&hf_ieee80211_rsn_ie_igtk_kde_keyid,
54421
14
     {"KeyId", "wlan.rsn.ie.igtk.kde.keyid",
54422
14
      FT_UINT16, BASE_DEC, NULL, 0,
54423
14
      NULL, HFILL }},
54424
54425
14
    {&hf_ieee80211_rsn_ie_igtk_kde_ipn,
54426
14
     {"IPN", "wlan.rsn.ie.igtk.kde.ipn",
54427
14
      FT_UINT48, BASE_DEC, NULL, 0,
54428
14
      NULL, HFILL }},
54429
54430
14
    {&hf_ieee80211_rsn_ie_igtk_kde_igtk,
54431
14
     {"IGTK", "wlan.rsn.ie.igtk.kde.igtk",
54432
14
      FT_BYTES, BASE_NONE, NULL, 0,
54433
14
      NULL, HFILL }},
54434
54435
14
    {&hf_ieee80211_rsn_ie_oci_operating_class,
54436
14
     {"Operating Class", "wlan.rsn.ie.oci_kde.operating_class",
54437
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54438
54439
14
    {&hf_ieee80211_rsn_ie_oci_primary_channel_number,
54440
14
     {"Primary Channel Number", "wlan.rsn.ie.oci_kde.primary_channel_number",
54441
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54442
54443
14
    {&hf_ieee80211_rsn_ie_oci_frequency_segment_1,
54444
14
     {"Frequency Segment 1 Channel Number",
54445
14
      "wlan.rsn.ie.oci_kde.frequency_segment_1_channel_number",
54446
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54447
54448
14
    {&hf_ieee80211_rsn_ie_bigtk_key_id,
54449
14
     {"Key ID", "wlan.rsn.ie.bigtk_kde.key_id",
54450
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54451
54452
14
    {&hf_ieee80211_rsn_ie_bigtk_bipn,
54453
14
     {"BIPN", "wlan.rsn.ie.bigtk_kde.bipn",
54454
14
      FT_UINT48, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54455
54456
14
    {&hf_ieee80211_rsn_ie_bigtk_bigtk,
54457
14
     {"Key ID", "wlan.rsn.ie.bigtk_kde.bigtk",
54458
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54459
54460
14
    {&hf_ieee80211_rsn_ie_mlo_link_info,
54461
14
     {"Link Information", "wlan.rsn.ie.mlo_link.link_info",
54462
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
54463
54464
14
    {&hf_ieee80211_rsn_ie_mlo_linkid,
54465
14
     {"LinkID", "wlan.rsn.ie.mlo_link.link_info.linkid",
54466
14
      FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
54467
54468
14
    {&hf_ieee80211_rsn_ie_mlo_rnse_present,
54469
14
     {"RSNEInfo", "wlan.rsn.ie.mlo_link.link_info.rsneinfo",
54470
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
54471
54472
14
    {&hf_ieee80211_rsn_ie_mlo_rnsxe_present,
54473
14
     {"RSNXEInfo", "wlan.rsn.ie.mlo_link.link_info.rsnxeinfo",
54474
14
      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
54475
54476
14
    {&hf_ieee80211_rsn_ie_mlo_reserved,
54477
14
     {"Reserved", "wlan.rsn.ie.mlo_link.link_info.reserved",
54478
14
      FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL }},
54479
54480
14
    {&hf_ieee80211_rsn_ie_mlo_mac_addr,
54481
14
     {"MAC Address", "wlan.rsn.ie.mlo_link.mac_addr",
54482
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54483
54484
14
    {&hf_ieee80211_rsn_ie_mlo_gtk_kde_key_id,
54485
14
     {"Key ID", "wlan.rsn.ie.mlo_gtk.key_id",
54486
14
      FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL }},
54487
54488
14
    {&hf_ieee80211_rsn_ie_mlo_gtk_kde_tx,
54489
14
     {"Tx", "wlan.rsn.ie.mlo_gtk.tx",
54490
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
54491
54492
14
    {&hf_ieee80211_rsn_ie_mlo_gtk_kde_reserved,
54493
14
     {"Reserved", "wlan.rsn.ie.mlo_gtk.reserved",
54494
14
      FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL }},
54495
54496
14
    {&hf_ieee80211_rsn_ie_mlo_gtk_kde_linkid,
54497
14
     {"LinkID", "wlan.rsn.ie.mlo_gtk.linkid",
54498
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
54499
54500
14
    {&hf_ieee80211_rsn_ie_mlo_gtk_kde_pn,
54501
14
     {"PN", "wlan.rsn.ie.mlo_gtk.pn",
54502
14
      FT_UINT48, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54503
54504
14
    {&hf_ieee80211_rsn_ie_mlo_gtk_kde_gtk,
54505
14
     {"GTK", "wlan.rsn.ie.mlo_gtk.gtk",
54506
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54507
54508
14
    {&hf_ieee80211_rsn_ie_mlo_igtk_kde_key_id,
54509
14
     {"Key ID", "wlan.rsn.ie.mlo_igtk.key_id",
54510
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
54511
54512
14
    {&hf_ieee80211_rsn_ie_mlo_igtk_kde_ipn,
54513
14
     {"IPN", "wlan.rsn.ie.mlo_igtk.ipn",
54514
14
      FT_UINT48, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54515
54516
14
    {&hf_ieee80211_rsn_ie_mlo_igtk_kde_reserved,
54517
14
     {"Reserved", "wlan.rsn.ie.mlo_igtk.reserved",
54518
14
      FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL }},
54519
54520
14
    {&hf_ieee80211_rsn_ie_mlo_igtk_kde_linkid,
54521
14
     {"LinkID", "wlan.rsn.ie.mlo_igtk.linkid",
54522
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
54523
54524
14
    {&hf_ieee80211_rsn_ie_mlo_igtk_kde_igtk,
54525
14
     {"IGTK", "wlan.rsn.ie.mlo_igtk.igtk",
54526
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54527
54528
14
    {&hf_ieee80211_rsn_ie_mlo_bigtk_kde_key_id,
54529
14
     {"Key ID", "wlan.rsn.ie.mlo_bigtk.key_id",
54530
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
54531
54532
14
    {&hf_ieee80211_rsn_ie_mlo_bigtk_kde_ipn,
54533
14
     {"IPN", "wlan.rsn.ie.mlo_bigtk.ipn",
54534
14
      FT_UINT48, BASE_DEC, NULL, 0x0, NULL, HFILL }},
54535
54536
14
    {&hf_ieee80211_rsn_ie_mlo_bigtk_kde_reserved,
54537
14
     {"Reserved", "wlan.rsn.ie.mlo_bigtk.reserved",
54538
14
      FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL }},
54539
54540
14
    {&hf_ieee80211_rsn_ie_mlo_bigtk_kde_linkid,
54541
14
     {"LinkID", "wlan.rsn.ie.mlo_bigtk.linkid",
54542
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
54543
54544
14
    {&hf_ieee80211_rsn_ie_mlo_bigtk_kde_bigtk,
54545
14
     {"BIGTK", "wlan.rsn.ie.mlo_bigtk.bigtk",
54546
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
54547
54548
14
    {&hf_ieee80211_rsn_ie_unknown,
54549
14
     {"RSN Unknown", "wlan.rsn.ie.unknown",
54550
14
      FT_BYTES, BASE_NONE, NULL, 0,
54551
14
      NULL, HFILL }},
54552
54553
14
    {&hf_ieee80211_marvell_ie_type,
54554
14
     {"Type", "wlan.marvell.ie.type",
54555
14
      FT_UINT8, BASE_HEX, NULL, 0,
54556
14
      NULL, HFILL }},
54557
54558
14
    {&hf_ieee80211_marvell_ie_mesh_subtype,
54559
14
     {"Subtype", "wlan.marvell.ie.subtype",
54560
14
      FT_UINT8, BASE_HEX, NULL, 0,
54561
14
      NULL, HFILL }},
54562
54563
14
    {&hf_ieee80211_marvell_ie_mesh_version,
54564
14
     {"Version", "wlan.marvell.ie.version",
54565
14
      FT_UINT8, BASE_HEX, NULL, 0,
54566
14
      NULL, HFILL }},
54567
54568
14
    {&hf_ieee80211_marvell_ie_mesh_active_proto_id,
54569
14
     {"Path Selection Protocol", "wlan.marvell.ie.proto_id",
54570
14
      FT_UINT8, BASE_HEX, VALS(mesh_path_selection_codes), 0,
54571
14
      NULL, HFILL }},
54572
54573
14
    {&hf_ieee80211_marvell_ie_mesh_active_metric_id,
54574
14
     {"Path Selection Metric", "wlan.marvell.ie.metric_id",
54575
14
      FT_UINT8, BASE_HEX, VALS(mesh_metric_codes), 0,
54576
14
      NULL, HFILL }},
54577
54578
14
    {&hf_ieee80211_marvell_ie_mesh_cap,
54579
14
     {"Mesh Capabilities", "wlan.marvell.ie.cap",
54580
14
      FT_UINT8, BASE_HEX, NULL, 0,
54581
14
      NULL, HFILL }},
54582
54583
14
    {&hf_ieee80211_marvell_ie_data,
54584
14
     { "Marvell IE data", "wlan.marvell.data",
54585
14
       FT_BYTES, BASE_NONE, NULL, 0x0,
54586
14
       NULL, HFILL }},
54587
54588
14
   {&hf_ieee80211_extreme_mesh_ie_type,
54589
14
     { "Type", "wlan.extreme_mesh.ie.type",
54590
14
       FT_UINT8, BASE_HEX, VALS(extreme_mesh_ie_type_vals), 0,
54591
14
       NULL, HFILL }},
54592
14
   {&hf_ieee80211_extreme_mesh_ie_services,
54593
14
     { "Services", "wlan.extreme_mesh.ie.services",
54594
14
       FT_UINT8, BASE_HEX, NULL, 0,
54595
14
       NULL, HFILL }},
54596
14
   {&hf_ieee80211_extreme_mesh_ie_hello_f_root,
54597
14
     { "Root", "wlan.extreme_mesh.ie.services.root",
54598
14
       FT_BOOLEAN, 8, NULL, EXTREME_MESH_IE_SERVICES_ROOT,
54599
14
       NULL, HFILL }},
54600
14
   {&hf_ieee80211_extreme_mesh_ie_hello_f_proxy,
54601
14
     { "Proxy", "wlan.extreme_mesh.ie.services.proxy",
54602
14
       FT_BOOLEAN, 8, NULL, EXTREME_MESH_IE_SERVICES_PROXY,
54603
14
       NULL, HFILL }},
54604
14
   {&hf_ieee80211_extreme_mesh_ie_hello_f_geo,
54605
14
     { "Geo", "wlan.extreme_mesh.ie.services.geo",
54606
14
       FT_BOOLEAN, 8, NULL, EXTREME_MESH_IE_SERVICES_GEO,
54607
14
       NULL, HFILL }},
54608
14
   {&hf_ieee80211_extreme_mesh_ie_hello_f_path_pref,
54609
14
     { "Path Preference", "wlan.extreme_mesh.ie.services.path_pref",
54610
14
       FT_BOOLEAN, 8, NULL, EXTREME_MESH_IE_SERVICES_PATH_PREF,
54611
14
       NULL, HFILL }},
54612
14
   {&hf_ieee80211_extreme_mesh_ie_hello_f_mobile,
54613
14
     { "Mobile", "wlan.extreme_mesh.ie.services.mobile",
54614
14
       FT_BOOLEAN, 8, NULL, EXTREME_MESH_IE_SERVICES_MOBILE,
54615
14
       NULL, HFILL }},
54616
14
   {&hf_ieee80211_extreme_mesh_ie_htr,
54617
14
     { "Hops to Root", "wlan.extreme_mesh.ie.htr",
54618
14
       FT_UINT8, BASE_HEX, NULL, 0,
54619
14
       NULL, HFILL }},
54620
14
   {&hf_ieee80211_extreme_mesh_ie_mtr,
54621
14
     { "Metric to Root", "wlan.extreme_mesh.ie.mtr",
54622
14
       FT_UINT16, BASE_HEX, NULL, 0,
54623
14
       NULL, HFILL }},
54624
14
   {&hf_ieee80211_extreme_mesh_ie_root,
54625
14
     { "Root Id", "wlan.extreme_mesh.ie.root",
54626
14
       FT_ETHER, BASE_NONE, NULL, 0,
54627
14
       NULL, HFILL }},
54628
14
   {&hf_ieee80211_extreme_mesh_ie_nh,
54629
14
     { "Next Hop", "wlan.extreme_mesh.ie.nh",
54630
14
       FT_ETHER, BASE_NONE, NULL, 0,
54631
14
       NULL, HFILL }},
54632
14
   {&hf_ieee80211_extreme_mesh_ie_mesh_id,
54633
14
     { "Mesh Id", "wlan.extreme_mesh.ie.mesh_id",
54634
14
       FT_STRING, BASE_NONE, NULL, 0,
54635
14
       NULL, HFILL }},
54636
14
   {&hf_ieee80211_extreme_mesh_ie_mp_id,
54637
14
     { "Mesh Point Id", "wlan.extreme_mesh.ie.mp_id",
54638
14
       FT_ETHER, BASE_NONE, NULL, 0,
54639
14
       NULL, HFILL }},
54640
54641
14
    {&hf_ieee80211_atheros_ie_type,
54642
14
     {"Type", "wlan.atheros.ie.type",
54643
14
      FT_UINT8, BASE_HEX, VALS(atheros_ie_type_vals), 0,
54644
14
      NULL, HFILL }},
54645
54646
14
    {&hf_ieee80211_atheros_ie_subtype,
54647
14
     {"Subtype", "wlan.atheros.ie.subtype",
54648
14
      FT_UINT8, BASE_HEX, NULL, 0,
54649
14
      NULL, HFILL }},
54650
54651
14
    {&hf_ieee80211_atheros_ie_version,
54652
14
     {"Version", "wlan.atheros.ie.version",
54653
14
      FT_UINT8, BASE_HEX, NULL, 0,
54654
14
      NULL, HFILL }},
54655
54656
14
    {&hf_ieee80211_atheros_ie_cap_f_turbop,
54657
14
     {"Turbo Prime", "wlan.ie.atheros.capabilities.turbop",
54658
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_TURBOP,
54659
14
      NULL, HFILL }},
54660
54661
14
    {&hf_ieee80211_atheros_ie_cap_f_comp,
54662
14
     {"Compression", "wlan.ie.atheros.capabilities.comp",
54663
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_COMP,
54664
14
      NULL, HFILL }},
54665
54666
14
    {&hf_ieee80211_atheros_ie_cap_f_ff,
54667
14
     {"Fast Frames", "wlan.ie.atheros.capabilities.ff",
54668
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_FF,
54669
14
      NULL, HFILL }},
54670
54671
14
    {&hf_ieee80211_atheros_ie_cap_f_xr,
54672
14
     {"eXtended Range", "wlan.ie.atheros.capabilities.xr",
54673
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_XR,
54674
14
      NULL, HFILL }},
54675
54676
14
    {&hf_ieee80211_atheros_ie_cap_f_ar,
54677
14
     {"Advanced Radar", "wlan.ie.atheros.capabilities.ar",
54678
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_AR,
54679
14
      NULL, HFILL }},
54680
54681
14
    {&hf_ieee80211_atheros_ie_cap_f_burst,
54682
14
     {"Burst", "wlan.ie.atheros.capabilities.burst",
54683
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_BURST,
54684
14
      NULL, HFILL }},
54685
54686
14
    {&hf_ieee80211_atheros_ie_cap_f_wme,
54687
14
     {"CWMin tuning", "wlan.ie.atheros.capabilities.wme",
54688
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_WME,
54689
14
      NULL, HFILL }},
54690
54691
14
    {&hf_ieee80211_atheros_ie_cap_f_boost,
54692
14
     {"Boost", "wlan.ie.atheros.capabilities.boost",
54693
14
      FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_BOOST,
54694
14
      NULL, HFILL }},
54695
54696
14
    {&hf_ieee80211_atheros_ie_advcap_cap,
54697
14
     {"Capabilities", "wlan.atheros.ie.advcap.cap",
54698
14
      FT_UINT8, BASE_HEX, NULL, 0,
54699
14
      NULL, HFILL }},
54700
54701
14
    {&hf_ieee80211_atheros_ie_advcap_defkey,
54702
14
     {"Default key index", "wlan.atheros.ie.advcap.defkey",
54703
14
      FT_UINT16, BASE_HEX, NULL, 0,
54704
14
      NULL, HFILL }},
54705
54706
14
    {&hf_ieee80211_atheros_ie_xr_info,
54707
14
     {"Info", "wlan.atheros.ie.xr.info",
54708
14
      FT_UINT8, BASE_HEX, NULL, 0,
54709
14
      NULL, HFILL }},
54710
54711
14
    {&hf_ieee80211_atheros_ie_xr_base_bssid,
54712
14
     {"Base BSS Id", "wlan.atheros.ie.xr.base_bssid",
54713
14
      FT_ETHER, BASE_NONE, NULL, 0,
54714
14
      NULL, HFILL }},
54715
54716
14
    {&hf_ieee80211_atheros_ie_xr_xr_bssid,
54717
14
     {"XR BSS Id", "wlan.atheros.ie.xr.xr_bssid",
54718
14
      FT_ETHER, BASE_NONE, NULL, 0,
54719
14
      NULL, HFILL }},
54720
54721
14
    {&hf_ieee80211_atheros_ie_xr_xr_beacon,
54722
14
     {"XR Beacon Interval", "wlan.atheros.ie.xr.xr_beacon",
54723
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
54724
14
      NULL, HFILL }},
54725
54726
14
    {&hf_ieee80211_atheros_ie_xr_base_cap,
54727
14
     {"Base capabilities", "wlan.atheros.ie.xr.base_cap",
54728
14
      FT_UINT8, BASE_HEX, NULL, 0,
54729
14
      NULL, HFILL }},
54730
54731
14
    {&hf_ieee80211_atheros_ie_xr_xr_cap,
54732
14
     {"XR capabilities", "wlan.atheros.ie.xr.xr_cap",
54733
14
      FT_UINT8, BASE_HEX, NULL, 0,
54734
14
      NULL, HFILL }},
54735
54736
14
    {&hf_ieee80211_atheros_ie_data,
54737
14
     {"Atheros IE data", "wlan.atheros.data",
54738
14
      FT_BYTES, BASE_NONE, NULL, 0,
54739
14
      NULL, HFILL }},
54740
54741
14
    {&hf_ieee80211_aironet_ie_type,
54742
14
     {"Aironet IE type", "wlan.aironet.type",
54743
14
      FT_UINT8, BASE_DEC, VALS(aironet_ie_type_vals), 0,
54744
14
      NULL, HFILL }},
54745
54746
14
    {&hf_ieee80211_aironet_ie_dtpc,
54747
14
     {"Aironet IE CCX DTCP", "wlan.aironet.dtpc",
54748
14
      FT_INT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_dbm), 0,
54749
14
      NULL, HFILL }},
54750
54751
14
    {&hf_ieee80211_aironet_ie_dtpc_unknown,
54752
14
     {"Aironet IE CCX DTCP Unknown", "wlan.aironet.dtpc_unknown",
54753
14
      FT_BYTES, BASE_NONE, NULL, 0,
54754
14
      NULL, HFILL }},
54755
54756
14
    {&hf_ieee80211_aironet_ie_version,
54757
14
     {"Aironet IE CCX version", "wlan.aironet.version",
54758
14
      FT_UINT8, BASE_DEC, NULL, 0,
54759
14
      NULL, HFILL }},
54760
54761
14
    {&hf_ieee80211_aironet_ie_data,
54762
14
     { "Aironet IE data", "wlan.aironet.data",
54763
14
       FT_BYTES, BASE_NONE, NULL, 0x0,
54764
14
       NULL, HFILL }},
54765
54766
14
    {&hf_ieee80211_qbss_version,
54767
14
     {"QBSS Version", "wlan.qbss.version",
54768
14
      FT_UINT8, BASE_DEC, NULL, 0,
54769
14
      NULL, HFILL }},
54770
54771
14
    {&hf_ieee80211_qbss_scount,
54772
14
     {"Station Count", "wlan.qbss.scount",
54773
14
      FT_UINT16, BASE_DEC, NULL, 0,
54774
14
      NULL, HFILL }},
54775
54776
14
    {&hf_ieee80211_qbss_cu,
54777
14
     {"Channel Utilization", "wlan.qbss.cu",
54778
14
      FT_UINT8, BASE_DEC, NULL, 0,
54779
14
      NULL, HFILL }},
54780
54781
14
    {&hf_ieee80211_qbss_adc,
54782
14
     {"Available Admission Capacity", "wlan.qbss.adc",
54783
14
      FT_UINT16, BASE_DEC, NULL, 0,
54784
14
      NULL, HFILL }},
54785
54786
14
    {&hf_ieee80211_qbss2_cu,
54787
14
     {"Channel Utilization", "wlan.qbss2.cu",
54788
14
      FT_UINT8, BASE_DEC, NULL, 0,
54789
14
      NULL, HFILL }},
54790
54791
14
    {&hf_ieee80211_qbss2_gl,
54792
14
     {"G.711 CU Quantum", "wlan.qbss2.glimit",
54793
14
      FT_UINT8, BASE_DEC, NULL, 0,
54794
14
      NULL, HFILL }},
54795
54796
14
    {&hf_ieee80211_qbss2_cal,
54797
14
     {"Call Admission Limit", "wlan.qbss2.cal",
54798
14
      FT_UINT8, BASE_DEC, NULL, 0,
54799
14
      NULL, HFILL }},
54800
54801
14
    {&hf_ieee80211_qbss2_scount,
54802
14
     {"Station Count", "wlan.qbss2.scount",
54803
14
      FT_UINT16, BASE_DEC, NULL, 0,
54804
14
      NULL, HFILL }},
54805
54806
14
    {&hf_ieee80211_aironet_ie_qos_reserved,
54807
14
     {"Aironet IE QoS reserved", "wlan.aironet.qos.reserved",
54808
14
      FT_UINT8, BASE_HEX, NULL, 0,
54809
14
      NULL, HFILL }},
54810
54811
14
    {&hf_ieee80211_aironet_ie_qos_paramset,
54812
14
     {"Aironet IE QoS paramset", "wlan.aironet.qos.paramset",
54813
14
      FT_UINT8, BASE_DEC, NULL, 0,
54814
14
      NULL, HFILL }},
54815
54816
14
    {&hf_ieee80211_aironet_ie_qos_val,
54817
14
     {"Aironet IE QoS valueset", "wlan.aironet.qos.val",
54818
14
      FT_BYTES, BASE_NONE, NULL, 0,
54819
14
      NULL, HFILL }},
54820
54821
14
    {&hf_ieee80211_aironet_ie_clientmfp,
54822
14
     {"Aironet IE Client MFP", "wlan.aironet.clientmfp",
54823
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
54824
14
      NULL, HFILL }},
54825
54826
    /* Vendor Specific : SGDSN */
54827
14
    {&hf_ieee80211_vs_sgdsn_tag,
54828
14
     {"Tag", "wlan.vs.sgdsn.tag",
54829
14
      FT_NONE, BASE_NONE, NULL, 0,
54830
14
      NULL, HFILL }},
54831
54832
14
    {&hf_ieee80211_vs_sgdsn_type,
54833
14
     {"Type", "wlan.vs.sgdsn.type",
54834
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_sgdsn_type_vals), 0,
54835
14
      NULL, HFILL }},
54836
54837
14
    {&hf_ieee80211_vs_sgdsn_length,
54838
14
     {"Length", "wlan.vs.sgdsn.length",
54839
14
      FT_UINT8, BASE_DEC, NULL, 0,
54840
14
      NULL, HFILL }},
54841
54842
14
    {&hf_ieee80211_vs_sgdsn_version,
54843
14
     {"Version", "wlan.vs.sgdsn.tag.version",
54844
14
      FT_UINT8, BASE_DEC, NULL, 0,
54845
14
      NULL, HFILL }},
54846
54847
14
    {&hf_ieee80211_vs_sgdsn_icaomfrcode,
54848
14
     {"ICAO Manufacturer Code", "wlan.vs.sgdsn.tag.icaomfrcode",
54849
14
      FT_STRING, BASE_NONE, NULL, 0,
54850
14
      NULL, HFILL }},
54851
54852
14
    {&hf_ieee80211_vs_sgdsn_manufacturer,
54853
14
     {"Manufacturer", "wlan.vs.sgdsn.tag.manufacturer",
54854
14
      FT_STRING, BASE_NONE, NULL, 0,
54855
14
      NULL, HFILL }},
54856
54857
14
    {&hf_ieee80211_vs_sgdsn_model,
54858
14
     {"Model", "wlan.vs.sgdsn.tag.model",
54859
14
      FT_STRING, BASE_NONE, NULL, 0,
54860
14
      NULL, HFILL }},
54861
54862
14
    {&hf_ieee80211_vs_sgdsn_serialnumber,
54863
14
     {"Serial number", "wlan.vs.sgdsn.tag.serialnumber",
54864
14
      FT_STRING, BASE_NONE, NULL, 0,
54865
14
      NULL, HFILL }},
54866
54867
14
    {&hf_ieee80211_vs_sgdsn_serialnumber_len,
54868
14
     {"Serial number length", "wlan.vs.sgdsn.tag.serialnumber.len",
54869
14
      FT_UINT8, BASE_CUSTOM, CF_FUNC(vs_sgdsn_serialnumber_len_custom), 0,
54870
14
      NULL, HFILL }},
54871
54872
14
    {&hf_ieee80211_vs_sgdsn_gpscoord,
54873
14
     {"GPS Coord", "wlan.vs.sgdsn.tag.gpscoord",
54874
14
      FT_INT32, BASE_DEC, NULL, 0,
54875
14
      NULL, HFILL }},
54876
54877
14
    {&hf_ieee80211_vs_sgdsn_altitude,
54878
14
     {"Altitude", "wlan.vs.sgdsn.tag.altitude",
54879
14
      FT_INT16, BASE_DEC, NULL, 0,
54880
14
      NULL, HFILL }},
54881
54882
14
    {&hf_ieee80211_vs_sgdsn_speed,
54883
14
     {"Speed", "wlan.vs.sgdsn.tag.speed",
54884
14
      FT_UINT8, BASE_DEC, NULL, 0,
54885
14
      NULL, HFILL }},
54886
54887
14
    {&hf_ieee80211_vs_sgdsn_heading,
54888
14
     {"Heading", "wlan.vs.sgdsn.tag.heading",
54889
14
      FT_UINT16, BASE_DEC, NULL, 0,
54890
14
      NULL, HFILL }},
54891
54892
    /* Vendor Specific : Nintendo */
54893
14
    {&hf_ieee80211_vs_nintendo_type,
54894
14
     {"Type", "wlan.vs.nintendo.type",
54895
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_nintendo_type_vals), 0,
54896
14
      NULL, HFILL }},
54897
54898
14
    {&hf_ieee80211_vs_nintendo_length,
54899
14
     {"Length", "wlan.vs.nintendo.length",
54900
14
      FT_UINT8, BASE_DEC, NULL, 0,
54901
14
      NULL, HFILL }},
54902
54903
14
    {&hf_ieee80211_vs_nintendo_servicelist,
54904
14
     {"Servicelist", "wlan.vs.nintendo.servicelist",
54905
14
      FT_BYTES, BASE_NONE, NULL, 0,
54906
14
      NULL, HFILL }},
54907
54908
14
    {&hf_ieee80211_vs_nintendo_service,
54909
14
     {"Service", "wlan.vs.nintendo.service",
54910
14
      FT_BYTES, BASE_NONE, NULL, 0,
54911
14
      NULL, HFILL }},
54912
54913
14
    {&hf_ieee80211_vs_nintendo_consoleid,
54914
14
     {"Console ID", "wlan.vs.nintendo.consoleid",
54915
14
      FT_BYTES, BASE_NONE, NULL, 0,
54916
14
      NULL, HFILL }},
54917
54918
14
    {&hf_ieee80211_vs_nintendo_unknown,
54919
14
     {"Unknown", "wlan.vs.nintendo.unknown",
54920
14
      FT_BYTES, BASE_NONE, NULL, 0,
54921
14
      NULL, HFILL }},
54922
54923
    /* Vendor Specific : Aruba Networks */
54924
14
    {&hf_ieee80211_vs_aruba_subtype,
54925
14
     {"Subtype", "wlan.vs.aruba.subtype",
54926
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_aruba_subtype_vals), 0,
54927
14
      NULL, HFILL }},
54928
54929
14
    {&hf_ieee80211_vs_aruba_apname,
54930
14
     {"AP Name", "wlan.vs.aruba.ap_name",
54931
14
      FT_STRINGZ, BASE_NONE, NULL, 0,
54932
14
      NULL, HFILL }},
54933
54934
14
    {&hf_ieee80211_vs_aruba_data,
54935
14
     {"Data", "wlan.vs.aruba.data",
54936
14
      FT_BYTES, BASE_NONE, NULL, 0,
54937
14
      NULL, HFILL }},
54938
54939
14
    {&hf_ieee80211_vs_aruba_gps_length,
54940
14
      { "GPS Length", "wlan.ie.aruba.gps.length",
54941
14
        FT_UINT8, BASE_DEC, NULL, 0,
54942
14
        NULL, HFILL }},
54943
54944
14
    { &hf_ieee80211_vs_aruba_gps_subversion,
54945
14
      { "GPS Subversion", "wlan.ie.aruba.gps.subversion",
54946
14
        FT_UINT8, BASE_DEC, NULL, 0,
54947
14
        NULL, HFILL }},
54948
54949
14
    { &hf_ieee80211_vs_aruba_gps_hop,
54950
14
      { "GPS Hop", "wlan.ie.aruba.gps.hop",
54951
14
        FT_UINT8, BASE_DEC, NULL, 0,
54952
14
        NULL, HFILL }},
54953
54954
14
    { &hf_ieee80211_vs_aruba_gps_latitude,
54955
14
      { "GPS Latitude", "wlan.ie.aruba.gps.latitude",
54956
14
        FT_DOUBLE, BASE_DEC, NULL, 0,
54957
14
        NULL, HFILL }},
54958
54959
14
    { &hf_ieee80211_vs_aruba_gps_longitude,
54960
14
      { "GPS Longitude", "wlan.ie.aruba.gps.longitude",
54961
14
        FT_DOUBLE, BASE_DEC, NULL, 0,
54962
14
        NULL, HFILL }},
54963
54964
14
    { &hf_ieee80211_vs_aruba_gps_major_axis,
54965
14
      { "GPS Major Axis", "wlan.ie.aruba.gps.major_axis",
54966
14
        FT_DOUBLE, BASE_DEC, NULL, 0,
54967
14
        NULL, HFILL }},
54968
54969
14
    { &hf_ieee80211_vs_aruba_gps_minor_axis,
54970
14
      { "GPS Minor Axis", "wlan.ie.aruba.gps.minor_axis",
54971
14
        FT_DOUBLE, BASE_DEC, NULL, 0,
54972
14
        NULL, HFILL }},
54973
54974
14
    { &hf_ieee80211_vs_aruba_gps_orientation,
54975
14
      { "GPS Orientation", "wlan.ie.aruba.gps.orientation",
54976
14
        FT_DOUBLE, BASE_DEC, NULL, 0,
54977
14
        NULL, HFILL }},
54978
54979
14
    { &hf_ieee80211_vs_aruba_gps_distance,
54980
14
      { "GPS Distance", "wlan.ie.aruba.gps.distance",
54981
14
        FT_DOUBLE, BASE_DEC, NULL, 0,
54982
14
        NULL, HFILL }},
54983
54984
    /* Vendor Specific : Routerboard */
54985
14
    {&hf_ieee80211_vs_routerboard_unknown,
54986
14
     {"Unknown", "wlan.vs.routerboard.unknown",
54987
14
      FT_BYTES, BASE_NONE, NULL, 0,
54988
14
      NULL, HFILL }},
54989
54990
14
    {&hf_ieee80211_vs_routerboard_subitem,
54991
14
     {"Sub IE", "wlan.vs.routerboard.subitem",
54992
14
      FT_BYTES, BASE_NONE, NULL, 0,
54993
14
      NULL, HFILL }},
54994
54995
14
    {&hf_ieee80211_vs_routerboard_subtype,
54996
14
     {"Subtype", "wlan.vs.routerboard.subtype",
54997
14
      FT_UINT8, BASE_DEC, NULL, 0,
54998
14
      NULL, HFILL }},
54999
55000
14
    {&hf_ieee80211_vs_routerboard_sublength,
55001
14
     {"Sublength", "wlan.vs.routerboard.sublength",
55002
14
      FT_UINT8, BASE_DEC, NULL, 0,
55003
14
      NULL, HFILL }},
55004
55005
14
    {&hf_ieee80211_vs_routerboard_subdata,
55006
14
     {"Subdata", "wlan.vs.routerboard.subdata",
55007
14
      FT_BYTES, BASE_NONE, NULL, 0,
55008
14
      NULL, HFILL }},
55009
55010
14
    {&hf_ieee80211_vs_routerboard_subtype1_prefix,
55011
14
     {"Subtype 1 Prefix", "wlan.vs.routerboard.subtype1_prefix",
55012
14
      FT_BYTES, BASE_NONE, NULL, 0,
55013
14
      NULL, HFILL }},
55014
55015
14
    {&hf_ieee80211_vs_routerboard_subtype1_data,
55016
14
     {"Subtype 1 Data", "wlan.vs.routerboard.subtype1_data",
55017
14
      FT_STRING, BASE_NONE, NULL, 0,
55018
14
      NULL, HFILL }},
55019
55020
    /* Vendor Specific : Meru (Fortinet) */
55021
14
    {&hf_ieee80211_vs_meru_subitem,
55022
14
     {"Sub IE", "wlan.vs.meru.unknown",
55023
14
      FT_NONE, BASE_NONE, NULL, 0,
55024
14
      NULL, HFILL }},
55025
55026
14
    {&hf_ieee80211_vs_meru_subtype,
55027
14
     {"Subtype", "wlan.vs.meru.subtype",
55028
14
      FT_UINT8, BASE_DEC, NULL, 0,
55029
14
      NULL, HFILL }},
55030
55031
14
    {&hf_ieee80211_vs_meru_sublength,
55032
14
     {"Sublength", "wlan.vs.meru.sublength",
55033
14
      FT_UINT8, BASE_DEC, NULL, 0,
55034
14
      NULL, HFILL }},
55035
55036
14
    {&hf_ieee80211_vs_meru_subdata,
55037
14
     {"Subdata", "wlan.vs.meru.subdata",
55038
14
      FT_BYTES, BASE_NONE, NULL, 0,
55039
14
      NULL, HFILL }},
55040
55041
    /* Vendor Specific : Extreme (Zebra) */
55042
14
    {&hf_ieee80211_vs_extreme_subtype,
55043
14
     {"Subtype", "wlan.vs.extreme.subtype",
55044
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_extreme_subtype_vals), 0,
55045
14
      NULL, HFILL }},
55046
55047
14
    {&hf_ieee80211_vs_extreme_subdata,
55048
14
     {"Subdata", "wlan.vs.extreme.subdata",
55049
14
      FT_BYTES, BASE_NONE, NULL, 0,
55050
14
      NULL, HFILL }},
55051
55052
14
    {&hf_ieee80211_vs_extreme_unknown,
55053
14
     {"Unknown", "wlan.vs.extreme.unknown",
55054
14
      FT_BYTES, BASE_NONE, NULL, 0,
55055
14
      NULL, HFILL }},
55056
55057
14
    {&hf_ieee80211_vs_extreme_ap_length,
55058
14
     {"AP Length", "wlan.vs.extreme.ap_length",
55059
14
      FT_UINT8, BASE_DEC, NULL, 0,
55060
14
      NULL, HFILL }},
55061
55062
14
    {&hf_ieee80211_vs_extreme_ap_name,
55063
14
     {"AP Name", "wlan.vs.extreme.ap_name",
55064
14
      FT_STRING, BASE_NONE, NULL, 0,
55065
14
      NULL, HFILL }},
55066
55067
    /* Vendor Specific : Aerohive */
55068
14
    {&hf_ieee80211_vs_aerohive_version,
55069
14
     {"Version", "wlan.vs.aerohive.version",
55070
14
      FT_UINT8, BASE_DEC, NULL, 0,
55071
14
      NULL, HFILL }},
55072
55073
14
    {&hf_ieee80211_vs_aerohive_subtype,
55074
14
     {"Subtype", "wlan.vs.aerohive.subtype",
55075
14
      FT_UINT8, BASE_DEC, NULL, 0,
55076
14
      NULL, HFILL }},
55077
55078
14
    {&hf_ieee80211_vs_aerohive_hostname_length,
55079
14
     {"Host Name Length", "wlan.vs.aerohive.hostname_length",
55080
14
      FT_UINT8, BASE_DEC, NULL, 0,
55081
14
      NULL, HFILL }},
55082
55083
14
    {&hf_ieee80211_vs_aerohive_hostname,
55084
14
     {"Host Name", "wlan.vs.aerohive.hostname",
55085
14
      FT_STRING, BASE_NONE, NULL, 0,
55086
14
      NULL, HFILL }},
55087
55088
14
    {&hf_ieee80211_vs_aerohive_data,
55089
14
     {"Data", "wlan.vs.aerohive.data",
55090
14
      FT_BYTES, BASE_NONE, NULL, 0,
55091
14
      NULL, HFILL }},
55092
55093
    /* Vendor Specific : Mist */
55094
14
    {&hf_ieee80211_vs_mist_ap_name,
55095
14
     {"AP Name", "wlan.vs.mist.apname",
55096
14
       FT_STRING, BASE_NONE, NULL, 0,
55097
14
       NULL, HFILL }},
55098
55099
14
    {&hf_ieee80211_vs_mist_data,
55100
14
     {"Data", "wlan.vs.mist.data",
55101
14
       FT_BYTES, BASE_NONE, NULL, 0,
55102
14
       NULL, HFILL }},
55103
55104
    /* Vendor Specific: Cisco */
55105
14
      {&hf_ieee80211_vs_cisco_ap_name_v2,
55106
14
     {"AP Name", "wlan.vs.cisco.apname_v2",
55107
14
       FT_STRING, BASE_NONE, NULL, 0,
55108
14
       NULL, HFILL }},
55109
55110
    /* Vendor Specific : Ruckus */
55111
14
    {&hf_ieee80211_vs_ruckus_ap_name,
55112
14
     {"AP Name", "wlan.vs.ruckus.apname",
55113
14
       FT_STRING, BASE_NONE, NULL, 0,
55114
14
       NULL, HFILL }},
55115
55116
14
    {&hf_ieee80211_vs_ruckus_data,
55117
14
     {"Data", "wlan.vs.ruckus.data",
55118
14
       FT_BYTES, BASE_NONE, NULL, 0,
55119
14
       NULL, HFILL }},
55120
55121
     /* Vendor Specific : Alcatel-Lucent */
55122
14
     {&hf_ieee80211_vs_alcatel_ap_name,
55123
14
      {"AP Name", "wlan.vs.alcatel.apname",
55124
14
        FT_STRING, BASE_NONE, NULL, 0,
55125
14
        NULL, HFILL }},
55126
55127
14
     {&hf_ieee80211_vs_alcatel_data,
55128
14
      {"Data", "wlan.vs.alcatel.data",
55129
14
        FT_BYTES, BASE_NONE, NULL, 0,
55130
14
        NULL, HFILL }},
55131
55132
    /* Vendor Specific : Fortinet */
55133
14
    {&hf_ieee80211_vs_fortinet_subtype,
55134
14
     {"Subtype", "wlan.vs.fortinet.subtype",
55135
14
      FT_UINT16, BASE_DEC, VALS(ieee80211_vs_fortinet_subtype_vals), 0,
55136
14
      NULL, HFILL }},
55137
55138
14
    {&hf_ieee80211_vs_fortinet_system_type,
55139
14
     {"Type", "wlan.vs.fortinet.system.type",
55140
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_fortinet_system_type_vals), 0,
55141
14
      NULL, HFILL }},
55142
55143
14
    {&hf_ieee80211_vs_fortinet_system_length,
55144
14
     {"Length", "wlan.vs.fortinet.system.length",
55145
14
      FT_UINT8, BASE_DEC, NULL, 0,
55146
14
      NULL, HFILL }},
55147
55148
14
    {&hf_ieee80211_vs_fortinet_system_apname,
55149
14
     {"AP Name", "wlan.vs.fortinet.system.ap_name",
55150
14
      FT_STRINGZ, BASE_NONE, NULL, 0,
55151
14
      NULL, HFILL }},
55152
55153
14
    {&hf_ieee80211_vs_fortinet_system_apmodel,
55154
14
     {"AP Model", "wlan.vs.fortinet.system.ap_model",
55155
14
      FT_STRINGZ, BASE_NONE, NULL, 0,
55156
14
      NULL, HFILL }},
55157
55158
14
    {&hf_ieee80211_vs_fortinet_system_apserial,
55159
14
     {"AP Serial", "wlan.vs.fortinet.system.ap_serial",
55160
14
      FT_STRINGZ, BASE_NONE, NULL, 0,
55161
14
      NULL, HFILL }},
55162
55163
14
    {&hf_ieee80211_vs_fortinet_data,
55164
14
     {"Data", "wlan.vs.fortinet.data",
55165
14
      FT_BYTES, BASE_NONE, NULL, 0,
55166
14
      NULL, HFILL }},
55167
55168
    /* Vendor Specific : Arista Networks */
55169
14
    {&hf_ieee80211_vs_arista_subtype,
55170
14
     {"Subtype", "wlan.vs.arista.subtype",
55171
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_arista_subtype_vals), 0,
55172
14
      NULL, HFILL }},
55173
55174
14
    {&hf_ieee80211_vs_arista_apname,
55175
14
     {"AP Name", "wlan.vs.arista.ap_name",
55176
14
      FT_STRINGZ, BASE_NONE, NULL, 0,
55177
14
      NULL, HFILL }},
55178
55179
14
    {&hf_ieee80211_vs_arista_data,
55180
14
     {"Data", "wlan.vs.arista.data",
55181
14
      FT_BYTES, BASE_NONE, NULL, 0,
55182
14
      NULL, HFILL }},
55183
55184
    /* Vendor Specific : Wi-SUN */
55185
14
    {&hf_ieee80211_vs_wisun_type,
55186
14
     {"Data Type", "wlan.vs.wisun.type",
55187
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_wisun_type_vals), 0,
55188
14
      NULL, HFILL }},
55189
14
    {&hf_ieee80211_vs_wisun_ptkid,
55190
14
     {"PTK ID", "wlan.vs.wisun.ptkid",
55191
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
55192
14
    {&hf_ieee80211_vs_wisun_gtkl,
55193
14
     {"GTK Liveness", "wlan.vs.wisun.gtkl",
55194
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
55195
14
    {&hf_ieee80211_vs_wisun_gtkl_gtk0,
55196
14
     {"GTK[0]", "wlan.vs.wisun.gtkl.gtk0",
55197
14
      FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK0, NULL, HFILL }},
55198
14
    {&hf_ieee80211_vs_wisun_gtkl_gtk1,
55199
14
     {"GTK[1]", "wlan.vs.wisun.gtkl.gtk1",
55200
14
      FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK1, NULL, HFILL }},
55201
14
    {&hf_ieee80211_vs_wisun_gtkl_gtk2,
55202
14
     {"GTK[2]", "wlan.vs.wisun.gtkl.gtk2",
55203
14
      FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK2, NULL, HFILL }},
55204
14
    {&hf_ieee80211_vs_wisun_gtkl_gtk3,
55205
14
     {"GTK[3]", "wlan.vs.wisun.gtkl.gtk3",
55206
14
      FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK3, NULL, HFILL }},
55207
14
    {&hf_ieee80211_vs_wisun_nr,
55208
14
     {"Node Role", "wlan.vs.wisun.nr",
55209
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_vs_wisun_nr_vals), 0,
55210
14
      NULL, HFILL }},
55211
14
    {&hf_ieee80211_vs_wisun_lgtkl,
55212
14
     {"LGTK Liveness", "wlan.vs.wisun.lgtkl",
55213
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
55214
14
    {&hf_ieee80211_vs_wisun_lgtkl_lgtk0,
55215
14
     {"LGTK[0]", "wlan.vs.wisun.lgtkl.lgtk0",
55216
14
      FT_UINT8, BASE_HEX, NULL, WISUN_LGTKL_LGTK0, NULL, HFILL }},
55217
14
    {&hf_ieee80211_vs_wisun_lgtkl_lgtk1,
55218
14
     {"LGTK[1]", "wlan.vs.wisun.lgtkl.lgtk1",
55219
14
      FT_UINT8, BASE_HEX, NULL, WISUN_LGTKL_LGTK1, NULL, HFILL }},
55220
14
    {&hf_ieee80211_vs_wisun_lgtkl_lgtk2,
55221
14
     {"LGTK[2]", "wlan.vs.wisun.lgtkl.lgtk2",
55222
14
      FT_UINT8, BASE_HEX, NULL, WISUN_LGTKL_LGTK2, NULL, HFILL }},
55223
14
    {&hf_ieee80211_vs_wisun_lgtk_key_id,
55224
14
     {"Key ID", "wlan.vs.wisun.lgtk.key_id",
55225
14
      FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL }},
55226
14
    {&hf_ieee80211_vs_wisun_lgtk_lgtk,
55227
14
     {"LGTK", "wlan.vs.wisun.lgtk.lgtk",
55228
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
55229
14
    {&hf_ieee80211_vs_wisun_data,
55230
14
     {"Data", "wlan.vs.wisun.data",
55231
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
55232
55233
    /* Vendor Specific : apple */
55234
14
    {&hf_ieee80211_vs_apple_type,
55235
14
     {"Type", "wlan.vs.apple.type",
55236
14
      FT_UINT8, BASE_DEC, NULL, 0,
55237
14
      NULL, HFILL }},
55238
55239
14
    {&hf_ieee80211_vs_apple_subtype,
55240
14
     {"Subtype", "wlan.vs.apple.subtype",
55241
14
      FT_UINT16, BASE_DEC, VALS(ieee80211_vs_apple_subtype_vals), 0,
55242
14
      NULL, HFILL }},
55243
55244
14
    {&hf_ieee80211_vs_apple_length,
55245
14
     {"Length", "wlan.vs.apple.length",
55246
14
      FT_UINT8, BASE_DEC, NULL, 0,
55247
14
      NULL, HFILL }},
55248
55249
14
    {&hf_ieee80211_vs_apple_data,
55250
14
     {"Data", "wlan.vs.apple.data",
55251
14
      FT_BYTES, BASE_NONE, NULL, 0,
55252
14
      NULL, HFILL }},
55253
55254
14
    {&hf_ieee80211_tsinfo,
55255
14
     {"Traffic Stream (TS) Info", "wlan.ts_info",
55256
14
      FT_UINT24, BASE_HEX, NULL, 0,
55257
14
      "Traffic Stream (TS) Info field", HFILL }},
55258
55259
14
    {&hf_ieee80211_tsinfo_type,
55260
14
     {"Traffic Type", "wlan.ts_info.type",
55261
14
      FT_UINT24, BASE_DEC, VALS(tsinfo_type), 0x000001,
55262
14
      "Traffic Stream (TS) Info Traffic Type", HFILL }},
55263
55264
14
    {&hf_ieee80211_tsinfo_tsid,
55265
14
     {"Traffic Stream ID (TSID)", "wlan.ts_info.tsid",
55266
14
      FT_UINT24, BASE_DEC, NULL, 0x00001E,
55267
14
      "Traffic Stream ID (TSID) Info TSID", HFILL }},
55268
55269
14
    {&hf_ieee80211_tsinfo_dir,
55270
14
     {"Direction", "wlan.ts_info.dir",
55271
14
      FT_UINT24, BASE_DEC, VALS(tsinfo_direction), 0x000060,
55272
14
      "Traffic Stream (TS) Info Direction", HFILL }},
55273
55274
14
    {&hf_ieee80211_tsinfo_access,
55275
14
     {"Access Policy", "wlan.ts_info.access",
55276
14
      FT_UINT24, BASE_DEC, VALS(tsinfo_access), 0x000180,
55277
14
      "Traffic Stream (TS) Info Access Policy", HFILL }},
55278
55279
14
    {&hf_ieee80211_tsinfo_agg,
55280
14
     {"Aggregation", "wlan.ts_info.agg",
55281
14
      FT_UINT24, BASE_DEC, NULL, 0x000200,
55282
14
      "Traffic Stream (TS) Info Access Policy", HFILL }},
55283
55284
14
    {&hf_ieee80211_tsinfo_apsd,
55285
14
     {"Automatic Power-Save Delivery (APSD)", "wlan.ts_info.apsd",
55286
14
      FT_UINT24, BASE_DEC, NULL, 0x000400,
55287
14
      "Traffic Stream (TS) Info Automatic Power-Save Delivery (APSD)", HFILL }},
55288
55289
14
    {&hf_ieee80211_tsinfo_up,
55290
14
     {"User Priority", "wlan.ts_info.up",
55291
14
      FT_UINT24, BASE_DEC, VALS(qos_up), 0x003800,
55292
14
      "Traffic Stream (TS) Info User Priority", HFILL }},
55293
55294
14
    {&hf_ieee80211_tsinfo_ack,
55295
14
     {"Ack Policy", "wlan.ts_info.ack",
55296
14
      FT_UINT24, BASE_DEC, VALS(ack_policy), 0x00C000,
55297
14
      "Traffic Stream (TS) Info Ack Policy", HFILL }},
55298
55299
14
    {&hf_ieee80211_tsinfo_sched,
55300
14
     {"Schedule", "wlan.ts_info.sched",
55301
14
      FT_UINT24, BASE_DEC, NULL, 0x010000,
55302
14
      "Traffic Stream (TS) Info Schedule", HFILL }},
55303
55304
14
    {&hf_ieee80211_tsinfo_rsv,
55305
14
     {"Reserved", "wlan.ts_info.rsv",
55306
14
      FT_UINT24, BASE_HEX, NULL, 0xFE0000,
55307
14
      "Must be Zero", HFILL }},
55308
55309
14
    {&hf_ieee80211_tspec_nor_msdu,
55310
14
     {"Normal MSDU Size", "wlan.tspec.nor_msdu",
55311
14
      FT_UINT16, BASE_DEC, NULL, 0,
55312
14
      NULL, HFILL }},
55313
55314
14
    {&hf_ieee80211_tspec_max_msdu,
55315
14
     {"Maximum MSDU Size", "wlan.tspec.max_msdu",
55316
14
      FT_UINT16, BASE_DEC, NULL, 0,
55317
14
      NULL, HFILL }},
55318
55319
14
    {&hf_ieee80211_tspec_min_srv,
55320
14
     {"Minimum Service Interval", "wlan.tspec.min_srv",
55321
14
      FT_UINT32, BASE_DEC, NULL, 0,
55322
14
      NULL, HFILL }},
55323
55324
14
    {&hf_ieee80211_tspec_max_srv,
55325
14
     {"Maximum Service Interval", "wlan.tspec.max_srv",
55326
14
      FT_UINT32, BASE_DEC, NULL, 0,
55327
14
      NULL, HFILL }},
55328
55329
14
    {&hf_ieee80211_tspec_inact_int,
55330
14
     {"Inactivity Interval", "wlan.tspec.inact_int",
55331
14
      FT_UINT32, BASE_DEC, NULL, 0,
55332
14
      NULL, HFILL }},
55333
55334
14
    {&hf_ieee80211_tspec_susp_int,
55335
14
     {"Suspension Interval", "wlan.tspec.susp_int",
55336
14
      FT_UINT32, BASE_DEC, NULL, 0,
55337
14
      NULL, HFILL }},
55338
55339
14
    {&hf_ieee80211_tspec_srv_start,
55340
14
     {"Service Start Time", "wlan.tspec.srv_start",
55341
14
      FT_UINT32, BASE_DEC, NULL, 0,
55342
14
      NULL, HFILL }},
55343
55344
14
    {&hf_ieee80211_tspec_min_data,
55345
14
     {"Minimum Data Rate", "wlan.tspec.min_data",
55346
14
      FT_UINT32, BASE_DEC, NULL, 0,
55347
14
      NULL, HFILL }},
55348
55349
14
    {&hf_ieee80211_tspec_mean_data,
55350
14
     {"Mean Data Rate", "wlan.tspec.mean_data",
55351
14
      FT_UINT32, BASE_DEC, NULL, 0,
55352
14
      NULL, HFILL }},
55353
55354
14
    {&hf_ieee80211_tspec_peak_data,
55355
14
     {"Peak Data Rate", "wlan.tspec.peak_data",
55356
14
      FT_UINT32, BASE_DEC, NULL, 0,
55357
14
      NULL, HFILL }},
55358
55359
14
    {&hf_ieee80211_tspec_burst_size,
55360
14
     {"Burst Size", "wlan.tspec.burst_size",
55361
14
      FT_UINT32, BASE_DEC, NULL, 0,
55362
14
      NULL, HFILL }},
55363
55364
14
    {&hf_ieee80211_tspec_delay_bound,
55365
14
     {"Delay Bound", "wlan.tspec.delay_bound",
55366
14
      FT_UINT32, BASE_DEC, NULL, 0,
55367
14
      NULL, HFILL }},
55368
55369
14
    {&hf_ieee80211_tspec_min_phy,
55370
14
     {"Minimum PHY Rate", "wlan.tspec.min_phy",
55371
14
      FT_UINT32, BASE_DEC, NULL, 0,
55372
14
      NULL, HFILL }},
55373
55374
14
    {&hf_ieee80211_tspec_surplus,
55375
14
     {"Surplus Bandwidth Allowance", "wlan.tspec.surplus",
55376
14
      FT_UINT16, BASE_DEC, NULL, 0,
55377
14
      NULL, HFILL }},
55378
55379
14
    {&hf_ieee80211_tspec_medium,
55380
14
     {"Medium Time", "wlan.tspec.medium",
55381
14
      FT_UINT16, BASE_DEC, NULL, 0,
55382
14
      NULL, HFILL }},
55383
55384
14
    {&hf_ieee80211_tspec_dmg,
55385
14
     {"DMG attributes", "wlan.tspec.dmg",
55386
14
      FT_UINT16, BASE_DEC, NULL, 0,
55387
14
      NULL, HFILL }},
55388
55389
14
    {&hf_ieee80211_ts_delay,
55390
14
     {"Traffic Stream (TS) Delay", "wlan.ts_delay",
55391
14
      FT_UINT32, BASE_DEC, NULL, 0,
55392
14
      NULL, HFILL }},
55393
55394
14
    {&hf_ieee80211_tclas_process,
55395
14
     {"Processing", "wlan.tclas_proc.processing",
55396
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_tclas_process_flag), 0,
55397
14
      NULL, HFILL }},
55398
55399
14
    {&hf_ieee80211_tag_ext_supp_rates,
55400
14
     {"Extended Supported Rates", "wlan.extended_supported_rates",
55401
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_supported_rates_vals_ext, 0x0,
55402
14
      "In Mbit/sec, (B) for Basic Rates", HFILL }},
55403
55404
14
    {&hf_ieee80211_sched_info,
55405
14
     {"Schedule Info", "wlan.sched.sched_info",
55406
14
      FT_UINT16, BASE_HEX, NULL, 0,
55407
14
      "Schedule Info field", HFILL }},
55408
55409
14
    {&hf_ieee80211_sched_info_agg,
55410
14
     {"Schedule Aggregation", "wlan.sched_info.agg",
55411
14
      FT_UINT16, BASE_DEC, NULL, 0x0001,
55412
14
      "Traffic Stream (TS) Info Access Policy", HFILL }},
55413
55414
14
    {&hf_ieee80211_sched_info_tsid,
55415
14
     {"Schedule Traffic Stream ID (TSID)", "wlan.sched_info.tsid",
55416
14
      FT_UINT16, BASE_DEC, NULL, 0x001E,
55417
14
      "Traffic Stream ID (TSID) Info TSID", HFILL }},
55418
55419
14
    {&hf_ieee80211_sched_info_dir,
55420
14
     {"Schedule Direction", "wlan.sched_info.dir",
55421
14
      FT_UINT16, BASE_DEC, VALS(tsinfo_direction), 0x0060,
55422
14
      "Traffic Stream (TS) Info Direction", HFILL }},
55423
55424
14
    {&hf_ieee80211_sched_srv_start,
55425
14
     {"Service Start Time", "wlan.sched.srv_start",
55426
14
      FT_UINT32, BASE_HEX, NULL, 0,
55427
14
      NULL, HFILL }},
55428
55429
14
    {&hf_ieee80211_sched_srv_int,
55430
14
     {"Service Interval", "wlan.sched.srv_int",
55431
14
      FT_UINT32, BASE_HEX, NULL, 0,
55432
14
      NULL, HFILL }},
55433
55434
14
    {&hf_ieee80211_sched_spec_int,
55435
14
     {"Specification Interval", "wlan.sched.spec_int",
55436
14
      FT_UINT16, BASE_HEX, NULL, 0,
55437
14
      NULL, HFILL }},
55438
55439
14
    {&hf_ieee80211_aruba,
55440
14
     {"Aruba Type", "wlan.aruba.type",
55441
14
      FT_UINT16, BASE_DEC|BASE_EXT_STRING, &aruba_mgt_typevals_ext, 0,
55442
14
      "Aruba Management", HFILL }},
55443
55444
14
    {&hf_ieee80211_aruba_hb_seq,
55445
14
     {"Aruba Heartbeat Sequence", "wlan.aruba.heartbeat_sequence",
55446
14
      FT_UINT64, BASE_DEC, NULL, 0,
55447
14
      NULL, HFILL }},
55448
55449
14
    {&hf_ieee80211_aruba_mtu,
55450
14
     {"Aruba MTU Size", "wlan.aruba.mtu_size",
55451
14
      FT_UINT16, BASE_DEC, NULL, 0,
55452
14
      NULL, HFILL }},
55453
55454
    /* Start: HT Control (+HTC) */
55455
14
    {&hf_ieee80211_htc,
55456
14
     {"HT Control (+HTC)", "wlan.htc",
55457
14
      FT_UINT32, BASE_HEX, NULL, 0,
55458
14
      "High Throughput Control (+HTC)", HFILL }},
55459
55460
14
    {&hf_ieee80211_htc_vht,
55461
14
     {"VHT", "wlan.htc.vht",
55462
14
      FT_BOOLEAN, 32, NULL, HTC_VHT,
55463
14
      "High Throughput Control HT/VHT flag", HFILL }},
55464
55465
14
    {&hf_ieee80211_htc_he,
55466
14
     {"HE", "wlan.htc.he",
55467
14
      FT_BOOLEAN, 32, NULL, HTC_HE,
55468
14
      "High Efficiency Control HE flag", HFILL }},
55469
55470
14
    {&hf_ieee80211_htc_he_ctrl_id,
55471
14
     {"Control ID", "wlan.htc.he.a_control.ctrl_id",
55472
14
      FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
55473
55474
14
    {&hf_ieee80211_he_a_control_padding,
55475
14
     {"Padding", "wlan.htc.he.a_control.padding",
55476
14
      FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
55477
55478
14
    {&hf_ieee80211_he_trs_he_tb_ppdu_len,
55479
14
     {"HE TB PPDU Length", "wlan.htc.he.a_control.umrs.he_tb_ppdu_len",
55480
14
      FT_UINT32, BASE_DEC, NULL, 0x0000001f, NULL, HFILL }},
55481
55482
14
    {&hf_ieee80211_he_trs_ru_allocation,
55483
14
     {"RU Allocation", "wlan.htc.he.a_control.umrs.ru_allocation",
55484
14
      FT_UINT32, BASE_DEC, NULL, 0x00001fe0, NULL, HFILL }},
55485
55486
14
    {&hf_ieee80211_he_dl_tx_power,
55487
14
     {"DL Tx Power", "wlan.htc.he.a_control.umrs.dl_tx_power",
55488
14
      FT_UINT32, BASE_HEX, NULL, 0x0003e000, NULL, HFILL }},
55489
55490
14
    {&hf_ieee80211_he_ul_target_rssi,
55491
14
     {"UL Target RSSI", "wlan.htc.he.a_control.umrs.ul_target_rssi",
55492
14
      FT_UINT32, BASE_CUSTOM, CF_FUNC(ul_target_rssi_base_custom),
55493
14
      0x007c0000, NULL, HFILL }},
55494
55495
14
    {&hf_ieee80211_he_ul_mcs,
55496
14
     {"UL MCS", "wlan.htc.he.a_control.umrs.ul_mcs",
55497
14
      FT_UINT32, BASE_HEX, NULL, 0x01800000, NULL, HFILL }},
55498
55499
14
    {&hf_ieee80211_he_ul_reserved,
55500
14
     {"reserved", "wlan.htc.he.a_control.umrs.reserved",
55501
14
      FT_UINT32, BASE_HEX, NULL, 0x02000000, NULL, HFILL }},
55502
55503
14
    {&hf_ieee80211_he_om_rx_nss,
55504
14
     {"Rx NSS", "wlan.htc.he.a_control.om.rx_nss",
55505
14
      FT_UINT32, BASE_DEC, NULL, 0x00000007, NULL, HFILL }},
55506
55507
14
    {&hf_ieee80211_he_om_channel_width,
55508
14
     {"Channel Width", "wlan.htc.he.a_control.om.channel_width",
55509
14
      FT_UINT32, BASE_DEC, NULL, 0x00000018, NULL, HFILL }},
55510
55511
14
    {&hf_ieee80211_he_om_ul_mu_disable,
55512
14
     {"UL MU Disable", "wlan.htc.he.a_control.om.ul_mu_disable",
55513
14
      FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL }},
55514
55515
14
    {&hf_ieee80211_he_om_tx_nsts,
55516
14
     {"Tx NSTS", "wlan.htc.he.a_control.om.tx_nsts",
55517
14
      FT_UINT32, BASE_DEC, NULL, 0x000001c0, NULL, HFILL }},
55518
55519
14
    {&hf_ieee80211_he_om_er_su_disable,
55520
14
     {"ER SU Disable", "wlan.htc.he.a_control.om.er_su_disable",
55521
14
      FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL }},
55522
55523
14
    {&hf_ieee80211_he_om_dl_mu_mimo_resound,
55524
14
     {"DL MU-MIMO Resound Recommendation",
55525
14
      "wlan.htc.he.a_control.om.dl_mu_mimo_resound_recommendation",
55526
14
      FT_BOOLEAN, 32, NULL, 0x00000400, NULL, HFILL }},
55527
55528
14
    {&hf_ieee80211_he_om_ul_mu_data_disable,
55529
14
     {"UL MU Data Disable", "wlan.htc.he.a_control.om.ul_mu_data_disable",
55530
14
      FT_BOOLEAN, 32, NULL, 0x00000800, NULL, HFILL }},
55531
55532
14
    {&hf_ieee80211_he_hla_unsolicited_mfb,
55533
14
     {"Unsolicited MFB", "wlan.htc.he.a_control.hla.unsolicited_mfb",
55534
14
      FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }},
55535
55536
14
    {&hf_ieee80211_he_hla_mrq,
55537
14
     {"MRQ", "wlan.htc.he.a_control.hla.mrq",
55538
14
      FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }},
55539
55540
14
    {&hf_ieee80211_he_hla_nss,
55541
14
     {"NSS", "wlan.htc.he.a_control.hla.NSS",
55542
14
      FT_UINT32, BASE_DEC, NULL, 0x0000001c, NULL, HFILL }},
55543
55544
14
    {&hf_ieee80211_he_hla_he_mcs,
55545
14
     {"HE-MCS", "wlan.htc.he.a_control.hla.he_mcs",
55546
14
      FT_UINT32, BASE_DEC, NULL, 0x000001e0, NULL, HFILL }},
55547
55548
14
    {&hf_ieee80211_he_hla_dcm,
55549
14
     {"DCM", "wlan.htc.he.a_control.hla.dcm",
55550
14
      FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL }},
55551
55552
14
    {&hf_ieee80211_he_hla_ru,
55553
14
     {"RU", "wlan.htc.he.a_control.hla.ru",
55554
14
      FT_UINT32, BASE_DEC, NULL, 0x0003fc00, NULL, HFILL }},
55555
55556
14
    {&hf_ieee80211_he_hla_bw,
55557
14
     {"BW", "wlan.htc.he.a_control.hla.bw",
55558
14
      FT_UINT32, BASE_DEC, NULL, 0x000c0000, NULL, HFILL }},
55559
55560
14
    {&hf_ieee80211_he_hla_msi_ppdu_type,
55561
14
     {"MSI/PPDU Type", "wlan.htc.he.a_control.hla.msi_ppdu_type",
55562
14
      FT_UINT32, BASE_DEC, NULL, 0x00700000, NULL, HFILL }},
55563
55564
14
    {&hf_ieee80211_he_hla_tx_bf,
55565
14
     {"Tx BF", "wlan.htc.he.a_control.hla.tx_bf",
55566
14
      FT_BOOLEAN, 32, TFS(&he_hla_tx_bf_tfs), 0x00800000, NULL, HFILL }},
55567
55568
14
    {&hf_ieee80211_he_hla_reserved,
55569
14
     {"Reserved", "wlan.htc.he.a_control.hla.reserved",
55570
14
      FT_UINT32, BASE_HEX, NULL, 0x03000000, NULL, HFILL }},
55571
55572
14
    {&hf_ieee80211_he_bsr_aci_bitmap,
55573
14
     {"ACI Bitmap", "wlan.htc.he.a_control.bsr.aci_bitmap",
55574
14
      FT_UINT32, BASE_HEX, NULL, 0x0000000f, NULL, HFILL }},
55575
55576
14
    {&hf_ieee80211_he_bsr_delta_tid,
55577
14
     {"Delta TID", "wlan.htc.he.a_control.bsr.delta_tid",
55578
14
      FT_UINT32, BASE_HEX, NULL, 0x00000030, NULL, HFILL }},
55579
55580
14
    {&hf_ieee80211_he_bsr_aci_high,
55581
14
     {"ACI High", "wlan.htc.he.a_control.bsr.aci_high",
55582
14
      FT_UINT32, BASE_HEX, NULL, 0x000000c0, NULL, HFILL }},
55583
55584
14
    {&hf_ieee80211_he_bsr_scaling_factor,
55585
14
     {"Scaling Factor", "wlan.htc.he.a_control.bsr.scaling_factor",
55586
14
      FT_UINT32, BASE_HEX, NULL, 0x00000300, NULL, HFILL }},
55587
55588
14
    {&hf_ieee80211_he_bsr_queue_size_high,
55589
14
     {"Queue Size High", "wlan.htc.he.a_control.bsr.queue_size_high",
55590
14
      FT_UINT32, BASE_HEX, NULL, 0x0003fc00, NULL, HFILL }},
55591
55592
14
    {&hf_ieee80211_he_bsr_queue_size_all,
55593
14
     {"Queue Size All", "wlan.htc.he.a_control.bsr.queue_size_all",
55594
14
      FT_UINT32, BASE_HEX, NULL, 0x03fc0000, NULL, HFILL }},
55595
55596
14
    {&hf_ieee80211_he_uph_ul_power_headroom,
55597
14
     {"UL Power Headroom", "wlan.htc.he.a_control.uph.ul_power_headroom",
55598
14
      FT_UINT32, BASE_DEC, NULL, 0x0000001f, NULL, HFILL }},
55599
55600
14
    {&hf_ieee80211_he_uph_ul_min_transmit_power_flag,
55601
14
     {"Minimum Transmit Power Flag", "wlan.htc.he.a_control.uph.min_transmit_power_flag",
55602
14
      FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL }},
55603
55604
14
    {&hf_ieee80211_he_uph_reserved,
55605
14
     {"Reserved", "wlan.htc.he.a_control.uph.reserved",
55606
14
      FT_UINT32, BASE_HEX, NULL, 0x000000c0, NULL, HFILL }},
55607
55608
14
    {&hf_ieee80211_he_btc_avail_chan,
55609
14
     {"Available Channel Bitmap", "wlan.htc.he.a_control.bqr.avail_chan_bitmap",
55610
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
55611
55612
14
    {&hf_ieee80211_he_btc_reserved,
55613
14
     {"Reserved", "wlan.htc.he.a_control.bqr.reserved",
55614
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
55615
55616
14
    {&hf_ieee80211_he_cci_ac_constraint,
55617
14
     {"AC Constraint", "wlan.htc.he.a_control.cci.ac_constraint",
55618
14
      FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }},
55619
55620
14
    {&hf_ieee80211_he_cci_rdg_more_ppdu,
55621
14
     {"RDG/More PPDU", "wlan.htc.he.a_control.cci.rdg_more_ppdu",
55622
14
      FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }},
55623
55624
14
    {&hf_ieee80211_he_cci_sr_ppdu_indic,
55625
14
     {"PSRT PPDU", "wlan.htc.he.a_control.cci.sr_ppdu_indic",
55626
14
      FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }},
55627
55628
14
    {&hf_ieee80211_he_cci_reserved,
55629
14
     {"Reserved", "wlan.htc.he.a_control.cci.reserved",
55630
14
      FT_UINT32, BASE_HEX, NULL, 0x000000F8, NULL, HFILL }},
55631
55632
14
    {&hf_ieee80211_he_eht_om_rx_nss_ext,
55633
14
     {"Rx NSS Extension", "wlan.htc.he.a_control.eht_om.rx_nss_ext",
55634
14
      FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }},
55635
55636
14
    {&hf_ieee80211_he_eht_om_chan_w_ext,
55637
14
     {"Channel Width Extension", "wlan.htc.he.a_control.eht_om.chan_w_ext",
55638
14
      FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }},
55639
55640
14
    {&hf_ieee80211_he_eht_om_tx_nsts_ext,
55641
14
     {"Tx NSTS Extension", "wlan.htc.he.a_control.eht_om.tx_nsts_ext",
55642
14
      FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }},
55643
55644
14
    {&hf_ieee80211_he_eht_om_reserved,
55645
14
     {"Reserved", "wlan.htc.he.a_control.eht_om.reserved",
55646
14
      FT_UINT32, BASE_HEX, NULL, 0x00000038, NULL, HFILL }},
55647
55648
14
    {&hf_ieee80211_he_srs_ppdu_resp_dur,
55649
14
     {"PPDU Response Duration", "wlan.htc.he.a_control.srs.ppdu_resp_dur",
55650
14
      FT_UINT32, BASE_DEC, NULL, 0x000000FF, NULL, HFILL }},
55651
55652
14
    {&hf_ieee80211_he_srs_reserved,
55653
14
     {"Reserved", "wlan.htc.he.a_control.srs.reserved",
55654
14
      FT_UINT32, BASE_HEX, NULL, 0x00000300, NULL, HFILL }},
55655
55656
14
    {&hf_ieee80211_he_aar_assisted_ap_bitmap,
55657
14
     {"Assisted AP Link ID Bitmap",
55658
14
      "wlan.htc.he.a_control.aar.assisted_ap_link_id_bitmap",
55659
14
      FT_UINT32, BASE_HEX, NULL, 0x0000FFFF, NULL, HFILL }},
55660
55661
14
    {&hf_ieee80211_he_aar_reserved,
55662
14
     {"Reserved", "wlan.htc.he.a_control.aar.reserved",
55663
14
      FT_UINT32, BASE_HEX, NULL, 0x000F0000, NULL, HFILL }},
55664
55665
14
    {&hf_ieee80211_he_a_control_ones,
55666
14
     {"Padding", "wlan.htc.he.a_control.ones",
55667
14
      FT_UINT32, BASE_HEX, NULL, 0x03ffffff, NULL, HFILL }},
55668
55669
14
    {&hf_ieee80211_he_trigger_common_info,
55670
14
     {"HE Trigger Common Info", "wlan.trigger.he.common_info",
55671
14
      FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL }},
55672
55673
14
    {&hf_ieee80211_he_trigger_type,
55674
14
     {"Trigger Type", "wlan.trigger.he.trigger_type",
55675
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(trigger_type_vals),
55676
14
        0x000000000000000F, NULL, HFILL }},
55677
55678
14
    {&hf_ieee80211_he_trigger_ul_length,
55679
14
     {"UL Length", "wlan.trigger.he.ul_length",
55680
14
      FT_UINT64, BASE_DEC, NULL, 0x000000000000FFF0, NULL, HFILL }},
55681
55682
14
    {&hf_ieee80211_he_trigger_more_tf,
55683
14
     {"More TF", "wlan.trigger.he.more_tf",
55684
14
      FT_BOOLEAN, 64, NULL, 0x0000000000010000, NULL, HFILL }},
55685
55686
14
    {&hf_ieee80211_he_trigger_cs_required,
55687
14
     {"CS Required", "wlan.trigger.he.cs_required",
55688
14
      FT_BOOLEAN, 64, NULL, 0x0000000000020000, NULL, HFILL }},
55689
55690
14
    {&hf_ieee80211_he_trigger_ul_bw,
55691
14
     {"UL BW", "wlan.trigger.he.ul_bw",
55692
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(bw_subfield_vals), 0x00000000000C0000, NULL, HFILL }},
55693
55694
14
    {&hf_ieee80211_he_trigger_gi_and_ltf_type,
55695
14
     {"GI And LTF Type", "wlan.trigger.he.gi_and_ltf_type",
55696
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(gi_and_ltf_type_subfield_vals), 0x0000000000300000,
55697
14
        NULL, HFILL }},
55698
55699
14
    {&hf_ieee80211_he_trigger_mu_mimo_ltf_mode,
55700
14
     {"MU-MIMO LTF Mode", "wlan.trigger.he.mu_mimo_ltf_mode",
55701
14
      FT_BOOLEAN, 64, TFS(&mu_mimo_ltf_mode_tfs), 0x0000000000400000, NULL, HFILL }},
55702
55703
14
    {&hf_ieee80211_he_trigger_num_he_ltf_syms_etc,
55704
14
     {"Number of HE-LTF Symbols and Midamble Periodicity",
55705
14
        "wlan.trigger.he.num_he_ltf_syms_and_midamble_per",
55706
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000003800000, NULL, HFILL }},
55707
55708
14
    {&hf_ieee80211_he_trigger_ul_stbc,
55709
14
     {"UL STBC", "wlan.trigger.he.ul_stbc",
55710
14
      FT_BOOLEAN, 64, NULL, 0x0000000004000000, NULL, HFILL }},
55711
55712
14
    {&hf_ieee80211_he_trigger_ldpc_extra_sym_seg,
55713
14
     {"LDPC Extra Symbol Segment", "wlan.trigger.he.ldpc_extra_symbol_segment",
55714
14
      FT_BOOLEAN, 64, NULL, 0x0000000008000000, NULL, HFILL }},
55715
55716
14
    {&hf_ieee80211_he_trigger_ap_tx_power,
55717
14
     {"AP Tx Power", "wlan.trigger.he.ap_tx_power",
55718
14
      FT_UINT64, BASE_CUSTOM, CF_FUNC(ap_tx_power_custom),
55719
14
      0x00000003F0000000, NULL, HFILL }},
55720
55721
14
    {&hf_ieee80211_he_trigger_pre_fec_padding_factor,
55722
14
     {"Pre-FEC Padding Factor",
55723
14
      "wlan.trigger.he.ul_packet_extension.pre_fec_padding_factor",
55724
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING,
55725
14
      VALS64(pre_fec_padding_factor_vals),
55726
14
      0x0000000C00000000, NULL, HFILL }},
55727
55728
14
    {&hf_ieee80211_he_trigger_pe_disambiguity,
55729
14
     {"PE Disambiguity",
55730
14
      "wlan.trigger.he.ul_packet_extension.pe_disambiguity",
55731
14
      FT_BOOLEAN, 64, TFS(&pe_disambiguity_tfs),
55732
14
      0x0000001000000000, NULL, HFILL }},
55733
55734
14
    {&hf_ieee80211_he_trigger_ul_spatial_reuse,
55735
14
     {"UL Spatial Reuse", "wlan.trigger.he.ul_spatial_reuse",
55736
14
      FT_UINT64, BASE_HEX, NULL, 0x001FFFE000000000, NULL, HFILL }},
55737
55738
14
    {&hf_ieee80211_he_trigger_ul_he_sig_a_reserved,
55739
14
     {"UL HE-SIG-A2 Reserved", "wlan.trigger.he.ul_he_sig_a2_reserved",
55740
14
      FT_UINT64, BASE_HEX, NULL, 0x7FC0000000000000, NULL, HFILL }},
55741
55742
14
    {&hf_ieee80211_he_trigger_doppler,
55743
14
     {"Doppler", "wlan.trigger.he.doppler",
55744
14
      FT_BOOLEAN, 64, NULL, 0x0020000000000000, NULL, HFILL }},
55745
55746
14
    {&hf_ieee80211_he_trigger_reserved,
55747
14
     {"Reserved", "wlan.trigger.he.reserved",
55748
14
      FT_UINT64, BASE_HEX, NULL, 0x8000000000000000, NULL, HFILL }},
55749
55750
14
    {&hf_ieee80211_he_trigger_bar_ctrl,
55751
14
     {"BAR Control", "wlan.trigger.he.common_info.bar_ctrl",
55752
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
55753
55754
14
    {&hf_ieee80211_he_trigger_bar_ctrl_ba_ack_policy,
55755
14
     {"BA Ack Policy", "wlan.trigger.he.common_info.bar_ctrl.ba_ack_policy",
55756
14
      FT_BOOLEAN, 16, TFS(&ieee80211_block_ack_control_ack_policy_flag), 0x0001,
55757
14
       NULL, HFILL }},
55758
55759
14
    {&hf_ieee80211_he_trigger_bar_ctrl_ba_type,
55760
14
     {"BA Type", "wlan.trigger.he.common_info.bar_ctrl.ba_type",
55761
14
      FT_UINT16, BASE_HEX, VALS(block_ack_type_vals), 0x001e, NULL, HFILL }},
55762
55763
14
    {&hf_ieee80211_he_trigger_bar_ctrl_reserved,
55764
14
     {"Reserved", "wlan.trigger.he.common_info.bar_ctrl.reserved",
55765
14
      FT_UINT16, BASE_HEX, NULL, 0x0FE0, NULL, HFILL }},
55766
55767
14
    {&hf_ieee80211_he_trigger_bar_ctrl_tid_info,
55768
14
     {"TID_INFO", "wlan.trigger.he.common_info.bar_ctrl.tid_info",
55769
14
      FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL }},
55770
55771
14
    {&hf_ieee80211_he_trigger_bar_info,
55772
14
     {"BAR Information", "wlan.trigger.he.common_info.bar_info",
55773
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
55774
55775
14
    {&hf_ieee80211_he_trigger_bar_info_blk_ack_seq_ctrl,
55776
14
     {"Block Ack Starting Sequence Control",
55777
14
      "wlan.trigger.he.common_info.bar_info.blk_ack_starting_seq_ctrl",
55778
14
      FT_UINT16, BASE_HEX, NULL, 0xffff, NULL, HFILL }},
55779
55780
14
    {&hf_ieee80211_he_trigger_user_info,
55781
14
     {"User Info", "wlan.trigger.he.user_info",
55782
14
      FT_UINT40, BASE_HEX, NULL, 0, NULL, HFILL }},
55783
55784
14
    {&hf_ieee80211_he_trigger_user_info_padding_start,
55785
14
     {"Start of Padding", "wlan.trigger.he.user_info.start_of_padding",
55786
14
      FT_UINT16, BASE_DEC, NULL, 0x0FFF, NULL, HFILL }},
55787
55788
14
    {&hf_ieee80211_he_trigger_padding,
55789
14
     {"Padding", "wlan.trigger.he.padding",
55790
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
55791
55792
14
    {&hf_ieee80211_he_trigger_mpdu_mu_spacing,
55793
14
     {"MPDU MU Spacing Factor", "wlan.trigger.he.mpdu_mu_spacing_factor",
55794
14
      FT_UINT8, BASE_DEC, NULL, 0x03, NULL, HFILL }},
55795
55796
14
    {&hf_ieee80211_he_trigger_tid_aggregation_limit,
55797
14
     {"TID Aggregation Limit", "wlan.trigger.he.tid_aggregation_limit",
55798
14
      FT_UINT8, BASE_DEC, NULL, 0x1C, NULL, HFILL }},
55799
55800
14
    {&hf_ieee80211_he_trigger_dependent_reserved1,
55801
14
     {"Reserved", "wlan.trigger.he.reserved1",
55802
14
      FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
55803
55804
14
    {&hf_ieee80211_he_trigger_preferred_ac,
55805
14
     {"Preferred AC", "wlan.trigger.he.preferred_ac",
55806
14
      FT_UINT8, BASE_HEX, VALS(preferred_ac_vals), 0xC0, NULL, HFILL }},
55807
55808
14
    {&hf_ieee80211_he_trigger_dep_basic_user_info,
55809
14
     {"Basic Trigger Dependent User Info", "wlan.trigger.he.basic_user_info",
55810
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
55811
55812
14
    {&hf_ieee80211_he_trigger_starting_aid,
55813
14
     {"Starting AID", "wlan.trigger.he.starting_aid",
55814
14
      FT_UINT40, BASE_HEX, NULL, 0x0000000FFF, NULL, HFILL }},
55815
55816
14
    {&hf_ieee80211_he_trigger_dependent_reserved2,
55817
14
     {"Reserved", "wlan.trigger.he.reserved2",
55818
14
      FT_UINT40, BASE_HEX, NULL, 0x00001FF000, NULL, HFILL }},
55819
55820
14
    {&hf_ieee80211_he_trigger_feedback_type,
55821
14
     {"Feedback Type", "wlan.trigger.he.feedback_type",
55822
14
      FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }},
55823
55824
14
    {&hf_ieee80211_he_trigger_dependent_reserved3,
55825
14
     {"Reserved", "wlan.trigger.he.reserved3",
55826
14
      FT_UINT40, BASE_HEX, NULL, 0x00FE000000, NULL, HFILL }},
55827
55828
14
    {&hf_ieee80211_he_trigger_nfrp_target_rssi,
55829
14
     {"Target RSSI", "wlan.trigger.he.target_rssi",
55830
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(target_rssi_base_custom), 0x7F00000000,
55831
14
       NULL, HFILL }},
55832
55833
14
    {&hf_ieee80211_he_trigger_multiplexing_flag,
55834
14
     {"Multiplexing Flag", "wlan.trigger.he.multiplexing_flag",
55835
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
55836
55837
14
    {&hf_ieee80211_he_trigger_dep_nfrp_user_info,
55838
14
     {"NFRP Trigger Dependent User Unfo", "wlan.trigger.he.nfrp_user_info",
55839
14
      FT_UINT40, BASE_HEX, NULL, 0, NULL, HFILL }},
55840
55841
14
    {&hf_ieee80211_he_trigger_feedback_seg_retrans_bm,
55842
14
     {"Feedback Segment Retransmission Bitmap", "wlan.trigger.he.feedback_bm",
55843
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
55844
55845
14
    {&hf_ieee80211_he_trigger_aid12,
55846
14
     {"AID12", "wlan.trigger.he.user_info.aid12",
55847
14
      FT_UINT40, BASE_HEX, NULL, 0x0000000FFF, NULL, HFILL }},
55848
55849
14
    {&hf_ieee80211_he_trigger_ru_allocation_region,
55850
14
     {"RU Allocation Region", "wlan.trigger.he.ru_allocation_region",
55851
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_ru_allocation_region_custom),
55852
14
      0x0000001000, NULL, HFILL }},
55853
55854
14
    {&hf_ieee80211_he_trigger_ru_allocation,
55855
14
     {"RU Allocation", "wlan.trigger.he.ru_allocation",
55856
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_ru_allocation_base_custom),
55857
14
      0x00000FE000, NULL, HFILL }},
55858
55859
14
    {&hf_ieee80211_he_trigger_ul_fec_coding_type,
55860
14
     {"UL FEC Coding Type", "wlan.trigger.he.ul_fec_coding_type",
55861
14
      FT_BOOLEAN, 40, TFS(&he_trigger_ul_fec_coding_type_tfs), 0x0000100000,
55862
14
        NULL, HFILL }},
55863
55864
14
    {&hf_ieee80211_he_trigger_ul_mcs,
55865
14
     {"UL MCS", "wlan.trigger.he.ul_mcs",
55866
14
      FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }},
55867
55868
14
    {&hf_ieee80211_he_trigger_ul_dcm,
55869
14
     {"UL DCM", "wlan.trigger.he.ul_dcm",
55870
14
      FT_BOOLEAN, 40, NULL, 0x0002000000, NULL, HFILL }},
55871
55872
14
    {&hf_ieee80211_he_trigger_ru_starting_spatial_stream,
55873
14
     {"Starting Spatial Stream", "wlan.trigger.he.ru_starting_spatial_stream",
55874
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
55875
14
      0x001c000000, NULL, HFILL }},
55876
55877
14
    {&hf_ieee80211_he_trigger_ru_number_spatial_streams,
55878
14
     {"Number Of Spatial Streams", "wlan.trigger.he.ru_number_of_spatial_stream",
55879
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
55880
14
      0x00E0000000, NULL, HFILL }},
55881
55882
14
    {&hf_ieee80211_he_trigger_ru_number_ra_ru,
55883
14
     {"Number of RA-RU", "wlan.trigger.he.ru_number_of_ra_ru",
55884
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
55885
14
      0x007C000000, NULL, HFILL }},
55886
55887
14
    {&hf_ieee80211_he_trigger_ru_no_more_ra_ru,
55888
14
     {"No More RA-RU", "wlan.trigger.he.ru_no_more_ra_ru",
55889
14
      FT_BOOLEAN, 40, NULL, 0x0080000000, NULL, HFILL }},
55890
55891
14
    {&hf_ieee80211_he_trigger_ul_target_rssi,
55892
14
     {"UL Target RSSI", "wlan.trigger.he.ul_target_rssi",
55893
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(target_rssi_base_custom), 0x7F00000000,
55894
14
       NULL, HFILL }},
55895
55896
14
    {&hf_ieee80211_he_trigger_user_reserved,
55897
14
     {"Reserved", "wlan.trigger.he.user_reserved",
55898
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
55899
55900
14
    {&hf_ieee80211_he_trigger_ranging_common_info_1,
55901
14
     {"Ranging Common Info", "wlan.trigger.he.ranging.common_info",
55902
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
55903
55904
14
    {&hf_ieee80211_he_trigger_ranging_common_info_2,
55905
14
     {"Ranging Common Info", "wlan.trigger.he.ranging.common_info",
55906
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
55907
55908
14
    {&hf_ieee80211_eht_trigger_common_info,
55909
14
     {"EHT Trigger Common Info", "wlan.trigger.eht.common_info",
55910
14
      FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL }},
55911
55912
14
    {&hf_ieee80211_eht_trigger_type,
55913
14
     {"Trigger Type", "wlan.trigger.eht.trigger_type",
55914
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(trigger_type_vals),
55915
14
        0x000000000000000F, NULL, HFILL }},
55916
55917
14
    {&hf_ieee80211_eht_trigger_ul_length,
55918
14
     {"UL Length", "wlan.trigger.eht.ul_length",
55919
14
      FT_UINT64, BASE_DEC, NULL, 0x000000000000FFF0, NULL, HFILL }},
55920
55921
14
    {&hf_ieee80211_eht_trigger_more_tf,
55922
14
     {"More TF", "wlan.trigger.eht.more_tf",
55923
14
      FT_BOOLEAN, 64, NULL, 0x0000000000010000, NULL, HFILL }},
55924
55925
14
    {&hf_ieee80211_eht_trigger_cs_required,
55926
14
     {"CS Required", "wlan.trigger.eht.cs_required",
55927
14
      FT_BOOLEAN, 64, NULL, 0x0000000000020000, NULL, HFILL }},
55928
55929
14
    {&hf_ieee80211_eht_trigger_ul_bw,
55930
14
     {"UL BW", "wlan.trigger.eht.ul_bw",
55931
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(bw_subfield_vals),
55932
14
      0x00000000000C0000, NULL, HFILL }},
55933
55934
14
    {&hf_ieee80211_eht_trigger_gi_and_eht_ltf_type,
55935
14
     {"GI And HE/EHT-LTF Type/Triggered TXOP Sharing Mode",
55936
14
      "wlan.trigger.eht.gi_and_he_eht_ltf_type_triggered_txop_sharing_mode",
55937
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000000300000, NULL, HFILL }},
55938
55939
14
    {&hf_ieee80211_eht_trigger_reserved2,
55940
14
     {"Reserved", "wlan.trigger.eht.reserved2",
55941
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000000400000, NULL, HFILL }},
55942
55943
14
    {&hf_ieee80211_eht_trigger_num_he_eht_ltf_syms_etc,
55944
14
     {"Number of HE/EHT-LTF Symbols",
55945
14
      "wlan.trigger.eht.num_ltf_eht_ltf_symbols",
55946
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000003800000, NULL, HFILL }},
55947
55948
14
    {&hf_ieee80211_eht_trigger_reserved3,
55949
14
     {"Reserved", "wlan.trigger.eht.reserved3",
55950
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000004000000, NULL, HFILL }},
55951
55952
14
    {&hf_ieee80211_eht_trigger_ldpc_extra_sym_seg,
55953
14
     {"LDPC Extra Symbol Segment", "wlan.trigger.eht.ldpc_extra_symbol_segment",
55954
14
      FT_BOOLEAN, 64, NULL, 0x0000000008000000, NULL, HFILL }},
55955
55956
14
    {&hf_ieee80211_eht_trigger_ap_tx_power,
55957
14
     {"AP Tx Power", "wlan.trigger.eht.ap_tx_power",
55958
14
      FT_UINT64, BASE_CUSTOM, CF_FUNC(ap_tx_power_custom),
55959
14
      0x00000003F0000000, NULL, HFILL }},
55960
55961
14
    {&hf_ieee80211_eht_trigger_pre_fec_padding_factor,
55962
14
     {"Pre-FEC Padding Factor",
55963
14
      "wlan.trigger.eht.ul_packet_extension.pre_fec_padding_factor",
55964
14
      FT_UINT64, BASE_DEC|BASE_VAL64_STRING,
55965
14
      VALS64(pre_fec_padding_factor_vals),
55966
14
      0x0000000c00000000, NULL, HFILL }},
55967
55968
14
    {&hf_ieee80211_eht_trigger_pe_disambiguity,
55969
14
     {"PE Disambiguity",
55970
14
      "wlan.trigger.eht.ul_packet_extension.pe_disambiguity",
55971
14
      FT_BOOLEAN, 64, TFS(&pe_disambiguity_tfs),
55972
14
      0x0000001000000000, NULL, HFILL }},
55973
55974
14
    {&hf_ieee80211_eht_trigger_ul_spatial_reuse,
55975
14
     {"Spatial Reuse", "wlan.trigger.eht.spatial_reuse",
55976
14
      FT_UINT64, BASE_HEX, NULL, 0x001FFFE000000000, NULL, HFILL }},
55977
55978
14
    {&hf_ieee80211_eht_trigger_reserved4,
55979
14
     {"Reserved", "wlan.trigger.eht.reserved4",
55980
14
      FT_UINT64, BASE_HEX, NULL, 0x0020000000000000, NULL, HFILL }},
55981
55982
14
    {&hf_ieee80211_eht_trigger_he_eht_p160,
55983
14
     {"HE/EHT P160", "wlan.trigger.eht.he_eht_p160",
55984
14
      FT_UINT64, BASE_HEX, NULL, 0x0040000000000000, NULL, HFILL }},
55985
55986
14
    {&hf_ieee80211_eht_trigger_special_user_info_flag,
55987
14
     {"Special User Info Field Flag",
55988
14
      "wlan.trigger.eht.special_user_info_flag",
55989
14
      FT_UINT64, BASE_HEX, NULL, 0x0080000000000000, NULL, HFILL }},
55990
55991
14
    {&hf_ieee80211_eht_trigger_eht_reserved,
55992
14
     {"EHT Reserved", "wlan.trigger.eht.eht_reserved",
55993
14
      FT_UINT64, BASE_HEX, NULL, 0x7f00000000000000, NULL, HFILL }},
55994
55995
14
    {&hf_ieee80211_eht_trigger_reserved,
55996
14
     {"Reserved", "wlan.trigger.eht.reserved",
55997
14
      FT_UINT64, BASE_HEX, NULL, 0x8000000000000000, NULL, HFILL }},
55998
55999
14
    {&hf_ieee80211_eht_trigger_user_info,
56000
14
     {"EHT User Info", "wlan.trigger.eht.user_info",
56001
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
56002
56003
14
    {&hf_ieee80211_eht_trigger_aid12,
56004
14
     {"AID12", "wlan.trigger.eht.user_info.aid12",
56005
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000FFF, NULL, HFILL }},
56006
56007
14
    {&hf_ieee80211_eht_trigger_ru_allocation_region,
56008
14
     {"RU Allocation Region", "wlan.trigger.eht.user_info.ru_allocation_region",
56009
14
      FT_UINT40, BASE_HEX, NULL, 0x0000001000, NULL, HFILL }},
56010
56011
14
    {&hf_ieee80211_eht_trigger_ru_allocation,
56012
14
     {"RU Allocation", "wlan.trigger.eht.user_info.ru_allocation",
56013
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(eht_ru_allocation_base_custom), 0x00000FE000, NULL, HFILL }},
56014
56015
14
    {&hf_ieee80211_eht_trigger_ul_fec_coding_type,
56016
14
     {"UL FEC Coding Type", "wlan.trigger.eht.user_info.ul_fec_coding_type",
56017
14
      FT_UINT40, BASE_HEX, NULL, 0x0000100000, NULL, HFILL }},
56018
56019
14
    {&hf_ieee80211_eht_trigger_ul_eht_mcs,
56020
14
     {"UL EHT MCS", "wlan.trigger.eht.user_info.ul_eht_mcs",
56021
14
      FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }},
56022
56023
14
    {&hf_ieee80211_eht_trigger_user_info_reserved,
56024
14
     {"Reserved", "wlan.trigger.eht.user_info.reserved",
56025
14
      FT_UINT40, BASE_HEX, NULL, 0x0002000000, NULL, HFILL }},
56026
56027
14
    {&hf_ieee80211_eht_trigger_ru_starting_spatial_stream,
56028
14
     {"Starting Spatial Stream",
56029
14
      "wlan.trigger.eht.user_info.ru_starting_spatial_stream",
56030
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56031
14
      0x003C000000, NULL, HFILL }},
56032
56033
14
    {&hf_ieee80211_eht_trigger_ru_number_spatial_streams,
56034
14
     {"Number Of Spatial Streams",
56035
14
      "wlan.trigger.eht.user_info.ru_number_spatial_streams",
56036
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56037
14
      0x00C0000000, NULL, HFILL }},
56038
56039
14
    {&hf_ieee80211_eht_trigger_ul_target_recv_power,
56040
14
     {"UL Target Receive Power",
56041
14
      "wlan.trigger.eht.user_info.ul_target_receive_power",
56042
14
      FT_UINT40, BASE_HEX, NULL, 0x7F00000000, NULL, HFILL }},
56043
56044
14
    {&hf_ieee80211_eht_trigger_ps160,
56045
14
     {"PS160", "wlan.trigger.eht.user_info.ps160",
56046
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
56047
56048
14
    {&hf_ieee80211_eht_trigger_special_user_info,
56049
14
     {"Special User Info",
56050
14
      "wlan.trigger.eht.special_user_info",
56051
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
56052
56053
14
    {&hf_ieee80211_eht_trigger_phy_version_identifier,
56054
14
     {"Phy Version Identifier",
56055
14
      "wlan.trigger.eht.user_info.phy_version_identifier",
56056
14
      FT_UINT40, BASE_HEX, NULL, 0x0000007000, NULL, HFILL }},
56057
56058
14
    {&hf_ieee80211_eht_trigger_ul_bw_extenstion,
56059
14
     {"UL BW Extension", "wlan.trigger.eht.user_info.ul_bw_extension",
56060
14
      FT_UINT40, BASE_HEX, NULL, 0x0000018000, NULL, HFILL }},
56061
56062
14
    {&hf_ieee80211_eht_trigger_eht_spatial_reuse_1,
56063
14
     {"EHT/UHR Spatial Reuse 1", "wlan.trigger.eht.user_info.eht_spatial_reuse_1",
56064
14
      FT_UINT40, BASE_HEX, NULL, 0x00001E0000, NULL, HFILL }},
56065
56066
14
    {&hf_ieee80211_eht_trigger_eht_spatial_reuse_2,
56067
14
     {"EHT/UHR Spatial Reuse 2", "wlan.trigger.eht.user_info.eht_spatial_reuse_2",
56068
14
      FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }},
56069
56070
14
    {&hf_ieee80211_eht_trigger_disregard_u_sig_1,
56071
14
     {"Disregard In U-SIG-1",
56072
14
      "wlan.trigger.eht.user_info.disregard_u_sig_1",
56073
14
      FT_UINT40, BASE_HEX, NULL, 0x007E000000, NULL, HFILL }},
56074
56075
14
    {&hf_ieee80211_eht_trigger_validate_u_sig_2,
56076
14
     {"Validate In U-SIG-2",
56077
14
      "wlan.trigger.eht.user_info.validate_u_sig_2",
56078
14
      FT_UINT40, BASE_HEX, NULL, 0x0080000000, NULL, HFILL }},
56079
56080
14
    {&hf_ieee80211_eht_trigger_disregard_u_sig_2_4lsb,
56081
14
     {"four LSBs of Disregard In U-SIG-2",
56082
14
      "wlan.trigger.eht.user_info.disregard_u_sig_2_4lsb",
56083
14
      FT_UINT40, BASE_HEX, NULL, 0x0F00000000, NULL, HFILL }},
56084
56085
14
    {&hf_ieee80211_eht_trigger_disregard_u_sig_2_msb,
56086
14
     {"MSB of Disregard In U-SIG-2",
56087
14
      "wlan.trigger.eht.user_info.disregard_u_sig_2_msb",
56088
14
      FT_UINT40, BASE_HEX, NULL, 0x1000000000, NULL, HFILL }},
56089
56090
14
    {&hf_ieee80211_eht_trigger_special_reserved,
56091
14
     {"Reserved", "wlan.trigger.eht.user_info.special_reserved",
56092
14
      FT_UINT40, BASE_HEX, NULL, 0xE000000000, NULL, HFILL }},
56093
56094
14
    { &hf_ieee80211_uhr_trigger_common_info,
56095
14
     {"UHR Trigger Common Info", "wlan.trigger.uhr.common_info",
56096
14
      FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL } },
56097
56098
14
    { &hf_ieee80211_uhr_trigger_type,
56099
14
     {"Trigger Type", "wlan.trigger.uhr.trigger_type",
56100
14
      FT_UINT64, BASE_DEC | BASE_VAL64_STRING, VALS64(trigger_type_vals),
56101
14
        0x000000000000000F, NULL, HFILL } },
56102
56103
14
    { &hf_ieee80211_uhr_trigger_ul_length,
56104
14
     {"UL Length", "wlan.trigger.uhr.ul_length",
56105
14
      FT_UINT64, BASE_DEC, NULL, 0x000000000000FFF0, NULL, HFILL } },
56106
56107
14
    { &hf_ieee80211_uhr_trigger_more_tf,
56108
14
     {"More TF", "wlan.trigger.uhr.more_tf",
56109
14
      FT_BOOLEAN, 64, NULL, 0x0000000000010000, NULL, HFILL } },
56110
56111
14
    { &hf_ieee80211_uhr_trigger_cs_required,
56112
14
     {"CS Required", "wlan.trigger.uhr.cs_required",
56113
14
      FT_BOOLEAN, 64, NULL, 0x0000000000020000, NULL, HFILL } },
56114
56115
14
    { &hf_ieee80211_uhr_trigger_ul_bw,
56116
14
     {"UL BW", "wlan.trigger.uhr.ul_bw",
56117
14
      FT_UINT64, BASE_DEC | BASE_VAL64_STRING, VALS64(bw_subfield_vals),
56118
14
      0x00000000000C0000, NULL, HFILL } },
56119
56120
14
    { &hf_ieee80211_uhr_trigger_gi_and_he_uhr_ltf_type,
56121
14
     {"GI And HE/UHR-LTF Type/Triggered TXOP Sharing Mode",
56122
14
      "wlan.trigger.uhr.gi_and_he_uhr_ltf_type_triggered_txop_sharing_mode",
56123
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000000300000, NULL, HFILL } },
56124
56125
14
    { &hf_ieee80211_uhr_trigger_reserved2,
56126
14
     {"Reserved", "wlan.trigger.uhr.reserved2",
56127
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000000400000, NULL, HFILL } },
56128
56129
14
    { &hf_ieee80211_uhr_trigger_num_he_uhr_ltf_syms_etc,
56130
14
     {"Number of HE/UHR-LTF Symbols",
56131
14
      "wlan.trigger.uhr.num_he_uhr_ltf_symbols",
56132
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000003800000, NULL, HFILL } },
56133
56134
14
    { &hf_ieee80211_uhr_trigger_reserved3,
56135
14
     {"Reserved", "wlan.trigger.uhr.reserved3",
56136
14
      FT_UINT64, BASE_HEX, NULL, 0x0000000004000000, NULL, HFILL } },
56137
56138
14
    { &hf_ieee80211_uhr_trigger_ldpc_extra_sym_seg,
56139
14
     {"LDPC Extra Symbol Segment", "wlan.trigger.uhr.ldpc_extra_symbol_segment",
56140
14
      FT_BOOLEAN, 64, NULL, 0x0000000008000000, NULL, HFILL } },
56141
56142
14
    { &hf_ieee80211_uhr_trigger_ap_tx_power,
56143
14
     {"AP Tx Power", "wlan.trigger.uhr.ap_tx_power",
56144
14
      FT_UINT64, BASE_CUSTOM, CF_FUNC(ap_tx_power_custom),
56145
14
      0x00000003F0000000, NULL, HFILL } },
56146
56147
14
    { &hf_ieee80211_uhr_trigger_pre_fec_padding_factor,
56148
14
     {"Pre-FEC Padding Factor",
56149
14
      "wlan.trigger.uhr.ul_packet_extension.pre_fec_padding_factor",
56150
14
      FT_UINT64, BASE_DEC | BASE_VAL64_STRING,
56151
14
      VALS64(pre_fec_padding_factor_vals),
56152
14
      0x0000000c00000000, NULL, HFILL } },
56153
56154
14
    { &hf_ieee80211_uhr_trigger_pe_disambiguity,
56155
14
     {"PE Disambiguity",
56156
14
      "wlan.trigger.uhr.ul_packet_extension.pe_disambiguity",
56157
14
      FT_BOOLEAN, 64, TFS(&pe_disambiguity_tfs),
56158
14
      0x0000001000000000, NULL, HFILL } },
56159
56160
14
    { &hf_ieee80211_uhr_trigger_ul_spatial_reuse,
56161
14
     {"Spatial Reuse", "wlan.trigger.uhr.spatial_reuse",
56162
14
      FT_UINT64, BASE_HEX, NULL, 0x001FFFE000000000, NULL, HFILL } },
56163
56164
14
    { &hf_ieee80211_uhr_trigger_reserved4,
56165
14
     {"Reserved", "wlan.trigger.uhr.reserved4",
56166
14
      FT_UINT64, BASE_HEX, NULL, 0x0020000000000000, NULL, HFILL } },
56167
56168
14
    { &hf_ieee80211_uhr_trigger_he_uhr_p160,
56169
14
     {"HE/UHR P160", "wlan.trigger.uhr.he_uhr_p160",
56170
14
      FT_UINT64, BASE_HEX, NULL, 0x0040000000000000, NULL, HFILL } },
56171
56172
14
    { &hf_ieee80211_uhr_trigger_special_user_info_flag,
56173
14
     {"Special User Info Field Flag",
56174
14
      "wlan.trigger.uhr.special_user_info_flag",
56175
14
      FT_UINT64, BASE_HEX, NULL, 0x0080000000000000, NULL, HFILL } },
56176
56177
14
    { &hf_ieee80211_uhr_trigger_dru_rru,
56178
14
     {"DRU/RRU Indication", "wlan.trigger.uhr.dru_rru",
56179
14
      FT_UINT64, BASE_HEX, NULL, 0x0f00000000000000, NULL, HFILL } },
56180
56181
14
    { &hf_ieee80211_uhr_trigger_ifcs,
56182
14
     {"IFCS Present Flag", "wlan.trigger.uhr.ifcs",
56183
14
      FT_UINT64, BASE_HEX, NULL, 0x1000000000000000, NULL, HFILL } },
56184
56185
14
    { &hf_ieee80211_uhr_trigger_uhr_reserved,
56186
14
     {"UHR Reserved", "wlan.trigger.uhr.uhr_reserved",
56187
14
      FT_UINT64, BASE_HEX, NULL, 0x2000000000000000, NULL, HFILL } },
56188
56189
14
    { &hf_ieee80211_uhr_trigger_reserved,
56190
14
     {"Reserved", "wlan.trigger.uhr.reserved",
56191
14
      FT_UINT64, BASE_HEX, NULL, 0x4000000000000000, NULL, HFILL } },
56192
56193
14
    { &hf_ieee80211_uhr_trigger_user_info,
56194
14
     {"UHR User Info", "wlan.trigger.uhr.user_info",
56195
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL } },
56196
56197
14
    { &hf_ieee80211_uhr_trigger_aid12,
56198
14
     {"AID12", "wlan.trigger.uhr.user_info.aid12",
56199
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000FFF, NULL, HFILL } },
56200
56201
14
    { &hf_ieee80211_uhr_trigger_ru_allocation_region,
56202
14
     {"RU Allocation Region", "wlan.trigger.uhr.user_info.ru_allocation_region",
56203
14
      FT_UINT40, BASE_DEC, NULL, 0x0000001000, NULL, HFILL } },
56204
56205
14
    { &hf_ieee80211_uhr_trigger_ru_allocation,
56206
14
     {"RU Allocation", "wlan.trigger.uhr.user_info.ru_allocation",
56207
14
      FT_UINT40, BASE_DEC, NULL, 0x00000FE000, NULL, HFILL } },
56208
56209
14
    { &hf_ieee80211_uhr_trigger_ul_fec_coding_type,
56210
14
     {"UL FEC Coding Type", "wlan.trigger.uhr.user_info.ul_fec_coding_type",
56211
14
      FT_UINT40, BASE_HEX, NULL, 0x0000100000, NULL, HFILL } },
56212
56213
14
    { &hf_ieee80211_uhr_trigger_ul_uhr_mcs,
56214
14
     {"UL UHR MCS", "wlan.trigger.uhr.user_info.ul_uhr_mcs",
56215
14
      FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL } },
56216
56217
14
    { &hf_ieee80211_uhr_trigger_2xldpc,
56218
14
     {"2xLDPC", "wlan.trigger.uhr.user_info.2xldpc",
56219
14
      FT_UINT40, BASE_HEX, NULL, 0x0002000000, NULL, HFILL } },
56220
56221
14
    { &hf_ieee80211_uhr_trigger_ru_starting_spatial_stream,
56222
14
     {"Starting Spatial Stream",
56223
14
      "wlan.trigger.uhr.user_info.ru_starting_spatial_stream",
56224
14
      FT_UINT40, BASE_DEC, NULL,
56225
14
      0x003C000000, NULL, HFILL } },
56226
56227
14
    { &hf_ieee80211_uhr_trigger_dru_distribution_bw,
56228
14
     {"DRU Distribution BW",
56229
14
      "wlan.trigger.uhr.user_info.dru_distribution_bw",
56230
14
      FT_UINT40, BASE_DEC, NULL,
56231
14
      0x000C000000, NULL, HFILL } },
56232
56233
14
    { &hf_ieee80211_uhr_trigger_dru_reserved,
56234
14
     {"DRU reserved",
56235
14
      "wlan.trigger.uhr.user_info.dru_reserved",
56236
14
      FT_UINT40, BASE_DEC, NULL,
56237
14
      0x0030000000, NULL, HFILL } },
56238
56239
14
    { &hf_ieee80211_uhr_trigger_ru_number_spatial_streams,
56240
14
     {"Number Of Spatial Streams",
56241
14
      "wlan.trigger.uhr.user_info.ru_number_spatial_streams",
56242
14
      FT_UINT40, BASE_DEC, NULL,
56243
14
      0x00C0000000, NULL, HFILL } },
56244
56245
14
    { &hf_ieee80211_uhr_trigger_ul_target_recv_power,
56246
14
     {"UL Target Receive Power",
56247
14
      "wlan.trigger.uhr.user_info.ul_target_receive_power",
56248
14
      FT_UINT40, BASE_HEX, NULL, 0x7F00000000, NULL, HFILL } },
56249
56250
14
    { &hf_ieee80211_uhr_trigger_ps160,
56251
14
     {"PS160", "wlan.trigger.uhr.user_info.ps160",
56252
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL } },
56253
56254
14
    {&hf_ieee80211_ranging_trigger_subtype1,
56255
14
     {"Ranging Trigger Subtype",
56256
14
      "wlan.trigger.he.ranging.ranging_trigger_subtype",
56257
14
      FT_UINT8, BASE_RANGE_STRING|BASE_HEX, RVALS(ranging_trigger_subtype_vals),
56258
14
      0x0f, NULL, HFILL }},
56259
56260
14
    {&hf_ieee80211_ranging_trigger_reserved1,
56261
14
     {"Reserved", "wlan.trigger.he.ranging.reserved",
56262
14
      FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL }},
56263
56264
14
    {&hf_ieee80211_ranging_trigger_token,
56265
14
     {"Token", "wlan.trigger.he.ranging.token",
56266
14
      FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL }},
56267
56268
14
    {&hf_ieee80211_ranging_trigger_subtype2,
56269
14
     {"Ranging Trigger Subtype",
56270
14
      "wlan.trigger.he.ranging.ranging_trigger_subtype",
56271
14
      FT_UINT16, BASE_RANGE_STRING|BASE_HEX,
56272
14
      RVALS(ranging_trigger_subtype_vals), 0x000f, NULL, HFILL }},
56273
56274
14
    {&hf_ieee80211_ranging_trigger_reserved2,
56275
14
     {"Reserved", "wlan.trigger.he.ranging.reserved2",
56276
14
      FT_UINT16, BASE_HEX, NULL, 0x03f0, NULL, HFILL }},
56277
56278
14
    {&hf_ieee80211_ranging_trigger_sounding_dialog_token,
56279
14
     {"Sounding Dialog Token Number",
56280
14
      "wlan.trigger.he.ranging.sounding_dialog_token",
56281
14
      FT_UINT16, BASE_HEX, NULL, 0xfc00, NULL, HFILL }},
56282
56283
14
    {&hf_ieee80211_he_trigger_ranging_trigger_poll_rpt,
56284
14
     {"Ranging Trigger Poll/Rpt", "wlan.trigger.he.ranging.poll_rpt",
56285
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
56286
56287
14
    {&hf_ieee80211_ranging_pol_rpt_aid12_rsid12,
56288
14
     {"AID12/RSID12", "wlan.trigger.he.ranging.poll_rpt.aid12_rsid12",
56289
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000fff, NULL, HFILL }},
56290
56291
14
    {&hf_ieee80211_ranging_pol_rpt_ru_alloc_region,
56292
14
     {"RU Allocation Region", "wlan.trigger.he.ranging.poll_rpt.ru_allocation_region",
56293
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_ru_allocation_region_custom),
56294
14
      0x0000001000, NULL, HFILL }},
56295
56296
14
    {&hf_ieee80211_ranging_pol_rpt_ru_alloc,
56297
14
     {"RU Allocation", "wlan.trigger.he.ranging.poll_rpt.ru_allocation",
56298
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_ru_allocation_base_custom), 0x00000fe000, NULL, HFILL }},
56299
56300
14
    {&hf_ieee80211_ranging_pol_rpt_ul_fec_coding_type,
56301
14
     {"UL FEC Coding Type",
56302
14
      "wlan.trigger.he.ranging.poll_rpt.ul_fec_coding_type",
56303
14
      FT_BOOLEAN, 40, TFS(&he_trigger_ul_fec_coding_type_tfs), 0x0000100000, NULL, HFILL }},
56304
56305
14
    {&hf_ieee80211_ranging_pol_rpt_ulmcs,
56306
14
     {"UL MCS", "wlan.trigger.he.ranging.poll_rpt.ul_mcs",
56307
14
      FT_UINT40, BASE_HEX, NULL, 0x0001e00000, NULL, HFILL }},
56308
56309
14
    {&hf_ieee80211_ranging_pol_rpt_uldcm,
56310
14
     {"UL DCM", "wlan.trigger.he.ranging.poll_rpt.ul_dcm",
56311
14
      FT_UINT40, BASE_HEX, NULL, 0x0002000000, NULL, HFILL }},
56312
56313
14
    {&hf_ieee80211_ranging_pol_rpt_starting_spatial_stream,
56314
14
     {"Starting Spatial Stream",
56315
14
      "wlan.trigger.he.ranging.poll_rpt.starting_spatial_stream",
56316
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56317
14
      0x001c000000, NULL, HFILL }},
56318
56319
14
    {&hf_ieee80211_ranging_pol_rpt_number_spatial_streams,
56320
14
     {"Number Of Spatial Streams",
56321
14
      "wlan.trigger.he.ranging.poll_rpt.number_spatial_streams",
56322
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56323
14
      0x00e0000000, NULL, HFILL }},
56324
56325
14
    {&hf_ieee80211_ranging_pol_rpt_ul_target_rssi,
56326
14
     {"UL Target RSSI", "wlan.trigger.he.ranging.poll_rpt.ul_target_rssi",
56327
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(target_rssi_base_custom), 0x7f00000000, NULL, HFILL }},
56328
56329
14
    {&hf_ieee80211_ranging_pol_rpt_reserved,
56330
14
     {"Reserved", "wlan.trigger.he.ranging.poll_rpt.reserved",
56331
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
56332
56333
14
    {&hf_ieee80211_he_trigger_ranging_trigger_sounding,
56334
14
     {"Ranging Trigger Sounding", "wlan.trigger.he.ranging.sounding",
56335
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
56336
56337
14
    {&hf_ieee80211_ranging_sounding_aid12_rsid12,
56338
14
     {"AID12/RSID12", "wlan.trigger.he.ranging.sounding.aid12_rsid12",
56339
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000fff, NULL, HFILL }},
56340
56341
14
    {&hf_ieee80211_ranging_sounding_reserved1,
56342
14
     {"Reserved", "wlan.trigger.he.ranging.sounding.reserved1",
56343
14
      FT_UINT40, BASE_HEX, NULL, 0x00001ff000, NULL, HFILL }},
56344
56345
14
    {&hf_ieee80211_ranging_sounding_i2r_rep,
56346
14
     {"I2R Rep", "wlan.trigger.he.ranging.sounding.i2r_rep",
56347
14
      FT_UINT40, BASE_DEC, NULL, 0x0000e00000, NULL, HFILL }},
56348
56349
14
    {&hf_ieee80211_ranging_sounding_reserved2,
56350
14
     {"Reserved", "wlan.trigger.he.ranging.sounding.reserved2",
56351
14
      FT_UINT40, BASE_HEX, NULL, 0x0003000000, NULL, HFILL }},
56352
56353
14
    {&hf_ieee80211_ranging_sounding_starting_spatial_stream,
56354
14
     {"Starting Spatial Stream",
56355
14
      "wlan.trigger.he.ranging.sounding.starting_spatial_stream",
56356
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56357
14
      0x001c000000, NULL, HFILL }},
56358
56359
14
    {&hf_ieee80211_ranging_sounding_number_spatial_streams,
56360
14
     {"Number of Spatial Streams",
56361
14
      "wlan.trigger.he.ranging.sounding.number_spatial_streams",
56362
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56363
14
      0x00e0000000, NULL, HFILL }},
56364
56365
14
    {&hf_ieee80211_ranging_sounding_ul_target_rssi,
56366
14
     {"UL Target RSSI", "wlan.trigger.he.ranging.sounding.ul_target_rssi",
56367
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(target_rssi_base_custom), 0x7f00000000, NULL, HFILL }},
56368
56369
14
    {&hf_ieee80211_ranging_sounding_reserved3,
56370
14
     {"Reserved", "wlan.trigger.he.ranging.sounding.reserved3",
56371
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
56372
56373
14
    {&hf_ieee80211_he_trigger_ranging_trigger_sec_sound,
56374
14
     {"Secured Sounding", "wlan.trigger.he.ranging.secured_sounding",
56375
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
56376
56377
14
    {&hf_ieee80211_ranging_sec_sound_aid12_rsid12,
56378
14
     {"AID12/RSID12", "wlan.trigger.he.ranging.secured_sounding.aid12_rsid12",
56379
14
      FT_UINT40, BASE_DEC, NULL, 0x0000000fff, NULL, HFILL }},
56380
56381
14
    {&hf_ieee80211_ranging_sec_sound_reserved1,
56382
14
     {"Reserved", "wlan.trigger.he.ranging.secured_sounding.reserved1",
56383
14
      FT_UINT40, BASE_HEX, NULL, 0x00001ff000, NULL, HFILL }},
56384
56385
14
    {&hf_ieee80211_ranging_sec_sound_i2r_rep,
56386
14
     {"I2R Rep", "wlan.trigger.he.ranging.secured_sounding.i2r_rep",
56387
14
      FT_UINT40, BASE_HEX, NULL, 0x0000e00000, NULL, HFILL }},
56388
56389
14
    {&hf_ieee80211_ranging_sec_sound_reserved2,
56390
14
     {"Reserved", "wlan.trigger.he.ranging.secured_sounding.reserved2",
56391
14
      FT_UINT40, BASE_HEX, NULL, 0x0003000000, NULL, HFILL }},
56392
56393
14
    {&hf_ieee80211_ranging_sec_sound_starting_spatial_stream,
56394
14
     {"Starting Spatial Stream",
56395
14
      "wlan.trigger.he.ranging.secured_sounding.starting_spatial_stream",
56396
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56397
14
      0x001c000000, NULL, HFILL }},
56398
56399
14
    {&hf_ieee80211_ranging_sec_sound_number_spatial_streams,
56400
14
     {"Number of Spatial Streams",
56401
14
      "wlan.trigger.he.ranging.secured_sounding.number_spatial_streams",
56402
14
      FT_UINT40, BASE_CUSTOM, CF_FUNC(he_trigger_minus_one_custom),
56403
14
      0x00e0000000, NULL, HFILL }},
56404
56405
14
    {&hf_ieee80211_ranging_sec_sound_ul_target_rssi,
56406
14
     {"UL Target RSSI",
56407
14
      "wlan.trigger.he.ranging.secured_sounding.ul_target_rssi",
56408
14
      FT_UINT40, BASE_HEX, NULL, 0x7f00000000, NULL, HFILL }},
56409
56410
14
    {&hf_ieee80211_ranging_sec_sound_reserved3,
56411
14
     {"Reserved", "wlan.trigger.he.ranging.secured_sounding.reserved3",
56412
14
      FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
56413
56414
14
    {&hf_ieee80211_he_trigger_ranging_user_info_sac,
56415
14
     {"SAC", "wlan.trigger.he.ranging.user_info.sac",
56416
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
56417
56418
14
    {&hf_ieee80211_he_qtp_control,
56419
14
     {"Control", "wlan.ext_tag.quiet_time_period.control",
56420
14
      FT_UINT8, BASE_RANGE_STRING | BASE_HEX, RVALS(quiet_time_period_control_rvals), 0,
56421
14
      "Type of Quiet Time Period Element", HFILL } },
56422
56423
14
    {&hf_ieee80211_he_qtp_setup_quiet_period_duration,
56424
14
     {"Quiet Period Duration", "wlan.ext_tag.quiet_time_period.setup.duration",
56425
14
      FT_UINT8, BASE_DEC, NULL, 0,
56426
14
      "Quiet Period Duration in units of 32us", HFILL } },
56427
56428
14
    {&hf_ieee80211_he_qtp_setup_srv_specific_identif,
56429
14
     {"Service Specific Identifier", "wlan.ext_tag.quiet_time_period.setup.srv_specific_identif",
56430
14
      FT_UINT16, BASE_HEX, NULL, 0,
56431
14
      "Service Specific peer-to-peer operation", HFILL } },
56432
56433
14
    {&hf_ieee80211_he_qtp_request_dialog_token,
56434
14
     {"Dialog Token", "wlan.ext_tag.quiet_time_period.request.dialog_token",
56435
14
      FT_UINT16, BASE_DEC, NULL, 0,
56436
14
      "Quiet Time Periods Response suptype to which request subtype corresponds",
56437
14
      HFILL } },
56438
56439
14
    {&hf_ieee80211_he_qtp_request_quiet_period_offset,
56440
14
     {"Quiet Period Offset", "wlan.ext_tag.quiet_time_period.request.offset",
56441
14
      FT_UINT8, BASE_DEC, NULL, 0,
56442
14
      "Offset of the first quiet period from the TBTT in TUs", HFILL } },
56443
56444
14
    {&hf_ieee80211_he_qtp_request_quiet_period_duration,
56445
14
     {"Quiet Period Duration", "wlan.ext_tag.quiet_time_period.request.duration",
56446
14
      FT_UINT16, BASE_DEC, NULL, 0,
56447
14
      "Quiet Period Duration in units of 32us", HFILL } },
56448
56449
14
    {&hf_ieee80211_he_qtp_request_quiet_period_interval,
56450
14
     {"Quiet Period Interval", "wlan.ext_tag.quiet_time_period.request.interval",
56451
14
      FT_UINT8, BASE_DEC, NULL, 0,
56452
14
      "Interval between the start of two consecutive quite time periods, in TUs",
56453
14
      HFILL } },
56454
56455
14
    {&hf_ieee80211_he_qtp_request_repetition_count,
56456
14
     {"Repetition Count", "wlan.ext_tag.quiet_time_period.request.repetition_count",
56457
14
      FT_UINT8, BASE_DEC, NULL, 0,
56458
14
      "Number of requested quiet time periods", HFILL } },
56459
56460
14
    {&hf_ieee80211_he_qtp_request_srv_specific_identif,
56461
14
     {"Service Specific Identifier", "wlan.ext_tag.quiet_time_period.request.srv_specific_identif",
56462
14
      FT_UINT16, BASE_HEX, NULL, 0,
56463
14
      "Specified peer-to-peer operation for which participating HE STAs might transmit frames during the quiet time period", HFILL } },
56464
56465
14
    {&hf_ieee80211_he_qtp_response_dialog_token,
56466
14
     {"Dialog Token", "wlan.ext_tag.quiet_time_period.response.dialog_token",
56467
14
      FT_UINT16, BASE_DEC, NULL, 0,
56468
14
      "The quiet time period request subtype to which this response corresponds",
56469
14
      HFILL } },
56470
56471
14
    {&hf_ieee80211_he_qtp_response_status_code,
56472
14
     {"Status Code", "wlan.ext_tag.quiet_time_period.response.status_code",
56473
14
      FT_UINT8, BASE_DEC, NULL, 0,
56474
14
      "Status of the requested operation", HFILL } },
56475
56476
14
    {&hf_ieee80211_he_qtp_response_quiet_period_offset,
56477
14
     {"Quiet Period Offset", "wlan.ext_tag.quiet_time_period.response.offset",
56478
14
       FT_UINT8, BASE_DEC, NULL, 0,
56479
14
      "Offset of the start of the first quiet time period", HFILL } },
56480
56481
14
    {&hf_ieee80211_he_qtp_response_quiet_period_duration,
56482
14
     {"Quiet Period Duration", "wlan.ext_tag.quiet_time_period.response.duration",
56483
14
      FT_UINT16, BASE_DEC, NULL, 0,
56484
14
      "Quiet Period Duration in units of 32us", HFILL } },
56485
56486
14
    {&hf_ieee80211_he_qtp_response_quiet_period_interval,
56487
14
     {"Quiet Period Interval", "wlan.ext_tag.quiet_time_period.response.interval",
56488
14
      FT_UINT8, BASE_DEC, NULL, 0,
56489
14
      "Interval between the start of two consecutive quiet time periods", HFILL } },
56490
56491
14
    {&hf_ieee80211_he_qtp_response_repetition_count,
56492
14
     {"Repetition Count", "wlan.ext_tag.quiet_time_period.response.repetition_count",
56493
14
      FT_UINT8, BASE_DEC, NULL, 0,
56494
14
      "Number of requested quiet time periods", HFILL } },
56495
56496
14
    {&hf_ieee80211_he_qtp_response_srv_specific_identif,
56497
14
     {"Service Specific Identifier", "wlan.ext_tag.quiet_time_period.response.srv_specific_identif",
56498
14
      FT_UINT16, BASE_HEX, NULL, 0,
56499
14
      "Identifier of a peer-to-peer operation for which participating HE STAs might transmit frames",
56500
14
      HFILL } },
56501
56502
14
    {&hf_ieee80211_he_ndp_annc_sta,
56503
14
     {"STA Info", "wlan.he_ndp.sta_info",
56504
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
56505
56506
14
    {&hf_ieee80211_he_ndp_annc_aid11,
56507
14
     {"AID11", "wlan.he_ndp.sta_info.aid11",
56508
14
      FT_UINT32, BASE_HEX, NULL, 0x000007FF, NULL, HFILL }},
56509
56510
14
    {&hf_ieee80211_he_ndp_annc_ru_start,
56511
14
     {"RU Start Index", "wlan.he_ndp.sta_info.ru_start",
56512
14
      FT_UINT32, BASE_HEX, NULL, 0x0003F800,
56513
14
      "26-tone RU start index of the target STA", HFILL }},
56514
56515
14
    {&hf_ieee80211_he_ndp_annc_ru_end,
56516
14
     {"RU End Index", "wlan.he_ndp.sta_info.ru_end",
56517
14
      FT_UINT32, BASE_HEX, NULL, 0x01FC0000,
56518
14
      "26-tone RU end index  of the target STA", HFILL }},
56519
56520
14
    {&hf_ieee80211_he_ndp_annc_feedback_type_and_ng,
56521
14
     {"Feedback Type and Ng", "wlan.he_ndp.sta_info.feedback_type_and_ng",
56522
14
      FT_UINT32, BASE_HEX, NULL, 0x06000000, NULL, HFILL }},
56523
56524
14
    {&hf_ieee80211_he_ndp_annc_disambiguation,
56525
14
     {"Disambiguation", "wlan.he_ndp.sta_info.disambiguation",
56526
14
      FT_UINT32, BASE_HEX, NULL, 0x08000000, NULL, HFILL }},
56527
56528
14
    {&hf_ieee80211_he_ndp_annc_codebook_size,
56529
14
     {"Codebook Size", "wlan.he_ndp.sta_info.codebook_size",
56530
14
      FT_UINT32, BASE_HEX, NULL, 0x10000000, NULL, HFILL }},
56531
56532
14
    {&hf_ieee80211_he_ndp_annc_nc,
56533
14
     {"Nc", "wlan.he_ndp.sta_info.nc",
56534
14
      FT_UINT32, BASE_HEX, NULL, 0xE0000000, NULL, HFILL }},
56535
56536
14
    {&hf_ieee80211_he_ndp_annc_disallowed_bitmap,
56537
14
     {"Disallowed Subchannel Bitmap",
56538
14
      "wlan.he_ndp.sta_info.disallowed_subchannel_bitmap",
56539
14
      FT_UINT32, BASE_HEX, NULL, 0x0007f800, NULL, HFILL }},
56540
56541
14
    {&hf_ieee80211_he_ndp_annc_reserved1,
56542
14
     {"Reserved", "wlan.he_ndp.sta_info.reserved1",
56543
14
      FT_UINT32, BASE_HEX, NULL, 0x07f80000, NULL, HFILL }},
56544
56545
14
    {&hf_ieee80211_he_ndp_annc_reserved2,
56546
14
     {"Reserved", "wlan.he_ndp.sta_info.reserved2",
56547
14
      FT_UINT32, BASE_HEX, NULL, 0xf0000000, NULL, HFILL }},
56548
56549
14
    {&hf_ieee80211_htc_ht_lac,
56550
14
     {"Link Adaptation Control (LAC)", "wlan.htc.lac",
56551
14
      FT_UINT32, BASE_HEX, NULL, 0x0000FFFE,
56552
14
      "High Throughput Control Link Adaptation Control (LAC)", HFILL }},
56553
56554
14
    {&hf_ieee80211_htc_lac_trq,
56555
14
     {"Training Request (TRQ)", "wlan.htc.lac.trq",
56556
14
      FT_BOOLEAN, 16, TFS(&htc_lac_trq_flag), 0x0002,
56557
14
      "High Throughput Control Link Adaptation Control Training Request (TRQ)", HFILL }},
56558
56559
14
    {&hf_ieee80211_htc_lac_mai_aseli,
56560
14
     {"Antenna Selection Indication (ASELI)", "wlan.htc.lac.mai.aseli",
56561
14
      FT_UINT16, BASE_HEX, NULL, 0x003C,
56562
14
      "High Throughput Control Link Adaptation Control MAI Antenna Selection Indication", HFILL }},
56563
56564
14
    {&hf_ieee80211_htc_lac_mai_mrq,
56565
14
     {"MCS Request (MRQ)", "wlan.htc.lac.mai.mrq",
56566
14
      FT_BOOLEAN, 16, TFS(&htc_lac_mai_mrq_flag), 0x0004,
56567
14
      "High Throughput Control Link Adaptation Control MAI MCS Request", HFILL }},
56568
56569
14
    {&hf_ieee80211_htc_lac_mai_msi,
56570
14
     {"MCS Request Sequence Identifier (MSI)", "wlan.htc.lac.mai.msi",
56571
14
      FT_UINT16, BASE_HEX, NULL, 0x0038,
56572
14
      "High Throughput Control Link Adaptation Control MAI MCS Request Sequence Identifier", HFILL }},
56573
56574
14
    {&hf_ieee80211_htc_lac_mai_reserved,
56575
14
     {"Reserved", "wlan.htc.lac.mai.reserved",
56576
14
      FT_UINT16, BASE_HEX, NULL, 0x0038,
56577
14
      "High Throughput Control Link Adaptation Control MAI Reserved", HFILL }},
56578
56579
14
    {&hf_ieee80211_htc_lac_mfsi,
56580
14
     {"MCS Feedback Sequence Identifier (MFSI)", "wlan.htc.lac.mfsi",
56581
14
      FT_UINT16, BASE_DEC, NULL, 0x01C0,
56582
14
      "High Throughput Control Link Adaptation Control MCS Feedback Sequence Identifier (MSI)", HFILL }},
56583
56584
14
    {&hf_ieee80211_htc_lac_asel_command,
56585
14
     {"Antenna Selection (ASEL) Command", "wlan.htc.lac.asel.command",
56586
14
      FT_UINT16, BASE_HEX, VALS(ieee80211_htc_lac_asel_command_flags), 0x0E00,
56587
14
      "High Throughput Control Link Adaptation Control Antenna Selection (ASEL) Command", HFILL }},
56588
56589
14
    {&hf_ieee80211_htc_lac_asel_data,
56590
14
     {"Antenna Selection (ASEL) Data", "wlan.htc.lac.asel.data",
56591
14
      FT_UINT16, BASE_HEX, NULL, 0xF000,
56592
14
      "High Throughput Control Link Adaptation Control Antenna Selection (ASEL) Data", HFILL }},
56593
56594
14
    {&hf_ieee80211_htc_lac_mfb,
56595
14
     {"MCS Feedback (MFB)", "wlan.htc.lac.mfb",
56596
14
      FT_UINT16, BASE_HEX, NULL, 0xFE00,
56597
14
      "High Throughput Control Link Adaptation Control MCS Feedback", HFILL }},
56598
56599
14
    {&hf_ieee80211_htc_cal_pos,
56600
14
     {"Calibration Position", "wlan.htc.cal.pos",
56601
14
      FT_UINT32, BASE_DEC, VALS(ieee80211_htc_cal_pos_flags), 0x00030000,
56602
14
      "High Throughput Control Calibration Position", HFILL }},
56603
56604
14
    {&hf_ieee80211_htc_cal_seq,
56605
14
     {"Calibration Sequence Identifier", "wlan.htc.cal.seq",
56606
14
      FT_UINT32, BASE_DEC, NULL, 0x000C0000,
56607
14
      "High Throughput Control Calibration Sequence Identifier", HFILL }},
56608
56609
14
    {&hf_ieee80211_htc_reserved1,
56610
14
     {"Reserved", "wlan.htc.reserved1",
56611
14
      FT_UINT32, BASE_HEX, NULL, 0x00300000,
56612
14
      "High Throughput Control Reserved", HFILL }},
56613
56614
14
    {&hf_ieee80211_htc_csi_steering,
56615
14
     {"CSI/Steering", "wlan.htc.csi_steering",
56616
14
      FT_UINT32, BASE_DEC, VALS(ieee80211_htc_csi_steering_flags), 0x00C00000,
56617
14
      "High Throughput Control CSI/Steering", HFILL }},
56618
56619
14
    {&hf_ieee80211_htc_ndp_announcement,
56620
14
     {"NDP Announcement", "wlan.htc.ndp_announcement",
56621
14
      FT_BOOLEAN, 32, TFS(&ieee80211_htc_ndp_announcement_flag), 0x01000000,
56622
14
      "High Throughput Control NDP Announcement", HFILL }},
56623
56624
14
    {&hf_ieee80211_htc_reserved2,
56625
14
     {"Reserved", "wlan.htc.reserved2",
56626
14
      FT_UINT32, BASE_HEX, NULL, 0x3E000000,
56627
14
      "High Throughput Control Reserved", HFILL }},
56628
56629
14
    {&hf_ieee80211_htc_mrq,
56630
14
     {"MRQ", "wlan.htc.mrq",
56631
14
      FT_BOOLEAN, 32, NULL, HTC_MRQ,
56632
14
      "VHT-MCS feedback request", HFILL }},
56633
56634
14
    {&hf_ieee80211_htc_msi,
56635
14
     {"MSI", "wlan.htc.msi",
56636
14
      FT_UINT32, BASE_DEC, NULL, 0x00000038,
56637
14
      "MRQ sequence number", HFILL }},
56638
56639
14
    {&hf_ieee80211_htc_msi_stbc_reserved,
56640
14
     {"Reserved", "wlan.htc.msi_stbc_reserved",
56641
14
      FT_UINT32, BASE_HEX, NULL, 0x00000038,
56642
14
      NULL, HFILL }},
56643
56644
14
    {&hf_ieee80211_htc_compressed_msi,
56645
14
     {"Compressed MSI", "wlan.htc.compressed_msi",
56646
14
      FT_UINT32, BASE_DEC, NULL, 0x00000018,
56647
14
      NULL, HFILL }},
56648
56649
14
    {&hf_ieee80211_htc_ppdu_stbc_encoded,
56650
14
     {"PPDU was STBC encoded", "wlan.htc.ppdu_stbc_encoded",
56651
14
      FT_BOOLEAN, 32, NULL, 0x00000020,
56652
14
      NULL, HFILL }},
56653
56654
14
    {&hf_ieee80211_htc_mfsi,
56655
14
     {"MFSI", "wlan.htc.mfsi",
56656
14
      FT_BOOLEAN, 32, NULL, 0x000001C0,
56657
14
      "MFB sequence identifier", HFILL }},
56658
56659
14
    {&hf_ieee80211_htc_gid_l,
56660
14
     {"GID-L", "wlan.htc.gid_l",
56661
14
      FT_BOOLEAN, 32, NULL, 0x000001C0,
56662
14
      "LSBs of group ID", HFILL }},
56663
56664
14
    {&hf_ieee80211_htc_mfb,
56665
14
     {"MFB", "wlan.htc.mfb",
56666
14
      FT_UINT32, BASE_HEX, NULL, 0x00FFFE00,
56667
14
      "Recommended MFB", HFILL }},
56668
56669
14
    {&hf_ieee80211_htc_num_sts,
56670
14
     {"NUM_STS", "wlan.htc.num_sts",
56671
14
      FT_UINT32, BASE_DEC, NULL, 0x00000E00,
56672
14
      "Recommended NUM_STS", HFILL }},
56673
56674
14
    {&hf_ieee80211_htc_vht_mcs,
56675
14
     {"VHT-MCS", "wlan.htc.vht_mcs",
56676
14
      FT_UINT32, BASE_DEC, NULL, 0x0000F000,
56677
14
      "Recommended VHT-MCS", HFILL }},
56678
56679
14
    {&hf_ieee80211_htc_bw,
56680
14
     {"BW", "wlan.htc.bw",
56681
14
      FT_UINT32, BASE_DEC, VALS(ieee80211_htc_bw_recommended_vht_mcs_vals), 0x00030000,
56682
14
      "Bandwidth for recommended VHT-MCS", HFILL }},
56683
56684
14
    {&hf_ieee80211_htc_s1g_num_sts,
56685
14
     {"NUM_STS", "wlan.htc.num_sts",
56686
14
      FT_UINT32, BASE_DEC, NULL, 0x00000600,
56687
14
      "Recommended NUM_STS", HFILL }},
56688
56689
14
    {&hf_ieee80211_htc_s1g_vht_mcs,
56690
14
     {"VHT-MCS", "wlan.htc.vht_mcs",
56691
14
      FT_UINT32, BASE_DEC, NULL, 0x00007800,
56692
14
      "Recommended VHT-MCS", HFILL }},
56693
56694
14
    {&hf_ieee80211_htc_s1g_bw,
56695
14
     {"BW", "wlan.htc.bw",
56696
14
      FT_UINT32, BASE_DEC, VALS(ieee80211_htc_s1g_bw_recommended_vht_mcs_vals), 0x00038000,
56697
14
      "Bandwidth for recommended VHT-MCS", HFILL }},
56698
56699
14
    {&hf_ieee80211_htc_snr,
56700
14
     {"SNR", "wlan.htc.snr",
56701
14
      FT_INT32, BASE_DEC, NULL, 0x00FC0000,
56702
14
      "Average SNR + 22", HFILL }},
56703
56704
14
    {&hf_ieee80211_htc_reserved3,
56705
14
     {"Reserved", "wlan.htc.reserved3",
56706
14
      FT_UINT32, BASE_HEX, NULL, 0x1F000000,
56707
14
      NULL, HFILL }},
56708
56709
14
    {&hf_ieee80211_htc_gid_h,
56710
14
     {"GID-H", "wlan.htc.gid_h",
56711
14
      FT_UINT32, BASE_DEC, NULL, 0x07000000,
56712
14
      NULL, HFILL }},
56713
56714
14
    {&hf_ieee80211_htc_coding_type,
56715
14
     {"Coding type", "wlan.htc.coding_type",
56716
14
      FT_UINT32, BASE_DEC, VALS(ieee80211_htc_coding_type_vals), 0x08000000,
56717
14
      NULL, HFILL }},
56718
56719
14
    {&hf_ieee80211_htc_fb_tx_type,
56720
14
     {"FB Tx type", "wlan.htc.fb_tx_type",
56721
14
      FT_UINT32, BASE_DEC, VALS(ieee80211_htc_fb_tx_type_vals), 0x10000000,
56722
14
      NULL, HFILL }},
56723
56724
14
    {&hf_ieee80211_htc_unsolicited_mfb,
56725
14
     {"Unsolicited MFB", "wlan.htc.unsolicited_mfb",
56726
14
      FT_BOOLEAN, 32, NULL, HTC_UNSOLICITED_MFB,
56727
14
      "High Throughput Control Unsolicited MFB", HFILL }},
56728
56729
14
    {&hf_ieee80211_htc_ac_constraint,
56730
14
     {"AC Constraint", "wlan.htc.ac_constraint",
56731
14
      FT_BOOLEAN, 32, NULL, 0x40000000,
56732
14
      "High Throughput Control AC Constraint", HFILL }},
56733
56734
14
    {&hf_ieee80211_htc_rdg_more_ppdu,
56735
14
     {"RDG/More PPDU", "wlan.htc.rdg_more_ppdu",
56736
14
      FT_BOOLEAN, 32, NULL, 0x80000000,
56737
14
      "High Throughput Control RDG/More PPDU", HFILL }},
56738
    /* End: HT Control (+HTC) */
56739
56740
    /* MDIE */
56741
14
    {&hf_ieee80211_tag_mobility_domain_mdid,
56742
14
     {"Mobility Domain Identifier", "wlan.mobility_domain.mdid",
56743
14
      FT_UINT16, BASE_HEX, NULL, 0,
56744
14
      NULL, HFILL }},
56745
56746
14
    {&hf_ieee80211_tag_mobility_domain_ft_capab,
56747
14
     {"FT Capability and Policy", "wlan.mobility_domain.ft_capab",
56748
14
      FT_UINT8, BASE_HEX, NULL, 0,
56749
14
      NULL, HFILL }},
56750
56751
14
    {&hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds,
56752
14
     {"Fast BSS Transition over DS",
56753
14
      "wlan.mobility_domain.ft_capab.ft_over_ds",
56754
14
      FT_UINT8, BASE_HEX, NULL, 0x01,
56755
14
      NULL, HFILL }},
56756
56757
14
    {&hf_ieee80211_tag_mobility_domain_ft_capab_resource_req,
56758
14
     {"Resource Request Protocol Capability",
56759
14
      "wlan.mobility_domain.ft_capab.resource_req",
56760
14
      FT_UINT8, BASE_HEX, NULL, 0x02,
56761
14
      NULL, HFILL }},
56762
56763
14
    {&hf_ieee80211_tag_mobility_domain_ft_capab_reserved,
56764
14
     {"Reserved",
56765
14
      "wlan.mobility_domain.ft_capab.reserved",
56766
14
      FT_UINT8, BASE_HEX, NULL, 0xfc,
56767
14
      NULL, HFILL }},
56768
56769
    /* FTIE */
56770
14
    {&hf_ieee80211_tag_ft_mic_control,
56771
14
     {"MIC Control", "wlan.ft.mic_control",
56772
14
      FT_UINT16, BASE_HEX, NULL, 0,
56773
14
      NULL, HFILL }},
56774
56775
14
    {&hf_ieee80211_tag_ft_mic_control_rsnxe_used,
56776
14
     {"RSNXE Used", "wlan.ft.mic_control.rsnxe_used",
56777
14
      FT_BOOLEAN, 16, TFS(&tfs_used_notused), 0x0001, NULL, HFILL }},
56778
56779
14
    {&hf_ieee80211_tag_ft_mic_control_mic_length,
56780
14
     {"MIC Length", "wlan.ft.mic_control.mic_length",
56781
14
      FT_UINT16, BASE_DEC, NULL, 0x000e, NULL, HFILL }},
56782
56783
14
    {&hf_ieee80211_tag_ft_mic_control_reserved,
56784
14
     {"Reserved", "wlan.ft.mic_control.reserved",
56785
14
      FT_UINT16, BASE_HEX, NULL, 0x00f0,
56786
14
      NULL, HFILL }},
56787
56788
14
    {&hf_ieee80211_tag_ft_mic_control_element_count,
56789
14
     {"Element Count", "wlan.ft.mic_control.element_count",
56790
14
      FT_UINT16, BASE_DEC, NULL, 0xff00,
56791
14
      NULL, HFILL }},
56792
56793
14
    {&hf_ieee80211_tag_ft_mic,
56794
14
     {"MIC", "wlan.ft.mic",
56795
14
      FT_BYTES, BASE_NONE, NULL, 0,
56796
14
      NULL, HFILL }},
56797
56798
14
    {&hf_ieee80211_tag_ft_anonce,
56799
14
     {"ANonce", "wlan.ft.anonce",
56800
14
      FT_BYTES, BASE_NONE, NULL, 0,
56801
14
      NULL, HFILL }},
56802
56803
14
    {&hf_ieee80211_tag_ft_snonce,
56804
14
     {"SNonce", "wlan.ft.snonce",
56805
14
      FT_BYTES, BASE_NONE, NULL, 0,
56806
14
      NULL, HFILL }},
56807
56808
14
    {&hf_ieee80211_tag_ft_subelem_id,
56809
14
     {"Subelement ID", "wlan.ft.subelem.id",
56810
14
      FT_UINT8, BASE_DEC, VALS(ft_subelem_id_vals), 0,
56811
14
      NULL, HFILL }},
56812
56813
14
    {&hf_ieee80211_tag_ft_subelem_len,
56814
14
     {"Length", "wlan.ft.subelem.len",
56815
14
      FT_UINT8, BASE_DEC, NULL, 0,
56816
14
      NULL, HFILL }},
56817
56818
14
    {&hf_ieee80211_tag_ft_subelem_data,
56819
14
     {"Data", "wlan.ft.subelem.data",
56820
14
      FT_BYTES, BASE_NONE, NULL, 0,
56821
14
      NULL, HFILL }},
56822
56823
14
    {&hf_ieee80211_tag_ft_subelem_r1kh_id,
56824
14
     {"PMK-R1 key holder identifier (R1KH-ID)", "wlan.ft.subelem.r1kh_id",
56825
14
      FT_BYTES, BASE_NONE, NULL, 0,
56826
14
      NULL, HFILL }},
56827
56828
14
    {&hf_ieee80211_tag_ft_subelem_gtk_key_info,
56829
14
     {"Key Info", "wlan.ft.subelem.gtk.key_info",
56830
14
      FT_UINT16, BASE_HEX, NULL, 0,
56831
14
      NULL, HFILL }},
56832
56833
14
    {&hf_ieee80211_tag_ft_subelem_gtk_key_id,
56834
14
     {"Key ID", "wlan.ft.subelem.gtk.key_id",
56835
14
      FT_UINT16, BASE_DEC, NULL, 0x0003,
56836
14
      NULL, HFILL }},
56837
56838
14
    {&hf_ieee80211_tag_ft_subelem_gtk_key_length,
56839
14
     {"Key Length", "wlan.ft.subelem.gtk.key_length",
56840
14
      FT_UINT8, BASE_DEC, NULL, 0,
56841
14
      NULL, HFILL }},
56842
56843
14
    {&hf_ieee80211_tag_ft_subelem_gtk_rsc,
56844
14
     {"RSC", "wlan.ft.subelem.gtk.rsc",
56845
14
      FT_BYTES, BASE_NONE, NULL, 0,
56846
14
      NULL, HFILL }},
56847
56848
14
    {&hf_ieee80211_tag_ft_subelem_gtk_key,
56849
14
     {"GTK", "wlan.ft.subelem.gtk.key",
56850
14
      FT_BYTES, BASE_NONE, NULL, 0,
56851
14
      NULL, HFILL }},
56852
56853
14
    {&hf_ieee80211_tag_ft_subelem_gtk_key_encrypted,
56854
14
     {"GTK (encrypted)", "wlan.ft.subelem.gtk.key_encrypted",
56855
14
      FT_BYTES, BASE_NONE, NULL, 0,
56856
14
      NULL, HFILL }},
56857
56858
14
    {&hf_ieee80211_tag_ft_subelem_r0kh_id,
56859
14
     {"PMK-R0 key holder identifier (R0KH-ID)", "wlan.ft.subelem.r0kh_id",
56860
14
      FT_BYTES, BASE_NONE, NULL, 0,
56861
14
      NULL, HFILL }},
56862
56863
14
    {&hf_ieee80211_tag_ft_subelem_igtk_key_id,
56864
14
     {"Key ID", "wlan.ft.subelem.igtk.key_id",
56865
14
      FT_UINT16, BASE_DEC, NULL, 0,
56866
14
      NULL, HFILL }},
56867
56868
14
    {&hf_ieee80211_tag_ft_subelem_igtk_ipn,
56869
14
     {"IPN", "wlan.ft.subelem.igtk.ipn",
56870
14
      FT_BYTES, BASE_NONE, NULL, 0,
56871
14
      NULL, HFILL }},
56872
56873
14
    {&hf_ieee80211_tag_ft_subelem_igtk_key_length,
56874
14
     {"Key Length", "wlan.ft.subelem.igtk.key_length",
56875
14
      FT_UINT8, BASE_DEC, NULL, 0,
56876
14
      NULL, HFILL }},
56877
56878
14
    {&hf_ieee80211_tag_ft_subelem_igtk_key,
56879
14
     {"Wrapped Key (IGTK)", "wlan.ft.subelem.igtk.key",
56880
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
56881
56882
14
    {&hf_ieee80211_tag_ft_subelem_oci_op_class,
56883
14
     {"Operating Class", "wlan.ft.subelem.oci.operating_class",
56884
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
56885
56886
14
    {&hf_ieee80211_tag_ft_subelem_oci_prim_chan_num,
56887
14
     {"Primary Channel Number", "wlan.ft.subelem.oci.primary_channel_number",
56888
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
56889
56890
14
    {&hf_ieee80211_tag_ft_subelem_oci_freq_seg_1,
56891
14
     {"Frequency Segment 1 Channel Number",
56892
14
      "wlan.ft.subelem.oci.frequency_segment_1_channel_number",
56893
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
56894
56895
14
    {&hf_ieee80211_tag_ft_subelem_oci_oct_op_class,
56896
14
     {"OCT Operating Class", "wlan.ft.subelem.oci.oct_operating_class",
56897
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
56898
56899
14
    {&hf_ieee80211_tag_ft_subelem_oci_oct_prim_chan_num,
56900
14
     {"OCT Primary Channel Number",
56901
14
      "wlan.ft.subelem.oci.oct_primary_channel_number",
56902
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
56903
56904
14
    {&hf_ieee80211_tag_ft_subelem_oci_oct_freq_seg_1,
56905
14
     {"OCT Frequency Segment 1 Channel Number",
56906
14
      "wlan.ft.subelem.oci.oct_frequency_segment_1_channel_number",
56907
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
56908
56909
14
    {&hf_ieee80211_tag_ft_subelem_bigtk_key_id,
56910
14
     {"Key ID", "wlan.ft.subelem.bigtk.key_id",
56911
14
      FT_UINT16, BASE_DEC, NULL, 0,
56912
14
      NULL, HFILL }},
56913
56914
14
    {&hf_ieee80211_tag_ft_subelem_bigtk_bipn,
56915
14
     {"BIPN", "wlan.ft.subelem.bigtk.bipn",
56916
14
      FT_BYTES, BASE_NONE, NULL, 0,
56917
14
      NULL, HFILL }},
56918
56919
14
    {&hf_ieee80211_tag_ft_subelem_bigtk_key_length,
56920
14
     {"Key Length", "wlan.ft.subelem.bigtk.key_length",
56921
14
      FT_UINT8, BASE_HEX, NULL, 0,
56922
14
      NULL, HFILL }},
56923
56924
14
    {&hf_ieee80211_tag_ft_subelem_bigtk_key,
56925
14
     {"Wrapped Key (BIGTK)", "wlan.ft.subelem.bigtk.key",
56926
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
56927
56928
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_key_info,
56929
14
     {"Key Info", "wlan.ft.subelem.mlo_gtk.key_info",
56930
14
      FT_UINT16, BASE_HEX, NULL, 0,
56931
14
      NULL, HFILL }},
56932
56933
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_key_id,
56934
14
     {"Key ID", "wlan.ft.subelem.mlo_gtk.key_id",
56935
14
      FT_UINT16, BASE_DEC, NULL, 0x0003,
56936
14
      NULL, HFILL }},
56937
56938
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_link_id_info,
56939
14
     {"Link ID Info", "wlan.ft.subelem.mlo_gtk.link_id_info",
56940
14
      FT_UINT8, BASE_HEX, NULL, 0,
56941
14
      NULL, HFILL }},
56942
56943
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_link_id,
56944
14
     {"Link ID", "wlan.ft.subelem.mlo_gtk.link_id",
56945
14
      FT_UINT8, BASE_DEC, NULL, 0x0f,
56946
14
      NULL, HFILL }},
56947
56948
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_key_length,
56949
14
     {"Key Length", "wlan.ft.subelem.mlo_gtk.key_length",
56950
14
      FT_UINT8, BASE_HEX, NULL, 0,
56951
14
      NULL, HFILL }},
56952
56953
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_rsc,
56954
14
     {"RSC", "wlan.ft.subelem.mlo_gtk.rsc",
56955
14
      FT_BYTES, BASE_NONE, NULL, 0,
56956
14
      NULL, HFILL }},
56957
56958
14
    {&hf_ieee80211_tag_ft_subelem_mlo_gtk_key,
56959
14
     {"Wrapped Key (MLO GTK)", "wlan.ft.subelem.mlo_gtk.key",
56960
14
      FT_BYTES, BASE_NONE, NULL, 0,
56961
14
      NULL, HFILL }},
56962
56963
14
    {&hf_ieee80211_tag_ft_subelem_mlo_igtk_key_id,
56964
14
     {"Key ID", "wlan.ft.subelem.mlo_igtk.key_id",
56965
14
      FT_UINT16, BASE_DEC, NULL, 0,
56966
14
      NULL, HFILL }},
56967
56968
14
    {&hf_ieee80211_tag_ft_subelem_mlo_igtk_ipn,
56969
14
     {"IPN", "wlan.ft.subelem.mlo_igtk.ipn",
56970
14
      FT_BYTES, BASE_NONE, NULL, 0,
56971
14
      NULL, HFILL }},
56972
56973
14
    {&hf_ieee80211_tag_ft_subelem_mlo_igtk_link_id_info,
56974
14
     {"Link ID Info", "wlan.ft.subelem.mlo_igtk.link_id_info",
56975
14
      FT_UINT8, BASE_HEX, NULL, 0,
56976
14
      NULL, HFILL }},
56977
56978
14
    {&hf_ieee80211_tag_ft_subelem_mlo_igtk_link_id,
56979
14
     {"Link ID", "wlan.ft.subelem.mlo_igtk.link_id",
56980
14
      FT_UINT8, BASE_DEC, NULL, 0x0f,
56981
14
      NULL, HFILL }},
56982
56983
14
    {&hf_ieee80211_tag_ft_subelem_mlo_igtk_key_length,
56984
14
     {"Key Length", "wlan.ft.subelem.mlo_igtk.key_length",
56985
14
      FT_UINT8, BASE_HEX, NULL, 0,
56986
14
      NULL, HFILL }},
56987
56988
14
    {&hf_ieee80211_tag_ft_subelem_mlo_igtk_key,
56989
14
     {"Wrapped Key (MLO IGTK)", "wlan.ft.subelem.mlo_igtk.key",
56990
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
56991
56992
14
    {&hf_ieee80211_tag_ft_subelem_mlo_bigtk_key_id,
56993
14
     {"Key ID", "wlan.ft.subelem.mlo_bigtk.key_id",
56994
14
      FT_UINT16, BASE_DEC, NULL, 0,
56995
14
      NULL, HFILL }},
56996
56997
14
    {&hf_ieee80211_tag_ft_subelem_mlo_bigtk_bipn,
56998
14
     {"BIPN", "wlan.ft.subelem.mlo_bigtk.bipn",
56999
14
      FT_BYTES, BASE_NONE, NULL, 0,
57000
14
      NULL, HFILL }},
57001
57002
14
    {&hf_ieee80211_tag_ft_subelem_mlo_bigtk_link_id,
57003
14
     {"Link ID", "wlan.ft.subelem.mlo_bigtk.link_id",
57004
14
      FT_UINT8, BASE_DEC, NULL, 0x0f,
57005
14
      NULL, HFILL }},
57006
57007
14
    {&hf_ieee80211_tag_ft_subelem_mlo_bigtk_link_id_info,
57008
14
     {"Link ID Info", "wlan.ft.subelem.mlo_bigtk.link_id_info",
57009
14
      FT_UINT8, BASE_HEX, NULL, 0,
57010
14
      NULL, HFILL }},
57011
57012
14
    {&hf_ieee80211_tag_ft_subelem_mlo_bigtk_key_length,
57013
14
     {"Key Length", "wlan.ft.subelem.mlo_bigtk.key_length",
57014
14
      FT_UINT8, BASE_HEX, NULL, 0,
57015
14
      NULL, HFILL }},
57016
57017
14
    {&hf_ieee80211_tag_ft_subelem_mlo_bigtk_key,
57018
14
     {"Wrapped Key (MLO BIGTK)", "wlan.ft.subelem.mlo_bigtk.key",
57019
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57020
57021
    /* RIC Data IE: 802.11-2012: 8.4.2.52 */
57022
14
    {&hf_ieee80211_tag_ric_data_id,
57023
14
     {"Resource Handshake Identifier", "wlan.ric_data.id",
57024
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57025
57026
14
    {&hf_ieee80211_tag_ric_data_desc_cnt,
57027
14
     {"Resource Descriptor Count", "wlan.ric_data.desc_cnt",
57028
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57029
57030
14
    {&hf_ieee80211_tag_ric_data_status_code,
57031
14
     {"Status Code", "wlan.ric_data.status_code",
57032
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
57033
14
      "Status of requested Resource", HFILL }},
57034
57035
    /* OBSS IE: 802.11-2012: 8.4.2.61 */
57036
14
    {&hf_ieee80211_tag_obss_spd,
57037
14
     {"Scan Passive Dwell", "wlan.obss.spd",
57038
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57039
57040
14
    {&hf_ieee80211_tag_obss_sad,
57041
14
     {"Scan Active Dwell", "wlan.obss.sad",
57042
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57043
57044
14
    {&hf_ieee80211_tag_obss_cwtsi,
57045
14
     {"Channel Width Trigger Scan Interval", "wlan.obss.cwtsi",
57046
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57047
57048
14
    {&hf_ieee80211_tag_obss_sptpc,
57049
14
     {"Scan Passive Total Per Channel", "wlan.obss.sptpc",
57050
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57051
57052
14
    {&hf_ieee80211_tag_obss_satpc,
57053
14
     {"Scan Active Total Per Channel", "wlan.obss.satpc",
57054
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57055
57056
14
    {&hf_ieee80211_tag_obss_wctdf,
57057
14
     {"Width Channel Transition Delay Factor", "wlan.obss.wctdf",
57058
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57059
57060
14
    {&hf_ieee80211_tag_obss_sat,
57061
14
     {"Scan Activity Threshold", "wlan.obss.sat",
57062
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57063
57064
    /* Group Data Cypher Suite: 802.11-2012: 8.4.2.25.1 */
57065
14
    {&hf_ieee80211_group_data_cipher_suite_oui,
57066
14
     {"Group Data Cypher Suite OUI", "wlan.osen.gdcs.oui",
57067
14
      FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
57068
57069
    /* TODO: List the suite names ... */
57070
14
    {&hf_ieee80211_group_data_cipher_suite_type,
57071
14
     {"Group Data Cypher Suite type", "wlan.osen.gdcs.type",
57072
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57073
57074
14
    {&hf_ieee80211_osen_pcs_count,
57075
14
     {"OSEN Pairwise Cipher Suite Count", "wlan.osen.pwcs.count",
57076
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57077
57078
14
    {&hf_ieee80211_osen_pairwise_cipher_suite_oui,
57079
14
     {"OSEN Pairwise Cypher Suite OUI", "wlan.osen.pwcs.oui",
57080
14
      FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
57081
57082
14
    {&hf_ieee80211_osen_pairwise_cipher_suite_type,
57083
14
     {"OSEN Pairwise Cypher Suite type", "wlan.osen.pwcs.type",
57084
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57085
57086
14
    {&hf_ieee80211_osen_akm_count,
57087
14
     {"OSEN AKM Cipher Suite Count", "wlan.osen.akms.count",
57088
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57089
57090
14
    {&hf_ieee80211_osen_akm_cipher_suite_oui,
57091
14
     {"OSEN AKM Cipher Suite OUI", "wlan.osen.akms.oui",
57092
14
      FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
57093
57094
14
    {&hf_ieee80211_osen_akm_cipher_suite_type,
57095
14
     {"OSEN AKM Cipher Suite Type", "wlan.osen.akms.type",
57096
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57097
57098
14
    {&hf_ieee80211_osen_rsn_cap_preauth,
57099
14
     {"RSN Pre-Auth capabilities", "wlan.osen.rsn.capabilities.preauth",
57100
14
      FT_BOOLEAN, 16, TFS(&rsn_preauth_flags), 0x0001, NULL, HFILL }},
57101
57102
14
    {&hf_ieee80211_osen_rsn_cap_no_pairwise,
57103
14
     {"RSN No Pairwise capabilities", "wlan.osen.rsn.capabilities.no_pairwise",
57104
14
      FT_BOOLEAN, 16, TFS(&rsn_no_pairwise_flags), 0x0002, NULL, HFILL }},
57105
57106
14
    {&hf_ieee80211_osen_rsn_cap_ptksa_replay_counter,
57107
14
     {"RSN PTKSA Replay Counter capabilities",
57108
14
                "wlan.osen.rsn.capabilities.ptksa_replay_counter",
57109
14
      FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x000C, NULL, HFILL }},
57110
57111
14
    {&hf_ieee80211_osen_rsn_cap_gtksa_replay_counter,
57112
14
     {"RSN GTKSA Replay Counter capabilities",
57113
14
                "wlan.osen.rsn.capabilities.gtksa_replay_counter",
57114
14
      FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x0030, NULL, HFILL }},
57115
57116
14
    {&hf_ieee80211_osen_group_management_cipher_suite_oui,
57117
14
     {"OSEN Group Management Cipher Suite OUI", "wlan.osen.gmcs.oui",
57118
14
      FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
57119
57120
14
    {&hf_ieee80211_osen_group_management_cipher_suite_type,
57121
14
     {"OSEN Group Management Cipher Suite Type", "wlan.osen.gmcs.type",
57122
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57123
57124
14
    {&hf_ieee80211_osen_rsn_cap_mfpr,
57125
14
     {"Management Frame Protection Required", "wlan.osen.rsn.capabilities.mfpr",
57126
14
      FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0040, NULL, HFILL }},
57127
57128
14
    {&hf_ieee80211_osen_rsn_cap_mfpc,
57129
14
     {"Management Frame Protection Capable", "wlan.osen.rsn.capabilities.mfpc",
57130
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x0080, NULL, HFILL }},
57131
57132
14
    {&hf_ieee80211_osen_rsn_cap_jmr,
57133
14
     {"Joint Multi-band RSNA", "wlan.osen.rsn.capabilities.jmr",
57134
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
57135
57136
14
    {&hf_ieee80211_osen_rsn_cap_peerkey,
57137
14
     {"PeerKey Enabled", "wlan.osen.rsn.capabilities.peerkey",
57138
14
      FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), 0x0200, NULL, HFILL }},
57139
57140
14
    {&hf_ieee80211_osen_rsn_cap_flags,
57141
14
     {"RSN Capability Flags", "wlan.osen.rsn.capabilities.flags",
57142
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
57143
57144
14
    {&hf_ieee80211_osen_rsn_spp_a_msdu_capable,
57145
14
     {"SPP A-MSDU Capable", "wlan.osen.rsn.capabilities.spp_a_msdu_cap",
57146
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x0400, NULL, HFILL }},
57147
57148
14
    {&hf_ieee80211_osen_rsn_spp_a_msdu_required,
57149
14
     {"SPP A-MSDU Required", "wlan.osen.rsn.capabilities.spp_a_msdu_req",
57150
14
      FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0800, NULL, HFILL }},
57151
57152
14
    {&hf_ieee80211_osen_rsn_pbac,
57153
14
     {"Protected Block Ack Agreement Capable", "wlan.osen.rsn.capabilities.pbac",
57154
14
      FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x1000, NULL, HFILL }},
57155
57156
14
    {&hf_ieee80211_osen_extended_key_id_iaf,
57157
14
     {"Extended Key ID for Individually Addressed Frames",
57158
14
      "wlan.osn.rsn.extended_key_id_iaf",
57159
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
57160
57161
14
    {&hf_ieee80211_osen_reserved,
57162
14
     {"Reserved", "wlan.osen.rsn.capabilities.reserved",
57163
14
      FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
57164
57165
14
    {&hf_ieee80211_osen_pmkid_count,
57166
14
     {"OSEN PMKID Count", "wlan.osen.pmkid.count",
57167
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57168
57169
14
    {&hf_ieee80211_osen_pmkid,
57170
14
     {"OSEN PKMID", "wlan.osen.pmkid.bytes",
57171
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57172
57173
    /* RIC Descriptor IE: 802.11-2012: 8.4.2.53 */
57174
14
    {&hf_ieee80211_tag_ric_desc_rsrc_type,
57175
14
     {"Resource Type", "wlan.ric_desc.rsrc_type",
57176
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57177
57178
14
    {&hf_ieee80211_tag_ric_desc_var_params,
57179
14
     {"Variable Params", "wlan.ric_desc.var_params",
57180
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57181
57182
    /* MMIE */
57183
14
    {&hf_ieee80211_tag_mmie_keyid,
57184
14
     {"KeyID", "wlan.mmie.keyid",
57185
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57186
57187
14
    {&hf_ieee80211_tag_mmie_ipn,
57188
14
     {"IPN", "wlan.mmie.ipn",
57189
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57190
57191
14
    {&hf_ieee80211_tag_mmie_mic,
57192
14
     {"MIC", "wlan.mmie.mic",
57193
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57194
57195
    /* Non Transmitted BSSID Capability */
57196
14
    {&hf_ieee80211_tag_no_bssid_capability_dmg_bss_control,
57197
14
     {"DMG BSS Control", "wlan.no_bssid_capability.dmg_bss_control",
57198
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
57199
57200
14
    {&hf_ieee80211_tag_no_bssid_capability_dmg_bss_control_type,
57201
14
     {"Type", "wlan.no_bssid_capability.dmg_bss_control.type",
57202
14
      FT_UINT8, BASE_DEC, NULL, 0x03, NULL, HFILL }},
57203
57204
14
    {&hf_ieee80211_tag_no_bssid_capability_dmg_bss_control_reserved,
57205
14
     {"Reserved", "wlan.no_bssid_capability.dmg_bss_control.reserved",
57206
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
57207
57208
    /* Multiple BSSID Index */
57209
14
    {&hf_ieee80211_tag_multiple_bssid_index_bssid_index,
57210
14
     {"BSSID Index", "wlan.multiple_bssid_index.bssid_index",
57211
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57212
57213
14
    {&hf_ieee80211_tag_multiple_bssid_index_dtim_period,
57214
14
     {"DTIM Period", "wlan.multiple_bssid_index.dtim_period",
57215
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57216
57217
14
    {&hf_ieee80211_tag_multiple_bssid_index_dtim_count,
57218
14
     {"DTIM Count", "wlan.multiple_bssid_index.dtim_count",
57219
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57220
57221
    /* WAPI Parameter Set*/
57222
14
    {&hf_ieee80211_tag_wapi_param_set_version,
57223
14
     {"Version", "wlan.wapi.version",
57224
14
      FT_UINT16, BASE_DEC, NULL, 0,
57225
14
      NULL, HFILL }},
57226
57227
14
    {&hf_ieee80211_tag_wapi_param_set_akm_suite_count,
57228
14
     {"AKM Suite Count", "wlan.wapi.akm_suite.count",
57229
14
      FT_UINT16, BASE_DEC, NULL, 0,
57230
14
      NULL, HFILL }},
57231
57232
14
    {&hf_ieee80211_tag_wapi_param_set_akm_suite_oui,
57233
14
     {"AKM Suite OUI", "wlan.wapi.akm_suite.oui",
57234
14
      FT_UINT24, BASE_OUI, NULL, 0,
57235
14
      NULL, HFILL }},
57236
57237
14
    {&hf_ieee80211_tag_wapi_param_set_akm_suite_type,
57238
14
     {"AKM Suite Type", "wlan.wapi.akm_suite.type",
57239
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_suite_type) , 0,
57240
14
      NULL, HFILL }},
57241
57242
14
    {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count,
57243
14
     {"Unicast Cipher Suite Count", "wlan.wapi.unicast_cipher.suite.count",
57244
14
      FT_UINT16, BASE_DEC, NULL, 0,
57245
14
      NULL, HFILL }},
57246
57247
14
    {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui,
57248
14
     {"Unicast Cipher Suite OUI", "wlan.wapi.unicast_cipher.suite.oui",
57249
14
      FT_UINT24, BASE_OUI, NULL, 0,
57250
14
      NULL, HFILL }},
57251
57252
14
    {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type,
57253
14
     {"Unicast Cipher Suite Type", "wlan.wapi.unicast_cipher.suite.type",
57254
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_cipher_type) , 0,
57255
14
      NULL, HFILL }},
57256
57257
14
    {&hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui,
57258
14
     {"Multicast Cipher Suite OUI", "wlan.wapi.multicast_cipher.suite.oui",
57259
14
      FT_UINT24, BASE_OUI, NULL, 0,
57260
14
      NULL, HFILL }},
57261
57262
14
    {&hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type,
57263
14
     {"Multicast Cipher Suite Type", "wlan.wapi.multicast_cipher.suite.type",
57264
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_cipher_type) , 0,
57265
14
      NULL, HFILL }},
57266
57267
14
    {&hf_ieee80211_tag_wapi_param_set_capab,
57268
14
     {"WAPI Capability Info", "wlan.wapi.capab",
57269
14
      FT_UINT16, BASE_HEX, NULL, 0,
57270
14
      NULL, HFILL }},
57271
57272
14
    {&hf_ieee80211_tag_wapi_param_set_capab_preauth,
57273
14
     {"Supports Preauthentication?", "wlan.wapi.capab.preauth",
57274
14
      FT_BOOLEAN, 16 , NULL, 0x0001,
57275
14
      NULL, HFILL }},
57276
57277
14
    {&hf_ieee80211_tag_wapi_param_set_capab_rsvd,
57278
14
     {"Reserved", "wlan.wapi.capab.rsvd",
57279
14
      FT_UINT16, BASE_DEC , NULL, 0xFFFE,
57280
14
      NULL, HFILL }},
57281
57282
14
    {&hf_ieee80211_tag_wapi_param_set_bkid_count,
57283
14
     {"No of BKID's", "wlan.wapi.bkid.count",
57284
14
      FT_UINT16, BASE_DEC, NULL, 0,
57285
14
      NULL, HFILL }},
57286
57287
14
    {&hf_ieee80211_tag_wapi_param_set_bkid_list,
57288
14
     {"BKID", "wlan.wapi.bkid",
57289
14
      FT_BYTES, BASE_NONE, NULL, 0,
57290
14
      NULL, HFILL }},
57291
57292
    /* BSS Max Idle Period */
57293
14
    {&hf_ieee80211_tag_bss_max_idle_period,
57294
14
     {"Max Idle Period (1000 TUs)", "wlan.bss_max_idle.period",
57295
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57296
57297
14
    {&hf_ieee80211_tag_bss_max_idle_options,
57298
14
     {"Idle Options", "wlan.bss_max_idle.options",
57299
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57300
57301
14
    {&hf_ieee80211_tag_bss_max_idle_options_protected,
57302
14
     {"Protected Keep-Alive Required",
57303
14
      "wlan.bss_max_idle.options.protected",
57304
14
      FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
57305
57306
14
    {&hf_ieee80211_tag_bss_idle_options_reserved,
57307
14
     {"Reserved", "wlan.bss_max_idle.options.reserved",
57308
14
      FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
57309
57310
    /* TFS Request */
57311
14
    {&hf_ieee80211_tag_tfs_request_id,
57312
14
     {"TFS ID", "wlan.tfs_request.id",
57313
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57314
57315
14
    {&hf_ieee80211_tag_tfs_request_ac_delete_after_match,
57316
14
     {"TFS Action Code - Delete after match",
57317
14
      "wlan.tfs_request.action_code.delete_after_match",
57318
14
      FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
57319
57320
14
    {&hf_ieee80211_tag_tfs_request_ac_notify,
57321
14
     {"TFS Action Code - Notify",
57322
14
      "wlan.tfs_request.action_code.notify",
57323
14
      FT_UINT8, BASE_DEC, NULL, 0x02, NULL, HFILL }},
57324
57325
14
    {&hf_ieee80211_tag_tfs_request_subelem_id,
57326
14
     {"Subelement ID", "wlan.tfs_request.subelem.id",
57327
14
      FT_UINT8, BASE_DEC, VALS(tfs_request_subelem_ids), 0,
57328
14
      "TFS Request Subelement ID", HFILL }},
57329
57330
14
    {&hf_ieee80211_tag_tfs_request_subelem_len,
57331
14
     {"Length", "wlan.tfs_request.subelem.len",
57332
14
      FT_UINT8, BASE_DEC, NULL, 0,
57333
14
      "TFS Request Subelement Length", HFILL }},
57334
57335
14
    {&hf_ieee80211_tag_tfs_request_subelem,
57336
14
     {"Subelement Data", "wlan.tfs_request.subelem",
57337
14
      FT_BYTES, BASE_NONE, NULL, 0,
57338
14
      "TFS Request Subelement Data", HFILL }},
57339
57340
    /* TFS Response */
57341
14
    {&hf_ieee80211_tag_tfs_response_subelem_id,
57342
14
     {"Subelement ID", "wlan.tfs_response.subelem.id",
57343
14
      FT_UINT8, BASE_DEC, VALS(tfs_response_subelem_ids), 0,
57344
14
      "TFS Response Subelement ID", HFILL }},
57345
57346
14
    {&hf_ieee80211_tag_tfs_response_subelem_len,
57347
14
     {"Length", "wlan.tfs_response.subelem.len",
57348
14
      FT_UINT8, BASE_DEC, NULL, 0,
57349
14
      "TFS Response Subelement Length", HFILL }},
57350
57351
14
    {&hf_ieee80211_tag_tfs_response_subelem,
57352
14
     {"Subelement Data", "wlan.tfs_response.subelem",
57353
14
      FT_BYTES, BASE_NONE, NULL, 0,
57354
14
      "TFS Response Subelement Data", HFILL }},
57355
57356
14
    {&hf_ieee80211_tag_tfs_response_status,
57357
14
     {"TFS Response Status", "wlan.tfs_response.status",
57358
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57359
57360
14
    {&hf_ieee80211_tag_tfs_response_id,
57361
14
     {"TFS ID", "wlan.tfs_response.tfs_id",
57362
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57363
57364
    /* WNM-Sleep Mode */
57365
14
    {&hf_ieee80211_tag_wnm_sleep_mode_action_type,
57366
14
     {"Action Type", "wlan.wnm_sleep_mode.action_type",
57367
14
      FT_UINT8, BASE_DEC, VALS(wnm_sleep_mode_action_types), 0,
57368
14
      "WNM-Sleep Mode Action Type", HFILL }},
57369
57370
14
    {&hf_ieee80211_tag_wnm_sleep_mode_response_status,
57371
14
     {"WNM-Sleep Mode Response Status",
57372
14
      "wlan.wnm_sleep_mode.response_status",
57373
14
      FT_UINT8, BASE_DEC, VALS(wnm_sleep_mode_response_status_vals), 0, NULL,
57374
14
      HFILL }},
57375
57376
14
    {&hf_ieee80211_tag_wnm_sleep_mode_interval,
57377
14
     {"WNM-Sleep Interval", "wlan.wnm_sleep_mode.interval",
57378
14
      FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
57379
57380
14
    {&hf_ieee80211_wnm_sub_elt_id,
57381
14
     {"Subelement ID", "wlan.wnm_subelt.id",
57382
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57383
57384
14
    {&hf_ieee80211_wnm_sub_elt_len,
57385
14
     {"Subelement len", "wlan.wnm_subelt.len",
57386
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57387
57388
    /* Time Advertisement */
57389
14
    {&hf_ieee80211_tag_time_adv_timing_capab,
57390
14
     {"Timing capabilities", "wlan.time_adv.timing_capab",
57391
14
      FT_UINT8, BASE_DEC, VALS(time_adv_timing_capab_vals), 0,
57392
14
      NULL, HFILL }},
57393
57394
14
    {&hf_ieee80211_tag_time_adv_time_value,
57395
14
     {"Time Value", "wlan.time_adv.time_value",
57396
14
      FT_BYTES, BASE_NONE, NULL, 0,
57397
14
      NULL, HFILL }},
57398
57399
14
    {&hf_ieee80211_tag_time_adv_time_value_year,
57400
14
     {"Time Value: Year", "wlan.time_adv.time_value.year",
57401
14
      FT_UINT16, BASE_DEC, NULL, 0,
57402
14
      NULL, HFILL }},
57403
57404
14
    {&hf_ieee80211_tag_time_adv_time_value_month,
57405
14
     {"Time Value: Month", "wlan.time_adv.time_value.month",
57406
14
      FT_UINT8, BASE_DEC, NULL, 0,
57407
14
      NULL, HFILL }},
57408
57409
14
    {&hf_ieee80211_tag_time_adv_time_value_day,
57410
14
     {"Time Value: Day", "wlan.time_adv.time_value.day",
57411
14
      FT_UINT8, BASE_DEC, NULL, 0,
57412
14
      NULL, HFILL }},
57413
57414
14
    {&hf_ieee80211_tag_time_adv_time_value_hours,
57415
14
     {"Time Value: Hours", "wlan.time_adv.time_value.hours",
57416
14
      FT_UINT8, BASE_DEC, NULL, 0,
57417
14
      NULL, HFILL }},
57418
57419
14
    {&hf_ieee80211_tag_time_adv_time_value_minutes,
57420
14
     {"Time Value: Minutes", "wlan.time_adv.time_value.minutes",
57421
14
      FT_UINT8, BASE_DEC, NULL, 0,
57422
14
      NULL, HFILL }},
57423
57424
14
    {&hf_ieee80211_tag_time_adv_time_value_seconds,
57425
14
     {"Time Value: Seconds", "wlan.time_adv.time_value.seconds",
57426
14
      FT_UINT8, BASE_DEC, NULL, 0,
57427
14
      NULL, HFILL }},
57428
57429
14
    {&hf_ieee80211_tag_time_adv_time_value_milliseconds,
57430
14
     {"Time Value: Milliseconds", "wlan.time_adv.time_value.milliseconds",
57431
14
      FT_UINT16, BASE_DEC, NULL, 0,
57432
14
      NULL, HFILL }},
57433
57434
14
    {&hf_ieee80211_tag_time_adv_time_value_reserved,
57435
14
     {"Time Value: Reserved", "wlan.time_adv.time_value.reserved",
57436
14
      FT_UINT8, BASE_DEC, NULL, 0,
57437
14
      NULL, HFILL }},
57438
57439
14
    {&hf_ieee80211_tag_time_adv_time_error,
57440
14
     {"Time Error", "wlan.time_adv.time_error",
57441
14
      FT_BYTES, BASE_NONE, NULL, 0,
57442
14
      NULL, HFILL }},
57443
57444
14
    {&hf_ieee80211_tag_time_adv_time_update_counter,
57445
14
     {"Time Update Counter", "wlan.time_adv.time_update_counter",
57446
14
      FT_UINT8, BASE_DEC, NULL, 0,
57447
14
      NULL, HFILL }},
57448
57449
    /* Time Zone */
57450
14
    {&hf_ieee80211_tag_time_zone,
57451
14
     {"Time Zone", "wlan.time_zone",
57452
14
      FT_STRING, BASE_NONE, NULL, 0,
57453
14
      NULL, HFILL }},
57454
57455
    /* Interworking */
57456
14
    {&hf_ieee80211_tag_interworking_access_network_type,
57457
14
     {"Access Network Type", "wlan.interworking.access_network_type",
57458
14
      FT_UINT8, BASE_DEC, VALS(access_network_type_vals), 0x0f,
57459
14
      NULL, HFILL }},
57460
57461
14
    {&hf_ieee80211_tag_interworking_internet,
57462
14
     {"Internet", "wlan.interworking.internet",
57463
14
      FT_UINT8, BASE_DEC, NULL, 0x10,
57464
14
      NULL, HFILL }},
57465
57466
14
    {&hf_ieee80211_tag_interworking_asra,
57467
14
     {"ASRA", "wlan.interworking.asra",
57468
14
      FT_UINT8, BASE_DEC, NULL, 0x20,
57469
14
      "Additional Step Required for Access", HFILL }},
57470
57471
14
    {&hf_ieee80211_tag_interworking_esr,
57472
14
     {"ESR", "wlan.interworking.esr",
57473
14
      FT_UINT8, BASE_DEC, NULL, 0x40,
57474
14
      "Emergency services reachable", HFILL }},
57475
57476
14
    {&hf_ieee80211_tag_interworking_uesa,
57477
14
     {"UESA", "wlan.interworking.uesa",
57478
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
57479
14
      "Unauthenticated emergency service accessible", HFILL }},
57480
57481
14
    {&hf_ieee80211_tag_interworking_hessid,
57482
14
     {"HESSID", "wlan.interworking.hessid",
57483
14
      FT_ETHER, BASE_NONE, NULL, 0,
57484
14
      "Homogeneous ESS identifier", HFILL }},
57485
57486
    /* QoS Map Set element */
57487
14
    {&hf_ieee80211_tag_qos_map_set_dscp_exc,
57488
14
     {"DSCP Exception", "wlan.qos_map_set.dscp_exception",
57489
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
57490
57491
14
    {&hf_ieee80211_tag_qos_map_set_dscp_exc_val,
57492
14
     {"DSCP Value", "wlan.qos_map_set.dscp_value",
57493
14
      FT_UINT8, BASE_DEC, NULL, 0,
57494
14
      "DSCP Exception - DSCP Value", HFILL }},
57495
57496
14
    {&hf_ieee80211_tag_qos_map_set_dscp_exc_up,
57497
14
     {"User Priority", "wlan.qos_map_set.up",
57498
14
      FT_UINT8, BASE_DEC, NULL, 0,
57499
14
      "DSCP Exception - User Priority", HFILL }},
57500
57501
14
    {&hf_ieee80211_tag_qos_map_set_range,
57502
14
     {"DSCP Range description", "wlan.qos_map_set.range",
57503
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
57504
57505
14
    {&hf_ieee80211_tag_qos_map_set_low,
57506
14
     {"DSCP Low Value", "wlan.qos_map_set.dscp_low_value",
57507
14
      FT_UINT8, BASE_DEC, NULL, 0,
57508
14
      "DSCP Range description - DSCP Low Value", HFILL }},
57509
57510
14
    {&hf_ieee80211_tag_qos_map_set_high,
57511
14
     {"DSCP High Value", "wlan.qos_map_set.dscp_high_value",
57512
14
      FT_UINT8, BASE_DEC, NULL, 0,
57513
14
      "DSCP Range description - DSCP High Value", HFILL }},
57514
57515
    /* Advertisement Protocol */
57516
14
    {&hf_ieee80211_tag_adv_proto_resp_len_limit,
57517
14
     {"Query Response Length Limit", "wlan.adv_proto.resp_len_limit",
57518
14
      FT_UINT8, BASE_DEC, NULL, 0x7f,
57519
14
      NULL, HFILL }},
57520
57521
14
    {&hf_ieee80211_tag_adv_proto_pame_bi,
57522
14
     {"PAME-BI", "wlan.adv_proto.pame_bi",
57523
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
57524
14
      "Pre-Association Message Xchange BSSID Independent (PAME-BI)", HFILL }},
57525
57526
14
    {&hf_ieee80211_tag_adv_proto_id,
57527
14
     {"Advertisement Protocol ID", "wlan.adv_proto.id",
57528
14
      FT_UINT8, BASE_DEC, VALS(adv_proto_id_vals), 0,
57529
14
      NULL, HFILL }},
57530
57531
14
    {&hf_ieee80211_tag_adv_vs_len,
57532
14
     {"Advertisement Protocol Vendor Specific length", "wlan.adv_proto.vs_len",
57533
14
      FT_UINT8, BASE_DEC, NULL, 0,
57534
14
      NULL, HFILL}},
57535
#if 0
57536
    {&hf_ieee80211_tag_adv_proto_vs_info,
57537
     {"Advertisement Protocol Vendor Specific info", "wlan.adv_proto.vs_info",
57538
      FT_NONE, BASE_NONE, NULL, 0,
57539
      NULL, HFILL }},
57540
#endif
57541
57542
    /* Roaming Consortium */
57543
14
    {&hf_ieee80211_tag_roaming_consortium_num_anqp_oi,
57544
14
     {"Number of ANQP OIs", "wlan.roaming_consortium.num_anqp_oi",
57545
14
      FT_UINT8, BASE_DEC, NULL, 0,
57546
14
      NULL, HFILL }},
57547
57548
14
    {&hf_ieee80211_tag_roaming_consortium_oi1_len,
57549
14
     {"OI #1 Length", "wlan.roaming_consortium.oi1_len",
57550
14
      FT_UINT8, BASE_DEC, NULL, 0x0f,
57551
14
      NULL, HFILL }},
57552
57553
14
    {&hf_ieee80211_tag_roaming_consortium_oi2_len,
57554
14
     {"OI #2 Length", "wlan.roaming_consortium.oi2_len",
57555
14
      FT_UINT8, BASE_DEC, NULL, 0xf0,
57556
14
      NULL, HFILL }},
57557
57558
14
    {&hf_ieee80211_tag_roaming_consortium_oi1,
57559
14
     {"OI #1", "wlan.roaming_consortium.oi1",
57560
14
      FT_BYTES, BASE_NONE, NULL, 0,
57561
14
      NULL, HFILL }},
57562
57563
14
    {&hf_ieee80211_tag_roaming_consortium_oi2,
57564
14
     {"OI #2", "wlan.roaming_consortium.oi2",
57565
14
      FT_BYTES, BASE_NONE, NULL, 0,
57566
14
      NULL, HFILL }},
57567
57568
14
    {&hf_ieee80211_tag_roaming_consortium_oi3,
57569
14
     {"OI #3", "wlan.roaming_consortium.oi3",
57570
14
      FT_BYTES, BASE_NONE, NULL, 0,
57571
14
      NULL, HFILL }},
57572
57573
    /* Timeout Interval */
57574
14
    {&hf_ieee80211_tag_timeout_int_type,
57575
14
     {"Timeout Interval Type", "wlan.timeout_int.type",
57576
14
      FT_UINT8, BASE_DEC, VALS(timeout_int_types), 0,
57577
14
      NULL, HFILL }},
57578
57579
14
    {&hf_ieee80211_tag_timeout_int_value,
57580
14
     {"Timeout Interval Value", "wlan.timeout_int.value",
57581
14
      FT_UINT32, BASE_DEC, NULL, 0,
57582
14
      NULL, HFILL }},
57583
57584
    /* Link Identifier */
57585
14
    {&hf_ieee80211_tag_link_id_bssid,
57586
14
     {"BSSID", "wlan.link_id.bssid",
57587
14
      FT_ETHER, BASE_NONE, NULL, 0,
57588
14
      NULL, HFILL }},
57589
57590
14
    {&hf_ieee80211_tag_link_id_init_sta,
57591
14
     {"TDLS initiator STA Address", "wlan.link_id.init_sta",
57592
14
      FT_ETHER, BASE_NONE, NULL, 0,
57593
14
      NULL, HFILL }},
57594
57595
14
    {&hf_ieee80211_tag_link_id_resp_sta,
57596
14
     {"TDLS responder STA Address", "wlan.link_id.resp_sta",
57597
14
      FT_ETHER, BASE_NONE, NULL, 0,
57598
14
      NULL, HFILL }},
57599
57600
    /* Wakeup Schedule */
57601
14
    {&hf_ieee80211_tag_wakeup_schedule_offset,
57602
14
     {"Offset", "wlan.wakeup_schedule.offset",
57603
14
      FT_UINT32, BASE_DEC, NULL, 0,
57604
14
      NULL, HFILL }},
57605
57606
14
    {&hf_ieee80211_tag_wakeup_schedule_interval,
57607
14
     {"Interval", "wlan.wakeup_schedule.interval",
57608
14
      FT_UINT32, BASE_DEC, NULL, 0,
57609
14
      NULL, HFILL }},
57610
57611
14
    {&hf_ieee80211_tag_wakeup_schedule_awake_window_slots,
57612
14
     {"Awake Window Slots", "wlan.wakeup_schedule.awake_window_slots",
57613
14
      FT_UINT32, BASE_DEC, NULL, 0,
57614
14
      NULL, HFILL }},
57615
57616
14
    {&hf_ieee80211_tag_wakeup_schedule_max_awake_dur,
57617
14
     {"Maximum Awake Window Duration", "wlan.wakeup_schedule.max_awake_dur",
57618
14
      FT_UINT32, BASE_DEC, NULL, 0,
57619
14
      NULL, HFILL }},
57620
57621
14
    {&hf_ieee80211_tag_wakeup_schedule_idle_count,
57622
14
     {"Idle Count", "wlan.wakeup_schedule.idle_count",
57623
14
      FT_UINT16, BASE_DEC, NULL, 0,
57624
14
      NULL, HFILL }},
57625
57626
    /* Channel Switch Timing */
57627
14
    {&hf_ieee80211_tag_channel_switch_timing_switch_time,
57628
14
     {"Switch Time", "wlan.channel_switch_timing.switch_time",
57629
14
      FT_UINT16, BASE_DEC, NULL, 0,
57630
14
      NULL, HFILL }},
57631
57632
14
    {&hf_ieee80211_tag_channel_switch_timing_switch_timeout,
57633
14
     {"Switch Timeout", "wlan.channel_switch_timing.switch_timeout",
57634
14
      FT_UINT16, BASE_DEC, NULL, 0,
57635
14
      NULL, HFILL }},
57636
57637
    /* PTI Control */
57638
14
    {&hf_ieee80211_tag_pti_control_tid,
57639
14
     {"TID", "wlan.pti_control.tid",
57640
14
      FT_UINT8, BASE_DEC, NULL, 0,
57641
14
      NULL, HFILL }},
57642
57643
14
    {&hf_ieee80211_tag_pti_control_sequence_control,
57644
14
     {"Sequence Control", "wlan.pti_control.sequence_control",
57645
14
      FT_UINT16, BASE_HEX, NULL, 0,
57646
14
      NULL, HFILL }},
57647
57648
    /* PU Buffer Status */
57649
14
    {&hf_ieee80211_tag_pu_buffer_status_ac_bk,
57650
14
     {"AC_BK traffic available", "wlan.pu_buffer_status.ac_bk",
57651
14
      FT_UINT8, BASE_DEC, NULL, 0x01,
57652
14
      NULL, HFILL }},
57653
57654
14
    {&hf_ieee80211_tag_pu_buffer_status_ac_be,
57655
14
     {"AC_BE traffic available", "wlan.pu_buffer_status.ac_be",
57656
14
      FT_UINT8, BASE_DEC, NULL, 0x02,
57657
14
      NULL, HFILL }},
57658
57659
14
    {&hf_ieee80211_tag_pu_buffer_status_ac_vi,
57660
14
     {"AC_VI traffic available", "wlan.pu_buffer_status.ac_vi",
57661
14
      FT_UINT8, BASE_DEC, NULL, 0x04,
57662
14
      NULL, HFILL }},
57663
57664
14
    {&hf_ieee80211_tag_pu_buffer_status_ac_vo,
57665
14
     {"AC_VO traffic available", "wlan.pu_buffer_status.ac_vo",
57666
14
      FT_UINT8, BASE_DEC, NULL, 0x08,
57667
14
      NULL, HFILL }},
57668
57669
    /* 60g ie  */
57670
14
    {&hf_ieee80211_wfa_60g_attr,
57671
14
     {"Attribute", "wlan.60g.attr",
57672
14
      FT_NONE, BASE_NONE, NULL, 0,
57673
14
      NULL, HFILL }},
57674
57675
14
    {&hf_ieee80211_wfa_60g_attr_id,
57676
14
     {"Attribute ID", "wlan.60g.attr.id",
57677
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_60g_attr_ids), 0x0,
57678
14
      NULL, HFILL }},
57679
57680
14
    {&hf_ieee80211_wfa_60g_attr_len,
57681
14
     {"Attribute Length", "wlan.60g.attr.length",
57682
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
57683
14
      NULL, HFILL }},
57684
57685
14
    {&hf_ieee80211_wfa_60g_attr_cap_sta_mac_addr,
57686
14
     {"STA Address", "wlan.60g.attr.60g_cap.sta_mac_addr",
57687
14
      FT_ETHER, BASE_NONE, NULL, 0x0,
57688
14
      NULL, HFILL }},
57689
57690
14
    {&hf_ieee80211_wfa_60g_attr_cap_recv_amsdu_frames,
57691
14
     {"Receive Capability AMSDU", "wlan.60g.attr.60g_cap.recv_amsdu",
57692
14
      FT_UINT8, BASE_DEC, NULL, 0x01,
57693
14
      NULL, HFILL }},
57694
57695
14
    {&hf_ieee80211_wfa_60g_attr_cap_reserved,
57696
14
     {"Reserved", "wlan.60g.attr.60g_cap.reserved",
57697
14
      FT_UINT8, BASE_HEX, NULL, 0xfe,
57698
14
      NULL, HFILL }},
57699
57700
14
    {&hf_ieee80211_mysterious_extra_stuff,
57701
14
     {"Mysterious extra OLPC/Ruckus/Atheros/Vector/??? stuff", "wlan.mysterious_extra_stuff",
57702
14
      FT_NONE, BASE_NONE, NULL, 0x0,
57703
14
      NULL, HFILL }},
57704
57705
14
    {&hf_ieee80211_mscs_descriptor_type,
57706
14
     {"Request Type", "wlan.ext_tag.mscs_descriptor.request_type",
57707
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(scs_request_type_rvals),
57708
14
      0x0, NULL, HFILL }},
57709
57710
14
    {&hf_ieee80211_mscs_user_prio_control_reserved,
57711
14
     {"Reserved", "wlan.ext_tag.mscs_descriptor.reserved1",
57712
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57713
57714
14
    {&hf_ieee80211_user_prio_bitmap,
57715
14
     {"User Priority Bitmap",
57716
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.upbm",
57717
14
       FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57718
57719
14
    {&hf_ieee80211_user_prio_bitmap_bit0,
57720
14
     {"User Priority 0",
57721
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_0",
57722
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x01, NULL, HFILL }},
57723
57724
14
    {&hf_ieee80211_user_prio_bitmap_bit1,
57725
14
     {"User Priority 1",
57726
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_1",
57727
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x02, NULL, HFILL }},
57728
57729
14
    {&hf_ieee80211_user_prio_bitmap_bit2,
57730
14
     {"User Priority 2",
57731
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_2",
57732
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x04, NULL, HFILL }},
57733
57734
14
    {&hf_ieee80211_user_prio_bitmap_bit3,
57735
14
     {"User Priority 3",
57736
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_3",
57737
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x08, NULL, HFILL }},
57738
57739
14
    {&hf_ieee80211_user_prio_bitmap_bit4,
57740
14
     {"User Priority 4",
57741
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_4",
57742
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x10, NULL, HFILL }},
57743
57744
14
    {&hf_ieee80211_user_prio_bitmap_bit5,
57745
14
     {"User Priority 5",
57746
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_5",
57747
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x20, NULL, HFILL }},
57748
57749
14
    {&hf_ieee80211_user_prio_bitmap_bit6,
57750
14
     {"User Priority 6",
57751
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_6",
57752
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x40, NULL, HFILL }},
57753
57754
14
    {&hf_ieee80211_user_prio_bitmap_bit7,
57755
14
     {"User Priority 7",
57756
14
       "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_7",
57757
14
       FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x80, NULL, HFILL }},
57758
57759
14
    {&hf_ieee80211_user_prio_limit,
57760
14
     {"User Priority Limit",
57761
14
      "wlan.ext_tag.mscs_descriptor.user_prio_control.user_prio_limit",
57762
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
57763
57764
14
    {&hf_ieee80211_user_prio_reserved,
57765
14
     {"Reserved", "wlan.ext_tag.mscs_descriptor.user_prio_control.reserved",
57766
14
      FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL }},
57767
57768
14
    {&hf_ieee80211_stream_timeout_reserved,
57769
14
     {"Reserved", "wlan.ext_tag.mscs_descriptor.reserved2",
57770
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57771
57772
14
    {&hf_ieee80211_stream_timeout,
57773
14
     {"Stream Timeout", "wlan.ext_tag.mscs_descriptor.stream_timeout",
57774
14
      FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_tu_tus), 0x0, NULL, HFILL }},
57775
57776
14
    {&hf_ieee80211_mscs_subelement_id,
57777
14
     {"MSCS Subelement ID", "wlan.ext_tag.mscs_descriptor.subelement_id",
57778
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57779
57780
14
    {&hf_ieee80211_mscs_subelement_len,
57781
14
     {"MSCS Subelement Length", "wlan.ext_tag.mscs_descriptor.subelement_len",
57782
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57783
57784
14
    {&hf_ieee80211_mscs_subelement_data,
57785
14
     {"MSCS Subelement Data", "wlan.ext_tag.mscs_descriptor.subelement_data",
57786
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
57787
57788
14
    {&hf_ieee80211_intra_access_prio,
57789
14
     {"Intra-Access Priority", "wlan.tag.scs_intra_access_prio",
57790
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57791
57792
14
    {&hf_ieee80211_intra_access_prio_user_prio,
57793
14
     {"User Priority", "wlan.tag.scs_intra_access_prio.user_prio",
57794
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
57795
57796
14
    {&hf_ieee80211_intra_access_prio_alt_queue,
57797
14
     {"Alternate Queue", "wlan.tag.scs_intra_access_prio.alt_queue",
57798
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
57799
57800
14
    {&hf_ieee80211_intra_access_prio_drop_elig,
57801
14
     {"Drop Eligibility", "wlan.tag.scs_intra_access_prio.drop_elig",
57802
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
57803
57804
14
    {&hf_ieee80211_intra_access_prio_reserved,
57805
14
     {"Reserved", "wlan.tag.scs_intra_access_prio.reserved",
57806
14
      FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL }},
57807
57808
14
    {&hf_ieee80211_scs_descriptor_scsid,
57809
14
     {"SCSID", "wlan.tag.scs_descriptor.scsid",
57810
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57811
57812
14
    {&hf_ieee80211_scs_descriptor_type,
57813
14
     {"Request Type", "wlan.tag.scs_descriptor.request_type",
57814
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(scs_request_type_rvals),
57815
14
      0x0, NULL, HFILL }},
57816
57817
14
    {&hf_ieee80211_estimated_service_params,
57818
14
     {"Estimated Service Parameters", "wlan.ext_tag.estimated_service_params",
57819
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
57820
57821
14
    {&hf_ieee80211_esp_access_category,
57822
14
     {"Access Category", "wlan.ext_tag.estimated_service_params.access_category",
57823
14
      FT_UINT24, BASE_DEC, VALS(esp_access_category_vals), 0x000003,
57824
14
       NULL, HFILL }},
57825
57826
14
    {&hf_ieee80211_esp_reserved,
57827
14
     {"Reserved", "wlan.ext_tag.estimated_service_params.reserved",
57828
14
      FT_UINT24, BASE_HEX, NULL, 0x000004, NULL, HFILL }},
57829
57830
14
    {&hf_ieee80211_esp_data_format,
57831
14
     {"Data Format", "wlan.ext_tag.estimated_service_params.data_format",
57832
14
      FT_UINT24, BASE_DEC, VALS(esp_data_format_vals), 0x000018,
57833
14
       NULL, HFILL }},
57834
57835
14
    {&hf_ieee80211_esp_ba_windows_size,
57836
14
     {"BA Window Size", "wlan.ext_tag.estimated_service_params.ba_window_size",
57837
14
      FT_UINT24, BASE_DEC, VALS(esp_ba_window_size_vals), 0x0000E0,
57838
14
       NULL, HFILL }},
57839
57840
14
    {&hf_ieee80211_esp_est_air_time_frac,
57841
14
     {"Estimated Air Time Fraction", "wlan.ext_tag.estimated_service_params.air_time_frac",
57842
14
      FT_UINT24, BASE_DEC, NULL, 0x00FF00, NULL, HFILL }},
57843
57844
14
    {&hf_ieee80211_esp_data_ppdu_duration_target,
57845
14
     {"Data PPDU Duration Target", "wlan.ext_tag.estimated_service_params.data_ppdu_dur_target",
57846
14
      FT_UINT24, BASE_DEC, NULL, 0xFF0000, NULL, HFILL }},
57847
57848
14
    {&hf_ieee80211_fcg_new_channel_number,
57849
14
     {"New Channel Number", "wlan.ext_tag.future_channel_guidance.new_chan_num",
57850
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57851
57852
14
    {&hf_ieee80211_fcg_extra_info,
57853
14
     {"Extra bytes", "wlan.ext_tag.future_channel_guidance.extra_bytes",
57854
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
57855
57856
14
    {&hf_ieee80211_sae_password_identifier,
57857
14
     {"Password Identifier", "wlan.ext_tag.sae.password_identifier",
57858
14
      FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
57859
57860
14
    {&hf_ieee80211_sae_anti_clogging_token,
57861
14
     {"Anti-Clogging Token", "wlan.ext_tag.sae.anti_clogging_token",
57862
14
      FT_BYTES, BASE_NONE, NULL, 0,
57863
14
      NULL, HFILL }},
57864
57865
14
    {&hf_ieee80211_tag_fils_indication_info_nr_pk,
57866
14
     {"Number of Public Key Identifiers", "wlan.fils_indication.info.nr_pk",
57867
14
      FT_UINT16, BASE_DEC, NULL, GENMASK(2,0), NULL, HFILL }},
57868
57869
14
    {&hf_ieee80211_tag_fils_indication_info_nr_realm,
57870
14
     {"Number of Realm Identifiers", "wlan.fils_indication.info.nr_realm",
57871
14
      FT_UINT16, BASE_DEC, NULL, GENMASK(5,3), NULL, HFILL }},
57872
57873
14
    {&hf_ieee80211_tag_fils_indication_info_ip_config,
57874
14
     {"FILS IP Address Configuration", "wlan.fils_indication.info.ip_config",
57875
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), GENMASK(6,6), NULL, HFILL }},
57876
57877
14
    {&hf_ieee80211_tag_fils_indication_info_cache_id_included,
57878
14
     {"Cache Identifier", "wlan.fils_indication.info.cache_id_included",
57879
14
      FT_BOOLEAN, 16, TFS(&tfs_included_not_included), GENMASK(7,7), NULL, HFILL }},
57880
57881
14
    {&hf_ieee80211_tag_fils_indication_info_hessid_included,
57882
14
     {"HESSID", "wlan.fils_indication.info.hessid_included",
57883
14
      FT_BOOLEAN, 16, TFS(&tfs_included_not_included), GENMASK(8,8), NULL, HFILL }},
57884
57885
14
    {&hf_ieee80211_tag_fils_indication_info_ska_without_pfs,
57886
14
     {"FILS Shared Key Authentication without PFS", "wlan.fils_indication.info.ska_without_pfs",
57887
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), GENMASK(9,9), NULL, HFILL }},
57888
57889
14
    {&hf_ieee80211_tag_fils_indication_info_ska_with_pfs,
57890
14
     {"FILS Shared Key Authentication with PFS", "wlan.fils_indication.info.ska_with_pfs",
57891
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), GENMASK(10,10), NULL, HFILL }},
57892
57893
14
    {&hf_ieee80211_tag_fils_indication_info_pka,
57894
14
     {"FILS Public Key Authentication", "wlan.fils_indication.info.pka",
57895
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), GENMASK(11,11), NULL, HFILL }},
57896
57897
14
    {&hf_ieee80211_tag_fils_indication_info_reserved,
57898
14
     {"Reserved", "wlan.fils_indication.info.reserved",
57899
14
      FT_UINT16, BASE_HEX, NULL, GENMASK(15,12), NULL, HFILL }},
57900
57901
14
    {&hf_ieee80211_tag_fils_indication_cache_identifier,
57902
14
     {"Cache Identifier", "wlan.fils_indication.cache_identifier",
57903
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57904
57905
14
    {&hf_ieee80211_tag_fils_indication_hessid,
57906
14
     {"HESSID", "wlan.fils_indication.hessid",
57907
14
      FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
57908
57909
14
    {&hf_ieee80211_tag_fils_indication_realm_list,
57910
14
     {"Realm Identifiers", "wlan.fils_indication.realms",
57911
14
      FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
57912
57913
14
    {&hf_ieee80211_tag_fils_indication_realm_identifier,
57914
14
     {"Realm Identifier", "wlan.fils_indication.realms.identifier",
57915
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57916
57917
14
    {&hf_ieee80211_tag_fils_indication_public_key_list,
57918
14
     {"Public Keys", "wlan.fils_indication.public_keys",
57919
14
      FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
57920
57921
14
    {&hf_ieee80211_tag_fils_indication_public_key_type,
57922
14
     {"Key Type", "wlan.fils_indication.public_keys.key_type",
57923
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57924
57925
14
    {&hf_ieee80211_tag_fils_indication_public_key_length,
57926
14
     {"Length", "wlan.fils_indication.public_keys.length",
57927
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57928
57929
14
    {&hf_ieee80211_tag_fils_indication_public_key_indicator,
57930
14
     {"Public Key Indicator", "wlan.fils_indication.public_keys.indicator",
57931
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
57932
57933
14
    {&hf_ieee80211_qos_mgmt_attribute_id,
57934
14
     {"Attribute ID", "wlan.qos_mgmt.ie.attribute_id",
57935
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(qos_mgmt_attributes), 0,
57936
14
      NULL, HFILL }},
57937
57938
14
    {&hf_ieee80211_qos_mgmt_attribute_len,
57939
14
     {"Length", "wlan.qos_mgmt.ie.length",
57940
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
57941
57942
14
    {&hf_ieee80211_qos_mgmt_start_port_range,
57943
14
     {"Start Port", "wlan.qos_mgmt.ie.start_port",
57944
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57945
57946
14
    {&hf_ieee80211_qos_mgmt_end_port_range,
57947
14
     {"End Port", "wlan.qos_mgmt.ie.end_port",
57948
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57949
57950
14
    {&hf_ieee80211_qos_mgmt_dscp_pol_id,
57951
14
     {"Policy ID", "wlan.qos_mgmt.ie.dscp_policy.policy_id",
57952
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57953
57954
14
    {&hf_ieee80211_qos_mgmt_dscp_pol_req_type,
57955
14
     {"Request Type", "wlan.qos_mgmt.ie.dscp_policy.request_type",
57956
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
57957
57958
14
    {&hf_ieee80211_qos_mgmt_dscp_pol_dscp,
57959
14
     {"DSCP", "wlan.qos_mgmt.ie.dscp_policy.dscp",
57960
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
57961
57962
14
    {&hf_ieee80211_qos_mgmt_domain_name,
57963
14
     {"Domain Name", "wlan.qos_mgmt.ie.domain_name",
57964
14
      FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
57965
57966
14
    {&hf_ieee80211_qos_mgmt_unknown_attr,
57967
14
     {"Unknown attribute", "wlan.qos_mgmt.ie.unknown_attribute",
57968
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
57969
57970
14
    {&hf_ieee80211_ext_tag,
57971
14
     {"Ext Tag", "wlan.ext_tag",
57972
14
      FT_NONE, BASE_NONE, NULL, 0,
57973
14
      NULL, HFILL }},
57974
57975
14
    {&hf_ieee80211_ext_tag_number,
57976
14
     {"Ext Tag Number", "wlan.ext_tag.number",
57977
14
      FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_eid_ext_ext, 0,
57978
14
      "Element ID", HFILL }},
57979
57980
14
    {&hf_ieee80211_ext_tag_length,
57981
14
     {"Ext Tag length", "wlan.ext_tag.length",
57982
14
      FT_UINT32, BASE_DEC, NULL, 0,
57983
14
      "Length of tag", HFILL }},
57984
57985
14
    {&hf_ieee80211_ext_tag_data,
57986
14
     {"Ext Tag Data", "wlan.ext_tag.data",
57987
14
      FT_BYTES, BASE_NONE, NULL, 0,
57988
14
      NULL, HFILL }},
57989
57990
14
    {&hf_ieee80211_fils_req_params_parameter_control_bitmap,
57991
14
     {"Parameter Control Bitmap", "wlan.ext_tag.fils.req_params.parameter_control_bitmap",
57992
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
57993
14
      NULL, HFILL }},
57994
57995
14
    {&hf_ieee80211_fils_req_params_fils_criteria_present,
57996
14
     {"FILS Criteria Present", "wlan.ext_tag.fils.req_params.fils_criteria_present",
57997
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_FILS_CRITERIA,
57998
14
      NULL, HFILL }},
57999
58000
14
    {&hf_ieee80211_fils_req_params_max_delay_limit_present,
58001
14
     {"Max Delay Limit Present", "wlan.ext_tag.fils.req_params.max_delay_limit_present",
58002
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_MAX_DELAY_LIMIT,
58003
14
      NULL, HFILL }},
58004
58005
14
    {&hf_ieee80211_fils_req_params_minimum_data_rate_present,
58006
14
     {"Minimum Data Rate Present", "wlan.ext_tag.fils.req_params.minimum_data_rate_present",
58007
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_MINIMUM_DATA_RATE,
58008
14
      NULL, HFILL }},
58009
58010
14
    {&hf_ieee80211_fils_req_params_rcpi_limit_present,
58011
14
     {"RCPI Limit Present", "wlan.ext_tag.fils.req_params.rcpi_limit_present",
58012
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_RCPI_LIMIT,
58013
14
      NULL, HFILL }},
58014
58015
14
    {&hf_ieee80211_fils_req_params_oui_response_criteria_present,
58016
14
     {"OUI Response Criteria Present", "wlan.ext_tag.fils.req_params.oui_response_criteria_present",
58017
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_OUI_RESPONSE_CRITERIA,
58018
14
      NULL, HFILL }},
58019
58020
14
    {&hf_ieee80211_fils_req_params_reserved,
58021
14
     {"Reserved", "wlan.ext_tag.fils.req_params.reserved",
58022
14
      FT_UINT8, BASE_HEX, NULL, FILS_REQ_PARAMS_RESERVED,
58023
14
      NULL, HFILL }},
58024
58025
14
    {&hf_ieee80211_fils_req_params_max_channel_time,
58026
14
     {"Max Channel Time", "wlan.ext_tag.fils.req_params.max_channel_time",
58027
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
58028
14
      NULL, HFILL }},
58029
58030
14
    {&hf_ieee80211_fils_req_params_fils_criteria,
58031
14
     {"FILS Criteria", "wlan.ext_tag.fils.req_params.fils_criteria",
58032
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
58033
14
      NULL, HFILL }},
58034
58035
14
    {&hf_ieee80211_fils_req_params_fils_criteria_bss_delay,
58036
14
     {"BSS Delay", "wlan.ext_tag.fils.req_params.fils_criteria.bss_delay",
58037
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_FILS_CRITERIA_BSS_DELAY,
58038
14
      NULL, HFILL }},
58039
58040
14
    {&hf_ieee80211_fils_req_params_fils_criteria_phy_support,
58041
14
     {"PHY Support", "wlan.ext_tag.fils.req_params.fils_criteria.phy_support",
58042
14
      FT_BOOLEAN, 8, NULL, FILS_REQ_PARAMS_FILS_CRITERIA_PHY_SUPPORT,
58043
14
      NULL, HFILL }},
58044
58045
14
    {&hf_ieee80211_fils_req_params_fils_criteria_reserved,
58046
14
     {"Reserved", "wlan.ext_tag.fils.req_params.fils_criteria.reserved",
58047
14
      FT_UINT8, BASE_HEX, NULL, FILS_REQ_PARAMS_FILS_CRITERIA_RESERVED,
58048
14
      NULL, HFILL }},
58049
58050
14
    {&hf_ieee80211_fils_req_params_max_delay_limit,
58051
14
     {"Max Delay Limit", "wlan.ext_tag.fils.req_params.max_delay_limit",
58052
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
58053
14
      NULL, HFILL }},
58054
58055
14
    {&hf_ieee80211_fils_req_params_minimum_data_rate,
58056
14
     {"Minimum Data Rate", "wlan.ext_tag.fils.req_params.minimum_data_rate",
58057
14
      FT_UINT24, BASE_DEC, NULL, 0x0,
58058
14
      NULL, HFILL }},
58059
58060
14
    {&hf_ieee80211_fils_req_params_rcpi_limit,
58061
14
     {"RCPI Limit", "wlan.ext_tag.fils.req_params.rcpi_limit",
58062
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
58063
14
      NULL, HFILL }},
58064
58065
14
    {&hf_ieee80211_fils_req_params_oui_response_criteria,
58066
14
     {"OUI Response Criteria", "wlan.ext_tag.fils.req_params.oui_response_criteria",
58067
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
58068
14
      NULL, HFILL }},
58069
58070
14
    {&hf_ieee80211_fils_session,
58071
14
     {"FILS Session", "wlan.ext_tag.fils.session",
58072
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
58073
14
      NULL, HFILL }},
58074
58075
14
    {&hf_ieee80211_fils_encrypted_data,
58076
14
     {"FILS Encrypted Data", "wlan.ext_tag.fils.encrypted_data",
58077
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
58078
14
      NULL, HFILL }},
58079
58080
14
    {&hf_ieee80211_fils_nonce,
58081
14
     {"FILS Nonce", "wlan.ext_tag.fils.nonce",
58082
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
58083
14
      NULL, HFILL }},
58084
58085
14
    {&hf_ieee80211_he_mac_capabilities,
58086
14
     {"HE MAC Capabilities Information", "wlan.ext_tag.he_mac_caps",
58087
14
      FT_UINT48, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58088
58089
14
    {&hf_ieee80211_he_htc_he_support,
58090
14
     {"+HTC HE Support", "wlan.ext_tag.he_mac_cap.htc_he_support",
58091
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000000001,
58092
14
      NULL, HFILL }},
58093
58094
14
    {&hf_ieee80211_he_twt_requester_support,
58095
14
     {"TWT Requester Support", "wlan.ext_tag.he_mac_cap.twt_req_support",
58096
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000000002,
58097
14
      NULL, HFILL }},
58098
58099
14
    {&hf_ieee80211_he_twt_responder_support,
58100
14
     {"TWT Responder Support", "wlan.ext_tag.he_mac_cap.twt_rsp_support",
58101
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000000004,
58102
14
      NULL, HFILL }},
58103
58104
14
    {&hf_ieee80211_he_dynamic_fragmentation_support,
58105
14
     {"Dynamic Fragmentation Support", "wlan.ext_tag.he_mac_cap.dynamic_fragmentation_support",
58106
14
      FT_UINT48, BASE_DEC|BASE_VAL64_STRING,
58107
14
      VALS64(he_dynamic_fragmentation_support_vals), 0x000000000018,
58108
14
      NULL, HFILL }},
58109
58110
14
    {&hf_ieee80211_he_max_number_fragmented_msdus,
58111
14
     {"Maximum Number of Fragmented MSDUs", "wlan.ext_tag.he_mac_cap.max_frag_msdus",
58112
14
      FT_UINT48, BASE_CUSTOM, CF_FUNC(max_frag_msdus_base_custom), 0x0000000000E0,
58113
14
      NULL, HFILL }},
58114
58115
14
    {&hf_ieee80211_he_min_fragment_size,
58116
14
     {"Minimum Fragment Size", "wlan.ext_tag.he_mac_cap.min_frag_size",
58117
14
      FT_UINT48, BASE_DEC|BASE_VAL64_STRING,
58118
14
      VALS64(he_minimum_fragmentation_size_vals), 0x000000000300,
58119
14
      NULL, HFILL }},
58120
58121
14
    {&hf_ieee80211_he_trigger_frame_mac_padding_dur,
58122
14
     {"Trigger Frame MAC Padding Duration", "wlan.ext_tag.he_mac_cap.trig_frm_mac_padding_dur",
58123
14
      FT_UINT48, BASE_DEC|BASE_VAL64_STRING, VALS64(he_trigger_mac_padding_dur_vals), 0x000000000C00, NULL, HFILL }},
58124
58125
14
    {&hf_ieee80211_he_multi_tid_aggregation_rx_support,
58126
14
     {"Multi-TID Aggregation Rx Support", "wlan.ext_tag.he_mac_cap.multi_tid_agg_rx_support",
58127
14
      FT_UINT48, BASE_DEC, NULL, 0x000000007000, NULL, HFILL }},
58128
58129
14
    {&hf_ieee80211_he_he_link_adaptation_support,
58130
14
     {"HE Link Adaptation Support", "wlan.ext_tag.he_mac_cap.he_link_adaptation_support",
58131
14
      FT_UINT48, BASE_DEC|BASE_VAL64_STRING,
58132
14
      VALS64(he_link_adaptation_support_vals), 0x000000018000,
58133
14
      NULL, HFILL }},
58134
58135
14
    {&hf_ieee80211_he_all_ack_support,
58136
14
     {"All Ack Support", "wlan.ext_tag.he_mac_cap.all_ack_support",
58137
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000020000,
58138
14
      NULL, HFILL }},
58139
58140
14
    {&hf_ieee80211_he_trs_support,
58141
14
     {"TRS Support", "wlan.ext_tag.he_mac_cap.trs_support",
58142
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000040000,
58143
14
      NULL, HFILL }},
58144
58145
14
    {&hf_ieee80211_he_bsr_support,
58146
14
     {"BSR Support", "wlan.ext_tag.he_mac_cap.bsr_support",
58147
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000080000,
58148
14
      NULL, HFILL }},
58149
58150
14
    {&hf_ieee80211_he_broadcast_twt_support,
58151
14
     {"Broadcast TWT Support", "wlan.ext_tag.he_mac_cap.broadcast_twt_support",
58152
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000100000,
58153
14
      NULL, HFILL }},
58154
58155
14
    {&hf_ieee80211_he_32_bit_ba_bitmap_support,
58156
14
     {"32-bit BA Bitmap Support", "wlan.ext_tag.he_mac_cap.32_bit_ba_bitmap_support",
58157
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000200000,
58158
14
      NULL, HFILL }},
58159
58160
14
    {&hf_ieee80211_he_mu_cascading_support,
58161
14
     {"MU Cascading Support", "wlan.ext_tag.he_mac_cap.mu_cascading_support",
58162
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000400000,
58163
14
      NULL, HFILL }},
58164
58165
14
    {&hf_ieee80211_he_ack_enabled_aggregation_support,
58166
14
     {"Ack-Enabled Aggregation Support", "wlan.ext_tag.he_mac_cap.ack_enabled_agg_support",
58167
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000000800000,
58168
14
      NULL, HFILL }},
58169
58170
14
    {&hf_ieee80211_he_reserved_b24,
58171
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_b24",
58172
14
      FT_UINT48, BASE_HEX, NULL, 0x000001000000,
58173
14
      NULL, HFILL }},
58174
58175
14
    {&hf_ieee80211_he_om_control_support,
58176
14
     {"OM Control Support", "wlan.ext_tag.he_mac_cap.om_control_support",
58177
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000002000000,
58178
14
      NULL, HFILL }},
58179
58180
14
    {&hf_ieee80211_he_ofdma_ra_support,
58181
14
     {"OFDMA RA Support", "wlan.ext_tag.he_mac_cap.ofdma_ra_support",
58182
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000004000000,
58183
14
      NULL, HFILL }},
58184
58185
14
    {&hf_ieee80211_he_max_a_mpdu_length_exponent_ext,
58186
14
     {"Maximum A-MPDU Length Exponent Extension",
58187
14
      "wlan.ext_tag.he_mac_cap.max_a_mpdu_len_exp_ext",
58188
14
      FT_UINT48, BASE_DEC, NULL, 0x000018000000, NULL, HFILL }},
58189
58190
14
    {&hf_ieee80211_he_a_msdu_fragmentation_support,
58191
14
     {"A-MSDU Fragmentation Support", "wlan.ext_tag.he_mac_cap.a_msdu_frag_support",
58192
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000020000000,
58193
14
      NULL, HFILL }},
58194
58195
14
    {&hf_ieee80211_he_flexible_twt_schedule_support,
58196
14
     {"Flexible TWT Schedule Support", "wlan.ext_tag.he_mac_cap.flexible_twt_sched_support",
58197
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000040000000,
58198
14
      NULL, HFILL }},
58199
58200
14
    {&hf_ieee80211_he_rx_control_frame_to_multibss,
58201
14
     {"Rx Control Frame to MultiBSS", "wlan.ext_tag.he_mac_cap.rx_ctl_frm_multibss",
58202
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000080000000,
58203
14
      NULL, HFILL }},
58204
58205
14
    {&hf_ieee80211_he_bsrp_bqrp_a_mpdu_aggregation,
58206
14
     {"BSRP BQRP A-MPDU Aggregation", "wlan.ext_tag.he_mac_cap.bsrp_bqrp_a_mpdu_agg",
58207
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000100000000,
58208
14
      NULL, HFILL }},
58209
58210
14
    {&hf_ieee80211_he_qtp_support,
58211
14
     {"QTP Support", "wlan.ext_tag.he_mac_cap.qtp_support",
58212
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000200000000,
58213
14
      NULL, HFILL }},
58214
58215
14
    {&hf_ieee80211_he_bqr_support,
58216
14
     {"BQR Support", "wlan.ext_tag.he_mac_cap.bqr_support",
58217
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000400000000,
58218
14
      NULL, HFILL }},
58219
58220
14
    {&hf_ieee80211_he_psr_responder,
58221
14
     {"PSR Responder", "wlan.ext_tag.he_mac_cap.psr_responder",
58222
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x000800000000,
58223
14
      NULL, HFILL }},
58224
58225
14
    {&hf_ieee80211_he_ndp_feedback_report_support,
58226
14
     {"NDP Feedback Report Support", "wlan.ext_tag.he_mac_cap.ndp_feedback_report_support",
58227
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x001000000000,
58228
14
      NULL, HFILL }},
58229
58230
14
    {&hf_ieee80211_he_ops_support,
58231
14
     {"OPS Support", "wlan.ext_tag.he_mac_cap.ops_support",
58232
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x002000000000,
58233
14
      NULL, HFILL }},
58234
58235
14
    {&hf_ieee80211_he_a_msdu_in_a_mpdu_support,
58236
14
     {"A-MSDU Not Under BA in Ack-Enabled A-MPDU Support", "wlan.ext_tag.he_mac_cap.a_msdu_in_a_mpdu_support",
58237
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported), 0x004000000000,
58238
14
      NULL, HFILL }},
58239
58240
14
    {&hf_ieee80211_he_multi_tid_aggregation_tx_support,
58241
14
     {"Multi-TID Aggregation Tx Support", "wlan.ext_tag.he_mac_cap.multi_tid_agg_tx_support",
58242
14
       FT_UINT48, BASE_DEC, NULL, 0x038000000000, NULL, HFILL }},
58243
58244
14
    {&hf_ieee80211_he_subchannel_selective_trans_support,
58245
14
     {"HE Subchannel Selective Transmission Support", "wlan.ext_tag.he_mac_cap.subchannel_selective_xmit_support",
58246
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported),
58247
14
      0x040000000000, NULL, HFILL }},
58248
58249
14
    {&hf_ieee80211_he_2_996_tone_ru_support,
58250
14
     {"UL 2x996-tone RU Support", "wlan.ext_tag.he_mac_cap.ul_2_996_tone_ru_support",
58251
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported),
58252
14
      0x080000000000, NULL, HFILL }},
58253
58254
14
    {&hf_ieee80211_he_om_control_ul_mu_data_disable_rx_support,
58255
14
     {"OM Control UL MU Data Disable RX Support", "wlan.ext_tag.he_mac_cap.om_cntl_ul_mu_data_disable_rx_support",
58256
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported),
58257
14
      0x100000000000, NULL, HFILL }},
58258
58259
14
    {&hf_ieee80211_he_dynamic_sm_power_save,
58260
14
     {"HE Dynamic SM Power Save", "wlan.ext_tag.he_mac_cap.dynamic_sm_power_save",
58261
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported),
58262
14
      0x200000000000, NULL, HFILL }},
58263
58264
14
    {&hf_ieee80211_he_punctured_sounding_support,
58265
14
     {"Punctured Sounding Support", "wlan.ext_tag.he_mac_cap.punctured_sounding_support",
58266
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported),
58267
14
      0x400000000000, NULL, HFILL }},
58268
58269
14
    {&hf_ieee80211_he_ht_and_vht_trigger_frame_rx_support,
58270
14
     {"HT And VHT Trigger Frame RX Support", "wlan.ext_tag.he_mac_cap.ht_and_vht_trigger_frame_rx_support",
58271
14
      FT_BOOLEAN, 48, TFS(&tfs_supported_not_supported),
58272
14
      0x800000000000, NULL, HFILL }},
58273
58274
14
    {&hf_ieee80211_he_reserved_bits_5_7,
58275
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bits_5_7",
58276
14
      FT_UINT48, BASE_HEX, NULL, 0x0000000000E0, NULL, HFILL }},
58277
58278
14
    {&hf_ieee80211_he_reserved_bits_8_9,
58279
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bits_8_9",
58280
14
      FT_UINT48, BASE_HEX, NULL, 0x000000000300, NULL, HFILL }},
58281
58282
14
    {&hf_ieee80211_he_reserved_bits_15_16,
58283
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bits_15_16",
58284
14
      FT_UINT48, BASE_HEX, NULL, 0x000000018000, NULL, HFILL }},
58285
58286
14
    {&hf_ieee80211_he_reserved_bit_18,
58287
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_18",
58288
14
      FT_UINT48, BASE_HEX, NULL, 0x000000040000, NULL, HFILL }},
58289
58290
14
    {&hf_ieee80211_he_reserved_bit_19,
58291
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_19",
58292
14
      FT_UINT48, BASE_HEX, NULL, 0x000000080000, NULL, HFILL }},
58293
58294
14
    {&hf_ieee80211_he_reserved_bit_25,
58295
14
     {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_25",
58296
14
      FT_UINT48, BASE_HEX, NULL, 0x000002000000, NULL, HFILL }},
58297
58298
14
    {&hf_ieee80211_he_reserved_bit_29,
58299
14
       {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_29",
58300
14
        FT_UINT48, BASE_HEX, NULL, 0x000020000000, NULL, HFILL }},
58301
58302
14
    {&hf_ieee80211_he_reserved_bit_34,
58303
14
       {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_34",
58304
14
        FT_UINT48, BASE_HEX, NULL, 0x000400000000, NULL, HFILL }},
58305
58306
14
    {&hf_ieee80211_he_phy_reserved_b0,
58307
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.reserved_b0",
58308
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
58309
58310
14
    {&hf_ieee80211_he_phy_cap_reserved_b0,
58311
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.fbyte.reserved_b0",
58312
14
      FT_UINT8, BASE_HEX, NULL, 0x01,
58313
14
      NULL, HFILL }},
58314
58315
14
    {&hf_ieee80211_he_phy_chan_width_set,
58316
14
     {"Channel Width Set", "wlan.ext_tag.he_phy_cap.fbytes",
58317
14
      FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
58318
58319
14
    {&hf_ieee80211_he_40mhz_channel_2_4ghz,
58320
14
     {"40 MHz in 2.4 GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.40mhz_in_2_4ghz",
58321
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
58322
58323
14
    {&hf_ieee80211_he_40_and_80_mhz_5ghz,
58324
14
     {"40 & 80 MHz in the 5 GHz and 6 GHz bands", "wlan.ext_tag.he_phy_cap.chan_width_set.40_80_in_5ghz",
58325
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
58326
58327
14
    {&hf_ieee80211_he_160_mhz_5ghz,
58328
14
     {"160 MHz in the 5 GHz and 6 GHz bands", "wlan.ext_tag.he_phy_cap.chan_width_set.160_in_5ghz",
58329
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
58330
58331
14
    {&hf_ieee80211_he_160_80_plus_80_mhz_5ghz,
58332
14
     {"160/80+80 MHz in the 5 GHz and 6 GHz bands", "wlan.ext_tag.he_phy_cap.chan_width_set.160_80_80_in_5ghz",
58333
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
58334
58335
14
    {&hf_ieee80211_he_242_tone_rus_in_2_4ghz,
58336
14
     {"242 tone RUs in the 2.4 GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.242_tone_in_2_4ghz",
58337
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
58338
58339
14
    {&hf_ieee80211_he_242_tone_rus_in_5ghz,
58340
14
     {"242 tone RUs in the 5 GHz and 6 GHz bands", "wlan.ext_tag.he_phy_cap.chan_width_set.242_tone_in_5ghz",
58341
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL }},
58342
58343
14
    {&hf_ieee80211_he_chan_width_reserved,
58344
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width_set.reserved",
58345
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
58346
58347
14
    {&hf_ieee80211_he_phy_b8_to_b23,
58348
14
     {"Bits 8 to 23", "wlan.ext_tag.he_phy_cap.bits_8_to_23",
58349
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58350
58351
14
    {&hf_ieee80211_he_5ghz_b0_reserved,
58352
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width.set.5GHz_b0_reserved",
58353
14
      FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
58354
58355
14
    {&hf_ieee80211_he_5ghz_b4_reserved,
58356
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width.set.5GHz_b4_reserved",
58357
14
      FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
58358
58359
14
    {&hf_ieee80211_he_24ghz_b1_reserved,
58360
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width.set.24GHz_b1_reserved",
58361
14
      FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
58362
58363
14
    {&hf_ieee80211_he_24ghz_b2_reserved,
58364
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width.set.24GHz_b2_reserved",
58365
14
      FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL }},
58366
58367
14
    {&hf_ieee80211_he_24ghz_b3_reserved,
58368
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width.set.24GHz_b3_reserved",
58369
14
      FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL }},
58370
58371
14
    {&hf_ieee80211_he_24ghz_b5_reserved,
58372
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width.set.24GHz_b5_reserved",
58373
14
      FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL }},
58374
58375
14
    {&hf_ieee80211_he_phy_cap_punctured_preamble_rx,
58376
14
     {"Punctured Preamble Rx", "wlan.ext_tag.he_phy_cap.punc_preamble_rx",
58377
14
      FT_UINT16, BASE_HEX, NULL, 0x000F, NULL, HFILL }},
58378
58379
14
    {&hf_ieee80211_he_phy_cap_device_class,
58380
14
     {"Device Class", "wlan.ext_tag.he_phy_cap.device_class",
58381
14
      FT_UINT16, BASE_HEX, VALS(he_phy_device_class_vals), 0x0010, NULL, HFILL }},
58382
58383
14
    {&hf_ieee80211_he_phy_cap_ldpc_coding_in_payload,
58384
14
     {"LDPC Coding In Payload", "wlan.ext_tag.he_phy_cap.ldpc_coding_in_payload",
58385
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020, NULL, HFILL }},
58386
58387
14
    {&hf_ieee80211_he_phy_cap_he_su_ppdu_1x_he_ltf_08us,
58388
14
     {"HE SU PPDU With 1x HE-LTF And 0.8us GI",
58389
14
      "wlan.ext_tag.he_phy_cap.he_su_ppdu_with_1x_he_ltf_08us",
58390
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
58391
58392
14
    {&hf_ieee80211_he_phy_cap_midamble_tx_rx_max_nsts,
58393
14
     {"Midamble Tx/Rx Max NSTS", "wlan.ext_tag.he_phy_cap.midamble_tx_rx_max_nsts",
58394
14
      FT_UINT16, BASE_HEX, VALS(he_phy_midamble_tx_rx_max_nsts_vals), 0x0180, NULL, HFILL }},
58395
58396
14
    {&hf_ieee80211_he_phy_cap_ndp_with_4x_he_ltf_32us,
58397
14
     {"NDP With 4x HE-LTF and 3.2us GI",
58398
14
      "wlan.ext_tag.he_phy_cap.ndp_with_4x_he_ltf_4x_3.2us",
58399
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
58400
58401
14
    {&hf_ieee80211_he_phy_cap_stbc_tx_lt_80mhz,
58402
14
     {"STBC Tx <= 80 MHz", "wlan.ext_tag.he_phy_cap.stbc_tx_lt_80mhz",
58403
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
58404
58405
14
    {&hf_ieee80211_he_phy_cap_stbc_rx_lt_80mhz,
58406
14
     {"STBC Rx <= 80 MHz", "wlan.ext_tag.he_phy_cap.stbc_rx_lt_80mhz",
58407
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
58408
58409
14
    {&hf_ieee80211_he_phy_cap_doppler_tx,
58410
14
     {"Doppler Tx", "wlan.ext_tag.he_phy_cap.doppler_tx",
58411
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
58412
58413
14
    {&hf_ieee80211_he_phy_cap_doppler_rx,
58414
14
     {"Doppler Rx", "wlan.ext_tag.he_phy_cap.doppler_rx",
58415
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
58416
58417
14
    {&hf_ieee80211_he_phy_cap_full_bw_ul_mu_mimo,
58418
14
     {"Full Bandwidth UL MU-MIMO", "wlan.ext_tag.he_phy_cap.full_bw_ul_mu_mimo",
58419
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x4000, NULL, HFILL }},
58420
58421
14
    {&hf_ieee80211_he_phy_cap_partial_bw_ul_mu_mimo,
58422
14
     {"Partial Bandwidth UL MU-MIMO", "wlan.ext_tag.he_phy_cap.partial_bw_ul_mu_mimo",
58423
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x8000, NULL, HFILL }},
58424
58425
14
    {&hf_ieee80211_he_phy_b24_to_b39,
58426
14
     {"Bits 24 to 39", "wlan.ext_tag.he_phy_cap.bits_24_to_39",
58427
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58428
58429
14
    {&hf_ieee80211_he_phy_cap_dcm_max_constellation_tx,
58430
14
     {"DCM Max Constellation Tx", "wlan.ext_tag.he_phy_cap.dcm_max_const_tx",
58431
14
      FT_UINT16, BASE_HEX, VALS(he_phy_dcm_max_constellation_vals), 0x0003, NULL, HFILL }},
58432
58433
14
    {&hf_ieee80211_he_phy_cap_dcm_max_nss_tx,
58434
14
     {"DCM Max NSS Tx", "wlan.ext_tag.he_phy_cap.dcm_max_nss_tx",
58435
14
      FT_UINT16, BASE_HEX, VALS(he_phy_dcm_max_nss_vals), 0x0004, NULL, HFILL }},
58436
58437
14
    {&hf_ieee80211_he_phy_cap_dcm_max_constellation_rx,
58438
14
     {"DCM Max Constellation Rx", "wlan.ext_tag.he_phy_cap.dcm_max_const_rx",
58439
14
      FT_UINT16, BASE_HEX, VALS(he_phy_dcm_max_constellation_vals), 0x0018, NULL, HFILL }},
58440
58441
14
    {&hf_ieee80211_he_phy_cap_dcm_max_nss_rx,
58442
14
     {"DCM Max NSS Rx", "wlan.ext_tag.he_phy_cap.dcm_max_nss_rx",
58443
14
      FT_UINT16, BASE_HEX, VALS(he_phy_dcm_max_nss_vals), 0x0020, NULL, HFILL }},
58444
58445
14
    {&hf_ieee80211_he_phy_cap_rx_partial_bw_su_20mhz_he_mu_ppdu,
58446
14
     {"Rx Partial BW SU In 20 MHz HE MU PPDU", "wlan.ext_tag.he_phy_cap.rx_partial_bw_su_20mhz_he_mu_ppdu",
58447
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
58448
58449
14
    {&hf_ieee80211_he_phy_cap_su_beamformer,
58450
14
     {"SU Beamformer", "wlan.ext_tag.he_phy_cap.su_beamformer",
58451
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080, NULL, HFILL }},
58452
58453
14
    {&hf_ieee80211_he_phy_cap_su_beamformee,
58454
14
     {"SU Beamformee", "wlan.ext_tag.he_phy_cap.su_beamformee",
58455
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
58456
58457
14
    {&hf_ieee80211_he_phy_cap_mu_beamformer,
58458
14
     {"MU Beamformer", "wlan.ext_tag.he_phy_cap.mu_beamformer",
58459
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
58460
58461
14
    {&hf_ieee80211_he_phy_cap_beamformee_sts_lte_80mhz,
58462
14
     {"Beamformee STS <= 80 MHz", "wlan.ext_tag.he_phy_cap.beamformee_sts_lte_80mhz",
58463
14
      FT_UINT16, BASE_HEX, NULL, 0x1C00, NULL, HFILL }},
58464
58465
14
    {&hf_ieee80211_he_phy_cap_beamformee_sts_gt_80mhz,
58466
14
     {"Beamformee STS > 80 MHz", "wlan.ext_tag.he_phy_cap.beamformee_sts_gt_80mhz",
58467
14
      FT_UINT16, BASE_HEX, NULL, 0xE000, NULL, HFILL }},
58468
58469
14
    {&hf_ieee80211_he_phy_b40_to_b55,
58470
14
     {"Bits 40 to 55", "wlan.ext_tag.he_phy_cap.bits_40_to_55",
58471
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58472
58473
14
    {&hf_ieee80211_he_phy_cap_number_of_sounding_dims_lte_80,
58474
14
     {"Number Of Sounding Dimensions <= 80 MHz", "wlan.ext_tag.he_phy_cap.no_sounding_dims_lte_80",
58475
14
      FT_UINT16, BASE_DEC, NULL, 0x0007, NULL, HFILL }},
58476
58477
14
    {&hf_ieee80211_he_phy_cap_number_of_sounding_dims_gt_80,
58478
14
     {"Number Of Sounding Dimensions > 80 MHz", "wlan.ext_tag.he_phy_cap.no_sounding_dims_gt_80",
58479
14
      FT_UINT16, BASE_DEC, NULL, 0x0038, NULL, HFILL }},
58480
58481
14
    {&hf_ieee80211_he_phy_cap_ng_eq_16_su_fb,
58482
14
     {"Ng = 16 SU Feedback", "wlan.ext_tag.he_phy_cap.ng_eq_16_su_fb",
58483
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
58484
58485
14
    {&hf_ieee80211_he_phy_cap_ng_eq_16_mu_fb,
58486
14
     {"Ng = 16 MU Feedback", "wlan.ext_tag.he_phy_cap.ng_eq_16_mu_fb",
58487
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080, NULL, HFILL }},
58488
58489
14
    {&hf_ieee80211_he_phy_cap_codebook_size_eq_4_2_fb,
58490
14
     {"Codebook Size SU Feedback", "wlan.ext_tag.he_phy_cap.codebook_size_su_fb",
58491
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
58492
58493
14
    {&hf_ieee80211_he_phy_cap_codebook_size_eq_7_5_fb,
58494
14
     {"Codebook Size MU Feedback", "wlan.ext_tag.he_phy_cap.codebook_size_mu_fb",
58495
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
58496
58497
14
    {&hf_ieee80211_he_phy_cap_triggered_su_beamforming_fb,
58498
14
     {"Triggered SU Beamforming Feedback", "wlan.ext_tag.he_phy_cap.trig_su_bf_fb",
58499
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
58500
58501
14
    {&hf_ieee80211_he_phy_cap_triggered_mu_beamforming_fb,
58502
14
     {"Triggered MU Beamforming Feedback", "wlan.ext_tag.he_phy_cap.trig_mu_bf_fb",
58503
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
58504
58505
14
    {&hf_ieee80211_he_phy_cap_triggered_cqi_fb,
58506
14
     {"Triggered CQI Feedback", "wlan.ext_tag.he_phy_cap.trig_cqi_fb",
58507
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
58508
58509
14
    {&hf_ieee80211_he_phy_cap_partial_bw_extended_range,
58510
14
     {"Partial Bandwidth Extended Range", "wlan.ext_tag.he_phy_cap.partial_bw_er",
58511
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
58512
58513
14
    {&hf_ieee80211_he_phy_cap_partial_bw_dl_mu_mimo,
58514
14
     {"Partial Bandwidth DL MU-MIMO", "wlan.ext_tag.he_phy_cap.partial_bw_dl_mu_mimo",
58515
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x4000, NULL, HFILL }},
58516
58517
14
    {&hf_ieee80211_he_phy_cap_ppe_threshold_present,
58518
14
     {"PPE Thresholds Present", "wlan.ext_tag.he_phy_cap.ppe_thres_present",
58519
14
      FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
58520
58521
14
    {&hf_ieee80211_he_phy_b56_to_b71,
58522
14
     {"Bits 56 to 71", "wlan.ext_tag.he_phy_cap.bits_56_to_71",
58523
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58524
58525
14
    {&hf_ieee80211_he_phy_cap_psr_based_sr_support,
58526
14
     {"PSR-based SR Support", "wlan.ext_tag.he_phy_cap.psr_based_sr_sup",
58527
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001, NULL, HFILL }},
58528
58529
14
    {&hf_ieee80211_he_phy_cap_power_boost_factor_ar_support,
58530
14
     {"Power Boost Factor ar Support", "wlan.ext_tag.he_phy_cap.pwr_bst_factor_ar_sup",
58531
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002, NULL, HFILL }},
58532
58533
14
    {&hf_ieee80211_he_phy_cap_he_su_ppdu_etc_gi,
58534
14
     {"HE SU PPDU And HE MU PPDU With 4x HE-LTF And 0.8us GI", "wlan.ext_tag.he_phy_cap.he_su_ppdu_etc_gi",
58535
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004, NULL, HFILL }},
58536
58537
14
    {&hf_ieee80211_he_phy_cap_max_nc,
58538
14
     {"Max Nc", "wlan.ext_tag.he_phy_cap.max_nc",
58539
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0038, NULL, HFILL }},
58540
58541
14
    {&hf_ieee80211_he_phy_cap_stbc_tx_gt_80_mhz,
58542
14
     {"STBC Tx > 80 MHz", "wlan.ext_tag.he_phy_cap.stbc_tx_gt_80_mhz",
58543
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
58544
58545
14
    {&hf_ieee80211_he_phy_cap_stbc_rx_gt_80_mhz,
58546
14
     {"STBC Rx > 80 MHz", "wlan.ext_tag.he_phy_cap.stbc_rx_gt_80_mhz",
58547
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080, NULL, HFILL }},
58548
58549
14
    {&hf_ieee80211_he_phy_cap_he_er_su_ppdu_4xxx_gi,
58550
14
     {"HE ER SU PPDU With 4x HE-LTF And 0.8us GI", "wlan.ext_tag.he_phy_cap.he_er_su_ppdu_4xxx_gi",
58551
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
58552
58553
14
    {&hf_ieee80211_he_phy_cap_20mhz_in_40mhz_24ghz_band,
58554
14
     {"20 MHz In 40 MHz HE PPDU In 2.4 GHz Band", "wlan.ext_tag.he_phy_cap.20_mhz_in_40_in_2_4ghz",
58555
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
58556
58557
14
    {&hf_ieee80211_he_phy_cap_20mhz_in_160_80p80_ppdu,
58558
14
     {"20 MHz In 160/80+80 MHz HE PPDU", "wlan.ext_tag.he_phy_cap.20_mhz_in_160_80p80_ppdu",
58559
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
58560
58561
14
    {&hf_ieee80211_he_phy_cap_80mgz_in_160_80p80_ppdu,
58562
14
     {"80 MHz In 160/80+80 MHz HE PPDU", "wlan.ext_tag.he_phy_cap.80_mhz_in_160_80p80_ppdu",
58563
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
58564
58565
14
    {&hf_ieee80211_he_phy_cap_he_er_su_ppdu_1xxx_gi,
58566
14
     {"HE ER SU PPDU With 1x HE-LTF And 0.8us GI", "wlan.ext_tag.he_phy_cap.he_er_su_ppdu_1xxx_gi",
58567
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
58568
58569
14
    {&hf_ieee80211_he_phy_cap_midamble_tx_rx_2x_xxx_ltf,
58570
14
     {"Midamble Tx/Rx 2x And 1x HE-LTF", "wlan.ext_tag.he_phy_cap.midamble_tx_rx_2x_1x_he_ltf",
58571
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
58572
58573
14
    {&hf_ieee80211_he_phy_b72_to_b87,
58574
14
     {"Bits 72 to 87", "wlan.ext_tag.he_phy_cap.bits_72_to_87",
58575
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58576
58577
14
    {&hf_ieee80211_he_phy_cap_dcm_max_ru,
58578
14
     {"DCM Max RU", "wlan.ext_tag.he_phy_cap.dcm_max_ru",
58579
14
      FT_UINT16, BASE_HEX, VALS(he_phy_dcm_max_ru_vals), 0xC000, NULL, HFILL }},
58580
58581
14
    {&hf_ieee80211_he_phy_cap_longer_than_16_he_sigb_ofdm_symbol_support,
58582
14
     {"Longer Than 16 HE SIG-B OFDM Symbols Support", "wlan.ext_tag.he_phy_cap.longer_than_16_he_sigb_ofdm_sym_support",
58583
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001, NULL, HFILL }},
58584
58585
14
    {&hf_ieee80211_he_phy_cap_non_triggered_cqi_feedback,
58586
14
     {"Non-Triggered CQI Feedback", "wlan.ext_tag.he_phy_cap.non_triggered_feedback",
58587
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002, NULL, HFILL }},
58588
58589
14
    {&hf_ieee80211_he_phy_cap_tx_1024_qam_242_tone_ru_support,
58590
14
     {"Tx 1024-QAM Support < 242-tone RU Support", "wlan.ext_tag.he_phy_cap.tx_1024_qam_support_lt_242_tone_ru",
58591
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004, NULL, HFILL }},
58592
58593
14
    {&hf_ieee80211_he_phy_cap_rx_1024_qam_242_tone_ru_support,
58594
14
     {"Rx 1024-QAM Support < 242-tone RU Support", "wlan.ext_tag.he_phy_cap.rx_1024_qam_support_lt_242_tone_ru",
58595
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0008, NULL, HFILL }},
58596
58597
14
    {&hf_ieee80211_he_phy_cap_rx_full_bw_su_using_he_muppdu_w_compressed_sigb,
58598
14
     {"Rx Full BW SU Using HE MU PPDU With Compressed HE-SIG-B", "wlan.ext_tag.he_phy_cap.rx_full_bw_su_using_he_mu_ppdu_with_compressed_sigb",
58599
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010, NULL, HFILL }},
58600
58601
14
    {&hf_ieee80211_he_phy_cap_rx_full_bw_su_using_he_muppdu_w_non_compressed_sigb,
58602
14
     {"Rx Full BW SU Using HE MU PPDU With Non-Compressed HE-SIG-B", "wlan.ext_tag.he_phy_cap.rx_full_bw_su_using_he_mu_ppdu_with_non_compressed_sigb",
58603
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020, NULL, HFILL }},
58604
58605
14
    {&hf_ieee80211_he_phy_cap_nominal_packet_padding,
58606
14
     {"Nominal Packet Padding", "wlan.ext_tag.he_phy_cap.nominal_packet_padding",
58607
14
      FT_UINT16, BASE_DEC, VALS(he_phy_nominal_packet_padding_vals), 0x00C0, NULL, HFILL }},
58608
58609
14
    {&hf_ieee80211_he_phy_cap_he_mu_ppdu_ru_rx_max,
58610
14
     {"HE MU PPDU With More Than One RU Rx Max N_HE-LTF", "wlan.ext_tag.he_phy_cap.he_mu_ppdu_ru_rx_max",
58611
14
      FT_UINT16, BASE_DEC, NULL, 0x0100, NULL, HFILL }},
58612
58613
14
    {&hf_ieee80211_he_phy_cap_b81_b87_reserved,
58614
14
     {"Reserved", "wlan.ext_tag.he_phy_cap.reserved_b81_b87",
58615
14
      FT_UINT16, BASE_HEX, NULL, 0xFE00, NULL, HFILL }},
58616
58617
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_1_ss,
58618
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_1_ss",
58619
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58620
58621
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_2_ss,
58622
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_2_ss",
58623
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58624
58625
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_3_ss,
58626
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_3_ss",
58627
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58628
58629
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_4_ss,
58630
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_4_ss",
58631
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58632
58633
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_5_ss,
58634
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_5_ss",
58635
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58636
58637
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_6_ss,
58638
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_6_ss",
58639
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58640
58641
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_7_ss,
58642
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_7_ss",
58643
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58644
58645
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_rx_8_ss,
58646
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_8_ss",
58647
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58648
58649
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_1_ss,
58650
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_1_ss",
58651
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58652
58653
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_2_ss,
58654
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_2_ss",
58655
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58656
58657
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_3_ss,
58658
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_3_ss",
58659
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58660
58661
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_4_ss,
58662
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_4_ss",
58663
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58664
58665
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_5_ss,
58666
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_5_ss",
58667
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58668
58669
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_6_ss,
58670
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_6_ss",
58671
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58672
58673
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_7_ss,
58674
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_7_ss",
58675
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58676
58677
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80_tx_8_ss,
58678
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_8_ss",
58679
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58680
58681
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_1_ss,
58682
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_1_ss",
58683
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58684
58685
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_2_ss,
58686
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_2_ss",
58687
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58688
58689
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_3_ss,
58690
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_3_ss",
58691
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58692
58693
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_4_ss,
58694
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_4_ss",
58695
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58696
58697
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_5_ss,
58698
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_5_ss",
58699
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58700
58701
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_6_ss,
58702
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_6_ss",
58703
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58704
58705
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_7_ss,
58706
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_7_ss",
58707
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58708
58709
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_rx_8_ss,
58710
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_8_ss",
58711
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58712
58713
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_1_ss,
58714
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_1_ss",
58715
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58716
58717
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_2_ss,
58718
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_2_ss",
58719
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58720
58721
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_3_ss,
58722
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_3_ss",
58723
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58724
58725
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_4_ss,
58726
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_4_ss",
58727
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58728
58729
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_5_ss,
58730
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_5_ss",
58731
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58732
58733
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_6_ss,
58734
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_6_ss",
58735
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58736
58737
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_7_ss,
58738
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_7_ss",
58739
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58740
58741
14
    {&hf_ieee80211_he_mcs_max_he_mcs_80p80_tx_8_ss,
58742
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_8_ss",
58743
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58744
58745
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_1_ss,
58746
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_1_ss",
58747
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58748
58749
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_2_ss,
58750
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_2_ss",
58751
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58752
58753
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_3_ss,
58754
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_3_ss",
58755
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58756
58757
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_4_ss,
58758
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_4_ss",
58759
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58760
58761
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_5_ss,
58762
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_5_ss",
58763
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58764
58765
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_6_ss,
58766
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_6_ss",
58767
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58768
58769
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_7_ss,
58770
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_7_ss",
58771
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58772
58773
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_rx_8_ss,
58774
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_8_ss",
58775
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58776
58777
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_1_ss,
58778
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_1_ss",
58779
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58780
58781
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_2_ss,
58782
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_2_ss",
58783
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58784
58785
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_3_ss,
58786
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_3_ss",
58787
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58788
58789
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_4_ss,
58790
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_4_ss",
58791
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58792
58793
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_5_ss,
58794
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_5_ss",
58795
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58796
58797
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_6_ss,
58798
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_6_ss",
58799
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58800
58801
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_7_ss,
58802
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_7_ss",
58803
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58804
58805
14
    {&hf_ieee80211_he_mcs_max_he_mcs_160_tx_8_ss,
58806
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_8_ss",
58807
14
      FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58808
58809
14
    {&hf_ieee80211_he_rx_he_mcs_map_lte_80,
58810
14
     {"Rx HE-MCS Map <= 80 MHz", "wlan.ext_tag.he_mcs_map.rx_he_mcs_map_lte_80",
58811
14
     FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58812
58813
14
    {&hf_ieee80211_he_tx_he_mcs_map_lte_80,
58814
14
     {"Tx HE-MCS Map <= 80 MHz", "wlan.ext_tag.he_mcs_map.tx_he_mcs_map_lte_80",
58815
14
     FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58816
58817
14
    {&hf_ieee80211_he_rx_he_mcs_map_160,
58818
14
     {"Rx HE-MCS Map 160 MHz", "wlan.ext_tag.he_mcs_map.rx_he_mcs_map_160",
58819
14
     FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58820
58821
14
    {&hf_ieee80211_he_tx_he_mcs_map_160,
58822
14
     {"Tx HE-MCS Map 160 MHz", "wlan.ext_tag.he_mcs_map.tx_he_mcs_map_160",
58823
14
     FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58824
58825
14
    {&hf_ieee80211_he_rx_he_mcs_map_80_80,
58826
14
     {"Rx HE-MCS Map 80+80 MHz", "wlan.ext_tag.he_mcs_map.rx_he_mcs_map_80_80",
58827
14
     FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58828
58829
14
    {&hf_ieee80211_he_tx_he_mcs_map_80_80,
58830
14
     {"Tx HE-MCS Map 80+80 MHz", "wlan.ext_tag.he_mcs_map.tx_he_mcs_map_80_80",
58831
14
     FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58832
58833
14
    {&hf_ieee80211_he_ppe_thresholds_nss,
58834
14
     {"NSS", "wlan.ext_tag.he_ppe_thresholds.nss",
58835
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
58836
58837
14
    {&hf_ieee80211_he_ppe_thresholds_ru_index_bitmask,
58838
14
     {"RU Index Bitmask", "wlan.ext_tag.he_ppe_thresholds.ru_index_bitmask",
58839
14
      FT_UINT8, BASE_HEX, NULL, 0x78, NULL, HFILL }},
58840
58841
14
    {&hf_ieee80211_he_ppe_ppet16,
58842
14
     {"PPET16","wlan.ext_tag.he_ppe_thresholds.ppet16",
58843
14
      FT_UINT8, BASE_HEX, VALS(constellation_vals), 0x0, NULL, HFILL }},
58844
58845
14
    {&hf_ieee80211_he_ppe_ppet8,
58846
14
     {"PPET8","wlan.ext_tag.he_ppe_thresholds.ppet8",
58847
14
      FT_UINT8, BASE_HEX, VALS(constellation_vals), 0x0, NULL, HFILL }},
58848
58849
14
    {&hf_ieee80211_he_operation_parameter,
58850
14
     {"HE Operation Parameters", "wlan.ext_tag.he_operation.params",
58851
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
58852
58853
14
    {&hf_ieee80211_he_operation_default_pe_duration,
58854
14
     {"Default PE Duration", "wlan.ext_tag.he_operation.default_pe_duration",
58855
14
      FT_UINT24, BASE_DEC, NULL, 0x000007, NULL, HFILL }},
58856
58857
14
    {&hf_ieee80211_he_operation_twt_required,
58858
14
     {"TWT Required", "wlan.ext_tag.he_operation.twt_required",
58859
14
      FT_BOOLEAN, 24, TFS(&tfs_required_not_required), 0x000008, NULL, HFILL }},
58860
58861
14
    {&hf_ieee80211_he_operation_txop_duration_rts_threshold,
58862
14
     {"TXOP Duration RTS Threshold", "wlan.ext_tag.he_operation.txop_duration_rts_thresh",
58863
14
      FT_UINT24, BASE_DEC, NULL, 0x003FF0, NULL, HFILL }},
58864
58865
14
    {&hf_ieee80211_he_operation_vht_operation_information_present,
58866
14
     {"VHT Operation Information Present", "wlan.ext_tag.he_operation.vht_op_info_present",
58867
14
      FT_BOOLEAN, 24, NULL, 0x004000, NULL, HFILL }},
58868
58869
14
    {&hf_ieee80211_he_operation_co_hosted_bss,
58870
14
     {"Co-Hosted BSS", "wlan.ext_tag.he_operation.co_hosted_bss",
58871
14
      FT_BOOLEAN, 24, NULL, 0x008000, NULL, HFILL }},
58872
58873
14
    {&hf_ieee80211_he_operation_er_su_disable,
58874
14
     {"ER SU Disable", "wlan.ext_tag.he_operation.er_su_disable",
58875
14
      FT_BOOLEAN, 24, NULL, 0x010000, NULL, HFILL }},
58876
58877
14
    {&hf_ieee80211_he_operation_6ghz_operation_information_present,
58878
14
     {"6 GHz Operation Information Present", "wlan.ext_tag.he_operation.6ghz_operation_information_present",
58879
14
      FT_BOOLEAN, 24, NULL, 0x020000, NULL, HFILL }},
58880
58881
14
    {&hf_ieee80211_he_operation_reserved_b16_b23,
58882
14
     {"Reserved", "wlan.ext_tag.he_operation.reserved_b16_b32",
58883
14
      FT_UINT24, BASE_HEX, NULL, 0xFC0000, NULL, HFILL }},
58884
58885
14
    {&hf_ieee80211_he_bss_color_information,
58886
14
     {"BSS Color Information", "wlan.ext_tag.bss_color_information",
58887
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
58888
58889
14
    {&hf_ieee80211_he_bss_color_info_bss_color,
58890
14
     {"BSS Color", "wlan.ext_tag.bss_color_information.bss_color",
58891
14
      FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL }},
58892
58893
14
    {&hf_ieee80211_he_bss_color_partial_bss_color,
58894
14
     {"Partial BSS Color", "wlan.ext_tag.bss_color_information.partial_bss_color",
58895
14
      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
58896
58897
14
    {&hf_ieee80211_he_bss_color_bss_color_disabled,
58898
14
     {"BSS Color Disabled", "wlan.ext_tag.bss_color_information.bss_color_disabled",
58899
14
      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
58900
58901
14
    {&hf_ieee80211_he_operation_basic_mcs,
58902
14
     {"Basic HE-MCS and NSS Set", "wlan.ext_tag.he_operation.basic_he_mcs_and_nss",
58903
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
58904
58905
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_1_ss,
58906
14
     {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_1_ss",
58907
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
58908
58909
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_2_ss,
58910
14
     {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_2_ss",
58911
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
58912
58913
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_3_ss,
58914
14
     {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_3_ss",
58915
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
58916
58917
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_4_ss,
58918
14
     {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_4_ss",
58919
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
58920
58921
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_5_ss,
58922
14
     {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_5_ss",
58923
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
58924
58925
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_6_ss,
58926
14
     {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_6_ss",
58927
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
58928
58929
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_7_ss,
58930
14
     {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_7_ss",
58931
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
58932
58933
14
    {&hf_ieee80211_he_oper_max_he_mcs_for_8_ss,
58934
14
     {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_8_ss",
58935
14
      FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
58936
58937
14
    {&hf_ieee80211_he_operation_channel_width,
58938
14
     {"Channel Width", "wlan.ext_tag.he_operation.vht_op_info.channel_width",
58939
14
      FT_UINT8, BASE_DEC, VALS(channel_width_vals), 0, NULL, HFILL }},
58940
58941
14
    {&hf_ieee80211_he_operation_channel_center_freq_0,
58942
14
     {"Channel Center Frequency Segment 0", "wlan.ext_tag.he_operation.vht_op_info.chan_center_freq_seg_0",
58943
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58944
58945
14
    {&hf_ieee80211_he_operation_channel_center_freq_1,
58946
14
     {"Channel Center Frequency Segment 1", "wlan.ext_tag.he_operation.vht_op_info.chan_center_freq_seg_1",
58947
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58948
58949
14
    {&hf_ieee80211_he_operation_max_co_hosted_bssid_indicator,
58950
14
     {"Max Co-Hosted BSSID Indicator", "wlan.ext_tag.he_operation.max_co_hosted_bssid_indicator",
58951
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58952
58953
14
    {&hf_ieee80211_he_operation_6ghz_primary_channel,
58954
14
     {"Primary Channel", "wlan.ext_tag.he_operation.6ghz.primary_channel",
58955
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58956
58957
14
    {&hf_ieee80211_he_operation_6ghz_control,
58958
14
     {"Control", "wlan.ext_tag.he_operation.6ghz.control",
58959
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
58960
58961
14
    {&hf_ieee80211_he_operation_6ghz_control_channel_width,
58962
14
     {"Channel Width", "wlan.ext_tag.he_operation.6ghz.control.channel_width",
58963
14
      FT_UINT8, BASE_DEC, VALS(operating_mode_field_channel_width), 0x03, NULL, HFILL }},
58964
58965
14
    {&hf_ieee80211_he_operation_6ghz_control_duplicate_beacon,
58966
14
     {"Duplicate Beacon", "wlan.ext_tag.he_operation.6ghz.control.duplicate_beacon",
58967
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
58968
58969
14
    {&hf_ieee80211_he_operation_6ghz_control_regulatory_info,
58970
14
     {"Regulatory Info", "wlan.ext_tag.he_operation.6ghz.control.regulatory_info",
58971
14
      FT_UINT8, BASE_DEC, NULL, 0x78, NULL, HFILL }},
58972
58973
14
    {&hf_ieee80211_he_operation_6ghz_control_reserved,
58974
14
     {"Reserved", "wlan.ext_tag.he_operation.6ghz.control.reserved",
58975
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
58976
58977
14
    {&hf_ieee80211_he_operation_6ghz_channel_center_freq_0,
58978
14
     {"Channel Center Frequency Segment 0", "wlan.ext_tag.he_operation.6ghz.chan_center_freq_seg_0",
58979
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58980
58981
14
    {&hf_ieee80211_he_operation_6ghz_channel_center_freq_1,
58982
14
     {"Channel Center Frequency Segment 1", "wlan.ext_tag.he_operation.6ghz.chan_center_freq_seg_1",
58983
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58984
58985
14
    {&hf_ieee80211_he_operation_6ghz_minimum_rate,
58986
14
     {"Minimum Rate", "wlan.ext_tag.he_operation.6ghz.minimum_rate",
58987
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
58988
58989
14
    {&hf_ieee80211_he_muac_aci_aifsn,
58990
14
     {"AIC/AIFSN","wlan.ext_tag.mu_edca_parameter_set.aic_aifsn",
58991
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
58992
58993
14
    {&hf_ieee80211_he_muac_aifsn,
58994
14
     {"AIFSN", "wlan.ext_tag.mu_edca_parameter_set.aifsn",
58995
14
      FT_UINT8, BASE_DEC, NULL, 0x0F,
58996
14
      NULL, HFILL }},
58997
58998
14
    {&hf_ieee80211_he_muac_acm,
58999
14
     {"Admission Control Mandatory", "wlan.ext_tag.mu_edca_parameter_set.acm",
59000
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
59001
14
      NULL, HFILL }},
59002
59003
14
    {&hf_ieee80211_he_muac_aci,
59004
14
     {"ACI", "wlan.ext_tag.mu_edca_parameter_set.aci",
59005
14
      FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
59006
14
      NULL, HFILL }},
59007
59008
14
    {&hf_ieee80211_he_muac_reserved,
59009
14
     {"Reserved", "wlan.ext_tag.mu_edca_parameter_set.reserved",
59010
14
      FT_UINT8, BASE_DEC, NULL, 0x80,
59011
14
      "Must be Zero", HFILL }},
59012
59013
14
    {&hf_ieee80211_he_mu_edca_timer,
59014
14
     {"MU EDCA Timer","wlan.ext_tag.mu_edca_parameter_set.mu_edca_timer",
59015
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59016
59017
14
    {&hf_ieee80211_he_muac_ecwmin_ecwmax,
59018
14
     {"ECWmin/ECWmax","wlan.ext_tag.mu_edca_parameter_set.ecwmin_ecwmax",
59019
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59020
59021
14
    {&hf_ieee80211_he_spatial_reuse_sr_control,
59022
14
     {"SR Control", "wlan.ext_tag.spatial_reuse.sr_control",
59023
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59024
59025
14
    {&hf_ieee80211_he_srp_disallowed,
59026
14
     {"SRP Disallowed", "wlan.ext_tag.spatial_reuse.sr_control.srp_dis",
59027
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
59028
59029
14
    {&hf_ieee80211_he_non_srg_obss_pd_sr_disallowed,
59030
14
     {"NON-SRG OBSS PD SR Disallowed", "wlan.ext_tag.spatial_reuse.sr_control.non_srg_obss_pd_sr_dis",
59031
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
59032
59033
14
    {&hf_ieee80211_he_non_srg_offset_present,
59034
14
     {"Non-SRG Offset Present", "wlan.ext_tag.spatial_reuse.sr_control.non_srg_ofs_present",
59035
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
59036
59037
14
    {&hf_ieee80211_he_srg_information_present,
59038
14
     {"SRG Information Present", "wlan.ext_tag.spatial_reuse.sr_control.srg_info_present",
59039
14
     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
59040
59041
14
    {&hf_ieee80211_he_hesiga_spatial_reuse_value15_allowed,
59042
14
     {"HESIGA Spatial Reuse value 15 allowed", "wlan.ext_tag.spatial_reuse.sr_control.hesiga_val_15_allowed",
59043
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
59044
59045
14
    {&hf_ieee80211_he_sr_control_reserved,
59046
14
     {"Reserved", "wlan.ext_tag.spatial_reuse.sr_control.reserved",
59047
14
      FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL }},
59048
59049
14
    {&hf_ieee80211_he_spatial_non_srg_obss_pd_max_offset,
59050
14
     {"Non-SRG OBSS PD Max Offset", "wlan.ext_tag.spatial_reuse.non_srg_obss_pd_max_offset",
59051
14
      FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59052
59053
14
    {&hf_ieee80211_he_spatial_srg_obss_pd_min_offset,
59054
14
     {"SRG OBSS PD Min Offset", "wlan.ext_tag.spatial_reuse.srg_obss_pd_min_offset",
59055
14
      FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59056
59057
14
    {&hf_ieee80211_he_spatial_srg_obss_pd_max_offset,
59058
14
     {"SRG OBSS PD Max Offset", "wlan.ext_tag.spatial_reuse.srg_obss_pd_max_offset",
59059
14
      FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59060
59061
14
    {&hf_ieee80211_he_spatial_srg_bss_color_bitmap,
59062
14
     {"SRG BSS Color Bitmap", "wlan.ext_tag.spatial_reuse.srg_bss_color_bitmap",
59063
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
59064
59065
14
    {&hf_ieee80211_he_spatial_srg_partial_bssid_bitmap,
59066
14
     {"SRG Partial BSSID Bitmap", "wlan.ext_tag.spatial_reuse.srg_partial_bssid_bitmap",
59067
14
      FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
59068
59069
14
    {&hf_ieee80211_he_resource_request_buffer_thresh,
59070
14
     {"Resource Request Buffer Threshold Exponent", "wlan.ext_tag.ndp_feedback.res_req_buf_thresh_exp",
59071
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59072
59073
14
    {&hf_ieee80211_he_bss_color_change_new_color_info,
59074
14
     {"New BSS Color Info", "wlan.ext_tag.bss_color_change.new_color_info",
59075
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59076
59077
14
    {&hf_ieee80211_he_new_bss_color_info_color,
59078
14
     {"New BSS Color", "wlan.ext_tag.bss_color_change.new_bss_color",
59079
14
      FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL }},
59080
59081
14
    {&hf_ieee80211_he_new_bss_color_info_reserved,
59082
14
     {"Reserved", "wlan.ext_tag.bss_color_change.new_color_reserved",
59083
14
      FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL }},
59084
59085
14
    {&hf_ieee80211_he_bss_color_change_switch_countdown,
59086
14
     {"BSS Color Switch Countdown", "wlan.ext_tag.bss_color_change.color_switch_countdown",
59087
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59088
59089
14
    {&hf_ieee80211_he_ess_report_planned_ess,
59090
14
     {"Planned ESS", "wlan.ext_tag.ess_report.ess_info.planned_ess",
59091
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
59092
59093
14
    {&hf_ieee80211_he_ess_report_edge_of_ess,
59094
14
     {"Edge of ESS", "wlan.ext_tag.ess_report.ess_info.edge_of_ess",
59095
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
59096
59097
14
    {&hf_ieee80211_he_ess_report_info_field,
59098
14
     {"ESS Information field", "wlan.ext_tag.ess_report.ess_info.field",
59099
14
     FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL }},
59100
59101
14
    {&hf_ieee80211_he_ess_report_recommend_transition_thresh,
59102
14
     {"Recommended BSS Transition Threshold", "wlan.ext_tag.ess_report.ess_info.thresh",
59103
14
     FT_INT8, BASE_DEC, NULL, 0xFC, NULL, HFILL }},
59104
59105
14
    {&hf_ieee80211_he_ops_duration,
59106
14
     {"OPS Duration", "wlan.ext_tag.ops.ops_duration",
59107
14
      FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL }},
59108
59109
14
    {&hf_ieee80211_he_uora_field,
59110
14
     {"UL OFDMA-based Random Access Parameter SET", "wlan.ext_tag.uora_parameter_set.field",
59111
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59112
59113
14
    {&hf_ieee80211_he_uora_eocwmin,
59114
14
     {"EOCWmin", "wlan.ext_tag.uora_parameter_set.eocwmin",
59115
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
59116
59117
14
    {&hf_ieee80211_he_uora_owcwmax,
59118
14
     {"EOCWmax", "wlan.ext_tag.uora_parameter_set.eocwmax",
59119
14
      FT_UINT8, BASE_DEC, NULL, 0x38, NULL, HFILL }},
59120
59121
14
    {&hf_ieee80211_he_uora_reserved,
59122
14
     {"Reserved", "wlan.ext_tag.uora_parameter_set.reserved",
59123
14
      FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL }},
59124
59125
14
    {&hf_ieee80211_max_channel_switch_time,
59126
14
     {"Max Channel Switch Time",
59127
14
      "wlan.ext_tag.max_channel_switch_time.switch_time",
59128
14
      FT_UINT24, BASE_DEC|BASE_UNIT_STRING, UNS(&units_tu_tus), 0x0, NULL, HFILL }},
59129
59130
14
    {&hf_ieee80211_oci_operating_class,
59131
14
     {"Operating Class", "wlan.ext_tag.oci.operating_class",
59132
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59133
59134
14
    {&hf_ieee80211_oci_primary_channel_number,
59135
14
     {"Primary Channel Number", "wlan.ext_tag.oci.primary_channel_number",
59136
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59137
59138
14
    {&hf_ieee80211_oci_frequency_segment_1,
59139
14
     {"Frequency Segment 1 Channel Number",
59140
14
      "wlan.ext_tag.oci.frequency_segment_1_channel_number",
59141
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59142
59143
14
    {&hf_ieee80211_oci_oct_operating_class,
59144
14
     {"OCT Operating Class", "wlan.ext_tag.oci.oct_operating_class",
59145
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59146
59147
14
    {&hf_ieee80211_oci_oct_primary_channel_number,
59148
14
     {"OCT Primary Channel Number",
59149
14
      "wlan.ext_tag.oci.oct_primary_channel_number",
59150
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59151
59152
14
    {&hf_ieee80211_oci_oct_frequency_segment_1,
59153
14
     {"OCT Frequency Segment 1 Channel Number",
59154
14
      "wlan.ext_tag.oci.oct_frequency_segment_1_channel_number",
59155
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59156
59157
14
    {&hf_ieee80211_multiple_bssid_configuration_bssid_count,
59158
14
     {"BSSID Count", "wlan.ext_tag.multiple_bssid_configuration.bssid_count",
59159
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59160
59161
14
    {&hf_ieee80211_non_inheritance_element_id_list_length,
59162
14
     {"Length", "wlan.ext_tag.non_inheritance.element_id_list.length",
59163
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59164
59165
14
    {&hf_ieee80211_non_inheritance_element_id_list_element_id,
59166
14
     {"Element ID", "wlan.ext_tag.non_inheritance.element_id_list.element_id",
59167
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59168
59169
14
    {&hf_ieee80211_non_inheritance_element_id_ext_list_length,
59170
14
     {"Length", "wlan.ext_tag.non_inheritance.element_id_ext_list.length",
59171
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59172
59173
14
    {&hf_ieee80211_non_inheritance_element_id_ext_list_element_id_ext,
59174
14
     {"Element ID Extension", "wlan.ext_tag.non_inheritance.element_id_ext_list.element_id_ext",
59175
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59176
59177
14
    {&hf_ieee80211_multiple_bssid_configuration_full_set_rx_periodicity,
59178
14
     {"Full Set Rx Periodicity", "wlan.ext_tag.multiple_bssid_configuration.full_set_rx_periodicity",
59179
14
     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59180
59181
14
    {&hf_ieee80211_known_bssid_bitmap,
59182
14
     {"Bitmap", "wlan.ext_tag.known_bssid.bitmap",
59183
14
     FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59184
59185
14
    {&hf_ieee80211_short_ssid,
59186
14
     {"Short SSID", "wlan.ext_tag.short_ssid",
59187
14
     FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59188
59189
14
    {&hf_ieee80211_rejected_groups_group,
59190
14
     {"Rejected Finite Cyclic Group", "wlan.ext_tag.rejected_groups.group",
59191
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59192
59193
14
    {&hf_ieee80211_ff_s1g_action,
59194
14
      {"S1G Action", "wlan.s1g.action",
59195
14
       FT_UINT8, BASE_DEC, VALS(s1g_action_vals), 0, NULL, HFILL }},
59196
59197
14
    {&hf_ieee80211_ff_prot_s1g_action,
59198
14
      {"Protected S1G Action", "wlan.s1g.prot_action",
59199
14
       FT_UINT8, BASE_DEC, VALS(prot_s1g_action_vals), 0, NULL, HFILL }},
59200
59201
14
    {&hf_ieee80211_ff_s1g_timestamp,
59202
14
     {"Timestamp", "wlan.s1g.timestamp",
59203
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
59204
59205
14
    {&hf_ieee80211_ff_s1g_change_sequence,
59206
14
     {"Change Sequence", "wlan.s1g.change_sequence",
59207
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59208
59209
14
    {&hf_ieee80211_ff_s1g_next_tbtt,
59210
14
     {"Next TBTT", "wlan.s1g.next_tbtt",
59211
14
      FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
59212
59213
14
    {&hf_ieee80211_ff_s1g_compressed_ssid,
59214
14
     {"Compressed SSID", "wlan.s1g.compressed_ssid",
59215
14
      FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
59216
59217
14
    {&hf_ieee80211_ff_s1g_access_network_options,
59218
14
     {"Access Network Options", "wlan.s1g.access_network_options",
59219
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59220
59221
14
    {&hf_ieee80211_s1g_sync_control,
59222
14
     {"Sync Control", "wlan.s1g.sync_control",
59223
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59224
59225
14
    {&hf_ieee80211_s1g_sync_control_uplink_sync_request,
59226
14
     {"Uplink Sync Request", "wlan.s1g.sync_control.uplink_sync_request",
59227
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
59228
59229
14
    {&hf_ieee80211_s1g_sync_control_time_slot_protection_request,
59230
14
     {"Time Slot Protection request",
59231
14
      "wlan.s1g.sync_control.time_slot_protection_request",
59232
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
59233
59234
14
    {&hf_ieee80211_s1g_sync_control_reserved,
59235
14
     {"Reserved", "wlan.s1g.sync_control.reserved",
59236
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
59237
59238
14
    {&hf_ieee80211_s1g_sector_id_index,
59239
14
     {"Sector ID Index", "wlan.s1g.sector_id_index",
59240
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59241
59242
14
    {&hf_ieee80211_s1g_sector_id_preferred_sector_id,
59243
14
     {"Preferred Sector ID", "wlan.s1g.sector_id_index.preferred_sector_id",
59244
14
      FT_UINT16, BASE_DEC, NULL, 0x0007, NULL, HFILL }},
59245
59246
14
    {&hf_ieee80211_s1g_sector_id_snr,
59247
14
     {"SNR", "wlan.s1g.sector_id_index.snr",
59248
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(s1g_sector_id_index_snr_custom),
59249
14
      0x00F8, NULL, HFILL }},
59250
59251
14
    {&hf_ieee80211_s1g_sector_id_receive_sector_bitmap,
59252
14
     {"Receive Sector Bitmap", "wlan.s1g.sector_id_index.receive_sector_bitmap",
59253
14
      FT_UINT16, BASE_HEX, NULL, 0xFF00, NULL, HFILL }},
59254
59255
14
    {&hf_ieee80211_s1g_twt_information_control,
59256
14
     {"TWT Information Control", "wlan.s1g.twt_information.control",
59257
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59258
59259
14
    {&hf_ieee80211_s1g_twt_next_twt_32,
59260
14
     {"Next TWT", "wlan.s1g.twt_information.next_twt32",
59261
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59262
59263
14
    {&hf_ieee80211_s1g_twt_next_twt_48,
59264
14
     {"Next TWT", "wlan.s1g.twt_information.next_twt48",
59265
14
      FT_UINT48, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59266
59267
14
    {&hf_ieee80211_s1g_twt_next_twt_64,
59268
14
     {"Next TWT", "wlan.s1g.twt_information.next_twt64",
59269
14
      FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59270
59271
14
    {&hf_ieee80211_s1g_twt_flow_identifier,
59272
14
     {"TWT Flow Identifier",
59273
14
      "wlan.s1g.twt_information.control.twt_flow_identifier",
59274
14
      FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
59275
59276
14
    {&hf_ieee80211_s1g_twt_response_required,
59277
14
     {"Response Requested",
59278
14
      "wlan.s1g.twt_information.control.response_requested",
59279
14
     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
59280
59281
14
    {&hf_ieee80211_s1g_twt_next_twt_request,
59282
14
     {"Next TWT Request", "wlan.s1g.twt_information.control.next_twt_request",
59283
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
59284
59285
14
    {&hf_ieee80211_s1g_twt_next_twt_subfield_size,
59286
14
     {"Next TWT Subfield Size",
59287
14
      "wlan.s1g.twt_information.control.next_twt_subfield_size",
59288
14
      FT_UINT8, BASE_HEX, NULL, 0x60, NULL, HFILL }},
59289
59290
14
    {&hf_ieee80211_s1g_twt_reserved,
59291
14
     {"Reserved", "wlan.s1g.twt_information.control.reserved",
59292
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
59293
59294
14
    {&hf_ieee80211_s1g_update_edca_info,
59295
14
     {"Update EDCA Info", "wlan.s1g.edca_param_set.update_edca_info",
59296
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59297
59298
14
    {&hf_ieee80211_s1g_update_edca_override,
59299
14
     {"Override", "wlan.s1g.edca_param_set.update_edca_info.override",
59300
14
      FT_BOOLEAN, 8, NULL, 0x01,
59301
14
      "Overrides the previously stored EDCAL parameters", HFILL }},
59302
59303
14
    {&hf_ieee80211_s1g_update_edca_ps_poll_aci,
59304
14
     {"PS-Poll ACI", "wlan.s1g.edca_param_set.update_edca_info.pd_poll_aci",
59305
14
      FT_UINT8, BASE_HEX, NULL, 0x06, NULL, HFILL }},
59306
59307
14
    {&hf_ieee80211_s1g_update_edca_raw_aci,
59308
14
     {"RAW ACI", "wlan.s1g.edca_param_set.update_edca_info.raw_aci",
59309
14
      FT_UINT8, BASE_HEX, NULL, 0x18, NULL, HFILL }},
59310
59311
14
    {&hf_ieee80211_s1g_update_edca_sta_type,
59312
14
     {"STA Type", "wlan.s1g.edca_param_set.update_edca_info.sta_type",
59313
14
      FT_UINT8, BASE_HEX, VALS(sta_field_type_vals), 0x60, NULL, HFILL }},
59314
59315
14
    {&hf_ieee80211_s1g_update_edca_reserved,
59316
14
     {"Reserved", "wlan.s1g.edca_param_set.update_edca_info.reserved",
59317
14
     FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
59318
59319
14
    {&hf_ieee80211_twt_bcast_flow,
59320
14
      {"TWT Flow", "wlan.twt.bcast_flow",
59321
14
       FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59322
59323
14
    {&hf_ieee80211_twt_individual_flow,
59324
14
      {"TWT Flow", "wlan.twt.individual_flow",
59325
14
       FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59326
59327
14
    {&hf_ieee80211_twt_individual_flow_id,
59328
14
      {"Individual TWT Flow Id", "wlan.twt.individual_flow_id",
59329
14
       FT_UINT8, BASE_DEC, NULL, 0x7, NULL, HFILL }},
59330
59331
14
    {&hf_ieee80211_twt_individual_reserved,
59332
14
     {"Reserved", "wlan.twt.individual_reserved",
59333
14
      FT_UINT8, BASE_HEX, NULL, 0x18, NULL, HFILL }},
59334
59335
14
    {&hf_ieee80211_twt_bcast_id,
59336
14
      {"Broadcast TWT Id", "wlan.twt.bcast_flow_id",
59337
14
       FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL }},
59338
59339
14
    {&hf_ieee80211_twt_neg_type,
59340
14
      {"TWT Negotiation type", "wlan.twt.neg_type",
59341
14
       FT_UINT8, BASE_DEC, VALS(twt_neg_type_vals), 0x60,
59342
14
       NULL, HFILL }},
59343
59344
14
    {&hf_ieee80211_twt_neg_type2_reserved1,
59345
14
     {"Reserved", "wlan.twt.flow_id_reserved1",
59346
14
      FT_UINT8, BASE_HEX, NULL, 0x1f, NULL, HFILL }},
59347
59348
14
    {&hf_ieee80211_twt_neg_type2_reserved2,
59349
14
     {"Reserved", "wlan.twt.flow_id_reserved2",
59350
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
59351
59352
14
    {&hf_ieee80211_twt_bcast_teardown_all,
59353
14
     {"TWT Flow", "wlan.twt.bcast_flow",
59354
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59355
59356
14
    {&hf_ieee80211_twt_bcast_twt_id_reserved,
59357
14
     {"Reserved", "wlan.twt.bcast_flow.twt_id_reserved",
59358
14
      FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL }},
59359
59360
14
    {&hf_ieee80211_twt_bcast_neg_type_reserved,
59361
14
     {"Reserved", "wlan.twt.bcast_flow.negotiation_type_reserved",
59362
14
      FT_UINT8, BASE_HEX, NULL, 0x60, NULL, HFILL }},
59363
59364
14
    {&hf_ieee80211_twt_bcast_teardown_all_twt,
59365
14
     {"Teardown All TWT", "wlan.twt.bcast_flow.teardown_all_twt",
59366
14
      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
59367
59368
14
    {&hf_ieee80211_tag_twt_control_field,
59369
14
      {"Control Field", "wlan.twt.control_field",
59370
14
       FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59371
59372
14
    {&hf_ieee80211_tag_twt_ndp_paging_indicator,
59373
14
     {"NDP Paging Indicator", "wlan.twt.ndp_paging_indicator",
59374
14
      FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x1, NULL, HFILL }},
59375
59376
14
    {&hf_ieee80211_tag_twt_responder_pm_mode,
59377
14
     {"Responder PM Mode", "wlan.twt.resp_pm",
59378
14
      FT_BOOLEAN, 8, TFS(&twt_responder_pm_mode_tfs), 0x2, NULL, HFILL }},
59379
59380
14
    {&hf_ieee80211_tag_twt_neg_type,
59381
14
      {"Negotiation type", "wlan.twt.neg_type",
59382
14
       FT_UINT8, BASE_DEC, VALS(twt_neg_type_vals), 0xc, NULL, HFILL }},
59383
59384
14
    {&hf_ieee80211_tag_twt_info_frame_disabled,
59385
14
     {"TWT Information Frame Disabled", "wlan.twt.info_frame_disabled",
59386
14
      FT_BOOLEAN, 8, TFS(&twt_info_frame_disabled_tfs), 0x10, NULL, HFILL }},
59387
59388
14
    {&hf_ieee80211_tag_twt_wake_duration_unit,
59389
14
     {"Wake Duration Unit", "wlan.twt.wake_duration_unit",
59390
14
      FT_BOOLEAN, 8, TFS(&twt_wake_duration_unit_tfs), 0x20, NULL, HFILL }},
59391
59392
14
    {&hf_ieee80211_tag_twt_link_id_bitmap_present,
59393
14
     {"Link ID Bitmap Present", "wlan.twt.link_id_bitmap_present",
59394
14
      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
59395
59396
14
    {&hf_ieee80211_tag_twt_aligned_twt,
59397
14
      {"Aligned TWT", "wlan.twt.aligned_twt",
59398
14
       FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
59399
59400
14
    {&hf_ieee80211_tag_twt_req_type_field,
59401
14
      {"Request Type", "wlan.twt.request_type",
59402
14
       FT_UINT16, BASE_HEX, NULL, 0, NULL,  HFILL }},
59403
59404
14
    {&hf_ieee80211_tag_twt_req_type_req,
59405
14
      {"Requester", "wlan.twt.requester",
59406
14
       FT_BOOLEAN, 16, TFS(&twt_requester_tfs), 0x0001, NULL, HFILL }},
59407
59408
14
    {&hf_ieee80211_tag_twt_req_type_setup_cmd,
59409
14
      {"Setup Command", "wlan.twt.setup_cmd",
59410
14
       FT_UINT16, BASE_DEC, VALS(twt_setup_cmd), 0x000e, NULL, HFILL }},
59411
59412
14
    {&hf_ieee80211_tag_twt_req_type_trigger,
59413
14
      {"Trigger", "wlan.twt.trigger",
59414
14
       FT_BOOLEAN, 16, TFS(&twt_trigger), 0x0010, NULL, HFILL }},
59415
59416
14
    {&hf_ieee80211_tag_twt_req_type_implicit,
59417
14
      {"Implicit", "wlan.twt.implicit",
59418
14
       FT_BOOLEAN, 16, TFS(&twt_implicit), 0x0020, NULL, HFILL }},
59419
59420
14
    {&hf_ieee80211_tag_twt_req_type_flow_type,
59421
14
      {"Flow type", "wlan.twt.flow_type",
59422
14
       FT_BOOLEAN, 16, TFS(&twt_flow_type), 0x0040, NULL, HFILL }},
59423
59424
14
    {&hf_ieee80211_tag_twt_req_type_flow_id,
59425
14
      {"Flow ID", "wlan.twt.flow_id",
59426
14
       FT_UINT16, BASE_DEC, NULL, 0x0380, NULL, HFILL }},
59427
59428
14
    {&hf_ieee80211_tag_twt_req_type_wake_int_exp,
59429
14
      {"Wake Interval Exponent", "wlan.twt.wake_interval_exp",
59430
14
       FT_UINT16, BASE_DEC, NULL, 0x7c00, NULL, HFILL }},
59431
59432
14
    {&hf_ieee80211_tag_twt_req_type_prot,
59433
14
      {"Protection", "wlan.twt.prot",
59434
14
       FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
59435
59436
14
    {&hf_ieee80211_tag_twt_req_type_last_bcst_parm_set,
59437
14
      {"Last Broadcast Parameter Set",
59438
14
       "wlan.twt.last_broadcast_parameter_set",
59439
14
       FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL }},
59440
59441
14
    {&hf_ieee80211_tag_twt_req_type_bcst_twt_recom,
59442
14
      {"Broadcast TWT Recommendation", "wlan.twt.broadcast_twt_recommendation",
59443
14
       FT_UINT16, BASE_DEC, NULL, 0x0380, NULL, HFILL }},
59444
59445
14
    {&hf_ieee80211_tag_twt_req_type_aligned,
59446
14
      {"Aligned", "wlan.twt.aligned",
59447
14
       FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL }},
59448
59449
14
    {&hf_ieee80211_tag_twt_ndp_paging_field,
59450
14
     {"NDP Paging", "wlan.twt.ndp_paging",
59451
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59452
59453
14
    {&hf_ieee80211_tag_twt_ndp_paging_p_id,
59454
14
     {"P-ID", "wlan.twt.ndp_paging.p_id",
59455
14
      FT_UINT32, BASE_HEX, NULL, 0x000001FF, NULL, HFILL }},
59456
59457
14
    {&hf_ieee80211_tag_twt_ndp_max_ndp_paging_period,
59458
14
     {"Max NDP Paging Period", "wlan.twt.ndp_paging.max_ndp_paging_period",
59459
14
      FT_UINT32, BASE_DEC, NULL, 0x0001FE00, NULL, HFILL }},
59460
59461
14
    {&hf_ieee80211_tag_twt_ndp_partial_tsf_offset,
59462
14
     {"Partial TSF Offset", "wlan.twt.ndp_paging.partial_tsf_offset",
59463
14
      FT_UINT32, BASE_DEC, NULL, 0x001E0000, NULL, HFILL }},
59464
59465
14
    {&hf_ieee80211_tag_twt_ndp_action,
59466
14
     {"Action", "wlan.twt.ndp_paging.action",
59467
14
      FT_UINT32, BASE_DEC, VALS(twt_ndp_action_vals),
59468
14
      0x00E00000, NULL, HFILL }},
59469
59470
14
    {&hf_ieee80211_tag_twt_ndp_min_sleep_duration,
59471
14
     {"Min Sleep Duration", "wlan.twt.ndp_paging.min_sleep_duration",
59472
14
      FT_UINT32, BASE_DEC, NULL, 0x3C000000, NULL, HFILL }},
59473
59474
14
    {&hf_ieee80211_tag_twt_ndp_reserved,
59475
14
     {"Reserved", "wlan.twt.ndp_paging.reserved",
59476
14
      FT_UINT32, BASE_HEX, NULL, 0xC0000000, NULL, HFILL }},
59477
59478
14
    {&hf_ieee80211_tag_twt_link_id_bitmap,
59479
14
     {"Link ID Bitmap", "wlan.twt.link_id_bitmap",
59480
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
59481
59482
14
    {&hf_ieee80211_tag_twt_aligned_twt_link_bitmap,
59483
14
     {"Aligned TWT Link Bitmap", "wlan.twt.aligned_twt_link_bitmap",
59484
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
59485
59486
14
    {&hf_ieee80211_tag_twt_broadcast_info,
59487
14
     {"Broadcast TWT Info", "wlan.twt.broadcast_twt_info",
59488
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
59489
59490
14
    {&hf_ieee80211_tag_twt_bcast_info_persistence,
59491
14
     {"Broadcast TWT Persistence",
59492
14
      "wlan.twt.bcast_twt_info.broadcast_twt_persistence",
59493
14
      FT_UINT16, BASE_HEX, NULL, 0xFF00, NULL, HFILL }},
59494
59495
14
    {&hf_ieee80211_tag_twt_bcast_info_id,
59496
14
     {"Broadcast TWT ID", "wlan.twt.bcast_twt_info.broadcast_twt_id",
59497
14
      FT_UINT16, BASE_HEX, NULL, 0x00F8, NULL, HFILL }},
59498
59499
14
    {&hf_ieee80211_tag_twt_bcast_info_rtwt_sche_info,
59500
14
     {"Restricted TWT Schedule Info", "wlan.twt.bcast_twt_info.rtwt_schedule_info",
59501
14
      FT_UINT16, BASE_HEX, NULL, 0x0006, NULL, HFILL }},
59502
59503
14
    {&hf_ieee80211_tag_twt_bcast_info_rtwt_traffic_present,
59504
14
     {"Restricted TWT Traffic Info Present", "wlan.twt.bcast_twt_info.rtwt_traffic_info_present",
59505
14
      FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL }},
59506
59507
14
    {&hf_ieee80211_tag_twt_traffic_info_control,
59508
14
      {"Traffic Info Control", "wlan.twt.traffic_info.control",
59509
14
       FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59510
59511
14
    {&hf_ieee80211_tag_twt_traffic_info_dl_bitmap_valid,
59512
14
      {"DL TID Bitmap Valid", "wlan.twt.traffic_info.dl_tid_bitmap_valid",
59513
14
       FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
59514
59515
14
    {&hf_ieee80211_tag_twt_traffic_info_ul_bitmap_valid,
59516
14
      {"UL TID Bitmap Valid", "wlan.twt.traffic_info.ul_tid_bitmap_valid",
59517
14
       FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
59518
59519
14
    {&hf_ieee80211_tag_twt_traffic_info_reserved,
59520
14
      {"Reserved", "wlan.twt.traffic_info.reserved",
59521
14
       FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
59522
59523
14
    {&hf_ieee80211_tag_twt_traffic_info_rtwt_dl_bitmap,
59524
14
      {"Restricted TWT DL TID Bitmap", "wlan.twt.traffic_info.dl_tid_bitmap",
59525
14
       FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59526
59527
14
    {&hf_ieee80211_tag_twt_traffic_info_rtwt_ul_bitmap,
59528
14
      {"Restricted TWT UL TID Bitmap", "wlan.twt.traffic_info.ul_tid_bitmap",
59529
14
       FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59530
59531
14
    {&hf_ieee80211_tag_twt_target_wake_time,
59532
14
      {"Target Wake Time", "wlan.twt.target_wake_time",
59533
14
       FT_UINT64, BASE_DEC, NULL, 0, NULL, HFILL }},
59534
59535
14
    {&hf_ieee80211_tag_twt_target_wake_time_short,
59536
14
      {"Target Wake Time", "wlan.twt.target_wake_time_short",
59537
14
       FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
59538
59539
14
    {&hf_ieee80211_tag_twt_nom_min_twt_wake_dur,
59540
14
      {"Nominal Minimum TWT Wake duration", "wlan.twt.nom_min_twt_wake_duration",
59541
14
       FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59542
59543
14
    {&hf_ieee80211_tag_twt_wake_interval_mantissa,
59544
14
      {"TWT Wake Interval Mantissa", "wlan.twt.wake_interval_mantissa",
59545
14
       FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
59546
59547
14
    {&hf_ieee80211_tag_twt_channel,
59548
14
      {"TWT Channel", "wlan.twt.channel",
59549
14
       FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
59550
59551
14
    {&hf_ieee80211_tag_rsnx,
59552
14
      {"RSNX", "wlan.rsnx",
59553
14
       FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59554
59555
14
    {&hf_ieee80211_wfa_ie_transition_disable_bitmap,
59556
14
      {"Transition Disable Bitmap", "wlan.transition_disable_bitmap",
59557
14
       FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59558
59559
14
    {&hf_ieee80211_wfa_ie_transition_disable_wpa3_personal,
59560
14
      {"WPA3-Personal", "wlan.transition_disable.wpa3_personal",
59561
14
       FT_BOOLEAN, 8, NULL, GENMASK(0, 0), NULL, HFILL }},
59562
59563
14
    {&hf_ieee80211_wfa_ie_transition_disable_sae_pk,
59564
14
      {"SAE-PK", "wlan.transition_disable.sae_pk",
59565
14
       FT_BOOLEAN, 8, NULL, GENMASK(1, 1), NULL, HFILL }},
59566
59567
14
    {&hf_ieee80211_wfa_ie_transition_disable_wpa3_enterprise,
59568
14
      {"WPA3-Enterprise", "wlan.transition_disable.wpa3_enterprise",
59569
14
       FT_BOOLEAN, 8, NULL, GENMASK(2, 2), NULL, HFILL }},
59570
59571
14
    {&hf_ieee80211_wfa_ie_transition_disable_enhanced_open,
59572
14
      {"Wi-Fi Enhanced Open", "wlan.transition_disable.enhanced_open",
59573
14
       FT_BOOLEAN, 8, NULL, GENMASK(3, 3), NULL, HFILL }},
59574
59575
14
    {&hf_ieee80211_wfa_ie_transition_disable_reserved_b4thru7,
59576
14
      {"Reserved", "wlan.transition_disable.reserved.b4thru7",
59577
14
       FT_UINT8, BASE_HEX, NULL, GENMASK(7, 4), NULL, HFILL }},
59578
59579
14
    {&hf_ieee80211_wfa_ie_transition_disable_reserved,
59580
14
      {"Reserved", "wlan.transition_disable.reserved",
59581
14
       FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59582
59583
14
    {&hf_ieee80211_tag_rsnx_length,
59584
14
      {"RSNX Length", "wlan.rsnx.length",
59585
14
       FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
59586
59587
14
    {&hf_ieee80211_tag_rsnx_protected_twt_operations_support,
59588
14
      {"Protected TWT Operations Support", "wlan.rsnx.protected_twt_operations_support",
59589
14
       FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
59590
59591
14
    {&hf_ieee80211_tag_rsnx_sae_hash_to_element,
59592
14
      {"SAE Hash to element", "wlan.rsnx.sae_hash_to_element",
59593
14
       FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
59594
59595
14
    {&hf_ieee80211_tag_rsnx_sae_pk,
59596
14
      {"SAE-PK", "wlan.rsnx.sae_pk",
59597
14
       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
59598
59599
14
    {&hf_ieee80211_tag_rsnx_protected_wur_frame_support,
59600
14
      {"Protected WUR Frame Support", "wlan.rsnx.protected_wur_frame_support",
59601
14
       FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
59602
59603
14
    {&hf_ieee80211_tag_rsnx_secure_ltf_support,
59604
14
      {"Secure LTF Support", "wlan.rsnx.secure_ltf_support",
59605
14
       FT_BOOLEAN, 8, NULL, GENMASK(0, 0), NULL, HFILL }},
59606
59607
14
    {&hf_ieee80211_tag_rsnx_secure_rtt_supported,
59608
14
      {"Secure RTT Supported", "wlan.rsnx.secure_rtt_supported",
59609
14
       FT_BOOLEAN, 8, NULL, GENMASK(1, 1), NULL, HFILL }},
59610
59611
14
    {&hf_ieee80211_tag_rsnx_urnm_mfpr_x20,
59612
14
      {"URNM-MFPR-X20", "wlan.rsnx.urnm_mfpr_x20",
59613
14
       FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
59614
59615
14
    {&hf_ieee80211_tag_rsnx_protected_announce_support,
59616
14
      {"Protected Announce Support", "wlan.rsnx.protected_announce_support",
59617
14
       FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
59618
59619
14
    {&hf_ieee80211_tag_rsnx_pbac,
59620
14
      {"PBAC", "wlan.rsnx.pbac",
59621
14
       FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
59622
59623
14
    {&hf_ieee80211_tag_rsnx_extended_s1g_action_protection,
59624
14
      {"Extended S1G Action Protection", "wlan.rsnx.extended_s1g_action_protection",
59625
14
       FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
59626
59627
14
    {&hf_ieee80211_tag_rsnx_spp_amsdu_capable,
59628
14
      {"SPP AMSDU Capable", "wlan.rsnx.spp_amsdu_capable",
59629
14
       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
59630
59631
14
    {&hf_ieee80211_tag_rsnx_urnm_mfpr,
59632
14
      {"URNM-MFPR", "wlan.rsnx.urnm_mfpr",
59633
14
       FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
59634
59635
14
    {&hf_ieee80211_tag_rsnx_reserved,
59636
14
      {"Reserved", "wlan.rsnx.reserved",
59637
14
       FT_UINT8, BASE_HEX, NULL, 0x00, NULL, HFILL }},
59638
59639
14
    {&hf_ieee80211_owe_dh_parameter_group,
59640
14
     {"Group", "wlan.ext_tag.owe_dh_parameter.group",
59641
14
      FT_UINT32, BASE_DEC, VALS(owe_dh_parameter_group_vals), 0x0, NULL, HFILL }},
59642
59643
14
    {&hf_ieee80211_owe_dh_parameter_public_key,
59644
14
     {"Public Key", "wlan.ext_tag.owe_dh_parameter.public_key",
59645
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59646
59647
14
    {&hf_ieee80211_tag_pasn_parameters_control,
59648
14
     {"Control", "wlan.etag.pasn_params.control",
59649
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59650
59651
14
    {&hf_ieee80211_tag_pasn_params_comeback_info_present,
59652
14
     {"Comeback Info Present", "wlan.etag.pasn_params.comeback_info_present",
59653
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
59654
59655
14
    {&hf_ieee80211_tag_pasn_params_group_and_key_present,
59656
14
     {"Group and Key Present", "wlan.etag.pasn_params.group_and_key_present",
59657
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
59658
59659
14
    {&hf_ieee80211_tag_pasn_parameters_reserved,
59660
14
     {"Reserved", "wlan.etag.pasn_parameters.reserved",
59661
14
      FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL }},
59662
59663
14
    {&hf_ieee80211_tag_pasn_parameters_wrapped_fmt,
59664
14
      {"Wrapped Data Format", "wlan.etag.pasn_parameters.wrapped_data_format",
59665
14
       FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(wrapped_data_fmt_rvals),
59666
14
       0x0, NULL, HFILL }},
59667
59668
14
    {&hf_ieee80211_tag_pasn_comeback_after,
59669
14
     {"Comeback After", "wlan.etag.pasn_parameters.comeback_after",
59670
14
      FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_tu_tus), 0x0, NULL, HFILL }},
59671
59672
14
    {&hf_ieee80211_tag_pasn_cookie_length,
59673
14
     {"Cookie length", "wlan.etag.pasn_parameters.cookie_length",
59674
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59675
59676
14
    {&hf_ieee80211_tag_pasn_cookie,
59677
14
     {"Cookie", "wlan.etag.pasn_parameters.cookie",
59678
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59679
59680
14
    {&hf_ieee80211_tag_pasn_finite_cyclic_group_id,
59681
14
     {"Finite Cyclic Group ID",
59682
14
      "wlan.etag.pasn_parameters.finite_cyclic_group_id",
59683
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59684
59685
14
    {&hf_ieee80211_tag_pasn_ephemeral_public_key_len,
59686
14
     {"Ephemeral Public Key Length",
59687
14
      "wlan.etag.pasn_parameters.ephemeral_public_key_len",
59688
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59689
59690
14
    {&hf_ieee80211_tag_pasn_ephemeral_public_key,
59691
14
      {"Ephemeral Public Key",
59692
14
       "wlan.etag.pasn_parameters.ephemeral_public_key",
59693
14
       FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59694
59695
14
    {&hf_ieee80211_pasn_auth1_frame_len,
59696
14
     {"Auth Frame 1 Length", "wlan.pasn_wrapped_data.auth_frame_1_len",
59697
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59698
59699
14
    {&hf_ieee80211_pasn_auth2_frame_len,
59700
14
     {"Auth Frame 2 Length", "wlan.pasn_wrapped_data.auth_frame_2_len",
59701
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59702
59703
14
    {&hf_ieee80211_eht_eml_control_field,
59704
14
     {"EML Control Field", "wlan.eht.eml_control",
59705
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59706
59707
14
    {&hf_ieee80211_eht_eml_control_emlsr_mode,
59708
14
     {"EMLSR Mode", "wlan.eht.eml_control.emlsr_mode",
59709
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
59710
59711
14
    {&hf_ieee80211_eht_eml_control_emlmr_mode,
59712
14
     {"EMLMR Mode", "wlan.eht.eml_control.emlmr_mode",
59713
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
59714
59715
14
    {&hf_ieee80211_eht_eml_control_emlsr_para_update_control,
59716
14
     {"EMLSR Parameter Update Control", "wlan.eht.eml_control.emlsr_para_update_control",
59717
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
59718
59719
14
    {&hf_ieee80211_eht_eml_control_device_coexist_activities,
59720
14
     {"In-Device Coexistence Activities",
59721
14
      "wlan.eht.eml_control.in_device_coexist_activities",
59722
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
59723
59724
14
    {&hf_ieee80211_eht_eml_control_reserved,
59725
14
     {"Reserved", "wlan.eht.eml_control.reserved",
59726
14
      FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL }},
59727
59728
14
    {&hf_ieee80211_eht_eml_control_link_bitmap,
59729
14
     {"Link Bitmap", "wlan.eht.eml_control.link_bitmap",
59730
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59731
59732
14
    {&hf_ieee80211_eht_eml_control_link_enable_id,
59733
14
     {"Enable Link ID",
59734
14
       "wlan.eht.eml_control.link_map.enable_id",
59735
14
       FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59736
59737
14
    {&hf_ieee80211_eht_eml_control_mcs_map_count,
59738
14
     {"MCS Map Count Control", "wlan.eht.eml_control.mcs_map_count",
59739
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59740
59741
14
    {&hf_ieee80211_eht_eml_control_mcs_map_count_bw,
59742
14
     {"MCS Map Count Control BW", "wlan.eht.eml_control.mcs_map_count.bw",
59743
14
      FT_UINT8, BASE_HEX, VALS(eht_eml_control_mcs_map_count_bw), 0x03, NULL, HFILL }},
59744
59745
14
    {&hf_ieee80211_eht_eml_control_mcs_map_count_reserved,
59746
14
     {"Reserved", "wlan.eht.eml_control.mcs_map_count.reserved",
59747
14
      FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL }},
59748
59749
14
    {&hf_ieee80211_eht_emlsr_para_update,
59750
14
     {"EMLSR Parameter Update", "wlan.eht.emlsr_parameter_update",
59751
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
59752
59753
14
    {&hf_ieee80211_eht_emlsr_para_update_padding_delay,
59754
14
     {"EMLSR Padding Delay", "wlan.eht.emlsr_parameter_update.padding_delay",
59755
14
      FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL }},
59756
59757
14
    {&hf_ieee80211_eht_emlsr_para_update_tran_delay,
59758
14
     {"EMLSR Transition Delay", "wlan.eht.emlsr_parameter_update.transition_delay",
59759
14
      FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL }},
59760
59761
14
    {&hf_ieee80211_eht_emlsr_para_update_reserved,
59762
14
     {"Reserved", "wlan.eht.emlsr_parameter_update.reserved",
59763
14
      FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL }},
59764
59765
14
    {&hf_ieee80211_eht_multi_link_control,
59766
14
     {"Multi-Link Control", "wlan.eht.multi_link.control",
59767
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59768
59769
14
    {&hf_ieee80211_eht_multi_link_control_type,
59770
14
     {"Type", "wlan.eht.multi_link.control.type",
59771
14
      FT_UINT16, BASE_DEC, VALS(multi_link_type_vals), 0x0007, NULL, HFILL }},
59772
59773
14
    {&hf_ieee80211_eht_multi_link_control_reserved,
59774
14
     {"Reserved", "wlan.eht.multi_link.control.reserved",
59775
14
      FT_UINT16, BASE_HEX, NULL, 0x0008, NULL, HFILL }},
59776
59777
14
    {&hf_ieee80211_eht_multi_link_control_link_id_present,
59778
14
     {"Link ID Info Present",
59779
14
      "wlan.eht.multi_link.control.basic.link_id_info_present",
59780
14
      FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL }},
59781
59782
14
    {&hf_ieee80211_eht_multi_link_control_bss_parms_ch_count,
59783
14
     {"BSS Parameters Change Count Present",
59784
14
      "wlan.eht.multi_link.control.basic.bss_parameters_change_count_present",
59785
14
      FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL }},
59786
59787
14
    {&hf_ieee80211_eht_multi_link_control_medium_sync_delay,
59788
14
     {"Medium Synchronization Delay Info Present",
59789
14
      "wlan.eht.multi_link.control.basic.medium_sync_delayinfo_present",
59790
14
      FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL }},
59791
59792
14
    {&hf_ieee80211_eht_multi_link_control_eml_capa,
59793
14
     {"EML Capabilities Present",
59794
14
      "wlan.eht.multi_link.control.basic.eml_capabilities_present",
59795
14
      FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL }},
59796
59797
14
    {&hf_ieee80211_eht_multi_link_control_mld_capa,
59798
14
     {"MLD Capabilities Present",
59799
14
      "wlan.eht.multi_link.control.basic.mld_capabilities_present",
59800
14
      FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL }},
59801
59802
14
    {&hf_ieee80211_eht_multi_link_control_basic_mld_id_present,
59803
14
     {"AP MLD ID Present",
59804
14
      "wlan.eht.multi_link.control.basic.mld_id_present",
59805
14
      FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL }},
59806
59807
14
    {&hf_ieee80211_eht_multi_link_control_ext_mld_capa,
59808
14
     {"Extended MLD Capabilities and Operations Present",
59809
14
      "wlan.eht.multi_link.control.basic.ext_mld_capabilities_present",
59810
14
      FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL }},
59811
59812
14
    {&hf_ieee80211_eht_multi_link_control_bitmap_reserved,
59813
14
     {"Reserved", "wlan.eht.multi_link.control.basic.reserved",
59814
14
      FT_UINT16, BASE_HEX, NULL, 0xF800, NULL, HFILL }},
59815
59816
14
    {&hf_ieee80211_eht_multi_link_control_probe_mld_id_present,
59817
14
     {"AP MLD ID Present",
59818
14
      "wlan.eht.multi_link.control.probe.mld_id_present",
59819
14
      FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL }},
59820
59821
14
    {&hf_ieee80211_eht_multi_link_control_probe_mld_mac_addr_present,
59822
14
     {"MLD MAC Address Present",
59823
14
      "wlan.eht.multi_link.control.probe.mld_mac_addr_present",
59824
14
      FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL }},
59825
59826
14
    {&hf_ieee80211_eht_multi_link_control_probe_reserved,
59827
14
     {"Reserved", "wlan.eht.multi_link.control.probe.reserved",
59828
14
      FT_UINT16, BASE_HEX, NULL, 0xFFC0, NULL, HFILL }},
59829
59830
14
    {&hf_ieee80211_eht_multi_link_control_tdls_reserved,
59831
14
     {"Reserved", "wlan.eht.multi_link.control.tdls.reserved",
59832
14
      FT_UINT16, BASE_HEX, NULL, 0xFFF0, NULL, HFILL }},
59833
59834
14
    {&hf_ieee80211_eht_multi_link_control_prio_access_reserved,
59835
14
     {"Reserved", "wlan.eht.multi_link.control.prio_access.reserved",
59836
14
      FT_UINT16, BASE_HEX, NULL, 0xFFF0, NULL, HFILL }},
59837
59838
14
    {&hf_ieee80211_eht_multi_link_control_reconfig_mld_mac,
59839
14
     {"MLD MAC Address Present",
59840
14
      "wlan.eht.multi_link.control.reconfig.mld_mac_addr_present",
59841
14
      FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL }},
59842
59843
14
    {&hf_ieee80211_eht_multi_link_control_reconfig_eml_capa,
59844
14
     {"EML Capabilities Present",
59845
14
      "wlan.eht.multi_link.control.reconfig.eml_capabilities_present",
59846
14
      FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL }},
59847
59848
14
    {&hf_ieee80211_eht_multi_link_control_reconfig_mld_capa_oper,
59849
14
     {"MLD Capabilities And Operations Present",
59850
14
      "wlan.eht.multi_link.control.reconfig.mld_capabilities_present",
59851
14
      FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL }},
59852
59853
14
    {&hf_ieee80211_eht_multi_link_control_reconfig_ext_mld_capa_oper,
59854
14
     {"Extended MLD Capabilities And Operations Present",
59855
14
      "wlan.eht.multi_link.control.reconfig.ext_mld_capa_oper_present",
59856
14
      FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL }},
59857
59858
14
    {&hf_ieee80211_eht_multi_link_control_reconfig_reserved,
59859
14
     {"Reserved",
59860
14
      "wlan.eht.multi_link.control.reconfig.reserved",
59861
14
      FT_UINT16, BASE_HEX, NULL, 0xFF00, NULL, HFILL }},
59862
59863
14
    {&hf_ieee80211_eht_common_field_length,
59864
14
     {"Common Info Length", "wlan.eht.multi_link.common_info.length",
59865
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59866
59867
14
    {&hf_ieee80211_eht_common_field_mld_mac,
59868
14
     {"MLD MAC Address", "wlan.eht.multi_link.common_info.mld_mac_address",
59869
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59870
59871
14
    {&hf_ieee80211_eht_common_field_link_id_field,
59872
14
     {"Link ID subfield", "wlan.eht.multi_link.common_info.link_id_subfield",
59873
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59874
59875
14
    {&hf_ieee80211_eht_common_info_link_id,
59876
14
     {"Link ID", "wlan.eht.multi_link.common_info.link_id_subfield.link_id",
59877
14
      FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL }},
59878
59879
14
    {&hf_ieee80211_eht_common_info_link_id_reserved,
59880
14
     {"Reserved", "wlan.eht.multi_link.common_info.link_id_subfield.reserved",
59881
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
59882
59883
14
    {&hf_ieee80211_eht_common_field_bss_param_change_count,
59884
14
     {"BSS Parameters Change Count",
59885
14
      "wlan.eht.multi_link.common_info.bss_parameters_change_count",
59886
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59887
59888
14
    {&hf_ieee80211_eht_common_field_medium_sync_field,
59889
14
     {"Medium Sync Field", "wlan.eht.multi_link.common_info.medium_sync_field",
59890
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59891
59892
14
    {&hf_ieee80211_eht_common_info_medium_sync_duration,
59893
14
     {"Medium Synchronization Duration",
59894
14
      "wlan.eht.multi_link.common_info.medium_sync.sync_duration",
59895
14
      FT_UINT16, BASE_DEC, NULL, 0x00FF, NULL, HFILL }},
59896
59897
14
    {&hf_ieee80211_eht_common_info_medium_sync_threshold,
59898
14
     {"Medium Synchronization OFDM ED Threshold",
59899
14
      "wlan.eht.multi_link.common_info.medium_sync.ofdm_ed_threshold",
59900
14
      FT_UINT16, BASE_DEC, NULL, 0x0F00, NULL, HFILL }},
59901
59902
14
    {&hf_ieee80211_eht_common_info_medium_sync_max_txops,
59903
14
     {"Medium Synchronization Maximum Number of TXOPs",
59904
14
      "wlan.eht.multi_link.common_info.medium_sync.max_number_of_txops",
59905
14
      FT_UINT16, BASE_DEC, NULL, 0xF000, NULL, HFILL }},
59906
59907
14
    {&hf_ieee80211_eht_common_field_eml_capabilities,
59908
14
     {"EML Capabilities", "wlan.eht.multi_link.common_info.eml_capabilities",
59909
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59910
59911
14
    {&hf_ieee80211_eht_common_info_eml_capa_emlsr_support,
59912
14
     {"EMLSR Support",
59913
14
      "wlan.eht.multi_link.common_info.eml_capabilities.emlsr_support",
59914
14
      FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL }},
59915
59916
14
    {&hf_ieee80211_eht_common_info_eml_capa_emlsr_padding_delay,
59917
14
     {"EMLSR Padding Delay",
59918
14
      "wlan.eht.multi_link.common_info.eml_capabilities.emlsr_padding_delay",
59919
14
      FT_UINT16, BASE_DEC, NULL, 0x000E, NULL, HFILL }},
59920
59921
14
    {&hf_ieee80211_eht_common_info_eml_capa_emlsr_transition_delay,
59922
14
     {"EMLSR Transition Delay",
59923
14
      "wlan.eht.multi_link.common_info.eml_capabilities.emlsr_transition_delay",
59924
14
      FT_UINT16, BASE_DEC, NULL, 0x0070, NULL, HFILL }},
59925
59926
14
    {&hf_ieee80211_eht_common_info_eml_capa_emlmr_support,
59927
14
     {"EMLMR Support",
59928
14
      "wlan.eht.multi_link.common_info.eml_capabilities.emlmr_support",
59929
14
      FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL }},
59930
59931
14
    {&hf_ieee80211_eht_common_info_eml_capa_emlmr_delay,
59932
14
     {"EMLMR Delay",
59933
14
      "wlan.eht.multi_link.common_info.eml_capabilities.emlmr_delay",
59934
14
      FT_UINT16, BASE_DEC, NULL, 0x0700, NULL, HFILL }},
59935
59936
14
    {&hf_ieee80211_eht_common_info_eml_capa_transition_timeout,
59937
14
     {"Transition Timeout",
59938
14
      "wlan.eht.multi_link.common_info.eml_capabilities.transition_timeout",
59939
14
      FT_UINT16, BASE_DEC, NULL, 0x7800, NULL, HFILL }},
59940
59941
14
    {&hf_ieee80211_eht_common_info_eml_capa_reserved,
59942
14
     {"Reserved",
59943
14
      "wlan.eht.multi_link.common_info.eml_capabilities.capa_reserved",
59944
14
      FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL }},
59945
59946
14
    {&hf_ieee80211_eht_common_field_mld_capabilities,
59947
14
     {"MLD Capabilities", "wlan.eht.multi_link.common_info.mld_capabilities",
59948
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
59949
59950
14
    {&hf_ieee80211_eht_common_info_mld_max_simul_links,
59951
14
     {"Maximum Number of Simultaneous Links",
59952
14
      "wlan.eht.multi_link.common_info.mld_capabilities.max_simultaneous_links",
59953
14
      FT_UINT16, BASE_DEC, NULL, 0x000F, NULL, HFILL }},
59954
59955
14
    {&hf_ieee80211_eht_common_info_mld_srs_support,
59956
14
     {"SRS Support",
59957
14
      "wlan.eht.multi_link.common_info.mld_capabilities.srs_support",
59958
14
      FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL }},
59959
59960
14
    {&hf_ieee80211_eht_common_info_mld_tid_to_link_map_neg,
59961
14
     {"TID-To-Link Mapping Negotiation Support",
59962
14
      "wlan.eht.multi_link.common_info.mld_capabilities.tid_to_link_neg_sup",
59963
14
      FT_UINT16, BASE_DEC, NULL, 0x0060, NULL, HFILL }},
59964
59965
14
    {&hf_ieee80211_eht_common_info_mld_freq_sep_for_str,
59966
14
     {"Frequency Separation For STR/AP MLD Type Indication",
59967
14
      "wlan.eht.multi_link.common_info.mld_capabilities.freq_sep_for_str",
59968
14
      FT_UINT16, BASE_DEC, NULL, 0x0F80, NULL, HFILL }},
59969
59970
14
    {&hf_ieee80211_eht_common_info_mld_aar_support,
59971
14
     {"AAR Support",
59972
14
      "wlan.eht.multi_link.common_info.mld_capabilities.aar_support",
59973
14
      FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL }},
59974
59975
14
    {&hf_ieee80211_eht_common_info_mld_link_reconf_op_support,
59976
14
     {"Link Reconfiguration Operation Support",
59977
14
      "wlan.eht.multi_link.common_info.mld_capabilities.link_reconfig_op_support",
59978
14
      FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL }},
59979
59980
14
    {&hf_ieee80211_eht_common_info_mld_aligned_twt_support,
59981
14
     {"Aligned TWT Support",
59982
14
      "wlan.eht.multi_link.common_info.mld_capabilities.aligned_twt_support",
59983
14
      FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL }},
59984
59985
14
    {&hf_ieee80211_eht_common_info_mld_reserved,
59986
14
     {"Reserved", "wlan.eht.multi_link.common_info.mld_capabilities.reserved",
59987
14
      FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL }},
59988
59989
14
    {&hf_ieee80211_eht_common_field_ap_mld_mac,
59990
14
     {"AP MLD MAC Address",
59991
14
      "wlan.eht.multi_link.common_info.ap_mld_mac_address",
59992
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
59993
59994
14
    {&hf_ieee80211_eht_common_field_mld_id,
59995
14
     {"AP MLD ID", "wlan.eht.multi_link.common_info.mld_id",
59996
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
59997
59998
14
    {&hf_ieee80211_eht_common_field_ext_mld_capabilities,
59999
14
     {"Extended MLD Capabilities and Operations",
60000
14
      "wlan.eht.multi_link.common_info.ext_mld_capabilities",
60001
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60002
60003
14
    {&hf_ieee80211_eht_common_info_ext_mld_op_update_support,
60004
14
     {"Operation Parameter Update Support",
60005
14
      "wlan.eht.multi_link.common_info.ext_mld_capabilities.op_param_update_support",
60006
14
      FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL }},
60007
60008
14
    {&hf_ieee80211_eht_common_info_ext_mld_max_simul_links,
60009
14
     {"Recommended Max Simultaneous Links",
60010
14
      "wlan.eht.multi_link.common_info.ext_mld_capabilities.max_simultaneous_links",
60011
14
      FT_UINT16, BASE_DEC, NULL, 0x001E, NULL, HFILL }},
60012
60013
14
    {&hf_ieee80211_eht_common_info_ext_mld_nstr_status_support,
60014
14
     {"NSTR Status Update Support",
60015
14
      "wlan.eht.multi_link.common_info.ext_mld_capabilities.nstr_status_update_support",
60016
14
      FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL }},
60017
60018
14
    {&hf_ieee80211_eht_common_info_ext_mld_emlsr_enable_one_link_support,
60019
14
     {"EMLSR Enablement On One Link Support",
60020
14
      "wlan.eht.multi_link.common_info.ext_mld_capabilities.emlsr_enable_one_link_support",
60021
14
      FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL }},
60022
60023
14
    {&hf_ieee80211_eht_common_info_ext_mld_btm_mld_recom_aps_support,
60024
14
     {"BTM MLD Recommendation For Multiple APs Support",
60025
14
      "wlan.eht.multi_link.common_info.ext_mld_capabilities.btm_mld_recom_multiple_aps_support",
60026
14
      FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL }},
60027
60028
14
    {&hf_ieee80211_eht_common_info_ext_mld_reserved,
60029
14
     {"Reserved", "wlan.eht.multi_link.common_info.ext_mld_capabilities.reserved",
60030
14
      FT_UINT16, BASE_HEX, NULL, 0xFF00, NULL, HFILL }},
60031
60032
14
    {&hf_ieee80211_eht_profile_sta_control,
60033
14
     {"STA Control", "wlan.eht.multi_link.sta_profile.sta_control",
60034
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60035
60036
14
    {&hf_ieee80211_eht_multi_link_subelt_tag,
60037
14
     {"Subelement ID", "wlan.eht.multi_link.sta_profile.subelt_id",
60038
14
      FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(multi_link_sub_elt_string),
60039
14
      0x0, NULL, HFILL }},
60040
60041
14
    {&hf_ieee80211_eht_multi_link_subelt_len,
60042
14
     {"Subelement Length", "wlan.eht.multi_link.sta_profile.subelt_len",
60043
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60044
60045
14
    {&hf_ieee80211_eht_multi_link_type_0_link_count,
60046
14
     {"Basic STA Profile Count", "wlan.eht.multi_link.type_0.sta_profile_count",
60047
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60048
60049
14
    {&hf_ieee80211_eht_multi_link_type_1_link_count,
60050
14
     {"Probe Request STA Profile Count", "wlan.eht.multi_link.type_1.sta_profile_count",
60051
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60052
60053
14
    {&hf_ieee80211_eht_multi_link_type_2_link_count,
60054
14
     {"Reconfiguration STA Profile Count", "wlan.eht.multi_link.type_2.sta_profile_count",
60055
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60056
60057
14
    {&hf_ieee80211_eht_multi_link_type_3_link_count,
60058
14
     {"TDLS STA Profile Count", "wlan.eht.multi_link.type_3.sta_profile_count",
60059
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60060
60061
14
    {&hf_ieee80211_eht_multi_link_type_4_link_count,
60062
14
     {"Priority Access STA Profile Count", "wlan.eht.multi_link.type_4.sta_profile_count",
60063
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60064
60065
14
    {&hf_ieee80211_eht_multi_link_link_id_list,
60066
14
     {"STA Profiles LinkIds", "wlan.eht.multi_link.sta_profile_id_list",
60067
14
      FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }},
60068
60069
14
    {&hf_ieee80211_eht_profile_link_id,
60070
14
     {"Link ID", "wlan.eht.multi_link.sta_profile.sta_control.link_id",
60071
14
      FT_UINT16, BASE_HEX, NULL, STA_CTRL_LINK_ID, NULL, HFILL }},
60072
60073
14
    {&hf_ieee80211_eht_profile_complete_profile,
60074
14
     {"Complete Profile",
60075
14
      "wlan.eht.multi_link.sta_profile.sta_control.complete_profile",
60076
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_COMPLETE_PROFILE, NULL, HFILL }},
60077
60078
14
    {&hf_ieee80211_eht_profile_mac_address_present,
60079
14
     {"MAC Address Present",
60080
14
      "wlan.eht.multi_link.sta_profile.sta_control.mac_address_present",
60081
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_MAC_ADDR_PRESENT, NULL, HFILL }},
60082
60083
14
    {&hf_ieee80211_eht_profile_beacon_interval_present,
60084
14
     {"Beacon Interval Present",
60085
14
      "wlan.eht.multi_link.sta_profile.sta_control.beacon_interval_present",
60086
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_BEACON_INT_PRESENT, NULL, HFILL }},
60087
60088
14
    {&hf_ieee80211_eht_profile_tsf_offset_present,
60089
14
     {"TSF Offset Present",
60090
14
      "wlan.eht.multi_link.sta_profile.sta_control.tsf_offset_present",
60091
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_TSF_OFFSET_PRESENT, NULL, HFILL }},
60092
60093
14
    {&hf_ieee80211_eht_profile_dtim_info_present,
60094
14
     {"DTIM Info Present",
60095
14
      "wlan.eht.multi_link.sta_profile.sta_control.dtim_info_present",
60096
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_DTIM_INFO_PRESENT, NULL, HFILL }},
60097
60098
14
    {&hf_ieee80211_eht_profile_nstr_link_pair_present,
60099
14
     {"NSTR Link Pair Present",
60100
14
      "wlan.eht.multi_link.sta_profile.sta_control.nstr_link_pair_present",
60101
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_NSTR_LINK_PAIR_PRESENT, NULL, HFILL }},
60102
60103
14
    {&hf_ieee80211_eht_profile_nstr_bitmap_size,
60104
14
     {"NSTR Bitmap Size",
60105
14
      "wlan.eht.multi_link.sta_profile.sta_control.nstr_bitmap_size",
60106
14
      FT_UINT16, BASE_DEC, NULL, STA_CTRL_NSTR_BITMAP_SIZE, NULL, HFILL }},
60107
60108
14
    {&hf_ieee80211_eht_profile_bss_params_change_count_present,
60109
14
     {"BSS Parameters Change Count Present",
60110
14
      "wlan.eht.multi_link.sta_profile.sta_control.bss_params_change_count_present",
60111
14
      FT_BOOLEAN, 16, NULL, STA_CTRL_BSS_PARAMS_CHANGE_CNT_PRESENT, NULL, HFILL }},
60112
60113
14
    {&hf_ieee80211_eht_profile_reserved,
60114
14
     {"Reserved", "wlan.eht.multi_link.sta_profile.sta_control.reserved",
60115
14
      FT_UINT16, BASE_HEX, NULL, STA_CTRL_RESERVED, NULL, HFILL }},
60116
60117
14
    {&hf_ieee80211_eht_profile_probe_reserved,
60118
14
     {"Reserved", "wlan.eht.multi_link.sta_profile.sta_control.probe_reserved",
60119
14
      FT_UINT16, BASE_HEX, NULL, 0xFFE0, NULL, HFILL }},
60120
60121
14
    {&hf_ieee80211_eht_profile_removal_timer_present,
60122
14
     {"AP Removal Timer Present",
60123
14
      "wlan.eht.multi_link.sta_profile.sta_control.ap_removal_timer_present",
60124
14
      FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL }},
60125
60126
14
    {&hf_ieee80211_eht_profile_reconfig_operation_type,
60127
14
     {"Reconfiguration Operation Type",
60128
14
      "wlan.eht.multi_link.sta_profile.sta_control.reconfig_operation_type",
60129
14
      FT_UINT16, BASE_DEC|BASE_RANGE_STRING, RVALS(eht_reconfig_op_type_rvals),
60130
14
      0x0780, NULL, HFILL }},
60131
60132
14
    {&hf_ieee80211_eht_profile_operation_para_present,
60133
14
     {"Operation Parameters Present",
60134
14
      "wlan.eht.multi_link.sta_profile.sta_control.operation_parameters_present",
60135
14
      FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL }},
60136
60137
14
    {&hf_ieee80211_eht_profile_reconfig_nstr_bitmap_size,
60138
14
     {"NSTR Bitmap Size",
60139
14
      "wlan.eht.multi_link.sta_profile.sta_control.reconfig_nstr_bitmap_size",
60140
14
      FT_UINT16, BASE_DEC, NULL, 0x1000, NULL, HFILL }},
60141
60142
14
    {&hf_ieee80211_eht_profile_reconfig_nstr_bitmap_present,
60143
14
     {"NSTR Indication Bitmap Present",
60144
14
      "wlan.eht.multi_link.sta_control.reconfig_nstr_bitmap_present",
60145
14
      FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL }},
60146
60147
14
    {&hf_ieee80211_eht_profile_reconfig_reserved,
60148
14
     {"Reserved", "wlan.eht.multi_link.sta_profile.sta_control.reconfig_reserved",
60149
14
      FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
60150
60151
14
    {&hf_ieee80211_eht_profile_prio_acc_reserved,
60152
14
     {"Reserved",
60153
14
      "wlan.eht.multi_link.sta_profile.sta_control.priority_access_reserved",
60154
14
      FT_UINT16, BASE_HEX, NULL, 0xFFF0, NULL, HFILL }},
60155
60156
14
    {&hf_ieee80211_eht_sta_profile_info_len,
60157
14
     {"STA Info Length",
60158
14
      "wlan.eht.multi_link.sta_profile.sta_info.len",
60159
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60160
60161
14
    {&hf_ieee80211_eht_sta_profile_info_mac,
60162
14
     {"STA MAC Address",
60163
14
      "wlan.eht.multi_link.sta_profile.sta_info.sta_mac_addr",
60164
14
      FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
60165
60166
14
    {&hf_ieee80211_eht_sta_profile_info_beacon,
60167
14
     {"Beacon Interval",
60168
14
      "wlan.eht.multi_link.sta_profile.sta_info.beacon_interval",
60169
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60170
60171
14
    {&hf_ieee80211_eht_sta_profile_info_tsf_offset,
60172
14
     {"TSF Offset",
60173
14
      "wlan.eht.multi_link.sta_profile.sta_info.tsf_offset",
60174
14
      FT_INT64, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60175
60176
14
    {&hf_ieee80211_eht_sta_profile_info_dtim_count,
60177
14
     {"DTIM Count",
60178
14
      "wlan.eht.multi_link.sta_profile.sta_info.dtim_count",
60179
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60180
60181
14
    {&hf_ieee80211_eht_sta_profile_info_dtim_period,
60182
14
     {"DTIM Period",
60183
14
      "wlan.eht.multi_link.sta_profile.sta_info.dtim_period",
60184
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60185
60186
14
    {&hf_ieee80211_eht_sta_profile_info_bitmap,
60187
14
     {"NSTR Indication Bitmap",
60188
14
      "wlan.eht.multi_link.sta_profile.sta_info.nstr_bitmap",
60189
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
60190
60191
14
    {&hf_ieee80211_eht_sta_profile_bss_params_change_count,
60192
14
     {"BSS Parameters Change Count",
60193
14
      "wlan.eht.multi_link.sta_profile.sta_info.bss_params_change_count",
60194
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60195
60196
14
    {&hf_ieee80211_eht_sta_profile_removal_timer,
60197
14
     {"AP Removal Timer",
60198
14
      "wlan.eht.multi_link.sta_profile.sta_info.ap_removal_timer",
60199
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60200
60201
14
    {&hf_ieee80211_eht_sta_profile_presence_indi,
60202
14
     {"Presence Indication",
60203
14
      "wlan.eht.multi_link.sta_profile.sta_info.presence_indication",
60204
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60205
60206
14
    {&hf_ieee80211_eht_sta_profile_presence_indi_max_mpdu_length_present,
60207
14
     {"Maximum MPDU Length Present",
60208
14
      "wlan.eht.multi_link.sta_profile.sta_info.presence_indication.max_mpdu_length_present",
60209
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
60210
60211
14
    {&hf_ieee80211_eht_sta_profile_presence_indi_max_amsdu_length_present,
60212
14
     {"Maximum A-MSDU Length Present",
60213
14
      "wlan.eht.multi_link.sta_profile.sta_info.presence_indication.max_amsdu_length_present",
60214
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
60215
60216
14
    {&hf_ieee80211_eht_sta_profile_presence_indi_reserved,
60217
14
     {"Reserved",
60218
14
      "wlan.eht.multi_link.sta_profile.sta_info.presence_indication.reserved",
60219
14
      FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL }},
60220
60221
14
    {&hf_ieee80211_eht_sta_profile_operation_para_info,
60222
14
     {"Operation Parameter Info",
60223
14
      "wlan.eht.multi_link.sta_profile.sta_info.operation_parameter_info",
60224
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60225
60226
14
    {&hf_ieee80211_eht_sta_profile_operation_para_info_max_mpdu_length,
60227
14
     {"Maximum MPDU Length",
60228
14
      "wlan.eht.multi_link.sta_profile.sta_info.operation_parameter_info.max_mpdu_length",
60229
14
      FT_UINT16, BASE_HEX, VALS(vht_max_mpdu_length_flag), 0x0003,
60230
14
      "In Octets unit", HFILL }},
60231
60232
14
    {&hf_ieee80211_eht_sta_profile_operation_para_info_amsdu_length,
60233
14
     {"A-MSDU length",
60234
14
      "wlan.eht.multi_link.sta_profile.sta_info.operation_parameter_info.amsdu_length",
60235
14
      FT_BOOLEAN, 16, TFS(&ht_max_amsdu_flag), 0x0004,
60236
14
      NULL, HFILL }},
60237
60238
14
    {&hf_ieee80211_eht_sta_profile_operation_para_info_pad,
60239
14
     {"Pad", "wlan.eht.multi_link.sta_profile.sta_info.operation_parameter_info.pad",
60240
14
      FT_UINT16, BASE_HEX, NULL, 0xFFF8,
60241
14
      NULL, HFILL }},
60242
60243
14
    {&hf_ieee80211_eht_operation_parameters,
60244
14
     {"EHT Operation Parameters",
60245
14
      "wlan.eht.eht_operation_parameters",
60246
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60247
60248
14
    {&hf_ieee80211_eht_basic_eht_mcs_nss_set,
60249
14
     {"Basic EHT-MCS And Nss Set",
60250
14
      "wlan.eht.basic_eht_mcs_and_nss_set",
60251
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60252
60253
14
    {&hf_ieee80211_eht_operation_control_chan_width,
60254
14
     {"Channel Width",
60255
14
      "wlan.eht.eht_operation_information.control.channel_width",
60256
14
      FT_UINT8, BASE_DEC, VALS(eht_operation_control_chan_wid_vals),
60257
14
      0x7, NULL, HFILL }},
60258
60259
14
    {&hf_ieee80211_eht_operation_control_reserved,
60260
14
     {"Reserved", "wlan.eht.eht_operation_information.control.reserved",
60261
14
      FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL }},
60262
60263
14
    {&hf_ieee80211_eht_operation_info_present,
60264
14
     {"EHT Operation Information Present",
60265
14
      "wlan.eht.eht_operation_parameters.eht_operation_information_present",
60266
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
60267
60268
14
    {&hf_ieee80211_eht_operation_subchannel_bitmap_present,
60269
14
     {"Disabled Subchannel Bitmap Present",
60270
14
      "wlan.eht.eht_operation_parameters.disabled_subchannel_bitmap_present",
60271
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
60272
60273
14
    {&hf_ieee80211_eht_operation_default_pe_duration,
60274
14
     {"EHT Default PE Duration",
60275
14
      "wlan.eht.eht_operation_parameters.eht_default_pe_duration",
60276
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
60277
60278
14
    {&hf_ieee80211_eht_operation_group_addressed_bu_indication_limit,
60279
14
     {"Group Addressed BU Indication Limit",
60280
14
      "wlan.eht.eht_operation_parameters.group_addressed_bu_indication_limit",
60281
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
60282
60283
14
    {&hf_ieee80211_eht_operation_group_addressed_bu_indication_exp,
60284
14
     {"Group Addressed BU Indication Exponent",
60285
14
      "wlan.eht.eht_operation_parameters.group_addressed_bu_indication_exponent",
60286
14
      FT_UINT8, BASE_DEC, NULL, 0x30, NULL, HFILL }},
60287
60288
14
    {&hf_ieee80211_eht_operation_mcs15_disable,
60289
14
     {"MCS15 Disable",
60290
14
      "wlan.eht.eht_operation_parameters.mcs_15_disable",
60291
14
      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
60292
60293
14
    {&hf_ieee80211_eht_operation_reserved,
60294
14
     {"Reserved",  "wlan.eht.eht_operation_parameters.reserved",
60295
14
      FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
60296
60297
14
    {&hf_ieee80211_eht_operation_control,
60298
14
     {"Control", "wlan.eht.eht_operation_information.control",
60299
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60300
60301
14
    {&hf_ieee80211_eht_operation_ccfs0,
60302
14
     {"CCFS0", "wlan.eht.eht_operation_information.ccfs0",
60303
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60304
60305
14
    {&hf_ieee80211_eht_operation_ccfs1,
60306
14
     {"CCFS1", "wlan.eht.eht_operation_information.ccfs1",
60307
14
      FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60308
60309
14
    {&hf_ieee80211_eht_operation_disabled_bitmap,
60310
14
     {"Disabled Subchannel Bitmap",
60311
14
      "wlan.eht.eht_operation_information.disabled_subchannel_bitmap",
60312
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60313
60314
14
    {&hf_ieee80211_eht_mac_capabilities,
60315
14
     {"EHT MAC Capabilities Information", "wlan.eht.mac_capabilities_info",
60316
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60317
60318
14
    {&hf_ieee80211_eht_mac_capa_epcs_prio_access_support,
60319
14
     {"EPCS Priority Access Support",
60320
14
      "wlan.eht.mac_capabilities.epcs_priority_access_support",
60321
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001, NULL, HFILL }},
60322
60323
14
    {&hf_ieee80211_eht_mac_capa_eht_om_control_support,
60324
14
     {"EHT OM Control Support",
60325
14
      "wlan.eht.mac_capabilities.eht_om_control_support",
60326
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002, NULL, HFILL }},
60327
60328
14
    {&hf_ieee80211_eht_mac_capa_trig_txop_sharing_mode_1_support,
60329
14
     {"Triggered TXOP Sharing Mode 1 Support",
60330
14
      "wlan.eht.mac_capabilities.triggered_txop_sharing_mode_1_support",
60331
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004, NULL, HFILL }},
60332
60333
14
    {&hf_ieee80211_eht_mac_capa_trig_txop_sharing_mode_2_support,
60334
14
     {"Triggered TXOP Sharing Mode 2 Support",
60335
14
      "wlan.eht.mac_capabilities.triggered_txop_sharing_mode_2_support",
60336
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0008, NULL, HFILL }},
60337
60338
14
    {&hf_ieee80211_eht_mac_capa_restricted_twt_support,
60339
14
     {"Restricted TWT Support",
60340
14
      "wlan.eht.mac_capabilities.restricted_twt_support",
60341
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010, NULL, HFILL }},
60342
60343
14
    {&hf_ieee80211_eht_mac_capa_scs_traffic_description_support,
60344
14
     {"SCS Traffic Description Support",
60345
14
      "wlan.eht.mac_capabilities.scs_traffic_description_support",
60346
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020, NULL, HFILL }},
60347
60348
14
    {&hf_ieee80211_eht_mac_capa_maximum_mpdu_length,
60349
14
     {"Maximum MPDU Length",
60350
14
      "wlan.eht.mac_capabilities.maximum_mpdu_length",
60351
14
      FT_UINT16, BASE_HEX, VALS(vht_max_mpdu_length_flag), 0x00c0, NULL, HFILL }},
60352
60353
14
    {&hf_ieee80211_eht_mac_capa_maximum_ampdu_length_exp_ext,
60354
14
     {"Maximum A-MPDU Length Exponent Extension",
60355
14
      "wlan.eht.mac_capabilities.maximum_a_mpdu_length_exponent_extension",
60356
14
      FT_UINT16, BASE_DEC, NULL, 0x0100, NULL, HFILL }},
60357
60358
14
    {&hf_ieee80211_eht_mac_capa_eht_trs_support,
60359
14
     {"EHT TRS Support",
60360
14
      "wlan.eht.mac_capabilities.eht_trs_support",
60361
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
60362
60363
14
    {&hf_ieee80211_eht_mac_capa_txop_return_support_txop_sha_mode,
60364
14
     {"TXOP Return Support In TXOP Sharing Mode 2",
60365
14
      "wlan.eht.mac_capabilities.txop_return_support_in_txop_sharing_mode_2",
60366
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
60367
60368
14
    {&hf_ieee80211_eht_mac_capa_two_bqrs_support,
60369
14
     {"Two BQRs Support",
60370
14
      "wlan.eht.mac_capabilities.two_bqrs_support",
60371
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
60372
60373
14
    {&hf_ieee80211_eht_mac_capa_eht_link_adaptation_support,
60374
14
     {"EHT Link Adaptation Support",
60375
14
      "wlan.eht.mac_capabilities.eht_link_adaptation_support",
60376
14
      FT_UINT16, BASE_DEC, VALS(eht_link_adaptation_vals), 0x3000, NULL, HFILL }},
60377
60378
14
    {&hf_ieee80211_eht_mac_capa_unsolicited_epcs_update,
60379
14
     {"Unsolicited EPCS Priority Access Parameter Update",
60380
14
      "wlan.eht.mac_capabilities.unsolicited_epcs_prio_access_para_update",
60381
14
      FT_UINT16, BASE_DEC, NULL, 0x4000, NULL, HFILL }},
60382
60383
14
    {&hf_ieee80211_eht_mac_capa_reserved,
60384
14
     {"Reserved",
60385
14
      "wlan.eht.mac_capabilities.reserved",
60386
14
      FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL }},
60387
60388
14
    {&hf_ieee80211_eht_phy_bits_0_15,
60389
14
     {"EHT PHY Bits 0-15", "wlan.eht.phy_capabilities.bits_0_15",
60390
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60391
60392
14
    {&hf_ieee80211_eht_phy_bits_0_15_reserved,
60393
14
     {"Reserved", "wlan.eht.phy_capabilities.bits_0_15.reserved",
60394
14
      FT_UINT16, BASE_HEX, NULL, 0x0001, NULL, HFILL }},
60395
60396
14
    {&hf_ieee80211_eht_phy_bits_0_15_320_mhz_in_6ghz,
60397
14
     {"Support For 320 MHz in 6 GHz",
60398
14
      "wlan.eht.phy_capabilities.bits_0_15.support_for_320mhz_in_6ghz",
60399
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002, NULL, HFILL }},
60400
60401
14
    {&hf_ieee80211_eht_phy_bits_0_15_242_tone_ru_bw_wider_20mhz,
60402
14
     {"Support for 242-tone RU in BW Wider than 20 MHz",
60403
14
      "wlan.eht.phy_capabilities.bits_0_15.support_for_242_tone_ru_in_bw_wider_20mhz",
60404
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004, NULL, HFILL }},
60405
60406
14
    {&hf_ieee80211_eht_phy_bits_0_15_ndp_and_3_2_us_gi,
60407
14
     {"NDP With 4x EHT-LTF And 3.2 us GI",
60408
14
      "wlan.eht.phy_capabilities.bits_0_15.ndp_with_4x_eht_ltf_and_3_2_us_gi",
60409
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0008, NULL, HFILL }},
60410
60411
14
    {&hf_ieee80211_eht_phy_bits_0_15_partial_bw_ul_mu_mimo,
60412
14
     {"Partial Bandwidth UL MU-MIMO",
60413
14
      "wlan.eht.phy_capabilities.bits_0_15.partial_bandwidth_ul_mu_mimo",
60414
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010, NULL, HFILL }},
60415
60416
14
    {&hf_ieee80211_eht_phy_bits_0_15_su_beamformer,
60417
14
     {"SU Beamformer", "wlan.eht.phy_capabilities.bits_0_15.su_beamformer",
60418
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020, NULL, HFILL }},
60419
60420
14
    {&hf_ieee80211_eht_phy_bits_0_15_su_beamformee,
60421
14
     {"SU Beamformee", "wlan.eht.phy_capabilities.bits_0_15.su_beamformee",
60422
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
60423
60424
14
    {&hf_ieee80211_eht_phy_bits_0_15_su_beamformee_le_80mhz,
60425
14
     {"Beamformee SS (<= 80 MHz)",
60426
14
      "wlan.eht.phy_capabilities.bits_0_15.beamformee_ss_le_80mhz",
60427
14
      FT_UINT16, BASE_HEX, NULL, 0x0380, NULL, HFILL }},
60428
60429
14
    {&hf_ieee80211_eht_phy_bits_0_15_su_beamformee_eq_160mhz,
60430
14
     {"Beamformee SS (= 160 MHz)",
60431
14
      "wlan.eht.phy_capabilities.bits_0_15.beamformee_ss_eq_160mhz",
60432
14
      FT_UINT16, BASE_HEX, NULL, 0x1c00, NULL, HFILL }},
60433
60434
14
    {&hf_ieee80211_eht_phy_bits_0_15_su_beamformee_eq_320mhz,
60435
14
     {"Beamformee SS (= 320 MHz)",
60436
14
      "wlan.eht.phy_capabilities.bits_0_15.beamformee_ss_eq_320_mhz",
60437
14
      FT_UINT16, BASE_HEX, NULL, 0xe000, NULL, HFILL }},
60438
60439
14
    {&hf_ieee80211_eht_phy_bits_16_31,
60440
14
     {"EHT PHY Bits 16-31", "wlan.eht.phy_capabilities.bits_16_31",
60441
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60442
60443
14
    {&hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_lt_80mhz,
60444
14
     {"Number Of Sounding Dimensions (<= 80 MHz)",
60445
14
      "wlan.eht.phy_capabilities.bits_16_31.number_of_sounding_dims_le_80_mhz",
60446
14
      FT_UINT16, BASE_HEX, NULL, 0x0007, NULL, HFILL }},
60447
60448
14
    {&hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_eq_160mhz,
60449
14
     {"Number Of Sounding Dimensions (= 160 MHz)",
60450
14
      "wlan.eht.phy_capabilities.bits_16_31.number_of_sounding_dims_eq_160_mhz",
60451
14
      FT_UINT16, BASE_HEX, NULL, 0x0038, NULL, HFILL }},
60452
60453
14
    {&hf_ieee80211_eht_phy_bits_16_31_num_sounding_dims_eq_320mhz,
60454
14
     {"Number Of Sounding Dimensions (= 320 MHz)",
60455
14
      "wlan.eht.phy_capabilities.bits_16_31.number_of_sounding_dims_eq_320_mhz",
60456
14
      FT_UINT16, BASE_HEX, NULL, 0x01c0, NULL, HFILL }},
60457
60458
14
    {&hf_ieee80211_eht_phy_bits_16_31_num_ng_eq_16_su_feedback,
60459
14
     {"Ng = 16 SU Feedback",
60460
14
      "wlan.eht.phy_capabilities.bits_16_31.ng_eq_16_su_fbck",
60461
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
60462
60463
14
    {&hf_ieee80211_eht_phy_bits_16_31_num_ng_eq_16_mu_feedback,
60464
14
     {"Ng = 16 MU Feedback",
60465
14
      "wlan.eht.phy_capabilities.bits_16_31.ng_eq_16_mu_fbck",
60466
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
60467
60468
14
    {&hf_ieee80211_eht_phy_bits_16_31_codebook_size_4_2_su_fbck,
60469
14
     {"Codebook Size = (4,2) SU Feedback",
60470
14
      "wlan.eht.phy_capabilities.bits_16_31.codebook_size_eq_4_2_su_fbck",
60471
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
60472
60473
14
    {&hf_ieee80211_eht_phy_bits_16_31_codebook_size_7_5_mu_fbck,
60474
14
     {"Codebook Size = (7,5) MU Feedback",
60475
14
      "wlan.eht.phy_capabilities.bits_16_31.codebook_size_eq_7_5_mu_fbck",
60476
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
60477
60478
14
    {&hf_ieee80211_eht_phy_bits_16_31_triggered_su_beemform_fbck,
60479
14
     {"Triggered SU Beamforming Feedback",
60480
14
      "wlan.eht.phy_capabilities.bits_16_31.triggered_su_beamforming_fbck",
60481
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
60482
60483
14
    {&hf_ieee80211_eht_phy_bits_16_31_triggered_mu_beemform_p_bw_fbck,
60484
14
     {"Triggered MU Beamforming Partial BW Feedback",
60485
14
      "wlan.eht.phy_capabilities.bits_16_31.triggered_mu_beamforming_partial_fbck",
60486
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x4000, NULL, HFILL }},
60487
60488
14
    {&hf_ieee80211_eht_phy_bits_16_31_triggered_cqi_feedback,
60489
14
     {"Triggered CQI Feedback",
60490
14
      "wlan.eht.phy_capabilities.bits_16_31.triggered_cqi_fbck",
60491
14
      FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x8000, NULL, HFILL }},
60492
60493
14
    {&hf_ieee80211_eht_phy_bits_32_39,
60494
14
     {"EHT PHY Bits 32-39", "wlan.eht.phy_capabilities.bits_32_39",
60495
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60496
60497
14
    {&hf_ieee80211_eht_phy_bits_32_39_partial_bw_dl_mu_mimo,
60498
14
     {"Partial Bandwidth DL MU-MIMO",
60499
14
      "wlan.eht.phy_capabilities.bits_32_39.partial_bw_dl_mu_mimo",
60500
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
60501
60502
14
    {&hf_ieee80211_eht_phy_bits_32_39_eht_psr_based_sr_support,
60503
14
     {"EHT PSR-Based SR support",
60504
14
      "wlan.eht.phy_capabilities.bits_32_39.eht_psr_based_sr_support",
60505
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
60506
60507
14
    {&hf_ieee80211_eht_phy_bits_32_39_power_boost_factor_support,
60508
14
     {"Power Boost Factor Support",
60509
14
      "wlan.eht.phy_capabilities.bits_32_39.power_boost_factor_support",
60510
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
60511
60512
14
    {&hf_ieee80211_eht_phy_bits_32_39_eht_mu_ppdu_w_4x_eht_ltf_08_gi,
60513
14
     {"EHT MU PPDU With 4x EHT-LTF and 0.8 us GI",
60514
14
      "wlan.eht.phy_capabilities.bits_32_39.eht_mu_ppdu_w_4x_eht_ltf_08_us_gi",
60515
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
60516
60517
14
    {&hf_ieee80211_eht_phy_bits_32_39_max_nc,
60518
14
     {"Max Nc", "wlan.eht.phy_capabilities.bits_32_39.max_nc",
60519
14
      FT_UINT8, BASE_DEC, NULL, 0xf0, NULL, HFILL }},
60520
60521
14
    {&hf_ieee80211_eht_phy_bits_40_63,
60522
14
     {"EHT PHY Bits 40-63", "wlan.eht.phy_capabilities.bits_40_63",
60523
14
      FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60524
60525
14
    {&hf_ieee80211_eht_phy_bits_40_63_non_triggered_cqi_fbck,
60526
14
     {"Non-Triggered CQI Feedback",
60527
14
      "wlan.eht.phy_capabilities.bits_40_63.non_triggered_cqi_fbck",
60528
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60529
14
      0x000001, NULL, HFILL }},
60530
60531
14
    {&hf_ieee80211_eht_phy_bits_40_63_tx_1024_4096_qam_lt_242_ru_support,
60532
14
     {"Tx 1024-QAM & 4096-QAM < 242-tone RU Support",
60533
14
      "wlan.eht.phy_capabilities.bits_40_63.tx_1024_4096_qam_lt_242_ru_support",
60534
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60535
14
      0x000002, NULL, HFILL }},
60536
60537
14
    {&hf_ieee80211_eht_phy_bits_40_63_rx_1024_4096_qam_lt_242_ru_support,
60538
14
     {"Rx 1024-QAM & 4096-QAM < 242-tone-RU Support",
60539
14
      "wlan.eht.phy_capabilities.bits_40_63.rx_1024_4096_qam_lt_242_ru_support",
60540
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60541
14
      0x000004, NULL, HFILL }},
60542
60543
14
    {&hf_ieee80211_eht_phy_bits_40_63_ppe_thresholds_present,
60544
14
     {"PPE Thresholds Present",
60545
14
      "wlan.eht.phy_capabilities.bits_40_63.ppe_thresholds_present",
60546
14
      FT_BOOLEAN, 24, TFS(&tfs_present_not_present),
60547
14
      0x000008, NULL, HFILL }},
60548
60549
14
    {&hf_ieee80211_eht_phy_bits_40_63_common_nominal_packet_padding,
60550
14
     {"Common Nominal Packet Padding",
60551
14
      "wlan.eht.phy_capabilities.bits_40_63.common_nominal_packet_padding",
60552
14
      FT_UINT24, BASE_DEC, NULL, 0x000030, NULL, HFILL }},
60553
60554
14
    {&hf_ieee80211_eht_phy_bits_40_63_max_num_supported_eht_ltfs,
60555
14
     {"Maximum Number Of Supported EHT-LTFs",
60556
14
      "wlan.eht.phy_capabilities.bits_40_63.max_num_supported_eht_ltfs",
60557
14
      FT_UINT24, BASE_DEC, NULL, 0x0007c0, NULL, HFILL }},
60558
60559
14
    {&hf_ieee80211_eht_phy_bits_40_63_support_of_mcx_15,
60560
14
     {"Support Of MCS 15",
60561
14
      "wlan.eht.phy_capabilities.bits_40_63.support_of_mcs_15",
60562
14
      FT_UINT24, BASE_DEC, NULL, 0x007800, NULL, HFILL }},
60563
60564
14
    {&hf_ieee80211_eht_phy_bits_40_63_support_of_eht_dup_in_6_ghz,
60565
14
     {"Support Of EHT DUP (MCS 14) in 6 GHz",
60566
14
      "wlan.eht.phy_capabilities.bits_40_63.support_eht_dup_6_ghz",
60567
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60568
14
      0x008000, NULL, HFILL }},
60569
14
    {&hf_ieee80211_eht_phy_bits_40_63_support_20_mhz_sta_ndp_wide_bw,
60570
14
     {"Support For 20 MHz Operating STA Receiving NDP With Wider BW",
60571
14
      "wlan.eht.phy_capabilities.bits_40_63.support_20_mhz_sta_recv_ndp_wider_bw",
60572
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60573
14
      0x010000, NULL, HFILL }},
60574
60575
14
    {&hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_le_80_mhz,
60576
14
     {"Non-OFDMA UL MU-MIMO (BW <= 80 MHz)",
60577
14
      "wlan.eht.phy_capabilities.bits_40_63.non_ofdma_ul_mu_mimo_bw_lt_80_mhz",
60578
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60579
14
      0x020000, NULL, HFILL }},
60580
60581
14
    {&hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_eq_160_mhz,
60582
14
     {"Non-OFDMA UL MU-MIMO (BW = 160 MHz)",
60583
14
      "wlan.eht.phy_capabilities.bits_40_63.non_ofdma_ul_mu_mimo_bw_eq_160_mhz",
60584
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60585
14
      0x040000, NULL, HFILL }},
60586
60587
14
    {&hf_ieee80211_eht_phy_bits_40_63_non_ofdma_ul_mu_bw_eq_320_mhz,
60588
14
     {"Non-OFDMA UL MU-MIMO (BW = 320 MHz)",
60589
14
      "wlan.eht.phy_capabilities.bits_40_63.non_ofdma_ul_mu_mimo_bw_eq_320_mhz",
60590
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60591
14
      0x080000, NULL, HFILL }},
60592
60593
14
    {&hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_le_80_mhz,
60594
14
     {"MU Beamformer (BW <= 80 MHz)",
60595
14
      "wlan.eht.phy_capabilities.bits_40_63.mu_beamformer_bw_le_80_mhz",
60596
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60597
14
      0x100000, NULL, HFILL }},
60598
60599
14
    {&hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_eq_160_mhz,
60600
14
     {"MU Beamformer (BW = 160 MHz)",
60601
14
      "wlan.eht.phy_capabilities.bits_40_63.mu_beamformer_bw_eq_160_mhz",
60602
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60603
14
      0x200000, NULL, HFILL }},
60604
60605
14
    {&hf_ieee80211_eht_phy_bits_40_63_mu_beamformer_bw_eq_320_mhz,
60606
14
     {"MU Beamformer (BW = 320 MHz)",
60607
14
      "wlan.eht.phy_capabilities.bits_40_63.mu_beamformer_bw_eq_320_mhz",
60608
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60609
14
      0x400000, NULL, HFILL }},
60610
60611
14
    {&hf_ieee80211_eht_phy_bits_40_63_tb_sounding_feedback_rate_limit,
60612
14
     {"TB Sounding Feedback Rate Limit",
60613
14
      "wlan.eht.phy_capabilities.bits_40_63.tb_sounding_fbck_rate_limit",
60614
14
      FT_BOOLEAN, 24, TFS(&tfs_supported_not_supported),
60615
14
      0x800000, NULL, HFILL }},
60616
60617
14
    {&hf_ieee80211_eht_phy_bits_64_71,
60618
14
     {"EHT PHY Bits 64-71", "wlan.eht.phy_capabilities.bits_64_71",
60619
14
      FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60620
60621
14
    {&hf_ieee80211_eht_phy_bits_64_71_rx_1024_qam_wid_bw_dl_ofdma_sup,
60622
14
     {"Rx 1024-QAM In Wider Bandwidth DL OFDMA Support",
60623
14
      "wlan.eht.phy_capabilities.bits_64_71.rx_1024_qam_in_wider_bw_dl_ofdma",
60624
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported),
60625
14
      0x01, NULL, HFILL }},
60626
60627
14
    {&hf_ieee80211_eht_phy_bits_64_71_rx_4096_qam_wid_bw_dl_ofdma_sup,
60628
14
     {"Rx 4096-QAM In Wider Bandwidth DL OFDMA SUpport",
60629
14
      "wlan.eht.phy_capabilities.bits_64_71.rx_4096_qam_in_wider_bw_dl_ofdma",
60630
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported),
60631
14
      0x02, NULL, HFILL }},
60632
60633
14
    {&hf_ieee80211_eht_phy_bits_64_71_20m_limit_capa_support,
60634
14
     {"20 MHz-Only Limited Capabilities Support",
60635
14
      "wlan.eht.phy_capabilities.bits_64_71.20m_only_limited_capabilities",
60636
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported),
60637
14
      0x04, NULL, HFILL }},
60638
60639
14
    {&hf_ieee80211_eht_phy_bits_64_71_20m_mu_beam_feedback_dl_mu_mimo,
60640
14
     {"20 MHz-Only Triggered MU Beamforming Full BW Feedback And DL MU-MIMO",
60641
14
      "wlan.eht.phy_capabilities.bits_64_71.20m_only_trig_mu_beamforming_dl_mu_mimo",
60642
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported),
60643
14
      0x08, NULL, HFILL }},
60644
60645
14
    {&hf_ieee80211_eht_phy_bits_64_71_20m_mru_support,
60646
14
     {"20 MHz-Only MRU Support",
60647
14
      "wlan.eht.phy_capabilities.bits_64_71.20m_only_mru_support",
60648
14
      FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported),
60649
14
      0x10, NULL, HFILL }},
60650
60651
14
    {&hf_ieee80211_eht_phy_bits_64_71_reserved,
60652
14
     {"Reserved", "wlan.eht.phy_capabilities.bits_64_71.reserved",
60653
14
      FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL }},
60654
60655
14
    {&hf_ieee80211_eht_mcs_and_nss_non_ap,
60656
14
     {"EHT-MCS Map (20 MHz-Only Non-AP STA)",
60657
14
      "wlan.eht.supported_eht_mcs_bss_set.20_mhz_only_non_sta",
60658
14
       FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60659
60660
14
    {&hf_ieee80211_eht_rx_max_nss_20mhz_0_7,
60661
14
     {"RX Max NSS That Supports EHt-MCS 0-7",
60662
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.rx_max_nss_supports_eht_mcs_0_7",
60663
14
      FT_UINT32, BASE_HEX, NULL, 0x0000000F, NULL, HFILL }},
60664
60665
14
    {&hf_ieee80211_eht_tx_max_nss_20mhz_0_7,
60666
14
     {"TX Max NSS That Supports EHt-MCS 0-7",
60667
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.tx_max_nss_supports_eht_mcs_0_7",
60668
14
      FT_UINT32, BASE_HEX, NULL, 0x000000F0, NULL, HFILL }},
60669
60670
14
    {&hf_ieee80211_eht_rx_max_nss_20mhz_8_9,
60671
14
     {"RX Max NSS That Supports EHt-MCS 8-9",
60672
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.rx_max_nss_supports_eht_mcs_8_9",
60673
14
      FT_UINT32, BASE_HEX, NULL, 0x00000F00, NULL, HFILL }},
60674
60675
14
    {&hf_ieee80211_eht_tx_max_nss_20mhz_8_9,
60676
14
     {"TX Max NSS That Supports EHt-MCS 8-9",
60677
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.tx_max_nss_supports_eht_mcs_8_9",
60678
14
      FT_UINT32, BASE_HEX, NULL, 0x0000F000, NULL, HFILL }},
60679
60680
14
    {&hf_ieee80211_eht_rx_max_nss_20mhz_10_11,
60681
14
     {"RX Max NSS That Supports EHt-MCS 10-11",
60682
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.rx_max_nss_supports_eht_mcs_10_11",
60683
14
      FT_UINT32, BASE_HEX, NULL, 0x000F0000, NULL, HFILL }},
60684
60685
14
    {&hf_ieee80211_eht_tx_max_nss_20mhz_10_11,
60686
14
     {"TX Max NSS That Supports EHt-MCS 10-11",
60687
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.tx_max_nss_supports_eht_mcs_10_11",
60688
14
      FT_UINT32, BASE_HEX, NULL, 0x00F00000, NULL, HFILL }},
60689
60690
14
    {&hf_ieee80211_eht_rx_max_nss_20mhz_12_13,
60691
14
     {"RX Max NSS That Supports EHt-MCS 12-13",
60692
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.rx_max_nss_supports_eht_mcs_12_13",
60693
14
      FT_UINT32, BASE_HEX, NULL, 0x0F000000, NULL, HFILL }},
60694
60695
14
    {&hf_ieee80211_eht_tx_max_nss_20mhz_12_13,
60696
14
     {"TX Max NSS That Supports EHt-MCS 12-13",
60697
14
      "wlan.eht.supported_eht_mcs_bss_non_sta.tx_max_nss_supports_eht_mcs_12_13",
60698
14
      FT_UINT32, BASE_HEX, NULL, 0xF0000000, NULL, HFILL }},
60699
60700
14
    {&hf_ieee80211_eht_mcs_and_nss_le_80mhz,
60701
14
     {"EHT-MCS Map (BW <= 80MHz)",
60702
14
      "wlan.eht.supported_eht_mcs_bss_set.eht_mcs_map_bw_le_80_mhz",
60703
14
      FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60704
60705
14
    {&hf_ieee80211_eht_le_80_rx_max_nss_0_9,
60706
14
     {"Rx Max Nss That Supports EHT-MCS 0-9",
60707
14
      "wlan.eht.supported_eht_mcs_bss_set.le_80.rx_max_nss_supports_eht_mcs_0_9",
60708
14
      FT_UINT24, BASE_DEC, NULL, 0x00000F, NULL, HFILL }},
60709
60710
14
    {&hf_ieee80211_eht_le_80_tx_max_nss_0_9,
60711
14
     {"Tx Max Nss That Supports EHT-MCS 0-9",
60712
14
      "wlan.eht.supported_eht_mcs_bss_set.le_80.tx_max_nss_supports_eht_mcs_0_9",
60713
14
      FT_UINT24, BASE_DEC, NULL, 0x0000F0, NULL, HFILL }},
60714
60715
14
    {&hf_ieee80211_eht_le_80_rx_max_nss_10_11,
60716
14
     {"Rx Max Nss That Supports EHT-MCS 10-11",
60717
14
      "wlan.eht.supported_eht_mcs_bss_set.le_80.rx_max_nss_supports_eht_mcs_10_11",
60718
14
      FT_UINT24, BASE_DEC, NULL, 0x000F00, NULL, HFILL }},
60719
60720
14
    {&hf_ieee80211_eht_le_80_tx_max_nss_10_11,
60721
14
     {"Tx Max Nss That Supports EHT-MCS 10-11",
60722
14
      "wlan.eht.supported_eht_mcs_bss_set.le_80.tx_max_nss_supports_eht_mcs_10_11",
60723
14
      FT_UINT24, BASE_DEC, NULL, 0x00F000, NULL, HFILL }},
60724
60725
14
    {&hf_ieee80211_eht_le_80_rx_max_nss_12_13,
60726
14
     {"Rx Max Nss That Supports EHT-MCS 12-13",
60727
14
      "wlan.eht.supported_eht_mcs_bss_set.le_80.rx_max_nss_supports_eht_mcs_12_13",
60728
14
      FT_UINT24, BASE_DEC, NULL, 0x0F0000, NULL, HFILL }},
60729
60730
14
    {&hf_ieee80211_eht_le_80_tx_max_nss_12_13,
60731
14
     {"Tx Max Nss That Supports EHT-MCS 12-13",
60732
14
      "wlan.eht.supported_eht_mcs_bss_set.le_80.tx_max_nss_supports_eht_mcs_12_13",
60733
14
      FT_UINT24, BASE_DEC, NULL, 0xF00000, NULL, HFILL }},
60734
60735
14
    {&hf_ieee80211_eht_mcs_and_nss_eq_160mhz,
60736
14
     {"EHT-MCS Map (BW = 160MHz)",
60737
14
      "wlan.eht.supported_eht_mcs_bss_set.eht_mcs_map_bw_eq_160_mhz",
60738
14
      FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60739
60740
14
    {&hf_ieee80211_eht_160_rx_max_nss_0_9,
60741
14
     {"Rx Max Nss That Supports EHT-MCS 0-9",
60742
14
      "wlan.eht.supported_eht_mcs_bss_set.160.rx_max_nss_supports_eht_mcs_0_9",
60743
14
      FT_UINT24, BASE_DEC, NULL, 0x00000F, NULL, HFILL }},
60744
60745
14
    {&hf_ieee80211_eht_160_tx_max_nss_0_9,
60746
14
     {"Tx Max Nss That Supports EHT-MCS 0-9",
60747
14
      "wlan.eht.supported_eht_mcs_bss_set.160.tx_max_nss_supports_eht_mcs_0_9",
60748
14
      FT_UINT24, BASE_DEC, NULL, 0x0000F0, NULL, HFILL }},
60749
60750
14
    {&hf_ieee80211_eht_160_rx_max_nss_10_11,
60751
14
     {"Rx Max Nss That Supports EHT-MCS 10-11",
60752
14
      "wlan.eht.supported_eht_mcs_bss_set.160.rx_max_nss_supports_eht_mcs_10_11",
60753
14
      FT_UINT24, BASE_DEC, NULL, 0x000F00, NULL, HFILL }},
60754
60755
14
    {&hf_ieee80211_eht_160_tx_max_nss_10_11,
60756
14
     {"Tx Max Nss That Supports EHT-MCS 10-11",
60757
14
      "wlan.eht.supported_eht_mcs_bss_set.160.tx_max_nss_supports_eht_mcs_10_11",
60758
14
      FT_UINT24, BASE_DEC, NULL, 0x00F000, NULL, HFILL }},
60759
60760
14
    {&hf_ieee80211_eht_160_rx_max_nss_12_13,
60761
14
     {"Rx Max Nss That Supports EHT-MCS 12-13",
60762
14
      "wlan.eht.supported_eht_mcs_bss_set.160.rx_max_nss_supports_eht_mcs_12_13",
60763
14
      FT_UINT24, BASE_DEC, NULL, 0x0F0000, NULL, HFILL }},
60764
60765
14
    {&hf_ieee80211_eht_160_tx_max_nss_12_13,
60766
14
     {"Tx Max Nss That Supports EHT-MCS 12-13",
60767
14
      "wlan.eht.supported_eht_mcs_bss_set.160.tx_max_nss_supports_eht_mcs_12_13",
60768
14
      FT_UINT24, BASE_DEC, NULL, 0xF00000, NULL, HFILL }},
60769
60770
14
    {&hf_ieee80211_eht_mcs_and_nss_eq_320mhz,
60771
14
     {"EHT-MCS Map (BW = 320MHz)",
60772
14
      "wlan.eht.supported_eht_mcs_bss_set.eht_mcs_map_bw_eq_320_mhz",
60773
14
      FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60774
60775
14
    {&hf_ieee80211_eht_320_rx_max_nss_0_9,
60776
14
     {"Rx Max Nss That Supports EHT-MCS 0-9",
60777
14
      "wlan.eht.supported_eht_mcs_bss_set.320.rx_max_nss_supports_eht_mcs_0_9",
60778
14
      FT_UINT24, BASE_DEC, NULL, 0x00000F, NULL, HFILL }},
60779
60780
14
    {&hf_ieee80211_eht_320_tx_max_nss_0_9,
60781
14
     {"Tx Max Nss That Supports EHT-MCS 0-9",
60782
14
      "wlan.eht.supported_eht_mcs_bss_set.320.tx_max_nss_supports_eht_mcs_0_9",
60783
14
      FT_UINT24, BASE_DEC, NULL, 0x0000F0, NULL, HFILL }},
60784
60785
14
    {&hf_ieee80211_eht_320_rx_max_nss_10_11,
60786
14
     {"Rx Max Nss That Supports EHT-MCS 10-11",
60787
14
      "wlan.eht.supported_eht_mcs_bss_set.320.rx_max_nss_supports_eht_mcs_10_11",
60788
14
      FT_UINT24, BASE_DEC, NULL, 0x000F00, NULL, HFILL }},
60789
60790
14
    {&hf_ieee80211_eht_320_tx_max_nss_10_11,
60791
14
     {"Tx Max Nss That Supports EHT-MCS 10-11",
60792
14
      "wlan.eht.supported_eht_mcs_bss_set.320.tx_max_nss_supports_eht_mcs_10_11",
60793
14
      FT_UINT24, BASE_DEC, NULL, 0x00F000, NULL, HFILL }},
60794
60795
14
    {&hf_ieee80211_eht_320_rx_max_nss_12_13,
60796
14
     {"Rx Max Nss That Supports EHT-MCS 12-13",
60797
14
      "wlan.eht.supported_eht_mcs_bss_set.320.rx_max_nss_supports_eht_mcs_12_13",
60798
14
      FT_UINT24, BASE_DEC, NULL, 0x0F0000, NULL, HFILL }},
60799
60800
14
    {&hf_ieee80211_eht_320_tx_max_nss_12_13,
60801
14
     {"Tx Max Nss That Supports EHT-MCS 12-13",
60802
14
      "wlan.eht.supported_eht_mcs_bss_set.320.tx_max_nss_supports_eht_mcs_12_13",
60803
14
      FT_UINT24, BASE_DEC, NULL, 0xF00000, NULL, HFILL }},
60804
60805
14
    {&hf_ieee80211_eht_supported_mcs_nss_bytes,
60806
14
     {"Supported EHT-MCS and NSS Set bytes",
60807
14
      "wlan.eht.supported_eht_mcs_nss_set.bytes",
60808
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
60809
60810
14
    {&hf_ieee80211_eht_ppe_thresholds,
60811
14
     {"EHT PPE Thresholds", "wlan.eht.ppe_thresholds",
60812
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
60813
60814
14
    {&hf_ieee80211_eht_ttl_mapping_control,
60815
14
     {"TID-To-Link Mapping Control",
60816
14
      "wlan.eht.tid_to_link_mapping.control",
60817
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60818
60819
14
    {&hf_ieee80211_eht_ttl_mapping_direction,
60820
14
     {"Direction", "wlan.eht.tid_to_link_mapping.control.direction",
60821
14
      FT_UINT8, BASE_HEX, VALS(tid_to_link_mapping_dirn_vals), 0x03,
60822
14
      NULL, HFILL }},
60823
60824
14
    {&hf_ieee80211_eht_ttl_default_link_mapping,
60825
14
     {"Default Link Mapping",
60826
14
      "wlan.eht.tid_to_link_mapping.control.default_link_mapping",
60827
14
      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
60828
60829
14
    {&hf_ieee80211_eht_ttl_mapping_switch_time_pres,
60830
14
     {"Mapping Switch Time Present",
60831
14
      "wlan.eht.tid_to_link_mapping.control.mapping_switch_time",
60832
14
      FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
60833
60834
14
    {&hf_ieee80211_eht_ttl_expected_dura_pres,
60835
14
     {"Expected Duration Present",
60836
14
      "wlan.eht.tid_to_link_mapping.control.expected_duration",
60837
14
      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
60838
60839
14
    {&hf_ieee80211_eht_ttl_link_mapping_size,
60840
14
     {"Link Mapping Size",
60841
14
      "wlan.eht.tid_to_link_mapping.control.link_mapping_size",
60842
14
      FT_UINT8, BASE_DEC, VALS(ttl_link_mapping_size_vals), 0x20, NULL, HFILL }},
60843
60844
14
    {&hf_ieee80211_eht_ttl_mapping_reserved,
60845
14
     {"Reserved", "wlan.eht.tid_to_link_mapping.control.reserved",
60846
14
      FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL }},
60847
60848
14
    {&hf_ieee80211_eht_ttl_mapping_presence,
60849
14
     {"Link Mapping Presence Indicator",
60850
14
      "wlan.eht.tid_to_link_mapping.control.link_mapping_presence_indicator",
60851
14
      FT_UINT8, BASE_HEX, NULL, 0x00, NULL, HFILL }},
60852
60853
14
    {&hf_ieee80211_eht_ttl_mapping_switch_time,
60854
14
     {"Mapping Switch Time", "wlan.eht.tid_to_link_mapping.switch_time",
60855
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60856
60857
14
    {&hf_ieee80211_eht_ttl_mapping_expected_duration,
60858
14
     {"Expected Duration", "wlan.eht.tid_to_link_mapping.expected_duration",
60859
14
      FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60860
60861
14
    {&hf_ieee80211_eht_ttl_mapping_tid_0_link_mapping,
60862
14
     {"Link Mapping Of TID 0", "wlan.eht.tid_to_link_mapping.tid_0.link_mapping",
60863
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60864
60865
14
    {&hf_ieee80211_eht_ttl_mapping_tid_1_link_mapping,
60866
14
     {"Link Mapping Of TID 1", "wlan.eht.tid_to_link_mapping.tid_1.link_mapping",
60867
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60868
60869
14
    {&hf_ieee80211_eht_ttl_mapping_tid_2_link_mapping,
60870
14
     {"Link Mapping Of TID 2", "wlan.eht.tid_to_link_mapping.tid_2.link_mapping",
60871
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60872
60873
14
    {&hf_ieee80211_eht_ttl_mapping_tid_3_link_mapping,
60874
14
     {"Link Mapping Of TID 3", "wlan.eht.tid_to_link_mapping.tid_3.link_mapping",
60875
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60876
60877
14
    {&hf_ieee80211_eht_ttl_mapping_tid_4_link_mapping,
60878
14
     {"Link Mapping Of TID 4", "wlan.eht.tid_to_link_mapping.tid_4.link_mapping",
60879
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60880
60881
14
    {&hf_ieee80211_eht_ttl_mapping_tid_5_link_mapping,
60882
14
     {"Link Mapping Of TID 5", "wlan.eht.tid_to_link_mapping.tid_5.link_mapping",
60883
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60884
60885
14
    {&hf_ieee80211_eht_ttl_mapping_tid_6_link_mapping,
60886
14
     {"Link Mapping Of TID 6", "wlan.eht.tid_to_link_mapping.tid_6.link_mapping",
60887
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60888
60889
14
    {&hf_ieee80211_eht_ttl_mapping_tid_7_link_mapping,
60890
14
     {"Link Mapping Of TID 7", "wlan.eht.tid_to_link_mapping.tid_7.link_mapping",
60891
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60892
60893
14
    {&hf_ieee80211_eht_multi_link_traffic_control,
60894
14
     {"Multi-Link Traffic Control",
60895
14
      "wlan.eht.multi_link_traffic.traffic_control",
60896
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
60897
60898
14
    {&hf_ieee80211_eht_multi_link_tc_bitmap_size,
60899
14
     {"Bitmap Size", "wlan.eht.multi_link_traffic.traffic_control.bitmap_size",
60900
14
      FT_UINT16, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), 0x000F, NULL, HFILL }},
60901
60902
14
    {&hf_ieee80211_eht_multi_link_tc_aid_offset,
60903
14
     {"AID Offset", "wlan.eht.multi_link_traffic.traffic_control.aid_offset",
60904
14
      FT_UINT16, BASE_DEC, NULL, 0x7FF0, NULL, HFILL }},
60905
60906
14
    {&hf_ieee80211_eht_multi_link_tc_reserved,
60907
14
     {"Reserved", "wlan.eht.multi_link_traffic.traffic_control.reserved",
60908
14
      FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL }},
60909
60910
14
    {&hf_ieee80211_eht_multi_link_traffic_indication,
60911
14
     {"Traffic Indication List",
60912
14
      "wlan.eht.multi_link_traffic.traffic_indication_list",
60913
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
60914
60915
14
    {&hf_ieee80211_eht_qos_chars_dirn,
60916
14
     {"Direction", "wlan.eht.qos_characteristics.control.direction",
60917
14
      FT_UINT32, BASE_HEX, VALS(qos_chars_dirn_vals),
60918
14
      0x00000003, NULL, HFILL }},
60919
60920
14
    {&hf_ieee80211_eht_qos_chars_tid,
60921
14
     {"TID", "wlan.eht.qos_characteristics.control.tid",
60922
14
      FT_UINT32, BASE_HEX, NULL, 0x0000003C, NULL, HFILL }},
60923
60924
14
    {&hf_ieee80211_eht_qos_chars_user_prio,
60925
14
     {"User Priority", "wlan.eht.qos_characteristics.control.user_priority",
60926
14
      FT_UINT32, BASE_HEX, NULL, 0x000001C0, NULL, HFILL }},
60927
60928
14
    {&hf_ieee80211_eht_qos_chars_bitmap,
60929
14
     {"Presence Bitmap of Additional Parameters",
60930
14
      "wlan.eht.qos_characteristics.control.presence_bitmap",
60931
14
      FT_UINT32, BASE_HEX, NULL, 0x01FFFE00, NULL, HFILL }},
60932
60933
14
    {&hf_ieee80211_eht_qos_chars_linkid,
60934
14
     {"LinkID", "wlan.eht.qos_characteristics.control.linkid",
60935
14
      FT_UINT32, BASE_HEX, NULL, 0x1E000000, NULL, HFILL }},
60936
60937
14
    {&hf_ieee80211_eht_qos_chars_resrvd,
60938
14
     {"Reserved", "wlan.eht.qos_characteristics.control.reserved",
60939
14
      FT_UINT32, BASE_HEX, NULL, 0xE0000000, NULL, HFILL }},
60940
60941
14
    {&hf_ieee80211_eht_qos_chars_min_svc_interval,
60942
14
     {"Minimum Service Interval",
60943
14
      "wlan.eht.qos_characteristics.minimum_service_interval",
60944
14
      FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60945
60946
14
    {&hf_ieee80211_eht_qos_chars_max_svc_interval,
60947
14
     {"Maximum Service Interval",
60948
14
      "wlan.eht.qos_characteristics.maximum_service_interval",
60949
14
      FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60950
60951
14
    {&hf_ieee80211_eht_qos_chars_min_data_rate,
60952
14
     {"Minimum Data Rate",
60953
14
      "wlan.eht.qos_characteristics.minimal_data_rate",
60954
14
      FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60955
60956
14
    {&hf_ieee80211_eht_qos_chars_delay_bound,
60957
14
     {"Delay Bound",
60958
14
      "wlan.eht.qos_characteristics.delay_bound",
60959
14
      FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60960
60961
14
    {&hf_ieee80211_eht_qos_chars_max_msdu_size,
60962
14
     {"Maximum MSDU Size", "wlan.eht.qos_characteristics.max_msdu_size",
60963
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60964
60965
14
    {&hf_ieee80211_eht_qos_chars_service_start_time,
60966
14
     {"Service Start Time", "wlan.eht.qos_characteristics.service_start_time",
60967
14
      FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60968
60969
14
    {&hf_ieee80211_eht_qos_chars_service_start_time_linkid,
60970
14
     {"Service Start Time LinkID", "wlan.eht.qos_characteristics.service_start_time_linkid",
60971
14
      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60972
60973
14
    {&hf_ieee80211_eht_qos_chars_mean_data_rate,
60974
14
     {"Mean Data Rate", "wlan.eht.qos_characteristics.mean_data_rate",
60975
14
      FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60976
60977
14
    {&hf_ieee80211_eht_qos_chars_burst_size,
60978
14
     {"Burst Size", "wlan.eht.qos_characteristics.burst_size",
60979
14
      FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60980
60981
14
    {&hf_ieee80211_eht_qos_chars_msdu_lifetime,
60982
14
     {"MSDU Lifetime", "wlan.eht.qos_characteristics.msdu_lifetime",
60983
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60984
60985
14
    {&hf_ieee80211_eht_qos_chars_msdu_delivery_ratio,
60986
14
     {"MSDU Delivery Ratio", "wlan.eht.qos_characteristics.msdu_delivery_ratio",
60987
14
      FT_UINT8, BASE_DEC, NULL, 0x0f, NULL, HFILL }},
60988
60989
14
    {&hf_ieee80211_eht_qos_chars_msdu_count_exponent,
60990
14
     {"MSDU Count Exponent", "wlan.eht.qos_characteristics.msdu_count_exponent",
60991
14
      FT_UINT8, BASE_DEC, NULL, 0xf0, NULL, HFILL }},
60992
60993
14
    {&hf_ieee80211_eht_qos_chars_medium_time,
60994
14
     {"Medium Time", "wlan.eht.qos_characteristics.medium_time",
60995
14
      FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
60996
60997
14
    {&hf_ieee80211_eht_link_id_bitmap,
60998
14
     {"Link ID Bitmap", "wlan.eht.link_id_bitmap",
60999
14
      FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
61000
61001
14
    {&hf_ieee80211_eht_aid_bitmap_length,
61002
14
     {"Partial AID Bitmap Length", "wlan.eht.aid_bitmap.length",
61003
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
61004
61005
14
    {&hf_ieee80211_eht_aid_bitmap_control,
61006
14
     {"Bitmap Control", "wlan.eht.aid_bitmap.control",
61007
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
61008
61009
14
    {&hf_ieee80211_eht_aid_bitmap_control_offset,
61010
14
     {"Bitmap Offset", "wlan.eht.aid_bitmap.control.offset",
61011
14
      FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL }},
61012
61013
14
    {&hf_ieee80211_eht_aid_bitmap_control_reserved,
61014
14
     {"Reserved", "wlan.eht.aid_bitmap.control.reserved",
61015
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
61016
61017
14
    {&hf_ieee80211_eht_aid_bitmap_partial_aid_bitmap,
61018
14
     {"Partial AID Bitmap", "wlan.eht.aid_bitmap.partial_aid_bitmap",
61019
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
61020
61021
14
    {&hf_ieee80211_eht_aid_bitmap_aid,
61022
14
     {"Association ID", "wlan.eht.aid_bitmap.aid",
61023
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
61024
61025
14
    {&hf_ieee80211_eht_bw_indi_param,
61026
14
     {"Bandwidth Indication Parameters", "wlan.eht.bw_indication_params",
61027
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
61028
61029
14
    {&hf_ieee80211_eht_bw_indi_param_reserved,
61030
14
     {"Reserved", "wlan.eht.bw_indication_params.reserved",
61031
14
      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
61032
61033
14
    {&hf_ieee80211_eht_bw_indi_param_disabled_subchan_bitmap,
61034
14
     {"Disabled Subchannel Bitmap Present", "wlan.eht.bw_indication_params.disabled_subchan_bitamp",
61035
14
      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
61036
61037
14
    {&hf_ieee80211_eht_bw_indi_param_reserved1,
61038
14
     {"Reserved", "wlan.eht.bw_indication_params.reserved1",
61039
14
      FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL }},
61040
61041
14
    {&hf_ieee80211_eht_bw_indi_diabled_bitmap,
61042
14
     {"Disabled Subchannel Bitmap",
61043
14
      "wlan.eht.bw_indication.disabled_subchannel_bitmap",
61044
14
      FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
61045
61046
14
    {&hf_ieee80211_eht_mimo_ctrl_field,
61047
14
     {"EHT MIMO Control", "wlan.eht.mimo.control",
61048
14
      FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
61049
61050
14
    {&hf_ieee80211_eht_mimo_ctrl_nc_index,
61051
14
     {"Nc Index", "wlan.eht.mimo.control.nc_index",
61052
14
      FT_UINT40, BASE_DEC, NULL, 0x000000000F, NULL, HFILL }},
61053
61054
14
    {&hf_ieee80211_eht_mimo_ctrl_nr_index,
61055
14
     {"Nr Index", "wlan.eht.mimo.control.nr_index",
61056
14
      FT_UINT40, BASE_DEC, NULL, 0x00000000F0, NULL, HFILL }},
61057
61058
14
    {&hf_ieee80211_eht_mimo_ctrl_bw,
61059
14
     {"BW", "wlan.eht.mimo.control.bw",
61060
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(eht_mimo_bw_vals),
61061
14
      0x0000000700, NULL, HFILL }},
61062
61063
14
    {&hf_ieee80211_eht_mimo_ctrl_grouping,
61064
14
     {"Grouping", "wlan.eht.mimo.control.grouping",
61065
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(eht_mimo_grouping_vals),
61066
14
      0x0000000800, NULL, HFILL }},
61067
61068
14
    {&hf_ieee80211_eht_mimo_ctrl_feedback_type,
61069
14
     {"Feedback Type", "wlan.eht.mimo.control.feedback_type",
61070
14
      FT_UINT40, BASE_DEC|BASE_VAL64_STRING, VALS64(eht_feedback_type_vals),
61071
14
      0x0000003000, NULL, HFILL }},
61072
61073
14
    {&hf_ieee80211_eht_mimo_ctrl_reserved1,
61074
14
     {"Reserved", "wlan.eht.mimo.control.reserved1",
61075
14
      FT_UINT40, BASE_HEX, NULL, 0x000001C000, NULL, HFILL }},
61076
61077
14
    {&hf_ieee80211_eht_mimo_ctrl_remaining_feedback_segments,
61078
14
     {"Remaining Feedback Segments",
61079
14
      "wlan.eht.mimo.control.remaining_feedback_segments",
61080
14
      FT_UINT40, BASE_DEC, NULL, 0x00000E0000, NULL, HFILL }},
61081
61082
14
    {&hf_ieee80211_eht_mimo_ctrl_first_feedback_segment,
61083
14
     {"First Feedback Segment", "wlan.eht.mimo.control.first_feedback_segment",
61084
14
      FT_UINT40, BASE_DEC, NULL, 0x0000100000, NULL, HFILL }},
61085
61086
14
    {&hf_ieee80211_eht_mimo_ctrl_partial_bw_info,
61087
14
     {"Partial BW Info", "wlan.eht.mimo.control.partial_bw_info",
61088
14
      FT_UINT40, BASE_HEX, NULL, 0x003FE00000, NULL, HFILL }},
61089
61090
14
    {&hf_ieee80211_eht_mimo_ctrl_sounding_dialog_token_number,
61091
14
     {"Sounding Dialog Token Number",
61092
14
      "wlan.eht.mimo.control.sounding_dialog_token_number",
61093
14
      FT_UINT40, BASE_DEC, NULL, 0x0FC0000000, NULL, HFILL }},
61094
61095
14
    {&hf_ieee80211_eht_mimo_ctrl_codebook_info,
61096
14
     {"Codebook Information", "wlan.eht.mimo.control.codebook_info",
61097
14
      FT_UINT40, BASE_DEC, NULL, 0x1000000000, NULL, HFILL }},
61098
61099
14
    {&hf_ieee80211_eht_mimo_ctrl_reserved2,
61100
14
     {"Reserved", "wlan.eht.mimo.control.reserved2",
61101
14
      FT_UINT40, BASE_HEX, NULL, 0xE000000000, NULL, HFILL }},
61102
61103
14
    {&hf_ieee80211_eht_compressed_beamforming_report_snr,
61104
14
     {"AgvSNR", "wlan.eht.mimo.beamforming_report.avgsnr",
61105
14
      FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
61106
61107
14
    {&hf_ieee80211_eht_compressed_beamform_scidx,
61108
14
     {"SCIDX", "wlan.eht.mimo.beamforming_report.scidx",
61109
14
      FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
61110
61111
14
    {&hf_ieee80211_eht_mu_exclusive_beamforming_report_delta_snr,
61112
14
     {"Delta SNR", "wlan.eht.mu.exclusive_beamforming_report.delta_snr",
61113
14
      FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
61114
61115
14
    {&hf_ieee80211_eht_group_key_data_length,
61116
14
     {"Key Data Length", "wlan.eht.group_key_data.length",
61117
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
61118
61119
14
    {&hf_ieee80211_eht_reconfig_link_id_info,
61120
14
     {"Link ID Info", "wlan.eht.reconfig.link_id_info",
61121
14
      FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
61122
61123
14
    {&hf_ieee80211_eht_reconfig_link_id,
61124
14
     {"Link ID", "wlan.eht.reconfig.link_id_info.link_id",
61125
14
      FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
61126
61127
14
    {&hf_ieee80211_eht_reconfig_link_id_reserved,
61128
14
     {"Reserved", "wlan.eht.reconfig.link_id_info.reserved",
61129
14
      FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }},
61130
61131
14
    {&hf_ieee80211_eht_reconfig_status_code,
61132
14
     {"Status code", "wlan.eht.reconfig.status_code",
61133
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
61134
14
      NULL, HFILL }},
61135
61136
14
    {&hf_ieee80211_wfa_rsn_selection,
61137
14
     {"RSNE Variant", "wlan.wfa_rsn_selection.variant",
61138
14
      FT_UINT8, BASE_DEC, VALS(wfa_rsne_variant_vals), 0, NULL, HFILL }},
61139
61140
14
    {&hf_ieee80211_wfa_rsn_or_link_kde_link_id,
61141
14
     {"Link ID", "wlan.wfa_rsn_or_link_kde.link_id",
61142
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
61143
61144
14
    {&hf_ieee80211_nonap_sta_regulatory_conn,
61145
14
     {"Regulatory Connectivity", "wlan.nonap_sta_regulatory_connect",
61146
14
      FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
61147
61148
14
    {&hf_ieee80211_nonap_sta_regu_conn_indoor_ap_valid,
61149
14
     {"Connectivity With Indoor AP Valid", "wlan.nonap_sta_regulatory_connect.indoor_ap_valid",
61150
14
      FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
61151
61152
14
    {&hf_ieee80211_nonap_sta_regu_conn_indoor_ap,
61153
14
     {"Connectivity With Indoor AP", "wlan.nonap_sta_regulatory_connect.indoor_ap",
61154
14
      FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
61155
61156
14
    {&hf_ieee80211_nonap_sta_regu_conn_sp_ap_valid,
61157
14
     {"Connectivity With SP AP Valid", "wlan.nonap_sta_regulatory_connect.sp_ap_valid",
61158
14
      FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
61159
61160
14
    {&hf_ieee80211_nonap_sta_regu_conn_sp_ap,
61161
14
     {"Connectivity With SP AP", "wlan.nonap_sta_regulatory_connect.sp_ap",
61162
14
      FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL }},
61163
61164
14
    {&hf_ieee80211_nonap_sta_regu_conn_reserved,
61165
14
     {"Reserved", "wlan.nonap_sta_regulatory_connect.reserved",
61166
14
      FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL }},
61167
61168
14
    {&hf_ieee80211_tag_channel_usage_mode,
61169
14
     {"Usage Mode", "wlan.channel_usage.mode",
61170
14
      FT_UINT8, BASE_DEC|BASE_RANGE_STRING,
61171
14
      RVALS(channel_usage_mode), 0, NULL, HFILL }},
61172
61173
14
    {&hf_ieee80211_ff_count,
61174
14
     {"Count", "wlan.fixed.count",
61175
14
      FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
61176
14
  };
61177
61178
14
  static hf_register_info aggregate_fields[] = {
61179
14
    {&hf_ieee80211_amsdu_subframe,
61180
14
     {"A-MSDU Subframe", "wlan_aggregate.a_msdu.subframe",
61181
14
      FT_NONE, BASE_NONE, NULL, 0x0,
61182
14
      "Aggregate MAC Service Data Unit (MSDU) Subframe", HFILL }},
61183
61184
14
    {&hf_ieee80211_amsdu_length,
61185
14
     {"A-MSDU Length", "wlan_aggregate.a_msdu.length",
61186
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
61187
14
      NULL, HFILL }},
61188
61189
14
    {&hf_ieee80211_amsdu_padding,
61190
14
     {"A-MSDU Padding", "wlan_aggregate.a_msdu.padding",
61191
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
61192
14
      NULL, HFILL }},
61193
14
  };
61194
61195
14
  static uat_field_t wep_uat_flds[] = {
61196
61197
14
      UAT_FLD_VS(uat_wep_key_records, key, "Key type", wep_type_vals,
61198
14
                        "Decryption key type used"),
61199
14
      UAT_FLD_CSTRING(uat_wep_key_records, string, "Key",
61200
14
                        "wep:<wep hexadecimal key>\n"
61201
14
                        "wpa-pwd:<passphrase>[:<ssid>]\n"
61202
14
                        "wpa-psk:<wpa hexadecimal key>\n"
61203
14
                        "tk:<hexadecimal key>\n"
61204
14
                        "msk:<hexadecimal key>\n"),
61205
14
      UAT_END_FIELDS
61206
14
    };
61207
61208
14
  static int *ett[] = {
61209
14
    &ett_80211,
61210
14
    &ett_proto_flags,
61211
14
    &ett_cap_tree,
61212
14
    &ett_fc_tree,
61213
14
    &ett_cntrl_wrapper_fc,
61214
14
    &ett_cntrl_wrapper_payload,
61215
14
    &ett_fragments,
61216
14
    &ett_fragment,
61217
14
    &ett_block_ack,
61218
14
    &ett_block_ack_tid,
61219
14
    &ett_block_ack_request_control,
61220
14
    &ett_block_ack_bitmap,
61221
14
    &ett_block_ack_request_multi_sta_aid_tid,
61222
14
    &ett_multi_sta_block_ack,
61223
14
    &ett_ath_cap_tree,
61224
14
    &ett_extreme_mesh_services_tree,
61225
14
    &ett_addr,
61226
61227
14
    &ett_80211_mgt,
61228
14
    &ett_fixed_parameters,
61229
14
    &ett_tagged_parameters,
61230
14
    &ett_tag_bmapctl_tree,
61231
14
    &ett_s1g_pvb_tree,
61232
14
    &ett_s1g_pvb_eb_tree,
61233
14
    &ett_s1g_pvb_block_control_byte,
61234
14
    &ett_s1g_pvb_block_bitmap_tree,
61235
14
    &ett_s1g_pvb_subblock_tree,
61236
14
    &ett_s1g_pvb_olb_tree,
61237
14
    &ett_s1g_pvb_ade_control,
61238
14
    &ett_s1g_pvb_ade_tree,
61239
14
    &ett_s1g_pvb_olb_subblock,
61240
14
    &ett_tag_country_fnm_tree,
61241
14
    &ett_tag_country_rcc_tree,
61242
14
    &ett_qos_parameters,
61243
14
    &ett_qos_ps_buf_state,
61244
14
    &ett_wep_parameters,
61245
14
    &ett_msh_control,
61246
14
    &ett_hwmp_targ_flags_tree,
61247
14
    &ett_mesh_chswitch_flag_tree,
61248
14
    &ett_mesh_config_cap_tree,
61249
14
    &ett_mesh_formation_info_tree,
61250
14
    &ett_bcn_timing_rctrl_tree,
61251
14
    &ett_bcn_timing_info_tree,
61252
14
    &ett_gann_flags_tree,
61253
14
    &ett_pxu_proxy_info_tree,
61254
14
    &ett_pxu_proxy_info_flags_tree,
61255
61256
14
    &ett_rsn_gcs_tree,
61257
14
    &ett_rsn_pcs_tree,
61258
14
    &ett_rsn_sub_pcs_tree,
61259
14
    &ett_rsn_akms_tree,
61260
14
    &ett_rsn_sub_akms_tree,
61261
14
    &ett_rsn_cap_tree,
61262
14
    &ett_rsn_pmkid_tree,
61263
14
    &ett_rsn_gmcs_tree,
61264
61265
14
    &ett_kde_mlo_link_info,
61266
61267
14
    &ett_wpa_mcs_tree,
61268
14
    &ett_wpa_ucs_tree,
61269
14
    &ett_wpa_sub_ucs_tree,
61270
14
    &ett_wpa_akms_tree,
61271
14
    &ett_wpa_sub_akms_tree,
61272
14
    &ett_wme_ac,
61273
14
    &ett_wme_aci_aifsn,
61274
14
    &ett_wme_ecw,
61275
14
    &ett_wme_qos_info,
61276
61277
14
    &ett_update_edca_info,
61278
61279
14
    &ett_ht_cap_tree,
61280
14
    &ett_ampduparam_tree,
61281
14
    &ett_mcsset_tree,
61282
14
    &ett_mcsbit_tree,
61283
14
    &ett_htex_cap_tree,
61284
14
    &ett_txbf_tree,
61285
14
    &ett_antsel_tree,
61286
14
    &ett_hta_cap_tree,
61287
14
    &ett_hta_cap1_tree,
61288
14
    &ett_hta_cap2_tree,
61289
61290
14
    &ett_s1g_ndp,
61291
14
    &ett_s1g_ndp_ack,
61292
14
    &ett_s1g_ndp_cts,
61293
14
    &ett_s1g_ndp_cf_end,
61294
14
    &ett_s1g_ndp_ps_poll,
61295
14
    &ett_s1g_ndp_ps_poll_ack,
61296
14
    &ett_s1g_ndp_block_ack,
61297
14
    &ett_s1g_ndp_beamforming_report_poll,
61298
14
    &ett_s1g_ndp_paging,
61299
14
    &ett_s1g_ndp_probe,
61300
14
    &ett_pv1_sid,
61301
14
    &ett_pv1_sid_field,
61302
14
    &ett_pv1_seq_control,
61303
14
    &ett_ieee80211_s1g_capabilities_info,
61304
14
    &ett_ieee80211_s1g_capabilities,
61305
14
    &ett_s1g_cap_byte1,
61306
14
    &ett_s1g_cap_byte2,
61307
14
    &ett_s1g_cap_byte3,
61308
14
    &ett_s1g_cap_byte4,
61309
14
    &ett_s1g_cap_byte5,
61310
14
    &ett_s1g_cap_byte6,
61311
14
    &ett_s1g_cap_byte7,
61312
14
    &ett_s1g_cap_byte8,
61313
14
    &ett_s1g_cap_byte9,
61314
14
    &ett_s1g_cap_byte10,
61315
14
    &ett_ieee80211_s1g_sup_mcs_and_nss_set,
61316
14
    &ett_s1g_mcs_and_mcs_set,
61317
14
    &ett_s1g_operation_info,
61318
14
    &ett_s1g_channel_width,
61319
14
    &ett_s1g_subchannel_selective_transmission,
61320
14
    &ett_s1g_raw_assignment,
61321
14
    &ett_s1g_raw_assn_tree,
61322
14
    &ett_s1g_raw_control,
61323
14
    &ett_s1g_raw_slot_def,
61324
14
    &ett_s1g_raw_group_subfield,
61325
14
    &ett_s1g_raw_channel_indication,
61326
14
    &ett_s1g_page_slice_control,
61327
14
    &ett_s1g_aid_request_mode,
61328
14
    &ett_s1g_aid_characteristic,
61329
14
    &ett_s1g_sector_operation,
61330
14
    &ett_tack_info,
61331
14
    &ett_ieee80211_s1g_auth_control,
61332
14
    &ett_s1g_relay_control,
61333
14
    &ett_s1g_relay_function,
61334
14
    &ett_ieee80211_s1g_addr_list,
61335
14
    &ett_ieee80211_s1g_reach_addr,
61336
14
    &ett_s1g_relay_discovery_control,
61337
14
    &ett_ieee80211_s1g_aid_entry,
61338
14
    &ett_s1g_probe_resp_subfield_0,
61339
14
    &ett_s1g_header_comp_control,
61340
14
    &ett_pv1_mgmt_action,
61341
14
    &ett_pv1_mgmt_action_no_ack,
61342
14
    &ett_pv1_cntl_stack,
61343
14
    &ett_pv1_cntl_bat,
61344
61345
14
    &ett_htc_tree,
61346
14
    &ett_htc_he_a_control,
61347
14
    &ett_mfb_subtree,
61348
14
    &ett_lac_subtree,
61349
14
    &ett_ieee80211_a_control_padding,
61350
14
    &ett_ieee80211_a_control_ones,
61351
14
    &ett_ieee80211_triggered_response_schedule,
61352
14
    &ett_ieee80211_control_om,
61353
14
    &ett_ieee80211_hla_control,
61354
14
    &ett_ieee80211_buffer_status_report,
61355
14
    &ett_ieee80211_control_uph,
61356
14
    &ett_ieee80211_buffer_control_bqr,
61357
14
    &ett_ieee80211_control_cci,
61358
14
    &ett_ieee80211_control_eht_om,
61359
14
    &ett_ieee80211_control_srs,
61360
14
    &ett_ieee80211_control_aar,
61361
61362
14
    &ett_vht_cap_tree,
61363
14
    &ett_vht_mcsset_tree,
61364
14
    &ett_vht_rx_mcsbit_tree,
61365
14
    &ett_vht_tx_mcsbit_tree,
61366
14
    &ett_vht_basic_mcsbit_tree,
61367
14
    &ett_vht_op_tree,
61368
14
    &ett_vht_tpe_info_tree,
61369
14
    &ett_tpe_psd,
61370
61371
14
    &ett_vht_ranging_annc,
61372
61373
14
    &ett_ff_he_action,
61374
14
    &ett_ff_protected_he_action,
61375
14
    &ett_ff_protected_eht_action,
61376
14
    &ett_ff_he_mimo_control,
61377
14
    &ett_ff_he_mimo_beamforming_report_snr,
61378
14
    &ett_ff_he_mimo_feedback_matrices,
61379
61380
14
    &ett_ff_vhtmimo_cntrl,
61381
14
    &ett_ff_vhtmimo_beamforming_report,
61382
14
    &ett_ff_vhtmimo_beamforming_report_snr,
61383
14
    &ett_ff_vhtmimo_beamforming_angle,
61384
14
    &ett_ff_vhtmimo_beamforming_report_feedback_matrices,
61385
14
    &ett_ff_vhtmu_exclusive_beamforming_report_matrices,
61386
61387
14
    &ett_vht_grpidmgmt,
61388
14
    &ett_vht_msa,
61389
14
    &ett_vht_upa,
61390
61391
14
    &ett_ht_operation_info_delimiter1_tree,
61392
14
    &ett_ht_operation_info_delimiter2_tree,
61393
14
    &ett_ht_operation_info_delimiter3_tree,
61394
61395
14
    &ett_ff_ftm_param_delim1,
61396
14
    &ett_ff_ftm_param_delim2,
61397
14
    &ett_ff_ftm_param_delim3,
61398
14
    &ett_ff_ftm_tod_err1,
61399
14
    &ett_ff_ftm_toa_err1,
61400
14
    &ett_tag_ranging,
61401
14
    &ett_tag_ranging_ntb,
61402
14
    &ett_tag_ranging_secure_he_ltf,
61403
61404
14
    &ett_ranging_subelement_tree,
61405
61406
14
    &ett_tag_direct_meas_results,
61407
61408
14
    &ett_rsta_avail_header,
61409
14
    &ett_rsta_avail_tree,
61410
14
    &ett_rsta_avail_subfield,
61411
61412
14
    &ett_pasn_parameters,
61413
14
    &ett_pasn_comeback_tree,
61414
14
    &ett_pasn_auth_frame,
61415
61416
    /* 802.11be tree */
61417
14
    &ett_eht_multi_link_control,
61418
14
    &ett_eht_multi_link_common_info,
61419
14
    &ett_eht_multi_link_common_info_link_id,
61420
14
    &ett_eht_multi_link_common_info_medium_sync,
61421
14
    &ett_eht_multi_link_common_info_eml_capa,
61422
14
    &ett_eht_multi_link_common_info_mld_capa,
61423
14
    &ett_eht_multi_link_common_info_ext_mld_capa,
61424
14
    &ett_eht_multi_link_per_sta,
61425
14
    &ett_eht_multi_link_subelt,
61426
14
    &ett_eht_multi_link_sta_control,
61427
14
    &ett_eht_multi_link_per_sta_info,
61428
14
    &ett_eht_multi_link_sta_dtim,
61429
14
    &ett_eht_multi_link_reconf_oper_param,
61430
14
    &ett_eht_multi_link_reconfig_presence_indi,
61431
14
    &ett_eht_multi_link_reconfig_operation_para_info,
61432
14
    &ett_eht_operation_params,
61433
14
    &ett_eht_operation_control,
61434
14
    &ett_eht_mac_capa,
61435
14
    &ett_eht_phy_capa,
61436
14
    &ett_eht_phy_bits_0_15,
61437
14
    &ett_eht_phy_bits_16_31,
61438
14
    &ett_eht_phy_bits_32_39,
61439
14
    &ett_eht_phy_bits_40_63,
61440
14
    &ett_eht_phy_bits_64_71,
61441
14
    &ett_eht_phy_mcs_nss,
61442
14
    &ett_eht_phy_mcs_nss_set,
61443
14
    &ett_eht_ttl_mapping,
61444
14
    &ett_eht_ttl_mapping_link_mapping,
61445
14
    &ett_eht_eht_multi_link_tc,
61446
14
    &ett_eht_qos_characteristics,
61447
14
    &ett_eht_aid_bmapctl_tree,
61448
14
    &ett_eht_bw_indication_param,
61449
14
    &ett_eht_eml_control,
61450
14
    &ett_eht_eml_control_link_map,
61451
14
    &ett_eht_eml_control_mcs_map_count,
61452
14
    &ett_eht_emlsr_para_update,
61453
14
    &ett_eht_mimo_ctrl,
61454
14
    &ett_eht_beamforming_rpt_ru_index,
61455
14
    &ett_eht_beamforming_feedback_tree,
61456
14
    &ett_ff_eht_mimo_beamforming_report_snr,
61457
14
    &ett_ff_eht_mimo_mu_exclusive_report,
61458
14
    &ett_eht_mu_exclusive_beamforming_rpt_ru_index,
61459
14
    &ett_eht_reconfig_status_list,
61460
14
    &ett_eht_group_key_data,
61461
61462
14
    &ett_tag_measure_request_mode_tree,
61463
14
    &ett_tag_measure_request_type_tree,
61464
14
    &ett_tag_measure_request_sub_element_tree,
61465
14
    &ett_tag_measure_report_mode_tree,
61466
14
    &ett_tag_measure_report_type_tree,
61467
14
    &ett_tag_measure_report_basic_map_tree,
61468
14
    &ett_tag_measure_report_rpi_tree,
61469
14
    &ett_tag_measure_report_frame_tree,
61470
14
    &ett_tag_measure_report_sub_element_tree,
61471
14
    &ett_tag_measure_reported_frame_tree,
61472
14
    &ett_tag_measure_reported_frame_frag_id_tree,
61473
14
    &ett_tag_measure_reported_lci_z_tree,
61474
14
    &ett_tag_measure_reported_lci_urp_tree,
61475
14
    &ett_tag_bss_bitmask_tree,
61476
14
    &ett_tag_dfs_map_tree,
61477
14
    &ett_tag_dfs_map_flags_tree,
61478
14
    &ett_tag_erp_info_tree,
61479
14
    &ett_tag_ex_cap1,
61480
14
    &ett_tag_ex_cap2,
61481
14
    &ett_tag_ex_cap3,
61482
14
    &ett_tag_ex_cap4,
61483
14
    &ett_tag_ex_cap5,
61484
14
    &ett_tag_ex_cap6,
61485
14
    &ett_tag_ex_cap7,
61486
14
    &ett_tag_ex_cap8,
61487
14
    &ett_tag_ex_cap89,
61488
14
    &ett_tag_ex_cap10,
61489
14
    &ett_tag_ex_cap11,
61490
14
    &ett_tag_ex_cap12,
61491
14
    &ett_tag_ex_cap13,
61492
14
    &ett_tag_ex_cap14,
61493
61494
14
    &ett_tag_rm_cap1,
61495
14
    &ett_tag_rm_cap2,
61496
14
    &ett_tag_rm_cap3,
61497
14
    &ett_tag_rm_cap4,
61498
14
    &ett_tag_rm_cap5,
61499
61500
14
    &ett_tag_rsnx_octet1,
61501
14
    &ett_tag_rsnx_octet2,
61502
61503
14
    &ett_tag_multiple_bssid_subelem_tree,
61504
61505
14
    &ett_tag_20_40_bc,
61506
61507
14
    &ett_tag_intolerant_tree,
61508
61509
14
    &ett_tag_tclas_mask_tree,
61510
61511
14
    &ett_tag_supported_channels,
61512
61513
14
    &ett_tag_neighbor_report_bssid_info_tree,
61514
14
    &ett_tag_neighbor_report_bssid_info_capability_tree,
61515
14
    &ett_tag_neighbor_report_subelement_tree,
61516
14
    &ett_tag_neighbor_report_sub_tag_tree,
61517
61518
14
    &ett_tag_wapi_param_set_akm_tree,
61519
14
    &ett_tag_wapi_param_set_ucast_tree,
61520
14
    &ett_tag_wapi_param_set_mcast_tree,
61521
14
    &ett_tag_wapi_param_set_preauth_tree,
61522
61523
14
    &ett_max_idle_period_options,
61524
61525
14
    &ett_tag_time_adv_tree,
61526
61527
14
    &ett_tag_he_6ghz_cap_inf_tree,
61528
61529
14
    &ett_ff_ba_param_tree,
61530
14
    &ett_ff_ba_ssc_tree,
61531
14
    &ett_ff_delba_param_tree,
61532
14
    &ett_ff_qos_info,
61533
14
    &ett_ff_psmp_param_set,
61534
14
    &ett_ff_mimo_cntrl,
61535
14
    &ett_ff_ant_sel,
61536
14
    &ett_mimo_report,
61537
14
    &ett_ff_sm_pwr_save,
61538
14
    &ett_ff_chan_switch_announce,
61539
14
    &ett_ff_ht_info,
61540
14
    &ett_ff_psmp_sta_info,
61541
61542
14
    &ett_tpc,
61543
61544
14
    &ett_msdu_aggregation_parent_tree,
61545
14
    &ett_msdu_aggregation_subframe_tree,
61546
61547
14
    &ett_80211_mgt_ie,
61548
14
    &ett_tsinfo_tree,
61549
14
    &ett_sched_tree,
61550
61551
14
    &ett_fcs,
61552
61553
14
    &ett_hs20_osu_providers_list,
61554
14
    &ett_hs20_osu_provider_tree,
61555
14
    &ett_hs20_friendly_names_list,
61556
14
    &ett_hs20_friendly_name_tree,
61557
14
    &ett_hs20_osu_provider_method_list,
61558
14
    &ett_osu_icons_avail_list,
61559
14
    &ett_hs20_osu_icon_tree,
61560
14
    &ett_hs20_osu_service_desc_list,
61561
14
    &ett_hs20_osu_service_desc_tree,
61562
14
    &ett_hs20_venue_url,
61563
14
    &ett_hs20_advice_of_charge,
61564
14
    &ett_hs20_aoc_plan,
61565
61566
14
    &ett_hs20_ofn_tree,
61567
61568
14
    &ett_adv_proto,
61569
14
    &ett_adv_proto_tuple,
61570
14
    &ett_gas_query,
61571
14
    &ett_gas_anqp,
61572
14
    &ett_nai_realm,
61573
14
    &ett_nai_realm_eap,
61574
14
    &ett_tag_ric_data_desc_ie,
61575
14
    &ett_anqp_vendor_capab,
61576
61577
14
    &ett_osen_group_data_cipher_suite,
61578
14
    &ett_osen_pairwise_cipher_suites,
61579
14
    &ett_osen_pairwise_cipher_suite,
61580
14
    &ett_osen_akm_cipher_suites,
61581
14
    &ett_osen_akm_cipher_suite,
61582
14
    &ett_osen_rsn_cap_tree,
61583
14
    &ett_osen_pmkid_list,
61584
14
    &ett_osen_pmkid_tree,
61585
14
    &ett_osen_group_management_cipher_suite,
61586
61587
14
    &ett_hs20_cc_proto_port_tuple,
61588
61589
14
    &ett_tag_no_bssid_capability_dmg_bss_control_tree,
61590
14
    &ett_ssid_list,
61591
61592
14
    &ett_sgdsn,
61593
14
    &ett_nintendo,
61594
61595
14
    &ett_routerboard,
61596
61597
14
    &ett_meru,
61598
61599
14
    &ett_wisun_gtkl,
61600
14
    &ett_wisun_lgtkl,
61601
61602
14
    &ett_qos_map_set_exception,
61603
14
    &ett_qos_map_set_range,
61604
61605
14
    &ett_wnm_notif_subelt,
61606
61607
14
    &ett_tag_mobility_domain_ft_capab_tree,
61608
61609
14
    &ett_tag_ft_mic_control_tree,
61610
14
    &ett_tag_ft_subelem_tree,
61611
61612
    /* 802.11ad trees */
61613
14
    &ett_dynamic_alloc_tree,
61614
14
    &ett_ssw_tree,
61615
14
    &ett_bf_tree,
61616
14
    &ett_sswf_tree,
61617
14
    &ett_brp_tree,
61618
14
    &ett_blm_tree,
61619
14
    &ett_bic_tree,
61620
14
    &ett_dmg_params_tree,
61621
14
    &ett_cc_tree,
61622
14
    &ett_rcsi_tree,
61623
14
    &ett_80211_ext,
61624
14
    &ett_allocation_tree,
61625
14
    &ett_sta_info,
61626
61627
14
    &ett_ieee80211_esp,
61628
14
    &ett_ieee80211_wfa_60g_attr,
61629
14
    &ett_ieee80211_wfa_transition_disable_tree,
61630
14
    &ett_gas_resp_fragment,
61631
14
    &ett_gas_resp_fragments,
61632
61633
14
    &ett_mbo_oce_attr,
61634
14
    &ett_mbo_ap_cap,
61635
14
    &ett_oce_cap,
61636
14
    &ett_oce_metrics_cap,
61637
61638
    /* 802.11 ah trees */
61639
14
    &ett_s1g_sync_control_tree,
61640
14
    &ett_s1g_twt_information_control,
61641
14
    &ett_s1g_sector_id_index,
61642
14
    &ett_twt_tear_down_tree,
61643
14
    &ett_twt_control_field_tree,
61644
14
    &ett_twt_req_type_tree,
61645
14
    &ett_twt_ndp_paging_field_tree,
61646
14
    &ett_twt_broadcast_info_tree,
61647
14
    &ett_twt_traffic_info_tree,
61648
14
    &ett_twt_traffic_info_control_tree,
61649
61650
    /* 802.11ax trees */
61651
14
    &ett_he_mac_capabilities,
61652
14
    &ett_he_phy_capabilities,
61653
14
    &ett_he_phy_cap_first_byte,
61654
14
    &ett_he_phy_cap_chan_width_set,
61655
14
    &ett_he_phy_cap_b8_to_b23,
61656
14
    &ett_he_phy_cap_b24_to_b39,
61657
14
    &ett_he_phy_cap_b40_to_b55,
61658
14
    &ett_he_phy_cap_b56_to_b71,
61659
14
    &ett_he_phy_cap_b72_to_b87,
61660
14
    &ett_he_mcs_and_nss_set,
61661
14
    &ett_he_rx_tx_he_mcs_map_lte_80,
61662
14
    &ett_he_rx_mcs_map_lte_80,
61663
14
    &ett_he_tx_mcs_map_lte_80,
61664
14
    &ett_he_rx_tx_he_mcs_map_160,
61665
14
    &ett_he_rx_mcs_map_160,
61666
14
    &ett_he_tx_mcs_map_160,
61667
14
    &ett_he_rx_tx_he_mcs_map_80_80,
61668
14
    &ett_he_rx_mcs_map_80_80,
61669
14
    &ett_he_tx_mcs_map_80_80,
61670
14
    &ett_he_ppe_threshold,
61671
14
    &ett_he_ppe_nss,
61672
14
    &ett_he_ppe_ru_alloc,
61673
14
    &ett_he_operation_params,
61674
14
    &ett_he_bss_color_information,
61675
14
    &ett_he_oper_basic_mcs,
61676
14
    &ett_he_operation_vht_op_info,
61677
14
    &ett_he_operation_6ghz,
61678
14
    &ett_he_operation_6ghz_control,
61679
14
    &ett_he_mu_edca_param,
61680
14
    &ett_he_uora_tree,
61681
14
    &ett_he_aic_aifsn,
61682
14
    &ett_he_spatial_reuse_control,
61683
14
    &ett_he_ess_report_info_field,
61684
14
    &ett_he_bss_new_color_info,
61685
14
    &ett_he_trigger_common_info,
61686
14
    &ett_he_trigger_ranging,
61687
14
    &ett_he_trigger_ranging_poll,
61688
14
    &ett_he_trigger_packet_extension,
61689
14
    &ett_he_trigger_base_common_info,
61690
14
    &ett_he_trigger_bar_ctrl,
61691
14
    &ett_he_trigger_bar_info,
61692
14
    &ett_he_trigger_user_info,
61693
14
    &ett_he_trigger_base_user_info,
61694
14
    &ett_he_trigger_dep_basic_user_info,
61695
14
    &ett_he_trigger_dep_nfrp_user_info,
61696
14
    &ett_ndp_annc,
61697
14
    &ett_ndp_vht_annc_sta_list,
61698
14
    &ett_ndp_vht_annc_sta_info_tree,
61699
14
    &ett_ndp_he_annc_sta_list,
61700
14
    &ett_ndp_he_annc_sta_item,
61701
14
    &ett_ndp_he_annc_sta_info,
61702
14
    &ett_ndp_eht_annc_sta_list,
61703
14
    &ett_ndp_eht_annc_sta_info,
61704
14
    &ett_ndp_ranging_annc_sta_list,
61705
14
    &ett_ndp_ranging_annc_sta_info,
61706
14
    &ett_non_inheritance_element_id_list,
61707
14
    &ett_non_inheritance_element_id_ext_list,
61708
14
    &ett_mscs_user_prio,
61709
14
    &ett_ieee80211_user_prio_bitmap,
61710
14
    &ett_ieee80211_intra_access_prio,
61711
61712
14
    &ett_ieee80211_3gpp_plmn,
61713
61714
    /* 802.11ai trees */
61715
14
    &ett_fils_indication_realm_list,
61716
14
    &ett_fils_indication_public_key_list,
61717
61718
14
    &ett_neighbor_ap_info,
61719
14
    &ett_tbtt_infos,
61720
14
    &ett_rnr_bss_params_tree,
61721
14
    &ett_rnr_mld_params_tree,
61722
61723
14
    &ett_qos_mgmt_dscp_policy_capabilities,
61724
14
    &ett_qos_mgmt_pol_capa,
61725
14
    &ett_qos_mgmt_attributes,
61726
14
    &ett_qos_mgmt_dscp_policy,
61727
14
    &ett_qos_mgmt_tclas,
61728
14
    &ett_qos_mgmt_domain_name,
61729
14
    &ett_qos_mgmt_unknown_attribute,
61730
14
    &ett_dscp_policy_status_list,
61731
14
    &ett_pol_rqst_cont_tree,
61732
14
    &ett_pol_resp_cont_tree,
61733
61734
14
    &ett_ff_fils_discovery_frame_control,
61735
14
    &ett_ff_fils_discovery_capability,
61736
61737
14
    &ett_ff_fils_req_params,
61738
14
    &ett_ff_fils_req_params_fils_criteria,
61739
61740
14
    &ett_nonap_sta_regulatory_conn,
61741
61742
14
    &ett_chan_usage,
61743
14
  };
61744
61745
14
  static ei_register_info ei[] = {
61746
14
    { &ei_ieee80211_bad_length,
61747
14
      { "ieee80211.bad_length", PI_MALFORMED, PI_ERROR,
61748
14
        "Wrong length indicated", EXPFILL }},
61749
61750
14
    { &ei_ieee80211_inv_val,
61751
14
      { "ieee80211.invalid_value", PI_MALFORMED, PI_WARN,
61752
14
        "Invalid value", EXPFILL }},
61753
61754
14
    { &ei_ieee80211_tag_number,
61755
14
      { "wlan.tag.number.unexpected_ie", PI_MALFORMED, PI_ERROR,
61756
14
        "Unexpected Information Element ID", EXPFILL }},
61757
61758
14
    { &ei_ieee80211_tag_length,
61759
14
      { "wlan.tag.length.bad", PI_MALFORMED, PI_ERROR,
61760
14
        "Bad tag length", EXPFILL }},
61761
61762
14
    { &ei_ieee80211_extra_data,
61763
14
      { "ieee80211.extra_data", PI_MALFORMED, PI_WARN,
61764
14
        "Unexpected extra data in the end", EXPFILL }},
61765
61766
14
    { &ei_ieee80211_ff_anqp_capability,
61767
14
      { "wlan.fixed.anqp.capability.invalid", PI_MALFORMED, PI_ERROR,
61768
14
        "Invalid vendor-specific ANQP capability", EXPFILL }},
61769
61770
14
    { &ei_ieee80211_ff_anqp_venue_length,
61771
14
      { "wlan.fixed.anqp.venue.length.invalid", PI_MALFORMED, PI_ERROR,
61772
14
        "Invalid Venue Name Duple length", EXPFILL }},
61773
61774
14
    { &ei_ieee80211_ff_anqp_roaming_consortium_oi_len,
61775
14
      { "wlan.fixed.anqp.roaming_consortium.oi_len.invalid", PI_MALFORMED, PI_ERROR,
61776
14
        "Invalid Roaming Consortium OI", EXPFILL }},
61777
61778
14
    { &ei_ieee80211_ff_anqp_nai_field_len,
61779
14
      { "wlan.fixed.anqp.nai_realm_list.field_len.invalid", PI_MALFORMED, PI_ERROR,
61780
14
        "Invalid NAI Realm List", EXPFILL }},
61781
61782
14
    { &ei_ieee80211_ff_anqp_nai_realm_eap_len,
61783
14
      { "wlan.fixed.anqp_nai_realm_list.eap_method_len.invalid", PI_MALFORMED, PI_ERROR,
61784
14
        "Invalid EAP Method subfield", EXPFILL }},
61785
61786
14
    { &ei_hs20_anqp_ofn_length,
61787
14
      { "wlan.hs20.anqp.ofn.length.invalid", PI_MALFORMED, PI_ERROR,
61788
14
        "Invalid Operator Friendly Name Duple length", EXPFILL }},
61789
61790
14
    { &ei_hs20_anqp_nai_hrq_length,
61791
14
      { "wlan.hs20.anqp.nai_hrq.length.invalid", PI_MALFORMED, PI_ERROR,
61792
14
        "Invalid NAI Home Realm Query length", EXPFILL }},
61793
61794
14
    { &ei_ieee80211_ff_anqp_info_length,
61795
14
      { "wlan.fixed.anqp.info_length.invalid", PI_MALFORMED, PI_ERROR,
61796
14
        "Invalid ANQP Info length", EXPFILL }},
61797
61798
14
    { &ei_ieee80211_not_enough_room_for_anqp_header,
61799
14
      { "wlan.fixed.query_length_invalid", PI_MALFORMED, PI_ERROR,
61800
14
        "Not enough room for ANQP header", EXPFILL }},
61801
61802
14
    { &ei_ieee80211_ff_query_request_length,
61803
14
      { "wlan.fixed.query_request_length.invalid", PI_MALFORMED, PI_ERROR,
61804
14
        "Invalid Query Request Length", EXPFILL }},
61805
61806
14
    { &ei_ieee80211_ff_query_response_length,
61807
14
      { "wlan.fixed.query_response_length.invalid", PI_MALFORMED, PI_ERROR,
61808
14
        "Invalid Query Response Length", EXPFILL }},
61809
61810
14
    { &ei_ieee80211_tag_wnm_sleep_mode_no_key_data,
61811
14
      { "wlan.wnm_sleep_mode.no_key_data", PI_MALFORMED, PI_ERROR,
61812
14
        "WNM-Sleep Mode Response is not long enough to include Key Data", EXPFILL }},
61813
61814
14
    { &ei_ieee80211_tdls_setup_response_malformed,
61815
14
      { "wlan.tdls_setup_response_malformed", PI_MALFORMED, PI_ERROR,
61816
14
        "TDLS Setup Response (success) does not include mandatory fields", EXPFILL }},
61817
61818
14
    { &ei_ieee80211_tdls_setup_confirm_malformed,
61819
14
      { "wlan.tdls_setup_confirm_malformed", PI_MALFORMED, PI_ERROR,
61820
14
        "TDLS Setup Confirm (success) does not include mandatory fields", EXPFILL }},
61821
61822
14
    { &ei_ieee80211_wfa_ie_wme_qos_info_bad_ftype,
61823
14
      { "wlan.wfa.ie.wme.qos_info.bad_ftype", PI_UNDECODED, PI_WARN,
61824
14
        "Could not deduce direction to decode correctly", EXPFILL }},
61825
61826
14
    { &ei_ieee80211_qos_info_bad_ftype,
61827
14
      { "wlan.qos_info.bad_ftype", PI_UNDECODED, PI_WARN,
61828
14
        "Could not deduce direction to decode correctly", EXPFILL }},
61829
61830
14
    { &ei_ieee80211_qos_bad_aifsn,
61831
14
      { "wlan.qos_info.bad_aifsn", PI_MALFORMED, PI_WARN,
61832
14
        "Invalid AIFSN", EXPFILL }},
61833
61834
14
    { &ei_ieee80211_rsn_pcs_count,
61835
14
      { "wlan.rsn.pcs.count.invalid", PI_MALFORMED, PI_ERROR,
61836
14
        "Pairwise Cipher Suite Count too large", EXPFILL }},
61837
61838
14
    { &ei_ieee80211_rsn_pmkid_count,
61839
14
      { "wlan.rsn.akms.count.invalid", PI_MALFORMED, PI_ERROR,
61840
14
        "Auth Key Management (AKM) Suite Count too large", EXPFILL }},
61841
61842
14
    { &ei_ieee80211_pmkid_count_too_large,
61843
14
      { "wlan.rsn.pmkid.count.invalid", PI_MALFORMED, PI_ERROR,
61844
14
        "PMKID Count too large", EXPFILL }},
61845
61846
14
    { &ei_ieee80211_vht_tpe_pwr_info_count,
61847
14
      { "wlan.vht.tpe.pwr_info.count.invalid", PI_MALFORMED, PI_ERROR,
61848
14
        "Max Tx Pwr Count is Incorrect, should be 0-7", EXPFILL }},
61849
61850
14
    { &ei_ieee80211_vht_tpe_pwr_info_unit,
61851
14
      { "wlan.vht.tpe.pwr_info.unit.unknown", PI_UNDECODED, PI_WARN,
61852
14
        "Unknown Max Tx Pwr Unit Interpretation (not interpreted)", EXPFILL }},
61853
61854
14
    { &ei_ieee80211_missing_data,
61855
14
      { "ieee80211.missing_data", PI_MALFORMED, PI_WARN,
61856
14
        "No Request subelements in TFS Request", EXPFILL }},
61857
61858
14
    { &ei_ieee80211_fc_retry,
61859
14
      { "wlan.fc.retry.expert", PI_SEQUENCE, PI_NOTE,
61860
14
        "Retransmission (retry)", EXPFILL }},
61861
61862
14
    { &ei_ieee80211_tag_measure_request_unknown,
61863
14
      { "wlan.measure.req.unknown.expert", PI_UNDECODED, PI_WARN,
61864
14
        "Undecoded Measurement Request type (or subtype), Contact Wireshark developers if you want this supported", EXPFILL }},
61865
61866
14
    { &ei_ieee80211_tag_measure_request_beacon_unknown,
61867
14
      { "wlan.measure.req.beacon.unknown.expert", PI_UNDECODED, PI_WARN,
61868
14
        "Unknown Measure RequestData (not interpreted)", EXPFILL }},
61869
61870
14
    { &ei_ieee80211_tag_measure_report_unknown,
61871
14
      { "wlan.measure.rep.unknown.expert", PI_UNDECODED, PI_WARN,
61872
14
        "Undecoded Measurement Report type (or subtype), Contact Wireshark developers if you want this supported", EXPFILL }},
61873
61874
14
    { &ei_ieee80211_tag_measure_report_beacon_unknown,
61875
14
      { "wlan.measure.rep.beacon.unknown.expert", PI_UNDECODED, PI_WARN,
61876
14
        "Unknown Measure Report Data (not interpreted)", EXPFILL }},
61877
61878
14
    { &ei_ieee80211_tag_measure_report_lci_unknown,
61879
14
      { "wlan.measure.rep.lci.unknown.expert", PI_UNDECODED, PI_WARN,
61880
14
        "Unknown Report LCI Data (not interpreted)", EXPFILL }},
61881
61882
14
    { &ei_ieee80211_tag_data,
61883
14
      { "wlan.tag.data.undecoded", PI_UNDECODED, PI_NOTE,
61884
14
        "Dissector for 802.11 IE Tag code not implemented, Contact Wireshark developers if you want this supported", EXPFILL }},
61885
61886
14
    { &ei_ieee80211_dmg_subtype,
61887
14
      { "wlan.dmg_subtype.bad", PI_MALFORMED, PI_ERROR,
61888
14
        "Bad DMG type/subtype", EXPFILL }},
61889
61890
14
    { &ei_ieee80211_wfa_60g_attr_len_invalid,
61891
14
      { "wlan.60g.attr.length.invalid", PI_MALFORMED, PI_ERROR,
61892
14
        "Attribute length invalid", EXPFILL }},
61893
61894
14
    { &ei_ieee80211_vht_action,
61895
14
      { "wlan.vht.action.undecoded", PI_UNDECODED, PI_NOTE,
61896
14
        "All subtype of VHT Action is not yet supported by Wireshark", EXPFILL }},
61897
61898
14
    { &ei_ieee80211_mesh_peering_unexpected,
61899
14
      { "wlan.peering.unexpected", PI_MALFORMED, PI_ERROR,
61900
14
        "Unexpected Self-protected action", EXPFILL }},
61901
61902
14
    { &ei_ieee80211_wfa_60g_unknown_attribute,
61903
14
      { "wlan.attr.unknown", PI_MALFORMED, PI_ERROR,
61904
14
        "Attribute unknown", EXPFILL }},
61905
61906
14
    { &ei_ieee80211_fcs,
61907
14
      { "wlan.fcs.bad_checksum", PI_MALFORMED, PI_ERROR,
61908
14
        "Bad checksum", EXPFILL }},
61909
61910
14
    { &ei_ieee80211_mismatched_akm_suite,
61911
14
      { "wlan.rsn.akms.mismatched", PI_PROTOCOL, PI_ERROR,
61912
14
        "Mismatched AKMS", EXPFILL }},
61913
61914
14
    { &ei_ieee80211_vs_routerboard_unexpected_len,
61915
14
      { "wlan.vs.routerboard.unexpected_len", PI_PROTOCOL, PI_WARN,
61916
14
        "Unexpected IE Length", EXPFILL }},
61917
61918
14
    { &ei_ieee80211_vs_sgdsn_serialnumber_invalid_len_val,
61919
14
      { "wlan.vs.sgdsn.tag.serialnumber.invalid_len_val", PI_PROTOCOL, PI_ERROR,
61920
14
        "Invalid serial number length value", EXPFILL }},
61921
61922
14
    { &ei_ieee80211_vs_sgdsn_serialnumber_unexpected_len_val,
61923
14
      { "wlan.vs.sgdsn.tag.serialnumber.unexpected_len_val", PI_PROTOCOL, PI_WARN,
61924
14
        "Unexpected serial number length", EXPFILL }},
61925
61926
14
    { &ei_ieee80211_twt_tear_down_bad_neg_type,
61927
14
      { "wlan.twt.tear_down_bad_neg_type", PI_PROTOCOL, PI_ERROR,
61928
14
        "Bad Negotiation type for S1G TWT Flow field in TWT teardown", EXPFILL }},
61929
61930
14
    { &ei_ieee80211_twt_setup_bad_command,
61931
14
      { "wlan.twt.setup_bad_command", PI_PROTOCOL, PI_ERROR,
61932
14
        "This TWT Setup Command is not allowed, check the TWT Request field", EXPFILL }},
61933
61934
14
    { &ei_ieee80211_twt_bcast_info_no_term,
61935
14
      { "wlan.twt.incorrect_length", PI_PROTOCOL, PI_ERROR,
61936
14
        "Incorrect length or missing Last Broadcast Parameter Set field", EXPFILL }},
61937
61938
14
    { &ei_ieee80211_invalid_control_word,
61939
14
      { "wlan.htc.he.a_control.invalid", PI_PROTOCOL, PI_ERROR,
61940
14
        "Invalid control word", EXPFILL }},
61941
61942
14
    { &ei_ieee80211_invalid_control_id,
61943
14
      { "wlan.htc.he.a_control.ctrl_id.invalid", PI_PROTOCOL, PI_ERROR,
61944
14
        "Invalid control id", EXPFILL }},
61945
61946
14
    { &ei_ieee80211_invalid_control_length,
61947
14
      { "wlan.htc.he.a_control.ctrl_length.invalid", PI_PROTOCOL, PI_ERROR,
61948
14
        "Incorrect Control Information Length", EXPFILL }},
61949
61950
14
    { &ei_ieee80211_htc_in_dmg_packet,
61951
14
      { "wlan.htc_in_dmg_packet", PI_PROTOCOL, PI_ERROR,
61952
14
        "DMG frame has the +HTC/Order bit set", EXPFILL }},
61953
61954
14
    { &ei_ieee80211_eht_invalid_subelement,
61955
14
      { "wlan.eht.invalid_subelement", PI_PROTOCOL, PI_ERROR,
61956
14
         "Incorrect EHT Sub-element length", EXPFILL }},
61957
61958
14
    { &ei_ieee80211_eht_invalid_action,
61959
14
      { "wlan.eht.invalid_action", PI_PROTOCOL, PI_ERROR,
61960
14
         "Invalid EHT Action field value", EXPFILL }},
61961
61962
14
    { &ei_ieee80211_eht_invalid_multi_link,
61963
14
      { "wlan.eht.invalid_multi_link", PI_PROTOCOL, PI_ERROR,
61964
14
         "Invalid EHT Multi-Link element", EXPFILL }},
61965
61966
14
     {&ei_ieee80211_eht_invalid_nc_nr,
61967
14
       { "wlan.eht.invalid_nc_nr", PI_PROTOCOL, PI_WARN,
61968
14
         "Invalid NR or NC in EHT MIMO Control", EXPFILL }},
61969
14
  };
61970
61971
14
  expert_module_t *expert_ieee80211;
61972
61973
14
  module_t *wlan_module;
61974
61975
14
  memset(&wlan_stats, 0, sizeof wlan_stats);
61976
61977
14
  proto_aggregate = proto_register_protocol("IEEE 802.11 wireless LAN aggregate frame",
61978
14
      "IEEE 802.11 Aggregate Data", "wlan_aggregate");
61979
14
  proto_register_field_array(proto_aggregate, aggregate_fields, array_length(aggregate_fields));
61980
61981
14
  proto_wlan = proto_register_protocol("IEEE 802.11 wireless LAN", "IEEE 802.11", "wlan");
61982
61983
14
  heur_subdissector_list = register_heur_dissector_list_with_description("wlan_data", "IEEE 802.11 WLAN v0 data", proto_wlan);
61984
61985
  /* Created to remove Decode As confusion */
61986
14
  proto_centrino = proto_register_protocol("IEEE 802.11 wireless LAN (Centrino)", "IEEE 802.11 (Centrino)", "wlan_centrino");
61987
14
  proto_register_field_array(proto_wlan, hf, array_length(hf));
61988
14
  centrino_handle = register_dissector("wlan_centrino",  dissect_ieee80211_centrino, proto_centrino );
61989
61990
14
  proto_wlan_ext = proto_register_protocol("IEEE 802.11 wireless LAN extension frame",
61991
14
      "IEEE 802.11 EXT", "wlan_ext");
61992
61993
14
  proto_register_subtree_array(ett, array_length(ett));
61994
61995
14
  expert_ieee80211 = expert_register_protocol(proto_wlan);
61996
14
  expert_register_field_array(expert_ieee80211, ei, array_length(ei));
61997
61998
  /*
61999
   * Create the hash table we will use for holding STA properties that
62000
   * track newer protocol varients like S1G, DMG, etc. Use the existing
62001
   * retransmit hash and equal functions.
62002
   */
62003
14
  sta_prop_hash = wmem_map_new_autoreset(wmem_epan_scope(), wmem_file_scope(),
62004
14
                                         sta_prop_hash_fn, sta_prop_equal_fn);
62005
62006
14
  ieee80211_handle = register_dissector("wlan", dissect_ieee80211,                    proto_wlan);
62007
14
  register_dissector("wlan_withfcs",            dissect_ieee80211_withfcs,            proto_wlan);
62008
14
  wlan_withoutfcs_handle = register_dissector("wlan_withoutfcs", dissect_ieee80211_withoutfcs, proto_wlan);
62009
14
  register_dissector("wlan_bsfc",               dissect_ieee80211_bsfc,               proto_wlan);
62010
14
  register_dissector("wlan_noqos",              dissect_ieee80211_noqos,              proto_wlan);
62011
62012
14
  register_capture_dissector("ieee80211", capture_ieee80211, proto_wlan);
62013
14
  register_capture_dissector("ieee80211_datapad", capture_ieee80211_datapad, proto_wlan);
62014
62015
14
  reassembly_table_register(&wlan_reassembly_table,
62016
14
                        &addresses_reassembly_table_functions);
62017
14
  register_init_routine(wlan_retransmit_init);
62018
14
  reassembly_table_register(&gas_reassembly_table,
62019
14
                        &addresses_reassembly_table_functions);
62020
62021
14
  wlan_tap = register_tap("wlan");
62022
14
  register_conversation_table(proto_wlan, true, wlan_conversation_packet, wlan_endpoint_packet);
62023
62024
14
  wlan_address_type = address_type_dissector_register("AT_ETHER_WLAN", "WLAN Address", ether_to_str, ether_str_len, NULL, wlan_col_filter_str,
62025
14
                                                            ether_len, ether_name_resolution_str, ether_name_resolution_len);
62026
14
  wlan_bssid_address_type = address_type_dissector_register("AT_ETHER_BSSID", "WLAN BSSID Address", ether_to_str, ether_str_len, NULL, wlan_bssid_col_filter_str,
62027
14
                                                            ether_len, ether_name_resolution_str, ether_name_resolution_len);
62028
14
  set_address(&bssid_broadcast, wlan_bssid_address_type, 6, bssid_broadcast_data);
62029
62030
14
  wlan_ra_ta_address_type = address_type_dissector_register("AT_ETHER_RA_TA", "WLAN RA/TA Address", ether_to_str, ether_str_len, NULL, wlan_ra_ta_col_filter_str,
62031
14
                                                            ether_len, ether_name_resolution_str, ether_name_resolution_len);
62032
62033
14
  wlan_aid_address_type = address_type_dissector_register("AT_WLAN_AID", "WLAN Association ID", wlan_aid_to_str, wlan_aid_str_len, NULL, wlan_aid_col_filter_str, NULL, NULL, NULL);
62034
62035
14
  tagged_field_table = register_dissector_table("wlan.tag.number", "IEEE 802.11 Fields", proto_wlan, FT_UINT8, BASE_DEC);
62036
14
  vendor_specific_action_table = register_dissector_table("wlan.action.vendor_specific", "IEEE802.11 Vendor Specific Action", proto_wlan, FT_UINT24, BASE_HEX);
62037
14
  wifi_alliance_action_subtype_table = register_dissector_table("wlan.action.wifi_alliance.subtype", "Wi-Fi Alliance Action Subtype", proto_wlan, FT_UINT8, BASE_HEX);
62038
14
  vendor_specific_anqp_info_table = register_dissector_table("wlan.anqp.vendor_specific", "IEEE802.11 ANQP information Vendor Specific", proto_wlan, FT_UINT24, BASE_HEX);
62039
14
  wifi_alliance_anqp_info_table = register_dissector_table("wlan.anqp.wifi_alliance.subtype", "Wi-Fi Alliance ANQP Subtype", proto_wlan, FT_UINT8, BASE_HEX);
62040
14
  wifi_alliance_ie_table = register_dissector_table("wlan.ie.wifi_alliance.subtype", "Wi-Fi Alliance IE Subtype", proto_wlan, FT_UINT8, BASE_HEX);
62041
14
  wifi_alliance_public_action_table = register_dissector_table("wlan.pa.wifi_alliance.subtype", "Wi-Fi Alliance PA Subtype", proto_wlan, FT_UINT8, BASE_HEX);
62042
62043
  /* Register configuration options */
62044
14
  wlan_module = prefs_register_protocol(proto_wlan, init_wepkeys);
62045
14
  prefs_register_bool_preference(wlan_module, "defragment",
62046
14
    "Reassemble fragmented 802.11 datagrams",
62047
14
    "Whether fragmented 802.11 datagrams should be reassembled",
62048
14
     &wlan_defragment);
62049
62050
14
  prefs_register_bool_preference(wlan_module, "ignore_draft_ht",
62051
14
    "Ignore vendor-specific HT elements",
62052
14
    "Don't dissect 802.11n draft HT elements (which might contain duplicate information).",
62053
14
    &wlan_ignore_draft_ht);
62054
62055
14
  prefs_register_bool_preference(wlan_module, "retransmitted",
62056
14
    "Call subdissector for retransmitted 802.11 frames",
62057
14
    "Whether retransmitted 802.11 frames should be subdissected",
62058
14
    &wlan_subdissector);
62059
62060
14
  prefs_register_bool_preference(wlan_module, "check_fcs",
62061
14
    "Assume packets have FCS",
62062
14
    "Some 802.11 cards include the FCS at the end of a packet, others do not.",
62063
14
    &wlan_check_fcs);
62064
62065
14
  prefs_register_bool_preference(wlan_module, "check_checksum",
62066
14
    "Validate the FCS checksum if possible",
62067
14
    "Whether to validate the FCS checksum or not.",
62068
14
    &wlan_check_checksum);
62069
62070
14
  prefs_register_enum_preference(wlan_module, "ignore_wep",
62071
14
    "Ignore the Protection bit",
62072
14
    "Some 802.11 cards leave the Protection bit set even though the packet is decrypted, "
62073
14
    "and some also leave the IV (initialization vector).",
62074
14
    &wlan_ignore_prot, wlan_ignore_prot_options, true);
62075
62076
14
  prefs_register_bool_preference(wlan_module, "wpa_key_mic_len_enable",
62077
14
    "Enable WPA Key MIC Length override",
62078
14
    "Whether to enable MIC Length override or not.",
62079
14
    &wlan_key_mic_len_enable);
62080
62081
14
  prefs_register_uint_preference(wlan_module, "wpa_key_mic_len",
62082
14
    "WPA Key MIC Length override",
62083
14
    "Some Key MIC lengths are greater than 16 bytes, so set the length you require",
62084
14
    10, &wlan_key_mic_len);
62085
62086
14
  prefs_register_bool_preference(wlan_module, "treat_as_s1g",
62087
14
    "Treat as S1G", "Treat all WiFi packets as S1G",
62088
14
    &treat_as_s1g);
62089
62090
14
  prefs_register_obsolete_preference(wlan_module, "wep_keys");
62091
62092
14
  prefs_register_bool_preference(wlan_module, "enable_decryption",
62093
14
    "Enable decryption", "Enable WEP and WPA/WPA2 decryption",
62094
14
    &enable_decryption);
62095
62096
14
  wep_uat = uat_new("WEP and WPA Decryption Keys",
62097
14
            sizeof(uat_wep_key_record_t), /* record size */
62098
14
            "80211_keys",                 /* filename */
62099
14
            true,                         /* from_profile */
62100
14
            &uat_wep_key_records,         /* data_ptr */
62101
14
            &num_wepkeys_uat,             /* numitems_ptr */
62102
14
            UAT_AFFECTS_DISSECTION,       /* affects dissection of packets, but not set of named fields */
62103
14
            "Ch80211Keys",                /* help */
62104
14
            uat_wep_key_record_copy_cb,   /* copy callback */
62105
14
            uat_wep_key_record_update_cb, /* update callback */
62106
14
            uat_wep_key_record_free_cb,   /* free callback */
62107
14
            init_wepkeys,                 /* post update callback - update the WEP/WPA keys */
62108
14
            NULL,                         /* reset callback */
62109
14
            wep_uat_flds);                /* UAT field definitions */
62110
62111
14
  prefs_register_uat_preference(wlan_module,
62112
14
                                "wep_key_table",
62113
14
                                "Decryption keys",
62114
14
                                "WEP and pre-shared WPA keys\n"
62115
14
                                "Key examples: 01:02:03:04:05 (40/64-bit WEP),\n"
62116
14
                                "010203040506070809101111213 (104/128-bit WEP),\n"
62117
14
                                "MyPassword[:MyAP] (WPA + plaintext password [+ SSID]),\n"
62118
14
                                "0102030405...6061626364 (WPA + 256-bit key)."
62119
14
                                "Invalid keys will be ignored.",
62120
14
                                wep_uat);
62121
14
}
62122
62123
void
62124
proto_register_wlan_rsna_eapol(void)
62125
14
{
62126
62127
14
  static hf_register_info hf[] = {
62128
14
    {&hf_wlan_rsna_eapol_wpa_keydes_msgnr,
62129
14
     {"Message number", "wlan_rsna_eapol.keydes.msgnr",
62130
14
      FT_UINT8, BASE_DEC, NULL, 0x0,
62131
14
      NULL, HFILL }},
62132
62133
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo,
62134
14
     {"Key Information", "wlan_rsna_eapol.keydes.key_info",
62135
14
      FT_UINT16, BASE_HEX, NULL, 0x0,
62136
14
      NULL, HFILL }},
62137
62138
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version,
62139
14
     {"Key Descriptor Version", "wlan_rsna_eapol.keydes.key_info.keydes_version",
62140
14
      FT_UINT16, BASE_DEC, VALS(keydes_version_vals), KEY_INFO_KEYDES_VERSION_MASK,
62141
14
      NULL, HFILL }},
62142
62143
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type,
62144
14
     {"Key Type", "wlan_rsna_eapol.keydes.key_info.key_type",
62145
14
      FT_BOOLEAN, 16, TFS(&keyinfo_key_type_tfs), KEY_INFO_KEY_TYPE_MASK,
62146
14
      NULL, HFILL }},
62147
62148
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index,
62149
14
     {"Key Index", "wlan_rsna_eapol.keydes.key_info.key_index",
62150
14
      FT_UINT16, BASE_DEC, NULL, KEY_INFO_KEY_INDEX_MASK,
62151
14
      NULL, HFILL }},
62152
62153
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install,
62154
14
     {"Install", "wlan_rsna_eapol.keydes.key_info.install",
62155
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_INSTALL_MASK,
62156
14
      NULL, HFILL }},
62157
62158
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack,
62159
14
     {"Key ACK", "wlan_rsna_eapol.keydes.key_info.key_ack",
62160
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_KEY_ACK_MASK,
62161
14
      NULL, HFILL }},
62162
62163
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic,
62164
14
     {"Key MIC", "wlan_rsna_eapol.keydes.key_info.key_mic",
62165
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_KEY_MIC_MASK,
62166
14
      NULL, HFILL }},
62167
62168
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure,
62169
14
     {"Secure", "wlan_rsna_eapol.keydes.key_info.secure",
62170
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_SECURE_MASK,
62171
14
      NULL, HFILL }},
62172
62173
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error,
62174
14
     {"Error", "wlan_rsna_eapol.keydes.key_info.error",
62175
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_ERROR_MASK,
62176
14
      NULL, HFILL }},
62177
62178
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request,
62179
14
     {"Request", "wlan_rsna_eapol.keydes.key_info.request",
62180
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_REQUEST_MASK,
62181
14
      NULL, HFILL }},
62182
62183
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data,
62184
14
     {"Encrypted Key Data", "wlan_rsna_eapol.keydes.key_info.encrypted_key_data",
62185
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_ENCRYPTED_KEY_DATA_MASK,
62186
14
      NULL, HFILL }},
62187
62188
14
    {&hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message,
62189
14
     {"SMK Message", "wlan_rsna_eapol.keydes.key_info.smk_message",
62190
14
      FT_BOOLEAN, 16, TFS(&tfs_set_notset), KEY_INFO_SMK_MESSAGE_MASK,
62191
14
      NULL, HFILL }},
62192
62193
14
    {&hf_wlan_rsna_eapol_keydes_key_len,
62194
14
     {"Key Length", "eapol.keydes.key_len",
62195
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
62196
14
      NULL, HFILL }},
62197
62198
14
    {&hf_wlan_rsna_eapol_keydes_replay_counter,
62199
14
     {"Replay Counter", "eapol.keydes.replay_counter",
62200
14
      FT_UINT64, BASE_DEC, NULL, 0x0,
62201
14
      NULL, HFILL }},
62202
62203
14
    {&hf_wlan_rsna_eapol_keydes_key_iv,
62204
14
     {"Key IV", "eapol.keydes.key_iv",
62205
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62206
14
      NULL, HFILL }},
62207
62208
14
    {&hf_wlan_rsna_eapol_wpa_keydes_nonce,
62209
14
     {"WPA Key Nonce", "wlan_rsna_eapol.keydes.nonce",
62210
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62211
14
      NULL, HFILL }},
62212
62213
14
    {&hf_wlan_rsna_eapol_wpa_keydes_rsc,
62214
14
     {"WPA Key RSC", "wlan_rsna_eapol.keydes.rsc",
62215
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62216
14
      NULL, HFILL }},
62217
62218
14
    {&hf_wlan_rsna_eapol_wpa_keydes_id,
62219
14
     {"WPA Key ID", "wlan_rsna_eapol.keydes.id",
62220
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62221
14
      NULL, HFILL }},
62222
62223
14
    {&hf_wlan_rsna_eapol_wpa_keydes_mic,
62224
14
     {"WPA Key MIC", "wlan_rsna_eapol.keydes.mic",
62225
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62226
14
      NULL, HFILL }},
62227
62228
14
    {&hf_wlan_rsna_eapol_wpa_keydes_data_len,
62229
14
     {"WPA Key Data Length", "wlan_rsna_eapol.keydes.data_len",
62230
14
      FT_UINT16, BASE_DEC, NULL, 0x0,
62231
14
      NULL, HFILL }},
62232
62233
14
    {&hf_wlan_rsna_eapol_wpa_keydes_data,
62234
14
     {"WPA Key Data", "wlan_rsna_eapol.keydes.data",
62235
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62236
14
      NULL, HFILL }},
62237
62238
14
    {&hf_wlan_rsna_eapol_wpa_keydes_padding,
62239
14
     {"WPA Key Data Padding", "wlan_rsna_eapol.keydes.padding",
62240
14
      FT_BYTES, BASE_NONE, NULL, 0x0,
62241
14
      NULL, HFILL }},
62242
62243
14
    {&hf_wlan_rsna_eapol_wpa_extraneous,
62244
14
     {"WPA EAPOL Extraneous Data", "wlan_rsna_eapol.extraneous",
62245
14
      FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
62246
14
  };
62247
62248
14
  static int *ett[] = {
62249
14
    &ett_keyinfo,
62250
14
    &ett_wlan_rsna_eapol_keydes_data,
62251
14
  };
62252
62253
14
  proto_wlan_rsna_eapol = proto_register_protocol("IEEE 802.11 RSNA EAPOL key",
62254
14
      "802.11 RSNA EAPOL", "wlan_rsna_eapol");
62255
14
  proto_register_field_array(proto_wlan_rsna_eapol, hf, array_length(hf));
62256
62257
14
  proto_register_subtree_array(ett, array_length(ett));
62258
14
}
62259
62260
void
62261
proto_reg_handoff_ieee80211(void)
62262
14
{
62263
14
  dissector_handle_t data_encap_handle;
62264
14
  dissector_handle_t wlan_rsna_eapol_wpa_key_handle, wlan_rsna_eapol_rsn_key_handle;
62265
14
  capture_dissector_handle_t ieee80211_cap_handle;
62266
62267
14
  dissector_add_for_decode_as_with_preference("udp.port", ieee80211_handle);
62268
  /*
62269
   * Get handles for the 802.2 (LPD) LLC, EPD LLC, IPX and Ethernet
62270
   * dissectors.
62271
   */
62272
14
  llc_handle            = find_dissector_add_dependency("llc", proto_wlan);
62273
14
  epd_llc_handle        = find_dissector_add_dependency("epd_llc", proto_wlan);
62274
14
  ipx_handle            = find_dissector_add_dependency("ipx", proto_wlan);
62275
14
  eth_withoutfcs_handle = find_dissector_add_dependency("eth_withoutfcs", proto_wlan);
62276
62277
  /*
62278
   * Get the Ethertype dissector table.
62279
   */
62280
14
  ethertype_subdissector_table = find_dissector_table("ethertype");
62281
62282
14
  llc_cap_handle = find_capture_dissector("llc");
62283
14
  ipx_cap_handle = find_capture_dissector("ipx");
62284
62285
14
  dissector_add_uint("wtap_encap", WTAP_ENCAP_IEEE_802_11, ieee80211_handle);
62286
62287
14
  dissector_add_uint("ethertype", ETHERTYPE_CENTRINO_PROMISC, centrino_handle);
62288
62289
14
  ieee80211_cap_handle = find_capture_dissector("ieee80211");
62290
14
  capture_dissector_add_uint("wtap_encap", WTAP_ENCAP_IEEE_802_11, ieee80211_cap_handle);
62291
14
  capture_dissector_add_uint("wtap_encap", WTAP_ENCAP_IEEE_802_11_WITH_RADIO, ieee80211_cap_handle);
62292
14
  capture_dissector_add_uint("ppi", 105 /* DLT_DLT_IEEE802_11 */, ieee80211_cap_handle);
62293
62294
  /* Register handoff to Aruba GRE */
62295
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8200, wlan_withoutfcs_handle);
62296
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8210, wlan_withoutfcs_handle);
62297
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8220, wlan_withoutfcs_handle);
62298
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8230, wlan_withoutfcs_handle);
62299
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8240, wlan_withoutfcs_handle);
62300
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8250, wlan_withoutfcs_handle);
62301
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8260, wlan_withoutfcs_handle);
62302
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8270, wlan_withoutfcs_handle);
62303
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8280, wlan_withoutfcs_handle);
62304
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8290, wlan_withoutfcs_handle);
62305
14
  dissector_add_uint("gre.proto", GRE_ARUBA_82A0, wlan_withoutfcs_handle);
62306
14
  dissector_add_uint("gre.proto", GRE_ARUBA_82B0, wlan_withoutfcs_handle);
62307
14
  dissector_add_uint("gre.proto", GRE_ARUBA_82C0, wlan_withoutfcs_handle);
62308
14
  dissector_add_uint("gre.proto", GRE_ARUBA_82D0, wlan_withoutfcs_handle);
62309
14
  dissector_add_uint("gre.proto", GRE_ARUBA_82E0, wlan_withoutfcs_handle);
62310
14
  dissector_add_uint("gre.proto", GRE_ARUBA_82F0, wlan_withoutfcs_handle);
62311
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8300, wlan_withoutfcs_handle);
62312
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8310, wlan_withoutfcs_handle);
62313
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8320, wlan_withoutfcs_handle);
62314
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8330, wlan_withoutfcs_handle);
62315
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8340, wlan_withoutfcs_handle);
62316
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8350, wlan_withoutfcs_handle);
62317
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8360, wlan_withoutfcs_handle);
62318
14
  dissector_add_uint("gre.proto", GRE_ARUBA_8370, wlan_withoutfcs_handle);
62319
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9100, wlan_withoutfcs_handle);
62320
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9110, wlan_withoutfcs_handle);
62321
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9120, wlan_withoutfcs_handle);
62322
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9130, wlan_withoutfcs_handle);
62323
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9140, wlan_withoutfcs_handle);
62324
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9150, wlan_withoutfcs_handle);
62325
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9160, wlan_withoutfcs_handle);
62326
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9170, wlan_withoutfcs_handle);
62327
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9180, wlan_withoutfcs_handle);
62328
14
  dissector_add_uint("gre.proto", GRE_ARUBA_9190, wlan_withoutfcs_handle);
62329
14
  dissector_add_uint("gre.proto", GRE_ARUBA_91A0, wlan_withoutfcs_handle);
62330
14
  dissector_add_uint("gre.proto", GRE_ARUBA_91B0, wlan_withoutfcs_handle);
62331
14
  dissector_add_uint("gre.proto", GRE_ARUBA_91C0, wlan_withoutfcs_handle);
62332
14
  dissector_add_uint("gre.proto", GRE_ARUBA_91D0, wlan_withoutfcs_handle);
62333
14
  dissector_add_uint("gre.proto", GRE_ARUBA_91E0, wlan_withoutfcs_handle);
62334
14
  dissector_add_uint("gre.proto", GRE_ARUBA_91F0, wlan_withoutfcs_handle);
62335
62336
14
  data_encap_handle = create_dissector_handle(dissect_data_encap, proto_wlan);
62337
14
  dissector_add_uint("ethertype", ETHERTYPE_IEEE80211_DATA_ENCAP,
62338
14
                data_encap_handle);
62339
62340
  /*
62341
   * EAPOL key descriptor types.
62342
   */
62343
14
  wlan_rsna_eapol_wpa_key_handle = create_dissector_handle(dissect_wlan_rsna_eapol_wpa_or_rsn_key,
62344
14
                                                               proto_wlan_rsna_eapol);
62345
14
  dissector_add_uint("eapol.keydes.type", EAPOL_WPA_KEY, wlan_rsna_eapol_wpa_key_handle);
62346
14
  wlan_rsna_eapol_rsn_key_handle = create_dissector_handle(dissect_wlan_rsna_eapol_wpa_or_rsn_key,
62347
14
                                                               proto_wlan_rsna_eapol);
62348
14
  dissector_add_uint("eapol.keydes.type", EAPOL_RSN_KEY, wlan_rsna_eapol_rsn_key_handle);
62349
62350
14
  dissector_add_uint("sflow_245.header_protocol", SFLOW_5_HEADER_80211_MAC, wlan_withoutfcs_handle);
62351
62352
  /* Tagged fields */
62353
  /* XXX - for now, do it without pinos so the protocol is -1 */
62354
14
  dissector_add_uint("wlan.tag.number", TAG_SSID, create_dissector_handle(ieee80211_tag_ssid, -1));
62355
14
  dissector_add_uint("wlan.tag.number", TAG_SUPP_RATES, create_dissector_handle(ieee80211_tag_supp_rates, -1));
62356
14
  dissector_add_uint("wlan.tag.number", TAG_FH_PARAMETER, create_dissector_handle(ieee80211_tag_fh_parameter, -1));
62357
14
  dissector_add_uint("wlan.tag.number", TAG_DS_PARAMETER, create_dissector_handle(ieee80211_tag_ds_parameter, -1));
62358
14
  dissector_add_uint("wlan.tag.number", TAG_CF_PARAMETER, create_dissector_handle(ieee80211_tag_cf_parameter, -1));
62359
14
  dissector_add_uint("wlan.tag.number", TAG_TIM, create_dissector_handle(ieee80211_tag_tim, -1));
62360
14
  dissector_add_uint("wlan.tag.number", TAG_IBSS_PARAMETER, create_dissector_handle(ieee80211_tag_ibss_parameter, -1));
62361
14
  dissector_add_uint("wlan.tag.number", TAG_COUNTRY_INFO, create_dissector_handle(ieee80211_tag_country_info, -1));
62362
14
  dissector_add_uint("wlan.tag.number", TAG_FH_HOPPING_PARAMETER, create_dissector_handle(ieee80211_tag_fh_hopping_parameter, -1));
62363
14
  dissector_add_uint("wlan.tag.number", TAG_FH_HOPPING_TABLE, create_dissector_handle(ieee80211_tag_fh_hopping_table, -1));
62364
14
  dissector_add_uint("wlan.tag.number", TAG_REQUEST, create_dissector_handle(ieee80211_tag_request, -1));
62365
14
  dissector_add_uint("wlan.tag.number", TAG_QBSS_LOAD, create_dissector_handle(ieee80211_tag_qbss_load, -1));
62366
14
  dissector_add_uint("wlan.tag.number", TAG_EDCA_PARAM_SET, create_dissector_handle(ieee80211_tag_edca_param_set, -1));
62367
14
  dissector_add_uint("wlan.tag.number", TAG_TSPEC, create_dissector_handle(ieee80211_tag_tspec, -1));
62368
14
  dissector_add_uint("wlan.tag.number", TAG_TCLAS, create_dissector_handle(ieee80211_tag_tclas, -1));
62369
14
  dissector_add_uint("wlan.tag.number", TAG_SCHEDULE, create_dissector_handle(ieee80211_tag_schedule, -1));
62370
14
  dissector_add_uint("wlan.tag.number", TAG_CHALLENGE_TEXT, create_dissector_handle(ieee80211_tag_challenge_text, -1));
62371
14
  dissector_add_uint("wlan.tag.number", TAG_POWER_CONSTRAINT, create_dissector_handle(ieee80211_tag_power_constraint, -1));
62372
14
  dissector_add_uint("wlan.tag.number", TAG_POWER_CAPABILITY, create_dissector_handle(ieee80211_tag_power_capability, -1));
62373
14
  dissector_add_uint("wlan.tag.number", TAG_TPC_REQUEST, create_dissector_handle(ieee80211_tag_tpc_request, -1));
62374
14
  dissector_add_uint("wlan.tag.number", TAG_TPC_REPORT, create_dissector_handle(ieee80211_tag_tpc_report, -1));
62375
14
  dissector_add_uint("wlan.tag.number", TAG_SUPPORTED_CHANNELS, create_dissector_handle(ieee80211_tag_supported_channels, -1));
62376
14
  dissector_add_uint("wlan.tag.number", TAG_CHANNEL_SWITCH_ANN, create_dissector_handle(ieee80211_tag_switch_ann, -1));
62377
14
  dissector_add_uint("wlan.tag.number", TAG_MEASURE_REQ, create_dissector_handle(ieee80211_tag_measure_req, -1));
62378
14
  dissector_add_uint("wlan.tag.number", TAG_MEASURE_REP, create_dissector_handle(ieee80211_tag_measure_rep, -1));
62379
14
  dissector_add_uint("wlan.tag.number", TAG_QUIET, create_dissector_handle(ieee80211_tag_quiet, -1));
62380
14
  dissector_add_uint("wlan.tag.number", TAG_IBSS_DFS, create_dissector_handle(ieee80211_tag_ibss_dfs, -1));
62381
14
  dissector_add_uint("wlan.tag.number", TAG_ERP_INFO, create_dissector_handle(ieee80211_tag_erp_info, -1));
62382
14
  dissector_add_uint("wlan.tag.number", TAG_ERP_INFO_OLD, create_dissector_handle(ieee80211_tag_erp_info, -1));
62383
14
  dissector_add_uint("wlan.tag.number", TAG_TS_DELAY, create_dissector_handle(ieee80211_tag_ts_delay, -1));
62384
14
  dissector_add_uint("wlan.tag.number", TAG_TCLAS_PROCESS, create_dissector_handle(ieee80211_tag_tclas_process, -1));
62385
14
  dissector_add_uint("wlan.tag.number", TAG_QOS_CAPABILITY, create_dissector_handle(ieee80211_tag_qos_capability, -1));
62386
14
  dissector_add_uint("wlan.tag.number", TAG_RSN_IE, create_dissector_handle(ieee80211_tag_rsn_ie, -1));
62387
14
  dissector_add_uint("wlan.tag.number", TAG_EXT_SUPP_RATES, create_dissector_handle(ieee80211_tag_ext_supp_rates, -1));
62388
14
  dissector_add_uint("wlan.tag.number", TAG_EXTENDED_CAPABILITIES, create_dissector_handle(dissect_extended_capabilities_ie, -1));
62389
14
  dissector_add_uint("wlan.tag.number", TAG_CISCO_CCX1_CKIP, create_dissector_handle(ieee80211_tag_cisco_ccx1_ckip, -1));
62390
14
  dissector_add_uint("wlan.tag.number", TAG_VHT_CAPABILITY, create_dissector_handle(dissect_vht_capability_ie, -1));
62391
14
  dissector_add_uint("wlan.tag.number", TAG_VHT_OPERATION, create_dissector_handle(dissect_vht_operation_ie, -1));
62392
14
  dissector_add_uint("wlan.tag.number", TAG_EXT_BSS_LOAD, create_dissector_handle(dissect_ext_bss_load, -1));
62393
14
  dissector_add_uint("wlan.tag.number", TAG_WIDE_BW_CHANNEL_SWITCH, create_dissector_handle(dissect_wide_bw_channel_switch, -1));
62394
14
  dissector_add_uint("wlan.tag.number", TAG_TX_PWR_ENVELOPE, create_dissector_handle(dissect_vht_tx_pwr_envelope, -1));
62395
14
  dissector_add_uint("wlan.tag.number", TAG_CHANNEL_SWITCH_WRAPPER, create_dissector_handle(dissect_channel_switch_wrapper, -1));
62396
14
  dissector_add_uint("wlan.tag.number", TAG_OPERATING_MODE_NOTIFICATION, create_dissector_handle(dissect_operating_mode_notification, -1));
62397
14
  dissector_add_uint("wlan.tag.number", TAG_REDUCED_NEIGHBOR_REPORT, create_dissector_handle(dissect_reduced_neighbor_report, -1));
62398
14
  dissector_add_uint("wlan.tag.number", TAG_FINE_TIME_MEASUREMENT_PARAM, create_dissector_handle(dissect_ftm_params, -1));
62399
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_CAPABILITIES, create_dissector_handle(dissect_s1g_capabilities, -1));
62400
14
  dissector_add_uint("wlan.tag.number", TAG_SUBCHANNEL_SELECTIVE_TRANSMISSION, create_dissector_handle(dissect_subchannel_selective_transmission, -1));
62401
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_OPEN_LOOP_LINK_MARGIN_INDEX, create_dissector_handle(dissect_s1g_open_loop_link_margin_index, -1));
62402
14
  dissector_add_uint("wlan.tag.number", TAG_RPS, create_dissector_handle(dissect_rps, -1));
62403
14
  dissector_add_uint("wlan.tag.number", TAG_PAGE_SLICE, create_dissector_handle(dissect_page_slice, -1));
62404
14
  dissector_add_uint("wlan.tag.number", TAG_AID_REQUEST, create_dissector_handle(dissect_aid_request, -1));
62405
14
  dissector_add_uint("wlan.tag.number", TAG_AID_RESPONSE, create_dissector_handle(dissect_aid_response, -1));
62406
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_SECTOR_OPERATION, create_dissector_handle(dissect_s1g_sector_operation, -1));
62407
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_BEACON_COMPATIBILITY, create_dissector_handle(dissect_s1g_beacon_compatibility, -1));
62408
14
  dissector_add_uint("wlan.tag.number", TAG_SHORT_BEACON_INTERVAL, create_dissector_handle(dissect_s1g_short_beacon_interval, -1));
62409
14
  dissector_add_uint("wlan.tag.number", TAG_CHANGE_SEQUENCE, create_dissector_handle(dissect_s1g_change_sequence, -1));
62410
  /* 7.3.2.26 Vendor Specific information element (221) */
62411
14
  dissector_add_uint("wlan.tag.number", TAG_VENDOR_SPECIFIC_IE, create_dissector_handle(ieee80211_tag_vendor_specific_ie, -1));
62412
14
  dissector_add_uint("wlan.tag.number", TAG_AUTHENTICATION_CONTROL, create_dissector_handle(dissect_authentication_control, -1));
62413
14
  dissector_add_uint("wlan.tag.number", TAG_TSF_TIMER_ACCURACY, create_dissector_handle(dissect_tsf_timer_accuracy, -1));
62414
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_RELAY, create_dissector_handle(dissect_s1g_relay, -1));
62415
14
  dissector_add_uint("wlan.tag.number", TAG_REACHABLE_ADDRESS, create_dissector_handle(dissect_reachable_address, -1));
62416
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_RELAY_DISCOVERY, create_dissector_handle(dissect_s1g_relay_discovery, -1));
62417
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_RELAY_ACTIVATION, create_dissector_handle(dissect_s1g_relay_activation, -1));
62418
14
  dissector_add_uint("wlan.tag.number", TAG_AID_ANNOUNCEMENT, create_dissector_handle(dissect_aid_announcement, -1));
62419
14
  dissector_add_uint("wlan.tag.number", TAG_PV1_PROBE_RESPONSE_OPTION, create_dissector_handle(dissect_pv1_probe_response_option, -1));
62420
14
  dissector_add_uint("wlan.tag.number", TAG_EL_OPERATION, create_dissector_handle(dissect_el_operation, -1));
62421
14
  dissector_add_uint("wlan.tag.number", TAG_SECTORIZED_GROUP_ID_LIST, create_dissector_handle(dissect_sectorized_group_id_list, -1));
62422
14
  dissector_add_uint("wlan.tag.number", TAG_S1G_OPERATION, create_dissector_handle(dissect_s1g_operation, -1));
62423
14
  dissector_add_uint("wlan.tag.number", TAG_HEADER_COMPRESSION, create_dissector_handle(dissect_header_compression, -1));
62424
14
  dissector_add_uint("wlan.tag.number", TAG_SST_OPERATION, create_dissector_handle(dissect_sst_operation, -1));
62425
14
  dissector_add_uint("wlan.tag.number", TAG_MAD, create_dissector_handle(dissect_max_away_duration, -1));
62426
  /* This Cisco proprietary IE seems to mimic 221 */
62427
14
  dissector_add_uint("wlan.tag.number", TAG_CISCO_VENDOR_SPECIFIC, create_dissector_handle(ieee80211_tag_vendor_specific_ie, -1));
62428
14
  dissector_add_uint("wlan.tag.number", TAG_SYMBOL_PROPRIETARY, create_dissector_handle(ieee80211_tag_symbol_proprietary_ie, -1));
62429
14
  dissector_add_uint("wlan.tag.number", TAG_MOBILITY_DOMAIN, create_dissector_handle(dissect_mobility_domain, -1));
62430
14
  dissector_add_uint("wlan.tag.number", TAG_FAST_BSS_TRANSITION, create_dissector_handle(dissect_fast_bss_transition, -1));
62431
14
  dissector_add_uint("wlan.tag.number", TAG_MMIE, create_dissector_handle(dissect_mmie, -1));
62432
14
  dissector_add_uint("wlan.tag.number", TAG_NO_BSSID_CAPABILITY, create_dissector_handle(dissect_no_bssid_capability, -1));
62433
14
  dissector_add_uint("wlan.tag.number", TAG_SSID_LIST, create_dissector_handle(dissect_ssid_list, -1));
62434
14
  dissector_add_uint("wlan.tag.number", TAG_MULTIPLE_BSSID_INDEX, create_dissector_handle(dissect_multiple_bssid_index, -1));
62435
14
  dissector_add_uint("wlan.tag.number", TAG_TIME_ZONE, create_dissector_handle(dissect_time_zone, -1));
62436
14
  dissector_add_uint("wlan.tag.number", TAG_TIMEOUT_INTERVAL, create_dissector_handle(dissect_timeout_interval, -1));
62437
14
  dissector_add_uint("wlan.tag.number", TAG_RIC_DATA, create_dissector_handle(dissect_ric_data, -1));
62438
14
  dissector_add_uint("wlan.tag.number", TAG_LINK_IDENTIFIER, create_dissector_handle(dissect_link_identifier, -1));
62439
14
  dissector_add_uint("wlan.tag.number", TAG_WAKEUP_SCHEDULE, create_dissector_handle(dissect_wakeup_schedule, -1));
62440
14
  dissector_add_uint("wlan.tag.number", TAG_CHANNEL_SWITCH_TIMING, create_dissector_handle(dissect_channel_switch_timing, -1));
62441
14
  dissector_add_uint("wlan.tag.number", TAG_PTI_CONTROL, create_dissector_handle(dissect_pti_control, -1));
62442
14
  dissector_add_uint("wlan.tag.number", TAG_PU_BUFFER_STATUS, create_dissector_handle(dissect_pu_buffer_status, -1));
62443
14
  dissector_add_uint("wlan.tag.number", TAG_HT_CAPABILITY, create_dissector_handle(dissect_ht_capability_ie, -1));
62444
14
  dissector_add_uint("wlan.tag.number", TAG_HT_OPERATION, create_dissector_handle(dissect_ht_operation_ie, -1));
62445
14
  dissector_add_uint("wlan.tag.number", TAG_SECONDARY_CHANNEL_OFFSET, create_dissector_handle(dissect_secondary_channel_offset_ie, -1));
62446
14
  dissector_add_uint("wlan.tag.number", TAG_RCPI, create_dissector_handle(dissect_rcpi_ie, -1));
62447
14
  dissector_add_uint("wlan.tag.number", TAG_BSS_AVG_ACCESS_DELAY, create_dissector_handle(dissect_bss_avg_access_delay_ie, -1));
62448
14
  dissector_add_uint("wlan.tag.number", TAG_ANTENNA, create_dissector_handle(dissect_antenna_ie, -1));
62449
14
  dissector_add_uint("wlan.tag.number", TAG_RSNI, create_dissector_handle(dissect_rsni_ie, -1));
62450
14
  dissector_add_uint("wlan.tag.number", TAG_MEASURE_PILOT_TRANS, create_dissector_handle(dissect_measurement_pilot_trans_ie, -1));
62451
14
  dissector_add_uint("wlan.tag.number", TAG_BSS_AVB_ADM_CAPACITY, create_dissector_handle(dissect_bss_available_admission_capacity_ie, -1));
62452
14
  dissector_add_uint("wlan.tag.number", TAG_IE_68_CONFLICT, create_dissector_handle(ieee80211_tag_ie_68_conflict, -1));
62453
14
  dissector_add_uint("wlan.tag.number", TAG_BSS_MAX_IDLE_PERIOD, create_dissector_handle(dissect_bss_max_idle_period, -1));
62454
14
  dissector_add_uint("wlan.tag.number", TAG_TFS_REQUEST, create_dissector_handle(dissect_tfs_request, -1));
62455
14
  dissector_add_uint("wlan.tag.number", TAG_TFS_RESPONSE, create_dissector_handle(dissect_tfs_response, -1));
62456
14
  dissector_add_uint("wlan.tag.number", TAG_WNM_SLEEP_MODE, create_dissector_handle(dissect_wnm_sleep_mode, -1));
62457
14
  dissector_add_uint("wlan.tag.number", TAG_TIME_ADV, create_dissector_handle(dissect_time_adv, -1));
62458
14
  dissector_add_uint("wlan.tag.number", TAG_RM_ENABLED_CAPABILITY, create_dissector_handle(dissect_rm_enabled_capabilities_ie, -1));
62459
14
  dissector_add_uint("wlan.tag.number", TAG_MULTIPLE_BSSID, create_dissector_handle(dissect_multiple_bssid_ie, -1));
62460
14
  dissector_add_uint("wlan.tag.number", TAG_20_40_BSS_CO_EX, create_dissector_handle(dissect_20_40_bss_coexistence, -1));
62461
14
  dissector_add_uint("wlan.tag.number", TAG_20_40_BSS_INTOL_CH_REP, create_dissector_handle(dissect_20_40_bss_intolerant, -1));
62462
14
  dissector_add_uint("wlan.tag.number", TAG_OVERLAP_BSS_SCAN_PAR, create_dissector_handle(dissect_overlap_bss_scan_par, -1));
62463
14
  dissector_add_uint("wlan.tag.number", TAG_RIC_DESCRIPTOR, create_dissector_handle(dissect_ric_descriptor, -1));
62464
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_PEERING_MGMT, create_dissector_handle(ieee80211_tag_mesh_peering_mgmt, -1));
62465
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_CONFIGURATION, create_dissector_handle(ieee80211_tag_mesh_configuration, -1));
62466
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_ID, create_dissector_handle(ieee80211_tag_mesh_id, -1));
62467
14
  dissector_add_uint("wlan.tag.number", TAG_BEACON_TIMING, create_dissector_handle(ieee80211_tag_beacon_timing, -1));
62468
14
  dissector_add_uint("wlan.tag.number", TAG_GANN, create_dissector_handle(ieee80211_tag_gann, -1));
62469
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_PREQ, create_dissector_handle(ieee80211_tag_mesh_preq, -1));
62470
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_PREP, create_dissector_handle(ieee80211_tag_mesh_prep, -1));
62471
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_PERR, create_dissector_handle(ieee80211_tag_mesh_perr, -1));
62472
14
  dissector_add_uint("wlan.tag.number", TAG_PXU, create_dissector_handle(ieee80211_tag_pxu, -1));
62473
14
  dissector_add_uint("wlan.tag.number", TAG_PXUC, create_dissector_handle(ieee80211_tag_pxuc, -1));
62474
14
  dissector_add_uint("wlan.tag.number", TAG_MIC, create_dissector_handle(ieee80211_tag_mic, -1));
62475
14
  dissector_add_uint("wlan.tag.number", TAG_RANN, create_dissector_handle(ieee80211_tag_rann, -1));
62476
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_CHANNEL_SWITCH, create_dissector_handle(ieee80211_tag_mesh_channel_switch, -1));
62477
14
  dissector_add_uint("wlan.tag.number", TAG_INTERWORKING, create_dissector_handle(dissect_interworking, -1));
62478
14
  dissector_add_uint("wlan.tag.number", TAG_ADVERTISEMENT_PROTOCOL, create_dissector_handle(dissect_advertisement_protocol, -1));
62479
14
  dissector_add_uint("wlan.tag.number", TAG_QOS_MAP_SET, create_dissector_handle(dissect_qos_map_set, -1));
62480
14
  dissector_add_uint("wlan.tag.number", TAG_ROAMING_CONSORTIUM, create_dissector_handle(dissect_roaming_consortium, -1));
62481
14
  dissector_add_uint("wlan.tag.number", TAG_AP_CHANNEL_REPORT, create_dissector_handle(dissect_ap_channel_report, -1));
62482
14
  dissector_add_uint("wlan.tag.number", TAG_NEIGHBOR_REPORT, create_dissector_handle(dissect_neighbor_report, -1));
62483
14
  dissector_add_uint("wlan.tag.number", TAG_MESH_AWAKE_WINDOW, create_dissector_handle(ieee80211_tag_mesh_awake_window, -1));
62484
14
  dissector_add_uint("wlan.tag.number", TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT, create_dissector_handle(ieee80211_tag_channel_switch_announcement, -1));
62485
14
  dissector_add_uint("wlan.tag.number", TAG_SUPPORTED_OPERATING_CLASSES, create_dissector_handle(ieee80211_tag_supported_operating_classes, -1));
62486
14
  dissector_add_uint("wlan.tag.number", TAG_RELAY_CAPABILITIES, create_dissector_handle(add_tag_relay_capabilities, -1));
62487
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_BSS_PARAMETER_CHANGE, create_dissector_handle(ieee80211_tag_bss_parameter_change, -1));
62488
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_CAPABILITIES, create_dissector_handle(ieee80211_tag_dmg_capabilities, -1));
62489
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_OPERATION, create_dissector_handle(ieee80211_tag_dmg_operation, -1));
62490
14
  dissector_add_uint("wlan.tag.number", TAG_ANTENNA_SECTOR_ID, create_dissector_handle(ieee80211_tag_antenna_section_id, -1));
62491
14
  dissector_add_uint("wlan.tag.number", TAG_EXTENDED_SCHEDULE, create_dissector_handle(ieee80211_tag_extended_schedule, -1));
62492
14
  dissector_add_uint("wlan.tag.number", TAG_STA_AVAILABILITY, create_dissector_handle(ieee80211_tag_sta_availability, -1));
62493
14
  dissector_add_uint("wlan.tag.number", TAG_NEXT_DMG_ATI, create_dissector_handle(ieee80211_tag_next_dmg_ati, -1));
62494
14
  dissector_add_uint("wlan.tag.number", TAG_NEXTPCP_LIST, create_dissector_handle(ieee80211_tag_nextpcp_list, -1));
62495
14
  dissector_add_uint("wlan.tag.number", TAG_PCP_HANDOVER, create_dissector_handle(ieee80211_tag_pcp_handover, -1));
62496
14
  dissector_add_uint("wlan.tag.number", TAG_BEAMLINK_MAINTENANCE, create_dissector_handle(ieee80211_tag_beamlink_maintenance, -1));
62497
14
  dissector_add_uint("wlan.tag.number", TAG_QUIET_PERIOD_RES, create_dissector_handle(ieee80211_tag_quiet_period_res, -1));
62498
14
  dissector_add_uint("wlan.tag.number", TAG_INTRA_ACCESS_CAT_PRIO, create_dissector_handle(ieee80211_tag_intra_access_cat_prio, -1));
62499
14
  dissector_add_uint("wlan.tag.number", TAG_SCS_DESCRIPTOR, create_dissector_handle(ieee80211_tag_scs_descriptor, -1));
62500
14
  dissector_add_uint("wlan.tag.number", TAG_RELAY_TRANSFER_PARAM, create_dissector_handle(ieee80211_tag_relay_transfer_param, -1));
62501
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_BEAM_REFINEMENT, create_dissector_handle(ieee80211_tag_dmg_beam_refinement, -1));
62502
14
  dissector_add_uint("wlan.tag.number", TAG_WAKEUP_SCHEDULE_AD, create_dissector_handle(ieee80211_tag_wakeup_schedule_ad, -1));
62503
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_TSPEC, create_dissector_handle(ieee80211_tag_dmg_tspec, -1));
62504
14
  dissector_add_uint("wlan.tag.number", TAG_CHANNEL_MEASURMENT_FB, create_dissector_handle(ieee80211_tag_channel_measurement_fb, -1));
62505
14
  dissector_add_uint("wlan.tag.number", TAG_AWAKE_WINDOW, create_dissector_handle(ieee80211_tag_awake_window, -1));
62506
14
  dissector_add_uint("wlan.tag.number", TAG_ADDBA_EXT, create_dissector_handle(ieee80211_tag_addba_ext, -1));
62507
14
  dissector_add_uint("wlan.tag.number", TAG_MULTI_BAND, create_dissector_handle(ieee80211_tag_multi_band, -1));
62508
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_LINK_MARGIN, create_dissector_handle(ieee80211_tag_dmg_link_margin, -1));
62509
14
  dissector_add_uint("wlan.tag.number", TAG_DMG_LINK_ADAPTION_ACK, create_dissector_handle(ieee80211_tag_dmg_link_adaption_ack, -1));
62510
14
  dissector_add_uint("wlan.tag.number", TAG_FILS_INDICATION, create_dissector_handle(ieee80211_tag_fils_indication, -1));
62511
14
  dissector_add_uint("wlan.tag.number", TAG_SWITCHING_STREAM, create_dissector_handle(ieee80211_tag_switching_stream, -1));
62512
14
  dissector_add_uint("wlan.tag.number", TAG_ELEMENT_ID_EXTENSION, create_dissector_handle(ieee80211_tag_element_id_extension, -1));
62513
14
  dissector_add_uint("wlan.tag.number", TAG_TWT, create_dissector_handle(ieee80211_tag_twt, -1));
62514
14
  dissector_add_uint("wlan.tag.number", TAG_RSNX, create_dissector_handle(ieee80211_tag_rsnx, -1));
62515
14
  dissector_add_uint("wlan.tag.number", TAG_CHANNEL_USAGE, create_dissector_handle(ieee80211_tag_channel_usage, -1));
62516
62517
  /* Vendor specific actions */
62518
14
  dissector_add_uint("wlan.action.vendor_specific", OUI_MARVELL, create_dissector_handle(dissect_vendor_action_marvell, -1));
62519
14
  dissector_add_uint("wlan.action.vendor_specific", OUI_WFA, create_dissector_handle(dissect_vendor_action_wifi_alliance, -1));
62520
62521
  /* Protected action WFA ... */
62522
14
  dissector_add_uint("wlan.action.wifi_alliance.subtype", WFA_SUBTYPE_ACTION_QOS_MGMT, create_dissector_handle(dissect_vendor_action_wfa_qos_mgmt, -1));
62523
62524
14
  dissector_add_uint("wlan.anqp.vendor_specific", OUI_WFA, create_dissector_handle(dissect_vendor_wifi_alliance_anqp, -1));
62525
14
  dissector_add_uint("wlan.anqp.wifi_alliance.subtype", WFA_ANQP_SUBTYPE_HS20, create_dissector_handle(dissect_hs20_anqp, -1));
62526
14
  dissector_add_uint("wlan.anqp.wifi_alliance.subtype", WFA_ANQP_SUBTYPE_MBO, create_dissector_handle(dissect_mbo_anqp, -1));
62527
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_SUBSCRIPTION_REMEDIATION, create_dissector_handle(dissect_hs20_subscription_remediation, -1));
62528
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_DEAUTHENTICATION_IMMINENT, create_dissector_handle(dissect_hs20_deauthentication_imminent, -1));
62529
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_HS20_INDICATION, create_dissector_handle(dissect_hs20_indication, -1));
62530
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_OSEN, create_dissector_handle(dissect_hs20_osen, -1));
62531
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_OWE_TRANSITION_MODE, create_dissector_handle(dissect_owe_transition_mode, -1));
62532
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_TRANSITION_DISABLE_KDE, create_dissector_handle(dissect_transition_disable_kde, -1));
62533
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_WIFI_60G, create_dissector_handle(dissect_wfa_60g_ie, -1));
62534
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_MBO_OCE, create_dissector_handle(dissect_mbo_oce, -1));
62535
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_WNM_SUBTYPE_NON_PREF_CHAN_REPORT, create_dissector_handle(dissect_wfa_wnm_non_pref_chan, -1));
62536
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_WNM_SUBTYPE_CELL_DATA_CAPABILITIES, create_dissector_handle(dissect_wfa_wnm_cell_cap, -1));
62537
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_QOS_MGMT, create_dissector_handle(dissect_qos_mgmt, -1));
62538
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_RSN_OVERRIDE, create_dissector_handle(dissect_wfa_rsn_override, -1));
62539
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_RSN_OVERRIDE_2, create_dissector_handle(dissect_wfa_rsn_override_2, -1));
62540
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_RSNX_OVERRIDE, create_dissector_handle(dissect_wfa_rsnx_override, -1));
62541
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_RSN_SELECTION, create_dissector_handle(dissect_wfa_rsn_selection, -1));
62542
14
  dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_RSN_OVERRIDE_LINK_KDE, create_dissector_handle(dissect_wfa_rsn_override_link_kde, -1));
62543
14
}
62544
62545
/*
62546
 * Editor modelines
62547
 *
62548
 * Local Variables:
62549
 * c-basic-offset: 2
62550
 * tab-width: 8
62551
 * indent-tabs-mode: nil
62552
 * End:
62553
 *
62554
 * ex: set shiftwidth=2 tabstop=8 expandtab:
62555
 * :indentSize=2:tabSize=8:noTabs=true:
62556
 */