You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by GitBox <gi...@apache.org> on 2022/03/16 18:47:03 UTC

[GitHub] [incubator-nuttx] xiaoxiang781216 commented on a change in pull request #5755: wireless/80211: update the 80211 header

xiaoxiang781216 commented on a change in pull request #5755:
URL: https://github.com/apache/incubator-nuttx/pull/5755#discussion_r828314004



##########
File path: include/nuttx/wireless/ieee80211/ieee80211.h
##########
@@ -42,849 +42,4026 @@
  * Pre-processor Definitions
  ****************************************************************************/
 
-#define IEEE80211_ADDR_LEN          6  /* size of 802.11 address */
-
-/* is 802.11 address multicast/broadcast? */
-
-#define IEEE80211_IS_MULTICAST(_a)  (*(_a) & 0x01)
-
-/* htframe */
-
-#define IEEE80211_FC0_VERSION_MASK          0x03
-#define IEEE80211_FC0_VERSION_SHIFT         0
-#define IEEE80211_FC0_VERSION_0             0x00
-#define IEEE80211_FC0_TYPE_MASK             0x0c
-#define IEEE80211_FC0_TYPE_SHIFT            2
-#define IEEE80211_FC0_TYPE_MGT              0x00
-#define IEEE80211_FC0_TYPE_CTL              0x04
-#define IEEE80211_FC0_TYPE_DATA             0x08
-
-#define IEEE80211_FC0_SUBTYPE_MASK          0xf0
-#define IEEE80211_FC0_SUBTYPE_SHIFT         4
-
-/* for TYPE_MGT */
-
-#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ     0x00
-#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP    0x10
-#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ   0x20
-#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP  0x30
-#define IEEE80211_FC0_SUBTYPE_PROBE_REQ     0x40
-#define IEEE80211_FC0_SUBTYPE_PROBE_RESP    0x50
-#define IEEE80211_FC0_SUBTYPE_BEACON        0x80
-#define IEEE80211_FC0_SUBTYPE_ATIM          0x90
-#define IEEE80211_FC0_SUBTYPE_DISASSOC      0xa0
-#define IEEE80211_FC0_SUBTYPE_AUTH          0xb0
-#define IEEE80211_FC0_SUBTYPE_DEAUTH        0xc0
-#define IEEE80211_FC0_SUBTYPE_ACTION        0xd0
-#define IEEE80211_FC0_SUBTYPE_ACTION_NOACK  0xe0  /* 11n */
-
-/* for TYPE_CTL */
-
-#define IEEE80211_FC0_SUBTYPE_WRAPPER       0x70  /* 11n */
-#define IEEE80211_FC0_SUBTYPE_BAR           0x80
-#define IEEE80211_FC0_SUBTYPE_BA            0x90
-#define IEEE80211_FC0_SUBTYPE_PS_POLL       0xa0
-#define IEEE80211_FC0_SUBTYPE_RTS           0xb0
-#define IEEE80211_FC0_SUBTYPE_CTS           0xc0
-#define IEEE80211_FC0_SUBTYPE_ACK           0xd0
-#define IEEE80211_FC0_SUBTYPE_CF_END        0xe0
-#define IEEE80211_FC0_SUBTYPE_CF_END_ACK    0xf0
-
-/* for TYPE_DATA (bit combination) */
-
-#define IEEE80211_FC0_SUBTYPE_DATA          0x00
-#define IEEE80211_FC0_SUBTYPE_CF_ACK        0x10
-#define IEEE80211_FC0_SUBTYPE_CF_POLL       0x20
-#define IEEE80211_FC0_SUBTYPE_CF_ACPL       0x30
-#define IEEE80211_FC0_SUBTYPE_NODATA        0x40
-#define IEEE80211_FC0_SUBTYPE_CFACK         0x50
-#define IEEE80211_FC0_SUBTYPE_CFPOLL        0x60
-#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70
-#define IEEE80211_FC0_SUBTYPE_QOS           0x80
-
-#define IEEE80211_FC1_DIR_MASK              0x03
-#define IEEE80211_FC1_DIR_NODS              0x00  /* STA->STA */
-#define IEEE80211_FC1_DIR_TODS              0x01  /* STA->AP */
-#define IEEE80211_FC1_DIR_FROMDS            0x02
-                                                  /* AP ->STA */
-#define IEEE80211_FC1_DIR_DSTODS            0x03
-                                                  /* AP ->AP */
-
-#define IEEE80211_FC1_MORE_FRAG             0x04
-#define IEEE80211_FC1_RETRY                 0x08
-#define IEEE80211_FC1_PWR_MGT               0x10
-#define IEEE80211_FC1_MORE_DATA             0x20
-#define IEEE80211_FC1_PROTECTED             0x40
-#define IEEE80211_FC1_WEP                   0x40  /* pre-RSNA compat */
-#define IEEE80211_FC1_ORDER                 0x80
-#define IEEE80211_FC1_BITS \
-    "\20\03MORE_FRAG\04RETRY\05PWR_MGT\06MORE_DATA" \
-    "\07PROTECTED\08ORDER"
-
-/* Sequence Control field (see 7.1.3.4). */
-
-#define IEEE80211_SEQ_FRAG_MASK            0x000f
-#define IEEE80211_SEQ_FRAG_SHIFT           0
-#define IEEE80211_SEQ_SEQ_MASK             0xfff0
-#define IEEE80211_SEQ_SEQ_SHIFT            4
-
-#define IEEE80211_NWID_LEN                 32
-#define IEEE80211_MMIE_LEN                 18  /* 11w */
-
-/* QoS Control field (see 7.1.3.5). */
-
-#define IEEE80211_QOS_TXOP                 0xff00
-#define IEEE80211_QOS_AMSDU                0x0080  /* 11n */
-#define IEEE80211_QOS_ACK_POLICY_NORMAL    0x0000
-#define IEEE80211_QOS_ACK_POLICY_NOACK     0x0020
-#define IEEE80211_QOS_ACK_POLICY_NOEXPLACK 0x0040
-#define IEEE80211_QOS_ACK_POLICY_BA        0x0060
-#define IEEE80211_QOS_ACK_POLICY_MASK      0x0060
-#define IEEE80211_QOS_ACK_POLICY_SHIFT     5
-#define IEEE80211_QOS_EOSP                 0x0010
-#define IEEE80211_QOS_TID                  0x000f
-
-/* Capability Information field (see 7.3.1.4) */
-
-#define IEEE80211_CAPINFO_ESS              0x0001
-#define IEEE80211_CAPINFO_IBSS             0x0002
-#define IEEE80211_CAPINFO_CF_POLLABLE      0x0004
-#define IEEE80211_CAPINFO_CF_POLLREQ       0x0008
-#define IEEE80211_CAPINFO_PRIVACY          0x0010
-#define IEEE80211_CAPINFO_SHORT_PREAMBLE   0x0020
-#define IEEE80211_CAPINFO_PBCC             0x0040
-#define IEEE80211_CAPINFO_CHNL_AGILITY     0x0080
-#define IEEE80211_CAPINFO_SPECTRUM_MGMT    0x0100
-#define IEEE80211_CAPINFO_QOS              0x0200
-#define IEEE80211_CAPINFO_SHORT_SLOTTIME   0x0400
-#define IEEE80211_CAPINFO_APSD             0x0800
-
-/* bit 12 is reserved */
-
-#define IEEE80211_CAPINFO_DSSSOFDM         0x2000
-#define IEEE80211_CAPINFO_DELAYED_B_ACK    0x4000
-#define IEEE80211_CAPINFO_IMMEDIATE_B_ACK  0x8000
-#define IEEE80211_CAPINFO_BITS \
-    "\10\01ESS\02IBSS\03CF_POLLABLE\04CF_POLLREQ" \
-    "\05PRIVACY\06SHORT_PREAMBLE\07PBCC\10CHNL_AGILITY" \
-    "\11SPECTRUM_MGMT\12QOS\13SHORT_SLOTTIME\14APSD" \
-    "\16DSSSOFDM\17DELAYED_B_ACK\20IMMEDIATE_B_ACK"
-
-/* Block Ack Action field values (see Table 7-54). */
-
-#define IEEE80211_ACTION_ADDBA_REQ         0
-#define IEEE80211_ACTION_ADDBA_RESP        1
-#define IEEE80211_ACTION_DELBA             2
-
-/* SA Query Action field values (see Table 7-57l). */
-
-#define IEEE80211_ACTION_SA_QUERY_REQ      0
-#define IEEE80211_ACTION_SA_QUERY_RESP     1
-
-/* HT Action field values (see Table 7-57m). */
-
-#define IEEE80211_ACTION_NOTIFYCW          0
-
-#define IEEE80211_RATE_BASIC               0x80
-#define IEEE80211_RATE_VAL                 0x7f
-#define IEEE80211_RATE_SIZE                8    /* 802.11 standard */
-#define IEEE80211_RATE_MAXSIZE             15   /* max rates we'll handle */
-
-/* BlockAck/BlockAckReq Control field (see Figure 7-13). */
-
-#define IEEE80211_BA_ACK_POLICY            0x0001
-#define IEEE80211_BA_MULTI_TID             0x0002
-#define IEEE80211_BA_COMPRESSED            0x0004
-#define IEEE80211_BA_TID_INFO_MASK         0xf000
-#define IEEE80211_BA_TID_INFO_SHIFT        12
-
-/* DELBA Parameter Set field (see Figure 7-34). */
-
-#define IEEE80211_DELBA_INITIATOR          0x0800
-
-/* ERP information element (see 7.3.2.13). */
-
-#define IEEE80211_ERP_NON_ERP_PRESENT      0x01
-#define IEEE80211_ERP_USE_PROTECTION       0x02
-#define IEEE80211_ERP_BARKER_MODE          0x04
-
-/* RSN capabilities (see 7.3.2.25.3). */
-
-#define IEEE80211_RSNCAP_PREAUTH           0x0001
-#define IEEE80211_RSNCAP_NOPAIRWISE        0x0002
-#define IEEE80211_RSNCAP_PTKSA_RCNT_MASK   0x000c
-#define IEEE80211_RSNCAP_PTKSA_RCNT_SHIFT  2
-#define IEEE80211_RSNCAP_GTKSA_RCNT_MASK   0x0030
-#define IEEE80211_RSNCAP_GTKSA_RCNT_SHIFT  4
-#define IEEE80211_RSNCAP_RCNT1             0
-#define IEEE80211_RSNCAP_RCNT2             1
-#define IEEE80211_RSNCAP_RCNT4             2
-#define IEEE80211_RSNCAP_RCNT16            3
-#define IEEE80211_RSNCAP_MFPR              0x0040  /* 11w */
-#define IEEE80211_RSNCAP_MFPC              0x0080  /* 11w */
-#define IEEE80211_RSNCAP_PEERKEYENA        0x0200
-#define IEEE80211_RSNCAP_SPPAMSDUC         0x0400  /* 11n */
-#define IEEE80211_RSNCAP_SPPAMSDUR         0x0800  /* 11n */
-#define IEEE80211_RSNCAP_PBAC              0x1000  /* 11n */
-
-/* HT Capabilities Info (see 7.3.2.57.2). */
-
-#define IEEE80211_HTCAP_LDPC               0x00000001
-#define IEEE80211_HTCAP_CBW20_40           0x00000002
-#define IEEE80211_HTCAP_SMPS_MASK          0x0000000c
-#define IEEE80211_HTCAP_SMPS_SHIFT         2
-#define IEEE80211_HTCAP_SMPS_STA           0
-#define IEEE80211_HTCAP_SMPS_DYN           1
-#define IEEE80211_HTCAP_SMPS_DIS           3
-#define IEEE80211_HTCAP_GF                 0x00000010
-#define IEEE80211_HTCAP_SGI20              0x00000020
-#define IEEE80211_HTCAP_SGI40              0x00000040
-#define IEEE80211_HTCAP_TXSTBC             0x00000080
-#define IEEE80211_HTCAP_RXSTBC_MASK        0x00000300
-#define IEEE80211_HTCAP_RXSTBC_SHIFT       8
-#define IEEE80211_HTCAP_DELAYEDBA          0x00000400
-#define IEEE80211_HTCAP_AMSDU7935          0x00000800
-#define IEEE80211_HTCAP_DSSSCCK40          0x00001000
-#define IEEE80211_HTCAP_PSMP               0x00002000
-#define IEEE80211_HTCAP_40INTOLERANT       0x00004000
-#define IEEE80211_HTCAP_LSIGTXOPPROT       0x00008000
+/*  IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble
+ *  and FCS/CRC (frame check sequence).
+ */
+
+#define ETH_ALEN  6         /* Octets in one ethernet addr   */
+#define ETH_TLEN  2         /* Octets in ethernet type field */
+#define ETH_HLEN  14        /* Total octets in header.   */
+#define ETH_ZLEN  60        /* Min. octets in frame sans FCS */
+#define ETH_DATA_LEN  1500  /* Max. octets in payload  */
+#define ETH_FRAME_LEN 1514  /* Max. octets in frame sans FCS */
+#define ETH_FCS_LEN 4       /* Octets in the FCS     */
+
+#define ETH_MIN_MTU 68      /* Min IPv4 MTU per RFC791  */
+#define ETH_MAX_MTU 0xFFFFU /* 65535, same as IP_MAX_MTU  */
+
+/* DS bit usage
+ *
+ * TA = transmitter address
+ * RA = receiver address
+ * DA = destination address
+ * SA = source address
+ *
+ * ToDS    FromDS  A1(RA)  A2(TA)  A3      A4      Use
+ * -----------------------------------------------------------------
+ *  0       0       DA      SA      BSSID   -       IBSS/DLS
+ *  0       1       DA      BSSID   SA      -       AP -> STA
+ *  1       0       BSSID   SA      DA      -       AP <- STA
+ *  1       1       RA      TA      DA      SA      unspecified (WDS)
+ */
+
+#define FCS_LEN  4
+
+#define IEEE80211_FCTL_VERS                 0x0003
+#define IEEE80211_FCTL_FTYPE                0x000c
+#define IEEE80211_FCTL_STYPE                0x00f0
+#define IEEE80211_FCTL_TODS                 0x0100
+#define IEEE80211_FCTL_FROMDS               0x0200
+#define IEEE80211_FCTL_MOREFRAGS            0x0400
+#define IEEE80211_FCTL_RETRY                0x0800
+#define IEEE80211_FCTL_PM                   0x1000
+#define IEEE80211_FCTL_MOREDATA             0x2000
+#define IEEE80211_FCTL_PROTECTED            0x4000
+#define IEEE80211_FCTL_ORDER                0x8000
+#define IEEE80211_FCTL_CTL_EXT              0x0f00
+
+#define IEEE80211_SCTL_FRAG                 0x000F
+#define IEEE80211_SCTL_SEQ                  0xFFF0
+
+#define IEEE80211_FTYPE_MGMT                0x0000
+#define IEEE80211_FTYPE_CTL                 0x0004
+#define IEEE80211_FTYPE_DATA                0x0008
+#define IEEE80211_FTYPE_EXT                 0x000c
+
+/* management */
+
+#define IEEE80211_STYPE_ASSOC_REQ           0x0000
+#define IEEE80211_STYPE_ASSOC_RESP          0x0010
+#define IEEE80211_STYPE_REASSOC_REQ         0x0020
+#define IEEE80211_STYPE_REASSOC_RESP        0x0030
+#define IEEE80211_STYPE_PROBE_REQ           0x0040
+#define IEEE80211_STYPE_PROBE_RESP          0x0050
+#define IEEE80211_STYPE_BEACON              0x0080
+#define IEEE80211_STYPE_ATIM                0x0090
+#define IEEE80211_STYPE_DISASSOC            0x00A0
+#define IEEE80211_STYPE_AUTH                0x00B0
+#define IEEE80211_STYPE_DEAUTH              0x00C0
+#define IEEE80211_STYPE_ACTION              0x00D0
+
+/* control */
+
+#define IEEE80211_STYPE_CTL_EXT             0x0060
+#define IEEE80211_STYPE_BACK_REQ            0x0080
+#define IEEE80211_STYPE_BACK                0x0090
+#define IEEE80211_STYPE_PSPOLL              0x00A0
+#define IEEE80211_STYPE_RTS                 0x00B0
+#define IEEE80211_STYPE_CTS                 0x00C0
+#define IEEE80211_STYPE_ACK                 0x00D0
+#define IEEE80211_STYPE_CFEND               0x00E0
+#define IEEE80211_STYPE_CFENDACK            0x00F0
+
+/* data */
+
+#define IEEE80211_STYPE_DATA                0x0000
+#define IEEE80211_STYPE_DATA_CFACK          0x0010
+#define IEEE80211_STYPE_DATA_CFPOLL         0x0020
+#define IEEE80211_STYPE_DATA_CFACKPOLL      0x0030
+#define IEEE80211_STYPE_NULLFUNC            0x0040
+#define IEEE80211_STYPE_CFACK               0x0050
+#define IEEE80211_STYPE_CFPOLL              0x0060
+#define IEEE80211_STYPE_CFACKPOLL           0x0070
+#define IEEE80211_STYPE_QOS_DATA            0x0080
+#define IEEE80211_STYPE_QOS_DATA_CFACK      0x0090
+#define IEEE80211_STYPE_QOS_DATA_CFPOLL     0x00A0
+#define IEEE80211_STYPE_QOS_DATA_CFACKPOLL  0x00B0
+#define IEEE80211_STYPE_QOS_NULLFUNC        0x00C0
+#define IEEE80211_STYPE_QOS_CFACK           0x00D0
+#define IEEE80211_STYPE_QOS_CFPOLL          0x00E0
+#define IEEE80211_STYPE_QOS_CFACKPOLL       0x00F0
+
+/* extension, added by 802.11ad */
+
+#define IEEE80211_STYPE_DMG_BEACON          0x0000
+#define IEEE80211_STYPE_S1G_BEACON          0x0010
+
+/* bits unique to S1G beacon */
+
+#define IEEE80211_S1G_BCN_NEXT_TBTT         0x100
+
+/* see 802.11ah-2016 9.9 NDP CMAC frames */
+
+#define IEEE80211_S1G_1MHZ_NDP_BITS         25
+#define IEEE80211_S1G_1MHZ_NDP_BYTES        4
+#define IEEE80211_S1G_2MHZ_NDP_BITS         37
+#define IEEE80211_S1G_2MHZ_NDP_BYTES        5
+
+#define IEEE80211_NDP_FTYPE_CTS             0
+#define IEEE80211_NDP_FTYPE_CF_END          0
+#define IEEE80211_NDP_FTYPE_PS_POLL         1
+#define IEEE80211_NDP_FTYPE_ACK             2
+#define IEEE80211_NDP_FTYPE_PS_POLL_ACK     3
+#define IEEE80211_NDP_FTYPE_BA              4
+#define IEEE80211_NDP_FTYPE_BF_REPORT_POLL  5
+#define IEEE80211_NDP_FTYPE_PAGING          6
+#define IEEE80211_NDP_FTYPE_PREQ            7
+
+#define SM64(f, v) ((((u64)v) << f##_S) & f)
+
+/* NDP CMAC frame fields */
+
+#define IEEE80211_NDP_FTYPE                 0x0000000000000007
+#define IEEE80211_NDP_FTYPE_S               0x0000000000000000
+
+/* 1M Probe Request 11ah 9.9.3.1.1 */
+
+#define IEEE80211_NDP_1M_PREQ_ANO           0x0000000000000008
+#define IEEE80211_NDP_1M_PREQ_ANO_S         3
+#define IEEE80211_NDP_1M_PREQ_CSSID         0x00000000000FFFF0
+#define IEEE80211_NDP_1M_PREQ_CSSID_S       4
+#define IEEE80211_NDP_1M_PREQ_RTYPE         0x0000000000100000
+#define IEEE80211_NDP_1M_PREQ_RTYPE_S       20
+#define IEEE80211_NDP_1M_PREQ_RSV           0x0000000001E00000
+#define IEEE80211_NDP_1M_PREQ_RSV           0x0000000001E00000
+
+/* 2M Probe Request 11ah 9.9.3.1.2 */
+
+#define IEEE80211_NDP_2M_PREQ_ANO           0x0000000000000008
+#define IEEE80211_NDP_2M_PREQ_ANO_S         3
+#define IEEE80211_NDP_2M_PREQ_CSSID         0x0000000FFFFFFFF0
+#define IEEE80211_NDP_2M_PREQ_CSSID_S       4
+#define IEEE80211_NDP_2M_PREQ_RTYPE         0x0000001000000000
+#define IEEE80211_NDP_2M_PREQ_RTYPE_S       36
+
+#define IEEE80211_ANO_NETTYPE_WILD          15
+
+/* bits unique to S1G beacon */
+
+#define IEEE80211_S1G_BCN_NEXT_TBTT         0x100
+
+/* control extension - for IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTL_EXT */
+
+#define IEEE80211_CTL_EXT_POLL              0x2000
+#define IEEE80211_CTL_EXT_SPR               0x3000
+#define IEEE80211_CTL_EXT_GRANT             0x4000
+#define IEEE80211_CTL_EXT_DMG_CTS           0x5000
+#define IEEE80211_CTL_EXT_DMG_DTS           0x6000
+#define IEEE80211_CTL_EXT_SSW               0x8000
+#define IEEE80211_CTL_EXT_SSW_FBACK         0x9000
+#define IEEE80211_CTL_EXT_SSW_ACK           0xa000
+
+#define IEEE80211_SN_MASK  ((IEEE80211_SCTL_SEQ) >> 4)
+#define IEEE80211_MAX_SN  IEEE80211_SN_MASK
+#define IEEE80211_SN_MODULO  (IEEE80211_MAX_SN + 1)
+
+/* PV1 Layout 11ah 9.8.3.1 */
+#define IEEE80211_PV1_FCTL_VERS             0x0003
+#define IEEE80211_PV1_FCTL_FTYPE            0x001c
+#define IEEE80211_PV1_FCTL_STYPE            0x00e0
+#define IEEE80211_PV1_FCTL_TODS             0x0100
+#define IEEE80211_PV1_FCTL_MOREFRAGS        0x0200
+#define IEEE80211_PV1_FCTL_PM               0x0400
+#define IEEE80211_PV1_FCTL_MOREDATA         0x0800
+#define IEEE80211_PV1_FCTL_PROTECTED        0x1000
+#define IEEE80211_PV1_FCTL_END_SP           0x2000
+#define IEEE80211_PV1_FCTL_RELAYED          0x4000
+#define IEEE80211_PV1_FCTL_ACK_POLICY       0x8000
+#define IEEE80211_PV1_FCTL_CTL_EXT          0x0f00
+
+static inline bool ieee80211_sn_less(uint16_t sn1, uint16_t sn2)
+{
+  return ((sn1 - sn2) & IEEE80211_SN_MASK) > (IEEE80211_SN_MODULO >> 1);
+}
+
+static inline uint16_t ieee80211_sn_add(uint16_t sn1, uint16_t sn2)
+{
+  return (sn1 + sn2) & IEEE80211_SN_MASK;
+}
+
+static inline uint16_t ieee80211_sn_inc(uint16_t sn)
+{
+  return ieee80211_sn_add(sn, 1);
+}
+
+static inline uint16_t ieee80211_sn_sub(uint16_t sn1, uint16_t sn2)
+{
+  return (sn1 - sn2) & IEEE80211_SN_MASK;
+}
+
+#define IEEE80211_SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
+#define IEEE80211_SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
+
+/* miscellaneous IEEE 802.11 constants */
+
+#define IEEE80211_MAX_FRAG_THRESHOLD        2352
+#define IEEE80211_MAX_RTS_THRESHOLD         2353
+#define IEEE80211_MAX_AID                   2007
+#define IEEE80211_MAX_AID_S1G               8191
+#define IEEE80211_MAX_TIM_LEN               251
+#define IEEE80211_MAX_MESH_PEERINGS         63
+
+/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
+ * 6.2.1.1.2.
+ * 802.11e clarifies the figure in section 7.1.2. The frame body is
+ * up to 2304 octets long (maximum MSDU size) plus any crypt overhead.
+ */
+
+#define IEEE80211_MAX_DATA_LEN              2304
+
+/* 802.11ad extends maximum MSDU size for DMG (freq > 40Ghz) networks
+ * to 7920 bytes, see 8.2.3 General frame format
+ */
+
+#define IEEE80211_MAX_DATA_LEN_DMG          7920
+
+/* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU,
+ * 12 byte crypt, 4 byte FCS
+ */
+
+#define IEEE80211_MAX_FRAME_LEN             2352
+
+/* Maximal size of an A-MSDU that can be transported in a HT BA session */
+
+#define IEEE80211_MAX_MPDU_LEN_HT_BA        4095
+
+/* Maximal size of an A-MSDU */
+
+#define IEEE80211_MAX_MPDU_LEN_HT_3839      3839
+#define IEEE80211_MAX_MPDU_LEN_HT_7935      7935
+
+#define IEEE80211_MAX_MPDU_LEN_VHT_3895     3895
+#define IEEE80211_MAX_MPDU_LEN_VHT_7991     7991
+#define IEEE80211_MAX_MPDU_LEN_VHT_11454    11454
+
+#define IEEE80211_MAX_SSID_LEN              32
+
+#define IEEE80211_MAX_MESH_ID_LEN           32
+
+#define IEEE80211_FIRST_TSPEC_TSID          8
+#define IEEE80211_NUM_TIDS                  16
+
+/* number of user priorities 802.11 uses */
+
+#define IEEE80211_NUM_UPS                   8
+
+/* number of ACs */
+
+#define IEEE80211_NUM_ACS                   4
+
+#define IEEE80211_QOS_CTL_LEN               2
+
+/* 1d tag mask */
+
+#define IEEE80211_QOS_CTL_TAG1D_MASK        0x0007
+
+/* TID mask */
+
+#define IEEE80211_QOS_CTL_TID_MASK          0x000f
+
+/* EOSP */
+
+#define IEEE80211_QOS_CTL_EOSP              0x0010
+
+/* ACK policy */
+
+#define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL 0x0000
+#define IEEE80211_QOS_CTL_ACK_POLICY_NOACK  0x0020
+#define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL 0x0040
+#define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK 0x0060
+#define IEEE80211_QOS_CTL_ACK_POLICY_MASK   0x0060
+
+/* A-MSDU 802.11n */
+
+#define IEEE80211_QOS_CTL_A_MSDU_PRESENT    0x0080
+
+/* Mesh Control 802.11s */
+
+#define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT 0x0100
+
+/* Mesh Power Save Level */
+
+#define IEEE80211_QOS_CTL_MESH_PS_LEVEL     0x0200
+
+/* Mesh Receiver Service Period Initiated */
+
+#define IEEE80211_QOS_CTL_RSPI              0x0400
+
+/* U-APSD queue for WMM IEs sent by AP */
+
+#define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD   (1<<7)
+#define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK 0x0f
+
+/* U-APSD queues for WMM IEs sent by STA */
+
+#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO  (1<<0)
+#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI  (1<<1)
+#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK  (1<<2)
+#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE  (1<<3)
+#define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK 0x0f
+
+/* U-APSD max SP length for WMM IEs sent by STA */
+
+#define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL 0x00
+#define IEEE80211_WMM_IE_STA_QOSINFO_SP_2   0x01
+#define IEEE80211_WMM_IE_STA_QOSINFO_SP_4   0x02
+#define IEEE80211_WMM_IE_STA_QOSINFO_SP_6   0x03
+#define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK 0x03
+#define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT 5
+
+#define IEEE80211_HT_CTL_LEN  4
+
+struct ieee80211_hdr
+{
+  uint16_t frame_control;
+  uint16_t duration_id;
+  uint8_t addr1[ETH_ALEN];
+  uint8_t addr2[ETH_ALEN];
+  uint8_t addr3[ETH_ALEN];
+  uint16_t seq_ctrl;
+  uint8_t addr4[ETH_ALEN];
+};
+
+struct ieee80211_hdr_3addr
+{
+  uint16_t frame_control;
+  uint16_t duration_id;
+  uint8_t addr1[ETH_ALEN];
+  uint8_t addr2[ETH_ALEN];
+  uint8_t addr3[ETH_ALEN];
+  uint16_t seq_ctrl;
+};
+
+struct ieee80211_qos_hdr
+{
+  uint16_t frame_control;
+  uint16_t duration_id;
+  uint8_t addr1[ETH_ALEN];
+  uint8_t addr2[ETH_ALEN];
+  uint8_t addr3[ETH_ALEN];
+  uint16_t seq_ctrl;
+  uint16_t qos_ctrl;
+};
+
+/* ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_tods(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
+}
+
+/* ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_fromds(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
+}
+
+/* ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and
+ *                    IEEE80211_FCTL_FROMDS are set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_a4(uint16_t fc)
+{
+  uint16_t tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
+  return (fc & tmp) == tmp;
+}
+
+/* ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_morefrags(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
+}
+
+/* ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_retry(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
+}
+
+/* ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_pm(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
+}
+
+/* ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_moredata(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
+}
+
+/* ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_protected(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
+}
+
+/* ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_has_order(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
+}
+
+/* ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_mgmt(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT);
+}
+
+/* ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_ctl(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL);
+}
+
+/* ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_data(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_DATA);
+}
+
+/* ieee80211_is_ext - check if type is IEEE80211_FTYPE_EXT
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_ext(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_EXT);
+}
+
+/* ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA
+ *                         and IEEE80211_STYPE_QOS_DATA is set
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_data_qos(uint16_t fc)
+{
+  /* mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
+   * to check the one bit
+   */
+
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE |
+                           IEEE80211_STYPE_QOS_DATA)) ==
+    cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
+}
+
+/* ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA
+ *                             and has data
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_data_present(uint16_t fc)
+{
+  /* mask with 0x40 and test that that bit is clear to only return true
+   * for the data-containing substypes.
+   */
+
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
+    cpu_to_le16(IEEE80211_FTYPE_DATA);
+}
+
+/* ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT &&
+ *                                   IEEE80211_STYPE_ASSOC_REQ
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_assoc_req(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
+}
+
+/* ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT &&
+ *                                    IEEE80211_STYPE_ASSOC_RESP
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_assoc_resp(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
+}
+
+/* ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT &&
+ *                                     IEEE80211_STYPE_REASSOC_REQ
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_reassoc_req(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
+}
+
+/* ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT &&
+ *                                      IEEE80211_STYPE_REASSOC_RESP
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_reassoc_resp(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
+}
+
+/* ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT &&
+ *                                   IEEE80211_STYPE_PROBE_REQ
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_probe_req(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
+}
+
+/* ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT &&
+ *                                    IEEE80211_STYPE_PROBE_RESP
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_probe_resp(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
+}
+
+/* ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT &&
+ *                                IEEE80211_STYPE_BEACON
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_beacon(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
+}
+
+/* ieee80211_is_s1g_beacon - check if IEEE80211_FTYPE_EXT &&
+ * IEEE80211_STYPE_S1G_BEACON
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_s1g_beacon(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE |
+        IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON);
+}
+
+/* ieee80211_next_tbtt_present - check if IEEE80211_FTYPE_EXT &&
+ * IEEE80211_STYPE_S1G_BEACON && IEEE80211_S1G_BCN_NEXT_TBTT
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_next_tbtt_present(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON) &&
+    fc & cpu_to_le16(IEEE80211_S1G_BCN_NEXT_TBTT);
+}
+
+/* ieee80211_is_s1g_short_beacon - check if next tbtt present bit is set.
+ * Only true for S1G beacons when they're short.
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_s1g_short_beacon(uint16_t fc)
+{
+  return ieee80211_is_s1g_beacon(fc) && ieee80211_next_tbtt_present(fc);
+}
+
+/* ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_atim(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
+}
+
+/* ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT &&
+ *                                  IEEE80211_STYPE_DISASSOC
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_disassoc(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
+}
+
+/* ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_auth(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
+}
+
+/* ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT &&
+ *                                IEEE80211_STYPE_DEAUTH
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_deauth(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
+}
+
+/* ieee80211_is_action - check if IEEE80211_FTYPE_MGMT &&
+ *                                IEEE80211_STYPE_ACTION
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_action(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
+}
+
+/* ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL &&
+ *                                  IEEE80211_STYPE_BACK_REQ
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_back_req(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
+}
+
+/* ieee80211_is_back - check if IEEE80211_FTYPE_CTL &&
+ *                              IEEE80211_STYPE_BACK
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_back(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
+}
+
+/* ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL &&
+ *                                IEEE80211_STYPE_PSPOLL
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_pspoll(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
+}
+
+/* ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_rts(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
+}
+
+/* ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_cts(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
+}
+
+/* ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_ack(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
+}
+
+/* ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_cfend(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
+}
+
+/* ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL &&
+ *                                  IEEE80211_STYPE_CFENDACK
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_cfendack(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
+}
+
+/* ieee80211_is_nullfunc - check if frame is a regular
+ *                         (non-QoS) nullfunc frame
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_nullfunc(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
+}
+
+/* ieee80211_is_qos_nullfunc - check if frame is a QoS nullfunc frame
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_qos_nullfunc(uint16_t fc)
+{
+  return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+    cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
+}
+
+/* ieee80211_is_any_nullfunc - check if frame is regular or QoS
+ *                             nullfunc frame
+ * @fc: frame control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_any_nullfunc(uint16_t fc)
+{
+  return (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc));
+}
+
+/* ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
+ * @fc: frame control field in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_bufferable_mmpdu(uint16_t fc)
+{
+  /* IEEE 802.11-2012, definition of "bufferable management frame";
+   * note that this ignores the IBSS special case.
+   */
+
+  return ieee80211_is_mgmt(fc) &&
+    (ieee80211_is_action(fc) ||
+     ieee80211_is_disassoc(fc) ||
+     ieee80211_is_deauth(fc));
+}
+
+/* ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
+ * @seq_ctrl: frame sequence control bytes in little-endian byteorder
+ */
+
+static inline bool ieee80211_is_first_frag(uint16_t seq_ctrl)
+{
+  return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0;
+}
+
+/* ieee80211_is_frag - check if a frame is a fragment
+ * @hdr: 802.11 header of the frame
+ */
+
+static inline bool ieee80211_is_frag(struct ieee80211_hdr *hdr)
+{
+  return ieee80211_has_morefrags(hdr->frame_control) ||
+    hdr->seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG);
+}
+
+struct ieee80211s_hdr
+{
+  uint8_t flags;
+  uint8_t ttl;
+  uint32_t seqnum;
+  uint8_t eaddr1[ETH_ALEN];
+  uint8_t eaddr2[ETH_ALEN];
+};
+
+/* Mesh flags */
+
+#define MESH_FLAGS_AE_A4    0x1
+#define MESH_FLAGS_AE_A5_A6 0x2
+#define MESH_FLAGS_AE       0x3
+#define MESH_FLAGS_PS_DEEP  0x4
+
+/* enum ieee80211_preq_flags - mesh PREQ element flags
+ *
+ * @IEEE80211_PREQ_PROACTIVE_PREP_FLAG: proactive PREP subfield
+ */
+
+enum ieee80211_preq_flags
+{
+  IEEE80211_PREQ_PROACTIVE_PREP_FLAG = 1 << 2,
+};
+
+/* enum ieee80211_preq_target_flags - mesh PREQ element per target flags
+ *
+ * @IEEE80211_PREQ_TO_FLAG: target only subfield
+ * @IEEE80211_PREQ_USN_FLAG: unknown target HWMP sequence number subfield
+ */
+
+enum ieee80211_preq_target_flags
+{
+  IEEE80211_PREQ_TO_FLAG  = 1 << 0,
+  IEEE80211_PREQ_USN_FLAG = 1 << 2,
+};
+
+/* struct ieee80211_quiet_ie
+ *
+ * This structure refers to "Quiet information element"
+ */
+
+struct ieee80211_quiet_ie
+{
+  uint8_t count;
+  uint8_t period;
+  uint16_t duration;
+  uint16_t offset;
+};
+
+/* struct ieee80211_msrment_ie
+ *
+ * This structure refers to "Measurement Request/Report information element"
+ */
+
+struct ieee80211_msrment_ie
+{
+  uint8_t token;
+  uint8_t mode;
+  uint8_t type;
+  uint8_t request[];
+};
+
+/* struct ieee80211_channel_sw_ie
+ *
+ * This structure refers to "Channel Switch Announcement information element"
+ */
+
+struct ieee80211_channel_sw_ie
+{
+  uint8_t mode;
+  uint8_t new_ch_num;
+  uint8_t count;
+};
+
+/* struct ieee80211_ext_chansw_ie
+ *
+ * This structure represents the
+ * "Extended Channel Switch Announcement element"
+ */
+
+struct ieee80211_ext_chansw_ie
+{
+  uint8_t mode;
+  uint8_t new_operating_class;
+  uint8_t new_ch_num;
+  uint8_t count;
+};
+
+/* struct ieee80211_sec_chan_offs_ie - secondary channel offset IE
+ * @sec_chan_offs: secondary channel offset,
+ *                 uses IEEE80211_HT_PARAM_CHA_SEC_* values here
+ * This structure represents the "Secondary Channel Offset element"
+ */
+
+struct ieee80211_sec_chan_offs_ie
+{
+  uint8_t sec_chan_offs;
+};
+
+/* struct ieee80211_mesh_chansw_params_ie - mesh channel switch parameters IE
+ *
+ * This structure represents the "Mesh Channel Switch Paramters element"
+ */
+
+struct ieee80211_mesh_chansw_params_ie
+{
+  uint8_t mesh_ttl;
+  uint8_t mesh_flags;
+  uint16_t mesh_reason;
+  uint16_t mesh_pre_value;
+};
+
+/* struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE
+ */
+
+struct ieee80211_wide_bw_chansw_ie
+{
+  uint8_t new_channel_width;
+  uint8_t new_center_freq_seg0;
+  uint8_t new_center_freq_seg1;
+};
+
+/* struct ieee80211_tim
+ *
+ * This structure refers to "Traffic Indication Map information element"
+ */
+
+struct ieee80211_tim_ie
+{
+  uint8_t dtim_count;
+  uint8_t dtim_period;
+  uint8_t bitmap_ctrl;
+
+  /* variable size: 1 - 251 bytes */
+
+  uint8_t virtual_map[1];
+};
+
+/* struct ieee80211_meshconf_ie
+ *
+ * This structure refers to "Mesh Configuration information element"
+ */
+
+struct ieee80211_meshconf_ie
+{
+  uint8_t meshconf_psel;
+  uint8_t meshconf_pmetric;
+  uint8_t meshconf_congest;
+  uint8_t meshconf_synch;
+  uint8_t meshconf_auth;
+  uint8_t meshconf_form;
+  uint8_t meshconf_cap;
+};
+
+/* enum mesh_config_capab_flags
+ * Mesh Configuration IE capability field flags
+ *
+ * @IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS: STA is willing to establish
+ * additional mesh peerings with other mesh STAs
+ * @IEEE80211_MESHCONF_CAPAB_FORWARDING: the STA forwards MSDUs
+ * @IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING: TBTT adjustment procedure
+ * is ongoing
+ * @IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL:
+ *                        STA is in deep sleep mode or has
+ * neighbors in deep sleep mode
+ */
+
+enum mesh_config_capab_flags
+{
+  IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS    = 0x01,
+  IEEE80211_MESHCONF_CAPAB_FORWARDING       = 0x08,
+  IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING   = 0x20,
+  IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL = 0x40,
+};
+
+#define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1
+
+/* mesh channel switch parameters element's flag indicator */
+
+#define WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT BIT(0)
+#define WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR BIT(1)
+#define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2)
+
+/* struct ieee80211_rann_ie
+ *
+ * This structure refers to "Root Announcement information element"
+ */
+
+struct ieee80211_rann_ie
+{
+  uint8_t rann_flags;
+  uint8_t rann_hopcount;
+  uint8_t rann_ttl;
+  uint8_t rann_addr[ETH_ALEN];
+  uint32_t rann_seq;
+  uint32_t rann_interval;
+  uint32_t rann_metric;
+};
+
+enum ieee80211_rann_flags
+{
+  RANN_FLAG_IS_GATE = 1 << 0,
+};
+
+enum ieee80211_ht_chanwidth_values
+{
+  IEEE80211_HT_CHANWIDTH_20MHZ  = 0,
+  IEEE80211_HT_CHANWIDTH_ANY    = 1,
+};
+
+/* enum ieee80211_opmode_bits - VHT operating mode field bits
+ * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask
+ * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width
+ * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width
+ * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ: 80 MHz channel width
+ * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ: 160 MHz or 80+80 MHz channel
+ *                                           width
+ * @IEEE80211_OPMODE_NOTIF_BW_160_80P80: 160 / 80+80 MHz indicator flag
+ * @IEEE80211_OPMODE_NOTIF_RX_NSS_MASK: number of spatial streams mask
+ * (the NSS value is the value of this field + 1)
+ * @IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT: number of spatial streams shift
+ * @IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF: indicates streams in SU-MIMO PPDU
+ * using a beamforming steering matrix
+ */
+
+enum ieee80211_vht_opmode_bits
+{
+  IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK   = 0x03,
+  IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ  = 0,
+  IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ  = 1,
+  IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ  = 2,
+  IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ = 3,
+  IEEE80211_OPMODE_NOTIF_BW_160_80P80     = 0x04,
+  IEEE80211_OPMODE_NOTIF_RX_NSS_MASK      = 0x70,
+  IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT     = 4,
+  IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF   = 0x80,
+};
+
+/* enum ieee80211_s1g_chanwidth
+ * These are defined in IEEE802.11-2016ah Table 10-20
+ * as BSS Channel Width
+ *
+ * @IEEE80211_S1G_CHANWIDTH_1MHZ: 1MHz operating channel
+ * @IEEE80211_S1G_CHANWIDTH_2MHZ: 2MHz operating channel
+ * @IEEE80211_S1G_CHANWIDTH_4MHZ: 4MHz operating channel
+ * @IEEE80211_S1G_CHANWIDTH_8MHZ: 8MHz operating channel
+ * @IEEE80211_S1G_CHANWIDTH_16MHZ: 16MHz operating channel
+ */
+
+enum ieee80211_s1g_chanwidth
+{
+  IEEE80211_S1G_CHANWIDTH_1MHZ  = 0,
+  IEEE80211_S1G_CHANWIDTH_2MHZ  = 1,
+  IEEE80211_S1G_CHANWIDTH_4MHZ  = 3,
+  IEEE80211_S1G_CHANWIDTH_8MHZ  = 7,
+  IEEE80211_S1G_CHANWIDTH_16MHZ = 15,
+};
+
+#define WLAN_SA_QUERY_TR_ID_LEN 2
+#define WLAN_MEMBERSHIP_LEN     8
+#define WLAN_USER_POSITION_LEN 16
+
+/* struct ieee80211_tpc_report_ie
+ *
+ * This structure refers to "TPC Report element"
+ */
+
+struct ieee80211_tpc_report_ie
+{
+  uint8_t tx_power;
+  uint8_t link_margin;
+};
+
+#define IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK   GENMASK(2, 1)
+#define IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT  1
+#define IEEE80211_ADDBA_EXT_NO_FRAG           BIT(0)
+
+struct ieee80211_addba_ext_ie
+{
+  uint8_t data;
+};
+
+/* struct ieee80211_s1g_bcn_compat_ie
+ *
+ * S1G Beacon Compatibility element
+ */
+
+struct ieee80211_s1g_bcn_compat_ie
+{
+  uint16_t compat_info;
+  uint16_t beacon_int;
+  uint32_t tsf_completion;
+};
+
+/* struct ieee80211_s1g_oper_ie
+ *
+ * S1G Operation element
+ */
+
+struct ieee80211_s1g_oper_ie
+{
+  uint8_t ch_width;
+  uint8_t oper_class;
+  uint8_t primary_ch;
+  uint8_t oper_ch;
+  uint16_t basic_mcs_nss;
+};
+
+/* struct ieee80211_aid_response_ie
+ *
+ * AID Response element
+ */
+
+struct ieee80211_aid_response_ie
+{
+  uint16_t aid;
+  uint8_t switch_count;
+  uint16_t response_int;
+};
+
+struct ieee80211_s1g_cap
+{
+  uint8_t capab_info[10];
+  uint8_t supp_mcs_nss[5];
+};
+
+struct ieee80211_ext
+{
+  uint16_t frame_control;
+  uint16_t duration;
+  union
+    {
+      struct
+        {
+          uint8_t sa[ETH_ALEN];
+          uint32_t timestamp;
+          uint8_t change_seq;
+          uint8_t variable[0];
+        } s1g_beacon;
+      struct
+        {
+          uint8_t sa[ETH_ALEN];
+          uint32_t timestamp;
+          uint8_t change_seq;
+          uint8_t next_tbtt[3];
+          uint8_t variable[0];
+        } s1g_short_beacon;
+    } u;
+};
+
+struct ieee80211_mgmt
+{
+  uint16_t frame_control;
+  uint16_t duration;
+  uint8_t da[ETH_ALEN];
+  uint8_t sa[ETH_ALEN];
+  uint8_t bssid[ETH_ALEN];
+  uint16_t seq_ctrl;
+  union
+    {
+      struct
+        {
+          uint16_t auth_alg;
+          uint16_t auth_transaction;
+          uint16_t status_code;
+
+          /* possibly followed by Challenge text */
+
+          uint8_t variable[0];
+        } auth;
+      struct
+        {
+          uint16_t reason_code;
+        } deauth;
+      struct
+        {
+          uint16_t capab_info;
+          uint16_t listen_interval;
+
+          /* followed by SSID and Supported rates */
+
+          uint8_t variable[0];

Review comment:
       @pkarashchenko since:
   
   1. This file is controlled by 3rd party
   2. It isn't a core header file included by many place
   3. Chip which contain WiFi normally has the new version compiler
   
   Can we relax the requirement here?




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org