xref: /linux-6.15/include/linux/ieee80211.h (revision b9ccfda2)
1 /*
2  * IEEE 802.11 defines
3  *
4  * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
5  * <[email protected]>
6  * Copyright (c) 2002-2003, Jouni Malinen <[email protected]>
7  * Copyright (c) 2005, Devicescape Software, Inc.
8  * Copyright (c) 2006, Michael Wu <[email protected]>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14 
15 #ifndef LINUX_IEEE80211_H
16 #define LINUX_IEEE80211_H
17 
18 #include <linux/types.h>
19 #include <asm/byteorder.h>
20 
21 /*
22  * DS bit usage
23  *
24  * TA = transmitter address
25  * RA = receiver address
26  * DA = destination address
27  * SA = source address
28  *
29  * ToDS    FromDS  A1(RA)  A2(TA)  A3      A4      Use
30  * -----------------------------------------------------------------
31  *  0       0       DA      SA      BSSID   -       IBSS/DLS
32  *  0       1       DA      BSSID   SA      -       AP -> STA
33  *  1       0       BSSID   SA      DA      -       AP <- STA
34  *  1       1       RA      TA      DA      SA      unspecified (WDS)
35  */
36 
37 #define FCS_LEN 4
38 
39 #define IEEE80211_FCTL_VERS		0x0003
40 #define IEEE80211_FCTL_FTYPE		0x000c
41 #define IEEE80211_FCTL_STYPE		0x00f0
42 #define IEEE80211_FCTL_TODS		0x0100
43 #define IEEE80211_FCTL_FROMDS		0x0200
44 #define IEEE80211_FCTL_MOREFRAGS	0x0400
45 #define IEEE80211_FCTL_RETRY		0x0800
46 #define IEEE80211_FCTL_PM		0x1000
47 #define IEEE80211_FCTL_MOREDATA		0x2000
48 #define IEEE80211_FCTL_PROTECTED	0x4000
49 #define IEEE80211_FCTL_ORDER		0x8000
50 #define IEEE80211_FCTL_CTL_EXT		0x0f00
51 
52 #define IEEE80211_SCTL_FRAG		0x000F
53 #define IEEE80211_SCTL_SEQ		0xFFF0
54 
55 #define IEEE80211_FTYPE_MGMT		0x0000
56 #define IEEE80211_FTYPE_CTL		0x0004
57 #define IEEE80211_FTYPE_DATA		0x0008
58 #define IEEE80211_FTYPE_EXT		0x000c
59 
60 /* management */
61 #define IEEE80211_STYPE_ASSOC_REQ	0x0000
62 #define IEEE80211_STYPE_ASSOC_RESP	0x0010
63 #define IEEE80211_STYPE_REASSOC_REQ	0x0020
64 #define IEEE80211_STYPE_REASSOC_RESP	0x0030
65 #define IEEE80211_STYPE_PROBE_REQ	0x0040
66 #define IEEE80211_STYPE_PROBE_RESP	0x0050
67 #define IEEE80211_STYPE_BEACON		0x0080
68 #define IEEE80211_STYPE_ATIM		0x0090
69 #define IEEE80211_STYPE_DISASSOC	0x00A0
70 #define IEEE80211_STYPE_AUTH		0x00B0
71 #define IEEE80211_STYPE_DEAUTH		0x00C0
72 #define IEEE80211_STYPE_ACTION		0x00D0
73 
74 /* control */
75 #define IEEE80211_STYPE_CTL_EXT		0x0060
76 #define IEEE80211_STYPE_BACK_REQ	0x0080
77 #define IEEE80211_STYPE_BACK		0x0090
78 #define IEEE80211_STYPE_PSPOLL		0x00A0
79 #define IEEE80211_STYPE_RTS		0x00B0
80 #define IEEE80211_STYPE_CTS		0x00C0
81 #define IEEE80211_STYPE_ACK		0x00D0
82 #define IEEE80211_STYPE_CFEND		0x00E0
83 #define IEEE80211_STYPE_CFENDACK	0x00F0
84 
85 /* data */
86 #define IEEE80211_STYPE_DATA			0x0000
87 #define IEEE80211_STYPE_DATA_CFACK		0x0010
88 #define IEEE80211_STYPE_DATA_CFPOLL		0x0020
89 #define IEEE80211_STYPE_DATA_CFACKPOLL		0x0030
90 #define IEEE80211_STYPE_NULLFUNC		0x0040
91 #define IEEE80211_STYPE_CFACK			0x0050
92 #define IEEE80211_STYPE_CFPOLL			0x0060
93 #define IEEE80211_STYPE_CFACKPOLL		0x0070
94 #define IEEE80211_STYPE_QOS_DATA		0x0080
95 #define IEEE80211_STYPE_QOS_DATA_CFACK		0x0090
96 #define IEEE80211_STYPE_QOS_DATA_CFPOLL		0x00A0
97 #define IEEE80211_STYPE_QOS_DATA_CFACKPOLL	0x00B0
98 #define IEEE80211_STYPE_QOS_NULLFUNC		0x00C0
99 #define IEEE80211_STYPE_QOS_CFACK		0x00D0
100 #define IEEE80211_STYPE_QOS_CFPOLL		0x00E0
101 #define IEEE80211_STYPE_QOS_CFACKPOLL		0x00F0
102 
103 /* extension, added by 802.11ad */
104 #define IEEE80211_STYPE_DMG_BEACON		0x0000
105 
106 /* control extension - for IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTL_EXT */
107 #define IEEE80211_CTL_EXT_POLL		0x2000
108 #define IEEE80211_CTL_EXT_SPR		0x3000
109 #define IEEE80211_CTL_EXT_GRANT	0x4000
110 #define IEEE80211_CTL_EXT_DMG_CTS	0x5000
111 #define IEEE80211_CTL_EXT_DMG_DTS	0x6000
112 #define IEEE80211_CTL_EXT_SSW		0x8000
113 #define IEEE80211_CTL_EXT_SSW_FBACK	0x9000
114 #define IEEE80211_CTL_EXT_SSW_ACK	0xa000
115 
116 /* miscellaneous IEEE 802.11 constants */
117 #define IEEE80211_MAX_FRAG_THRESHOLD	2352
118 #define IEEE80211_MAX_RTS_THRESHOLD	2353
119 #define IEEE80211_MAX_AID		2007
120 #define IEEE80211_MAX_TIM_LEN		251
121 /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
122    6.2.1.1.2.
123 
124    802.11e clarifies the figure in section 7.1.2. The frame body is
125    up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */
126 #define IEEE80211_MAX_DATA_LEN		2304
127 /* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */
128 #define IEEE80211_MAX_FRAME_LEN		2352
129 
130 #define IEEE80211_MAX_SSID_LEN		32
131 
132 #define IEEE80211_MAX_MESH_ID_LEN	32
133 
134 #define IEEE80211_QOS_CTL_LEN		2
135 /* 1d tag mask */
136 #define IEEE80211_QOS_CTL_TAG1D_MASK		0x0007
137 /* TID mask */
138 #define IEEE80211_QOS_CTL_TID_MASK		0x000f
139 /* EOSP */
140 #define IEEE80211_QOS_CTL_EOSP			0x0010
141 /* ACK policy */
142 #define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL	0x0000
143 #define IEEE80211_QOS_CTL_ACK_POLICY_NOACK	0x0020
144 #define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL	0x0040
145 #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK	0x0060
146 #define IEEE80211_QOS_CTL_ACK_POLICY_MASK	0x0060
147 /* A-MSDU 802.11n */
148 #define IEEE80211_QOS_CTL_A_MSDU_PRESENT	0x0080
149 /* Mesh Control 802.11s */
150 #define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT  0x0100
151 
152 /* U-APSD queue for WMM IEs sent by AP */
153 #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD	(1<<7)
154 #define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK	0x0f
155 
156 /* U-APSD queues for WMM IEs sent by STA */
157 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO	(1<<0)
158 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI	(1<<1)
159 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK	(1<<2)
160 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE	(1<<3)
161 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK	0x0f
162 
163 /* U-APSD max SP length for WMM IEs sent by STA */
164 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL	0x00
165 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_2	0x01
166 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_4	0x02
167 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_6	0x03
168 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK	0x03
169 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT	5
170 
171 #define IEEE80211_HT_CTL_LEN		4
172 
173 struct ieee80211_hdr {
174 	__le16 frame_control;
175 	__le16 duration_id;
176 	u8 addr1[6];
177 	u8 addr2[6];
178 	u8 addr3[6];
179 	__le16 seq_ctrl;
180 	u8 addr4[6];
181 } __attribute__ ((packed));
182 
183 struct ieee80211_hdr_3addr {
184 	__le16 frame_control;
185 	__le16 duration_id;
186 	u8 addr1[6];
187 	u8 addr2[6];
188 	u8 addr3[6];
189 	__le16 seq_ctrl;
190 } __attribute__ ((packed));
191 
192 struct ieee80211_qos_hdr {
193 	__le16 frame_control;
194 	__le16 duration_id;
195 	u8 addr1[6];
196 	u8 addr2[6];
197 	u8 addr3[6];
198 	__le16 seq_ctrl;
199 	__le16 qos_ctrl;
200 } __attribute__ ((packed));
201 
202 /**
203  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
204  * @fc: frame control bytes in little-endian byteorder
205  */
206 static inline int ieee80211_has_tods(__le16 fc)
207 {
208 	return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
209 }
210 
211 /**
212  * ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
213  * @fc: frame control bytes in little-endian byteorder
214  */
215 static inline int ieee80211_has_fromds(__le16 fc)
216 {
217 	return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
218 }
219 
220 /**
221  * ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and IEEE80211_FCTL_FROMDS are set
222  * @fc: frame control bytes in little-endian byteorder
223  */
224 static inline int ieee80211_has_a4(__le16 fc)
225 {
226 	__le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
227 	return (fc & tmp) == tmp;
228 }
229 
230 /**
231  * ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
232  * @fc: frame control bytes in little-endian byteorder
233  */
234 static inline int ieee80211_has_morefrags(__le16 fc)
235 {
236 	return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
237 }
238 
239 /**
240  * ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
241  * @fc: frame control bytes in little-endian byteorder
242  */
243 static inline int ieee80211_has_retry(__le16 fc)
244 {
245 	return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
246 }
247 
248 /**
249  * ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
250  * @fc: frame control bytes in little-endian byteorder
251  */
252 static inline int ieee80211_has_pm(__le16 fc)
253 {
254 	return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
255 }
256 
257 /**
258  * ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
259  * @fc: frame control bytes in little-endian byteorder
260  */
261 static inline int ieee80211_has_moredata(__le16 fc)
262 {
263 	return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
264 }
265 
266 /**
267  * ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
268  * @fc: frame control bytes in little-endian byteorder
269  */
270 static inline int ieee80211_has_protected(__le16 fc)
271 {
272 	return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
273 }
274 
275 /**
276  * ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
277  * @fc: frame control bytes in little-endian byteorder
278  */
279 static inline int ieee80211_has_order(__le16 fc)
280 {
281 	return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
282 }
283 
284 /**
285  * ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
286  * @fc: frame control bytes in little-endian byteorder
287  */
288 static inline int ieee80211_is_mgmt(__le16 fc)
289 {
290 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
291 	       cpu_to_le16(IEEE80211_FTYPE_MGMT);
292 }
293 
294 /**
295  * ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
296  * @fc: frame control bytes in little-endian byteorder
297  */
298 static inline int ieee80211_is_ctl(__le16 fc)
299 {
300 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
301 	       cpu_to_le16(IEEE80211_FTYPE_CTL);
302 }
303 
304 /**
305  * ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
306  * @fc: frame control bytes in little-endian byteorder
307  */
308 static inline int ieee80211_is_data(__le16 fc)
309 {
310 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
311 	       cpu_to_le16(IEEE80211_FTYPE_DATA);
312 }
313 
314 /**
315  * ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA and IEEE80211_STYPE_QOS_DATA is set
316  * @fc: frame control bytes in little-endian byteorder
317  */
318 static inline int ieee80211_is_data_qos(__le16 fc)
319 {
320 	/*
321 	 * mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
322 	 * to check the one bit
323 	 */
324 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
325 	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
326 }
327 
328 /**
329  * ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
330  * @fc: frame control bytes in little-endian byteorder
331  */
332 static inline int ieee80211_is_data_present(__le16 fc)
333 {
334 	/*
335 	 * mask with 0x40 and test that that bit is clear to only return true
336 	 * for the data-containing substypes.
337 	 */
338 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
339 	       cpu_to_le16(IEEE80211_FTYPE_DATA);
340 }
341 
342 /**
343  * ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_REQ
344  * @fc: frame control bytes in little-endian byteorder
345  */
346 static inline int ieee80211_is_assoc_req(__le16 fc)
347 {
348 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
349 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
350 }
351 
352 /**
353  * ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_RESP
354  * @fc: frame control bytes in little-endian byteorder
355  */
356 static inline int ieee80211_is_assoc_resp(__le16 fc)
357 {
358 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
359 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
360 }
361 
362 /**
363  * ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_REQ
364  * @fc: frame control bytes in little-endian byteorder
365  */
366 static inline int ieee80211_is_reassoc_req(__le16 fc)
367 {
368 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
369 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
370 }
371 
372 /**
373  * ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_RESP
374  * @fc: frame control bytes in little-endian byteorder
375  */
376 static inline int ieee80211_is_reassoc_resp(__le16 fc)
377 {
378 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
379 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
380 }
381 
382 /**
383  * ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_REQ
384  * @fc: frame control bytes in little-endian byteorder
385  */
386 static inline int ieee80211_is_probe_req(__le16 fc)
387 {
388 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
389 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
390 }
391 
392 /**
393  * ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_RESP
394  * @fc: frame control bytes in little-endian byteorder
395  */
396 static inline int ieee80211_is_probe_resp(__le16 fc)
397 {
398 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
399 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
400 }
401 
402 /**
403  * ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_BEACON
404  * @fc: frame control bytes in little-endian byteorder
405  */
406 static inline int ieee80211_is_beacon(__le16 fc)
407 {
408 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
409 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
410 }
411 
412 /**
413  * ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
414  * @fc: frame control bytes in little-endian byteorder
415  */
416 static inline int ieee80211_is_atim(__le16 fc)
417 {
418 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
419 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
420 }
421 
422 /**
423  * ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DISASSOC
424  * @fc: frame control bytes in little-endian byteorder
425  */
426 static inline int ieee80211_is_disassoc(__le16 fc)
427 {
428 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
429 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
430 }
431 
432 /**
433  * ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
434  * @fc: frame control bytes in little-endian byteorder
435  */
436 static inline int ieee80211_is_auth(__le16 fc)
437 {
438 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
439 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
440 }
441 
442 /**
443  * ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DEAUTH
444  * @fc: frame control bytes in little-endian byteorder
445  */
446 static inline int ieee80211_is_deauth(__le16 fc)
447 {
448 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
449 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
450 }
451 
452 /**
453  * ieee80211_is_action - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ACTION
454  * @fc: frame control bytes in little-endian byteorder
455  */
456 static inline int ieee80211_is_action(__le16 fc)
457 {
458 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
459 	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
460 }
461 
462 /**
463  * ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK_REQ
464  * @fc: frame control bytes in little-endian byteorder
465  */
466 static inline int ieee80211_is_back_req(__le16 fc)
467 {
468 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
469 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
470 }
471 
472 /**
473  * ieee80211_is_back - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK
474  * @fc: frame control bytes in little-endian byteorder
475  */
476 static inline int ieee80211_is_back(__le16 fc)
477 {
478 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
479 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
480 }
481 
482 /**
483  * ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_PSPOLL
484  * @fc: frame control bytes in little-endian byteorder
485  */
486 static inline int ieee80211_is_pspoll(__le16 fc)
487 {
488 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
489 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
490 }
491 
492 /**
493  * ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
494  * @fc: frame control bytes in little-endian byteorder
495  */
496 static inline int ieee80211_is_rts(__le16 fc)
497 {
498 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
499 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
500 }
501 
502 /**
503  * ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
504  * @fc: frame control bytes in little-endian byteorder
505  */
506 static inline int ieee80211_is_cts(__le16 fc)
507 {
508 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
509 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
510 }
511 
512 /**
513  * ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
514  * @fc: frame control bytes in little-endian byteorder
515  */
516 static inline int ieee80211_is_ack(__le16 fc)
517 {
518 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
519 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
520 }
521 
522 /**
523  * ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
524  * @fc: frame control bytes in little-endian byteorder
525  */
526 static inline int ieee80211_is_cfend(__le16 fc)
527 {
528 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
529 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
530 }
531 
532 /**
533  * ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFENDACK
534  * @fc: frame control bytes in little-endian byteorder
535  */
536 static inline int ieee80211_is_cfendack(__le16 fc)
537 {
538 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
539 	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
540 }
541 
542 /**
543  * ieee80211_is_nullfunc - check if frame is a regular (non-QoS) nullfunc frame
544  * @fc: frame control bytes in little-endian byteorder
545  */
546 static inline int ieee80211_is_nullfunc(__le16 fc)
547 {
548 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
549 	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
550 }
551 
552 /**
553  * ieee80211_is_qos_nullfunc - check if frame is a QoS nullfunc frame
554  * @fc: frame control bytes in little-endian byteorder
555  */
556 static inline int ieee80211_is_qos_nullfunc(__le16 fc)
557 {
558 	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
559 	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
560 }
561 
562 /**
563  * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
564  * @seq_ctrl: frame sequence control bytes in little-endian byteorder
565  */
566 static inline int ieee80211_is_first_frag(__le16 seq_ctrl)
567 {
568 	return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0;
569 }
570 
571 struct ieee80211s_hdr {
572 	u8 flags;
573 	u8 ttl;
574 	__le32 seqnum;
575 	u8 eaddr1[6];
576 	u8 eaddr2[6];
577 } __attribute__ ((packed));
578 
579 /* Mesh flags */
580 #define MESH_FLAGS_AE_A4 	0x1
581 #define MESH_FLAGS_AE_A5_A6	0x2
582 #define MESH_FLAGS_AE		0x3
583 #define MESH_FLAGS_PS_DEEP	0x4
584 
585 /**
586  * enum ieee80211_preq_flags - mesh PREQ element flags
587  *
588  * @IEEE80211_PREQ_PROACTIVE_PREP_FLAG: proactive PREP subfield
589  */
590 enum ieee80211_preq_flags {
591 	IEEE80211_PREQ_PROACTIVE_PREP_FLAG	= 1<<2,
592 };
593 
594 /**
595  * enum ieee80211_preq_target_flags - mesh PREQ element per target flags
596  *
597  * @IEEE80211_PREQ_TO_FLAG: target only subfield
598  * @IEEE80211_PREQ_USN_FLAG: unknown target HWMP sequence number subfield
599  */
600 enum ieee80211_preq_target_flags {
601 	IEEE80211_PREQ_TO_FLAG	= 1<<0,
602 	IEEE80211_PREQ_USN_FLAG	= 1<<2,
603 };
604 
605 /**
606  * struct ieee80211_quiet_ie
607  *
608  * This structure refers to "Quiet information element"
609  */
610 struct ieee80211_quiet_ie {
611 	u8 count;
612 	u8 period;
613 	__le16 duration;
614 	__le16 offset;
615 } __attribute__ ((packed));
616 
617 /**
618  * struct ieee80211_msrment_ie
619  *
620  * This structure refers to "Measurement Request/Report information element"
621  */
622 struct ieee80211_msrment_ie {
623 	u8 token;
624 	u8 mode;
625 	u8 type;
626 	u8 request[0];
627 } __attribute__ ((packed));
628 
629 /**
630  * struct ieee80211_channel_sw_ie
631  *
632  * This structure refers to "Channel Switch Announcement information element"
633  */
634 struct ieee80211_channel_sw_ie {
635 	u8 mode;
636 	u8 new_ch_num;
637 	u8 count;
638 } __attribute__ ((packed));
639 
640 /**
641  * struct ieee80211_tim
642  *
643  * This structure refers to "Traffic Indication Map information element"
644  */
645 struct ieee80211_tim_ie {
646 	u8 dtim_count;
647 	u8 dtim_period;
648 	u8 bitmap_ctrl;
649 	/* variable size: 1 - 251 bytes */
650 	u8 virtual_map[1];
651 } __attribute__ ((packed));
652 
653 /**
654  * struct ieee80211_meshconf_ie
655  *
656  * This structure refers to "Mesh Configuration information element"
657  */
658 struct ieee80211_meshconf_ie {
659 	u8 meshconf_psel;
660 	u8 meshconf_pmetric;
661 	u8 meshconf_congest;
662 	u8 meshconf_synch;
663 	u8 meshconf_auth;
664 	u8 meshconf_form;
665 	u8 meshconf_cap;
666 } __attribute__ ((packed));
667 
668 /**
669  * struct ieee80211_rann_ie
670  *
671  * This structure refers to "Root Announcement information element"
672  */
673 struct ieee80211_rann_ie {
674 	u8 rann_flags;
675 	u8 rann_hopcount;
676 	u8 rann_ttl;
677 	u8 rann_addr[6];
678 	__le32 rann_seq;
679 	__le32 rann_interval;
680 	__le32 rann_metric;
681 } __attribute__ ((packed));
682 
683 enum ieee80211_rann_flags {
684 	RANN_FLAG_IS_GATE = 1 << 0,
685 };
686 
687 #define WLAN_SA_QUERY_TR_ID_LEN 2
688 
689 struct ieee80211_mgmt {
690 	__le16 frame_control;
691 	__le16 duration;
692 	u8 da[6];
693 	u8 sa[6];
694 	u8 bssid[6];
695 	__le16 seq_ctrl;
696 	union {
697 		struct {
698 			__le16 auth_alg;
699 			__le16 auth_transaction;
700 			__le16 status_code;
701 			/* possibly followed by Challenge text */
702 			u8 variable[0];
703 		} __attribute__ ((packed)) auth;
704 		struct {
705 			__le16 reason_code;
706 		} __attribute__ ((packed)) deauth;
707 		struct {
708 			__le16 capab_info;
709 			__le16 listen_interval;
710 			/* followed by SSID and Supported rates */
711 			u8 variable[0];
712 		} __attribute__ ((packed)) assoc_req;
713 		struct {
714 			__le16 capab_info;
715 			__le16 status_code;
716 			__le16 aid;
717 			/* followed by Supported rates */
718 			u8 variable[0];
719 		} __attribute__ ((packed)) assoc_resp, reassoc_resp;
720 		struct {
721 			__le16 capab_info;
722 			__le16 listen_interval;
723 			u8 current_ap[6];
724 			/* followed by SSID and Supported rates */
725 			u8 variable[0];
726 		} __attribute__ ((packed)) reassoc_req;
727 		struct {
728 			__le16 reason_code;
729 		} __attribute__ ((packed)) disassoc;
730 		struct {
731 			__le64 timestamp;
732 			__le16 beacon_int;
733 			__le16 capab_info;
734 			/* followed by some of SSID, Supported rates,
735 			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
736 			u8 variable[0];
737 		} __attribute__ ((packed)) beacon;
738 		struct {
739 			/* only variable items: SSID, Supported rates */
740 			u8 variable[0];
741 		} __attribute__ ((packed)) probe_req;
742 		struct {
743 			__le64 timestamp;
744 			__le16 beacon_int;
745 			__le16 capab_info;
746 			/* followed by some of SSID, Supported rates,
747 			 * FH Params, DS Params, CF Params, IBSS Params */
748 			u8 variable[0];
749 		} __attribute__ ((packed)) probe_resp;
750 		struct {
751 			u8 category;
752 			union {
753 				struct {
754 					u8 action_code;
755 					u8 dialog_token;
756 					u8 status_code;
757 					u8 variable[0];
758 				} __attribute__ ((packed)) wme_action;
759 				struct{
760 					u8 action_code;
761 					u8 element_id;
762 					u8 length;
763 					struct ieee80211_channel_sw_ie sw_elem;
764 				} __attribute__((packed)) chan_switch;
765 				struct{
766 					u8 action_code;
767 					u8 dialog_token;
768 					u8 element_id;
769 					u8 length;
770 					struct ieee80211_msrment_ie msr_elem;
771 				} __attribute__((packed)) measurement;
772 				struct{
773 					u8 action_code;
774 					u8 dialog_token;
775 					__le16 capab;
776 					__le16 timeout;
777 					__le16 start_seq_num;
778 				} __attribute__((packed)) addba_req;
779 				struct{
780 					u8 action_code;
781 					u8 dialog_token;
782 					__le16 status;
783 					__le16 capab;
784 					__le16 timeout;
785 				} __attribute__((packed)) addba_resp;
786 				struct{
787 					u8 action_code;
788 					__le16 params;
789 					__le16 reason_code;
790 				} __attribute__((packed)) delba;
791 				struct {
792 					u8 action_code;
793 					u8 variable[0];
794 				} __attribute__((packed)) self_prot;
795 				struct{
796 					u8 action_code;
797 					u8 variable[0];
798 				} __attribute__((packed)) mesh_action;
799 				struct {
800 					u8 action;
801 					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
802 				} __attribute__ ((packed)) sa_query;
803 				struct {
804 					u8 action;
805 					u8 smps_control;
806 				} __attribute__ ((packed)) ht_smps;
807 				struct {
808 					u8 action_code;
809 					u8 dialog_token;
810 					__le16 capability;
811 					u8 variable[0];
812 				} __packed tdls_discover_resp;
813 			} u;
814 		} __attribute__ ((packed)) action;
815 	} u;
816 } __attribute__ ((packed));
817 
818 /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
819 #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
820 
821 /* mgmt header + 1 byte category code */
822 #define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
823 
824 
825 /* Management MIC information element (IEEE 802.11w) */
826 struct ieee80211_mmie {
827 	u8 element_id;
828 	u8 length;
829 	__le16 key_id;
830 	u8 sequence_number[6];
831 	u8 mic[8];
832 } __attribute__ ((packed));
833 
834 struct ieee80211_vendor_ie {
835 	u8 element_id;
836 	u8 len;
837 	u8 oui[3];
838 	u8 oui_type;
839 } __packed;
840 
841 /* Control frames */
842 struct ieee80211_rts {
843 	__le16 frame_control;
844 	__le16 duration;
845 	u8 ra[6];
846 	u8 ta[6];
847 } __attribute__ ((packed));
848 
849 struct ieee80211_cts {
850 	__le16 frame_control;
851 	__le16 duration;
852 	u8 ra[6];
853 } __attribute__ ((packed));
854 
855 struct ieee80211_pspoll {
856 	__le16 frame_control;
857 	__le16 aid;
858 	u8 bssid[6];
859 	u8 ta[6];
860 } __attribute__ ((packed));
861 
862 /* TDLS */
863 
864 /* Link-id information element */
865 struct ieee80211_tdls_lnkie {
866 	u8 ie_type; /* Link Identifier IE */
867 	u8 ie_len;
868 	u8 bssid[6];
869 	u8 init_sta[6];
870 	u8 resp_sta[6];
871 } __packed;
872 
873 struct ieee80211_tdls_data {
874 	u8 da[6];
875 	u8 sa[6];
876 	__be16 ether_type;
877 	u8 payload_type;
878 	u8 category;
879 	u8 action_code;
880 	union {
881 		struct {
882 			u8 dialog_token;
883 			__le16 capability;
884 			u8 variable[0];
885 		} __packed setup_req;
886 		struct {
887 			__le16 status_code;
888 			u8 dialog_token;
889 			__le16 capability;
890 			u8 variable[0];
891 		} __packed setup_resp;
892 		struct {
893 			__le16 status_code;
894 			u8 dialog_token;
895 			u8 variable[0];
896 		} __packed setup_cfm;
897 		struct {
898 			__le16 reason_code;
899 			u8 variable[0];
900 		} __packed teardown;
901 		struct {
902 			u8 dialog_token;
903 			u8 variable[0];
904 		} __packed discover_req;
905 	} u;
906 } __packed;
907 
908 /**
909  * struct ieee80211_bar - HT Block Ack Request
910  *
911  * This structure refers to "HT BlockAckReq" as
912  * described in 802.11n draft section 7.2.1.7.1
913  */
914 struct ieee80211_bar {
915 	__le16 frame_control;
916 	__le16 duration;
917 	__u8 ra[6];
918 	__u8 ta[6];
919 	__le16 control;
920 	__le16 start_seq_num;
921 } __attribute__((packed));
922 
923 /* 802.11 BAR control masks */
924 #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL	0x0000
925 #define IEEE80211_BAR_CTRL_MULTI_TID		0x0002
926 #define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA	0x0004
927 #define IEEE80211_BAR_CTRL_TID_INFO_MASK	0xf000
928 #define IEEE80211_BAR_CTRL_TID_INFO_SHIFT	12
929 
930 #define IEEE80211_HT_MCS_MASK_LEN		10
931 
932 /**
933  * struct ieee80211_mcs_info - MCS information
934  * @rx_mask: RX mask
935  * @rx_highest: highest supported RX rate. If set represents
936  *	the highest supported RX data rate in units of 1 Mbps.
937  *	If this field is 0 this value should not be used to
938  *	consider the highest RX data rate supported.
939  * @tx_params: TX parameters
940  */
941 struct ieee80211_mcs_info {
942 	u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN];
943 	__le16 rx_highest;
944 	u8 tx_params;
945 	u8 reserved[3];
946 } __attribute__((packed));
947 
948 /* 802.11n HT capability MSC set */
949 #define IEEE80211_HT_MCS_RX_HIGHEST_MASK	0x3ff
950 #define IEEE80211_HT_MCS_TX_DEFINED		0x01
951 #define IEEE80211_HT_MCS_TX_RX_DIFF		0x02
952 /* value 0 == 1 stream etc */
953 #define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK	0x0C
954 #define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT	2
955 #define		IEEE80211_HT_MCS_TX_MAX_STREAMS	4
956 #define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION	0x10
957 
958 /*
959  * 802.11n D5.0 20.3.5 / 20.6 says:
960  * - indices 0 to 7 and 32 are single spatial stream
961  * - 8 to 31 are multiple spatial streams using equal modulation
962  *   [8..15 for two streams, 16..23 for three and 24..31 for four]
963  * - remainder are multiple spatial streams using unequal modulation
964  */
965 #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START 33
966 #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START_BYTE \
967 	(IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8)
968 
969 /**
970  * struct ieee80211_ht_cap - HT capabilities
971  *
972  * This structure is the "HT capabilities element" as
973  * described in 802.11n D5.0 7.3.2.57
974  */
975 struct ieee80211_ht_cap {
976 	__le16 cap_info;
977 	u8 ampdu_params_info;
978 
979 	/* 16 bytes MCS information */
980 	struct ieee80211_mcs_info mcs;
981 
982 	__le16 extended_ht_cap_info;
983 	__le32 tx_BF_cap_info;
984 	u8 antenna_selection_info;
985 } __attribute__ ((packed));
986 
987 /* 802.11n HT capabilities masks (for cap_info) */
988 #define IEEE80211_HT_CAP_LDPC_CODING		0x0001
989 #define IEEE80211_HT_CAP_SUP_WIDTH_20_40	0x0002
990 #define IEEE80211_HT_CAP_SM_PS			0x000C
991 #define		IEEE80211_HT_CAP_SM_PS_SHIFT	2
992 #define IEEE80211_HT_CAP_GRN_FLD		0x0010
993 #define IEEE80211_HT_CAP_SGI_20			0x0020
994 #define IEEE80211_HT_CAP_SGI_40			0x0040
995 #define IEEE80211_HT_CAP_TX_STBC		0x0080
996 #define IEEE80211_HT_CAP_RX_STBC		0x0300
997 #define		IEEE80211_HT_CAP_RX_STBC_SHIFT	8
998 #define IEEE80211_HT_CAP_DELAY_BA		0x0400
999 #define IEEE80211_HT_CAP_MAX_AMSDU		0x0800
1000 #define IEEE80211_HT_CAP_DSSSCCK40		0x1000
1001 #define IEEE80211_HT_CAP_RESERVED		0x2000
1002 #define IEEE80211_HT_CAP_40MHZ_INTOLERANT	0x4000
1003 #define IEEE80211_HT_CAP_LSIG_TXOP_PROT		0x8000
1004 
1005 /* 802.11n HT extended capabilities masks (for extended_ht_cap_info) */
1006 #define IEEE80211_HT_EXT_CAP_PCO		0x0001
1007 #define IEEE80211_HT_EXT_CAP_PCO_TIME		0x0006
1008 #define		IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT	1
1009 #define IEEE80211_HT_EXT_CAP_MCS_FB		0x0300
1010 #define		IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT	8
1011 #define IEEE80211_HT_EXT_CAP_HTC_SUP		0x0400
1012 #define IEEE80211_HT_EXT_CAP_RD_RESPONDER	0x0800
1013 
1014 /* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
1015 #define IEEE80211_HT_AMPDU_PARM_FACTOR		0x03
1016 #define IEEE80211_HT_AMPDU_PARM_DENSITY		0x1C
1017 #define		IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT	2
1018 
1019 /*
1020  * Maximum length of AMPDU that the STA can receive.
1021  * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
1022  */
1023 enum ieee80211_max_ampdu_length_exp {
1024 	IEEE80211_HT_MAX_AMPDU_8K = 0,
1025 	IEEE80211_HT_MAX_AMPDU_16K = 1,
1026 	IEEE80211_HT_MAX_AMPDU_32K = 2,
1027 	IEEE80211_HT_MAX_AMPDU_64K = 3
1028 };
1029 
1030 #define IEEE80211_HT_MAX_AMPDU_FACTOR 13
1031 
1032 /* Minimum MPDU start spacing */
1033 enum ieee80211_min_mpdu_spacing {
1034 	IEEE80211_HT_MPDU_DENSITY_NONE = 0,	/* No restriction */
1035 	IEEE80211_HT_MPDU_DENSITY_0_25 = 1,	/* 1/4 usec */
1036 	IEEE80211_HT_MPDU_DENSITY_0_5 = 2,	/* 1/2 usec */
1037 	IEEE80211_HT_MPDU_DENSITY_1 = 3,	/* 1 usec */
1038 	IEEE80211_HT_MPDU_DENSITY_2 = 4,	/* 2 usec */
1039 	IEEE80211_HT_MPDU_DENSITY_4 = 5,	/* 4 usec */
1040 	IEEE80211_HT_MPDU_DENSITY_8 = 6,	/* 8 usec */
1041 	IEEE80211_HT_MPDU_DENSITY_16 = 7	/* 16 usec */
1042 };
1043 
1044 /**
1045  * struct ieee80211_ht_operation - HT operation IE
1046  *
1047  * This structure is the "HT operation element" as
1048  * described in 802.11n-2009 7.3.2.57
1049  */
1050 struct ieee80211_ht_operation {
1051 	u8 primary_chan;
1052 	u8 ht_param;
1053 	__le16 operation_mode;
1054 	__le16 stbc_param;
1055 	u8 basic_set[16];
1056 } __attribute__ ((packed));
1057 
1058 /* for ht_param */
1059 #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET		0x03
1060 #define		IEEE80211_HT_PARAM_CHA_SEC_NONE		0x00
1061 #define		IEEE80211_HT_PARAM_CHA_SEC_ABOVE	0x01
1062 #define		IEEE80211_HT_PARAM_CHA_SEC_BELOW	0x03
1063 #define IEEE80211_HT_PARAM_CHAN_WIDTH_ANY		0x04
1064 #define IEEE80211_HT_PARAM_RIFS_MODE			0x08
1065 
1066 /* for operation_mode */
1067 #define IEEE80211_HT_OP_MODE_PROTECTION			0x0003
1068 #define		IEEE80211_HT_OP_MODE_PROTECTION_NONE		0
1069 #define		IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER	1
1070 #define		IEEE80211_HT_OP_MODE_PROTECTION_20MHZ		2
1071 #define		IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED	3
1072 #define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT		0x0004
1073 #define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT		0x0010
1074 
1075 /* for stbc_param */
1076 #define IEEE80211_HT_STBC_PARAM_DUAL_BEACON		0x0040
1077 #define IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT		0x0080
1078 #define IEEE80211_HT_STBC_PARAM_STBC_BEACON		0x0100
1079 #define IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT	0x0200
1080 #define IEEE80211_HT_STBC_PARAM_PCO_ACTIVE		0x0400
1081 #define IEEE80211_HT_STBC_PARAM_PCO_PHASE		0x0800
1082 
1083 
1084 /* block-ack parameters */
1085 #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
1086 #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
1087 #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
1088 #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
1089 #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
1090 
1091 /*
1092  * A-PMDU buffer sizes
1093  * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
1094  */
1095 #define IEEE80211_MIN_AMPDU_BUF 0x8
1096 #define IEEE80211_MAX_AMPDU_BUF 0x40
1097 
1098 
1099 /* Spatial Multiplexing Power Save Modes (for capability) */
1100 #define WLAN_HT_CAP_SM_PS_STATIC	0
1101 #define WLAN_HT_CAP_SM_PS_DYNAMIC	1
1102 #define WLAN_HT_CAP_SM_PS_INVALID	2
1103 #define WLAN_HT_CAP_SM_PS_DISABLED	3
1104 
1105 /* for SM power control field lower two bits */
1106 #define WLAN_HT_SMPS_CONTROL_DISABLED	0
1107 #define WLAN_HT_SMPS_CONTROL_STATIC	1
1108 #define WLAN_HT_SMPS_CONTROL_DYNAMIC	3
1109 
1110 #define VHT_MCS_SUPPORTED_SET_SIZE      8
1111 
1112 struct ieee80211_vht_capabilities {
1113 	__le32 vht_capabilities_info;
1114 	u8 vht_supported_mcs_set[VHT_MCS_SUPPORTED_SET_SIZE];
1115 } __packed;
1116 
1117 struct ieee80211_vht_operation {
1118 	u8 vht_op_info_chwidth;
1119 	u8 vht_op_info_chan_center_freq_seg1_idx;
1120 	u8 vht_op_info_chan_center_freq_seg2_idx;
1121 	__le16 vht_basic_mcs_set;
1122 } __packed;
1123 
1124 /**
1125  * struct ieee80211_vht_mcs_info - VHT MCS information
1126  * @rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams
1127  * @rx_highest: Indicates highest long GI VHT PPDU data rate
1128  *	STA can receive. Rate expressed in units of 1 Mbps.
1129  *	If this field is 0 this value should not be used to
1130  *	consider the highest RX data rate supported.
1131  * @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams
1132  * @tx_highest: Indicates highest long GI VHT PPDU data rate
1133  *	STA can transmit. Rate expressed in units of 1 Mbps.
1134  *	If this field is 0 this value should not be used to
1135  *	consider the highest TX data rate supported.
1136  */
1137 struct ieee80211_vht_mcs_info {
1138 	__le16 rx_mcs_map;
1139 	__le16 rx_highest;
1140 	__le16 tx_mcs_map;
1141 	__le16 tx_highest;
1142 } __packed;
1143 
1144 #define IEEE80211_VHT_MCS_ZERO_TO_SEVEN_SUPPORT 0
1145 #define IEEE80211_VHT_MCS_ZERO_TO_EIGHT_SUPPORT 1
1146 #define IEEE80211_VHT_MCS_ZERO_TO_NINE_SUPPORT  2
1147 #define IEEE80211_VHT_MCS_NOT_SUPPORTED 3
1148 
1149 /* 802.11ac VHT Capabilities */
1150 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895                0x00000000
1151 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991                0x00000001
1152 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454               0x00000002
1153 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ              0x00000004
1154 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ     0x00000008
1155 #define IEEE80211_VHT_CAP_RXLDPC                              0x00000010
1156 #define IEEE80211_VHT_CAP_SHORT_GI_80                         0x00000020
1157 #define IEEE80211_VHT_CAP_SHORT_GI_160                        0x00000040
1158 #define IEEE80211_VHT_CAP_TXSTBC                              0x00000080
1159 #define IEEE80211_VHT_CAP_RXSTBC_1                            0x00000100
1160 #define IEEE80211_VHT_CAP_RXSTBC_2                            0x00000200
1161 #define IEEE80211_VHT_CAP_RXSTBC_3                            0x00000300
1162 #define IEEE80211_VHT_CAP_RXSTBC_4                            0x00000400
1163 #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE               0x00000800
1164 #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE               0x00001000
1165 #define IEEE80211_VHT_CAP_BEAMFORMER_ANTENNAS_MAX             0x00006000
1166 #define IEEE80211_VHT_CAP_SOUNDING_DIMENTION_MAX              0x00030000
1167 #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE               0x00080000
1168 #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE               0x00100000
1169 #define IEEE80211_VHT_CAP_VHT_TXOP_PS                         0x00200000
1170 #define IEEE80211_VHT_CAP_HTC_VHT                             0x00400000
1171 #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT          0x00800000
1172 #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB   0x08000000
1173 #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB     0x0c000000
1174 #define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN                  0x10000000
1175 #define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN                  0x20000000
1176 
1177 /* Authentication algorithms */
1178 #define WLAN_AUTH_OPEN 0
1179 #define WLAN_AUTH_SHARED_KEY 1
1180 #define WLAN_AUTH_FT 2
1181 #define WLAN_AUTH_SAE 3
1182 #define WLAN_AUTH_LEAP 128
1183 
1184 #define WLAN_AUTH_CHALLENGE_LEN 128
1185 
1186 #define WLAN_CAPABILITY_ESS		(1<<0)
1187 #define WLAN_CAPABILITY_IBSS		(1<<1)
1188 
1189 /*
1190  * A mesh STA sets the ESS and IBSS capability bits to zero.
1191  * however, this holds true for p2p probe responses (in the p2p_find
1192  * phase) as well.
1193  */
1194 #define WLAN_CAPABILITY_IS_STA_BSS(cap)	\
1195 	(!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
1196 
1197 #define WLAN_CAPABILITY_CF_POLLABLE	(1<<2)
1198 #define WLAN_CAPABILITY_CF_POLL_REQUEST	(1<<3)
1199 #define WLAN_CAPABILITY_PRIVACY		(1<<4)
1200 #define WLAN_CAPABILITY_SHORT_PREAMBLE	(1<<5)
1201 #define WLAN_CAPABILITY_PBCC		(1<<6)
1202 #define WLAN_CAPABILITY_CHANNEL_AGILITY	(1<<7)
1203 
1204 /* 802.11h */
1205 #define WLAN_CAPABILITY_SPECTRUM_MGMT	(1<<8)
1206 #define WLAN_CAPABILITY_QOS		(1<<9)
1207 #define WLAN_CAPABILITY_SHORT_SLOT_TIME	(1<<10)
1208 #define WLAN_CAPABILITY_DSSS_OFDM	(1<<13)
1209 
1210 /* DMG (60gHz) 802.11ad */
1211 /* type - bits 0..1 */
1212 #define WLAN_CAPABILITY_DMG_TYPE_IBSS		(1<<0) /* Tx by: STA */
1213 #define WLAN_CAPABILITY_DMG_TYPE_PBSS		(2<<0) /* Tx by: PCP */
1214 #define WLAN_CAPABILITY_DMG_TYPE_AP		(3<<0) /* Tx by: AP */
1215 
1216 #define WLAN_CAPABILITY_DMG_CBAP_ONLY		(1<<2)
1217 #define WLAN_CAPABILITY_DMG_CBAP_SOURCE	(1<<3)
1218 #define WLAN_CAPABILITY_DMG_PRIVACY		(1<<4)
1219 #define WLAN_CAPABILITY_DMG_ECPAC		(1<<5)
1220 
1221 #define WLAN_CAPABILITY_DMG_SPECTRUM_MGMT	(1<<8)
1222 #define WLAN_CAPABILITY_DMG_RADIO_MEASURE	(1<<12)
1223 
1224 /* measurement */
1225 #define IEEE80211_SPCT_MSR_RPRT_MODE_LATE	(1<<0)
1226 #define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE	(1<<1)
1227 #define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED	(1<<2)
1228 
1229 #define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC	0
1230 #define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA	1
1231 #define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI	2
1232 
1233 /* 802.11g ERP information element */
1234 #define WLAN_ERP_NON_ERP_PRESENT (1<<0)
1235 #define WLAN_ERP_USE_PROTECTION (1<<1)
1236 #define WLAN_ERP_BARKER_PREAMBLE (1<<2)
1237 
1238 /* WLAN_ERP_BARKER_PREAMBLE values */
1239 enum {
1240 	WLAN_ERP_PREAMBLE_SHORT = 0,
1241 	WLAN_ERP_PREAMBLE_LONG = 1,
1242 };
1243 
1244 /* Band ID, 802.11ad #8.4.1.45 */
1245 enum {
1246 	IEEE80211_BANDID_TV_WS = 0, /* TV white spaces */
1247 	IEEE80211_BANDID_SUB1  = 1, /* Sub-1 GHz (excluding TV white spaces) */
1248 	IEEE80211_BANDID_2G    = 2, /* 2.4 GHz */
1249 	IEEE80211_BANDID_3G    = 3, /* 3.6 GHz */
1250 	IEEE80211_BANDID_5G    = 4, /* 4.9 and 5 GHz */
1251 	IEEE80211_BANDID_60G   = 5, /* 60 GHz */
1252 };
1253 
1254 /* Status codes */
1255 enum ieee80211_statuscode {
1256 	WLAN_STATUS_SUCCESS = 0,
1257 	WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
1258 	WLAN_STATUS_CAPS_UNSUPPORTED = 10,
1259 	WLAN_STATUS_REASSOC_NO_ASSOC = 11,
1260 	WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
1261 	WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
1262 	WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
1263 	WLAN_STATUS_CHALLENGE_FAIL = 15,
1264 	WLAN_STATUS_AUTH_TIMEOUT = 16,
1265 	WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
1266 	WLAN_STATUS_ASSOC_DENIED_RATES = 18,
1267 	/* 802.11b */
1268 	WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
1269 	WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
1270 	WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
1271 	/* 802.11h */
1272 	WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
1273 	WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
1274 	WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
1275 	/* 802.11g */
1276 	WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
1277 	WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
1278 	/* 802.11w */
1279 	WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY = 30,
1280 	WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31,
1281 	/* 802.11i */
1282 	WLAN_STATUS_INVALID_IE = 40,
1283 	WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
1284 	WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
1285 	WLAN_STATUS_INVALID_AKMP = 43,
1286 	WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
1287 	WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
1288 	WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
1289 	/* 802.11e */
1290 	WLAN_STATUS_UNSPECIFIED_QOS = 32,
1291 	WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
1292 	WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
1293 	WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
1294 	WLAN_STATUS_REQUEST_DECLINED = 37,
1295 	WLAN_STATUS_INVALID_QOS_PARAM = 38,
1296 	WLAN_STATUS_CHANGE_TSPEC = 39,
1297 	WLAN_STATUS_WAIT_TS_DELAY = 47,
1298 	WLAN_STATUS_NO_DIRECT_LINK = 48,
1299 	WLAN_STATUS_STA_NOT_PRESENT = 49,
1300 	WLAN_STATUS_STA_NOT_QSTA = 50,
1301 	/* 802.11s */
1302 	WLAN_STATUS_ANTI_CLOG_REQUIRED = 76,
1303 	WLAN_STATUS_FCG_NOT_SUPP = 78,
1304 	WLAN_STATUS_STA_NO_TBTT = 78,
1305 	/* 802.11ad */
1306 	WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES = 39,
1307 	WLAN_STATUS_REJECTED_FOR_DELAY_PERIOD = 47,
1308 	WLAN_STATUS_REJECT_WITH_SCHEDULE = 83,
1309 	WLAN_STATUS_PENDING_ADMITTING_FST_SESSION = 86,
1310 	WLAN_STATUS_PERFORMING_FST_NOW = 87,
1311 	WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW = 88,
1312 	WLAN_STATUS_REJECT_U_PID_SETTING = 89,
1313 	WLAN_STATUS_REJECT_DSE_BAND = 96,
1314 	WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL = 99,
1315 	WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT = 103,
1316 };
1317 
1318 
1319 /* Reason codes */
1320 enum ieee80211_reasoncode {
1321 	WLAN_REASON_UNSPECIFIED = 1,
1322 	WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
1323 	WLAN_REASON_DEAUTH_LEAVING = 3,
1324 	WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
1325 	WLAN_REASON_DISASSOC_AP_BUSY = 5,
1326 	WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
1327 	WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
1328 	WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
1329 	WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
1330 	/* 802.11h */
1331 	WLAN_REASON_DISASSOC_BAD_POWER = 10,
1332 	WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
1333 	/* 802.11i */
1334 	WLAN_REASON_INVALID_IE = 13,
1335 	WLAN_REASON_MIC_FAILURE = 14,
1336 	WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
1337 	WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
1338 	WLAN_REASON_IE_DIFFERENT = 17,
1339 	WLAN_REASON_INVALID_GROUP_CIPHER = 18,
1340 	WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
1341 	WLAN_REASON_INVALID_AKMP = 20,
1342 	WLAN_REASON_UNSUPP_RSN_VERSION = 21,
1343 	WLAN_REASON_INVALID_RSN_IE_CAP = 22,
1344 	WLAN_REASON_IEEE8021X_FAILED = 23,
1345 	WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
1346 	/* 802.11e */
1347 	WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
1348 	WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
1349 	WLAN_REASON_DISASSOC_LOW_ACK = 34,
1350 	WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
1351 	WLAN_REASON_QSTA_LEAVE_QBSS = 36,
1352 	WLAN_REASON_QSTA_NOT_USE = 37,
1353 	WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
1354 	WLAN_REASON_QSTA_TIMEOUT = 39,
1355 	WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
1356 	/* 802.11s */
1357 	WLAN_REASON_MESH_PEER_CANCELED = 52,
1358 	WLAN_REASON_MESH_MAX_PEERS = 53,
1359 	WLAN_REASON_MESH_CONFIG = 54,
1360 	WLAN_REASON_MESH_CLOSE = 55,
1361 	WLAN_REASON_MESH_MAX_RETRIES = 56,
1362 	WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57,
1363 	WLAN_REASON_MESH_INVALID_GTK = 58,
1364 	WLAN_REASON_MESH_INCONSISTENT_PARAM = 59,
1365 	WLAN_REASON_MESH_INVALID_SECURITY = 60,
1366 	WLAN_REASON_MESH_PATH_ERROR = 61,
1367 	WLAN_REASON_MESH_PATH_NOFORWARD = 62,
1368 	WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63,
1369 	WLAN_REASON_MAC_EXISTS_IN_MBSS = 64,
1370 	WLAN_REASON_MESH_CHAN_REGULATORY = 65,
1371 	WLAN_REASON_MESH_CHAN = 66,
1372 };
1373 
1374 
1375 /* Information Element IDs */
1376 enum ieee80211_eid {
1377 	WLAN_EID_SSID = 0,
1378 	WLAN_EID_SUPP_RATES = 1,
1379 	WLAN_EID_FH_PARAMS = 2,
1380 	WLAN_EID_DS_PARAMS = 3,
1381 	WLAN_EID_CF_PARAMS = 4,
1382 	WLAN_EID_TIM = 5,
1383 	WLAN_EID_IBSS_PARAMS = 6,
1384 	WLAN_EID_CHALLENGE = 16,
1385 
1386 	WLAN_EID_COUNTRY = 7,
1387 	WLAN_EID_HP_PARAMS = 8,
1388 	WLAN_EID_HP_TABLE = 9,
1389 	WLAN_EID_REQUEST = 10,
1390 
1391 	WLAN_EID_QBSS_LOAD = 11,
1392 	WLAN_EID_EDCA_PARAM_SET = 12,
1393 	WLAN_EID_TSPEC = 13,
1394 	WLAN_EID_TCLAS = 14,
1395 	WLAN_EID_SCHEDULE = 15,
1396 	WLAN_EID_TS_DELAY = 43,
1397 	WLAN_EID_TCLAS_PROCESSING = 44,
1398 	WLAN_EID_QOS_CAPA = 46,
1399 	/* 802.11z */
1400 	WLAN_EID_LINK_ID = 101,
1401 	/* 802.11s */
1402 	WLAN_EID_MESH_CONFIG = 113,
1403 	WLAN_EID_MESH_ID = 114,
1404 	WLAN_EID_LINK_METRIC_REPORT = 115,
1405 	WLAN_EID_CONGESTION_NOTIFICATION = 116,
1406 	WLAN_EID_PEER_MGMT = 117,
1407 	WLAN_EID_CHAN_SWITCH_PARAM = 118,
1408 	WLAN_EID_MESH_AWAKE_WINDOW = 119,
1409 	WLAN_EID_BEACON_TIMING = 120,
1410 	WLAN_EID_MCCAOP_SETUP_REQ = 121,
1411 	WLAN_EID_MCCAOP_SETUP_RESP = 122,
1412 	WLAN_EID_MCCAOP_ADVERT = 123,
1413 	WLAN_EID_MCCAOP_TEARDOWN = 124,
1414 	WLAN_EID_GANN = 125,
1415 	WLAN_EID_RANN = 126,
1416 	WLAN_EID_PREQ = 130,
1417 	WLAN_EID_PREP = 131,
1418 	WLAN_EID_PERR = 132,
1419 	WLAN_EID_PXU = 137,
1420 	WLAN_EID_PXUC = 138,
1421 	WLAN_EID_AUTH_MESH_PEER_EXCH = 139,
1422 	WLAN_EID_MIC = 140,
1423 
1424 	WLAN_EID_PWR_CONSTRAINT = 32,
1425 	WLAN_EID_PWR_CAPABILITY = 33,
1426 	WLAN_EID_TPC_REQUEST = 34,
1427 	WLAN_EID_TPC_REPORT = 35,
1428 	WLAN_EID_SUPPORTED_CHANNELS = 36,
1429 	WLAN_EID_CHANNEL_SWITCH = 37,
1430 	WLAN_EID_MEASURE_REQUEST = 38,
1431 	WLAN_EID_MEASURE_REPORT = 39,
1432 	WLAN_EID_QUIET = 40,
1433 	WLAN_EID_IBSS_DFS = 41,
1434 
1435 	WLAN_EID_ERP_INFO = 42,
1436 	WLAN_EID_EXT_SUPP_RATES = 50,
1437 
1438 	WLAN_EID_HT_CAPABILITY = 45,
1439 	WLAN_EID_HT_OPERATION = 61,
1440 
1441 	WLAN_EID_RSN = 48,
1442 	WLAN_EID_MMIE = 76,
1443 	WLAN_EID_WPA = 221,
1444 	WLAN_EID_GENERIC = 221,
1445 	WLAN_EID_VENDOR_SPECIFIC = 221,
1446 	WLAN_EID_QOS_PARAMETER = 222,
1447 
1448 	WLAN_EID_AP_CHAN_REPORT = 51,
1449 	WLAN_EID_NEIGHBOR_REPORT = 52,
1450 	WLAN_EID_RCPI = 53,
1451 	WLAN_EID_BSS_AVG_ACCESS_DELAY = 63,
1452 	WLAN_EID_ANTENNA_INFO = 64,
1453 	WLAN_EID_RSNI = 65,
1454 	WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66,
1455 	WLAN_EID_BSS_AVAILABLE_CAPACITY = 67,
1456 	WLAN_EID_BSS_AC_ACCESS_DELAY = 68,
1457 	WLAN_EID_RRM_ENABLED_CAPABILITIES = 70,
1458 	WLAN_EID_MULTIPLE_BSSID = 71,
1459 	WLAN_EID_BSS_COEX_2040 = 72,
1460 	WLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74,
1461 	WLAN_EID_EXT_CAPABILITY = 127,
1462 
1463 	WLAN_EID_MOBILITY_DOMAIN = 54,
1464 	WLAN_EID_FAST_BSS_TRANSITION = 55,
1465 	WLAN_EID_TIMEOUT_INTERVAL = 56,
1466 	WLAN_EID_RIC_DATA = 57,
1467 	WLAN_EID_RIC_DESCRIPTOR = 75,
1468 
1469 	WLAN_EID_DSE_REGISTERED_LOCATION = 58,
1470 	WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59,
1471 	WLAN_EID_EXT_CHANSWITCH_ANN = 60,
1472 
1473 	WLAN_EID_VHT_CAPABILITY = 191,
1474 	WLAN_EID_VHT_OPERATION = 192,
1475 
1476 	/* 802.11ad */
1477 	WLAN_EID_NON_TX_BSSID_CAP =  83,
1478 	WLAN_EID_WAKEUP_SCHEDULE = 143,
1479 	WLAN_EID_EXT_SCHEDULE = 144,
1480 	WLAN_EID_STA_AVAILABILITY = 145,
1481 	WLAN_EID_DMG_TSPEC = 146,
1482 	WLAN_EID_DMG_AT = 147,
1483 	WLAN_EID_DMG_CAP = 148,
1484 	WLAN_EID_DMG_OPERATION = 151,
1485 	WLAN_EID_DMG_BSS_PARAM_CHANGE = 152,
1486 	WLAN_EID_DMG_BEAM_REFINEMENT = 153,
1487 	WLAN_EID_CHANNEL_MEASURE_FEEDBACK = 154,
1488 	WLAN_EID_AWAKE_WINDOW = 157,
1489 	WLAN_EID_MULTI_BAND = 158,
1490 	WLAN_EID_ADDBA_EXT = 159,
1491 	WLAN_EID_NEXT_PCP_LIST = 160,
1492 	WLAN_EID_PCP_HANDOVER = 161,
1493 	WLAN_EID_DMG_LINK_MARGIN = 162,
1494 	WLAN_EID_SWITCHING_STREAM = 163,
1495 	WLAN_EID_SESSION_TRANSITION = 164,
1496 	WLAN_EID_DYN_TONE_PAIRING_REPORT = 165,
1497 	WLAN_EID_CLUSTER_REPORT = 166,
1498 	WLAN_EID_RELAY_CAP = 167,
1499 	WLAN_EID_RELAY_XFER_PARAM_SET = 168,
1500 	WLAN_EID_BEAM_LINK_MAINT = 169,
1501 	WLAN_EID_MULTIPLE_MAC_ADDR = 170,
1502 	WLAN_EID_U_PID = 171,
1503 	WLAN_EID_DMG_LINK_ADAPT_ACK = 172,
1504 	WLAN_EID_QUIET_PERIOD_REQ = 175,
1505 	WLAN_EID_QUIET_PERIOD_RESP = 177,
1506 	WLAN_EID_EPAC_POLICY = 182,
1507 	WLAN_EID_CLISTER_TIME_OFF = 183,
1508 	WLAN_EID_ANTENNA_SECTOR_ID_PATTERN = 190,
1509 };
1510 
1511 /* Action category code */
1512 enum ieee80211_category {
1513 	WLAN_CATEGORY_SPECTRUM_MGMT = 0,
1514 	WLAN_CATEGORY_QOS = 1,
1515 	WLAN_CATEGORY_DLS = 2,
1516 	WLAN_CATEGORY_BACK = 3,
1517 	WLAN_CATEGORY_PUBLIC = 4,
1518 	WLAN_CATEGORY_HT = 7,
1519 	WLAN_CATEGORY_SA_QUERY = 8,
1520 	WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9,
1521 	WLAN_CATEGORY_TDLS = 12,
1522 	WLAN_CATEGORY_MESH_ACTION = 13,
1523 	WLAN_CATEGORY_MULTIHOP_ACTION = 14,
1524 	WLAN_CATEGORY_SELF_PROTECTED = 15,
1525 	WLAN_CATEGORY_DMG = 16,
1526 	WLAN_CATEGORY_WMM = 17,
1527 	WLAN_CATEGORY_FST = 18,
1528 	WLAN_CATEGORY_UNPROT_DMG = 20,
1529 	WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
1530 	WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
1531 };
1532 
1533 /* SPECTRUM_MGMT action code */
1534 enum ieee80211_spectrum_mgmt_actioncode {
1535 	WLAN_ACTION_SPCT_MSR_REQ = 0,
1536 	WLAN_ACTION_SPCT_MSR_RPRT = 1,
1537 	WLAN_ACTION_SPCT_TPC_REQ = 2,
1538 	WLAN_ACTION_SPCT_TPC_RPRT = 3,
1539 	WLAN_ACTION_SPCT_CHL_SWITCH = 4,
1540 };
1541 
1542 /* HT action codes */
1543 enum ieee80211_ht_actioncode {
1544 	WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0,
1545 	WLAN_HT_ACTION_SMPS = 1,
1546 	WLAN_HT_ACTION_PSMP = 2,
1547 	WLAN_HT_ACTION_PCO_PHASE = 3,
1548 	WLAN_HT_ACTION_CSI = 4,
1549 	WLAN_HT_ACTION_NONCOMPRESSED_BF = 5,
1550 	WLAN_HT_ACTION_COMPRESSED_BF = 6,
1551 	WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,
1552 };
1553 
1554 /* Self Protected Action codes */
1555 enum ieee80211_self_protected_actioncode {
1556 	WLAN_SP_RESERVED = 0,
1557 	WLAN_SP_MESH_PEERING_OPEN = 1,
1558 	WLAN_SP_MESH_PEERING_CONFIRM = 2,
1559 	WLAN_SP_MESH_PEERING_CLOSE = 3,
1560 	WLAN_SP_MGK_INFORM = 4,
1561 	WLAN_SP_MGK_ACK = 5,
1562 };
1563 
1564 /* Mesh action codes */
1565 enum ieee80211_mesh_actioncode {
1566 	WLAN_MESH_ACTION_LINK_METRIC_REPORT,
1567 	WLAN_MESH_ACTION_HWMP_PATH_SELECTION,
1568 	WLAN_MESH_ACTION_GATE_ANNOUNCEMENT,
1569 	WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION,
1570 	WLAN_MESH_ACTION_MCCA_SETUP_REQUEST,
1571 	WLAN_MESH_ACTION_MCCA_SETUP_REPLY,
1572 	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST,
1573 	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT,
1574 	WLAN_MESH_ACTION_MCCA_TEARDOWN,
1575 	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST,
1576 	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE,
1577 };
1578 
1579 /* Security key length */
1580 enum ieee80211_key_len {
1581 	WLAN_KEY_LEN_WEP40 = 5,
1582 	WLAN_KEY_LEN_WEP104 = 13,
1583 	WLAN_KEY_LEN_CCMP = 16,
1584 	WLAN_KEY_LEN_TKIP = 32,
1585 	WLAN_KEY_LEN_AES_CMAC = 16,
1586 };
1587 
1588 /* Public action codes */
1589 enum ieee80211_pub_actioncode {
1590 	WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
1591 };
1592 
1593 /* TDLS action codes */
1594 enum ieee80211_tdls_actioncode {
1595 	WLAN_TDLS_SETUP_REQUEST = 0,
1596 	WLAN_TDLS_SETUP_RESPONSE = 1,
1597 	WLAN_TDLS_SETUP_CONFIRM = 2,
1598 	WLAN_TDLS_TEARDOWN = 3,
1599 	WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4,
1600 	WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5,
1601 	WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6,
1602 	WLAN_TDLS_PEER_PSM_REQUEST = 7,
1603 	WLAN_TDLS_PEER_PSM_RESPONSE = 8,
1604 	WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9,
1605 	WLAN_TDLS_DISCOVERY_REQUEST = 10,
1606 };
1607 
1608 /*
1609  * TDLS capabililites to be enabled in the 5th byte of the
1610  * @WLAN_EID_EXT_CAPABILITY information element
1611  */
1612 #define WLAN_EXT_CAPA5_TDLS_ENABLED	BIT(5)
1613 #define WLAN_EXT_CAPA5_TDLS_PROHIBITED	BIT(6)
1614 
1615 /* TDLS specific payload type in the LLC/SNAP header */
1616 #define WLAN_TDLS_SNAP_RFTYPE	0x2
1617 
1618 /**
1619  * enum - mesh synchronization method identifier
1620  *
1621  * @IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET: the default synchronization method
1622  * @IEEE80211_SYNC_METHOD_VENDOR: a vendor specific synchronization method
1623  *	that will be specified in a vendor specific information element
1624  */
1625 enum {
1626 	IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET = 1,
1627 	IEEE80211_SYNC_METHOD_VENDOR = 255,
1628 };
1629 
1630 /**
1631  * enum - mesh path selection protocol identifier
1632  *
1633  * @IEEE80211_PATH_PROTOCOL_HWMP: the default path selection protocol
1634  * @IEEE80211_PATH_PROTOCOL_VENDOR: a vendor specific protocol that will
1635  *	be specified in a vendor specific information element
1636  */
1637 enum {
1638 	IEEE80211_PATH_PROTOCOL_HWMP = 1,
1639 	IEEE80211_PATH_PROTOCOL_VENDOR = 255,
1640 };
1641 
1642 /**
1643  * enum - mesh path selection metric identifier
1644  *
1645  * @IEEE80211_PATH_METRIC_AIRTIME: the default path selection metric
1646  * @IEEE80211_PATH_METRIC_VENDOR: a vendor specific metric that will be
1647  *	specified in a vendor specific information element
1648  */
1649 enum {
1650 	IEEE80211_PATH_METRIC_AIRTIME = 1,
1651 	IEEE80211_PATH_METRIC_VENDOR = 255,
1652 };
1653 
1654 /**
1655  * enum ieee80211_root_mode_identifier - root mesh STA mode identifier
1656  *
1657  * These attribute are used by dot11MeshHWMPRootMode to set root mesh STA mode
1658  *
1659  * @IEEE80211_ROOTMODE_NO_ROOT: the mesh STA is not a root mesh STA (default)
1660  * @IEEE80211_ROOTMODE_ROOT: the mesh STA is a root mesh STA if greater than
1661  *	this value
1662  * @IEEE80211_PROACTIVE_PREQ_NO_PREP: the mesh STA is a root mesh STA supports
1663  *	the proactive PREQ with proactive PREP subfield set to 0
1664  * @IEEE80211_PROACTIVE_PREQ_WITH_PREP: the mesh STA is a root mesh STA
1665  *	supports the proactive PREQ with proactive PREP subfield set to 1
1666  * @IEEE80211_PROACTIVE_RANN: the mesh STA is a root mesh STA supports
1667  *	the proactive RANN
1668  */
1669 enum ieee80211_root_mode_identifier {
1670 	IEEE80211_ROOTMODE_NO_ROOT = 0,
1671 	IEEE80211_ROOTMODE_ROOT = 1,
1672 	IEEE80211_PROACTIVE_PREQ_NO_PREP = 2,
1673 	IEEE80211_PROACTIVE_PREQ_WITH_PREP = 3,
1674 	IEEE80211_PROACTIVE_RANN = 4,
1675 };
1676 
1677 /*
1678  * IEEE 802.11-2007 7.3.2.9 Country information element
1679  *
1680  * Minimum length is 8 octets, ie len must be evenly
1681  * divisible by 2
1682  */
1683 
1684 /* Although the spec says 8 I'm seeing 6 in practice */
1685 #define IEEE80211_COUNTRY_IE_MIN_LEN	6
1686 
1687 /* The Country String field of the element shall be 3 octets in length */
1688 #define IEEE80211_COUNTRY_STRING_LEN	3
1689 
1690 /*
1691  * For regulatory extension stuff see IEEE 802.11-2007
1692  * Annex I (page 1141) and Annex J (page 1147). Also
1693  * review 7.3.2.9.
1694  *
1695  * When dot11RegulatoryClassesRequired is true and the
1696  * first_channel/reg_extension_id is >= 201 then the IE
1697  * compromises of the 'ext' struct represented below:
1698  *
1699  *  - Regulatory extension ID - when generating IE this just needs
1700  *    to be monotonically increasing for each triplet passed in
1701  *    the IE
1702  *  - Regulatory class - index into set of rules
1703  *  - Coverage class - index into air propagation time (Table 7-27),
1704  *    in microseconds, you can compute the air propagation time from
1705  *    the index by multiplying by 3, so index 10 yields a propagation
1706  *    of 10 us. Valid values are 0-31, values 32-255 are not defined
1707  *    yet. A value of 0 inicates air propagation of <= 1 us.
1708  *
1709  *  See also Table I.2 for Emission limit sets and table
1710  *  I.3 for Behavior limit sets. Table J.1 indicates how to map
1711  *  a reg_class to an emission limit set and behavior limit set.
1712  */
1713 #define IEEE80211_COUNTRY_EXTENSION_ID 201
1714 
1715 /*
1716  *  Channels numbers in the IE must be monotonically increasing
1717  *  if dot11RegulatoryClassesRequired is not true.
1718  *
1719  *  If dot11RegulatoryClassesRequired is true consecutive
1720  *  subband triplets following a regulatory triplet shall
1721  *  have monotonically increasing first_channel number fields.
1722  *
1723  *  Channel numbers shall not overlap.
1724  *
1725  *  Note that max_power is signed.
1726  */
1727 struct ieee80211_country_ie_triplet {
1728 	union {
1729 		struct {
1730 			u8 first_channel;
1731 			u8 num_channels;
1732 			s8 max_power;
1733 		} __attribute__ ((packed)) chans;
1734 		struct {
1735 			u8 reg_extension_id;
1736 			u8 reg_class;
1737 			u8 coverage_class;
1738 		} __attribute__ ((packed)) ext;
1739 	};
1740 } __attribute__ ((packed));
1741 
1742 enum ieee80211_timeout_interval_type {
1743 	WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
1744 	WLAN_TIMEOUT_KEY_LIFETIME = 2 /* 802.11r */,
1745 	WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,
1746 };
1747 
1748 /* BACK action code */
1749 enum ieee80211_back_actioncode {
1750 	WLAN_ACTION_ADDBA_REQ = 0,
1751 	WLAN_ACTION_ADDBA_RESP = 1,
1752 	WLAN_ACTION_DELBA = 2,
1753 };
1754 
1755 /* BACK (block-ack) parties */
1756 enum ieee80211_back_parties {
1757 	WLAN_BACK_RECIPIENT = 0,
1758 	WLAN_BACK_INITIATOR = 1,
1759 };
1760 
1761 /* SA Query action */
1762 enum ieee80211_sa_query_action {
1763 	WLAN_ACTION_SA_QUERY_REQUEST = 0,
1764 	WLAN_ACTION_SA_QUERY_RESPONSE = 1,
1765 };
1766 
1767 
1768 /* cipher suite selectors */
1769 #define WLAN_CIPHER_SUITE_USE_GROUP	0x000FAC00
1770 #define WLAN_CIPHER_SUITE_WEP40		0x000FAC01
1771 #define WLAN_CIPHER_SUITE_TKIP		0x000FAC02
1772 /* reserved: 				0x000FAC03 */
1773 #define WLAN_CIPHER_SUITE_CCMP		0x000FAC04
1774 #define WLAN_CIPHER_SUITE_WEP104	0x000FAC05
1775 #define WLAN_CIPHER_SUITE_AES_CMAC	0x000FAC06
1776 #define WLAN_CIPHER_SUITE_GCMP		0x000FAC08
1777 
1778 #define WLAN_CIPHER_SUITE_SMS4		0x00147201
1779 
1780 /* AKM suite selectors */
1781 #define WLAN_AKM_SUITE_8021X		0x000FAC01
1782 #define WLAN_AKM_SUITE_PSK		0x000FAC02
1783 #define WLAN_AKM_SUITE_SAE			0x000FAC08
1784 #define WLAN_AKM_SUITE_FT_OVER_SAE	0x000FAC09
1785 
1786 #define WLAN_MAX_KEY_LEN		32
1787 
1788 #define WLAN_PMKID_LEN			16
1789 
1790 #define WLAN_OUI_WFA			0x506f9a
1791 #define WLAN_OUI_TYPE_WFA_P2P		9
1792 #define WLAN_OUI_MICROSOFT		0x0050f2
1793 #define WLAN_OUI_TYPE_MICROSOFT_WPA	1
1794 #define WLAN_OUI_TYPE_MICROSOFT_WMM	2
1795 #define WLAN_OUI_TYPE_MICROSOFT_WPS	4
1796 
1797 /*
1798  * WMM/802.11e Tspec Element
1799  */
1800 #define IEEE80211_WMM_IE_TSPEC_TID_MASK		0x0F
1801 #define IEEE80211_WMM_IE_TSPEC_TID_SHIFT	1
1802 
1803 enum ieee80211_tspec_status_code {
1804 	IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED = 0,
1805 	IEEE80211_TSPEC_STATUS_ADDTS_INVAL_PARAMS = 0x1,
1806 };
1807 
1808 struct ieee80211_tspec_ie {
1809 	u8 element_id;
1810 	u8 len;
1811 	u8 oui[3];
1812 	u8 oui_type;
1813 	u8 oui_subtype;
1814 	u8 version;
1815 	__le16 tsinfo;
1816 	u8 tsinfo_resvd;
1817 	__le16 nominal_msdu;
1818 	__le16 max_msdu;
1819 	__le32 min_service_int;
1820 	__le32 max_service_int;
1821 	__le32 inactivity_int;
1822 	__le32 suspension_int;
1823 	__le32 service_start_time;
1824 	__le32 min_data_rate;
1825 	__le32 mean_data_rate;
1826 	__le32 peak_data_rate;
1827 	__le32 max_burst_size;
1828 	__le32 delay_bound;
1829 	__le32 min_phy_rate;
1830 	__le16 sba;
1831 	__le16 medium_time;
1832 } __packed;
1833 
1834 /**
1835  * ieee80211_get_qos_ctl - get pointer to qos control bytes
1836  * @hdr: the frame
1837  *
1838  * The qos ctrl bytes come after the frame_control, duration, seq_num
1839  * and 3 or 4 addresses of length ETH_ALEN.
1840  * 3 addr: 2 + 2 + 2 + 3*6 = 24
1841  * 4 addr: 2 + 2 + 2 + 4*6 = 30
1842  */
1843 static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
1844 {
1845 	if (ieee80211_has_a4(hdr->frame_control))
1846 		return (u8 *)hdr + 30;
1847 	else
1848 		return (u8 *)hdr + 24;
1849 }
1850 
1851 /**
1852  * ieee80211_get_SA - get pointer to SA
1853  * @hdr: the frame
1854  *
1855  * Given an 802.11 frame, this function returns the offset
1856  * to the source address (SA). It does not verify that the
1857  * header is long enough to contain the address, and the
1858  * header must be long enough to contain the frame control
1859  * field.
1860  */
1861 static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
1862 {
1863 	if (ieee80211_has_a4(hdr->frame_control))
1864 		return hdr->addr4;
1865 	if (ieee80211_has_fromds(hdr->frame_control))
1866 		return hdr->addr3;
1867 	return hdr->addr2;
1868 }
1869 
1870 /**
1871  * ieee80211_get_DA - get pointer to DA
1872  * @hdr: the frame
1873  *
1874  * Given an 802.11 frame, this function returns the offset
1875  * to the destination address (DA). It does not verify that
1876  * the header is long enough to contain the address, and the
1877  * header must be long enough to contain the frame control
1878  * field.
1879  */
1880 static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
1881 {
1882 	if (ieee80211_has_tods(hdr->frame_control))
1883 		return hdr->addr3;
1884 	else
1885 		return hdr->addr1;
1886 }
1887 
1888 /**
1889  * ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
1890  * @hdr: the frame (buffer must include at least the first octet of payload)
1891  */
1892 static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
1893 {
1894 	if (ieee80211_is_disassoc(hdr->frame_control) ||
1895 	    ieee80211_is_deauth(hdr->frame_control))
1896 		return true;
1897 
1898 	if (ieee80211_is_action(hdr->frame_control)) {
1899 		u8 *category;
1900 
1901 		/*
1902 		 * Action frames, excluding Public Action frames, are Robust
1903 		 * Management Frames. However, if we are looking at a Protected
1904 		 * frame, skip the check since the data may be encrypted and
1905 		 * the frame has already been found to be a Robust Management
1906 		 * Frame (by the other end).
1907 		 */
1908 		if (ieee80211_has_protected(hdr->frame_control))
1909 			return true;
1910 		category = ((u8 *) hdr) + 24;
1911 		return *category != WLAN_CATEGORY_PUBLIC &&
1912 			*category != WLAN_CATEGORY_HT &&
1913 			*category != WLAN_CATEGORY_SELF_PROTECTED &&
1914 			*category != WLAN_CATEGORY_VENDOR_SPECIFIC;
1915 	}
1916 
1917 	return false;
1918 }
1919 
1920 /**
1921  * ieee80211_is_public_action - check if frame is a public action frame
1922  * @hdr: the frame
1923  * @len: length of the frame
1924  */
1925 static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
1926 					      size_t len)
1927 {
1928 	struct ieee80211_mgmt *mgmt = (void *)hdr;
1929 
1930 	if (len < IEEE80211_MIN_ACTION_SIZE)
1931 		return false;
1932 	if (!ieee80211_is_action(hdr->frame_control))
1933 		return false;
1934 	return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
1935 }
1936 
1937 /**
1938  * ieee80211_fhss_chan_to_freq - get channel frequency
1939  * @channel: the FHSS channel
1940  *
1941  * Convert IEEE802.11 FHSS channel to frequency (MHz)
1942  * Ref IEEE 802.11-2007 section 14.6
1943  */
1944 static inline int ieee80211_fhss_chan_to_freq(int channel)
1945 {
1946 	if ((channel > 1) && (channel < 96))
1947 		return channel + 2400;
1948 	else
1949 		return -1;
1950 }
1951 
1952 /**
1953  * ieee80211_freq_to_fhss_chan - get channel
1954  * @freq: the channels frequency
1955  *
1956  * Convert frequency (MHz) to IEEE802.11 FHSS channel
1957  * Ref IEEE 802.11-2007 section 14.6
1958  */
1959 static inline int ieee80211_freq_to_fhss_chan(int freq)
1960 {
1961 	if ((freq > 2401) && (freq < 2496))
1962 		return freq - 2400;
1963 	else
1964 		return -1;
1965 }
1966 
1967 /**
1968  * ieee80211_dsss_chan_to_freq - get channel center frequency
1969  * @channel: the DSSS channel
1970  *
1971  * Convert IEEE802.11 DSSS channel to the center frequency (MHz).
1972  * Ref IEEE 802.11-2007 section 15.6
1973  */
1974 static inline int ieee80211_dsss_chan_to_freq(int channel)
1975 {
1976 	if ((channel > 0) && (channel < 14))
1977 		return 2407 + (channel * 5);
1978 	else if (channel == 14)
1979 		return 2484;
1980 	else
1981 		return -1;
1982 }
1983 
1984 /**
1985  * ieee80211_freq_to_dsss_chan - get channel
1986  * @freq: the frequency
1987  *
1988  * Convert frequency (MHz) to IEEE802.11 DSSS channel
1989  * Ref IEEE 802.11-2007 section 15.6
1990  *
1991  * This routine selects the channel with the closest center frequency.
1992  */
1993 static inline int ieee80211_freq_to_dsss_chan(int freq)
1994 {
1995 	if ((freq >= 2410) && (freq < 2475))
1996 		return (freq - 2405) / 5;
1997 	else if ((freq >= 2482) && (freq < 2487))
1998 		return 14;
1999 	else
2000 		return -1;
2001 }
2002 
2003 /* Convert IEEE802.11 HR DSSS channel to frequency (MHz) and back
2004  * Ref IEEE 802.11-2007 section 18.4.6.2
2005  *
2006  * The channels and frequencies are the same as those defined for DSSS
2007  */
2008 #define ieee80211_hr_chan_to_freq(chan) ieee80211_dsss_chan_to_freq(chan)
2009 #define ieee80211_freq_to_hr_chan(freq) ieee80211_freq_to_dsss_chan(freq)
2010 
2011 /* Convert IEEE802.11 ERP channel to frequency (MHz) and back
2012  * Ref IEEE 802.11-2007 section 19.4.2
2013  */
2014 #define ieee80211_erp_chan_to_freq(chan) ieee80211_hr_chan_to_freq(chan)
2015 #define ieee80211_freq_to_erp_chan(freq) ieee80211_freq_to_hr_chan(freq)
2016 
2017 /**
2018  * ieee80211_ofdm_chan_to_freq - get channel center frequency
2019  * @s_freq: starting frequency == (dotChannelStartingFactor/2) MHz
2020  * @channel: the OFDM channel
2021  *
2022  * Convert IEEE802.11 OFDM channel to center frequency (MHz)
2023  * Ref IEEE 802.11-2007 section 17.3.8.3.2
2024  */
2025 static inline int ieee80211_ofdm_chan_to_freq(int s_freq, int channel)
2026 {
2027 	if ((channel > 0) && (channel <= 200) &&
2028 	    (s_freq >= 4000))
2029 		return s_freq + (channel * 5);
2030 	else
2031 		return -1;
2032 }
2033 
2034 /**
2035  * ieee80211_freq_to_ofdm_channel - get channel
2036  * @s_freq: starting frequency == (dotChannelStartingFactor/2) MHz
2037  * @freq: the frequency
2038  *
2039  * Convert frequency (MHz) to IEEE802.11 OFDM channel
2040  * Ref IEEE 802.11-2007 section 17.3.8.3.2
2041  *
2042  * This routine selects the channel with the closest center frequency.
2043  */
2044 static inline int ieee80211_freq_to_ofdm_chan(int s_freq, int freq)
2045 {
2046 	if ((freq > (s_freq + 2)) && (freq <= (s_freq + 1202)) &&
2047 	    (s_freq >= 4000))
2048 		return (freq + 2 - s_freq) / 5;
2049 	else
2050 		return -1;
2051 }
2052 
2053 /**
2054  * ieee80211_tu_to_usec - convert time units (TU) to microseconds
2055  * @tu: the TUs
2056  */
2057 static inline unsigned long ieee80211_tu_to_usec(unsigned long tu)
2058 {
2059 	return 1024 * tu;
2060 }
2061 
2062 /**
2063  * ieee80211_check_tim - check if AID bit is set in TIM
2064  * @tim: the TIM IE
2065  * @tim_len: length of the TIM IE
2066  * @aid: the AID to look for
2067  */
2068 static inline bool ieee80211_check_tim(struct ieee80211_tim_ie *tim,
2069 				       u8 tim_len, u16 aid)
2070 {
2071 	u8 mask;
2072 	u8 index, indexn1, indexn2;
2073 
2074 	if (unlikely(!tim || tim_len < sizeof(*tim)))
2075 		return false;
2076 
2077 	aid &= 0x3fff;
2078 	index = aid / 8;
2079 	mask  = 1 << (aid & 7);
2080 
2081 	indexn1 = tim->bitmap_ctrl & 0xfe;
2082 	indexn2 = tim_len + indexn1 - 4;
2083 
2084 	if (index < indexn1 || index > indexn2)
2085 		return false;
2086 
2087 	index -= indexn1;
2088 
2089 	return !!(tim->virtual_map[index] & mask);
2090 }
2091 
2092 #endif /* LINUX_IEEE80211_H */
2093