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