get rid of $Id$ - it has never helped us and it has broken too many patches ;)
[openwrt.git] / package / broadcom-wl / src / driver / proto / 802.11.h
1 /*
2  * Copyright 2007, 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 */
88 struct 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  */
107 struct 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
119 struct 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
127 struct 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
134 struct 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
141 struct 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
149 struct 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
171 /* control frame header (BA/BAR) */
172 struct dot11_ctl_header {
173         uint16                  fc;             /* frame control */
174         uint16                  durid;          /* duration/ID */
175         struct ether_addr       ra;             /* receiver address */
176         struct ether_addr       ta;             /* transmitter address */
177 } PACKED;
178 #define DOT11_CTL_HDR_LEN       16              /* control frame hdr len */
179
180 /* BAR frame payload */
181 struct dot11_bar {
182         uint16                  bar_control;    /* BAR Control */
183         uint16                  seqnum;         /* Starting Sequence control */
184 } PACKED;
185 #define DOT11_BAR_LEN           4               /* BAR frame payload length */
186
187 #define DOT11_BA_BITMAP_LEN     128             /* bitmap length */
188 #define DOT11_BA_CMP_BITMAP_LEN 8               /* compressed bitmap length */
189 /* BA frame payload */
190 struct dot11_ba {
191         uint16                  ba_control;     /* BA Control */
192         uint16                  seqnum;         /* Starting Sequence control */
193         uint8                   bitmap[DOT11_BA_BITMAP_LEN];    /* Block Ack Bitmap */
194 } PACKED;
195 #define DOT11_BA_LEN            4               /* BA frame payload len (wo bitmap) */
196
197 /* Management frame header */
198 struct dot11_management_header {
199         uint16                  fc;             /* frame control */
200         uint16                  durid;          /* duration/ID */
201         struct ether_addr       da;             /* receiver address */
202         struct ether_addr       sa;             /* transmitter address */
203         struct ether_addr       bssid;          /* BSS ID */
204         uint16                  seq;            /* sequence control */
205 } PACKED;
206 #define DOT11_MGMT_HDR_LEN      24              /* d11 management header length */
207
208 /* Management frame payloads */
209
210 struct dot11_bcn_prb {
211         uint32                  timestamp[2];
212         uint16                  beacon_interval;
213         uint16                  capability;
214 } PACKED;
215 #define DOT11_BCN_PRB_LEN       12              /* 802.11 beacon/probe frame fixed length */
216
217 struct dot11_auth {
218         uint16                  alg;            /* algorithm */
219         uint16                  seq;            /* sequence control */
220         uint16                  status;         /* status code */
221 } PACKED;
222 #define DOT11_AUTH_FIXED_LEN    6               /* length of auth frame without challenge info
223                                                  * elt
224                                                  */
225
226 struct dot11_assoc_req {
227         uint16                  capability;     /* capability information */
228         uint16                  listen;         /* listen interval */
229 } PACKED;
230 #define DOT11_ASSOC_REQ_FIXED_LEN       4       /* length of assoc frame without info elts */
231
232 struct dot11_reassoc_req {
233         uint16                  capability;     /* capability information */
234         uint16                  listen;         /* listen interval */
235         struct ether_addr       ap;             /* Current AP address */
236 } PACKED;
237 #define DOT11_REASSOC_REQ_FIXED_LEN     10      /* length of assoc frame without info elts */
238
239 struct dot11_assoc_resp {
240         uint16                  capability;     /* capability information */
241         uint16                  status;         /* status code */
242         uint16                  aid;            /* association ID */
243 } PACKED;
244
245 struct dot11_action_measure {
246         uint8   category;
247         uint8   action;
248         uint8   token;
249         uint8   data[1];
250 } PACKED;
251 #define DOT11_ACTION_MEASURE_LEN        3       /* d11 action measurement header length */
252
253 struct dot11_action_ht_ch_width {
254         uint8   category;
255         uint8   action;
256         uint8   ch_width;
257 } PACKED;
258
259 struct dot11_action_ht_mimops {
260         uint8   category;
261         uint8   action;
262         uint8   control;
263 } PACKED;
264
265 #define SM_PWRSAVE_ENABLE       1
266 #define SM_PWRSAVE_MODE         2
267
268 struct dot11_action_ht_info_xchg {
269         uint8   category;
270         uint8   action;
271         uint8   info;
272 } PACKED;
273
274 #define DOT11_HT_INFO_XCHG_INFO_REQ             0x01
275 #define DOT11_HT_INFO_XCHG_40MHZ_INTOLERANT     0x02
276 #define DOT11_HT_INFO_XCHG_STA_CHAN_WIDTH       0x04
277
278
279 /* ************* 802.11h related definitions. ************* */
280 struct dot11_power_cnst {
281         uint8 id;
282         uint8 len;
283         uint8 power;
284 } PACKED;
285 typedef struct dot11_power_cnst dot11_power_cnst_t;
286
287 struct dot11_power_cap {
288         uint8 min;
289         uint8 max;
290 } PACKED;
291 typedef struct dot11_power_cap dot11_power_cap_t;
292
293 struct dot11_tpc_rep {
294         uint8 id;
295         uint8 len;
296         uint8 tx_pwr;
297         uint8 margin;
298 } PACKED;
299 typedef struct dot11_tpc_rep dot11_tpc_rep_t;
300 #define DOT11_MNG_IE_TPC_REPORT_LEN     2       /* length of IE data, not including 2 byte header */
301
302 struct dot11_supp_channels {
303         uint8 id;
304         uint8 len;
305         uint8 first_channel;
306         uint8 num_channels;
307 } PACKED;
308 typedef struct dot11_supp_channels dot11_supp_channels_t;
309
310 /* Extension Channel Offset IE: 802.11n-D1.0 spec. added sideband
311  * offset for 40MHz operation.  The possible 3 values are:
312  * 1 = above control channel
313  * 3 = below control channel
314  * 0 = no extension channel
315  */
316 struct dot11_extch {
317         uint8   id;             /* IE ID, 62, DOT11_MNG_EXT_CHANNEL_OFFSET */
318         uint8   len;            /* IE length */
319         uint8   extch;
320 } PACKED;
321 typedef struct dot11_extch dot11_extch_ie_t;
322
323 struct dot11_brcm_extch {
324         uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
325         uint8   len;            /* IE length */
326         uint8   oui[3];         /* Proprietary OUI, BRCM_OUI */
327         uint8   type;           /* type inidicates what follows */
328         uint8   extch;
329 } PACKED;
330 typedef struct dot11_brcm_extch dot11_brcm_extch_ie_t;
331
332 #define BRCM_EXTCH_IE_LEN       5
333 #define BRCM_EXTCH_IE_TYPE      53      /* 802.11n ID not yet assigned */
334 #define DOT11_EXTCH_IE_LEN      1
335 #define DOT11_EXT_CH_MASK       0x03    /* extension channel mask */
336 #define DOT11_EXT_CH_UPPER      0x01    /* ext. ch. on upper sb */
337 #define DOT11_EXT_CH_LOWER      0x03    /* ext. ch. on lower sb */
338 #define DOT11_EXT_CH_NONE       0x00    /* no extension ch.  */
339
340 struct dot11_action_frmhdr {
341         uint8   category;
342         uint8   action;
343         uint8   data[1];
344 } PACKED;
345
346 /* CSA IE data structure */
347 struct dot11_channel_switch {
348         uint8 id;       /* id DOT11_MNG_CHANNEL_SWITCH_ID */
349         uint8 len;      /* length of IE */
350         uint8 mode;     /* mode 0 or 1 */
351         uint8 channel;  /* channel switch to */
352         uint8 count;    /* number of beacons before switching */
353 } PACKED;
354 typedef struct dot11_channel_switch dot11_chan_switch_ie_t;
355
356 #define DOT11_SWITCH_IE_LEN     3       /* length of IE data, not including 2 byte header */
357 /* CSA mode - 802.11h-2003 $7.3.2.20 */
358 #define DOT11_CSA_MODE_ADVISORY         0       /* no DOT11_CSA_MODE_NO_TX restriction imposed */
359 #define DOT11_CSA_MODE_NO_TX            1       /* no transmission upon receiving CSA frame. */
360
361 struct dot11_action_switch_channel {
362         uint8   category;
363         uint8   action;
364         dot11_chan_switch_ie_t chan_switch_ie;  /* for switch IE */
365         dot11_brcm_extch_ie_t extch_ie;         /* extension channel offset */
366 } PACKED;
367
368 /* 11n Extended Channel Switch IE data structure */
369 struct dot11_ext_csa {
370         uint8 id;       /* id DOT11_MNG_EXT_CHANNEL_SWITCH_ID */
371         uint8 len;      /* length of IE */
372         uint8 mode;     /* mode 0 or 1 */
373         uint8 reg;      /* regulatory class */
374         uint8 channel;  /* channel switch to */
375         uint8 count;    /* number of beacons before switching */
376 } PACKED;
377 typedef struct dot11_ext_csa dot11_ext_csa_ie_t;
378 #define DOT11_EXT_CSA_IE_LEN    4       /* length of extended channel switch IE body */
379
380 struct dot11_action_ext_csa {
381         uint8   category;
382         uint8   action;
383         dot11_ext_csa_ie_t chan_switch_ie;      /* for switch IE */
384 } PACKED;
385
386 /* 802.11h Measurement Request/Report IEs */
387 /* Measurement Type field */
388 #define DOT11_MEASURE_TYPE_BASIC        0       /* d11 measurement basic type */
389 #define DOT11_MEASURE_TYPE_CCA          1       /* d11 measurement CCA type */
390 #define DOT11_MEASURE_TYPE_RPI          2       /* d11 measurement PRI type */
391
392 /* Measurement Request Modes */
393 #define DOT11_MEASURE_MODE_ENABLE       (1<<1)  /* d11 measurement enable */
394 #define DOT11_MEASURE_MODE_REQUEST      (1<<2)  /* d11 measurement request */
395 #define DOT11_MEASURE_MODE_REPORT       (1<<3)  /* d11 measurement report */
396 /* Measurement Report Modes */
397 #define DOT11_MEASURE_MODE_LATE         (1<<0)  /* d11 measurement late */
398 #define DOT11_MEASURE_MODE_INCAPABLE    (1<<1)  /* d11 measurement incapable */
399 #define DOT11_MEASURE_MODE_REFUSED      (1<<2)  /* d11 measurement refuse */
400 /* Basic Measurement Map bits */
401 #define DOT11_MEASURE_BASIC_MAP_BSS     ((uint8)(1<<0)) /* d11 measurement basic map BSS */
402 #define DOT11_MEASURE_BASIC_MAP_OFDM    ((uint8)(1<<1)) /* d11 measurement map OFDM */
403 #define DOT11_MEASURE_BASIC_MAP_UKNOWN  ((uint8)(1<<2)) /* d11 measurement map unknown */
404 #define DOT11_MEASURE_BASIC_MAP_RADAR   ((uint8)(1<<3)) /* d11 measurement map radar */
405 #define DOT11_MEASURE_BASIC_MAP_UNMEAS  ((uint8)(1<<4)) /* d11 measurement map unmeasuremnt */
406
407 struct dot11_meas_req {
408         uint8 id;
409         uint8 len;
410         uint8 token;
411         uint8 mode;
412         uint8 type;
413         uint8 channel;
414         uint8 start_time[8];
415         uint16 duration;
416 } PACKED;
417 typedef struct dot11_meas_req dot11_meas_req_t;
418 #define DOT11_MNG_IE_MREQ_LEN 14        /* d11 measurement request IE length */
419 /* length of Measure Request IE data not including variable len */
420 #define DOT11_MNG_IE_MREQ_FIXED_LEN 3   /* d11 measurement request IE fixed length */
421
422 struct dot11_meas_rep {
423         uint8 id;
424         uint8 len;
425         uint8 token;
426         uint8 mode;
427         uint8 type;
428         union
429         {
430                 struct {
431                         uint8 channel;
432                         uint8 start_time[8];
433                         uint16 duration;
434                         uint8 map;
435                 } PACKED basic;
436                 uint8 data[1];
437         } PACKED rep;
438 } PACKED;
439 typedef struct dot11_meas_rep dot11_meas_rep_t;
440
441 /* length of Measure Report IE data not including variable len */
442 #define DOT11_MNG_IE_MREP_FIXED_LEN     3       /* d11 measurement response IE fixed length */
443
444 struct dot11_meas_rep_basic {
445         uint8 channel;
446         uint8 start_time[8];
447         uint16 duration;
448         uint8 map;
449 } PACKED;
450 typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t;
451 #define DOT11_MEASURE_BASIC_REP_LEN     12      /* d11 measurement basic report length */
452
453 struct dot11_quiet {
454         uint8 id;
455         uint8 len;
456         uint8 count;    /* TBTTs until beacon interval in quiet starts */
457         uint8 period;   /* Beacon intervals between periodic quiet periods ? */
458         uint16 duration;        /* Length of quiet period, in TU's */
459         uint16 offset;  /* TU's offset from TBTT in Count field */
460 } PACKED;
461 typedef struct dot11_quiet dot11_quiet_t;
462
463 struct chan_map_tuple {
464         uint8 channel;
465         uint8 map;
466 } PACKED;
467 typedef struct chan_map_tuple chan_map_tuple_t;
468
469 struct dot11_ibss_dfs {
470         uint8 id;
471         uint8 len;
472         uint8 eaddr[ETHER_ADDR_LEN];
473         uint8 interval;
474         chan_map_tuple_t map[1];
475 } PACKED;
476 typedef struct dot11_ibss_dfs dot11_ibss_dfs_t;
477
478 /* WME Elements */
479 #define WME_OUI                 "\x00\x50\xf2"  /* WME OUI */
480 #define WME_VER                 1       /* WME version */
481 #define WME_TYPE                2       /* WME type */
482 #define WME_SUBTYPE_IE          0       /* Information Element */
483 #define WME_SUBTYPE_PARAM_IE    1       /* Parameter Element */
484 #define WME_SUBTYPE_TSPEC       2       /* Traffic Specification */
485
486 /* WME Access Category Indices (ACIs) */
487 #define AC_BE                   0       /* Best Effort */
488 #define AC_BK                   1       /* Background */
489 #define AC_VI                   2       /* Video */
490 #define AC_VO                   3       /* Voice */
491 #define AC_COUNT                4       /* number of ACs */
492
493 typedef uint8 ac_bitmap_t;      /* AC bitmap of (1 << AC_xx) */
494
495 #define AC_BITMAP_NONE          0x0     /* No ACs */
496 #define AC_BITMAP_ALL           0xf     /* All ACs */
497 #define AC_BITMAP_TST(ab, ac)   (((ab) & (1 << (ac))) != 0)
498
499 /* WME Information Element (IE) */
500 struct wme_ie {
501         uint8 oui[3];
502         uint8 type;
503         uint8 subtype;
504         uint8 version;
505         uint8 qosinfo;
506 } PACKED;
507 typedef struct wme_ie wme_ie_t;
508 #define WME_IE_LEN 7    /* WME IE length */
509
510 struct edcf_acparam {
511         uint8   ACI;
512         uint8   ECW;
513         uint16  TXOP;           /* stored in network order (ls octet first) */
514 } PACKED;
515 typedef struct edcf_acparam edcf_acparam_t;
516
517 /* WME Parameter Element (PE) */
518 struct wme_param_ie {
519         uint8 oui[3];
520         uint8 type;
521         uint8 subtype;
522         uint8 version;
523         uint8 qosinfo;
524         uint8 rsvd;
525         edcf_acparam_t acparam[AC_COUNT];
526 } PACKED;
527 typedef struct wme_param_ie wme_param_ie_t;
528 #define WME_PARAM_IE_LEN            24          /* WME Parameter IE length */
529
530 /* QoS Info field for IE as sent from AP */
531 #define WME_QI_AP_APSD_MASK         0x80        /* U-APSD Supported mask */
532 #define WME_QI_AP_APSD_SHIFT        7           /* U-APSD Supported shift */
533 #define WME_QI_AP_COUNT_MASK        0x0f        /* Parameter set count mask */
534 #define WME_QI_AP_COUNT_SHIFT       0           /* Parameter set count shift */
535
536 /* QoS Info field for IE as sent from STA */
537 #define WME_QI_STA_MAXSPLEN_MASK    0x60        /* Max Service Period Length mask */
538 #define WME_QI_STA_MAXSPLEN_SHIFT   5           /* Max Service Period Length shift */
539 #define WME_QI_STA_APSD_ALL_MASK    0xf         /* APSD all AC bits mask */
540 #define WME_QI_STA_APSD_ALL_SHIFT   0           /* APSD all AC bits shift */
541 #define WME_QI_STA_APSD_BE_MASK     0x8         /* APSD AC_BE mask */
542 #define WME_QI_STA_APSD_BE_SHIFT    3           /* APSD AC_BE shift */
543 #define WME_QI_STA_APSD_BK_MASK     0x4         /* APSD AC_BK mask */
544 #define WME_QI_STA_APSD_BK_SHIFT    2           /* APSD AC_BK shift */
545 #define WME_QI_STA_APSD_VI_MASK     0x2         /* APSD AC_VI mask */
546 #define WME_QI_STA_APSD_VI_SHIFT    1           /* APSD AC_VI shift */
547 #define WME_QI_STA_APSD_VO_MASK     0x1         /* APSD AC_VO mask */
548 #define WME_QI_STA_APSD_VO_SHIFT    0           /* APSD AC_VO shift */
549
550 /* ACI */
551 #define EDCF_AIFSN_MIN               1           /* AIFSN minimum value */
552 #define EDCF_AIFSN_MAX               15          /* AIFSN maximum value */
553 #define EDCF_AIFSN_MASK              0x0f        /* AIFSN mask */
554 #define EDCF_ACM_MASK                0x10        /* ACM mask */
555 #define EDCF_ACI_MASK                0x60        /* ACI mask */
556 #define EDCF_ACI_SHIFT               5           /* ACI shift */
557
558 /* ECW */
559 #define EDCF_ECW_MIN                 0           /* cwmin/cwmax exponent minimum value */
560 #define EDCF_ECW_MAX                 15          /* cwmin/cwmax exponent maximum value */
561 #define EDCF_ECW2CW(exp)             ((1 << (exp)) - 1)
562 #define EDCF_ECWMIN_MASK             0x0f        /* cwmin exponent form mask */
563 #define EDCF_ECWMAX_MASK             0xf0        /* cwmax exponent form mask */
564 #define EDCF_ECWMAX_SHIFT            4           /* cwmax exponent form shift */
565
566 /* TXOP */
567 #define EDCF_TXOP_MIN                0           /* TXOP minimum value */
568 #define EDCF_TXOP_MAX                65535       /* TXOP maximum value */
569 #define EDCF_TXOP2USEC(txop)         ((txop) << 5)
570
571 /* Default EDCF parameters that AP advertises for STA to use; WMM draft Table 12 */
572 #define EDCF_AC_BE_ACI_STA           0x03       /* STA ACI value for best effort AC */
573 #define EDCF_AC_BE_ECW_STA           0xA4       /* STA ECW value for best effort AC */
574 #define EDCF_AC_BE_TXOP_STA          0x0000     /* STA TXOP value for best effort AC */
575 #define EDCF_AC_BK_ACI_STA           0x27       /* STA ACI value for background AC */
576 #define EDCF_AC_BK_ECW_STA           0xA4       /* STA ECW value for background AC */
577 #define EDCF_AC_BK_TXOP_STA          0x0000     /* STA TXOP value for background AC */
578 #define EDCF_AC_VI_ACI_STA           0x42       /* STA ACI value for video AC */
579 #define EDCF_AC_VI_ECW_STA           0x43       /* STA ECW value for video AC */
580 #define EDCF_AC_VI_TXOP_STA          0x005e     /* STA TXOP value for video AC */
581 #define EDCF_AC_VO_ACI_STA           0x62       /* STA ACI value for audio AC */
582 #define EDCF_AC_VO_ECW_STA           0x32       /* STA ECW value for audio AC */
583 #define EDCF_AC_VO_TXOP_STA          0x002f     /* STA TXOP value for audio AC */
584
585 /* Default EDCF parameters that AP uses; WMM draft Table 14 */
586 #define EDCF_AC_BE_ACI_AP            0x03       /* AP ACI value for best effort AC */
587 #define EDCF_AC_BE_ECW_AP            0x64       /* AP ECW value for best effort AC */
588 #define EDCF_AC_BE_TXOP_AP           0x0000     /* AP TXOP value for best effort AC */
589 #define EDCF_AC_BK_ACI_AP            0x27       /* AP ACI value for background AC */
590 #define EDCF_AC_BK_ECW_AP            0xA4       /* AP ECW value for background AC */
591 #define EDCF_AC_BK_TXOP_AP           0x0000     /* AP TXOP value for background AC */
592 #define EDCF_AC_VI_ACI_AP            0x41       /* AP ACI value for video AC */
593 #define EDCF_AC_VI_ECW_AP            0x43       /* AP ECW value for video AC */
594 #define EDCF_AC_VI_TXOP_AP           0x005e     /* AP TXOP value for video AC */
595 #define EDCF_AC_VO_ACI_AP            0x61       /* AP ACI value for audio AC */
596 #define EDCF_AC_VO_ECW_AP            0x32       /* AP ECW value for audio AC */
597 #define EDCF_AC_VO_TXOP_AP           0x002f     /* AP TXOP value for audio AC */
598
599 struct dot11_qbss_load_ie {
600         uint8 id;                       /* 11, DOT11_MNG_QBSS_LOAD_ID */
601         uint8 length;
602         uint16 station_count;           /* total number of STAs associated */
603         uint8 channel_utilization;      /* % of time, normalized to 255, QAP sensed medium busy */
604         uint16 aac;                     /* available admission capacity */
605 } PACKED;
606 typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t;
607
608 /* nom_msdu_size */
609 #define FIXED_MSDU_SIZE 0x8000          /* MSDU size is fixed */
610 #define MSDU_SIZE_MASK  0x7fff          /* (Nominal or fixed) MSDU size */
611
612 /* surplus_bandwidth */
613 /* Represented as 3 bits of integer, binary point, 13 bits fraction */
614 #define INTEGER_SHIFT   13      /* integer shift */
615 #define FRACTION_MASK   0x1FFF  /* fraction mask */
616
617 /* Management Notification Frame */
618 struct dot11_management_notification {
619         uint8 category;                 /* DOT11_ACTION_NOTIFICATION */
620         uint8 action;
621         uint8 token;
622         uint8 status;
623         uint8 data[1];                  /* Elements */
624 } PACKED;
625 #define DOT11_MGMT_NOTIFICATION_LEN 4   /* Fixed length */
626
627 /* WME Action Codes */
628 #define WME_ADDTS_REQUEST       0       /* WME ADDTS request */
629 #define WME_ADDTS_RESPONSE      1       /* WME ADDTS response */
630 #define WME_DELTS_REQUEST       2       /* WME DELTS request */
631
632 /* WME Setup Response Status Codes */
633 #define WME_ADMISSION_ACCEPTED  0       /* WME admission accepted */
634 #define WME_INVALID_PARAMETERS  1       /* WME invalide parameters */
635 #define WME_ADMISSION_REFUSED   3       /* WME admission refused */
636
637 /* Macro to take a pointer to a beacon or probe response
638  * body and return the char* pointer to the SSID info element
639  */
640 #define BCN_PRB_SSID(body) ((char*)(body) + DOT11_BCN_PRB_LEN)
641
642 /* Authentication frame payload constants */
643 #define DOT11_OPEN_SYSTEM       0       /* d11 open authentication */
644 #define DOT11_SHARED_KEY        1       /* d11 shared authentication */
645 #define DOT11_CHALLENGE_LEN     128     /* d11 challenge text length */
646
647 /* Frame control macros */
648 #define FC_PVER_MASK            0x3     /* PVER mask */
649 #define FC_PVER_SHIFT           0       /* PVER shift */
650 #define FC_TYPE_MASK            0xC     /* type mask */
651 #define FC_TYPE_SHIFT           2       /* type shift */
652 #define FC_SUBTYPE_MASK         0xF0    /* subtype mask */
653 #define FC_SUBTYPE_SHIFT        4       /* subtype shift */
654 #define FC_TODS                 0x100   /* to DS */
655 #define FC_TODS_SHIFT           8       /* to DS shift */
656 #define FC_FROMDS               0x200   /* from DS */
657 #define FC_FROMDS_SHIFT         9       /* from DS shift */
658 #define FC_MOREFRAG             0x400   /* more frag. */
659 #define FC_MOREFRAG_SHIFT       10      /* more frag. shift */
660 #define FC_RETRY                0x800   /* retry */
661 #define FC_RETRY_SHIFT          11      /* retry shift */
662 #define FC_PM                   0x1000  /* PM */
663 #define FC_PM_SHIFT             12      /* PM shift */
664 #define FC_MOREDATA             0x2000  /* more data */
665 #define FC_MOREDATA_SHIFT       13      /* more data shift */
666 #define FC_WEP                  0x4000  /* WEP */
667 #define FC_WEP_SHIFT            14      /* WEP shift */
668 #define FC_ORDER                0x8000  /* order */
669 #define FC_ORDER_SHIFT          15      /* order shift */
670
671 /* sequence control macros */
672 #define SEQNUM_SHIFT            4       /* seq. number shift */
673 #define SEQNUM_MAX              0x1000  /* max seqnum + 1 */
674 #define FRAGNUM_MASK            0xF     /* frag. number mask */
675
676 /* Frame Control type/subtype defs */
677
678 /* FC Types */
679 #define FC_TYPE_MNG             0       /* management type */
680 #define FC_TYPE_CTL             1       /* control type */
681 #define FC_TYPE_DATA            2       /* data type */
682
683 /* Management Subtypes */
684 #define FC_SUBTYPE_ASSOC_REQ            0       /* assoc. request */
685 #define FC_SUBTYPE_ASSOC_RESP           1       /* assoc. response */
686 #define FC_SUBTYPE_REASSOC_REQ          2       /* reassoc. request */
687 #define FC_SUBTYPE_REASSOC_RESP         3       /* reassoc. response */
688 #define FC_SUBTYPE_PROBE_REQ            4       /* probe request */
689 #define FC_SUBTYPE_PROBE_RESP           5       /* probe response */
690 #define FC_SUBTYPE_BEACON               8       /* beacon */
691 #define FC_SUBTYPE_ATIM                 9       /* ATIM */
692 #define FC_SUBTYPE_DISASSOC             10      /* disassoc. */
693 #define FC_SUBTYPE_AUTH                 11      /* authentication */
694 #define FC_SUBTYPE_DEAUTH               12      /* de-authentication */
695 #define FC_SUBTYPE_ACTION               13      /* action */
696 #define FC_SUBTYPE_ACTION_NOACK         14      /* action no-ack */
697
698 /* Control Subtypes */
699 #define FC_SUBTYPE_CTL_WRAPPER          7       /* Control Wrapper */
700 #define FC_SUBTYPE_BLOCKACK_REQ         8       /* Block Ack Req */
701 #define FC_SUBTYPE_BLOCKACK             9       /* Block Ack */
702 #define FC_SUBTYPE_PS_POLL              10      /* PS poll */
703 #define FC_SUBTYPE_RTS                  11      /* RTS */
704 #define FC_SUBTYPE_CTS                  12      /* CTS */
705 #define FC_SUBTYPE_ACK                  13      /* ACK */
706 #define FC_SUBTYPE_CF_END               14      /* CF-END */
707 #define FC_SUBTYPE_CF_END_ACK           15      /* CF-END ACK */
708
709 /* Data Subtypes */
710 #define FC_SUBTYPE_DATA                 0       /* Data */
711 #define FC_SUBTYPE_DATA_CF_ACK          1       /* Data + CF-ACK */
712 #define FC_SUBTYPE_DATA_CF_POLL         2       /* Data + CF-Poll */
713 #define FC_SUBTYPE_DATA_CF_ACK_POLL     3       /* Data + CF-Ack + CF-Poll */
714 #define FC_SUBTYPE_NULL                 4       /* Null */
715 #define FC_SUBTYPE_CF_ACK               5       /* CF-Ack */
716 #define FC_SUBTYPE_CF_POLL              6       /* CF-Poll */
717 #define FC_SUBTYPE_CF_ACK_POLL          7       /* CF-Ack + CF-Poll */
718 #define FC_SUBTYPE_QOS_DATA             8       /* QoS Data */
719 #define FC_SUBTYPE_QOS_DATA_CF_ACK      9       /* QoS Data + CF-Ack */
720 #define FC_SUBTYPE_QOS_DATA_CF_POLL     10      /* QoS Data + CF-Poll */
721 #define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11      /* QoS Data + CF-Ack + CF-Poll */
722 #define FC_SUBTYPE_QOS_NULL             12      /* QoS Null */
723 #define FC_SUBTYPE_QOS_CF_POLL          14      /* QoS CF-Poll */
724 #define FC_SUBTYPE_QOS_CF_ACK_POLL      15      /* QoS CF-Ack + CF-Poll */
725
726 /* Data Subtype Groups */
727 #define FC_SUBTYPE_ANY_QOS(s)           (((s) & 8) != 0)
728 #define FC_SUBTYPE_ANY_NULL(s)          (((s) & 4) != 0)
729 #define FC_SUBTYPE_ANY_CF_POLL(s)       (((s) & 2) != 0)
730 #define FC_SUBTYPE_ANY_CF_ACK(s)        (((s) & 1) != 0)
731
732 /* Type/Subtype Combos */
733 #define FC_KIND_MASK            (FC_TYPE_MASK | FC_SUBTYPE_MASK)        /* FC kind mask */
734
735 #define FC_KIND(t, s)   (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT))    /* FC kind */
736
737 #define FC_SUBTYPE(fc)  (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT)  /* Subtype from FC */
738 #define FC_TYPE(fc)     (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT)        /* Type from FC */
739
740 #define FC_ASSOC_REQ    FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ)      /* assoc. request */
741 #define FC_ASSOC_RESP   FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP)     /* assoc. response */
742 #define FC_REASSOC_REQ  FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ)    /* reassoc. request */
743 #define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP)   /* reassoc. response */
744 #define FC_PROBE_REQ    FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ)      /* probe request */
745 #define FC_PROBE_RESP   FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP)     /* probe response */
746 #define FC_BEACON       FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON)         /* beacon */
747 #define FC_DISASSOC     FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC)       /* disassoc */
748 #define FC_AUTH         FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH)           /* authentication */
749 #define FC_DEAUTH       FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH)         /* deauthentication */
750 #define FC_ACTION       FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION)         /* action */
751 #define FC_ACTION_NOACK FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION_NOACK)   /* action no-ack */
752
753 #define FC_CTL_WRAPPER  FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTL_WRAPPER)    /* Control Wrapper */
754 #define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ)   /* Block Ack Req */
755 #define FC_BLOCKACK     FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK)       /* Block Ack */
756 #define FC_PS_POLL      FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL)        /* PS poll */
757 #define FC_RTS          FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS)            /* RTS */
758 #define FC_CTS          FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS)            /* CTS */
759 #define FC_ACK          FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK)            /* ACK */
760 #define FC_CF_END       FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END)         /* CF-END */
761 #define FC_CF_END_ACK   FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK)     /* CF-END ACK */
762
763 #define FC_DATA         FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA)          /* data */
764 #define FC_NULL_DATA    FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL)          /* null data */
765 #define FC_DATA_CF_ACK  FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK)   /* data CF ACK */
766 #define FC_QOS_DATA     FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA)      /* QoS data */
767 #define FC_QOS_NULL     FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL)      /* QoS null */
768
769 /* QoS Control Field */
770
771 /* 802.1D Priority */
772 #define QOS_PRIO_SHIFT          0       /* QoS priority shift */
773 #define QOS_PRIO_MASK           0x0007  /* QoS priority mask */
774 #define QOS_PRIO(qos)           (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT)     /* QoS priority */
775
776 /* Traffic Identifier */
777 #define QOS_TID_SHIFT           0       /* QoS TID shift */
778 #define QOS_TID_MASK            0x000f  /* QoS TID mask */
779 #define QOS_TID(qos)            (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT)       /* QoS TID */
780
781 /* End of Service Period (U-APSD) */
782 #define QOS_EOSP_SHIFT          4       /* QoS End of Service Period shift */
783 #define QOS_EOSP_MASK           0x0010  /* QoS End of Service Period mask */
784 #define QOS_EOSP(qos)           (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT)     /* Qos EOSP */
785
786 /* Ack Policy */
787 #define QOS_ACK_NORMAL_ACK      0       /* Normal Ack */
788 #define QOS_ACK_NO_ACK          1       /* No Ack (eg mcast) */
789 #define QOS_ACK_NO_EXP_ACK      2       /* No Explicit Ack */
790 #define QOS_ACK_BLOCK_ACK       3       /* Block Ack */
791 #define QOS_ACK_SHIFT           5       /* QoS ACK shift */
792 #define QOS_ACK_MASK            0x0060  /* QoS ACK mask */
793 #define QOS_ACK(qos)            (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT)       /* QoS ACK */
794
795 /* A-MSDU flag */
796 #define QOS_AMSDU_SHIFT         7       /* AMSDU shift */
797 #define QOS_AMSDU_MASK          0x0080  /* AMSDU mask */
798
799 /* Management Frames */
800
801 /* Management Frame Constants */
802
803 /* Fixed fields */
804 #define DOT11_MNG_AUTH_ALGO_LEN         2       /* d11 management auth. algo. length */
805 #define DOT11_MNG_AUTH_SEQ_LEN          2       /* d11 management auth. seq. length */
806 #define DOT11_MNG_BEACON_INT_LEN        2       /* d11 management beacon interval length */
807 #define DOT11_MNG_CAP_LEN               2       /* d11 management cap. length */
808 #define DOT11_MNG_AP_ADDR_LEN           6       /* d11 management AP address length */
809 #define DOT11_MNG_LISTEN_INT_LEN        2       /* d11 management listen interval length */
810 #define DOT11_MNG_REASON_LEN            2       /* d11 management reason length */
811 #define DOT11_MNG_AID_LEN               2       /* d11 management AID length */
812 #define DOT11_MNG_STATUS_LEN            2       /* d11 management status length */
813 #define DOT11_MNG_TIMESTAMP_LEN         8       /* d11 management timestamp length */
814
815 /* DUR/ID field in assoc resp is 0xc000 | AID */
816 #define DOT11_AID_MASK                  0x3fff  /* d11 AID mask */
817
818 /* Reason Codes */
819 #define DOT11_RC_RESERVED               0       /* d11 RC reserved */
820 #define DOT11_RC_UNSPECIFIED            1       /* Unspecified reason */
821 #define DOT11_RC_AUTH_INVAL             2       /* Previous authentication no longer valid */
822 #define DOT11_RC_DEAUTH_LEAVING         3       /* Deauthenticated because sending station
823                                                  * is leaving (or has left) IBSS or ESS
824                                                  */
825 #define DOT11_RC_INACTIVITY             4       /* Disassociated due to inactivity */
826 #define DOT11_RC_BUSY                   5       /* Disassociated because AP is unable to handle
827                                                  * all currently associated stations
828                                                  */
829 #define DOT11_RC_INVAL_CLASS_2          6       /* Class 2 frame received from
830                                                  * nonauthenticated station
831                                                  */
832 #define DOT11_RC_INVAL_CLASS_3          7       /* Class 3 frame received from
833                                                  *  nonassociated station
834                                                  */
835 #define DOT11_RC_DISASSOC_LEAVING       8       /* Disassociated because sending station is
836                                                  * leaving (or has left) BSS
837                                                  */
838 #define DOT11_RC_NOT_AUTH               9       /* Station requesting (re)association is not
839                                                  * authenticated with responding station
840                                                  */
841 #define DOT11_RC_BAD_PC                 10      /* Unacceptable power capability element */
842 #define DOT11_RC_BAD_CHANNELS           11      /* Unacceptable supported channels element */
843 /* 12 is unused */
844
845 /* 32-39 are QSTA specific reasons added in 11e */
846 #define DOT11_RC_UNSPECIFIED_QOS        32      /* unspecified QoS-related reason */
847 #define DOT11_RC_INSUFFCIENT_BW         33      /* QAP lacks sufficient bandwidth */
848 #define DOT11_RC_EXCESSIVE_FRAMES       34      /* excessive number of frames need ack */
849 #define DOT11_RC_TX_OUTSIDE_TXOP        35      /* transmitting outside the limits of txop */
850 #define DOT11_RC_LEAVING_QBSS           36      /* QSTA is leaving the QBSS (or restting) */
851 #define DOT11_RC_BAD_MECHANISM          37      /* does not want to use the mechanism */
852 #define DOT11_RC_SETUP_NEEDED           38      /* mechanism needs a setup */
853 #define DOT11_RC_TIMEOUT                39      /* timeout */
854
855 #define DOT11_RC_MAX                    23      /* Reason codes > 23 are reserved */
856
857 /* Status Codes */
858 #define DOT11_SC_SUCCESS                0       /* Successful */
859 #define DOT11_SC_FAILURE                1       /* Unspecified failure */
860 #define DOT11_SC_CAP_MISMATCH           10      /* Cannot support all requested
861                                                  * capabilities in the Capability
862                                                  * Information field
863                                                  */
864 #define DOT11_SC_REASSOC_FAIL           11      /* Reassociation denied due to inability
865                                                  * to confirm that association exists
866                                                  */
867 #define DOT11_SC_ASSOC_FAIL             12      /* Association denied due to reason
868                                                  * outside the scope of this standard
869                                                  */
870 #define DOT11_SC_AUTH_MISMATCH          13      /* Responding station does not support
871                                                  * the specified authentication
872                                                  * algorithm
873                                                  */
874 #define DOT11_SC_AUTH_SEQ               14      /* Received an Authentication frame
875                                                  * with authentication transaction
876                                                  * sequence number out of expected
877                                                  * sequence
878                                                  */
879 #define DOT11_SC_AUTH_CHALLENGE_FAIL    15      /* Authentication rejected because of
880                                                  * challenge failure
881                                                  */
882 #define DOT11_SC_AUTH_TIMEOUT           16      /* Authentication rejected due to timeout
883                                                  * waiting for next frame in sequence
884                                                  */
885 #define DOT11_SC_ASSOC_BUSY_FAIL        17      /* Association denied because AP is
886                                                  * unable to handle additional
887                                                  * associated stations
888                                                  */
889 #define DOT11_SC_ASSOC_RATE_MISMATCH    18      /* Association denied due to requesting
890                                                  * station not supporting all of the
891                                                  * data rates in the BSSBasicRateSet
892                                                  * parameter
893                                                  */
894 #define DOT11_SC_ASSOC_SHORT_REQUIRED   19      /* Association denied due to requesting
895                                                  * station not supporting the Short
896                                                  * Preamble option
897                                                  */
898 #define DOT11_SC_ASSOC_PBCC_REQUIRED    20      /* Association denied due to requesting
899                                                  * station not supporting the PBCC
900                                                  * Modulation option
901                                                  */
902 #define DOT11_SC_ASSOC_AGILITY_REQUIRED 21      /* Association denied due to requesting
903                                                  * station not supporting the Channel
904                                                  * Agility option
905                                                  */
906 #define DOT11_SC_ASSOC_SPECTRUM_REQUIRED        22      /* Association denied because Spectrum
907                                                          * Management capability is required.
908                                                          */
909 #define DOT11_SC_ASSOC_BAD_POWER_CAP    23      /* Association denied because the info
910                                                  * in the Power Cap element is
911                                                  * unacceptable.
912                                                  */
913 #define DOT11_SC_ASSOC_BAD_SUP_CHANNELS 24      /* Association denied because the info
914                                                  * in the Supported Channel element is
915                                                  * unacceptable
916                                                  */
917 #define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED       25      /* Association denied due to requesting
918                                                          * station not supporting the Short Slot
919                                                          * Time option
920                                                          */
921 #define DOT11_SC_ASSOC_ERPBCC_REQUIRED  26      /* Association denied due to requesting
922                                                  * station not supporting the ER-PBCC
923                                                  * Modulation option
924                                                  */
925 #define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27      /* Association denied due to requesting
926                                                  * station not supporting the DSS-OFDM
927                                                  * option
928                                                  */
929
930 #define DOT11_SC_DECLINED               37      /* request declined */
931 #define DOT11_SC_INVALID_PARAMS         38      /* One or more params have invalid values */
932
933 /* Info Elts, length of INFORMATION portion of Info Elts */
934 #define DOT11_MNG_DS_PARAM_LEN                  1       /* d11 management DS parameter length */
935 #define DOT11_MNG_IBSS_PARAM_LEN                2       /* d11 management IBSS parameter length */
936
937 /* TIM Info element has 3 bytes fixed info in INFORMATION field,
938  * followed by 1 to 251 bytes of Partial Virtual Bitmap
939  */
940 #define DOT11_MNG_TIM_FIXED_LEN                 3       /* d11 management TIM fixed length */
941 #define DOT11_MNG_TIM_DTIM_COUNT                0       /* d11 management DTIM count */
942 #define DOT11_MNG_TIM_DTIM_PERIOD               1       /* d11 management DTIM period */
943 #define DOT11_MNG_TIM_BITMAP_CTL                2       /* d11 management TIM BITMAP control  */
944 #define DOT11_MNG_TIM_PVB                       3       /* d11 management TIM PVB */
945
946 /* TLV defines */
947 #define TLV_TAG_OFF             0       /* tag offset */
948 #define TLV_LEN_OFF             1       /* length offset */
949 #define TLV_HDR_LEN             2       /* header length */
950 #define TLV_BODY_OFF            2       /* body offset */
951
952 /* Management Frame Information Element IDs */
953 #define DOT11_MNG_SSID_ID                       0       /* d11 management SSID id */
954 #define DOT11_MNG_RATES_ID                      1       /* d11 management rates id */
955 #define DOT11_MNG_FH_PARMS_ID                   2       /* d11 management FH parameter id */
956 #define DOT11_MNG_DS_PARMS_ID                   3       /* d11 management DS parameter id */
957 #define DOT11_MNG_CF_PARMS_ID                   4       /* d11 management CF parameter id */
958 #define DOT11_MNG_TIM_ID                        5       /* d11 management TIM id */
959 #define DOT11_MNG_IBSS_PARMS_ID                 6       /* d11 management IBSS parameter id */
960 #define DOT11_MNG_COUNTRY_ID                    7       /* d11 management country id */
961 #define DOT11_MNG_HOPPING_PARMS_ID              8       /* d11 management hopping parameter id */
962 #define DOT11_MNG_HOPPING_TABLE_ID              9       /* d11 management hopping table id */
963 #define DOT11_MNG_REQUEST_ID                    10      /* d11 management request id */
964 #define DOT11_MNG_QBSS_LOAD_ID                  11      /* d11 management QBSS Load id */
965 #define DOT11_MNG_CHALLENGE_ID                  16      /* d11 management chanllenge id */
966 #define DOT11_MNG_PWR_CONSTRAINT_ID             32      /* 11H PowerConstraint */
967 #define DOT11_MNG_PWR_CAP_ID                    33      /* 11H PowerCapability */
968 #define DOT11_MNG_TPC_REQUEST_ID                34      /* 11H TPC Request */
969 #define DOT11_MNG_TPC_REPORT_ID                 35      /* 11H TPC Report */
970 #define DOT11_MNG_SUPP_CHANNELS_ID              36      /* 11H Supported Channels */
971 #define DOT11_MNG_CHANNEL_SWITCH_ID             37      /* 11H ChannelSwitch Announcement */
972 #define DOT11_MNG_MEASURE_REQUEST_ID            38      /* 11H MeasurementRequest */
973 #define DOT11_MNG_MEASURE_REPORT_ID             39      /* 11H MeasurementReport */
974 #define DOT11_MNG_QUIET_ID                      40      /* 11H Quiet */
975 #define DOT11_MNG_IBSS_DFS_ID                   41      /* 11H IBSS_DFS */
976 #define DOT11_MNG_ERP_ID                        42      /* d11 management ERP id */
977 #define DOT11_MNG_TS_DELAY_ID                   43      /* d11 management TS Delay id */
978 #define DOT11_MNG_HT_CAP                        45      /* d11 mgmt HT cap id */
979 #define DOT11_MNG_NONERP_ID                     47      /* d11 management NON-ERP id */
980 #define DOT11_MNG_RSN_ID                        48      /* d11 management RSN id */
981 #define DOT11_MNG_EXT_RATES_ID                  50      /* d11 management ext. rates id */
982 #define DOT11_MNG_EXT_CSA_ID                    60      /* d11 Extended CSA */
983 #define DOT11_MNG_HT_ADD                        61      /* d11 mgmt additional HT info */
984 #define DOT11_MNG_EXT_CHANNEL_OFFSET            62      /* d11 mgmt ext channel offset */
985 #define DOT11_MNG_EXT_CAP                       127     /* d11 mgmt ext capability */
986 #define DOT11_MNG_WPA_ID                        221     /* d11 management WPA id */
987 #define DOT11_MNG_PROPR_ID                      221     /* d11 management proprietary id */
988
989 /* Rate element Basic flag and rate mask */
990 #define DOT11_RATE_BASIC                        0x80    /* flag for a Basic Rate */
991 #define DOT11_RATE_MASK                         0x7F    /* mask for numeric part of rate */
992
993 /* ERP info element bit values */
994 #define DOT11_MNG_ERP_LEN                       1       /* ERP is currently 1 byte long */
995 #define DOT11_MNG_NONERP_PRESENT                0x01    /* NonERP (802.11b) STAs are present
996                                                          *in the BSS
997                                                          */
998 #define DOT11_MNG_USE_PROTECTION                0x02    /* Use protection mechanisms for
999                                                          *ERP-OFDM frames
1000                                                          */
1001 #define DOT11_MNG_BARKER_PREAMBLE               0x04    /* Short Preambles: 0 == allowed,
1002                                                          * 1 == not allowed
1003                                                          */
1004 /* TS Delay element offset & size */
1005 #define DOT11_MGN_TS_DELAY_LEN          4       /* length of TS DELAY IE */
1006 #define TS_DELAY_FIELD_SIZE                     4       /* TS DELAY field size */
1007
1008 /* Capability Information Field */
1009 #define DOT11_CAP_ESS                           0x0001  /* d11 cap. ESS */
1010 #define DOT11_CAP_IBSS                          0x0002  /* d11 cap. IBSS */
1011 #define DOT11_CAP_POLLABLE                      0x0004  /* d11 cap. pollable */
1012 #define DOT11_CAP_POLL_RQ                       0x0008  /* d11 cap. poll request */
1013 #define DOT11_CAP_PRIVACY                       0x0010  /* d11 cap. privacy */
1014 #define DOT11_CAP_SHORT                         0x0020  /* d11 cap. short */
1015 #define DOT11_CAP_PBCC                          0x0040  /* d11 cap. PBCC */
1016 #define DOT11_CAP_AGILITY                       0x0080  /* d11 cap. agility */
1017 #define DOT11_CAP_SPECTRUM                      0x0100  /* d11 cap. spectrum */
1018 #define DOT11_CAP_SHORTSLOT                     0x0400  /* d11 cap. shortslot */
1019 #define DOT11_CAP_CCK_OFDM                      0x2000  /* d11 cap. CCK/OFDM */
1020
1021 /* Extended Capability Information Field */
1022 #define DOT11_EXT_CAP_HT_IE_SUPPORT     0x01    /* support for info xchg action frame */
1023
1024 /* Action Frame Constants */
1025 #define DOT11_ACTION_HDR_LEN            2       /* action frame header length */
1026 #define DOT11_ACTION_CAT_ERR_MASK       0x80    /* d11 action category error mask */
1027 #define DOT11_ACTION_CAT_MASK           0x7F    /* d11 action category mask */
1028 #define DOT11_ACTION_CAT_SPECT_MNG      0x00    /* d11 action category spectrum management */
1029 #define DOT11_ACTION_CAT_BLOCKACK       0x03    /* d11 action category block ack */
1030 #define DOT11_ACTION_CAT_HT             0x07    /* d11 action category for HT */
1031 #define DOT11_ACTION_NOTIFICATION       0x11    /* 17 */
1032
1033 #define DOT11_ACTION_ID_M_REQ           0       /* d11 action measurement request */
1034 #define DOT11_ACTION_ID_M_REP           1       /* d11 action measurement response */
1035 #define DOT11_ACTION_ID_TPC_REQ         2       /* d11 action TPC request */
1036 #define DOT11_ACTION_ID_TPC_REP         3       /* d11 action TPC response */
1037 #define DOT11_ACTION_ID_CHANNEL_SWITCH  4       /* d11 action channel switch */
1038 #define DOT11_ACTION_ID_EXT_CSA         5       /* d11 extened CSA for 11n */
1039
1040 /* HT action ids */
1041 #define DOT11_ACTION_ID_HT_CH_WIDTH     0       /* notify channel width action id */
1042 #define DOT11_ACTION_ID_HT_MIMO_PS      1       /* mimo ps action id */
1043 #define DOT11_ACTION_ID_HT_INFO_XCHG    8       /* HT Information Exchange action id */
1044
1045 /* Block Ack action types */
1046 #define DOT11_BA_ACTION_ADDBA_REQ       0       /* ADDBA Req action frame type */
1047 #define DOT11_BA_ACTION_ADDBA_RESP      1       /* ADDBA Resp action frame type */
1048 #define DOT11_BA_ACTION_DELBA           2       /* DELBA action frame type */
1049
1050 /* ADDBA action parameters */
1051 #define DOT11_ADDBA_PARAM_AMSDU_SUP     0x0001  /* AMSDU supported under BA */
1052 #define DOT11_ADDBA_PARAM_POLICY_MASK   0x0002  /* policy mask(ack vs delayed) */
1053 #define DOT11_ADDBA_PARAM_POLICY_SHIFT  1       /* policy shift */
1054 #define DOT11_ADDBA_PARAM_TID_MASK      0x003c  /* tid mask */
1055 #define DOT11_ADDBA_PARAM_TID_SHIFT     2       /* tid shift */
1056 #define DOT11_ADDBA_PARAM_BSIZE_MASK    0xffc0  /* buffer size mask */
1057 #define DOT11_ADDBA_PARAM_BSIZE_SHIFT   6       /* buffer size shift */
1058
1059 #define DOT11_ADDBA_POLICY_DELAYED      0       /* delayed BA policy */
1060 #define DOT11_ADDBA_POLICY_IMMEDIATE    1       /* immediate BA policy */
1061
1062 struct dot11_addba_req {
1063         uint8 category;                         /* category of action frame (3) */
1064         uint8 action;                           /* action: addba req */
1065         uint8 token;                            /* identifier */
1066         uint16 addba_param_set;                 /* parameter set */
1067         uint16 timeout;                         /* timeout in seconds */
1068         uint16 start_seqnum;                    /* starting sequence number */
1069 }PACKED;
1070 typedef struct dot11_addba_req dot11_addba_req_t;
1071 #define DOT11_ADDBA_REQ_LEN             9       /* length of addba req frame */
1072
1073 struct dot11_addba_resp {
1074         uint8 category;                         /* category of action frame (3) */
1075         uint8 action;                           /* action: addba resp */
1076         uint8 token;                            /* identifier */
1077         uint16 status;                          /* status of add request */
1078         uint16 addba_param_set;                 /* negotiated parameter set */
1079         uint16 timeout;                         /* negotiated timeout in seconds */
1080 }PACKED;
1081 typedef struct dot11_addba_resp dot11_addba_resp_t;
1082 #define DOT11_ADDBA_RESP_LEN            9       /* length of addba resp frame */
1083
1084 /* DELBA action parameters */
1085 #define DOT11_DELBA_PARAM_INIT_MASK     0x0800  /* initiator mask */
1086 #define DOT11_DELBA_PARAM_INIT_SHIFT    11      /* initiator shift */
1087 #define DOT11_DELBA_PARAM_TID_MASK      0xf000  /* tid mask */
1088 #define DOT11_DELBA_PARAM_TID_SHIFT     12      /* tid shift */
1089
1090 struct dot11_delba {
1091         uint8 category;                         /* category of action frame (3) */
1092         uint8 action;                           /* action: addba req */
1093         uint16 delba_param_set;                 /* paarmeter set */
1094         uint16 reason;                          /* reason for dellba */
1095 }PACKED;
1096 typedef struct dot11_delba dot11_delba_t;
1097 #define DOT11_DELBA_LEN                 6       /* length of delba frame */
1098
1099 /* MLME Enumerations */
1100 #define DOT11_BSSTYPE_INFRASTRUCTURE            0       /* d11 infrastructure */
1101 #define DOT11_BSSTYPE_INDEPENDENT               1       /* d11 independent */
1102 #define DOT11_BSSTYPE_ANY                       2       /* d11 any BSS type */
1103 #define DOT11_SCANTYPE_ACTIVE                   0       /* d11 scan active */
1104 #define DOT11_SCANTYPE_PASSIVE                  1       /* d11 scan passive */
1105
1106 /* 802.11 BRCM "Compromise" Pre N constants */
1107 #define PREN_PREAMBLE           24      /* green field preamble time */
1108 #define PREN_MM_EXT             8       /* extra mixed mode preamble time */
1109 #define PREN_PREAMBLE_EXT       4       /* extra preamble (multiply by unique_streams-1) */
1110
1111 /* 802.11 N PHY constants */
1112 #define NPHY_RIFS_TIME          2       /* NPHY RIFS time */
1113
1114 /* 802.11 A PHY constants */
1115 #define APHY_SLOT_TIME          9       /* APHY slot time */
1116 #define APHY_SIFS_TIME          16      /* APHY SIFS time */
1117 #define APHY_DIFS_TIME          (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) /* APHY DIFS time */
1118 #define APHY_PREAMBLE_TIME      16      /* APHY preamble time */
1119 #define APHY_SIGNAL_TIME        4       /* APHY signal time */
1120 #define APHY_SYMBOL_TIME        4       /* APHY symbol time */
1121 #define APHY_SERVICE_NBITS      16      /* APHY service nbits */
1122 #define APHY_TAIL_NBITS         6       /* APHY tail nbits */
1123 #define APHY_CWMIN              15      /* APHY cwmin */
1124
1125 /* 802.11 B PHY constants */
1126 #define BPHY_SLOT_TIME          20      /* BPHY slot time */
1127 #define BPHY_SIFS_TIME          10      /* BPHY SIFS time */
1128 #define BPHY_DIFS_TIME          50      /* BPHY DIFS time */
1129 #define BPHY_PLCP_TIME          192     /* BPHY PLCP time */
1130 #define BPHY_PLCP_SHORT_TIME    96      /* BPHY PLCP short time */
1131 #define BPHY_CWMIN              31      /* BPHY cwmin */
1132
1133 /* 802.11 G constants */
1134 #define DOT11_OFDM_SIGNAL_EXTENSION     6       /* d11 OFDM signal extension */
1135
1136 #define PHY_CWMAX               1023    /* PHY cwmax */
1137
1138 #define DOT11_MAXNUMFRAGS       16      /* max # fragments per MSDU */
1139
1140 /* dot11Counters Table - 802.11 spec., Annex D */
1141 typedef struct d11cnt {
1142         uint32          txfrag;         /* dot11TransmittedFragmentCount */
1143         uint32          txmulti;        /* dot11MulticastTransmittedFrameCount */
1144         uint32          txfail;         /* dot11FailedCount */
1145         uint32          txretry;        /* dot11RetryCount */
1146         uint32          txretrie;       /* dot11MultipleRetryCount */
1147         uint32          rxdup;          /* dot11FrameduplicateCount */
1148         uint32          txrts;          /* dot11RTSSuccessCount */
1149         uint32          txnocts;        /* dot11RTSFailureCount */
1150         uint32          txnoack;        /* dot11ACKFailureCount */
1151         uint32          rxfrag;         /* dot11ReceivedFragmentCount */
1152         uint32          rxmulti;        /* dot11MulticastReceivedFrameCount */
1153         uint32          rxcrc;          /* dot11FCSErrorCount */
1154         uint32          txfrmsnt;       /* dot11TransmittedFrameCount */
1155         uint32          rxundec;        /* dot11WEPUndecryptableCount */
1156 } d11cnt_t;
1157
1158 /* BRCM OUI */
1159 #define BRCM_OUI                "\x00\x10\x18"  /* Broadcom OUI */
1160
1161 /* OUI for BRCM proprietary IE */
1162 #define BRCM_PROP_OUI           "\x00\x90\x4C"  /* Broadcom proprietary OUI */
1163
1164 /* BRCM info element */
1165 struct brcm_ie {
1166         uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
1167         uint8   len;            /* IE length */
1168         uint8   oui[3];         /* Proprietary OUI, BRCM_OUI */
1169         uint8   ver;            /* type/ver of this IE */
1170         uint8   assoc;          /* # of assoc STAs */
1171         uint8   flags;          /* misc flags */
1172         uint8   flags1;         /* misc flags */
1173         uint16  amsdu_mtu_pref; /* preferred A-MSDU MTU */
1174 } PACKED;
1175 typedef struct brcm_ie brcm_ie_t;
1176 #define BRCM_IE_LEN             11      /* BRCM IE length */
1177 #define BRCM_IE_VER             2       /* BRCM IE version */
1178 #define BRCM_IE_LEGACY_AES_VER  1       /* BRCM IE legacy AES version */
1179
1180 /* brcm_ie flags */
1181 #define BRF_ABCAP               0x1     /* afterburner capable */
1182 #define BRF_ABRQRD              0x2     /* afterburner requested */
1183 #define BRF_LZWDS               0x4     /* lazy wds enabled */
1184 #define BRF_BLOCKACK            0x8     /* BlockACK capable */
1185 #define BRF_ABCOUNTER_MASK      0xf0    /* afterburner wds "state" counter */
1186 #define BRF_ABCOUNTER_SHIFT     4       /* offset of afterburner wds "state" counter */
1187
1188 /* brcm_ie flags1 */
1189 #define BRF1_AMSDU              0x1     /* A-MSDU capable */
1190 #define BRF1_DPT                0x2     /* DPT capable */
1191
1192 #define AB_WDS_TIMEOUT_MAX      15      /* afterburner wds Max count indicating not
1193                                          * locally capable
1194                                          */
1195 #define AB_WDS_TIMEOUT_MIN      1       /* afterburner wds, use zero count as indicating
1196                                          * "downrev"
1197                                          */
1198
1199 /* EWC definitions */
1200 #define MCSSET_LEN      16      /* 16-bits per 8-bit set to give 128-bits bitmap of MCS Index */
1201 #define MAX_MCS_NUM     (128)   /* max mcs number = 128 */
1202
1203 struct ewc_cap_ie {
1204         uint16  cap;
1205         uint8   params;
1206         uint8   supp_mcs[MCSSET_LEN];
1207         uint16  ext_htcap;
1208         uint32  txbf_cap;
1209         uint8   as_cap;
1210 } PACKED;
1211 typedef struct ewc_cap_ie ewc_cap_ie_t;
1212
1213 /* CAP IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */
1214 /* the capability IE is primarily used to convey this nodes abilities */
1215 struct ewc_prop_cap_ie {
1216         uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
1217         uint8   len;            /* IE length */
1218         uint8   oui[3];         /* Proprietary OUI, BRCM_PROP_OUI */
1219         uint8   type;           /* type inidicates what follows */
1220         ewc_cap_ie_t cap_ie;
1221 } PACKED;
1222 typedef struct ewc_prop_cap_ie ewc_prop_cap_ie_t;
1223 #define EWC_PROP_IE_OVERHEAD    4       /* overhead bytes for prop oui ie */
1224 #define EWC_CAP_IE_LEN  26      
1225 #define EWC_CAP_IE_TYPE 51      
1226
1227 #define EWC_CAP_LDPC_CODING     0x0001  /* Support for rx of LDPC coded pkts */
1228 #define EWC_CAP_40MHZ           0x0002  /* FALSE:20Mhz, TRUE:20/40MHZ supported */
1229 #define EWC_CAP_MIMO_PS_MASK    0x000C  /* Mimo PS mask */
1230 #define EWC_CAP_MIMO_PS_SHIFT   0x0002  /* Mimo PS shift */
1231 #define EWC_CAP_MIMO_PS_OFF     0x0003  /* Mimo PS, no restriction */
1232 #define EWC_CAP_MIMO_PS_RTS     0x0001  /* Mimo PS, send RTS/CTS around MIMO frames */
1233 #define EWC_CAP_MIMO_PS_ON      0x0000  /* Mimo PS, MIMO disallowed */
1234 #define EWC_CAP_GF              0x0010  /* Greenfield preamble support */
1235 #define EWC_CAP_SHORT_GI_20     0x0020  /* 20MHZ short guard interval support */
1236 #define EWC_CAP_SHORT_GI_40     0x0040  /* 40Mhz short guard interval support */
1237 #define EWC_CAP_TX_STBC         0x0080  /* Tx STBC support */
1238 #define EWC_CAP_RX_STBC_MASK    0x0300  /* Rx STBC mask */
1239 #define EWC_CAP_RX_STBC_SHIFT   8       /* Rx STBC shift */
1240 #define EWC_CAP_DELAYED_BA      0x0400  /* delayed BA support */
1241 #define EWC_CAP_MAX_AMSDU       0x0800  /* Max AMSDU size in bytes , 0=3839, 1=7935 */
1242 #define EWC_CAP_DSSS_CCK        0x1000  /* DSSS/CCK supported by the BSS */
1243 #define EWC_CAP_PSMP            0x2000  /* Power Save Multi Poll support */
1244 #define EWC_CAP_40MHZ_INTOLERANT 0x4000 /* 40MHz Intolerant */
1245 #define EWC_CAP_LSIG_TXOP       0x8000  /* L-SIG TXOP protection support */
1246
1247 #define EWC_CAP_RX_STBC_NO              0x0     /* no rx STBC support */
1248 #define EWC_CAP_RX_STBC_ONE_STREAM      0x1     /* rx STBC support of 1 spatial stream */
1249 #define EWC_CAP_RX_STBC_TWO_STREAM      0x2     /* rx STBC support of 1-2 spatial streams */
1250 #define EWC_CAP_RX_STBC_THREE_STREAM    0x3     /* rx STBC support of 1-3 spatial streams */
1251
1252 #define EWC_MAX_AMSDU           7935    /* max amsdu size (bytes) per the EWC spec */
1253 #define EWC_MIN_AMSDU           3835    /* min amsdu size (bytes) per the EWC spec */
1254
1255 #define EWC_PARAMS_RX_FACTOR_MASK       0x03    /* ampdu rcv factor mask */
1256 #define EWC_PARAMS_DENSITY_MASK         0x1C    /* ampdu density mask */
1257 #define EWC_PARAMS_DENSITY_SHIFT        2       /* ampdu density shift */
1258
1259 /* EWC/AMPDU specific define */
1260 #define AMPDU_MAX_MPDU_DENSITY  7       /* max mpdu density; in 1/8 usec units */
1261 #define AMPDU_MAX_RX_FACTOR     3       /* max rcv ampdu len (64kb) */
1262 #define AMPDU_RX_FACTOR_BASE    8*1024  /* ampdu factor base for rx len */
1263 #define AMPDU_DELIMITER_LEN     4       /* length of ampdu delimiter */
1264
1265 struct ewc_add_ie {
1266         uint8   ctl_ch;                 /* control channel number */
1267         uint8   byte1;                  /* ext ch,rec. ch. width, RIFS support */
1268         uint16  opmode;                 /* operation mode */
1269         uint16  misc_bits;              /* misc bits */
1270         uint8   basic_mcs[MCSSET_LEN];  /* required MCS set */
1271 } PACKED;
1272 typedef struct ewc_add_ie ewc_add_ie_t;
1273
1274 /* ADD IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */
1275 /* the additional IE is primarily used to convey the current BSS configuration */
1276 struct ewc_prop_add_ie {
1277         uint8   id;             /* IE ID, 221, DOT11_MNG_PROPR_ID */
1278         uint8   len;            /* IE length */
1279         uint8   oui[3];         /* Proprietary OUI, BRCM_PROP_OUI */
1280         uint8   type;           /* indicates what follows */
1281         ewc_add_ie_t add_ie;
1282 } PACKED;
1283 typedef struct ewc_prop_add_ie ewc_prop_add_ie_t;
1284
1285 #define EWC_ADD_IE_LEN  22      
1286 #define EWC_ADD_IE_TYPE 52      
1287
1288 /* byte1 defn's */
1289 #define EWC_BW_ANY              0x04    /* set, STA can use 20 or 40MHz */
1290 #define EWC_RIFS_PERMITTED      0x08    /* RIFS allowed */
1291
1292 /* opmode defn's */
1293 #define EWC_OPMODE_MASK         0x0003  /* protection mode mask */
1294 #define EWC_OPMODE_SHIFT        0       /* protection mode shift */
1295 #define EWC_OPMODE_PURE         0x0000  /* protection mode PURE */
1296 #define EWC_OPMODE_OPTIONAL     0x0001  /* protection mode optional */
1297 #define EWC_OPMODE_HT20IN40     0x0002  /* protection mode 20MHz HT in 40MHz BSS */
1298 #define EWC_OPMODE_MIXED        0x0003  /* protection mode Mixed Mode */
1299 #define EWC_OPMODE_NONGF        0x0004  /* protection mode non-GF */
1300 #define DOT11N_TXBURST          0x0008  /* Tx burst limit */
1301 #define DOT11N_OBSS_NONHT       0x0010  /* OBSS Non-HT STA present */
1302
1303 /* misc_bites defn's */
1304 #define EWC_BASIC_STBC_MCS      0x007f  /* basic STBC MCS */
1305 #define EWC_DUAL_STBC_PROT      0x0080  /* Dual STBC Protection */
1306 #define EWC_SECOND_BCN          0x0100  /* Secondary beacon support */
1307 #define EWC_LSIG_TXOP           0x0200  /* L-SIG TXOP Protection full support */
1308 #define EWC_PCO_ACTIVE          0x0400  /* PCO active */
1309 #define EWC_PCO_PHASE           0x0800  /* PCO phase */
1310
1311 /* Tx Burst Limits */
1312 #define DOT11N_2G_TXBURST_LIMIT 6160    /* 2G band Tx burst limit per 802.11n Draft 1.10 (usec) */
1313 #define DOT11N_5G_TXBURST_LIMIT 3080    /* 5G band Tx burst limit per 802.11n Draft 1.10 (usec) */
1314
1315 /* Macros for opmode */
1316 #define GET_EWC_OPMODE(add_ie)          ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \
1317                                         >> EWC_OPMODE_SHIFT)
1318 #define EWC_MIXEDMODE_PRESENT(add_ie)   ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \
1319                                         == EWC_OPMODE_MIXED)    /* mixed mode present */
1320 #define EWC_HT20_PRESENT(add_ie)        ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \
1321                                         == EWC_OPMODE_HT20IN40) /* 20MHz HT present */
1322 #define EWC_OPTIONAL_PRESENT(add_ie)    ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \
1323                                         == EWC_OPMODE_OPTIONAL) /* Optional protection present */
1324 #define EWC_USE_PROTECTION(add_ie)      (EWC_HT20_PRESENT((add_ie)) || \
1325                                         EWC_MIXEDMODE_PRESENT((add_ie))) /* use protection */
1326 #define EWC_NONGF_PRESENT(add_ie)       ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_NONGF) \
1327                                         == EWC_OPMODE_NONGF)    /* non-GF present */
1328 #define DOT11N_TXBURST_PRESENT(add_ie)  ((ltoh16_ua(&add_ie->opmode) & DOT11N_TXBURST) \
1329                                         == DOT11N_TXBURST)      /* Tx Burst present */
1330 #define DOT11N_OBSS_NONHT_PRESENT(add_ie)       ((ltoh16_ua(&add_ie->opmode) & DOT11N_OBSS_NONHT) \
1331                                         == DOT11N_OBSS_NONHT)   /* OBSS Non-HT present */
1332
1333 /* Vendor IE structure */
1334 struct vndr_ie {
1335         uchar id;
1336         uchar len;
1337         uchar oui [3];
1338         uchar data [1];         /* Variable size data */
1339 } PACKED;
1340 typedef struct vndr_ie vndr_ie_t;
1341
1342 #define VNDR_IE_HDR_LEN         2       /* id + len field */
1343 #define VNDR_IE_MIN_LEN         3       /* size of the oui field */
1344 #define VNDR_IE_MAX_LEN         256     /* verdor IE max length */
1345
1346 /* WPA definitions */
1347 #define WPA_VERSION             1       /* WPA version */
1348 #define WPA_OUI                 "\x00\x50\xF2"  /* WPA OUI */
1349
1350 #define WPA2_VERSION            1       /* WPA2 version */
1351 #define WPA2_VERSION_LEN        2       /* WAP2 version length */
1352 #define WPA2_OUI                "\x00\x0F\xAC"  /* WPA2 OUI */
1353
1354 #define WPA_OUI_LEN     3       /* WPA OUI length */
1355
1356 /* RSN authenticated key managment suite */
1357 #define RSN_AKM_NONE            0       /* None (IBSS) */
1358 #define RSN_AKM_UNSPECIFIED     1       /* Over 802.1x */
1359 #define RSN_AKM_PSK             2       /* Pre-shared Key */
1360
1361 /* Key related defines */
1362 #define DOT11_MAX_DEFAULT_KEYS  4       /* number of default keys */
1363 #define DOT11_MAX_KEY_SIZE      32      /* max size of any key */
1364 #define DOT11_MAX_IV_SIZE       16      /* max size of any IV */
1365 #define DOT11_EXT_IV_FLAG       (1<<5)  /* flag to indicate IV is > 4 bytes */
1366
1367 #define WEP1_KEY_SIZE           5       /* max size of any WEP key */
1368 #define WEP1_KEY_HEX_SIZE       10      /* size of WEP key in hex. */
1369 #define WEP128_KEY_SIZE         13      /* max size of any WEP key */
1370 #define WEP128_KEY_HEX_SIZE     26      /* size of WEP key in hex. */
1371 #define TKIP_MIC_SIZE           8       /* size of TKIP MIC */
1372 #define TKIP_EOM_SIZE           7       /* max size of TKIP EOM */
1373 #define TKIP_EOM_FLAG           0x5a    /* TKIP EOM flag byte */
1374 #define TKIP_KEY_SIZE           32      /* size of any TKIP key */
1375 #define TKIP_MIC_AUTH_TX        16      /* offset to Authenticator MIC TX key */
1376 #define TKIP_MIC_AUTH_RX        24      /* offset to Authenticator MIC RX key */
1377 #define TKIP_MIC_SUP_RX         TKIP_MIC_AUTH_TX        /* offset to Supplicant MIC RX key */
1378 #define TKIP_MIC_SUP_TX         TKIP_MIC_AUTH_RX        /* offset to Supplicant MIC TX key */
1379 #define AES_KEY_SIZE            16      /* size of AES key */
1380
1381 #undef PACKED
1382 #if !defined(__GNUC__)
1383 #pragma pack()
1384 #endif
1385
1386 #endif /* _802_11_H_ */