LCOV - code coverage report
Current view: top level - include/linux - ieee80211.h (source / functions) Hit Total Coverage
Test: gcov_data_raspi2_real_modules_combined.info Lines: 0 22 0.0 %
Date: 2020-09-30 20:25:40 Functions: 0 0 -
Branches: 0 6 0.0 %

           Branch data     Line data    Source code
       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 - 2019 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 <asm/byteorder.h>
      22                 :            : #include <asm/unaligned.h>
      23                 :            : 
      24                 :            : /*
      25                 :            :  * DS bit usage
      26                 :            :  *
      27                 :            :  * TA = transmitter address
      28                 :            :  * RA = receiver address
      29                 :            :  * DA = destination address
      30                 :            :  * SA = source address
      31                 :            :  *
      32                 :            :  * ToDS    FromDS  A1(RA)  A2(TA)  A3      A4      Use
      33                 :            :  * -----------------------------------------------------------------
      34                 :            :  *  0       0       DA      SA      BSSID   -       IBSS/DLS
      35                 :            :  *  0       1       DA      BSSID   SA      -       AP -> STA
      36                 :            :  *  1       0       BSSID   SA      DA      -       AP <- STA
      37                 :            :  *  1       1       RA      TA      DA      SA      unspecified (WDS)
      38                 :            :  */
      39                 :            : 
      40                 :            : #define FCS_LEN 4
      41                 :            : 
      42                 :            : #define IEEE80211_FCTL_VERS             0x0003
      43                 :            : #define IEEE80211_FCTL_FTYPE            0x000c
      44                 :            : #define IEEE80211_FCTL_STYPE            0x00f0
      45                 :            : #define IEEE80211_FCTL_TODS             0x0100
      46                 :            : #define IEEE80211_FCTL_FROMDS           0x0200
      47                 :            : #define IEEE80211_FCTL_MOREFRAGS        0x0400
      48                 :            : #define IEEE80211_FCTL_RETRY            0x0800
      49                 :            : #define IEEE80211_FCTL_PM               0x1000
      50                 :            : #define IEEE80211_FCTL_MOREDATA         0x2000
      51                 :            : #define IEEE80211_FCTL_PROTECTED        0x4000
      52                 :            : #define IEEE80211_FCTL_ORDER            0x8000
      53                 :            : #define IEEE80211_FCTL_CTL_EXT          0x0f00
      54                 :            : 
      55                 :            : #define IEEE80211_SCTL_FRAG             0x000F
      56                 :            : #define IEEE80211_SCTL_SEQ              0xFFF0
      57                 :            : 
      58                 :            : #define IEEE80211_FTYPE_MGMT            0x0000
      59                 :            : #define IEEE80211_FTYPE_CTL             0x0004
      60                 :            : #define IEEE80211_FTYPE_DATA            0x0008
      61                 :            : #define IEEE80211_FTYPE_EXT             0x000c
      62                 :            : 
      63                 :            : /* management */
      64                 :            : #define IEEE80211_STYPE_ASSOC_REQ       0x0000
      65                 :            : #define IEEE80211_STYPE_ASSOC_RESP      0x0010
      66                 :            : #define IEEE80211_STYPE_REASSOC_REQ     0x0020
      67                 :            : #define IEEE80211_STYPE_REASSOC_RESP    0x0030
      68                 :            : #define IEEE80211_STYPE_PROBE_REQ       0x0040
      69                 :            : #define IEEE80211_STYPE_PROBE_RESP      0x0050
      70                 :            : #define IEEE80211_STYPE_BEACON          0x0080
      71                 :            : #define IEEE80211_STYPE_ATIM            0x0090
      72                 :            : #define IEEE80211_STYPE_DISASSOC        0x00A0
      73                 :            : #define IEEE80211_STYPE_AUTH            0x00B0
      74                 :            : #define IEEE80211_STYPE_DEAUTH          0x00C0
      75                 :            : #define IEEE80211_STYPE_ACTION          0x00D0
      76                 :            : 
      77                 :            : /* control */
      78                 :            : #define IEEE80211_STYPE_CTL_EXT         0x0060
      79                 :            : #define IEEE80211_STYPE_BACK_REQ        0x0080
      80                 :            : #define IEEE80211_STYPE_BACK            0x0090
      81                 :            : #define IEEE80211_STYPE_PSPOLL          0x00A0
      82                 :            : #define IEEE80211_STYPE_RTS             0x00B0
      83                 :            : #define IEEE80211_STYPE_CTS             0x00C0
      84                 :            : #define IEEE80211_STYPE_ACK             0x00D0
      85                 :            : #define IEEE80211_STYPE_CFEND           0x00E0
      86                 :            : #define IEEE80211_STYPE_CFENDACK        0x00F0
      87                 :            : 
      88                 :            : /* data */
      89                 :            : #define IEEE80211_STYPE_DATA                    0x0000
      90                 :            : #define IEEE80211_STYPE_DATA_CFACK              0x0010
      91                 :            : #define IEEE80211_STYPE_DATA_CFPOLL             0x0020
      92                 :            : #define IEEE80211_STYPE_DATA_CFACKPOLL          0x0030
      93                 :            : #define IEEE80211_STYPE_NULLFUNC                0x0040
      94                 :            : #define IEEE80211_STYPE_CFACK                   0x0050
      95                 :            : #define IEEE80211_STYPE_CFPOLL                  0x0060
      96                 :            : #define IEEE80211_STYPE_CFACKPOLL               0x0070
      97                 :            : #define IEEE80211_STYPE_QOS_DATA                0x0080
      98                 :            : #define IEEE80211_STYPE_QOS_DATA_CFACK          0x0090
      99                 :            : #define IEEE80211_STYPE_QOS_DATA_CFPOLL         0x00A0
     100                 :            : #define IEEE80211_STYPE_QOS_DATA_CFACKPOLL      0x00B0
     101                 :            : #define IEEE80211_STYPE_QOS_NULLFUNC            0x00C0
     102                 :            : #define IEEE80211_STYPE_QOS_CFACK               0x00D0
     103                 :            : #define IEEE80211_STYPE_QOS_CFPOLL              0x00E0
     104                 :            : #define IEEE80211_STYPE_QOS_CFACKPOLL           0x00F0
     105                 :            : 
     106                 :            : /* extension, added by 802.11ad */
     107                 :            : #define IEEE80211_STYPE_DMG_BEACON              0x0000
     108                 :            : 
     109                 :            : /* control extension - for IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTL_EXT */
     110                 :            : #define IEEE80211_CTL_EXT_POLL          0x2000
     111                 :            : #define IEEE80211_CTL_EXT_SPR           0x3000
     112                 :            : #define IEEE80211_CTL_EXT_GRANT 0x4000
     113                 :            : #define IEEE80211_CTL_EXT_DMG_CTS       0x5000
     114                 :            : #define IEEE80211_CTL_EXT_DMG_DTS       0x6000
     115                 :            : #define IEEE80211_CTL_EXT_SSW           0x8000
     116                 :            : #define IEEE80211_CTL_EXT_SSW_FBACK     0x9000
     117                 :            : #define IEEE80211_CTL_EXT_SSW_ACK       0xa000
     118                 :            : 
     119                 :            : 
     120                 :            : #define IEEE80211_SN_MASK               ((IEEE80211_SCTL_SEQ) >> 4)
     121                 :            : #define IEEE80211_MAX_SN                IEEE80211_SN_MASK
     122                 :            : #define IEEE80211_SN_MODULO             (IEEE80211_MAX_SN + 1)
     123                 :            : 
     124                 :            : static inline bool ieee80211_sn_less(u16 sn1, u16 sn2)
     125                 :            : {
     126                 :            :         return ((sn1 - sn2) & IEEE80211_SN_MASK) > (IEEE80211_SN_MODULO >> 1);
     127                 :            : }
     128                 :            : 
     129                 :            : static inline u16 ieee80211_sn_add(u16 sn1, u16 sn2)
     130                 :            : {
     131                 :            :         return (sn1 + sn2) & IEEE80211_SN_MASK;
     132                 :            : }
     133                 :            : 
     134                 :            : static inline u16 ieee80211_sn_inc(u16 sn)
     135                 :            : {
     136                 :            :         return ieee80211_sn_add(sn, 1);
     137                 :            : }
     138                 :            : 
     139                 :            : static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
     140                 :            : {
     141                 :            :         return (sn1 - sn2) & IEEE80211_SN_MASK;
     142                 :            : }
     143                 :            : 
     144                 :            : #define IEEE80211_SEQ_TO_SN(seq)        (((seq) & IEEE80211_SCTL_SEQ) >> 4)
     145                 :            : #define IEEE80211_SN_TO_SEQ(ssn)        (((ssn) << 4) & IEEE80211_SCTL_SEQ)
     146                 :            : 
     147                 :            : /* miscellaneous IEEE 802.11 constants */
     148                 :            : #define IEEE80211_MAX_FRAG_THRESHOLD    2352
     149                 :            : #define IEEE80211_MAX_RTS_THRESHOLD     2353
     150                 :            : #define IEEE80211_MAX_AID               2007
     151                 :            : #define IEEE80211_MAX_TIM_LEN           251
     152                 :            : #define IEEE80211_MAX_MESH_PEERINGS     63
     153                 :            : /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
     154                 :            :    6.2.1.1.2.
     155                 :            : 
     156                 :            :    802.11e clarifies the figure in section 7.1.2. The frame body is
     157                 :            :    up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */
     158                 :            : #define IEEE80211_MAX_DATA_LEN          2304
     159                 :            : /* 802.11ad extends maximum MSDU size for DMG (freq > 40Ghz) networks
     160                 :            :  * to 7920 bytes, see 8.2.3 General frame format
     161                 :            :  */
     162                 :            : #define IEEE80211_MAX_DATA_LEN_DMG      7920
     163                 :            : /* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */
     164                 :            : #define IEEE80211_MAX_FRAME_LEN         2352
     165                 :            : 
     166                 :            : /* Maximal size of an A-MSDU that can be transported in a HT BA session */
     167                 :            : #define IEEE80211_MAX_MPDU_LEN_HT_BA            4095
     168                 :            : 
     169                 :            : /* Maximal size of an A-MSDU */
     170                 :            : #define IEEE80211_MAX_MPDU_LEN_HT_3839          3839
     171                 :            : #define IEEE80211_MAX_MPDU_LEN_HT_7935          7935
     172                 :            : 
     173                 :            : #define IEEE80211_MAX_MPDU_LEN_VHT_3895         3895
     174                 :            : #define IEEE80211_MAX_MPDU_LEN_VHT_7991         7991
     175                 :            : #define IEEE80211_MAX_MPDU_LEN_VHT_11454        11454
     176                 :            : 
     177                 :            : #define IEEE80211_MAX_SSID_LEN          32
     178                 :            : 
     179                 :            : #define IEEE80211_MAX_MESH_ID_LEN       32
     180                 :            : 
     181                 :            : #define IEEE80211_FIRST_TSPEC_TSID      8
     182                 :            : #define IEEE80211_NUM_TIDS              16
     183                 :            : 
     184                 :            : /* number of user priorities 802.11 uses */
     185                 :            : #define IEEE80211_NUM_UPS               8
     186                 :            : /* number of ACs */
     187                 :            : #define IEEE80211_NUM_ACS               4
     188                 :            : 
     189                 :            : #define IEEE80211_QOS_CTL_LEN           2
     190                 :            : /* 1d tag mask */
     191                 :            : #define IEEE80211_QOS_CTL_TAG1D_MASK            0x0007
     192                 :            : /* TID mask */
     193                 :            : #define IEEE80211_QOS_CTL_TID_MASK              0x000f
     194                 :            : /* EOSP */
     195                 :            : #define IEEE80211_QOS_CTL_EOSP                  0x0010
     196                 :            : /* ACK policy */
     197                 :            : #define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL     0x0000
     198                 :            : #define IEEE80211_QOS_CTL_ACK_POLICY_NOACK      0x0020
     199                 :            : #define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL    0x0040
     200                 :            : #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK   0x0060
     201                 :            : #define IEEE80211_QOS_CTL_ACK_POLICY_MASK       0x0060
     202                 :            : /* A-MSDU 802.11n */
     203                 :            : #define IEEE80211_QOS_CTL_A_MSDU_PRESENT        0x0080
     204                 :            : /* Mesh Control 802.11s */
     205                 :            : #define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT  0x0100
     206                 :            : 
     207                 :            : /* Mesh Power Save Level */
     208                 :            : #define IEEE80211_QOS_CTL_MESH_PS_LEVEL         0x0200
     209                 :            : /* Mesh Receiver Service Period Initiated */
     210                 :            : #define IEEE80211_QOS_CTL_RSPI                  0x0400
     211                 :            : 
     212                 :            : /* U-APSD queue for WMM IEs sent by AP */
     213                 :            : #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD       (1<<7)
     214                 :            : #define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK  0x0f
     215                 :            : 
     216                 :            : /* U-APSD queues for WMM IEs sent by STA */
     217                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO      (1<<0)
     218                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI      (1<<1)
     219                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK      (1<<2)
     220                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE      (1<<3)
     221                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK    0x0f
     222                 :            : 
     223                 :            : /* U-APSD max SP length for WMM IEs sent by STA */
     224                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL     0x00
     225                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_SP_2       0x01
     226                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_SP_4       0x02
     227                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_SP_6       0x03
     228                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK    0x03
     229                 :            : #define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT   5
     230                 :            : 
     231                 :            : #define IEEE80211_HT_CTL_LEN            4
     232                 :            : 
     233                 :            : struct ieee80211_hdr {
     234                 :            :         __le16 frame_control;
     235                 :            :         __le16 duration_id;
     236                 :            :         u8 addr1[ETH_ALEN];
     237                 :            :         u8 addr2[ETH_ALEN];
     238                 :            :         u8 addr3[ETH_ALEN];
     239                 :            :         __le16 seq_ctrl;
     240                 :            :         u8 addr4[ETH_ALEN];
     241                 :            : } __packed __aligned(2);
     242                 :            : 
     243                 :            : struct ieee80211_hdr_3addr {
     244                 :            :         __le16 frame_control;
     245                 :            :         __le16 duration_id;
     246                 :            :         u8 addr1[ETH_ALEN];
     247                 :            :         u8 addr2[ETH_ALEN];
     248                 :            :         u8 addr3[ETH_ALEN];
     249                 :            :         __le16 seq_ctrl;
     250                 :            : } __packed __aligned(2);
     251                 :            : 
     252                 :            : struct ieee80211_qos_hdr {
     253                 :            :         __le16 frame_control;
     254                 :            :         __le16 duration_id;
     255                 :            :         u8 addr1[ETH_ALEN];
     256                 :            :         u8 addr2[ETH_ALEN];
     257                 :            :         u8 addr3[ETH_ALEN];
     258                 :            :         __le16 seq_ctrl;
     259                 :            :         __le16 qos_ctrl;
     260                 :            : } __packed __aligned(2);
     261                 :            : 
     262                 :            : /**
     263                 :            :  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
     264                 :            :  * @fc: frame control bytes in little-endian byteorder
     265                 :            :  */
     266                 :            : static inline bool ieee80211_has_tods(__le16 fc)
     267                 :            : {
     268                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
     269                 :            : }
     270                 :            : 
     271                 :            : /**
     272                 :            :  * ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
     273                 :            :  * @fc: frame control bytes in little-endian byteorder
     274                 :            :  */
     275                 :            : static inline bool ieee80211_has_fromds(__le16 fc)
     276                 :            : {
     277                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
     278                 :            : }
     279                 :            : 
     280                 :            : /**
     281                 :            :  * ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and IEEE80211_FCTL_FROMDS are set
     282                 :            :  * @fc: frame control bytes in little-endian byteorder
     283                 :            :  */
     284                 :            : static inline bool ieee80211_has_a4(__le16 fc)
     285                 :            : {
     286                 :            :         __le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
     287                 :          0 :         return (fc & tmp) == tmp;
     288                 :            : }
     289                 :            : 
     290                 :            : /**
     291                 :            :  * ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
     292                 :            :  * @fc: frame control bytes in little-endian byteorder
     293                 :            :  */
     294                 :            : static inline bool ieee80211_has_morefrags(__le16 fc)
     295                 :            : {
     296                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
     297                 :            : }
     298                 :            : 
     299                 :            : /**
     300                 :            :  * ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
     301                 :            :  * @fc: frame control bytes in little-endian byteorder
     302                 :            :  */
     303                 :            : static inline bool ieee80211_has_retry(__le16 fc)
     304                 :            : {
     305                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
     306                 :            : }
     307                 :            : 
     308                 :            : /**
     309                 :            :  * ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
     310                 :            :  * @fc: frame control bytes in little-endian byteorder
     311                 :            :  */
     312                 :            : static inline bool ieee80211_has_pm(__le16 fc)
     313                 :            : {
     314                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
     315                 :            : }
     316                 :            : 
     317                 :            : /**
     318                 :            :  * ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
     319                 :            :  * @fc: frame control bytes in little-endian byteorder
     320                 :            :  */
     321                 :            : static inline bool ieee80211_has_moredata(__le16 fc)
     322                 :            : {
     323                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
     324                 :            : }
     325                 :            : 
     326                 :            : /**
     327                 :            :  * ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
     328                 :            :  * @fc: frame control bytes in little-endian byteorder
     329                 :            :  */
     330                 :            : static inline bool ieee80211_has_protected(__le16 fc)
     331                 :            : {
     332                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
     333                 :            : }
     334                 :            : 
     335                 :            : /**
     336                 :            :  * ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
     337                 :            :  * @fc: frame control bytes in little-endian byteorder
     338                 :            :  */
     339                 :            : static inline bool ieee80211_has_order(__le16 fc)
     340                 :            : {
     341                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
     342                 :            : }
     343                 :            : 
     344                 :            : /**
     345                 :            :  * ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
     346                 :            :  * @fc: frame control bytes in little-endian byteorder
     347                 :            :  */
     348                 :            : static inline bool ieee80211_is_mgmt(__le16 fc)
     349                 :            : {
     350                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
     351                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT);
     352                 :            : }
     353                 :            : 
     354                 :            : /**
     355                 :            :  * ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
     356                 :            :  * @fc: frame control bytes in little-endian byteorder
     357                 :            :  */
     358                 :            : static inline bool ieee80211_is_ctl(__le16 fc)
     359                 :            : {
     360                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
     361                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL);
     362                 :            : }
     363                 :            : 
     364                 :            : /**
     365                 :            :  * ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
     366                 :            :  * @fc: frame control bytes in little-endian byteorder
     367                 :            :  */
     368                 :            : static inline bool ieee80211_is_data(__le16 fc)
     369                 :            : {
     370                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
     371                 :            :                cpu_to_le16(IEEE80211_FTYPE_DATA);
     372                 :            : }
     373                 :            : 
     374                 :            : /**
     375                 :            :  * ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA and IEEE80211_STYPE_QOS_DATA is set
     376                 :            :  * @fc: frame control bytes in little-endian byteorder
     377                 :            :  */
     378                 :            : static inline bool ieee80211_is_data_qos(__le16 fc)
     379                 :            : {
     380                 :            :         /*
     381                 :            :          * mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
     382                 :            :          * to check the one bit
     383                 :            :          */
     384                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
     385                 :            :                cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
     386                 :            : }
     387                 :            : 
     388                 :            : /**
     389                 :            :  * ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
     390                 :            :  * @fc: frame control bytes in little-endian byteorder
     391                 :            :  */
     392                 :            : static inline bool ieee80211_is_data_present(__le16 fc)
     393                 :            : {
     394                 :            :         /*
     395                 :            :          * mask with 0x40 and test that that bit is clear to only return true
     396                 :            :          * for the data-containing substypes.
     397                 :            :          */
     398                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
     399                 :            :                cpu_to_le16(IEEE80211_FTYPE_DATA);
     400                 :            : }
     401                 :            : 
     402                 :            : /**
     403                 :            :  * ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_REQ
     404                 :            :  * @fc: frame control bytes in little-endian byteorder
     405                 :            :  */
     406                 :            : static inline bool ieee80211_is_assoc_req(__le16 fc)
     407                 :            : {
     408                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     409                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
     410                 :            : }
     411                 :            : 
     412                 :            : /**
     413                 :            :  * ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_RESP
     414                 :            :  * @fc: frame control bytes in little-endian byteorder
     415                 :            :  */
     416                 :            : static inline bool ieee80211_is_assoc_resp(__le16 fc)
     417                 :            : {
     418                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     419                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
     420                 :            : }
     421                 :            : 
     422                 :            : /**
     423                 :            :  * ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_REQ
     424                 :            :  * @fc: frame control bytes in little-endian byteorder
     425                 :            :  */
     426                 :            : static inline bool ieee80211_is_reassoc_req(__le16 fc)
     427                 :            : {
     428                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     429                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
     430                 :            : }
     431                 :            : 
     432                 :            : /**
     433                 :            :  * ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_RESP
     434                 :            :  * @fc: frame control bytes in little-endian byteorder
     435                 :            :  */
     436                 :            : static inline bool ieee80211_is_reassoc_resp(__le16 fc)
     437                 :            : {
     438                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     439                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
     440                 :            : }
     441                 :            : 
     442                 :            : /**
     443                 :            :  * ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_REQ
     444                 :            :  * @fc: frame control bytes in little-endian byteorder
     445                 :            :  */
     446                 :            : static inline bool ieee80211_is_probe_req(__le16 fc)
     447                 :            : {
     448                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     449                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
     450                 :            : }
     451                 :            : 
     452                 :            : /**
     453                 :            :  * ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_RESP
     454                 :            :  * @fc: frame control bytes in little-endian byteorder
     455                 :            :  */
     456                 :            : static inline bool ieee80211_is_probe_resp(__le16 fc)
     457                 :            : {
     458                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     459                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
     460                 :            : }
     461                 :            : 
     462                 :            : /**
     463                 :            :  * ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_BEACON
     464                 :            :  * @fc: frame control bytes in little-endian byteorder
     465                 :            :  */
     466                 :            : static inline bool ieee80211_is_beacon(__le16 fc)
     467                 :            : {
     468                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     469                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
     470                 :            : }
     471                 :            : 
     472                 :            : /**
     473                 :            :  * ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
     474                 :            :  * @fc: frame control bytes in little-endian byteorder
     475                 :            :  */
     476                 :            : static inline bool ieee80211_is_atim(__le16 fc)
     477                 :            : {
     478                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     479                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
     480                 :            : }
     481                 :            : 
     482                 :            : /**
     483                 :            :  * ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DISASSOC
     484                 :            :  * @fc: frame control bytes in little-endian byteorder
     485                 :            :  */
     486                 :            : static inline bool ieee80211_is_disassoc(__le16 fc)
     487                 :            : {
     488                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     489                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
     490                 :            : }
     491                 :            : 
     492                 :            : /**
     493                 :            :  * ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
     494                 :            :  * @fc: frame control bytes in little-endian byteorder
     495                 :            :  */
     496                 :            : static inline bool ieee80211_is_auth(__le16 fc)
     497                 :            : {
     498                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     499                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
     500                 :            : }
     501                 :            : 
     502                 :            : /**
     503                 :            :  * ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DEAUTH
     504                 :            :  * @fc: frame control bytes in little-endian byteorder
     505                 :            :  */
     506                 :            : static inline bool ieee80211_is_deauth(__le16 fc)
     507                 :            : {
     508                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     509                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
     510                 :            : }
     511                 :            : 
     512                 :            : /**
     513                 :            :  * ieee80211_is_action - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ACTION
     514                 :            :  * @fc: frame control bytes in little-endian byteorder
     515                 :            :  */
     516                 :            : static inline bool ieee80211_is_action(__le16 fc)
     517                 :            : {
     518                 :          0 :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     519                 :            :                cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
     520                 :            : }
     521                 :            : 
     522                 :            : /**
     523                 :            :  * ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK_REQ
     524                 :            :  * @fc: frame control bytes in little-endian byteorder
     525                 :            :  */
     526                 :            : static inline bool ieee80211_is_back_req(__le16 fc)
     527                 :            : {
     528                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     529                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
     530                 :            : }
     531                 :            : 
     532                 :            : /**
     533                 :            :  * ieee80211_is_back - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK
     534                 :            :  * @fc: frame control bytes in little-endian byteorder
     535                 :            :  */
     536                 :            : static inline bool ieee80211_is_back(__le16 fc)
     537                 :            : {
     538                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     539                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
     540                 :            : }
     541                 :            : 
     542                 :            : /**
     543                 :            :  * ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_PSPOLL
     544                 :            :  * @fc: frame control bytes in little-endian byteorder
     545                 :            :  */
     546                 :            : static inline bool ieee80211_is_pspoll(__le16 fc)
     547                 :            : {
     548                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     549                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
     550                 :            : }
     551                 :            : 
     552                 :            : /**
     553                 :            :  * ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
     554                 :            :  * @fc: frame control bytes in little-endian byteorder
     555                 :            :  */
     556                 :            : static inline bool ieee80211_is_rts(__le16 fc)
     557                 :            : {
     558                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     559                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
     560                 :            : }
     561                 :            : 
     562                 :            : /**
     563                 :            :  * ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
     564                 :            :  * @fc: frame control bytes in little-endian byteorder
     565                 :            :  */
     566                 :            : static inline bool ieee80211_is_cts(__le16 fc)
     567                 :            : {
     568                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     569                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
     570                 :            : }
     571                 :            : 
     572                 :            : /**
     573                 :            :  * ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
     574                 :            :  * @fc: frame control bytes in little-endian byteorder
     575                 :            :  */
     576                 :            : static inline bool ieee80211_is_ack(__le16 fc)
     577                 :            : {
     578                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     579                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
     580                 :            : }
     581                 :            : 
     582                 :            : /**
     583                 :            :  * ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
     584                 :            :  * @fc: frame control bytes in little-endian byteorder
     585                 :            :  */
     586                 :            : static inline bool ieee80211_is_cfend(__le16 fc)
     587                 :            : {
     588                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     589                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
     590                 :            : }
     591                 :            : 
     592                 :            : /**
     593                 :            :  * ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFENDACK
     594                 :            :  * @fc: frame control bytes in little-endian byteorder
     595                 :            :  */
     596                 :            : static inline bool ieee80211_is_cfendack(__le16 fc)
     597                 :            : {
     598                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     599                 :            :                cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
     600                 :            : }
     601                 :            : 
     602                 :            : /**
     603                 :            :  * ieee80211_is_nullfunc - check if frame is a regular (non-QoS) nullfunc frame
     604                 :            :  * @fc: frame control bytes in little-endian byteorder
     605                 :            :  */
     606                 :            : static inline bool ieee80211_is_nullfunc(__le16 fc)
     607                 :            : {
     608                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     609                 :            :                cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
     610                 :            : }
     611                 :            : 
     612                 :            : /**
     613                 :            :  * ieee80211_is_qos_nullfunc - check if frame is a QoS nullfunc frame
     614                 :            :  * @fc: frame control bytes in little-endian byteorder
     615                 :            :  */
     616                 :            : static inline bool ieee80211_is_qos_nullfunc(__le16 fc)
     617                 :            : {
     618                 :            :         return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
     619                 :            :                cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
     620                 :            : }
     621                 :            : 
     622                 :            : /**
     623                 :            :  * ieee80211_is_any_nullfunc - check if frame is regular or QoS nullfunc frame
     624                 :            :  * @fc: frame control bytes in little-endian byteorder
     625                 :            :  */
     626                 :            : static inline bool ieee80211_is_any_nullfunc(__le16 fc)
     627                 :            : {
     628                 :            :         return (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc));
     629                 :            : }
     630                 :            : 
     631                 :            : /**
     632                 :            :  * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
     633                 :            :  * @fc: frame control field in little-endian byteorder
     634                 :            :  */
     635                 :            : static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
     636                 :            : {
     637                 :            :         /* IEEE 802.11-2012, definition of "bufferable management frame";
     638                 :            :          * note that this ignores the IBSS special case. */
     639                 :            :         return ieee80211_is_mgmt(fc) &&
     640                 :            :                (ieee80211_is_action(fc) ||
     641                 :            :                 ieee80211_is_disassoc(fc) ||
     642                 :            :                 ieee80211_is_deauth(fc));
     643                 :            : }
     644                 :            : 
     645                 :            : /**
     646                 :            :  * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
     647                 :            :  * @seq_ctrl: frame sequence control bytes in little-endian byteorder
     648                 :            :  */
     649                 :            : static inline bool ieee80211_is_first_frag(__le16 seq_ctrl)
     650                 :            : {
     651                 :            :         return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0;
     652                 :            : }
     653                 :            : 
     654                 :            : /**
     655                 :            :  * ieee80211_is_frag - check if a frame is a fragment
     656                 :            :  * @hdr: 802.11 header of the frame
     657                 :            :  */
     658                 :            : static inline bool ieee80211_is_frag(struct ieee80211_hdr *hdr)
     659                 :            : {
     660                 :            :         return ieee80211_has_morefrags(hdr->frame_control) ||
     661                 :            :                hdr->seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG);
     662                 :            : }
     663                 :            : 
     664                 :            : struct ieee80211s_hdr {
     665                 :            :         u8 flags;
     666                 :            :         u8 ttl;
     667                 :            :         __le32 seqnum;
     668                 :            :         u8 eaddr1[ETH_ALEN];
     669                 :            :         u8 eaddr2[ETH_ALEN];
     670                 :            : } __packed __aligned(2);
     671                 :            : 
     672                 :            : /* Mesh flags */
     673                 :            : #define MESH_FLAGS_AE_A4        0x1
     674                 :            : #define MESH_FLAGS_AE_A5_A6     0x2
     675                 :            : #define MESH_FLAGS_AE           0x3
     676                 :            : #define MESH_FLAGS_PS_DEEP      0x4
     677                 :            : 
     678                 :            : /**
     679                 :            :  * enum ieee80211_preq_flags - mesh PREQ element flags
     680                 :            :  *
     681                 :            :  * @IEEE80211_PREQ_PROACTIVE_PREP_FLAG: proactive PREP subfield
     682                 :            :  */
     683                 :            : enum ieee80211_preq_flags {
     684                 :            :         IEEE80211_PREQ_PROACTIVE_PREP_FLAG      = 1<<2,
     685                 :            : };
     686                 :            : 
     687                 :            : /**
     688                 :            :  * enum ieee80211_preq_target_flags - mesh PREQ element per target flags
     689                 :            :  *
     690                 :            :  * @IEEE80211_PREQ_TO_FLAG: target only subfield
     691                 :            :  * @IEEE80211_PREQ_USN_FLAG: unknown target HWMP sequence number subfield
     692                 :            :  */
     693                 :            : enum ieee80211_preq_target_flags {
     694                 :            :         IEEE80211_PREQ_TO_FLAG  = 1<<0,
     695                 :            :         IEEE80211_PREQ_USN_FLAG = 1<<2,
     696                 :            : };
     697                 :            : 
     698                 :            : /**
     699                 :            :  * struct ieee80211_quiet_ie
     700                 :            :  *
     701                 :            :  * This structure refers to "Quiet information element"
     702                 :            :  */
     703                 :            : struct ieee80211_quiet_ie {
     704                 :            :         u8 count;
     705                 :            :         u8 period;
     706                 :            :         __le16 duration;
     707                 :            :         __le16 offset;
     708                 :            : } __packed;
     709                 :            : 
     710                 :            : /**
     711                 :            :  * struct ieee80211_msrment_ie
     712                 :            :  *
     713                 :            :  * This structure refers to "Measurement Request/Report information element"
     714                 :            :  */
     715                 :            : struct ieee80211_msrment_ie {
     716                 :            :         u8 token;
     717                 :            :         u8 mode;
     718                 :            :         u8 type;
     719                 :            :         u8 request[0];
     720                 :            : } __packed;
     721                 :            : 
     722                 :            : /**
     723                 :            :  * struct ieee80211_channel_sw_ie
     724                 :            :  *
     725                 :            :  * This structure refers to "Channel Switch Announcement information element"
     726                 :            :  */
     727                 :            : struct ieee80211_channel_sw_ie {
     728                 :            :         u8 mode;
     729                 :            :         u8 new_ch_num;
     730                 :            :         u8 count;
     731                 :            : } __packed;
     732                 :            : 
     733                 :            : /**
     734                 :            :  * struct ieee80211_ext_chansw_ie
     735                 :            :  *
     736                 :            :  * This structure represents the "Extended Channel Switch Announcement element"
     737                 :            :  */
     738                 :            : struct ieee80211_ext_chansw_ie {
     739                 :            :         u8 mode;
     740                 :            :         u8 new_operating_class;
     741                 :            :         u8 new_ch_num;
     742                 :            :         u8 count;
     743                 :            : } __packed;
     744                 :            : 
     745                 :            : /**
     746                 :            :  * struct ieee80211_sec_chan_offs_ie - secondary channel offset IE
     747                 :            :  * @sec_chan_offs: secondary channel offset, uses IEEE80211_HT_PARAM_CHA_SEC_*
     748                 :            :  *      values here
     749                 :            :  * This structure represents the "Secondary Channel Offset element"
     750                 :            :  */
     751                 :            : struct ieee80211_sec_chan_offs_ie {
     752                 :            :         u8 sec_chan_offs;
     753                 :            : } __packed;
     754                 :            : 
     755                 :            : /**
     756                 :            :  * struct ieee80211_mesh_chansw_params_ie - mesh channel switch parameters IE
     757                 :            :  *
     758                 :            :  * This structure represents the "Mesh Channel Switch Paramters element"
     759                 :            :  */
     760                 :            : struct ieee80211_mesh_chansw_params_ie {
     761                 :            :         u8 mesh_ttl;
     762                 :            :         u8 mesh_flags;
     763                 :            :         __le16 mesh_reason;
     764                 :            :         __le16 mesh_pre_value;
     765                 :            : } __packed;
     766                 :            : 
     767                 :            : /**
     768                 :            :  * struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE
     769                 :            :  */
     770                 :            : struct ieee80211_wide_bw_chansw_ie {
     771                 :            :         u8 new_channel_width;
     772                 :            :         u8 new_center_freq_seg0, new_center_freq_seg1;
     773                 :            : } __packed;
     774                 :            : 
     775                 :            : /**
     776                 :            :  * struct ieee80211_tim
     777                 :            :  *
     778                 :            :  * This structure refers to "Traffic Indication Map information element"
     779                 :            :  */
     780                 :            : struct ieee80211_tim_ie {
     781                 :            :         u8 dtim_count;
     782                 :            :         u8 dtim_period;
     783                 :            :         u8 bitmap_ctrl;
     784                 :            :         /* variable size: 1 - 251 bytes */
     785                 :            :         u8 virtual_map[1];
     786                 :            : } __packed;
     787                 :            : 
     788                 :            : /**
     789                 :            :  * struct ieee80211_meshconf_ie
     790                 :            :  *
     791                 :            :  * This structure refers to "Mesh Configuration information element"
     792                 :            :  */
     793                 :            : struct ieee80211_meshconf_ie {
     794                 :            :         u8 meshconf_psel;
     795                 :            :         u8 meshconf_pmetric;
     796                 :            :         u8 meshconf_congest;
     797                 :            :         u8 meshconf_synch;
     798                 :            :         u8 meshconf_auth;
     799                 :            :         u8 meshconf_form;
     800                 :            :         u8 meshconf_cap;
     801                 :            : } __packed;
     802                 :            : 
     803                 :            : /**
     804                 :            :  * enum mesh_config_capab_flags - Mesh Configuration IE capability field flags
     805                 :            :  *
     806                 :            :  * @IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS: STA is willing to establish
     807                 :            :  *      additional mesh peerings with other mesh STAs
     808                 :            :  * @IEEE80211_MESHCONF_CAPAB_FORWARDING: the STA forwards MSDUs
     809                 :            :  * @IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING: TBTT adjustment procedure
     810                 :            :  *      is ongoing
     811                 :            :  * @IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL: STA is in deep sleep mode or has
     812                 :            :  *      neighbors in deep sleep mode
     813                 :            :  */
     814                 :            : enum mesh_config_capab_flags {
     815                 :            :         IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS          = 0x01,
     816                 :            :         IEEE80211_MESHCONF_CAPAB_FORWARDING             = 0x08,
     817                 :            :         IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING         = 0x20,
     818                 :            :         IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL       = 0x40,
     819                 :            : };
     820                 :            : 
     821                 :            : #define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1
     822                 :            : 
     823                 :            : /**
     824                 :            :  * mesh channel switch parameters element's flag indicator
     825                 :            :  *
     826                 :            :  */
     827                 :            : #define WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT BIT(0)
     828                 :            : #define WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR BIT(1)
     829                 :            : #define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2)
     830                 :            : 
     831                 :            : /**
     832                 :            :  * struct ieee80211_rann_ie
     833                 :            :  *
     834                 :            :  * This structure refers to "Root Announcement information element"
     835                 :            :  */
     836                 :            : struct ieee80211_rann_ie {
     837                 :            :         u8 rann_flags;
     838                 :            :         u8 rann_hopcount;
     839                 :            :         u8 rann_ttl;
     840                 :            :         u8 rann_addr[ETH_ALEN];
     841                 :            :         __le32 rann_seq;
     842                 :            :         __le32 rann_interval;
     843                 :            :         __le32 rann_metric;
     844                 :            : } __packed;
     845                 :            : 
     846                 :            : enum ieee80211_rann_flags {
     847                 :            :         RANN_FLAG_IS_GATE = 1 << 0,
     848                 :            : };
     849                 :            : 
     850                 :            : enum ieee80211_ht_chanwidth_values {
     851                 :            :         IEEE80211_HT_CHANWIDTH_20MHZ = 0,
     852                 :            :         IEEE80211_HT_CHANWIDTH_ANY = 1,
     853                 :            : };
     854                 :            : 
     855                 :            : /**
     856                 :            :  * enum ieee80211_opmode_bits - VHT operating mode field bits
     857                 :            :  * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask
     858                 :            :  * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width
     859                 :            :  * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width
     860                 :            :  * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ: 80 MHz channel width
     861                 :            :  * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ: 160 MHz or 80+80 MHz channel width
     862                 :            :  * @IEEE80211_OPMODE_NOTIF_RX_NSS_MASK: number of spatial streams mask
     863                 :            :  *      (the NSS value is the value of this field + 1)
     864                 :            :  * @IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT: number of spatial streams shift
     865                 :            :  * @IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF: indicates streams in SU-MIMO PPDU
     866                 :            :  *      using a beamforming steering matrix
     867                 :            :  */
     868                 :            : enum ieee80211_vht_opmode_bits {
     869                 :            :         IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK   = 3,
     870                 :            :         IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ  = 0,
     871                 :            :         IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ  = 1,
     872                 :            :         IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ  = 2,
     873                 :            :         IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ = 3,
     874                 :            :         IEEE80211_OPMODE_NOTIF_RX_NSS_MASK      = 0x70,
     875                 :            :         IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT     = 4,
     876                 :            :         IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF   = 0x80,
     877                 :            : };
     878                 :            : 
     879                 :            : #define WLAN_SA_QUERY_TR_ID_LEN 2
     880                 :            : #define WLAN_MEMBERSHIP_LEN 8
     881                 :            : #define WLAN_USER_POSITION_LEN 16
     882                 :            : 
     883                 :            : /**
     884                 :            :  * struct ieee80211_tpc_report_ie
     885                 :            :  *
     886                 :            :  * This structure refers to "TPC Report element"
     887                 :            :  */
     888                 :            : struct ieee80211_tpc_report_ie {
     889                 :            :         u8 tx_power;
     890                 :            :         u8 link_margin;
     891                 :            : } __packed;
     892                 :            : 
     893                 :            : #define IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK     GENMASK(2, 1)
     894                 :            : #define IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT    1
     895                 :            : #define IEEE80211_ADDBA_EXT_NO_FRAG             BIT(0)
     896                 :            : 
     897                 :            : struct ieee80211_addba_ext_ie {
     898                 :            :         u8 data;
     899                 :            : } __packed;
     900                 :            : 
     901                 :            : struct ieee80211_mgmt {
     902                 :            :         __le16 frame_control;
     903                 :            :         __le16 duration;
     904                 :            :         u8 da[ETH_ALEN];
     905                 :            :         u8 sa[ETH_ALEN];
     906                 :            :         u8 bssid[ETH_ALEN];
     907                 :            :         __le16 seq_ctrl;
     908                 :            :         union {
     909                 :            :                 struct {
     910                 :            :                         __le16 auth_alg;
     911                 :            :                         __le16 auth_transaction;
     912                 :            :                         __le16 status_code;
     913                 :            :                         /* possibly followed by Challenge text */
     914                 :            :                         u8 variable[0];
     915                 :            :                 } __packed auth;
     916                 :            :                 struct {
     917                 :            :                         __le16 reason_code;
     918                 :            :                 } __packed deauth;
     919                 :            :                 struct {
     920                 :            :                         __le16 capab_info;
     921                 :            :                         __le16 listen_interval;
     922                 :            :                         /* followed by SSID and Supported rates */
     923                 :            :                         u8 variable[0];
     924                 :            :                 } __packed assoc_req;
     925                 :            :                 struct {
     926                 :            :                         __le16 capab_info;
     927                 :            :                         __le16 status_code;
     928                 :            :                         __le16 aid;
     929                 :            :                         /* followed by Supported rates */
     930                 :            :                         u8 variable[0];
     931                 :            :                 } __packed assoc_resp, reassoc_resp;
     932                 :            :                 struct {
     933                 :            :                         __le16 capab_info;
     934                 :            :                         __le16 listen_interval;
     935                 :            :                         u8 current_ap[ETH_ALEN];
     936                 :            :                         /* followed by SSID and Supported rates */
     937                 :            :                         u8 variable[0];
     938                 :            :                 } __packed reassoc_req;
     939                 :            :                 struct {
     940                 :            :                         __le16 reason_code;
     941                 :            :                 } __packed disassoc;
     942                 :            :                 struct {
     943                 :            :                         __le64 timestamp;
     944                 :            :                         __le16 beacon_int;
     945                 :            :                         __le16 capab_info;
     946                 :            :                         /* followed by some of SSID, Supported rates,
     947                 :            :                          * FH Params, DS Params, CF Params, IBSS Params, TIM */
     948                 :            :                         u8 variable[0];
     949                 :            :                 } __packed beacon;
     950                 :            :                 struct {
     951                 :            :                         /* only variable items: SSID, Supported rates */
     952                 :            :                         u8 variable[0];
     953                 :            :                 } __packed probe_req;
     954                 :            :                 struct {
     955                 :            :                         __le64 timestamp;
     956                 :            :                         __le16 beacon_int;
     957                 :            :                         __le16 capab_info;
     958                 :            :                         /* followed by some of SSID, Supported rates,
     959                 :            :                          * FH Params, DS Params, CF Params, IBSS Params */
     960                 :            :                         u8 variable[0];
     961                 :            :                 } __packed probe_resp;
     962                 :            :                 struct {
     963                 :            :                         u8 category;
     964                 :            :                         union {
     965                 :            :                                 struct {
     966                 :            :                                         u8 action_code;
     967                 :            :                                         u8 dialog_token;
     968                 :            :                                         u8 status_code;
     969                 :            :                                         u8 variable[0];
     970                 :            :                                 } __packed wme_action;
     971                 :            :                                 struct{
     972                 :            :                                         u8 action_code;
     973                 :            :                                         u8 variable[0];
     974                 :            :                                 } __packed chan_switch;
     975                 :            :                                 struct{
     976                 :            :                                         u8 action_code;
     977                 :            :                                         struct ieee80211_ext_chansw_ie data;
     978                 :            :                                         u8 variable[0];
     979                 :            :                                 } __packed ext_chan_switch;
     980                 :            :                                 struct{
     981                 :            :                                         u8 action_code;
     982                 :            :                                         u8 dialog_token;
     983                 :            :                                         u8 element_id;
     984                 :            :                                         u8 length;
     985                 :            :                                         struct ieee80211_msrment_ie msr_elem;
     986                 :            :                                 } __packed measurement;
     987                 :            :                                 struct{
     988                 :            :                                         u8 action_code;
     989                 :            :                                         u8 dialog_token;
     990                 :            :                                         __le16 capab;
     991                 :            :                                         __le16 timeout;
     992                 :            :                                         __le16 start_seq_num;
     993                 :            :                                         /* followed by BA Extension */
     994                 :            :                                         u8 variable[0];
     995                 :            :                                 } __packed addba_req;
     996                 :            :                                 struct{
     997                 :            :                                         u8 action_code;
     998                 :            :                                         u8 dialog_token;
     999                 :            :                                         __le16 status;
    1000                 :            :                                         __le16 capab;
    1001                 :            :                                         __le16 timeout;
    1002                 :            :                                 } __packed addba_resp;
    1003                 :            :                                 struct{
    1004                 :            :                                         u8 action_code;
    1005                 :            :                                         __le16 params;
    1006                 :            :                                         __le16 reason_code;
    1007                 :            :                                 } __packed delba;
    1008                 :            :                                 struct {
    1009                 :            :                                         u8 action_code;
    1010                 :            :                                         u8 variable[0];
    1011                 :            :                                 } __packed self_prot;
    1012                 :            :                                 struct{
    1013                 :            :                                         u8 action_code;
    1014                 :            :                                         u8 variable[0];
    1015                 :            :                                 } __packed mesh_action;
    1016                 :            :                                 struct {
    1017                 :            :                                         u8 action;
    1018                 :            :                                         u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
    1019                 :            :                                 } __packed sa_query;
    1020                 :            :                                 struct {
    1021                 :            :                                         u8 action;
    1022                 :            :                                         u8 smps_control;
    1023                 :            :                                 } __packed ht_smps;
    1024                 :            :                                 struct {
    1025                 :            :                                         u8 action_code;
    1026                 :            :                                         u8 chanwidth;
    1027                 :            :                                 } __packed ht_notify_cw;
    1028                 :            :                                 struct {
    1029                 :            :                                         u8 action_code;
    1030                 :            :                                         u8 dialog_token;
    1031                 :            :                                         __le16 capability;
    1032                 :            :                                         u8 variable[0];
    1033                 :            :                                 } __packed tdls_discover_resp;
    1034                 :            :                                 struct {
    1035                 :            :                                         u8 action_code;
    1036                 :            :                                         u8 operating_mode;
    1037                 :            :                                 } __packed vht_opmode_notif;
    1038                 :            :                                 struct {
    1039                 :            :                                         u8 action_code;
    1040                 :            :                                         u8 membership[WLAN_MEMBERSHIP_LEN];
    1041                 :            :                                         u8 position[WLAN_USER_POSITION_LEN];
    1042                 :            :                                 } __packed vht_group_notif;
    1043                 :            :                                 struct {
    1044                 :            :                                         u8 action_code;
    1045                 :            :                                         u8 dialog_token;
    1046                 :            :                                         u8 tpc_elem_id;
    1047                 :            :                                         u8 tpc_elem_length;
    1048                 :            :                                         struct ieee80211_tpc_report_ie tpc;
    1049                 :            :                                 } __packed tpc_report;
    1050                 :            :                                 struct {
    1051                 :            :                                         u8 action_code;
    1052                 :            :                                         u8 dialog_token;
    1053                 :            :                                         u8 follow_up;
    1054                 :            :                                         u8 tod[6];
    1055                 :            :                                         u8 toa[6];
    1056                 :            :                                         __le16 tod_error;
    1057                 :            :                                         __le16 toa_error;
    1058                 :            :                                         u8 variable[0];
    1059                 :            :                                 } __packed ftm;
    1060                 :            :                         } u;
    1061                 :            :                 } __packed action;
    1062                 :            :         } u;
    1063                 :            : } __packed __aligned(2);
    1064                 :            : 
    1065                 :            : /* Supported rates membership selectors */
    1066                 :            : #define BSS_MEMBERSHIP_SELECTOR_HT_PHY  127
    1067                 :            : #define BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126
    1068                 :            : 
    1069                 :            : /* mgmt header + 1 byte category code */
    1070                 :            : #define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
    1071                 :            : 
    1072                 :            : 
    1073                 :            : /* Management MIC information element (IEEE 802.11w) */
    1074                 :            : struct ieee80211_mmie {
    1075                 :            :         u8 element_id;
    1076                 :            :         u8 length;
    1077                 :            :         __le16 key_id;
    1078                 :            :         u8 sequence_number[6];
    1079                 :            :         u8 mic[8];
    1080                 :            : } __packed;
    1081                 :            : 
    1082                 :            : /* Management MIC information element (IEEE 802.11w) for GMAC and CMAC-256 */
    1083                 :            : struct ieee80211_mmie_16 {
    1084                 :            :         u8 element_id;
    1085                 :            :         u8 length;
    1086                 :            :         __le16 key_id;
    1087                 :            :         u8 sequence_number[6];
    1088                 :            :         u8 mic[16];
    1089                 :            : } __packed;
    1090                 :            : 
    1091                 :            : struct ieee80211_vendor_ie {
    1092                 :            :         u8 element_id;
    1093                 :            :         u8 len;
    1094                 :            :         u8 oui[3];
    1095                 :            :         u8 oui_type;
    1096                 :            : } __packed;
    1097                 :            : 
    1098                 :            : struct ieee80211_wmm_ac_param {
    1099                 :            :         u8 aci_aifsn; /* AIFSN, ACM, ACI */
    1100                 :            :         u8 cw; /* ECWmin, ECWmax (CW = 2^ECW - 1) */
    1101                 :            :         __le16 txop_limit;
    1102                 :            : } __packed;
    1103                 :            : 
    1104                 :            : struct ieee80211_wmm_param_ie {
    1105                 :            :         u8 element_id; /* Element ID: 221 (0xdd); */
    1106                 :            :         u8 len; /* Length: 24 */
    1107                 :            :         /* required fields for WMM version 1 */
    1108                 :            :         u8 oui[3]; /* 00:50:f2 */
    1109                 :            :         u8 oui_type; /* 2 */
    1110                 :            :         u8 oui_subtype; /* 1 */
    1111                 :            :         u8 version; /* 1 for WMM version 1.0 */
    1112                 :            :         u8 qos_info; /* AP/STA specific QoS info */
    1113                 :            :         u8 reserved; /* 0 */
    1114                 :            :         /* AC_BE, AC_BK, AC_VI, AC_VO */
    1115                 :            :         struct ieee80211_wmm_ac_param ac[4];
    1116                 :            : } __packed;
    1117                 :            : 
    1118                 :            : /* Control frames */
    1119                 :            : struct ieee80211_rts {
    1120                 :            :         __le16 frame_control;
    1121                 :            :         __le16 duration;
    1122                 :            :         u8 ra[ETH_ALEN];
    1123                 :            :         u8 ta[ETH_ALEN];
    1124                 :            : } __packed __aligned(2);
    1125                 :            : 
    1126                 :            : struct ieee80211_cts {
    1127                 :            :         __le16 frame_control;
    1128                 :            :         __le16 duration;
    1129                 :            :         u8 ra[ETH_ALEN];
    1130                 :            : } __packed __aligned(2);
    1131                 :            : 
    1132                 :            : struct ieee80211_pspoll {
    1133                 :            :         __le16 frame_control;
    1134                 :            :         __le16 aid;
    1135                 :            :         u8 bssid[ETH_ALEN];
    1136                 :            :         u8 ta[ETH_ALEN];
    1137                 :            : } __packed __aligned(2);
    1138                 :            : 
    1139                 :            : /* TDLS */
    1140                 :            : 
    1141                 :            : /* Channel switch timing */
    1142                 :            : struct ieee80211_ch_switch_timing {
    1143                 :            :         __le16 switch_time;
    1144                 :            :         __le16 switch_timeout;
    1145                 :            : } __packed;
    1146                 :            : 
    1147                 :            : /* Link-id information element */
    1148                 :            : struct ieee80211_tdls_lnkie {
    1149                 :            :         u8 ie_type; /* Link Identifier IE */
    1150                 :            :         u8 ie_len;
    1151                 :            :         u8 bssid[ETH_ALEN];
    1152                 :            :         u8 init_sta[ETH_ALEN];
    1153                 :            :         u8 resp_sta[ETH_ALEN];
    1154                 :            : } __packed;
    1155                 :            : 
    1156                 :            : struct ieee80211_tdls_data {
    1157                 :            :         u8 da[ETH_ALEN];
    1158                 :            :         u8 sa[ETH_ALEN];
    1159                 :            :         __be16 ether_type;
    1160                 :            :         u8 payload_type;
    1161                 :            :         u8 category;
    1162                 :            :         u8 action_code;
    1163                 :            :         union {
    1164                 :            :                 struct {
    1165                 :            :                         u8 dialog_token;
    1166                 :            :                         __le16 capability;
    1167                 :            :                         u8 variable[0];
    1168                 :            :                 } __packed setup_req;
    1169                 :            :                 struct {
    1170                 :            :                         __le16 status_code;
    1171                 :            :                         u8 dialog_token;
    1172                 :            :                         __le16 capability;
    1173                 :            :                         u8 variable[0];
    1174                 :            :                 } __packed setup_resp;
    1175                 :            :                 struct {
    1176                 :            :                         __le16 status_code;
    1177                 :            :                         u8 dialog_token;
    1178                 :            :                         u8 variable[0];
    1179                 :            :                 } __packed setup_cfm;
    1180                 :            :                 struct {
    1181                 :            :                         __le16 reason_code;
    1182                 :            :                         u8 variable[0];
    1183                 :            :                 } __packed teardown;
    1184                 :            :                 struct {
    1185                 :            :                         u8 dialog_token;
    1186                 :            :                         u8 variable[0];
    1187                 :            :                 } __packed discover_req;
    1188                 :            :                 struct {
    1189                 :            :                         u8 target_channel;
    1190                 :            :                         u8 oper_class;
    1191                 :            :                         u8 variable[0];
    1192                 :            :                 } __packed chan_switch_req;
    1193                 :            :                 struct {
    1194                 :            :                         __le16 status_code;
    1195                 :            :                         u8 variable[0];
    1196                 :            :                 } __packed chan_switch_resp;
    1197                 :            :         } u;
    1198                 :            : } __packed;
    1199                 :            : 
    1200                 :            : /*
    1201                 :            :  * Peer-to-Peer IE attribute related definitions.
    1202                 :            :  */
    1203                 :            : /**
    1204                 :            :  * enum ieee80211_p2p_attr_id - identifies type of peer-to-peer attribute.
    1205                 :            :  */
    1206                 :            : enum ieee80211_p2p_attr_id {
    1207                 :            :         IEEE80211_P2P_ATTR_STATUS = 0,
    1208                 :            :         IEEE80211_P2P_ATTR_MINOR_REASON,
    1209                 :            :         IEEE80211_P2P_ATTR_CAPABILITY,
    1210                 :            :         IEEE80211_P2P_ATTR_DEVICE_ID,
    1211                 :            :         IEEE80211_P2P_ATTR_GO_INTENT,
    1212                 :            :         IEEE80211_P2P_ATTR_GO_CONFIG_TIMEOUT,
    1213                 :            :         IEEE80211_P2P_ATTR_LISTEN_CHANNEL,
    1214                 :            :         IEEE80211_P2P_ATTR_GROUP_BSSID,
    1215                 :            :         IEEE80211_P2P_ATTR_EXT_LISTEN_TIMING,
    1216                 :            :         IEEE80211_P2P_ATTR_INTENDED_IFACE_ADDR,
    1217                 :            :         IEEE80211_P2P_ATTR_MANAGABILITY,
    1218                 :            :         IEEE80211_P2P_ATTR_CHANNEL_LIST,
    1219                 :            :         IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
    1220                 :            :         IEEE80211_P2P_ATTR_DEVICE_INFO,
    1221                 :            :         IEEE80211_P2P_ATTR_GROUP_INFO,
    1222                 :            :         IEEE80211_P2P_ATTR_GROUP_ID,
    1223                 :            :         IEEE80211_P2P_ATTR_INTERFACE,
    1224                 :            :         IEEE80211_P2P_ATTR_OPER_CHANNEL,
    1225                 :            :         IEEE80211_P2P_ATTR_INVITE_FLAGS,
    1226                 :            :         /* 19 - 220: Reserved */
    1227                 :            :         IEEE80211_P2P_ATTR_VENDOR_SPECIFIC = 221,
    1228                 :            : 
    1229                 :            :         IEEE80211_P2P_ATTR_MAX
    1230                 :            : };
    1231                 :            : 
    1232                 :            : /* Notice of Absence attribute - described in P2P spec 4.1.14 */
    1233                 :            : /* Typical max value used here */
    1234                 :            : #define IEEE80211_P2P_NOA_DESC_MAX      4
    1235                 :            : 
    1236                 :            : struct ieee80211_p2p_noa_desc {
    1237                 :            :         u8 count;
    1238                 :            :         __le32 duration;
    1239                 :            :         __le32 interval;
    1240                 :            :         __le32 start_time;
    1241                 :            : } __packed;
    1242                 :            : 
    1243                 :            : struct ieee80211_p2p_noa_attr {
    1244                 :            :         u8 index;
    1245                 :            :         u8 oppps_ctwindow;
    1246                 :            :         struct ieee80211_p2p_noa_desc desc[IEEE80211_P2P_NOA_DESC_MAX];
    1247                 :            : } __packed;
    1248                 :            : 
    1249                 :            : #define IEEE80211_P2P_OPPPS_ENABLE_BIT          BIT(7)
    1250                 :            : #define IEEE80211_P2P_OPPPS_CTWINDOW_MASK       0x7F
    1251                 :            : 
    1252                 :            : /**
    1253                 :            :  * struct ieee80211_bar - HT Block Ack Request
    1254                 :            :  *
    1255                 :            :  * This structure refers to "HT BlockAckReq" as
    1256                 :            :  * described in 802.11n draft section 7.2.1.7.1
    1257                 :            :  */
    1258                 :            : struct ieee80211_bar {
    1259                 :            :         __le16 frame_control;
    1260                 :            :         __le16 duration;
    1261                 :            :         __u8 ra[ETH_ALEN];
    1262                 :            :         __u8 ta[ETH_ALEN];
    1263                 :            :         __le16 control;
    1264                 :            :         __le16 start_seq_num;
    1265                 :            : } __packed;
    1266                 :            : 
    1267                 :            : /* 802.11 BAR control masks */
    1268                 :            : #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL    0x0000
    1269                 :            : #define IEEE80211_BAR_CTRL_MULTI_TID            0x0002
    1270                 :            : #define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004
    1271                 :            : #define IEEE80211_BAR_CTRL_TID_INFO_MASK        0xf000
    1272                 :            : #define IEEE80211_BAR_CTRL_TID_INFO_SHIFT       12
    1273                 :            : 
    1274                 :            : #define IEEE80211_HT_MCS_MASK_LEN               10
    1275                 :            : 
    1276                 :            : /**
    1277                 :            :  * struct ieee80211_mcs_info - MCS information
    1278                 :            :  * @rx_mask: RX mask
    1279                 :            :  * @rx_highest: highest supported RX rate. If set represents
    1280                 :            :  *      the highest supported RX data rate in units of 1 Mbps.
    1281                 :            :  *      If this field is 0 this value should not be used to
    1282                 :            :  *      consider the highest RX data rate supported.
    1283                 :            :  * @tx_params: TX parameters
    1284                 :            :  */
    1285                 :            : struct ieee80211_mcs_info {
    1286                 :            :         u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN];
    1287                 :            :         __le16 rx_highest;
    1288                 :            :         u8 tx_params;
    1289                 :            :         u8 reserved[3];
    1290                 :            : } __packed;
    1291                 :            : 
    1292                 :            : /* 802.11n HT capability MSC set */
    1293                 :            : #define IEEE80211_HT_MCS_RX_HIGHEST_MASK        0x3ff
    1294                 :            : #define IEEE80211_HT_MCS_TX_DEFINED             0x01
    1295                 :            : #define IEEE80211_HT_MCS_TX_RX_DIFF             0x02
    1296                 :            : /* value 0 == 1 stream etc */
    1297                 :            : #define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK    0x0C
    1298                 :            : #define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT   2
    1299                 :            : #define         IEEE80211_HT_MCS_TX_MAX_STREAMS 4
    1300                 :            : #define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION  0x10
    1301                 :            : 
    1302                 :            : /*
    1303                 :            :  * 802.11n D5.0 20.3.5 / 20.6 says:
    1304                 :            :  * - indices 0 to 7 and 32 are single spatial stream
    1305                 :            :  * - 8 to 31 are multiple spatial streams using equal modulation
    1306                 :            :  *   [8..15 for two streams, 16..23 for three and 24..31 for four]
    1307                 :            :  * - remainder are multiple spatial streams using unequal modulation
    1308                 :            :  */
    1309                 :            : #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START 33
    1310                 :            : #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START_BYTE \
    1311                 :            :         (IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8)
    1312                 :            : 
    1313                 :            : /**
    1314                 :            :  * struct ieee80211_ht_cap - HT capabilities
    1315                 :            :  *
    1316                 :            :  * This structure is the "HT capabilities element" as
    1317                 :            :  * described in 802.11n D5.0 7.3.2.57
    1318                 :            :  */
    1319                 :            : struct ieee80211_ht_cap {
    1320                 :            :         __le16 cap_info;
    1321                 :            :         u8 ampdu_params_info;
    1322                 :            : 
    1323                 :            :         /* 16 bytes MCS information */
    1324                 :            :         struct ieee80211_mcs_info mcs;
    1325                 :            : 
    1326                 :            :         __le16 extended_ht_cap_info;
    1327                 :            :         __le32 tx_BF_cap_info;
    1328                 :            :         u8 antenna_selection_info;
    1329                 :            : } __packed;
    1330                 :            : 
    1331                 :            : /* 802.11n HT capabilities masks (for cap_info) */
    1332                 :            : #define IEEE80211_HT_CAP_LDPC_CODING            0x0001
    1333                 :            : #define IEEE80211_HT_CAP_SUP_WIDTH_20_40        0x0002
    1334                 :            : #define IEEE80211_HT_CAP_SM_PS                  0x000C
    1335                 :            : #define         IEEE80211_HT_CAP_SM_PS_SHIFT    2
    1336                 :            : #define IEEE80211_HT_CAP_GRN_FLD                0x0010
    1337                 :            : #define IEEE80211_HT_CAP_SGI_20                 0x0020
    1338                 :            : #define IEEE80211_HT_CAP_SGI_40                 0x0040
    1339                 :            : #define IEEE80211_HT_CAP_TX_STBC                0x0080
    1340                 :            : #define IEEE80211_HT_CAP_RX_STBC                0x0300
    1341                 :            : #define         IEEE80211_HT_CAP_RX_STBC_SHIFT  8
    1342                 :            : #define IEEE80211_HT_CAP_DELAY_BA               0x0400
    1343                 :            : #define IEEE80211_HT_CAP_MAX_AMSDU              0x0800
    1344                 :            : #define IEEE80211_HT_CAP_DSSSCCK40              0x1000
    1345                 :            : #define IEEE80211_HT_CAP_RESERVED               0x2000
    1346                 :            : #define IEEE80211_HT_CAP_40MHZ_INTOLERANT       0x4000
    1347                 :            : #define IEEE80211_HT_CAP_LSIG_TXOP_PROT         0x8000
    1348                 :            : 
    1349                 :            : /* 802.11n HT extended capabilities masks (for extended_ht_cap_info) */
    1350                 :            : #define IEEE80211_HT_EXT_CAP_PCO                0x0001
    1351                 :            : #define IEEE80211_HT_EXT_CAP_PCO_TIME           0x0006
    1352                 :            : #define         IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT     1
    1353                 :            : #define IEEE80211_HT_EXT_CAP_MCS_FB             0x0300
    1354                 :            : #define         IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT       8
    1355                 :            : #define IEEE80211_HT_EXT_CAP_HTC_SUP            0x0400
    1356                 :            : #define IEEE80211_HT_EXT_CAP_RD_RESPONDER       0x0800
    1357                 :            : 
    1358                 :            : /* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
    1359                 :            : #define IEEE80211_HT_AMPDU_PARM_FACTOR          0x03
    1360                 :            : #define IEEE80211_HT_AMPDU_PARM_DENSITY         0x1C
    1361                 :            : #define         IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT   2
    1362                 :            : 
    1363                 :            : /*
    1364                 :            :  * Maximum length of AMPDU that the STA can receive in high-throughput (HT).
    1365                 :            :  * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
    1366                 :            :  */
    1367                 :            : enum ieee80211_max_ampdu_length_exp {
    1368                 :            :         IEEE80211_HT_MAX_AMPDU_8K = 0,
    1369                 :            :         IEEE80211_HT_MAX_AMPDU_16K = 1,
    1370                 :            :         IEEE80211_HT_MAX_AMPDU_32K = 2,
    1371                 :            :         IEEE80211_HT_MAX_AMPDU_64K = 3
    1372                 :            : };
    1373                 :            : 
    1374                 :            : /*
    1375                 :            :  * Maximum length of AMPDU that the STA can receive in VHT.
    1376                 :            :  * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
    1377                 :            :  */
    1378                 :            : enum ieee80211_vht_max_ampdu_length_exp {
    1379                 :            :         IEEE80211_VHT_MAX_AMPDU_8K = 0,
    1380                 :            :         IEEE80211_VHT_MAX_AMPDU_16K = 1,
    1381                 :            :         IEEE80211_VHT_MAX_AMPDU_32K = 2,
    1382                 :            :         IEEE80211_VHT_MAX_AMPDU_64K = 3,
    1383                 :            :         IEEE80211_VHT_MAX_AMPDU_128K = 4,
    1384                 :            :         IEEE80211_VHT_MAX_AMPDU_256K = 5,
    1385                 :            :         IEEE80211_VHT_MAX_AMPDU_512K = 6,
    1386                 :            :         IEEE80211_VHT_MAX_AMPDU_1024K = 7
    1387                 :            : };
    1388                 :            : 
    1389                 :            : #define IEEE80211_HT_MAX_AMPDU_FACTOR 13
    1390                 :            : 
    1391                 :            : /* Minimum MPDU start spacing */
    1392                 :            : enum ieee80211_min_mpdu_spacing {
    1393                 :            :         IEEE80211_HT_MPDU_DENSITY_NONE = 0,     /* No restriction */
    1394                 :            :         IEEE80211_HT_MPDU_DENSITY_0_25 = 1,     /* 1/4 usec */
    1395                 :            :         IEEE80211_HT_MPDU_DENSITY_0_5 = 2,      /* 1/2 usec */
    1396                 :            :         IEEE80211_HT_MPDU_DENSITY_1 = 3,        /* 1 usec */
    1397                 :            :         IEEE80211_HT_MPDU_DENSITY_2 = 4,        /* 2 usec */
    1398                 :            :         IEEE80211_HT_MPDU_DENSITY_4 = 5,        /* 4 usec */
    1399                 :            :         IEEE80211_HT_MPDU_DENSITY_8 = 6,        /* 8 usec */
    1400                 :            :         IEEE80211_HT_MPDU_DENSITY_16 = 7        /* 16 usec */
    1401                 :            : };
    1402                 :            : 
    1403                 :            : /**
    1404                 :            :  * struct ieee80211_ht_operation - HT operation IE
    1405                 :            :  *
    1406                 :            :  * This structure is the "HT operation element" as
    1407                 :            :  * described in 802.11n-2009 7.3.2.57
    1408                 :            :  */
    1409                 :            : struct ieee80211_ht_operation {
    1410                 :            :         u8 primary_chan;
    1411                 :            :         u8 ht_param;
    1412                 :            :         __le16 operation_mode;
    1413                 :            :         __le16 stbc_param;
    1414                 :            :         u8 basic_set[16];
    1415                 :            : } __packed;
    1416                 :            : 
    1417                 :            : /* for ht_param */
    1418                 :            : #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET               0x03
    1419                 :            : #define         IEEE80211_HT_PARAM_CHA_SEC_NONE         0x00
    1420                 :            : #define         IEEE80211_HT_PARAM_CHA_SEC_ABOVE        0x01
    1421                 :            : #define         IEEE80211_HT_PARAM_CHA_SEC_BELOW        0x03
    1422                 :            : #define IEEE80211_HT_PARAM_CHAN_WIDTH_ANY               0x04
    1423                 :            : #define IEEE80211_HT_PARAM_RIFS_MODE                    0x08
    1424                 :            : 
    1425                 :            : /* for operation_mode */
    1426                 :            : #define IEEE80211_HT_OP_MODE_PROTECTION                 0x0003
    1427                 :            : #define         IEEE80211_HT_OP_MODE_PROTECTION_NONE            0
    1428                 :            : #define         IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER       1
    1429                 :            : #define         IEEE80211_HT_OP_MODE_PROTECTION_20MHZ           2
    1430                 :            : #define         IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED     3
    1431                 :            : #define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT           0x0004
    1432                 :            : #define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT           0x0010
    1433                 :            : #define IEEE80211_HT_OP_MODE_CCFS2_SHIFT                5
    1434                 :            : #define IEEE80211_HT_OP_MODE_CCFS2_MASK                 0x1fe0
    1435                 :            : 
    1436                 :            : /* for stbc_param */
    1437                 :            : #define IEEE80211_HT_STBC_PARAM_DUAL_BEACON             0x0040
    1438                 :            : #define IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT           0x0080
    1439                 :            : #define IEEE80211_HT_STBC_PARAM_STBC_BEACON             0x0100
    1440                 :            : #define IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT      0x0200
    1441                 :            : #define IEEE80211_HT_STBC_PARAM_PCO_ACTIVE              0x0400
    1442                 :            : #define IEEE80211_HT_STBC_PARAM_PCO_PHASE               0x0800
    1443                 :            : 
    1444                 :            : 
    1445                 :            : /* block-ack parameters */
    1446                 :            : #define IEEE80211_ADDBA_PARAM_AMSDU_MASK 0x0001
    1447                 :            : #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
    1448                 :            : #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
    1449                 :            : #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
    1450                 :            : #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
    1451                 :            : #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
    1452                 :            : 
    1453                 :            : /*
    1454                 :            :  * A-MPDU buffer sizes
    1455                 :            :  * According to HT size varies from 8 to 64 frames
    1456                 :            :  * HE adds the ability to have up to 256 frames.
    1457                 :            :  */
    1458                 :            : #define IEEE80211_MIN_AMPDU_BUF         0x8
    1459                 :            : #define IEEE80211_MAX_AMPDU_BUF_HT      0x40
    1460                 :            : #define IEEE80211_MAX_AMPDU_BUF         0x100
    1461                 :            : 
    1462                 :            : 
    1463                 :            : /* Spatial Multiplexing Power Save Modes (for capability) */
    1464                 :            : #define WLAN_HT_CAP_SM_PS_STATIC        0
    1465                 :            : #define WLAN_HT_CAP_SM_PS_DYNAMIC       1
    1466                 :            : #define WLAN_HT_CAP_SM_PS_INVALID       2
    1467                 :            : #define WLAN_HT_CAP_SM_PS_DISABLED      3
    1468                 :            : 
    1469                 :            : /* for SM power control field lower two bits */
    1470                 :            : #define WLAN_HT_SMPS_CONTROL_DISABLED   0
    1471                 :            : #define WLAN_HT_SMPS_CONTROL_STATIC     1
    1472                 :            : #define WLAN_HT_SMPS_CONTROL_DYNAMIC    3
    1473                 :            : 
    1474                 :            : /**
    1475                 :            :  * struct ieee80211_vht_mcs_info - VHT MCS information
    1476                 :            :  * @rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams
    1477                 :            :  * @rx_highest: Indicates highest long GI VHT PPDU data rate
    1478                 :            :  *      STA can receive. Rate expressed in units of 1 Mbps.
    1479                 :            :  *      If this field is 0 this value should not be used to
    1480                 :            :  *      consider the highest RX data rate supported.
    1481                 :            :  *      The top 3 bits of this field indicate the Maximum NSTS,total
    1482                 :            :  *      (a beamformee capability.)
    1483                 :            :  * @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams
    1484                 :            :  * @tx_highest: Indicates highest long GI VHT PPDU data rate
    1485                 :            :  *      STA can transmit. Rate expressed in units of 1 Mbps.
    1486                 :            :  *      If this field is 0 this value should not be used to
    1487                 :            :  *      consider the highest TX data rate supported.
    1488                 :            :  *      The top 2 bits of this field are reserved, the
    1489                 :            :  *      3rd bit from the top indiciates VHT Extended NSS BW
    1490                 :            :  *      Capability.
    1491                 :            :  */
    1492                 :            : struct ieee80211_vht_mcs_info {
    1493                 :            :         __le16 rx_mcs_map;
    1494                 :            :         __le16 rx_highest;
    1495                 :            :         __le16 tx_mcs_map;
    1496                 :            :         __le16 tx_highest;
    1497                 :            : } __packed;
    1498                 :            : 
    1499                 :            : /* for rx_highest */
    1500                 :            : #define IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT      13
    1501                 :            : #define IEEE80211_VHT_MAX_NSTS_TOTAL_MASK       (7 << IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT)
    1502                 :            : 
    1503                 :            : /* for tx_highest */
    1504                 :            : #define IEEE80211_VHT_EXT_NSS_BW_CAPABLE        (1 << 13)
    1505                 :            : 
    1506                 :            : /**
    1507                 :            :  * enum ieee80211_vht_mcs_support - VHT MCS support definitions
    1508                 :            :  * @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
    1509                 :            :  *      number of streams
    1510                 :            :  * @IEEE80211_VHT_MCS_SUPPORT_0_8: MCSes 0-8 are supported
    1511                 :            :  * @IEEE80211_VHT_MCS_SUPPORT_0_9: MCSes 0-9 are supported
    1512                 :            :  * @IEEE80211_VHT_MCS_NOT_SUPPORTED: This number of streams isn't supported
    1513                 :            :  *
    1514                 :            :  * These definitions are used in each 2-bit subfield of the @rx_mcs_map
    1515                 :            :  * and @tx_mcs_map fields of &struct ieee80211_vht_mcs_info, which are
    1516                 :            :  * both split into 8 subfields by number of streams. These values indicate
    1517                 :            :  * which MCSes are supported for the number of streams the value appears
    1518                 :            :  * for.
    1519                 :            :  */
    1520                 :            : enum ieee80211_vht_mcs_support {
    1521                 :            :         IEEE80211_VHT_MCS_SUPPORT_0_7   = 0,
    1522                 :            :         IEEE80211_VHT_MCS_SUPPORT_0_8   = 1,
    1523                 :            :         IEEE80211_VHT_MCS_SUPPORT_0_9   = 2,
    1524                 :            :         IEEE80211_VHT_MCS_NOT_SUPPORTED = 3,
    1525                 :            : };
    1526                 :            : 
    1527                 :            : /**
    1528                 :            :  * struct ieee80211_vht_cap - VHT capabilities
    1529                 :            :  *
    1530                 :            :  * This structure is the "VHT capabilities element" as
    1531                 :            :  * described in 802.11ac D3.0 8.4.2.160
    1532                 :            :  * @vht_cap_info: VHT capability info
    1533                 :            :  * @supp_mcs: VHT MCS supported rates
    1534                 :            :  */
    1535                 :            : struct ieee80211_vht_cap {
    1536                 :            :         __le32 vht_cap_info;
    1537                 :            :         struct ieee80211_vht_mcs_info supp_mcs;
    1538                 :            : } __packed;
    1539                 :            : 
    1540                 :            : /**
    1541                 :            :  * enum ieee80211_vht_chanwidth - VHT channel width
    1542                 :            :  * @IEEE80211_VHT_CHANWIDTH_USE_HT: use the HT operation IE to
    1543                 :            :  *      determine the channel width (20 or 40 MHz)
    1544                 :            :  * @IEEE80211_VHT_CHANWIDTH_80MHZ: 80 MHz bandwidth
    1545                 :            :  * @IEEE80211_VHT_CHANWIDTH_160MHZ: 160 MHz bandwidth
    1546                 :            :  * @IEEE80211_VHT_CHANWIDTH_80P80MHZ: 80+80 MHz bandwidth
    1547                 :            :  */
    1548                 :            : enum ieee80211_vht_chanwidth {
    1549                 :            :         IEEE80211_VHT_CHANWIDTH_USE_HT          = 0,
    1550                 :            :         IEEE80211_VHT_CHANWIDTH_80MHZ           = 1,
    1551                 :            :         IEEE80211_VHT_CHANWIDTH_160MHZ          = 2,
    1552                 :            :         IEEE80211_VHT_CHANWIDTH_80P80MHZ        = 3,
    1553                 :            : };
    1554                 :            : 
    1555                 :            : /**
    1556                 :            :  * struct ieee80211_vht_operation - VHT operation IE
    1557                 :            :  *
    1558                 :            :  * This structure is the "VHT operation element" as
    1559                 :            :  * described in 802.11ac D3.0 8.4.2.161
    1560                 :            :  * @chan_width: Operating channel width
    1561                 :            :  * @center_freq_seg0_idx: center freq segment 0 index
    1562                 :            :  * @center_freq_seg1_idx: center freq segment 1 index
    1563                 :            :  * @basic_mcs_set: VHT Basic MCS rate set
    1564                 :            :  */
    1565                 :            : struct ieee80211_vht_operation {
    1566                 :            :         u8 chan_width;
    1567                 :            :         u8 center_freq_seg0_idx;
    1568                 :            :         u8 center_freq_seg1_idx;
    1569                 :            :         __le16 basic_mcs_set;
    1570                 :            : } __packed;
    1571                 :            : 
    1572                 :            : /**
    1573                 :            :  * struct ieee80211_he_cap_elem - HE capabilities element
    1574                 :            :  *
    1575                 :            :  * This structure is the "HE capabilities element" fixed fields as
    1576                 :            :  * described in P802.11ax_D4.0 section 9.4.2.242.2 and 9.4.2.242.3
    1577                 :            :  */
    1578                 :            : struct ieee80211_he_cap_elem {
    1579                 :            :         u8 mac_cap_info[6];
    1580                 :            :         u8 phy_cap_info[11];
    1581                 :            : } __packed;
    1582                 :            : 
    1583                 :            : #define IEEE80211_TX_RX_MCS_NSS_DESC_MAX_LEN    5
    1584                 :            : 
    1585                 :            : /**
    1586                 :            :  * enum ieee80211_he_mcs_support - HE MCS support definitions
    1587                 :            :  * @IEEE80211_HE_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
    1588                 :            :  *      number of streams
    1589                 :            :  * @IEEE80211_HE_MCS_SUPPORT_0_9: MCSes 0-9 are supported
    1590                 :            :  * @IEEE80211_HE_MCS_SUPPORT_0_11: MCSes 0-11 are supported
    1591                 :            :  * @IEEE80211_HE_MCS_NOT_SUPPORTED: This number of streams isn't supported
    1592                 :            :  *
    1593                 :            :  * These definitions are used in each 2-bit subfield of the rx_mcs_*
    1594                 :            :  * and tx_mcs_* fields of &struct ieee80211_he_mcs_nss_supp, which are
    1595                 :            :  * both split into 8 subfields by number of streams. These values indicate
    1596                 :            :  * which MCSes are supported for the number of streams the value appears
    1597                 :            :  * for.
    1598                 :            :  */
    1599                 :            : enum ieee80211_he_mcs_support {
    1600                 :            :         IEEE80211_HE_MCS_SUPPORT_0_7    = 0,
    1601                 :            :         IEEE80211_HE_MCS_SUPPORT_0_9    = 1,
    1602                 :            :         IEEE80211_HE_MCS_SUPPORT_0_11   = 2,
    1603                 :            :         IEEE80211_HE_MCS_NOT_SUPPORTED  = 3,
    1604                 :            : };
    1605                 :            : 
    1606                 :            : /**
    1607                 :            :  * struct ieee80211_he_mcs_nss_supp - HE Tx/Rx HE MCS NSS Support Field
    1608                 :            :  *
    1609                 :            :  * This structure holds the data required for the Tx/Rx HE MCS NSS Support Field
    1610                 :            :  * described in P802.11ax_D2.0 section 9.4.2.237.4
    1611                 :            :  *
    1612                 :            :  * @rx_mcs_80: Rx MCS map 2 bits for each stream, total 8 streams, for channel
    1613                 :            :  *     widths less than 80MHz.
    1614                 :            :  * @tx_mcs_80: Tx MCS map 2 bits for each stream, total 8 streams, for channel
    1615                 :            :  *     widths less than 80MHz.
    1616                 :            :  * @rx_mcs_160: Rx MCS map 2 bits for each stream, total 8 streams, for channel
    1617                 :            :  *     width 160MHz.
    1618                 :            :  * @tx_mcs_160: Tx MCS map 2 bits for each stream, total 8 streams, for channel
    1619                 :            :  *     width 160MHz.
    1620                 :            :  * @rx_mcs_80p80: Rx MCS map 2 bits for each stream, total 8 streams, for
    1621                 :            :  *     channel width 80p80MHz.
    1622                 :            :  * @tx_mcs_80p80: Tx MCS map 2 bits for each stream, total 8 streams, for
    1623                 :            :  *     channel width 80p80MHz.
    1624                 :            :  */
    1625                 :            : struct ieee80211_he_mcs_nss_supp {
    1626                 :            :         __le16 rx_mcs_80;
    1627                 :            :         __le16 tx_mcs_80;
    1628                 :            :         __le16 rx_mcs_160;
    1629                 :            :         __le16 tx_mcs_160;
    1630                 :            :         __le16 rx_mcs_80p80;
    1631                 :            :         __le16 tx_mcs_80p80;
    1632                 :            : } __packed;
    1633                 :            : 
    1634                 :            : /**
    1635                 :            :  * struct ieee80211_he_operation - HE capabilities element
    1636                 :            :  *
    1637                 :            :  * This structure is the "HE operation element" fields as
    1638                 :            :  * described in P802.11ax_D4.0 section 9.4.2.243
    1639                 :            :  */
    1640                 :            : struct ieee80211_he_operation {
    1641                 :            :         __le32 he_oper_params;
    1642                 :            :         __le16 he_mcs_nss_set;
    1643                 :            :         /* Optional 0,1,3,4,5,7 or 8 bytes: depends on @he_oper_params */
    1644                 :            :         u8 optional[0];
    1645                 :            : } __packed;
    1646                 :            : 
    1647                 :            : /**
    1648                 :            :  * struct ieee80211_he_spr - HE spatial reuse element
    1649                 :            :  *
    1650                 :            :  * This structure is the "HE spatial reuse element" element as
    1651                 :            :  * described in P802.11ax_D4.0 section 9.4.2.241
    1652                 :            :  */
    1653                 :            : struct ieee80211_he_spr {
    1654                 :            :         u8 he_sr_control;
    1655                 :            :         /* Optional 0 to 19 bytes: depends on @he_sr_control */
    1656                 :            :         u8 optional[0];
    1657                 :            : } __packed;
    1658                 :            : 
    1659                 :            : /**
    1660                 :            :  * struct ieee80211_he_mu_edca_param_ac_rec - MU AC Parameter Record field
    1661                 :            :  *
    1662                 :            :  * This structure is the "MU AC Parameter Record" fields as
    1663                 :            :  * described in P802.11ax_D4.0 section 9.4.2.245
    1664                 :            :  */
    1665                 :            : struct ieee80211_he_mu_edca_param_ac_rec {
    1666                 :            :         u8 aifsn;
    1667                 :            :         u8 ecw_min_max;
    1668                 :            :         u8 mu_edca_timer;
    1669                 :            : } __packed;
    1670                 :            : 
    1671                 :            : /**
    1672                 :            :  * struct ieee80211_mu_edca_param_set - MU EDCA Parameter Set element
    1673                 :            :  *
    1674                 :            :  * This structure is the "MU EDCA Parameter Set element" fields as
    1675                 :            :  * described in P802.11ax_D4.0 section 9.4.2.245
    1676                 :            :  */
    1677                 :            : struct ieee80211_mu_edca_param_set {
    1678                 :            :         u8 mu_qos_info;
    1679                 :            :         struct ieee80211_he_mu_edca_param_ac_rec ac_be;
    1680                 :            :         struct ieee80211_he_mu_edca_param_ac_rec ac_bk;
    1681                 :            :         struct ieee80211_he_mu_edca_param_ac_rec ac_vi;
    1682                 :            :         struct ieee80211_he_mu_edca_param_ac_rec ac_vo;
    1683                 :            : } __packed;
    1684                 :            : 
    1685                 :            : /* 802.11ac VHT Capabilities */
    1686                 :            : #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895                  0x00000000
    1687                 :            : #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991                  0x00000001
    1688                 :            : #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454                 0x00000002
    1689                 :            : #define IEEE80211_VHT_CAP_MAX_MPDU_MASK                         0x00000003
    1690                 :            : #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ                0x00000004
    1691                 :            : #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ       0x00000008
    1692                 :            : #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK                  0x0000000C
    1693                 :            : #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT                 2
    1694                 :            : #define IEEE80211_VHT_CAP_RXLDPC                                0x00000010
    1695                 :            : #define IEEE80211_VHT_CAP_SHORT_GI_80                           0x00000020
    1696                 :            : #define IEEE80211_VHT_CAP_SHORT_GI_160                          0x00000040
    1697                 :            : #define IEEE80211_VHT_CAP_TXSTBC                                0x00000080
    1698                 :            : #define IEEE80211_VHT_CAP_RXSTBC_1                              0x00000100
    1699                 :            : #define IEEE80211_VHT_CAP_RXSTBC_2                              0x00000200
    1700                 :            : #define IEEE80211_VHT_CAP_RXSTBC_3                              0x00000300
    1701                 :            : #define IEEE80211_VHT_CAP_RXSTBC_4                              0x00000400
    1702                 :            : #define IEEE80211_VHT_CAP_RXSTBC_MASK                           0x00000700
    1703                 :            : #define IEEE80211_VHT_CAP_RXSTBC_SHIFT                          8
    1704                 :            : #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE                 0x00000800
    1705                 :            : #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE                 0x00001000
    1706                 :            : #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT                  13
    1707                 :            : #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK                   \
    1708                 :            :                 (7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT)
    1709                 :            : #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT             16
    1710                 :            : #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK              \
    1711                 :            :                 (7 << IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
    1712                 :            : #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE                 0x00080000
    1713                 :            : #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE                 0x00100000
    1714                 :            : #define IEEE80211_VHT_CAP_VHT_TXOP_PS                           0x00200000
    1715                 :            : #define IEEE80211_VHT_CAP_HTC_VHT                               0x00400000
    1716                 :            : #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT      23
    1717                 :            : #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK       \
    1718                 :            :                 (7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT)
    1719                 :            : #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB     0x08000000
    1720                 :            : #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB       0x0c000000
    1721                 :            : #define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN                    0x10000000
    1722                 :            : #define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN                    0x20000000
    1723                 :            : #define IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT                      30
    1724                 :            : #define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK                       0xc0000000
    1725                 :            : 
    1726                 :            : /**
    1727                 :            :  * ieee80211_get_vht_max_nss - return max NSS for a given bandwidth/MCS
    1728                 :            :  * @cap: VHT capabilities of the peer
    1729                 :            :  * @bw: bandwidth to use
    1730                 :            :  * @mcs: MCS index to use
    1731                 :            :  * @ext_nss_bw_capable: indicates whether or not the local transmitter
    1732                 :            :  *      (rate scaling algorithm) can deal with the new logic
    1733                 :            :  *      (dot11VHTExtendedNSSBWCapable)
    1734                 :            :  *
    1735                 :            :  * Due to the VHT Extended NSS Bandwidth Support, the maximum NSS can
    1736                 :            :  * vary for a given BW/MCS. This function parses the data.
    1737                 :            :  *
    1738                 :            :  * Note: This function is exported by cfg80211.
    1739                 :            :  */
    1740                 :            : int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
    1741                 :            :                               enum ieee80211_vht_chanwidth bw,
    1742                 :            :                               int mcs, bool ext_nss_bw_capable);
    1743                 :            : 
    1744                 :            : /* 802.11ax HE MAC capabilities */
    1745                 :            : #define IEEE80211_HE_MAC_CAP0_HTC_HE                            0x01
    1746                 :            : #define IEEE80211_HE_MAC_CAP0_TWT_REQ                           0x02
    1747                 :            : #define IEEE80211_HE_MAC_CAP0_TWT_RES                           0x04
    1748                 :            : #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_NOT_SUPP             0x00
    1749                 :            : #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_1              0x08
    1750                 :            : #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_2              0x10
    1751                 :            : #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_3              0x18
    1752                 :            : #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK                 0x18
    1753                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_1               0x00
    1754                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_2               0x20
    1755                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_4               0x40
    1756                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_8               0x60
    1757                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_16              0x80
    1758                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_32              0xa0
    1759                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_64              0xc0
    1760                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_UNLIMITED       0xe0
    1761                 :            : #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_MASK            0xe0
    1762                 :            : 
    1763                 :            : #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_UNLIMITED           0x00
    1764                 :            : #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_128                 0x01
    1765                 :            : #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_256                 0x02
    1766                 :            : #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_512                 0x03
    1767                 :            : #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_MASK                0x03
    1768                 :            : #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_0US                0x00
    1769                 :            : #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_8US                0x04
    1770                 :            : #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US               0x08
    1771                 :            : #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK               0x0c
    1772                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_1            0x00
    1773                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_2            0x10
    1774                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_3            0x20
    1775                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_4            0x30
    1776                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_5            0x40
    1777                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_6            0x50
    1778                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_7            0x60
    1779                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8            0x70
    1780                 :            : #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_MASK         0x70
    1781                 :            : 
    1782                 :            : /* Link adaptation is split between byte HE_MAC_CAP1 and
    1783                 :            :  * HE_MAC_CAP2. It should be set only if IEEE80211_HE_MAC_CAP0_HTC_HE
    1784                 :            :  * in which case the following values apply:
    1785                 :            :  * 0 = No feedback.
    1786                 :            :  * 1 = reserved.
    1787                 :            :  * 2 = Unsolicited feedback.
    1788                 :            :  * 3 = both
    1789                 :            :  */
    1790                 :            : #define IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION                   0x80
    1791                 :            : 
    1792                 :            : #define IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION                   0x01
    1793                 :            : #define IEEE80211_HE_MAC_CAP2_ALL_ACK                           0x02
    1794                 :            : #define IEEE80211_HE_MAC_CAP2_TRS                               0x04
    1795                 :            : #define IEEE80211_HE_MAC_CAP2_BSR                               0x08
    1796                 :            : #define IEEE80211_HE_MAC_CAP2_BCAST_TWT                         0x10
    1797                 :            : #define IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP                   0x20
    1798                 :            : #define IEEE80211_HE_MAC_CAP2_MU_CASCADING                      0x40
    1799                 :            : #define IEEE80211_HE_MAC_CAP2_ACK_EN                            0x80
    1800                 :            : 
    1801                 :            : #define IEEE80211_HE_MAC_CAP3_OMI_CONTROL                       0x02
    1802                 :            : #define IEEE80211_HE_MAC_CAP3_OFDMA_RA                          0x04
    1803                 :            : 
    1804                 :            : /* The maximum length of an A-MDPU is defined by the combination of the Maximum
    1805                 :            :  * A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the
    1806                 :            :  * same field in the HE capabilities.
    1807                 :            :  */
    1808                 :            : #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_USE_VHT 0x00
    1809                 :            : #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_1           0x08
    1810                 :            : #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2           0x10
    1811                 :            : #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED        0x18
    1812                 :            : #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK            0x18
    1813                 :            : #define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG                        0x20
    1814                 :            : #define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED                    0x40
    1815                 :            : #define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS         0x80
    1816                 :            : 
    1817                 :            : #define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG              0x01
    1818                 :            : #define IEEE80211_HE_MAC_CAP4_QTP                               0x02
    1819                 :            : #define IEEE80211_HE_MAC_CAP4_BQR                               0x04
    1820                 :            : #define IEEE80211_HE_MAC_CAP4_SRP_RESP                          0x08
    1821                 :            : #define IEEE80211_HE_MAC_CAP4_NDP_FB_REP                        0x10
    1822                 :            : #define IEEE80211_HE_MAC_CAP4_OPS                               0x20
    1823                 :            : #define IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU                    0x40
    1824                 :            : /* Multi TID agg TX is split between byte #4 and #5
    1825                 :            :  * The value is a combination of B39,B40,B41
    1826                 :            :  */
    1827                 :            : #define IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39          0x80
    1828                 :            : 
    1829                 :            : #define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40          0x01
    1830                 :            : #define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41          0x02
    1831                 :            : #define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION    0x04
    1832                 :            : #define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU                  0x08
    1833                 :            : #define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX         0x10
    1834                 :            : #define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS                  0x20
    1835                 :            : #define IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING                0x40
    1836                 :            : #define IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX              0x80
    1837                 :            : 
    1838                 :            : /* 802.11ax HE PHY capabilities */
    1839                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G             0x02
    1840                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G       0x04
    1841                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G            0x08
    1842                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G      0x10
    1843                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G        0x20
    1844                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G        0x40
    1845                 :            : #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK                    0xfe
    1846                 :            : 
    1847                 :            : #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_20MHZ  0x01
    1848                 :            : #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_40MHZ  0x02
    1849                 :            : #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_20MHZ 0x04
    1850                 :            : #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_40MHZ 0x08
    1851                 :            : #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK                     0x0f
    1852                 :            : #define IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A                            0x10
    1853                 :            : #define IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD                    0x20
    1854                 :            : #define IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US          0x40
    1855                 :            : /* Midamble RX/TX Max NSTS is split between byte #2 and byte #3 */
    1856                 :            : #define IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS                   0x80
    1857                 :            : 
    1858                 :            : #define IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS                   0x01
    1859                 :            : #define IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US                      0x02
    1860                 :            : #define IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ                       0x04
    1861                 :            : #define IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ                       0x08
    1862                 :            : #define IEEE80211_HE_PHY_CAP2_DOPPLER_TX                                0x10
    1863                 :            : #define IEEE80211_HE_PHY_CAP2_DOPPLER_RX                                0x20
    1864                 :            : 
    1865                 :            : /* Note that the meaning of UL MU below is different between an AP and a non-AP
    1866                 :            :  * sta, where in the AP case it indicates support for Rx and in the non-AP sta
    1867                 :            :  * case it indicates support for Tx.
    1868                 :            :  */
    1869                 :            : #define IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO                        0x40
    1870                 :            : #define IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO                     0x80
    1871                 :            : 
    1872                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM                   0x00
    1873                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK                     0x01
    1874                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK                     0x02
    1875                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_16_QAM                   0x03
    1876                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK                     0x03
    1877                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1                          0x00
    1878                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_2                          0x04
    1879                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM                   0x00
    1880                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK                     0x08
    1881                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK                     0x10
    1882                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM                   0x18
    1883                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK                     0x18
    1884                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1                          0x00
    1885                 :            : #define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2                          0x20
    1886                 :            : #define IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA             0x40
    1887                 :            : #define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER                             0x80
    1888                 :            : 
    1889                 :            : #define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE                             0x01
    1890                 :            : #define IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER                             0x02
    1891                 :            : 
    1892                 :            : /* Minimal allowed value of Max STS under 80MHz is 3 */
    1893                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4          0x0c
    1894                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5          0x10
    1895                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_6          0x14
    1896                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_7          0x18
    1897                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8          0x1c
    1898                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK       0x1c
    1899                 :            : 
    1900                 :            : /* Minimal allowed value of Max STS above 80MHz is 3 */
    1901                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4          0x60
    1902                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5          0x80
    1903                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_6          0xa0
    1904                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_7          0xc0
    1905                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8          0xe0
    1906                 :            : #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK       0xe0
    1907                 :            : 
    1908                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_1      0x00
    1909                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2      0x01
    1910                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_3      0x02
    1911                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_4      0x03
    1912                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_5      0x04
    1913                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_6      0x05
    1914                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_7      0x06
    1915                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_8      0x07
    1916                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK   0x07
    1917                 :            : 
    1918                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_1      0x00
    1919                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2      0x08
    1920                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_3      0x10
    1921                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_4      0x18
    1922                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_5      0x20
    1923                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_6      0x28
    1924                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_7      0x30
    1925                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_8      0x38
    1926                 :            : #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK   0x38
    1927                 :            : 
    1928                 :            : #define IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK                          0x40
    1929                 :            : #define IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK                          0x80
    1930                 :            : 
    1931                 :            : #define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU                       0x01
    1932                 :            : #define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU                       0x02
    1933                 :            : #define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB                     0x04
    1934                 :            : #define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB                     0x08
    1935                 :            : #define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB                               0x10
    1936                 :            : #define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE                      0x20
    1937                 :            : #define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO               0x40
    1938                 :            : #define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT                     0x80
    1939                 :            : 
    1940                 :            : #define IEEE80211_HE_PHY_CAP7_SRP_BASED_SR                              0x01
    1941                 :            : #define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR                     0x02
    1942                 :            : #define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI          0x04
    1943                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_1                                  0x08
    1944                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_2                                  0x10
    1945                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_3                                  0x18
    1946                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_4                                  0x20
    1947                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_5                                  0x28
    1948                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_6                                  0x30
    1949                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_7                                  0x38
    1950                 :            : #define IEEE80211_HE_PHY_CAP7_MAX_NC_MASK                               0x38
    1951                 :            : #define IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ                       0x40
    1952                 :            : #define IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ                       0x80
    1953                 :            : 
    1954                 :            : #define IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI          0x01
    1955                 :            : #define IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G              0x02
    1956                 :            : #define IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU                   0x04
    1957                 :            : #define IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU                   0x08
    1958                 :            : #define IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI               0x10
    1959                 :            : #define IEEE80211_HE_PHY_CAP8_MIDAMBLE_RX_TX_2X_AND_1XLTF               0x20
    1960                 :            : #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242                            0x00
    1961                 :            : #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484                            0x40
    1962                 :            : #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996                            0x80
    1963                 :            : #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996                          0xc0
    1964                 :            : #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK                           0xc0
    1965                 :            : 
    1966                 :            : #define IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM              0x01
    1967                 :            : #define IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK                0x02
    1968                 :            : #define IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU         0x04
    1969                 :            : #define IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU         0x08
    1970                 :            : #define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB     0x10
    1971                 :            : #define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB 0x20
    1972                 :            : #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_0US                   0x00
    1973                 :            : #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_8US                   0x40
    1974                 :            : #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US                  0x80
    1975                 :            : #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED              0xc0
    1976                 :            : #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_MASK                  0xc0
    1977                 :            : 
    1978                 :            : /* 802.11ax HE TX/RX MCS NSS Support  */
    1979                 :            : #define IEEE80211_TX_RX_MCS_NSS_SUPP_HIGHEST_MCS_POS                    (3)
    1980                 :            : #define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_POS                      (6)
    1981                 :            : #define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_POS                      (11)
    1982                 :            : #define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_MASK                     0x07c0
    1983                 :            : #define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_MASK                     0xf800
    1984                 :            : 
    1985                 :            : /* TX/RX HE MCS Support field Highest MCS subfield encoding */
    1986                 :            : enum ieee80211_he_highest_mcs_supported_subfield_enc {
    1987                 :            :         HIGHEST_MCS_SUPPORTED_MCS7 = 0,
    1988                 :            :         HIGHEST_MCS_SUPPORTED_MCS8,
    1989                 :            :         HIGHEST_MCS_SUPPORTED_MCS9,
    1990                 :            :         HIGHEST_MCS_SUPPORTED_MCS10,
    1991                 :            :         HIGHEST_MCS_SUPPORTED_MCS11,
    1992                 :            : };
    1993                 :            : 
    1994                 :            : /* Calculate 802.11ax HE capabilities IE Tx/Rx HE MCS NSS Support Field size */
    1995                 :            : static inline u8
    1996                 :            : ieee80211_he_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap)
    1997                 :            : {
    1998                 :            :         u8 count = 4;
    1999                 :            : 
    2000                 :            :         if (he_cap->phy_cap_info[0] &
    2001                 :            :             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
    2002                 :            :                 count += 4;
    2003                 :            : 
    2004                 :            :         if (he_cap->phy_cap_info[0] &
    2005                 :            :             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
    2006                 :            :                 count += 4;
    2007                 :            : 
    2008                 :            :         return count;
    2009                 :            : }
    2010                 :            : 
    2011                 :            : /* 802.11ax HE PPE Thresholds */
    2012                 :            : #define IEEE80211_PPE_THRES_NSS_SUPPORT_2NSS                    (1)
    2013                 :            : #define IEEE80211_PPE_THRES_NSS_POS                             (0)
    2014                 :            : #define IEEE80211_PPE_THRES_NSS_MASK                            (7)
    2015                 :            : #define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_2x966_AND_966_RU   \
    2016                 :            :         (BIT(5) | BIT(6))
    2017                 :            : #define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK               0x78
    2018                 :            : #define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS                (3)
    2019                 :            : #define IEEE80211_PPE_THRES_INFO_PPET_SIZE                      (3)
    2020                 :            : 
    2021                 :            : /*
    2022                 :            :  * Calculate 802.11ax HE capabilities IE PPE field size
    2023                 :            :  * Input: Header byte of ppe_thres (first byte), and HE capa IE's PHY cap u8*
    2024                 :            :  */
    2025                 :            : static inline u8
    2026                 :            : ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
    2027                 :            : {
    2028                 :            :         u8 n;
    2029                 :            : 
    2030                 :            :         if ((phy_cap_info[6] &
    2031                 :            :              IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0)
    2032                 :            :                 return 0;
    2033                 :            : 
    2034                 :            :         n = hweight8(ppe_thres_hdr &
    2035                 :            :                      IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
    2036                 :            :         n *= (1 + ((ppe_thres_hdr & IEEE80211_PPE_THRES_NSS_MASK) >>
    2037                 :            :                    IEEE80211_PPE_THRES_NSS_POS));
    2038                 :            : 
    2039                 :            :         /*
    2040                 :            :          * Each pair is 6 bits, and we need to add the 7 "header" bits to the
    2041                 :            :          * total size.
    2042                 :            :          */
    2043                 :            :         n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7;
    2044                 :            :         n = DIV_ROUND_UP(n, 8);
    2045                 :            : 
    2046                 :            :         return n;
    2047                 :            : }
    2048                 :            : 
    2049                 :            : /* HE Operation defines */
    2050                 :            : #define IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK            0x00000007
    2051                 :            : #define IEEE80211_HE_OPERATION_TWT_REQUIRED                     0x00000008
    2052                 :            : #define IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK               0x00003ff0
    2053                 :            : #define IEEE80211_HE_OPERATION_RTS_THRESHOLD_OFFSET             4
    2054                 :            : #define IEEE80211_HE_OPERATION_VHT_OPER_INFO                    0x00004000
    2055                 :            : #define IEEE80211_HE_OPERATION_CO_HOSTED_BSS                    0x00008000
    2056                 :            : #define IEEE80211_HE_OPERATION_ER_SU_DISABLE                    0x00010000
    2057                 :            : #define IEEE80211_HE_OPERATION_6GHZ_OP_INFO                     0x00020000
    2058                 :            : #define IEEE80211_HE_OPERATION_BSS_COLOR_MASK                   0x3f000000
    2059                 :            : #define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET         24
    2060                 :            : #define IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR                0x40000000
    2061                 :            : #define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED               0x80000000
    2062                 :            : 
    2063                 :            : /*
    2064                 :            :  * ieee80211_he_oper_size - calculate 802.11ax HE Operations IE size
    2065                 :            :  * @he_oper_ie: byte data of the He Operations IE, stating from the the byte
    2066                 :            :  *      after the ext ID byte. It is assumed that he_oper_ie has at least
    2067                 :            :  *      sizeof(struct ieee80211_he_operation) bytes, the caller must have
    2068                 :            :  *      validated this.
    2069                 :            :  * @return the actual size of the IE data (not including header), or 0 on error
    2070                 :            :  */
    2071                 :            : static inline u8
    2072                 :            : ieee80211_he_oper_size(const u8 *he_oper_ie)
    2073                 :            : {
    2074                 :            :         struct ieee80211_he_operation *he_oper = (void *)he_oper_ie;
    2075                 :            :         u8 oper_len = sizeof(struct ieee80211_he_operation);
    2076                 :            :         u32 he_oper_params;
    2077                 :            : 
    2078                 :            :         /* Make sure the input is not NULL */
    2079                 :            :         if (!he_oper_ie)
    2080                 :            :                 return 0;
    2081                 :            : 
    2082                 :            :         /* Calc required length */
    2083                 :            :         he_oper_params = le32_to_cpu(he_oper->he_oper_params);
    2084                 :            :         if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO)
    2085                 :            :                 oper_len += 3;
    2086                 :            :         if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
    2087                 :            :                 oper_len++;
    2088                 :            :         if (he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO)
    2089                 :            :                 oper_len += 4;
    2090                 :            : 
    2091                 :            :         /* Add the first byte (extension ID) to the total length */
    2092                 :            :         oper_len++;
    2093                 :            : 
    2094                 :            :         return oper_len;
    2095                 :            : }
    2096                 :            : 
    2097                 :            : /* HE Spatial Reuse defines */
    2098                 :            : #define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT                 0x4
    2099                 :            : #define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT                0x8
    2100                 :            : 
    2101                 :            : /*
    2102                 :            :  * ieee80211_he_spr_size - calculate 802.11ax HE Spatial Reuse IE size
    2103                 :            :  * @he_spr_ie: byte data of the He Spatial Reuse IE, stating from the the byte
    2104                 :            :  *      after the ext ID byte. It is assumed that he_spr_ie has at least
    2105                 :            :  *      sizeof(struct ieee80211_he_spr) bytes, the caller must have validated
    2106                 :            :  *      this
    2107                 :            :  * @return the actual size of the IE data (not including header), or 0 on error
    2108                 :            :  */
    2109                 :            : static inline u8
    2110                 :            : ieee80211_he_spr_size(const u8 *he_spr_ie)
    2111                 :            : {
    2112                 :            :         struct ieee80211_he_spr *he_spr = (void *)he_spr_ie;
    2113                 :            :         u8 spr_len = sizeof(struct ieee80211_he_spr);
    2114                 :            :         u8 he_spr_params;
    2115                 :            : 
    2116                 :            :         /* Make sure the input is not NULL */
    2117                 :            :         if (!he_spr_ie)
    2118                 :            :                 return 0;
    2119                 :            : 
    2120                 :            :         /* Calc required length */
    2121                 :            :         he_spr_params = he_spr->he_sr_control;
    2122                 :            :         if (he_spr_params & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
    2123                 :            :                 spr_len++;
    2124                 :            :         if (he_spr_params & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT)
    2125                 :            :                 spr_len += 18;
    2126                 :            : 
    2127                 :            :         /* Add the first byte (extension ID) to the total length */
    2128                 :            :         spr_len++;
    2129                 :            : 
    2130                 :            :         return spr_len;
    2131                 :            : }
    2132                 :            : 
    2133                 :            : /* Authentication algorithms */
    2134                 :            : #define WLAN_AUTH_OPEN 0
    2135                 :            : #define WLAN_AUTH_SHARED_KEY 1
    2136                 :            : #define WLAN_AUTH_FT 2
    2137                 :            : #define WLAN_AUTH_SAE 3
    2138                 :            : #define WLAN_AUTH_FILS_SK 4
    2139                 :            : #define WLAN_AUTH_FILS_SK_PFS 5
    2140                 :            : #define WLAN_AUTH_FILS_PK 6
    2141                 :            : #define WLAN_AUTH_LEAP 128
    2142                 :            : 
    2143                 :            : #define WLAN_AUTH_CHALLENGE_LEN 128
    2144                 :            : 
    2145                 :            : #define WLAN_CAPABILITY_ESS             (1<<0)
    2146                 :            : #define WLAN_CAPABILITY_IBSS            (1<<1)
    2147                 :            : 
    2148                 :            : /*
    2149                 :            :  * A mesh STA sets the ESS and IBSS capability bits to zero.
    2150                 :            :  * however, this holds true for p2p probe responses (in the p2p_find
    2151                 :            :  * phase) as well.
    2152                 :            :  */
    2153                 :            : #define WLAN_CAPABILITY_IS_STA_BSS(cap) \
    2154                 :            :         (!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
    2155                 :            : 
    2156                 :            : #define WLAN_CAPABILITY_CF_POLLABLE     (1<<2)
    2157                 :            : #define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
    2158                 :            : #define WLAN_CAPABILITY_PRIVACY         (1<<4)
    2159                 :            : #define WLAN_CAPABILITY_SHORT_PREAMBLE  (1<<5)
    2160                 :            : #define WLAN_CAPABILITY_PBCC            (1<<6)
    2161                 :            : #define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
    2162                 :            : 
    2163                 :            : /* 802.11h */
    2164                 :            : #define WLAN_CAPABILITY_SPECTRUM_MGMT   (1<<8)
    2165                 :            : #define WLAN_CAPABILITY_QOS             (1<<9)
    2166                 :            : #define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10)
    2167                 :            : #define WLAN_CAPABILITY_APSD            (1<<11)
    2168                 :            : #define WLAN_CAPABILITY_RADIO_MEASURE   (1<<12)
    2169                 :            : #define WLAN_CAPABILITY_DSSS_OFDM       (1<<13)
    2170                 :            : #define WLAN_CAPABILITY_DEL_BACK        (1<<14)
    2171                 :            : #define WLAN_CAPABILITY_IMM_BACK        (1<<15)
    2172                 :            : 
    2173                 :            : /* DMG (60gHz) 802.11ad */
    2174                 :            : /* type - bits 0..1 */
    2175                 :            : #define WLAN_CAPABILITY_DMG_TYPE_MASK           (3<<0)
    2176                 :            : #define WLAN_CAPABILITY_DMG_TYPE_IBSS           (1<<0) /* Tx by: STA */
    2177                 :            : #define WLAN_CAPABILITY_DMG_TYPE_PBSS           (2<<0) /* Tx by: PCP */
    2178                 :            : #define WLAN_CAPABILITY_DMG_TYPE_AP             (3<<0) /* Tx by: AP */
    2179                 :            : 
    2180                 :            : #define WLAN_CAPABILITY_DMG_CBAP_ONLY           (1<<2)
    2181                 :            : #define WLAN_CAPABILITY_DMG_CBAP_SOURCE         (1<<3)
    2182                 :            : #define WLAN_CAPABILITY_DMG_PRIVACY             (1<<4)
    2183                 :            : #define WLAN_CAPABILITY_DMG_ECPAC               (1<<5)
    2184                 :            : 
    2185                 :            : #define WLAN_CAPABILITY_DMG_SPECTRUM_MGMT       (1<<8)
    2186                 :            : #define WLAN_CAPABILITY_DMG_RADIO_MEASURE       (1<<12)
    2187                 :            : 
    2188                 :            : /* measurement */
    2189                 :            : #define IEEE80211_SPCT_MSR_RPRT_MODE_LATE       (1<<0)
    2190                 :            : #define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE  (1<<1)
    2191                 :            : #define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED    (1<<2)
    2192                 :            : 
    2193                 :            : #define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC      0
    2194                 :            : #define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA        1
    2195                 :            : #define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI        2
    2196                 :            : #define IEEE80211_SPCT_MSR_RPRT_TYPE_LCI        8
    2197                 :            : #define IEEE80211_SPCT_MSR_RPRT_TYPE_CIVIC      11
    2198                 :            : 
    2199                 :            : /* 802.11g ERP information element */
    2200                 :            : #define WLAN_ERP_NON_ERP_PRESENT (1<<0)
    2201                 :            : #define WLAN_ERP_USE_PROTECTION (1<<1)
    2202                 :            : #define WLAN_ERP_BARKER_PREAMBLE (1<<2)
    2203                 :            : 
    2204                 :            : /* WLAN_ERP_BARKER_PREAMBLE values */
    2205                 :            : enum {
    2206                 :            :         WLAN_ERP_PREAMBLE_SHORT = 0,
    2207                 :            :         WLAN_ERP_PREAMBLE_LONG = 1,
    2208                 :            : };
    2209                 :            : 
    2210                 :            : /* Band ID, 802.11ad #8.4.1.45 */
    2211                 :            : enum {
    2212                 :            :         IEEE80211_BANDID_TV_WS = 0, /* TV white spaces */
    2213                 :            :         IEEE80211_BANDID_SUB1  = 1, /* Sub-1 GHz (excluding TV white spaces) */
    2214                 :            :         IEEE80211_BANDID_2G    = 2, /* 2.4 GHz */
    2215                 :            :         IEEE80211_BANDID_3G    = 3, /* 3.6 GHz */
    2216                 :            :         IEEE80211_BANDID_5G    = 4, /* 4.9 and 5 GHz */
    2217                 :            :         IEEE80211_BANDID_60G   = 5, /* 60 GHz */
    2218                 :            : };
    2219                 :            : 
    2220                 :            : /* Status codes */
    2221                 :            : enum ieee80211_statuscode {
    2222                 :            :         WLAN_STATUS_SUCCESS = 0,
    2223                 :            :         WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
    2224                 :            :         WLAN_STATUS_CAPS_UNSUPPORTED = 10,
    2225                 :            :         WLAN_STATUS_REASSOC_NO_ASSOC = 11,
    2226                 :            :         WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
    2227                 :            :         WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
    2228                 :            :         WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
    2229                 :            :         WLAN_STATUS_CHALLENGE_FAIL = 15,
    2230                 :            :         WLAN_STATUS_AUTH_TIMEOUT = 16,
    2231                 :            :         WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
    2232                 :            :         WLAN_STATUS_ASSOC_DENIED_RATES = 18,
    2233                 :            :         /* 802.11b */
    2234                 :            :         WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
    2235                 :            :         WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
    2236                 :            :         WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
    2237                 :            :         /* 802.11h */
    2238                 :            :         WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
    2239                 :            :         WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
    2240                 :            :         WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
    2241                 :            :         /* 802.11g */
    2242                 :            :         WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
    2243                 :            :         WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
    2244                 :            :         /* 802.11w */
    2245                 :            :         WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY = 30,
    2246                 :            :         WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31,
    2247                 :            :         /* 802.11i */
    2248                 :            :         WLAN_STATUS_INVALID_IE = 40,
    2249                 :            :         WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
    2250                 :            :         WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
    2251                 :            :         WLAN_STATUS_INVALID_AKMP = 43,
    2252                 :            :         WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
    2253                 :            :         WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
    2254                 :            :         WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
    2255                 :            :         /* 802.11e */
    2256                 :            :         WLAN_STATUS_UNSPECIFIED_QOS = 32,
    2257                 :            :         WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
    2258                 :            :         WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
    2259                 :            :         WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
    2260                 :            :         WLAN_STATUS_REQUEST_DECLINED = 37,
    2261                 :            :         WLAN_STATUS_INVALID_QOS_PARAM = 38,
    2262                 :            :         WLAN_STATUS_CHANGE_TSPEC = 39,
    2263                 :            :         WLAN_STATUS_WAIT_TS_DELAY = 47,
    2264                 :            :         WLAN_STATUS_NO_DIRECT_LINK = 48,
    2265                 :            :         WLAN_STATUS_STA_NOT_PRESENT = 49,
    2266                 :            :         WLAN_STATUS_STA_NOT_QSTA = 50,
    2267                 :            :         /* 802.11s */
    2268                 :            :         WLAN_STATUS_ANTI_CLOG_REQUIRED = 76,
    2269                 :            :         WLAN_STATUS_FCG_NOT_SUPP = 78,
    2270                 :            :         WLAN_STATUS_STA_NO_TBTT = 78,
    2271                 :            :         /* 802.11ad */
    2272                 :            :         WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES = 39,
    2273                 :            :         WLAN_STATUS_REJECTED_FOR_DELAY_PERIOD = 47,
    2274                 :            :         WLAN_STATUS_REJECT_WITH_SCHEDULE = 83,
    2275                 :            :         WLAN_STATUS_PENDING_ADMITTING_FST_SESSION = 86,
    2276                 :            :         WLAN_STATUS_PERFORMING_FST_NOW = 87,
    2277                 :            :         WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW = 88,
    2278                 :            :         WLAN_STATUS_REJECT_U_PID_SETTING = 89,
    2279                 :            :         WLAN_STATUS_REJECT_DSE_BAND = 96,
    2280                 :            :         WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL = 99,
    2281                 :            :         WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT = 103,
    2282                 :            :         /* 802.11ai */
    2283                 :            :         WLAN_STATUS_FILS_AUTHENTICATION_FAILURE = 108,
    2284                 :            :         WLAN_STATUS_UNKNOWN_AUTHENTICATION_SERVER = 109,
    2285                 :            : };
    2286                 :            : 
    2287                 :            : 
    2288                 :            : /* Reason codes */
    2289                 :            : enum ieee80211_reasoncode {
    2290                 :            :         WLAN_REASON_UNSPECIFIED = 1,
    2291                 :            :         WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
    2292                 :            :         WLAN_REASON_DEAUTH_LEAVING = 3,
    2293                 :            :         WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
    2294                 :            :         WLAN_REASON_DISASSOC_AP_BUSY = 5,
    2295                 :            :         WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
    2296                 :            :         WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
    2297                 :            :         WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
    2298                 :            :         WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
    2299                 :            :         /* 802.11h */
    2300                 :            :         WLAN_REASON_DISASSOC_BAD_POWER = 10,
    2301                 :            :         WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
    2302                 :            :         /* 802.11i */
    2303                 :            :         WLAN_REASON_INVALID_IE = 13,
    2304                 :            :         WLAN_REASON_MIC_FAILURE = 14,
    2305                 :            :         WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
    2306                 :            :         WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
    2307                 :            :         WLAN_REASON_IE_DIFFERENT = 17,
    2308                 :            :         WLAN_REASON_INVALID_GROUP_CIPHER = 18,
    2309                 :            :         WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
    2310                 :            :         WLAN_REASON_INVALID_AKMP = 20,
    2311                 :            :         WLAN_REASON_UNSUPP_RSN_VERSION = 21,
    2312                 :            :         WLAN_REASON_INVALID_RSN_IE_CAP = 22,
    2313                 :            :         WLAN_REASON_IEEE8021X_FAILED = 23,
    2314                 :            :         WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
    2315                 :            :         /* TDLS (802.11z) */
    2316                 :            :         WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE = 25,
    2317                 :            :         WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26,
    2318                 :            :         /* 802.11e */
    2319                 :            :         WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
    2320                 :            :         WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
    2321                 :            :         WLAN_REASON_DISASSOC_LOW_ACK = 34,
    2322                 :            :         WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
    2323                 :            :         WLAN_REASON_QSTA_LEAVE_QBSS = 36,
    2324                 :            :         WLAN_REASON_QSTA_NOT_USE = 37,
    2325                 :            :         WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
    2326                 :            :         WLAN_REASON_QSTA_TIMEOUT = 39,
    2327                 :            :         WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
    2328                 :            :         /* 802.11s */
    2329                 :            :         WLAN_REASON_MESH_PEER_CANCELED = 52,
    2330                 :            :         WLAN_REASON_MESH_MAX_PEERS = 53,
    2331                 :            :         WLAN_REASON_MESH_CONFIG = 54,
    2332                 :            :         WLAN_REASON_MESH_CLOSE = 55,
    2333                 :            :         WLAN_REASON_MESH_MAX_RETRIES = 56,
    2334                 :            :         WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57,
    2335                 :            :         WLAN_REASON_MESH_INVALID_GTK = 58,
    2336                 :            :         WLAN_REASON_MESH_INCONSISTENT_PARAM = 59,
    2337                 :            :         WLAN_REASON_MESH_INVALID_SECURITY = 60,
    2338                 :            :         WLAN_REASON_MESH_PATH_ERROR = 61,
    2339                 :            :         WLAN_REASON_MESH_PATH_NOFORWARD = 62,
    2340                 :            :         WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63,
    2341                 :            :         WLAN_REASON_MAC_EXISTS_IN_MBSS = 64,
    2342                 :            :         WLAN_REASON_MESH_CHAN_REGULATORY = 65,
    2343                 :            :         WLAN_REASON_MESH_CHAN = 66,
    2344                 :            : };
    2345                 :            : 
    2346                 :            : 
    2347                 :            : /* Information Element IDs */
    2348                 :            : enum ieee80211_eid {
    2349                 :            :         WLAN_EID_SSID = 0,
    2350                 :            :         WLAN_EID_SUPP_RATES = 1,
    2351                 :            :         WLAN_EID_FH_PARAMS = 2, /* reserved now */
    2352                 :            :         WLAN_EID_DS_PARAMS = 3,
    2353                 :            :         WLAN_EID_CF_PARAMS = 4,
    2354                 :            :         WLAN_EID_TIM = 5,
    2355                 :            :         WLAN_EID_IBSS_PARAMS = 6,
    2356                 :            :         WLAN_EID_COUNTRY = 7,
    2357                 :            :         /* 8, 9 reserved */
    2358                 :            :         WLAN_EID_REQUEST = 10,
    2359                 :            :         WLAN_EID_QBSS_LOAD = 11,
    2360                 :            :         WLAN_EID_EDCA_PARAM_SET = 12,
    2361                 :            :         WLAN_EID_TSPEC = 13,
    2362                 :            :         WLAN_EID_TCLAS = 14,
    2363                 :            :         WLAN_EID_SCHEDULE = 15,
    2364                 :            :         WLAN_EID_CHALLENGE = 16,
    2365                 :            :         /* 17-31 reserved for challenge text extension */
    2366                 :            :         WLAN_EID_PWR_CONSTRAINT = 32,
    2367                 :            :         WLAN_EID_PWR_CAPABILITY = 33,
    2368                 :            :         WLAN_EID_TPC_REQUEST = 34,
    2369                 :            :         WLAN_EID_TPC_REPORT = 35,
    2370                 :            :         WLAN_EID_SUPPORTED_CHANNELS = 36,
    2371                 :            :         WLAN_EID_CHANNEL_SWITCH = 37,
    2372                 :            :         WLAN_EID_MEASURE_REQUEST = 38,
    2373                 :            :         WLAN_EID_MEASURE_REPORT = 39,
    2374                 :            :         WLAN_EID_QUIET = 40,
    2375                 :            :         WLAN_EID_IBSS_DFS = 41,
    2376                 :            :         WLAN_EID_ERP_INFO = 42,
    2377                 :            :         WLAN_EID_TS_DELAY = 43,
    2378                 :            :         WLAN_EID_TCLAS_PROCESSING = 44,
    2379                 :            :         WLAN_EID_HT_CAPABILITY = 45,
    2380                 :            :         WLAN_EID_QOS_CAPA = 46,
    2381                 :            :         /* 47 reserved for Broadcom */
    2382                 :            :         WLAN_EID_RSN = 48,
    2383                 :            :         WLAN_EID_802_15_COEX = 49,
    2384                 :            :         WLAN_EID_EXT_SUPP_RATES = 50,
    2385                 :            :         WLAN_EID_AP_CHAN_REPORT = 51,
    2386                 :            :         WLAN_EID_NEIGHBOR_REPORT = 52,
    2387                 :            :         WLAN_EID_RCPI = 53,
    2388                 :            :         WLAN_EID_MOBILITY_DOMAIN = 54,
    2389                 :            :         WLAN_EID_FAST_BSS_TRANSITION = 55,
    2390                 :            :         WLAN_EID_TIMEOUT_INTERVAL = 56,
    2391                 :            :         WLAN_EID_RIC_DATA = 57,
    2392                 :            :         WLAN_EID_DSE_REGISTERED_LOCATION = 58,
    2393                 :            :         WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59,
    2394                 :            :         WLAN_EID_EXT_CHANSWITCH_ANN = 60,
    2395                 :            :         WLAN_EID_HT_OPERATION = 61,
    2396                 :            :         WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62,
    2397                 :            :         WLAN_EID_BSS_AVG_ACCESS_DELAY = 63,
    2398                 :            :         WLAN_EID_ANTENNA_INFO = 64,
    2399                 :            :         WLAN_EID_RSNI = 65,
    2400                 :            :         WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66,
    2401                 :            :         WLAN_EID_BSS_AVAILABLE_CAPACITY = 67,
    2402                 :            :         WLAN_EID_BSS_AC_ACCESS_DELAY = 68,
    2403                 :            :         WLAN_EID_TIME_ADVERTISEMENT = 69,
    2404                 :            :         WLAN_EID_RRM_ENABLED_CAPABILITIES = 70,
    2405                 :            :         WLAN_EID_MULTIPLE_BSSID = 71,
    2406                 :            :         WLAN_EID_BSS_COEX_2040 = 72,
    2407                 :            :         WLAN_EID_BSS_INTOLERANT_CHL_REPORT = 73,
    2408                 :            :         WLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74,
    2409                 :            :         WLAN_EID_RIC_DESCRIPTOR = 75,
    2410                 :            :         WLAN_EID_MMIE = 76,
    2411                 :            :         WLAN_EID_ASSOC_COMEBACK_TIME = 77,
    2412                 :            :         WLAN_EID_EVENT_REQUEST = 78,
    2413                 :            :         WLAN_EID_EVENT_REPORT = 79,
    2414                 :            :         WLAN_EID_DIAGNOSTIC_REQUEST = 80,
    2415                 :            :         WLAN_EID_DIAGNOSTIC_REPORT = 81,
    2416                 :            :         WLAN_EID_LOCATION_PARAMS = 82,
    2417                 :            :         WLAN_EID_NON_TX_BSSID_CAP =  83,
    2418                 :            :         WLAN_EID_SSID_LIST = 84,
    2419                 :            :         WLAN_EID_MULTI_BSSID_IDX = 85,
    2420                 :            :         WLAN_EID_FMS_DESCRIPTOR = 86,
    2421                 :            :         WLAN_EID_FMS_REQUEST = 87,
    2422                 :            :         WLAN_EID_FMS_RESPONSE = 88,
    2423                 :            :         WLAN_EID_QOS_TRAFFIC_CAPA = 89,
    2424                 :            :         WLAN_EID_BSS_MAX_IDLE_PERIOD = 90,
    2425                 :            :         WLAN_EID_TSF_REQUEST = 91,
    2426                 :            :         WLAN_EID_TSF_RESPOSNE = 92,
    2427                 :            :         WLAN_EID_WNM_SLEEP_MODE = 93,
    2428                 :            :         WLAN_EID_TIM_BCAST_REQ = 94,
    2429                 :            :         WLAN_EID_TIM_BCAST_RESP = 95,
    2430                 :            :         WLAN_EID_COLL_IF_REPORT = 96,
    2431                 :            :         WLAN_EID_CHANNEL_USAGE = 97,
    2432                 :            :         WLAN_EID_TIME_ZONE = 98,
    2433                 :            :         WLAN_EID_DMS_REQUEST = 99,
    2434                 :            :         WLAN_EID_DMS_RESPONSE = 100,
    2435                 :            :         WLAN_EID_LINK_ID = 101,
    2436                 :            :         WLAN_EID_WAKEUP_SCHEDUL = 102,
    2437                 :            :         /* 103 reserved */
    2438                 :            :         WLAN_EID_CHAN_SWITCH_TIMING = 104,
    2439                 :            :         WLAN_EID_PTI_CONTROL = 105,
    2440                 :            :         WLAN_EID_PU_BUFFER_STATUS = 106,
    2441                 :            :         WLAN_EID_INTERWORKING = 107,
    2442                 :            :         WLAN_EID_ADVERTISEMENT_PROTOCOL = 108,
    2443                 :            :         WLAN_EID_EXPEDITED_BW_REQ = 109,
    2444                 :            :         WLAN_EID_QOS_MAP_SET = 110,
    2445                 :            :         WLAN_EID_ROAMING_CONSORTIUM = 111,
    2446                 :            :         WLAN_EID_EMERGENCY_ALERT = 112,
    2447                 :            :         WLAN_EID_MESH_CONFIG = 113,
    2448                 :            :         WLAN_EID_MESH_ID = 114,
    2449                 :            :         WLAN_EID_LINK_METRIC_REPORT = 115,
    2450                 :            :         WLAN_EID_CONGESTION_NOTIFICATION = 116,
    2451                 :            :         WLAN_EID_PEER_MGMT = 117,
    2452                 :            :         WLAN_EID_CHAN_SWITCH_PARAM = 118,
    2453                 :            :         WLAN_EID_MESH_AWAKE_WINDOW = 119,
    2454                 :            :         WLAN_EID_BEACON_TIMING = 120,
    2455                 :            :         WLAN_EID_MCCAOP_SETUP_REQ = 121,
    2456                 :            :         WLAN_EID_MCCAOP_SETUP_RESP = 122,
    2457                 :            :         WLAN_EID_MCCAOP_ADVERT = 123,
    2458                 :            :         WLAN_EID_MCCAOP_TEARDOWN = 124,
    2459                 :            :         WLAN_EID_GANN = 125,
    2460                 :            :         WLAN_EID_RANN = 126,
    2461                 :            :         WLAN_EID_EXT_CAPABILITY = 127,
    2462                 :            :         /* 128, 129 reserved for Agere */
    2463                 :            :         WLAN_EID_PREQ = 130,
    2464                 :            :         WLAN_EID_PREP = 131,
    2465                 :            :         WLAN_EID_PERR = 132,
    2466                 :            :         /* 133-136 reserved for Cisco */
    2467                 :            :         WLAN_EID_PXU = 137,
    2468                 :            :         WLAN_EID_PXUC = 138,
    2469                 :            :         WLAN_EID_AUTH_MESH_PEER_EXCH = 139,
    2470                 :            :         WLAN_EID_MIC = 140,
    2471                 :            :         WLAN_EID_DESTINATION_URI = 141,
    2472                 :            :         WLAN_EID_UAPSD_COEX = 142,
    2473                 :            :         WLAN_EID_WAKEUP_SCHEDULE = 143,
    2474                 :            :         WLAN_EID_EXT_SCHEDULE = 144,
    2475                 :            :         WLAN_EID_STA_AVAILABILITY = 145,
    2476                 :            :         WLAN_EID_DMG_TSPEC = 146,
    2477                 :            :         WLAN_EID_DMG_AT = 147,
    2478                 :            :         WLAN_EID_DMG_CAP = 148,
    2479                 :            :         /* 149 reserved for Cisco */
    2480                 :            :         WLAN_EID_CISCO_VENDOR_SPECIFIC = 150,
    2481                 :            :         WLAN_EID_DMG_OPERATION = 151,
    2482                 :            :         WLAN_EID_DMG_BSS_PARAM_CHANGE = 152,
    2483                 :            :         WLAN_EID_DMG_BEAM_REFINEMENT = 153,
    2484                 :            :         WLAN_EID_CHANNEL_MEASURE_FEEDBACK = 154,
    2485                 :            :         /* 155-156 reserved for Cisco */
    2486                 :            :         WLAN_EID_AWAKE_WINDOW = 157,
    2487                 :            :         WLAN_EID_MULTI_BAND = 158,
    2488                 :            :         WLAN_EID_ADDBA_EXT = 159,
    2489                 :            :         WLAN_EID_NEXT_PCP_LIST = 160,
    2490                 :            :         WLAN_EID_PCP_HANDOVER = 161,
    2491                 :            :         WLAN_EID_DMG_LINK_MARGIN = 162,
    2492                 :            :         WLAN_EID_SWITCHING_STREAM = 163,
    2493                 :            :         WLAN_EID_SESSION_TRANSITION = 164,
    2494                 :            :         WLAN_EID_DYN_TONE_PAIRING_REPORT = 165,
    2495                 :            :         WLAN_EID_CLUSTER_REPORT = 166,
    2496                 :            :         WLAN_EID_RELAY_CAP = 167,
    2497                 :            :         WLAN_EID_RELAY_XFER_PARAM_SET = 168,
    2498                 :            :         WLAN_EID_BEAM_LINK_MAINT = 169,
    2499                 :            :         WLAN_EID_MULTIPLE_MAC_ADDR = 170,
    2500                 :            :         WLAN_EID_U_PID = 171,
    2501                 :            :         WLAN_EID_DMG_LINK_ADAPT_ACK = 172,
    2502                 :            :         /* 173 reserved for Symbol */
    2503                 :            :         WLAN_EID_MCCAOP_ADV_OVERVIEW = 174,
    2504                 :            :         WLAN_EID_QUIET_PERIOD_REQ = 175,
    2505                 :            :         /* 176 reserved for Symbol */
    2506                 :            :         WLAN_EID_QUIET_PERIOD_RESP = 177,
    2507                 :            :         /* 178-179 reserved for Symbol */
    2508                 :            :         /* 180 reserved for ISO/IEC 20011 */
    2509                 :            :         WLAN_EID_EPAC_POLICY = 182,
    2510                 :            :         WLAN_EID_CLISTER_TIME_OFF = 183,
    2511                 :            :         WLAN_EID_INTER_AC_PRIO = 184,
    2512                 :            :         WLAN_EID_SCS_DESCRIPTOR = 185,
    2513                 :            :         WLAN_EID_QLOAD_REPORT = 186,
    2514                 :            :         WLAN_EID_HCCA_TXOP_UPDATE_COUNT = 187,
    2515                 :            :         WLAN_EID_HL_STREAM_ID = 188,
    2516                 :            :         WLAN_EID_GCR_GROUP_ADDR = 189,
    2517                 :            :         WLAN_EID_ANTENNA_SECTOR_ID_PATTERN = 190,
    2518                 :            :         WLAN_EID_VHT_CAPABILITY = 191,
    2519                 :            :         WLAN_EID_VHT_OPERATION = 192,
    2520                 :            :         WLAN_EID_EXTENDED_BSS_LOAD = 193,
    2521                 :            :         WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194,
    2522                 :            :         WLAN_EID_VHT_TX_POWER_ENVELOPE = 195,
    2523                 :            :         WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196,
    2524                 :            :         WLAN_EID_AID = 197,
    2525                 :            :         WLAN_EID_QUIET_CHANNEL = 198,
    2526                 :            :         WLAN_EID_OPMODE_NOTIF = 199,
    2527                 :            : 
    2528                 :            :         WLAN_EID_VENDOR_SPECIFIC = 221,
    2529                 :            :         WLAN_EID_QOS_PARAMETER = 222,
    2530                 :            :         WLAN_EID_CAG_NUMBER = 237,
    2531                 :            :         WLAN_EID_AP_CSN = 239,
    2532                 :            :         WLAN_EID_FILS_INDICATION = 240,
    2533                 :            :         WLAN_EID_DILS = 241,
    2534                 :            :         WLAN_EID_FRAGMENT = 242,
    2535                 :            :         WLAN_EID_EXTENSION = 255
    2536                 :            : };
    2537                 :            : 
    2538                 :            : /* Element ID Extensions for Element ID 255 */
    2539                 :            : enum ieee80211_eid_ext {
    2540                 :            :         WLAN_EID_EXT_ASSOC_DELAY_INFO = 1,
    2541                 :            :         WLAN_EID_EXT_FILS_REQ_PARAMS = 2,
    2542                 :            :         WLAN_EID_EXT_FILS_KEY_CONFIRM = 3,
    2543                 :            :         WLAN_EID_EXT_FILS_SESSION = 4,
    2544                 :            :         WLAN_EID_EXT_FILS_HLP_CONTAINER = 5,
    2545                 :            :         WLAN_EID_EXT_FILS_IP_ADDR_ASSIGN = 6,
    2546                 :            :         WLAN_EID_EXT_KEY_DELIVERY = 7,
    2547                 :            :         WLAN_EID_EXT_FILS_WRAPPED_DATA = 8,
    2548                 :            :         WLAN_EID_EXT_FILS_PUBLIC_KEY = 12,
    2549                 :            :         WLAN_EID_EXT_FILS_NONCE = 13,
    2550                 :            :         WLAN_EID_EXT_FUTURE_CHAN_GUIDANCE = 14,
    2551                 :            :         WLAN_EID_EXT_HE_CAPABILITY = 35,
    2552                 :            :         WLAN_EID_EXT_HE_OPERATION = 36,
    2553                 :            :         WLAN_EID_EXT_UORA = 37,
    2554                 :            :         WLAN_EID_EXT_HE_MU_EDCA = 38,
    2555                 :            :         WLAN_EID_EXT_HE_SPR = 39,
    2556                 :            :         WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME = 52,
    2557                 :            :         WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55,
    2558                 :            :         WLAN_EID_EXT_NON_INHERITANCE = 56,
    2559                 :            : };
    2560                 :            : 
    2561                 :            : /* Action category code */
    2562                 :            : enum ieee80211_category {
    2563                 :            :         WLAN_CATEGORY_SPECTRUM_MGMT = 0,
    2564                 :            :         WLAN_CATEGORY_QOS = 1,
    2565                 :            :         WLAN_CATEGORY_DLS = 2,
    2566                 :            :         WLAN_CATEGORY_BACK = 3,
    2567                 :            :         WLAN_CATEGORY_PUBLIC = 4,
    2568                 :            :         WLAN_CATEGORY_RADIO_MEASUREMENT = 5,
    2569                 :            :         WLAN_CATEGORY_HT = 7,
    2570                 :            :         WLAN_CATEGORY_SA_QUERY = 8,
    2571                 :            :         WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9,
    2572                 :            :         WLAN_CATEGORY_WNM = 10,
    2573                 :            :         WLAN_CATEGORY_WNM_UNPROTECTED = 11,
    2574                 :            :         WLAN_CATEGORY_TDLS = 12,
    2575                 :            :         WLAN_CATEGORY_MESH_ACTION = 13,
    2576                 :            :         WLAN_CATEGORY_MULTIHOP_ACTION = 14,
    2577                 :            :         WLAN_CATEGORY_SELF_PROTECTED = 15,
    2578                 :            :         WLAN_CATEGORY_DMG = 16,
    2579                 :            :         WLAN_CATEGORY_WMM = 17,
    2580                 :            :         WLAN_CATEGORY_FST = 18,
    2581                 :            :         WLAN_CATEGORY_UNPROT_DMG = 20,
    2582                 :            :         WLAN_CATEGORY_VHT = 21,
    2583                 :            :         WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
    2584                 :            :         WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
    2585                 :            : };
    2586                 :            : 
    2587                 :            : /* SPECTRUM_MGMT action code */
    2588                 :            : enum ieee80211_spectrum_mgmt_actioncode {
    2589                 :            :         WLAN_ACTION_SPCT_MSR_REQ = 0,
    2590                 :            :         WLAN_ACTION_SPCT_MSR_RPRT = 1,
    2591                 :            :         WLAN_ACTION_SPCT_TPC_REQ = 2,
    2592                 :            :         WLAN_ACTION_SPCT_TPC_RPRT = 3,
    2593                 :            :         WLAN_ACTION_SPCT_CHL_SWITCH = 4,
    2594                 :            : };
    2595                 :            : 
    2596                 :            : /* HT action codes */
    2597                 :            : enum ieee80211_ht_actioncode {
    2598                 :            :         WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0,
    2599                 :            :         WLAN_HT_ACTION_SMPS = 1,
    2600                 :            :         WLAN_HT_ACTION_PSMP = 2,
    2601                 :            :         WLAN_HT_ACTION_PCO_PHASE = 3,
    2602                 :            :         WLAN_HT_ACTION_CSI = 4,
    2603                 :            :         WLAN_HT_ACTION_NONCOMPRESSED_BF = 5,
    2604                 :            :         WLAN_HT_ACTION_COMPRESSED_BF = 6,
    2605                 :            :         WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,
    2606                 :            : };
    2607                 :            : 
    2608                 :            : /* VHT action codes */
    2609                 :            : enum ieee80211_vht_actioncode {
    2610                 :            :         WLAN_VHT_ACTION_COMPRESSED_BF = 0,
    2611                 :            :         WLAN_VHT_ACTION_GROUPID_MGMT = 1,
    2612                 :            :         WLAN_VHT_ACTION_OPMODE_NOTIF = 2,
    2613                 :            : };
    2614                 :            : 
    2615                 :            : /* Self Protected Action codes */
    2616                 :            : enum ieee80211_self_protected_actioncode {
    2617                 :            :         WLAN_SP_RESERVED = 0,
    2618                 :            :         WLAN_SP_MESH_PEERING_OPEN = 1,
    2619                 :            :         WLAN_SP_MESH_PEERING_CONFIRM = 2,
    2620                 :            :         WLAN_SP_MESH_PEERING_CLOSE = 3,
    2621                 :            :         WLAN_SP_MGK_INFORM = 4,
    2622                 :            :         WLAN_SP_MGK_ACK = 5,
    2623                 :            : };
    2624                 :            : 
    2625                 :            : /* Mesh action codes */
    2626                 :            : enum ieee80211_mesh_actioncode {
    2627                 :            :         WLAN_MESH_ACTION_LINK_METRIC_REPORT,
    2628                 :            :         WLAN_MESH_ACTION_HWMP_PATH_SELECTION,
    2629                 :            :         WLAN_MESH_ACTION_GATE_ANNOUNCEMENT,
    2630                 :            :         WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION,
    2631                 :            :         WLAN_MESH_ACTION_MCCA_SETUP_REQUEST,
    2632                 :            :         WLAN_MESH_ACTION_MCCA_SETUP_REPLY,
    2633                 :            :         WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST,
    2634                 :            :         WLAN_MESH_ACTION_MCCA_ADVERTISEMENT,
    2635                 :            :         WLAN_MESH_ACTION_MCCA_TEARDOWN,
    2636                 :            :         WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST,
    2637                 :            :         WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE,
    2638                 :            : };
    2639                 :            : 
    2640                 :            : /* Security key length */
    2641                 :            : enum ieee80211_key_len {
    2642                 :            :         WLAN_KEY_LEN_WEP40 = 5,
    2643                 :            :         WLAN_KEY_LEN_WEP104 = 13,
    2644                 :            :         WLAN_KEY_LEN_CCMP = 16,
    2645                 :            :         WLAN_KEY_LEN_CCMP_256 = 32,
    2646                 :            :         WLAN_KEY_LEN_TKIP = 32,
    2647                 :            :         WLAN_KEY_LEN_AES_CMAC = 16,
    2648                 :            :         WLAN_KEY_LEN_SMS4 = 32,
    2649                 :            :         WLAN_KEY_LEN_GCMP = 16,
    2650                 :            :         WLAN_KEY_LEN_GCMP_256 = 32,
    2651                 :            :         WLAN_KEY_LEN_BIP_CMAC_256 = 32,
    2652                 :            :         WLAN_KEY_LEN_BIP_GMAC_128 = 16,
    2653                 :            :         WLAN_KEY_LEN_BIP_GMAC_256 = 32,
    2654                 :            : };
    2655                 :            : 
    2656                 :            : #define IEEE80211_WEP_IV_LEN            4
    2657                 :            : #define IEEE80211_WEP_ICV_LEN           4
    2658                 :            : #define IEEE80211_CCMP_HDR_LEN          8
    2659                 :            : #define IEEE80211_CCMP_MIC_LEN          8
    2660                 :            : #define IEEE80211_CCMP_PN_LEN           6
    2661                 :            : #define IEEE80211_CCMP_256_HDR_LEN      8
    2662                 :            : #define IEEE80211_CCMP_256_MIC_LEN      16
    2663                 :            : #define IEEE80211_CCMP_256_PN_LEN       6
    2664                 :            : #define IEEE80211_TKIP_IV_LEN           8
    2665                 :            : #define IEEE80211_TKIP_ICV_LEN          4
    2666                 :            : #define IEEE80211_CMAC_PN_LEN           6
    2667                 :            : #define IEEE80211_GMAC_PN_LEN           6
    2668                 :            : #define IEEE80211_GCMP_HDR_LEN          8
    2669                 :            : #define IEEE80211_GCMP_MIC_LEN          16
    2670                 :            : #define IEEE80211_GCMP_PN_LEN           6
    2671                 :            : 
    2672                 :            : #define FILS_NONCE_LEN                  16
    2673                 :            : #define FILS_MAX_KEK_LEN                64
    2674                 :            : 
    2675                 :            : #define FILS_ERP_MAX_USERNAME_LEN       16
    2676                 :            : #define FILS_ERP_MAX_REALM_LEN          253
    2677                 :            : #define FILS_ERP_MAX_RRK_LEN            64
    2678                 :            : 
    2679                 :            : #define PMK_MAX_LEN                     64
    2680                 :            : #define SAE_PASSWORD_MAX_LEN            128
    2681                 :            : 
    2682                 :            : /* Public action codes (IEEE Std 802.11-2016, 9.6.8.1, Table 9-307) */
    2683                 :            : enum ieee80211_pub_actioncode {
    2684                 :            :         WLAN_PUB_ACTION_20_40_BSS_COEX = 0,
    2685                 :            :         WLAN_PUB_ACTION_DSE_ENABLEMENT = 1,
    2686                 :            :         WLAN_PUB_ACTION_DSE_DEENABLEMENT = 2,
    2687                 :            :         WLAN_PUB_ACTION_DSE_REG_LOC_ANN = 3,
    2688                 :            :         WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,
    2689                 :            :         WLAN_PUB_ACTION_DSE_MSMT_REQ = 5,
    2690                 :            :         WLAN_PUB_ACTION_DSE_MSMT_RESP = 6,
    2691                 :            :         WLAN_PUB_ACTION_MSMT_PILOT = 7,
    2692                 :            :         WLAN_PUB_ACTION_DSE_PC = 8,
    2693                 :            :         WLAN_PUB_ACTION_VENDOR_SPECIFIC = 9,
    2694                 :            :         WLAN_PUB_ACTION_GAS_INITIAL_REQ = 10,
    2695                 :            :         WLAN_PUB_ACTION_GAS_INITIAL_RESP = 11,
    2696                 :            :         WLAN_PUB_ACTION_GAS_COMEBACK_REQ = 12,
    2697                 :            :         WLAN_PUB_ACTION_GAS_COMEBACK_RESP = 13,
    2698                 :            :         WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
    2699                 :            :         WLAN_PUB_ACTION_LOC_TRACK_NOTI = 15,
    2700                 :            :         WLAN_PUB_ACTION_QAB_REQUEST_FRAME = 16,
    2701                 :            :         WLAN_PUB_ACTION_QAB_RESPONSE_FRAME = 17,
    2702                 :            :         WLAN_PUB_ACTION_QMF_POLICY = 18,
    2703                 :            :         WLAN_PUB_ACTION_QMF_POLICY_CHANGE = 19,
    2704                 :            :         WLAN_PUB_ACTION_QLOAD_REQUEST = 20,
    2705                 :            :         WLAN_PUB_ACTION_QLOAD_REPORT = 21,
    2706                 :            :         WLAN_PUB_ACTION_HCCA_TXOP_ADVERT = 22,
    2707                 :            :         WLAN_PUB_ACTION_HCCA_TXOP_RESPONSE = 23,
    2708                 :            :         WLAN_PUB_ACTION_PUBLIC_KEY = 24,
    2709                 :            :         WLAN_PUB_ACTION_CHANNEL_AVAIL_QUERY = 25,
    2710                 :            :         WLAN_PUB_ACTION_CHANNEL_SCHEDULE_MGMT = 26,
    2711                 :            :         WLAN_PUB_ACTION_CONTACT_VERI_SIGNAL = 27,
    2712                 :            :         WLAN_PUB_ACTION_GDD_ENABLEMENT_REQ = 28,
    2713                 :            :         WLAN_PUB_ACTION_GDD_ENABLEMENT_RESP = 29,
    2714                 :            :         WLAN_PUB_ACTION_NETWORK_CHANNEL_CONTROL = 30,
    2715                 :            :         WLAN_PUB_ACTION_WHITE_SPACE_MAP_ANN = 31,
    2716                 :            :         WLAN_PUB_ACTION_FTM_REQUEST = 32,
    2717                 :            :         WLAN_PUB_ACTION_FTM = 33,
    2718                 :            :         WLAN_PUB_ACTION_FILS_DISCOVERY = 34,
    2719                 :            : };
    2720                 :            : 
    2721                 :            : /* TDLS action codes */
    2722                 :            : enum ieee80211_tdls_actioncode {
    2723                 :            :         WLAN_TDLS_SETUP_REQUEST = 0,
    2724                 :            :         WLAN_TDLS_SETUP_RESPONSE = 1,
    2725                 :            :         WLAN_TDLS_SETUP_CONFIRM = 2,
    2726                 :            :         WLAN_TDLS_TEARDOWN = 3,
    2727                 :            :         WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4,
    2728                 :            :         WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5,
    2729                 :            :         WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6,
    2730                 :            :         WLAN_TDLS_PEER_PSM_REQUEST = 7,
    2731                 :            :         WLAN_TDLS_PEER_PSM_RESPONSE = 8,
    2732                 :            :         WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9,
    2733                 :            :         WLAN_TDLS_DISCOVERY_REQUEST = 10,
    2734                 :            : };
    2735                 :            : 
    2736                 :            : /* Extended Channel Switching capability to be set in the 1st byte of
    2737                 :            :  * the @WLAN_EID_EXT_CAPABILITY information element
    2738                 :            :  */
    2739                 :            : #define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING    BIT(2)
    2740                 :            : 
    2741                 :            : /* Multiple BSSID capability is set in the 6th bit of 3rd byte of the
    2742                 :            :  * @WLAN_EID_EXT_CAPABILITY information element
    2743                 :            :  */
    2744                 :            : #define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT      BIT(6)
    2745                 :            : 
    2746                 :            : /* TDLS capabilities in the the 4th byte of @WLAN_EID_EXT_CAPABILITY */
    2747                 :            : #define WLAN_EXT_CAPA4_TDLS_BUFFER_STA          BIT(4)
    2748                 :            : #define WLAN_EXT_CAPA4_TDLS_PEER_PSM            BIT(5)
    2749                 :            : #define WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH         BIT(6)
    2750                 :            : 
    2751                 :            : /* Interworking capabilities are set in 7th bit of 4th byte of the
    2752                 :            :  * @WLAN_EID_EXT_CAPABILITY information element
    2753                 :            :  */
    2754                 :            : #define WLAN_EXT_CAPA4_INTERWORKING_ENABLED     BIT(7)
    2755                 :            : 
    2756                 :            : /*
    2757                 :            :  * TDLS capabililites to be enabled in the 5th byte of the
    2758                 :            :  * @WLAN_EID_EXT_CAPABILITY information element
    2759                 :            :  */
    2760                 :            : #define WLAN_EXT_CAPA5_TDLS_ENABLED     BIT(5)
    2761                 :            : #define WLAN_EXT_CAPA5_TDLS_PROHIBITED  BIT(6)
    2762                 :            : #define WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED    BIT(7)
    2763                 :            : 
    2764                 :            : #define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED     BIT(5)
    2765                 :            : #define WLAN_EXT_CAPA8_OPMODE_NOTIF     BIT(6)
    2766                 :            : 
    2767                 :            : /* Defines the maximal number of MSDUs in an A-MSDU. */
    2768                 :            : #define WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB    BIT(7)
    2769                 :            : #define WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB    BIT(0)
    2770                 :            : 
    2771                 :            : /*
    2772                 :            :  * Fine Timing Measurement Initiator - bit 71 of @WLAN_EID_EXT_CAPABILITY
    2773                 :            :  * information element
    2774                 :            :  */
    2775                 :            : #define WLAN_EXT_CAPA9_FTM_INITIATOR    BIT(7)
    2776                 :            : 
    2777                 :            : /* Defines support for TWT Requester and TWT Responder */
    2778                 :            : #define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT   BIT(5)
    2779                 :            : #define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT   BIT(6)
    2780                 :            : 
    2781                 :            : /*
    2782                 :            :  * When set, indicates that the AP is able to tolerate 26-tone RU UL
    2783                 :            :  * OFDMA transmissions using HE TB PPDU from OBSS (not falsely classify the
    2784                 :            :  * 26-tone RU UL OFDMA transmissions as radar pulses).
    2785                 :            :  */
    2786                 :            : #define WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT BIT(7)
    2787                 :            : 
    2788                 :            : /* Defines support for enhanced multi-bssid advertisement*/
    2789                 :            : #define WLAN_EXT_CAPA11_EMA_SUPPORT     BIT(1)
    2790                 :            : 
    2791                 :            : /* TDLS specific payload type in the LLC/SNAP header */
    2792                 :            : #define WLAN_TDLS_SNAP_RFTYPE   0x2
    2793                 :            : 
    2794                 :            : /* BSS Coex IE information field bits */
    2795                 :            : #define WLAN_BSS_COEX_INFORMATION_REQUEST       BIT(0)
    2796                 :            : 
    2797                 :            : /**
    2798                 :            :  * enum ieee80211_mesh_sync_method - mesh synchronization method identifier
    2799                 :            :  *
    2800                 :            :  * @IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET: the default synchronization method
    2801                 :            :  * @IEEE80211_SYNC_METHOD_VENDOR: a vendor specific synchronization method
    2802                 :            :  *      that will be specified in a vendor specific information element
    2803                 :            :  */
    2804                 :            : enum ieee80211_mesh_sync_method {
    2805                 :            :         IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET = 1,
    2806                 :            :         IEEE80211_SYNC_METHOD_VENDOR = 255,
    2807                 :            : };
    2808                 :            : 
    2809                 :            : /**
    2810                 :            :  * enum ieee80211_mesh_path_protocol - mesh path selection protocol identifier
    2811                 :            :  *
    2812                 :            :  * @IEEE80211_PATH_PROTOCOL_HWMP: the default path selection protocol
    2813                 :            :  * @IEEE80211_PATH_PROTOCOL_VENDOR: a vendor specific protocol that will
    2814                 :            :  *      be specified in a vendor specific information element
    2815                 :            :  */
    2816                 :            : enum ieee80211_mesh_path_protocol {
    2817                 :            :         IEEE80211_PATH_PROTOCOL_HWMP = 1,
    2818                 :            :         IEEE80211_PATH_PROTOCOL_VENDOR = 255,
    2819                 :            : };
    2820                 :            : 
    2821                 :            : /**
    2822                 :            :  * enum ieee80211_mesh_path_metric - mesh path selection metric identifier
    2823                 :            :  *
    2824                 :            :  * @IEEE80211_PATH_METRIC_AIRTIME: the default path selection metric
    2825                 :            :  * @IEEE80211_PATH_METRIC_VENDOR: a vendor specific metric that will be
    2826                 :            :  *      specified in a vendor specific information element
    2827                 :            :  */
    2828                 :            : enum ieee80211_mesh_path_metric {
    2829                 :            :         IEEE80211_PATH_METRIC_AIRTIME = 1,
    2830                 :            :         IEEE80211_PATH_METRIC_VENDOR = 255,
    2831                 :            : };
    2832                 :            : 
    2833                 :            : /**
    2834                 :            :  * enum ieee80211_root_mode_identifier - root mesh STA mode identifier
    2835                 :            :  *
    2836                 :            :  * These attribute are used by dot11MeshHWMPRootMode to set root mesh STA mode
    2837                 :            :  *
    2838                 :            :  * @IEEE80211_ROOTMODE_NO_ROOT: the mesh STA is not a root mesh STA (default)
    2839                 :            :  * @IEEE80211_ROOTMODE_ROOT: the mesh STA is a root mesh STA if greater than
    2840                 :            :  *      this value
    2841                 :            :  * @IEEE80211_PROACTIVE_PREQ_NO_PREP: the mesh STA is a root mesh STA supports
    2842                 :            :  *      the proactive PREQ with proactive PREP subfield set to 0
    2843                 :            :  * @IEEE80211_PROACTIVE_PREQ_WITH_PREP: the mesh STA is a root mesh STA
    2844                 :            :  *      supports the proactive PREQ with proactive PREP subfield set to 1
    2845                 :            :  * @IEEE80211_PROACTIVE_RANN: the mesh STA is a root mesh STA supports
    2846                 :            :  *      the proactive RANN
    2847                 :            :  */
    2848                 :            : enum ieee80211_root_mode_identifier {
    2849                 :            :         IEEE80211_ROOTMODE_NO_ROOT = 0,
    2850                 :            :         IEEE80211_ROOTMODE_ROOT = 1,
    2851                 :            :         IEEE80211_PROACTIVE_PREQ_NO_PREP = 2,
    2852                 :            :         IEEE80211_PROACTIVE_PREQ_WITH_PREP = 3,
    2853                 :            :         IEEE80211_PROACTIVE_RANN = 4,
    2854                 :            : };
    2855                 :            : 
    2856                 :            : /*
    2857                 :            :  * IEEE 802.11-2007 7.3.2.9 Country information element
    2858                 :            :  *
    2859                 :            :  * Minimum length is 8 octets, ie len must be evenly
    2860                 :            :  * divisible by 2
    2861                 :            :  */
    2862                 :            : 
    2863                 :            : /* Although the spec says 8 I'm seeing 6 in practice */
    2864                 :            : #define IEEE80211_COUNTRY_IE_MIN_LEN    6
    2865                 :            : 
    2866                 :            : /* The Country String field of the element shall be 3 octets in length */
    2867                 :            : #define IEEE80211_COUNTRY_STRING_LEN    3
    2868                 :            : 
    2869                 :            : /*
    2870                 :            :  * For regulatory extension stuff see IEEE 802.11-2007
    2871                 :            :  * Annex I (page 1141) and Annex J (page 1147). Also
    2872                 :            :  * review 7.3.2.9.
    2873                 :            :  *
    2874                 :            :  * When dot11RegulatoryClassesRequired is true and the
    2875                 :            :  * first_channel/reg_extension_id is >= 201 then the IE
    2876                 :            :  * compromises of the 'ext' struct represented below:
    2877                 :            :  *
    2878                 :            :  *  - Regulatory extension ID - when generating IE this just needs
    2879                 :            :  *    to be monotonically increasing for each triplet passed in
    2880                 :            :  *    the IE
    2881                 :            :  *  - Regulatory class - index into set of rules
    2882                 :            :  *  - Coverage class - index into air propagation time (Table 7-27),
    2883                 :            :  *    in microseconds, you can compute the air propagation time from
    2884                 :            :  *    the index by multiplying by 3, so index 10 yields a propagation
    2885                 :            :  *    of 10 us. Valid values are 0-31, values 32-255 are not defined
    2886                 :            :  *    yet. A value of 0 inicates air propagation of <= 1 us.
    2887                 :            :  *
    2888                 :            :  *  See also Table I.2 for Emission limit sets and table
    2889                 :            :  *  I.3 for Behavior limit sets. Table J.1 indicates how to map
    2890                 :            :  *  a reg_class to an emission limit set and behavior limit set.
    2891                 :            :  */
    2892                 :            : #define IEEE80211_COUNTRY_EXTENSION_ID 201
    2893                 :            : 
    2894                 :            : /*
    2895                 :            :  *  Channels numbers in the IE must be monotonically increasing
    2896                 :            :  *  if dot11RegulatoryClassesRequired is not true.
    2897                 :            :  *
    2898                 :            :  *  If dot11RegulatoryClassesRequired is true consecutive
    2899                 :            :  *  subband triplets following a regulatory triplet shall
    2900                 :            :  *  have monotonically increasing first_channel number fields.
    2901                 :            :  *
    2902                 :            :  *  Channel numbers shall not overlap.
    2903                 :            :  *
    2904                 :            :  *  Note that max_power is signed.
    2905                 :            :  */
    2906                 :            : struct ieee80211_country_ie_triplet {
    2907                 :            :         union {
    2908                 :            :                 struct {
    2909                 :            :                         u8 first_channel;
    2910                 :            :                         u8 num_channels;
    2911                 :            :                         s8 max_power;
    2912                 :            :                 } __packed chans;
    2913                 :            :                 struct {
    2914                 :            :                         u8 reg_extension_id;
    2915                 :            :                         u8 reg_class;
    2916                 :            :                         u8 coverage_class;
    2917                 :            :                 } __packed ext;
    2918                 :            :         };
    2919                 :            : } __packed;
    2920                 :            : 
    2921                 :            : enum ieee80211_timeout_interval_type {
    2922                 :            :         WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
    2923                 :            :         WLAN_TIMEOUT_KEY_LIFETIME = 2 /* 802.11r */,
    2924                 :            :         WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,
    2925                 :            : };
    2926                 :            : 
    2927                 :            : /**
    2928                 :            :  * struct ieee80211_timeout_interval_ie - Timeout Interval element
    2929                 :            :  * @type: type, see &enum ieee80211_timeout_interval_type
    2930                 :            :  * @value: timeout interval value
    2931                 :            :  */
    2932                 :            : struct ieee80211_timeout_interval_ie {
    2933                 :            :         u8 type;
    2934                 :            :         __le32 value;
    2935                 :            : } __packed;
    2936                 :            : 
    2937                 :            : /**
    2938                 :            :  * enum ieee80211_idle_options - BSS idle options
    2939                 :            :  * @WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE: the station should send an RSN
    2940                 :            :  *      protected frame to the AP to reset the idle timer at the AP for
    2941                 :            :  *      the station.
    2942                 :            :  */
    2943                 :            : enum ieee80211_idle_options {
    2944                 :            :         WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE = BIT(0),
    2945                 :            : };
    2946                 :            : 
    2947                 :            : /**
    2948                 :            :  * struct ieee80211_bss_max_idle_period_ie
    2949                 :            :  *
    2950                 :            :  * This structure refers to "BSS Max idle period element"
    2951                 :            :  *
    2952                 :            :  * @max_idle_period: indicates the time period during which a station can
    2953                 :            :  *      refrain from transmitting frames to its associated AP without being
    2954                 :            :  *      disassociated. In units of 1000 TUs.
    2955                 :            :  * @idle_options: indicates the options associated with the BSS idle capability
    2956                 :            :  *      as specified in &enum ieee80211_idle_options.
    2957                 :            :  */
    2958                 :            : struct ieee80211_bss_max_idle_period_ie {
    2959                 :            :         __le16 max_idle_period;
    2960                 :            :         u8 idle_options;
    2961                 :            : } __packed;
    2962                 :            : 
    2963                 :            : /* BACK action code */
    2964                 :            : enum ieee80211_back_actioncode {
    2965                 :            :         WLAN_ACTION_ADDBA_REQ = 0,
    2966                 :            :         WLAN_ACTION_ADDBA_RESP = 1,
    2967                 :            :         WLAN_ACTION_DELBA = 2,
    2968                 :            : };
    2969                 :            : 
    2970                 :            : /* BACK (block-ack) parties */
    2971                 :            : enum ieee80211_back_parties {
    2972                 :            :         WLAN_BACK_RECIPIENT = 0,
    2973                 :            :         WLAN_BACK_INITIATOR = 1,
    2974                 :            : };
    2975                 :            : 
    2976                 :            : /* SA Query action */
    2977                 :            : enum ieee80211_sa_query_action {
    2978                 :            :         WLAN_ACTION_SA_QUERY_REQUEST = 0,
    2979                 :            :         WLAN_ACTION_SA_QUERY_RESPONSE = 1,
    2980                 :            : };
    2981                 :            : 
    2982                 :            : /**
    2983                 :            :  * struct ieee80211_bssid_index
    2984                 :            :  *
    2985                 :            :  * This structure refers to "Multiple BSSID-index element"
    2986                 :            :  *
    2987                 :            :  * @bssid_index: BSSID index
    2988                 :            :  * @dtim_period: optional, overrides transmitted BSS dtim period
    2989                 :            :  * @dtim_count: optional, overrides transmitted BSS dtim count
    2990                 :            :  */
    2991                 :            : struct ieee80211_bssid_index {
    2992                 :            :         u8 bssid_index;
    2993                 :            :         u8 dtim_period;
    2994                 :            :         u8 dtim_count;
    2995                 :            : };
    2996                 :            : 
    2997                 :            : /**
    2998                 :            :  * struct ieee80211_multiple_bssid_configuration
    2999                 :            :  *
    3000                 :            :  * This structure refers to "Multiple BSSID Configuration element"
    3001                 :            :  *
    3002                 :            :  * @bssid_count: total number of active BSSIDs in the set
    3003                 :            :  * @profile_periodicity: the least number of beacon frames need to be received
    3004                 :            :  *      in order to discover all the nontransmitted BSSIDs in the set.
    3005                 :            :  */
    3006                 :            : struct ieee80211_multiple_bssid_configuration {
    3007                 :            :         u8 bssid_count;
    3008                 :            :         u8 profile_periodicity;
    3009                 :            : };
    3010                 :            : 
    3011                 :            : #define SUITE(oui, id)  (((oui) << 8) | (id))
    3012                 :            : 
    3013                 :            : /* cipher suite selectors */
    3014                 :            : #define WLAN_CIPHER_SUITE_USE_GROUP     SUITE(0x000FAC, 0)
    3015                 :            : #define WLAN_CIPHER_SUITE_WEP40         SUITE(0x000FAC, 1)
    3016                 :            : #define WLAN_CIPHER_SUITE_TKIP          SUITE(0x000FAC, 2)
    3017                 :            : /* reserved:                            SUITE(0x000FAC, 3) */
    3018                 :            : #define WLAN_CIPHER_SUITE_CCMP          SUITE(0x000FAC, 4)
    3019                 :            : #define WLAN_CIPHER_SUITE_WEP104        SUITE(0x000FAC, 5)
    3020                 :            : #define WLAN_CIPHER_SUITE_AES_CMAC      SUITE(0x000FAC, 6)
    3021                 :            : #define WLAN_CIPHER_SUITE_GCMP          SUITE(0x000FAC, 8)
    3022                 :            : #define WLAN_CIPHER_SUITE_GCMP_256      SUITE(0x000FAC, 9)
    3023                 :            : #define WLAN_CIPHER_SUITE_CCMP_256      SUITE(0x000FAC, 10)
    3024                 :            : #define WLAN_CIPHER_SUITE_BIP_GMAC_128  SUITE(0x000FAC, 11)
    3025                 :            : #define WLAN_CIPHER_SUITE_BIP_GMAC_256  SUITE(0x000FAC, 12)
    3026                 :            : #define WLAN_CIPHER_SUITE_BIP_CMAC_256  SUITE(0x000FAC, 13)
    3027                 :            : 
    3028                 :            : #define WLAN_CIPHER_SUITE_SMS4          SUITE(0x001472, 1)
    3029                 :            : 
    3030                 :            : /* AKM suite selectors */
    3031                 :            : #define WLAN_AKM_SUITE_8021X                    SUITE(0x000FAC, 1)
    3032                 :            : #define WLAN_AKM_SUITE_PSK                      SUITE(0x000FAC, 2)
    3033                 :            : #define WLAN_AKM_SUITE_FT_8021X                 SUITE(0x000FAC, 3)
    3034                 :            : #define WLAN_AKM_SUITE_FT_PSK                   SUITE(0x000FAC, 4)
    3035                 :            : #define WLAN_AKM_SUITE_8021X_SHA256             SUITE(0x000FAC, 5)
    3036                 :            : #define WLAN_AKM_SUITE_PSK_SHA256               SUITE(0x000FAC, 6)
    3037                 :            : #define WLAN_AKM_SUITE_TDLS                     SUITE(0x000FAC, 7)
    3038                 :            : #define WLAN_AKM_SUITE_SAE                      SUITE(0x000FAC, 8)
    3039                 :            : #define WLAN_AKM_SUITE_FT_OVER_SAE              SUITE(0x000FAC, 9)
    3040                 :            : #define WLAN_AKM_SUITE_8021X_SUITE_B            SUITE(0x000FAC, 11)
    3041                 :            : #define WLAN_AKM_SUITE_8021X_SUITE_B_192        SUITE(0x000FAC, 12)
    3042                 :            : #define WLAN_AKM_SUITE_FILS_SHA256              SUITE(0x000FAC, 14)
    3043                 :            : #define WLAN_AKM_SUITE_FILS_SHA384              SUITE(0x000FAC, 15)
    3044                 :            : #define WLAN_AKM_SUITE_FT_FILS_SHA256           SUITE(0x000FAC, 16)
    3045                 :            : #define WLAN_AKM_SUITE_FT_FILS_SHA384           SUITE(0x000FAC, 17)
    3046                 :            : 
    3047                 :            : #define WLAN_MAX_KEY_LEN                32
    3048                 :            : 
    3049                 :            : #define WLAN_PMK_NAME_LEN               16
    3050                 :            : #define WLAN_PMKID_LEN                  16
    3051                 :            : #define WLAN_PMK_LEN_EAP_LEAP           16
    3052                 :            : #define WLAN_PMK_LEN                    32
    3053                 :            : #define WLAN_PMK_LEN_SUITE_B_192        48
    3054                 :            : 
    3055                 :            : #define WLAN_OUI_WFA                    0x506f9a
    3056                 :            : #define WLAN_OUI_TYPE_WFA_P2P           9
    3057                 :            : #define WLAN_OUI_MICROSOFT              0x0050f2
    3058                 :            : #define WLAN_OUI_TYPE_MICROSOFT_WPA     1
    3059                 :            : #define WLAN_OUI_TYPE_MICROSOFT_WMM     2
    3060                 :            : #define WLAN_OUI_TYPE_MICROSOFT_WPS     4
    3061                 :            : #define WLAN_OUI_TYPE_MICROSOFT_TPC     8
    3062                 :            : 
    3063                 :            : /*
    3064                 :            :  * WMM/802.11e Tspec Element
    3065                 :            :  */
    3066                 :            : #define IEEE80211_WMM_IE_TSPEC_TID_MASK         0x0F
    3067                 :            : #define IEEE80211_WMM_IE_TSPEC_TID_SHIFT        1
    3068                 :            : 
    3069                 :            : enum ieee80211_tspec_status_code {
    3070                 :            :         IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED = 0,
    3071                 :            :         IEEE80211_TSPEC_STATUS_ADDTS_INVAL_PARAMS = 0x1,
    3072                 :            : };
    3073                 :            : 
    3074                 :            : struct ieee80211_tspec_ie {
    3075                 :            :         u8 element_id;
    3076                 :            :         u8 len;
    3077                 :            :         u8 oui[3];
    3078                 :            :         u8 oui_type;
    3079                 :            :         u8 oui_subtype;
    3080                 :            :         u8 version;
    3081                 :            :         __le16 tsinfo;
    3082                 :            :         u8 tsinfo_resvd;
    3083                 :            :         __le16 nominal_msdu;
    3084                 :            :         __le16 max_msdu;
    3085                 :            :         __le32 min_service_int;
    3086                 :            :         __le32 max_service_int;
    3087                 :            :         __le32 inactivity_int;
    3088                 :            :         __le32 suspension_int;
    3089                 :            :         __le32 service_start_time;
    3090                 :            :         __le32 min_data_rate;
    3091                 :            :         __le32 mean_data_rate;
    3092                 :            :         __le32 peak_data_rate;
    3093                 :            :         __le32 max_burst_size;
    3094                 :            :         __le32 delay_bound;
    3095                 :            :         __le32 min_phy_rate;
    3096                 :            :         __le16 sba;
    3097                 :            :         __le16 medium_time;
    3098                 :            : } __packed;
    3099                 :            : 
    3100                 :            : /**
    3101                 :            :  * ieee80211_get_qos_ctl - get pointer to qos control bytes
    3102                 :            :  * @hdr: the frame
    3103                 :            :  *
    3104                 :            :  * The qos ctrl bytes come after the frame_control, duration, seq_num
    3105                 :            :  * and 3 or 4 addresses of length ETH_ALEN.
    3106                 :            :  * 3 addr: 2 + 2 + 2 + 3*6 = 24
    3107                 :            :  * 4 addr: 2 + 2 + 2 + 4*6 = 30
    3108                 :            :  */
    3109                 :            : static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
    3110                 :            : {
    3111                 :            :         if (ieee80211_has_a4(hdr->frame_control))
    3112                 :            :                 return (u8 *)hdr + 30;
    3113                 :            :         else
    3114                 :            :                 return (u8 *)hdr + 24;
    3115                 :            : }
    3116                 :            : 
    3117                 :            : /**
    3118                 :            :  * ieee80211_get_tid - get qos TID
    3119                 :            :  * @hdr: the frame
    3120                 :            :  */
    3121                 :            : static inline u8 ieee80211_get_tid(struct ieee80211_hdr *hdr)
    3122                 :            : {
    3123                 :            :         u8 *qc = ieee80211_get_qos_ctl(hdr);
    3124                 :            : 
    3125                 :            :         return qc[0] & IEEE80211_QOS_CTL_TID_MASK;
    3126                 :            : }
    3127                 :            : 
    3128                 :            : /**
    3129                 :            :  * ieee80211_get_SA - get pointer to SA
    3130                 :            :  * @hdr: the frame
    3131                 :            :  *
    3132                 :            :  * Given an 802.11 frame, this function returns the offset
    3133                 :            :  * to the source address (SA). It does not verify that the
    3134                 :            :  * header is long enough to contain the address, and the
    3135                 :            :  * header must be long enough to contain the frame control
    3136                 :            :  * field.
    3137                 :            :  */
    3138                 :            : static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
    3139                 :            : {
    3140         [ #  # ]:          0 :         if (ieee80211_has_a4(hdr->frame_control))
    3141                 :          0 :                 return hdr->addr4;
    3142         [ #  # ]:          0 :         if (ieee80211_has_fromds(hdr->frame_control))
    3143                 :          0 :                 return hdr->addr3;
    3144                 :          0 :         return hdr->addr2;
    3145                 :            : }
    3146                 :            : 
    3147                 :            : /**
    3148                 :            :  * ieee80211_get_DA - get pointer to DA
    3149                 :            :  * @hdr: the frame
    3150                 :            :  *
    3151                 :            :  * Given an 802.11 frame, this function returns the offset
    3152                 :            :  * to the destination address (DA). It does not verify that
    3153                 :            :  * the header is long enough to contain the address, and the
    3154                 :            :  * header must be long enough to contain the frame control
    3155                 :            :  * field.
    3156                 :            :  */
    3157                 :            : static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
    3158                 :            : {
    3159         [ #  # ]:          0 :         if (ieee80211_has_tods(hdr->frame_control))
    3160                 :          0 :                 return hdr->addr3;
    3161                 :            :         else
    3162                 :          0 :                 return hdr->addr1;
    3163                 :            : }
    3164                 :            : 
    3165                 :            : /**
    3166                 :            :  * _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
    3167                 :            :  * @hdr: the frame (buffer must include at least the first octet of payload)
    3168                 :            :  */
    3169                 :            : static inline bool _ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
    3170                 :            : {
    3171                 :            :         if (ieee80211_is_disassoc(hdr->frame_control) ||
    3172                 :            :             ieee80211_is_deauth(hdr->frame_control))
    3173                 :            :                 return true;
    3174                 :            : 
    3175                 :            :         if (ieee80211_is_action(hdr->frame_control)) {
    3176                 :            :                 u8 *category;
    3177                 :            : 
    3178                 :            :                 /*
    3179                 :            :                  * Action frames, excluding Public Action frames, are Robust
    3180                 :            :                  * Management Frames. However, if we are looking at a Protected
    3181                 :            :                  * frame, skip the check since the data may be encrypted and
    3182                 :            :                  * the frame has already been found to be a Robust Management
    3183                 :            :                  * Frame (by the other end).
    3184                 :            :                  */
    3185                 :            :                 if (ieee80211_has_protected(hdr->frame_control))
    3186                 :            :                         return true;
    3187                 :            :                 category = ((u8 *) hdr) + 24;
    3188                 :            :                 return *category != WLAN_CATEGORY_PUBLIC &&
    3189                 :            :                         *category != WLAN_CATEGORY_HT &&
    3190                 :            :                         *category != WLAN_CATEGORY_WNM_UNPROTECTED &&
    3191                 :            :                         *category != WLAN_CATEGORY_SELF_PROTECTED &&
    3192                 :            :                         *category != WLAN_CATEGORY_UNPROT_DMG &&
    3193                 :            :                         *category != WLAN_CATEGORY_VHT &&
    3194                 :            :                         *category != WLAN_CATEGORY_VENDOR_SPECIFIC;
    3195                 :            :         }
    3196                 :            : 
    3197                 :            :         return false;
    3198                 :            : }
    3199                 :            : 
    3200                 :            : /**
    3201                 :            :  * ieee80211_is_robust_mgmt_frame - check if skb contains a robust mgmt frame
    3202                 :            :  * @skb: the skb containing the frame, length will be checked
    3203                 :            :  */
    3204                 :            : static inline bool ieee80211_is_robust_mgmt_frame(struct sk_buff *skb)
    3205                 :            : {
    3206                 :            :         if (skb->len < IEEE80211_MIN_ACTION_SIZE)
    3207                 :            :                 return false;
    3208                 :            :         return _ieee80211_is_robust_mgmt_frame((void *)skb->data);
    3209                 :            : }
    3210                 :            : 
    3211                 :            : /**
    3212                 :            :  * ieee80211_is_public_action - check if frame is a public action frame
    3213                 :            :  * @hdr: the frame
    3214                 :            :  * @len: length of the frame
    3215                 :            :  */
    3216                 :            : static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
    3217                 :            :                                               size_t len)
    3218                 :            : {
    3219                 :            :         struct ieee80211_mgmt *mgmt = (void *)hdr;
    3220                 :            : 
    3221                 :            :         if (len < IEEE80211_MIN_ACTION_SIZE)
    3222                 :            :                 return false;
    3223                 :            :         if (!ieee80211_is_action(hdr->frame_control))
    3224                 :            :                 return false;
    3225                 :            :         return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
    3226                 :            : }
    3227                 :            : 
    3228                 :            : /**
    3229                 :            :  * _ieee80211_is_group_privacy_action - check if frame is a group addressed
    3230                 :            :  * privacy action frame
    3231                 :            :  * @hdr: the frame
    3232                 :            :  */
    3233                 :            : static inline bool _ieee80211_is_group_privacy_action(struct ieee80211_hdr *hdr)
    3234                 :            : {
    3235                 :            :         struct ieee80211_mgmt *mgmt = (void *)hdr;
    3236                 :            : 
    3237                 :            :         if (!ieee80211_is_action(hdr->frame_control) ||
    3238                 :            :             !is_multicast_ether_addr(hdr->addr1))
    3239                 :            :                 return false;
    3240                 :            : 
    3241                 :            :         return mgmt->u.action.category == WLAN_CATEGORY_MESH_ACTION ||
    3242                 :            :                mgmt->u.action.category == WLAN_CATEGORY_MULTIHOP_ACTION;
    3243                 :            : }
    3244                 :            : 
    3245                 :            : /**
    3246                 :            :  * ieee80211_is_group_privacy_action - check if frame is a group addressed
    3247                 :            :  * privacy action frame
    3248                 :            :  * @skb: the skb containing the frame, length will be checked
    3249                 :            :  */
    3250                 :            : static inline bool ieee80211_is_group_privacy_action(struct sk_buff *skb)
    3251                 :            : {
    3252                 :            :         if (skb->len < IEEE80211_MIN_ACTION_SIZE)
    3253                 :            :                 return false;
    3254                 :            :         return _ieee80211_is_group_privacy_action((void *)skb->data);
    3255                 :            : }
    3256                 :            : 
    3257                 :            : /**
    3258                 :            :  * ieee80211_tu_to_usec - convert time units (TU) to microseconds
    3259                 :            :  * @tu: the TUs
    3260                 :            :  */
    3261                 :            : static inline unsigned long ieee80211_tu_to_usec(unsigned long tu)
    3262                 :            : {
    3263                 :            :         return 1024 * tu;
    3264                 :            : }
    3265                 :            : 
    3266                 :            : /**
    3267                 :            :  * ieee80211_check_tim - check if AID bit is set in TIM
    3268                 :            :  * @tim: the TIM IE
    3269                 :            :  * @tim_len: length of the TIM IE
    3270                 :            :  * @aid: the AID to look for
    3271                 :            :  */
    3272                 :            : static inline bool ieee80211_check_tim(const struct ieee80211_tim_ie *tim,
    3273                 :            :                                        u8 tim_len, u16 aid)
    3274                 :            : {
    3275                 :            :         u8 mask;
    3276                 :            :         u8 index, indexn1, indexn2;
    3277                 :            : 
    3278                 :            :         if (unlikely(!tim || tim_len < sizeof(*tim)))
    3279                 :            :                 return false;
    3280                 :            : 
    3281                 :            :         aid &= 0x3fff;
    3282                 :            :         index = aid / 8;
    3283                 :            :         mask  = 1 << (aid & 7);
    3284                 :            : 
    3285                 :            :         indexn1 = tim->bitmap_ctrl & 0xfe;
    3286                 :            :         indexn2 = tim_len + indexn1 - 4;
    3287                 :            : 
    3288                 :            :         if (index < indexn1 || index > indexn2)
    3289                 :            :                 return false;
    3290                 :            : 
    3291                 :            :         index -= indexn1;
    3292                 :            : 
    3293                 :            :         return !!(tim->virtual_map[index] & mask);
    3294                 :            : }
    3295                 :            : 
    3296                 :            : /**
    3297                 :            :  * ieee80211_get_tdls_action - get tdls packet action (or -1, if not tdls packet)
    3298                 :            :  * @skb: the skb containing the frame, length will not be checked
    3299                 :            :  * @hdr_size: the size of the ieee80211_hdr that starts at skb->data
    3300                 :            :  *
    3301                 :            :  * This function assumes the frame is a data frame, and that the network header
    3302                 :            :  * is in the correct place.
    3303                 :            :  */
    3304                 :            : static inline int ieee80211_get_tdls_action(struct sk_buff *skb, u32 hdr_size)
    3305                 :            : {
    3306                 :            :         if (!skb_is_nonlinear(skb) &&
    3307                 :            :             skb->len > (skb_network_offset(skb) + 2)) {
    3308                 :            :                 /* Point to where the indication of TDLS should start */
    3309                 :            :                 const u8 *tdls_data = skb_network_header(skb) - 2;
    3310                 :            : 
    3311                 :            :                 if (get_unaligned_be16(tdls_data) == ETH_P_TDLS &&
    3312                 :            :                     tdls_data[2] == WLAN_TDLS_SNAP_RFTYPE &&
    3313                 :            :                     tdls_data[3] == WLAN_CATEGORY_TDLS)
    3314                 :            :                         return tdls_data[4];
    3315                 :            :         }
    3316                 :            : 
    3317                 :            :         return -1;
    3318                 :            : }
    3319                 :            : 
    3320                 :            : /* convert time units */
    3321                 :            : #define TU_TO_JIFFIES(x)        (usecs_to_jiffies((x) * 1024))
    3322                 :            : #define TU_TO_EXP_TIME(x)       (jiffies + TU_TO_JIFFIES(x))
    3323                 :            : 
    3324                 :            : /**
    3325                 :            :  * ieee80211_action_contains_tpc - checks if the frame contains TPC element
    3326                 :            :  * @skb: the skb containing the frame, length will be checked
    3327                 :            :  *
    3328                 :            :  * This function checks if it's either TPC report action frame or Link
    3329                 :            :  * Measurement report action frame as defined in IEEE Std. 802.11-2012 8.5.2.5
    3330                 :            :  * and 8.5.7.5 accordingly.
    3331                 :            :  */
    3332                 :            : static inline bool ieee80211_action_contains_tpc(struct sk_buff *skb)
    3333                 :            : {
    3334                 :            :         struct ieee80211_mgmt *mgmt = (void *)skb->data;
    3335                 :            : 
    3336                 :            :         if (!ieee80211_is_action(mgmt->frame_control))
    3337                 :            :                 return false;
    3338                 :            : 
    3339                 :            :         if (skb->len < IEEE80211_MIN_ACTION_SIZE +
    3340                 :            :                        sizeof(mgmt->u.action.u.tpc_report))
    3341                 :            :                 return false;
    3342                 :            : 
    3343                 :            :         /*
    3344                 :            :          * TPC report - check that:
    3345                 :            :          * category = 0 (Spectrum Management) or 5 (Radio Measurement)
    3346                 :            :          * spectrum management action = 3 (TPC/Link Measurement report)
    3347                 :            :          * TPC report EID = 35
    3348                 :            :          * TPC report element length = 2
    3349                 :            :          *
    3350                 :            :          * The spectrum management's tpc_report struct is used here both for
    3351                 :            :          * parsing tpc_report and radio measurement's link measurement report
    3352                 :            :          * frame, since the relevant part is identical in both frames.
    3353                 :            :          */
    3354                 :            :         if (mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT &&
    3355                 :            :             mgmt->u.action.category != WLAN_CATEGORY_RADIO_MEASUREMENT)
    3356                 :            :                 return false;
    3357                 :            : 
    3358                 :            :         /* both spectrum mgmt and link measurement have same action code */
    3359                 :            :         if (mgmt->u.action.u.tpc_report.action_code !=
    3360                 :            :             WLAN_ACTION_SPCT_TPC_RPRT)
    3361                 :            :                 return false;
    3362                 :            : 
    3363                 :            :         if (mgmt->u.action.u.tpc_report.tpc_elem_id != WLAN_EID_TPC_REPORT ||
    3364                 :            :             mgmt->u.action.u.tpc_report.tpc_elem_length !=
    3365                 :            :             sizeof(struct ieee80211_tpc_report_ie))
    3366                 :            :                 return false;
    3367                 :            : 
    3368                 :            :         return true;
    3369                 :            : }
    3370                 :            : 
    3371                 :            : struct element {
    3372                 :            :         u8 id;
    3373                 :            :         u8 datalen;
    3374                 :            :         u8 data[];
    3375                 :            : } __packed;
    3376                 :            : 
    3377                 :            : /* element iteration helpers */
    3378                 :            : #define for_each_element(_elem, _data, _datalen)                        \
    3379                 :            :         for (_elem = (const struct element *)(_data);                   \
    3380                 :            :              (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >= \
    3381                 :            :                 (int)sizeof(*_elem) &&                                  \
    3382                 :            :              (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >= \
    3383                 :            :                 (int)sizeof(*_elem) + _elem->datalen;                        \
    3384                 :            :              _elem = (const struct element *)(_elem->data + _elem->datalen))
    3385                 :            : 
    3386                 :            : #define for_each_element_id(element, _id, data, datalen)                \
    3387                 :            :         for_each_element(element, data, datalen)                        \
    3388                 :            :                 if (element->id == (_id))
    3389                 :            : 
    3390                 :            : #define for_each_element_extid(element, extid, _data, _datalen)         \
    3391                 :            :         for_each_element(element, _data, _datalen)                      \
    3392                 :            :                 if (element->id == WLAN_EID_EXTENSION &&             \
    3393                 :            :                     element->datalen > 0 &&                               \
    3394                 :            :                     element->data[0] == (extid))
    3395                 :            : 
    3396                 :            : #define for_each_subelement(sub, element)                               \
    3397                 :            :         for_each_element(sub, (element)->data, (element)->datalen)
    3398                 :            : 
    3399                 :            : #define for_each_subelement_id(sub, id, element)                        \
    3400                 :            :         for_each_element_id(sub, id, (element)->data, (element)->datalen)
    3401                 :            : 
    3402                 :            : #define for_each_subelement_extid(sub, extid, element)                  \
    3403                 :            :         for_each_element_extid(sub, extid, (element)->data, (element)->datalen)
    3404                 :            : 
    3405                 :            : /**
    3406                 :            :  * for_each_element_completed - determine if element parsing consumed all data
    3407                 :            :  * @element: element pointer after for_each_element() or friends
    3408                 :            :  * @data: same data pointer as passed to for_each_element() or friends
    3409                 :            :  * @datalen: same data length as passed to for_each_element() or friends
    3410                 :            :  *
    3411                 :            :  * This function returns %true if all the data was parsed or considered
    3412                 :            :  * while walking the elements. Only use this if your for_each_element()
    3413                 :            :  * loop cannot be broken out of, otherwise it always returns %false.
    3414                 :            :  *
    3415                 :            :  * If some data was malformed, this returns %false since the last parsed
    3416                 :            :  * element will not fill the whole remaining data.
    3417                 :            :  */
    3418                 :            : static inline bool for_each_element_completed(const struct element *element,
    3419                 :            :                                               const void *data, size_t datalen)
    3420                 :            : {
    3421                 :          0 :         return (const u8 *)element == (const u8 *)data + datalen;
    3422                 :            : }
    3423                 :            : 
    3424                 :            : #endif /* LINUX_IEEE80211_H */

Generated by: LCOV version 1.14