2854f5f5f21f21ac1ff56873fd8a285fac10510c
[obnox/wireshark/wip.git] / epan / dissectors / packet-ieee80211.c
1 /* packet-ieee80211.c
2  * Routines for Wireless LAN (IEEE 802.11) dissection
3  * Copyright 2000, Axis Communications AB
4  * Inquiries/bugreports should be sent to Johan.Jorgensen@axis.com
5  *
6  * $Id$
7  *
8  * Wireshark - Network traffic analyzer
9  * By Gerald Combs <gerald@wireshark.org>
10  * Copyright 1998 Gerald Combs
11  *
12  * Copied from README.developer
13  *
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27  *
28  * Credits:
29  *
30  * The following people helped me by pointing out bugs etc. Thank you!
31  *
32  * Marco Molteni
33  * Lena-Marie Nilsson
34  * Magnus Hultman-Persson
35  */
36
37 /*
38  * 09/12/2003 - Added dissection of country information tag
39  *
40  * Ritchie<at>tipsybottle.com
41  *
42  * 03/22/2004 - Added dissection of RSN IE
43  * Jouni Malinen <jkmaline@cc.hut.fi>
44  *
45  * 10/24/2005 - Add dissection for 802.11e
46  * Zhu Yi <yi.zhu@intel.com>
47  *
48  * Dutin Johnson - 802.11n and portions of 802.11k and 802.11ma
49  * dustin@dustinj.us & dustin.johnson@cacetech.com
50  *
51  * 01/31/2008 - Added dissection of 802.11s
52  * Javier Cardona <javier@cozybit.com>
53  *
54  * 04/21/2008 - Added dissection for 802.11p
55  * Arada Systems <http://www.aradasystems.com>
56  *
57  * 05/29/2011 - UATification of decryption keys
58  * Michael Mann <mmann78@netscape.net>
59  *
60  * Enhance 802.11 dissector by Alexis La Goutte
61  */
62
63 /*
64  * Reference :
65  * The 802.11 standard is "free", 6 month after the publication.
66  *
67  * IEEE Std 802.11-2007: Revision of IEEE Std 802.11-199
68  * include 8 amendments (802.11a,b,d,e,g,h,i,j)
69  * http://standards.ieee.org/getieee802/download/802.11-2007.pdf
70  *
71  * IEEE Std 802.11k-2008: Radio Resource Measurement of Wireless LANs
72  * http://standards.ieee.org/getieee802/download/802.11k-2008.pdf
73  *
74  * IEEE Std 802.11r-2008: Fast Basic Service Set (BSS) Transition
75  * http://standards.ieee.org/getieee802/download/802.11r-2008.pdf
76  *
77  * IEEE Std 802.11y-2008: 3650-3700 MHz Operation in USA
78  * http://standards.ieee.org/getieee802/download/802.11y-2008.pdf
79  *
80  * IEEE Std 802.11w-2009: Protected Management Frames
81  * http://standards.ieee.org/getieee802/download/802.11w-2009.pdf
82  *
83  * IEEE Std 802.11n-2009: Enhancements for Higher Throughput
84  * http://standards.ieee.org/getieee802/download/802.11n-2009.pdf
85  *
86  * IEEE Std 802.11p-2010: Wireless Access in Vehicular Environments
87  * http://standards.ieee.org/getieee802/download/802.11p-2010.pdf
88  *
89  * IEEE Std 802.11z-2010: Extensions to Direct-Link Setup (DLS)
90  * http://standards.ieee.org/getieee802/download/802.11z-2010.pdf
91  */
92
93
94 #ifdef HAVE_CONFIG_H
95 # include "config.h"
96 #endif
97
98 #include <stdlib.h>
99 #include <string.h>
100 #include <math.h>
101
102 #include <glib.h>
103
104 #include <epan/packet.h>
105 #include <epan/bitswap.h>
106 #include <epan/addr_resolv.h>
107 #include <epan/strutil.h>
108 #include <epan/prefs.h>
109 #include <epan/reassemble.h>
110 #include "packet-ipx.h"
111 #include "packet-llc.h"
112 #include "packet-ieee80211.h"
113 #include <epan/etypes.h>
114 #include <epan/greproto.h>
115 #include <epan/oui.h>
116 #include <epan/crc32.h>
117 #include <epan/tap.h>
118 #include <epan/emem.h>
119 #include <epan/crypt/wep-wpadefs.h>
120 #include <epan/expert.h>
121 #include <epan/uat.h>
122
123 #include "packet-wps.h"
124 #include "packet-wifi-p2p.h"
125
126 /*     Davide Schiera (2006-11-22): including AirPDcap project                */
127 #include <epan/crypt/airpdcap_ws.h>
128 /* Davide Schiera (2006-11-22) ---------------------------------------------- */
129
130 #ifndef roundup2
131 #define roundup2(x, y)  (((x)+((y)-1))&(~((y)-1)))  /* if y is powers of two */
132 #endif
133
134 /* Defragment fragmented 802.11 datagrams */
135 static gboolean wlan_defragment = TRUE;
136
137 /* call subdissector for retransmitted frames */
138 static gboolean wlan_subdissector = TRUE;
139
140 /* Check for the presence of the 802.11 FCS */
141 static gboolean wlan_check_fcs = FALSE;
142
143 /* Ignore vendor-specific HT elements */
144 static gboolean wlan_ignore_draft_ht = FALSE;
145
146 /* Ignore the WEP bit; assume packet is decrypted */
147 #define WLAN_IGNORE_WEP_NO     0
148 #define WLAN_IGNORE_WEP_WO_IV  1
149 #define WLAN_IGNORE_WEP_W_IV   2
150 static gint wlan_ignore_wep = WLAN_IGNORE_WEP_NO;
151
152 /* Tables for reassembly of fragments. */
153 static GHashTable *wlan_fragment_table = NULL;
154 static GHashTable *wlan_reassembled_table = NULL;
155
156 /* Statistical data */
157 static struct _wlan_stats wlan_stats;
158
159 /*-------------------------------------
160  * UAT for WEP decoder
161  *-------------------------------------
162  */
163 /* UAT entry structure. */
164 typedef struct {
165     guint8    key;
166     gchar    *string;
167 } uat_wep_key_record_t;
168
169 static uat_wep_key_record_t *uat_wep_key_records = NULL;
170 static uat_t * wep_uat = NULL;
171 static guint num_wepkeys_uat = 0;
172
173 static void* uat_wep_key_record_copy_cb(void* n, const void* o, size_t siz _U_) {
174     uat_wep_key_record_t* new_key = (uat_wep_key_record_t *)n;
175     const uat_wep_key_record_t* old_key = (uat_wep_key_record_t *)o;
176
177     if (old_key->string) {
178         new_key->string = g_strdup(old_key->string);
179     } else {
180         new_key->string = NULL;
181     }
182
183     return new_key;
184 }
185
186 static void uat_wep_key_record_update_cb(void* r, const char** err) {
187     uat_wep_key_record_t* rec = (uat_wep_key_record_t *)r;
188     decryption_key_t* dk;
189
190     if (rec->string == NULL) {
191          *err = ep_strdup_printf("Key can't be blank");
192     } else {
193         g_strstrip(rec->string);
194         dk = parse_key_string(rec->string, rec->key);
195
196         if(dk != NULL) {
197            switch(dk->type) {
198               case AIRPDCAP_KEY_TYPE_WEP:
199               case AIRPDCAP_KEY_TYPE_WEP_40:
200               case AIRPDCAP_KEY_TYPE_WEP_104:
201                  if (rec->key != AIRPDCAP_KEY_TYPE_WEP) {
202                     *err = ep_strdup_printf("Invalid key format");
203                  }
204                  break;
205               case AIRPDCAP_KEY_TYPE_WPA_PWD:
206                  if (rec->key != AIRPDCAP_KEY_TYPE_WPA_PWD) {
207                     *err = ep_strdup_printf("Invalid key format");
208                  }
209                  break;
210               case AIRPDCAP_KEY_TYPE_WPA_PSK:
211                  if (rec->key != AIRPDCAP_KEY_TYPE_WPA_PSK) {
212                     *err = ep_strdup_printf("Invalid key format");
213                  }
214                  break;
215               default:
216                  *err = ep_strdup_printf("Invalid key format");
217                  break;
218            }
219         } else {
220            *err = ep_strdup_printf("Invalid key format");
221         }
222     }
223 }
224
225 static void uat_wep_key_record_free_cb(void*r) {
226     uat_wep_key_record_t* key = (uat_wep_key_record_t *)r;
227
228     if (key->string) g_free(key->string);
229 }
230
231 UAT_VS_DEF(uat_wep_key_records, key, uat_wep_key_record_t, 0, STRING_KEY_TYPE_WEP)
232 UAT_CSTRING_CB_DEF(uat_wep_key_records, string, uat_wep_key_record_t)
233
234 /* Stuff for the WEP decoder */
235 static gboolean enable_decryption = FALSE;
236 static void init_wepkeys(void);
237
238 /* Davide Schiera (2006-11-26): created function to decrypt WEP and WPA/WPA2  */
239 static tvbuff_t *try_decrypt(tvbuff_t *tvb, guint32 offset, guint32 len, guint8 *algorithm, guint32 *sec_header, guint32 *sec_trailer);
240
241 static int weak_iv(guchar *iv);
242 #define SSWAP(a,b) {guint8 tmp = s[a]; s[a] = s[b]; s[b] = tmp;}
243
244 typedef struct mimo_control
245   {
246     guint8 nc;
247     guint8 nr;
248     gboolean chan_width;
249     guint8 grouping;
250     guint8 coefficient_size;
251     guint8 codebook_info;
252     guint8 remaining_matrix_segment;
253   } mimo_control_t;
254
255 mimo_control_t get_mimo_control (tvbuff_t *tvb, int offset);
256 int add_mimo_csi_matrices_report (proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl);
257 int add_mimo_beamforming_feedback_report (proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl);
258 int add_mimo_compressed_beamforming_feedback_report (proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl);
259
260 /* ************************************************************************* */
261 /*                          Miscellaneous Constants                          */
262 /* ************************************************************************* */
263 #define SHORT_STR 256
264
265 /* ************************************************************************* */
266 /*  Define some very useful macros that are used to analyze frame types etc. */
267 /* ************************************************************************* */
268
269 /*
270  * Fetch the frame control field and swap it if needed.  "fcf" and "tvb"
271  * must be valid variables.
272  */
273 #define FETCH_FCF(off) (wlan_broken_fc ? \
274   BSWAP16(tvb_get_letohs(tvb, off)) : \
275   tvb_get_letohs(tvb, off))
276
277 /*
278  * Extract the protocol version from the frame control field
279  */
280 #define FCF_PROT_VERSION(x)  ((x) & 0x3)
281
282 /*
283  * Extract the frame type from the frame control field.
284  */
285 #define FCF_FRAME_TYPE(x)    (((x) & 0xC) >> 2)
286
287 /*
288  * Extract the frame subtype from the frame control field.
289  */
290 #define FCF_FRAME_SUBTYPE(x) (((x) & 0xF0) >> 4)
291
292 /*
293  * Convert the frame type and subtype from the frame control field into
294  * one of the MGT_, CTRL_, or DATA_ values.
295  */
296 #define COMPOSE_FRAME_TYPE(x) (((x & 0x0C)<< 2)+FCF_FRAME_SUBTYPE(x))  /* Create key to (sub)type */
297
298 /*
299  * The subtype field of a data frame is, in effect, composed of 4 flag
300  * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have
301  * any data), and QoS.
302  */
303 #define DATA_FRAME_IS_CF_ACK(x)  ((x) & 0x01)
304 #define DATA_FRAME_IS_CF_POLL(x) ((x) & 0x02)
305 #define DATA_FRAME_IS_NULL(x)    ((x) & 0x04)
306 #define DATA_FRAME_IS_QOS(x)     ((x) & 0x08)
307
308 /*
309  * Extract the flags from the frame control field.
310  */
311 #define FCF_FLAGS(x)           (((x) & 0xFF00) >> 8)
312
313 /*
314  * Bits from the flags field.
315  */
316 #define FLAG_TO_DS            0x01
317 #define FLAG_FROM_DS          0x02
318 #define FLAG_MORE_FRAGMENTS   0x04
319 #define FLAG_RETRY            0x08
320 #define FLAG_POWER_MGT        0x10
321 #define FLAG_MORE_DATA        0x20
322 #define FLAG_PROTECTED        0x40
323 #define FLAG_ORDER            0x80
324
325 /*
326  * Test bits in the flags field.
327  */
328 /*
329  * XXX - Only HAVE_FRAGMENTS, IS_PROTECTED, and IS_STRICTLY_ORDERED
330  * are in use.  Should the rest be removed?
331  */
332 #define IS_TO_DS(x)            ((x) & FLAG_TO_DS)
333 #define IS_FROM_DS(x)          ((x) & FLAG_FROM_DS)
334 #define HAVE_FRAGMENTS(x)      ((x) & FLAG_MORE_FRAGMENTS)
335 #define IS_RETRY(x)            ((x) & FLAG_RETRY)
336 #define POWER_MGT_STATUS(x)    ((x) & FLAG_POWER_MGT)
337 #define HAS_MORE_DATA(x)       ((x) & FLAG_MORE_DATA)
338 #define IS_PROTECTED(x)        ((x) & FLAG_PROTECTED)
339 #define IS_STRICTLY_ORDERED(x) ((x) & FLAG_ORDER)
340
341 /*
342  * Extract subfields from the flags field.
343  */
344 #define FLAGS_DS_STATUS(x)          ((x) & (FLAG_FROM_DS|FLAG_TO_DS))
345
346 /*
347  * Extract an indication of the types of addresses in a data frame from
348  * the frame control field.
349  */
350 #define FCF_ADDR_SELECTOR(x) ((x) & ((FLAG_TO_DS|FLAG_FROM_DS) << 8))
351
352 #define DATA_ADDR_T1         0
353 #define DATA_ADDR_T2         (FLAG_FROM_DS << 8)
354 #define DATA_ADDR_T3         (FLAG_TO_DS << 8)
355 #define DATA_ADDR_T4         ((FLAG_TO_DS|FLAG_FROM_DS) << 8)
356
357 /*
358  * Extract the fragment number and sequence number from the sequence
359  * control field.
360  */
361 #define SEQCTL_FRAGMENT_NUMBER(x) ((x) & 0x000F)
362 #define SEQCTL_SEQUENCE_NUMBER(x) (((x) & 0xFFF0) >> 4)
363
364 /*
365  * Extract subfields from the QoS control field.
366  */
367 #define QOS_TID(x)            ((x) & 0x000F)
368 #define QOS_PRIORITY(x)       ((x) & 0x0007)
369 #define QOS_EOSP(x)           (((x) & 0x0010) >> 4) /* end of service period */
370 #define QOS_ACK_POLICY(x)     (((x) & 0x0060) >> 5)
371 #define QOS_AMSDU_PRESENT(x)  (((x) & 0x0080) >> 6)
372 #define QOS_FIELD_CONTENT(x)  (((x) & 0xFF00) >> 8)
373
374 #define QOS_FLAG_EOSP    0x10
375
376 /*
377  * Extract subfields from the result of QOS_FIELD_CONTENT().
378  */
379 #define QOS_PS_BUF_STATE_INDICATED(x)  (((x) & 0x02) >> 1)
380 #define QOS_PS_HIGHEST_PRI_BUF_AC(x)   (((x) & 0x0C) >> 2)
381 #define QOS_PS_QAP_BUF_LOAD(x)         (((x) & 0xF0) >> 4)
382
383 /*
384  * Extract subfields from the HT Control field.
385  * .11n D-1.10 & D-2.0, 7.1.3.5a, 32 bits.
386  */
387 #define HTC_LAC(htc)           ((htc) & 0xFF)
388 #define HTC_LAC_MAI(htc)       (((htc) >> 2) & 0xF)
389 #define HTC_IS_ASELI(htc)      (HTC_LAC_MAI(htc) == 0xE)
390 #define HTC_LAC_MAI_MRQ(htc)   ((HTC_LAC_MAI(htc))  & 0x1)
391 #define HTC_LAC_MAI_MSI(htc)   ((HTC_LAC_MAI(htc) >> 1) & 0x7)
392 #define HTC_LAC_MFSI(htc)      (((htc) >> 4) & 0x7)
393 #define HTC_LAC_ASEL_CMD(htc)  (((htc) >> 9) & 0x7)
394 #define HTC_LAC_ASEL_DATA(htc) (((htc) >> 12) & 0xF)
395 #define HTC_LAC_MFB(htc)       (((htc) >> 9) & 0x7F)
396 #define HTC_CAL_POS(htc)       (((htc) >> 16) & 0x3)
397 #define HTC_CAL_SEQ(htc)       (((htc) >> 18) & 0x3)
398 #define HTC_CSI_STEERING(htc)  (((htc) >> 22) & 0x3)
399 #define HTC_NDP_ANN(htc)       (((htc) >> 24) & 0x1)
400 #define HTC_AC_CONSTRAINT(htc) (((htc) >> 30) & 0x1)
401 #define HTC_RDG_MORE_PPDU(htc) (((htc) >> 31) & 0x1)
402
403 /*
404  * Extract subfields from the key octet in WEP-encrypted frames.
405  */
406 #define KEY_OCTET_WEP_KEY(x)   (((x) & 0xC0) >> 6)
407
408 #define KEY_EXTIV    0x20
409 #define EXTIV_LEN    8
410
411 /* Uncomment for 802.11s draft (mesh) support */
412 /* #define MESH_OVERRIDES 1 */
413 #ifdef MESH_OVERRIDES
414 /*
415  * Bits from the Mesh Flags field
416  */
417 #define MESH_FLAGS_ADDRESS_EXTENSION  0x3
418 #endif /* MESH_OVERRIDES */
419
420 /* ************************************************************************* */
421 /*              Constants used to identify cooked frame types                */
422 /* ************************************************************************* */
423 #define MGT_FRAME            0x00  /* Frame type is management */
424 #define CONTROL_FRAME        0x01  /* Frame type is control */
425 #define DATA_FRAME           0x02  /* Frame type is Data */
426
427 #define DATA_SHORT_HDR_LEN     24
428 #define DATA_LONG_HDR_LEN      30
429 #define MGT_FRAME_HDR_LEN      24  /* Length of Managment frame-headers */
430
431 /*
432  * COMPOSE_FRAME_TYPE() values for management frames.
433  */
434 #define MGT_ASSOC_REQ          0x00  /* association request        */
435 #define MGT_ASSOC_RESP         0x01  /* association response       */
436 #define MGT_REASSOC_REQ        0x02  /* reassociation request      */
437 #define MGT_REASSOC_RESP       0x03  /* reassociation response     */
438 #define MGT_PROBE_REQ          0x04  /* Probe request              */
439 #define MGT_PROBE_RESP         0x05  /* Probe response             */
440 #define MGT_MEASUREMENT_PILOT  0x06  /* Measurement Pilot          */
441 #define MGT_BEACON             0x08  /* Beacon frame               */
442 #define MGT_ATIM               0x09  /* ATIM                       */
443 #define MGT_DISASS             0x0A  /* Disassociation             */
444 #define MGT_AUTHENTICATION     0x0B  /* Authentication             */
445 #define MGT_DEAUTHENTICATION   0x0C  /* Deauthentication           */
446 #define MGT_ACTION             0x0D  /* Action                     */
447 #define MGT_ACTION_NO_ACK      0x0E  /* Action No Ack              */
448 #define MGT_ARUBA_WLAN         0x0F  /* Aruba WLAN Specific        */
449
450 /*
451  * COMPOSE_FRAME_TYPE() values for control frames.
452  */
453 #define CTRL_CONTROL_WRAPPER 0x17  /* Control Wrapper        */
454 #define CTRL_BLOCK_ACK_REQ   0x18  /* Block ack Request        */
455 #define CTRL_BLOCK_ACK       0x19  /* Block ack          */
456 #define CTRL_PS_POLL         0x1A  /* power-save poll               */
457 #define CTRL_RTS             0x1B  /* request to send               */
458 #define CTRL_CTS             0x1C  /* clear to send                 */
459 #define CTRL_ACKNOWLEDGEMENT 0x1D  /* acknowledgement               */
460 #define CTRL_CFP_END         0x1E  /* contention-free period end    */
461 #define CTRL_CFP_ENDACK      0x1F  /* contention-free period end/ack */
462
463 /*
464  * COMPOSE_FRAME_TYPE() values for data frames.
465  */
466 #define DATA                        0x20  /* Data                       */
467 #define DATA_CF_ACK                 0x21  /* Data + CF-Ack              */
468 #define DATA_CF_POLL                0x22  /* Data + CF-Poll             */
469 #define DATA_CF_ACK_POLL            0x23  /* Data + CF-Ack + CF-Poll    */
470 #define DATA_NULL_FUNCTION          0x24  /* Null function (no data)    */
471 #define DATA_CF_ACK_NOD             0x25  /* CF-Ack (no data)           */
472 #define DATA_CF_POLL_NOD            0x26  /* CF-Poll (No data)          */
473 #define DATA_CF_ACK_POLL_NOD        0x27  /* CF-Ack + CF-Poll (no data) */
474
475 #define DATA_QOS_DATA               0x28  /* QoS Data                   */
476 #define DATA_QOS_DATA_CF_ACK        0x29  /* QoS Data + CF-Ack        */
477 #define DATA_QOS_DATA_CF_POLL       0x2A  /* QoS Data + CF-Poll      */
478 #define DATA_QOS_DATA_CF_ACK_POLL   0x2B  /* QoS Data + CF-Ack + CF-Poll    */
479 #define DATA_QOS_NULL               0x2C  /* QoS Null        */
480 #define DATA_QOS_CF_POLL_NOD        0x2E  /* QoS CF-Poll (No Data)      */
481 #define DATA_QOS_CF_ACK_POLL_NOD    0x2F  /* QoS CF-Ack + CF-Poll (No Data) */
482
483
484 /* ************************************************************************* */
485 /*        Logical field codes (dissector's encoding of fixed fields)         */
486 /* ************************************************************************* */
487 #define FIELD_TIMESTAMP                 0x01  /* 64-bit timestamp                       */
488 #define FIELD_BEACON_INTERVAL           0x02  /* 16-bit beacon interval                 */
489 #define FIELD_CAP_INFO                  0x03  /* Add capability information tree        */
490 #define FIELD_AUTH_ALG                  0x04  /* Authentication algorithm used          */
491 #define FIELD_AUTH_TRANS_SEQ            0x05  /* Authentication sequence number         */
492 #define FIELD_CURRENT_AP_ADDR           0x06
493 #define FIELD_LISTEN_IVAL               0x07
494 #define FIELD_REASON_CODE               0x08
495 #define FIELD_ASSOC_ID                  0x09
496 #define FIELD_STATUS_CODE               0x0A
497 #define FIELD_CATEGORY_CODE             0x0B  /* Management action category */
498 #define FIELD_ACTION_CODE               0x0C  /* Management action code */
499 #define FIELD_DIALOG_TOKEN              0x0D  /* Management action dialog token */
500 #define FIELD_WME_ACTION_CODE           0x0E  /* Management notification action code */
501 #define FIELD_WME_DIALOG_TOKEN          0x0F  /* Management notification dialog token */
502 #define FIELD_WME_STATUS_CODE           0x10  /* Management notification setup response status code */
503 #define FIELD_QOS_ACTION_CODE           0x11
504 #define FIELD_QOS_TS_INFO               0x12
505 #define FIELD_DLS_ACTION_CODE           0x13
506 #define FIELD_DST_MAC_ADDR              0X14  /* DLS destination MAC address */
507 #define FIELD_SRC_MAC_ADDR              0X15  /* DLS source MAC address */
508 #define FIELD_DLS_TIMEOUT               0X16  /* DLS timeout value */
509 #define FIELD_SCHEDULE_INFO             0X17  /* Schedule Info field */
510 #define FIELD_ACTION                    0X18  /* Action field */
511 #define FIELD_BLOCK_ACK_ACTION_CODE     0x19
512 #define FIELD_QOS_INFO_AP               0x1A
513 #define FIELD_QOS_INFO_STA              0x1B
514 #define FIELD_BLOCK_ACK_PARAM           0x1C
515 #define FIELD_BLOCK_ACK_TIMEOUT         0x1D
516 #define FIELD_BLOCK_ACK_SSC             0x1E
517 #define FIELD_DELBA_PARAM_SET           0x1F
518 #define FIELD_MAX_REG_PWR               0x20
519 #define FIELD_MEASUREMENT_PILOT_INT     0x21
520 #define FIELD_COUNTRY_STR               0x22
521 #define FIELD_MAX_TX_PWR                0x23
522 #define FIELD_TX_PWR_USED               0x24
523 #define FIELD_TRANSCEIVER_NOISE_FLOOR   0x25
524 #define FIELD_DS_PARAM_SET              0x26
525 #define FIELD_CHANNEL_WIDTH             0x27
526 #define FIELD_SM_PWR_CNTRL              0x28
527 #define FIELD_PCO_PHASE_CNTRL           0x29
528 #define FIELD_PSMP_PARAM_SET            0x2A
529 #define FIELD_PSMP_STA_INFO             0x2B
530 #define FIELD_MIMO_CNTRL                0x2C
531 #define FIELD_ANT_SELECTION             0x2D
532 #define FIELD_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT 0x2E
533 #define FIELD_HT_INFORMATION            0x2F
534 #define FIELD_HT_ACTION_CODE            0x30
535 #define FIELD_PA_ACTION_CODE            0x31
536 #define FIELD_FT_ACTION_CODE            0x32
537 #define FIELD_STA_ADDRESS               0x33
538 #define FIELD_TARGET_AP_ADDRESS         0x34
539 #define FIELD_MESH_MGT_ACTION_PS_CODE   0x35    /* Mesh Management action peer link code */
540 /* unassigned                           0x36 */
541 #define FIELD_GAS_COMEBACK_DELAY        0x37
542 #define FIELD_GAS_FRAGMENT_ID           0x38
543 #define FIELD_SA_QUERY_ACTION_CODE      0x39
544 #define FIELD_TRANSACTION_ID            0x3A
545 #define FIELD_TDLS_ACTION_CODE          0x3B
546 #define FIELD_TARGET_CHANNEL            0x3C
547 #define FIELD_REGULATORY_CLASS          0x3D
548 #define FIELD_MESH_ACTION               0x3E
549 #define FIELD_MULTIHOP_ACTION           0x3F
550 #define FIELD_MESH_CONTROL              0x40
551 #define FIELD_SELFPROT_ACTION           0x41
552
553
554 /* ************************************************************************* */
555 /*        Logical field codes (IEEE 802.11 encoding of tags)                 */
556 /* ************************************************************************* */
557 #define TAG_SSID                     0
558 #define TAG_SUPP_RATES               1
559 #define TAG_FH_PARAMETER             2
560 #define TAG_DS_PARAMETER             3
561 #define TAG_CF_PARAMETER             4
562 #define TAG_TIM                      5
563 #define TAG_IBSS_PARAMETER           6
564 #define TAG_COUNTRY_INFO             7
565 #define TAG_FH_HOPPING_PARAMETER     8
566 #define TAG_FH_HOPPING_TABLE         9
567 #define TAG_REQUEST                  10
568 #define TAG_QBSS_LOAD                11
569 #define TAG_EDCA_PARAM_SET           12
570 #define TAG_TSPEC                    13
571 #define TAG_TCLAS                    14
572 #define TAG_SCHEDULE                 15
573 #define TAG_CHALLENGE_TEXT           16
574
575 #define TAG_POWER_CONSTRAINT         32
576 #define TAG_POWER_CAPABILITY         33
577 #define TAG_TPC_REQUEST              34
578 #define TAG_TPC_REPORT               35
579 /* 36 - 41 below */
580 #define TAG_ERP_INFO                 42
581 #define TAG_TS_DELAY                 43
582 #define TAG_TCLAS_PROCESS            44
583 #define TAG_HT_CAPABILITY            45  /* IEEE Stc 802.11n/D2.0 */
584 #define TAG_QOS_CAPABILITY           46
585 #define TAG_ERP_INFO_OLD             47  /* IEEE Std 802.11g/D4.0 */
586 #define TAG_RSN_IE                   48
587 /* Reserved 49 */
588 #define TAG_EXT_SUPP_RATES           50
589 #define TAG_AP_CHANNEL_REPORT        51
590 /* 52 below */
591 #define TAG_RCPI                     53
592 #define TAG_MOBILITY_DOMAIN          54  /* IEEE Std 802.11r-2008 */
593 /* 55 below */
594 #define TAG_TIMEOUT_INTERVAL         56  /* IEEE Std 802.11r-2008 */
595 #define TAG_RIC_DATA                 57  /* IEEE Std 802.11r-2008 */
596 /* 58 ??? */
597 #define TAG_SUPPORTED_REGULATORY_CLASSES            59 /* IEEE Std 802.11w-2009 */
598 #define TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT    60 /* IEEE Std 802.11w-2009 */
599 #define TAG_HT_INFO                  61  /* IEEE Stc 802.11n/D2.0 */
600 #define TAG_SECONDARY_CHANNEL_OFFSET 62  /* IEEE Stc 802.11n/D1.10/D2.0 */
601 /* 69 below */
602 #define TAG_20_40_BSS_CO_EX          72   /* IEEE P802.11n/D6.0 */
603 #define TAG_20_40_BSS_INTOL_CH_REP   73   /* IEEE P802.11n/D6.0 */
604 #define TAG_OVERLAP_BSS_SCAN_PAR     74   /* IEEE P802.11n/D6.0 */
605 #define TAG_RIC_DESCRIPTOR           75   /* IEEE Std 802.11r-2008 */
606 #define TAG_MMIE                     76   /* IEEE Std 802.11w-2009 */
607 #define TAG_LINK_IDENTIFIER          101  /* IEEE Std 802.11z-2010 */
608 #define TAG_WAKEUP_SCHEDULE          102  /* IEEE Std 802.11z-2010 */
609 #define TAG_CHANNEL_SWITCH_TIMING    104  /* IEEE Std 802.11z-2010 */
610 #define TAG_PTI_CONTROL              105  /* IEEE Std 802.11z-2010 */
611 #define TAG_PU_BUFFER_STATUS         106  /* IEEE Std 802.11z-2010 */
612 #define TAG_ADVERTISEMENT_PROTOCOL   108  /* IEEE P802.11u/D10.0 */
613 #define TAG_EXTENDED_CAPABILITIES    127   /* IEEE Stc 802.11n/D1.10/D2.0 */
614 #define TAG_AGERE_PROPRIETARY        128
615 #define TAG_CISCO_CCX1_CKIP          133  /* Cisco Compatible eXtensions */
616 #define TAG_CISCO_UNKNOWN_88         136  /* Cisco Compatible eXtensions? */
617 #define TAG_CISCO_UNKNOWN_95         149  /* Cisco Compatible eXtensions */
618 #define TAG_CISCO_UNKNOWN_96         150  /* Cisco Compatible eXtensions */
619 #define TAG_SYMBOL_PROPRIETARY       173
620 #define TAG_VENDOR_SPECIFIC_IE       221
621
622 #ifndef MESH_OVERRIDES
623 #define TAG_SUPPORTED_CHANNELS       36
624 #define TAG_CHANNEL_SWITCH_ANN       37
625 #define TAG_MEASURE_REQ              38
626 #define TAG_MEASURE_REP              39
627 #define TAG_QUIET                    40
628 #define TAG_IBSS_DFS                 41
629 #define TAG_NEIGHBOR_REPORT          52
630 #define TAG_FAST_BSS_TRANSITION      55  /* IEEE Std 802.11r-2008 */
631 #define TAG_WSIE                     69   /* tag of the Wave Service Information (802.11p) */
632 #else /* MESH_OVERRIDES */
633 #define TAG_SUPPORTED_CHANNELS       224
634 #define TAG_CHANNEL_SWITCH_ANN       225
635 #define TAG_MEASURE_REQ              226
636 #define TAG_MEASURE_REP              227
637 #define TAG_QUIET                    228
638 #define TAG_IBSS_DFS                 229
639 /* Not yet assigned by ANA */
640 #define TAG_MESH_CONFIGURATION       113
641 #define TAG_MESH_ID                  114
642 #define TAG_MESH_PEERING_MGMT        117
643 #define TAG_MESH_PREQ             68
644 #define TAG_MESH_PREP             69
645 #define TAG_MESH_PERR             70
646 #endif /* MESH_OVERRIDES */
647
648 static const range_string tag_num_vals[] = {
649   { TAG_SSID, TAG_SSID, "SSID parameter set" },
650   { TAG_SUPP_RATES, TAG_SUPP_RATES, "Supported Rates" },
651   { TAG_FH_PARAMETER, TAG_FH_PARAMETER, "FH Parameter set" },
652   { TAG_DS_PARAMETER, TAG_DS_PARAMETER, "DS Parameter set" },
653   { TAG_CF_PARAMETER, TAG_CF_PARAMETER, "CF Parameter set" },
654   { TAG_TIM, TAG_TIM, "Traffic Indication Map (TIM)" },
655   { TAG_IBSS_PARAMETER, TAG_IBSS_PARAMETER, "IBSS Parameter set" },
656   { TAG_COUNTRY_INFO, TAG_COUNTRY_INFO, "Country Information" },
657   { TAG_FH_HOPPING_PARAMETER, TAG_FH_HOPPING_PARAMETER, "Hopping Pattern Parameters" },
658   { TAG_FH_HOPPING_TABLE, TAG_FH_HOPPING_TABLE, "Hopping Pattern Table" },
659   { TAG_REQUEST, TAG_REQUEST, "Request" },
660   { TAG_QBSS_LOAD, TAG_QBSS_LOAD, "QBSS Load Element" },
661   { TAG_EDCA_PARAM_SET, TAG_EDCA_PARAM_SET, "EDCA Parameter Set" },
662   { TAG_TSPEC, TAG_TSPEC, "Traffic Specification" },
663   { TAG_TCLAS, TAG_TCLAS, "Traffic Classification" },
664   { TAG_SCHEDULE, TAG_SCHEDULE, "Schedule" },
665   { TAG_CHALLENGE_TEXT, TAG_CHALLENGE_TEXT,"Challenge text" },
666   { 17, 31, "Reserved" },
667   { TAG_POWER_CONSTRAINT, TAG_POWER_CONSTRAINT, "Power Constraint" },
668   { TAG_POWER_CAPABILITY, TAG_POWER_CAPABILITY, "Power Capability" },
669   { TAG_TPC_REQUEST, TAG_TPC_REQUEST, "TPC Request" },
670   { TAG_TPC_REPORT, TAG_TPC_REPORT, "TPC Report" },
671   { TAG_SUPPORTED_CHANNELS, TAG_SUPPORTED_CHANNELS, "Supported Channels" },
672   { TAG_CHANNEL_SWITCH_ANN, TAG_CHANNEL_SWITCH_ANN, "Channel Switch Announcement" },
673   { TAG_MEASURE_REQ, TAG_MEASURE_REQ, "Measurement Request" },
674   { TAG_MEASURE_REP, TAG_MEASURE_REP, "Measurement Report" },
675   { TAG_QUIET, TAG_QUIET, "Quiet" },
676   { TAG_IBSS_DFS, TAG_IBSS_DFS, "IBSS DFS" },
677   { TAG_ERP_INFO, TAG_ERP_INFO, "ERP Information" },
678   { TAG_TS_DELAY, TAG_TS_DELAY, "TS Delay" },
679   { TAG_TCLAS_PROCESS, TAG_TCLAS_PROCESS, "TCLAS Processing" },
680   { TAG_HT_CAPABILITY, TAG_HT_CAPABILITY, "HT Capabilities (802.11n D1.10)" },
681   { TAG_QOS_CAPABILITY, TAG_QOS_CAPABILITY, "QoS Capability" },
682   { TAG_ERP_INFO_OLD, TAG_ERP_INFO_OLD, "ERP Information" }, /* Reserved... */
683   { TAG_RSN_IE, TAG_RSN_IE, "RSN Information" },
684   { TAG_EXT_SUPP_RATES, TAG_EXT_SUPP_RATES, "Extended Supported Rates" },
685   { TAG_AP_CHANNEL_REPORT, TAG_AP_CHANNEL_REPORT, "AP Channel Report" },
686 #ifndef MESH_OVERRIDES
687   { TAG_NEIGHBOR_REPORT, TAG_NEIGHBOR_REPORT, "Neighbor Report" },
688 #endif
689   { TAG_RCPI, TAG_RCPI, "RCPI" },
690   { TAG_MOBILITY_DOMAIN, TAG_MOBILITY_DOMAIN, "Mobility Domain" },
691 #ifndef MESH_OVERRIDES
692   { TAG_FAST_BSS_TRANSITION, TAG_FAST_BSS_TRANSITION, "Fast BSS Transition" },
693 #endif
694   { TAG_TIMEOUT_INTERVAL, TAG_TIMEOUT_INTERVAL,"Timeout Interval" },
695   { TAG_RIC_DATA, TAG_RIC_DATA, "RIC Data" },
696   { TAG_SUPPORTED_REGULATORY_CLASSES, TAG_SUPPORTED_REGULATORY_CLASSES, "Supported Regulatory Classes" },
697   { TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT, TAG_EXTENDED_CHANNEL_SWITCH_ANNOUNCEMENT, "Extended Channel Switch Announcement" },
698   { TAG_HT_INFO, TAG_HT_INFO, "HT Information (802.11n D1.10)" },
699   { TAG_SECONDARY_CHANNEL_OFFSET, TAG_SECONDARY_CHANNEL_OFFSET, "Secondary Channel Offset (802.11n D1.10)" },
700 #ifndef MESH_OVERRIDES
701   { TAG_WSIE, TAG_WSIE, "Wave Service Information" }, /* www.aradasystems.com */
702 #endif
703   { TAG_20_40_BSS_CO_EX, TAG_20_40_BSS_CO_EX, "20/40 BSS Coexistence" },
704   { TAG_20_40_BSS_INTOL_CH_REP, TAG_20_40_BSS_INTOL_CH_REP, "20/40 BSS Intolerant Channel Report" },   /* IEEE P802.11n/D6.0 */
705   { TAG_OVERLAP_BSS_SCAN_PAR, TAG_OVERLAP_BSS_SCAN_PAR, "Overlapping BSS Scan Parameters" },       /* IEEE P802.11n/D6.0 */
706   { TAG_RIC_DESCRIPTOR, TAG_RIC_DESCRIPTOR, "RIC Descriptor" },
707   { TAG_MMIE, TAG_MMIE, "Management MIC" },
708   { TAG_LINK_IDENTIFIER, TAG_LINK_IDENTIFIER, "Link Identifier" },
709   { TAG_WAKEUP_SCHEDULE, TAG_WAKEUP_SCHEDULE, "Wakeup Schedule" },
710   { TAG_CHANNEL_SWITCH_TIMING, TAG_CHANNEL_SWITCH_TIMING, "Channel Switch Timing" },
711   { TAG_PTI_CONTROL, TAG_PTI_CONTROL, "PTI Control" },
712   { TAG_PU_BUFFER_STATUS, TAG_PU_BUFFER_STATUS, "PU Buffer Status" },
713   { TAG_ADVERTISEMENT_PROTOCOL, TAG_ADVERTISEMENT_PROTOCOL, "Advertisement Protocol"},
714   { TAG_EXTENDED_CAPABILITIES, TAG_EXTENDED_CAPABILITIES, "Extended Capabilities" },
715   { TAG_AGERE_PROPRIETARY, TAG_AGERE_PROPRIETARY, "Agere Proprietary" },
716   { TAG_CISCO_CCX1_CKIP, TAG_CISCO_CCX1_CKIP, "Cisco CCX1 CKIP + Device Name" },
717   { TAG_CISCO_UNKNOWN_88, TAG_CISCO_UNKNOWN_88, "Cisco Unknown 88" },
718   { TAG_CISCO_UNKNOWN_95, TAG_CISCO_UNKNOWN_95, "Cisco Unknown 95" },
719   { TAG_CISCO_UNKNOWN_96, TAG_CISCO_UNKNOWN_96, "Cisco Unknown 96" },
720   { TAG_SYMBOL_PROPRIETARY, TAG_SYMBOL_PROPRIETARY, "Symbol Proprietary" },
721   { TAG_VENDOR_SPECIFIC_IE, TAG_VENDOR_SPECIFIC_IE, "Vendor Specific" },
722 #ifdef MESH_OVERRIDES
723   { TAG_MESH_ID, TAG_MESH_ID, "Mesh ID" },
724   { TAG_MESH_CONFIGURATION, TAG_MESH_CONFIGURATION, "Mesh Configuration" },
725   { TAG_MESH_PEERING_MGMT, TAG_MESH_PEERING_MGMT, "Mesh Peering Management" },
726   { TAG_MESH_PREQ, TAG_MESH_PREQ, "Mesh Path Request" },
727   { TAG_MESH_PREP, TAG_MESH_PREP, "Mesh Path Response" },
728   { TAG_MESH_PERR, TAG_MESH_PERR, "Mesh Path Error" },
729 #endif /* MESH_OVERRIDES */
730   { 0, 0, NULL }
731 };
732
733 #define WPA_OUI     (const guint8 *) "\x00\x50\xF2"
734 #define RSN_OUI     (const guint8 *) "\x00\x0F\xAC"
735 #define WME_OUI     (const guint8 *) "\x00\x50\xF2"
736 #define PRE_11N_OUI (const guint8 *) "\x00\x90\x4c" /* 802.11n pre 1 oui */
737 #define WFA_OUI     (const guint8 *) "\x50\x6f\x9a"
738
739 /* WFA vendor specific subtypes */
740 #define WFA_SUBTYPE_P2P 9
741
742 #define PMKID_LEN 16
743
744 /* ************************************************************************* */
745 /*              Wireless Access in Vehicular Environment  IEEE 802.11p       */
746 /* ************************************************************************* */
747 #define WAVE_ACID       0x0001
748 #define WAVE_ACM        0x0002
749 #define WAVE_ACF        0x0004
750 #define WAVE_PRIORITY   0x0008
751 #define WAVE_CHANNEL    0x0010
752 #define WAVE_IPV6ADDR   0x0020
753 #define WAVE_PEERMAC    0x0040
754
755 /* ************************************************************************* */
756 /*              Supported Rates (7.3.2.2)                                    */
757 /* ************************************************************************* */
758
759 static const value_string ieee80211_supported_rates_vals[] = {
760   { 0x02, "1" },
761   { 0x03, "1.5" },
762   { 0x04, "2" },
763   { 0x05, "2.5" },
764   { 0x06, "3" },
765   { 0x09, "4.5" },
766   { 0x0B, "5.5" },
767   { 0x0C, "6" },
768   { 0x12, "9" },
769   { 0x16, "11" },
770   { 0x18, "12" },
771   { 0x1B, "13.5" },
772   { 0x24, "18" },
773   { 0x2C, "22" },
774   { 0x30, "24" },
775   { 0x36, "27" },
776   { 0x42, "33" },
777   { 0x48, "36" },
778   { 0x60, "48" },
779   { 0x6C, "54" },
780   { 0x82, "1(B)" },
781   { 0x83, "1.5(B)" },
782   { 0x84, "2(B)" },
783   { 0x85, "2.5(B)" },
784   { 0x86, "3(B)" },
785   { 0x89, "4.5(B)" },
786   { 0x8B, "5.5(B)" },
787   { 0x8C, "6(B)" },
788   { 0x92, "9(B)" },
789   { 0x96, "11(B)" },
790   { 0x98, "12(B)" },
791   { 0x9B, "13.5(B)" },
792   { 0xA4, "18(B)" },
793   { 0xAC, "22(B)" },
794   { 0xB0, "24(B)" },
795   { 0xB6, "27(B)" },
796   { 0xC2, "33(B)" },
797   { 0xC8, "36(B)" },
798   { 0xE0, "48(B)" },
799   { 0xEC, "54(B)" },
800   { 0xFF, "BSS requires support for mandatory features of HT PHY (IEEE 802.11 - Clause 20)" },
801   { 0,    NULL}
802 };
803 /* ************************************************************************* */
804 /*                         7.3.1.7 Reason Code field                         */
805 /* ************************************************************************* */
806 static const value_string ieee80211_reason_code[] = {
807   { 1, "Unspecified reason" },
808   { 2, "Previous authentication no longer valid" },
809   { 3, "Deauthenticated because sending STA is leaving (or has left) IBSS or ESS" },
810   { 4, "Disassociated due to inactivity" },
811   { 5, "Disassociated because AP is unable to handle all currently associated STAs" },
812   { 6, "Class 2 frame received from nonauthenticated STA" },
813   { 7, "Class 3 frame received from nonassociated STA" },
814   { 8, "Disassociated because sending STA is leaving (or has left) BSS" },
815   { 9, "STA requesting (re)association is not authenticated with responding STA" },
816   { 10, "Disassociated because the information in the Power Capability element is unacceptable" },
817   { 11, "Disassociated because the information in the Supported Channels element is unacceptable" },
818   { 12, "Reserved" },
819   { 13, "Invalid information element, i.e., an information element defined in this standard for which the content does not meet the specifications in Clause 7" },
820   { 14, "Message integrity code (MIC) failure" },
821   { 15, "4-Way Handshake timeout" },
822   { 16, "Group Key Handshake timeout" },
823   { 17, "Information element in 4-Way Handshake different from (Re)Association Request/Probe Response/Beacon frame" },
824   { 18, "Invalid group cipher" },
825   { 19, "Invalid pairwise cipher" },
826   { 20, "Invalid AKMP" },
827   { 21, "Unsupported RSN information element version" },
828   { 22, "Invalid RSN information element capabilities" },
829   { 23, "IEEE 802.1X authentication failed" },
830   { 24, "Cipher suite rejected because of the security policy" },
831   { 31, "TS deleted because QoS AP lacks sufficient bandwidth for this QoS STA due to a change in BSS service characteristics or operational mode" },
832   { 32, "Disassociated for unspecified, QoS-related reason" },
833   { 33, "Disassociated because QoS AP lacks sufficient bandwidth for this QoS STA" },
834   { 34, "Disassociated because excessive number of frames need to be acknowledged, but are not acknowledged due to AP transmissions and/or poor channel conditions" },
835   { 35, "Disassociated because STA is transmitting outside the limits of its TXOPs" },
836   { 36, "Requested from peer STA as the STA is leaving the BSS (or resetting)" },
837   { 37, "Requested from peer STA as it does not want to use the mechanism" },
838   { 38, "Requested from peer STA as the STA received frames using the mechanism for which a setup is required" },
839   { 39, "Requested from peer STA due to timeout" },
840   { 45, "Peer STA does not support the requested cipher suite" },
841   { 0,    NULL}
842 };
843
844 /* ************************************************************************* */
845 /*                         7.3.1.9 Status Code field                         */
846 /* ************************************************************************* */
847 static const value_string ieee80211_status_code[] = {
848   { 0, "Successful" },
849   { 1, "Unspecified failure" },
850   { 2, "TDLS wakeup schedule rejected but alternative schedule provided" },
851   { 3, "TDLS wakeup schedule rejected" },
852   { 5, "Security disabled" },
853   { 6, "Unacceptable lifetime" },
854   { 7, "Not in same BSS" },
855   { 10, "Cannot support all requested capabilities in the Capability Information field" },
856   { 11, "Reassociation denied due to inability to confirm that association exists" },
857   { 12, "Association denied due to reason outside the scope of this standard" },
858   { 13, "Responding STA does not support the specified authentication algorithm" },
859   { 14, "Received an Authentication frame with authentication transaction sequence number out of expected sequence" },
860   { 15, "Authentication rejected because of challenge failure" },
861   { 16, "Authentication rejected due to timeout waiting for next frame in sequence" },
862   { 17, "Association denied because AP is unable to handle additional associated STAs" },
863   { 18, "Association denied due to requesting STA not supporting all of the data rates in the BSSBasicRateSet parameter" },
864   { 19, "Association denied due to requesting STA not supporting the short preamble option" },
865   { 20, "Association denied due to requesting STA not supporting the PBCC modulation option" },
866   { 21, "Association denied due to requesting STA not supporting the Channel Agility option" },
867   { 22, "Association request rejected because Spectrum Management capability is required" },
868   { 23, "Association request rejected because the information in the Power Capability element is unacceptable" },
869   { 24, "Association request rejected because the information in the Supported Channels element is unacceptable" },
870   { 25, "Association denied due to requesting STA not supporting the Short Slot Time option" },
871   { 26, "Association denied due to requesting STA not supporting the DSSS-OFDM option" },
872   { 27, "Reserved Association denied because the requesting STA does not support HT features" },
873   { 28, "R0KH unreachable" },
874   { 29, "Association denied because the requesting STA does not support the phased coexistence operation (PCO) transition time required by the AP" },
875   { 30, "Association request rejected temporarily; try again later" },
876   { 31, "Robust Management frame policy violation" },
877   { 32, "Unspecified, QoS-related failure" },
878   { 33, "Association denied because QoS AP has insufficient bandwidth to handle another QoS STA" },
879   { 34, "Association denied due to excessive frame loss rates and/or poor conditions on current operating channel" },
880   { 35, "Association (with QoS BSS) denied because the requesting STA does not support the QoS facility" },
881   { 36, "Reserved" },
882   { 37, "The request has been declined" },
883   { 38, "The request has not been successful as one or more parameters have invalid values" },
884   { 39, "The TS has not been created because the request cannot be honored; however, a suggested TSPEC is provided so that the initiating STA may attempt to set another TS with the suggested changes to the TSPEC" },
885   { 40, "Invalid information element, i.e., an information element defined in this standard for which the content does not meet the specifications in Clause 7" },
886   { 41, "Invalid group cipher" },
887   { 42, "Invalid pairwise cipher" },
888   { 43, "Invalid AKMP" },
889   { 44, "Unsupported RSN information element version" },
890   { 45, "Invalid RSN information element capabilities" },
891   { 46, "Cipher suite rejected because of security policy" },
892   { 47, "The TS has not been created; however, the HC may be capable of creating a TS, in response to a request, after the time indicated in the TS Delay element" },
893   { 48, "Direct link is not allowed in the BSS by policy" },
894   { 49, "The Destination STA is not present within this BSS" },
895   { 50, "The Destination STA is not a QoS STA" },
896   { 51, "Association denied because the ListenInterval is too large" },
897   { 52, "Invalid FT Action frame count" },
898   { 53, "Invalid pairwise master key identifier (PMKID)" },
899   { 54, "Invalid MDIE" },
900   { 55, "Invalid FTIE" },
901   { 56, "GAS Advertisement Protocol not supported" },
902   { 57, "No outstanding GAS request" },
903   { 58, "GAS Response not received from the Advertisement Server" },
904   { 59, "STA timed out waiting for GAS Query Response" },
905   { 60, "GAS Response is larger than query response length limit" },
906   { 61, "Advertisement Server in the network is not currently reachable" },
907   { 62, "Requested information is not available for this BSSID" },
908   { 63, "Transmission failure" },
909   { 64, "Request refused due to permissions received via SSPN interface" },
910   { 65, "Request refused because AP does not support unauthenticated access" },
911   { 72, "Invalid contents of RSNIE" },
912   { 76, "Authentication is rejected because an Anti-Clogging Token is required" },
913   { 77, "Authentication is rejected because the offered finite cyclic group is not supported" },
914   { 78, "The TBTT adjustment request has not been successful because the STA could not find an alternative TBTT" },
915   { 0,    NULL}
916 };
917
918 /* ************************************************************************* */
919 /*                         Frame types, and their names                      */
920 /* ************************************************************************* */
921 static const value_string frame_type_subtype_vals[] = {
922   {MGT_ASSOC_REQ,             "Association Request"},
923   {MGT_ASSOC_RESP,            "Association Response"},
924   {MGT_REASSOC_REQ,           "Reassociation Request"},
925   {MGT_REASSOC_RESP,          "Reassociation Response"},
926   {MGT_PROBE_REQ,             "Probe Request"},
927   {MGT_PROBE_RESP,            "Probe Response"},
928   {MGT_MEASUREMENT_PILOT,     "Measurement Pilot"},
929   {MGT_BEACON,                "Beacon frame"},
930   {MGT_ATIM,                  "ATIM"},
931   {MGT_DISASS,                "Disassociate"},
932   {MGT_AUTHENTICATION,        "Authentication"},
933   {MGT_DEAUTHENTICATION,      "Deauthentication"},
934   {MGT_ACTION,                "Action"},
935   {MGT_ACTION_NO_ACK,         "Action No Ack"},
936   {MGT_ARUBA_WLAN,            "Aruba Management"},
937
938   {CTRL_CONTROL_WRAPPER,      "Control Wrapper"},
939   {CTRL_BLOCK_ACK_REQ,        "802.11 Block Ack Req"},
940   {CTRL_BLOCK_ACK,            "802.11 Block Ack"},
941   {CTRL_PS_POLL,              "Power-Save poll"},
942   {CTRL_RTS,                  "Request-to-send"},
943   {CTRL_CTS,                  "Clear-to-send"},
944   {CTRL_ACKNOWLEDGEMENT,      "Acknowledgement"},
945   {CTRL_CFP_END,              "CF-End (Control-frame)"},
946   {CTRL_CFP_ENDACK,           "CF-End + CF-Ack (Control-frame)"},
947
948   {DATA,                      "Data"},
949   {DATA_CF_ACK,               "Data + CF-Ack"},
950   {DATA_CF_POLL,              "Data + CF-Poll"},
951   {DATA_CF_ACK_POLL,          "Data + CF-Ack + CF-Poll"},
952   {DATA_NULL_FUNCTION,        "Null function (No data)"},
953   {DATA_CF_ACK_NOD,           "Acknowledgement (No data)"},
954   {DATA_CF_POLL_NOD,          "CF-Poll (No data)"},
955   {DATA_CF_ACK_POLL_NOD,      "CF-Ack/Poll (No data)"},
956   {DATA_QOS_DATA,             "QoS Data"},
957   {DATA_QOS_DATA_CF_ACK,      "QoS Data + CF-Acknowledgment"},
958   {DATA_QOS_DATA_CF_POLL,     "QoS Data + CF-Poll"},
959   {DATA_QOS_DATA_CF_ACK_POLL, "QoS Data + CF-Ack + CF-Poll"},
960   {DATA_QOS_NULL,             "QoS Null function (No data)"},
961   {DATA_QOS_CF_POLL_NOD,      "QoS CF-Poll (No Data)"},
962   {DATA_QOS_CF_ACK_POLL_NOD,  "QoS CF-Ack + CF-Poll (No data)"},
963   {0,                         NULL}
964 };
965
966 /* ************************************************************************* */
967 /*                             802.1D Tag Names                              */
968 /* ************************************************************************* */
969 static const char *qos_tags[8] = {
970   "Best Effort",
971   "Background",
972   "Spare",
973   "Excellent Effort",
974   "Controlled Load",
975   "Video",
976   "Voice",
977   "Network Control"
978 };
979
980 /* ************************************************************************* */
981 /*                 WME Access Category Names (by 802.1D Tag)                 */
982 /* ************************************************************************* */
983 static const char *qos_acs[8] = {
984   "Best Effort",
985   "Background",
986   "Background",
987   "Video",
988   "Video",
989   "Video",
990   "Voice",
991   "Voice"
992 };
993
994 /* ************************************************************************* */
995 /*                   WME Access Category Names (by WME ACI)                  */
996 /* ************************************************************************* */
997 static const value_string wme_acs[] = {
998   { 0, "Best Effort" },
999   { 1, "Background" },
1000   { 2, "Video" },
1001   { 3, "Voice" },
1002   { 0, NULL }
1003 };
1004
1005 /* ************************************************************************* */
1006 /*                  Aruba Management Type                                    */
1007 /* ************************************************************************* */
1008 static const value_string aruba_mgt_typevals[] = {
1009   { 0x0001,       "Hello" },
1010   { 0x0002,       "Probe" },
1011   { 0x0003,       "MTU" },
1012   { 0x0004,       "Ageout" },
1013   { 0x0005,       "Heartbeat" },
1014   { 0x0006,       "Deauth" },
1015   { 0x0007,       "Disassoc" },
1016   { 0x0008,       "Probe response" },
1017   { 0x0009,       "Tunnel update" },
1018   { 0x000A,       "Laser beam active" },
1019   { 0x000B,       "Client IP" },
1020   { 0x000C,       "Laser beam active v2" },
1021   { 0x000D,       "AP statistics" },
1022   { 0,            NULL }
1023 };
1024
1025 /*** Begin: Action Fixed Parameter ***/
1026 #define CAT_SPECTRUM_MGMT      0
1027 #define CAT_QOS                1
1028 #define CAT_DLS                2
1029 #define CAT_BLOCK_ACK          3
1030 #define CAT_PUBLIC             4
1031
1032 #define CAT_RADIO_MEASUREMENT   5
1033 #define CAT_FAST_BSS_TRANSITION 6
1034 #define CAT_HT                  7
1035 #define CAT_SA_QUERY            8
1036 #define CAT_PUBLIC_PROTECTED    9
1037 #define CAT_TDLS                12
1038
1039 #ifdef MESH_OVERRIDES
1040 /* per 11s draft 12.0 */
1041 #define CAT_MESH                13
1042 #define CAT_MULTIHOP            14
1043 #define CAT_SELF_PROTECTED      15
1044 #endif /* MESH_OVERRIDES */
1045
1046 #define CAT_MGMT_NOTIFICATION   17
1047 #define CAT_VENDOR_SPECIFIC_PROTECTED 126
1048 #define CAT_VENDOR_SPECIFIC     127
1049
1050 #ifdef MESH_OVERRIDES
1051 #define CAT_MESH_LINK_METRIC               31
1052 #define CAT_MESH_PATH_SELECTION            32
1053 #define CAT_MESH_INTERWORKING              33
1054 #define CAT_MESH_RESOURCE_COORDINATION     34
1055 #define CAT_MESH_SECURITY_ARCHITECTURE     35
1056 #endif /* MESH_OVERRIDES */
1057
1058 #define SM_ACTION_MEASUREMENT_REQUEST   0
1059 #define SM_ACTION_MEASUREMENT_REPORT    1
1060 #define SM_ACTION_TPC_REQUEST           2
1061 #define SM_ACTION_TPC_REPORT            3
1062 #define SM_ACTION_CHAN_SWITCH_ANNC      4
1063 #define SM_ACTION_EXT_CHAN_SWITCH_ANNC  5
1064
1065 #define SM_ACTION_ADDTS_REQUEST     0
1066 #define SM_ACTION_ADDTS_RESPONSE    1
1067 #define SM_ACTION_DELTS             2
1068 #define SM_ACTION_QOS_SCHEDULE      3
1069
1070 #define SM_ACTION_DLS_REQUEST       0
1071 #define SM_ACTION_DLS_RESPONSE      1
1072 #define SM_ACTION_DLS_TEARDOWN      2
1073
1074 #define BA_ADD_BLOCK_ACK_REQUEST    0
1075 #define BA_ADD_BLOCK_ACK_RESPONSE   1
1076 #define BA_DELETE_BLOCK_ACK         2
1077
1078 #define PA_DSE_ENABLEMENT                  1
1079 #define PA_DSE_DEENABLEMENT                2
1080 #define PA_DSE_REG_LOC_ANNOUNCEMENT        3
1081 #define PA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT 4
1082 #define PA_DSE_MEASUREMENT_REQUEST         5
1083 #define PA_DSE_MEASUREMENT_REPORT          6
1084 #define PA_MEASUREMENT_PILOT               7
1085 #define PA_DSE_POWER_CONSTRAINT            8
1086 #define PA_VENDOR_SPECIFIC                 9
1087 #define PA_GAS_INITIAL_REQUEST             10
1088 #define PA_GAS_INITIAL_RESPONSE            11
1089 #define PA_GAS_COMEBACK_REQUEST            12
1090 #define PA_GAS_COMEBACK_RESPONSE           13
1091 #define PA_TDLS_DISCOVERY_RESPONSE         14
1092
1093 #define HT_ACTION_NOTIFY_CHAN_WIDTH           0
1094 #define HT_ACTION_SM_PWR_SAVE                 1
1095 #define HT_ACTION_PSMP_ACTION                 2
1096 #define HT_ACTION_SET_PCO_PHASE               3
1097 #define HT_ACTION_MIMO_CSI                    4
1098 #define HT_ACTION_MIMO_BEAMFORMING            5
1099 #define HT_ACTION_MIMO_COMPRESSED_BEAMFORMING 6
1100 #define HT_ACTION_ANT_SEL_FEEDBACK            7
1101 #define HT_ACTION_HT_INFO_EXCHANGE            8
1102
1103 /* IEEE Std 802.11r-2008, 7.4.8, Table 7-57g */
1104 #define FT_ACTION_REQUEST               1
1105 #define FT_ACTION_RESPONSE              2
1106 #define FT_ACTION_CONFIRM               3
1107 #define FT_ACTION_ACK                   4
1108
1109 /* SA Query Action frame codes (IEEE 802.11w-2009, 7.4.9) */
1110 #define SA_QUERY_REQUEST                0
1111 #define SA_QUERY_RESPONSE               1
1112
1113 /* IEEE Std 802.11z-2010, 7.4.11, Table 7-57v1 */
1114 #define TDLS_SETUP_REQUEST              0
1115 #define TDLS_SETUP_RESPONSE             1
1116 #define TDLS_SETUP_CONFIRM              2
1117 #define TDLS_TEARDOWN                   3
1118 #define TDLS_PEER_TRAFFIC_INDICATION    4
1119 #define TDLS_CHANNEL_SWITCH_REQUEST     5
1120 #define TDLS_CHANNEL_SWITCH_RESPONSE    6
1121 #define TDLS_PEER_PSM_REQUEST           7
1122 #define TDLS_PEER_PSM_RESPONSE          8
1123 #define TDLS_PEER_TRAFFIC_RESPONSE      9
1124 #define TDLS_DISCOVERY_REQUEST          10
1125
1126 #ifdef MESH_OVERRIDES
1127 /* 11s draft 12.0, table 7-57v30 */
1128 #define MESH_ACTION_LINK_METRIC_REPORT              0
1129 #define MESH_ACTION_HWMP                            1
1130 #define MESH_ACTION_GATE_ANNOUNCE                   2
1131 #define MESH_ACTION_CONGESTION_CTL                  3
1132 #define MESH_ACTION_MCCA_SETUP_REQUEST              4
1133 #define MESH_ACTION_MCCA_SETUP_REPLY                5
1134 #define MESH_ACTION_MCCA_ADV_REQUEST                6
1135 #define MESH_ACTION_MCCA_ADV                        7
1136 #define MESH_ACTION_MCCA_TEARDOWN                   8
1137 #define MESH_ACTION_TBTT_ADJ_REQUEST                9
1138 #define MESH_ACTION_TBTT_ADJ_RESPONSE              10
1139
1140 /* 11s draft 12.0, table 7-57v42: Multihop Action field values */
1141 #define MULTIHOP_ACTION_PROXY_UPDATE                0
1142 #define MULTIHOP_ACTION_PROXY_UPDATE_CONF           1
1143
1144 /* 11s draft 12.0, table 7-57v24: Self-protected Action field values */
1145 #define SELFPROT_ACTION_MESH_PEERING_OPEN           1
1146 #define SELFPROT_ACTION_MESH_PEERING_CONFIRM        2
1147 #define SELFPROT_ACTION_MESH_PEERING_CLOSE          3
1148 #define SELFPROT_ACTION_MESH_GROUP_KEY_INFORM       4
1149 #define SELFPROT_ACTION_MESH_GROUP_KEY_ACK          5
1150
1151 /* 11s draft 12.0, table 7-43bj6: Mesh Peering Protocol Identifier field values */
1152 #define MESH_PEERING_PROTO_MGMT                     0
1153 #define MESH_PEERING_PROTO_AMPE                     1
1154 #define MESH_PEERING_PROTO_VENDOR                 255
1155
1156 #define MESH_PS_PATH_REQUEST                        0
1157 #define MESH_PS_PATH_REPLY                          1
1158 #define MESH_PS_PATH_ERROR                          2
1159 #define MESH_PS_ROOT_ANNOUNCEMENT                   3
1160 #endif /* MESH_OVERRIDES */
1161
1162 /* 11s draft, table 7-22 */
1163 #define MESH_LINK_CANCELLED                     2
1164 #define MESH_MAX_NEIGHBORS                      3
1165 #define MESH_CONFIG_POLICY_VIOLATION            4
1166 #define MESH_CLOSE_RCVD                         5
1167 #define MESH_MAX_RETRIES                        6
1168 #define MESH_CONFIRM_TIMEOUT                    7
1169
1170 /* Vendor actions */
1171 /* MARVELL */
1172 #define MRVL_ACTION_MESH_MANAGEMENT     1
1173
1174 #define MRVL_MESH_MGMT_ACTION_RREQ      0
1175 #define MRVL_MESH_MGMT_ACTION_RREP      1
1176 #define MRVL_MESH_MGMT_ACTION_RERR      2
1177 #define MRVL_MESH_MGMT_ACTION_PLDM      3
1178
1179 /*** End: Action Fixed Parameter ***/
1180
1181 static const value_string ieee80211_tag_measure_request_type_flags[] = {
1182   {0x00, "Basic Request"},
1183   {0x01, "Clear Channel Assessment (CCA) Request"},
1184   {0x02, "Receive Power Indication (RPI) Histogram Request"},
1185   {0x03, "Channel Load Request"},
1186   {0x04, "Noise Histogram Request"},
1187   {0x05, "Beacon Request"},
1188   {0x06, "Frame Request"},
1189   {0x07, "STA Statistics Request"},
1190   {0x08, "Location Configuration Indication (LCI) Request"},
1191   {0x09, "Transmit Stream Measurement Request"},
1192   {0x0A, "Measurement Pause Request"},
1193   {0x00, NULL}
1194 };
1195
1196 static const value_string ieee80211_tag_measure_report_type_flags[] = {
1197   { 0x00, "Basic Report" },
1198   { 0x01, "Clear Channel Assessment (CCA) Report" },
1199   { 0x02, "Receive Power Indication (RPI) Histogram Report" },
1200   { 0x03, "Channel Load Report" },
1201   { 0x04, "Noise Histogram Report" },
1202   { 0x05, "Beacon Report" },
1203   { 0x06, "Frame Report" },
1204   { 0x07, "STA Statistics Report" },
1205   { 0x08, "Location Configuration Information (LCI) Report" },
1206   { 0x09, "Transmit Stream Measurement Report" },
1207   { 0x00, NULL }
1208 };
1209
1210 static const true_false_string ieee80211_tag_measure_report_frame_info_frame_type_flag = {
1211   "Measurement Pilot Frame",
1212   "Beacon/Probe Response Frame"
1213 };
1214
1215 static const true_false_string ieee80211_tag_measure_map_field_bss_flag = {
1216   "At least one MPDU was received by another BSS or IBSS in the measurement period.",
1217   "No MPDUs were received from another BSS or IBSS in the measurement period."
1218 };
1219
1220 static const value_string ieee80211_tag_measure_request_measurement_mode_flags[] = {
1221   { 0x00, "Passive" },
1222   { 0x01, "Active" },
1223   { 0x02, "Beacon Table" },
1224   { 0x00, NULL }
1225 };
1226
1227 #define MEASURE_REQ_BEACON_SUB_SSID 0
1228 #define MEASURE_REQ_BEACON_SUB_BRI 1
1229 #define MEASURE_REQ_BEACON_SUB_RD 2
1230 #define MEASURE_REQ_BEACON_SUB_REQUEST 10
1231 #define MEASURE_REQ_BEACON_SUB_APCP 51
1232 #define MEASURE_REQ_BEACON_SUB_VS 221
1233
1234 static const value_string ieee80211_tag_measure_request_beacon_sub_id_flags[] = {
1235   { MEASURE_REQ_BEACON_SUB_SSID, "SSID" },
1236   { MEASURE_REQ_BEACON_SUB_BRI, "Beacon Reporting Information" },
1237   { MEASURE_REQ_BEACON_SUB_RD, "Reporting Detail" },
1238   { MEASURE_REQ_BEACON_SUB_REQUEST, "Request" },
1239   { MEASURE_REQ_BEACON_SUB_APCP, "AP Channel Report" },
1240   { MEASURE_REQ_BEACON_SUB_VS, "Vendor Specific" },
1241   { 0x00, NULL}
1242 };
1243
1244 static const value_string ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition_flags[] = {
1245   { 0x00, "Report to be issued after each measurement." },
1246   { 0x01, "The measured RCPI level is greater than an absolute threshold." },
1247   { 0x02, "The measured RCPI level is less than an absolute threshold." },
1248   { 0x03, "The measured RSNI level is greater than an absolute threshold." },
1249   { 0x04, "The measured RSNI level is less than an absolute threshold." },
1250   { 0x05, "The measured RCPI level is greater than a threshold defined by an offset from the serving AP's reference RCPI." },
1251   { 0x06, "The measured RCPI level is less than a threshold defined by an offset from the serving AP's reference RCPI." },
1252   { 0x07, "The measured RSNI level is greater than a threshold defined by an offset from the serving AP's reference RSNI." },
1253   { 0x08, "The measured RSNI level is less than a threshold defined by an offset from the serving AP's reference RSNI." },
1254   { 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." },
1255   { 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." },
1256   { 0xfe, "Report not required to be issued" },
1257   { 0x00, NULL }
1258 };
1259
1260 static const value_string ieee80211_tag_measure_request_beacon_sub_reporting_detail_flags[] = {
1261   { 0, "No fixed length fields or elements" },
1262   { 1, "All fixed length fields and any requested elements in the Request information element if present" },
1263   { 2, "All fixed length fields and elements (default, used when Reporting Detail subelement is not included in Beacon Request" },
1264   { 0x00, NULL }
1265 };
1266
1267 static const value_string ieee80211_tag_measure_request_group_id_flags[] = {
1268   { 0x00, "STA Counters from dot11CountersTable" },
1269   { 0x01, "STA Counters from dot11MacStatistics group" },
1270   { 0x02, "QoS STA Counters for UP0 from dot11QosCountersTable" },
1271   { 0x03, "QoS STA Counters for UP1 from dot11QosCountersTable" },
1272   { 0x04, "QoS STA Counters for UP2 from dot11QosCountersTable" },
1273   { 0x05, "QoS STA Counters for UP3 from dot11QosCountersTable" },
1274   { 0x06, "QoS STA Counters for UP4 from dot11QosCountersTable" },
1275   { 0x07, "QoS STA Counters for UP5 from dot11QosCountersTable" },
1276   { 0x08, "QoS STA Counters for UP6 from dot11QosCountersTable" },
1277   { 0x09, "QoS STA Counters for UP7 from dot11QosCountersTable" },
1278   { 0x0a, "BSS Average Access Delays" },
1279   { 0x0b, "STA Counters from dot11A-MSDU Group" },
1280   { 0x0c, "STA Counters from dot11A-MPDU Group" },
1281   { 0x0d, "STA Counters from dot11 BAR, Channel Width, PSMP Group" },
1282   { 0x0e, "STA Counters from dot11Protection Group" },
1283   { 0x0f, "STBC Group" },
1284   { 0x00, NULL }
1285 };
1286
1287 static const value_string ieee80211_tclas_process_flag[] = {
1288   {0x00, "Incoming MSDU's higher layer parameters have to match to the parameters in all associated TCLAS elements."},
1289   {0x01, "Incoming MSDU's higher layer parameters have to match to at least one of the associated TCLAS elements."},
1290   {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."},
1291   {0, NULL}
1292 };
1293
1294 static int proto_wlan = -1;
1295 static int proto_aggregate = -1;
1296 static packet_info * g_pinfo;
1297
1298 static int proto_radio = -1;
1299 static int proto_wlancap = -1;
1300 static int proto_prism = -1;
1301
1302 /* ************************************************************************* */
1303 /*                Header field info values for radio information             */
1304 /* ************************************************************************* */
1305 static int hf_mactime = -1;
1306 static int hf_hosttime = -1;
1307 static int hf_data_rate = -1;
1308 static int hf_channel = -1;
1309 static int hf_channel_frequency = -1;
1310 static int hf_normrssi_antsignal = -1;
1311 static int hf_dbm_antsignal = -1;
1312 static int hf_rawrssi_antsignal = -1;
1313 static int hf_normrssi_antnoise = -1;
1314 static int hf_dbm_antnoise = -1;
1315 static int hf_rawrssi_antnoise = -1;
1316 static int hf_signal_strength = -1;
1317
1318 /* Prism radio header */
1319
1320 static int hf_ieee80211_prism_msgcode = -1;
1321 static int hf_ieee80211_prism_msglen = -1;
1322 static int hf_ieee80211_prism_devname = -1;
1323 static int hf_ieee80211_prism_did = -1;
1324 static int hf_ieee80211_prism_did_type = -1;
1325 static int hf_ieee80211_prism_did_status = -1;
1326 static int hf_ieee80211_prism_did_length = -1;
1327 static int hf_ieee80211_prism_did_hosttime = -1;
1328 static int hf_ieee80211_prism_did_mactime = -1;
1329 static int hf_ieee80211_prism_did_channel = -1;
1330 static int hf_ieee80211_prism_did_rssi = -1;
1331 static int hf_ieee80211_prism_did_sq = -1;
1332 static int hf_ieee80211_prism_did_signal = -1;
1333 static int hf_ieee80211_prism_did_noise = -1;
1334 static int hf_ieee80211_prism_did_rate = -1;
1335 static int hf_ieee80211_prism_did_istx = -1;
1336 static int hf_ieee80211_prism_did_frmlen = -1;
1337 static int hf_ieee80211_prism_did_unknown = -1;
1338
1339 /* AVS WLANCAP radio header */
1340 static int hf_wlan_magic = -1;
1341 static int hf_wlan_version = -1;
1342 static int hf_wlan_length = -1;
1343 static int hf_wlan_phytype = -1;
1344 static int hf_wlan_antenna = -1;
1345 static int hf_wlan_priority = -1;
1346 static int hf_wlan_ssi_type = -1;
1347 static int hf_wlan_preamble = -1;
1348 static int hf_wlan_encoding = -1;
1349 static int hf_wlan_sequence = -1;
1350 static int hf_wlan_drops = -1;
1351 static int hf_wlan_receiver_addr = -1;
1352 static int hf_wlan_padding = -1;
1353
1354 /* ************************************************************************* */
1355 /*                Header field info values for FC-field                      */
1356 /* ************************************************************************* */
1357 static int hf_ieee80211_fc_field = -1;
1358 static int hf_ieee80211_fc_proto_version = -1;
1359 static int hf_ieee80211_fc_frame_type = -1;
1360 static int hf_ieee80211_fc_frame_subtype = -1;
1361 static int hf_ieee80211_fc_frame_type_subtype = -1;
1362
1363 static int hf_ieee80211_fc_flags = -1;
1364 static int hf_ieee80211_fc_to_ds = -1;
1365 static int hf_ieee80211_fc_from_ds = -1;
1366 static int hf_ieee80211_fc_data_ds = -1;
1367
1368 static int hf_ieee80211_fc_more_frag = -1;
1369 static int hf_ieee80211_fc_retry = -1;
1370 static int hf_ieee80211_fc_pwr_mgt = -1;
1371 static int hf_ieee80211_fc_more_data = -1;
1372 static int hf_ieee80211_fc_protected = -1;
1373 static int hf_ieee80211_fc_order = -1;
1374
1375 typedef struct retransmit_key {
1376   guint8  bssid[6];
1377   guint8  src[6];
1378   guint16 seq_control;
1379   guint   fnum;
1380 } retransmit_key;
1381
1382 static GHashTable *fc_analyse_retransmit_table = NULL;
1383 static GHashTable *fc_first_frame_table = NULL;
1384
1385 static int hf_ieee80211_fc_analysis_retransmission = -1;
1386 static int hf_ieee80211_fc_analysis_retransmission_frame = -1;
1387
1388 /* ************************************************************************* */
1389 /*                   Header values for Duration/ID field                     */
1390 /* ************************************************************************* */
1391 static int hf_ieee80211_did_duration = -1;
1392 static int hf_ieee80211_assoc_id = -1;
1393
1394 /* ************************************************************************* */
1395 /*         Header values for different address-fields (all 4 of them)        */
1396 /* ************************************************************************* */
1397 static int hf_ieee80211_addr_da = -1;  /* Destination address subfield */
1398 static int hf_ieee80211_addr_sa = -1;  /* Source address subfield */
1399 static int hf_ieee80211_addr_ra = -1;  /* Receiver address subfield */
1400 static int hf_ieee80211_addr_ta = -1;  /* Transmitter address subfield */
1401 static int hf_ieee80211_addr_bssid = -1;  /* address is bssid */
1402
1403 static int hf_ieee80211_addr = -1;  /* Source or destination address subfield */
1404
1405
1406 /* ************************************************************************* */
1407 /*                Header values for QoS control field                        */
1408 /* ************************************************************************* */
1409 static int hf_ieee80211_qos_priority = -1;
1410 static int hf_ieee80211_qos_ack_policy = -1;
1411 static int hf_ieee80211_qos_amsdu_present = -1;
1412 static int hf_ieee80211_qos_eosp = -1;
1413 static int hf_ieee80211_qos_bit4 = -1;
1414 static int hf_ieee80211_qos_txop_limit = -1;
1415 static int hf_ieee80211_qos_buf_state_indicated = -1;
1416 static int hf_ieee80211_qos_highest_pri_buf_ac = -1;
1417 static int hf_ieee80211_qos_qap_buf_load = -1;
1418 static int hf_ieee80211_qos_txop_dur_req = -1;
1419 static int hf_ieee80211_qos_queue_size = -1;
1420
1421 /* ************************************************************************* */
1422 /*                Header values for HT control field (+HTC)                  */
1423 /* ************************************************************************* */
1424 /* 802.11nD-1.10 & 802.11nD-2.0 7.1.3.5a */
1425 static int hf_ieee80211_htc = -1;
1426 static int hf_ieee80211_htc_lac = -1;
1427 static int hf_ieee80211_htc_lac_reserved = -1;
1428 static int hf_ieee80211_htc_lac_trq = -1;
1429 static int hf_ieee80211_htc_lac_mai_aseli = -1;
1430 static int hf_ieee80211_htc_lac_mai_mrq = -1;
1431 static int hf_ieee80211_htc_lac_mai_msi = -1;
1432 static int hf_ieee80211_htc_lac_mai_reserved = -1;
1433 static int hf_ieee80211_htc_lac_mfsi = -1;
1434 static int hf_ieee80211_htc_lac_mfb = -1;
1435 static int hf_ieee80211_htc_lac_asel_command = -1;
1436 static int hf_ieee80211_htc_lac_asel_data = -1;
1437 static int hf_ieee80211_htc_cal_pos = -1;
1438 static int hf_ieee80211_htc_cal_seq = -1;
1439 static int hf_ieee80211_htc_reserved1 = -1;
1440 static int hf_ieee80211_htc_csi_steering = -1;
1441 static int hf_ieee80211_htc_ndp_announcement = -1;
1442 static int hf_ieee80211_htc_reserved2 = -1;
1443 static int hf_ieee80211_htc_ac_constraint = -1;
1444 static int hf_ieee80211_htc_rdg_more_ppdu = -1;
1445
1446 /* ************************************************************************* */
1447 /*                Header values for sequence number field                    */
1448 /* ************************************************************************* */
1449 static int hf_ieee80211_frag_number = -1;
1450 static int hf_ieee80211_seq_number = -1;
1451
1452 /* ************************************************************************* */
1453 /*                   Header values for Frame Check field                     */
1454 /* ************************************************************************* */
1455 static int hf_ieee80211_fcs = -1;
1456 static int hf_ieee80211_fcs_good = -1;
1457 static int hf_ieee80211_fcs_bad = -1;
1458
1459 /* ************************************************************************* */
1460 /*                   Header values for reassembly                            */
1461 /* ************************************************************************* */
1462 static int hf_ieee80211_fragments = -1;
1463 static int hf_ieee80211_fragment = -1;
1464 static int hf_ieee80211_fragment_overlap = -1;
1465 static int hf_ieee80211_fragment_overlap_conflict = -1;
1466 static int hf_ieee80211_fragment_multiple_tails = -1;
1467 static int hf_ieee80211_fragment_too_long_fragment = -1;
1468 static int hf_ieee80211_fragment_error = -1;
1469 static int hf_ieee80211_fragment_count = -1;
1470 static int hf_ieee80211_reassembled_in = -1;
1471 static int hf_ieee80211_reassembled_length = -1;
1472
1473 static int proto_wlan_mgt = -1;
1474
1475 /* ************************************************************************* */
1476 /*                   Header values for WAVE                                  */
1477 /* ************************************************************************* */
1478
1479 static int hf_ieee80211_pst_timingquality = -1;
1480 static int hf_ieee80211_pst_providercount = -1;
1481 static int hf_ieee80211_pst_providercap =   -1;
1482 static int hf_ieee80211_pst_length =        -1;
1483 static int hf_ieee80211_pst_contents =      -1;
1484 static int hf_ieee80211_pst_acid =        -1;
1485 static int hf_ieee80211_pst_acm_length =  -1;
1486 static int hf_ieee80211_pst_acm_contents =-1;
1487 static int hf_ieee80211_pst_acf =         -1;
1488 static int hf_ieee80211_pst_priority =    -1;
1489 static int hf_ieee80211_pst_ipv6addr =    -1;
1490 static int hf_ieee80211_pst_serviceport = -1;
1491 static int hf_ieee80211_pst_addressing =  -1;
1492 static int hf_ieee80211_pst_macaddr =     -1;
1493 static int hf_ieee80211_pst_channel =     -1;
1494
1495 static int hf_ieee80211_chan_noc =        -1;
1496 static int hf_ieee80211_chan_length =     -1;
1497 static int hf_ieee80211_chan_content =    -1;
1498 static int hf_ieee80211_chan_channel =    -1;
1499 static int hf_ieee80211_chan_adapt   =    -1;
1500 static int hf_ieee80211_chan_rate    =    -1;
1501 static int hf_ieee80211_chan_tx_pow  =    -1;
1502
1503 #ifdef MESH_OVERRIDES
1504 /* ************************************************************************* */
1505 /*                   Header values for Mesh Header field                     */
1506 /* ************************************************************************* */
1507 static int hf_ieee80211_mesh_ttl = -1;
1508 static int hf_ieee80211_mesh_seq = -1;
1509 static int hf_ieee80211_mesh_flags = -1;
1510 static int hf_ieee80211_mesh_ae1 = -1;
1511 static int hf_ieee80211_mesh_ae2 = -1;
1512 static int hf_ieee80211_mesh_ae3 = -1;
1513 #endif /* MESH_OVERRIDES */
1514
1515 /* ************************************************************************* */
1516 /*                      Fixed fields found in mgt frames                     */
1517 /* ************************************************************************* */
1518 static int hf_ieee80211_fixed_parameters = -1;  /* Protocol payload for management frames */
1519
1520 static int hf_ieee80211_ff_auth_alg = -1;            /* Authentication algorithm field            */
1521 static int hf_ieee80211_ff_auth_seq = -1;            /* Authentication transaction sequence       */
1522 static int hf_ieee80211_ff_current_ap = -1;          /* Current AP MAC address                    */
1523 static int hf_ieee80211_ff_listen_ival = -1;         /* Listen interval fixed field               */
1524 static int hf_ieee80211_ff_timestamp = -1;           /* 64 bit timestamp                          */
1525 static int hf_ieee80211_ff_beacon_interval = -1;     /* 16 bit Beacon interval                    */
1526 static int hf_ieee80211_ff_assoc_id = -1;            /* 16 bit AID field                          */
1527 static int hf_ieee80211_ff_reason = -1;              /* 16 bit reason code                        */
1528 static int hf_ieee80211_ff_status_code = -1;         /* Status code                               */
1529 static int hf_ieee80211_ff_category_code = -1;       /* 8 bit Category code */
1530 static int hf_ieee80211_ff_action_code = -1;         /* 8 bit Action code */
1531 static int hf_ieee80211_ff_dialog_token = -1;        /* 8 bit Dialog token */
1532 static int hf_ieee80211_ff_wme_action_code = -1;     /* Management notification action code */
1533 static int hf_ieee80211_ff_wme_status_code = -1;     /* Management notification setup response status code */
1534 static int hf_ieee80211_ff_qos_action_code = -1;
1535 static int hf_ieee80211_ff_dls_action_code = -1;
1536 static int hf_ieee80211_ff_dst_mac_addr = -1;        /* DLS destination MAC addressi */
1537 static int hf_ieee80211_ff_src_mac_addr = -1;        /* DLS source MAC addressi */
1538 static int hf_ieee80211_ff_dls_timeout = -1;         /* DLS timeout value */
1539 static int hf_ieee80211_ff_ft_action_code = -1; /* 8 bit FT Action code */
1540 static int hf_ieee80211_ff_sta_address = -1;
1541 static int hf_ieee80211_ff_target_ap_address = -1;
1542 static int hf_ieee80211_ff_gas_comeback_delay = -1;
1543 static int hf_ieee80211_ff_gas_fragment_id = -1;
1544 static int hf_ieee80211_ff_more_gas_fragments = -1;
1545 static int hf_ieee80211_ff_query_request_length = -1;
1546 static int hf_ieee80211_ff_query_request = -1;
1547 static int hf_ieee80211_ff_query_response_length = -1;
1548 static int hf_ieee80211_ff_query_response = -1;
1549 static int hf_ieee80211_ff_anqp_info_id = -1;
1550 static int hf_ieee80211_ff_anqp_info_length = -1;
1551 static int hf_ieee80211_ff_anqp_info = -1;
1552 static int hf_ieee80211_ff_tdls_action_code = -1;
1553 static int hf_ieee80211_ff_target_channel = -1;
1554 static int hf_ieee80211_ff_regulatory_class = -1;
1555
1556 static int hf_ieee80211_ff_sa_query_action_code = -1;
1557 static int hf_ieee80211_ff_transaction_id = -1;
1558
1559 /* Vendor specific */
1560 static int hf_ieee80211_ff_marvell_action_type = -1;
1561 static int hf_ieee80211_ff_marvell_mesh_mgt_action_code = -1;
1562 static int hf_ieee80211_ff_mesh_mgt_length = -1;     /* Mesh Management length */
1563 static int hf_ieee80211_ff_mesh_mgt_mode = -1;       /* Mesh Management mode */
1564 static int hf_ieee80211_ff_mesh_mgt_ttl = -1;        /* Mesh Management TTL */
1565 static int hf_ieee80211_ff_mesh_mgt_dstcount = -1;   /* Mesh Management dst count */
1566 static int hf_ieee80211_ff_mesh_mgt_hopcount = -1;   /* Mesh Management hop count */
1567 static int hf_ieee80211_ff_mesh_mgt_rreqid = -1;     /* Mesh Management RREQ ID */
1568 static int hf_ieee80211_ff_mesh_mgt_sa = -1;         /* Mesh Management src addr */
1569 static int hf_ieee80211_ff_mesh_mgt_ssn = -1;        /* Mesh Management src sequence number */
1570 static int hf_ieee80211_ff_mesh_mgt_metric = -1;     /* Mesh Management metric */
1571 static int hf_ieee80211_ff_mesh_mgt_flags = -1;      /* Mesh Management RREQ flags */
1572 static int hf_ieee80211_ff_mesh_mgt_da = -1;         /* Mesh Management dst addr */
1573 static int hf_ieee80211_ff_mesh_mgt_dsn = -1;        /* Mesh Management dst sequence number */
1574 static int hf_ieee80211_ff_mesh_mgt_lifetime = -1;   /* Mesh Management lifetime */
1575
1576
1577 static int hf_ieee80211_ff_ba_action = -1;
1578
1579 static int hf_ieee80211_ff_block_ack_params = -1;
1580 static int hf_ieee80211_ff_block_ack_params_amsdu_permitted = -1;
1581 static int hf_ieee80211_ff_block_ack_params_policy = -1;
1582 static int hf_ieee80211_ff_block_ack_params_tid = -1;
1583 static int hf_ieee80211_ff_block_ack_params_buffer_size = -1;
1584
1585 static int hf_ieee80211_ff_block_ack_timeout = -1;
1586
1587 static int hf_ieee80211_ff_block_ack_ssc = -1;
1588 static int hf_ieee80211_ff_block_ack_ssc_fragment = -1;
1589 static int hf_ieee80211_ff_block_ack_ssc_sequence = -1;
1590
1591 static int hf_ieee80211_ff_delba_param = -1;
1592 static int hf_ieee80211_ff_delba_param_reserved = -1;
1593 static int hf_ieee80211_ff_delba_param_init = -1;
1594 static int hf_ieee80211_ff_delba_param_tid = -1;
1595
1596 static int hf_ieee80211_ff_max_reg_pwr = -1;
1597 static int hf_ieee80211_ff_measurement_pilot_int = -1;
1598 static int hf_ieee80211_ff_country_str = -1;
1599 static int hf_ieee80211_ff_max_tx_pwr = -1;
1600 static int hf_ieee80211_ff_tx_pwr_used = -1;
1601 static int hf_ieee80211_ff_transceiver_noise_floor = -1;
1602 static int hf_ieee80211_ff_channel_width = -1;
1603
1604 static int hf_ieee80211_ff_qos_info_ap = -1;
1605 static int hf_ieee80211_ff_qos_info_ap_edca_param_set_counter = -1;
1606 static int hf_ieee80211_ff_qos_info_ap_q_ack = -1;
1607 static int hf_ieee80211_ff_qos_info_ap_queue_req = -1;
1608 static int hf_ieee80211_ff_qos_info_ap_txop_request = -1;
1609 static int hf_ieee80211_ff_qos_info_ap_reserved = -1;
1610
1611 static int hf_ieee80211_ff_qos_info_sta = -1;
1612 static int hf_ieee80211_ff_qos_info_sta_ac_vo = -1;
1613 static int hf_ieee80211_ff_qos_info_sta_ac_vi = -1;
1614 static int hf_ieee80211_ff_qos_info_sta_ac_bk = -1;
1615 static int hf_ieee80211_ff_qos_info_sta_ac_be = -1;
1616 static int hf_ieee80211_ff_qos_info_sta_q_ack = -1;
1617 static int hf_ieee80211_ff_qos_info_sta_max_sp_len = -1;
1618 static int hf_ieee80211_ff_qos_info_sta_more_data_ack = -1;
1619
1620 static int hf_ieee80211_ff_sm_pwr_save = -1;
1621 static int hf_ieee80211_ff_sm_pwr_save_enabled = -1;
1622 static int hf_ieee80211_ff_sm_pwr_save_sm_mode = -1;
1623 static int hf_ieee80211_ff_sm_pwr_save_reserved = -1;
1624
1625 static int hf_ieee80211_ff_pco_phase_cntrl = -1;
1626
1627 static int hf_ieee80211_ff_psmp_param_set = -1;
1628 static int hf_ieee80211_ff_psmp_param_set_n_sta = -1;
1629 static int hf_ieee80211_ff_psmp_param_set_more_psmp = -1;
1630 static int hf_ieee80211_ff_psmp_param_set_psmp_sequence_duration = -1;
1631
1632 static int hf_ieee80211_ff_mimo_cntrl = -1;
1633 static int hf_ieee80211_ff_mimo_cntrl_nc_index = -1;
1634 static int hf_ieee80211_ff_mimo_cntrl_nr_index = -1;
1635 static int hf_ieee80211_ff_mimo_cntrl_channel_width = -1;
1636 static int hf_ieee80211_ff_mimo_cntrl_grouping = -1;
1637 static int hf_ieee80211_ff_mimo_cntrl_coefficient_size = -1;
1638 static int hf_ieee80211_ff_mimo_cntrl_codebook_info = -1;
1639 static int hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment = -1;
1640 static int hf_ieee80211_ff_mimo_cntrl_reserved = -1;
1641 static int hf_ieee80211_ff_mimo_cntrl_sounding_timestamp = -1;
1642
1643 static int hf_ieee80211_ff_ant_selection = -1;
1644 static int hf_ieee80211_ff_ant_selection_0 = -1;
1645 static int hf_ieee80211_ff_ant_selection_1 = -1;
1646 static int hf_ieee80211_ff_ant_selection_2 = -1;
1647 static int hf_ieee80211_ff_ant_selection_3 = -1;
1648 static int hf_ieee80211_ff_ant_selection_4 = -1;
1649 static int hf_ieee80211_ff_ant_selection_5 = -1;
1650 static int hf_ieee80211_ff_ant_selection_6 = -1;
1651 static int hf_ieee80211_ff_ant_selection_7 = -1;
1652
1653 static int hf_ieee80211_ff_ext_channel_switch_announcement = -1;
1654 static int hf_ieee80211_ff_ext_channel_switch_announcement_switch_mode = -1;
1655 static int hf_ieee80211_ff_ext_channel_switch_announcement_new_reg_class = -1;
1656 static int hf_ieee80211_ff_ext_channel_switch_announcement_new_chan_number = -1;
1657 static int hf_ieee80211_ff_ext_channel_switch_announcement_switch_count = -1;
1658
1659 static int hf_ieee80211_ff_ht_info = -1;
1660 static int hf_ieee80211_ff_ht_info_information_request = -1;
1661 static int hf_ieee80211_ff_ht_info_40_mhz_intolerant = -1;
1662 static int hf_ieee80211_ff_ht_info_sta_chan_width = -1;
1663 static int hf_ieee80211_ff_ht_info_reserved = -1;
1664
1665 static int hf_ieee80211_ff_ht_action = -1;
1666
1667 static int hf_ieee80211_ff_psmp_sta_info = -1;
1668 static int hf_ieee80211_ff_psmp_sta_info_type = -1;
1669 static int hf_ieee80211_ff_psmp_sta_info_dtt_start_offset = -1;
1670 static int hf_ieee80211_ff_psmp_sta_info_dtt_duration = -1;
1671 static int hf_ieee80211_ff_psmp_sta_info_sta_id = -1;
1672 static int hf_ieee80211_ff_psmp_sta_info_utt_start_offset = -1;
1673 static int hf_ieee80211_ff_psmp_sta_info_utt_duration = -1;
1674 static int hf_ieee80211_ff_psmp_sta_info_reserved_small= -1;
1675 static int hf_ieee80211_ff_psmp_sta_info_reserved_large = -1;
1676 static int hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id = -1;
1677
1678 static int hf_ieee80211_ff_mimo_csi_snr = -1;
1679
1680 #ifdef MESH_OVERRIDES
1681 static int hf_ieee80211_ff_mesh_action = -1;
1682 static int hf_ieee80211_ff_multihop_action = -1;
1683 static int hf_ieee80211_ff_mesh_flags = -1;
1684 static int hf_ieee80211_ff_mesh_ttl = -1;
1685 static int hf_ieee80211_ff_mesh_sequence = -1;
1686 static int hf_ieee80211_ff_mesh_addr4 = -1;
1687 static int hf_ieee80211_ff_mesh_addr5 = -1;
1688 static int hf_ieee80211_ff_mesh_addr6 = -1;
1689 static int hf_ieee80211_ff_selfprot_action = -1;
1690
1691 /*** Begin: Mesh Frame Format ***/
1692 static int hf_ieee80211_ff_mesh_mgt_action_ps_code = -1;/* Mesh Management path selection action code */
1693 /* NB: see above for more items */
1694 static int hf_ieee80211_ff_mesh_mgt_dest_flags = -1;     /* Mesh Management destination flags */
1695 static int hf_ieee80211_ff_mesh_mgt_srccount = -1;  /* Mesh Management src count */
1696 static int hf_ieee80211_ff_mesh_mgt_dest_do_flags = -1;  /* Mesh Management Destination Only flag */
1697 static int hf_ieee80211_ff_mesh_mgt_dest_rf_flags = -1;  /* Mesh Management Reply and Forward flag */
1698
1699
1700 /* variable header fields */
1701 static int hf_ieee80211_mesh_peering_proto = -1;
1702 static int hf_ieee80211_mesh_peering_local_link_id = -1;
1703 static int hf_ieee80211_mesh_peering_peer_link_id = -1;
1704
1705 static int hf_ieee80211_mesh_config_path_sel_protocol = -1;
1706 static int hf_ieee80211_mesh_config_path_sel_metric = -1;
1707 static int hf_ieee80211_mesh_config_congestion_control = -1;
1708 static int hf_ieee80211_mesh_config_sync_method = -1;
1709 static int hf_ieee80211_mesh_config_auth_protocol = -1;
1710 static int hf_ieee80211_mesh_config_formation_info = -1;
1711 static int hf_ieee80211_mesh_config_capability = -1;
1712 static int hf_ieee80211_mesh_id = -1;
1713 /*** End: Mesh Frame Format ***/
1714
1715 #endif /* MESH_OVERRIDES */
1716
1717 static int hf_ieee80211_ff_public_action = -1;
1718
1719 /* ************************************************************************* */
1720 /*            Flags found in the capability field (fixed field)              */
1721 /* ************************************************************************* */
1722 static int hf_ieee80211_ff_capture = -1;
1723 static int hf_ieee80211_ff_cf_ess = -1;
1724 static int hf_ieee80211_ff_cf_ibss = -1;
1725 static int hf_ieee80211_ff_cf_sta_poll = -1; /* CF pollable status for a STA            */
1726 static int hf_ieee80211_ff_cf_ap_poll = -1;  /* CF pollable status for an AP            */
1727 static int hf_ieee80211_ff_cf_privacy = -1;
1728 static int hf_ieee80211_ff_cf_preamble = -1;
1729 static int hf_ieee80211_ff_cf_pbcc = -1;
1730 static int hf_ieee80211_ff_cf_agility = -1;
1731 static int hf_ieee80211_ff_short_slot_time = -1;
1732 static int hf_ieee80211_ff_dsss_ofdm = -1;
1733 static int hf_ieee80211_ff_cf_spec_man = -1;
1734 static int hf_ieee80211_ff_cf_apsd = -1;
1735 static int hf_ieee80211_ff_cf_del_blk_ack = -1;
1736 static int hf_ieee80211_ff_cf_imm_blk_ack = -1;
1737
1738 /* ************************************************************************* */
1739 /*                       A-MSDU fields                                             */
1740 /* ************************************************************************* */
1741 static int hf_ieee80211_amsdu_msdu_header_text = -1;
1742
1743
1744 /* ************************************************************************* */
1745 /*                       Tagged value format fields                          */
1746 /* ************************************************************************* */
1747 static int hf_ieee80211_tagged_parameters = -1;  /* Fixed payload item */
1748 static int hf_ieee80211_tag = -1;
1749 static int hf_ieee80211_tag_number = -1;
1750 static int hf_ieee80211_tag_length = -1;
1751 static int hf_ieee80211_tag_interpretation = -1;
1752 static int hf_ieee80211_tag_oui = -1;
1753 static int hf_ieee80211_tag_ssid = -1;
1754 static int hf_ieee80211_tag_supp_rates = -1;
1755 static int hf_ieee80211_tag_fh_dwell_time = -1;
1756 static int hf_ieee80211_tag_fh_hop_set = -1;
1757 static int hf_ieee80211_tag_fh_hop_pattern = -1;
1758 static int hf_ieee80211_tag_fh_hop_index = -1;
1759 static int hf_ieee80211_tag_ds_param_channel = -1;
1760 static int hf_ieee80211_tag_cfp_count = -1;
1761 static int hf_ieee80211_tag_cfp_period = -1;
1762 static int hf_ieee80211_tag_cfp_max_duration = -1;
1763 static int hf_ieee80211_tag_cfp_dur_remaining = -1;
1764 static int hf_ieee80211_tim_dtim_count = -1;
1765 static int hf_ieee80211_tim_dtim_period = -1;
1766 static int hf_ieee80211_tim_bmapctl = -1;
1767 static int hf_ieee80211_tim_bmapctl_mcast = -1;
1768 static int hf_ieee80211_tim_bmapctl_offset = -1;
1769 static int hf_ieee80211_tim_partial_virtual_bitmap = -1;
1770 static int hf_ieee80211_tag_ibss_atim_window = -1;
1771 static int hf_ieee80211_tag_country_info_code = -1;
1772 static int hf_ieee80211_tag_country_info_env = -1;
1773 static int hf_ieee80211_tag_country_info_fnm = -1;
1774 static int hf_ieee80211_tag_country_info_fnm_fcn = -1;
1775 static int hf_ieee80211_tag_country_info_fnm_nc = -1;
1776 static int hf_ieee80211_tag_country_info_fnm_mtpl = -1;
1777 static int hf_ieee80211_tag_country_info_rrc = -1;
1778 static int hf_ieee80211_tag_country_info_rrc_rei = -1;
1779 static int hf_ieee80211_tag_country_info_rrc_rc = -1;
1780 static int hf_ieee80211_tag_country_info_rrc_cc = -1;
1781 static int hf_ieee80211_tag_fh_hopping_parameter_prime_radix = -1;
1782 static int hf_ieee80211_tag_fh_hopping_parameter_nb_channels = -1;
1783 static int hf_ieee80211_tag_fh_hopping_table_flag = -1;
1784 static int hf_ieee80211_tag_fh_hopping_table_number_of_sets = -1;
1785 static int hf_ieee80211_tag_fh_hopping_table_modulus = -1;
1786 static int hf_ieee80211_tag_fh_hopping_table_offset = -1;
1787 static int hf_ieee80211_tag_fh_hopping_random_table = -1;
1788 static int hf_ieee80211_tag_request = -1;
1789 static int hf_ieee80211_tag_challenge_text = -1;
1790
1791 static int hf_ieee80211_wep_iv = -1;
1792 static int hf_ieee80211_wep_iv_weak = -1;
1793 static int hf_ieee80211_tkip_extiv = -1;
1794 static int hf_ieee80211_ccmp_extiv = -1;
1795 static int hf_ieee80211_wep_key = -1;
1796 static int hf_ieee80211_wep_icv = -1;
1797
1798 static int hf_ieee80211_block_ack_request_control = -1;
1799 static int hf_ieee80211_block_ack_control = -1;
1800 static int hf_ieee80211_block_ack_control_ack_policy = -1;
1801 static int hf_ieee80211_block_ack_control_multi_tid = -1;
1802 static int hf_ieee80211_block_ack_control_compressed_bitmap = -1;
1803 static int hf_ieee80211_block_ack_control_reserved = -1;
1804
1805 static int hf_ieee80211_block_ack_control_basic_tid_info = -1;
1806 static int hf_ieee80211_block_ack_control_compressed_tid_info = -1;
1807 static int hf_ieee80211_block_ack_control_multi_tid_info = -1;
1808
1809 static int hf_ieee80211_block_ack_multi_tid_info = -1;
1810 static int hf_ieee80211_block_ack_request_type = -1;
1811 static int hf_ieee80211_block_ack_multi_tid_reserved = -1;
1812 static int hf_ieee80211_block_ack_multi_tid_value = -1;
1813 static int hf_ieee80211_block_ack_type = -1;
1814 static int hf_ieee80211_block_ack_bitmap = -1;
1815
1816 static int hf_ieee80211_tag_measure_request_measurement_mode = -1;
1817 static int hf_ieee80211_tag_measure_request_bssid = -1;
1818
1819 static int hf_ieee80211_tag_measure_request_subelement_length = -1;
1820 static int hf_ieee80211_tag_measure_request_beacon_sub_id = -1;
1821 static int hf_ieee80211_tag_measure_request_beacon_sub_ssid = -1;
1822 static int hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition = -1;
1823 static int hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset = -1;
1824 static int hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail = -1;
1825 static int hf_ieee80211_tag_measure_request_beacon_sub_request = -1;
1826 static int hf_ieee80211_tag_measure_request_beacon_unknown = -1;
1827
1828 static int hf_ieee80211_tag_measure_request_frame_request_type = -1;
1829 static int hf_ieee80211_tag_measure_request_mac_address  = -1;
1830 static int hf_ieee80211_tag_measure_request_peer_mac_address = -1;
1831 static int hf_ieee80211_tag_measure_request_group_id = -1;
1832
1833 static int hf_ieee80211_ht_cap = -1;
1834 static int hf_ieee80211_ht_vs_cap = -1;
1835 static int hf_ieee80211_ht_ldpc_coding = -1;
1836 static int hf_ieee80211_ht_chan_width = -1;
1837 static int hf_ieee80211_ht_sm_pwsave = -1;
1838 static int hf_ieee80211_ht_green = -1;
1839 static int hf_ieee80211_ht_short20 = -1;
1840 static int hf_ieee80211_ht_short40 = -1;
1841 static int hf_ieee80211_ht_tx_stbc = -1;
1842 static int hf_ieee80211_ht_rx_stbc = -1;
1843 static int hf_ieee80211_ht_delayed_block_ack = -1;
1844 static int hf_ieee80211_ht_max_amsdu = -1;
1845 static int hf_ieee80211_ht_dss_cck_40 = -1;
1846 static int hf_ieee80211_ht_psmp = -1;
1847 static int hf_ieee80211_ht_40_mhz_intolerant = -1;
1848 static int hf_ieee80211_ht_l_sig = -1;
1849
1850 static int hf_ieee80211_ampduparam = -1;
1851 static int hf_ieee80211_ampduparam_vs = -1;
1852 static int hf_ieee80211_ampduparam_mpdu = -1;
1853 static int hf_ieee80211_ampduparam_mpdu_start_spacing = -1;
1854 static int hf_ieee80211_ampduparam_reserved = -1;
1855
1856 static int hf_ieee80211_mcsset = -1;
1857 static int hf_ieee80211_mcsset_vs = -1;
1858 static int hf_ieee80211_mcsset_rx_bitmask_0to7 = -1;
1859 static int hf_ieee80211_mcsset_rx_bitmask_8to15 = -1;
1860 static int hf_ieee80211_mcsset_rx_bitmask_16to23 = -1;
1861 static int hf_ieee80211_mcsset_rx_bitmask_24to31 = -1;
1862 static int hf_ieee80211_mcsset_rx_bitmask_32 = -1;
1863 static int hf_ieee80211_mcsset_rx_bitmask_33to38 = -1;
1864 static int hf_ieee80211_mcsset_rx_bitmask_39to52 = -1;
1865 static int hf_ieee80211_mcsset_rx_bitmask_53to76 = -1;
1866 static int hf_ieee80211_mcsset_highest_data_rate = -1;
1867 static int hf_ieee80211_mcsset_tx_mcs_set_defined = -1;
1868 static int hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal = -1;
1869 static int hf_ieee80211_mcsset_tx_max_spatial_streams = -1;
1870 static int hf_ieee80211_mcsset_tx_unequal_modulation = -1;
1871
1872 static int hf_ieee80211_htex_cap = -1;
1873 static int hf_ieee80211_htex_vs_cap = -1;
1874 static int hf_ieee80211_htex_pco = -1;
1875 static int hf_ieee80211_htex_transtime = -1;
1876 static int hf_ieee80211_htex_mcs = -1;
1877 static int hf_ieee80211_htex_htc_support = -1;
1878 static int hf_ieee80211_htex_rd_responder = -1;
1879
1880 static int hf_ieee80211_txbf = -1;
1881 static int hf_ieee80211_txbf_vs = -1;
1882 static int hf_ieee80211_txbf_cap = -1;
1883 static int hf_ieee80211_txbf_rcv_ssc = -1;
1884 static int hf_ieee80211_txbf_tx_ssc = -1;
1885 static int hf_ieee80211_txbf_rcv_ndp = -1;
1886 static int hf_ieee80211_txbf_tx_ndp = -1;
1887 static int hf_ieee80211_txbf_impl_txbf = -1;
1888 static int hf_ieee80211_txbf_calib = -1;
1889 static int hf_ieee80211_txbf_expl_csi = -1;
1890 static int hf_ieee80211_txbf_expl_uncomp_fm = -1;
1891 static int hf_ieee80211_txbf_expl_comp_fm = -1;
1892 static int hf_ieee80211_txbf_expl_bf_csi = -1;
1893 static int hf_ieee80211_txbf_expl_uncomp_fm_feed = -1;
1894 static int hf_ieee80211_txbf_expl_comp_fm_feed = -1;
1895 static int hf_ieee80211_txbf_csi_num_bf_ant = -1;
1896 static int hf_ieee80211_txbf_min_group = -1;
1897 static int hf_ieee80211_txbf_uncomp_sm_bf_ant = -1;
1898 static int hf_ieee80211_txbf_comp_sm_bf_ant = -1;
1899 static int hf_ieee80211_txbf_csi_max_rows_bf = -1;
1900 static int hf_ieee80211_txbf_chan_est = -1;
1901 static int hf_ieee80211_txbf_resrv = -1;
1902
1903 /*** Begin: 802.11n D1.10 - HT Information IE  ***/
1904 static int hf_ieee80211_ht_info_primary_channel = -1;
1905
1906 static int hf_ieee80211_ht_info_delimiter1 = -1;
1907 static int hf_ieee80211_ht_info_secondary_channel_offset = -1;
1908 static int hf_ieee80211_ht_info_channel_width = -1;
1909 static int hf_ieee80211_ht_info_rifs_mode = -1;
1910 static int hf_ieee80211_ht_info_psmp_stas_only = -1;
1911 static int hf_ieee80211_ht_info_service_interval_granularity = -1;
1912
1913 static int hf_ieee80211_ht_info_delimiter2 = -1;
1914 static int hf_ieee80211_ht_info_operating_mode = -1;
1915 static int hf_ieee80211_ht_info_non_greenfield_sta_present = -1;
1916 static int hf_ieee80211_ht_info_transmit_burst_limit = -1;
1917 static int hf_ieee80211_ht_info_obss_non_ht_stas_present = -1;
1918 static int hf_ieee80211_ht_info_reserved_1 = -1;
1919
1920 static int hf_ieee80211_ht_info_delimiter3 = -1;
1921 static int hf_ieee80211_ht_info_reserved_2 = -1;
1922 static int hf_ieee80211_ht_info_dual_beacon = -1;
1923 static int hf_ieee80211_ht_info_dual_cts_protection = -1;
1924 static int hf_ieee80211_ht_info_secondary_beacon = -1;
1925 static int hf_ieee80211_ht_info_lsig_txop_protection_full_support = -1;
1926 static int hf_ieee80211_ht_info_pco_active = -1;
1927 static int hf_ieee80211_ht_info_pco_phase = -1;
1928 static int hf_ieee80211_ht_info_reserved_3 = -1;
1929 /*** End: 802.11n D1.10 - HT Information IE  ***/
1930
1931 static int hf_ieee80211_tag_secondary_channel_offset = -1;
1932
1933 static int hf_ieee80211_tag_power_constraint_local = -1;
1934
1935 static int hf_ieee80211_tag_power_capability_min = -1;
1936 static int hf_ieee80211_tag_power_capability_max = -1;
1937
1938 static int hf_ieee80211_tag_tpc_report_trsmt_pow = -1;
1939 static int hf_ieee80211_tag_tpc_report_link_mrg = -1;
1940
1941 static int hf_ieee80211_tag_supported_channels = -1;
1942 static int hf_ieee80211_tag_supported_channels_first = -1;
1943 static int hf_ieee80211_tag_supported_channels_range = -1;
1944
1945 static int hf_ieee80211_csa_channel_switch_mode = -1;
1946 static int hf_ieee80211_csa_new_channel_number = -1;
1947 static int hf_ieee80211_csa_channel_switch_count = -1;
1948
1949 static int hf_ieee80211_tag_measure_request_token = -1;
1950 static int hf_ieee80211_tag_measure_request_mode = -1;
1951 static int hf_ieee80211_tag_measure_request_mode_parallel = -1;
1952 static int hf_ieee80211_tag_measure_request_mode_enable = -1;
1953 static int hf_ieee80211_tag_measure_request_mode_request = -1;
1954 static int hf_ieee80211_tag_measure_request_mode_report = -1;
1955 static int hf_ieee80211_tag_measure_request_mode_duration_mandatory = -1;
1956 static int hf_ieee80211_tag_measure_request_mode_reserved = -1;
1957 static int hf_ieee80211_tag_measure_request_type = -1;
1958
1959 static int hf_ieee80211_tag_measure_request_channel_number = -1;
1960 static int hf_ieee80211_tag_measure_request_start_time = -1;
1961 static int hf_ieee80211_tag_measure_request_duration = -1;
1962
1963 static int hf_ieee80211_tag_measure_request_regulatory_class = -1;
1964 static int hf_ieee80211_tag_measure_request_randomization_interval = -1;
1965
1966 static int hf_ieee80211_tag_measure_report_measurement_token = -1;
1967 static int hf_ieee80211_tag_measure_report_mode = -1;
1968 static int hf_ieee80211_tag_measure_report_mode_late = -1;
1969 static int hf_ieee80211_tag_measure_report_mode_incapable = -1;
1970 static int hf_ieee80211_tag_measure_report_mode_refused = -1;
1971 static int hf_ieee80211_tag_measure_report_mode_reserved = -1;
1972 static int hf_ieee80211_tag_measure_report_type = -1;
1973 static int hf_ieee80211_tag_measure_report_channel_number = -1;
1974 static int hf_ieee80211_tag_measure_report_start_time = -1;
1975 static int hf_ieee80211_tag_measure_report_duration = -1;
1976
1977 static int hf_ieee80211_tag_measure_basic_map_field = -1;
1978 static int hf_ieee80211_tag_measure_map_field_bss = -1;
1979 static int hf_ieee80211_tag_measure_map_field_odfm = -1;
1980 static int hf_ieee80211_tag_measure_map_field_unident_signal = -1;
1981 static int hf_ieee80211_tag_measure_map_field_radar = -1;
1982 static int hf_ieee80211_tag_measure_map_field_unmeasured = -1;
1983 static int hf_ieee80211_tag_measure_map_field_reserved = -1;
1984
1985 static int hf_ieee80211_tag_measure_cca_busy_fraction = -1;
1986
1987 static int hf_ieee80211_tag_measure_rpi_histogram_report = -1;
1988 static int hf_ieee80211_tag_measure_rpi_histogram_report_0 = -1;
1989 static int hf_ieee80211_tag_measure_rpi_histogram_report_1 = -1;
1990 static int hf_ieee80211_tag_measure_rpi_histogram_report_2 = -1;
1991 static int hf_ieee80211_tag_measure_rpi_histogram_report_3 = -1;
1992 static int hf_ieee80211_tag_measure_rpi_histogram_report_4 = -1;
1993 static int hf_ieee80211_tag_measure_rpi_histogram_report_5 = -1;
1994 static int hf_ieee80211_tag_measure_rpi_histogram_report_6 = -1;
1995 static int hf_ieee80211_tag_measure_rpi_histogram_report_7 = -1;
1996
1997 static int hf_ieee80211_tag_measure_report_regulatory_class = -1;
1998 static int hf_ieee80211_tag_measure_report_channel_load = -1;
1999 static int hf_ieee80211_tag_measure_report_frame_info = -1;
2000 static int hf_ieee80211_tag_measure_report_frame_info_phy_type = -1;
2001 static int hf_ieee80211_tag_measure_report_frame_info_frame_type = -1;
2002 static int hf_ieee80211_tag_measure_report_rcpi = -1;
2003 static int hf_ieee80211_tag_measure_report_rsni = -1;
2004 static int hf_ieee80211_tag_measure_report_bssid = -1;
2005 static int hf_ieee80211_tag_measure_report_ant_id = -1;
2006 static int hf_ieee80211_tag_measure_report_anpi = -1;
2007 static int hf_ieee80211_tag_measure_report_ipi_density_0 = -1;
2008 static int hf_ieee80211_tag_measure_report_ipi_density_1 = -1;
2009 static int hf_ieee80211_tag_measure_report_ipi_density_2 = -1;
2010 static int hf_ieee80211_tag_measure_report_ipi_density_3 = -1;
2011 static int hf_ieee80211_tag_measure_report_ipi_density_4 = -1;
2012 static int hf_ieee80211_tag_measure_report_ipi_density_5 = -1;
2013 static int hf_ieee80211_tag_measure_report_ipi_density_6 = -1;
2014 static int hf_ieee80211_tag_measure_report_ipi_density_7 = -1;
2015 static int hf_ieee80211_tag_measure_report_ipi_density_8 = -1;
2016 static int hf_ieee80211_tag_measure_report_ipi_density_9 = -1;
2017 static int hf_ieee80211_tag_measure_report_ipi_density_10 = -1;
2018 static int hf_ieee80211_tag_measure_report_parent_tsf = -1;
2019
2020 static int hf_ieee80211_tag_quiet_count = -1;
2021 static int hf_ieee80211_tag_quiet_period = -1;
2022 static int hf_ieee80211_tag_quiet_duration = -1;
2023 static int hf_ieee80211_tag_quiet_offset = -1;
2024
2025 static int hf_ieee80211_tag_dfs_owner = -1;
2026 static int hf_ieee80211_tag_dfs_recovery_interval = -1;
2027 static int hf_ieee80211_tag_dfs_channel_map = -1;
2028 static int hf_ieee80211_tag_dfs_channel_number = -1;
2029 static int hf_ieee80211_tag_dfs_map = -1;
2030
2031 static int hf_ieee80211_tag_erp_info = -1;
2032 static int hf_ieee80211_tag_erp_info_erp_present = -1;
2033 static int hf_ieee80211_tag_erp_info_use_protection = -1;
2034 static int hf_ieee80211_tag_erp_info_barker_preamble_mode = -1;
2035 static int hf_ieee80211_tag_erp_info_reserved = -1;
2036
2037 static int hf_ieee80211_tag_extended_capabilities = -1;
2038 static int hf_ieee80211_tag_extended_capabilities_b0 = -1;
2039 static int hf_ieee80211_tag_extended_capabilities_b1 = -1;
2040 static int hf_ieee80211_tag_extended_capabilities_b2 = -1;
2041 static int hf_ieee80211_tag_extended_capabilities_b3 = -1;
2042 static int hf_ieee80211_tag_extended_capabilities_b4 = -1;
2043 static int hf_ieee80211_tag_extended_capabilities_b6 = -1;
2044 static int hf_ieee80211_tag_extended_capabilities_b28 = -1;
2045 static int hf_ieee80211_tag_extended_capabilities_b29 = -1;
2046 static int hf_ieee80211_tag_extended_capabilities_b30 = -1;
2047 static int hf_ieee80211_tag_extended_capabilities_b37 = -1;
2048 static int hf_ieee80211_tag_extended_capabilities_b38 = -1;
2049 static int hf_ieee80211_tag_extended_capabilities_b39 = -1;
2050 static int hf_ieee80211_tag_extended_capabilities_b40 = -1;
2051 static int hf_ieee80211_tag_extended_capabilities_serv_int_granularity = -1;
2052
2053 static int hf_ieee80211_tag_cisco_ccx1_unknown = -1;
2054 static int hf_ieee80211_tag_cisco_ccx1_name = -1;
2055 static int hf_ieee80211_tag_cisco_ccx1_clients = -1;
2056
2057 static int hf_ieee80211_tag_neighbor_report_bssid = -1;
2058 static int hf_ieee80211_tag_neighbor_report_bssid_info = -1;
2059 static int hf_ieee80211_tag_neighbor_report_bssid_info_reachability = -1;
2060 static int hf_ieee80211_tag_neighbor_report_bssid_info_security = -1;
2061 static int hf_ieee80211_tag_neighbor_report_bssid_info_key_scope = -1;
2062 /*static int hf_ieee80211_tag_neighbor_report_bssid_info_capability = -1; */ /* TODO Make this the parent tree item */
2063 static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng = -1;
2064 static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos = -1;
2065 static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd = -1;
2066 static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt = -1;
2067 static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback = -1;
2068 static int hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback = -1;
2069 static int hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain = -1;
2070 static int hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput = -1;
2071 static int hf_ieee80211_tag_neighbor_report_bssid_info_reserved = -1;
2072 static int hf_ieee80211_tag_neighbor_report_reg_class = -1;
2073 static int hf_ieee80211_tag_neighbor_report_channel_number = -1;
2074 static int hf_ieee80211_tag_neighbor_report_phy_type = -1;
2075
2076 static int hf_ieee80211_tag_supported_reg_classes_current = -1;
2077 static int hf_ieee80211_tag_supported_reg_classes_alternate = -1;
2078
2079 /* IEEE Std 802.11r-2008 7.3.2.47 */
2080 static int hf_ieee80211_tag_mobility_domain_mdid = -1;
2081 static int hf_ieee80211_tag_mobility_domain_ft_capab = -1;
2082 static int hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds = -1;
2083 static int hf_ieee80211_tag_mobility_domain_ft_capab_resource_req = -1;
2084
2085 /* IEEE Std 802.11r-2008 7.3.2.48 */
2086 static int hf_ieee80211_tag_ft_mic_control = -1;
2087 static int hf_ieee80211_tag_ft_element_count = -1;
2088 static int hf_ieee80211_tag_ft_mic = -1;
2089 static int hf_ieee80211_tag_ft_anonce = -1;
2090 static int hf_ieee80211_tag_ft_snonce = -1;
2091 static int hf_ieee80211_tag_ft_subelem_id = -1;
2092 static int hf_ieee80211_tag_ft_subelem_len = -1;
2093 static int hf_ieee80211_tag_ft_subelem_data = -1;
2094 static int hf_ieee80211_tag_ft_subelem_r1kh_id = -1;
2095 static int hf_ieee80211_tag_ft_subelem_gtk_key_info = -1;
2096 static int hf_ieee80211_tag_ft_subelem_gtk_key_id = -1;
2097 static int hf_ieee80211_tag_ft_subelem_gtk_key_length = -1;
2098 static int hf_ieee80211_tag_ft_subelem_gtk_rsc = -1;
2099 static int hf_ieee80211_tag_ft_subelem_gtk_key = -1;
2100 static int hf_ieee80211_tag_ft_subelem_r0kh_id = -1;
2101 static int hf_ieee80211_tag_ft_subelem_igtk_key_id = -1;
2102 static int hf_ieee80211_tag_ft_subelem_igtk_ipn = -1;
2103 static int hf_ieee80211_tag_ft_subelem_igtk_key_length = -1;
2104 static int hf_ieee80211_tag_ft_subelem_igtk_key = -1;
2105
2106 /* IEEE Std 802.11w-2009 7.3.2.55 */
2107 static int hf_ieee80211_tag_mmie_keyid = -1;
2108 static int hf_ieee80211_tag_mmie_ipn = -1;
2109 static int hf_ieee80211_tag_mmie_mic = -1;
2110
2111 /* IEEE P802.11u/D10.0, 7.3.2.91 */
2112 static int hf_ieee80211_tag_adv_proto_resp_len_limit = -1;
2113 static int hf_ieee80211_tag_adv_proto_pame_bi = -1;
2114 static int hf_ieee80211_tag_adv_proto_id = -1;
2115
2116 /* 802.11n 7.3.2.48 */
2117 static int hf_ieee80211_hta_cap = -1;
2118 static int hf_ieee80211_hta_ext_chan_offset = -1;
2119 static int hf_ieee80211_hta_rec_tx_width = -1;
2120 static int hf_ieee80211_hta_rifs_mode = -1;
2121 static int hf_ieee80211_hta_controlled_access = -1;
2122 static int hf_ieee80211_hta_service_interval = -1;
2123 static int hf_ieee80211_hta_operating_mode = -1;
2124 static int hf_ieee80211_hta_non_gf_devices = -1;
2125 static int hf_ieee80211_hta_basic_stbc_mcs = -1;
2126 static int hf_ieee80211_hta_dual_stbc_protection = -1;
2127 static int hf_ieee80211_hta_secondary_beacon = -1;
2128 static int hf_ieee80211_hta_lsig_txop_protection = -1;
2129 static int hf_ieee80211_hta_pco_active = -1;
2130 static int hf_ieee80211_hta_pco_phase = -1;
2131
2132 static int hf_ieee80211_antsel = -1;
2133 static int hf_ieee80211_antsel_vs = -1;
2134 static int hf_ieee80211_antsel_b0 = -1;
2135 static int hf_ieee80211_antsel_b1 = -1;
2136 static int hf_ieee80211_antsel_b2 = -1;
2137 static int hf_ieee80211_antsel_b3 = -1;
2138 static int hf_ieee80211_antsel_b4 = -1;
2139 static int hf_ieee80211_antsel_b5 = -1;
2140 static int hf_ieee80211_antsel_b6 = -1;
2141 static int hf_ieee80211_antsel_b7 = -1;
2142
2143 static int hf_ieee80211_rsn_version = -1;
2144 static int hf_ieee80211_rsn_gcs = -1;
2145 static int hf_ieee80211_rsn_gcs_oui = -1;
2146 static int hf_ieee80211_rsn_gcs_type = -1;
2147 static int hf_ieee80211_rsn_gcs_80211_type = -1;
2148 static int hf_ieee80211_rsn_pcs_count = -1;
2149 static int hf_ieee80211_rsn_pcs_list = -1;
2150 static int hf_ieee80211_rsn_pcs = -1;
2151 static int hf_ieee80211_rsn_pcs_oui = -1;
2152 static int hf_ieee80211_rsn_pcs_80211_type = -1;
2153 static int hf_ieee80211_rsn_pcs_type = -1;
2154 static int hf_ieee80211_rsn_akms_count = -1;
2155 static int hf_ieee80211_rsn_akms_list = -1;
2156 static int hf_ieee80211_rsn_akms = -1;
2157 static int hf_ieee80211_rsn_akms_oui = -1;
2158 static int hf_ieee80211_rsn_akms_80211_type = -1;
2159 static int hf_ieee80211_rsn_akms_type = -1;
2160 static int hf_ieee80211_rsn_cap = -1;
2161 static int hf_ieee80211_rsn_cap_preauth = -1;
2162 static int hf_ieee80211_rsn_cap_no_pairwise = -1;
2163 static int hf_ieee80211_rsn_cap_ptksa_replay_counter = -1;
2164 static int hf_ieee80211_rsn_cap_gtksa_replay_counter = -1;
2165 static int hf_ieee80211_rsn_cap_mfpr = -1;
2166 static int hf_ieee80211_rsn_cap_mfpc = -1;
2167 static int hf_ieee80211_rsn_cap_peerkey = -1;
2168 static int hf_ieee80211_rsn_pmkid_count = -1;
2169 static int hf_ieee80211_rsn_pmkid_list = -1;
2170 static int hf_ieee80211_rsn_pmkid = -1;
2171 static int hf_ieee80211_rsn_gmcs = -1;
2172 static int hf_ieee80211_rsn_gmcs_oui = -1;
2173 static int hf_ieee80211_rsn_gmcs_type = -1;
2174 static int hf_ieee80211_rsn_gmcs_80211_type = -1;
2175
2176 static int hf_ieee80211_wfa_ie_type = -1;
2177 static int hf_ieee80211_wfa_ie_wpa_version = -1;
2178 static int hf_ieee80211_wfa_ie_wpa_mcs = -1;
2179 static int hf_ieee80211_wfa_ie_wpa_mcs_oui = -1;
2180 static int hf_ieee80211_wfa_ie_wpa_mcs_type = -1;
2181 static int hf_ieee80211_wfa_ie_wpa_mcs_wfa_type = -1;
2182 static int hf_ieee80211_wfa_ie_wpa_ucs_count = -1;
2183 static int hf_ieee80211_wfa_ie_wpa_ucs_list = -1;
2184 static int hf_ieee80211_wfa_ie_wpa_ucs = -1;
2185 static int hf_ieee80211_wfa_ie_wpa_ucs_oui = -1;
2186 static int hf_ieee80211_wfa_ie_wpa_ucs_wfa_type = -1;
2187 static int hf_ieee80211_wfa_ie_wpa_ucs_type = -1;
2188 static int hf_ieee80211_wfa_ie_wpa_akms_count = -1;
2189 static int hf_ieee80211_wfa_ie_wpa_akms_list = -1;
2190 static int hf_ieee80211_wfa_ie_wpa_akms = -1;
2191 static int hf_ieee80211_wfa_ie_wpa_akms_oui = -1;
2192 static int hf_ieee80211_wfa_ie_wpa_akms_wfa_type = -1;
2193 static int hf_ieee80211_wfa_ie_wpa_akms_type = -1;
2194 static int hf_ieee80211_wfa_ie_wme_subtype = -1;
2195 static int hf_ieee80211_wfa_ie_wme_version = -1;
2196 static int hf_ieee80211_wfa_ie_wme_qos_info = -1;
2197 static int hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length = -1;
2198 static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be = -1;
2199 static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk = -1;
2200 static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi = -1;
2201 static int hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo = -1;
2202 static int hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved = -1;
2203 static int hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd = -1;
2204 static int hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count = -1;
2205 static int hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved = -1;
2206 static int hf_ieee80211_wfa_ie_wme_reserved = -1;
2207 static int hf_ieee80211_wfa_ie_wme_ac_parameters = -1;
2208 static int hf_ieee80211_wfa_ie_wme_acp_aci_aifsn = -1;
2209 static int hf_ieee80211_wfa_ie_wme_acp_aci = -1;
2210 static int hf_ieee80211_wfa_ie_wme_acp_acm = -1;
2211 static int hf_ieee80211_wfa_ie_wme_acp_aifsn = -1;
2212 static int hf_ieee80211_wfa_ie_wme_acp_reserved = -1;
2213 static int hf_ieee80211_wfa_ie_wme_acp_ecw = -1;
2214 static int hf_ieee80211_wfa_ie_wme_acp_ecw_max = -1;
2215 static int hf_ieee80211_wfa_ie_wme_acp_ecw_min = -1;
2216 static int hf_ieee80211_wfa_ie_wme_acp_txop_limit = -1;
2217 static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo = -1;
2218 static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid = -1;
2219 static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction = -1;
2220 static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb = -1;
2221 static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up = -1;
2222 static int hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved = -1;
2223 static int hf_ieee80211_wfa_ie_wme_tspec_nor_msdu = -1;
2224 static int hf_ieee80211_wfa_ie_wme_tspec_max_msdu = -1;
2225 static int hf_ieee80211_wfa_ie_wme_tspec_min_srv = -1;
2226 static int hf_ieee80211_wfa_ie_wme_tspec_max_srv = -1;
2227 static int hf_ieee80211_wfa_ie_wme_tspec_inact_int = -1;
2228 static int hf_ieee80211_wfa_ie_wme_tspec_susp_int = -1;
2229 static int hf_ieee80211_wfa_ie_wme_tspec_srv_start = -1;
2230 static int hf_ieee80211_wfa_ie_wme_tspec_min_data = -1;
2231 static int hf_ieee80211_wfa_ie_wme_tspec_mean_data = -1;
2232 static int hf_ieee80211_wfa_ie_wme_tspec_peak_data = -1;
2233 static int hf_ieee80211_wfa_ie_wme_tspec_burst_size = -1;
2234 static int hf_ieee80211_wfa_ie_wme_tspec_delay_bound = -1;
2235 static int hf_ieee80211_wfa_ie_wme_tspec_min_phy = -1;
2236 static int hf_ieee80211_wfa_ie_wme_tspec_surplus = -1;
2237 static int hf_ieee80211_wfa_ie_wme_tspec_medium = -1;
2238
2239 static int hf_ieee80211_aironet_ie_type = -1;
2240 static int hf_ieee80211_aironet_ie_version = -1;
2241 static int hf_ieee80211_aironet_ie_data = -1;
2242 static int hf_ieee80211_aironet_ie_qos_unk1 = -1;
2243 static int hf_ieee80211_aironet_ie_qos_paramset = -1;
2244 static int hf_ieee80211_aironet_ie_qos_val = -1;
2245
2246 static int hf_ieee80211_marvell_ie_type = -1;
2247 static int hf_ieee80211_marvell_ie_mesh_subtype = -1;
2248 static int hf_ieee80211_marvell_ie_mesh_version = -1;
2249 static int hf_ieee80211_marvell_ie_mesh_active_proto_id = -1;
2250 static int hf_ieee80211_marvell_ie_mesh_active_metric_id = -1;
2251 static int hf_ieee80211_marvell_ie_mesh_cap = -1;
2252 static int hf_ieee80211_marvell_ie_data = -1;
2253
2254 static int hf_ieee80211_atheros_ie_type = -1;
2255 static int hf_ieee80211_atheros_ie_subtype = -1;
2256 static int hf_ieee80211_atheros_ie_version = -1;
2257 static int hf_ieee80211_atheros_ie_cap_f_turbop = -1;
2258 static int hf_ieee80211_atheros_ie_cap_f_comp = -1;
2259 static int hf_ieee80211_atheros_ie_cap_f_ff = -1;
2260 static int hf_ieee80211_atheros_ie_cap_f_xr = -1;
2261 static int hf_ieee80211_atheros_ie_cap_f_ar = -1;
2262 static int hf_ieee80211_atheros_ie_cap_f_burst = -1;
2263 static int hf_ieee80211_atheros_ie_cap_f_wme = -1;
2264 static int hf_ieee80211_atheros_ie_cap_f_boost = -1;
2265 static int hf_ieee80211_atheros_ie_advcap_cap = -1;
2266 static int hf_ieee80211_atheros_ie_advcap_defkey = -1;
2267 static int hf_ieee80211_atheros_ie_xr_info = -1;
2268 static int hf_ieee80211_atheros_ie_xr_base_bssid = -1;
2269 static int hf_ieee80211_atheros_ie_xr_xr_bssid = -1;
2270 static int hf_ieee80211_atheros_ie_xr_xr_beacon = -1;
2271 static int hf_ieee80211_atheros_ie_xr_base_cap = -1;
2272 static int hf_ieee80211_atheros_ie_xr_xr_cap = -1;
2273 static int hf_ieee80211_atheros_ie_data = -1;
2274
2275 /*QBSS - Version 1,2,802.11e*/
2276
2277 static int hf_ieee80211_qbss2_cal = -1;
2278 static int hf_ieee80211_qbss2_gl = -1;
2279 static int hf_ieee80211_qbss_cu = -1;
2280 static int hf_ieee80211_qbss2_cu = -1;
2281 static int hf_ieee80211_qbss_scount = -1;
2282 static int hf_ieee80211_qbss2_scount = -1;
2283 static int hf_ieee80211_qbss_version = -1;
2284 static int hf_ieee80211_qbss_adc = -1;
2285
2286 static int hf_ieee80211_tsinfo = -1;
2287 static int hf_ieee80211_tsinfo_type = -1;
2288 static int hf_ieee80211_tsinfo_tsid = -1;
2289 static int hf_ieee80211_tsinfo_dir = -1;
2290 static int hf_ieee80211_tsinfo_access = -1;
2291 static int hf_ieee80211_tsinfo_agg = -1;
2292 static int hf_ieee80211_tsinfo_apsd = -1;
2293 static int hf_ieee80211_tsinfo_up = -1;
2294 static int hf_ieee80211_tsinfo_ack = -1;
2295 static int hf_ieee80211_tsinfo_sched = -1;
2296 static int hf_ieee80211_tsinfo_rsv = -1;
2297 static int hf_ieee80211_tspec_nor_msdu = -1;
2298 static int hf_ieee80211_tspec_max_msdu = -1;
2299 static int hf_ieee80211_tspec_min_srv = -1;
2300 static int hf_ieee80211_tspec_max_srv = -1;
2301 static int hf_ieee80211_tspec_inact_int = -1;
2302 static int hf_ieee80211_tspec_susp_int = -1;
2303 static int hf_ieee80211_tspec_srv_start = -1;
2304 static int hf_ieee80211_tspec_min_data = -1;
2305 static int hf_ieee80211_tspec_mean_data = -1;
2306 static int hf_ieee80211_tspec_peak_data = -1;
2307 static int hf_ieee80211_tspec_burst_size = -1;
2308 static int hf_ieee80211_tspec_delay_bound = -1;
2309 static int hf_ieee80211_tspec_min_phy = -1;
2310 static int hf_ieee80211_tspec_surplus = -1;
2311 static int hf_ieee80211_tspec_medium = -1;
2312 static int hf_ieee80211_ts_delay = -1;
2313 static int hf_ieee80211_tclas_process = -1;
2314 static int hf_ieee80211_tag_qos_cap_qos_info = -1;
2315 static int hf_ieee80211_tag_ext_supp_rates = -1;
2316 static int hf_ieee80211_sched_info = -1;
2317 static int hf_ieee80211_sched_info_agg = -1;
2318 static int hf_ieee80211_sched_info_tsid = -1;
2319 static int hf_ieee80211_sched_info_dir = -1;
2320 static int hf_ieee80211_sched_srv_start = -1;
2321 static int hf_ieee80211_sched_srv_int = -1;
2322 static int hf_ieee80211_sched_spec_int = -1;
2323 static int hf_ieee80211_action = -1;
2324 static int hf_ieee80211_tclas_up = -1;
2325 static int hf_ieee80211_tclas_class_type = -1;
2326 static int hf_ieee80211_tclas_class_mask = -1;
2327 static int hf_ieee80211_tclas_src_mac_addr = -1;
2328 static int hf_ieee80211_tclas_dst_mac_addr = -1;
2329 static int hf_ieee80211_tclas_ether_type = -1;
2330 static int hf_ieee80211_tclas_version = -1;
2331 static int hf_ieee80211_tclas_ipv4_src = -1;
2332 static int hf_ieee80211_tclas_ipv4_dst = -1;
2333 static int hf_ieee80211_tclas_src_port = -1;
2334 static int hf_ieee80211_tclas_dst_port = -1;
2335 static int hf_ieee80211_tclas_dscp = -1;
2336 static int hf_ieee80211_tclas_protocol = -1;
2337 static int hf_ieee80211_tclas_ipv6_src = -1;
2338 static int hf_ieee80211_tclas_ipv6_dst = -1;
2339 static int hf_ieee80211_tclas_flow = -1;
2340 static int hf_ieee80211_tclas_tag_type = -1;
2341
2342 static int hf_ieee80211_aruba = -1;
2343 static int hf_ieee80211_aruba_hb_seq = -1;
2344 static int hf_ieee80211_aruba_mtu = -1;
2345
2346 static int hf_ieee80211_tag_vendor_oui_type = -1;
2347
2348 /* IEEE Std 802.11z-2010 7.3.2.62 */
2349 static int hf_ieee80211_tag_link_id_bssid = -1;
2350 static int hf_ieee80211_tag_link_id_init_sta = -1;
2351 static int hf_ieee80211_tag_link_id_resp_sta = -1;
2352
2353 /* IEEE Std 802.11z-2010 7.3.2.63 */
2354 static int hf_ieee80211_tag_wakeup_schedule_offset = -1;
2355 static int hf_ieee80211_tag_wakeup_schedule_interval = -1;
2356 static int hf_ieee80211_tag_wakeup_schedule_awake_window_slots = -1;
2357 static int hf_ieee80211_tag_wakeup_schedule_max_awake_dur = -1;
2358 static int hf_ieee80211_tag_wakeup_schedule_idle_count = -1;
2359
2360 /* IEEE Std 802.11z-2010 7.3.2.64 */
2361 static int hf_ieee80211_tag_channel_switch_timing_switch_time = -1;
2362 static int hf_ieee80211_tag_channel_switch_timing_switch_timeout = -1;
2363
2364 /* IEEE Std 802.11z-2010 7.3.2.65 */
2365 static int hf_ieee80211_tag_pti_control_tid = -1;
2366 static int hf_ieee80211_tag_pti_control_sequence_control = -1;
2367
2368 /* IEEE Std 802.11z-2010 7.3.2.66 */
2369 static int hf_ieee80211_tag_pu_buffer_status_ac_bk = -1;
2370 static int hf_ieee80211_tag_pu_buffer_status_ac_be = -1;
2371 static int hf_ieee80211_tag_pu_buffer_status_ac_vi = -1;
2372 static int hf_ieee80211_tag_pu_buffer_status_ac_vo = -1;
2373
2374 /* IEEE Std 802.11r-2008 7.3.2.49 */
2375 static int hf_ieee80211_tag_timeout_int_type = -1;
2376 static int hf_ieee80211_tag_timeout_int_value = -1;
2377
2378 /* Ethertype 89-0d */
2379 static int hf_ieee80211_data_encap_payload_type = -1;
2380
2381 /* ************************************************************************* */
2382 /*                               Protocol trees                              */
2383 /* ************************************************************************* */
2384 static gint ett_80211 = -1;
2385 static gint ett_proto_flags = -1;
2386 static gint ett_cap_tree = -1;
2387 static gint ett_fc_tree = -1;
2388 static gint ett_cntrl_wrapper_fc = -1;
2389 static gint ett_cntrl_wrapper_payload = -1;
2390 static gint ett_fragments = -1;
2391 static gint ett_fragment = -1;
2392 static gint ett_block_ack = -1;
2393 static gint ett_ath_cap_tree = -1;
2394
2395
2396 static gint ett_80211_mgt = -1;
2397 static gint ett_fixed_parameters = -1;
2398 static gint ett_tagged_parameters = -1;
2399 static gint ett_tag_bmapctl_tree = -1;
2400 static gint ett_tag_country_fnm_tree = -1;
2401 static gint ett_tag_country_rcc_tree = -1;
2402 static gint ett_qos_parameters = -1;
2403 static gint ett_qos_ps_buf_state = -1;
2404 static gint ett_wep_parameters = -1;
2405 #ifdef MESH_OVERRIDES
2406 static gint ett_msh_parameters = -1;
2407 static gint ett_msh_dest_flags_tree = -1;
2408 #endif /* MESH_OVERRIDES */
2409
2410 static gint ett_rsn_gcs_tree = -1;
2411 static gint ett_rsn_pcs_tree = -1;
2412 static gint ett_rsn_sub_pcs_tree = -1;
2413 static gint ett_rsn_akms_tree = -1;
2414 static gint ett_rsn_sub_akms_tree = -1;
2415 static gint ett_rsn_cap_tree = -1;
2416 static gint ett_rsn_pmkid_tree = -1;
2417 static gint ett_rsn_gmcs_tree = -1;
2418
2419 static gint ett_wpa_mcs_tree = -1;
2420 static gint ett_wpa_ucs_tree = -1;
2421 static gint ett_wpa_sub_ucs_tree = -1;
2422 static gint ett_wpa_akms_tree = -1;
2423 static gint ett_wpa_sub_akms_tree = -1;
2424 static gint ett_wme_ac = -1;
2425 static gint ett_wme_aci_aifsn = -1;
2426 static gint ett_wme_ecw = -1;
2427 static gint ett_wme_qos_info = -1;
2428
2429 static gint ett_ht_cap_tree = -1;
2430 static gint ett_ampduparam_tree = -1;
2431 static gint ett_mcsset_tree = -1;
2432 static gint ett_mcsbit_tree = -1;
2433 static gint ett_htex_cap_tree = -1;
2434 static gint ett_txbf_tree = -1;
2435 static gint ett_antsel_tree = -1;
2436 static gint ett_hta_cap_tree = -1;
2437 static gint ett_hta_cap1_tree = -1;
2438 static gint ett_hta_cap2_tree = -1;
2439 static gint ett_htc_tree = -1;
2440
2441 static gint ett_ht_info_delimiter1_tree = -1;
2442 static gint ett_ht_info_delimiter2_tree = -1;
2443 static gint ett_ht_info_delimiter3_tree = -1;
2444
2445 static gint ett_tag_measure_request_mode_tree = -1;
2446 static gint ett_tag_measure_request_type_tree = -1;
2447 static gint ett_tag_measure_report_mode_tree = -1;
2448 static gint ett_tag_measure_report_type_tree = -1;
2449 static gint ett_tag_measure_report_basic_map_tree = -1;
2450 static gint ett_tag_measure_report_rpi_tree = -1;
2451 static gint ett_tag_measure_report_frame_tree = -1;
2452 static gint ett_tag_dfs_map_tree = -1;
2453 static gint ett_tag_erp_info_tree = -1;
2454 static gint ett_tag_ex_cap = -1;
2455
2456 static gint ett_tag_supported_channels = -1;
2457
2458 static gint ett_tag_neighbor_report_bssid_info_tree = -1;
2459 static gint ett_tag_neighbor_report_bssid_info_capability_tree = -1;
2460 static gint ett_tag_neighbor_report_sub_tag_tree = -1;
2461
2462 static gint ett_ff_ba_param_tree = -1;
2463 static gint ett_ff_ba_ssc_tree = -1;
2464 static gint ett_ff_delba_param_tree = -1;
2465 static gint ett_ff_qos_info = -1;
2466 static gint ett_ff_sm_pwr_save = -1;
2467 static gint ett_ff_psmp_param_set = -1;
2468 static gint ett_ff_mimo_cntrl = -1;
2469 static gint ett_ff_ant_sel = -1;
2470 static gint ett_mimo_report = -1;
2471 static gint ett_ff_chan_switch_announce = -1;
2472 static gint ett_ff_ht_info = -1;
2473 static gint ett_ff_psmp_sta_info = -1;
2474
2475 static gint ett_msdu_aggregation_parent_tree = -1;
2476 static gint ett_msdu_aggregation_subframe_tree = -1;
2477
2478 /***  Begin: WAVE Service information element Dissection - IEEE 802.11p Draft 4.0 ***/
2479 static gint ett_pst_tree = -1;
2480 static gint ett_pst_cap_tree = -1;
2481 static gint ett_chan_noc_tree = -1;
2482 static gint ett_wave_chnl_tree = -1;
2483
2484 /***  End: WAVE Service information element Dissection - IEEE 802.11p Draft 4.0 ***/
2485
2486 static gint ett_80211_mgt_ie = -1;
2487 static gint ett_tsinfo_tree = -1;
2488 static gint ett_sched_tree = -1;
2489
2490 static gint ett_fcs = -1;
2491
2492 static gint ett_radio = -1;
2493 static gint ett_prism = -1;
2494 static gint ett_prism_did = -1;
2495
2496 static gint ett_adv_proto = -1;
2497 static gint ett_adv_proto_tuple = -1;
2498 static gint ett_gas_query = -1;
2499 static gint ett_gas_anqp = -1;
2500
2501 static const fragment_items frag_items = {
2502   &ett_fragment,
2503   &ett_fragments,
2504   &hf_ieee80211_fragments,
2505   &hf_ieee80211_fragment,
2506   &hf_ieee80211_fragment_overlap,
2507   &hf_ieee80211_fragment_overlap_conflict,
2508   &hf_ieee80211_fragment_multiple_tails,
2509   &hf_ieee80211_fragment_too_long_fragment,
2510   &hf_ieee80211_fragment_error,
2511   &hf_ieee80211_fragment_count,
2512   &hf_ieee80211_reassembled_in,
2513   &hf_ieee80211_reassembled_length,
2514   "fragments"
2515 };
2516
2517 static enum_val_t wlan_ignore_wep_options[] = {
2518   { "no",         "No",               WLAN_IGNORE_WEP_NO    },
2519   { "without_iv", "Yes - without IV", WLAN_IGNORE_WEP_WO_IV },
2520   { "with_iv",    "Yes - with IV",    WLAN_IGNORE_WEP_W_IV  },
2521   { NULL,         NULL,               0                     }
2522 };
2523
2524 static dissector_handle_t ieee80211_handle;
2525 static dissector_handle_t llc_handle;
2526 static dissector_handle_t ipx_handle;
2527 static dissector_handle_t eth_withoutfcs_handle;
2528 static dissector_handle_t data_handle;
2529 static dissector_handle_t wlancap_handle;
2530
2531 static int wlan_tap = -1;
2532
2533 static const value_string adv_proto_id_vals[] =
2534 {
2535   {0, "Access Network Query Protocol"},
2536   {1, "MIH Information Service"},
2537   {2, "MIH Command and Event Services Capability Discovery"},
2538   {3, "Emergency Alert System (EAS)"},
2539   {4, "Location-to-Service Translation Protocol"},
2540   {221, "Vendor Specific"},
2541   {0, NULL}
2542 };
2543
2544 static const value_string timeout_int_types[] =
2545 {
2546   {1, "Reassociation deadline interval (TUs)"},
2547   {2, "Key lifetime interval (seconds)"},
2548   {3, "Association Comeback time (TUs)"},
2549   {0, NULL}
2550 };
2551
2552 static const value_string tdls_action_codes[] ={
2553   {TDLS_SETUP_REQUEST, "TDLS Setup Request"},
2554   {TDLS_SETUP_RESPONSE, "TDLS Setup Response"},
2555   {TDLS_SETUP_CONFIRM, "TDLS Setup Confirm"},
2556   {TDLS_TEARDOWN, "TDLS Teardown"},
2557   {TDLS_PEER_TRAFFIC_INDICATION, "TDLS Peer Traffic Indication"},
2558   {TDLS_CHANNEL_SWITCH_REQUEST, "TDLS Channel Switch Request"},
2559   {TDLS_CHANNEL_SWITCH_RESPONSE, "TDLS Channel Switch Response"},
2560   {TDLS_PEER_PSM_REQUEST, "TDLS Peer PSM Request"},
2561   {TDLS_PEER_PSM_RESPONSE, "TDLS Peer PSM Response"},
2562   {TDLS_PEER_TRAFFIC_RESPONSE, "TDLS Peer Traffic Response"},
2563   {TDLS_DISCOVERY_REQUEST, "TDLS Discovery Request"},
2564   {0, NULL}
2565 };
2566
2567 AIRPDCAP_CONTEXT airpdcap_ctx;
2568
2569 #define PSMP_STA_INFO_BROADCAST 0
2570 #define PSMP_STA_INFO_MULTICAST 1
2571 #define PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED 2
2572
2573 #define PSMP_STA_INFO_FLAG_TYPE         0x00000003
2574 #define PSMP_STA_INFO_FLAG_DTT_START    0x00001FFC
2575 #define PSMP_STA_INFO_FLAG_DTT_DURATION 0x001FE000
2576
2577 #define PSMP_STA_INFO_FLAG_STA_ID       0x001FFFE0
2578
2579 #define PSMP_STA_INFO_FLAG_UTT_START    0x0000FFE0
2580 #define PSMP_STA_INFO_FLAG_UTT_DURATION 0x03FF0000
2581
2582 #define PSMP_STA_INFO_FLAG_IA_RESERVED  0xFC000000
2583
2584 static const value_string ff_psmp_sta_info_flags[] = {
2585   { PSMP_STA_INFO_BROADCAST, "Broadcast"},
2586   { PSMP_STA_INFO_MULTICAST, "Multicast"},
2587   { PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED, "Individually Addressed"},
2588   {0, NULL}
2589 };
2590
2591 static void
2592 beacon_interval_base_custom(gchar *result, guint32 beacon_interval)
2593 {
2594    double temp_double;
2595    temp_double = (double)beacon_interval;
2596    g_snprintf(result, ITEM_LABEL_LENGTH, "%f [Seconds]", (temp_double * 1024 / 1000000) );
2597 }
2598
2599 /* ************************************************************************* */
2600 /*            Return the length of the current header (in bytes)             */
2601 /* ************************************************************************* */
2602 static int
2603 find_header_length (guint16 fcf, guint16 ctrl_fcf, gboolean is_ht)
2604 {
2605   int len;
2606   guint16 cw_fcf;
2607
2608   switch (FCF_FRAME_TYPE (fcf)) {
2609
2610   case MGT_FRAME:
2611     if (is_ht && IS_STRICTLY_ORDERED(FCF_FLAGS(fcf)))
2612       return MGT_FRAME_HDR_LEN + 4;
2613
2614     return MGT_FRAME_HDR_LEN;
2615
2616   case CONTROL_FRAME:
2617     if (COMPOSE_FRAME_TYPE(fcf) == CTRL_CONTROL_WRAPPER) {
2618       len = 6;
2619       cw_fcf = ctrl_fcf;
2620     } else {
2621       len = 0;
2622       cw_fcf = fcf;
2623     }
2624     switch (COMPOSE_FRAME_TYPE (cw_fcf)) {
2625
2626     case CTRL_CTS:
2627     case CTRL_ACKNOWLEDGEMENT:
2628       return len + 10;
2629
2630     case CTRL_RTS:
2631     case CTRL_PS_POLL:
2632     case CTRL_CFP_END:
2633     case CTRL_CFP_ENDACK:
2634     case CTRL_BLOCK_ACK_REQ:
2635     case CTRL_BLOCK_ACK:
2636       return len + 16;
2637     }
2638     return len + 4;  /* XXX */
2639
2640   case DATA_FRAME:
2641     len = (FCF_ADDR_SELECTOR(fcf) ==
2642       DATA_ADDR_T4) ? DATA_LONG_HDR_LEN : DATA_SHORT_HDR_LEN;
2643
2644     if (DATA_FRAME_IS_QOS(COMPOSE_FRAME_TYPE(fcf))) {
2645       len += 2;
2646       if (is_ht && IS_STRICTLY_ORDERED(FCF_FLAGS(fcf))) {
2647         len += 4;
2648       }
2649     }
2650
2651     return len;
2652
2653   default:
2654     return 4;  /* XXX */
2655   }
2656 }
2657
2658 #ifdef MESH_OVERRIDES
2659 /* ************************************************************************* */
2660 /*            Return the length of the mesh header if any (in bytes)
2661  *
2662  * Per IEEE 802.11-07/0799r8:
2663  * 7.1.3.5a.1 The Mesh Header field (...) is present in Data frames if and
2664  * only if they are transmitted between peer MPs with an established peer
2665  * link.  Data frames including the Mesh Header field are referred to as
2666  * Mesh Data frames.
2667  *
2668  * We need a stateful sniffer for that.  For now, use heuristics:  If we
2669  * find valid mesh flags (currently, only MESH_FLAGS_ADDRESS_EXTENSION) at the
2670  * offset where mesh flags should be, assume we're dealing with a mesh header.
2671  * ************************************************************************* */
2672 static int
2673 find_mesh_header_length(const guchar * pd, int offset, guint16 fcf)
2674 {
2675   guint8 mesh_flags;
2676
2677   switch (FCF_FRAME_TYPE (fcf)) {
2678
2679   case MGT_FRAME:
2680     /* TODO: Multihop Action Frames */
2681     return 0;
2682
2683   case DATA_FRAME:
2684     mesh_flags = pd[offset];
2685
2686     /* heuristics:                                                      */
2687     /* asume mesh if all reserved bits in the mesh_flags field are zero */
2688     if ((mesh_flags & ~MESH_FLAGS_ADDRESS_EXTENSION) == 0)
2689       return 6 + 6*(mesh_flags & MESH_FLAGS_ADDRESS_EXTENSION);
2690     break;
2691   }
2692   return 0;
2693 }
2694 #endif /* MESH_OVERRIDES */
2695
2696 mimo_control_t get_mimo_control (tvbuff_t *tvb, int offset)
2697 {
2698   guint16 mimo;
2699   mimo_control_t output;
2700
2701   mimo = tvb_get_letohs (tvb, offset);
2702
2703   output.nc = (mimo & 0x0003) + 1;
2704   output.nr = ((mimo & 0x000C) >> 2) + 1;
2705   output.chan_width = (mimo & 0x0010) >> 4;
2706   output.coefficient_size = 4; /* XXX - Is this a good default? */
2707
2708   switch ((mimo & 0x0060) >> 5)
2709     {
2710       case 0:
2711         output.grouping = 1;
2712         break;
2713
2714       case 1:
2715         output.grouping = 2;
2716         break;
2717
2718       case 2:
2719         output.grouping = 4;
2720         break;
2721
2722       default:
2723         output.grouping = 1;
2724         break;
2725     }
2726
2727   switch ((mimo & 0x0180) >> 7)
2728     {
2729       case 0:
2730         output.coefficient_size = 4;
2731         break;
2732
2733       case 1:
2734         output.coefficient_size = 5;
2735         break;
2736
2737       case 2:
2738         output.coefficient_size = 6;
2739         break;
2740
2741       case 3:
2742         output.coefficient_size = 8;
2743         break;
2744     }
2745
2746   output.codebook_info = (mimo & 0x0600) >> 9;
2747   output.remaining_matrix_segment = (mimo & 0x3800) >> 11;
2748
2749   return output;
2750 }
2751
2752 int get_mimo_na (guint8 nr, guint8 nc)
2753 {
2754   if (nr == 2 && nc == 1){
2755     return 2;
2756   }else if (nr == 2 && nc == 2){
2757     return 2;
2758   }else if (nr == 3 && nc == 1){
2759     return 4;
2760   }else if (nr == 3 && nc == 2){
2761     return 6;
2762   }else if (nr == 3 && nc == 3){
2763     return 6;
2764   }else if (nr == 4 && nc == 1){
2765     return 6;
2766   }else if (nr == 4 && nc == 2){
2767     return 10;
2768   }else if (nr == 4 && nc == 3){
2769     return 12;
2770   }else if (nr == 4 && nc == 4){
2771     return 12;
2772   }else{
2773     return 0;
2774   }
2775 }
2776
2777 int get_mimo_ns (gboolean chan_width, guint8 output_grouping)
2778 {
2779   int ns = 0;
2780
2781   if (chan_width)
2782   {
2783     switch (output_grouping)
2784       {
2785         case 1:
2786           ns = 114;
2787           break;
2788
2789           case 2:
2790             ns = 58;
2791             break;
2792
2793           case 4:
2794             ns = 30;
2795             break;
2796
2797           default:
2798             ns = 0;
2799       }
2800   } else {
2801     switch (output_grouping)
2802       {
2803         case 1:
2804           ns = 56;
2805           break;
2806
2807         case 2:
2808           ns = 30;
2809           break;
2810
2811         case 4:
2812           ns = 16;
2813           break;
2814
2815         default:
2816           ns = 0;
2817       }
2818   }
2819
2820   return ns;
2821 }
2822
2823 int add_mimo_csi_matrices_report (proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl)
2824 {
2825   proto_item *snr_item;
2826   proto_tree *snr_tree;
2827   int csi_matrix_size, start_offset;
2828   int ns, i;
2829
2830   start_offset = offset;
2831   snr_item = proto_tree_add_text(tree, tvb, offset, mimo_cntrl.nc, "Signal to Noise Ratio");
2832   snr_tree = proto_item_add_subtree (snr_item, ett_mimo_report);
2833
2834   for (i=1; i <= mimo_cntrl.nr; i++)
2835   {
2836     guint8 snr;
2837
2838     snr = tvb_get_guint8(tvb, offset);
2839     proto_tree_add_uint_format(snr_tree, hf_ieee80211_ff_mimo_csi_snr, tvb, offset, 1, snr, "Channel %d - Signal to Noise Ratio: 0x%02X", i, snr);
2840     offset++;
2841   }
2842
2843   ns = get_mimo_ns(mimo_cntrl.chan_width, mimo_cntrl.grouping);
2844   csi_matrix_size = ns*(3+(2*mimo_cntrl.nc*mimo_cntrl.nr*mimo_cntrl.coefficient_size));
2845   csi_matrix_size = roundup2(csi_matrix_size, 8) / 8;
2846   proto_tree_add_text(tree, tvb, offset, csi_matrix_size, "CSI Matrices");
2847   offset += csi_matrix_size;
2848   return offset - start_offset;
2849 }
2850
2851 int add_mimo_beamforming_feedback_report (proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl)
2852 {
2853   proto_item *snr_item;
2854   proto_tree *snr_tree;
2855   int csi_matrix_size, start_offset;
2856   int ns, i;
2857
2858   start_offset = offset;
2859   snr_item = proto_tree_add_text(tree, tvb, offset, mimo_cntrl.nc, "Signal to Noise Ratio");
2860   snr_tree = proto_item_add_subtree (snr_item, ett_mimo_report);
2861
2862   for (i=1; i <= mimo_cntrl.nc; i++)
2863   {
2864     guint8 snr;
2865
2866     snr = tvb_get_guint8(tvb, offset);
2867     proto_tree_add_uint_format(snr_tree, hf_ieee80211_ff_mimo_csi_snr, tvb, offset, 1, snr, "Stream %d - Signal to Noise Ratio: 0x%02X", i, snr);
2868     offset++;
2869   }
2870
2871   ns = get_mimo_ns(mimo_cntrl.chan_width, mimo_cntrl.grouping);
2872   csi_matrix_size = ns*(2*mimo_cntrl.nc*mimo_cntrl.nr*mimo_cntrl.coefficient_size);
2873   csi_matrix_size = roundup2(csi_matrix_size, 8) / 8;
2874   proto_tree_add_text(tree, tvb, offset, csi_matrix_size, "Beamforming Feedback Matrices");
2875   offset += csi_matrix_size;
2876   return offset - start_offset;
2877 }
2878
2879 int add_mimo_compressed_beamforming_feedback_report (proto_tree *tree, tvbuff_t *tvb, int offset, mimo_control_t mimo_cntrl)
2880 {
2881   proto_item *snr_item;
2882   proto_tree *snr_tree;
2883   int csi_matrix_size, start_offset;
2884   int ns, na, i;
2885
2886   start_offset = offset;
2887   snr_item = proto_tree_add_text(tree, tvb, offset, mimo_cntrl.nc, "Signal to Noise Ratio");
2888   snr_tree = proto_item_add_subtree (snr_item, ett_mimo_report);
2889
2890   for (i=1; i <= mimo_cntrl.nc; i++)
2891   {
2892     guint8 snr;
2893
2894     snr = tvb_get_guint8(tvb, offset);
2895     proto_tree_add_uint_format(snr_tree, hf_ieee80211_ff_mimo_csi_snr, tvb, offset, 1, snr, "Stream %d - Signal to Noise Ratio: 0x%02X", i, snr);
2896     offset++;
2897   }
2898
2899   na = get_mimo_na(mimo_cntrl.nr, mimo_cntrl.nc);
2900   ns = get_mimo_ns(mimo_cntrl.chan_width, mimo_cntrl.grouping);
2901   csi_matrix_size = ns*(na*((mimo_cntrl.codebook_info+1)*2 + 2)/2);
2902   csi_matrix_size = roundup2(csi_matrix_size, 8) / 8;
2903   proto_tree_add_text(tree, tvb, offset, csi_matrix_size, "Compressed Beamforming Feedback Matrices");
2904   offset += csi_matrix_size;
2905   return offset - start_offset;
2906 }
2907
2908 /* ************************************************************************* */
2909 /*          This is the capture function used to update packet counts        */
2910 /* ************************************************************************* */
2911 static void
2912 capture_ieee80211_common (const guchar * pd, int offset, int len,
2913         packet_counts * ld, gboolean fixed_length_header,
2914         gboolean datapad, gboolean is_ht)
2915 {
2916   guint16 fcf, hdr_length;
2917 #ifdef MESH_OVERRIDES
2918   guint16 meshdr_length;
2919 #endif /* MESH_OVERRIDES */
2920
2921   if (!BYTES_ARE_IN_FRAME(offset, len, 2)) {
2922     ld->other++;
2923     return;
2924   }
2925
2926   fcf = pletohs (&pd[offset]);
2927
2928   if (IS_PROTECTED(FCF_FLAGS(fcf)) && wlan_ignore_wep == WLAN_IGNORE_WEP_NO) {
2929     ld->other++;
2930     return;
2931   }
2932
2933   switch (COMPOSE_FRAME_TYPE (fcf)) {
2934
2935     case DATA:          /* We got a data frame */
2936     case DATA_CF_ACK:   /* Data with ACK */
2937     case DATA_CF_POLL:
2938     case DATA_CF_ACK_POLL:
2939     case DATA_QOS_DATA:
2940     {
2941       if (fixed_length_header) {
2942         hdr_length = DATA_LONG_HDR_LEN;
2943 #ifdef MESH_OVERRIDES
2944         meshdr_length = 0;
2945 #endif /* MESH_OVERRIDES */
2946       } else {
2947         hdr_length = find_header_length (fcf, 0, is_ht);
2948 #ifdef MESH_OVERRIDES
2949         if (datapad)
2950           hdr_length = roundup2(hdr_length, 4);
2951         meshdr_length = find_mesh_header_length(pd, offset + hdr_length, fcf);
2952         g_warning("mesh hdr_length %d hdr_length %d\n", meshdr_length, hdr_length);
2953         hdr_length += meshdr_length;
2954       }
2955 #else /* MESH_OVERRIDES */
2956       }
2957       if (datapad)
2958         hdr_length = roundup2(hdr_length, 4);
2959 #endif /* MESH_OVERRIDES */
2960       /* I guess some bridges take Netware Ethernet_802_3 frames,
2961          which are 802.3 frames (with a length field rather than
2962          a type field, but with no 802.2 header in the payload),
2963          and just stick the payload into an 802.11 frame.  I've seen
2964          captures that show frames of that sort.
2965
2966          We also handle some odd form of encapsulation in which a
2967          complete Ethernet frame is encapsulated within an 802.11
2968          data frame, with no 802.2 header.  This has been seen
2969          from some hardware.
2970
2971          On top of that, at least at some point it appeared that
2972          the OLPC XO sent out frames with two bytes of 0 between
2973          the "end" of the 802.11 header and the beginning of
2974          the payload.
2975
2976          So, if the packet doesn't start with 0xaa 0xaa:
2977
2978            we first use the same scheme that linux-wlan-ng does to detect
2979            those encapsulated Ethernet frames, namely looking to see whether
2980            the frame either starts with 6 octets that match the destination
2981            address from the 802.11 header or has 6 octets that match the
2982            source address from the 802.11 header following the first 6 octets,
2983            and, if so, treat it as an encapsulated Ethernet frame;
2984
2985            otherwise, we use the same scheme that we use in the Ethernet
2986            dissector to recognize Netware 802.3 frames, namely checking
2987            whether the packet starts with 0xff 0xff and, if so, treat it
2988            as an encapsulated IPX frame, and then check whether the
2989            packet starts with 0x00 0x00 and, if so, treat it as an OLPC
2990            frame. */
2991       if (!BYTES_ARE_IN_FRAME(offset+hdr_length, len, 2)) {
2992         ld->other++;
2993         return;
2994       }
2995       if (pd[offset+hdr_length] != 0xaa && pd[offset+hdr_length+1] != 0xaa) {
2996 #if 0
2997         /* XXX - this requires us to parse the header to find the source
2998            and destination addresses. */
2999         if (BYTES_ARE_IN_FRAME(offset+hdr_length, len, 12) {
3000           /* We have two MAC addresses after the header. */
3001           if (memcmp(&pd[offset+hdr_length+6], pinfo->dl_src.data, 6) == 0 ||
3002               memcmp(&pd[offset+hdr_length+6], pinfo->dl_dst.data, 6) == 0) {
3003             capture_eth (pd, offset + hdr_length, len, ld);
3004             return;
3005           }
3006         }
3007 #endif
3008         if (pd[offset+hdr_length] == 0xff && pd[offset+hdr_length+1] == 0xff)
3009           capture_ipx (ld);
3010         else if (pd[offset+hdr_length] == 0x00 && pd[offset+hdr_length+1] == 0x00)
3011           capture_llc (pd, offset + hdr_length + 2, len, ld);
3012       }
3013       else {
3014         capture_llc (pd, offset + hdr_length, len, ld);
3015       }
3016       break;
3017     }
3018
3019     default:
3020       ld->other++;
3021       break;
3022   }
3023 }
3024
3025 /*
3026  * Handle 802.11 with a variable-length link-layer header.
3027  */
3028 void
3029 capture_ieee80211 (const guchar * pd, int offset, int len, packet_counts * ld)
3030 {
3031   capture_ieee80211_common (pd, offset, len, ld, FALSE, FALSE, FALSE);
3032 }
3033
3034 /*
3035  * Handle 802.11 with a variable-length link-layer header and data padding.
3036  */
3037 void
3038 capture_ieee80211_datapad (const guchar * pd, int offset, int len,
3039                            packet_counts * ld)
3040 {
3041   capture_ieee80211_common (pd, offset, len, ld, FALSE, TRUE, FALSE);
3042 }
3043
3044 /*
3045  * Handle 802.11 with a fixed-length link-layer header (padded to the
3046  * maximum length).
3047  */
3048 void
3049 capture_ieee80211_fixed (const guchar * pd, int offset, int len, packet_counts * ld)
3050 {
3051   capture_ieee80211_common (pd, offset, len, ld, TRUE, FALSE, FALSE);
3052 }
3053
3054 /*
3055  * Handle an HT 802.11 with a variable-length link-layer header.
3056  */
3057 void
3058 capture_ieee80211_ht (const guchar * pd, int offset, int len, packet_counts * ld)
3059 {
3060   capture_ieee80211_common (pd, offset, len, ld, FALSE, FALSE, TRUE);
3061 }
3062
3063 #define WLANCAP_MAGIC_COOKIE_BASE 0x80211000
3064 #define WLANCAP_MAGIC_COOKIE_V1 0x80211001
3065 #define WLANCAP_MAGIC_COOKIE_V2 0x80211002
3066
3067
3068 /*
3069  * Prism II-based wlan devices have a monitoring mode that sticks
3070  * a proprietary header on each packet with lots of good
3071  * information.  This file is responsible for decoding that
3072  * data.
3073  *
3074  * Support by Tim Newsham
3075  *
3076  * A value from the header.
3077  *
3078  * It appears from looking at the linux-wlan-ng and Prism II HostAP
3079  * drivers, and various patches to the orinoco_cs drivers to add
3080  * Prism headers, that:
3081  *
3082  *      the "did" identifies what the value is (i.e., what it's the value
3083  *      of);
3084  *
3085  *      "status" is 0 if the value is present or 1 if it's absent;
3086  *
3087  *      "len" is the length of the value (always 4, in that code);
3088  *
3089  *      "data" is the value of the data (or 0 if not present).
3090  *
3091  * Note: all of those values are in the *host* byte order of the machine
3092  * on which the capture was written.
3093  */
3094
3095
3096 /*
3097  * Header attached during Prism monitor mode.
3098  *
3099  * At least according to one paper I've seen, the Prism 2.5 chip set
3100  * provides:
3101  *
3102  *      RSSI (receive signal strength indication) is "the total power
3103  *      received by the radio hardware while receiving the frame,
3104  *      including signal, interfereence, and background noise";
3105  *
3106  *      "silence value" is "the total power observed just before the
3107  *      start of the frame".
3108  *
3109  * None of the drivers I looked at supply the "rssi" or "sq" value,
3110  * but they do supply "signal" and "noise" values, along with a "rate"
3111  * value that's 1/5 of the raw value from what is presumably a raw
3112  * HFA384x frame descriptor, with the comment "set to 802.11 units",
3113  * which presumably means the units are 500 Kb/s.
3114  *
3115  * I infer from the current NetBSD "wi" driver that "signal" and "noise"
3116  * are adjusted dBm values, with the dBm value having 100 added to it
3117  * for the Prism II cards (although the NetBSD code has an XXX comment
3118  * for the #define for WI_PRISM_DBM_OFFSET) and 149 (with no XXX comment)
3119  * for the Orinoco cards.
3120  *
3121  * XXX - what about other drivers that supply Prism headers, such as
3122  * old versions of the MadWifi driver?
3123  */
3124
3125 #define PRISM_HEADER_LENGTH     144             /* Default Prism Header Length */
3126 #define PRISM_DID_HOSTTIME      0x00010044      /* Host time element */
3127 #define PRISM_DID_MACTIME       0x00020044      /* Mac time element */
3128 #define PRISM_DID_CHANNEL       0x00030044      /* Channel element */
3129 #define PRISM_DID_RSSI          0x00040044      /* RSSI element */
3130 #define PRISM_DID_SQ            0x00050044      /* SQ element */
3131 #define PRISM_DID_SIGNAL        0x00060044      /* Signal element */
3132 #define PRISM_DID_NOISE         0x00070044      /* Noise element */
3133 #define PRISM_DID_RATE          0x00080044      /* Rate element */
3134 #define PRISM_DID_ISTX          0x00090044      /* Is Tx frame */
3135 #define PRISM_DID_FRMLEN        0x000A0044      /* Frame length */
3136
3137 static const value_string prism_did_vals[] =
3138 {
3139   { PRISM_DID_HOSTTIME,   "Host Time" },
3140   { PRISM_DID_MACTIME,    "Mac Time" },
3141   { PRISM_DID_CHANNEL,    "Channel" },
3142   { PRISM_DID_RSSI,       "RSSI" },
3143   { PRISM_DID_SQ,         "SQ" },
3144   { PRISM_DID_SIGNAL,     "Signal" },
3145   { PRISM_DID_NOISE,      "Noise" },
3146   { PRISM_DID_RATE,       "Rate" },
3147   { PRISM_DID_ISTX,       "Is Tx" },
3148   { PRISM_DID_FRMLEN,     "Frame Length" },
3149   { 0, NULL}
3150 };
3151
3152 static const value_string prism_status_vals[] =
3153 {
3154   { 0,   "Not Supplied" },
3155   { 1,   "Supplied" },
3156   { 0, NULL}
3157 };
3158
3159 static const value_string prism_istx_vals[] =
3160 {
3161   { 0,   "Rx Packet" },
3162   { 1,   "Tx Packet" },
3163   { 0, NULL}
3164 };
3165
3166 static void
3167 prism_rate_base_custom(gchar *result, guint32 rate)
3168 {
3169    g_snprintf(result, ITEM_LABEL_LENGTH, "%u.%u", rate /2, rate & 1 ? 5 : 0);
3170 }
3171
3172 static gchar *
3173 prism_rate_return(guint32 rate)
3174 {
3175   gchar *result=NULL;
3176   result = ep_alloc(SHORT_STR);
3177   result[0] = '\0';
3178   prism_rate_base_custom(result, rate);
3179
3180   return result;
3181 }
3182
3183
3184 void
3185 capture_prism(const guchar *pd, int offset, int len, packet_counts *ld)
3186 {
3187   guint32 cookie;
3188
3189   if (!BYTES_ARE_IN_FRAME(offset, len, 4)) {
3190     ld->other++;
3191     return;
3192   }
3193
3194   /* Some captures with DLT_PRISM have the AVS WLAN header */
3195   cookie = pntohl(pd);
3196   if ((cookie == WLANCAP_MAGIC_COOKIE_V1) ||
3197       (cookie == WLANCAP_MAGIC_COOKIE_V2)) {
3198     capture_wlancap(pd, offset, len, ld);
3199     return;
3200   }
3201
3202   /* Prism header */
3203   if (!BYTES_ARE_IN_FRAME(offset, len, PRISM_HEADER_LENGTH)) {
3204     ld->other++;
3205     return;
3206   }
3207   offset += PRISM_HEADER_LENGTH;
3208
3209   /* 802.11 header follows */
3210   capture_ieee80211(pd, offset, len, ld);
3211 }
3212
3213 void
3214 capture_wlancap(const guchar *pd, int offset, int len, packet_counts *ld)
3215 {
3216   guint32 length;
3217
3218   if (!BYTES_ARE_IN_FRAME(offset, len, sizeof(guint32)*2)) {
3219     ld->other++;
3220     return;
3221   }
3222
3223   length = pntohl(pd+sizeof(guint32));
3224
3225   if (!BYTES_ARE_IN_FRAME(offset, len, length)) {
3226     ld->other++;
3227     return;
3228   }
3229
3230   offset += length;
3231
3232   /* 802.11 header follows */
3233   capture_ieee80211(pd, offset, len, ld);
3234 }
3235
3236 /* ************************************************************************* */
3237 /*          Add the subtree used to store the fixed parameters               */
3238 /* ************************************************************************* */
3239 static proto_tree *
3240 get_fixed_parameter_tree (proto_tree * tree, tvbuff_t *tvb, int start, int size)
3241 {
3242   proto_item *fixed_fields;
3243   fixed_fields =
3244     proto_tree_add_uint_format (tree, hf_ieee80211_fixed_parameters, tvb, start,
3245         size, size, "Fixed parameters (%d bytes)",
3246         size);
3247
3248   return proto_item_add_subtree (fixed_fields, ett_fixed_parameters);
3249 }
3250
3251
3252 /* ************************************************************************* */
3253 /*            Add the subtree used to store tagged parameters                */
3254 /* ************************************************************************* */
3255 static proto_tree *
3256 get_tagged_parameter_tree (proto_tree * tree, tvbuff_t *tvb, int start, int size)
3257 {
3258   proto_item *tagged_fields;
3259
3260   tagged_fields = proto_tree_add_uint_format (tree, hf_ieee80211_tagged_parameters,
3261     tvb,
3262     start,
3263     2,
3264     size,
3265     "Tagged parameters (%d bytes)",
3266     size);
3267
3268   return proto_item_add_subtree (tagged_fields, ett_tagged_parameters);
3269 }
3270
3271
3272 static int
3273 dissect_vendor_action_marvell(proto_tree *tree, tvbuff_t *tvb, int offset)
3274 {
3275   guint8 octet;
3276
3277   octet = tvb_get_guint8(tvb, offset);
3278   proto_tree_add_item (tree, hf_ieee80211_ff_marvell_action_type, tvb, offset, 1, TRUE);
3279   offset++;
3280   switch (octet)
3281     {
3282       case MRVL_ACTION_MESH_MANAGEMENT:
3283         octet = tvb_get_guint8(tvb, offset);
3284         proto_tree_add_item (tree, hf_ieee80211_ff_marvell_mesh_mgt_action_code, tvb, offset, 1, TRUE);
3285         offset++;
3286         switch (octet)
3287           {
3288             case MRVL_MESH_MGMT_ACTION_RREQ:
3289               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_length, tvb, offset, 1, TRUE);
3290               offset++;
3291               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_mode, tvb, offset, 1, TRUE);
3292               offset++;
3293               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_hopcount, tvb, offset, 1, TRUE);
3294               offset++;
3295               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_ttl, tvb, offset, 1, TRUE);
3296               offset++;
3297               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_rreqid, tvb, offset, 4, TRUE);
3298               offset+= 4;
3299               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_sa, tvb, offset, 6, FALSE);
3300               offset+= 6;
3301               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_ssn, tvb, offset, 4, TRUE);
3302               offset+= 4;
3303               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_lifetime, tvb, offset, 4, TRUE);
3304               offset+= 4;
3305               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_metric, tvb, offset, 4, TRUE);
3306               offset+= 4;
3307               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_dstcount, tvb, offset, 1, TRUE);
3308               offset++;
3309               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_flags, tvb, offset, 1, TRUE);
3310               offset++;
3311               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_da, tvb, offset, 6, FALSE);
3312               offset+= 6;
3313               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_dsn, tvb, offset, 4, TRUE);
3314               offset+= 4;
3315               break;
3316             case MRVL_MESH_MGMT_ACTION_RREP:
3317               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_length, tvb, offset, 1, TRUE);
3318               offset++;
3319               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_mode, tvb, offset, 1, TRUE);
3320               offset++;
3321               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_hopcount, tvb, offset, 1, TRUE);
3322               offset++;
3323               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_ttl, tvb, offset, 1, TRUE);
3324               offset++;
3325               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_da, tvb, offset, 6, FALSE);
3326               offset+= 6;
3327               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_dsn, tvb, offset, 4, TRUE);
3328               offset+= 4;
3329               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_lifetime, tvb, offset, 4, TRUE);
3330               offset+= 4;
3331               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_metric, tvb, offset, 4, TRUE);
3332               offset+= 4;
3333               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_sa, tvb, offset, 6, FALSE);
3334               offset+= 6;
3335               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_ssn, tvb, offset, 4, TRUE);
3336               offset+= 4;
3337               break;
3338             case MRVL_MESH_MGMT_ACTION_RERR:
3339               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_length, tvb, offset, 1, TRUE);
3340               offset++;
3341               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_mode, tvb, offset, 1, TRUE);
3342               offset++;
3343               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_dstcount, tvb, offset, 1, TRUE);
3344               offset++;
3345               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_da, tvb, offset, 6, FALSE);
3346               offset+= 6;
3347               proto_tree_add_item (tree, hf_ieee80211_ff_mesh_mgt_dsn, tvb, offset, 4, TRUE);
3348               offset+= 4;
3349               break;
3350             default:
3351               break;
3352           }
3353         break;
3354       default:
3355         break;
3356     }
3357
3358   return offset;
3359 }
3360
3361 static guint
3362 dissect_advertisement_protocol(packet_info *pinfo, proto_tree *tree,
3363                                tvbuff_t *tvb, int offset, gboolean *anqp)
3364 {
3365   guint8 tag_no, tag_len, left;
3366   proto_item *item = NULL;
3367   proto_tree *adv_tree, *adv_tuple_tree;
3368
3369   if (anqp)
3370     *anqp = FALSE;
3371   tag_no = tvb_get_guint8(tvb, offset);
3372   item = proto_tree_add_item(tree, hf_ieee80211_tag_number, tvb, offset, 1, TRUE);
3373
3374   tag_len = tvb_get_guint8(tvb, offset + 1);
3375   if (tag_no != TAG_ADVERTISEMENT_PROTOCOL) {
3376     expert_add_info_format(pinfo, item, PI_MALFORMED, PI_ERROR,
3377                            "Unexpected IE %d (expected Advertisement "
3378                            "Protocol)", tag_no);
3379     return 2 + tag_len;
3380   }
3381   item = proto_tree_add_uint(tree, hf_ieee80211_tag_length, tvb, offset + 1, 1, tag_len);
3382   if (tag_len < 2) {
3383     expert_add_info_format(pinfo, item, PI_MALFORMED, PI_ERROR,
3384                            "Advertisement Protocol: IE must be at least 2 "
3385                            "octets long");
3386     return 2 + tag_len;
3387   }
3388
3389   left = tag_len;
3390   offset += 2;
3391   item = proto_tree_add_text(tree, tvb, offset, left,
3392                              "Advertisement Protocol element");
3393   adv_tree = proto_item_add_subtree(item, ett_adv_proto);
3394
3395   while (left >= 2) {
3396     guint8 id;
3397
3398     id = tvb_get_guint8(tvb, offset + 1);
3399     item = proto_tree_add_text(adv_tree, tvb, offset, 2,
3400                                "Advertisement Protocol Tuple: %s",
3401                                val_to_str(id, adv_proto_id_vals,
3402                                           "Unknown (%d)"));
3403     adv_tuple_tree = proto_item_add_subtree(item, ett_adv_proto_tuple);
3404
3405     proto_tree_add_item(adv_tuple_tree,
3406                         hf_ieee80211_tag_adv_proto_resp_len_limit, tvb,
3407                         offset, 1, FALSE);
3408     proto_tree_add_item(adv_tuple_tree,
3409                         hf_ieee80211_tag_adv_proto_pame_bi, tvb,
3410                         offset, 1, FALSE);
3411     offset++;
3412     left--;
3413     proto_tree_add_item(adv_tuple_tree, hf_ieee80211_tag_adv_proto_id, tvb,
3414                         offset, 1, FALSE);
3415     offset++;
3416     left--;
3417
3418     if (id == 0 && anqp)
3419       *anqp = TRUE;
3420
3421     if (id == 221) {
3422       /* Vendor specific */
3423       guint8 len = tvb_get_guint8(tvb, offset);
3424       offset++;
3425       left--;
3426       if (len > left) {
3427         expert_add_info_format(pinfo, item, PI_MALFORMED, PI_ERROR,
3428                                "Vendor specific info length error");
3429         return 2 + tag_len;
3430       }
3431       proto_tree_add_text(adv_tuple_tree, tvb, offset, len,
3432                           "Vendor Specific Advertisement Protocol info");
3433       offset += len;
3434       left -= len;
3435     }
3436   }
3437
3438   if (left) {
3439     expert_add_info_format(pinfo, item, PI_MALFORMED, PI_ERROR,
3440                            "Unexpected extra data in the end");
3441   }
3442
3443   return 2 + tag_len;
3444 }
3445
3446 static void
3447 dissect_anqp(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean request)
3448 {
3449   guint16 id, len;
3450
3451   proto_tree_add_text(tree, tvb, offset, 4,
3452                       request ? "Access Network Query Protocol Request" :
3453                       "Access Network Query Protocol Response");
3454   proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_id,
3455                       tvb, offset, 2, TRUE);
3456   id = tvb_get_letohs(tvb, offset);
3457   offset += 2;
3458   proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_length,
3459                       tvb, offset, 2, TRUE);
3460   len = tvb_get_letohs(tvb, offset);
3461   offset += 2;
3462   proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info,
3463                       tvb, offset, len, FALSE);
3464   if (id == 56797) {
3465     /* ANQP vendor-specific list */
3466     guint32 oui;
3467     guint8 subtype;
3468
3469     oui = tvb_get_ntoh24(tvb, offset);
3470     proto_tree_add_item(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_NA);
3471     offset += 3;
3472
3473     switch (oui) {
3474     case OUI_WFA:
3475       subtype = tvb_get_guint8(tvb, offset);
3476       if (subtype == WFA_SUBTYPE_P2P) {
3477         proto_tree_add_text(tree, tvb, offset, 1, "Subtype %u: P2P ANQP",
3478                             subtype);
3479         dissect_wifi_p2p_anqp(g_pinfo, tree, tvb, offset + 1, request);
3480       } else {
3481         proto_tree_add_text(tree, tvb, offset, 1, "Subtype %u", subtype);
3482       }
3483     }
3484   }
3485 }
3486
3487 static guint
3488 dissect_gas_initial_request(proto_tree *tree, tvbuff_t *tvb, int offset,
3489                             gboolean anqp)
3490 {
3491   guint16 req_len;
3492   int start = offset;
3493   proto_item *item;
3494   proto_tree *query, *anqp_tree;
3495
3496   /* Query Request Length (2 octets) */
3497   req_len = tvb_get_letohs(tvb, offset);
3498
3499   item = proto_tree_add_text(tree, tvb, offset, 2 + req_len, "Query Request");
3500   query = proto_item_add_subtree(item, ett_gas_query);
3501
3502   proto_tree_add_item(query, hf_ieee80211_ff_query_request_length,
3503                       tvb, offset, 2, TRUE);
3504   offset += 2;
3505   /*
3506    * Query Request (GAS query; formatted per protocol specified in the
3507    * Advertisement Protocol IE)
3508    */
3509   item = proto_tree_add_item(query, hf_ieee80211_ff_query_request,
3510                              tvb, offset, req_len, FALSE);
3511   if (anqp) {
3512     anqp_tree = proto_item_add_subtree(item, ett_gas_anqp);
3513     dissect_anqp(anqp_tree, tvb, offset, TRUE);
3514   }
3515   offset += req_len;
3516
3517   return offset - start;
3518 }
3519
3520 static guint
3521 dissect_gas_initial_response(proto_tree *tree, tvbuff_t *tvb, int offset,
3522                              gboolean anqp)
3523 {
3524   guint16 resp_len;
3525   int start = offset;
3526   proto_item *item;
3527   proto_tree *query, *anqp_tree;
3528
3529   /* Query Response Length (2 octets) */
3530   resp_len = tvb_get_letohs(tvb, offset);
3531
3532   item = proto_tree_add_text(tree, tvb, offset, 2 + resp_len,
3533                              "Query Response");
3534   query = proto_item_add_subtree(item, ett_gas_query);
3535
3536   proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
3537                       tvb, offset, 2, TRUE);
3538   offset += 2;
3539   /* Query Response (optional) */
3540   if (resp_len) {
3541     item = proto_tree_add_item(query, hf_ieee80211_ff_query_response,
3542                                tvb, offset, resp_len, FALSE);
3543     if (anqp) {
3544       anqp_tree = proto_item_add_subtree(item, ett_gas_anqp);
3545       dissect_anqp(anqp_tree, tvb, offset, FALSE);
3546     }
3547     offset += resp_len;
3548   }
3549
3550   return offset - start;
3551 }
3552
3553 static guint
3554 dissect_gas_comeback_response(proto_tree *tree, tvbuff_t *tvb, int offset,
3555                               gboolean anqp, guint8 frag)
3556 {
3557   guint16 resp_len;
3558   int start = offset;
3559   proto_item *item;
3560   proto_tree *query, *anqp_tree;
3561
3562   /* Query Response Length (2 octets) */
3563   resp_len = tvb_get_letohs(tvb, offset);
3564
3565   item = proto_tree_add_text(tree, tvb, offset, 2 + resp_len,
3566                              "Query Response");
3567   query = proto_item_add_subtree(item, ett_gas_query);
3568
3569   proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
3570                       tvb, offset, 2, TRUE);
3571   offset += 2;
3572   /* Query Response (optional) */
3573   if (resp_len) {
3574     item = proto_tree_add_item(query, hf_ieee80211_ff_query_response,
3575                                tvb, offset, resp_len, FALSE);
3576     if (anqp && frag == 0) {
3577       anqp_tree = proto_item_add_subtree(item, ett_gas_anqp);
3578       dissect_anqp(anqp_tree, tvb, offset, FALSE);
3579     }
3580     offset += resp_len;
3581   }
3582
3583   return offset - start;
3584 }
3585
3586 /* ************************************************************************* */
3587 /*              Dissect and add fixed mgmt fields to protocol tree           */
3588 /* ************************************************************************* */
3589 static guint
3590 add_fixed_field(proto_tree * tree, tvbuff_t * tvb, int offset, int lfcode)
3591 {
3592
3593   guint length = 0;
3594
3595   switch (lfcode)
3596   {
3597     case FIELD_TIMESTAMP:
3598       proto_tree_add_item(tree, hf_ieee80211_ff_timestamp, tvb, offset, 8, TRUE);
3599       length += 8;
3600       break;
3601
3602     case FIELD_BEACON_INTERVAL:
3603       {
3604         proto_tree_add_item(tree, hf_ieee80211_ff_beacon_interval, tvb, offset, 2, TRUE);
3605         col_append_fstr(g_pinfo->cinfo, COL_INFO, ", BI=%d", tvb_get_letohs (tvb, offset));
3606         length += 2;
3607         break;
3608       }
3609
3610     case FIELD_CAP_INFO:
3611       {
3612
3613         proto_item *cap_item;
3614         proto_tree *cap_tree;
3615
3616         cap_item = proto_tree_add_item(tree, hf_ieee80211_ff_capture, tvb, offset, 2, TRUE);
3617         cap_tree = proto_item_add_subtree (cap_item, ett_cap_tree);
3618
3619         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_ess, tvb, offset, 2, TRUE);
3620         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_ibss, tvb, offset, 2, TRUE);
3621         if ((tvb_get_letohs(tvb, offset) & 0x0001) != 0)  /* This is an AP */
3622           proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_ap_poll, tvb, offset, 2, TRUE);
3623         else      /* This is a STA */
3624           proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_sta_poll, tvb, offset, 2, TRUE);
3625
3626         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_privacy, tvb, offset, 2, TRUE);
3627         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_preamble, tvb, offset, 2, TRUE);
3628         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_pbcc, tvb, offset, 2, TRUE);
3629         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_agility, tvb, offset, 2, TRUE);
3630         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_spec_man, tvb, offset, 2, TRUE);
3631         proto_tree_add_item(cap_tree, hf_ieee80211_ff_short_slot_time, tvb, offset, 2, TRUE);
3632         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_apsd, tvb, offset, 2, TRUE);
3633         proto_tree_add_item(cap_tree, hf_ieee80211_ff_dsss_ofdm, tvb, offset, 2, TRUE);
3634         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_del_blk_ack, tvb, offset, 2, TRUE);
3635         proto_tree_add_item(cap_tree, hf_ieee80211_ff_cf_imm_blk_ack, tvb, offset, 2, TRUE);
3636         length += 2;
3637         break;
3638       }
3639     case FIELD_AUTH_ALG:
3640       proto_tree_add_item(tree, hf_ieee80211_ff_auth_alg, tvb, offset, 2, TRUE);
3641       length += 2;
3642       break;
3643
3644     case FIELD_AUTH_TRANS_SEQ:
3645       proto_tree_add_item(tree, hf_ieee80211_ff_auth_seq, tvb, offset, 2, TRUE);
3646       length += 2;
3647       break;
3648
3649     case FIELD_CURRENT_AP_ADDR:
3650       proto_tree_add_item(tree, hf_ieee80211_ff_current_ap, tvb, offset, 6, FALSE);
3651       length += 6;
3652       break;
3653
3654     case FIELD_LISTEN_IVAL:
3655       proto_tree_add_item(tree, hf_ieee80211_ff_listen_ival, tvb, offset, 2, TRUE);
3656       length += 2;
3657       break;
3658
3659     case FIELD_REASON_CODE:
3660       proto_tree_add_item(tree, hf_ieee80211_ff_reason, tvb, offset, 2, TRUE);
3661       length += 2;
3662       break;
3663
3664     case FIELD_ASSOC_ID:
3665       proto_tree_add_item(tree, hf_ieee80211_ff_assoc_id, tvb, offset, 2, TRUE);
3666       length += 2;
3667       break;
3668
3669     case FIELD_STATUS_CODE:
3670       proto_tree_add_item(tree, hf_ieee80211_ff_status_code, tvb, offset, 2, TRUE);
3671       length += 2;
3672       break;
3673
3674     case FIELD_CATEGORY_CODE:
3675       proto_tree_add_item(tree, hf_ieee80211_ff_category_code, tvb, offset, 1, TRUE);
3676       length += 1;
3677       break;
3678
3679     case FIELD_ACTION_CODE:
3680       proto_tree_add_item(tree, hf_ieee80211_ff_action_code, tvb, offset, 1, TRUE);
3681       length += 1;
3682       break;
3683
3684     case FIELD_DIALOG_TOKEN:
3685       proto_tree_add_item(tree, hf_ieee80211_ff_dialog_token, tvb, offset, 1, TRUE);
3686       length += 1;
3687       break;
3688
3689     case FIELD_WME_ACTION_CODE:
3690       proto_tree_add_item(tree, hf_ieee80211_ff_wme_action_code, tvb, offset, 1, TRUE);
3691       length += 1;
3692       break;
3693
3694     case FIELD_WME_STATUS_CODE:
3695       proto_tree_add_item(tree, hf_ieee80211_ff_wme_status_code, tvb, offset, 1, TRUE);
3696       length += 1;
3697       break;
3698
3699     case FIELD_QOS_ACTION_CODE:
3700       proto_tree_add_item(tree, hf_ieee80211_ff_qos_action_code, tvb, offset, 1, TRUE);
3701       length += 1;
3702       break;
3703
3704     case FIELD_BLOCK_ACK_ACTION_CODE:
3705       proto_tree_add_item(tree, hf_ieee80211_ff_ba_action, tvb, offset, 1, TRUE);
3706       length += 1;
3707       break;
3708
3709     case FIELD_BLOCK_ACK_PARAM:
3710       {
3711         proto_item *param_item;
3712         proto_tree *param_tree;
3713
3714         param_item = proto_tree_add_item(tree, hf_ieee80211_ff_block_ack_params, tvb, offset, 2, TRUE);
3715         param_tree = proto_item_add_subtree (param_item, ett_ff_ba_param_tree);
3716
3717         proto_tree_add_item(param_tree, hf_ieee80211_ff_block_ack_params_amsdu_permitted, tvb, offset, 2, TRUE);
3718         proto_tree_add_item(param_tree, hf_ieee80211_ff_block_ack_params_policy, tvb, offset, 2, TRUE);
3719         proto_tree_add_item(param_tree, hf_ieee80211_ff_block_ack_params_tid, tvb, offset, 2, TRUE);
3720         proto_tree_add_item(param_tree, hf_ieee80211_ff_block_ack_params_buffer_size, tvb, offset, 2, TRUE);
3721         length += 2;
3722         break;
3723       }
3724
3725     case FIELD_BLOCK_ACK_TIMEOUT:
3726       {
3727         proto_tree_add_item(tree, hf_ieee80211_ff_block_ack_timeout, tvb, offset, 2, TRUE);
3728         length += 2;
3729         break;
3730       }
3731
3732     case FIELD_BLOCK_ACK_SSC:
3733       {
3734         proto_item *ssc_item;
3735         proto_tree *ssc_tree;
3736
3737         ssc_item = proto_tree_add_item(tree, hf_ieee80211_ff_block_ack_ssc, tvb, offset, 2, TRUE);
3738         ssc_tree = proto_item_add_subtree (ssc_item, ett_ff_ba_ssc_tree);
3739
3740         proto_tree_add_item(ssc_tree, hf_ieee80211_ff_block_ack_ssc_fragment, tvb, offset, 2, TRUE);
3741         proto_tree_add_item(ssc_tree, hf_ieee80211_ff_block_ack_ssc_sequence, tvb, offset, 2, TRUE);
3742         length += 2;
3743         break;
3744       }
3745
3746     case FIELD_QOS_TS_INFO:
3747       {
3748         proto_item *tsinfo_item;
3749         proto_tree *tsinfo_tree;
3750
3751         tsinfo_item = proto_tree_add_item(tree, hf_ieee80211_tsinfo, tvb, offset, 3, TRUE);
3752         tsinfo_tree = proto_item_add_subtree(tsinfo_item, ett_tsinfo_tree);
3753
3754         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_type, tvb, offset, 3, TRUE);
3755         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_tsid, tvb, offset, 3, TRUE);
3756         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_dir, tvb, offset, 3, TRUE);
3757         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_access, tvb, offset, 3, TRUE);
3758         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_agg, tvb, offset, 3, TRUE);
3759         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_apsd, tvb, offset, 3, TRUE);
3760         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_up, tvb, offset, 3, TRUE);
3761         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_ack, tvb, offset, 3, TRUE);
3762         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_sched, tvb, offset, 3, TRUE);
3763         proto_tree_add_item(tsinfo_tree, hf_ieee80211_tsinfo_rsv, tvb, offset, 3, TRUE);
3764         length += 3;
3765         break;
3766       }
3767
3768 #ifdef MESH_OVERRIDES
3769     case FIELD_MESH_ACTION:
3770       proto_tree_add_item(tree, hf_ieee80211_ff_mesh_action, tvb, offset, 1, TRUE);
3771       length += 1;
3772       break;
3773
3774     case FIELD_MULTIHOP_ACTION:
3775       proto_tree_add_item(tree, hf_ieee80211_ff_multihop_action, tvb, offset, 1, TRUE);
3776       length += 1;
3777       break;
3778
3779     case FIELD_MESH_CONTROL:
3780       proto_tree_add_item(tree, hf_ieee80211_ff_mesh_flags, tvb, offset, 1, TRUE);
3781       proto_tree_add_item(tree, hf_ieee80211_ff_mesh_ttl, tvb, offset + 1, 1, TRUE);
3782       proto_tree_add_item(tree, hf_ieee80211_ff_mesh_sequence, tvb, offset + 2, 4, TRUE);
3783       length += 6;
3784       switch (tvb_get_guint8(tvb, offset) & 0x03)
3785        {
3786          case 1:
3787            proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr4, tvb, offset + 6, 6, FALSE);
3788            length += 6;
3789            break;
3790