cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ieee80211.h (139856B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * IEEE 802.11 defines
      4 *
      5 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
      6 * <jkmaline@cc.hut.fi>
      7 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
      8 * Copyright (c) 2005, Devicescape Software, Inc.
      9 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
     10 * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH
     11 * Copyright (c) 2016 - 2017 Intel Deutschland GmbH
     12 * Copyright (c) 2018 - 2022 Intel Corporation
     13 */
     14
     15#ifndef LINUX_IEEE80211_H
     16#define LINUX_IEEE80211_H
     17
     18#include <linux/types.h>
     19#include <linux/if_ether.h>
     20#include <linux/etherdevice.h>
     21#include <linux/bitfield.h>
     22#include <asm/byteorder.h>
     23#include <asm/unaligned.h>
     24
     25/*
     26 * DS bit usage
     27 *
     28 * TA = transmitter address
     29 * RA = receiver address
     30 * DA = destination address
     31 * SA = source address
     32 *
     33 * ToDS    FromDS  A1(RA)  A2(TA)  A3      A4      Use
     34 * -----------------------------------------------------------------
     35 *  0       0       DA      SA      BSSID   -       IBSS/DLS
     36 *  0       1       DA      BSSID   SA      -       AP -> STA
     37 *  1       0       BSSID   SA      DA      -       AP <- STA
     38 *  1       1       RA      TA      DA      SA      unspecified (WDS)
     39 */
     40
     41#define FCS_LEN 4
     42
     43#define IEEE80211_FCTL_VERS		0x0003
     44#define IEEE80211_FCTL_FTYPE		0x000c
     45#define IEEE80211_FCTL_STYPE		0x00f0
     46#define IEEE80211_FCTL_TODS		0x0100
     47#define IEEE80211_FCTL_FROMDS		0x0200
     48#define IEEE80211_FCTL_MOREFRAGS	0x0400
     49#define IEEE80211_FCTL_RETRY		0x0800
     50#define IEEE80211_FCTL_PM		0x1000
     51#define IEEE80211_FCTL_MOREDATA		0x2000
     52#define IEEE80211_FCTL_PROTECTED	0x4000
     53#define IEEE80211_FCTL_ORDER		0x8000
     54#define IEEE80211_FCTL_CTL_EXT		0x0f00
     55
     56#define IEEE80211_SCTL_FRAG		0x000F
     57#define IEEE80211_SCTL_SEQ		0xFFF0
     58
     59#define IEEE80211_FTYPE_MGMT		0x0000
     60#define IEEE80211_FTYPE_CTL		0x0004
     61#define IEEE80211_FTYPE_DATA		0x0008
     62#define IEEE80211_FTYPE_EXT		0x000c
     63
     64/* management */
     65#define IEEE80211_STYPE_ASSOC_REQ	0x0000
     66#define IEEE80211_STYPE_ASSOC_RESP	0x0010
     67#define IEEE80211_STYPE_REASSOC_REQ	0x0020
     68#define IEEE80211_STYPE_REASSOC_RESP	0x0030
     69#define IEEE80211_STYPE_PROBE_REQ	0x0040
     70#define IEEE80211_STYPE_PROBE_RESP	0x0050
     71#define IEEE80211_STYPE_BEACON		0x0080
     72#define IEEE80211_STYPE_ATIM		0x0090
     73#define IEEE80211_STYPE_DISASSOC	0x00A0
     74#define IEEE80211_STYPE_AUTH		0x00B0
     75#define IEEE80211_STYPE_DEAUTH		0x00C0
     76#define IEEE80211_STYPE_ACTION		0x00D0
     77
     78/* control */
     79#define IEEE80211_STYPE_CTL_EXT		0x0060
     80#define IEEE80211_STYPE_BACK_REQ	0x0080
     81#define IEEE80211_STYPE_BACK		0x0090
     82#define IEEE80211_STYPE_PSPOLL		0x00A0
     83#define IEEE80211_STYPE_RTS		0x00B0
     84#define IEEE80211_STYPE_CTS		0x00C0
     85#define IEEE80211_STYPE_ACK		0x00D0
     86#define IEEE80211_STYPE_CFEND		0x00E0
     87#define IEEE80211_STYPE_CFENDACK	0x00F0
     88
     89/* data */
     90#define IEEE80211_STYPE_DATA			0x0000
     91#define IEEE80211_STYPE_DATA_CFACK		0x0010
     92#define IEEE80211_STYPE_DATA_CFPOLL		0x0020
     93#define IEEE80211_STYPE_DATA_CFACKPOLL		0x0030
     94#define IEEE80211_STYPE_NULLFUNC		0x0040
     95#define IEEE80211_STYPE_CFACK			0x0050
     96#define IEEE80211_STYPE_CFPOLL			0x0060
     97#define IEEE80211_STYPE_CFACKPOLL		0x0070
     98#define IEEE80211_STYPE_QOS_DATA		0x0080
     99#define IEEE80211_STYPE_QOS_DATA_CFACK		0x0090
    100#define IEEE80211_STYPE_QOS_DATA_CFPOLL		0x00A0
    101#define IEEE80211_STYPE_QOS_DATA_CFACKPOLL	0x00B0
    102#define IEEE80211_STYPE_QOS_NULLFUNC		0x00C0
    103#define IEEE80211_STYPE_QOS_CFACK		0x00D0
    104#define IEEE80211_STYPE_QOS_CFPOLL		0x00E0
    105#define IEEE80211_STYPE_QOS_CFACKPOLL		0x00F0
    106
    107/* extension, added by 802.11ad */
    108#define IEEE80211_STYPE_DMG_BEACON		0x0000
    109#define IEEE80211_STYPE_S1G_BEACON		0x0010
    110
    111/* bits unique to S1G beacon */
    112#define IEEE80211_S1G_BCN_NEXT_TBTT	0x100
    113
    114/* see 802.11ah-2016 9.9 NDP CMAC frames */
    115#define IEEE80211_S1G_1MHZ_NDP_BITS	25
    116#define IEEE80211_S1G_1MHZ_NDP_BYTES	4
    117#define IEEE80211_S1G_2MHZ_NDP_BITS	37
    118#define IEEE80211_S1G_2MHZ_NDP_BYTES	5
    119
    120#define IEEE80211_NDP_FTYPE_CTS			0
    121#define IEEE80211_NDP_FTYPE_CF_END		0
    122#define IEEE80211_NDP_FTYPE_PS_POLL		1
    123#define IEEE80211_NDP_FTYPE_ACK			2
    124#define IEEE80211_NDP_FTYPE_PS_POLL_ACK		3
    125#define IEEE80211_NDP_FTYPE_BA			4
    126#define IEEE80211_NDP_FTYPE_BF_REPORT_POLL	5
    127#define IEEE80211_NDP_FTYPE_PAGING		6
    128#define IEEE80211_NDP_FTYPE_PREQ		7
    129
    130#define SM64(f, v)	((((u64)v) << f##_S) & f)
    131
    132/* NDP CMAC frame fields */
    133#define IEEE80211_NDP_FTYPE                    0x0000000000000007
    134#define IEEE80211_NDP_FTYPE_S                  0x0000000000000000
    135
    136/* 1M Probe Request 11ah 9.9.3.1.1 */
    137#define IEEE80211_NDP_1M_PREQ_ANO      0x0000000000000008
    138#define IEEE80211_NDP_1M_PREQ_ANO_S                     3
    139#define IEEE80211_NDP_1M_PREQ_CSSID    0x00000000000FFFF0
    140#define IEEE80211_NDP_1M_PREQ_CSSID_S                   4
    141#define IEEE80211_NDP_1M_PREQ_RTYPE    0x0000000000100000
    142#define IEEE80211_NDP_1M_PREQ_RTYPE_S                  20
    143#define IEEE80211_NDP_1M_PREQ_RSV      0x0000000001E00000
    144#define IEEE80211_NDP_1M_PREQ_RSV      0x0000000001E00000
    145/* 2M Probe Request 11ah 9.9.3.1.2 */
    146#define IEEE80211_NDP_2M_PREQ_ANO      0x0000000000000008
    147#define IEEE80211_NDP_2M_PREQ_ANO_S                     3
    148#define IEEE80211_NDP_2M_PREQ_CSSID    0x0000000FFFFFFFF0
    149#define IEEE80211_NDP_2M_PREQ_CSSID_S                   4
    150#define IEEE80211_NDP_2M_PREQ_RTYPE    0x0000001000000000
    151#define IEEE80211_NDP_2M_PREQ_RTYPE_S                  36
    152
    153#define IEEE80211_ANO_NETTYPE_WILD              15
    154
    155/* bits unique to S1G beacon */
    156#define IEEE80211_S1G_BCN_NEXT_TBTT    0x100
    157
    158/* control extension - for IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTL_EXT */
    159#define IEEE80211_CTL_EXT_POLL		0x2000
    160#define IEEE80211_CTL_EXT_SPR		0x3000
    161#define IEEE80211_CTL_EXT_GRANT	0x4000
    162#define IEEE80211_CTL_EXT_DMG_CTS	0x5000
    163#define IEEE80211_CTL_EXT_DMG_DTS	0x6000
    164#define IEEE80211_CTL_EXT_SSW		0x8000
    165#define IEEE80211_CTL_EXT_SSW_FBACK	0x9000
    166#define IEEE80211_CTL_EXT_SSW_ACK	0xa000
    167
    168
    169#define IEEE80211_SN_MASK		((IEEE80211_SCTL_SEQ) >> 4)
    170#define IEEE80211_MAX_SN		IEEE80211_SN_MASK
    171#define IEEE80211_SN_MODULO		(IEEE80211_MAX_SN + 1)
    172
    173
    174/* PV1 Layout 11ah 9.8.3.1 */
    175#define IEEE80211_PV1_FCTL_VERS		0x0003
    176#define IEEE80211_PV1_FCTL_FTYPE	0x001c
    177#define IEEE80211_PV1_FCTL_STYPE	0x00e0
    178#define IEEE80211_PV1_FCTL_TODS		0x0100
    179#define IEEE80211_PV1_FCTL_MOREFRAGS	0x0200
    180#define IEEE80211_PV1_FCTL_PM		0x0400
    181#define IEEE80211_PV1_FCTL_MOREDATA	0x0800
    182#define IEEE80211_PV1_FCTL_PROTECTED	0x1000
    183#define IEEE80211_PV1_FCTL_END_SP       0x2000
    184#define IEEE80211_PV1_FCTL_RELAYED      0x4000
    185#define IEEE80211_PV1_FCTL_ACK_POLICY   0x8000
    186#define IEEE80211_PV1_FCTL_CTL_EXT	0x0f00
    187
    188static inline bool ieee80211_sn_less(u16 sn1, u16 sn2)
    189{
    190	return ((sn1 - sn2) & IEEE80211_SN_MASK) > (IEEE80211_SN_MODULO >> 1);
    191}
    192
    193static inline u16 ieee80211_sn_add(u16 sn1, u16 sn2)
    194{
    195	return (sn1 + sn2) & IEEE80211_SN_MASK;
    196}
    197
    198static inline u16 ieee80211_sn_inc(u16 sn)
    199{
    200	return ieee80211_sn_add(sn, 1);
    201}
    202
    203static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
    204{
    205	return (sn1 - sn2) & IEEE80211_SN_MASK;
    206}
    207
    208#define IEEE80211_SEQ_TO_SN(seq)	(((seq) & IEEE80211_SCTL_SEQ) >> 4)
    209#define IEEE80211_SN_TO_SEQ(ssn)	(((ssn) << 4) & IEEE80211_SCTL_SEQ)
    210
    211/* miscellaneous IEEE 802.11 constants */
    212#define IEEE80211_MAX_FRAG_THRESHOLD	2352
    213#define IEEE80211_MAX_RTS_THRESHOLD	2353
    214#define IEEE80211_MAX_AID		2007
    215#define IEEE80211_MAX_AID_S1G		8191
    216#define IEEE80211_MAX_TIM_LEN		251
    217#define IEEE80211_MAX_MESH_PEERINGS	63
    218/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
    219   6.2.1.1.2.
    220
    221   802.11e clarifies the figure in section 7.1.2. The frame body is
    222   up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */
    223#define IEEE80211_MAX_DATA_LEN		2304
    224/* 802.11ad extends maximum MSDU size for DMG (freq > 40Ghz) networks
    225 * to 7920 bytes, see 8.2.3 General frame format
    226 */
    227#define IEEE80211_MAX_DATA_LEN_DMG	7920
    228/* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */
    229#define IEEE80211_MAX_FRAME_LEN		2352
    230
    231/* Maximal size of an A-MSDU that can be transported in a HT BA session */
    232#define IEEE80211_MAX_MPDU_LEN_HT_BA		4095
    233
    234/* Maximal size of an A-MSDU */
    235#define IEEE80211_MAX_MPDU_LEN_HT_3839		3839
    236#define IEEE80211_MAX_MPDU_LEN_HT_7935		7935
    237
    238#define IEEE80211_MAX_MPDU_LEN_VHT_3895		3895
    239#define IEEE80211_MAX_MPDU_LEN_VHT_7991		7991
    240#define IEEE80211_MAX_MPDU_LEN_VHT_11454	11454
    241
    242#define IEEE80211_MAX_SSID_LEN		32
    243
    244#define IEEE80211_MAX_MESH_ID_LEN	32
    245
    246#define IEEE80211_FIRST_TSPEC_TSID	8
    247#define IEEE80211_NUM_TIDS		16
    248
    249/* number of user priorities 802.11 uses */
    250#define IEEE80211_NUM_UPS		8
    251/* number of ACs */
    252#define IEEE80211_NUM_ACS		4
    253
    254#define IEEE80211_QOS_CTL_LEN		2
    255/* 1d tag mask */
    256#define IEEE80211_QOS_CTL_TAG1D_MASK		0x0007
    257/* TID mask */
    258#define IEEE80211_QOS_CTL_TID_MASK		0x000f
    259/* EOSP */
    260#define IEEE80211_QOS_CTL_EOSP			0x0010
    261/* ACK policy */
    262#define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL	0x0000
    263#define IEEE80211_QOS_CTL_ACK_POLICY_NOACK	0x0020
    264#define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL	0x0040
    265#define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK	0x0060
    266#define IEEE80211_QOS_CTL_ACK_POLICY_MASK	0x0060
    267/* A-MSDU 802.11n */
    268#define IEEE80211_QOS_CTL_A_MSDU_PRESENT	0x0080
    269/* Mesh Control 802.11s */
    270#define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT  0x0100
    271
    272/* Mesh Power Save Level */
    273#define IEEE80211_QOS_CTL_MESH_PS_LEVEL		0x0200
    274/* Mesh Receiver Service Period Initiated */
    275#define IEEE80211_QOS_CTL_RSPI			0x0400
    276
    277/* U-APSD queue for WMM IEs sent by AP */
    278#define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD	(1<<7)
    279#define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK	0x0f
    280
    281/* U-APSD queues for WMM IEs sent by STA */
    282#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO	(1<<0)
    283#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI	(1<<1)
    284#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK	(1<<2)
    285#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE	(1<<3)
    286#define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK	0x0f
    287
    288/* U-APSD max SP length for WMM IEs sent by STA */
    289#define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL	0x00
    290#define IEEE80211_WMM_IE_STA_QOSINFO_SP_2	0x01
    291#define IEEE80211_WMM_IE_STA_QOSINFO_SP_4	0x02
    292#define IEEE80211_WMM_IE_STA_QOSINFO_SP_6	0x03
    293#define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK	0x03
    294#define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT	5
    295
    296#define IEEE80211_HT_CTL_LEN		4
    297
    298struct ieee80211_hdr {
    299	__le16 frame_control;
    300	__le16 duration_id;
    301	u8 addr1[ETH_ALEN];
    302	u8 addr2[ETH_ALEN];
    303	u8 addr3[ETH_ALEN];
    304	__le16 seq_ctrl;
    305	u8 addr4[ETH_ALEN];
    306} __packed __aligned(2);
    307
    308struct ieee80211_hdr_3addr {
    309	__le16 frame_control;
    310	__le16 duration_id;
    311	u8 addr1[ETH_ALEN];
    312	u8 addr2[ETH_ALEN];
    313	u8 addr3[ETH_ALEN];
    314	__le16 seq_ctrl;
    315} __packed __aligned(2);
    316
    317struct ieee80211_qos_hdr {
    318	__le16 frame_control;
    319	__le16 duration_id;
    320	u8 addr1[ETH_ALEN];
    321	u8 addr2[ETH_ALEN];
    322	u8 addr3[ETH_ALEN];
    323	__le16 seq_ctrl;
    324	__le16 qos_ctrl;
    325} __packed __aligned(2);
    326
    327/**
    328 * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
    329 * @fc: frame control bytes in little-endian byteorder
    330 */
    331static inline bool ieee80211_has_tods(__le16 fc)
    332{
    333	return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
    334}
    335
    336/**
    337 * ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
    338 * @fc: frame control bytes in little-endian byteorder
    339 */
    340static inline bool ieee80211_has_fromds(__le16 fc)
    341{
    342	return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
    343}
    344
    345/**
    346 * ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and IEEE80211_FCTL_FROMDS are set
    347 * @fc: frame control bytes in little-endian byteorder
    348 */
    349static inline bool ieee80211_has_a4(__le16 fc)
    350{
    351	__le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
    352	return (fc & tmp) == tmp;
    353}
    354
    355/**
    356 * ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
    357 * @fc: frame control bytes in little-endian byteorder
    358 */
    359static inline bool ieee80211_has_morefrags(__le16 fc)
    360{
    361	return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
    362}
    363
    364/**
    365 * ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
    366 * @fc: frame control bytes in little-endian byteorder
    367 */
    368static inline bool ieee80211_has_retry(__le16 fc)
    369{
    370	return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
    371}
    372
    373/**
    374 * ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
    375 * @fc: frame control bytes in little-endian byteorder
    376 */
    377static inline bool ieee80211_has_pm(__le16 fc)
    378{
    379	return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
    380}
    381
    382/**
    383 * ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
    384 * @fc: frame control bytes in little-endian byteorder
    385 */
    386static inline bool ieee80211_has_moredata(__le16 fc)
    387{
    388	return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
    389}
    390
    391/**
    392 * ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
    393 * @fc: frame control bytes in little-endian byteorder
    394 */
    395static inline bool ieee80211_has_protected(__le16 fc)
    396{
    397	return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
    398}
    399
    400/**
    401 * ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
    402 * @fc: frame control bytes in little-endian byteorder
    403 */
    404static inline bool ieee80211_has_order(__le16 fc)
    405{
    406	return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
    407}
    408
    409/**
    410 * ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
    411 * @fc: frame control bytes in little-endian byteorder
    412 */
    413static inline bool ieee80211_is_mgmt(__le16 fc)
    414{
    415	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
    416	       cpu_to_le16(IEEE80211_FTYPE_MGMT);
    417}
    418
    419/**
    420 * ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
    421 * @fc: frame control bytes in little-endian byteorder
    422 */
    423static inline bool ieee80211_is_ctl(__le16 fc)
    424{
    425	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
    426	       cpu_to_le16(IEEE80211_FTYPE_CTL);
    427}
    428
    429/**
    430 * ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
    431 * @fc: frame control bytes in little-endian byteorder
    432 */
    433static inline bool ieee80211_is_data(__le16 fc)
    434{
    435	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
    436	       cpu_to_le16(IEEE80211_FTYPE_DATA);
    437}
    438
    439/**
    440 * ieee80211_is_ext - check if type is IEEE80211_FTYPE_EXT
    441 * @fc: frame control bytes in little-endian byteorder
    442 */
    443static inline bool ieee80211_is_ext(__le16 fc)
    444{
    445	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
    446	       cpu_to_le16(IEEE80211_FTYPE_EXT);
    447}
    448
    449
    450/**
    451 * ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA and IEEE80211_STYPE_QOS_DATA is set
    452 * @fc: frame control bytes in little-endian byteorder
    453 */
    454static inline bool ieee80211_is_data_qos(__le16 fc)
    455{
    456	/*
    457	 * mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
    458	 * to check the one bit
    459	 */
    460	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
    461	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
    462}
    463
    464/**
    465 * ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
    466 * @fc: frame control bytes in little-endian byteorder
    467 */
    468static inline bool ieee80211_is_data_present(__le16 fc)
    469{
    470	/*
    471	 * mask with 0x40 and test that that bit is clear to only return true
    472	 * for the data-containing substypes.
    473	 */
    474	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
    475	       cpu_to_le16(IEEE80211_FTYPE_DATA);
    476}
    477
    478/**
    479 * ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_REQ
    480 * @fc: frame control bytes in little-endian byteorder
    481 */
    482static inline bool ieee80211_is_assoc_req(__le16 fc)
    483{
    484	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    485	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
    486}
    487
    488/**
    489 * ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_RESP
    490 * @fc: frame control bytes in little-endian byteorder
    491 */
    492static inline bool ieee80211_is_assoc_resp(__le16 fc)
    493{
    494	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    495	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
    496}
    497
    498/**
    499 * ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_REQ
    500 * @fc: frame control bytes in little-endian byteorder
    501 */
    502static inline bool ieee80211_is_reassoc_req(__le16 fc)
    503{
    504	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    505	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
    506}
    507
    508/**
    509 * ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_RESP
    510 * @fc: frame control bytes in little-endian byteorder
    511 */
    512static inline bool ieee80211_is_reassoc_resp(__le16 fc)
    513{
    514	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    515	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
    516}
    517
    518/**
    519 * ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_REQ
    520 * @fc: frame control bytes in little-endian byteorder
    521 */
    522static inline bool ieee80211_is_probe_req(__le16 fc)
    523{
    524	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    525	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
    526}
    527
    528/**
    529 * ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_RESP
    530 * @fc: frame control bytes in little-endian byteorder
    531 */
    532static inline bool ieee80211_is_probe_resp(__le16 fc)
    533{
    534	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    535	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
    536}
    537
    538/**
    539 * ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_BEACON
    540 * @fc: frame control bytes in little-endian byteorder
    541 */
    542static inline bool ieee80211_is_beacon(__le16 fc)
    543{
    544	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    545	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
    546}
    547
    548/**
    549 * ieee80211_is_s1g_beacon - check if IEEE80211_FTYPE_EXT &&
    550 * IEEE80211_STYPE_S1G_BEACON
    551 * @fc: frame control bytes in little-endian byteorder
    552 */
    553static inline bool ieee80211_is_s1g_beacon(__le16 fc)
    554{
    555	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE |
    556				 IEEE80211_FCTL_STYPE)) ==
    557	       cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON);
    558}
    559
    560/**
    561 * ieee80211_next_tbtt_present - check if IEEE80211_FTYPE_EXT &&
    562 * IEEE80211_STYPE_S1G_BEACON && IEEE80211_S1G_BCN_NEXT_TBTT
    563 * @fc: frame control bytes in little-endian byteorder
    564 */
    565static inline bool ieee80211_next_tbtt_present(__le16 fc)
    566{
    567	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    568	       cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON) &&
    569	       fc & cpu_to_le16(IEEE80211_S1G_BCN_NEXT_TBTT);
    570}
    571
    572/**
    573 * ieee80211_is_s1g_short_beacon - check if next tbtt present bit is set. Only
    574 * true for S1G beacons when they're short.
    575 * @fc: frame control bytes in little-endian byteorder
    576 */
    577static inline bool ieee80211_is_s1g_short_beacon(__le16 fc)
    578{
    579	return ieee80211_is_s1g_beacon(fc) && ieee80211_next_tbtt_present(fc);
    580}
    581
    582/**
    583 * ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
    584 * @fc: frame control bytes in little-endian byteorder
    585 */
    586static inline bool ieee80211_is_atim(__le16 fc)
    587{
    588	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    589	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
    590}
    591
    592/**
    593 * ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DISASSOC
    594 * @fc: frame control bytes in little-endian byteorder
    595 */
    596static inline bool ieee80211_is_disassoc(__le16 fc)
    597{
    598	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    599	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
    600}
    601
    602/**
    603 * ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
    604 * @fc: frame control bytes in little-endian byteorder
    605 */
    606static inline bool ieee80211_is_auth(__le16 fc)
    607{
    608	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    609	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
    610}
    611
    612/**
    613 * ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DEAUTH
    614 * @fc: frame control bytes in little-endian byteorder
    615 */
    616static inline bool ieee80211_is_deauth(__le16 fc)
    617{
    618	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    619	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
    620}
    621
    622/**
    623 * ieee80211_is_action - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ACTION
    624 * @fc: frame control bytes in little-endian byteorder
    625 */
    626static inline bool ieee80211_is_action(__le16 fc)
    627{
    628	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    629	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
    630}
    631
    632/**
    633 * ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK_REQ
    634 * @fc: frame control bytes in little-endian byteorder
    635 */
    636static inline bool ieee80211_is_back_req(__le16 fc)
    637{
    638	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    639	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
    640}
    641
    642/**
    643 * ieee80211_is_back - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK
    644 * @fc: frame control bytes in little-endian byteorder
    645 */
    646static inline bool ieee80211_is_back(__le16 fc)
    647{
    648	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    649	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
    650}
    651
    652/**
    653 * ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_PSPOLL
    654 * @fc: frame control bytes in little-endian byteorder
    655 */
    656static inline bool ieee80211_is_pspoll(__le16 fc)
    657{
    658	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    659	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
    660}
    661
    662/**
    663 * ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
    664 * @fc: frame control bytes in little-endian byteorder
    665 */
    666static inline bool ieee80211_is_rts(__le16 fc)
    667{
    668	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    669	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
    670}
    671
    672/**
    673 * ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
    674 * @fc: frame control bytes in little-endian byteorder
    675 */
    676static inline bool ieee80211_is_cts(__le16 fc)
    677{
    678	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    679	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
    680}
    681
    682/**
    683 * ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
    684 * @fc: frame control bytes in little-endian byteorder
    685 */
    686static inline bool ieee80211_is_ack(__le16 fc)
    687{
    688	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    689	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
    690}
    691
    692/**
    693 * ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
    694 * @fc: frame control bytes in little-endian byteorder
    695 */
    696static inline bool ieee80211_is_cfend(__le16 fc)
    697{
    698	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    699	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
    700}
    701
    702/**
    703 * ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFENDACK
    704 * @fc: frame control bytes in little-endian byteorder
    705 */
    706static inline bool ieee80211_is_cfendack(__le16 fc)
    707{
    708	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    709	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
    710}
    711
    712/**
    713 * ieee80211_is_nullfunc - check if frame is a regular (non-QoS) nullfunc frame
    714 * @fc: frame control bytes in little-endian byteorder
    715 */
    716static inline bool ieee80211_is_nullfunc(__le16 fc)
    717{
    718	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    719	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
    720}
    721
    722/**
    723 * ieee80211_is_qos_nullfunc - check if frame is a QoS nullfunc frame
    724 * @fc: frame control bytes in little-endian byteorder
    725 */
    726static inline bool ieee80211_is_qos_nullfunc(__le16 fc)
    727{
    728	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
    729	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
    730}
    731
    732/**
    733 * ieee80211_is_any_nullfunc - check if frame is regular or QoS nullfunc frame
    734 * @fc: frame control bytes in little-endian byteorder
    735 */
    736static inline bool ieee80211_is_any_nullfunc(__le16 fc)
    737{
    738	return (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc));
    739}
    740
    741/**
    742 * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
    743 * @fc: frame control field in little-endian byteorder
    744 */
    745static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
    746{
    747	/* IEEE 802.11-2012, definition of "bufferable management frame";
    748	 * note that this ignores the IBSS special case. */
    749	return ieee80211_is_mgmt(fc) &&
    750	       (ieee80211_is_action(fc) ||
    751		ieee80211_is_disassoc(fc) ||
    752		ieee80211_is_deauth(fc));
    753}
    754
    755/**
    756 * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
    757 * @seq_ctrl: frame sequence control bytes in little-endian byteorder
    758 */
    759static inline bool ieee80211_is_first_frag(__le16 seq_ctrl)
    760{
    761	return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0;
    762}
    763
    764/**
    765 * ieee80211_is_frag - check if a frame is a fragment
    766 * @hdr: 802.11 header of the frame
    767 */
    768static inline bool ieee80211_is_frag(struct ieee80211_hdr *hdr)
    769{
    770	return ieee80211_has_morefrags(hdr->frame_control) ||
    771	       hdr->seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG);
    772}
    773
    774struct ieee80211s_hdr {
    775	u8 flags;
    776	u8 ttl;
    777	__le32 seqnum;
    778	u8 eaddr1[ETH_ALEN];
    779	u8 eaddr2[ETH_ALEN];
    780} __packed __aligned(2);
    781
    782/* Mesh flags */
    783#define MESH_FLAGS_AE_A4 	0x1
    784#define MESH_FLAGS_AE_A5_A6	0x2
    785#define MESH_FLAGS_AE		0x3
    786#define MESH_FLAGS_PS_DEEP	0x4
    787
    788/**
    789 * enum ieee80211_preq_flags - mesh PREQ element flags
    790 *
    791 * @IEEE80211_PREQ_PROACTIVE_PREP_FLAG: proactive PREP subfield
    792 */
    793enum ieee80211_preq_flags {
    794	IEEE80211_PREQ_PROACTIVE_PREP_FLAG	= 1<<2,
    795};
    796
    797/**
    798 * enum ieee80211_preq_target_flags - mesh PREQ element per target flags
    799 *
    800 * @IEEE80211_PREQ_TO_FLAG: target only subfield
    801 * @IEEE80211_PREQ_USN_FLAG: unknown target HWMP sequence number subfield
    802 */
    803enum ieee80211_preq_target_flags {
    804	IEEE80211_PREQ_TO_FLAG	= 1<<0,
    805	IEEE80211_PREQ_USN_FLAG	= 1<<2,
    806};
    807
    808/**
    809 * struct ieee80211_quiet_ie
    810 *
    811 * This structure refers to "Quiet information element"
    812 */
    813struct ieee80211_quiet_ie {
    814	u8 count;
    815	u8 period;
    816	__le16 duration;
    817	__le16 offset;
    818} __packed;
    819
    820/**
    821 * struct ieee80211_msrment_ie
    822 *
    823 * This structure refers to "Measurement Request/Report information element"
    824 */
    825struct ieee80211_msrment_ie {
    826	u8 token;
    827	u8 mode;
    828	u8 type;
    829	u8 request[];
    830} __packed;
    831
    832/**
    833 * struct ieee80211_channel_sw_ie
    834 *
    835 * This structure refers to "Channel Switch Announcement information element"
    836 */
    837struct ieee80211_channel_sw_ie {
    838	u8 mode;
    839	u8 new_ch_num;
    840	u8 count;
    841} __packed;
    842
    843/**
    844 * struct ieee80211_ext_chansw_ie
    845 *
    846 * This structure represents the "Extended Channel Switch Announcement element"
    847 */
    848struct ieee80211_ext_chansw_ie {
    849	u8 mode;
    850	u8 new_operating_class;
    851	u8 new_ch_num;
    852	u8 count;
    853} __packed;
    854
    855/**
    856 * struct ieee80211_sec_chan_offs_ie - secondary channel offset IE
    857 * @sec_chan_offs: secondary channel offset, uses IEEE80211_HT_PARAM_CHA_SEC_*
    858 *	values here
    859 * This structure represents the "Secondary Channel Offset element"
    860 */
    861struct ieee80211_sec_chan_offs_ie {
    862	u8 sec_chan_offs;
    863} __packed;
    864
    865/**
    866 * struct ieee80211_mesh_chansw_params_ie - mesh channel switch parameters IE
    867 *
    868 * This structure represents the "Mesh Channel Switch Paramters element"
    869 */
    870struct ieee80211_mesh_chansw_params_ie {
    871	u8 mesh_ttl;
    872	u8 mesh_flags;
    873	__le16 mesh_reason;
    874	__le16 mesh_pre_value;
    875} __packed;
    876
    877/**
    878 * struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE
    879 */
    880struct ieee80211_wide_bw_chansw_ie {
    881	u8 new_channel_width;
    882	u8 new_center_freq_seg0, new_center_freq_seg1;
    883} __packed;
    884
    885/**
    886 * struct ieee80211_tim
    887 *
    888 * This structure refers to "Traffic Indication Map information element"
    889 */
    890struct ieee80211_tim_ie {
    891	u8 dtim_count;
    892	u8 dtim_period;
    893	u8 bitmap_ctrl;
    894	/* variable size: 1 - 251 bytes */
    895	u8 virtual_map[1];
    896} __packed;
    897
    898/**
    899 * struct ieee80211_meshconf_ie
    900 *
    901 * This structure refers to "Mesh Configuration information element"
    902 */
    903struct ieee80211_meshconf_ie {
    904	u8 meshconf_psel;
    905	u8 meshconf_pmetric;
    906	u8 meshconf_congest;
    907	u8 meshconf_synch;
    908	u8 meshconf_auth;
    909	u8 meshconf_form;
    910	u8 meshconf_cap;
    911} __packed;
    912
    913/**
    914 * enum mesh_config_capab_flags - Mesh Configuration IE capability field flags
    915 *
    916 * @IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS: STA is willing to establish
    917 *	additional mesh peerings with other mesh STAs
    918 * @IEEE80211_MESHCONF_CAPAB_FORWARDING: the STA forwards MSDUs
    919 * @IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING: TBTT adjustment procedure
    920 *	is ongoing
    921 * @IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL: STA is in deep sleep mode or has
    922 *	neighbors in deep sleep mode
    923 */
    924enum mesh_config_capab_flags {
    925	IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS		= 0x01,
    926	IEEE80211_MESHCONF_CAPAB_FORWARDING		= 0x08,
    927	IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING		= 0x20,
    928	IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL	= 0x40,
    929};
    930
    931#define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1
    932
    933/**
    934 * mesh channel switch parameters element's flag indicator
    935 *
    936 */
    937#define WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT BIT(0)
    938#define WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR BIT(1)
    939#define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2)
    940
    941/**
    942 * struct ieee80211_rann_ie
    943 *
    944 * This structure refers to "Root Announcement information element"
    945 */
    946struct ieee80211_rann_ie {
    947	u8 rann_flags;
    948	u8 rann_hopcount;
    949	u8 rann_ttl;
    950	u8 rann_addr[ETH_ALEN];
    951	__le32 rann_seq;
    952	__le32 rann_interval;
    953	__le32 rann_metric;
    954} __packed;
    955
    956enum ieee80211_rann_flags {
    957	RANN_FLAG_IS_GATE = 1 << 0,
    958};
    959
    960enum ieee80211_ht_chanwidth_values {
    961	IEEE80211_HT_CHANWIDTH_20MHZ = 0,
    962	IEEE80211_HT_CHANWIDTH_ANY = 1,
    963};
    964
    965/**
    966 * enum ieee80211_opmode_bits - VHT operating mode field bits
    967 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask
    968 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width
    969 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width
    970 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ: 80 MHz channel width
    971 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ: 160 MHz or 80+80 MHz channel width
    972 * @IEEE80211_OPMODE_NOTIF_BW_160_80P80: 160 / 80+80 MHz indicator flag
    973 * @IEEE80211_OPMODE_NOTIF_RX_NSS_MASK: number of spatial streams mask
    974 *	(the NSS value is the value of this field + 1)
    975 * @IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT: number of spatial streams shift
    976 * @IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF: indicates streams in SU-MIMO PPDU
    977 *	using a beamforming steering matrix
    978 */
    979enum ieee80211_vht_opmode_bits {
    980	IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK	= 0x03,
    981	IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ	= 0,
    982	IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ	= 1,
    983	IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ	= 2,
    984	IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ	= 3,
    985	IEEE80211_OPMODE_NOTIF_BW_160_80P80	= 0x04,
    986	IEEE80211_OPMODE_NOTIF_RX_NSS_MASK	= 0x70,
    987	IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT	= 4,
    988	IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF	= 0x80,
    989};
    990
    991/**
    992 * enum ieee80211_s1g_chanwidth
    993 * These are defined in IEEE802.11-2016ah Table 10-20
    994 * as BSS Channel Width
    995 *
    996 * @IEEE80211_S1G_CHANWIDTH_1MHZ: 1MHz operating channel
    997 * @IEEE80211_S1G_CHANWIDTH_2MHZ: 2MHz operating channel
    998 * @IEEE80211_S1G_CHANWIDTH_4MHZ: 4MHz operating channel
    999 * @IEEE80211_S1G_CHANWIDTH_8MHZ: 8MHz operating channel
   1000 * @IEEE80211_S1G_CHANWIDTH_16MHZ: 16MHz operating channel
   1001 */
   1002enum ieee80211_s1g_chanwidth {
   1003	IEEE80211_S1G_CHANWIDTH_1MHZ = 0,
   1004	IEEE80211_S1G_CHANWIDTH_2MHZ = 1,
   1005	IEEE80211_S1G_CHANWIDTH_4MHZ = 3,
   1006	IEEE80211_S1G_CHANWIDTH_8MHZ = 7,
   1007	IEEE80211_S1G_CHANWIDTH_16MHZ = 15,
   1008};
   1009
   1010#define WLAN_SA_QUERY_TR_ID_LEN 2
   1011#define WLAN_MEMBERSHIP_LEN 8
   1012#define WLAN_USER_POSITION_LEN 16
   1013
   1014/**
   1015 * struct ieee80211_tpc_report_ie
   1016 *
   1017 * This structure refers to "TPC Report element"
   1018 */
   1019struct ieee80211_tpc_report_ie {
   1020	u8 tx_power;
   1021	u8 link_margin;
   1022} __packed;
   1023
   1024#define IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK	GENMASK(2, 1)
   1025#define IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT	1
   1026#define IEEE80211_ADDBA_EXT_NO_FRAG		BIT(0)
   1027#define IEEE80211_ADDBA_EXT_BUF_SIZE_MASK	GENMASK(7, 5)
   1028#define IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT	10
   1029
   1030struct ieee80211_addba_ext_ie {
   1031	u8 data;
   1032} __packed;
   1033
   1034/**
   1035 * struct ieee80211_s1g_bcn_compat_ie
   1036 *
   1037 * S1G Beacon Compatibility element
   1038 */
   1039struct ieee80211_s1g_bcn_compat_ie {
   1040	__le16 compat_info;
   1041	__le16 beacon_int;
   1042	__le32 tsf_completion;
   1043} __packed;
   1044
   1045/**
   1046 * struct ieee80211_s1g_oper_ie
   1047 *
   1048 * S1G Operation element
   1049 */
   1050struct ieee80211_s1g_oper_ie {
   1051	u8 ch_width;
   1052	u8 oper_class;
   1053	u8 primary_ch;
   1054	u8 oper_ch;
   1055	__le16 basic_mcs_nss;
   1056} __packed;
   1057
   1058/**
   1059 * struct ieee80211_aid_response_ie
   1060 *
   1061 * AID Response element
   1062 */
   1063struct ieee80211_aid_response_ie {
   1064	__le16 aid;
   1065	u8 switch_count;
   1066	__le16 response_int;
   1067} __packed;
   1068
   1069struct ieee80211_s1g_cap {
   1070	u8 capab_info[10];
   1071	u8 supp_mcs_nss[5];
   1072} __packed;
   1073
   1074struct ieee80211_ext {
   1075	__le16 frame_control;
   1076	__le16 duration;
   1077	union {
   1078		struct {
   1079			u8 sa[ETH_ALEN];
   1080			__le32 timestamp;
   1081			u8 change_seq;
   1082			u8 variable[0];
   1083		} __packed s1g_beacon;
   1084		struct {
   1085			u8 sa[ETH_ALEN];
   1086			__le32 timestamp;
   1087			u8 change_seq;
   1088			u8 next_tbtt[3];
   1089			u8 variable[0];
   1090		} __packed s1g_short_beacon;
   1091	} u;
   1092} __packed __aligned(2);
   1093
   1094#define IEEE80211_TWT_CONTROL_NDP			BIT(0)
   1095#define IEEE80211_TWT_CONTROL_RESP_MODE			BIT(1)
   1096#define IEEE80211_TWT_CONTROL_NEG_TYPE_BROADCAST	BIT(3)
   1097#define IEEE80211_TWT_CONTROL_RX_DISABLED		BIT(4)
   1098#define IEEE80211_TWT_CONTROL_WAKE_DUR_UNIT		BIT(5)
   1099
   1100#define IEEE80211_TWT_REQTYPE_REQUEST			BIT(0)
   1101#define IEEE80211_TWT_REQTYPE_SETUP_CMD			GENMASK(3, 1)
   1102#define IEEE80211_TWT_REQTYPE_TRIGGER			BIT(4)
   1103#define IEEE80211_TWT_REQTYPE_IMPLICIT			BIT(5)
   1104#define IEEE80211_TWT_REQTYPE_FLOWTYPE			BIT(6)
   1105#define IEEE80211_TWT_REQTYPE_FLOWID			GENMASK(9, 7)
   1106#define IEEE80211_TWT_REQTYPE_WAKE_INT_EXP		GENMASK(14, 10)
   1107#define IEEE80211_TWT_REQTYPE_PROTECTION		BIT(15)
   1108
   1109enum ieee80211_twt_setup_cmd {
   1110	TWT_SETUP_CMD_REQUEST,
   1111	TWT_SETUP_CMD_SUGGEST,
   1112	TWT_SETUP_CMD_DEMAND,
   1113	TWT_SETUP_CMD_GROUPING,
   1114	TWT_SETUP_CMD_ACCEPT,
   1115	TWT_SETUP_CMD_ALTERNATE,
   1116	TWT_SETUP_CMD_DICTATE,
   1117	TWT_SETUP_CMD_REJECT,
   1118};
   1119
   1120struct ieee80211_twt_params {
   1121	__le16 req_type;
   1122	__le64 twt;
   1123	u8 min_twt_dur;
   1124	__le16 mantissa;
   1125	u8 channel;
   1126} __packed;
   1127
   1128struct ieee80211_twt_setup {
   1129	u8 dialog_token;
   1130	u8 element_id;
   1131	u8 length;
   1132	u8 control;
   1133	u8 params[];
   1134} __packed;
   1135
   1136struct ieee80211_mgmt {
   1137	__le16 frame_control;
   1138	__le16 duration;
   1139	u8 da[ETH_ALEN];
   1140	u8 sa[ETH_ALEN];
   1141	u8 bssid[ETH_ALEN];
   1142	__le16 seq_ctrl;
   1143	union {
   1144		struct {
   1145			__le16 auth_alg;
   1146			__le16 auth_transaction;
   1147			__le16 status_code;
   1148			/* possibly followed by Challenge text */
   1149			u8 variable[];
   1150		} __packed auth;
   1151		struct {
   1152			__le16 reason_code;
   1153		} __packed deauth;
   1154		struct {
   1155			__le16 capab_info;
   1156			__le16 listen_interval;
   1157			/* followed by SSID and Supported rates */
   1158			u8 variable[];
   1159		} __packed assoc_req;
   1160		struct {
   1161			__le16 capab_info;
   1162			__le16 status_code;
   1163			__le16 aid;
   1164			/* followed by Supported rates */
   1165			u8 variable[];
   1166		} __packed assoc_resp, reassoc_resp;
   1167		struct {
   1168			__le16 capab_info;
   1169			__le16 status_code;
   1170			u8 variable[];
   1171		} __packed s1g_assoc_resp, s1g_reassoc_resp;
   1172		struct {
   1173			__le16 capab_info;
   1174			__le16 listen_interval;
   1175			u8 current_ap[ETH_ALEN];
   1176			/* followed by SSID and Supported rates */
   1177			u8 variable[];
   1178		} __packed reassoc_req;
   1179		struct {
   1180			__le16 reason_code;
   1181		} __packed disassoc;
   1182		struct {
   1183			__le64 timestamp;
   1184			__le16 beacon_int;
   1185			__le16 capab_info;
   1186			/* followed by some of SSID, Supported rates,
   1187			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
   1188			u8 variable[];
   1189		} __packed beacon;
   1190		struct {
   1191			/* only variable items: SSID, Supported rates */
   1192			DECLARE_FLEX_ARRAY(u8, variable);
   1193		} __packed probe_req;
   1194		struct {
   1195			__le64 timestamp;
   1196			__le16 beacon_int;
   1197			__le16 capab_info;
   1198			/* followed by some of SSID, Supported rates,
   1199			 * FH Params, DS Params, CF Params, IBSS Params */
   1200			u8 variable[];
   1201		} __packed probe_resp;
   1202		struct {
   1203			u8 category;
   1204			union {
   1205				struct {
   1206					u8 action_code;
   1207					u8 dialog_token;
   1208					u8 status_code;
   1209					u8 variable[];
   1210				} __packed wme_action;
   1211				struct{
   1212					u8 action_code;
   1213					u8 variable[];
   1214				} __packed chan_switch;
   1215				struct{
   1216					u8 action_code;
   1217					struct ieee80211_ext_chansw_ie data;
   1218					u8 variable[];
   1219				} __packed ext_chan_switch;
   1220				struct{
   1221					u8 action_code;
   1222					u8 dialog_token;
   1223					u8 element_id;
   1224					u8 length;
   1225					struct ieee80211_msrment_ie msr_elem;
   1226				} __packed measurement;
   1227				struct{
   1228					u8 action_code;
   1229					u8 dialog_token;
   1230					__le16 capab;
   1231					__le16 timeout;
   1232					__le16 start_seq_num;
   1233					/* followed by BA Extension */
   1234					u8 variable[];
   1235				} __packed addba_req;
   1236				struct{
   1237					u8 action_code;
   1238					u8 dialog_token;
   1239					__le16 status;
   1240					__le16 capab;
   1241					__le16 timeout;
   1242				} __packed addba_resp;
   1243				struct{
   1244					u8 action_code;
   1245					__le16 params;
   1246					__le16 reason_code;
   1247				} __packed delba;
   1248				struct {
   1249					u8 action_code;
   1250					u8 variable[];
   1251				} __packed self_prot;
   1252				struct{
   1253					u8 action_code;
   1254					u8 variable[];
   1255				} __packed mesh_action;
   1256				struct {
   1257					u8 action;
   1258					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
   1259				} __packed sa_query;
   1260				struct {
   1261					u8 action;
   1262					u8 smps_control;
   1263				} __packed ht_smps;
   1264				struct {
   1265					u8 action_code;
   1266					u8 chanwidth;
   1267				} __packed ht_notify_cw;
   1268				struct {
   1269					u8 action_code;
   1270					u8 dialog_token;
   1271					__le16 capability;
   1272					u8 variable[0];
   1273				} __packed tdls_discover_resp;
   1274				struct {
   1275					u8 action_code;
   1276					u8 operating_mode;
   1277				} __packed vht_opmode_notif;
   1278				struct {
   1279					u8 action_code;
   1280					u8 membership[WLAN_MEMBERSHIP_LEN];
   1281					u8 position[WLAN_USER_POSITION_LEN];
   1282				} __packed vht_group_notif;
   1283				struct {
   1284					u8 action_code;
   1285					u8 dialog_token;
   1286					u8 tpc_elem_id;
   1287					u8 tpc_elem_length;
   1288					struct ieee80211_tpc_report_ie tpc;
   1289				} __packed tpc_report;
   1290				struct {
   1291					u8 action_code;
   1292					u8 dialog_token;
   1293					u8 follow_up;
   1294					u8 tod[6];
   1295					u8 toa[6];
   1296					__le16 tod_error;
   1297					__le16 toa_error;
   1298					u8 variable[];
   1299				} __packed ftm;
   1300				struct {
   1301					u8 action_code;
   1302					u8 variable[];
   1303				} __packed s1g;
   1304			} u;
   1305		} __packed action;
   1306	} u;
   1307} __packed __aligned(2);
   1308
   1309/* Supported rates membership selectors */
   1310#define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
   1311#define BSS_MEMBERSHIP_SELECTOR_VHT_PHY	126
   1312#define BSS_MEMBERSHIP_SELECTOR_HE_PHY	122
   1313#define BSS_MEMBERSHIP_SELECTOR_SAE_H2E 123
   1314
   1315/* mgmt header + 1 byte category code */
   1316#define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
   1317
   1318
   1319/* Management MIC information element (IEEE 802.11w) */
   1320struct ieee80211_mmie {
   1321	u8 element_id;
   1322	u8 length;
   1323	__le16 key_id;
   1324	u8 sequence_number[6];
   1325	u8 mic[8];
   1326} __packed;
   1327
   1328/* Management MIC information element (IEEE 802.11w) for GMAC and CMAC-256 */
   1329struct ieee80211_mmie_16 {
   1330	u8 element_id;
   1331	u8 length;
   1332	__le16 key_id;
   1333	u8 sequence_number[6];
   1334	u8 mic[16];
   1335} __packed;
   1336
   1337struct ieee80211_vendor_ie {
   1338	u8 element_id;
   1339	u8 len;
   1340	u8 oui[3];
   1341	u8 oui_type;
   1342} __packed;
   1343
   1344struct ieee80211_wmm_ac_param {
   1345	u8 aci_aifsn; /* AIFSN, ACM, ACI */
   1346	u8 cw; /* ECWmin, ECWmax (CW = 2^ECW - 1) */
   1347	__le16 txop_limit;
   1348} __packed;
   1349
   1350struct ieee80211_wmm_param_ie {
   1351	u8 element_id; /* Element ID: 221 (0xdd); */
   1352	u8 len; /* Length: 24 */
   1353	/* required fields for WMM version 1 */
   1354	u8 oui[3]; /* 00:50:f2 */
   1355	u8 oui_type; /* 2 */
   1356	u8 oui_subtype; /* 1 */
   1357	u8 version; /* 1 for WMM version 1.0 */
   1358	u8 qos_info; /* AP/STA specific QoS info */
   1359	u8 reserved; /* 0 */
   1360	/* AC_BE, AC_BK, AC_VI, AC_VO */
   1361	struct ieee80211_wmm_ac_param ac[4];
   1362} __packed;
   1363
   1364/* Control frames */
   1365struct ieee80211_rts {
   1366	__le16 frame_control;
   1367	__le16 duration;
   1368	u8 ra[ETH_ALEN];
   1369	u8 ta[ETH_ALEN];
   1370} __packed __aligned(2);
   1371
   1372struct ieee80211_cts {
   1373	__le16 frame_control;
   1374	__le16 duration;
   1375	u8 ra[ETH_ALEN];
   1376} __packed __aligned(2);
   1377
   1378struct ieee80211_pspoll {
   1379	__le16 frame_control;
   1380	__le16 aid;
   1381	u8 bssid[ETH_ALEN];
   1382	u8 ta[ETH_ALEN];
   1383} __packed __aligned(2);
   1384
   1385/* TDLS */
   1386
   1387/* Channel switch timing */
   1388struct ieee80211_ch_switch_timing {
   1389	__le16 switch_time;
   1390	__le16 switch_timeout;
   1391} __packed;
   1392
   1393/* Link-id information element */
   1394struct ieee80211_tdls_lnkie {
   1395	u8 ie_type; /* Link Identifier IE */
   1396	u8 ie_len;
   1397	u8 bssid[ETH_ALEN];
   1398	u8 init_sta[ETH_ALEN];
   1399	u8 resp_sta[ETH_ALEN];
   1400} __packed;
   1401
   1402struct ieee80211_tdls_data {
   1403	u8 da[ETH_ALEN];
   1404	u8 sa[ETH_ALEN];
   1405	__be16 ether_type;
   1406	u8 payload_type;
   1407	u8 category;
   1408	u8 action_code;
   1409	union {
   1410		struct {
   1411			u8 dialog_token;
   1412			__le16 capability;
   1413			u8 variable[0];
   1414		} __packed setup_req;
   1415		struct {
   1416			__le16 status_code;
   1417			u8 dialog_token;
   1418			__le16 capability;
   1419			u8 variable[0];
   1420		} __packed setup_resp;
   1421		struct {
   1422			__le16 status_code;
   1423			u8 dialog_token;
   1424			u8 variable[0];
   1425		} __packed setup_cfm;
   1426		struct {
   1427			__le16 reason_code;
   1428			u8 variable[0];
   1429		} __packed teardown;
   1430		struct {
   1431			u8 dialog_token;
   1432			u8 variable[0];
   1433		} __packed discover_req;
   1434		struct {
   1435			u8 target_channel;
   1436			u8 oper_class;
   1437			u8 variable[0];
   1438		} __packed chan_switch_req;
   1439		struct {
   1440			__le16 status_code;
   1441			u8 variable[0];
   1442		} __packed chan_switch_resp;
   1443	} u;
   1444} __packed;
   1445
   1446/*
   1447 * Peer-to-Peer IE attribute related definitions.
   1448 */
   1449/**
   1450 * enum ieee80211_p2p_attr_id - identifies type of peer-to-peer attribute.
   1451 */
   1452enum ieee80211_p2p_attr_id {
   1453	IEEE80211_P2P_ATTR_STATUS = 0,
   1454	IEEE80211_P2P_ATTR_MINOR_REASON,
   1455	IEEE80211_P2P_ATTR_CAPABILITY,
   1456	IEEE80211_P2P_ATTR_DEVICE_ID,
   1457	IEEE80211_P2P_ATTR_GO_INTENT,
   1458	IEEE80211_P2P_ATTR_GO_CONFIG_TIMEOUT,
   1459	IEEE80211_P2P_ATTR_LISTEN_CHANNEL,
   1460	IEEE80211_P2P_ATTR_GROUP_BSSID,
   1461	IEEE80211_P2P_ATTR_EXT_LISTEN_TIMING,
   1462	IEEE80211_P2P_ATTR_INTENDED_IFACE_ADDR,
   1463	IEEE80211_P2P_ATTR_MANAGABILITY,
   1464	IEEE80211_P2P_ATTR_CHANNEL_LIST,
   1465	IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
   1466	IEEE80211_P2P_ATTR_DEVICE_INFO,
   1467	IEEE80211_P2P_ATTR_GROUP_INFO,
   1468	IEEE80211_P2P_ATTR_GROUP_ID,
   1469	IEEE80211_P2P_ATTR_INTERFACE,
   1470	IEEE80211_P2P_ATTR_OPER_CHANNEL,
   1471	IEEE80211_P2P_ATTR_INVITE_FLAGS,
   1472	/* 19 - 220: Reserved */
   1473	IEEE80211_P2P_ATTR_VENDOR_SPECIFIC = 221,
   1474
   1475	IEEE80211_P2P_ATTR_MAX
   1476};
   1477
   1478/* Notice of Absence attribute - described in P2P spec 4.1.14 */
   1479/* Typical max value used here */
   1480#define IEEE80211_P2P_NOA_DESC_MAX	4
   1481
   1482struct ieee80211_p2p_noa_desc {
   1483	u8 count;
   1484	__le32 duration;
   1485	__le32 interval;
   1486	__le32 start_time;
   1487} __packed;
   1488
   1489struct ieee80211_p2p_noa_attr {
   1490	u8 index;
   1491	u8 oppps_ctwindow;
   1492	struct ieee80211_p2p_noa_desc desc[IEEE80211_P2P_NOA_DESC_MAX];
   1493} __packed;
   1494
   1495#define IEEE80211_P2P_OPPPS_ENABLE_BIT		BIT(7)
   1496#define IEEE80211_P2P_OPPPS_CTWINDOW_MASK	0x7F
   1497
   1498/**
   1499 * struct ieee80211_bar - HT Block Ack Request
   1500 *
   1501 * This structure refers to "HT BlockAckReq" as
   1502 * described in 802.11n draft section 7.2.1.7.1
   1503 */
   1504struct ieee80211_bar {
   1505	__le16 frame_control;
   1506	__le16 duration;
   1507	__u8 ra[ETH_ALEN];
   1508	__u8 ta[ETH_ALEN];
   1509	__le16 control;
   1510	__le16 start_seq_num;
   1511} __packed;
   1512
   1513/* 802.11 BAR control masks */
   1514#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL	0x0000
   1515#define IEEE80211_BAR_CTRL_MULTI_TID		0x0002
   1516#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA	0x0004
   1517#define IEEE80211_BAR_CTRL_TID_INFO_MASK	0xf000
   1518#define IEEE80211_BAR_CTRL_TID_INFO_SHIFT	12
   1519
   1520#define IEEE80211_HT_MCS_MASK_LEN		10
   1521
   1522/**
   1523 * struct ieee80211_mcs_info - MCS information
   1524 * @rx_mask: RX mask
   1525 * @rx_highest: highest supported RX rate. If set represents
   1526 *	the highest supported RX data rate in units of 1 Mbps.
   1527 *	If this field is 0 this value should not be used to
   1528 *	consider the highest RX data rate supported.
   1529 * @tx_params: TX parameters
   1530 */
   1531struct ieee80211_mcs_info {
   1532	u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN];
   1533	__le16 rx_highest;
   1534	u8 tx_params;
   1535	u8 reserved[3];
   1536} __packed;
   1537
   1538/* 802.11n HT capability MSC set */
   1539#define IEEE80211_HT_MCS_RX_HIGHEST_MASK	0x3ff
   1540#define IEEE80211_HT_MCS_TX_DEFINED		0x01
   1541#define IEEE80211_HT_MCS_TX_RX_DIFF		0x02
   1542/* value 0 == 1 stream etc */
   1543#define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK	0x0C
   1544#define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT	2
   1545#define		IEEE80211_HT_MCS_TX_MAX_STREAMS	4
   1546#define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION	0x10
   1547
   1548/*
   1549 * 802.11n D5.0 20.3.5 / 20.6 says:
   1550 * - indices 0 to 7 and 32 are single spatial stream
   1551 * - 8 to 31 are multiple spatial streams using equal modulation
   1552 *   [8..15 for two streams, 16..23 for three and 24..31 for four]
   1553 * - remainder are multiple spatial streams using unequal modulation
   1554 */
   1555#define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START 33
   1556#define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START_BYTE \
   1557	(IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8)
   1558
   1559/**
   1560 * struct ieee80211_ht_cap - HT capabilities
   1561 *
   1562 * This structure is the "HT capabilities element" as
   1563 * described in 802.11n D5.0 7.3.2.57
   1564 */
   1565struct ieee80211_ht_cap {
   1566	__le16 cap_info;
   1567	u8 ampdu_params_info;
   1568
   1569	/* 16 bytes MCS information */
   1570	struct ieee80211_mcs_info mcs;
   1571
   1572	__le16 extended_ht_cap_info;
   1573	__le32 tx_BF_cap_info;
   1574	u8 antenna_selection_info;
   1575} __packed;
   1576
   1577/* 802.11n HT capabilities masks (for cap_info) */
   1578#define IEEE80211_HT_CAP_LDPC_CODING		0x0001
   1579#define IEEE80211_HT_CAP_SUP_WIDTH_20_40	0x0002
   1580#define IEEE80211_HT_CAP_SM_PS			0x000C
   1581#define		IEEE80211_HT_CAP_SM_PS_SHIFT	2
   1582#define IEEE80211_HT_CAP_GRN_FLD		0x0010
   1583#define IEEE80211_HT_CAP_SGI_20			0x0020
   1584#define IEEE80211_HT_CAP_SGI_40			0x0040
   1585#define IEEE80211_HT_CAP_TX_STBC		0x0080
   1586#define IEEE80211_HT_CAP_RX_STBC		0x0300
   1587#define		IEEE80211_HT_CAP_RX_STBC_SHIFT	8
   1588#define IEEE80211_HT_CAP_DELAY_BA		0x0400
   1589#define IEEE80211_HT_CAP_MAX_AMSDU		0x0800
   1590#define IEEE80211_HT_CAP_DSSSCCK40		0x1000
   1591#define IEEE80211_HT_CAP_RESERVED		0x2000
   1592#define IEEE80211_HT_CAP_40MHZ_INTOLERANT	0x4000
   1593#define IEEE80211_HT_CAP_LSIG_TXOP_PROT		0x8000
   1594
   1595/* 802.11n HT extended capabilities masks (for extended_ht_cap_info) */
   1596#define IEEE80211_HT_EXT_CAP_PCO		0x0001
   1597#define IEEE80211_HT_EXT_CAP_PCO_TIME		0x0006
   1598#define		IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT	1
   1599#define IEEE80211_HT_EXT_CAP_MCS_FB		0x0300
   1600#define		IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT	8
   1601#define IEEE80211_HT_EXT_CAP_HTC_SUP		0x0400
   1602#define IEEE80211_HT_EXT_CAP_RD_RESPONDER	0x0800
   1603
   1604/* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
   1605#define IEEE80211_HT_AMPDU_PARM_FACTOR		0x03
   1606#define IEEE80211_HT_AMPDU_PARM_DENSITY		0x1C
   1607#define		IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT	2
   1608
   1609/*
   1610 * Maximum length of AMPDU that the STA can receive in high-throughput (HT).
   1611 * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
   1612 */
   1613enum ieee80211_max_ampdu_length_exp {
   1614	IEEE80211_HT_MAX_AMPDU_8K = 0,
   1615	IEEE80211_HT_MAX_AMPDU_16K = 1,
   1616	IEEE80211_HT_MAX_AMPDU_32K = 2,
   1617	IEEE80211_HT_MAX_AMPDU_64K = 3
   1618};
   1619
   1620/*
   1621 * Maximum length of AMPDU that the STA can receive in VHT.
   1622 * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
   1623 */
   1624enum ieee80211_vht_max_ampdu_length_exp {
   1625	IEEE80211_VHT_MAX_AMPDU_8K = 0,
   1626	IEEE80211_VHT_MAX_AMPDU_16K = 1,
   1627	IEEE80211_VHT_MAX_AMPDU_32K = 2,
   1628	IEEE80211_VHT_MAX_AMPDU_64K = 3,
   1629	IEEE80211_VHT_MAX_AMPDU_128K = 4,
   1630	IEEE80211_VHT_MAX_AMPDU_256K = 5,
   1631	IEEE80211_VHT_MAX_AMPDU_512K = 6,
   1632	IEEE80211_VHT_MAX_AMPDU_1024K = 7
   1633};
   1634
   1635#define IEEE80211_HT_MAX_AMPDU_FACTOR 13
   1636
   1637/* Minimum MPDU start spacing */
   1638enum ieee80211_min_mpdu_spacing {
   1639	IEEE80211_HT_MPDU_DENSITY_NONE = 0,	/* No restriction */
   1640	IEEE80211_HT_MPDU_DENSITY_0_25 = 1,	/* 1/4 usec */
   1641	IEEE80211_HT_MPDU_DENSITY_0_5 = 2,	/* 1/2 usec */
   1642	IEEE80211_HT_MPDU_DENSITY_1 = 3,	/* 1 usec */
   1643	IEEE80211_HT_MPDU_DENSITY_2 = 4,	/* 2 usec */
   1644	IEEE80211_HT_MPDU_DENSITY_4 = 5,	/* 4 usec */
   1645	IEEE80211_HT_MPDU_DENSITY_8 = 6,	/* 8 usec */
   1646	IEEE80211_HT_MPDU_DENSITY_16 = 7	/* 16 usec */
   1647};
   1648
   1649/**
   1650 * struct ieee80211_ht_operation - HT operation IE
   1651 *
   1652 * This structure is the "HT operation element" as
   1653 * described in 802.11n-2009 7.3.2.57
   1654 */
   1655struct ieee80211_ht_operation {
   1656	u8 primary_chan;
   1657	u8 ht_param;
   1658	__le16 operation_mode;
   1659	__le16 stbc_param;
   1660	u8 basic_set[16];
   1661} __packed;
   1662
   1663/* for ht_param */
   1664#define IEEE80211_HT_PARAM_CHA_SEC_OFFSET		0x03
   1665#define		IEEE80211_HT_PARAM_CHA_SEC_NONE		0x00
   1666#define		IEEE80211_HT_PARAM_CHA_SEC_ABOVE	0x01
   1667#define		IEEE80211_HT_PARAM_CHA_SEC_BELOW	0x03
   1668#define IEEE80211_HT_PARAM_CHAN_WIDTH_ANY		0x04
   1669#define IEEE80211_HT_PARAM_RIFS_MODE			0x08
   1670
   1671/* for operation_mode */
   1672#define IEEE80211_HT_OP_MODE_PROTECTION			0x0003
   1673#define		IEEE80211_HT_OP_MODE_PROTECTION_NONE		0
   1674#define		IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER	1
   1675#define		IEEE80211_HT_OP_MODE_PROTECTION_20MHZ		2
   1676#define		IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED	3
   1677#define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT		0x0004
   1678#define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT		0x0010
   1679#define IEEE80211_HT_OP_MODE_CCFS2_SHIFT		5
   1680#define IEEE80211_HT_OP_MODE_CCFS2_MASK			0x1fe0
   1681
   1682/* for stbc_param */
   1683#define IEEE80211_HT_STBC_PARAM_DUAL_BEACON		0x0040
   1684#define IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT		0x0080
   1685#define IEEE80211_HT_STBC_PARAM_STBC_BEACON		0x0100
   1686#define IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT	0x0200
   1687#define IEEE80211_HT_STBC_PARAM_PCO_ACTIVE		0x0400
   1688#define IEEE80211_HT_STBC_PARAM_PCO_PHASE		0x0800
   1689
   1690
   1691/* block-ack parameters */
   1692#define IEEE80211_ADDBA_PARAM_AMSDU_MASK 0x0001
   1693#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
   1694#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
   1695#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
   1696#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
   1697#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
   1698
   1699/*
   1700 * A-MPDU buffer sizes
   1701 * According to HT size varies from 8 to 64 frames
   1702 * HE adds the ability to have up to 256 frames.
   1703 * EHT adds the ability to have up to 1K frames.
   1704 */
   1705#define IEEE80211_MIN_AMPDU_BUF		0x8
   1706#define IEEE80211_MAX_AMPDU_BUF_HT	0x40
   1707#define IEEE80211_MAX_AMPDU_BUF_HE	0x100
   1708#define IEEE80211_MAX_AMPDU_BUF_EHT	0x400
   1709
   1710
   1711/* Spatial Multiplexing Power Save Modes (for capability) */
   1712#define WLAN_HT_CAP_SM_PS_STATIC	0
   1713#define WLAN_HT_CAP_SM_PS_DYNAMIC	1
   1714#define WLAN_HT_CAP_SM_PS_INVALID	2
   1715#define WLAN_HT_CAP_SM_PS_DISABLED	3
   1716
   1717/* for SM power control field lower two bits */
   1718#define WLAN_HT_SMPS_CONTROL_DISABLED	0
   1719#define WLAN_HT_SMPS_CONTROL_STATIC	1
   1720#define WLAN_HT_SMPS_CONTROL_DYNAMIC	3
   1721
   1722/**
   1723 * struct ieee80211_vht_mcs_info - VHT MCS information
   1724 * @rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams
   1725 * @rx_highest: Indicates highest long GI VHT PPDU data rate
   1726 *	STA can receive. Rate expressed in units of 1 Mbps.
   1727 *	If this field is 0 this value should not be used to
   1728 *	consider the highest RX data rate supported.
   1729 *	The top 3 bits of this field indicate the Maximum NSTS,total
   1730 *	(a beamformee capability.)
   1731 * @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams
   1732 * @tx_highest: Indicates highest long GI VHT PPDU data rate
   1733 *	STA can transmit. Rate expressed in units of 1 Mbps.
   1734 *	If this field is 0 this value should not be used to
   1735 *	consider the highest TX data rate supported.
   1736 *	The top 2 bits of this field are reserved, the
   1737 *	3rd bit from the top indiciates VHT Extended NSS BW
   1738 *	Capability.
   1739 */
   1740struct ieee80211_vht_mcs_info {
   1741	__le16 rx_mcs_map;
   1742	__le16 rx_highest;
   1743	__le16 tx_mcs_map;
   1744	__le16 tx_highest;
   1745} __packed;
   1746
   1747/* for rx_highest */
   1748#define IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT	13
   1749#define IEEE80211_VHT_MAX_NSTS_TOTAL_MASK	(7 << IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT)
   1750
   1751/* for tx_highest */
   1752#define IEEE80211_VHT_EXT_NSS_BW_CAPABLE	(1 << 13)
   1753
   1754/**
   1755 * enum ieee80211_vht_mcs_support - VHT MCS support definitions
   1756 * @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
   1757 *	number of streams
   1758 * @IEEE80211_VHT_MCS_SUPPORT_0_8: MCSes 0-8 are supported
   1759 * @IEEE80211_VHT_MCS_SUPPORT_0_9: MCSes 0-9 are supported
   1760 * @IEEE80211_VHT_MCS_NOT_SUPPORTED: This number of streams isn't supported
   1761 *
   1762 * These definitions are used in each 2-bit subfield of the @rx_mcs_map
   1763 * and @tx_mcs_map fields of &struct ieee80211_vht_mcs_info, which are
   1764 * both split into 8 subfields by number of streams. These values indicate
   1765 * which MCSes are supported for the number of streams the value appears
   1766 * for.
   1767 */
   1768enum ieee80211_vht_mcs_support {
   1769	IEEE80211_VHT_MCS_SUPPORT_0_7	= 0,
   1770	IEEE80211_VHT_MCS_SUPPORT_0_8	= 1,
   1771	IEEE80211_VHT_MCS_SUPPORT_0_9	= 2,
   1772	IEEE80211_VHT_MCS_NOT_SUPPORTED	= 3,
   1773};
   1774
   1775/**
   1776 * struct ieee80211_vht_cap - VHT capabilities
   1777 *
   1778 * This structure is the "VHT capabilities element" as
   1779 * described in 802.11ac D3.0 8.4.2.160
   1780 * @vht_cap_info: VHT capability info
   1781 * @supp_mcs: VHT MCS supported rates
   1782 */
   1783struct ieee80211_vht_cap {
   1784	__le32 vht_cap_info;
   1785	struct ieee80211_vht_mcs_info supp_mcs;
   1786} __packed;
   1787
   1788/**
   1789 * enum ieee80211_vht_chanwidth - VHT channel width
   1790 * @IEEE80211_VHT_CHANWIDTH_USE_HT: use the HT operation IE to
   1791 *	determine the channel width (20 or 40 MHz)
   1792 * @IEEE80211_VHT_CHANWIDTH_80MHZ: 80 MHz bandwidth
   1793 * @IEEE80211_VHT_CHANWIDTH_160MHZ: 160 MHz bandwidth
   1794 * @IEEE80211_VHT_CHANWIDTH_80P80MHZ: 80+80 MHz bandwidth
   1795 */
   1796enum ieee80211_vht_chanwidth {
   1797	IEEE80211_VHT_CHANWIDTH_USE_HT		= 0,
   1798	IEEE80211_VHT_CHANWIDTH_80MHZ		= 1,
   1799	IEEE80211_VHT_CHANWIDTH_160MHZ		= 2,
   1800	IEEE80211_VHT_CHANWIDTH_80P80MHZ	= 3,
   1801};
   1802
   1803/**
   1804 * struct ieee80211_vht_operation - VHT operation IE
   1805 *
   1806 * This structure is the "VHT operation element" as
   1807 * described in 802.11ac D3.0 8.4.2.161
   1808 * @chan_width: Operating channel width
   1809 * @center_freq_seg0_idx: center freq segment 0 index
   1810 * @center_freq_seg1_idx: center freq segment 1 index
   1811 * @basic_mcs_set: VHT Basic MCS rate set
   1812 */
   1813struct ieee80211_vht_operation {
   1814	u8 chan_width;
   1815	u8 center_freq_seg0_idx;
   1816	u8 center_freq_seg1_idx;
   1817	__le16 basic_mcs_set;
   1818} __packed;
   1819
   1820/**
   1821 * struct ieee80211_he_cap_elem - HE capabilities element
   1822 *
   1823 * This structure is the "HE capabilities element" fixed fields as
   1824 * described in P802.11ax_D4.0 section 9.4.2.242.2 and 9.4.2.242.3
   1825 */
   1826struct ieee80211_he_cap_elem {
   1827	u8 mac_cap_info[6];
   1828	u8 phy_cap_info[11];
   1829} __packed;
   1830
   1831#define IEEE80211_TX_RX_MCS_NSS_DESC_MAX_LEN	5
   1832
   1833/**
   1834 * enum ieee80211_he_mcs_support - HE MCS support definitions
   1835 * @IEEE80211_HE_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
   1836 *	number of streams
   1837 * @IEEE80211_HE_MCS_SUPPORT_0_9: MCSes 0-9 are supported
   1838 * @IEEE80211_HE_MCS_SUPPORT_0_11: MCSes 0-11 are supported
   1839 * @IEEE80211_HE_MCS_NOT_SUPPORTED: This number of streams isn't supported
   1840 *
   1841 * These definitions are used in each 2-bit subfield of the rx_mcs_*
   1842 * and tx_mcs_* fields of &struct ieee80211_he_mcs_nss_supp, which are
   1843 * both split into 8 subfields by number of streams. These values indicate
   1844 * which MCSes are supported for the number of streams the value appears
   1845 * for.
   1846 */
   1847enum ieee80211_he_mcs_support {
   1848	IEEE80211_HE_MCS_SUPPORT_0_7	= 0,
   1849	IEEE80211_HE_MCS_SUPPORT_0_9	= 1,
   1850	IEEE80211_HE_MCS_SUPPORT_0_11	= 2,
   1851	IEEE80211_HE_MCS_NOT_SUPPORTED	= 3,
   1852};
   1853
   1854/**
   1855 * struct ieee80211_he_mcs_nss_supp - HE Tx/Rx HE MCS NSS Support Field
   1856 *
   1857 * This structure holds the data required for the Tx/Rx HE MCS NSS Support Field
   1858 * described in P802.11ax_D2.0 section 9.4.2.237.4
   1859 *
   1860 * @rx_mcs_80: Rx MCS map 2 bits for each stream, total 8 streams, for channel
   1861 *     widths less than 80MHz.
   1862 * @tx_mcs_80: Tx MCS map 2 bits for each stream, total 8 streams, for channel
   1863 *     widths less than 80MHz.
   1864 * @rx_mcs_160: Rx MCS map 2 bits for each stream, total 8 streams, for channel
   1865 *     width 160MHz.
   1866 * @tx_mcs_160: Tx MCS map 2 bits for each stream, total 8 streams, for channel
   1867 *     width 160MHz.
   1868 * @rx_mcs_80p80: Rx MCS map 2 bits for each stream, total 8 streams, for
   1869 *     channel width 80p80MHz.
   1870 * @tx_mcs_80p80: Tx MCS map 2 bits for each stream, total 8 streams, for
   1871 *     channel width 80p80MHz.
   1872 */
   1873struct ieee80211_he_mcs_nss_supp {
   1874	__le16 rx_mcs_80;
   1875	__le16 tx_mcs_80;
   1876	__le16 rx_mcs_160;
   1877	__le16 tx_mcs_160;
   1878	__le16 rx_mcs_80p80;
   1879	__le16 tx_mcs_80p80;
   1880} __packed;
   1881
   1882/**
   1883 * struct ieee80211_he_operation - HE capabilities element
   1884 *
   1885 * This structure is the "HE operation element" fields as
   1886 * described in P802.11ax_D4.0 section 9.4.2.243
   1887 */
   1888struct ieee80211_he_operation {
   1889	__le32 he_oper_params;
   1890	__le16 he_mcs_nss_set;
   1891	/* Optional 0,1,3,4,5,7 or 8 bytes: depends on @he_oper_params */
   1892	u8 optional[];
   1893} __packed;
   1894
   1895/**
   1896 * struct ieee80211_he_spr - HE spatial reuse element
   1897 *
   1898 * This structure is the "HE spatial reuse element" element as
   1899 * described in P802.11ax_D4.0 section 9.4.2.241
   1900 */
   1901struct ieee80211_he_spr {
   1902	u8 he_sr_control;
   1903	/* Optional 0 to 19 bytes: depends on @he_sr_control */
   1904	u8 optional[];
   1905} __packed;
   1906
   1907/**
   1908 * struct ieee80211_he_mu_edca_param_ac_rec - MU AC Parameter Record field
   1909 *
   1910 * This structure is the "MU AC Parameter Record" fields as
   1911 * described in P802.11ax_D4.0 section 9.4.2.245
   1912 */
   1913struct ieee80211_he_mu_edca_param_ac_rec {
   1914	u8 aifsn;
   1915	u8 ecw_min_max;
   1916	u8 mu_edca_timer;
   1917} __packed;
   1918
   1919/**
   1920 * struct ieee80211_mu_edca_param_set - MU EDCA Parameter Set element
   1921 *
   1922 * This structure is the "MU EDCA Parameter Set element" fields as
   1923 * described in P802.11ax_D4.0 section 9.4.2.245
   1924 */
   1925struct ieee80211_mu_edca_param_set {
   1926	u8 mu_qos_info;
   1927	struct ieee80211_he_mu_edca_param_ac_rec ac_be;
   1928	struct ieee80211_he_mu_edca_param_ac_rec ac_bk;
   1929	struct ieee80211_he_mu_edca_param_ac_rec ac_vi;
   1930	struct ieee80211_he_mu_edca_param_ac_rec ac_vo;
   1931} __packed;
   1932
   1933#define IEEE80211_EHT_MCS_NSS_RX 0x0f
   1934#define IEEE80211_EHT_MCS_NSS_TX 0xf0
   1935
   1936/**
   1937 * struct ieee80211_eht_mcs_nss_supp_20mhz_only - EHT 20MHz only station max
   1938 * supported NSS for per MCS.
   1939 *
   1940 * For each field below, bits 0 - 3 indicate the maximal number of spatial
   1941 * streams for Rx, and bits 4 - 7 indicate the maximal number of spatial streams
   1942 * for Tx.
   1943 *
   1944 * @rx_tx_mcs7_max_nss: indicates the maximum number of spatial streams
   1945 *     supported for reception and the maximum number of spatial streams
   1946 *     supported for transmission for MCS 0 - 7.
   1947 * @rx_tx_mcs9_max_nss: indicates the maximum number of spatial streams
   1948 *     supported for reception and the maximum number of spatial streams
   1949 *     supported for transmission for MCS 8 - 9.
   1950 * @rx_tx_mcs11_max_nss: indicates the maximum number of spatial streams
   1951 *     supported for reception and the maximum number of spatial streams
   1952 *     supported for transmission for MCS 10 - 11.
   1953 * @rx_tx_mcs13_max_nss: indicates the maximum number of spatial streams
   1954 *     supported for reception and the maximum number of spatial streams
   1955 *     supported for transmission for MCS 12 - 13.
   1956 */
   1957struct ieee80211_eht_mcs_nss_supp_20mhz_only {
   1958	u8 rx_tx_mcs7_max_nss;
   1959	u8 rx_tx_mcs9_max_nss;
   1960	u8 rx_tx_mcs11_max_nss;
   1961	u8 rx_tx_mcs13_max_nss;
   1962};
   1963
   1964/**
   1965 * struct ieee80211_eht_mcs_nss_supp_bw - EHT max supported NSS per MCS (except
   1966 * 20MHz only stations).
   1967 *
   1968 * For each field below, bits 0 - 3 indicate the maximal number of spatial
   1969 * streams for Rx, and bits 4 - 7 indicate the maximal number of spatial streams
   1970 * for Tx.
   1971 *
   1972 * @rx_tx_mcs9_max_nss: indicates the maximum number of spatial streams
   1973 *     supported for reception and the maximum number of spatial streams
   1974 *     supported for transmission for MCS 0 - 9.
   1975 * @rx_tx_mcs11_max_nss: indicates the maximum number of spatial streams
   1976 *     supported for reception and the maximum number of spatial streams
   1977 *     supported for transmission for MCS 10 - 11.
   1978 * @rx_tx_mcs13_max_nss: indicates the maximum number of spatial streams
   1979 *     supported for reception and the maximum number of spatial streams
   1980 *     supported for transmission for MCS 12 - 13.
   1981 */
   1982struct ieee80211_eht_mcs_nss_supp_bw {
   1983	u8 rx_tx_mcs9_max_nss;
   1984	u8 rx_tx_mcs11_max_nss;
   1985	u8 rx_tx_mcs13_max_nss;
   1986};
   1987
   1988/**
   1989 * struct ieee80211_eht_cap_elem_fixed - EHT capabilities fixed data
   1990 *
   1991 * This structure is the "EHT Capabilities element" fixed fields as
   1992 * described in P802.11be_D1.4 section 9.4.2.313.
   1993 *
   1994 * @mac_cap_info: MAC capabilities, see IEEE80211_EHT_MAC_CAP*
   1995 * @phy_cap_info: PHY capabilities, see IEEE80211_EHT_PHY_CAP*
   1996 */
   1997struct ieee80211_eht_cap_elem_fixed {
   1998	u8 mac_cap_info[2];
   1999	u8 phy_cap_info[9];
   2000} __packed;
   2001
   2002/**
   2003 * struct ieee80211_eht_cap_elem - EHT capabilities element
   2004 * @fixed: fixed parts, see &ieee80211_eht_cap_elem_fixed
   2005 * @optional: optional parts
   2006 */
   2007struct ieee80211_eht_cap_elem {
   2008	struct ieee80211_eht_cap_elem_fixed fixed;
   2009
   2010	/*
   2011	 * Followed by:
   2012	 * Supported EHT-MCS And NSS Set field: 4, 3, 6 or 9 octets.
   2013	 * EHT PPE Thresholds field: variable length.
   2014	 */
   2015	u8 optional[];
   2016} __packed;
   2017
   2018/**
   2019 * struct ieee80211_eht_operation - eht operation element
   2020 *
   2021 * This structure is the "EHT Operation Element" fields as
   2022 * described in P802.11be_D1.4 section 9.4.2.311
   2023 *
   2024 * FIXME: The spec is unclear how big the fields are, and doesn't
   2025 *	  indicate the "Disabled Subchannel Bitmap Present" in the
   2026 *	  structure (Figure 9-1002a) at all ...
   2027 */
   2028struct ieee80211_eht_operation {
   2029	u8 chan_width;
   2030	u8 ccfs;
   2031	u8 present_bm;
   2032
   2033	u8 disable_subchannel_bitmap[];
   2034} __packed;
   2035
   2036#define IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT	0x1
   2037
   2038/* 802.11ac VHT Capabilities */
   2039#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895			0x00000000
   2040#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991			0x00000001
   2041#define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454			0x00000002
   2042#define IEEE80211_VHT_CAP_MAX_MPDU_MASK				0x00000003
   2043#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ		0x00000004
   2044#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ	0x00000008
   2045#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK			0x0000000C
   2046#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT			2
   2047#define IEEE80211_VHT_CAP_RXLDPC				0x00000010
   2048#define IEEE80211_VHT_CAP_SHORT_GI_80				0x00000020
   2049#define IEEE80211_VHT_CAP_SHORT_GI_160				0x00000040
   2050#define IEEE80211_VHT_CAP_TXSTBC				0x00000080
   2051#define IEEE80211_VHT_CAP_RXSTBC_1				0x00000100
   2052#define IEEE80211_VHT_CAP_RXSTBC_2				0x00000200
   2053#define IEEE80211_VHT_CAP_RXSTBC_3				0x00000300
   2054#define IEEE80211_VHT_CAP_RXSTBC_4				0x00000400
   2055#define IEEE80211_VHT_CAP_RXSTBC_MASK				0x00000700
   2056#define IEEE80211_VHT_CAP_RXSTBC_SHIFT				8
   2057#define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE			0x00000800
   2058#define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE			0x00001000
   2059#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT                  13
   2060#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK			\
   2061		(7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT)
   2062#define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT		16
   2063#define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK		\
   2064		(7 << IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
   2065#define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE			0x00080000
   2066#define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE			0x00100000
   2067#define IEEE80211_VHT_CAP_VHT_TXOP_PS				0x00200000
   2068#define IEEE80211_VHT_CAP_HTC_VHT				0x00400000
   2069#define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT	23
   2070#define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK	\
   2071		(7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT)
   2072#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB	0x08000000
   2073#define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB	0x0c000000
   2074#define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN			0x10000000
   2075#define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN			0x20000000
   2076#define IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT			30
   2077#define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK			0xc0000000
   2078
   2079/**
   2080 * ieee80211_get_vht_max_nss - return max NSS for a given bandwidth/MCS
   2081 * @cap: VHT capabilities of the peer
   2082 * @bw: bandwidth to use
   2083 * @mcs: MCS index to use
   2084 * @ext_nss_bw_capable: indicates whether or not the local transmitter
   2085 *	(rate scaling algorithm) can deal with the new logic
   2086 *	(dot11VHTExtendedNSSBWCapable)
   2087 * @max_vht_nss: current maximum NSS as advertised by the STA in
   2088 *	operating mode notification, can be 0 in which case the
   2089 *	capability data will be used to derive this (from MCS support)
   2090 *
   2091 * Due to the VHT Extended NSS Bandwidth Support, the maximum NSS can
   2092 * vary for a given BW/MCS. This function parses the data.
   2093 *
   2094 * Note: This function is exported by cfg80211.
   2095 */
   2096int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
   2097			      enum ieee80211_vht_chanwidth bw,
   2098			      int mcs, bool ext_nss_bw_capable,
   2099			      unsigned int max_vht_nss);
   2100
   2101/**
   2102 * enum ieee80211_ap_reg_power - regulatory power for a Access Point
   2103 *
   2104 * @IEEE80211_REG_UNSET_AP: Access Point has no regulatory power mode
   2105 * @IEEE80211_REG_LPI: Indoor Access Point
   2106 * @IEEE80211_REG_SP: Standard power Access Point
   2107 * @IEEE80211_REG_VLP: Very low power Access Point
   2108 * @IEEE80211_REG_AP_POWER_AFTER_LAST: internal
   2109 * @IEEE80211_REG_AP_POWER_MAX: maximum value
   2110 */
   2111enum ieee80211_ap_reg_power {
   2112	IEEE80211_REG_UNSET_AP,
   2113	IEEE80211_REG_LPI_AP,
   2114	IEEE80211_REG_SP_AP,
   2115	IEEE80211_REG_VLP_AP,
   2116	IEEE80211_REG_AP_POWER_AFTER_LAST,
   2117	IEEE80211_REG_AP_POWER_MAX =
   2118		IEEE80211_REG_AP_POWER_AFTER_LAST - 1,
   2119};
   2120
   2121/**
   2122 * enum ieee80211_client_reg_power - regulatory power for a client
   2123 *
   2124 * @IEEE80211_REG_UNSET_CLIENT: Client has no regulatory power mode
   2125 * @IEEE80211_REG_DEFAULT_CLIENT: Default Client
   2126 * @IEEE80211_REG_SUBORDINATE_CLIENT: Subordinate Client
   2127 * @IEEE80211_REG_CLIENT_POWER_AFTER_LAST: internal
   2128 * @IEEE80211_REG_CLIENT_POWER_MAX: maximum value
   2129 */
   2130enum ieee80211_client_reg_power {
   2131	IEEE80211_REG_UNSET_CLIENT,
   2132	IEEE80211_REG_DEFAULT_CLIENT,
   2133	IEEE80211_REG_SUBORDINATE_CLIENT,
   2134	IEEE80211_REG_CLIENT_POWER_AFTER_LAST,
   2135	IEEE80211_REG_CLIENT_POWER_MAX =
   2136		IEEE80211_REG_CLIENT_POWER_AFTER_LAST - 1,
   2137};
   2138
   2139/* 802.11ax HE MAC capabilities */
   2140#define IEEE80211_HE_MAC_CAP0_HTC_HE				0x01
   2141#define IEEE80211_HE_MAC_CAP0_TWT_REQ				0x02
   2142#define IEEE80211_HE_MAC_CAP0_TWT_RES				0x04
   2143#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_NOT_SUPP		0x00
   2144#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_1		0x08
   2145#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_2		0x10
   2146#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_3		0x18
   2147#define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK			0x18
   2148#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_1		0x00
   2149#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_2		0x20
   2150#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_4		0x40
   2151#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_8		0x60
   2152#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_16		0x80
   2153#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_32		0xa0
   2154#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_64		0xc0
   2155#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_UNLIMITED	0xe0
   2156#define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_MASK		0xe0
   2157
   2158#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_UNLIMITED		0x00
   2159#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_128			0x01
   2160#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_256			0x02
   2161#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_512			0x03
   2162#define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_MASK		0x03
   2163#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_0US		0x00
   2164#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_8US		0x04
   2165#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US		0x08
   2166#define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK		0x0c
   2167#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_1		0x00
   2168#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_2		0x10
   2169#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_3		0x20
   2170#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_4		0x30
   2171#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_5		0x40
   2172#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_6		0x50
   2173#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_7		0x60
   2174#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8		0x70
   2175#define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_MASK		0x70
   2176
   2177/* Link adaptation is split between byte HE_MAC_CAP1 and
   2178 * HE_MAC_CAP2. It should be set only if IEEE80211_HE_MAC_CAP0_HTC_HE
   2179 * in which case the following values apply:
   2180 * 0 = No feedback.
   2181 * 1 = reserved.
   2182 * 2 = Unsolicited feedback.
   2183 * 3 = both
   2184 */
   2185#define IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION			0x80
   2186
   2187#define IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION			0x01
   2188#define IEEE80211_HE_MAC_CAP2_ALL_ACK				0x02
   2189#define IEEE80211_HE_MAC_CAP2_TRS				0x04
   2190#define IEEE80211_HE_MAC_CAP2_BSR				0x08
   2191#define IEEE80211_HE_MAC_CAP2_BCAST_TWT				0x10
   2192#define IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP			0x20
   2193#define IEEE80211_HE_MAC_CAP2_MU_CASCADING			0x40
   2194#define IEEE80211_HE_MAC_CAP2_ACK_EN				0x80
   2195
   2196#define IEEE80211_HE_MAC_CAP3_OMI_CONTROL			0x02
   2197#define IEEE80211_HE_MAC_CAP3_OFDMA_RA				0x04
   2198
   2199/* The maximum length of an A-MDPU is defined by the combination of the Maximum
   2200 * A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the
   2201 * same field in the HE capabilities.
   2202 */
   2203#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0		0x00
   2204#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1		0x08
   2205#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2		0x10
   2206#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3		0x18
   2207#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK		0x18
   2208#define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG			0x20
   2209#define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED			0x40
   2210#define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS		0x80
   2211
   2212#define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG		0x01
   2213#define IEEE80211_HE_MAC_CAP4_QTP				0x02
   2214#define IEEE80211_HE_MAC_CAP4_BQR				0x04
   2215#define IEEE80211_HE_MAC_CAP4_PSR_RESP				0x08
   2216#define IEEE80211_HE_MAC_CAP4_NDP_FB_REP			0x10
   2217#define IEEE80211_HE_MAC_CAP4_OPS				0x20
   2218#define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU			0x40
   2219/* Multi TID agg TX is split between byte #4 and #5
   2220 * The value is a combination of B39,B40,B41
   2221 */
   2222#define IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39		0x80
   2223
   2224#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40		0x01
   2225#define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41		0x02
   2226#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION	0x04
   2227#define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU			0x08
   2228#define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX		0x10
   2229#define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS			0x20
   2230#define IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING		0x40
   2231#define IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX		0x80
   2232
   2233#define IEEE80211_HE_VHT_MAX_AMPDU_FACTOR	20
   2234#define IEEE80211_HE_HT_MAX_AMPDU_FACTOR	16
   2235#define IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR	13
   2236
   2237/* 802.11ax HE PHY capabilities */
   2238#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G		0x02
   2239#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G	0x04
   2240#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G		0x08
   2241#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G	0x10
   2242#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL		0x1e
   2243
   2244#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G	0x20
   2245#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G	0x40
   2246#define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK			0xfe
   2247
   2248#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_20MHZ	0x01
   2249#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_40MHZ	0x02
   2250#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_20MHZ	0x04
   2251#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_40MHZ	0x08
   2252#define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK			0x0f
   2253#define IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A				0x10
   2254#define IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD			0x20
   2255#define IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US		0x40
   2256/* Midamble RX/TX Max NSTS is split between byte #2 and byte #3 */
   2257#define IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS			0x80
   2258
   2259#define IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS			0x01
   2260#define IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US			0x02
   2261#define IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ			0x04
   2262#define IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ			0x08
   2263#define IEEE80211_HE_PHY_CAP2_DOPPLER_TX				0x10
   2264#define IEEE80211_HE_PHY_CAP2_DOPPLER_RX				0x20
   2265
   2266/* Note that the meaning of UL MU below is different between an AP and a non-AP
   2267 * sta, where in the AP case it indicates support for Rx and in the non-AP sta
   2268 * case it indicates support for Tx.
   2269 */
   2270#define IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO			0x40
   2271#define IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO			0x80
   2272
   2273#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM			0x00
   2274#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK			0x01
   2275#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK			0x02
   2276#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_16_QAM			0x03
   2277#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK			0x03
   2278#define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1				0x00
   2279#define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_2				0x04
   2280#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM			0x00
   2281#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK			0x08
   2282#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK			0x10
   2283#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM			0x18
   2284#define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK			0x18
   2285#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1				0x00
   2286#define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2				0x20
   2287#define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU		0x40
   2288#define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER				0x80
   2289
   2290#define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE				0x01
   2291#define IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER				0x02
   2292
   2293/* Minimal allowed value of Max STS under 80MHz is 3 */
   2294#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4		0x0c
   2295#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5		0x10
   2296#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_6		0x14
   2297#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_7		0x18
   2298#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8		0x1c
   2299#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK	0x1c
   2300
   2301/* Minimal allowed value of Max STS above 80MHz is 3 */
   2302#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4		0x60
   2303#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5		0x80
   2304#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_6		0xa0
   2305#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_7		0xc0
   2306#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8		0xe0
   2307#define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK	0xe0
   2308
   2309#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_1	0x00
   2310#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2	0x01
   2311#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_3	0x02
   2312#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_4	0x03
   2313#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_5	0x04
   2314#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_6	0x05
   2315#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_7	0x06
   2316#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_8	0x07
   2317#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK	0x07
   2318
   2319#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_1	0x00
   2320#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2	0x08
   2321#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_3	0x10
   2322#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_4	0x18
   2323#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_5	0x20
   2324#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_6	0x28
   2325#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_7	0x30
   2326#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_8	0x38
   2327#define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK	0x38
   2328
   2329#define IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK				0x40
   2330#define IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK				0x80
   2331
   2332#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU			0x01
   2333#define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU			0x02
   2334#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB			0x04
   2335#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB		0x08
   2336#define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB				0x10
   2337#define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE			0x20
   2338#define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO		0x40
   2339#define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT			0x80
   2340
   2341#define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR				0x01
   2342#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP			0x02
   2343#define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI		0x04
   2344#define IEEE80211_HE_PHY_CAP7_MAX_NC_1					0x08
   2345#define IEEE80211_HE_PHY_CAP7_MAX_NC_2					0x10
   2346#define IEEE80211_HE_PHY_CAP7_MAX_NC_3					0x18
   2347#define IEEE80211_HE_PHY_CAP7_MAX_NC_4					0x20
   2348#define IEEE80211_HE_PHY_CAP7_MAX_NC_5					0x28
   2349#define IEEE80211_HE_PHY_CAP7_MAX_NC_6					0x30
   2350#define IEEE80211_HE_PHY_CAP7_MAX_NC_7					0x38
   2351#define IEEE80211_HE_PHY_CAP7_MAX_NC_MASK				0x38
   2352#define IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ			0x40
   2353#define IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ			0x80
   2354
   2355#define IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI		0x01
   2356#define IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G		0x02
   2357#define IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU			0x04
   2358#define IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU			0x08
   2359#define IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI		0x10
   2360#define IEEE80211_HE_PHY_CAP8_MIDAMBLE_RX_TX_2X_AND_1XLTF		0x20
   2361#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242				0x00
   2362#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484				0x40
   2363#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996				0x80
   2364#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996				0xc0
   2365#define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK				0xc0
   2366
   2367#define IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM		0x01
   2368#define IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK		0x02
   2369#define IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU		0x04
   2370#define IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU		0x08
   2371#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB	0x10
   2372#define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB	0x20
   2373#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US			0x0
   2374#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US			0x1
   2375#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US			0x2
   2376#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED		0x3
   2377#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS			6
   2378#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK			0xc0
   2379
   2380#define IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF			0x01
   2381
   2382/* 802.11ax HE TX/RX MCS NSS Support  */
   2383#define IEEE80211_TX_RX_MCS_NSS_SUPP_HIGHEST_MCS_POS			(3)
   2384#define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_POS			(6)
   2385#define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_POS			(11)
   2386#define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_MASK			0x07c0
   2387#define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_MASK			0xf800
   2388
   2389/* TX/RX HE MCS Support field Highest MCS subfield encoding */
   2390enum ieee80211_he_highest_mcs_supported_subfield_enc {
   2391	HIGHEST_MCS_SUPPORTED_MCS7 = 0,
   2392	HIGHEST_MCS_SUPPORTED_MCS8,
   2393	HIGHEST_MCS_SUPPORTED_MCS9,
   2394	HIGHEST_MCS_SUPPORTED_MCS10,
   2395	HIGHEST_MCS_SUPPORTED_MCS11,
   2396};
   2397
   2398/* Calculate 802.11ax HE capabilities IE Tx/Rx HE MCS NSS Support Field size */
   2399static inline u8
   2400ieee80211_he_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap)
   2401{
   2402	u8 count = 4;
   2403
   2404	if (he_cap->phy_cap_info[0] &
   2405	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
   2406		count += 4;
   2407
   2408	if (he_cap->phy_cap_info[0] &
   2409	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
   2410		count += 4;
   2411
   2412	return count;
   2413}
   2414
   2415/* 802.11ax HE PPE Thresholds */
   2416#define IEEE80211_PPE_THRES_NSS_SUPPORT_2NSS			(1)
   2417#define IEEE80211_PPE_THRES_NSS_POS				(0)
   2418#define IEEE80211_PPE_THRES_NSS_MASK				(7)
   2419#define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_2x966_AND_966_RU	\
   2420	(BIT(5) | BIT(6))
   2421#define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK		0x78
   2422#define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS		(3)
   2423#define IEEE80211_PPE_THRES_INFO_PPET_SIZE			(3)
   2424#define IEEE80211_HE_PPE_THRES_INFO_HEADER_SIZE			(7)
   2425
   2426/*
   2427 * Calculate 802.11ax HE capabilities IE PPE field size
   2428 * Input: Header byte of ppe_thres (first byte), and HE capa IE's PHY cap u8*
   2429 */
   2430static inline u8
   2431ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
   2432{
   2433	u8 n;
   2434
   2435	if ((phy_cap_info[6] &
   2436	     IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0)
   2437		return 0;
   2438
   2439	n = hweight8(ppe_thres_hdr &
   2440		     IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
   2441	n *= (1 + ((ppe_thres_hdr & IEEE80211_PPE_THRES_NSS_MASK) >>
   2442		   IEEE80211_PPE_THRES_NSS_POS));
   2443
   2444	/*
   2445	 * Each pair is 6 bits, and we need to add the 7 "header" bits to the
   2446	 * total size.
   2447	 */
   2448	n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7;
   2449	n = DIV_ROUND_UP(n, 8);
   2450
   2451	return n;
   2452}
   2453
   2454static inline bool ieee80211_he_capa_size_ok(const u8 *data, u8 len)
   2455{
   2456	const struct ieee80211_he_cap_elem *he_cap_ie_elem = (const void *)data;
   2457	u8 needed = sizeof(*he_cap_ie_elem);
   2458
   2459	if (len < needed)
   2460		return false;
   2461
   2462	needed += ieee80211_he_mcs_nss_size(he_cap_ie_elem);
   2463	if (len < needed)
   2464		return false;
   2465
   2466	if (he_cap_ie_elem->phy_cap_info[6] &
   2467			IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
   2468		if (len < needed + 1)
   2469			return false;
   2470		needed += ieee80211_he_ppe_size(data[needed],
   2471						he_cap_ie_elem->phy_cap_info);
   2472	}
   2473
   2474	return len >= needed;
   2475}
   2476
   2477/* HE Operation defines */
   2478#define IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK		0x00000007
   2479#define IEEE80211_HE_OPERATION_TWT_REQUIRED			0x00000008
   2480#define IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK		0x00003ff0
   2481#define IEEE80211_HE_OPERATION_RTS_THRESHOLD_OFFSET		4
   2482#define IEEE80211_HE_OPERATION_VHT_OPER_INFO			0x00004000
   2483#define IEEE80211_HE_OPERATION_CO_HOSTED_BSS			0x00008000
   2484#define IEEE80211_HE_OPERATION_ER_SU_DISABLE			0x00010000
   2485#define IEEE80211_HE_OPERATION_6GHZ_OP_INFO			0x00020000
   2486#define IEEE80211_HE_OPERATION_BSS_COLOR_MASK			0x3f000000
   2487#define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET			24
   2488#define IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR		0x40000000
   2489#define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED		0x80000000
   2490
   2491#define IEEE80211_6GHZ_CTRL_REG_LPI_AP	0
   2492#define IEEE80211_6GHZ_CTRL_REG_SP_AP	1
   2493
   2494/**
   2495 * ieee80211_he_6ghz_oper - HE 6 GHz operation Information field
   2496 * @primary: primary channel
   2497 * @control: control flags
   2498 * @ccfs0: channel center frequency segment 0
   2499 * @ccfs1: channel center frequency segment 1
   2500 * @minrate: minimum rate (in 1 Mbps units)
   2501 */
   2502struct ieee80211_he_6ghz_oper {
   2503	u8 primary;
   2504#define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH	0x3
   2505#define		IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ	0
   2506#define		IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ	1
   2507#define		IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ	2
   2508#define		IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ	3
   2509#define IEEE80211_HE_6GHZ_OPER_CTRL_DUP_BEACON	0x4
   2510#define IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO	0x38
   2511	u8 control;
   2512	u8 ccfs0;
   2513	u8 ccfs1;
   2514	u8 minrate;
   2515} __packed;
   2516
   2517/*
   2518 * In "9.4.2.161 Transmit Power Envelope element" of "IEEE Std 802.11ax-2021",
   2519 * it show four types in "Table 9-275a-Maximum Transmit Power Interpretation
   2520 * subfield encoding", and two category for each type in "Table E-12-Regulatory
   2521 * Info subfield encoding in the United States".
   2522 * So it it totally max 8 Transmit Power Envelope element.
   2523 */
   2524#define IEEE80211_TPE_MAX_IE_COUNT	8
   2525/*
   2526 * In "Table 9-277—Meaning of Maximum Transmit Power Count subfield"
   2527 * of "IEEE Std 802.11ax™‐2021", the max power level is 8.
   2528 */
   2529#define IEEE80211_MAX_NUM_PWR_LEVEL	8
   2530
   2531#define IEEE80211_TPE_MAX_POWER_COUNT	8
   2532
   2533/* transmit power interpretation type of transmit power envelope element */
   2534enum ieee80211_tx_power_intrpt_type {
   2535	IEEE80211_TPE_LOCAL_EIRP,
   2536	IEEE80211_TPE_LOCAL_EIRP_PSD,
   2537	IEEE80211_TPE_REG_CLIENT_EIRP,
   2538	IEEE80211_TPE_REG_CLIENT_EIRP_PSD,
   2539};
   2540
   2541/**
   2542 * struct ieee80211_tx_pwr_env
   2543 *
   2544 * This structure represents the "Transmit Power Envelope element"
   2545 */
   2546struct ieee80211_tx_pwr_env {
   2547	u8 tx_power_info;
   2548	s8 tx_power[IEEE80211_TPE_MAX_POWER_COUNT];
   2549} __packed;
   2550
   2551#define IEEE80211_TX_PWR_ENV_INFO_COUNT 0x7
   2552#define IEEE80211_TX_PWR_ENV_INFO_INTERPRET 0x38
   2553#define IEEE80211_TX_PWR_ENV_INFO_CATEGORY 0xC0
   2554
   2555/*
   2556 * ieee80211_he_oper_size - calculate 802.11ax HE Operations IE size
   2557 * @he_oper_ie: byte data of the He Operations IE, stating from the byte
   2558 *	after the ext ID byte. It is assumed that he_oper_ie has at least
   2559 *	sizeof(struct ieee80211_he_operation) bytes, the caller must have
   2560 *	validated this.
   2561 * @return the actual size of the IE data (not including header), or 0 on error
   2562 */
   2563static inline u8
   2564ieee80211_he_oper_size(const u8 *he_oper_ie)
   2565{
   2566	const struct ieee80211_he_operation *he_oper = (const void *)he_oper_ie;
   2567	u8 oper_len = sizeof(struct ieee80211_he_operation);
   2568	u32 he_oper_params;
   2569
   2570	/* Make sure the input is not NULL */
   2571	if (!he_oper_ie)
   2572		return 0;
   2573
   2574	/* Calc required length */
   2575	he_oper_params = le32_to_cpu(he_oper->he_oper_params);
   2576	if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO)
   2577		oper_len += 3;
   2578	if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
   2579		oper_len++;
   2580	if (he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO)
   2581		oper_len += sizeof(struct ieee80211_he_6ghz_oper);
   2582
   2583	/* Add the first byte (extension ID) to the total length */
   2584	oper_len++;
   2585
   2586	return oper_len;
   2587}
   2588
   2589/**
   2590 * ieee80211_he_6ghz_oper - obtain 6 GHz operation field
   2591 * @he_oper: HE operation element (must be pre-validated for size)
   2592 *	but may be %NULL
   2593 *
   2594 * Return: a pointer to the 6 GHz operation field, or %NULL
   2595 */
   2596static inline const struct ieee80211_he_6ghz_oper *
   2597ieee80211_he_6ghz_oper(const struct ieee80211_he_operation *he_oper)
   2598{
   2599	const u8 *ret = (const void *)&he_oper->optional;
   2600	u32 he_oper_params;
   2601
   2602	if (!he_oper)
   2603		return NULL;
   2604
   2605	he_oper_params = le32_to_cpu(he_oper->he_oper_params);
   2606
   2607	if (!(he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO))
   2608		return NULL;
   2609	if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO)
   2610		ret += 3;
   2611	if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
   2612		ret++;
   2613
   2614	return (const void *)ret;
   2615}
   2616
   2617/* HE Spatial Reuse defines */
   2618#define IEEE80211_HE_SPR_PSR_DISALLOWED				BIT(0)
   2619#define IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED		BIT(1)
   2620#define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT			BIT(2)
   2621#define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT		BIT(3)
   2622#define IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED		BIT(4)
   2623
   2624/*
   2625 * ieee80211_he_spr_size - calculate 802.11ax HE Spatial Reuse IE size
   2626 * @he_spr_ie: byte data of the He Spatial Reuse IE, stating from the byte
   2627 *	after the ext ID byte. It is assumed that he_spr_ie has at least
   2628 *	sizeof(struct ieee80211_he_spr) bytes, the caller must have validated
   2629 *	this
   2630 * @return the actual size of the IE data (not including header), or 0 on error
   2631 */
   2632static inline u8
   2633ieee80211_he_spr_size(const u8 *he_spr_ie)
   2634{
   2635	const struct ieee80211_he_spr *he_spr = (const void *)he_spr_ie;
   2636	u8 spr_len = sizeof(struct ieee80211_he_spr);
   2637	u8 he_spr_params;
   2638
   2639	/* Make sure the input is not NULL */
   2640	if (!he_spr_ie)
   2641		return 0;
   2642
   2643	/* Calc required length */
   2644	he_spr_params = he_spr->he_sr_control;
   2645	if (he_spr_params & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
   2646		spr_len++;
   2647	if (he_spr_params & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT)
   2648		spr_len += 18;
   2649
   2650	/* Add the first byte (extension ID) to the total length */
   2651	spr_len++;
   2652
   2653	return spr_len;
   2654}
   2655
   2656/* S1G Capabilities Information field */
   2657#define IEEE80211_S1G_CAPABILITY_LEN	15
   2658
   2659#define S1G_CAP0_S1G_LONG	BIT(0)
   2660#define S1G_CAP0_SGI_1MHZ	BIT(1)
   2661#define S1G_CAP0_SGI_2MHZ	BIT(2)
   2662#define S1G_CAP0_SGI_4MHZ	BIT(3)
   2663#define S1G_CAP0_SGI_8MHZ	BIT(4)
   2664#define S1G_CAP0_SGI_16MHZ	BIT(5)
   2665#define S1G_CAP0_SUPP_CH_WIDTH	GENMASK(7, 6)
   2666
   2667#define S1G_SUPP_CH_WIDTH_2	0
   2668#define S1G_SUPP_CH_WIDTH_4	1
   2669#define S1G_SUPP_CH_WIDTH_8	2
   2670#define S1G_SUPP_CH_WIDTH_16	3
   2671#define S1G_SUPP_CH_WIDTH_MAX(cap) ((1 << FIELD_GET(S1G_CAP0_SUPP_CH_WIDTH, \
   2672						    cap[0])) << 1)
   2673
   2674#define S1G_CAP1_RX_LDPC	BIT(0)
   2675#define S1G_CAP1_TX_STBC	BIT(1)
   2676#define S1G_CAP1_RX_STBC	BIT(2)
   2677#define S1G_CAP1_SU_BFER	BIT(3)
   2678#define S1G_CAP1_SU_BFEE	BIT(4)
   2679#define S1G_CAP1_BFEE_STS	GENMASK(7, 5)
   2680
   2681#define S1G_CAP2_SOUNDING_DIMENSIONS	GENMASK(2, 0)
   2682#define S1G_CAP2_MU_BFER		BIT(3)
   2683#define S1G_CAP2_MU_BFEE		BIT(4)
   2684#define S1G_CAP2_PLUS_HTC_VHT		BIT(5)
   2685#define S1G_CAP2_TRAVELING_PILOT	GENMASK(7, 6)
   2686
   2687#define S1G_CAP3_RD_RESPONDER		BIT(0)
   2688#define S1G_CAP3_HT_DELAYED_BA		BIT(1)
   2689#define S1G_CAP3_MAX_MPDU_LEN		BIT(2)
   2690#define S1G_CAP3_MAX_AMPDU_LEN_EXP	GENMASK(4, 3)
   2691#define S1G_CAP3_MIN_MPDU_START		GENMASK(7, 5)
   2692
   2693#define S1G_CAP4_UPLINK_SYNC	BIT(0)
   2694#define S1G_CAP4_DYNAMIC_AID	BIT(1)
   2695#define S1G_CAP4_BAT		BIT(2)
   2696#define S1G_CAP4_TIME_ADE	BIT(3)
   2697#define S1G_CAP4_NON_TIM	BIT(4)
   2698#define S1G_CAP4_GROUP_AID	BIT(5)
   2699#define S1G_CAP4_STA_TYPE	GENMASK(7, 6)
   2700
   2701#define S1G_CAP5_CENT_AUTH_CONTROL	BIT(0)
   2702#define S1G_CAP5_DIST_AUTH_CONTROL	BIT(1)
   2703#define S1G_CAP5_AMSDU			BIT(2)
   2704#define S1G_CAP5_AMPDU			BIT(3)
   2705#define S1G_CAP5_ASYMMETRIC_BA		BIT(4)
   2706#define S1G_CAP5_FLOW_CONTROL		BIT(5)
   2707#define S1G_CAP5_SECTORIZED_BEAM	GENMASK(7, 6)
   2708
   2709#define S1G_CAP6_OBSS_MITIGATION	BIT(0)
   2710#define S1G_CAP6_FRAGMENT_BA		BIT(1)
   2711#define S1G_CAP6_NDP_PS_POLL		BIT(2)
   2712#define S1G_CAP6_RAW_OPERATION		BIT(3)
   2713#define S1G_CAP6_PAGE_SLICING		BIT(4)
   2714#define S1G_CAP6_TXOP_SHARING_IMP_ACK	BIT(5)
   2715#define S1G_CAP6_VHT_LINK_ADAPT		GENMASK(7, 6)
   2716
   2717#define S1G_CAP7_TACK_AS_PS_POLL		BIT(0)
   2718#define S1G_CAP7_DUP_1MHZ			BIT(1)
   2719#define S1G_CAP7_MCS_NEGOTIATION		BIT(2)
   2720#define S1G_CAP7_1MHZ_CTL_RESPONSE_PREAMBLE	BIT(3)
   2721#define S1G_CAP7_NDP_BFING_REPORT_POLL		BIT(4)
   2722#define S1G_CAP7_UNSOLICITED_DYN_AID		BIT(5)
   2723#define S1G_CAP7_SECTOR_TRAINING_OPERATION	BIT(6)
   2724#define S1G_CAP7_TEMP_PS_MODE_SWITCH		BIT(7)
   2725
   2726#define S1G_CAP8_TWT_GROUPING	BIT(0)
   2727#define S1G_CAP8_BDT		BIT(1)
   2728#define S1G_CAP8_COLOR		GENMASK(4, 2)
   2729#define S1G_CAP8_TWT_REQUEST	BIT(5)
   2730#define S1G_CAP8_TWT_RESPOND	BIT(6)
   2731#define S1G_CAP8_PV1_FRAME	BIT(7)
   2732
   2733#define S1G_CAP9_LINK_ADAPT_PER_CONTROL_RESPONSE BIT(0)
   2734
   2735#define S1G_OPER_CH_WIDTH_PRIMARY_1MHZ	BIT(0)
   2736#define S1G_OPER_CH_WIDTH_OPER		GENMASK(4, 1)
   2737
   2738/* EHT MAC capabilities as defined in P802.11be_D1.4 section 9.4.2.313.2 */
   2739#define IEEE80211_EHT_MAC_CAP0_NSEP_PRIO_ACCESS			0x01
   2740#define IEEE80211_EHT_MAC_CAP0_OM_CONTROL			0x02
   2741#define IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1		0x04
   2742#define IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2		0x08
   2743#define IEEE80211_EHT_MAC_CAP0_RESTRICTED_TWT			0x10
   2744#define IEEE80211_EHT_MAC_CAP0_SCS_TRAFFIC_DESC			0x20
   2745#define IEEE80211_EHT_MAC_CAP0_MAX_AMPDU_LEN_MASK		0xc0
   2746#define		IEEE80211_EHT_MAC_CAP0_MAX_AMPDU_LEN_3895	0
   2747#define		IEEE80211_EHT_MAC_CAP0_MAX_AMPDU_LEN_7991	1
   2748#define		IEEE80211_EHT_MAC_CAP0_MAX_AMPDU_LEN_11454	2
   2749
   2750/* EHT PHY capabilities as defined in P802.11be_D1.4 section 9.4.2.313.3 */
   2751#define IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ			0x02
   2752#define IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ		0x04
   2753#define IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI		0x08
   2754#define IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO		0x10
   2755#define IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER			0x20
   2756#define IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE			0x40
   2757
   2758/* EHT beamformee number of spatial streams <= 80MHz is split */
   2759#define IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK		0x80
   2760#define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK		0x03
   2761
   2762#define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK	0x1c
   2763#define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK	0xe0
   2764
   2765#define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK		0x07
   2766#define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK		0x38
   2767
   2768/* EHT number of sounding dimensions for 320MHz is split */
   2769#define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK		0xc0
   2770#define IEEE80211_EHT_PHY_CAP3_SOUNDING_DIM_320MHZ_MASK		0x01
   2771#define IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK		0x02
   2772#define IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK		0x04
   2773#define IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK		0x08
   2774#define IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK		0x10
   2775#define IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK			0x20
   2776#define IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK		0x40
   2777#define IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK			0x80
   2778
   2779#define IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO		0x01
   2780#define IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP			0x02
   2781#define IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP		0x04
   2782#define IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI	0x08
   2783#define IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK			0xf0
   2784
   2785#define IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK		0x01
   2786#define IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP		0x02
   2787#define IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP		0x04
   2788#define IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT		0x08
   2789#define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK	0x30
   2790#define   IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_0US	0
   2791#define   IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US	1
   2792#define   IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US	2
   2793#define   IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_20US	3
   2794
   2795/* Maximum number of supported EHT LTF is split */
   2796#define IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK	0xc0
   2797#define IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK	0x07
   2798
   2799#define IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK			0x78
   2800#define IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP		0x80
   2801
   2802#define IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW	0x01
   2803#define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ	0x02
   2804#define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ	0x04
   2805#define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ	0x08
   2806#define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ		0x10
   2807#define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ		0x20
   2808#define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ		0x40
   2809#define IEEE80211_EHT_PHY_CAP7_TB_SOUNDING_FDBK_RATE_LIMIT	0x80
   2810
   2811#define IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA	0x01
   2812#define IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA	0x02
   2813
   2814/*
   2815 * EHT operation channel width as defined in P802.11be_D1.4 section 9.4.2.311
   2816 */
   2817#define IEEE80211_EHT_OPER_CHAN_WIDTH		0x7
   2818#define IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ	0
   2819#define IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ	1
   2820#define IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ	2
   2821#define IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ	3
   2822#define IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ	4
   2823
   2824/* Calculate 802.11be EHT capabilities IE Tx/Rx EHT MCS NSS Support Field size */
   2825static inline u8
   2826ieee80211_eht_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap,
   2827			   const struct ieee80211_eht_cap_elem_fixed *eht_cap)
   2828{
   2829	u8 count = 0;
   2830
   2831	/* on 2.4 GHz, if it supports 40 MHz, the result is 3 */
   2832	if (he_cap->phy_cap_info[0] &
   2833	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G)
   2834		return 3;
   2835
   2836	/* on 2.4 GHz, these three bits are reserved, so should be 0 */
   2837	if (he_cap->phy_cap_info[0] &
   2838	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)
   2839		count += 3;
   2840
   2841	if (he_cap->phy_cap_info[0] &
   2842	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
   2843		count += 3;
   2844
   2845	if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
   2846		count += 3;
   2847
   2848	return count ? count : 4;
   2849}
   2850
   2851/* 802.11be EHT PPE Thresholds */
   2852#define IEEE80211_EHT_PPE_THRES_NSS_POS			0
   2853#define IEEE80211_EHT_PPE_THRES_NSS_MASK		0xf
   2854#define IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK	0x1f0
   2855#define IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE		3
   2856#define IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE	9
   2857
   2858/*
   2859 * Calculate 802.11be EHT capabilities IE EHT field size
   2860 */
   2861static inline u8
   2862ieee80211_eht_ppe_size(u16 ppe_thres_hdr, const u8 *phy_cap_info)
   2863{
   2864	u32 n;
   2865
   2866	if (!(phy_cap_info[5] &
   2867	      IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT))
   2868		return 0;
   2869
   2870	n = hweight16(ppe_thres_hdr &
   2871		      IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
   2872	n *= 1 + u16_get_bits(ppe_thres_hdr, IEEE80211_EHT_PPE_THRES_NSS_MASK);
   2873
   2874	/*
   2875	 * Each pair is 6 bits, and we need to add the 9 "header" bits to the
   2876	 * total size.
   2877	 */
   2878	n = n * IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2 +
   2879	    IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
   2880	return DIV_ROUND_UP(n, 8);
   2881}
   2882
   2883static inline bool
   2884ieee80211_eht_capa_size_ok(const u8 *he_capa, const u8 *data, u8 len)
   2885{
   2886	const struct ieee80211_eht_cap_elem_fixed *elem = (const void *)data;
   2887	u8 needed = sizeof(struct ieee80211_eht_cap_elem_fixed);
   2888
   2889	if (len < needed || !he_capa)
   2890		return false;
   2891
   2892	needed += ieee80211_eht_mcs_nss_size((const void *)he_capa,
   2893					     (const void *)data);
   2894	if (len < needed)
   2895		return false;
   2896
   2897	if (elem->phy_cap_info[5] &
   2898			IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) {
   2899		u16 ppe_thres_hdr;
   2900
   2901		if (len < needed + sizeof(ppe_thres_hdr))
   2902			return false;
   2903
   2904		ppe_thres_hdr = get_unaligned_le16(data + needed);
   2905		needed += ieee80211_eht_ppe_size(ppe_thres_hdr,
   2906						 elem->phy_cap_info);
   2907	}
   2908
   2909	return len >= needed;
   2910}
   2911
   2912static inline bool
   2913ieee80211_eht_oper_size_ok(const u8 *data, u8 len)
   2914{
   2915	const struct ieee80211_eht_operation *elem = (const void *)data;
   2916	u8 needed = sizeof(*elem);
   2917
   2918	if (len < needed)
   2919		return false;
   2920
   2921	if (elem->present_bm & IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT)
   2922		needed += 2;
   2923
   2924	return len >= needed;
   2925}
   2926
   2927#define LISTEN_INT_USF	GENMASK(15, 14)
   2928#define LISTEN_INT_UI	GENMASK(13, 0)
   2929
   2930#define IEEE80211_MAX_USF	FIELD_MAX(LISTEN_INT_USF)
   2931#define IEEE80211_MAX_UI	FIELD_MAX(LISTEN_INT_UI)
   2932
   2933/* Authentication algorithms */
   2934#define WLAN_AUTH_OPEN 0
   2935#define WLAN_AUTH_SHARED_KEY 1
   2936#define WLAN_AUTH_FT 2
   2937#define WLAN_AUTH_SAE 3
   2938#define WLAN_AUTH_FILS_SK 4
   2939#define WLAN_AUTH_FILS_SK_PFS 5
   2940#define WLAN_AUTH_FILS_PK 6
   2941#define WLAN_AUTH_LEAP 128
   2942
   2943#define WLAN_AUTH_CHALLENGE_LEN 128
   2944
   2945#define WLAN_CAPABILITY_ESS		(1<<0)
   2946#define WLAN_CAPABILITY_IBSS		(1<<1)
   2947
   2948/*
   2949 * A mesh STA sets the ESS and IBSS capability bits to zero.
   2950 * however, this holds true for p2p probe responses (in the p2p_find
   2951 * phase) as well.
   2952 */
   2953#define WLAN_CAPABILITY_IS_STA_BSS(cap)	\
   2954	(!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
   2955
   2956#define WLAN_CAPABILITY_CF_POLLABLE	(1<<2)
   2957#define WLAN_CAPABILITY_CF_POLL_REQUEST	(1<<3)
   2958#define WLAN_CAPABILITY_PRIVACY		(1<<4)
   2959#define WLAN_CAPABILITY_SHORT_PREAMBLE	(1<<5)
   2960#define WLAN_CAPABILITY_PBCC		(1<<6)
   2961#define WLAN_CAPABILITY_CHANNEL_AGILITY	(1<<7)
   2962
   2963/* 802.11h */
   2964#define WLAN_CAPABILITY_SPECTRUM_MGMT	(1<<8)
   2965#define WLAN_CAPABILITY_QOS		(1<<9)
   2966#define WLAN_CAPABILITY_SHORT_SLOT_TIME	(1<<10)
   2967#define WLAN_CAPABILITY_APSD		(1<<11)
   2968#define WLAN_CAPABILITY_RADIO_MEASURE	(1<<12)
   2969#define WLAN_CAPABILITY_DSSS_OFDM	(1<<13)
   2970#define WLAN_CAPABILITY_DEL_BACK	(1<<14)
   2971#define WLAN_CAPABILITY_IMM_BACK	(1<<15)
   2972
   2973/* DMG (60gHz) 802.11ad */
   2974/* type - bits 0..1 */
   2975#define WLAN_CAPABILITY_DMG_TYPE_MASK		(3<<0)
   2976#define WLAN_CAPABILITY_DMG_TYPE_IBSS		(1<<0) /* Tx by: STA */
   2977#define WLAN_CAPABILITY_DMG_TYPE_PBSS		(2<<0) /* Tx by: PCP */
   2978#define WLAN_CAPABILITY_DMG_TYPE_AP		(3<<0) /* Tx by: AP */
   2979
   2980#define WLAN_CAPABILITY_DMG_CBAP_ONLY		(1<<2)
   2981#define WLAN_CAPABILITY_DMG_CBAP_SOURCE		(1<<3)
   2982#define WLAN_CAPABILITY_DMG_PRIVACY		(1<<4)
   2983#define WLAN_CAPABILITY_DMG_ECPAC		(1<<5)
   2984
   2985#define WLAN_CAPABILITY_DMG_SPECTRUM_MGMT	(1<<8)
   2986#define WLAN_CAPABILITY_DMG_RADIO_MEASURE	(1<<12)
   2987
   2988/* measurement */
   2989#define IEEE80211_SPCT_MSR_RPRT_MODE_LATE	(1<<0)
   2990#define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE	(1<<1)
   2991#define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED	(1<<2)
   2992
   2993#define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC	0
   2994#define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA	1
   2995#define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI	2
   2996#define IEEE80211_SPCT_MSR_RPRT_TYPE_LCI	8
   2997#define IEEE80211_SPCT_MSR_RPRT_TYPE_CIVIC	11
   2998
   2999/* 802.11g ERP information element */
   3000#define WLAN_ERP_NON_ERP_PRESENT (1<<0)
   3001#define WLAN_ERP_USE_PROTECTION (1<<1)
   3002#define WLAN_ERP_BARKER_PREAMBLE (1<<2)
   3003
   3004/* WLAN_ERP_BARKER_PREAMBLE values */
   3005enum {
   3006	WLAN_ERP_PREAMBLE_SHORT = 0,
   3007	WLAN_ERP_PREAMBLE_LONG = 1,
   3008};
   3009
   3010/* Band ID, 802.11ad #8.4.1.45 */
   3011enum {
   3012	IEEE80211_BANDID_TV_WS = 0, /* TV white spaces */
   3013	IEEE80211_BANDID_SUB1  = 1, /* Sub-1 GHz (excluding TV white spaces) */
   3014	IEEE80211_BANDID_2G    = 2, /* 2.4 GHz */
   3015	IEEE80211_BANDID_3G    = 3, /* 3.6 GHz */
   3016	IEEE80211_BANDID_5G    = 4, /* 4.9 and 5 GHz */
   3017	IEEE80211_BANDID_60G   = 5, /* 60 GHz */
   3018};
   3019
   3020/* Status codes */
   3021enum ieee80211_statuscode {
   3022	WLAN_STATUS_SUCCESS = 0,
   3023	WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
   3024	WLAN_STATUS_CAPS_UNSUPPORTED = 10,
   3025	WLAN_STATUS_REASSOC_NO_ASSOC = 11,
   3026	WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
   3027	WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
   3028	WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
   3029	WLAN_STATUS_CHALLENGE_FAIL = 15,
   3030	WLAN_STATUS_AUTH_TIMEOUT = 16,
   3031	WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
   3032	WLAN_STATUS_ASSOC_DENIED_RATES = 18,
   3033	/* 802.11b */
   3034	WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
   3035	WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
   3036	WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
   3037	/* 802.11h */
   3038	WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
   3039	WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
   3040	WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
   3041	/* 802.11g */
   3042	WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
   3043	WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
   3044	/* 802.11w */
   3045	WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY = 30,
   3046	WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31,
   3047	/* 802.11i */
   3048	WLAN_STATUS_INVALID_IE = 40,
   3049	WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
   3050	WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
   3051	WLAN_STATUS_INVALID_AKMP = 43,
   3052	WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
   3053	WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
   3054	WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
   3055	/* 802.11e */
   3056	WLAN_STATUS_UNSPECIFIED_QOS = 32,
   3057	WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
   3058	WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
   3059	WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
   3060	WLAN_STATUS_REQUEST_DECLINED = 37,
   3061	WLAN_STATUS_INVALID_QOS_PARAM = 38,
   3062	WLAN_STATUS_CHANGE_TSPEC = 39,
   3063	WLAN_STATUS_WAIT_TS_DELAY = 47,
   3064	WLAN_STATUS_NO_DIRECT_LINK = 48,
   3065	WLAN_STATUS_STA_NOT_PRESENT = 49,
   3066	WLAN_STATUS_STA_NOT_QSTA = 50,
   3067	/* 802.11s */
   3068	WLAN_STATUS_ANTI_CLOG_REQUIRED = 76,
   3069	WLAN_STATUS_FCG_NOT_SUPP = 78,
   3070	WLAN_STATUS_STA_NO_TBTT = 78,
   3071	/* 802.11ad */
   3072	WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES = 39,
   3073	WLAN_STATUS_REJECTED_FOR_DELAY_PERIOD = 47,
   3074	WLAN_STATUS_REJECT_WITH_SCHEDULE = 83,
   3075	WLAN_STATUS_PENDING_ADMITTING_FST_SESSION = 86,
   3076	WLAN_STATUS_PERFORMING_FST_NOW = 87,
   3077	WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW = 88,
   3078	WLAN_STATUS_REJECT_U_PID_SETTING = 89,
   3079	WLAN_STATUS_REJECT_DSE_BAND = 96,
   3080	WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL = 99,
   3081	WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT = 103,
   3082	/* 802.11ai */
   3083	WLAN_STATUS_FILS_AUTHENTICATION_FAILURE = 108,
   3084	WLAN_STATUS_UNKNOWN_AUTHENTICATION_SERVER = 109,
   3085	WLAN_STATUS_SAE_HASH_TO_ELEMENT = 126,
   3086	WLAN_STATUS_SAE_PK = 127,
   3087};
   3088
   3089
   3090/* Reason codes */
   3091enum ieee80211_reasoncode {
   3092	WLAN_REASON_UNSPECIFIED = 1,
   3093	WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
   3094	WLAN_REASON_DEAUTH_LEAVING = 3,
   3095	WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
   3096	WLAN_REASON_DISASSOC_AP_BUSY = 5,
   3097	WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
   3098	WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
   3099	WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
   3100	WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
   3101	/* 802.11h */
   3102	WLAN_REASON_DISASSOC_BAD_POWER = 10,
   3103	WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
   3104	/* 802.11i */
   3105	WLAN_REASON_INVALID_IE = 13,
   3106	WLAN_REASON_MIC_FAILURE = 14,
   3107	WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
   3108	WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
   3109	WLAN_REASON_IE_DIFFERENT = 17,
   3110	WLAN_REASON_INVALID_GROUP_CIPHER = 18,
   3111	WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
   3112	WLAN_REASON_INVALID_AKMP = 20,
   3113	WLAN_REASON_UNSUPP_RSN_VERSION = 21,
   3114	WLAN_REASON_INVALID_RSN_IE_CAP = 22,
   3115	WLAN_REASON_IEEE8021X_FAILED = 23,
   3116	WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
   3117	/* TDLS (802.11z) */
   3118	WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE = 25,
   3119	WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26,
   3120	/* 802.11e */
   3121	WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
   3122	WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
   3123	WLAN_REASON_DISASSOC_LOW_ACK = 34,
   3124	WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
   3125	WLAN_REASON_QSTA_LEAVE_QBSS = 36,
   3126	WLAN_REASON_QSTA_NOT_USE = 37,
   3127	WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
   3128	WLAN_REASON_QSTA_TIMEOUT = 39,
   3129	WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
   3130	/* 802.11s */
   3131	WLAN_REASON_MESH_PEER_CANCELED = 52,
   3132	WLAN_REASON_MESH_MAX_PEERS = 53,
   3133	WLAN_REASON_MESH_CONFIG = 54,
   3134	WLAN_REASON_MESH_CLOSE = 55,
   3135	WLAN_REASON_MESH_MAX_RETRIES = 56,
   3136	WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57,
   3137	WLAN_REASON_MESH_INVALID_GTK = 58,
   3138	WLAN_REASON_MESH_INCONSISTENT_PARAM = 59,
   3139	WLAN_REASON_MESH_INVALID_SECURITY = 60,
   3140	WLAN_REASON_MESH_PATH_ERROR = 61,
   3141	WLAN_REASON_MESH_PATH_NOFORWARD = 62,
   3142	WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63,
   3143	WLAN_REASON_MAC_EXISTS_IN_MBSS = 64,
   3144	WLAN_REASON_MESH_CHAN_REGULATORY = 65,
   3145	WLAN_REASON_MESH_CHAN = 66,
   3146};
   3147
   3148
   3149/* Information Element IDs */
   3150enum ieee80211_eid {
   3151	WLAN_EID_SSID = 0,
   3152	WLAN_EID_SUPP_RATES = 1,
   3153	WLAN_EID_FH_PARAMS = 2, /* reserved now */
   3154	WLAN_EID_DS_PARAMS = 3,
   3155	WLAN_EID_CF_PARAMS = 4,
   3156	WLAN_EID_TIM = 5,
   3157	WLAN_EID_IBSS_PARAMS = 6,
   3158	WLAN_EID_COUNTRY = 7,
   3159	/* 8, 9 reserved */
   3160	WLAN_EID_REQUEST = 10,
   3161	WLAN_EID_QBSS_LOAD = 11,
   3162	WLAN_EID_EDCA_PARAM_SET = 12,
   3163	WLAN_EID_TSPEC = 13,
   3164	WLAN_EID_TCLAS = 14,
   3165	WLAN_EID_SCHEDULE = 15,
   3166	WLAN_EID_CHALLENGE = 16,
   3167	/* 17-31 reserved for challenge text extension */
   3168	WLAN_EID_PWR_CONSTRAINT = 32,
   3169	WLAN_EID_PWR_CAPABILITY = 33,
   3170	WLAN_EID_TPC_REQUEST = 34,
   3171	WLAN_EID_TPC_REPORT = 35,
   3172	WLAN_EID_SUPPORTED_CHANNELS = 36,
   3173	WLAN_EID_CHANNEL_SWITCH = 37,
   3174	WLAN_EID_MEASURE_REQUEST = 38,
   3175	WLAN_EID_MEASURE_REPORT = 39,
   3176	WLAN_EID_QUIET = 40,
   3177	WLAN_EID_IBSS_DFS = 41,
   3178	WLAN_EID_ERP_INFO = 42,
   3179	WLAN_EID_TS_DELAY = 43,
   3180	WLAN_EID_TCLAS_PROCESSING = 44,
   3181	WLAN_EID_HT_CAPABILITY = 45,
   3182	WLAN_EID_QOS_CAPA = 46,
   3183	/* 47 reserved for Broadcom */
   3184	WLAN_EID_RSN = 48,
   3185	WLAN_EID_802_15_COEX = 49,
   3186	WLAN_EID_EXT_SUPP_RATES = 50,
   3187	WLAN_EID_AP_CHAN_REPORT = 51,
   3188	WLAN_EID_NEIGHBOR_REPORT = 52,
   3189	WLAN_EID_RCPI = 53,
   3190	WLAN_EID_MOBILITY_DOMAIN = 54,
   3191	WLAN_EID_FAST_BSS_TRANSITION = 55,
   3192	WLAN_EID_TIMEOUT_INTERVAL = 56,
   3193	WLAN_EID_RIC_DATA = 57,
   3194	WLAN_EID_DSE_REGISTERED_LOCATION = 58,
   3195	WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59,
   3196	WLAN_EID_EXT_CHANSWITCH_ANN = 60,
   3197	WLAN_EID_HT_OPERATION = 61,
   3198	WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62,
   3199	WLAN_EID_BSS_AVG_ACCESS_DELAY = 63,
   3200	WLAN_EID_ANTENNA_INFO = 64,
   3201	WLAN_EID_RSNI = 65,
   3202	WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66,
   3203	WLAN_EID_BSS_AVAILABLE_CAPACITY = 67,
   3204	WLAN_EID_BSS_AC_ACCESS_DELAY = 68,
   3205	WLAN_EID_TIME_ADVERTISEMENT = 69,
   3206	WLAN_EID_RRM_ENABLED_CAPABILITIES = 70,
   3207	WLAN_EID_MULTIPLE_BSSID = 71,
   3208	WLAN_EID_BSS_COEX_2040 = 72,
   3209	WLAN_EID_BSS_INTOLERANT_CHL_REPORT = 73,
   3210	WLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74,
   3211	WLAN_EID_RIC_DESCRIPTOR = 75,
   3212	WLAN_EID_MMIE = 76,
   3213	WLAN_EID_ASSOC_COMEBACK_TIME = 77,
   3214	WLAN_EID_EVENT_REQUEST = 78,
   3215	WLAN_EID_EVENT_REPORT = 79,
   3216	WLAN_EID_DIAGNOSTIC_REQUEST = 80,
   3217	WLAN_EID_DIAGNOSTIC_REPORT = 81,
   3218	WLAN_EID_LOCATION_PARAMS = 82,
   3219	WLAN_EID_NON_TX_BSSID_CAP =  83,
   3220	WLAN_EID_SSID_LIST = 84,
   3221	WLAN_EID_MULTI_BSSID_IDX = 85,
   3222	WLAN_EID_FMS_DESCRIPTOR = 86,
   3223	WLAN_EID_FMS_REQUEST = 87,
   3224	WLAN_EID_FMS_RESPONSE = 88,
   3225	WLAN_EID_QOS_TRAFFIC_CAPA = 89,
   3226	WLAN_EID_BSS_MAX_IDLE_PERIOD = 90,
   3227	WLAN_EID_TSF_REQUEST = 91,
   3228	WLAN_EID_TSF_RESPOSNE = 92,
   3229	WLAN_EID_WNM_SLEEP_MODE = 93,
   3230	WLAN_EID_TIM_BCAST_REQ = 94,
   3231	WLAN_EID_TIM_BCAST_RESP = 95,
   3232	WLAN_EID_COLL_IF_REPORT = 96,
   3233	WLAN_EID_CHANNEL_USAGE = 97,
   3234	WLAN_EID_TIME_ZONE = 98,
   3235	WLAN_EID_DMS_REQUEST = 99,
   3236	WLAN_EID_DMS_RESPONSE = 100,
   3237	WLAN_EID_LINK_ID = 101,
   3238	WLAN_EID_WAKEUP_SCHEDUL = 102,
   3239	/* 103 reserved */
   3240	WLAN_EID_CHAN_SWITCH_TIMING = 104,
   3241	WLAN_EID_PTI_CONTROL = 105,
   3242	WLAN_EID_PU_BUFFER_STATUS = 106,
   3243	WLAN_EID_INTERWORKING = 107,
   3244	WLAN_EID_ADVERTISEMENT_PROTOCOL = 108,
   3245	WLAN_EID_EXPEDITED_BW_REQ = 109,
   3246	WLAN_EID_QOS_MAP_SET = 110,
   3247	WLAN_EID_ROAMING_CONSORTIUM = 111,
   3248	WLAN_EID_EMERGENCY_ALERT = 112,
   3249	WLAN_EID_MESH_CONFIG = 113,
   3250	WLAN_EID_MESH_ID = 114,
   3251	WLAN_EID_LINK_METRIC_REPORT = 115,
   3252	WLAN_EID_CONGESTION_NOTIFICATION = 116,
   3253	WLAN_EID_PEER_MGMT = 117,
   3254	WLAN_EID_CHAN_SWITCH_PARAM = 118,
   3255	WLAN_EID_MESH_AWAKE_WINDOW = 119,
   3256	WLAN_EID_BEACON_TIMING = 120,
   3257	WLAN_EID_MCCAOP_SETUP_REQ = 121,
   3258	WLAN_EID_MCCAOP_SETUP_RESP = 122,
   3259	WLAN_EID_MCCAOP_ADVERT = 123,
   3260	WLAN_EID_MCCAOP_TEARDOWN = 124,
   3261	WLAN_EID_GANN = 125,
   3262	WLAN_EID_RANN = 126,
   3263	WLAN_EID_EXT_CAPABILITY = 127,
   3264	/* 128, 129 reserved for Agere */
   3265	WLAN_EID_PREQ = 130,
   3266	WLAN_EID_PREP = 131,
   3267	WLAN_EID_PERR = 132,
   3268	/* 133-136 reserved for Cisco */
   3269	WLAN_EID_PXU = 137,
   3270	WLAN_EID_PXUC = 138,
   3271	WLAN_EID_AUTH_MESH_PEER_EXCH = 139,
   3272	WLAN_EID_MIC = 140,
   3273	WLAN_EID_DESTINATION_URI = 141,
   3274	WLAN_EID_UAPSD_COEX = 142,
   3275	WLAN_EID_WAKEUP_SCHEDULE = 143,
   3276	WLAN_EID_EXT_SCHEDULE = 144,
   3277	WLAN_EID_STA_AVAILABILITY = 145,
   3278	WLAN_EID_DMG_TSPEC = 146,
   3279	WLAN_EID_DMG_AT = 147,
   3280	WLAN_EID_DMG_CAP = 148,
   3281	/* 149 reserved for Cisco */
   3282	WLAN_EID_CISCO_VENDOR_SPECIFIC = 150,
   3283	WLAN_EID_DMG_OPERATION = 151,
   3284	WLAN_EID_DMG_BSS_PARAM_CHANGE = 152,
   3285	WLAN_EID_DMG_BEAM_REFINEMENT = 153,
   3286	WLAN_EID_CHANNEL_MEASURE_FEEDBACK = 154,
   3287	/* 155-156 reserved for Cisco */
   3288	WLAN_EID_AWAKE_WINDOW = 157,
   3289	WLAN_EID_MULTI_BAND = 158,
   3290	WLAN_EID_ADDBA_EXT = 159,
   3291	WLAN_EID_NEXT_PCP_LIST = 160,
   3292	WLAN_EID_PCP_HANDOVER = 161,
   3293	WLAN_EID_DMG_LINK_MARGIN = 162,
   3294	WLAN_EID_SWITCHING_STREAM = 163,
   3295	WLAN_EID_SESSION_TRANSITION = 164,
   3296	WLAN_EID_DYN_TONE_PAIRING_REPORT = 165,
   3297	WLAN_EID_CLUSTER_REPORT = 166,
   3298	WLAN_EID_RELAY_CAP = 167,
   3299	WLAN_EID_RELAY_XFER_PARAM_SET = 168,
   3300	WLAN_EID_BEAM_LINK_MAINT = 169,
   3301	WLAN_EID_MULTIPLE_MAC_ADDR = 170,
   3302	WLAN_EID_U_PID = 171,
   3303	WLAN_EID_DMG_LINK_ADAPT_ACK = 172,
   3304	/* 173 reserved for Symbol */
   3305	WLAN_EID_MCCAOP_ADV_OVERVIEW = 174,
   3306	WLAN_EID_QUIET_PERIOD_REQ = 175,
   3307	/* 176 reserved for Symbol */
   3308	WLAN_EID_QUIET_PERIOD_RESP = 177,
   3309	/* 178-179 reserved for Symbol */
   3310	/* 180 reserved for ISO/IEC 20011 */
   3311	WLAN_EID_EPAC_POLICY = 182,
   3312	WLAN_EID_CLISTER_TIME_OFF = 183,
   3313	WLAN_EID_INTER_AC_PRIO = 184,
   3314	WLAN_EID_SCS_DESCRIPTOR = 185,
   3315	WLAN_EID_QLOAD_REPORT = 186,
   3316	WLAN_EID_HCCA_TXOP_UPDATE_COUNT = 187,
   3317	WLAN_EID_HL_STREAM_ID = 188,
   3318	WLAN_EID_GCR_GROUP_ADDR = 189,
   3319	WLAN_EID_ANTENNA_SECTOR_ID_PATTERN = 190,
   3320	WLAN_EID_VHT_CAPABILITY = 191,
   3321	WLAN_EID_VHT_OPERATION = 192,
   3322	WLAN_EID_EXTENDED_BSS_LOAD = 193,
   3323	WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194,
   3324	WLAN_EID_TX_POWER_ENVELOPE = 195,
   3325	WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196,
   3326	WLAN_EID_AID = 197,
   3327	WLAN_EID_QUIET_CHANNEL = 198,
   3328	WLAN_EID_OPMODE_NOTIF = 199,
   3329
   3330	WLAN_EID_REDUCED_NEIGHBOR_REPORT = 201,
   3331
   3332	WLAN_EID_AID_REQUEST = 210,
   3333	WLAN_EID_AID_RESPONSE = 211,
   3334	WLAN_EID_S1G_BCN_COMPAT = 213,
   3335	WLAN_EID_S1G_SHORT_BCN_INTERVAL = 214,
   3336	WLAN_EID_S1G_TWT = 216,
   3337	WLAN_EID_S1G_CAPABILITIES = 217,
   3338	WLAN_EID_VENDOR_SPECIFIC = 221,
   3339	WLAN_EID_QOS_PARAMETER = 222,
   3340	WLAN_EID_S1G_OPERATION = 232,
   3341	WLAN_EID_CAG_NUMBER = 237,
   3342	WLAN_EID_AP_CSN = 239,
   3343	WLAN_EID_FILS_INDICATION = 240,
   3344	WLAN_EID_DILS = 241,
   3345	WLAN_EID_FRAGMENT = 242,
   3346	WLAN_EID_RSNX = 244,
   3347	WLAN_EID_EXTENSION = 255
   3348};
   3349
   3350/* Element ID Extensions for Element ID 255 */
   3351enum ieee80211_eid_ext {
   3352	WLAN_EID_EXT_ASSOC_DELAY_INFO = 1,
   3353	WLAN_EID_EXT_FILS_REQ_PARAMS = 2,
   3354	WLAN_EID_EXT_FILS_KEY_CONFIRM = 3,
   3355	WLAN_EID_EXT_FILS_SESSION = 4,
   3356	WLAN_EID_EXT_FILS_HLP_CONTAINER = 5,
   3357	WLAN_EID_EXT_FILS_IP_ADDR_ASSIGN = 6,
   3358	WLAN_EID_EXT_KEY_DELIVERY = 7,
   3359	WLAN_EID_EXT_FILS_WRAPPED_DATA = 8,
   3360	WLAN_EID_EXT_FILS_PUBLIC_KEY = 12,
   3361	WLAN_EID_EXT_FILS_NONCE = 13,
   3362	WLAN_EID_EXT_FUTURE_CHAN_GUIDANCE = 14,
   3363	WLAN_EID_EXT_HE_CAPABILITY = 35,
   3364	WLAN_EID_EXT_HE_OPERATION = 36,
   3365	WLAN_EID_EXT_UORA = 37,
   3366	WLAN_EID_EXT_HE_MU_EDCA = 38,
   3367	WLAN_EID_EXT_HE_SPR = 39,
   3368	WLAN_EID_EXT_NDP_FEEDBACK_REPORT_PARAMSET = 41,
   3369	WLAN_EID_EXT_BSS_COLOR_CHG_ANN = 42,
   3370	WLAN_EID_EXT_QUIET_TIME_PERIOD_SETUP = 43,
   3371	WLAN_EID_EXT_ESS_REPORT = 45,
   3372	WLAN_EID_EXT_OPS = 46,
   3373	WLAN_EID_EXT_HE_BSS_LOAD = 47,
   3374	WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME = 52,
   3375	WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55,
   3376	WLAN_EID_EXT_NON_INHERITANCE = 56,
   3377	WLAN_EID_EXT_KNOWN_BSSID = 57,
   3378	WLAN_EID_EXT_SHORT_SSID_LIST = 58,
   3379	WLAN_EID_EXT_HE_6GHZ_CAPA = 59,
   3380	WLAN_EID_EXT_UL_MU_POWER_CAPA = 60,
   3381	WLAN_EID_EXT_EHT_OPERATION = 106,
   3382	WLAN_EID_EXT_EHT_MULTI_LINK = 107,
   3383	WLAN_EID_EXT_EHT_CAPABILITY = 108,
   3384};
   3385
   3386/* Action category code */
   3387enum ieee80211_category {
   3388	WLAN_CATEGORY_SPECTRUM_MGMT = 0,
   3389	WLAN_CATEGORY_QOS = 1,
   3390	WLAN_CATEGORY_DLS = 2,
   3391	WLAN_CATEGORY_BACK = 3,
   3392	WLAN_CATEGORY_PUBLIC = 4,
   3393	WLAN_CATEGORY_RADIO_MEASUREMENT = 5,
   3394	WLAN_CATEGORY_FAST_BBS_TRANSITION = 6,
   3395	WLAN_CATEGORY_HT = 7,
   3396	WLAN_CATEGORY_SA_QUERY = 8,
   3397	WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9,
   3398	WLAN_CATEGORY_WNM = 10,
   3399	WLAN_CATEGORY_WNM_UNPROTECTED = 11,
   3400	WLAN_CATEGORY_TDLS = 12,
   3401	WLAN_CATEGORY_MESH_ACTION = 13,
   3402	WLAN_CATEGORY_MULTIHOP_ACTION = 14,
   3403	WLAN_CATEGORY_SELF_PROTECTED = 15,
   3404	WLAN_CATEGORY_DMG = 16,
   3405	WLAN_CATEGORY_WMM = 17,
   3406	WLAN_CATEGORY_FST = 18,
   3407	WLAN_CATEGORY_UNPROT_DMG = 20,
   3408	WLAN_CATEGORY_VHT = 21,
   3409	WLAN_CATEGORY_S1G = 22,
   3410	WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
   3411	WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
   3412};
   3413
   3414/* SPECTRUM_MGMT action code */
   3415enum ieee80211_spectrum_mgmt_actioncode {
   3416	WLAN_ACTION_SPCT_MSR_REQ = 0,
   3417	WLAN_ACTION_SPCT_MSR_RPRT = 1,
   3418	WLAN_ACTION_SPCT_TPC_REQ = 2,
   3419	WLAN_ACTION_SPCT_TPC_RPRT = 3,
   3420	WLAN_ACTION_SPCT_CHL_SWITCH = 4,
   3421};
   3422
   3423/* HT action codes */
   3424enum ieee80211_ht_actioncode {
   3425	WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0,
   3426	WLAN_HT_ACTION_SMPS = 1,
   3427	WLAN_HT_ACTION_PSMP = 2,
   3428	WLAN_HT_ACTION_PCO_PHASE = 3,
   3429	WLAN_HT_ACTION_CSI = 4,
   3430	WLAN_HT_ACTION_NONCOMPRESSED_BF = 5,
   3431	WLAN_HT_ACTION_COMPRESSED_BF = 6,
   3432	WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,
   3433};
   3434
   3435/* VHT action codes */
   3436enum ieee80211_vht_actioncode {
   3437	WLAN_VHT_ACTION_COMPRESSED_BF = 0,
   3438	WLAN_VHT_ACTION_GROUPID_MGMT = 1,
   3439	WLAN_VHT_ACTION_OPMODE_NOTIF = 2,
   3440};
   3441
   3442/* Self Protected Action codes */
   3443enum ieee80211_self_protected_actioncode {
   3444	WLAN_SP_RESERVED = 0,
   3445	WLAN_SP_MESH_PEERING_OPEN = 1,
   3446	WLAN_SP_MESH_PEERING_CONFIRM = 2,
   3447	WLAN_SP_MESH_PEERING_CLOSE = 3,
   3448	WLAN_SP_MGK_INFORM = 4,
   3449	WLAN_SP_MGK_ACK = 5,
   3450};
   3451
   3452/* Mesh action codes */
   3453enum ieee80211_mesh_actioncode {
   3454	WLAN_MESH_ACTION_LINK_METRIC_REPORT,
   3455	WLAN_MESH_ACTION_HWMP_PATH_SELECTION,
   3456	WLAN_MESH_ACTION_GATE_ANNOUNCEMENT,
   3457	WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION,
   3458	WLAN_MESH_ACTION_MCCA_SETUP_REQUEST,
   3459	WLAN_MESH_ACTION_MCCA_SETUP_REPLY,
   3460	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST,
   3461	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT,
   3462	WLAN_MESH_ACTION_MCCA_TEARDOWN,
   3463	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST,
   3464	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE,
   3465};
   3466
   3467/* Security key length */
   3468enum ieee80211_key_len {
   3469	WLAN_KEY_LEN_WEP40 = 5,
   3470	WLAN_KEY_LEN_WEP104 = 13,
   3471	WLAN_KEY_LEN_CCMP = 16,
   3472	WLAN_KEY_LEN_CCMP_256 = 32,
   3473	WLAN_KEY_LEN_TKIP = 32,
   3474	WLAN_KEY_LEN_AES_CMAC = 16,
   3475	WLAN_KEY_LEN_SMS4 = 32,
   3476	WLAN_KEY_LEN_GCMP = 16,
   3477	WLAN_KEY_LEN_GCMP_256 = 32,
   3478	WLAN_KEY_LEN_BIP_CMAC_256 = 32,
   3479	WLAN_KEY_LEN_BIP_GMAC_128 = 16,
   3480	WLAN_KEY_LEN_BIP_GMAC_256 = 32,
   3481};
   3482
   3483enum ieee80211_s1g_actioncode {
   3484	WLAN_S1G_AID_SWITCH_REQUEST,
   3485	WLAN_S1G_AID_SWITCH_RESPONSE,
   3486	WLAN_S1G_SYNC_CONTROL,
   3487	WLAN_S1G_STA_INFO_ANNOUNCE,
   3488	WLAN_S1G_EDCA_PARAM_SET,
   3489	WLAN_S1G_EL_OPERATION,
   3490	WLAN_S1G_TWT_SETUP,
   3491	WLAN_S1G_TWT_TEARDOWN,
   3492	WLAN_S1G_SECT_GROUP_ID_LIST,
   3493	WLAN_S1G_SECT_ID_FEEDBACK,
   3494	WLAN_S1G_TWT_INFORMATION = 11,
   3495};
   3496
   3497#define IEEE80211_WEP_IV_LEN		4
   3498#define IEEE80211_WEP_ICV_LEN		4
   3499#define IEEE80211_CCMP_HDR_LEN		8
   3500#define IEEE80211_CCMP_MIC_LEN		8
   3501#define IEEE80211_CCMP_PN_LEN		6
   3502#define IEEE80211_CCMP_256_HDR_LEN	8
   3503#define IEEE80211_CCMP_256_MIC_LEN	16
   3504#define IEEE80211_CCMP_256_PN_LEN	6
   3505#define IEEE80211_TKIP_IV_LEN		8
   3506#define IEEE80211_TKIP_ICV_LEN		4
   3507#define IEEE80211_CMAC_PN_LEN		6
   3508#define IEEE80211_GMAC_PN_LEN		6
   3509#define IEEE80211_GCMP_HDR_LEN		8
   3510#define IEEE80211_GCMP_MIC_LEN		16
   3511#define IEEE80211_GCMP_PN_LEN		6
   3512
   3513#define FILS_NONCE_LEN			16
   3514#define FILS_MAX_KEK_LEN		64
   3515
   3516#define FILS_ERP_MAX_USERNAME_LEN	16
   3517#define FILS_ERP_MAX_REALM_LEN		253
   3518#define FILS_ERP_MAX_RRK_LEN		64
   3519
   3520#define PMK_MAX_LEN			64
   3521#define SAE_PASSWORD_MAX_LEN		128
   3522
   3523/* Public action codes (IEEE Std 802.11-2016, 9.6.8.1, Table 9-307) */
   3524enum ieee80211_pub_actioncode {
   3525	WLAN_PUB_ACTION_20_40_BSS_COEX = 0,
   3526	WLAN_PUB_ACTION_DSE_ENABLEMENT = 1,
   3527	WLAN_PUB_ACTION_DSE_DEENABLEMENT = 2,
   3528	WLAN_PUB_ACTION_DSE_REG_LOC_ANN = 3,
   3529	WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,
   3530	WLAN_PUB_ACTION_DSE_MSMT_REQ = 5,
   3531	WLAN_PUB_ACTION_DSE_MSMT_RESP = 6,
   3532	WLAN_PUB_ACTION_MSMT_PILOT = 7,
   3533	WLAN_PUB_ACTION_DSE_PC = 8,
   3534	WLAN_PUB_ACTION_VENDOR_SPECIFIC = 9,
   3535	WLAN_PUB_ACTION_GAS_INITIAL_REQ = 10,
   3536	WLAN_PUB_ACTION_GAS_INITIAL_RESP = 11,
   3537	WLAN_PUB_ACTION_GAS_COMEBACK_REQ = 12,
   3538	WLAN_PUB_ACTION_GAS_COMEBACK_RESP = 13,
   3539	WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
   3540	WLAN_PUB_ACTION_LOC_TRACK_NOTI = 15,
   3541	WLAN_PUB_ACTION_QAB_REQUEST_FRAME = 16,
   3542	WLAN_PUB_ACTION_QAB_RESPONSE_FRAME = 17,
   3543	WLAN_PUB_ACTION_QMF_POLICY = 18,
   3544	WLAN_PUB_ACTION_QMF_POLICY_CHANGE = 19,
   3545	WLAN_PUB_ACTION_QLOAD_REQUEST = 20,
   3546	WLAN_PUB_ACTION_QLOAD_REPORT = 21,
   3547	WLAN_PUB_ACTION_HCCA_TXOP_ADVERT = 22,
   3548	WLAN_PUB_ACTION_HCCA_TXOP_RESPONSE = 23,
   3549	WLAN_PUB_ACTION_PUBLIC_KEY = 24,
   3550	WLAN_PUB_ACTION_CHANNEL_AVAIL_QUERY = 25,
   3551	WLAN_PUB_ACTION_CHANNEL_SCHEDULE_MGMT = 26,
   3552	WLAN_PUB_ACTION_CONTACT_VERI_SIGNAL = 27,
   3553	WLAN_PUB_ACTION_GDD_ENABLEMENT_REQ = 28,
   3554	WLAN_PUB_ACTION_GDD_ENABLEMENT_RESP = 29,
   3555	WLAN_PUB_ACTION_NETWORK_CHANNEL_CONTROL = 30,
   3556	WLAN_PUB_ACTION_WHITE_SPACE_MAP_ANN = 31,
   3557	WLAN_PUB_ACTION_FTM_REQUEST = 32,
   3558	WLAN_PUB_ACTION_FTM = 33,
   3559	WLAN_PUB_ACTION_FILS_DISCOVERY = 34,
   3560};
   3561
   3562/* TDLS action codes */
   3563enum ieee80211_tdls_actioncode {
   3564	WLAN_TDLS_SETUP_REQUEST = 0,
   3565	WLAN_TDLS_SETUP_RESPONSE = 1,
   3566	WLAN_TDLS_SETUP_CONFIRM = 2,
   3567	WLAN_TDLS_TEARDOWN = 3,
   3568	WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4,
   3569	WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5,
   3570	WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6,
   3571	WLAN_TDLS_PEER_PSM_REQUEST = 7,
   3572	WLAN_TDLS_PEER_PSM_RESPONSE = 8,
   3573	WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9,
   3574	WLAN_TDLS_DISCOVERY_REQUEST = 10,
   3575};
   3576
   3577/* Extended Channel Switching capability to be set in the 1st byte of
   3578 * the @WLAN_EID_EXT_CAPABILITY information element
   3579 */
   3580#define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING	BIT(2)
   3581
   3582/* Multiple BSSID capability is set in the 6th bit of 3rd byte of the
   3583 * @WLAN_EID_EXT_CAPABILITY information element
   3584 */
   3585#define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT	BIT(6)
   3586
   3587/* Timing Measurement protocol for time sync is set in the 7th bit of 3rd byte
   3588 * of the @WLAN_EID_EXT_CAPABILITY information element
   3589 */
   3590#define WLAN_EXT_CAPA3_TIMING_MEASUREMENT_SUPPORT	BIT(7)
   3591
   3592/* TDLS capabilities in the 4th byte of @WLAN_EID_EXT_CAPABILITY */
   3593#define WLAN_EXT_CAPA4_TDLS_BUFFER_STA		BIT(4)
   3594#define WLAN_EXT_CAPA4_TDLS_PEER_PSM		BIT(5)
   3595#define WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH		BIT(6)
   3596
   3597/* Interworking capabilities are set in 7th bit of 4th byte of the
   3598 * @WLAN_EID_EXT_CAPABILITY information element
   3599 */
   3600#define WLAN_EXT_CAPA4_INTERWORKING_ENABLED	BIT(7)
   3601
   3602/*
   3603 * TDLS capabililites to be enabled in the 5th byte of the
   3604 * @WLAN_EID_EXT_CAPABILITY information element
   3605 */
   3606#define WLAN_EXT_CAPA5_TDLS_ENABLED	BIT(5)
   3607#define WLAN_EXT_CAPA5_TDLS_PROHIBITED	BIT(6)
   3608#define WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED	BIT(7)
   3609
   3610#define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED	BIT(5)
   3611#define WLAN_EXT_CAPA8_OPMODE_NOTIF	BIT(6)
   3612
   3613/* Defines the maximal number of MSDUs in an A-MSDU. */
   3614#define WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB	BIT(7)
   3615#define WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB	BIT(0)
   3616
   3617/*
   3618 * Fine Timing Measurement Initiator - bit 71 of @WLAN_EID_EXT_CAPABILITY
   3619 * information element
   3620 */
   3621#define WLAN_EXT_CAPA9_FTM_INITIATOR	BIT(7)
   3622
   3623/* Defines support for TWT Requester and TWT Responder */
   3624#define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT	BIT(5)
   3625#define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT	BIT(6)
   3626
   3627/*
   3628 * When set, indicates that the AP is able to tolerate 26-tone RU UL
   3629 * OFDMA transmissions using HE TB PPDU from OBSS (not falsely classify the
   3630 * 26-tone RU UL OFDMA transmissions as radar pulses).
   3631 */
   3632#define WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT BIT(7)
   3633
   3634/* Defines support for enhanced multi-bssid advertisement*/
   3635#define WLAN_EXT_CAPA11_EMA_SUPPORT	BIT(3)
   3636
   3637/* TDLS specific payload type in the LLC/SNAP header */
   3638#define WLAN_TDLS_SNAP_RFTYPE	0x2
   3639
   3640/* BSS Coex IE information field bits */
   3641#define WLAN_BSS_COEX_INFORMATION_REQUEST	BIT(0)
   3642
   3643/**
   3644 * enum ieee80211_mesh_sync_method - mesh synchronization method identifier
   3645 *
   3646 * @IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET: the default synchronization method
   3647 * @IEEE80211_SYNC_METHOD_VENDOR: a vendor specific synchronization method
   3648 *	that will be specified in a vendor specific information element
   3649 */
   3650enum ieee80211_mesh_sync_method {
   3651	IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET = 1,
   3652	IEEE80211_SYNC_METHOD_VENDOR = 255,
   3653};
   3654
   3655/**
   3656 * enum ieee80211_mesh_path_protocol - mesh path selection protocol identifier
   3657 *
   3658 * @IEEE80211_PATH_PROTOCOL_HWMP: the default path selection protocol
   3659 * @IEEE80211_PATH_PROTOCOL_VENDOR: a vendor specific protocol that will
   3660 *	be specified in a vendor specific information element
   3661 */
   3662enum ieee80211_mesh_path_protocol {
   3663	IEEE80211_PATH_PROTOCOL_HWMP = 1,
   3664	IEEE80211_PATH_PROTOCOL_VENDOR = 255,
   3665};
   3666
   3667/**
   3668 * enum ieee80211_mesh_path_metric - mesh path selection metric identifier
   3669 *
   3670 * @IEEE80211_PATH_METRIC_AIRTIME: the default path selection metric
   3671 * @IEEE80211_PATH_METRIC_VENDOR: a vendor specific metric that will be
   3672 *	specified in a vendor specific information element
   3673 */
   3674enum ieee80211_mesh_path_metric {
   3675	IEEE80211_PATH_METRIC_AIRTIME = 1,
   3676	IEEE80211_PATH_METRIC_VENDOR = 255,
   3677};
   3678
   3679/**
   3680 * enum ieee80211_root_mode_identifier - root mesh STA mode identifier
   3681 *
   3682 * These attribute are used by dot11MeshHWMPRootMode to set root mesh STA mode
   3683 *
   3684 * @IEEE80211_ROOTMODE_NO_ROOT: the mesh STA is not a root mesh STA (default)
   3685 * @IEEE80211_ROOTMODE_ROOT: the mesh STA is a root mesh STA if greater than
   3686 *	this value
   3687 * @IEEE80211_PROACTIVE_PREQ_NO_PREP: the mesh STA is a root mesh STA supports
   3688 *	the proactive PREQ with proactive PREP subfield set to 0
   3689 * @IEEE80211_PROACTIVE_PREQ_WITH_PREP: the mesh STA is a root mesh STA
   3690 *	supports the proactive PREQ with proactive PREP subfield set to 1
   3691 * @IEEE80211_PROACTIVE_RANN: the mesh STA is a root mesh STA supports
   3692 *	the proactive RANN
   3693 */
   3694enum ieee80211_root_mode_identifier {
   3695	IEEE80211_ROOTMODE_NO_ROOT = 0,
   3696	IEEE80211_ROOTMODE_ROOT = 1,
   3697	IEEE80211_PROACTIVE_PREQ_NO_PREP = 2,
   3698	IEEE80211_PROACTIVE_PREQ_WITH_PREP = 3,
   3699	IEEE80211_PROACTIVE_RANN = 4,
   3700};
   3701
   3702/*
   3703 * IEEE 802.11-2007 7.3.2.9 Country information element
   3704 *
   3705 * Minimum length is 8 octets, ie len must be evenly
   3706 * divisible by 2
   3707 */
   3708
   3709/* Although the spec says 8 I'm seeing 6 in practice */
   3710#define IEEE80211_COUNTRY_IE_MIN_LEN	6
   3711
   3712/* The Country String field of the element shall be 3 octets in length */
   3713#define IEEE80211_COUNTRY_STRING_LEN	3
   3714
   3715/*
   3716 * For regulatory extension stuff see IEEE 802.11-2007
   3717 * Annex I (page 1141) and Annex J (page 1147). Also
   3718 * review 7.3.2.9.
   3719 *
   3720 * When dot11RegulatoryClassesRequired is true and the
   3721 * first_channel/reg_extension_id is >= 201 then the IE
   3722 * compromises of the 'ext' struct represented below:
   3723 *
   3724 *  - Regulatory extension ID - when generating IE this just needs
   3725 *    to be monotonically increasing for each triplet passed in
   3726 *    the IE
   3727 *  - Regulatory class - index into set of rules
   3728 *  - Coverage class - index into air propagation time (Table 7-27),
   3729 *    in microseconds, you can compute the air propagation time from
   3730 *    the index by multiplying by 3, so index 10 yields a propagation
   3731 *    of 10 us. Valid values are 0-31, values 32-255 are not defined
   3732 *    yet. A value of 0 inicates air propagation of <= 1 us.
   3733 *
   3734 *  See also Table I.2 for Emission limit sets and table
   3735 *  I.3 for Behavior limit sets. Table J.1 indicates how to map
   3736 *  a reg_class to an emission limit set and behavior limit set.
   3737 */
   3738#define IEEE80211_COUNTRY_EXTENSION_ID 201
   3739
   3740/*
   3741 *  Channels numbers in the IE must be monotonically increasing
   3742 *  if dot11RegulatoryClassesRequired is not true.
   3743 *
   3744 *  If dot11RegulatoryClassesRequired is true consecutive
   3745 *  subband triplets following a regulatory triplet shall
   3746 *  have monotonically increasing first_channel number fields.
   3747 *
   3748 *  Channel numbers shall not overlap.
   3749 *
   3750 *  Note that max_power is signed.
   3751 */
   3752struct ieee80211_country_ie_triplet {
   3753	union {
   3754		struct {
   3755			u8 first_channel;
   3756			u8 num_channels;
   3757			s8 max_power;
   3758		} __packed chans;
   3759		struct {
   3760			u8 reg_extension_id;
   3761			u8 reg_class;
   3762			u8 coverage_class;
   3763		} __packed ext;
   3764	};
   3765} __packed;
   3766
   3767enum ieee80211_timeout_interval_type {
   3768	WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
   3769	WLAN_TIMEOUT_KEY_LIFETIME = 2 /* 802.11r */,
   3770	WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,
   3771};
   3772
   3773/**
   3774 * struct ieee80211_timeout_interval_ie - Timeout Interval element
   3775 * @type: type, see &enum ieee80211_timeout_interval_type
   3776 * @value: timeout interval value
   3777 */
   3778struct ieee80211_timeout_interval_ie {
   3779	u8 type;
   3780	__le32 value;
   3781} __packed;
   3782
   3783/**
   3784 * enum ieee80211_idle_options - BSS idle options
   3785 * @WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE: the station should send an RSN
   3786 *	protected frame to the AP to reset the idle timer at the AP for
   3787 *	the station.
   3788 */
   3789enum ieee80211_idle_options {
   3790	WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE = BIT(0),
   3791};
   3792
   3793/**
   3794 * struct ieee80211_bss_max_idle_period_ie
   3795 *
   3796 * This structure refers to "BSS Max idle period element"
   3797 *
   3798 * @max_idle_period: indicates the time period during which a station can
   3799 *	refrain from transmitting frames to its associated AP without being
   3800 *	disassociated. In units of 1000 TUs.
   3801 * @idle_options: indicates the options associated with the BSS idle capability
   3802 *	as specified in &enum ieee80211_idle_options.
   3803 */
   3804struct ieee80211_bss_max_idle_period_ie {
   3805	__le16 max_idle_period;
   3806	u8 idle_options;
   3807} __packed;
   3808
   3809/* BACK action code */
   3810enum ieee80211_back_actioncode {
   3811	WLAN_ACTION_ADDBA_REQ = 0,
   3812	WLAN_ACTION_ADDBA_RESP = 1,
   3813	WLAN_ACTION_DELBA = 2,
   3814};
   3815
   3816/* BACK (block-ack) parties */
   3817enum ieee80211_back_parties {
   3818	WLAN_BACK_RECIPIENT = 0,
   3819	WLAN_BACK_INITIATOR = 1,
   3820};
   3821
   3822/* SA Query action */
   3823enum ieee80211_sa_query_action {
   3824	WLAN_ACTION_SA_QUERY_REQUEST = 0,
   3825	WLAN_ACTION_SA_QUERY_RESPONSE = 1,
   3826};
   3827
   3828/**
   3829 * struct ieee80211_bssid_index
   3830 *
   3831 * This structure refers to "Multiple BSSID-index element"
   3832 *
   3833 * @bssid_index: BSSID index
   3834 * @dtim_period: optional, overrides transmitted BSS dtim period
   3835 * @dtim_count: optional, overrides transmitted BSS dtim count
   3836 */
   3837struct ieee80211_bssid_index {
   3838	u8 bssid_index;
   3839	u8 dtim_period;
   3840	u8 dtim_count;
   3841};
   3842
   3843/**
   3844 * struct ieee80211_multiple_bssid_configuration
   3845 *
   3846 * This structure refers to "Multiple BSSID Configuration element"
   3847 *
   3848 * @bssid_count: total number of active BSSIDs in the set
   3849 * @profile_periodicity: the least number of beacon frames need to be received
   3850 *	in order to discover all the nontransmitted BSSIDs in the set.
   3851 */
   3852struct ieee80211_multiple_bssid_configuration {
   3853	u8 bssid_count;
   3854	u8 profile_periodicity;
   3855};
   3856
   3857#define SUITE(oui, id)	(((oui) << 8) | (id))
   3858
   3859/* cipher suite selectors */
   3860#define WLAN_CIPHER_SUITE_USE_GROUP	SUITE(0x000FAC, 0)
   3861#define WLAN_CIPHER_SUITE_WEP40		SUITE(0x000FAC, 1)
   3862#define WLAN_CIPHER_SUITE_TKIP		SUITE(0x000FAC, 2)
   3863/* reserved: 				SUITE(0x000FAC, 3) */
   3864#define WLAN_CIPHER_SUITE_CCMP		SUITE(0x000FAC, 4)
   3865#define WLAN_CIPHER_SUITE_WEP104	SUITE(0x000FAC, 5)
   3866#define WLAN_CIPHER_SUITE_AES_CMAC	SUITE(0x000FAC, 6)
   3867#define WLAN_CIPHER_SUITE_GCMP		SUITE(0x000FAC, 8)
   3868#define WLAN_CIPHER_SUITE_GCMP_256	SUITE(0x000FAC, 9)
   3869#define WLAN_CIPHER_SUITE_CCMP_256	SUITE(0x000FAC, 10)
   3870#define WLAN_CIPHER_SUITE_BIP_GMAC_128	SUITE(0x000FAC, 11)
   3871#define WLAN_CIPHER_SUITE_BIP_GMAC_256	SUITE(0x000FAC, 12)
   3872#define WLAN_CIPHER_SUITE_BIP_CMAC_256	SUITE(0x000FAC, 13)
   3873
   3874#define WLAN_CIPHER_SUITE_SMS4		SUITE(0x001472, 1)
   3875
   3876/* AKM suite selectors */
   3877#define WLAN_AKM_SUITE_8021X			SUITE(0x000FAC, 1)
   3878#define WLAN_AKM_SUITE_PSK			SUITE(0x000FAC, 2)
   3879#define WLAN_AKM_SUITE_FT_8021X			SUITE(0x000FAC, 3)
   3880#define WLAN_AKM_SUITE_FT_PSK			SUITE(0x000FAC, 4)
   3881#define WLAN_AKM_SUITE_8021X_SHA256		SUITE(0x000FAC, 5)
   3882#define WLAN_AKM_SUITE_PSK_SHA256		SUITE(0x000FAC, 6)
   3883#define WLAN_AKM_SUITE_TDLS			SUITE(0x000FAC, 7)
   3884#define WLAN_AKM_SUITE_SAE			SUITE(0x000FAC, 8)
   3885#define WLAN_AKM_SUITE_FT_OVER_SAE		SUITE(0x000FAC, 9)
   3886#define WLAN_AKM_SUITE_AP_PEER_KEY		SUITE(0x000FAC, 10)
   3887#define WLAN_AKM_SUITE_8021X_SUITE_B		SUITE(0x000FAC, 11)
   3888#define WLAN_AKM_SUITE_8021X_SUITE_B_192	SUITE(0x000FAC, 12)
   3889#define WLAN_AKM_SUITE_FT_8021X_SHA384		SUITE(0x000FAC, 13)
   3890#define WLAN_AKM_SUITE_FILS_SHA256		SUITE(0x000FAC, 14)
   3891#define WLAN_AKM_SUITE_FILS_SHA384		SUITE(0x000FAC, 15)
   3892#define WLAN_AKM_SUITE_FT_FILS_SHA256		SUITE(0x000FAC, 16)
   3893#define WLAN_AKM_SUITE_FT_FILS_SHA384		SUITE(0x000FAC, 17)
   3894#define WLAN_AKM_SUITE_OWE			SUITE(0x000FAC, 18)
   3895#define WLAN_AKM_SUITE_FT_PSK_SHA384		SUITE(0x000FAC, 19)
   3896#define WLAN_AKM_SUITE_PSK_SHA384		SUITE(0x000FAC, 20)
   3897
   3898#define WLAN_AKM_SUITE_WFA_DPP			SUITE(WLAN_OUI_WFA, 2)
   3899
   3900#define WLAN_MAX_KEY_LEN		32
   3901
   3902#define WLAN_PMK_NAME_LEN		16
   3903#define WLAN_PMKID_LEN			16
   3904#define WLAN_PMK_LEN_EAP_LEAP		16
   3905#define WLAN_PMK_LEN			32
   3906#define WLAN_PMK_LEN_SUITE_B_192	48
   3907
   3908#define WLAN_OUI_WFA			0x506f9a
   3909#define WLAN_OUI_TYPE_WFA_P2P		9
   3910#define WLAN_OUI_TYPE_WFA_DPP		0x1A
   3911#define WLAN_OUI_MICROSOFT		0x0050f2
   3912#define WLAN_OUI_TYPE_MICROSOFT_WPA	1
   3913#define WLAN_OUI_TYPE_MICROSOFT_WMM	2
   3914#define WLAN_OUI_TYPE_MICROSOFT_WPS	4
   3915#define WLAN_OUI_TYPE_MICROSOFT_TPC	8
   3916
   3917/*
   3918 * WMM/802.11e Tspec Element
   3919 */
   3920#define IEEE80211_WMM_IE_TSPEC_TID_MASK		0x0F
   3921#define IEEE80211_WMM_IE_TSPEC_TID_SHIFT	1
   3922
   3923enum ieee80211_tspec_status_code {
   3924	IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED = 0,
   3925	IEEE80211_TSPEC_STATUS_ADDTS_INVAL_PARAMS = 0x1,
   3926};
   3927
   3928struct ieee80211_tspec_ie {
   3929	u8 element_id;
   3930	u8 len;
   3931	u8 oui[3];
   3932	u8 oui_type;
   3933	u8 oui_subtype;
   3934	u8 version;
   3935	__le16 tsinfo;
   3936	u8 tsinfo_resvd;
   3937	__le16 nominal_msdu;
   3938	__le16 max_msdu;
   3939	__le32 min_service_int;
   3940	__le32 max_service_int;
   3941	__le32 inactivity_int;
   3942	__le32 suspension_int;
   3943	__le32 service_start_time;
   3944	__le32 min_data_rate;
   3945	__le32 mean_data_rate;
   3946	__le32 peak_data_rate;
   3947	__le32 max_burst_size;
   3948	__le32 delay_bound;
   3949	__le32 min_phy_rate;
   3950	__le16 sba;
   3951	__le16 medium_time;
   3952} __packed;
   3953
   3954struct ieee80211_he_6ghz_capa {
   3955	/* uses IEEE80211_HE_6GHZ_CAP_* below */
   3956	__le16 capa;
   3957} __packed;
   3958
   3959/* HE 6 GHz band capabilities */
   3960/* uses enum ieee80211_min_mpdu_spacing values */
   3961#define IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START	0x0007
   3962/* uses enum ieee80211_vht_max_ampdu_length_exp values */
   3963#define IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP	0x0038
   3964/* uses IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_* values */
   3965#define IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN	0x00c0
   3966/* WLAN_HT_CAP_SM_PS_* values */
   3967#define IEEE80211_HE_6GHZ_CAP_SM_PS		0x0600
   3968#define IEEE80211_HE_6GHZ_CAP_RD_RESPONDER	0x0800
   3969#define IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS	0x1000
   3970#define IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS	0x2000
   3971
   3972/**
   3973 * ieee80211_get_qos_ctl - get pointer to qos control bytes
   3974 * @hdr: the frame
   3975 *
   3976 * The qos ctrl bytes come after the frame_control, duration, seq_num
   3977 * and 3 or 4 addresses of length ETH_ALEN.
   3978 * 3 addr: 2 + 2 + 2 + 3*6 = 24
   3979 * 4 addr: 2 + 2 + 2 + 4*6 = 30
   3980 */
   3981static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
   3982{
   3983	if (ieee80211_has_a4(hdr->frame_control))
   3984		return (u8 *)hdr + 30;
   3985	else
   3986		return (u8 *)hdr + 24;
   3987}
   3988
   3989/**
   3990 * ieee80211_get_tid - get qos TID
   3991 * @hdr: the frame
   3992 */
   3993static inline u8 ieee80211_get_tid(struct ieee80211_hdr *hdr)
   3994{
   3995	u8 *qc = ieee80211_get_qos_ctl(hdr);
   3996
   3997	return qc[0] & IEEE80211_QOS_CTL_TID_MASK;
   3998}
   3999
   4000/**
   4001 * ieee80211_get_SA - get pointer to SA
   4002 * @hdr: the frame
   4003 *
   4004 * Given an 802.11 frame, this function returns the offset
   4005 * to the source address (SA). It does not verify that the
   4006 * header is long enough to contain the address, and the
   4007 * header must be long enough to contain the frame control
   4008 * field.
   4009 */
   4010static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
   4011{
   4012	if (ieee80211_has_a4(hdr->frame_control))
   4013		return hdr->addr4;
   4014	if (ieee80211_has_fromds(hdr->frame_control))
   4015		return hdr->addr3;
   4016	return hdr->addr2;
   4017}
   4018
   4019/**
   4020 * ieee80211_get_DA - get pointer to DA
   4021 * @hdr: the frame
   4022 *
   4023 * Given an 802.11 frame, this function returns the offset
   4024 * to the destination address (DA). It does not verify that
   4025 * the header is long enough to contain the address, and the
   4026 * header must be long enough to contain the frame control
   4027 * field.
   4028 */
   4029static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
   4030{
   4031	if (ieee80211_has_tods(hdr->frame_control))
   4032		return hdr->addr3;
   4033	else
   4034		return hdr->addr1;
   4035}
   4036
   4037/**
   4038 * _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
   4039 * @hdr: the frame (buffer must include at least the first octet of payload)
   4040 */
   4041static inline bool _ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
   4042{
   4043	if (ieee80211_is_disassoc(hdr->frame_control) ||
   4044	    ieee80211_is_deauth(hdr->frame_control))
   4045		return true;
   4046
   4047	if (ieee80211_is_action(hdr->frame_control)) {
   4048		u8 *category;
   4049
   4050		/*
   4051		 * Action frames, excluding Public Action frames, are Robust
   4052		 * Management Frames. However, if we are looking at a Protected
   4053		 * frame, skip the check since the data may be encrypted and
   4054		 * the frame has already been found to be a Robust Management
   4055		 * Frame (by the other end).
   4056		 */
   4057		if (ieee80211_has_protected(hdr->frame_control))
   4058			return true;
   4059		category = ((u8 *) hdr) + 24;
   4060		return *category != WLAN_CATEGORY_PUBLIC &&
   4061			*category != WLAN_CATEGORY_HT &&
   4062			*category != WLAN_CATEGORY_WNM_UNPROTECTED &&
   4063			*category != WLAN_CATEGORY_SELF_PROTECTED &&
   4064			*category != WLAN_CATEGORY_UNPROT_DMG &&
   4065			*category != WLAN_CATEGORY_VHT &&
   4066			*category != WLAN_CATEGORY_VENDOR_SPECIFIC;
   4067	}
   4068
   4069	return false;
   4070}
   4071
   4072/**
   4073 * ieee80211_is_robust_mgmt_frame - check if skb contains a robust mgmt frame
   4074 * @skb: the skb containing the frame, length will be checked
   4075 */
   4076static inline bool ieee80211_is_robust_mgmt_frame(struct sk_buff *skb)
   4077{
   4078	if (skb->len < IEEE80211_MIN_ACTION_SIZE)
   4079		return false;
   4080	return _ieee80211_is_robust_mgmt_frame((void *)skb->data);
   4081}
   4082
   4083/**
   4084 * ieee80211_is_public_action - check if frame is a public action frame
   4085 * @hdr: the frame
   4086 * @len: length of the frame
   4087 */
   4088static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
   4089					      size_t len)
   4090{
   4091	struct ieee80211_mgmt *mgmt = (void *)hdr;
   4092
   4093	if (len < IEEE80211_MIN_ACTION_SIZE)
   4094		return false;
   4095	if (!ieee80211_is_action(hdr->frame_control))
   4096		return false;
   4097	return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
   4098}
   4099
   4100/**
   4101 * _ieee80211_is_group_privacy_action - check if frame is a group addressed
   4102 * privacy action frame
   4103 * @hdr: the frame
   4104 */
   4105static inline bool _ieee80211_is_group_privacy_action(struct ieee80211_hdr *hdr)
   4106{
   4107	struct ieee80211_mgmt *mgmt = (void *)hdr;
   4108
   4109	if (!ieee80211_is_action(hdr->frame_control) ||
   4110	    !is_multicast_ether_addr(hdr->addr1))
   4111		return false;
   4112
   4113	return mgmt->u.action.category == WLAN_CATEGORY_MESH_ACTION ||
   4114	       mgmt->u.action.category == WLAN_CATEGORY_MULTIHOP_ACTION;
   4115}
   4116
   4117/**
   4118 * ieee80211_is_group_privacy_action - check if frame is a group addressed
   4119 * privacy action frame
   4120 * @skb: the skb containing the frame, length will be checked
   4121 */
   4122static inline bool ieee80211_is_group_privacy_action(struct sk_buff *skb)
   4123{
   4124	if (skb->len < IEEE80211_MIN_ACTION_SIZE)
   4125		return false;
   4126	return _ieee80211_is_group_privacy_action((void *)skb->data);
   4127}
   4128
   4129/**
   4130 * ieee80211_tu_to_usec - convert time units (TU) to microseconds
   4131 * @tu: the TUs
   4132 */
   4133static inline unsigned long ieee80211_tu_to_usec(unsigned long tu)
   4134{
   4135	return 1024 * tu;
   4136}
   4137
   4138/**
   4139 * ieee80211_check_tim - check if AID bit is set in TIM
   4140 * @tim: the TIM IE
   4141 * @tim_len: length of the TIM IE
   4142 * @aid: the AID to look for
   4143 */
   4144static inline bool ieee80211_check_tim(const struct ieee80211_tim_ie *tim,
   4145				       u8 tim_len, u16 aid)
   4146{
   4147	u8 mask;
   4148	u8 index, indexn1, indexn2;
   4149
   4150	if (unlikely(!tim || tim_len < sizeof(*tim)))
   4151		return false;
   4152
   4153	aid &= 0x3fff;
   4154	index = aid / 8;
   4155	mask  = 1 << (aid & 7);
   4156
   4157	indexn1 = tim->bitmap_ctrl & 0xfe;
   4158	indexn2 = tim_len + indexn1 - 4;
   4159
   4160	if (index < indexn1 || index > indexn2)
   4161		return false;
   4162
   4163	index -= indexn1;
   4164
   4165	return !!(tim->virtual_map[index] & mask);
   4166}
   4167
   4168/**
   4169 * ieee80211_get_tdls_action - get tdls packet action (or -1, if not tdls packet)
   4170 * @skb: the skb containing the frame, length will not be checked
   4171 * @hdr_size: the size of the ieee80211_hdr that starts at skb->data
   4172 *
   4173 * This function assumes the frame is a data frame, and that the network header
   4174 * is in the correct place.
   4175 */
   4176static inline int ieee80211_get_tdls_action(struct sk_buff *skb, u32 hdr_size)
   4177{
   4178	if (!skb_is_nonlinear(skb) &&
   4179	    skb->len > (skb_network_offset(skb) + 2)) {
   4180		/* Point to where the indication of TDLS should start */
   4181		const u8 *tdls_data = skb_network_header(skb) - 2;
   4182
   4183		if (get_unaligned_be16(tdls_data) == ETH_P_TDLS &&
   4184		    tdls_data[2] == WLAN_TDLS_SNAP_RFTYPE &&
   4185		    tdls_data[3] == WLAN_CATEGORY_TDLS)
   4186			return tdls_data[4];
   4187	}
   4188
   4189	return -1;
   4190}
   4191
   4192/* convert time units */
   4193#define TU_TO_JIFFIES(x)	(usecs_to_jiffies((x) * 1024))
   4194#define TU_TO_EXP_TIME(x)	(jiffies + TU_TO_JIFFIES(x))
   4195
   4196/* convert frequencies */
   4197#define MHZ_TO_KHZ(freq) ((freq) * 1000)
   4198#define KHZ_TO_MHZ(freq) ((freq) / 1000)
   4199#define PR_KHZ(f) KHZ_TO_MHZ(f), f % 1000
   4200#define KHZ_F "%d.%03d"
   4201
   4202/* convert powers */
   4203#define DBI_TO_MBI(gain) ((gain) * 100)
   4204#define MBI_TO_DBI(gain) ((gain) / 100)
   4205#define DBM_TO_MBM(gain) ((gain) * 100)
   4206#define MBM_TO_DBM(gain) ((gain) / 100)
   4207
   4208/**
   4209 * ieee80211_action_contains_tpc - checks if the frame contains TPC element
   4210 * @skb: the skb containing the frame, length will be checked
   4211 *
   4212 * This function checks if it's either TPC report action frame or Link
   4213 * Measurement report action frame as defined in IEEE Std. 802.11-2012 8.5.2.5
   4214 * and 8.5.7.5 accordingly.
   4215 */
   4216static inline bool ieee80211_action_contains_tpc(struct sk_buff *skb)
   4217{
   4218	struct ieee80211_mgmt *mgmt = (void *)skb->data;
   4219
   4220	if (!ieee80211_is_action(mgmt->frame_control))
   4221		return false;
   4222
   4223	if (skb->len < IEEE80211_MIN_ACTION_SIZE +
   4224		       sizeof(mgmt->u.action.u.tpc_report))
   4225		return false;
   4226
   4227	/*
   4228	 * TPC report - check that:
   4229	 * category = 0 (Spectrum Management) or 5 (Radio Measurement)
   4230	 * spectrum management action = 3 (TPC/Link Measurement report)
   4231	 * TPC report EID = 35
   4232	 * TPC report element length = 2
   4233	 *
   4234	 * The spectrum management's tpc_report struct is used here both for
   4235	 * parsing tpc_report and radio measurement's link measurement report
   4236	 * frame, since the relevant part is identical in both frames.
   4237	 */
   4238	if (mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT &&
   4239	    mgmt->u.action.category != WLAN_CATEGORY_RADIO_MEASUREMENT)
   4240		return false;
   4241
   4242	/* both spectrum mgmt and link measurement have same action code */
   4243	if (mgmt->u.action.u.tpc_report.action_code !=
   4244	    WLAN_ACTION_SPCT_TPC_RPRT)
   4245		return false;
   4246
   4247	if (mgmt->u.action.u.tpc_report.tpc_elem_id != WLAN_EID_TPC_REPORT ||
   4248	    mgmt->u.action.u.tpc_report.tpc_elem_length !=
   4249	    sizeof(struct ieee80211_tpc_report_ie))
   4250		return false;
   4251
   4252	return true;
   4253}
   4254
   4255struct element {
   4256	u8 id;
   4257	u8 datalen;
   4258	u8 data[];
   4259} __packed;
   4260
   4261/* element iteration helpers */
   4262#define for_each_element(_elem, _data, _datalen)			\
   4263	for (_elem = (const struct element *)(_data);			\
   4264	     (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >=	\
   4265		(int)sizeof(*_elem) &&					\
   4266	     (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >=	\
   4267		(int)sizeof(*_elem) + _elem->datalen;			\
   4268	     _elem = (const struct element *)(_elem->data + _elem->datalen))
   4269
   4270#define for_each_element_id(element, _id, data, datalen)		\
   4271	for_each_element(element, data, datalen)			\
   4272		if (element->id == (_id))
   4273
   4274#define for_each_element_extid(element, extid, _data, _datalen)		\
   4275	for_each_element(element, _data, _datalen)			\
   4276		if (element->id == WLAN_EID_EXTENSION &&		\
   4277		    element->datalen > 0 &&				\
   4278		    element->data[0] == (extid))
   4279
   4280#define for_each_subelement(sub, element)				\
   4281	for_each_element(sub, (element)->data, (element)->datalen)
   4282
   4283#define for_each_subelement_id(sub, id, element)			\
   4284	for_each_element_id(sub, id, (element)->data, (element)->datalen)
   4285
   4286#define for_each_subelement_extid(sub, extid, element)			\
   4287	for_each_element_extid(sub, extid, (element)->data, (element)->datalen)
   4288
   4289/**
   4290 * for_each_element_completed - determine if element parsing consumed all data
   4291 * @element: element pointer after for_each_element() or friends
   4292 * @data: same data pointer as passed to for_each_element() or friends
   4293 * @datalen: same data length as passed to for_each_element() or friends
   4294 *
   4295 * This function returns %true if all the data was parsed or considered
   4296 * while walking the elements. Only use this if your for_each_element()
   4297 * loop cannot be broken out of, otherwise it always returns %false.
   4298 *
   4299 * If some data was malformed, this returns %false since the last parsed
   4300 * element will not fill the whole remaining data.
   4301 */
   4302static inline bool for_each_element_completed(const struct element *element,
   4303					      const void *data, size_t datalen)
   4304{
   4305	return (const u8 *)element == (const u8 *)data + datalen;
   4306}
   4307
   4308/**
   4309 * RSNX Capabilities:
   4310 * bits 0-3: Field length (n-1)
   4311 */
   4312#define WLAN_RSNX_CAPA_PROTECTED_TWT BIT(4)
   4313#define WLAN_RSNX_CAPA_SAE_H2E BIT(5)
   4314
   4315/*
   4316 * reduced neighbor report, based on Draft P802.11ax_D6.1,
   4317 * section 9.4.2.170 and accepted contributions.
   4318 */
   4319#define IEEE80211_AP_INFO_TBTT_HDR_TYPE				0x03
   4320#define IEEE80211_AP_INFO_TBTT_HDR_FILTERED			0x04
   4321#define IEEE80211_AP_INFO_TBTT_HDR_COLOC			0x08
   4322#define IEEE80211_AP_INFO_TBTT_HDR_COUNT			0xF0
   4323#define IEEE80211_TBTT_INFO_OFFSET_BSSID_BSS_PARAM		9
   4324#define IEEE80211_TBTT_INFO_OFFSET_BSSID_SSSID_BSS_PARAM	13
   4325
   4326#define IEEE80211_RNR_TBTT_PARAMS_OCT_RECOMMENDED		0x01
   4327#define IEEE80211_RNR_TBTT_PARAMS_SAME_SSID			0x02
   4328#define IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID			0x04
   4329#define IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID		0x08
   4330#define IEEE80211_RNR_TBTT_PARAMS_COLOC_ESS			0x10
   4331#define IEEE80211_RNR_TBTT_PARAMS_PROBE_ACTIVE			0x20
   4332#define IEEE80211_RNR_TBTT_PARAMS_COLOC_AP			0x40
   4333
   4334struct ieee80211_neighbor_ap_info {
   4335	u8 tbtt_info_hdr;
   4336	u8 tbtt_info_len;
   4337	u8 op_class;
   4338	u8 channel;
   4339} __packed;
   4340
   4341enum ieee80211_range_params_max_total_ltf {
   4342	IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_4 = 0,
   4343	IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_8,
   4344	IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_16,
   4345	IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_UNSPECIFIED,
   4346};
   4347
   4348#endif /* LINUX_IEEE80211_H */