1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2001 Atsushi Onoe
5 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
6 * All rights reserved.
7 * Copyright (c) 2020-2025 The FreeBSD Foundation
8 *
9 * Portions of this software were developed by Björn Zeeb
10 * under sponsorship from the FreeBSD Foundation.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32#ifndef _NET80211_IEEE80211_H_
33#define _NET80211_IEEE80211_H_
34
35#include <sys/types.h>
36
37#ifndef _KERNEL
38#include <stdbool.h>
39#endif
40
41/*
42 * 802.11 protocol definitions.
43 */
44
45#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
46/* is 802.11 address multicast/broadcast? */
47#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)
48
49#ifdef _KERNEL
50extern const uint8_t ieee80211broadcastaddr[];
51#endif
52
53typedef uint16_t ieee80211_seq;
54
55/* IEEE 802.11 PLCP header */
56struct ieee80211_plcp_hdr {
57 uint16_t i_sfd;
58 uint8_t i_signal;
59 uint8_t i_service;
60 uint16_t i_length;
61 uint16_t i_crc;
62} __packed;
63
64#define IEEE80211_PLCP_SFD 0xF3A0
65#define IEEE80211_PLCP_SERVICE 0x00
66#define IEEE80211_PLCP_SERVICE_LOCKED 0x04
67#define IEEE80211_PLCL_SERVICE_PBCC 0x08
68#define IEEE80211_PLCP_SERVICE_LENEXT5 0x20
69#define IEEE80211_PLCP_SERVICE_LENEXT6 0x40
70#define IEEE80211_PLCP_SERVICE_LENEXT7 0x80
71
72/*
73 * generic definitions for IEEE 802.11 frames
74 */
75struct ieee80211_frame {
76 uint8_t i_fc[2];
77 uint8_t i_dur[2];
78 uint8_t i_addr1[IEEE80211_ADDR_LEN];
79 uint8_t i_addr2[IEEE80211_ADDR_LEN];
80 uint8_t i_addr3[IEEE80211_ADDR_LEN];
81 uint8_t i_seq[2];
82 /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
83 /* see below */
84} __packed;
85
86struct ieee80211_qosframe {
87 uint8_t i_fc[2];
88 uint8_t i_dur[2];
89 uint8_t i_addr1[IEEE80211_ADDR_LEN];
90 uint8_t i_addr2[IEEE80211_ADDR_LEN];
91 uint8_t i_addr3[IEEE80211_ADDR_LEN];
92 uint8_t i_seq[2];
93 uint8_t i_qos[2];
94 /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
95 /* see below */
96} __packed;
97
98struct ieee80211_qoscntl {
99 uint8_t i_qos[2];
100};
101
102struct ieee80211_frame_addr4 {
103 uint8_t i_fc[2];
104 uint8_t i_dur[2];
105 uint8_t i_addr1[IEEE80211_ADDR_LEN];
106 uint8_t i_addr2[IEEE80211_ADDR_LEN];
107 uint8_t i_addr3[IEEE80211_ADDR_LEN];
108 uint8_t i_seq[2];
109 uint8_t i_addr4[IEEE80211_ADDR_LEN];
110} __packed;
111
112struct ieee80211_qosframe_addr4 {
113 uint8_t i_fc[2];
114 uint8_t i_dur[2];
115 uint8_t i_addr1[IEEE80211_ADDR_LEN];
116 uint8_t i_addr2[IEEE80211_ADDR_LEN];
117 uint8_t i_addr3[IEEE80211_ADDR_LEN];
118 uint8_t i_seq[2];
119 uint8_t i_addr4[IEEE80211_ADDR_LEN];
120 uint8_t i_qos[2];
121} __packed;
122
123#define IEEE80211_FC0_VERSION_MASK 0x03
124#define IEEE80211_FC0_VERSION_SHIFT 0
125#define IEEE80211_FC0_VERSION_0 0x00
126#define IEEE80211_FC0_TYPE_MASK 0x0c
127#define IEEE80211_FC0_TYPE_SHIFT 2
128#define IEEE80211_FC0_TYPE_MGT 0x00 /* Management */
129#define IEEE80211_FC0_TYPE_CTL 0x04 /* Control */
130#define IEEE80211_FC0_TYPE_DATA 0x08 /* Data */
131#define IEEE80211_FC0_TYPE_EXT 0x0c /* Extension */
132
133#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
134#define IEEE80211_FC0_SUBTYPE_SHIFT 4
135/* 802.11-2020 Table 9-1-Valid type and subtype combinations */
136/* For type 00 Management (IEEE80211_FC0_TYPE_MGT) */
137#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 /* Association Request */
138#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 /* Association Response */
139#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20 /* Reassociation Request */
140#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30 /* Reassociation Response */
141#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40 /* Probe Request */
142#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50 /* Probe Response */
143#define IEEE80211_FC0_SUBTYPE_TIMING_ADV 0x60 /* Timing Advertisement */
144/* 0111 Reserved 0x70 */
145#define IEEE80211_FC0_SUBTYPE_BEACON 0x80 /* Beacon */
146#define IEEE80211_FC0_SUBTYPE_ATIM 0x90 /* ATIM */
147#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0 /* Disassociation */
148#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0 /* Authentication */
149#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0 /* Deauthentication */
150#define IEEE80211_FC0_SUBTYPE_ACTION 0xd0 /* Action */
151#define IEEE80211_FC0_SUBTYPE_ACTION_NOACK 0xe0 /* Action No Ack */
152/* 1111 Reserved 0xf0 */
153/* For type 01 Control (IEEE80211_FC0_TYPE_CTL) */
154/* 0000-0001 Reserved 0x00-0x10 */
155#define IEEE80211_FC0_SUBTYPE_TRIGGER 0x20 /* Trigger, 80211ax-2021 */
156#define IEEE80211_FC0_SUBTYPE_TACK 0x30 /* TACK */
157#define IEEE80211_FC0_SUBTYPE_BF_REPORT_POLL 0x40 /* Beamforming Report Poll */
158#define IEEE80211_FC0_SUBTYPE_VHT_HE_NDP 0x50 /* VHT/HE NDP Announcement, 80211ac/ax-2013/2021 */
159#define IEEE80211_FC0_SUBTYPE_CTL_EXT 0x60 /* Control Frame Extension */
160#define IEEE80211_FC0_SUBTYPE_CONTROL_WRAP 0x70 /* Control Wrapper */
161#define IEEE80211_FC0_SUBTYPE_BAR 0x80 /* Block Ack Request (BlockAckReq) */
162#define IEEE80211_FC0_SUBTYPE_BA 0x90 /* Block Ack (BlockAck) */
163#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0 /* PS-Poll */
164#define IEEE80211_FC0_SUBTYPE_RTS 0xb0 /* RTS */
165#define IEEE80211_FC0_SUBTYPE_CTS 0xc0 /* CTS */
166#define IEEE80211_FC0_SUBTYPE_ACK 0xd0 /* Ack */
167#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0 /* CF-End */
168#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0 /* 1111 Reserved - what was CF_END_ACK? */
169/* For type 10 Data (IEEE80211_FC0_TYPE_DATA) */
170#define IEEE80211_FC0_SUBTYPE_DATA 0x00 /* Data */
171/* 0001-0011 Reserved 0x10-0x30 */ /* Were: CF_ACK, CF_POLL, CF_ACPL */
172#define IEEE80211_FC0_SUBTYPE_NODATA 0x40 /* Null */
173/* 0101-0111 Reserved 0x50-0x70 */ /* Were: CFACK, CFPOLL, CF_ACK_CF_ACK */
174#define IEEE80211_FC0_SUBTYPE_QOS_MASK_ANY 0x80 /* QoS mask - matching any subtypes 8..15 */
175#define IEEE80211_FC0_SUBTYPE_QOS_DATA 0x80 /* QoS Data */
176#define IEEE80211_FC0_SUBTYPE_QOS_DATA_CFACK 0x90 /* QoS Data +CF-Ack */
177#define IEEE80211_FC0_SUBTYPE_QOS_DATA_CFPOLL 0xa0 /* QoS Data +CF-Poll */
178#define IEEE80211_FC0_SUBTYPE_QOS_DATA_CFACKPOLL 0xb0 /* QoS Data +CF-Ack +CF-Poll */
179#define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 /* QoS Null */
180/* 1101 Reserved 0xd0 */
181#define IEEE80211_FC0_SUBTYPE_QOS_CFPOLL 0xe0 /* QoS CF-Poll */
182#define IEEE80211_FC0_SUBTYPE_QOS_CFACKPOLL 0xf0 /* QoS CF-Ack +CF-Poll */
183/* For type 11 Extension (IEEE80211_FC0_TYPE_EXT) */
184#define IEEE80211_FC0_SUBTYPE_DMG_BEACON 0x00 /* DMG Beacon */
185#define IEEE80211_FC0_SUBTYPE_S1G_BEACON 0x10 /* S1G Beacon */
186/* 0010-1111 Reserved 0x20-0xff */
187
188/* 802.11-2020 Table 9-2-Control Frame Extension */
189/* Reusing B11..B8, part of FC1 */
190#define IEEE80211_CTL_EXT_SECTOR_ACK 0x00 /* Sector Ack, 80211ay-2021 */
191#define IEEE80211_CTL_EXT_BA_SCHED 0x01 /* Block Ack Schedule, 80211ay-2021 */
192#define IEEE80211_CTL_EXT_POLL 0x02 /* Poll */
193#define IEEE80211_CTL_EXT_SPR 0x03 /* SPR */
194#define IEEE80211_CTL_EXT_GRANT 0x04 /* Grant */
195#define IEEE80211_CTL_EXT_DMG_CTS 0x05 /* DMG CTS */
196#define IEEE80211_CTL_EXT_DMG_DTS 0x06 /* DMG DTS */
197#define IEEE80211_CTL_EXT_GRANT_ACK 0x07 /* Grant Ack */
198#define IEEE80211_CTL_EXT_SSW 0x08 /* SSW */
199#define IEEE80211_CTL_EXT_SSW_FBACK 0x09 /* SSW-Feedback */
200#define IEEE80211_CTL_EXT_SSW_ACK 0x0a /* SSW-Ack */
201#define IEEE80211_CTL_EXT_TDD_BF 0x0b /* TDD Beamforming, 80211ay-2021 */
202/* 1100-1111 Reserved 0xc-0xf */
203
204/* Check the version field */
205#define IEEE80211_IS_FC0_CHECK_VER(wh, v) \
206 (((wh)->i_fc[0] & IEEE80211_FC0_VERSION_MASK) == (v))
207
208/* Check the version and type field */
209#define IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, v, t) \
210 (((((wh)->i_fc[0] & IEEE80211_FC0_VERSION_MASK) == (v))) && \
211 (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == (t)))
212
213/* Check the version, type and subtype field */
214#define IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, v, t, st) \
215 (((((wh)->i_fc[0] & IEEE80211_FC0_VERSION_MASK) == (v))) && \
216 (((wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == (t)) && \
217 (((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == (st)))
218
219#define IEEE80211_IS_MGMT(wh) \
220 (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
221 IEEE80211_FC0_TYPE_MGT))
222#define IEEE80211_IS_CTL(wh) \
223 (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
224 IEEE80211_FC0_TYPE_CTL))
225#define IEEE80211_IS_DATA(wh) \
226 (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
227 IEEE80211_FC0_TYPE_DATA))
228#define IEEE80211_IS_EXT(wh) \
229 (IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
230 IEEE80211_FC0_TYPE_EXT))
231
232/* Management frame types */
233
234#define IEEE80211_IS_MGMT_BEACON(wh) \
235 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
236 IEEE80211_FC0_VERSION_0, \
237 IEEE80211_FC0_TYPE_MGT, \
238 IEEE80211_FC0_SUBTYPE_BEACON))
239
240#define IEEE80211_IS_MGMT_PROBE_RESP(wh) \
241 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
242 IEEE80211_FC0_VERSION_0, \
243 IEEE80211_FC0_TYPE_MGT, \
244 IEEE80211_FC0_SUBTYPE_PROBE_RESP))
245
246#define IEEE80211_IS_MGMT_ACTION(wh) \
247 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
248 IEEE80211_FC0_VERSION_0, \
249 IEEE80211_FC0_TYPE_MGT, \
250 IEEE80211_FC0_SUBTYPE_ACTION))
251
252/* Control frame types */
253
254#define IEEE80211_IS_CTL_PS_POLL(wh) \
255 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
256 IEEE80211_FC0_VERSION_0, \
257 IEEE80211_FC0_TYPE_CTL, \
258 IEEE80211_FC0_SUBTYPE_PS_POLL))
259
260#define IEEE80211_IS_CTL_BAR(wh) \
261 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
262 IEEE80211_FC0_VERSION_0, \
263 IEEE80211_FC0_TYPE_CTL, \
264 IEEE80211_FC0_SUBTYPE_BAR))
265
266/* Data frame types */
267
268/*
269 * Return true if the frame is any of the QOS frame types, not just
270 * data frames. Matching on the IEEE80211_FC0_SUBTYPE_QOS_ANY bit
271 * being set also matches on subtypes 8..15.
272 */
273#define IEEE80211_IS_QOS_ANY(wh) \
274 ((IEEE80211_IS_FC0_CHECK_VER_TYPE(wh, IEEE80211_FC0_VERSION_0, \
275 IEEE80211_FC0_TYPE_DATA)) && \
276 ((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS_MASK_ANY))
277
278/*
279 * Return true if this frame is QOS data, and only QOS data.
280 */
281#define IEEE80211_IS_QOSDATA(wh) \
282 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
283 IEEE80211_FC0_VERSION_0, \
284 IEEE80211_FC0_TYPE_DATA, \
285 IEEE80211_FC0_SUBTYPE_QOS_DATA))
286
287/*
288 * Return true if this frame is a QoS NULL data frame.
289 */
290#define IEEE80211_IS_QOS_NULL(wh) \
291 (IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh, \
292 IEEE80211_FC0_VERSION_0, \
293 IEEE80211_FC0_TYPE_DATA, \
294 IEEE80211_FC0_SUBTYPE_QOS_NULL))
295
296
297#define IEEE80211_FC1_DIR_MASK 0x03
298#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
299#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
300#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
301#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
302
303#define IEEE80211_IS_DSTODS(wh) \
304 (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
305
306#define IEEE80211_FC1_MORE_FRAG 0x04
307#define IEEE80211_FC1_RETRY 0x08
308#define IEEE80211_FC1_PWR_MGT 0x10
309#define IEEE80211_FC1_MORE_DATA 0x20
310#define IEEE80211_FC1_PROTECTED 0x40
311#define IEEE80211_FC1_ORDER 0x80
312
313#define IEEE80211_IS_PROTECTED(wh) \
314 ((wh)->i_fc[1] & IEEE80211_FC1_PROTECTED)
315
316#define IEEE80211_HAS_SEQ(type, subtype) \
317 ((type) != IEEE80211_FC0_TYPE_CTL && \
318 !((type) == IEEE80211_FC0_TYPE_DATA && \
319 ((subtype) & IEEE80211_FC0_SUBTYPE_QOS_NULL) == \
320 IEEE80211_FC0_SUBTYPE_QOS_NULL))
321#define IEEE80211_SEQ_FRAG_MASK 0x000f
322#define IEEE80211_SEQ_FRAG_SHIFT 0
323#define IEEE80211_SEQ_SEQ_MASK 0xfff0
324#define IEEE80211_SEQ_SEQ_SHIFT 4
325#define IEEE80211_SEQ_RANGE 4096
326
327#define IEEE80211_SEQ_ADD(seq, incr) \
328 (((seq) + (incr)) & (IEEE80211_SEQ_RANGE-1))
329#define IEEE80211_SEQ_INC(seq) IEEE80211_SEQ_ADD(seq,1)
330#define IEEE80211_SEQ_SUB(a, b) \
331 (((a) + IEEE80211_SEQ_RANGE - (b)) & (IEEE80211_SEQ_RANGE-1))
332
333#define IEEE80211_SEQ_BA_RANGE 2048 /* 2^11 */
334#define IEEE80211_SEQ_BA_BEFORE(a, b) \
335 (IEEE80211_SEQ_SUB(b, a+1) < IEEE80211_SEQ_BA_RANGE-1)
336
337#define IEEE80211_NWID_LEN 32
338#define IEEE80211_MESHID_LEN 32
339
340#define IEEE80211_QOS_CTL_LEN 2
341
342#define IEEE80211_QOS_TXOP 0x00ff
343/* bit 8 is reserved */
344#define IEEE80211_QOS_AMSDU 0x80
345#define IEEE80211_QOS_AMSDU_S 7
346#define IEEE80211_QOS_ACKPOLICY 0x60
347#define IEEE80211_QOS_ACKPOLICY_S 5
348#define IEEE80211_QOS_ACKPOLICY_NOACK 0x20 /* No ACK required */
349#define IEEE80211_QOS_ACKPOLICY_BA 0x60 /* Block ACK */
350#define IEEE80211_QOS_EOSP 0x10 /* EndOfService Period*/
351#define IEEE80211_QOS_EOSP_S 4
352#define IEEE80211_QOS_TID 0x0f
353/* qos[1] byte used for all frames sent by mesh STAs in a mesh BSS */
354#define IEEE80211_QOS_MC 0x01 /* Mesh control */
355/* Mesh power save level*/
356#define IEEE80211_QOS_MESH_PSL 0x02
357/* Mesh Receiver Service Period Initiated */
358#define IEEE80211_QOS_RSPI 0x04
359/* bits 11 to 15 reserved */
360
361/* does frame have QoS sequence control data */
362#define IEEE80211_QOS_HAS_SEQ(wh) \
363 (((wh)->i_fc[0] & \
364 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS_DATA)) == \
365 (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS_DATA))
366
367/*
368 * WME/802.11e information element.
369 */
370struct ieee80211_wme_info {
371 uint8_t wme_id; /* IEEE80211_ELEMID_VENDOR */
372 uint8_t wme_len; /* length in bytes */
373 uint8_t wme_oui[3]; /* 0x00, 0x50, 0xf2 */
374 uint8_t wme_type; /* OUI type */
375 uint8_t wme_subtype; /* OUI subtype */
376 uint8_t wme_version; /* spec revision */
377 uint8_t wme_info; /* QoS info */
378} __packed;
379
380/*
381 * WME/802.11e Tspec Element
382 */
383struct ieee80211_wme_tspec {
384 uint8_t ts_id;
385 uint8_t ts_len;
386 uint8_t ts_oui[3];
387 uint8_t ts_oui_type;
388 uint8_t ts_oui_subtype;
389 uint8_t ts_version;
390 uint8_t ts_tsinfo[3];
391 uint8_t ts_nom_msdu[2];
392 uint8_t ts_max_msdu[2];
393 uint8_t ts_min_svc[4];
394 uint8_t ts_max_svc[4];
395 uint8_t ts_inactv_intv[4];
396 uint8_t ts_susp_intv[4];
397 uint8_t ts_start_svc[4];
398 uint8_t ts_min_rate[4];
399 uint8_t ts_mean_rate[4];
400 uint8_t ts_max_burst[4];
401 uint8_t ts_min_phy[4];
402 uint8_t ts_peak_rate[4];
403 uint8_t ts_delay[4];
404 uint8_t ts_surplus[2];
405 uint8_t ts_medium_time[2];
406} __packed;
407
408/*
409 * WME AC parameter field
410 */
411struct ieee80211_wme_acparams {
412 uint8_t acp_aci_aifsn;
413 uint8_t acp_logcwminmax;
414 uint16_t acp_txop;
415} __packed;
416
417#define WME_NUM_AC 4 /* 4 AC categories */
418#define WME_NUM_TID 16 /* 16 tids */
419
420#define WME_PARAM_ACI 0x60 /* Mask for ACI field */
421#define WME_PARAM_ACI_S 5 /* Shift for ACI field */
422#define WME_PARAM_ACM 0x10 /* Mask for ACM bit */
423#define WME_PARAM_ACM_S 4 /* Shift for ACM bit */
424#define WME_PARAM_AIFSN 0x0f /* Mask for aifsn field */
425#define WME_PARAM_AIFSN_S 0 /* Shift for aifsn field */
426#define WME_PARAM_LOGCWMIN 0x0f /* Mask for CwMin field (in log) */
427#define WME_PARAM_LOGCWMIN_S 0 /* Shift for CwMin field */
428#define WME_PARAM_LOGCWMAX 0xf0 /* Mask for CwMax field (in log) */
429#define WME_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */
430
431#define WME_AC_TO_TID(_ac) ( \
432 ((_ac) == WME_AC_VO) ? 6 : \
433 ((_ac) == WME_AC_VI) ? 5 : \
434 ((_ac) == WME_AC_BK) ? 1 : \
435 0)
436
437#define TID_TO_WME_AC(_tid) ( \
438 ((_tid) == 0 || (_tid) == 3) ? WME_AC_BE : \
439 ((_tid) < 3) ? WME_AC_BK : \
440 ((_tid) < 6) ? WME_AC_VI : \
441 WME_AC_VO)
442
443/*
444 * WME Parameter Element
445 */
446struct ieee80211_wme_param {
447 uint8_t param_id;
448 uint8_t param_len;
449 uint8_t param_oui[3];
450 uint8_t param_oui_type;
451 uint8_t param_oui_subtype;
452 uint8_t param_version;
453 uint8_t param_qosInfo;
454#define WME_QOSINFO_COUNT 0x0f /* Mask for param count field */
455 uint8_t param_reserved;
456 struct ieee80211_wme_acparams params_acParams[WME_NUM_AC];
457} __packed;
458
459/*
460 * WME U-APSD qos info field defines
461 */
462#define WME_CAPINFO_UAPSD_EN 0x00000080
463#define WME_CAPINFO_UAPSD_VO 0x00000001
464#define WME_CAPINFO_UAPSD_VI 0x00000002
465#define WME_CAPINFO_UAPSD_BK 0x00000004
466#define WME_CAPINFO_UAPSD_BE 0x00000008
467#define WME_CAPINFO_UAPSD_ACFLAGS_SHIFT 0
468#define WME_CAPINFO_UAPSD_ACFLAGS_MASK 0xF
469#define WME_CAPINFO_UAPSD_MAXSP_SHIFT 5
470#define WME_CAPINFO_UAPSD_MAXSP_MASK 0x3
471#define WME_CAPINFO_IE_OFFSET 8
472#define WME_UAPSD_MAXSP(_qosinfo) \
473 (((_qosinfo) >> WME_CAPINFO_UAPSD_MAXSP_SHIFT) & \
474 WME_CAPINFO_UAPSD_MAXSP_MASK)
475#define WME_UAPSD_AC_ENABLED(_ac, _qosinfo) \
476 ((1 << (3 - (_ac))) & ( \
477 ((_qosinfo) >> WME_CAPINFO_UAPSD_ACFLAGS_SHIFT) & \
478 WME_CAPINFO_UAPSD_ACFLAGS_MASK))
479
480/*
481 * Management Notification Frame
482 */
483struct ieee80211_mnf {
484 uint8_t mnf_category;
485 uint8_t mnf_action;
486 uint8_t mnf_dialog;
487 uint8_t mnf_status;
488} __packed;
489#define MNF_SETUP_REQ 0
490#define MNF_SETUP_RESP 1
491#define MNF_TEARDOWN 2
492
493/*
494 * 802.11n Management Action Frames
495 */
496/* generic frame format */
497struct ieee80211_action {
498 uint8_t ia_category;
499 uint8_t ia_action;
500} __packed;
501
502/* 80211-2020 Table 9-51-Category values */
503#define IEEE80211_ACTION_CAT_SM 0 /* 9.6.2 Spectrum Management */
504#define IEEE80211_ACTION_CAT_QOS 1 /* 9.6.3 QoS */
505/* Reserved 2 was IEEE80211_ACTION_CAT_DLS */
506#define IEEE80211_ACTION_CAT_BA 3 /* 9.6.4 Block Ack */
507#define IEEE80211_ACTION_CAT_PUBLIC 4 /* 9.6.7 Public */
508#define IEEE80211_ACTION_CAT_RADIO_MEASUREMENT 5 /* 9.6.6 Radio Measurement */
509#define IEEE80211_ACTION_CAT_FAST_BSS_TRANSITION 6 /* 9.6.8 Fast BSS Transition */
510#define IEEE80211_ACTION_CAT_HT 7 /* 9.6.11 HT */
511#define IEEE80211_ACTION_CAT_SA_QUERY 8 /* 9.6.9 SA Query */
512#define IEEE80211_ACTION_CAT_PROTECTED_DUAL_OF_PUBLIC_ACTION 9 /* 9.6.10 Protected Dual of Public Action */
513#define IEEE80211_ACTION_CAT_WNM 10 /* 9.6.13 WNM */
514#define IEEE80211_ACTION_CAT_UNPROTECTED_WNM 11 /* 9.6.14 Unprotected WNM */
515#define IEEE80211_ACTION_CAT_TDLS 12 /* 9.6.12 TDLS */
516#define IEEE80211_ACTION_CAT_MESH 13 /* 9.6.16 Mesh */
517#define IEEE80211_ACTION_CAT_MULTIHOP 14 /* 9.6.17 Multihop */
518#define IEEE80211_ACTION_CAT_SELF_PROT 15 /* 9.6.15 Self-protected */
519#define IEEE80211_ACTION_CAT_DMG 16 /* 9.6.19 DMG */
520/* Reserved 17 (R)Wi-Fi Alliance */
521#define IEEE80211_ACTION_CAT_FAST_SESSION_TRANSFER 18 /* 9.6.20 Fast Session Transfer */
522#define IEEE80211_ACTION_CAT_ROBUST_AV_STREAMING 19 /* 9.6.18 Robust AV Streaming */
523#define IEEE80211_ACTION_CAT_UNPROTECTED_DMG 20 /* 9.6.21 Unprotected DMG */
524#define IEEE80211_ACTION_CAT_VHT 21 /* 9.6.22 VHT */
525#define IEEE80211_ACTION_CAT_UNPROTECTED_S1G 22 /* 9.6.24 Unprotected S1G */
526#define IEEE80211_ACTION_CAT_S1G 23 /* 9.6.25 S1G */
527#define IEEE80211_ACTION_CAT_FLOW_CONTROL 24 /* 9.6.26 Flow Control */
528#define IEEE80211_ACTION_CAT_CTL_RESP_MCS_NEG 25 /* 9.6.27 Control Response MCS Negotiation */
529#define IEEE80211_ACTION_CAT_FILS 26 /* 9.6.23 FILS */
530#define IEEE80211_ACTION_CAT_CDMG 27 /* 9.6.28 CDMG */
531#define IEEE80211_ACTION_CAT_CMMG 28 /* 9.6.29 CMMG */
532#define IEEE80211_ACTION_CAT_GLK 29 /* 9.6.30 GLK */
533#define IEEE80211_ACTION_CAT_HE 30 /* 9.6.31 HE, 80211ax-2021 */
534#define IEEE80211_ACTION_CAT_PROTECTED_HE 31 /* 9.6.32 Protected HE, 80211ax-2021 */
535/* Reserved 32-125 */
536#define IEEE80211_ACTION_CAT_VENDOR_SPECIFIC_PROTECTED 126 /* 9.6.5 Vendor-specific Protected */
537#define IEEE80211_ACTION_CAT_VENDOR 127 /* 9.6.5 Vendor-specific */
538/* Error 128-255 */
539
540
541/* 80211-2020 Table 9-346-Spectrum Management Action field values */
542enum ieee80211_action_sm {
543 IEEE80211_ACTION_SM_SMREQ = 0, /* Spectrum Measurement Request */
544 IEEE80211_ACTION_SM_SMREP = 1, /* Spectrum Measurement Report */
545 IEEE80211_ACTION_SM_TPCREQ = 2, /* TPC Request */
546 IEEE80211_ACTION_SM_TPCREP = 3, /* TPC Report */
547 IEEE80211_ACTION_SM_CSA = 4, /* Channel Switch Announcement */
548 /* Reserved = 5-255 */
549};
550
551/* 80211-2020 Table 9-363-Radio Measurement Action field values */
552enum ieee80211_action_radio_measurement {
553 IEEE80211_ACTION_RADIO_MEASUREMENT_RMREQ = 0, /* Radio Measurement Request */
554 IEEE80211_ACTION_RADIO_MEASUREMENT_RMREP = 1, /* Radio Measurement Report */
555 IEEE80211_ACTION_RADIO_MEASUREMENT_LMREQ = 2, /* Link Measurement Request */
556 IEEE80211_ACTION_RADIO_MEASUREMENT_LMREP = 3, /* Link Measurement Report */
557 IEEE80211_ACTION_RADIO_MEASUREMENT_NRREQ = 4, /* Neighbor Report Request */
558 IEEE80211_ACTION_RADIO_MEASUREMENT_NRRESP = 5, /* Neighbor Report Response */
559 /* Reserved = 6-255 */
560};
561
562#define IEEE80211_ACTION_HT_TXCHWIDTH 0 /* recommended xmit chan width*/
563#define IEEE80211_ACTION_HT_MIMOPWRSAVE 1 /* MIMO power save */
564
565/* HT - recommended transmission channel width */
566struct ieee80211_action_ht_txchwidth {
567 struct ieee80211_action at_header;
568 uint8_t at_chwidth;
569} __packed;
570
571#define IEEE80211_A_HT_TXCHWIDTH_20 0
572#define IEEE80211_A_HT_TXCHWIDTH_2040 1
573
574/* HT - MIMO Power Save (NB: D2.04) */
575struct ieee80211_action_ht_mimopowersave {
576 struct ieee80211_action am_header;
577 uint8_t am_control;
578} __packed;
579
580#define IEEE80211_A_HT_MIMOPWRSAVE_ENA 0x01 /* PS enabled */
581#define IEEE80211_A_HT_MIMOPWRSAVE_MODE 0x02
582#define IEEE80211_A_HT_MIMOPWRSAVE_MODE_S 1
583#define IEEE80211_A_HT_MIMOPWRSAVE_DYNAMIC 0x02 /* Dynamic Mode */
584#define IEEE80211_A_HT_MIMOPWRSAVE_STATIC 0x00 /* no SM packets */
585/* bits 2-7 reserved */
586
587/* Block Ack actions */
588#define IEEE80211_ACTION_BA_ADDBA_REQUEST 0 /* ADDBA request */
589#define IEEE80211_ACTION_BA_ADDBA_RESPONSE 1 /* ADDBA response */
590#define IEEE80211_ACTION_BA_DELBA 2 /* DELBA */
591
592/* Block Ack Parameter Set */
593#define IEEE80211_BAPS_BUFSIZ 0xffc0 /* buffer size */
594#define IEEE80211_BAPS_BUFSIZ_S 6
595#define IEEE80211_BAPS_TID 0x003c /* TID */
596#define IEEE80211_BAPS_TID_S 2
597#define IEEE80211_BAPS_POLICY 0x0002 /* block ack policy */
598#define IEEE80211_BAPS_POLICY_S 1
599#define IEEE80211_BAPS_AMSDU 0x0001 /* A-MSDU permitted */
600#define IEEE80211_BAPS_AMSDU_S 0
601
602#define IEEE80211_BAPS_POLICY_DELAYED (0<<IEEE80211_BAPS_POLICY_S)
603#define IEEE80211_BAPS_POLICY_IMMEDIATE (1<<IEEE80211_BAPS_POLICY_S)
604
605/* Block Ack Sequence Control */
606#define IEEE80211_BASEQ_START 0xfff0 /* starting seqnum */
607#define IEEE80211_BASEQ_START_S 4
608#define IEEE80211_BASEQ_FRAG 0x000f /* fragment number */
609#define IEEE80211_BASEQ_FRAG_S 0
610
611/* Delayed Block Ack Parameter Set */
612#define IEEE80211_DELBAPS_TID 0xf000 /* TID */
613#define IEEE80211_DELBAPS_TID_S 12
614#define IEEE80211_DELBAPS_INIT 0x0800 /* initiator */
615#define IEEE80211_DELBAPS_INIT_S 11
616
617/* BA - ADDBA request */
618struct ieee80211_action_ba_addbarequest {
619 struct ieee80211_action rq_header;
620 uint8_t rq_dialogtoken;
621 uint16_t rq_baparamset;
622 uint16_t rq_batimeout; /* in TUs */
623 uint16_t rq_baseqctl;
624} __packed;
625
626/* BA - ADDBA response */
627struct ieee80211_action_ba_addbaresponse {
628 struct ieee80211_action rs_header;
629 uint8_t rs_dialogtoken;
630 uint16_t rs_statuscode;
631 uint16_t rs_baparamset;
632 uint16_t rs_batimeout; /* in TUs */
633} __packed;
634
635/* BA - DELBA */
636struct ieee80211_action_ba_delba {
637 struct ieee80211_action dl_header;
638 uint16_t dl_baparamset;
639 uint16_t dl_reasoncode;
640} __packed;
641
642/* BAR Control */
643#define IEEE80211_BAR_TID 0xf000 /* TID */
644#define IEEE80211_BAR_TID_S 12
645#define IEEE80211_BAR_COMP 0x0004 /* Compressed Bitmap */
646#define IEEE80211_BAR_MTID 0x0002 /* Multi-TID */
647#define IEEE80211_BAR_NOACK 0x0001 /* No-Ack policy */
648
649/* BAR Starting Sequence Control */
650#define IEEE80211_BAR_SEQ_START 0xfff0 /* starting seqnum */
651#define IEEE80211_BAR_SEQ_START_S 4
652
653struct ieee80211_ba_request {
654 uint16_t rq_barctl;
655 uint16_t rq_barseqctl;
656} __packed;
657
658/*
659 * Control frames.
660 */
661struct ieee80211_frame_min {
662 uint8_t i_fc[2];
663 uint8_t i_dur[2];
664 uint8_t i_addr1[IEEE80211_ADDR_LEN];
665 uint8_t i_addr2[IEEE80211_ADDR_LEN];
666 /* FCS */
667} __packed;
668
669struct ieee80211_frame_rts {
670 uint8_t i_fc[2];
671 uint8_t i_dur[2];
672 uint8_t i_ra[IEEE80211_ADDR_LEN];
673 uint8_t i_ta[IEEE80211_ADDR_LEN];
674 /* FCS */
675} __packed;
676
677struct ieee80211_frame_cts {
678 uint8_t i_fc[2];
679 uint8_t i_dur[2];
680 uint8_t i_ra[IEEE80211_ADDR_LEN];
681 /* FCS */
682} __packed;
683
684struct ieee80211_frame_ack {
685 uint8_t i_fc[2];
686 uint8_t i_dur[2];
687 uint8_t i_ra[IEEE80211_ADDR_LEN];
688 /* FCS */
689} __packed;
690
691struct ieee80211_frame_pspoll {
692 uint8_t i_fc[2];
693 uint8_t i_aid[2];
694 uint8_t i_bssid[IEEE80211_ADDR_LEN];
695 uint8_t i_ta[IEEE80211_ADDR_LEN];
696 /* FCS */
697} __packed;
698
699struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */
700 uint8_t i_fc[2];
701 uint8_t i_dur[2]; /* should be zero */
702 uint8_t i_ra[IEEE80211_ADDR_LEN];
703 uint8_t i_bssid[IEEE80211_ADDR_LEN];
704 /* FCS */
705} __packed;
706
707struct ieee80211_frame_bar {
708 uint8_t i_fc[2];
709 uint8_t i_dur[2];
710 uint8_t i_ra[IEEE80211_ADDR_LEN];
711 uint8_t i_ta[IEEE80211_ADDR_LEN];
712 uint16_t i_ctl;
713 uint16_t i_seq;
714 /* FCS */
715} __packed;
716
717/*
718 * BEACON management packets
719 *
720 * octet timestamp[8]
721 * octet beacon interval[2]
722 * octet capability information[2]
723 * information element
724 * octet elemid
725 * octet length
726 * octet information[length]
727 */
728
729#define IEEE80211_BEACON_INTERVAL(beacon) \
730 ((beacon)[8] | ((beacon)[9] << 8))
731#define IEEE80211_BEACON_CAPABILITY(beacon) \
732 ((beacon)[10] | ((beacon)[11] << 8))
733
734#define IEEE80211_CAPINFO_ESS 0x0001
735#define IEEE80211_CAPINFO_IBSS 0x0002
736#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004
737#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008
738#define IEEE80211_CAPINFO_PRIVACY 0x0010
739#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020
740#define IEEE80211_CAPINFO_PBCC 0x0040
741#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080
742#define IEEE80211_CAPINFO_SPECTRUM_MGMT 0x0100
743/* bit 9 is reserved */
744#define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400
745#define IEEE80211_CAPINFO_RSN 0x0800
746/* bit 12 is reserved */
747#define IEEE80211_CAPINFO_DSSSOFDM 0x2000
748/* bits 14-15 are reserved */
749
750#define IEEE80211_CAPINFO_BITS \
751 "\20\1ESS\2IBSS\3CF_POLLABLE\4CF_POLLREQ\5PRIVACY\6SHORT_PREAMBLE" \
752 "\7PBCC\10CHNL_AGILITY\11SPECTRUM_MGMT\13SHORT_SLOTTIME\14RSN" \
753 "\16DSSOFDM"
754
755/*
756 * 802.11i/WPA information element (maximally sized).
757 */
758struct ieee80211_ie_wpa {
759 uint8_t wpa_id; /* IEEE80211_ELEMID_VENDOR */
760 uint8_t wpa_len; /* length in bytes */
761 uint8_t wpa_oui[3]; /* 0x00, 0x50, 0xf2 */
762 uint8_t wpa_type; /* OUI type */
763 uint16_t wpa_version; /* spec revision */
764 uint32_t wpa_mcipher[1]; /* multicast/group key cipher */
765 uint16_t wpa_uciphercnt; /* # pairwise key ciphers */
766 uint32_t wpa_uciphers[8];/* ciphers */
767 uint16_t wpa_authselcnt; /* authentication selector cnt*/
768 uint32_t wpa_authsels[8];/* selectors */
769 uint16_t wpa_caps; /* 802.11i capabilities */
770 uint16_t wpa_pmkidcnt; /* 802.11i pmkid count */
771 uint16_t wpa_pmkids[8]; /* 802.11i pmkids */
772} __packed;
773
774/*
775 * 802.11n HT Capability IE
776 * NB: these reflect D1.10
777 */
778struct ieee80211_ie_htcap {
779 uint8_t hc_id; /* element ID */
780 uint8_t hc_len; /* length in bytes */
781 uint16_t hc_cap; /* HT caps (see below) */
782 uint8_t hc_param; /* HT params (see below) */
783 uint8_t hc_mcsset[16]; /* supported MCS set */
784 uint16_t hc_extcap; /* extended HT capabilities */
785 uint32_t hc_txbf; /* txbf capabilities */
786 uint8_t hc_antenna; /* antenna capabilities */
787} __packed;
788
789/* HT capability flags (ht_cap) */
790#define IEEE80211_HTCAP_LDPC 0x0001 /* LDPC rx supported */
791#define IEEE80211_HTCAP_CHWIDTH40 0x0002 /* 20/40 supported */
792#define IEEE80211_HTCAP_SMPS 0x000c /* SM Power Save mode */
793#define IEEE80211_HTCAP_SMPS_OFF 0x000c /* disabled */
794#define IEEE80211_HTCAP_SMPS_DYNAMIC 0x0004 /* send RTS first */
795/* NB: SMPS value 2 is reserved */
796#define IEEE80211_HTCAP_SMPS_ENA 0x0000 /* enabled (static mode) */
797#define IEEE80211_HTCAP_GREENFIELD 0x0010 /* Greenfield supported */
798#define IEEE80211_HTCAP_SHORTGI20 0x0020 /* Short GI in 20MHz */
799#define IEEE80211_HTCAP_SHORTGI40 0x0040 /* Short GI in 40MHz */
800#define IEEE80211_HTCAP_TXSTBC 0x0080 /* STBC tx ok */
801#define IEEE80211_HTCAP_RXSTBC 0x0300 /* STBC rx support */
802#define IEEE80211_HTCAP_RXSTBC_S 8
803#define IEEE80211_HTCAP_RXSTBC_1STREAM 0x0100 /* 1 spatial stream */
804#define IEEE80211_HTCAP_RXSTBC_2STREAM 0x0200 /* 1-2 spatial streams*/
805#define IEEE80211_HTCAP_RXSTBC_3STREAM 0x0300 /* 1-3 spatial streams*/
806#define IEEE80211_HTCAP_DELBA 0x0400 /* HT DELBA supported */
807#define IEEE80211_HTCAP_MAXAMSDU 0x0800 /* max A-MSDU length */
808#define IEEE80211_HTCAP_MAXAMSDU_7935 0x0800 /* 7935 octets */
809#define IEEE80211_HTCAP_MAXAMSDU_3839 0x0000 /* 3839 octets */
810#define IEEE80211_HTCAP_DSSSCCK40 0x1000 /* DSSS/CCK in 40MHz */
811#define IEEE80211_HTCAP_PSMP 0x2000 /* PSMP supported */
812#define IEEE80211_HTCAP_40INTOLERANT 0x4000 /* 40MHz intolerant */
813#define IEEE80211_HTCAP_LSIGTXOPPROT 0x8000 /* L-SIG TXOP prot */
814
815#define IEEE80211_HTCAP_BITS \
816 "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \
817 "\13DELBA\14AMSDU(7935)\15DSSSCCK40\16PSMP\1740INTOLERANT" \
818 "\20LSIGTXOPPROT"
819
820/* HT parameters (hc_param) */
821#define IEEE80211_HTCAP_MAXRXAMPDU 0x03 /* max rx A-MPDU factor */
822#define IEEE80211_HTCAP_MAXRXAMPDU_S 0
823#define IEEE80211_HTCAP_MAXRXAMPDU_8K 0
824#define IEEE80211_HTCAP_MAXRXAMPDU_16K 1
825#define IEEE80211_HTCAP_MAXRXAMPDU_32K 2
826#define IEEE80211_HTCAP_MAXRXAMPDU_64K 3
827#define IEEE80211_HTCAP_MPDUDENSITY 0x1c /* min MPDU start spacing */
828#define IEEE80211_HTCAP_MPDUDENSITY_S 2
829#define IEEE80211_HTCAP_MPDUDENSITY_NA 0 /* no time restriction */
830#define IEEE80211_HTCAP_MPDUDENSITY_025 1 /* 1/4 us */
831#define IEEE80211_HTCAP_MPDUDENSITY_05 2 /* 1/2 us */
832#define IEEE80211_HTCAP_MPDUDENSITY_1 3 /* 1 us */
833#define IEEE80211_HTCAP_MPDUDENSITY_2 4 /* 2 us */
834#define IEEE80211_HTCAP_MPDUDENSITY_4 5 /* 4 us */
835#define IEEE80211_HTCAP_MPDUDENSITY_8 6 /* 8 us */
836#define IEEE80211_HTCAP_MPDUDENSITY_16 7 /* 16 us */
837
838/* HT extended capabilities (hc_extcap) */
839#define IEEE80211_HTCAP_PCO 0x0001 /* PCO capable */
840#define IEEE80211_HTCAP_PCOTRANS 0x0006 /* PCO transition time */
841#define IEEE80211_HTCAP_PCOTRANS_S 1
842#define IEEE80211_HTCAP_PCOTRANS_04 0x0002 /* 400 us */
843#define IEEE80211_HTCAP_PCOTRANS_15 0x0004 /* 1.5 ms */
844#define IEEE80211_HTCAP_PCOTRANS_5 0x0006 /* 5 ms */
845/* bits 3-7 reserved */
846#define IEEE80211_HTCAP_MCSFBACK 0x0300 /* MCS feedback */
847#define IEEE80211_HTCAP_MCSFBACK_S 8
848#define IEEE80211_HTCAP_MCSFBACK_NONE 0x0000 /* nothing provided */
849#define IEEE80211_HTCAP_MCSFBACK_UNSOL 0x0200 /* unsolicited feedback */
850#define IEEE80211_HTCAP_MCSFBACK_MRQ 0x0300 /* " "+respond to MRQ */
851#define IEEE80211_HTCAP_HTC 0x0400 /* +HTC support */
852#define IEEE80211_HTCAP_RDR 0x0800 /* reverse direction responder*/
853/* bits 12-15 reserved */
854
855/*
856 * 802.11n HT Information IE
857 */
858struct ieee80211_ie_htinfo {
859 uint8_t hi_id; /* element ID */
860 uint8_t hi_len; /* length in bytes */
861 uint8_t hi_ctrlchannel; /* primary channel */
862 uint8_t hi_byte1; /* ht ie byte 1 */
863 uint8_t hi_byte2; /* ht ie byte 2 */
864 uint8_t hi_byte3; /* ht ie byte 3 */
865 uint16_t hi_byte45; /* ht ie bytes 4+5 */
866 uint8_t hi_basicmcsset[16]; /* basic MCS set */
867} __packed;
868
869/* byte1 */
870#define IEEE80211_HTINFO_2NDCHAN 0x03 /* secondary/ext chan offset */
871#define IEEE80211_HTINFO_2NDCHAN_S 0
872#define IEEE80211_HTINFO_2NDCHAN_NONE 0x00 /* no secondary/ext channel */
873#define IEEE80211_HTINFO_2NDCHAN_ABOVE 0x01 /* above private channel */
874/* NB: 2 is reserved */
875#define IEEE80211_HTINFO_2NDCHAN_BELOW 0x03 /* below primary channel */
876#define IEEE80211_HTINFO_TXWIDTH 0x04 /* tx channel width */
877#define IEEE80211_HTINFO_TXWIDTH_20 0x00 /* 20MHz width */
878#define IEEE80211_HTINFO_TXWIDTH_2040 0x04 /* any supported width */
879#define IEEE80211_HTINFO_RIFSMODE 0x08 /* Reduced IFS (RIFS) use */
880#define IEEE80211_HTINFO_RIFSMODE_PROH 0x00 /* RIFS use prohibited */
881#define IEEE80211_HTINFO_RIFSMODE_PERM 0x08 /* RIFS use permitted */
882#define IEEE80211_HTINFO_PMSPONLY 0x10 /* PSMP required to associate */
883#define IEEE80211_HTINFO_SIGRAN 0xe0 /* shortest Service Interval */
884#define IEEE80211_HTINFO_SIGRAN_S 5
885#define IEEE80211_HTINFO_SIGRAN_5 0x00 /* 5 ms */
886/* XXX add rest */
887
888/* bytes 2+3 */
889#define IEEE80211_HTINFO_OPMODE 0x03 /* operating mode */
890#define IEEE80211_HTINFO_OPMODE_S 0
891#define IEEE80211_HTINFO_OPMODE_PURE 0x00 /* no protection */
892#define IEEE80211_HTINFO_OPMODE_PROTOPT 0x01 /* protection optional */
893#define IEEE80211_HTINFO_OPMODE_HT20PR 0x02 /* protection for HT20 sta's */
894#define IEEE80211_HTINFO_OPMODE_MIXED 0x03 /* protection for legacy sta's*/
895#define IEEE80211_HTINFO_NONGF_PRESENT 0x04 /* non-GF sta's present */
896#define IEEE80211_HTINFO_TXBL 0x08 /* transmit burst limit */
897#define IEEE80211_HTINFO_NONHT_PRESENT 0x10 /* non-HT sta's present */
898/* bits 5-15 reserved */
899
900/* bytes 4+5 */
901#define IEEE80211_HTINFO_2NDARYBEACON 0x01
902#define IEEE80211_HTINFO_LSIGTXOPPROT 0x02
903#define IEEE80211_HTINFO_PCO_ACTIVE 0x04
904#define IEEE80211_HTINFO_40MHZPHASE 0x08
905
906/* byte5 */
907#define IEEE80211_HTINFO_BASIC_STBCMCS 0x7f
908#define IEEE80211_HTINFO_BASIC_STBCMCS_S 0
909#define IEEE80211_HTINFO_DUALPROTECTED 0x80
910
911/*
912 * 802.11ac definitions - 802.11ac-2013 .
913 */
914
915/*
916 * Maximum length of A-MPDU that the STA can RX in VHT.
917 * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
918 */
919#define IEEE80211_VHTCAP_MAX_AMPDU_8K 0
920#define IEEE80211_VHTCAP_MAX_AMPDU_16K 1
921#define IEEE80211_VHTCAP_MAX_AMPDU_32K 2
922#define IEEE80211_VHTCAP_MAX_AMPDU_64K 3
923#define IEEE80211_VHTCAP_MAX_AMPDU_128K 4
924#define IEEE80211_VHTCAP_MAX_AMPDU_256K 5
925#define IEEE80211_VHTCAP_MAX_AMPDU_512K 6
926#define IEEE80211_VHTCAP_MAX_AMPDU_1024K 7
927
928/*
929 * VHT MCS information.
930 * + rx_highest/tx_highest: optional; maximum long GI VHT PPDU
931 * data rate. 1Mbit/sec units.
932 * + rx_mcs_map/tx_mcs_map: bitmap of per-stream supported MCS;
933 * 2 bits each.
934 */
935
936/* 802.11ac-2013, 8.4.2.160.3 Supported VHT-MCS and NSS Set field */
937enum ieee80211_vht_mcs_support {
938 IEEE80211_VHT_MCS_SUPPORT_0_7 = 0, /* MCS0-7 */
939 IEEE80211_VHT_MCS_SUPPORT_0_8 = 1, /* MCS0-8 */
940 IEEE80211_VHT_MCS_SUPPORT_0_9 = 2, /* MCS0-9 */
941 IEEE80211_VHT_MCS_NOT_SUPPORTED = 3 /* not supported */
942};
943
944/* 802.11ac-2013, 8.4.2.160.3 Supported VHT-MCS and NSS Set field */
945struct ieee80211_vht_mcs_info {
946 uint16_t rx_mcs_map;
947 uint16_t rx_highest;
948 uint16_t tx_mcs_map;
949 uint16_t tx_highest;
950} __packed;
951
952/* 802.11ac-2013, 8.4.2.160.1 VHT Capabilities element structure */
953struct ieee80211_vht_cap {
954 uint32_t vht_cap_info;
955 struct ieee80211_vht_mcs_info supp_mcs;
956} __packed;
957
958/*
959 * 802.11ac-2013, Table 8-183x-VHT Operation Information subfields.
960 * 802.11-2020, Table 9-274-VHT Operation Information subfields (for deprecations)
961 */
962enum ieee80211_vht_chanwidth {
963 IEEE80211_VHT_CHANWIDTH_USE_HT = 0, /* 20 MHz or 40 MHz */
964 IEEE80211_VHT_CHANWIDTH_80MHZ = 1, /* 80MHz */
965 IEEE80211_VHT_CHANWIDTH_160MHZ = 2, /* 160MHz (deprecated) */
966 IEEE80211_VHT_CHANWIDTH_80P80MHZ = 3, /* 80+80MHz (deprecated) */
967 /* 4..255 reserved. */
968};
969
970/* The name conflicts with the same structure in wpa. Only ifconfig needs this. */
971#if defined(_KERNEL) || defined(WANT_NET80211)
972/* 802.11ac-2013 8.4.2.161 VHT Operation element */
973struct ieee80211_vht_operation {
974 uint8_t chan_width; /* enum ieee80211_vht_chanwidth */
975 uint8_t center_freq_seq0_idx; /* 20/40/80/160 - VHT chan1 */
976 uint8_t center_freq_seq1_idx; /* 80+80 - VHT chan2 */
977 uint16_t basic_mcs_set; /* Basic VHT-MCS and NSS Set */
978} __packed;
979#endif
980
981/* 802.11ac VHT Capabilities */
982#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_3895 0x00000000
983#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_7991 0x00000001
984#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_11454 0x00000002
985#define IEEE80211_VHTCAP_MAX_MPDU_MASK 0x00000003
986#define IEEE80211_VHTCAP_MAX_MPDU_MASK_S 0
987
988#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK 0x0000000C
989#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK_S 2
990#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_NO160 0
991#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160MHZ 1
992#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160_80P80MHZ 2
993#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_RESERVED 3
994
995#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_IS_160MHZ(_vhtcaps) \
996 (_IEEE80211_MASKSHIFT(_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) >= \
997 IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160MHZ)
998#define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_IS_160_80P80MHZ(_vhtcaps) \
999 (_IEEE80211_MASKSHIFT(_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) == \
1000 IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160_80P80MHZ)
1001
1002#define IEEE80211_VHTCAP_RXLDPC 0x00000010
1003#define IEEE80211_VHTCAP_RXLDPC_S 4
1004
1005#define IEEE80211_VHTCAP_SHORT_GI_80 0x00000020
1006#define IEEE80211_VHTCAP_SHORT_GI_80_S 5
1007
1008#define IEEE80211_VHTCAP_SHORT_GI_160 0x00000040
1009#define IEEE80211_VHTCAP_SHORT_GI_160_S 6
1010
1011#define IEEE80211_VHTCAP_TXSTBC 0x00000080
1012#define IEEE80211_VHTCAP_TXSTBC_S 7
1013
1014#define IEEE80211_VHTCAP_RXSTBC_1 0x00000100
1015#define IEEE80211_VHTCAP_RXSTBC_2 0x00000200
1016#define IEEE80211_VHTCAP_RXSTBC_3 0x00000300
1017#define IEEE80211_VHTCAP_RXSTBC_4 0x00000400
1018#define IEEE80211_VHTCAP_RXSTBC_MASK 0x00000700
1019#define IEEE80211_VHTCAP_RXSTBC_MASK_S 8
1020
1021#define IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE 0x00000800
1022#define IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE_S 11
1023
1024#define IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE 0x00001000
1025#define IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE_S 12
1026
1027#define IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT 13
1028#define IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK \
1029 (7 << IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT)
1030#define IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK_S 13
1031
1032#define IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_SHIFT 16
1033#define IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK \
1034 (7 << IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_SHIFT)
1035#define IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK_S 16
1036
1037#define IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE 0x00080000
1038#define IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE_S 19
1039#define IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE 0x00100000
1040#define IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE_S 20
1041#define IEEE80211_VHTCAP_VHT_TXOP_PS 0x00200000
1042#define IEEE80211_VHTCAP_VHT_TXOP_PS_S 21
1043#define IEEE80211_VHTCAP_HTC_VHT 0x00400000
1044#define IEEE80211_VHTCAP_HTC_VHT_S 22
1045
1046#define IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT 23
1047#define IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \
1048 (7 << IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT)
1049#define IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_S 23
1050
1051#define IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK 0x0c000000
1052#define IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB 0x08000000
1053#define IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB 0x0c000000
1054#define IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MASK_S 26
1055
1056#define IEEE80211_VHTCAP_RX_ANTENNA_PATTERN 0x10000000
1057#define IEEE80211_VHTCAP_RX_ANTENNA_PATTERN_S 28
1058#define IEEE80211_VHTCAP_TX_ANTENNA_PATTERN 0x20000000
1059#define IEEE80211_VHTCAP_TX_ANTENNA_PATTERN_S 29
1060
1061/* 802.11-2016, 9.4.2.158.2 VHT Capabilities Information field. */
1062#define IEEE80211_VHTCAP_EXT_NSS_BW 0xc0000000
1063#define IEEE80211_VHTCAP_EXT_NSS_BW_S 30
1064
1065/*
1066 * XXX TODO: add the rest of the bits
1067 */
1068#define IEEE80211_VHTCAP_BITS \
1069 "\20\1MPDU7991\2MPDU11454\3CHAN160\4CHAN160+80P80\5RXLDPC\6SHORTGI80" \
1070 "\7SHORTGI160\10RXSTBC1\11RXSTBC2\12RXSTBC3\13RXSTBC4\14BFERCAP" \
1071 "\15BFEECAP\27VHT\37RXANTPTN\40TXANTPTN"
1072
1073/*
1074 * VHT Transmit Power Envelope element - 802.11ac-2013 8.4.2.164
1075 *
1076 * This defines the maximum transmit power for various bandwidths.
1077 */
1078/*
1079 * Count is how many elements follow and what they're for:
1080 *
1081 * 0 - 20 MHz
1082 * 1 - 20+40 MHz
1083 * 2 - 20+40+80 MHz
1084 * 3 - 20+40+80+(160, 80+80) MHz
1085 */
1086#define IEEE80211_VHT_TXPWRENV_INFO_COUNT_SHIFT 0
1087#define IEEE80211_VHT_TXPWRENV_INFO_COUNT_MASK 0x07
1088
1089/*
1090 * Unit is the tx power representation. It should be EIRP for now;
1091 * other values are reserved.
1092 */
1093#define IEEE80211_VHT_TXPWRENV_UNIT_MASK 0x38
1094#define IEEE80211_VHT_TXPWRENV_UNIT_SHIFT 3
1095
1096/* This value is within the unit mask/shift above */
1097#define IEEE80211_VHT_TXPWRENV_UNIT_EIRP 0
1098
1099struct ieee80211_ie_vht_txpwrenv {
1100 uint8_t ie;
1101 uint8_t len;
1102 uint8_t tx_info;
1103 int8_t tx_elem[0]; /* TX power elements, 1/2 dB, signed */
1104};
1105
1106/* VHT action codes */
1107#define WLAN_ACTION_VHT_COMPRESSED_BF 0
1108#define WLAN_ACTION_VHT_GROUPID_MGMT 1
1109#define WLAN_ACTION_VHT_OPMODE_NOTIF 2
1110
1111#if defined(_KERNEL) || defined(WANT_NET80211)
1112/*
1113 * HE
1114 */
1115
1116/*
1117 * 802.11ax-2021, 9.4.2.248.2 HE MAC Capabilities Information field.
1118 */
1119/* B0..B7 */
1120#define IEEE80211_HE_MAC_CAP0_HTC_HE (1<<0)
1121#define IEEE80211_HE_MAC_CAP0_TWT_REQ (1<<1)
1122#define IEEE80211_HE_MAC_CAP0_TWT_RES (1<<2)
1123
1124/* B8..B15 */
1125#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US (1<<3)
1126#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK (1<<3 | 1<<2)
1127#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8 (1<<6 | 1<<5 | 1<<4)
1128#define IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION (1<<7)
1129/* Note: B15|B16 are split between octets %!$@??? */
1130
1131/* B16..B23 */
1132#define IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION (1<<0)
1133#define IEEE80211_HE_MAC_CAP2_ALL_ACK (1<<1)
1134#define IEEE80211_HE_MAC_CAP2_TRS (1<<2)
1135#define IEEE80211_HE_MAC_CAP2_BSR (1<<3)
1136#define IEEE80211_HE_MAC_CAP2_BCAST_TWT (1<<4)
1137#define IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP (1<<5)
1138#define IEEE80211_HE_MAC_CAP2_MU_CASCADING (1<<6)
1139#define IEEE80211_HE_MAC_CAP2_ACK_EN (1<<7)
1140
1141/* B24..B31 */
1142#define IEEE80211_HE_MAC_CAP3_OMI_CONTROL (1<<1)
1143#define IEEE80211_HE_MAC_CAP3_OFDMA_RA (1<<2)
1144#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1 (1<<3)
1145#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2 (1<<4)
1146#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3 (1<<4 | 1<<3)
1147#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK (1<<4 | 1<<3)
1148#define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED (1<<6)
1149#define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS (1<<7)
1150
1151/* B32..B39 */
1152#define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG (1<<0)
1153#define IEEE80211_HE_MAC_CAP4_BQR (1<<2)
1154#define IEEE80211_HE_MAC_CAP4_OPS (1<<5)
1155#define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU (1<<6)
1156#define IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39 (1<<7)
1157/* Note: B39|B40|B41 are split between octets %!$@??? */
1158
1159/* B40..B47 */
1160#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 (1<<0)
1161#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 (1<<1)
1162#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION (1<<2)
1163#define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU (1<<3)
1164#define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX (1<<4)
1165#define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS (1<<5)
1166#define IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING (1<<6)
1167#define IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX (1<<7)
1168
1169/*
1170 * 802.11ax-2021, 9.4.2.248.3 HE PHY Capabilities Information field.
1171 */
1172/* B0..B7 */
1173#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G (1<<1)
1174#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G (1<<2)
1175#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G (1<<3)
1176#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G (1<<4)
1177#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL (1<<4 | 1<<3 | 1<<2 | 1<<1)
1178#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G (1<<5)
1179#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G (1<<6)
1180#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK (1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1)
1181
1182/* B8..B15 */
1183#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK (1<<3 | 1<<2 | 1<<1 | 1<<0)
1184#define IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A (1<<4)
1185#define IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD (1<<5)
1186#define IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US (1<<6)
1187#define IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS (1<<7)
1188/* Note: B15|B16 are split between octets %!$@??? */
1189
1190/* B16..B23 */
1191#define IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS (1<<0)
1192#define IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US (1<<1)
1193#define IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ (1<<2)
1194#define IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ (1<<3)
1195#define IEEE80211_HE_PHY_CAP2_DOPPLER_TX (1<<4)
1196#define IEEE80211_HE_PHY_CAP2_DOPPLER_RX (1<<5)
1197#define IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO (1<<6)
1198#define IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO (1<<7)
1199
1200/* B24..B31 */
1201#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM 0x00
1202#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK (1<<0)
1203#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK (1<<1)
1204#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_16_QAM (1<<1 | 1<<0)
1205#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK (1<<1 | 1<<0)
1206#define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 0x00
1207#define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_2 (1<<2)
1208#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM 0x00
1209#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK (1<<3)
1210#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK (1<<4)
1211#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM (1<<4 | 1<<3)
1212#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK (1<<4 | 1<<3)
1213#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00
1214#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 (1<<5)
1215#define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU (1<<6)
1216#define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER (1<<7)
1217
1218/* B32..B39 */
1219#define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE (1<<0)
1220#define IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER (1<<1)
1221#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 (1<<3 | 1<<2)
1222#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5 (1<<4)
1223#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8 (1<<4 | 1<<3 | 1<<2)
1224#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK (1<<4 | 1<<3 | 1<<2)
1225#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 (1<<6 | 1<<5)
1226#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5 (1<<7)
1227#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 (1<<7 | 1<<6 | 1<<5)
1228#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK (1<<7 | 1<<6 | 1<<5)
1229
1230/* B40..B47 */
1231#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 (1<<0)
1232#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK (1<<2 | 1<<1 | 1<<0)
1233#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2 (1<<3)
1234#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK (1<<5 | 1<<4 | 1<<3)
1235#define IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK (1<<6)
1236#define IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK (1<<7)
1237
1238/* B48..B55 */
1239#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU (1<<0)
1240#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU (1<<1)
1241#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB (1<<2)
1242#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB (1<<3)
1243#define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB (1<<4)
1244#define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE (1<<5)
1245#define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO (1<<6)
1246#define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT (1<<7)
1247
1248/* B56..B63 */
1249#define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR (1<<0)
1250#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP (1<<1)
1251#define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI (1<<2)
1252#define IEEE80211_HE_PHY_CAP7_MAX_NC_1 (1<<3)
1253#define IEEE80211_HE_PHY_CAP7_MAX_NC_2 (1<<4)
1254#define IEEE80211_HE_PHY_CAP7_MAX_NC_MASK (1<<5 | 1<<4 | 1<<3)
1255#define IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ (1<<6)
1256#define IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ (1<<7)
1257
1258/* B64..B71 */
1259#define IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI (1<<0)
1260#define IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G (1<<1)
1261#define IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU (1<<2)
1262#define IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU (1<<3)
1263#define IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI (1<<4)
1264#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242 0x00
1265#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484 (1<<6)
1266#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996 (1<<7)
1267#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996 (1<<7 | 1<<6)
1268#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK (1<<7 | 1<<6)
1269
1270/* B72..B79 */
1271#define IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM (1<<0)
1272#define IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK (1<<1)
1273#define IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU (1<<2)
1274#define IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU (1<<3)
1275#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB (1<<4)
1276#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB (1<<5)
1277#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US 0x00
1278#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US 1
1279#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US 2
1280#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED 3
1281#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS 6
1282#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK (1<<7 | 1<<6)
1283
1284/* B80..B87 */
1285#define IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF (1<<0)
1286
1287/*
1288 * 802.11ax-2021,
1289 * 9.4.2.248.2 HE MAC Capabilities Information field.
1290 * 9.4.2.248.3 HE PHY Capabilities Information field.
1291 */
1292struct ieee80211_he_cap_elem {
1293 uint8_t mac_cap_info[6];
1294 uint8_t phy_cap_info[11];
1295} __packed;
1296
1297/* 802.11ax-2021, 9.4.2.248.4 Supported HE-MCS And NSS Set field. */
1298enum ieee80211_he_mcs_support {
1299 IEEE80211_HE_MCS_SUPPORT_0_7 = 0, /* HE-MCS 0-7 for n NSS */
1300 IEEE80211_HE_MCS_SUPPORT_0_9 = 1, /* HE-MCS 0-9 for n NSS */
1301 IEEE80211_HE_MCS_SUPPORT_0_11 = 2, /* HE-MCS 0-11 for n NSS */
1302 IEEE80211_HE_MCS_NOT_SUPPORTED = 3 /* n NSS not supported. */
1303};
1304
1305struct ieee80211_he_mcs_nss_supp {
1306 uint16_t rx_mcs_80;
1307 uint16_t tx_mcs_80;
1308 uint16_t rx_mcs_160;
1309 uint16_t tx_mcs_160;
1310 uint16_t rx_mcs_80p80;
1311 uint16_t tx_mcs_80p80;
1312} __packed;
1313
1314#define IEEE80211_HE_CAP_PPE_THRES_MAX 25
1315
1316/* XXX this should only be internal. */
1317struct net80211_he_cap {
1318 bool has_he;
1319 struct ieee80211_he_cap_elem he_cap_elem;
1320 struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp;
1321 uint8_t ppe_thres[IEEE80211_HE_CAP_PPE_THRES_MAX];
1322};
1323
1324/* 802.11ax-2021, 9.4.2.249 HE Operation element. */
1325#define IEEE80211_HE_OPERATION_ER_SU_DISABLE (1<<16)
1326#define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET 24
1327#define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED (1<<31)
1328
1329struct ieee80211_he_operation {
1330 uint32_t he_oper_params; /* (3) params | (1) bss color info */
1331 uint16_t he_mcs_nss_set;
1332 uint8_t optional[0];
1333} __packed;
1334
1335/* 802.11ax-2021, 9.4.2.251 MU EDCA Parameter Set element. */
1336struct ieee80211_he_mu_edca_param_ac_rec {
1337 uint8_t aifsn;
1338 uint8_t ecw_min_max;
1339 uint8_t mu_edca_timer;
1340} __packed;
1341
1342struct ieee80211_mu_edca_param_set {
1343 uint8_t mu_qos_info;
1344 union {
1345 struct {
1346 struct ieee80211_he_mu_edca_param_ac_rec ac_be;
1347 struct ieee80211_he_mu_edca_param_ac_rec ac_bk;
1348 struct ieee80211_he_mu_edca_param_ac_rec ac_vi;
1349 struct ieee80211_he_mu_edca_param_ac_rec ac_vo;
1350 };
1351 struct ieee80211_he_mu_edca_param_ac_rec param_ac_recs[4];
1352 };
1353} __packed;
1354
1355/* 802.11ax-2021, 9.4.2.252 Spatial Reuse Parameter Set element */
1356/* Figure 9-788r-SR Control field format */
1357#define IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED (1<<1)
1358#define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT (1<<2)
1359#define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT (1<<3)
1360#define IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED (1<<4)
1361
1362/* 802.11ax-2021, 9.4.2.263 HE 6 GHz Band Capabilities element */
1363/* Figure 9-788aj-Capabilities Information field format */
1364#define IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START (1<<2 | 1<<1 | 1<<0)
1365#define IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP (1<<5 | 1<<4 | 1<<3)
1366#define IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN (1<<7 | 1<<6)
1367#define IEEE80211_HE_6GHZ_CAP_SM_PS (1<<10 | 1<<9)
1368#define IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS (1<<12)
1369#define IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS (1<<13)
1370
1371struct ieee80211_he_6ghz_capa {
1372 uint16_t capa;
1373};
1374#endif /* _KERNEL || WANT_NET80211 */
1375
1376/*
1377 * Management information element payloads.
1378 *
1379 * 802.11-2020 Table 9-92 (Element IDs).
1380 * 802.11ax-2021
1381 */
1382
1383enum {
1384 IEEE80211_ELEMID_SSID = 0,
1385 IEEE80211_ELEMID_RATES = 1,
1386 /* 2 Reserved */
1387 IEEE80211_ELEMID_FHPARMS = 2, /* remove? */
1388 IEEE80211_ELEMID_DSPARMS = 3,
1389 /* 4 Reserved */
1390 IEEE80211_ELEMID_CFPARMS = 4, /* remove? */
1391 IEEE80211_ELEMID_TIM = 5,
1392 IEEE80211_ELEMID_IBSSPARMS = 6,
1393 IEEE80211_ELEMID_COUNTRY = 7,
1394 /* 8, 9 reserved */
1395 IEEE80211_ELEMID_REQUEST = 10,
1396 IEEE80211_ELEMID_BSSLOAD = 11,
1397 IEEE80211_ELEMID_EDCA_PARAM_SET = 12,
1398 IEEE80211_ELEMID_TSPEC = 13,
1399 IEEE80211_ELEMID_TCLAS = 14,
1400 IEEE80211_ELEMID_SCHEDULE = 15,
1401 IEEE80211_ELEMID_CHALLENGE = 16,
1402 /* 17-31 reserved for challenge text extension */
1403 IEEE80211_ELEMID_PWRCNSTR = 32,
1404 IEEE80211_ELEMID_PWRCAP = 33,
1405 IEEE80211_ELEMID_TPCREQ = 34,
1406 IEEE80211_ELEMID_TPCREP = 35,
1407 IEEE80211_ELEMID_SUPPCHAN = 36,
1408 IEEE80211_ELEMID_CSA = 37,
1409 IEEE80211_ELEMID_MEASREQ = 38,
1410 IEEE80211_ELEMID_MEASREP = 39,
1411 IEEE80211_ELEMID_QUIET = 40,
1412 IEEE80211_ELEMID_IBSSDFS = 41,
1413 IEEE80211_ELEMID_ERP = 42,
1414 IEEE80211_ELEMID_TS_DELAY = 43,
1415 IEEE80211_ELEMID_TCLAS_PROCES = 44,
1416 IEEE80211_ELEMID_HTCAP = 45,
1417 IEEE80211_ELEMID_QOS = 46,
1418 /* 47 reserved */
1419 IEEE80211_ELEMID_RESERVED_47 = 47,
1420 IEEE80211_ELEMID_RSN = 48,
1421 /* 49 reserved */
1422 IEEE80211_ELEMID_XRATES = 50,
1423 IEEE80211_ELEMID_APCHANREP = 51,
1424 IEEE80211_ELEMID_NEIGHBOR_REP = 52,
1425 IEEE80211_ELEMID_RCPI = 53,
1426 IEEE80211_ELEMID_MOBILITY_DOMAIN = 54, /* MDE */
1427 IEEE80211_ELEMID_FAST_BSS_TRANS = 55, /* FTE */
1428 IEEE80211_ELEMID_TIMEOUT_INTVL = 56,
1429 IEEE80211_ELEMID_RIC_DATA = 57, /* RDE */
1430 IEEE80211_ELEMID_DSE_REG_LOC = 58,
1431 IEEE80211_ELEMID_SUP_OP_CLASS = 59,
1432 IEEE80211_ELEMID_EXT_CSA = 60,
1433 IEEE80211_ELEMID_HTINFO = 61, /* HTOPER */
1434 IEEE80211_ELEMID_SECCHAN_OFFSET = 62,
1435 IEEE80211_ELEMID_BSS_AVG_ACC_DELAY = 63,
1436 IEEE80211_ELEMID_ANTENNA = 64,
1437 IEEE80211_ELEMID_RSNI = 65,
1438 IEEE80211_ELEMID_MEAS_PILOT_TRANS = 66,
1439 IEEE80211_ELEMID_BSS_AVAIL_AD_CAP = 67,
1440 IEEE80211_ELEMID_BSS_AC_ACC_DELAY = 68,
1441 IEEE80211_ELEMID_TIME_ADV = 69,
1442 IEEE80211_ELEMID_RRM_ENACAPS = 70, /* RM_ENCAPS */
1443 IEEE80211_ELEMID_MULTIBSSID = 71,
1444 IEEE80211_ELEMID_COEX_2040 = 72,
1445 IEEE80211_ELEMID_2040_INTOL_CHAN_REPORT = 73,
1446 IEEE80211_ELEMID_OVERLAP_BSS_SCAN_PARAM = 74,
1447 IEEE80211_ELEMID_RIC_DESC = 75,
1448 IEEE80211_ELEMID_MGMT_MIC = 76,
1449 /* 77 reserved */
1450 IEEE80211_ELEMID_EVENT_REQ = 78,
1451 IEEE80211_ELEMID_EVENT_REP = 79,
1452 IEEE80211_ELEMID_DIAGNOSTIC_REQ = 80,
1453 IEEE80211_ELEMID_DIAGNOSTIC_REP = 81,
1454 IEEE80211_ELEMID_LOCATION_PARAM = 82,
1455 IEEE80211_ELEMID_NONTRANS_BSSID_CAP = 83,
1456 IEEE80211_ELEMID_SSID_LIST = 84,
1457 IEEE80211_ELEMID_MULTI_BSSID_IDX = 85,
1458 IEEE80211_ELEMID_FMS_DESC = 86,
1459 IEEE80211_ELEMID_FMS_REQ = 87,
1460 IEEE80211_ELEMID_FMS_RESP = 88,
1461 IEEE80211_ELEMID_QOS_TRAFFIC_CAP = 89,
1462 IEEE80211_ELEMID_BSS_MAX_IDLE_P = 90,
1463 IEEE80211_ELEMID_TSF_REQ = 91,
1464 IEEE80211_ELEMID_TSF_RESP = 92,
1465 IEEE80211_ELEMID_WNM_SLEEP_MODE = 93,
1466 IEEE80211_ELEMID_TIM_BCAST_REQ = 94,
1467 IEEE80211_ELEMID_TIM_BCAST_RESP = 95,
1468 IEEE80211_ELEMID_COL_INTERF_REP = 96,
1469 IEEE80211_ELEMID_CHAN_USAGE = 97,
1470 IEEE80211_ELEMID_TIME_ZONE = 98,
1471 IEEE80211_ELEMID_DMS_REQ = 99,
1472 IEEE80211_ELEMID_DMS_RESP = 100,
1473 IEEE80211_ELEMID_LINK_ID = 101,
1474 IEEE80211_ELEMID_WAKEUP_SCHED = 102,
1475 /* 103 reserved */
1476 IEEE80211_ELEMID_CHAN_SW_TIMING = 104,
1477 IEEE80211_ELEMID_PTI_CONTROL = 105,
1478 IEEE80211_ELEMID_TPU_BUF_STATUS = 106,
1479 IEEE80211_ELEMID_INTERWORKING = 107,
1480 IEEE80211_ELEMID_ADV_PROTO = 108,
1481 IEEE80211_ELEMID_EXP_BW_REQ = 109,
1482 IEEE80211_ELEMID_QOS_MAP = 110,
1483 IEEE80211_ELEMID_ROAM_CONSORT = 111,
1484 IEEE80211_ELEMID_EMERG_ALERT_ID = 112,
1485
1486 /*
1487 * 802.11s IEs
1488 * NB: On vanilla Linux still IEEE80211_ELEMID_MESHPEER = 55,
1489 * but they defined a new with id 117 called PEER_MGMT.
1490 * NB: complies with open80211
1491 */
1492 IEEE80211_ELEMID_MESHCONF = 113,
1493 IEEE80211_ELEMID_MESHID = 114,
1494 IEEE80211_ELEMID_MESHLINK = 115,
1495 IEEE80211_ELEMID_MESHCNGST = 116,
1496 IEEE80211_ELEMID_MESHPEER = 117,
1497 IEEE80211_ELEMID_MESHCSA = 118,
1498 IEEE80211_ELEMID_MESHTIM = 39, /* XXX: remove */
1499 IEEE80211_ELEMID_MESHAWAKEW = 119,
1500 IEEE80211_ELEMID_MESHBEACONT = 120,
1501 /* 121-124 MMCAOP not implemented yet */
1502 IEEE80211_ELEMID_MESHGANN = 125,
1503 IEEE80211_ELEMID_MESHRANN = 126,
1504 /* 127 Extended Capabilities */
1505 IEEE80211_ELEMID_EXTCAP = 127,
1506 /* 128-129 reserved */
1507 IEEE80211_ELEMID_MESHPREQ = 130,
1508 IEEE80211_ELEMID_MESHPREP = 131,
1509 IEEE80211_ELEMID_MESHPERR = 132,
1510 /* 133-136 reserved */
1511 IEEE80211_ELEMID_MESHPXU = 137,
1512 IEEE80211_ELEMID_MESHPXUC = 138,
1513 IEEE80211_ELEMID_MESHAH = 60, /* XXX: remove */
1514 /* XXX 139 */
1515
1516 IEEE80211_ELEMID_MIC = 140,
1517 IEEE80211_ELEMID_DEST_URI = 141,
1518 IEEE80211_ELEMID_U_APSD_COEX = 142,
1519 IEEE80211_ELEMID_DMG_WAKEUP_SCHED = 143,
1520 IEEE80211_ELEMID_EXT_SCHED = 144,
1521 IEEE80211_ELEMID_STA_AVAIL = 145,
1522 IEEE80211_ELEMID_DMG_TSPEC = 146,
1523 IEEE80211_ELEMID_NEXT_DMG_ATI = 147,
1524 IEEE80211_ELEMID_DMG_CAP = 148,
1525 /* 149-150 reserved. */
1526 IEEE80211_ELEMID_TPC = 150, /* XXX: remove */
1527 IEEE80211_ELEMID_DMG_OPER = 151,
1528 IEEE80211_ELEMID_DMG_BSS_PARAM_CHANGE = 152,
1529 IEEE80211_ELEMID_DMG_BEAM_REF = 153,
1530 IEEE80211_ELEMID_CHAN_MEAS_FEEDB = 154,
1531 /* 155-156 reserved. */
1532 IEEE80211_ELEMID_CCKM = 156, /* XXX: remove? */
1533 IEEE80211_ELEMID_AWAKE_WIN = 157,
1534 IEEE80211_ELEMID_MULTI_BAND = 158,
1535 IEEE80211_ELEMID_ADDBA_EXT = 159,
1536 IEEE80211_ELEMID_NEXTPCP_LIST = 160,
1537 IEEE80211_ELEMID_PCP_HANDOVER = 161,
1538 IEEE80211_ELEMID_DMG_LINK_MARGIN = 162,
1539 IEEE80211_ELEMID_SW_STREAM = 163,
1540 IEEE80211_ELEMID_SESS_TRANS = 164,
1541 /* 165 reserved. */
1542 IEEE80211_ELEMID_CLUSTER_REP = 166,
1543 IEEE80211_ELEMID_RELAY_CAP = 167,
1544 IEEE80211_ELEMID_RELAY_TRANS_PARAM_SET = 168,
1545 IEEE80211_ELEMID_BEAMLINK_MAINT = 169,
1546 IEEE80211_ELEMID_MULTI_MAC_SUBL = 170,
1547 IEEE80211_ELEMID_U_PID = 171,
1548 IEEE80211_ELEMID_DMG_LINK_ADAP_ACK = 172,
1549 /* 173 reserved. */
1550 IEEE80211_ELEMID_MCCAOP_ADV_OV = 174,
1551 IEEE80211_ELEMID_QUIET_PERIOD_REQ = 175,
1552 /* 176 reserved. */
1553 IEEE80211_ELEMID_QUIET_PERIOD_RESP = 177,
1554 /* 178-180 reserved. */
1555 IEEE80211_ELEMID_QMF_POLICY = 181,
1556 IEEE80211_ELEMID_ECAPC_POLICY = 182,
1557 IEEE80211_ELEMID_CLUSTER_TIME_OFFSET = 183,
1558 IEEE80211_ELEMID_INTRA_ACC_CAT_PRIO = 184,
1559 IEEE80211_ELEMID_SCS_DESCR = 185,
1560 IEEE80211_ELEMID_QLOAD_REPORT = 186,
1561 IEEE80211_ELEMID_HCCA_TXOP_UP_CNT = 187,
1562 IEEE80211_ELEMID_HL_STREAM_ID = 188,
1563 IEEE80211_ELEMID_GCR_GROUP_ADDR = 189,
1564 IEEE80211_ELEMID_ANTENNA_SECTOR_ID_PAT = 190,
1565 IEEE80211_ELEMID_VHT_CAP = 191,
1566 IEEE80211_ELEMID_VHT_OPMODE = 192,
1567 IEEE80211_ELEMID_EXTENDED_BSS_LOAD = 193,
1568 IEEE80211_ELEMID_WIDE_BW_CHAN_SW = 194,
1569 IEEE80211_ELEMID_VHT_PWR_ENV = 195, /* TX_PWR_ENV */
1570 IEEE80211_ELEMID_CHANNEL_SWITCH_WRAPPER = 196,
1571 IEEE80211_ELEMID_AID = 197,
1572 IEEE80211_ELEMID_QUIET_CHANNEL = 198,
1573 IEEE80211_ELEMID_OPMODE_NOTIF = 199,
1574 IEEE80211_ELEMID_UPSIM = 200,
1575 IEEE80211_ELEMID_RED_NEIGH_REP = 201,
1576 IEEE80211_ELEMID_TVHT_OP = 202,
1577 /* 203 reserved. */
1578 IEEE80211_ELEMID_DEVICE_LOC = 204,
1579 IEEE80211_ELEMID_WHITE_SPACE_MAP = 205,
1580 IEEE80211_ELEMID_FINE_TIME_MEAS_PARAM = 206,
1581 IEEE80211_ELEMID_SIG_OPEN_LOOP_LINK_MARGIN_IDX = 207,
1582 IEEE80211_ELEMID_RPS = 208,
1583 IEEE80211_ELEMID_PAGE_SLICE = 209,
1584 IEEE80211_ELEMID_AID_REQ = 210,
1585 IEEE80211_ELEMID_AID_RESP = 211,
1586 IEEE80211_ELEMID_SIG_SECTOR_OP = 212,
1587 IEEE80211_ELEMID_SIG_BEACON_COMPAT = 213,
1588 IEEE80211_ELEMID_SHORT_BEACON_INTVL = 214,
1589 IEEE80211_ELEMID_CHANGE_SEQ = 215,
1590 IEEE80211_ELEMID_TWT = 216,
1591 IEEE80211_ELEMID_SIG_CAPS = 217,
1592 /* 218-219 reserved. */
1593 IEEE80211_ELEMID_SUBCHAN_SELECT_TRANS = 220,
1594 IEEE80211_ELEMID_VENDOR = 221, /* vendor private */
1595 IEEE80211_ELEMID_AUTH_CONTROL = 222,
1596 IEEE80211_ELEMID_TSF_TIMER_ACC = 223,
1597 IEEE80211_ELEMID_S1G_RELAY = 224,
1598 IEEE80211_ELEMID_REACHABLE_ADDR = 225,
1599 IEEE80211_ELEMID_SIG_RELAY_DISC = 226,
1600 /* 227 reserved. */
1601 IEEE80211_ELEMID_AID_ANNOUNCEMENT = 228,
1602 IEEE80211_ELEMID_PV1_PROBE_RESP_OPT = 229,
1603 IEEE80211_ELEMID_EL_OP = 230,
1604 IEEE80211_ELEMID_SECTORIZED_GRP_ID_LIST = 231,
1605 IEEE80211_ELEMID_SIG_OP = 232,
1606 IEEE80211_ELEMID_HDR_COMPRESSION = 233,
1607 IEEE80211_ELEMID_SST_OP = 234,
1608 IEEE80211_ELEMID_MAD = 235,
1609 IEEE80211_ELEMID_SIG_RELAY_ACT = 236,
1610 IEEE80211_ELEMID_CAG_NUMBER = 237,
1611 /* 238 reserved. */
1612 IEEE80211_ELEMID_AP_CSN = 239,
1613 IEEE80211_ELEMID_FILS_INDICATION = 240,
1614 IEEE80211_ELEMID_DILS = 241,
1615 IEEE80211_ELEMID_FRAGMENT = 242,
1616 /* 243 reserved. */
1617 IEEE80211_ELEMID_RSN_EXT = 244,
1618 /* 245-254 reserved. */
1619 IEEE80211_ELEMID_EXTFIELD = 255
1620};
1621
1622enum ieee80211_elemid_ext {
1623 IEEE80211_ELEMID_EXT_ASSOC_DELAY_INFO = 1,
1624 IEEE80211_ELEMID_EXT_FILS_REQ_PARAMS = 2,
1625 IEEE80211_ELEMID_EXT_FILS_KEY_CONFIRM = 3,
1626 IEEE80211_ELEMID_EXT_FILS_SESSION = 4,
1627 IEEE80211_ELEMID_EXT_FILS_HLP_CONTAINER = 5,
1628 IEEE80211_ELEMID_EXT_FILS_IP_ADDR_ASSIGNMENT = 6,
1629 IEEE80211_ELEMID_EXT_KEY_DELIVERY = 7,
1630 IEEE80211_ELEMID_EXT_FILS_WRAPPED_DATA = 8,
1631 IEEE80211_ELEMID_EXT_FTM_SYNC_INFO = 9,
1632 IEEE80211_ELEMID_EXT_EXT_REQ = 10,
1633 IEEE80211_ELEMID_EXT_EST_SERVICE_PARAM_INBOUND = 11,
1634 IEEE80211_ELEMID_EXT_FILS_PUBLIC_KEY = 12,
1635 IEEE80211_ELEMID_EXT_FILS_NONCE = 13,
1636 IEEE80211_ELEMID_EXT_FUTURE_CHAN_GUIDANCE = 14,
1637 IEEE80211_ELEMID_EXT_SERVICE_HINT = 15,
1638 IEEE80211_ELEMID_EXT_SERVICE_HASH = 16,
1639 IEEE80211_ELEMID_EXT_CDMG_CAPA = 17,
1640 IEEE80211_ELEMID_EXT_DYN_BW_CTRL = 18,
1641 IEEE80211_ELEMID_EXT_CDMG_EXT_SCHEDULE = 19,
1642 IEEE80211_ELEMID_EXT_SSW_REPORT = 20,
1643 IEEE80211_ELEMID_EXT_CLUSTER_PROBE = 21,
1644 IEEE80211_ELEMID_EXT_EXT_CLUSTER_REPORT = 22,
1645 IEEE80211_ELEMID_EXT_CLUSTER_SW_ANNOUNCEMENT = 23,
1646 IEEE80211_ELEMID_EXT_ENHANCED_BEAM_TRACKING = 24,
1647 IEEE80211_ELEMID_EXT_SPSH_REPORT = 25,
1648 IEEE80211_ELEMID_EXT_CLUSTER_INTERF_ASSESS = 26,
1649 IEEE80211_ELEMID_EXT_CMMG_CAPA = 27,
1650 IEEE80211_ELEMID_EXT_CMMG_OPER = 28,
1651 IEEE80211_ELEMID_EXT_CMMG_OPMODE_NOTIF = 29,
1652 IEEE80211_ELEMID_EXT_CMMG_LINK_MARGIN = 30,
1653 IEEE80211_ELEMID_EXT_CMMG_LINK_ADAP_ACK = 31,
1654 /* 32 reserved. */
1655 IEEE80211_ELEMID_EXT_PASSWORD_ID = 33,
1656 IEEE80211_ELEMID_EXT_GLK_GCR_PARAM_SET = 34,
1657 IEEE80211_ELEMID_EXT_HE_CAPA = 35,
1658 IEEE80211_ELEMID_EXT_HE_OPER = 36,
1659 IEEE80211_ELEMID_EXT_UORA_PARAM_SET = 37,
1660 IEEE80211_ELEMID_EXT_MU_EDCA_PARAM_SET = 38,
1661 IEEE80211_ELEMID_EXT_SPATIAL_REUSE_PARAM_SET = 39,
1662 IEEE80211_ELEMID_EXT_GAS_EXTENSION = 40,
1663 IEEE80211_ELEMID_EXT_NDP_FEEDB_REPORT_PARAM = 41,
1664 IEEE80211_ELEMID_EXT_BSS_COLOR_CHG_ANNOUNCE = 42,
1665 IEEE80211_ELEMID_EXT_QUIET_TIMME_PERIOD = 43,
1666 IEEE80211_ELEMID_EXT_VENDOR_SPECIFIC_REQ_ELEM = 44,
1667 IEEE80211_ELEMID_EXT_ESS_REPORT = 45,
1668 IEEE80211_ELEMID_EXT_OPS = 46,
1669 IEEE80211_ELEMID_EXT_HE_BSS_LOAD = 47,
1670 /* 48-51 reserved. */
1671 IEEE80211_ELEMID_EXT_MAC_CH_SW_TIME = 52,
1672 IEEE80211_ELEMID_EXT_EST_SERVICE_PARAM_OUTBOUND = 53,
1673 IEEE80211_ELEMID_EXT_OCI = 54,
1674 IEEE80211_ELEMID_EXT_MULTI_BSSID_CONFIG = 55,
1675 IEEE80211_ELEMID_EXT_NON_INHERITANCE = 56,
1676 IEEE80211_ELEMID_EXT_KNOWN_BSSID = 57,
1677 IEEE80211_ELEMID_EXT_SHORT_SSID_LIST = 58,
1678 IEEE80211_ELEMID_EXT_HE_6GHZ_BAND_CAPA = 59,
1679 IEEE80211_ELEMID_EXT_ULMU_POWER_CAAP = 60,
1680 /* 61-87 reserved. */
1681 IEEE80211_ELEMID_EXT_MSCS_DESCRIPTOR = 88,
1682 IEEE80211_ELEMID_EXT_TCLAS_MASK = 89,
1683 IEEE80211_ELEMID_EXT_SUPPL_CLASS_2_CAPA = 90,
1684 IEEE80211_ELEMID_EXT_OCT_SOURCE = 91,
1685 IEEE80211_ELEMID_EXT_REJECTED_GROUPS = 92,
1686 IEEE80211_ELEMID_EXT_ANTI_CLOGGING_TAOKEN_CONTAINER = 93,
1687 /* 94-255 reserved. */
1688};
1689
1690struct ieee80211_tim_ie {
1691 uint8_t tim_ie; /* IEEE80211_ELEMID_TIM */
1692 uint8_t tim_len;
1693 uint8_t tim_count; /* DTIM count */
1694 uint8_t tim_period; /* DTIM period */
1695 uint8_t tim_bitctl; /* bitmap control */
1696 uint8_t tim_bitmap[1]; /* variable-length bitmap */
1697} __packed;
1698
1699struct ieee80211_country_ie {
1700 uint8_t ie; /* IEEE80211_ELEMID_COUNTRY */
1701 uint8_t len;
1702 uint8_t cc[3]; /* ISO CC+(I)ndoor/(O)utdoor */
1703 struct {
1704 uint8_t schan; /* starting channel */
1705 uint8_t nchan; /* number channels */
1706 uint8_t maxtxpwr; /* tx power cap */
1707 } __packed band[1]; /* sub bands (NB: var size) */
1708} __packed;
1709
1710#define IEEE80211_COUNTRY_MAX_BANDS 84 /* max possible bands */
1711#define IEEE80211_COUNTRY_MAX_SIZE \
1712 (sizeof(struct ieee80211_country_ie) + 3*(IEEE80211_COUNTRY_MAX_BANDS-1))
1713
1714struct ieee80211_bss_load_ie {
1715 uint8_t ie;
1716 uint8_t len;
1717 uint16_t sta_count; /* station count */
1718 uint8_t chan_load; /* channel utilization */
1719 uint8_t aac; /* available admission capacity */
1720} __packed;
1721
1722struct ieee80211_ap_chan_report_ie {
1723 uint8_t ie;
1724 uint8_t len;
1725 uint8_t i_class; /* operating class */
1726 /* Annex E, E.1 Country information and operating classes */
1727 uint8_t chan_list[0];
1728} __packed;
1729
1730#define IEEE80211_EXTCAP_CMS (1ULL << 0) /* 20/40 BSS coexistence management support */
1731#define IEEE80211_EXTCAP_RSVD_1 (1ULL << 1)
1732#define IEEE80211_EXTCAP_ECS (1ULL << 2) /* extended channel switching */
1733#define IEEE80211_EXTCAP_RSVD_3 (1ULL << 3)
1734#define IEEE80211_EXTCAP_PSMP_CAP (1ULL << 4) /* PSMP capability */
1735#define IEEE80211_EXTCAP_RSVD_5 (1ULL << 5)
1736#define IEEE80211_EXTCAP_S_PSMP_SUPP (1ULL << 6)
1737#define IEEE80211_EXTCAP_EVENT (1ULL << 7)
1738#define IEEE80211_EXTCAP_DIAGNOSTICS (1ULL << 8)
1739#define IEEE80211_EXTCAP_MCAST_DIAG (1ULL << 9)
1740#define IEEE80211_EXTCAP_LOC_TRACKING (1ULL << 10)
1741#define IEEE80211_EXTCAP_FMS (1ULL << 11)
1742#define IEEE80211_EXTCAP_PROXY_ARP (1ULL << 12)
1743#define IEEE80211_EXTCAP_CIR (1ULL << 13) /* collocated interference reporting */
1744#define IEEE80211_EXTCAP_CIVIC_LOC (1ULL << 14)
1745#define IEEE80211_EXTCAP_GEOSPATIAL_LOC (1ULL << 15)
1746#define IEEE80211_EXTCAP_TFS (1ULL << 16)
1747#define IEEE80211_EXTCAP_WNM_SLEEPMODE (1ULL << 17)
1748#define IEEE80211_EXTCAP_TIM_BROADCAST (1ULL << 18)
1749#define IEEE80211_EXTCAP_BSS_TRANSITION (1ULL << 19)
1750#define IEEE80211_EXTCAP_QOS_TRAF_CAP (1ULL << 20)
1751#define IEEE80211_EXTCAP_AC_STA_COUNT (1ULL << 21)
1752#define IEEE80211_EXTCAP_M_BSSID (1ULL << 22) /* multiple BSSID field */
1753#define IEEE80211_EXTCAP_TIMING_MEAS (1ULL << 23)
1754#define IEEE80211_EXTCAP_CHAN_USAGE (1ULL << 24)
1755#define IEEE80211_EXTCAP_SSID_LIST (1ULL << 25)
1756#define IEEE80211_EXTCAP_DMS (1ULL << 26)
1757#define IEEE80211_EXTCAP_UTC_TSF_OFFSET (1ULL << 27)
1758#define IEEE80211_EXTCAP_TLDS_BUF_STA_SUPP (1ULL << 28) /* TDLS peer U-APSP buffer STA support */
1759#define IEEE80211_EXTCAP_TLDS_PPSM_SUPP (1ULL << 29) /* TDLS peer PSM support */
1760#define IEEE80211_EXTCAP_TLDS_CH_SW (1ULL << 30) /* TDLS channel switching */
1761#define IEEE80211_EXTCAP_INTERWORKING (1ULL << 31)
1762#define IEEE80211_EXTCAP_QOSMAP (1ULL << 32)
1763#define IEEE80211_EXTCAP_EBR (1ULL << 33)
1764#define IEEE80211_EXTCAP_SSPN_IF (1ULL << 34)
1765#define IEEE80211_EXTCAP_RSVD_35 (1ULL << 35)
1766#define IEEE80211_EXTCAP_MSGCF_CAP (1ULL << 36)
1767#define IEEE80211_EXTCAP_TLDS_SUPP (1ULL << 37)
1768#define IEEE80211_EXTCAP_TLDS_PROHIB (1ULL << 38)
1769#define IEEE80211_EXTCAP_TLDS_CH_SW_PROHIB (1ULL << 39) /* TDLS channel switching prohibited */
1770#define IEEE80211_EXTCAP_RUF (1ULL << 40) /* reject unadmitted frame */
1771/* service interval granularity */
1772#define IEEE80211_EXTCAP_SIG \
1773 ((1ULL << 41) | (1ULL << 42) | (1ULL << 43))
1774#define IEEE80211_EXTCAP_ID_LOC (1ULL << 44)
1775#define IEEE80211_EXTCAP_U_APSD_COEX (1ULL << 45)
1776#define IEEE80211_EXTCAP_WNM_NOTIFICATION (1ULL << 46)
1777#define IEEE80211_EXTCAP_RSVD_47 (1ULL << 47)
1778#define IEEE80211_EXTCAP_SSID (1ULL << 48) /* UTF-8 SSID */
1779/* bits 49-n are reserved */
1780
1781struct ieee80211_extcap_ie {
1782 uint8_t ie;
1783 uint8_t len;
1784} __packed;
1785
1786/*
1787 * 802.11h Quiet Time Element.
1788 */
1789struct ieee80211_quiet_ie {
1790 uint8_t quiet_ie; /* IEEE80211_ELEMID_QUIET */
1791 uint8_t len;
1792 uint8_t tbttcount; /* quiet start */
1793 uint8_t period; /* beacon intervals between quiets */
1794 uint16_t duration; /* TUs of each quiet*/
1795 uint16_t offset; /* TUs of from TBTT of quiet start */
1796} __packed;
1797
1798/*
1799 * 802.11h Channel Switch Announcement (CSA).
1800 */
1801struct ieee80211_csa_ie {
1802 uint8_t csa_ie; /* IEEE80211_ELEMID_CHANSWITCHANN */
1803 uint8_t csa_len;
1804 uint8_t csa_mode; /* Channel Switch Mode */
1805 uint8_t csa_newchan; /* New Channel Number */
1806 uint8_t csa_count; /* Channel Switch Count */
1807} __packed;
1808
1809/*
1810 * Note the min acceptable CSA count is used to guard against
1811 * malicious CSA injection in station mode. Defining this value
1812 * as other than 0 violates the 11h spec.
1813 */
1814#define IEEE80211_CSA_COUNT_MIN 2
1815#define IEEE80211_CSA_COUNT_MAX 255
1816
1817/* rate set entries are in .5 Mb/s units, and potentially marked as basic */
1818#define IEEE80211_RATE_BASIC 0x80
1819#define IEEE80211_RATE_VAL 0x7f
1820#define IEEE80211_RV(v) ((v) & IEEE80211_RATE_VAL)
1821
1822/* ERP information element flags */
1823#define IEEE80211_ERP_NON_ERP_PRESENT 0x01
1824#define IEEE80211_ERP_USE_PROTECTION 0x02
1825#define IEEE80211_ERP_LONG_PREAMBLE 0x04
1826
1827#define IEEE80211_ERP_BITS \
1828 "\20\1NON_ERP_PRESENT\2USE_PROTECTION\3LONG_PREAMBLE"
1829
1830#define ATH_OUI 0x7f0300 /* Atheros OUI */
1831#define ATH_OUI_TYPE 0x01 /* Atheros protocol ie */
1832
1833/* NB: Atheros allocated the OUI for this purpose ~2005 but beware ... */
1834#define TDMA_OUI ATH_OUI
1835#define TDMA_OUI_TYPE 0x02 /* TDMA protocol ie */
1836
1837#define BCM_OUI 0x4c9000 /* Broadcom OUI */
1838#define BCM_OUI_HTCAP 51 /* pre-draft HTCAP ie */
1839#define BCM_OUI_HTINFO 52 /* pre-draft HTINFO ie */
1840
1841#define WPA_OUI 0xf25000
1842#define WPA_OUI_TYPE 0x01
1843#define WPA_VERSION 1 /* current supported version */
1844
1845#define WPA_CSE_NULL 0x00
1846#define WPA_CSE_WEP40 0x01
1847#define WPA_CSE_TKIP 0x02
1848#define WPA_CSE_CCMP 0x04 /* CCMP 128-bit */
1849#define WPA_CSE_WEP104 0x05
1850
1851#define WPA_ASE_NONE 0x00
1852#define WPA_ASE_8021X_UNSPEC 0x01
1853#define WPA_ASE_8021X_PSK 0x02
1854
1855#define WPS_OUI_TYPE 0x04
1856
1857/* 802.11-2016 Table 9-131 - Cipher Suite Selectors */
1858#define RSN_OUI 0xac0f00
1859#define RSN_VERSION 1 /* current supported version */
1860
1861/* RSN cipher suite element */
1862#define RSN_CSE_NULL 0
1863#define RSN_CSE_WEP40 1
1864#define RSN_CSE_TKIP 2
1865#define RSN_CSE_WRAP 3 /* Reserved in the 802.11-2016 */
1866#define RSN_CSE_CCMP 4 /* CCMP 128 bit */
1867#define RSN_CSE_WEP104 5
1868#define RSN_CSE_BIP_CMAC_128 6
1869/* 7 - "Group addressed traffic not allowed" */
1870#define RSN_CSE_GCMP_128 8
1871#define RSN_CSE_GCMP_256 9
1872#define RSN_CSE_CCMP_256 10
1873#define RSN_CSE_BIP_GMAC_128 11
1874#define RSN_CSE_BIP_GMAC_256 12
1875#define RSN_CSE_BIP_CMAC_256 13
1876
1877/* 802.11-2016 Table 9-133 - AKM suite selectors */
1878/* RSN AKM suite element */
1879#define RSN_ASE_NONE 0
1880#define RSN_ASE_8021X_UNSPEC 1
1881#define RSN_ASE_8021X_PSK 2
1882#define RSN_ASE_FT_8021X 3 /* SHA-256 */
1883#define RSN_ASE_FT_PSK 4 /* SHA-256 */
1884#define RSN_ASE_8021X_UNSPEC_SHA256 5
1885#define RSN_ASE_8021X_PSK_SHA256 6
1886#define RSN_ASE_8021X_TDLS 7 /* SHA-256 */
1887#define RSN_ASE_SAE_UNSPEC 8 /* SHA-256 */
1888#define RSN_ASE_FT_SAE 9 /* SHA-256 */
1889#define RSN_ASE_AP_PEERKEY 10 /* SHA-256 */
1890#define RSN_ASE_8021X_SUITE_B_SHA256 11
1891#define RSN_ASE_8021X_SUITE_B_SHA384 12
1892#define RSN_ASE_FT_8021X_SHA384 13
1893
1894/* 802.11-2016 Figure 9-257 - RSN Capabilities (2 byte field) */
1895#define RSN_CAP_PREAUTH 0x0001
1896#define RSN_CAP_NO_PAIRWISE 0x0002
1897#define RSN_CAP_PTKSA_REPLAY_COUNTER 0x000c /* 2 bit field */
1898#define RSN_CAP_GTKSA_REPLAY_COUNTER 0x0030 /* 2 bit field */
1899#define RSN_CAP_MFP_REQUIRED 0x0040
1900#define RSN_CAP_MFP_CAPABLE 0x0080
1901#define RSN_CAP_JOINT_MULTIBAND_RSNA 0x0100
1902#define RSN_CAP_PEERKEY_ENABLED 0x0200
1903#define RSN_CAP_SPP_AMSDU_CAPABLE 0x0400
1904#define RSN_CAP_SPP_AMSDU_REQUIRED 0x0800
1905#define RSN_CAP_PBAC_CAPABLE 0x1000
1906#define RSN_CAP_EXT_KEYID_CAPABLE 0x0200
1907
1908/* 802.11-2016 Table 9-134 PTKSA/GTKSA/STKSA replay counters usage */
1909#define RSN_CAP_REPLAY_COUNTER_1_PER 0
1910#define RSN_CAP_REPLAY_COUNTER_2_PER 1
1911#define RSN_CAP_REPLAY_COUNTER_4_PER 2
1912#define RSN_CAP_REPLAY_COUNTER_16_PER 3
1913
1914#define WME_OUI 0xf25000
1915#define WME_OUI_TYPE 0x02
1916#define WME_INFO_OUI_SUBTYPE 0x00
1917#define WME_PARAM_OUI_SUBTYPE 0x01
1918#define WME_VERSION 1
1919
1920/* WME stream classes */
1921#define WME_AC_BE 0 /* best effort */
1922#define WME_AC_BK 1 /* background */
1923#define WME_AC_VI 2 /* video */
1924#define WME_AC_VO 3 /* voice */
1925
1926/*
1927 * AUTH management packets
1928 *
1929 * octet algo[2]
1930 * octet seq[2]
1931 * octet status[2]
1932 * octet chal.id
1933 * octet chal.length
1934 * octet chal.text[253] NB: 1-253 bytes
1935 */
1936
1937/* challenge length for shared key auth */
1938#define IEEE80211_CHALLENGE_LEN 128
1939
1940#define IEEE80211_AUTH_ALG_OPEN 0x0000
1941#define IEEE80211_AUTH_ALG_SHARED 0x0001
1942#define IEEE80211_AUTH_ALG_LEAP 0x0080
1943
1944enum {
1945 IEEE80211_AUTH_OPEN_REQUEST = 1,
1946 IEEE80211_AUTH_OPEN_RESPONSE = 2,
1947};
1948
1949enum {
1950 IEEE80211_AUTH_SHARED_REQUEST = 1,
1951 IEEE80211_AUTH_SHARED_CHALLENGE = 2,
1952 IEEE80211_AUTH_SHARED_RESPONSE = 3,
1953 IEEE80211_AUTH_SHARED_PASS = 4,
1954};
1955
1956/*
1957 * Reason and status codes.
1958 *
1959 * Reason codes are used in management frames to indicate why an
1960 * action took place (e.g. on disassociation). Status codes are
1961 * used in management frames to indicate the result of an operation.
1962 *
1963 * Unlisted codes are reserved
1964 */
1965
1966enum {
1967 IEEE80211_REASON_UNSPECIFIED = 1,
1968 IEEE80211_REASON_AUTH_EXPIRE = 2,
1969 IEEE80211_REASON_AUTH_LEAVE = 3,
1970 IEEE80211_REASON_ASSOC_EXPIRE = 4,
1971 IEEE80211_REASON_ASSOC_TOOMANY = 5,
1972 IEEE80211_REASON_NOT_AUTHED = 6,
1973 IEEE80211_REASON_NOT_ASSOCED = 7,
1974 IEEE80211_REASON_ASSOC_LEAVE = 8,
1975 IEEE80211_REASON_ASSOC_NOT_AUTHED = 9,
1976 IEEE80211_REASON_DISASSOC_PWRCAP_BAD = 10, /* 11h */
1977 IEEE80211_REASON_DISASSOC_SUPCHAN_BAD = 11, /* 11h */
1978 IEEE80211_REASON_IE_INVALID = 13, /* 11i */
1979 IEEE80211_REASON_MIC_FAILURE = 14, /* 11i */
1980 IEEE80211_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, /* 11i */
1981 IEEE80211_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, /* 11i */
1982 IEEE80211_REASON_IE_IN_4WAY_DIFFERS = 17, /* 11i */
1983 IEEE80211_REASON_GROUP_CIPHER_INVALID = 18, /* 11i */
1984 IEEE80211_REASON_PAIRWISE_CIPHER_INVALID= 19, /* 11i */
1985 IEEE80211_REASON_AKMP_INVALID = 20, /* 11i */
1986 IEEE80211_REASON_UNSUPP_RSN_IE_VERSION = 21, /* 11i */
1987 IEEE80211_REASON_INVALID_RSN_IE_CAP = 22, /* 11i */
1988 IEEE80211_REASON_802_1X_AUTH_FAILED = 23, /* 11i */
1989 IEEE80211_REASON_CIPHER_SUITE_REJECTED = 24, /* 11i */
1990 IEEE80211_REASON_UNSPECIFIED_QOS = 32, /* 11e */
1991 IEEE80211_REASON_INSUFFICIENT_BW = 33, /* 11e */
1992 IEEE80211_REASON_TOOMANY_FRAMES = 34, /* 11e */
1993 IEEE80211_REASON_OUTSIDE_TXOP = 35, /* 11e */
1994 IEEE80211_REASON_LEAVING_QBSS = 36, /* 11e */
1995 IEEE80211_REASON_BAD_MECHANISM = 37, /* 11e */
1996 IEEE80211_REASON_SETUP_NEEDED = 38, /* 11e */
1997 IEEE80211_REASON_TIMEOUT = 39, /* 11e */
1998
1999 IEEE80211_REASON_PEER_LINK_CANCELED = 52, /* 11s */
2000 IEEE80211_REASON_MESH_MAX_PEERS = 53, /* 11s */
2001 IEEE80211_REASON_MESH_CPVIOLATION = 54, /* 11s */
2002 IEEE80211_REASON_MESH_CLOSE_RCVD = 55, /* 11s */
2003 IEEE80211_REASON_MESH_MAX_RETRIES = 56, /* 11s */
2004 IEEE80211_REASON_MESH_CONFIRM_TIMEOUT = 57, /* 11s */
2005 IEEE80211_REASON_MESH_INVALID_GTK = 58, /* 11s */
2006 IEEE80211_REASON_MESH_INCONS_PARAMS = 59, /* 11s */
2007 IEEE80211_REASON_MESH_INVALID_SECURITY = 60, /* 11s */
2008 IEEE80211_REASON_MESH_PERR_NO_PROXY = 61, /* 11s */
2009 IEEE80211_REASON_MESH_PERR_NO_FI = 62, /* 11s */
2010 IEEE80211_REASON_MESH_PERR_DEST_UNREACH = 63, /* 11s */
2011 IEEE80211_REASON_MESH_MAC_ALRDY_EXISTS_MBSS = 64, /* 11s */
2012 IEEE80211_REASON_MESH_CHAN_SWITCH_REG = 65, /* 11s */
2013 IEEE80211_REASON_MESH_CHAN_SWITCH_UNSPEC = 66, /* 11s */
2014
2015 IEEE80211_STATUS_SUCCESS = 0,
2016 IEEE80211_STATUS_UNSPECIFIED = 1,
2017 IEEE80211_STATUS_CAPINFO = 10,
2018 IEEE80211_STATUS_NOT_ASSOCED = 11,
2019 IEEE80211_STATUS_OTHER = 12,
2020 IEEE80211_STATUS_ALG = 13,
2021 IEEE80211_STATUS_SEQUENCE = 14,
2022 IEEE80211_STATUS_CHALLENGE = 15,
2023 IEEE80211_STATUS_TIMEOUT = 16,
2024 IEEE80211_STATUS_TOOMANY = 17,
2025 IEEE80211_STATUS_BASIC_RATE = 18,
2026 IEEE80211_STATUS_SP_REQUIRED = 19, /* 11b */
2027 IEEE80211_STATUS_PBCC_REQUIRED = 20, /* 11b */
2028 IEEE80211_STATUS_CA_REQUIRED = 21, /* 11b */
2029 IEEE80211_STATUS_SPECMGMT_REQUIRED = 22, /* 11h */
2030 IEEE80211_STATUS_PWRCAP_REQUIRED = 23, /* 11h */
2031 IEEE80211_STATUS_SUPCHAN_REQUIRED = 24, /* 11h */
2032 IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25, /* 11g */
2033 IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26, /* 11g */
2034 IEEE80211_STATUS_MISSING_HT_CAPS = 27, /* 11n D3.0 */
2035 IEEE80211_STATUS_INVALID_IE = 40, /* 11i */
2036 IEEE80211_STATUS_GROUP_CIPHER_INVALID = 41, /* 11i */
2037 IEEE80211_STATUS_PAIRWISE_CIPHER_INVALID = 42, /* 11i */
2038 IEEE80211_STATUS_AKMP_INVALID = 43, /* 11i */
2039 IEEE80211_STATUS_UNSUPP_RSN_IE_VERSION = 44, /* 11i */
2040 IEEE80211_STATUS_INVALID_RSN_IE_CAP = 45, /* 11i */
2041 IEEE80211_STATUS_CIPHER_SUITE_REJECTED = 46, /* 11i */
2042};
2043
2044#define IEEE80211_WEP_KEYLEN 5 /* 40bit */
2045#define IEEE80211_WEP_IVLEN 3 /* 24bit */
2046#define IEEE80211_WEP_KIDLEN 1 /* 1 octet */
2047#define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */
2048#define IEEE80211_WEP_TOTLEN (IEEE80211_WEP_IVLEN + \
2049 IEEE80211_WEP_KIDLEN + \
2050 IEEE80211_WEP_CRCLEN)
2051#define IEEE80211_WEP_NKID 4 /* number of key ids */
2052
2053/*
2054 * 802.11i defines an extended IV for use with non-WEP ciphers.
2055 * When the EXTIV bit is set in the key id byte an additional
2056 * 4 bytes immediately follow the IV for TKIP. For CCMP the
2057 * EXTIV bit is likewise set but the 8 bytes represent the
2058 * CCMP header rather than IV+extended-IV.
2059 */
2060#define IEEE80211_WEP_EXTIV 0x20
2061#define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */
2062#define IEEE80211_WEP_MICLEN 8 /* trailing MIC */
2063
2064#define IEEE80211_CRC_LEN 4
2065
2066/*
2067 * Maximum acceptable MTU is:
2068 * IEEE80211_MAX_LEN - WEP overhead - CRC -
2069 * QoS overhead - RSN/WPA overhead
2070 * Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default
2071 * mtu is Ethernet-compatible; it's set by ether_ifattach.
2072 */
2073#define IEEE80211_MTU_MAX 2290
2074#define IEEE80211_MTU_MIN 32
2075
2076#define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \
2077 (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
2078#define IEEE80211_ACK_LEN \
2079 (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
2080#define IEEE80211_MIN_LEN \
2081 (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
2082
2083/*
2084 * The 802.11 spec says at most 2007 stations may be
2085 * associated at once. For most AP's this is way more
2086 * than is feasible so we use a default of IEEE80211_AID_DEF.
2087 * This number may be overridden by the driver and/or by
2088 * user configuration but may not be less than IEEE80211_AID_MIN
2089 * (see _ieee80211.h for implementation-specific settings).
2090 */
2091#define IEEE80211_AID_MAX 2007
2092
2093#define IEEE80211_AID(b) ((b) &~ 0xc000)
2094
2095/*
2096 * RTS frame length parameters. The default is specified in
2097 * the 802.11 spec as 512; we treat it as implementation-dependent
2098 * so it's defined in ieee80211_var.h. The max may be wrong
2099 * for jumbo frames.
2100 */
2101#define IEEE80211_RTS_MIN 1
2102#define IEEE80211_RTS_MAX 2346
2103
2104/*
2105 * TX fragmentation parameters. As above for RTS, we treat
2106 * default as implementation-dependent so define it elsewhere.
2107 */
2108#define IEEE80211_FRAG_MIN 256
2109#define IEEE80211_FRAG_MAX 2346
2110
2111/*
2112 * Beacon interval (TU's). Min+max come from WiFi requirements.
2113 * As above, we treat default as implementation-dependent so
2114 * define it elsewhere.
2115 */
2116#define IEEE80211_BINTVAL_MAX 1000 /* max beacon interval (TU's) */
2117#define IEEE80211_BINTVAL_MIN 25 /* min beacon interval (TU's) */
2118
2119/*
2120 * DTIM period (beacons). Min+max are not really defined
2121 * by the protocol but we want them publicly visible so
2122 * define them here.
2123 */
2124#define IEEE80211_DTIM_MAX 15 /* max DTIM period */
2125#define IEEE80211_DTIM_MIN 1 /* min DTIM period */
2126
2127/*
2128 * Beacon miss threshold (beacons). As for DTIM, we define
2129 * them here to be publicly visible. Note the max may be
2130 * clamped depending on device capabilities.
2131 */
2132#define IEEE80211_HWBMISS_MIN 1
2133#define IEEE80211_HWBMISS_MAX 255
2134
2135/*
2136 * 802.11 frame duration definitions.
2137 */
2138
2139struct ieee80211_duration {
2140 uint16_t d_rts_dur;
2141 uint16_t d_data_dur;
2142 uint16_t d_plcp_len;
2143 uint8_t d_residue; /* unused octets in time slot */
2144};
2145
2146/* One Time Unit (TU) is 1Kus = 1024 microseconds. */
2147#define IEEE80211_DUR_TU 1024
2148
2149/* IEEE 802.11b durations for DSSS PHY in microseconds */
2150#define IEEE80211_DUR_DS_LONG_PREAMBLE 144
2151#define IEEE80211_DUR_DS_SHORT_PREAMBLE 72
2152
2153#define IEEE80211_DUR_DS_SLOW_PLCPHDR 48
2154#define IEEE80211_DUR_DS_FAST_PLCPHDR 24
2155#define IEEE80211_DUR_DS_SLOW_ACK 112
2156#define IEEE80211_DUR_DS_FAST_ACK 56
2157#define IEEE80211_DUR_DS_SLOW_CTS 112
2158#define IEEE80211_DUR_DS_FAST_CTS 56
2159
2160#define IEEE80211_DUR_DS_SLOT 20
2161#define IEEE80211_DUR_DS_SIFS 10
2162#define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT)
2163#define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \
2164 2 * IEEE80211_DUR_DS_SLOT)
2165#define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \
2166 IEEE80211_DUR_DS_SLOW_ACK + \
2167 IEEE80211_DUR_DS_LONG_PREAMBLE + \
2168 IEEE80211_DUR_DS_SLOW_PLCPHDR + \
2169 IEEE80211_DUR_DIFS)
2170
2171#endif /* _NET80211_IEEE80211_H_ */