1 /* $OpenBSD: ieee80211.h,v 1.63 2022/03/14 15:07:24 stsp Exp $ */
2 /* $NetBSD: ieee80211.h,v 1.6 2004/04/30 23:51:53 dyoung Exp $ */
3
4 /*-
5 * Copyright (c) 2001 Atsushi Onoe
6 * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 #ifndef _NET80211_IEEE80211_H_
30 #define _NET80211_IEEE80211_H_
31
32 /*
33 * 802.11 protocol definitions.
34 */
35
36 #define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
37 /* is 802.11 address multicast/broadcast? */
38 #define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)
39
40 /*
41 * Generic definitions for IEEE 802.11 frames.
42 */
43 struct ieee80211_frame {
44 u_int8_t i_fc[2];
45 u_int8_t i_dur[2];
46 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
47 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
48 u_int8_t i_addr3[IEEE80211_ADDR_LEN];
49 u_int8_t i_seq[2];
50 } __packed;
51
52 struct ieee80211_qosframe {
53 u_int8_t i_fc[2];
54 u_int8_t i_dur[2];
55 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
56 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
57 u_int8_t i_addr3[IEEE80211_ADDR_LEN];
58 u_int8_t i_seq[2];
59 u_int8_t i_qos[2];
60 } __packed;
61
62 struct ieee80211_htframe { /* 11n */
63 u_int8_t i_fc[2];
64 u_int8_t i_dur[2];
65 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
66 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
67 u_int8_t i_addr3[IEEE80211_ADDR_LEN];
68 u_int8_t i_seq[2];
69 u_int8_t i_qos[2];
70 u_int8_t i_ht[4];
71 } __packed;
72
73 struct ieee80211_frame_addr4 {
74 u_int8_t i_fc[2];
75 u_int8_t i_dur[2];
76 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
77 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
78 u_int8_t i_addr3[IEEE80211_ADDR_LEN];
79 u_int8_t i_seq[2];
80 u_int8_t i_addr4[IEEE80211_ADDR_LEN];
81 } __packed;
82
83 struct ieee80211_qosframe_addr4 {
84 u_int8_t i_fc[2];
85 u_int8_t i_dur[2];
86 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
87 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
88 u_int8_t i_addr3[IEEE80211_ADDR_LEN];
89 u_int8_t i_seq[2];
90 u_int8_t i_addr4[IEEE80211_ADDR_LEN];
91 u_int8_t i_qos[2];
92 } __packed;
93
94 struct ieee80211_htframe_addr4 { /* 11n */
95 u_int8_t i_fc[2];
96 u_int8_t i_dur[2];
97 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
98 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
99 u_int8_t i_addr3[IEEE80211_ADDR_LEN];
100 u_int8_t i_seq[2];
101 u_int8_t i_addr4[IEEE80211_ADDR_LEN];
102 u_int8_t i_qos[2];
103 u_int8_t i_ht[4];
104 } __packed;
105
106 #define IEEE80211_FC0_VERSION_MASK 0x03
107 #define IEEE80211_FC0_VERSION_SHIFT 0
108 #define IEEE80211_FC0_VERSION_0 0x00
109 #define IEEE80211_FC0_TYPE_MASK 0x0c
110 #define IEEE80211_FC0_TYPE_SHIFT 2
111 #define IEEE80211_FC0_TYPE_MGT 0x00
112 #define IEEE80211_FC0_TYPE_CTL 0x04
113 #define IEEE80211_FC0_TYPE_DATA 0x08
114
115 #define IEEE80211_FC0_SUBTYPE_MASK 0xf0
116 #define IEEE80211_FC0_SUBTYPE_SHIFT 4
117 /* for TYPE_MGT */
118 #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00
119 #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10
120 #define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20
121 #define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30
122 #define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40
123 #define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50
124 #define IEEE80211_FC0_SUBTYPE_BEACON 0x80
125 #define IEEE80211_FC0_SUBTYPE_ATIM 0x90
126 #define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0
127 #define IEEE80211_FC0_SUBTYPE_AUTH 0xb0
128 #define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0
129 #define IEEE80211_FC0_SUBTYPE_ACTION 0xd0
130 #define IEEE80211_FC0_SUBTYPE_ACTION_NOACK 0xe0 /* 11n */
131 /* for TYPE_CTL */
132 #define IEEE80211_FC0_SUBTYPE_WRAPPER 0x70 /* 11n */
133 #define IEEE80211_FC0_SUBTYPE_BAR 0x80
134 #define IEEE80211_FC0_SUBTYPE_BA 0x90
135 #define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0
136 #define IEEE80211_FC0_SUBTYPE_RTS 0xb0
137 #define IEEE80211_FC0_SUBTYPE_CTS 0xc0
138 #define IEEE80211_FC0_SUBTYPE_ACK 0xd0
139 #define IEEE80211_FC0_SUBTYPE_CF_END 0xe0
140 #define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0
141 /* for TYPE_DATA (bit combination) */
142 #define IEEE80211_FC0_SUBTYPE_DATA 0x00
143 #define IEEE80211_FC0_SUBTYPE_DATA_CF_ACK 0x10
144 #define IEEE80211_FC0_SUBTYPE_DATA_CF_POLL 0x20
145 #define IEEE80211_FC0_SUBTYPE_DATA_CF_ACKPOLL 0x30
146 #define IEEE80211_FC0_SUBTYPE_NODATA 0x40
147 #define IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK 0x50
148 #define IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL 0x60
149 #define IEEE80211_FC0_SUBTYPE_NODATA_CF_ACKPOLL 0x70
150 #define IEEE80211_FC0_SUBTYPE_QOS 0x80
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_PROTECTED 0x40
163 #define IEEE80211_FC1_WEP 0x40 /* pre-RSNA compat */
164 #define IEEE80211_FC1_ORDER 0x80
165 #define IEEE80211_FC1_BITS \
166 "\20\03MORE_FRAG\04RETRY\05PWR_MGT\06MORE_DATA" \
167 "\07PROTECTED\08ORDER"
168
169 /*
170 * Sequence Control field (see 802.11-2012 8.2.4.4).
171 */
172 #define IEEE80211_SEQ_FRAG_MASK 0x000f
173 #define IEEE80211_SEQ_FRAG_SHIFT 0
174 #define IEEE80211_SEQ_SEQ_MASK 0xfff0
175 #define IEEE80211_SEQ_SEQ_SHIFT 4
176
177 #define IEEE80211_NWID_LEN 32
178 #define IEEE80211_MMIE_LEN 18 /* 11w */
179
180 /*
181 * QoS Control field (see 802.11-2012 8.2.4.5).
182 */
183 #define IEEE80211_QOS_TXOP 0xff00
184 #define IEEE80211_QOS_AMSDU 0x0080 /* 11n */
185 #define IEEE80211_QOS_ACK_POLICY_NORMAL 0x0000
186 #define IEEE80211_QOS_ACK_POLICY_NOACK 0x0020
187 #define IEEE80211_QOS_ACK_POLICY_NOEXPLACK 0x0040
188 #define IEEE80211_QOS_ACK_POLICY_BA 0x0060
189 #define IEEE80211_QOS_ACK_POLICY_MASK 0x0060
190 #define IEEE80211_QOS_ACK_POLICY_SHIFT 5
191 #define IEEE80211_QOS_EOSP 0x0010
192 #define IEEE80211_QOS_TID 0x000f
193
194 /*
195 * Control frames.
196 */
197 struct ieee80211_frame_min {
198 u_int8_t i_fc[2];
199 u_int8_t i_dur[2];
200 u_int8_t i_addr1[IEEE80211_ADDR_LEN];
201 u_int8_t i_addr2[IEEE80211_ADDR_LEN];
202 /* FCS */
203 } __packed;
204
205 struct ieee80211_frame_rts {
206 u_int8_t i_fc[2];
207 u_int8_t i_dur[2];
208 u_int8_t i_ra[IEEE80211_ADDR_LEN];
209 u_int8_t i_ta[IEEE80211_ADDR_LEN];
210 /* FCS */
211 } __packed;
212
213 struct ieee80211_frame_cts {
214 u_int8_t i_fc[2];
215 u_int8_t i_dur[2];
216 u_int8_t i_ra[IEEE80211_ADDR_LEN];
217 /* FCS */
218 } __packed;
219
220 struct ieee80211_frame_ack {
221 u_int8_t i_fc[2];
222 u_int8_t i_dur[2];
223 u_int8_t i_ra[IEEE80211_ADDR_LEN];
224 /* FCS */
225 } __packed;
226
227 struct ieee80211_frame_pspoll {
228 u_int8_t i_fc[2];
229 u_int8_t i_aid[2];
230 u_int8_t i_bssid[IEEE80211_ADDR_LEN];
231 u_int8_t i_ta[IEEE80211_ADDR_LEN];
232 /* FCS */
233 } __packed;
234
235 struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */
236 u_int8_t i_fc[2];
237 u_int8_t i_dur[2]; /* should be zero */
238 u_int8_t i_ra[IEEE80211_ADDR_LEN];
239 u_int8_t i_bssid[IEEE80211_ADDR_LEN];
240 /* FCS */
241 } __packed;
242
243 #ifdef _KERNEL
244 static __inline int
ieee80211_has_seq(const struct ieee80211_frame * wh)245 ieee80211_has_seq(const struct ieee80211_frame *wh)
246 {
247 return (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) !=
248 IEEE80211_FC0_TYPE_CTL;
249 }
250
251 static __inline int
ieee80211_has_addr4(const struct ieee80211_frame * wh)252 ieee80211_has_addr4(const struct ieee80211_frame *wh)
253 {
254 return (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) ==
255 IEEE80211_FC1_DIR_DSTODS;
256 }
257
258 static __inline int
ieee80211_has_qos(const struct ieee80211_frame * wh)259 ieee80211_has_qos(const struct ieee80211_frame *wh)
260 {
261 return (wh->i_fc[0] &
262 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) ==
263 (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS);
264 }
265
266 static __inline int
ieee80211_has_htc(const struct ieee80211_frame * wh)267 ieee80211_has_htc(const struct ieee80211_frame *wh)
268 {
269 return (wh->i_fc[1] & IEEE80211_FC1_ORDER) &&
270 (ieee80211_has_qos(wh) ||
271 (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
272 IEEE80211_FC0_TYPE_MGT);
273 }
274
275 static __inline u_int16_t
ieee80211_get_qos(const struct ieee80211_frame * wh)276 ieee80211_get_qos(const struct ieee80211_frame *wh)
277 {
278 const u_int8_t *frm;
279
280 if (ieee80211_has_addr4(wh))
281 frm = ((const struct ieee80211_qosframe_addr4 *)wh)->i_qos;
282 else
283 frm = ((const struct ieee80211_qosframe *)wh)->i_qos;
284
285 return letoh16(*(const u_int16_t *)frm);
286 }
287 #endif /* _KERNEL */
288
289 /*
290 * Capability Information field (see 802.11-2012 8.4.1.4).
291 */
292 #define IEEE80211_CAPINFO_ESS 0x0001
293 #define IEEE80211_CAPINFO_IBSS 0x0002
294 #define IEEE80211_CAPINFO_CF_POLLABLE 0x0004
295 #define IEEE80211_CAPINFO_CF_POLLREQ 0x0008
296 #define IEEE80211_CAPINFO_PRIVACY 0x0010
297 #define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020
298 #define IEEE80211_CAPINFO_PBCC 0x0040
299 #define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080
300 #define IEEE80211_CAPINFO_SPECTRUM_MGMT 0x0100
301 #define IEEE80211_CAPINFO_QOS 0x0200
302 #define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400
303 #define IEEE80211_CAPINFO_APSD 0x0800
304 #define IEEE80211_CAPINFO_RADIO_MEASUREMENT 0x1000
305 #define IEEE80211_CAPINFO_DSSSOFDM 0x2000
306 #define IEEE80211_CAPINFO_DELAYED_B_ACK 0x4000
307 #define IEEE80211_CAPINFO_IMMEDIATE_B_ACK 0x8000
308 #define IEEE80211_CAPINFO_BITS \
309 "\10\01ESS\02IBSS\03CF_POLLABLE\04CF_POLLREQ" \
310 "\05PRIVACY\06SHORT_PREAMBLE\07PBCC\10CHNL_AGILITY" \
311 "\11SPECTRUM_MGMT\12QOS\13SHORT_SLOTTIME\14APSD" \
312 "\15RADIO_MEASUREMENT\16DSSSOFDM\17DELAYED_B_ACK\20IMMEDIATE_B_ACK"
313
314 /*
315 * Information element IDs (see 802.11-2012 Table 8.4.2).
316 */
317 enum {
318 IEEE80211_ELEMID_SSID = 0,
319 IEEE80211_ELEMID_RATES = 1,
320 IEEE80211_ELEMID_FHPARMS = 2,
321 IEEE80211_ELEMID_DSPARMS = 3,
322 IEEE80211_ELEMID_CFPARMS = 4,
323 IEEE80211_ELEMID_TIM = 5,
324 IEEE80211_ELEMID_IBSSPARMS = 6,
325 IEEE80211_ELEMID_COUNTRY = 7,
326 IEEE80211_ELEMID_HOPPING_PARMS = 8,
327 IEEE80211_ELEMID_HOPPING_PATTERN = 9,
328 IEEE80211_ELEMID_REQUEST = 10,
329 IEEE80211_ELEMID_QBSS_LOAD = 11,
330 IEEE80211_ELEMID_EDCAPARMS = 12,
331 IEEE80211_ELEMID_TSPEC = 13,
332 IEEE80211_ELEMID_TCLASS = 14,
333 IEEE80211_ELEMID_SCHEDULE = 15,
334 IEEE80211_ELEMID_CHALLENGE = 16,
335 /* 17-31 reserved for challenge text extension */
336 IEEE80211_ELEMID_POWER_CONSTRAINT = 32,
337 IEEE80211_ELEMID_POWER_CAP = 33,
338 IEEE80211_ELEMID_TPC_REQUEST = 34,
339 IEEE80211_ELEMID_TPC_REPORT = 35,
340 IEEE80211_ELEMID_SUPP_CHNLS = 35,
341 IEEE80211_ELEMID_CSA = 37, /* 11h */
342 IEEE80211_ELEMID_MEASUREMENT_REQUEST = 38, /* DFS */
343 IEEE80211_ELEMID_MEASUREMENT_REPORT = 39, /* DFS */
344 IEEE80211_ELEMID_QUIET = 40,
345 IEEE80211_ELEMID_IBSS_DFS = 41,
346 IEEE80211_ELEMID_ERP = 42,
347 IEEE80211_ELEMID_TS_DELAY = 43,
348 IEEE80211_ELEMID_TCLAS = 44,
349 IEEE80211_ELEMID_HTCAPS = 45, /* 11n */
350 IEEE80211_ELEMID_QOS_CAP = 46,
351 /* 47 reserved */
352 IEEE80211_ELEMID_RSN = 48,
353 /* 49 reserved */
354 IEEE80211_ELEMID_XRATES = 50,
355 IEEE80211_ELEMID_AP_CHNL_REPORT = 51,
356 IEEE80211_ELEMID_NBR_REPORT = 52,
357 IEEE80211_ELEMID_RCPI = 53,
358 IEEE80211_ELEMID_MDE = 54,
359 IEEE80211_ELEMID_FTE = 55,
360 IEEE80211_ELEMID_TIE = 56, /* 11r */
361 IEEE80211_ELEMID_RDE = 57,
362 IEEE80211_ELEMID_DSE = 58,
363 IEEE80211_ELEMID_SUPP_OPCLASS = 59,
364 IEEE80211_ELEMID_XCSA = 60,
365 IEEE80211_ELEMID_HTOP = 61, /* 11n */
366 IEEE80211_ELEMID_SECONDARY_CHANL_OFFSET = 62, /* 11n */
367 IEEE80211_ELEMID_AVG_ACCESS_DELAY = 63,
368 IEEE80211_ELEMID_ANTENNA = 64,
369 IEEE80211_ELEMID_RSNI = 65,
370 IEEE80211_ELEMID_MEASUREMENT_PILOT_TX = 66,
371 IEEE80211_ELEMID_AVAIL_CAPACITY = 67,
372 IEEE80211_ELEMID_AC_ACCESS_DELAY = 68,
373 IEEE80211_ELEMID_TIME_ADVERT = 69,
374 IEEE80211_ELEMID_RM = 70,
375 IEEE80211_ELEMID_MULTI_BSSID = 71,
376 IEEE80211_ELEMID_20_40_CBW_COEX = 72, /* 11n */
377 IEEE80211_ELEMID_20_40_CBW_INTOLERANT = 73, /* 11n */
378 IEEE80211_ELEMID_SCAN_PARAM_OVERLAP = 74,
379 IEEE80211_ELEMID_RIC = 75,
380 IEEE80211_ELEMID_MMIE = 76, /* 11w */
381 IEEE80211_ELEMID_EVENT_REQUEST = 78,
382 IEEE80211_ELEMID_EVENT_REPORT = 79,
383 IEEE80211_ELEMID_DIAG_REQUEST = 80,
384 IEEE80211_ELEMID_DIAG_REPORT = 81,
385 IEEE80211_ELEMID_LOCATION_PARMS = 82,
386 IEEE80211_ELEMID_NONTX_BSSID = 83,
387 IEEE80211_ELEMID_SSID_LIST = 84,
388 IEEE80211_ELEMID_MULTI_BSSID_IDX = 85,
389 IEEE80211_ELEMID_FMS_DESC = 86,
390 IEEE80211_ELEMID_FMS_REQUEST = 87,
391 IEEE80211_ELEMID_FMS_RESPONSE = 88,
392 IEEE80211_ELEMID_QOS_TRAFFIC_CAP = 89,
393 IEEE80211_ELEMID_MAX_IDLE_PERIOD = 90,
394 IEEE80211_ELEMID_TFS_REQUEST = 91,
395 IEEE80211_ELEMID_TFS_RESPONSE = 92,
396 IEEE80211_ELEMID_WNM_SLEEP = 93,
397 IEEE80211_ELEMID_TIM_BCAST_REQUEST = 94,
398 IEEE80211_ELEMID_TIM_BCAST_RESPONSE = 95,
399 IEEE80211_ELEMID_INTERFERENCE_REPORT = 96,
400 IEEE80211_ELEMID_CHNL_USAGE = 97,
401 IEEE80211_ELEMID_TIME_ZONE = 98,
402 IEEE80211_ELEMID_DMS_REQUEST = 99,
403 IEEE80211_ELEMID_DMS_RESPONSE = 100,
404 IEEE80211_ELEMID_LINK_ID = 101,
405 IEEE80211_ELEMID_WAKE_SCHED = 102,
406 /* 103 undefined */
407 IEEE80211_ELEMID_CHNL_SWITCH_TIMING = 104,
408 IEEE80211_ELEMID_PTI_CTRL = 105,
409 IEEE80211_ELEMID_TPU_BUF_STATUS = 106,
410 IEEE80211_ELEMID_INTERWORKING = 107,
411 IEEE80211_ELEMID_ADVERT_PROTOCOL = 108,
412 IEEE80211_ELEMID_EXPEDITED_BW_REQUEST = 109,
413 IEEE80211_ELEMID_QOS_MAP_SET = 110,
414 IEEE80211_ELEMID_ROAMING_CONSORTIUM = 111,
415 IEEE80211_ELEMID_EMERGENCY_ALERT_ID = 112,
416 IEEE80211_ELEMID_MESHCONF = 113,
417 IEEE80211_ELEMID_MESHID = 114,
418 IEEE80211_ELEMID_MESHLINK = 115,
419 IEEE80211_ELEMID_MESHCNGST = 116,
420 IEEE80211_ELEMID_MESHPEER = 117,
421 IEEE80211_ELEMID_MESHCSA = 118,
422 IEEE80211_ELEMID_MESHAWAKEW = 119,
423 IEEE80211_ELEMID_MESHBEACONT = 120,
424 IEEE80211_ELEMID_MCCAOP_SETUP_REQUEST = 121,
425 IEEE80211_ELEMID_MCCAOP_SETUP_REPLY = 122,
426 IEEE80211_ELEMID_MCCAOP_ADVERT = 123,
427 IEEE80211_ELEMID_MCCAOP_TEARDOWN = 124,
428 IEEE80211_ELEMID_MESHGANN = 125,
429 IEEE80211_ELEMID_MESHRANN = 126,
430 IEEE80211_ELEMID_XCAPS = 127,
431 /* 128-129 reserved */
432 IEEE80211_ELEMID_MESHPREQ = 130,
433 IEEE80211_ELEMID_MESHPREP = 131,
434 IEEE80211_ELEMID_MESHPERR = 132,
435 /* 133-136 reserved */
436 IEEE80211_ELEMID_MESHPXU = 137,
437 IEEE80211_ELEMID_MESHPXUC = 138,
438 IEEE80211_ELEMID_AUTH_MESH_PEERING_XCHG = 139,
439 IEEE80211_ELEMID_MIC = 140,
440 IEEE80211_ELEMID_DEST_URI = 141,
441 IEEE80211_ELEMID_U_APSD_COEX = 142,
442 /* 143-174 reserved */
443 IEEE80211_ELEMID_MCCAOP_ADVERT_OVIEW = 174,
444 /* 175-190 reserved */
445 IEEE80211_ELEMID_VHTCAPS = 191, /* 11ac */
446 IEEE80211_ELEMID_VHTOP = 192, /* 11ac */
447 IEEE80211_ELEMID_EXT_BSS_LOAD = 193, /* 11ac */
448 IEEE80211_ELEMID_WIDEBAND_CHNL_SWITCH = 194, /* 11ac */
449 IEEE80211_ELEMID_VHT_TXPOWER = 195, /* 11ac */
450 IEEE80211_ELEMID_CHNL_SWITCH_WRAPPER = 196, /* 11ac */
451 IEEE80211_ELEMID_AID = 197, /* 11ac */
452 IEEE80211_ELEMID_QUIET_CHNL = 198, /* 11ac */
453 IEEE80211_ELEMID_OPMODE_NOTIF = 199, /* 11ac */
454 /* 200-220 reserved */
455 IEEE80211_ELEMID_VENDOR = 221 /* vendor private */
456 /* 222-255 reserved */
457 };
458
459 /*
460 * Action field category values (see 802.11-2012 8.4.1.11 Table 8-38).
461 */
462 enum {
463 IEEE80211_CATEG_SPECTRUM = 0,
464 IEEE80211_CATEG_QOS = 1,
465 IEEE80211_CATEG_DLS = 2,
466 IEEE80211_CATEG_BA = 3,
467 IEEE80211_CATEG_PUB = 4,
468 IEEE80211_CATEG_RADIO_MSRMNT = 5,
469 IEEE80211_CATEG_FAST_BSS_TRANS = 6,
470 IEEE80211_CATEG_HT = 7, /* 11n */
471 IEEE80211_CATEG_SA_QUERY = 8, /* 11w */
472 IEEE80211_CATEG_PROT_DUAL_PUBLIC_ACTION = 9,
473 IEEE80211_CATEG_WNM = 10,
474 IEEE80211_CATEG_UNPROT_WNM = 11,
475 IEEE80211_CATEG_TDLS = 12,
476 IEEE80211_CATEG_MESH = 13,
477 IEEE80211_CATEG_MULTIHOP = 14,
478 IEEE80211_CATEG_SELF_PROT = 15,
479 /* 16-125 reserved */
480 IEEE80211_CATEG_PROT_VENDOR = 126,
481 IEEE80211_CATEG_VENDOR = 127
482 /* 128-255 error */
483 };
484
485 /*
486 * Block Ack Action field values (see 802.11-2012 8.5.5 Table 8-202).
487 */
488 #define IEEE80211_ACTION_ADDBA_REQ 0
489 #define IEEE80211_ACTION_ADDBA_RESP 1
490 #define IEEE80211_ACTION_DELBA 2
491 /* 3-255 reserved */
492
493 /*
494 * SA Query Action field values (see 802.11-2012 8.5.10 Table 8-227).
495 */
496 #define IEEE80211_ACTION_SA_QUERY_REQ 0
497 #define IEEE80211_ACTION_SA_QUERY_RESP 1
498
499 /*
500 * HT Action field values (see 802.11-2012 8.5.12 Table 8-229).
501 */
502 #define IEEE80211_ACTION_NOTIFYCW 0
503 #define IEEE80211_ACTION_SM_PWRSAVE 1
504 #define IEEE80211_ACTION_PSMP 2
505 #define IEEE80211_ACTION_SET_PCO_PHASE 3
506 #define IEEE80211_ACTION_CSI 4
507 #define IEEE80211_ACTION_NONCOMPRESSED_BF 5
508 #define IEEE80211_ACTION_COMPRESSED_BF 6
509 #define IEEE80211_ACTION_ASEL_IDX_FEEDBACK 7
510 /* 8-255 reserved */
511
512 #define IEEE80211_RATE_BASIC 0x80
513 #define IEEE80211_RATE_VAL 0x7f
514 #define IEEE80211_RATE_SIZE 8 /* 802.11 standard */
515 #define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */
516
517 #define IEEE80211_HT_NUM_MCS 77
518 #define IEEE80211_VHT_NUM_MCS 10
519
520 /*
521 * BlockAck/BlockAckReq Control field (see 802.11-2012 8.3.1.9 Figure 8-25).
522 */
523 #define IEEE80211_BA_ACK_POLICY 0x0001
524 #define IEEE80211_BA_MULTI_TID 0x0002
525 #define IEEE80211_BA_COMPRESSED 0x0004
526 #define IEEE80211_BA_TID_INFO_MASK 0xf000
527 #define IEEE80211_BA_TID_INFO_SHIFT 12
528
529 /*
530 * ADDBA Parameter Set field (see 802.11-2012 8.4.1.14 Figure 8-48).
531 */
532 #define IEEE80211_ADDBA_AMSDU 0x0001 /* A-MSDU in A-MPDU supported */
533 #define IEEE80211_ADDBA_BA_POLICY 0x0002 /* 1=immediate BA 0=delayed BA */
534 #define IEEE80211_ADDBA_TID_MASK 0x003c
535 #define IEEE80211_ADDBA_TID_SHIFT 2
536 #define IEEE80211_ADDBA_BUFSZ_MASK 0xffc0
537 #define IEEE80211_ADDBA_BUFSZ_SHIFT 6
538
539 /*
540 * DELBA Parameter Set field (see 802.11-2012 8.4.1.16 Figure 8-50).
541 */
542 #define IEEE80211_DELBA_INITIATOR 0x0800
543 #define IEEE80211_DELBA_TID_INFO_MASK 0xf000
544 #define IEEE80211_DELBA_TID_INFO_SHIFT 12
545
546 /*
547 * ERP information element parameters (see 802.11-2012 8.4.2.14 Figure 8-95).
548 */
549 #define IEEE80211_ERP_NON_ERP_PRESENT 0x01
550 #define IEEE80211_ERP_USE_PROTECTION 0x02
551 #define IEEE80211_ERP_BARKER_MODE 0x04
552
553 /*
554 * RSN capabilities (see 802.11-2012 8.4.2.27.4).
555 */
556 #define IEEE80211_RSNCAP_PREAUTH 0x0001
557 #define IEEE80211_RSNCAP_NOPAIRWISE 0x0002
558 #define IEEE80211_RSNCAP_PTKSA_RCNT_MASK 0x000c
559 #define IEEE80211_RSNCAP_PTKSA_RCNT_SHIFT 2
560 #define IEEE80211_RSNCAP_GTKSA_RCNT_MASK 0x0030
561 #define IEEE80211_RSNCAP_GTKSA_RCNT_SHIFT 4
562 #define IEEE80211_RSNCAP_RCNT1 0
563 #define IEEE80211_RSNCAP_RCNT2 1
564 #define IEEE80211_RSNCAP_RCNT4 2
565 #define IEEE80211_RSNCAP_RCNT16 3
566 #define IEEE80211_RSNCAP_MFPR 0x0040 /* 11w */
567 #define IEEE80211_RSNCAP_MFPC 0x0080 /* 11w */
568 #define IEEE80211_RSNCAP_PEERKEYENA 0x0200
569 #define IEEE80211_RSNCAP_SPPAMSDUC 0x0400 /* 11n */
570 #define IEEE80211_RSNCAP_SPPAMSDUR 0x0800 /* 11n */
571 #define IEEE80211_RSNCAP_PBAC 0x1000 /* 11n */
572 #define IEEE80211_RSNCAP_EXTENDED_KEYID 0x2000
573
574 /*
575 * HT Capabilities Info (see 802.11-2012 8.4.2.58.2).
576 */
577 #define IEEE80211_HTCAP_LDPC 0x00000001
578 #define IEEE80211_HTCAP_CBW20_40 0x00000002
579 #define IEEE80211_HTCAP_SMPS_MASK 0x0000000c
580 #define IEEE80211_HTCAP_SMPS_SHIFT 2
581 #define IEEE80211_HTCAP_SMPS_STA 0
582 #define IEEE80211_HTCAP_SMPS_DYN 1
583 #define IEEE80211_HTCAP_SMPS_DIS 3
584 #define IEEE80211_HTCAP_GF 0x00000010
585 #define IEEE80211_HTCAP_SGI20 0x00000020
586 #define IEEE80211_HTCAP_SGI40 0x00000040
587 #define IEEE80211_HTCAP_TXSTBC 0x00000080
588 #define IEEE80211_HTCAP_RXSTBC_MASK 0x00000300
589 #define IEEE80211_HTCAP_RXSTBC_SHIFT 8
590 #define IEEE80211_HTCAP_DELAYEDBA 0x00000400
591 #define IEEE80211_HTCAP_AMSDU7935 0x00000800
592 #define IEEE80211_HTCAP_DSSSCCK40 0x00001000
593 #define IEEE80211_HTCAP_PSMP 0x00002000
594 #define IEEE80211_HTCAP_40INTOLERANT 0x00004000
595 #define IEEE80211_HTCAP_LSIGTXOPPROT 0x00008000
596
597 /*
598 * HT A-MPDU parameters (see 802.11-2012 8.4.2.58.3).
599 */
600 #define IEEE80211_AMPDU_PARAM_LE 0x03
601 #define IEEE80211_AMPDU_PARAM_SS 0x1c
602 #define IEEE80211_AMPDU_PARAM_SS_NONE (0 << 2)
603 #define IEEE80211_AMPDU_PARAM_SS_0_25 (1 << 2)
604 #define IEEE80211_AMPDU_PARAM_SS_0_5 (2 << 2)
605 #define IEEE80211_AMPDU_PARAM_SS_1 (3 << 2)
606 #define IEEE80211_AMPDU_PARAM_SS_2 (4 << 2)
607 #define IEEE80211_AMPDU_PARAM_SS_4 (5 << 2)
608 #define IEEE80211_AMPDU_PARAM_SS_8 (6 << 2)
609 #define IEEE80211_AMPDU_PARAM_SS_16 (7 << 2)
610 /* bits 5-7 reserved */
611
612 /*
613 * HT Supported MCS Set (see 802.11-2012 8.4.2.58.4).
614 * This field is 16 bytes in size. Bitmasks given below
615 * operate on 8 or 16 bit integer subsets of this field
616 * for use with ieee80211com and ieee80211_node.
617 */
618 /* Bits 0-76: Supported Rx MCS bitmask */
619 /* Bits 77-79: Reserved */
620 /* Bits 80-89: Highest Rx rate in units of 1MB/s */
621 #define IEEE80211_MCS_RX_RATE_HIGH 0x03ff
622 /* Bits 90-95: Reserved */
623 /* Bits 96-100: Tx MCS set */
624 #define IEEE80211_TX_MCS_SET_DEFINED 0x01
625 #define IEEE80211_TX_RX_MCS_NOT_EQUAL 0x02
626 #define IEEE80211_TX_SPATIAL_STREAMS 0x0c
627 #define IEEE80211_TX_UNEQUAL_MODULATION 0x10
628 /* Bits 101-127: Reserved */
629
630 /*
631 * HT Extended Capabilities (see 802.11-2012 8.4.2.58.5).
632 */
633 #define IEEE80211_HTXCAP_PCO 0x0001
634 #define IEEE80211_HTXCAP_PCOTT_MASK 0x0006
635 #define IEEE80211_HTXCAP_PCOTT_SHIFT 1
636 #define IEEE80211_HTXCAP_PCOTT_400 1
637 #define IEEE80211_HTXCAP_PCOTT_1500 2
638 #define IEEE80211_HTXCAP_PCOTT_5000 3
639 /* Bits 3-7 are reserved. */
640 #define IEEE80211_HTXCAP_MFB_MASK 0x0300
641 #define IEEE80211_HTXCAP_MFB_SHIFT 8
642 #define IEEE80211_HTXCAP_MFB_NONE 0
643 #define IEEE80211_HTXCAP_MFB_UNSOL 2
644 #define IEEE80211_HTXCAP_MFB_BOTH 3
645 #define IEEE80211_HTXCAP_HTC 0x0400
646 #define IEEE80211_HTXCAP_RDRESP 0x0800
647 /* Bits 12-15 are reserved. */
648
649 /*
650 * Transmit Beamforming (TxBF) Capabilities (see 802.11-2012 8.4.2.58.6).
651 */
652 #define IEEE80211_TXBFCAP_IMPLICIT_RX 0x00000001
653 #define IEEE80211_TXBFCAP_RSSC 0x00000002
654 #define IEEE80211_TXBFCAP_TSSC 0x00000004
655 #define IEEE80211_TXBFCAP_RNDP 0x00000008
656 #define IEEE80211_TXBFCAP_TNDP 0x00000010
657 #define IEEE80211_TXBFCAP_IMPLICIT_TX 0x00000020
658 #define IEEE80211_TXBFCAP_CALIB_MASK 0x000000c0
659 #define IEEE80211_TXBFCAP_CALIB_SHIFT 6
660 #define IEEE80211_TXBFCAP_TX_CSI 0x00000100
661 #define IEEE80211_TXBFCAP_EXPLICIT_NSC 0x00000200
662 #define IEEE80211_TXBFCAP_EXPLICIT_CSC 0x00000400
663 #define IEEE80211_TXBFCAP_CSI_FB_DELAYED 0x00000800
664 #define IEEE80211_TXBFCAP_CSI_FB_IMMEDIATE 0x00001000
665 #define IEEE80211_TXBFCAP_EXPLICIT_NB_FB_DELAYED 0x00002000
666 #define IEEE80211_TXBFCAP_EXPLICIT_NB_FB_IMMEDIATE 0x00004000
667 #define IEEE80211_TXBFCAP_EXPLICIT_CB_FB_DELAYED 0x00008000
668 #define IEEE80211_TXBFCAP_EXPLICIT_CB_FB_IMMEDIATE 0x00010000
669 #define IEEE80211_TXBFCAP_MINIMAL_GROUPING_1_2 0x00020000
670 #define IEEE80211_TXBFCAP_MINIMAL_GROUPING_1_4 0x00040000
671 #define IEEE80211_TXBFCAP_CSI_NUM_ANT_MASK 0x00180000
672 #define IEEE80211_TXBFCAP_CSI_NUM_ANT_SHIFT 19
673 #define IEEE80211_TXBFCAP_NS_NUM_ANT_MASK 0x00600000
674 #define IEEE80211_TXBFCAP_NS_NUM_ANT_SHIFT 21
675 #define IEEE80211_TXBFCAP_CS_NUM_ANT_MASK 0x01800000
676 #define IEEE80211_TXBFCAP_CS_NUM_ANT_SHIFT 23
677 #define IEEE80211_TXBFCAP_CSI_NUM_ROWS_MASK 0x06000000
678 #define IEEE80211_TXBFCAP_CSI_NUM_ROWS_SHIFT 25
679 #define IEEE80211_TXBFCAP_CHANL_ESTIMATE_MASK 0x18000000
680 #define IEEE80211_TXBFCAP_CHANL_ESTIMATE_SHIFT 27
681
682 /*
683 * Antenna Selection (ASEL) Capability (see 802.11-2012 8.4.2.58.7).
684 */
685 #define IEEE80211_ASELCAP_ASEL 0x01
686 #define IEEE80211_ASELCAP_CSIFB_TX 0x02
687 #define IEEE80211_ASELCAP_ANT_IDX_FB_TX 0x04
688 #define IEEE80211_ASELCAP_CSIFB 0x08
689 #define IEEE80211_ASELCAP_ANT_IDX_FB 0x10
690 #define IEEE80211_ASELCAP_ASEL_RX 0x20
691 #define IEEE80211_ASELCAP_TX_SOUND_PPDU 0x20
692 /* Bit 7 is reserved. */
693
694 /*
695 * HT Operation element (see 802.11-2012 8.4.2.59).
696 */
697 /* Byte 0 contains primary channel number. */
698 /* Byte 1. */
699 #define IEEE80211_HTOP0_SCO_MASK 0x03
700 #define IEEE80211_HTOP0_SCO_SHIFT 0
701 #define IEEE80211_HTOP0_SCO_SCN 0
702 #define IEEE80211_HTOP0_SCO_SCA 1
703 #define IEEE80211_HTOP0_SCO_SCB 3
704 #define IEEE80211_HTOP0_CHW 0x04
705 #define IEEE80211_HTOP0_RIFS 0x08
706 /* bits 4-7 reserved */
707 /* Bytes 2-3. */
708 #define IEEE80211_HTOP1_PROT_MASK 0x0003
709 #define IEEE80211_HTOP1_PROT_SHIFT 0
710 #define IEEE80211_HTOP1_NONGF_STA 0x0004
711 /* Bit 3 is reserved. */
712 #define IEEE80211_HTOP1_OBSS_NONHT_STA 0x0010
713 /* Bits 5-15 are reserved. */
714 /* Bytes 4-5. */
715 /* Bits 0-5 are reserved. */
716 #define IEEE80211_HTOP2_DUALBEACON 0x0040
717 #define IEEE80211_HTOP2_DUALCTSPROT 0x0080
718 #define IEEE80211_HTOP2_STBCBEACON 0x0100
719 #define IEEE80211_HTOP2_LSIGTXOP 0x0200
720 #define IEEE80211_HTOP2_PCOACTIVE 0x0400
721 #define IEEE80211_HTOP2_PCOPHASE40 0x0800
722 /* Bits 12-15 are reserved. */
723
724 /*
725 * VHT Capabilities Info (see 802.11ac-2013 8.4.2.160.2).
726 */
727 #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_MASK 0x00000003
728 #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_SHIFT 0
729 #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_3895 0
730 #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_7991 1
731 #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_11454 2
732 #define IEEE80211_VHTCAP_CHAN_WIDTH_MASK 0x0c
733 #define IEEE80211_VHTCAP_CHAN_WIDTH_SHIFT 2
734 #define IEEE80211_VHTCAP_CHAN_WIDTH_80 0
735 #define IEEE80211_VHTCAP_CHAN_WIDTH_160 1
736 #define IEEE80211_VHTCAP_CHAN_WIDTH_160_8080 2
737 #define IEEE80211_VHTCAP_RX_LDPC 0x00000010
738 #define IEEE80211_VHTCAP_SGI80 0x00000020
739 #define IEEE80211_VHTCAP_SGI160 0x00000040
740 #define IEEE80211_VHTCAP_TX_STBC 0x00000080
741 #define IEEE80211_VHTCAP_RX_STBC_SS_MASK 0x00000700
742 #define IEEE80211_VHTCAP_RX_STBC_SS_SHIFT 8
743 #define IEEE80211_VHTCAP_SU_BEAMFORMER 0x00000800
744 #define IEEE80211_VHTCAP_SU_BEAMFORMEE 0x00001000
745 #define IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK 0x0000e000
746 #define IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT 13
747 #define IEEE80211_VHTCAP_NUM_STS_MASK 0x00070000
748 #define IEEE80211_VHTCAP_NUM_STS_SHIFT 16
749 #define IEEE80211_VHTCAP_MU_BEAMFORMER 0x00080000
750 #define IEEE80211_VHTCAP_MU_BEAMFORMEE 0x00100000
751 #define IEEE80211_VHTCAP_TXOP_PS 0x00200000
752 #define IEEE80211_VHTCAP_HTC_VHT 0x00400000
753 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_MASK 0x03800000
754 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_SHIFT 23
755 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_8K 0
756 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_16K 1
757 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_32K 2
758 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_64K 3
759 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_128K 4
760 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_256K 5
761 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_512K 6
762 #define IEEE80211_VHTCAP_MAX_AMPDU_LEN_1024K 7
763 #define IEEE80211_VHTCAP_LINK_ADAPT_MASK 0x0c000000
764 #define IEEE80211_VHTCAP_LINK_ADAPT_SHIFT 26
765 #define IEEE80211_VHTCAP_LINK_ADAPT_UNSOL_MFB 2
766 #define IEEE80211_VHTCAP_LINK_ADAPT_MRQ_MFB 3
767 #define IEEE80211_VHTCAP_RX_ANT_PATTERN 0x10000000
768 #define IEEE80211_VHTCAP_TX_ANT_PATTERN 0x20000000
769
770 /*
771 * VHT-MCS and NSS map (see 802.11ac-2013 8.4.2.160.3, Figure 8-401bs).
772 * Set of VHT MCS supported for a given number of spatial streams, `n'.
773 * Used by the VHT capabilities IE and by the basic VHT MSC set in
774 * the VHT operation IE.
775 */
776 #define IEEE80211_VHT_MCS_FOR_SS_MASK(n) (0x3 << (2*((n)-1)))
777 #define IEEE80211_VHT_MCS_FOR_SS_SHIFT(n) (2*((n)-1))
778 #define IEEE80211_VHT_MCS_0_7 0
779 #define IEEE80211_VHT_MCS_0_8 1
780 #define IEEE80211_VHT_MCS_0_9 2
781 #define IEEE80211_VHT_MCS_SS_NOT_SUPP 3
782
783 #define IEEE80211_VHT_MAX_LGI_MBIT_S_MASK 0x1fff
784 #define IEEE80211_VHT_MAX_LGI_MBIT_S_SHIFT 0
785
786 /* The highest number of spatial streams supported by VHT. */
787 #define IEEE80211_VHT_NUM_SS 8
788
789 /*
790 * VHT Operation element (see 802.11ac-2013 8.4.2.161).
791 */
792 /* Byte 0. */
793 #define IEEE80211_VHTOP0_CHAN_WIDTH_MASK 0x03
794 #define IEEE80211_VHTOP0_CHAN_WIDTH_SHIFT 0
795 #define IEEE80211_VHTOP0_CHAN_WIDTH_HT 0
796 #define IEEE80211_VHTOP0_CHAN_WIDTH_80 1
797 #define IEEE80211_VHTOP0_CHAN_WIDTH_160 2
798 #define IEEE80211_VHTOP0_CHAN_WIDTH_8080 3
799 /* Byte 1 contains channel center frequency index 0 for 80, 80+80, 160 MHz. */
800 /* Byte 2 contains channel center frequency index 1 for 80+80 MHz only. */
801
802 /*
803 * EDCA Access Categories.
804 */
805 enum ieee80211_edca_ac {
806 EDCA_AC_BK = 1, /* Background */
807 EDCA_AC_BE = 0, /* Best Effort */
808 EDCA_AC_VI = 2, /* Video */
809 EDCA_AC_VO = 3 /* Voice */
810 };
811 #define EDCA_NUM_AC 4
812
813 /* number of TID values (traffic identifier) */
814 #define IEEE80211_NUM_TID 16
815
816 /* Atheros private advanced capabilities info */
817 #define ATHEROS_CAP_TURBO_PRIME 0x01
818 #define ATHEROS_CAP_COMPRESSION 0x02
819 #define ATHEROS_CAP_FAST_FRAME 0x04
820 /* bits 3-6 reserved */
821 #define ATHEROS_CAP_BOOST 0x80
822
823 /*-
824 * Organizationally Unique Identifiers.
825 * See http://standards.ieee.org/regauth/oui/oui.txt for a list.
826 */
827 #define ATHEROS_OUI ((const u_int8_t[]){ 0x00, 0x03, 0x7f })
828 #define BROADCOM_OUI ((const u_int8_t[]){ 0x00, 0x90, 0x4c })
829 #define IEEE80211_OUI ((const u_int8_t[]){ 0x00, 0x0f, 0xac })
830 #define MICROSOFT_OUI ((const u_int8_t[]){ 0x00, 0x50, 0xf2 })
831
832 #define IEEE80211_AUTH_ALGORITHM(auth) \
833 ((auth)[0] | ((auth)[1] << 8))
834 #define IEEE80211_AUTH_TRANSACTION(auth) \
835 ((auth)[2] | ((auth)[3] << 8))
836 #define IEEE80211_AUTH_STATUS(auth) \
837 ((auth)[4] | ((auth)[5] << 8))
838
839 /*
840 * Authentication Algorithm Number field (see 7.3.1.1).
841 */
842 #define IEEE80211_AUTH_ALG_OPEN 0x0000
843 #define IEEE80211_AUTH_ALG_SHARED 0x0001
844 #define IEEE80211_AUTH_ALG_LEAP 0x0080
845
846 /*
847 * Authentication Transaction Sequence Number field (see 7.3.1.2).
848 */
849 enum {
850 IEEE80211_AUTH_OPEN_REQUEST = 1,
851 IEEE80211_AUTH_OPEN_RESPONSE = 2
852 };
853 enum {
854 IEEE80211_AUTH_SHARED_REQUEST = 1,
855 IEEE80211_AUTH_SHARED_CHALLENGE = 2,
856 IEEE80211_AUTH_SHARED_RESPONSE = 3,
857 IEEE80211_AUTH_SHARED_PASS = 4
858 };
859
860 /*
861 * Reason codes (see Table 22).
862 */
863 enum {
864 IEEE80211_REASON_UNSPECIFIED = 1,
865 IEEE80211_REASON_AUTH_EXPIRE = 2,
866 IEEE80211_REASON_AUTH_LEAVE = 3,
867 IEEE80211_REASON_ASSOC_EXPIRE = 4,
868 IEEE80211_REASON_ASSOC_TOOMANY = 5,
869 IEEE80211_REASON_NOT_AUTHED = 6,
870 IEEE80211_REASON_NOT_ASSOCED = 7,
871 IEEE80211_REASON_ASSOC_LEAVE = 8,
872 IEEE80211_REASON_ASSOC_NOT_AUTHED = 9,
873
874 /* XXX the following two reason codes are not correct */
875 IEEE80211_REASON_RSN_REQUIRED = 11,
876 IEEE80211_REASON_RSN_INCONSISTENT = 12,
877
878 IEEE80211_REASON_IE_INVALID = 13,
879 IEEE80211_REASON_MIC_FAILURE = 14,
880 IEEE80211_REASON_4WAY_TIMEOUT = 15,
881 IEEE80211_REASON_GROUP_TIMEOUT = 16,
882 IEEE80211_REASON_RSN_DIFFERENT_IE = 17,
883 IEEE80211_REASON_BAD_GROUP_CIPHER = 18,
884 IEEE80211_REASON_BAD_PAIRWISE_CIPHER = 19,
885 IEEE80211_REASON_BAD_AKMP = 20,
886 IEEE80211_REASON_RSN_IE_VER_UNSUP = 21,
887 IEEE80211_REASON_RSN_IE_BAD_CAP = 22,
888
889 IEEE80211_REASON_CIPHER_REJ_POLICY = 24,
890
891 IEEE80211_REASON_SETUP_REQUIRED = 38,
892 IEEE80211_REASON_TIMEOUT = 39
893 };
894
895 /*
896 * Status codes (see Table 23).
897 */
898 enum {
899 IEEE80211_STATUS_SUCCESS = 0,
900 IEEE80211_STATUS_UNSPECIFIED = 1,
901 IEEE80211_STATUS_CAPINFO = 10,
902 IEEE80211_STATUS_NOT_ASSOCED = 11,
903 IEEE80211_STATUS_OTHER = 12,
904 IEEE80211_STATUS_ALG = 13,
905 IEEE80211_STATUS_SEQUENCE = 14,
906 IEEE80211_STATUS_CHALLENGE = 15,
907 IEEE80211_STATUS_TIMEOUT = 16,
908 IEEE80211_STATUS_TOOMANY = 17,
909 IEEE80211_STATUS_BASIC_RATE = 18,
910 IEEE80211_STATUS_SP_REQUIRED = 19,
911 IEEE80211_STATUS_PBCC_REQUIRED = 20,
912 IEEE80211_STATUS_CA_REQUIRED = 21,
913 IEEE80211_STATUS_TOO_MANY_STATIONS = 22,
914 IEEE80211_STATUS_RATES = 23,
915 IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25,
916 IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26,
917
918 IEEE80211_STATUS_TRY_AGAIN_LATER = 30,
919 IEEE80211_STATUS_MFP_POLICY = 31,
920
921 IEEE80211_STATUS_REFUSED = 37,
922 IEEE80211_STATUS_INVALID_PARAM = 38,
923
924 IEEE80211_STATUS_IE_INVALID = 40,
925 IEEE80211_STATUS_BAD_GROUP_CIPHER = 41,
926 IEEE80211_STATUS_BAD_PAIRWISE_CIPHER = 42,
927 IEEE80211_STATUS_BAD_AKMP = 43,
928 IEEE80211_STATUS_RSN_IE_VER_UNSUP = 44,
929
930 IEEE80211_STATUS_CIPHER_REJ_POLICY = 46
931 };
932
933 #define IEEE80211_WEP_KEYLEN 5 /* 40bit */
934 #define IEEE80211_WEP_NKID 4 /* number of key ids */
935 #define IEEE80211_CHALLENGE_LEN 128
936
937 /* WEP header constants */
938 #define IEEE80211_WEP_IVLEN 3 /* 24bit */
939 #define IEEE80211_WEP_KIDLEN 1 /* 1 octet */
940 #define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */
941 #define IEEE80211_CRC_LEN 4
942 #define IEEE80211_WEP_TOTLEN (IEEE80211_WEP_IVLEN + \
943 IEEE80211_WEP_KIDLEN + \
944 IEEE80211_WEP_CRCLEN)
945
946 /*
947 * 802.11i defines an extended IV for use with non-WEP ciphers.
948 * When the EXTIV bit is set in the key id byte an additional
949 * 4 bytes immediately follow the IV for TKIP. For CCMP the
950 * EXTIV bit is likewise set but the 8 bytes represent the
951 * CCMP header rather than IV+extended-IV.
952 */
953 #define IEEE80211_WEP_EXTIV 0x20
954 #define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */
955 #define IEEE80211_WEP_MICLEN 8 /* trailing MIC */
956
957 /*
958 * Maximum acceptable MTU is:
959 * IEEE80211_MAX_LEN - WEP overhead - CRC -
960 * QoS overhead - RSN/WPA overhead
961 * Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default
962 * mtu is Ethernet-compatible; it's set by ether_ifattach.
963 */
964 #define IEEE80211_MTU_MAX 2290
965 #define IEEE80211_MTU_MIN 32
966
967 #define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \
968 (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
969 #define IEEE80211_ACK_LEN \
970 (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
971 #define IEEE80211_MIN_LEN \
972 (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
973
974 /*
975 * The 802.11 spec says at most 2007 stations may be
976 * associated at once. For most AP's this is way more
977 * than is feasible so we use a default of 1800. This
978 * number may be overridden by the driver and/or by
979 * user configuration.
980 */
981 #define IEEE80211_AID_MAX 2007
982 #define IEEE80211_AID_DEF 1800
983 #define IEEE80211_AID(b) ((b) &~ 0xc000)
984
985 /*
986 * RTS frame length parameters. The default is specified in
987 * the 802.11 spec. The max may be wrong for jumbo frames.
988 */
989 #define IEEE80211_RTS_DEFAULT 512
990 #define IEEE80211_RTS_MIN 1
991 #define IEEE80211_RTS_MAX IEEE80211_MAX_LEN
992
993 #define IEEE80211_PLCP_SERVICE 0x00
994 #define IEEE80211_PLCP_SERVICE_PBCC 0x08 /* PBCC encoded */
995 #define IEEE80211_PLCP_SERVICE_LENEXT 0x80 /* length extension bit */
996
997 /* One Time Unit (TU) is 1Kus = 1024 microseconds. */
998 #define IEEE80211_DUR_TU 1024
999
1000 /* IEEE 802.11b durations for DSSS PHY in microseconds */
1001 #define IEEE80211_DUR_DS_LONG_PREAMBLE 144
1002 #define IEEE80211_DUR_DS_SHORT_PREAMBLE 72
1003 #define IEEE80211_DUR_DS_PREAMBLE_DIFFERENCE \
1004 (IEEE80211_DUR_DS_LONG_PREAMBLE - IEEE80211_DUR_DS_SHORT_PREAMBLE)
1005 #define IEEE80211_DUR_DS_FAST_PLCPHDR 24
1006 #define IEEE80211_DUR_DS_SLOW_PLCPHDR 48
1007 #define IEEE80211_DUR_DS_PLCPHDR_DIFFERENCE \
1008 (IEEE80211_DUR_DS_SLOW_PLCPHDR - IEEE80211_DUR_DS_FAST_PLCPHDR)
1009 #define IEEE80211_DUR_DS_SLOW_ACK 112
1010 #define IEEE80211_DUR_DS_FAST_ACK 56
1011 #define IEEE80211_DUR_DS_SLOW_CTS 112
1012 #define IEEE80211_DUR_DS_FAST_CTS 56
1013 #define IEEE80211_DUR_DS_SLOT 20
1014 #define IEEE80211_DUR_DS_SHSLOT 9
1015 #define IEEE80211_DUR_DS_SIFS 10
1016 #define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT)
1017 #define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \
1018 2 * IEEE80211_DUR_DS_SLOT)
1019 #define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \
1020 IEEE80211_DUR_DS_SLOW_ACK + \
1021 IEEE80211_DUR_DS_LONG_PREAMBLE + \
1022 IEEE80211_DUR_DS_SLOW_PLCPHDR + \
1023 IEEE80211_DUR_DIFS)
1024
1025 /*
1026 * The RSNA key descriptor used by IEEE 802.11 does not use the IEEE 802.1X
1027 * key descriptor. Instead, it uses the key descriptor described in 8.5.2.
1028 */
1029 #define EAPOL_KEY_NONCE_LEN 32
1030 #define EAPOL_KEY_IV_LEN 16
1031 #define EAPOL_KEY_MIC_LEN 16
1032
1033 struct ieee80211_eapol_key {
1034 u_int8_t version;
1035 #define EAPOL_VERSION 1
1036
1037 u_int8_t type;
1038 /* IEEE Std 802.1X-2004, 7.5.4 (only type EAPOL-Key is used here) */
1039 #define EAP_PACKET 0
1040 #define EAPOL_START 1
1041 #define EAPOL_LOGOFF 2
1042 #define EAPOL_KEY 3
1043 #define EAPOL_ASF_ALERT 4
1044
1045 u_int8_t len[2];
1046 u_int8_t desc;
1047 /* IEEE Std 802.1X-2004, 7.6.1 */
1048 #define EAPOL_KEY_DESC_RC4 1 /* deprecated */
1049 #define EAPOL_KEY_DESC_IEEE80211 2
1050 #define EAPOL_KEY_DESC_WPA 254 /* non-standard WPA */
1051
1052 u_int8_t info[2];
1053 #define EAPOL_KEY_VERSION_MASK 0x7
1054 #define EAPOL_KEY_DESC_V1 1
1055 #define EAPOL_KEY_DESC_V2 2
1056 #define EAPOL_KEY_DESC_V3 3 /* 11r */
1057 #define EAPOL_KEY_PAIRWISE (1 << 3)
1058 #define EAPOL_KEY_INSTALL (1 << 6) /* I */
1059 #define EAPOL_KEY_KEYACK (1 << 7) /* A */
1060 #define EAPOL_KEY_KEYMIC (1 << 8) /* M */
1061 #define EAPOL_KEY_SECURE (1 << 9) /* S */
1062 #define EAPOL_KEY_ERROR (1 << 10)
1063 #define EAPOL_KEY_REQUEST (1 << 11)
1064 #define EAPOL_KEY_ENCRYPTED (1 << 12)
1065 #define EAPOL_KEY_SMK (1 << 13)
1066 /* WPA compatibility */
1067 #define EAPOL_KEY_WPA_KID_MASK 0x3
1068 #define EAPOL_KEY_WPA_KID_SHIFT 4
1069 #define EAPOL_KEY_WPA_TX EAPOL_KEY_INSTALL
1070
1071 u_int8_t keylen[2];
1072 u_int8_t replaycnt[8];
1073 u_int8_t nonce[EAPOL_KEY_NONCE_LEN];
1074 u_int8_t iv[EAPOL_KEY_IV_LEN];
1075 u_int8_t rsc[8];
1076 u_int8_t reserved[8];
1077 u_int8_t mic[EAPOL_KEY_MIC_LEN];
1078 u_int8_t paylen[2];
1079 } __packed;
1080
1081 /* Pairwise Transient Key (see 8.5.1.2) */
1082 struct ieee80211_ptk {
1083 u_int8_t kck[16]; /* Key Confirmation Key */
1084 u_int8_t kek[16]; /* Key Encryption Key */
1085 u_int8_t tk[32]; /* Temporal Key */
1086 } __packed;
1087
1088 #define IEEE80211_PMKID_LEN 16
1089 #define IEEE80211_SMKID_LEN 16
1090
1091 /*
1092 * Key Data Encapsulation (see Table 62).
1093 */
1094 enum {
1095 IEEE80211_KDE_GTK = 1,
1096 IEEE80211_KDE_MACADDR = 3,
1097 IEEE80211_KDE_PMKID = 4,
1098 IEEE80211_KDE_SMK = 5,
1099 IEEE80211_KDE_NONCE = 6,
1100 IEEE80211_KDE_LIFETIME = 7,
1101 IEEE80211_KDE_ERROR = 8,
1102 IEEE80211_KDE_IGTK = 9 /* 11w */
1103 };
1104
1105 /*
1106 * HT protection modes (see 802.11-2012 8.4.2.59)
1107 */
1108 enum ieee80211_htprot {
1109 IEEE80211_HTPROT_NONE = 0, /* only 20/40MHz HT STAs exist */
1110 IEEE80211_HTPROT_NONMEMBER, /* non-HT STA overlaps our channel */
1111 IEEE80211_HTPROT_20MHZ, /* 20MHz HT STA on a 40MHz channel */
1112 IEEE80211_HTPROT_NONHT_MIXED /* non-HT STA associated to our BSS */
1113 };
1114
1115 #endif /* _NET80211_IEEE80211_H_ */
1116