Apply FreeBSD rev 1.16:
[dragonfly.git] / sys / netproto / 802_11 / ieee80211.h
1 /*
2  * Copyright (c) 2001 Atsushi Onoe
3  * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * Alternatively, this software may be distributed under the terms of the
18  * GNU General Public License ("GPL") version 2 as published by the Free
19  * Software Foundation.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.9.2.2 2006/08/10 06:07:49 sam Exp $
33  * $DragonFly: src/sys/netproto/802_11/ieee80211.h,v 1.4 2006/11/25 05:54:22 sephe Exp $
34  */
35 #ifndef _NET80211_IEEE80211_H_
36 #define _NET80211_IEEE80211_H_
37
38 /*
39  * 802.11 protocol definitions.
40  */
41
42 #define IEEE80211_ADDR_LEN      6               /* size of 802.11 address */
43 /* is 802.11 address multicast/broadcast? */
44 #define IEEE80211_IS_MULTICAST(_a)      (*(_a) & 0x01)
45
46 /* IEEE 802.11 PLCP header */
47 struct ieee80211_plcp_hdr {
48         uint16_t        i_sfd;
49         uint8_t         i_signal;
50         uint8_t         i_service;
51         uint16_t        i_length;
52         uint16_t        i_crc;
53 } __packed;
54
55 #define IEEE80211_PLCP_SFD      0xF3A0 
56 #define IEEE80211_PLCP_SERVICE  0x00
57
58 /*
59  * generic definitions for IEEE 802.11 frames
60  */
61 struct ieee80211_frame {
62         uint8_t         i_fc[2];
63         uint8_t         i_dur[2];
64         uint8_t         i_addr1[IEEE80211_ADDR_LEN];
65         uint8_t         i_addr2[IEEE80211_ADDR_LEN];
66         uint8_t         i_addr3[IEEE80211_ADDR_LEN];
67         uint8_t         i_seq[2];
68         /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
69         /* see below */
70 } __packed;
71
72 struct ieee80211_qosframe {
73         uint8_t         i_fc[2];
74         uint8_t         i_dur[2];
75         uint8_t         i_addr1[IEEE80211_ADDR_LEN];
76         uint8_t         i_addr2[IEEE80211_ADDR_LEN];
77         uint8_t         i_addr3[IEEE80211_ADDR_LEN];
78         uint8_t         i_seq[2];
79         uint8_t         i_qos[2];
80         /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
81         /* see below */
82 } __packed;
83
84 struct ieee80211_qoscntl {
85         uint8_t         i_qos[2];
86 };
87
88 struct ieee80211_frame_addr4 {
89         uint8_t         i_fc[2];
90         uint8_t         i_dur[2];
91         uint8_t         i_addr1[IEEE80211_ADDR_LEN];
92         uint8_t         i_addr2[IEEE80211_ADDR_LEN];
93         uint8_t         i_addr3[IEEE80211_ADDR_LEN];
94         uint8_t         i_seq[2];
95         uint8_t         i_addr4[IEEE80211_ADDR_LEN];
96 } __packed;
97
98
99 struct ieee80211_qosframe_addr4 {
100         uint8_t         i_fc[2];
101         uint8_t         i_dur[2];
102         uint8_t         i_addr1[IEEE80211_ADDR_LEN];
103         uint8_t         i_addr2[IEEE80211_ADDR_LEN];
104         uint8_t         i_addr3[IEEE80211_ADDR_LEN];
105         uint8_t         i_seq[2];
106         uint8_t         i_addr4[IEEE80211_ADDR_LEN];
107         uint8_t         i_qos[2];
108 } __packed;
109
110 #define IEEE80211_FC0_VERSION_MASK              0x03
111 #define IEEE80211_FC0_VERSION_SHIFT             0
112 #define IEEE80211_FC0_VERSION_0                 0x00
113 #define IEEE80211_FC0_TYPE_MASK                 0x0c
114 #define IEEE80211_FC0_TYPE_SHIFT                2
115 #define IEEE80211_FC0_TYPE_MGT                  0x00
116 #define IEEE80211_FC0_TYPE_CTL                  0x04
117 #define IEEE80211_FC0_TYPE_DATA                 0x08
118
119 #define IEEE80211_FC0_SUBTYPE_MASK              0xf0
120 #define IEEE80211_FC0_SUBTYPE_SHIFT             4
121 /* for TYPE_MGT */
122 #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ         0x00
123 #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP        0x10
124 #define IEEE80211_FC0_SUBTYPE_REASSOC_REQ       0x20
125 #define IEEE80211_FC0_SUBTYPE_REASSOC_RESP      0x30
126 #define IEEE80211_FC0_SUBTYPE_PROBE_REQ         0x40
127 #define IEEE80211_FC0_SUBTYPE_PROBE_RESP        0x50
128 #define IEEE80211_FC0_SUBTYPE_BEACON            0x80
129 #define IEEE80211_FC0_SUBTYPE_ATIM              0x90
130 #define IEEE80211_FC0_SUBTYPE_DISASSOC          0xa0
131 #define IEEE80211_FC0_SUBTYPE_AUTH              0xb0
132 #define IEEE80211_FC0_SUBTYPE_DEAUTH            0xc0
133 /* for TYPE_CTL */
134 #define IEEE80211_FC0_SUBTYPE_PS_POLL           0xa0
135 #define IEEE80211_FC0_SUBTYPE_RTS               0xb0
136 #define IEEE80211_FC0_SUBTYPE_CTS               0xc0
137 #define IEEE80211_FC0_SUBTYPE_ACK               0xd0
138 #define IEEE80211_FC0_SUBTYPE_CF_END            0xe0
139 #define IEEE80211_FC0_SUBTYPE_CF_END_ACK        0xf0
140 /* for TYPE_DATA (bit combination) */
141 #define IEEE80211_FC0_SUBTYPE_DATA              0x00
142 #define IEEE80211_FC0_SUBTYPE_CF_ACK            0x10
143 #define IEEE80211_FC0_SUBTYPE_CF_POLL           0x20
144 #define IEEE80211_FC0_SUBTYPE_CF_ACPL           0x30
145 #define IEEE80211_FC0_SUBTYPE_NODATA            0x40
146 #define IEEE80211_FC0_SUBTYPE_CFACK             0x50
147 #define IEEE80211_FC0_SUBTYPE_CFPOLL            0x60
148 #define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK     0x70
149 #define IEEE80211_FC0_SUBTYPE_QOS               0x80
150 #define IEEE80211_FC0_SUBTYPE_QOS_NULL          0xc0
151
152 #define IEEE80211_FC1_DIR_MASK                  0x03
153 #define IEEE80211_FC1_DIR_NODS                  0x00    /* STA->STA */
154 #define IEEE80211_FC1_DIR_TODS                  0x01    /* STA->AP  */
155 #define IEEE80211_FC1_DIR_FROMDS                0x02    /* AP ->STA */
156 #define IEEE80211_FC1_DIR_DSTODS                0x03    /* AP ->AP  */
157
158 #define IEEE80211_FC1_MORE_FRAG                 0x04
159 #define IEEE80211_FC1_RETRY                     0x08
160 #define IEEE80211_FC1_PWR_MGT                   0x10
161 #define IEEE80211_FC1_MORE_DATA                 0x20
162 #define IEEE80211_FC1_WEP                       0x40
163 #define IEEE80211_FC1_ORDER                     0x80
164
165 #define IEEE80211_SEQ_FRAG_MASK                 0x000f
166 #define IEEE80211_SEQ_FRAG_SHIFT                0
167 #define IEEE80211_SEQ_SEQ_MASK                  0xfff0
168 #define IEEE80211_SEQ_SEQ_SHIFT                 4
169
170 #define IEEE80211_NWID_LEN                      32
171
172 #define IEEE80211_QOS_TXOP                      0x00ff
173 /* bit 8 is reserved */
174 #define IEEE80211_QOS_ACKPOLICY                 0x60
175 #define IEEE80211_QOS_ACKPOLICY_S               5
176 #define IEEE80211_QOS_ESOP                      0x10
177 #define IEEE80211_QOS_ESOP_S                    4
178 #define IEEE80211_QOS_TID                       0x0f
179
180 /* does frame have QoS sequence control data */
181 #define IEEE80211_QOS_HAS_SEQ(wh) \
182         (((wh)->i_fc[0] & \
183           (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == \
184           (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS))
185
186 /*
187  * WME/802.11e information element.
188  */
189 struct ieee80211_wme_info {
190         uint8_t         wme_id;         /* IEEE80211_ELEMID_VENDOR */
191         uint8_t         wme_len;        /* length in bytes */
192         uint8_t         wme_oui[3];     /* 0x00, 0x50, 0xf2 */
193         uint8_t         wme_type;       /* OUI type */
194         uint8_t         wme_subtype;    /* OUI subtype */
195         uint8_t         wme_version;    /* spec revision */
196         uint8_t         wme_info;       /* QoS info */
197 } __packed;
198
199 /*
200  * WME/802.11e Tspec Element
201  */
202 struct ieee80211_wme_tspec {
203         uint8_t         ts_id;
204         uint8_t         ts_len;
205         uint8_t         ts_oui[3];
206         uint8_t         ts_oui_type;
207         uint8_t         ts_oui_subtype;
208         uint8_t         ts_version;
209         uint8_t         ts_tsinfo[3];
210         uint8_t         ts_nom_msdu[2];
211         uint8_t         ts_max_msdu[2];
212         uint8_t         ts_min_svc[4];
213         uint8_t         ts_max_svc[4];
214         uint8_t         ts_inactv_intv[4];
215         uint8_t         ts_susp_intv[4];
216         uint8_t         ts_start_svc[4];
217         uint8_t         ts_min_rate[4];
218         uint8_t         ts_mean_rate[4];
219         uint8_t         ts_max_burst[4];
220         uint8_t         ts_min_phy[4];
221         uint8_t         ts_peak_rate[4];
222         uint8_t         ts_delay[4];
223         uint8_t         ts_surplus[2];
224         uint8_t         ts_medium_time[2];
225 } __packed;
226
227 /*
228  * WME AC parameter field
229  */
230 struct ieee80211_wme_acparams {
231         uint8_t         acp_aci_aifsn;
232         uint8_t         acp_logcwminmax;
233         uint16_t        acp_txop;
234 } __packed;
235
236 #define WME_NUM_AC              4       /* 4 AC categories */
237
238 #define WME_PARAM_ACI           0x60    /* Mask for ACI field */
239 #define WME_PARAM_ACI_S         5       /* Shift for ACI field */
240 #define WME_PARAM_ACM           0x10    /* Mask for ACM bit */
241 #define WME_PARAM_ACM_S         4       /* Shift for ACM bit */
242 #define WME_PARAM_AIFSN         0x0f    /* Mask for aifsn field */
243 #define WME_PARAM_AIFSN_S       0       /* Shift for aifsn field */
244 #define WME_PARAM_LOGCWMIN      0x0f    /* Mask for CwMin field (in log) */
245 #define WME_PARAM_LOGCWMIN_S    0       /* Shift for CwMin field */
246 #define WME_PARAM_LOGCWMAX      0xf0    /* Mask for CwMax field (in log) */
247 #define WME_PARAM_LOGCWMAX_S    4       /* Shift for CwMax field */
248
249 #define WME_AC_TO_TID(_ac) (       \
250         ((_ac) == WME_AC_VO) ? 6 : \
251         ((_ac) == WME_AC_VI) ? 5 : \
252         ((_ac) == WME_AC_BK) ? 1 : \
253         0)
254
255 #define TID_TO_WME_AC(_tid) (      \
256         ((_tid) < 1) ? WME_AC_BE : \
257         ((_tid) < 3) ? WME_AC_BK : \
258         ((_tid) < 6) ? WME_AC_VI : \
259         WME_AC_VO)
260
261 /*
262  * WME Parameter Element
263  */
264 struct ieee80211_wme_param {
265         uint8_t         param_id;
266         uint8_t         param_len;
267         uint8_t         param_oui[3];
268         uint8_t         param_oui_type;
269         uint8_t         param_oui_sybtype;
270         uint8_t         param_version;
271         uint8_t         param_qosInfo;
272 #define WME_QOSINFO_COUNT       0x0f    /* Mask for param count field */
273         uint8_t         param_reserved;
274         struct ieee80211_wme_acparams   params_acParams[WME_NUM_AC];
275 } __packed;
276
277 /*
278  * Management Notification Frame
279  */
280 struct ieee80211_mnf {
281         uint8_t         mnf_category;
282         uint8_t         mnf_action;
283         uint8_t         mnf_dialog;
284         uint8_t         mnf_status;
285 } __packed;
286 #define MNF_SETUP_REQ   0
287 #define MNF_SETUP_RESP  1
288 #define MNF_TEARDOWN    2
289
290 /*
291  * Control frames.
292  */
293 struct ieee80211_frame_min {
294         uint8_t         i_fc[2];
295         uint8_t         i_dur[2];
296         uint8_t         i_addr1[IEEE80211_ADDR_LEN];
297         uint8_t         i_addr2[IEEE80211_ADDR_LEN];
298         /* FCS */
299 } __packed;
300
301 struct ieee80211_frame_rts {
302         uint8_t         i_fc[2];
303         uint8_t         i_dur[2];
304         uint8_t         i_ra[IEEE80211_ADDR_LEN];
305         uint8_t         i_ta[IEEE80211_ADDR_LEN];
306         /* FCS */
307 } __packed;
308
309 struct ieee80211_frame_cts {
310         uint8_t         i_fc[2];
311         uint8_t         i_dur[2];
312         uint8_t         i_ra[IEEE80211_ADDR_LEN];
313         /* FCS */
314 } __packed;
315
316 struct ieee80211_frame_ack {
317         uint8_t         i_fc[2];
318         uint8_t         i_dur[2];
319         uint8_t         i_ra[IEEE80211_ADDR_LEN];
320         /* FCS */
321 } __packed;
322
323 struct ieee80211_frame_pspoll {
324         uint8_t         i_fc[2];
325         uint8_t         i_aid[2];
326         uint8_t         i_bssid[IEEE80211_ADDR_LEN];
327         uint8_t         i_ta[IEEE80211_ADDR_LEN];
328         /* FCS */
329 } __packed;
330
331 struct ieee80211_frame_cfend {          /* NB: also CF-End+CF-Ack */
332         uint8_t         i_fc[2];
333         uint8_t         i_dur[2];       /* should be zero */
334         uint8_t         i_ra[IEEE80211_ADDR_LEN];
335         uint8_t         i_bssid[IEEE80211_ADDR_LEN];
336         /* FCS */
337 } __packed;
338
339 /*
340  * BEACON management packets
341  *
342  *      octet timestamp[8]
343  *      octet beacon interval[2]
344  *      octet capability information[2]
345  *      information element
346  *              octet elemid
347  *              octet length
348  *              octet information[length]
349  */
350
351 typedef uint8_t *ieee80211_mgt_beacon_t;
352
353 #define IEEE80211_BEACON_INTERVAL(beacon) \
354         ((beacon)[8] | ((beacon)[9] << 8))
355 #define IEEE80211_BEACON_CAPABILITY(beacon) \
356         ((beacon)[10] | ((beacon)[11] << 8))
357
358 #define IEEE80211_CAPINFO_ESS                   0x0001
359 #define IEEE80211_CAPINFO_IBSS                  0x0002
360 #define IEEE80211_CAPINFO_CF_POLLABLE           0x0004
361 #define IEEE80211_CAPINFO_CF_POLLREQ            0x0008
362 #define IEEE80211_CAPINFO_PRIVACY               0x0010
363 #define IEEE80211_CAPINFO_SHORT_PREAMBLE        0x0020
364 #define IEEE80211_CAPINFO_PBCC                  0x0040
365 #define IEEE80211_CAPINFO_CHNL_AGILITY          0x0080
366 /* bits 8-9 are reserved */
367 #define IEEE80211_CAPINFO_SHORT_SLOTTIME        0x0400
368 #define IEEE80211_CAPINFO_RSN                   0x0800
369 /* bit 12 is reserved */
370 #define IEEE80211_CAPINFO_DSSSOFDM              0x2000
371 /* bits 14-15 are reserved */
372
373 /*
374  * 802.11i/WPA information element (maximally sized).
375  */
376 struct ieee80211_ie_wpa {
377         uint8_t         wpa_id;         /* IEEE80211_ELEMID_VENDOR */
378         uint8_t         wpa_len;        /* length in bytes */
379         uint8_t         wpa_oui[3];     /* 0x00, 0x50, 0xf2 */
380         uint8_t         wpa_type;       /* OUI type */
381         uint16_t        wpa_version;    /* spec revision */
382         uint32_t        wpa_mcipher[1]; /* multicast/group key cipher */
383         uint16_t        wpa_uciphercnt; /* # pairwise key ciphers */
384         uint32_t        wpa_uciphers[8];/* ciphers */
385         uint16_t        wpa_authselcnt; /* authentication selector cnt*/
386         uint32_t        wpa_authsels[8];/* selectors */
387         uint16_t        wpa_caps;       /* 802.11i capabilities */
388         uint16_t        wpa_pmkidcnt;   /* 802.11i pmkid count */
389         uint16_t        wpa_pmkids[8];  /* 802.11i pmkids */
390 } __packed;
391
392 /*
393  * Management information element payloads.
394  */
395
396 enum {
397         IEEE80211_ELEMID_SSID           = 0,
398         IEEE80211_ELEMID_RATES          = 1,
399         IEEE80211_ELEMID_FHPARMS        = 2,
400         IEEE80211_ELEMID_DSPARMS        = 3,
401         IEEE80211_ELEMID_CFPARMS        = 4,
402         IEEE80211_ELEMID_TIM            = 5,
403         IEEE80211_ELEMID_IBSSPARMS      = 6,
404         IEEE80211_ELEMID_COUNTRY        = 7,
405         IEEE80211_ELEMID_CHALLENGE      = 16,
406         /* 17-31 reserved for challenge text extension */
407         IEEE80211_ELEMID_ERP            = 42,
408         IEEE80211_ELEMID_RSN            = 48,
409         IEEE80211_ELEMID_XRATES         = 50,
410         IEEE80211_ELEMID_TPC            = 150,
411         IEEE80211_ELEMID_CCKM           = 156,
412         IEEE80211_ELEMID_VENDOR         = 221,  /* vendor private */
413 };
414
415 struct ieee80211_tim_ie {
416         uint8_t         tim_ie;                 /* IEEE80211_ELEMID_TIM */
417         uint8_t         tim_len;
418         uint8_t         tim_count;              /* DTIM count */
419         uint8_t         tim_period;             /* DTIM period */
420         uint8_t         tim_bitctl;             /* bitmap control */
421         uint8_t         tim_bitmap[1];          /* variable-length bitmap */
422 } __packed;
423
424 struct ieee80211_country_ie {
425         uint8_t         ie;                     /* IEEE80211_ELEMID_COUNTRY */
426         uint8_t         len;
427         uint8_t         cc[3];                  /* ISO CC+(I)ndoor/(O)utdoor */
428         struct {
429                 uint8_t schan;                  /* starting channel */
430                 uint8_t nchan;                  /* number channels */
431                 uint8_t maxtxpwr;               /* tx power cap */
432         } band[4] __packed;                     /* up to 4 sub bands */
433 } __packed;
434
435 #define IEEE80211_CHALLENGE_LEN         128
436
437 #define IEEE80211_RATE_BASIC            0x80
438 #define IEEE80211_RATE_VAL              0x7f
439 #define IEEE80211_RS_RATE(rs, idx) \
440         ((rs)->rs_rates[idx] & IEEE80211_RATE_VAL)
441
442 /* EPR information element flags */
443 #define IEEE80211_ERP_NON_ERP_PRESENT   0x01
444 #define IEEE80211_ERP_USE_PROTECTION    0x02
445 #define IEEE80211_ERP_LONG_PREAMBLE     0x04
446
447 /* Atheros private advanced capabilities info */
448 #define ATHEROS_CAP_TURBO_PRIME         0x01
449 #define ATHEROS_CAP_COMPRESSION         0x02
450 #define ATHEROS_CAP_FAST_FRAME          0x04
451 /* bits 3-6 reserved */
452 #define ATHEROS_CAP_BOOST               0x80
453
454 #define ATH_OUI                 0x7f0300                /* Atheros OUI */
455 #define ATH_OUI_TYPE            0x01
456 #define ATH_OUI_VERSION         0x01
457
458 #define WPA_OUI                 0xf25000
459 #define WPA_OUI_TYPE            0x01
460 #define WPA_VERSION             1               /* current supported version */
461
462 #define WPA_CSE_NULL            0x00
463 #define WPA_CSE_WEP40           0x01
464 #define WPA_CSE_TKIP            0x02
465 #define WPA_CSE_CCMP            0x04
466 #define WPA_CSE_WEP104          0x05
467
468 #define WPA_ASE_NONE            0x00
469 #define WPA_ASE_8021X_UNSPEC    0x01
470 #define WPA_ASE_8021X_PSK       0x02
471
472 #define RSN_OUI                 0xac0f00
473 #define RSN_VERSION             1               /* current supported version */
474
475 #define RSN_CSE_NULL            0x00
476 #define RSN_CSE_WEP40           0x01
477 #define RSN_CSE_TKIP            0x02
478 #define RSN_CSE_WRAP            0x03
479 #define RSN_CSE_CCMP            0x04
480 #define RSN_CSE_WEP104          0x05
481
482 #define RSN_ASE_NONE            0x00
483 #define RSN_ASE_8021X_UNSPEC    0x01
484 #define RSN_ASE_8021X_PSK       0x02
485
486 #define RSN_CAP_PREAUTH         0x01
487
488 #define WME_OUI                 0xf25000
489 #define WME_OUI_TYPE            0x02
490 #define WME_INFO_OUI_SUBTYPE    0x00
491 #define WME_PARAM_OUI_SUBTYPE   0x01
492 #define WME_VERSION             1
493
494 /* WME stream classes */
495 #define WME_AC_BE       0               /* best effort */
496 #define WME_AC_BK       1               /* background */
497 #define WME_AC_VI       2               /* video */
498 #define WME_AC_VO       3               /* voice */
499
500 /*
501  * AUTH management packets
502  *
503  *      octet algo[2]
504  *      octet seq[2]
505  *      octet status[2]
506  *      octet chal.id
507  *      octet chal.length
508  *      octet chal.text[253]
509  */
510
511 typedef uint8_t *ieee80211_mgt_auth_t;
512
513 #define IEEE80211_AUTH_ALGORITHM(auth) \
514         ((auth)[0] | ((auth)[1] << 8))
515 #define IEEE80211_AUTH_TRANSACTION(auth) \
516         ((auth)[2] | ((auth)[3] << 8))
517 #define IEEE80211_AUTH_STATUS(auth) \
518         ((auth)[4] | ((auth)[5] << 8))
519
520 #define IEEE80211_AUTH_ALG_OPEN         0x0000
521 #define IEEE80211_AUTH_ALG_SHARED       0x0001
522 #define IEEE80211_AUTH_ALG_LEAP         0x0080
523
524 enum {
525         IEEE80211_AUTH_OPEN_REQUEST             = 1,
526         IEEE80211_AUTH_OPEN_RESPONSE            = 2,
527 };
528
529 enum {
530         IEEE80211_AUTH_SHARED_REQUEST           = 1,
531         IEEE80211_AUTH_SHARED_CHALLENGE         = 2,
532         IEEE80211_AUTH_SHARED_RESPONSE          = 3,
533         IEEE80211_AUTH_SHARED_PASS              = 4,
534 };
535
536 /*
537  * Reason codes
538  *
539  * Unlisted codes are reserved
540  */
541
542 enum {
543         IEEE80211_REASON_UNSPECIFIED            = 1,
544         IEEE80211_REASON_AUTH_EXPIRE            = 2,
545         IEEE80211_REASON_AUTH_LEAVE             = 3,
546         IEEE80211_REASON_ASSOC_EXPIRE           = 4,
547         IEEE80211_REASON_ASSOC_TOOMANY          = 5,
548         IEEE80211_REASON_NOT_AUTHED             = 6,
549         IEEE80211_REASON_NOT_ASSOCED            = 7,
550         IEEE80211_REASON_ASSOC_LEAVE            = 8,
551         IEEE80211_REASON_ASSOC_NOT_AUTHED       = 9,
552
553         IEEE80211_REASON_RSN_REQUIRED           = 11,
554         IEEE80211_REASON_RSN_INCONSISTENT       = 12,
555         IEEE80211_REASON_IE_INVALID             = 13,
556         IEEE80211_REASON_MIC_FAILURE            = 14,
557
558         IEEE80211_STATUS_SUCCESS                = 0,
559         IEEE80211_STATUS_UNSPECIFIED            = 1,
560         IEEE80211_STATUS_CAPINFO                = 10,
561         IEEE80211_STATUS_NOT_ASSOCED            = 11,
562         IEEE80211_STATUS_OTHER                  = 12,
563         IEEE80211_STATUS_ALG                    = 13,
564         IEEE80211_STATUS_SEQUENCE               = 14,
565         IEEE80211_STATUS_CHALLENGE              = 15,
566         IEEE80211_STATUS_TIMEOUT                = 16,
567         IEEE80211_STATUS_TOOMANY                = 17,
568         IEEE80211_STATUS_BASIC_RATE             = 18,
569         IEEE80211_STATUS_SP_REQUIRED            = 19,
570         IEEE80211_STATUS_PBCC_REQUIRED          = 20,
571         IEEE80211_STATUS_CA_REQUIRED            = 21,
572         IEEE80211_STATUS_TOO_MANY_STATIONS      = 22,
573         IEEE80211_STATUS_RATES                  = 23,
574         IEEE80211_STATUS_SHORTSLOT_REQUIRED     = 25,
575         IEEE80211_STATUS_DSSSOFDM_REQUIRED      = 26,
576 };
577
578 #define IEEE80211_WEP_KEYLEN            5       /* 40bit */
579 #define IEEE80211_WEP_IVLEN             3       /* 24bit */
580 #define IEEE80211_WEP_KIDLEN            1       /* 1 octet */
581 #define IEEE80211_WEP_CRCLEN            4       /* CRC-32 */
582 #define IEEE80211_WEP_NKID              4       /* number of key ids */
583
584 /*
585  * 802.11i defines an extended IV for use with non-WEP ciphers.
586  * When the EXTIV bit is set in the key id byte an additional
587  * 4 bytes immediately follow the IV for TKIP.  For CCMP the
588  * EXTIV bit is likewise set but the 8 bytes represent the
589  * CCMP header rather than IV+extended-IV.
590  */
591 #define IEEE80211_WEP_EXTIV             0x20
592 #define IEEE80211_WEP_EXTIVLEN          4       /* extended IV length */
593 #define IEEE80211_WEP_MICLEN            8       /* trailing MIC */
594
595 #define IEEE80211_CRC_LEN               4
596
597 /*
598  * Maximum acceptable MTU is:
599  *      IEEE80211_MAX_LEN - WEP overhead - CRC -
600  *              QoS overhead - RSN/WPA overhead
601  * Min is arbitrarily chosen > IEEE80211_MIN_LEN.  The default
602  * mtu is Ethernet-compatible; it's set by ether_ifattach.
603  */
604 #define IEEE80211_MTU_MAX               2290
605 #define IEEE80211_MTU_MIN               32
606
607 #define IEEE80211_MAX_LEN               (2300 + IEEE80211_CRC_LEN + \
608     (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
609 #define IEEE80211_ACK_LEN \
610         (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
611 #define IEEE80211_MIN_LEN \
612         (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
613
614 /*
615  * The 802.11 spec says at most 2007 stations may be
616  * associated at once.  For most AP's this is way more
617  * than is feasible so we use a default of 128.  This
618  * number may be overridden by the driver and/or by
619  * user configuration.
620  */
621 #define IEEE80211_AID_MAX               2007
622 #define IEEE80211_AID_DEF               128
623
624 #define IEEE80211_AID(b)        ((b) &~ 0xc000)
625
626 /* 
627  * RTS frame length parameters.  The default is specified in
628  * the 802.11 spec as 512; we treat it as implementation-dependent
629  * so it's defined in ieee80211_var.h.  The max may be wrong
630  * for jumbo frames.
631  */
632 #define IEEE80211_RTS_MIN               1
633 #define IEEE80211_RTS_MAX               2346
634
635 /* 
636  * TX fragmentation parameters.  As above for RTS, we treat
637  * default as implementation-dependent so define it elsewhere.
638  */
639 #define IEEE80211_FRAG_MIN              256
640 #define IEEE80211_FRAG_MAX              2346
641
642 /*
643  * Beacon interval (TU's).  Min+max come from WiFi requirements.
644  * As above, we treat default as implementation-dependent so
645  * define it elsewhere.
646  */
647 #define IEEE80211_BINTVAL_MAX   1000    /* max beacon interval (TU's) */
648 #define IEEE80211_BINTVAL_MIN   25      /* min beacon interval (TU's) */
649
650 /*
651  * DTIM period (beacons).  Min+max are not really defined
652  * by the protocol but we want them publicly visible so
653  * define them here.
654  */
655 #define IEEE80211_DTIM_MAX      15      /* max DTIM period */
656 #define IEEE80211_DTIM_MIN      1       /* min DTIM period */
657
658 /*
659  * Beacon miss threshold (beacons).  As for DTIM, we define
660  * them here to be publicly visible.  Note the max may be
661  * clamped depending on device capabilities.
662  */
663 #define IEEE80211_HWBMISS_MIN   1
664 #define IEEE80211_HWBMISS_MAX   255
665
666 #endif /* _NET80211_IEEE80211_H_ */