Root/package/broadcom-wl/src/include/proto/802.11.h

1/*
2 * Copyright 2006, Broadcom Corporation
3 * All Rights Reserved.
4 *
5 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
6 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
7 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
8 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
9 *
10 * Fundamental types and constants relating to 802.11
11 *
12 */
13
14#ifndef _802_11_H_
15#define _802_11_H_
16
17#ifndef _TYPEDEFS_H_
18#include <typedefs.h>
19#endif
20
21#ifndef _NET_ETHERNET_H_
22#include <proto/ethernet.h>
23#endif
24
25#include <proto/wpa.h>
26
27/* enable structure packing */
28#if defined(__GNUC__)
29#define PACKED __attribute__((packed))
30#else
31#pragma pack(1)
32#define PACKED
33#endif
34
35#define DOT11_TU_TO_US 1024 /* 802.11 Time Unit is 1024 microseconds */
36
37/* Generic 802.11 frame constants */
38#define DOT11_A3_HDR_LEN 24 /* d11 header length with A3 */
39#define DOT11_A4_HDR_LEN 30 /* d11 header length with A4 */
40#define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN /* MAC header length */
41#define DOT11_FCS_LEN 4 /* d11 FCS length */
42#define DOT11_ICV_LEN 4 /* d11 ICV length */
43#define DOT11_ICV_AES_LEN 8 /* d11 ICV/AES length */
44#define DOT11_QOS_LEN 2 /* d11 QoS length */
45#define DOT11_HTC_LEN 4 /* d11 HT Control field length */
46
47#define DOT11_KEY_INDEX_SHIFT 6 /* d11 key index shift */
48#define DOT11_IV_LEN 4 /* d11 IV length */
49#define DOT11_IV_TKIP_LEN 8 /* d11 IV TKIP length */
50#define DOT11_IV_AES_OCB_LEN 4 /* d11 IV/AES/OCB length */
51#define DOT11_IV_AES_CCM_LEN 8 /* d11 IV/AES/CCM length */
52#define DOT11_IV_MAX_LEN 8 /* maximum iv len for any encryption */
53
54/* Includes MIC */
55#define DOT11_MAX_MPDU_BODY_LEN 2304 /* max MPDU body length */
56/* A4 header + QoS + CCMP + PDU + ICV + FCS = 2352 */
57#define DOT11_MAX_MPDU_LEN (DOT11_A4_HDR_LEN + \
58                     DOT11_QOS_LEN + \
59                     DOT11_IV_AES_CCM_LEN + \
60                     DOT11_MAX_MPDU_BODY_LEN + \
61                     DOT11_ICV_LEN + \
62                     DOT11_FCS_LEN) /* d11 max MPDU length */
63
64#define DOT11_MAX_SSID_LEN 32 /* d11 max ssid length */
65
66/* dot11RTSThreshold */
67#define DOT11_DEFAULT_RTS_LEN 2347 /* d11 default RTS length */
68#define DOT11_MAX_RTS_LEN 2347 /* d11 max RTS length */
69
70/* dot11FragmentationThreshold */
71#define DOT11_MIN_FRAG_LEN 256 /* d11 min fragmentation length */
72#define DOT11_MAX_FRAG_LEN 2346 /* Max frag is also limited by aMPDUMaxLength
73                        * of the attached PHY
74                        */
75#define DOT11_DEFAULT_FRAG_LEN 2346 /* d11 default fragmentation length */
76
77/* dot11BeaconPeriod */
78#define DOT11_MIN_BEACON_PERIOD 1 /* d11 min beacon period */
79#define DOT11_MAX_BEACON_PERIOD 0xFFFF /* d11 max beacon period */
80
81/* dot11DTIMPeriod */
82#define DOT11_MIN_DTIM_PERIOD 1 /* d11 min DTIM period */
83#define DOT11_MAX_DTIM_PERIOD 0xFF /* d11 max DTIM period */
84
85/* 802.2 LLC/SNAP header used by 802.11 per 802.1H */
86#define DOT11_LLC_SNAP_HDR_LEN 8 /* d11 LLC/SNAP header length */
87#define DOT11_OUI_LEN 3 /* d11 OUI length */
88struct dot11_llc_snap_header {
89    uint8 dsap; /* always 0xAA */
90    uint8 ssap; /* always 0xAA */
91    uint8 ctl; /* always 0x03 */
92    uint8 oui[DOT11_OUI_LEN]; /* RFC1042: 0x00 0x00 0x00
93                         * Bridge-Tunnel: 0x00 0x00 0xF8
94                         */
95    uint16 type; /* ethertype */
96} PACKED;
97
98/* RFC1042 header used by 802.11 per 802.1H */
99#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) /* RCF1042 header length */
100
101/* Generic 802.11 MAC header */
102/*
103 * N.B.: This struct reflects the full 4 address 802.11 MAC header.
104 * The fields are defined such that the shorter 1, 2, and 3
105 * address headers just use the first k fields.
106 */
107struct dot11_header {
108    uint16 fc; /* frame control */
109    uint16 durid; /* duration/ID */
110    struct ether_addr a1; /* address 1 */
111    struct ether_addr a2; /* address 2 */
112    struct ether_addr a3; /* address 3 */
113    uint16 seq; /* sequence control */
114    struct ether_addr a4; /* address 4 */
115} PACKED;
116
117/* Control frames */
118
119struct dot11_rts_frame {
120    uint16 fc; /* frame control */
121    uint16 durid; /* duration/ID */
122    struct ether_addr ra; /* receiver address */
123    struct ether_addr ta; /* transmitter address */
124} PACKED;
125#define DOT11_RTS_LEN 16 /* d11 RTS frame length */
126
127struct dot11_cts_frame {
128    uint16 fc; /* frame control */
129    uint16 durid; /* duration/ID */
130    struct ether_addr ra; /* receiver address */
131} PACKED;
132#define DOT11_CTS_LEN 10 /* d11 CTS frame length */
133
134struct dot11_ack_frame {
135    uint16 fc; /* frame control */
136    uint16 durid; /* duration/ID */
137    struct ether_addr ra; /* receiver address */
138} PACKED;
139#define DOT11_ACK_LEN 10 /* d11 ACK frame length */
140
141struct dot11_ps_poll_frame {
142    uint16 fc; /* frame control */
143    uint16 durid; /* AID */
144    struct ether_addr bssid; /* receiver address, STA in AP */
145    struct ether_addr ta; /* transmitter address */
146} PACKED;
147#define DOT11_PS_POLL_LEN 16 /* d11 PS poll frame length */
148
149struct dot11_cf_end_frame {
150    uint16 fc; /* frame control */
151    uint16 durid; /* duration/ID */
152    struct ether_addr ra; /* receiver address */
153    struct ether_addr bssid; /* transmitter address, STA in AP */
154} PACKED;
155#define DOT11_CS_END_LEN 16 /* d11 CF-END frame length */
156
157/* BA/BAR Control parameters */
158#define DOT11_BA_CTL_POLICY_NORMAL 0x0000 /* normal ack */
159#define DOT11_BA_CTL_POLICY_NOACK 0x0001 /* no ack */
160#define DOT11_BA_CTL_POLICY_MASK 0x0001 /* ack policy mask */
161
162#define DOT11_BA_CTL_MTID 0x0002 /* multi tid BA */
163#define DOT11_BA_CTL_COMPRESSED 0x0004 /* compressed bitmap */
164
165#define DOT11_BA_CTL_NUMMSDU_MASK 0x0FC0 /* num msdu in bitmap mask */
166#define DOT11_BA_CTL_NUMMSDU_SHIFT 6 /* num msdu in bitmap shift */
167
168#define DOT11_BA_CTL_TID_MASK 0xF000 /* tid mask */
169#define DOT11_BA_CTL_TID_SHIFT 12 /* tid shift */
170
171struct dot11_ba_req_frame {
172    uint16 fc; /* frame control */
173    uint16 durid; /* duration/ID */
174    struct ether_addr ra; /* receiver address */
175    struct ether_addr ta; /* transmitter address */
176    uint16 bar_control; /* BAR Control */
177    uint16 seqnum; /* Starting Sequence control */
178} PACKED;
179#define DOT11_BA_REQ_LEN 20 /* BAR frame length */
180
181#define DOT11_BA_BITMAP_LEN 128 /* bitmap length */
182#define DOT11_BA_CMP_BITMAP_LEN 8 /* compressed bitmap length */
183struct dot11_ba_frame {
184    uint16 fc; /* frame control */
185    uint16 durid; /* duration/ID */
186    struct ether_addr ra; /* receiver address */
187    struct ether_addr ta; /* transmitter address */
188    uint16 ba_control; /* BA Control */
189    uint16 seqnum; /* Starting Sequence control */
190    uint8 bitmap[DOT11_BA_BITMAP_LEN]; /* Block Ack Bitmap */
191} PACKED;
192#define DOT11_BA_LEN 20 /* BA frame length (without bitmap) */
193
194/* Management frame header */
195struct dot11_management_header {
196    uint16 fc; /* frame control */
197    uint16 durid; /* duration/ID */
198    struct ether_addr da; /* receiver address */
199    struct ether_addr sa; /* transmitter address */
200    struct ether_addr bssid; /* BSS ID */
201    uint16 seq; /* sequence control */
202} PACKED;
203#define DOT11_MGMT_HDR_LEN 24 /* d11 management header length */
204
205/* Management frame payloads */
206
207struct dot11_bcn_prb {
208    uint32 timestamp[2];
209    uint16 beacon_interval;
210    uint16 capability;
211} PACKED;
212#define DOT11_BCN_PRB_LEN 12 /* d11 beacon probe frame length */
213
214struct dot11_auth {
215    uint16 alg; /* algorithm */
216    uint16 seq; /* sequence control */
217    uint16 status; /* status code */
218} PACKED;
219#define DOT11_AUTH_FIXED_LEN 6 /* length of auth frame without challenge info
220                         * elt
221                         */
222
223struct dot11_assoc_req {
224    uint16 capability; /* capability information */
225    uint16 listen; /* listen interval */
226} PACKED;
227#define DOT11_ASSOC_REQ_FIXED_LEN 4 /* length of assoc frame without info elts */
228
229struct dot11_reassoc_req {
230    uint16 capability; /* capability information */
231    uint16 listen; /* listen interval */
232    struct ether_addr ap; /* Current AP address */
233} PACKED;
234#define DOT11_REASSOC_REQ_FIXED_LEN 10 /* length of assoc frame without info elts */
235
236struct dot11_assoc_resp {
237    uint16 capability; /* capability information */
238    uint16 status; /* status code */
239    uint16 aid; /* association ID */
240} PACKED;
241
242struct dot11_action_measure {
243    uint8 category;
244    uint8 action;
245    uint8 token;
246    uint8 data[1];
247} PACKED;
248#define DOT11_ACTION_MEASURE_LEN 3 /* d11 action measurement header length */
249
250struct dot11_action_switch_channel {
251    uint8 category;
252    uint8 action;
253    uint8 data[5]; /* for switch IE */
254} PACKED;
255
256struct dot11_action_ht_ch_width {
257    uint8 category;
258    uint8 action;
259    uint8 ch_width;
260} PACKED;
261
262struct dot11_action_ht_mimops {
263    uint8 category;
264    uint8 action;
265    uint8 enable;
266    uint8 psmode;
267} PACKED;
268
269/* ************* 802.11h related definitions. ************* */
270typedef struct {
271    uint8 id;
272    uint8 len;
273    uint8 power;
274} dot11_power_cnst_t;
275
276typedef struct {
277    uint8 min;
278    uint8 max;
279} dot11_power_cap_t;
280
281typedef struct {
282    uint8 id;
283    uint8 len;
284    uint8 tx_pwr;
285    uint8 margin;
286} dot11_tpc_rep_t;
287#define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */
288
289typedef struct {
290    uint8 id;
291    uint8 len;
292    uint8 first_channel;
293    uint8 num_channels;
294} dot11_supp_channels_t;
295
296/* channel switch announcement (CSA) mode type - 802.11h-2003 $7.3.2.20 */
297#define DOT11_CSA_MODE_ADVISORY 0 /* no DOT11_CSA_MODE_NO_TX restriction imposed */
298#define DOT11_CSA_MODE_NO_TX 1 /* no transmission upon receiving CSA frame. */
299
300/* CSA IE data structure */
301struct dot11_channel_switch {
302    uint8 id;
303    uint8 len;
304    uint8 mode;
305    uint8 channel;
306    uint8 count;
307} PACKED;
308typedef struct dot11_channel_switch dot11_channel_switch_t;
309
310#define DOT11_SWITCH_IE_LEN 3 /* length of IE data, not including 2 byte header */
311
312/* 802.11h Measurement Request/Report IEs */
313/* Measurement Type field */
314#define DOT11_MEASURE_TYPE_BASIC 0 /* d11 measurement basic type */
315#define DOT11_MEASURE_TYPE_CCA 1 /* d11 measurement CCA type */
316#define DOT11_MEASURE_TYPE_RPI 2 /* d11 measurement PRI type */
317
318/* Measurement Mode field */
319
320/* Measurement Request Modes */
321#define DOT11_MEASURE_MODE_ENABLE (1<<1) /* d11 measurement enable */
322#define DOT11_MEASURE_MODE_REQUEST (1<<2) /* d11 measurement request */
323#define DOT11_MEASURE_MODE_REPORT (1<<3) /* d11 measurement report */
324/* Measurement Report Modes */
325#define DOT11_MEASURE_MODE_LATE (1<<0) /* d11 measurement late */
326#define DOT11_MEASURE_MODE_INCAPABLE (1<<1) /* d11 measurement incapable */
327#define DOT11_MEASURE_MODE_REFUSED (1<<2) /* d11 measurement refuse */
328/* Basic Measurement Map bits */
329#define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) /* d11 measurement basic map BSS */
330#define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) /* d11 measurement map OFDM */
331#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) /* d11 measurement map unknown */
332#define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) /* d11 measurement map radar */
333#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) /* d11 measurement map unmeasuremnt */
334
335typedef struct {
336    uint8 id;
337    uint8 len;
338    uint8 token;
339    uint8 mode;
340    uint8 type;
341    uint8 channel;
342    uint8 start_time[8];
343    uint16 duration;
344} dot11_meas_req_t;
345#define DOT11_MNG_IE_MREQ_LEN 14 /* d11 measurement request IE length */
346/* length of Measure Request IE data not including variable len */
347#define DOT11_MNG_IE_MREQ_FIXED_LEN 3 /* d11 measurement request IE fixed length */
348
349struct dot11_meas_rep {
350    uint8 id;
351    uint8 len;
352    uint8 token;
353    uint8 mode;
354    uint8 type;
355    union
356    {
357        struct {
358            uint8 channel;
359            uint8 start_time[8];
360            uint16 duration;
361            uint8 map;
362        } PACKED basic;
363        uint8 data[1];
364    } PACKED rep;
365} PACKED;
366typedef struct dot11_meas_rep dot11_meas_rep_t;
367
368/* length of Measure Report IE data not including variable len */
369#define DOT11_MNG_IE_MREP_FIXED_LEN 3 /* d11 measurement response IE fixed length */
370
371struct dot11_meas_rep_basic {
372    uint8 channel;
373    uint8 start_time[8];
374    uint16 duration;
375    uint8 map;
376} PACKED;
377typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t;
378#define DOT11_MEASURE_BASIC_REP_LEN 12 /* d11 measurement basic report length */
379
380struct dot11_quiet {
381    uint8 id;
382    uint8 len;
383    uint8 count; /* TBTTs until beacon interval in quiet starts */
384    uint8 period; /* Beacon intervals between periodic quiet periods ? */
385    uint16 duration; /* Length of quiet period, in TU's */
386    uint16 offset; /* TU's offset from TBTT in Count field */
387} PACKED;
388typedef struct dot11_quiet dot11_quiet_t;
389
390typedef struct {
391    uint8 channel;
392    uint8 map;
393} chan_map_tuple_t;
394
395typedef struct {
396    uint8 id;
397    uint8 len;
398    uint8 eaddr[ETHER_ADDR_LEN];
399    uint8 interval;
400    chan_map_tuple_t map[1];
401} dot11_ibss_dfs_t;
402
403/* WME Elements */
404#define WME_OUI "\x00\x50\xf2" /* WME OUI */
405#define WME_VER 1 /* WME version */
406#define WME_TYPE 2 /* WME type */
407#define WME_SUBTYPE_IE 0 /* Information Element */
408#define WME_SUBTYPE_PARAM_IE 1 /* Parameter Element */
409#define WME_SUBTYPE_TSPEC 2 /* Traffic Specification */
410
411/* WME Access Category Indices (ACIs) */
412#define AC_BE 0 /* Best Effort */
413#define AC_BK 1 /* Background */
414#define AC_VI 2 /* Video */
415#define AC_VO 3 /* Voice */
416#define AC_COUNT 4 /* number of ACs */
417
418typedef uint8 ac_bitmap_t; /* AC bitmap of (1 << AC_xx) */
419
420#define AC_BITMAP_NONE 0x0 /* No ACs */
421#define AC_BITMAP_ALL 0xf /* All ACs */
422#define AC_BITMAP_TST(ab, ac) (((ab) & (1 << (ac))) != 0)
423
424/* WME Information Element (IE) */
425struct wme_ie {
426    uint8 oui[3];
427    uint8 type;
428    uint8 subtype;
429    uint8 version;
430    uint8 qosinfo;
431} PACKED;
432typedef struct wme_ie wme_ie_t;
433#define WME_IE_LEN 7 /* WME IE length */
434
435struct edcf_acparam {
436    uint8 ACI;
437    uint8 ECW;
438    uint16 TXOP; /* stored in network order (ls octet first) */
439} PACKED;
440typedef struct edcf_acparam edcf_acparam_t;
441
442/* WME Parameter Element (PE) */
443struct wme_param_ie {
444    uint8 oui[3];
445    uint8 type;
446    uint8 subtype;
447    uint8 version;
448    uint8 qosinfo;
449    uint8 rsvd;
450    edcf_acparam_t acparam[AC_COUNT];
451} PACKED;
452typedef struct wme_param_ie wme_param_ie_t;
453#define WME_PARAM_IE_LEN 24 /* WME Parameter IE length */
454
455/* QoS Info field for IE as sent from AP */
456#define WME_QI_AP_APSD_MASK 0x80 /* U-APSD Supported mask */
457#define WME_QI_AP_APSD_SHIFT 7 /* U-APSD Supported shift */
458#define WME_QI_AP_COUNT_MASK 0x0f /* Parameter set count mask */
459#define WME_QI_AP_COUNT_SHIFT 0 /* Parameter set count shift */
460
461/* QoS Info field for IE as sent from STA */
462#define WME_QI_STA_MAXSPLEN_MASK 0x60 /* Max Service Period Length mask */
463#define WME_QI_STA_MAXSPLEN_SHIFT 5 /* Max Service Period Length shift */
464#define WME_QI_STA_APSD_ALL_MASK 0xf /* APSD all AC bits mask */
465#define WME_QI_STA_APSD_ALL_SHIFT 0 /* APSD all AC bits shift */
466#define WME_QI_STA_APSD_BE_MASK 0x8 /* APSD AC_BE mask */
467#define WME_QI_STA_APSD_BE_SHIFT 3 /* APSD AC_BE shift */
468#define WME_QI_STA_APSD_BK_MASK 0x4 /* APSD AC_BK mask */
469#define WME_QI_STA_APSD_BK_SHIFT 2 /* APSD AC_BK shift */
470#define WME_QI_STA_APSD_VI_MASK 0x2 /* APSD AC_VI mask */
471#define WME_QI_STA_APSD_VI_SHIFT 1 /* APSD AC_VI shift */
472#define WME_QI_STA_APSD_VO_MASK 0x1 /* APSD AC_VO mask */
473#define WME_QI_STA_APSD_VO_SHIFT 0 /* APSD AC_VO shift */
474
475/* ACI */
476#define EDCF_AIFSN_MIN 1 /* AIFSN minimum value */
477#define EDCF_AIFSN_MAX 15 /* AIFSN maximum value */
478#define EDCF_AIFSN_MASK 0x0f /* AIFSN mask */
479#define EDCF_ACM_MASK 0x10 /* ACM mask */
480#define EDCF_ACI_MASK 0x60 /* ACI mask */
481#define EDCF_ACI_SHIFT 5 /* ACI shift */
482
483/* ECW */
484#define EDCF_ECW_MIN 0 /* cwmin/cwmax exponent minimum value */
485#define EDCF_ECW_MAX 15 /* cwmin/cwmax exponent maximum value */
486#define EDCF_ECW2CW(exp) ((1 << (exp)) - 1)
487#define EDCF_ECWMIN_MASK 0x0f /* cwmin exponent form mask */
488#define EDCF_ECWMAX_MASK 0xf0 /* cwmax exponent form mask */
489#define EDCF_ECWMAX_SHIFT 4 /* cwmax exponent form shift */
490
491/* TXOP */
492#define EDCF_TXOP_MIN 0 /* TXOP minimum value */
493#define EDCF_TXOP_MAX 65535 /* TXOP maximum value */
494#define EDCF_TXOP2USEC(txop) ((txop) << 5)
495
496/* Default EDCF parameters that AP advertises for STA to use; WMM draft Table 12 */
497#define EDCF_AC_BE_ACI_STA 0x03 /* STA ACI value for best effort AC */
498#define EDCF_AC_BE_ECW_STA 0xA4 /* STA ECW value for best effort AC */
499#define EDCF_AC_BE_TXOP_STA 0x0000 /* STA TXOP value for best effort AC */
500#define EDCF_AC_BK_ACI_STA 0x27 /* STA ACI value for background AC */
501#define EDCF_AC_BK_ECW_STA 0xA4 /* STA ECW value for background AC */
502#define EDCF_AC_BK_TXOP_STA 0x0000 /* STA TXOP value for background AC */
503#define EDCF_AC_VI_ACI_STA 0x42 /* STA ACI value for video AC */
504#define EDCF_AC_VI_ECW_STA 0x43 /* STA ECW value for video AC */
505#define EDCF_AC_VI_TXOP_STA 0x005e /* STA TXOP value for video AC */
506#define EDCF_AC_VO_ACI_STA 0x62 /* STA ACI value for audio AC */
507#define EDCF_AC_VO_ECW_STA 0x32 /* STA ECW value for audio AC */
508#define EDCF_AC_VO_TXOP_STA 0x002f /* STA TXOP value for audio AC */
509
510/* Default EDCF parameters that AP uses; WMM draft Table 14 */
511#define EDCF_AC_BE_ACI_AP 0x03 /* AP ACI value for best effort AC */
512#define EDCF_AC_BE_ECW_AP 0x64 /* AP ECW value for best effort AC */
513#define EDCF_AC_BE_TXOP_AP 0x0000 /* AP TXOP value for best effort AC */
514#define EDCF_AC_BK_ACI_AP 0x27 /* AP ACI value for background AC */
515#define EDCF_AC_BK_ECW_AP 0xA4 /* AP ECW value for background AC */
516#define EDCF_AC_BK_TXOP_AP 0x0000 /* AP TXOP value for background AC */
517#define EDCF_AC_VI_ACI_AP 0x41 /* AP ACI value for video AC */
518#define EDCF_AC_VI_ECW_AP 0x43 /* AP ECW value for video AC */
519#define EDCF_AC_VI_TXOP_AP 0x005e /* AP TXOP value for video AC */
520#define EDCF_AC_VO_ACI_AP 0x61 /* AP ACI value for audio AC */
521#define EDCF_AC_VO_ECW_AP 0x32 /* AP ECW value for audio AC */
522#define EDCF_AC_VO_TXOP_AP 0x002f /* AP TXOP value for audio AC */
523
524struct dot11_qbss_load_ie {
525    uint8 id; /* 11, DOT11_MNG_QBSS_LOAD_ID */
526    uint8 length;
527    uint16 station_count; /* total number of STAs associated */
528    uint8 channel_utilization; /* % of time, normalized to 255, QAP sensed medium busy */
529    uint16 aac; /* available admission capacity */
530} PACKED;
531typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t;
532
533/* nom_msdu_size */
534#define FIXED_MSDU_SIZE 0x8000 /* MSDU size is fixed */
535#define MSDU_SIZE_MASK 0x7fff /* (Nominal or fixed) MSDU size */
536
537/* surplus_bandwidth */
538/* Represented as 3 bits of integer, binary point, 13 bits fraction */
539#define INTEGER_SHIFT 13 /* integer shift */
540#define FRACTION_MASK 0x1FFF /* fraction mask */
541
542/* Management Notification Frame */
543struct dot11_management_notification {
544    uint8 category; /* DOT11_ACTION_NOTIFICATION */
545    uint8 action;
546    uint8 token;
547    uint8 status;
548    uint8 data[1]; /* Elements */
549} PACKED;
550#define DOT11_MGMT_NOTIFICATION_LEN 4 /* Fixed length */
551
552/* WME Action Codes */
553#define WME_ADDTS_REQUEST 0 /* WME ADDTS request */
554#define WME_ADDTS_RESPONSE 1 /* WME ADDTS response */
555#define WME_DELTS_REQUEST 2 /* WME DELTS request */
556
557/* WME Setup Response Status Codes */
558#define WME_ADMISSION_ACCEPTED 0 /* WME admission accepted */
559#define WME_INVALID_PARAMETERS 1 /* WME invalide parameters */
560#define WME_ADMISSION_REFUSED 3 /* WME admission refused */
561
562/* Macro to take a pointer to a beacon or probe response
563 * header and return the char* pointer to the SSID info element
564 */
565#define BCN_PRB_SSID(hdr) ((char*)(hdr) + DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_LEN)
566
567/* Authentication frame payload constants */
568#define DOT11_OPEN_SYSTEM 0 /* d11 open authentication */
569#define DOT11_SHARED_KEY 1 /* d11 shared authentication */
570#define DOT11_CHALLENGE_LEN 128 /* d11 chanllenge text length */
571
572/* Frame control macros */
573#define FC_PVER_MASK 0x3 /* PVER mask */
574#define FC_PVER_SHIFT 0 /* PVER shift */
575#define FC_TYPE_MASK 0xC /* type mask */
576#define FC_TYPE_SHIFT 2 /* type shift */
577#define FC_SUBTYPE_MASK 0xF0 /* subtype mask */
578#define FC_SUBTYPE_SHIFT 4 /* subtype shift */
579#define FC_TODS 0x100 /* to DS */
580#define FC_TODS_SHIFT 8 /* to DS shift */
581#define FC_FROMDS 0x200 /* from DS */
582#define FC_FROMDS_SHIFT 9 /* from DS shift */
583#define FC_MOREFRAG 0x400 /* more frag. */
584#define FC_MOREFRAG_SHIFT 10 /* more frag. shift */
585#define FC_RETRY 0x800 /* retry */
586#define FC_RETRY_SHIFT 11 /* retry shift */
587#define FC_PM 0x1000 /* PM */
588#define FC_PM_SHIFT 12 /* PM shift */
589#define FC_MOREDATA 0x2000 /* more data */
590#define FC_MOREDATA_SHIFT 13 /* more data shift */
591#define FC_WEP 0x4000 /* WEP */
592#define FC_WEP_SHIFT 14 /* WEP shift */
593#define FC_ORDER 0x8000 /* order */
594#define FC_ORDER_SHIFT 15 /* order shift */
595
596/* sequence control macros */
597#define SEQNUM_SHIFT 4 /* seq. number shift */
598#define SEQNUM_MAX 0x1000 /* max seqnum + 1 */
599#define FRAGNUM_MASK 0xF /* frag. number mask */
600
601/* Frame Control type/subtype defs */
602
603/* FC Types */
604#define FC_TYPE_MNG 0 /* management type */
605#define FC_TYPE_CTL 1 /* control type */
606#define FC_TYPE_DATA 2 /* data type */
607
608/* Management Subtypes */
609#define FC_SUBTYPE_ASSOC_REQ 0 /* assoc. request */
610#define FC_SUBTYPE_ASSOC_RESP 1 /* assoc. response */
611#define FC_SUBTYPE_REASSOC_REQ 2 /* reassoc. request */
612#define FC_SUBTYPE_REASSOC_RESP 3 /* reassoc. response */
613#define FC_SUBTYPE_PROBE_REQ 4 /* probe request */
614#define FC_SUBTYPE_PROBE_RESP 5 /* probe response */
615#define FC_SUBTYPE_BEACON 8 /* beacon */
616#define FC_SUBTYPE_ATIM 9 /* ATIM */
617#define FC_SUBTYPE_DISASSOC 10 /* disassoc. */
618#define FC_SUBTYPE_AUTH 11 /* authentication */
619#define FC_SUBTYPE_DEAUTH 12 /* de-authentication */
620#define FC_SUBTYPE_ACTION 13 /* action */
621
622/* Control Subtypes */
623#define FC_SUBTYPE_BLOCKACK_REQ 8 /* Block Ack Req */
624#define FC_SUBTYPE_BLOCKACK 9 /* Block Ack */
625#define FC_SUBTYPE_PS_POLL 10 /* PS poll */
626#define FC_SUBTYPE_RTS 11 /* RTS */
627#define FC_SUBTYPE_CTS 12 /* CTS */
628#define FC_SUBTYPE_ACK 13 /* ACK */
629#define FC_SUBTYPE_CF_END 14 /* CF-END */
630#define FC_SUBTYPE_CF_END_ACK 15 /* CF-END ACK */
631
632/* Data Subtypes */
633#define FC_SUBTYPE_DATA 0 /* Data */
634#define FC_SUBTYPE_DATA_CF_ACK 1 /* Data + CF-ACK */
635#define FC_SUBTYPE_DATA_CF_POLL 2 /* Data + CF-Poll */
636#define FC_SUBTYPE_DATA_CF_ACK_POLL 3 /* Data + CF-Ack + CF-Poll */
637#define FC_SUBTYPE_NULL 4 /* Null */
638#define FC_SUBTYPE_CF_ACK 5 /* CF-Ack */
639#define FC_SUBTYPE_CF_POLL 6 /* CF-Poll */
640#define FC_SUBTYPE_CF_ACK_POLL 7 /* CF-Ack + CF-Poll */
641#define FC_SUBTYPE_QOS_DATA 8 /* QoS Data */
642#define FC_SUBTYPE_QOS_DATA_CF_ACK 9 /* QoS Data + CF-Ack */
643#define FC_SUBTYPE_QOS_DATA_CF_POLL 10 /* QoS Data + CF-Poll */
644#define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11 /* QoS Data + CF-Ack + CF-Poll */
645#define FC_SUBTYPE_QOS_NULL 12 /* QoS Null */
646#define FC_SUBTYPE_QOS_CF_POLL 14 /* QoS CF-Poll */
647#define FC_SUBTYPE_QOS_CF_ACK_POLL 15 /* QoS CF-Ack + CF-Poll */
648
649/* Data Subtype Groups */
650#define FC_SUBTYPE_ANY_QOS(s) (((s) & 8) != 0)
651#define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0)
652#define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0)
653#define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0)
654
655/* Type/Subtype Combos */
656#define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) /* FC kind mask */
657
658#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) /* FC kind */
659
660#define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT) /* Subtype from FC */
661#define FC_TYPE(fc) (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT) /* Type from FC */
662
663#define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) /* assoc. request */
664#define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) /* assoc. response */
665#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) /* reassoc. request */
666#define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) /* reassoc. response */
667#define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) /* probe request */
668#define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) /* probe response */
669#define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) /* beacon */
670#define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) /* disassoc */
671#define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) /* authentication */
672#define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) /* deauthentication */
673#define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) /* action */
674
675#define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ) /* Block Ack Req */
676#define FC_BLOCKACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK) /* Block Ack */
677#define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) /* PS poll */
678#define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) /* RTS */
679#define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) /* CTS */
680#define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) /* ACK */
681#define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) /* CF-END */
682#define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) /* CF-END ACK */
683
684#define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) /* data */
685#define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) /* null data */
686#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) /* data CF ACK */
687#define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) /* QoS data */
688#define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) /* QoS null */
689
690/* QoS Control Field */
691
692/* 802.1D Priority */
693#define QOS_PRIO_SHIFT 0 /* QoS priority shift */
694#define QOS_PRIO_MASK 0x0007 /* QoS priority mask */
695#define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) /* QoS priority */
696
697/* Traffic Identifier */
698#define QOS_TID_SHIFT 0 /* QoS TID shift */
699#define QOS_TID_MASK 0x000f /* QoS TID mask */
700#define QOS_TID(qos) (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT) /* QoS TID */
701
702/* End of Service Period (U-APSD) */
703#define QOS_EOSP_SHIFT 4 /* QoS End of Service Period shift */
704#define QOS_EOSP_MASK 0x0010 /* QoS End of Service Period mask */
705#define QOS_EOSP(qos) (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT) /* Qos EOSP */
706
707/* Ack Policy */
708#define QOS_ACK_NORMAL_ACK 0 /* Normal Ack */
709#define QOS_ACK_NO_ACK 1 /* No Ack (eg mcast) */
710#define QOS_ACK_NO_EXP_ACK 2 /* No Explicit Ack */
711#define QOS_ACK_BLOCK_ACK 3 /* Block Ack */
712#define QOS_ACK_SHIFT 5 /* QoS ACK shift */
713#define QOS_ACK_MASK 0x0060 /* QoS ACK mask */
714#define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) /* QoS ACK */
715
716/* A-MSDU flag */
717#define QOS_AMSDU_SHIFT 7 /* AMSDU shift */
718#define QOS_AMSDU_MASK 0x0080 /* AMSDU mask */
719
720/* Management Frames */
721
722/* Management Frame Constants */
723
724/* Fixed fields */
725#define DOT11_MNG_AUTH_ALGO_LEN 2 /* d11 management auth. algo. length */
726#define DOT11_MNG_AUTH_SEQ_LEN 2 /* d11 management auth. seq. length */
727#define DOT11_MNG_BEACON_INT_LEN 2 /* d11 management beacon interval length */
728#define DOT11_MNG_CAP_LEN 2 /* d11 management cap. length */
729#define DOT11_MNG_AP_ADDR_LEN 6 /* d11 management AP address length */
730#define DOT11_MNG_LISTEN_INT_LEN 2 /* d11 management listen interval length */
731#define DOT11_MNG_REASON_LEN 2 /* d11 management reason length */
732#define DOT11_MNG_AID_LEN 2 /* d11 management AID length */
733#define DOT11_MNG_STATUS_LEN 2 /* d11 management status length */
734#define DOT11_MNG_TIMESTAMP_LEN 8 /* d11 management timestamp length */
735
736/* DUR/ID field in assoc resp is 0xc000 | AID */
737#define DOT11_AID_MASK 0x3fff /* d11 AID mask */
738
739/* Reason Codes */
740#define DOT11_RC_RESERVED 0 /* d11 RC reserved */
741#define DOT11_RC_UNSPECIFIED 1 /* Unspecified reason */
742#define DOT11_RC_AUTH_INVAL 2 /* Previous authentication no longer
743                             * valid
744                             */
745#define DOT11_RC_DEAUTH_LEAVING 3 /* Deauthenticated because sending station
746                             * is leaving (or has left) IBSS or ESS
747                             */
748#define DOT11_RC_INACTIVITY 4 /* Disassociated due to inactivity */
749#define DOT11_RC_BUSY 5 /* Disassociated because AP is unable
750                             * to handle all currently associated
751                             * stations
752                             */
753#define DOT11_RC_INVAL_CLASS_2 6 /* Class 2 frame received from
754                             * nonauthenticated station
755                             */
756#define DOT11_RC_INVAL_CLASS_3 7 /* Class 3 frame received from
757                             * nonassociated station
758                             */
759#define DOT11_RC_DISASSOC_LEAVING 8 /* Disassociated because sending station is
760                             * leaving (or has left) BSS
761                             */
762#define DOT11_RC_NOT_AUTH 9 /* Station requesting (re)association is
763                             * not authenticated with responding
764                             * station
765                             */
766#define DOT11_RC_MAX 23 /* Reason codes > 23 are reserved */
767
768/* Status Codes */
769#define DOT11_STATUS_SUCCESS 0 /* Successful */
770#define DOT11_STATUS_FAILURE 1 /* Unspecified failure */
771#define DOT11_STATUS_CAP_MISMATCH 10 /* Cannot support all requested
772                             * capabilities in the Capability
773                             * Information field
774                             */
775#define DOT11_STATUS_REASSOC_FAIL 11 /* Reassociation denied due to inability
776                             * to confirm that association exists
777                             */
778#define DOT11_STATUS_ASSOC_FAIL 12 /* Association denied due to reason
779                             * outside the scope of this standard
780                             */
781#define DOT11_STATUS_AUTH_MISMATCH 13 /* Responding station does not support
782                             * the specified authentication
783                             * algorithm
784                             */
785#define DOT11_STATUS_AUTH_SEQ 14 /* Received an Authentication frame
786                             * with authentication transaction
787                             * sequence number out of expected
788                             * sequence
789                             */
790#define DOT11_STATUS_AUTH_CHALLENGE_FAIL 15 /* Authentication rejected because of
791                             * challenge failure
792                             */
793#define DOT11_STATUS_AUTH_TIMEOUT 16 /* Authentication rejected due to timeout
794                             * waiting for next frame in sequence
795                             */
796#define DOT11_STATUS_ASSOC_BUSY_FAIL 17 /* Association denied because AP is
797                             * unable to handle additional
798                             * associated stations
799                             */
800#define DOT11_STATUS_ASSOC_RATE_MISMATCH 18 /* Association denied due to requesting
801                             * station not supporting all of the
802                             * data rates in the BSSBasicRateSet
803                             * parameter
804                             */
805#define DOT11_STATUS_ASSOC_SHORT_REQUIRED 19 /* Association denied due to requesting
806                             * station not supporting the Short
807                             * Preamble option
808                             */
809#define DOT11_STATUS_ASSOC_PBCC_REQUIRED 20 /* Association denied due to requesting
810                             * station not supporting the PBCC
811                             * Modulation option
812                             */
813#define DOT11_STATUS_ASSOC_AGILITY_REQUIRED 21 /* Association denied due to requesting
814                             * station not supporting the Channel
815                             * Agility option
816                             */
817#define DOT11_STATUS_ASSOC_SPECTRUM_REQUIRED 22 /* Association denied because Spectrum
818                             * Management capability is required.
819                             */
820#define DOT11_STATUS_ASSOC_BAD_POWER_CAP 23 /* Association denied because the info
821                             * in the Power Cap element is
822                             * unacceptable.
823                             */
824#define DOT11_STATUS_ASSOC_BAD_SUP_CHANNELS 24 /* Association denied because the info
825                             * in the Supported Channel element is
826                             * unacceptable
827                             */
828#define DOT11_STATUS_ASSOC_SHORTSLOT_REQUIRED 25 /* Association denied due to requesting
829                             * station not supporting the Short Slot
830                             * Time option
831                             */
832#define DOT11_STATUS_ASSOC_ERPBCC_REQUIRED 26 /* Association denied due to requesting
833                             * station not supporting the ER-PBCC
834                             * Modulation option
835                             */
836#define DOT11_STATUS_ASSOC_DSSOFDM_REQUIRED 27 /* Association denied due to requesting
837                             * station not supporting the DSS-OFDM
838                             * option
839                             */
840
841/* Info Elts, length of INFORMATION portion of Info Elts */
842#define DOT11_MNG_DS_PARAM_LEN 1 /* d11 management DS parameter length */
843#define DOT11_MNG_IBSS_PARAM_LEN 2 /* d11 management IBSS parameter length */
844
845/* TIM Info element has 3 bytes fixed info in INFORMATION field,
846 * followed by 1 to 251 bytes of Partial Virtual Bitmap
847 */
848#define DOT11_MNG_TIM_FIXED_LEN 3 /* d11 management TIM fixed length */
849#define DOT11_MNG_TIM_DTIM_COUNT 0 /* d11 management DTIM count */
850#define DOT11_MNG_TIM_DTIM_PERIOD 1 /* d11 management DTIM period */
851#define DOT11_MNG_TIM_BITMAP_CTL 2 /* d11 management TIM BITMAP control */
852#define DOT11_MNG_TIM_PVB 3 /* d11 management TIM PVB */
853
854/* TLV defines */
855#define TLV_TAG_OFF 0 /* tag offset */
856#define TLV_LEN_OFF 1 /* length offset */
857#define TLV_HDR_LEN 2 /* header length */
858#define TLV_BODY_OFF 2 /* body offset */
859
860/* Management Frame Information Element IDs */
861#define DOT11_MNG_SSID_ID 0 /* d11 management SSID id */
862#define DOT11_MNG_RATES_ID 1 /* d11 management rates id */
863#define DOT11_MNG_FH_PARMS_ID 2 /* d11 management FH parameter id */
864#define DOT11_MNG_DS_PARMS_ID 3 /* d11 management DS parameter id */
865#define DOT11_MNG_CF_PARMS_ID 4 /* d11 management CF parameter id */
866#define DOT11_MNG_TIM_ID 5 /* d11 management TIM id */
867#define DOT11_MNG_IBSS_PARMS_ID 6 /* d11 management IBSS parameter id */
868#define DOT11_MNG_COUNTRY_ID 7 /* d11 management country id */
869#define DOT11_MNG_HOPPING_PARMS_ID 8 /* d11 management hopping parameter id */
870#define DOT11_MNG_HOPPING_TABLE_ID 9 /* d11 management hopping table id */
871#define DOT11_MNG_REQUEST_ID 10 /* d11 management request id */
872#define DOT11_MNG_QBSS_LOAD_ID 11 /* d11 management QBSS Load id */
873#define DOT11_MNG_CHALLENGE_ID 16 /* d11 management chanllenge id */
874#define DOT11_MNG_PWR_CONSTRAINT_ID 32 /* 11H PowerConstraint */
875#define DOT11_MNG_PWR_CAP_ID 33 /* 11H PowerCapability */
876#define DOT11_MNG_TPC_REQUEST_ID 34 /* 11H TPC Request */
877#define DOT11_MNG_TPC_REPORT_ID 35 /* 11H TPC Report */
878#define DOT11_MNG_SUPP_CHANNELS_ID 36 /* 11H Supported Channels */
879#define DOT11_MNG_CHANNEL_SWITCH_ID 37 /* 11H ChannelSwitch Announcement */
880#define DOT11_MNG_MEASURE_REQUEST_ID 38 /* 11H MeasurementRequest */
881#define DOT11_MNG_MEASURE_REPORT_ID 39 /* 11H MeasurementReport */
882#define DOT11_MNG_QUIET_ID 40 /* 11H Quiet */
883#define DOT11_MNG_IBSS_DFS_ID 41 /* 11H IBSS_DFS */
884#define DOT11_MNG_ERP_ID 42 /* d11 management ERP id */
885#define DOT11_MNG_TS_DELAY_ID 43 /* d11 management TS Delay id */
886#define DOT11_MNG_NONERP_ID 47 /* d11 management NON-ERP id */
887#define DOT11_MNG_RSN_ID 48 /* d11 management RSN id */
888#define DOT11_MNG_EXT_RATES_ID 50 /* d11 management ext. rates id */
889#define DOT11_MNG_WPA_ID 221 /* d11 management WPA id */
890#define DOT11_MNG_PROPR_ID 221 /* d11 management proprietary id */
891
892/* Rate element Basic flag and rate mask */
893#define DOT11_RATE_BASIC 0x80 /* flag for a Basic Rate */
894#define DOT11_RATE_MASK 0x7F /* mask for numeric part of rate */
895
896/* ERP info element bit values */
897#define DOT11_MNG_ERP_LEN 1 /* ERP is currently 1 byte long */
898#define DOT11_MNG_NONERP_PRESENT 0x01 /* NonERP (802.11b) STAs are present
899                             *in the BSS
900                             */
901#define DOT11_MNG_USE_PROTECTION 0x02 /* Use protection mechanisms for
902                             *ERP-OFDM frames
903                             */
904#define DOT11_MNG_BARKER_PREAMBLE 0x04 /* Short Preambles: 0 == allowed,
905                             * 1 == not allowed
906                             */
907/* TS Delay element offset & size */
908#define DOT11_MGN_TS_DELAY_LEN 4 /* length of TS DELAY IE */
909#define TS_DELAY_FIELD_SIZE 4 /* TS DELAY field size */
910
911/* Capability Information Field */
912#define DOT11_CAP_ESS 0x0001 /* d11 cap. ESS */
913#define DOT11_CAP_IBSS 0x0002 /* d11 cap. IBSS */
914#define DOT11_CAP_POLLABLE 0x0004 /* d11 cap. pollable */
915#define DOT11_CAP_POLL_RQ 0x0008 /* d11 cap. poll request */
916#define DOT11_CAP_PRIVACY 0x0010 /* d11 cap. privacy */
917#define DOT11_CAP_SHORT 0x0020 /* d11 cap. short */
918#define DOT11_CAP_PBCC 0x0040 /* d11 cap. PBCC */
919#define DOT11_CAP_AGILITY 0x0080 /* d11 cap. agility */
920#define DOT11_CAP_SPECTRUM 0x0100 /* d11 cap. spectrum */
921#define DOT11_CAP_SHORTSLOT 0x0400 /* d11 cap. shortslot */
922#define DOT11_CAP_CCK_OFDM 0x2000 /* d11 cap. CCK/OFDM */
923
924/* Action Frame Constants */
925#define DOT11_ACTION_CAT_ERR_MASK 0x80 /* d11 action category error mask */
926#define DOT11_ACTION_CAT_MASK 0x7F /* d11 action category mask */
927#define DOT11_ACTION_CAT_SPECT_MNG 0x00 /* d11 action category spectrum management */
928#define DOT11_ACTION_CAT_BLOCKACK 0x03 /* d11 action category block ack */
929#define DOT11_ACTION_NOTIFICATION 0x11 /* 17 */
930
931#define DOT11_ACTION_ID_M_REQ 0 /* d11 action measurement request */
932#define DOT11_ACTION_ID_M_REP 1 /* d11 action measurement response */
933#define DOT11_ACTION_ID_TPC_REQ 2 /* d11 action TPC request */
934#define DOT11_ACTION_ID_TPC_REP 3 /* d11 action TPC response */
935#define DOT11_ACTION_ID_CHANNEL_SWITCH 4 /* d11 action channel switch */
936
937/* HT (EWC) action ids */
938#define DOT11_ACTION_ID_HT_CH_WIDTH 0 /* mimo ps action frame id */
939#define DOT11_ACTION_ID_HT_MIMO_PS 1 /* mimo ps action frame id */
940
941/* Block Ack action types */
942#define DOT11_BA_ACTION_ADDBA_REQ 0 /* ADDBA Req action frame type */
943#define DOT11_BA_ACTION_ADDBA_RESP 1 /* ADDBA Resp action frame type */
944#define DOT11_BA_ACTION_DELBA 2 /* DELBA action frame type */
945
946/* ADDBA action parameters */
947#define DOT11_ADDBA_PARAM_POLICY_MASK 0x0002 /* policy mask(ack vs delayed) */
948#define DOT11_ADDBA_PARAM_POLICY_SHIFT 1 /* policy shift */
949#define DOT11_ADDBA_PARAM_TID_MASK 0x003c /* tid mask */
950#define DOT11_ADDBA_PARAM_TID_SHIFT 2 /* tid shift */
951#define DOT11_ADDBA_PARAM_BSIZE_MASK 0xffc0 /* buffer size mask */
952#define DOT11_ADDBA_PARAM_BSIZE_SHIFT 6 /* buffer size shift */
953
954#define DOT11_ADDBA_POLICY_DELAYED 0 /* delayed BA policy */
955#define DOT11_ADDBA_POLICY_IMMEDIATE 1 /* immediate BA policy */
956
957struct dot11_addba_req {
958    uint8 category; /* category of action frame (3) */
959    uint8 action; /* action: addba req */
960    uint8 token; /* identifier */
961    uint16 addba_param_set; /* parameter set */
962    uint16 timeout; /* timeout in seconds */
963    uint16 start_seqnum; /* starting sequence number */
964}PACKED;
965typedef struct dot11_addba_req dot11_addba_req_t;
966#define DOT11_ADDBA_REQ_LEN 9 /* length of addba req frame */
967
968struct dot11_addba_resp {
969    uint8 category; /* category of action frame (3) */
970    uint8 action; /* action: addba resp */
971    uint8 token; /* identifier */
972    uint16 status; /* status of add request */
973    uint16 addba_param_set; /* negotiated parameter set */
974    uint16 timeout; /* negotiated timeout in seconds */
975}PACKED;
976typedef struct dot11_addba_resp dot11_addba_resp_t;
977#define DOT11_ADDBA_RESP_LEN 9 /* length of addba resp frame */
978
979/* DELBA action parameters */
980#define DOT11_DELBA_PARAM_INIT_MASK 0x0800 /* initiator mask */
981#define DOT11_DELBA_PARAM_INIT_SHIFT 11 /* initiator shift */
982#define DOT11_DELBA_PARAM_TID_MASK 0xf000 /* tid mask */
983#define DOT11_DELBA_PARAM_TID_SHIFT 12 /* tid shift */
984
985struct dot11_delba {
986    uint8 category; /* category of action frame (3) */
987    uint8 action; /* action: addba req */
988    uint16 delba_param_set; /* paarmeter set */
989    uint16 reason; /* reason for dellba */
990}PACKED;
991typedef struct dot11_delba dot11_delba_t;
992#define DOT11_DELBA_LEN 6 /* length of delba frame */
993
994/* MLME Enumerations */
995#define DOT11_BSSTYPE_INFRASTRUCTURE 0 /* d11 infrastructure */
996#define DOT11_BSSTYPE_INDEPENDENT 1 /* d11 independent */
997#define DOT11_BSSTYPE_ANY 2 /* d11 any BSS type */
998#define DOT11_SCANTYPE_ACTIVE 0 /* d11 scan active */
999#define DOT11_SCANTYPE_PASSIVE 1 /* d11 scan passive */
1000
1001/* 802.11 BRCM "Compromise" Pre N constants */
1002#define PREN_PREAMBLE 24 /* green field preamble time */
1003#define PREN_MM_EXT 16 /* extra mixed mode preamble time */
1004#define PREN_PREAMBLE_EXT 4 /* extra preamble (multiply by unique_streams-1) */
1005
1006/* 802.11 A PHY constants */
1007#define APHY_SLOT_TIME 9 /* APHY slot time */
1008#define APHY_SIFS_TIME 16 /* APHY SIFS time */
1009#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) /* APHY DIFS time */
1010#define APHY_PREAMBLE_TIME 16 /* APHY preamble time */
1011#define APHY_SIGNAL_TIME 4 /* APHY signal time */
1012#define APHY_SYMBOL_TIME 4 /* APHY symbol time */
1013#define APHY_SERVICE_NBITS 16 /* APHY service nbits */
1014#define APHY_TAIL_NBITS 6 /* APHY tail nbits */
1015#define APHY_CWMIN 15 /* APHY cwmin */
1016
1017/* 802.11 B PHY constants */
1018#define BPHY_SLOT_TIME 20 /* BPHY slot time */
1019#define BPHY_SIFS_TIME 10 /* BPHY SIFS time */
1020#define BPHY_DIFS_TIME 50 /* BPHY DIFS time */
1021#define BPHY_PLCP_TIME 192 /* BPHY PLCP time */
1022#define BPHY_PLCP_SHORT_TIME 96 /* BPHY PLCP short time */
1023#define BPHY_CWMIN 31 /* BPHY cwmin */
1024
1025/* 802.11 G constants */
1026#define DOT11_OFDM_SIGNAL_EXTENSION 6 /* d11 OFDM signal extension */
1027
1028#define PHY_CWMAX 1023 /* PHY cwmax */
1029
1030#define DOT11_MAXNUMFRAGS 16 /* max # fragments per MSDU */
1031
1032/* dot11Counters Table - 802.11 spec., Annex D */
1033typedef struct d11cnt {
1034    uint32 txfrag; /* dot11TransmittedFragmentCount */
1035    uint32 txmulti; /* dot11MulticastTransmittedFrameCount */
1036    uint32 txfail; /* dot11FailedCount */
1037    uint32 txretry; /* dot11RetryCount */
1038    uint32 txretrie; /* dot11MultipleRetryCount */
1039    uint32 rxdup; /* dot11FrameduplicateCount */
1040    uint32 txrts; /* dot11RTSSuccessCount */
1041    uint32 txnocts; /* dot11RTSFailureCount */
1042    uint32 txnoack; /* dot11ACKFailureCount */
1043    uint32 rxfrag; /* dot11ReceivedFragmentCount */
1044    uint32 rxmulti; /* dot11MulticastReceivedFrameCount */
1045    uint32 rxcrc; /* dot11FCSErrorCount */
1046    uint32 txfrmsnt; /* dot11TransmittedFrameCount */
1047    uint32 rxundec; /* dot11WEPUndecryptableCount */
1048} d11cnt_t;
1049
1050/* BRCM OUI */
1051#define BRCM_OUI "\x00\x10\x18" /* Broadcom OUI */
1052
1053/* OUI for BRCM proprietary IE */
1054#define BRCM_PROP_OUI "\x00\x90\x4C" /* Broadcom proprietary OUI */
1055
1056/* BRCM info element */
1057struct brcm_ie {
1058    uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */
1059    uint8 len; /* IE length */
1060    uint8 oui[3]; /* Proprietary OUI, BRCM_OUI */
1061    uint8 ver; /* type/ver of this IE */
1062    uint8 assoc; /* # of assoc STAs */
1063    uint8 flags; /* misc flags */
1064    uint8 flags1; /* misc flags */
1065    uint16 amsdu_mtu_pref; /* preferred A-MSDU MTU */
1066} PACKED;
1067typedef struct brcm_ie brcm_ie_t;
1068#define BRCM_IE_LEN 11 /* BRCM IE length */
1069#define BRCM_IE_VER 2 /* BRCM IE version */
1070#define BRCM_IE_LEGACY_AES_VER 1 /* BRCM IE legacy AES version */
1071
1072/* brcm_ie flags */
1073#define BRF_ABCAP 0x1 /* afterburner capable */
1074#define BRF_ABRQRD 0x2 /* afterburner requested */
1075#define BRF_LZWDS 0x4 /* lazy wds enabled */
1076#define BRF_BLOCKACK 0x8 /* BlockACK capable */
1077#define BRF_ABCOUNTER_MASK 0xf0 /* afterburner wds "state" counter */
1078#define BRF_ABCOUNTER_SHIFT 4 /* offset of afterburner wds "state" counter */
1079
1080/* brcm_ie flags1 */
1081#define BRF1_AMSDU 0x1 /* A-MSDU capable */
1082
1083#define AB_WDS_TIMEOUT_MAX 15 /* afterburner wds Max count indicating not
1084                     * locally capable
1085                     */
1086#define AB_WDS_TIMEOUT_MIN 1 /* afterburner wds, use zero count as indicating
1087                     * "downrev"
1088                     */
1089
1090/* EWC definitions */
1091#define MCSSET_LEN 16 /* 16-bits per 8-bit set to give 128-bits bitmap of MCS Index */
1092
1093struct ewc_cap {
1094    uint16 cap;
1095    uint8 params;
1096    uint8 supp_mcs[MCSSET_LEN];
1097    uint16 ext_htcap;
1098    uint32 txbf_cap;
1099    uint8 as_cap;
1100} PACKED;
1101typedef struct ewc_cap ewc_cap_t;
1102
1103/* CAP IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */
1104/* the capability IE is primarily used to convey this nodes abilities */
1105struct ewc_cap_ie {
1106    uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */
1107    uint8 len; /* IE length */
1108    uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */
1109    uint8 type; /* type inidicates what follows */
1110    ewc_cap_t cap;
1111} PACKED;
1112typedef struct ewc_cap_ie ewc_cap_ie_t;
1113
1114#define EWC_CAP_IE_LEN (26+4)
1115#define EWC_CAP_IE_TYPE 51
1116
1117#define EWC_CAP_ADC_CODING 0x0001 /* Advance coding support */
1118#define EWC_CAP_40MHZ 0x0002 /* FALSE:20Mhz, TRUE: 20 and 40MHZ supported */
1119#define EWC_CAP_MIMO_PS_MASK 0x000C /* Mimo PS mask */
1120#define EWC_CAP_MIMO_PS_SHIFT 0x0002 /* Mimo PS shift */
1121#define EWC_CAP_MIMO_PS_OFF 0x0003 /* Mimo PS, no restriction */
1122#define EWC_CAP_MIMO_PS_RTS 0x0001 /* Mimo PS, send RTS/CTS around MIMO frames */
1123#define EWC_CAP_MIMO_PS_ON 0x0000 /* Mimo PS, MIMO disallowed */
1124#define EWC_CAP_GF 0x0010 /* Greenfield preamble support */
1125#define EWC_CAP_SHORT_GI_20 0x0020 /* 20MHZ short guard interval support */
1126#define EWC_CAP_SHORT_GI_40 0x0040 /* 40Mhz short guard interval support */
1127#define EWC_CAP_TX_STBC 0x0080 /* Tx STBC support */
1128#define EWC_CAP_RX_STBC_MASK 0x0300 /* Rx STBC mask */
1129#define EWC_CAP_RX_STBC_SHIFT 8 /* Rx STBC shift */
1130#define EWC_CAP_DELAYED_BA 0x0400 /* delayed BA support */
1131#define EWC_CAP_MAX_AMSDU 0x0800 /* Max AMSDU size in bytes , 0=3839, 1=7935 */
1132#define EWC_CAP_DSSS_CCK 0x1000 /* DSSS/CCK supported by the BSS */
1133#define EWC_CAP_PSMP 0x2000 /* Power Save Multi Poll support */
1134#define EWC_CAP_STBC_CTL 0x4000 /* STBC control frame support */
1135#define EWC_CAP_LSIG_TXOP 0x8000 /* L-SIG TXOP protection support */
1136
1137#define EWC_MAX_AMSDU 7935 /* max amsdu size (bytes) per the EWC spec */
1138#define EWC_MIN_AMSDU 3835 /* min amsdu size (bytes) per the EWC spec */
1139
1140#define EWC_PARAMS_RX_FACTOR_MASK 0x03 /* ampdu rcv factor mask */
1141#define EWC_PARAMS_DENSITY_MASK 0x1C /* ampdu density mask */
1142#define EWC_PARAMS_DENSITY_SHIFT 2 /* ampdu density shift */
1143
1144/* EWC/AMPDU specific define */
1145#define AMPDU_MAX_MPDU_DENSITY 7 /* max mpdu density; in 1/8 usec units */
1146#define AMPDU_MAX_RX_FACTOR 3 /* max rcv ampdu len (64kb) */
1147#define AMPDU_RX_FACTOR_BASE 8*1024 /* ampdu factor base for rx len */
1148#define AMPDU_DELIMITER_LEN 4 /* length of ampdu delimiter */
1149
1150struct ewc_add {
1151    uint8 ctl_ch; /* control channel number */
1152    uint8 byte1; /* ext ch,rec. ch. width, RIFS support */
1153    uint16 opmode; /* operation mode */
1154    uint16 misc_bits; /* misc bits */
1155    uint8 basic_mcs[MCSSET_LEN]; /* required MCS set */
1156} PACKED;
1157typedef struct ewc_add ewc_add_t;
1158
1159/* ADD IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */
1160/* the additional IE is primarily used to convey the current BSS configuration */
1161struct ewc_add_ie {
1162    uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */
1163    uint8 len; /* IE length */
1164    uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */
1165    uint8 type; /* indicates what follows */
1166    ewc_add_t add;
1167} PACKED;
1168typedef struct ewc_add_ie ewc_add_ie_t;
1169
1170#define EWC_ADD_IE_LEN (22+4)
1171#define EWC_ADD_IE_TYPE 52
1172
1173/* byte1 defn's */
1174#define EWC_EXT_CH_MASK 0x03 /* extension channel mask */
1175#define EWC_EXT_CH_UPPER 0x01 /* ext. ch. on upper sb */
1176#define EWC_EXT_CH_LOWER 0x03 /* ext. ch. on lower sb */
1177#define EWC_EXT_CH_NONE 0x00 /* extension channel mask */
1178#define EWC_BW_ANY 0x04 /* set, STA can use 20 or 40MHz */
1179#define EWC_RIFS_PERMITTED 0x08 /* RIFS allowed */
1180
1181/* opmode defn's */
1182#define EWC_OPMODE_MASK 0x0003 /* protection mode mask */
1183#define EWC_OPMODE_PURE 0x0000 /* protection mode PURE */
1184#define EWC_OPMODE_HT20IN40 0x0002 /* protection mode 20MHz HT in 40MHz BSS */
1185#define EWC_OPMODE_MIXED 0x0003 /* protection mode Mixed Mode */
1186#define EWC_NONGF_PRESENT 0x0004 /* protection mode non-GF */
1187
1188/* misc_bites defn's */
1189#define EWC_BASIC_STBC_MCS 0x007f /* basic STBC MCS */
1190#define EWC_DUAL_STBC_PROT 0x0080 /* Dual STBC Protection */
1191#define EWC_SECOND_BCN 0x0100 /* Secondary beacon support */
1192#define EWC_LSIG_TXOP 0x0200 /* L-SIG TXOP Protection full support */
1193#define EWC_PCO_ACTIVE 0x0400 /* PCO active */
1194#define EWC_PCO_PHASE 0x0800 /* PCO phase */
1195
1196/* Macros for opmode */
1197#define EWC_MIXEDMODE_PRESENT(add) ((ltoh16_ua(&add.opmode) & EWC_OPMODE_MASK) \
1198                   == EWC_OPMODE_MIXED) /* mixed mode present */
1199#define EWC_HT20_PRESENT(add) ((ltoh16_ua(&add.opmode) & EWC_OPMODE_MASK) \
1200                == EWC_OPMODE_HT20IN40) /* 20MHz HT present */
1201#define EWC_USE_PROTECTION(add) (EWC_HT20_PRESENT((add)) || \
1202                EWC_MIXEDMODE_PRESENT((add))) /* use protection */
1203
1204/* Vendor IE structure */
1205struct vndr_ie {
1206    uchar id;
1207    uchar len;
1208    uchar oui [3];
1209    uchar data [1]; /* Variable size data */
1210}PACKED;
1211typedef struct vndr_ie vndr_ie_t;
1212
1213#define VNDR_IE_HDR_LEN 2 /* id + len field */
1214#define VNDR_IE_MIN_LEN 3 /* size of the oui field */
1215#define VNDR_IE_MAX_LEN 256 /* verdor IE max length */
1216
1217/* WPA definitions */
1218#define WPA_VERSION 1 /* WPA version */
1219#define WPA_OUI "\x00\x50\xF2" /* WPA OUI */
1220
1221#define WPA2_VERSION 1 /* WPA2 version */
1222#define WPA2_VERSION_LEN 2 /* WAP2 version length */
1223#define WPA2_OUI "\x00\x0F\xAC" /* WPA2 OUI */
1224
1225#define WPA_OUI_LEN 3 /* WPA OUI length */
1226
1227/* RSN authenticated key managment suite */
1228#define RSN_AKM_NONE 0 /* None (IBSS) */
1229#define RSN_AKM_UNSPECIFIED 1 /* Over 802.1x */
1230#define RSN_AKM_PSK 2 /* Pre-shared Key */
1231
1232/* Key related defines */
1233#define DOT11_MAX_DEFAULT_KEYS 4 /* number of default keys */
1234#define DOT11_MAX_KEY_SIZE 32 /* max size of any key */
1235#define DOT11_MAX_IV_SIZE 16 /* max size of any IV */
1236#define DOT11_EXT_IV_FLAG (1<<5) /* flag to indicate IV is > 4 bytes */
1237
1238#define WEP1_KEY_SIZE 5 /* max size of any WEP key */
1239#define WEP1_KEY_HEX_SIZE 10 /* size of WEP key in hex. */
1240#define WEP128_KEY_SIZE 13 /* max size of any WEP key */
1241#define WEP128_KEY_HEX_SIZE 26 /* size of WEP key in hex. */
1242#define TKIP_MIC_SIZE 8 /* size of TKIP MIC */
1243#define TKIP_EOM_SIZE 7 /* max size of TKIP EOM */
1244#define TKIP_EOM_FLAG 0x5a /* TKIP EOM flag byte */
1245#define TKIP_KEY_SIZE 32 /* size of any TKIP key */
1246#define TKIP_MIC_AUTH_TX 16 /* offset to Authenticator MIC TX key */
1247#define TKIP_MIC_AUTH_RX 24 /* offset to Authenticator MIC RX key */
1248#define TKIP_MIC_SUP_RX TKIP_MIC_AUTH_TX /* offset to Supplicant MIC RX key */
1249#define TKIP_MIC_SUP_TX TKIP_MIC_AUTH_RX /* offset to Supplicant MIC TX key */
1250#define AES_KEY_SIZE 16 /* size of AES key */
1251
1252#undef PACKED
1253#if !defined(__GNUC__)
1254#pragma pack()
1255#endif
1256
1257#endif /* _802_11_H_ */
1258

Archive Download this file



interactive