Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (c) 2017       Intel Deutschland GmbH
0003  * Copyright (c) 2018-2019, 2021 Intel Corporation
0004  *
0005  * Permission to use, copy, modify, and/or distribute this software for any
0006  * purpose with or without fee is hereby granted, provided that the above
0007  * copyright notice and this permission notice appear in all copies.
0008  *
0009  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0010  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0011  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0012  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0013  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0014  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0015  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0016  */
0017 #ifndef __RADIOTAP_H
0018 #define __RADIOTAP_H
0019 
0020 #include <linux/kernel.h>
0021 #include <asm/unaligned.h>
0022 
0023 /**
0024  * struct ieee82011_radiotap_header - base radiotap header
0025  */
0026 struct ieee80211_radiotap_header {
0027     /**
0028      * @it_version: radiotap version, always 0
0029      */
0030     uint8_t it_version;
0031 
0032     /**
0033      * @it_pad: padding (or alignment)
0034      */
0035     uint8_t it_pad;
0036 
0037     /**
0038      * @it_len: overall radiotap header length
0039      */
0040     __le16 it_len;
0041 
0042     /**
0043      * @it_present: (first) present word
0044      */
0045     __le32 it_present;
0046 
0047     /**
0048      * @it_optional: all remaining presence bitmaps
0049      */
0050     __le32 it_optional[];
0051 } __packed;
0052 
0053 /* version is always 0 */
0054 #define PKTHDR_RADIOTAP_VERSION 0
0055 
0056 /* see the radiotap website for the descriptions */
0057 enum ieee80211_radiotap_presence {
0058     IEEE80211_RADIOTAP_TSFT = 0,
0059     IEEE80211_RADIOTAP_FLAGS = 1,
0060     IEEE80211_RADIOTAP_RATE = 2,
0061     IEEE80211_RADIOTAP_CHANNEL = 3,
0062     IEEE80211_RADIOTAP_FHSS = 4,
0063     IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
0064     IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
0065     IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
0066     IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
0067     IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
0068     IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
0069     IEEE80211_RADIOTAP_ANTENNA = 11,
0070     IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
0071     IEEE80211_RADIOTAP_DB_ANTNOISE = 13,
0072     IEEE80211_RADIOTAP_RX_FLAGS = 14,
0073     IEEE80211_RADIOTAP_TX_FLAGS = 15,
0074     IEEE80211_RADIOTAP_RTS_RETRIES = 16,
0075     IEEE80211_RADIOTAP_DATA_RETRIES = 17,
0076     /* 18 is XChannel, but it's not defined yet */
0077     IEEE80211_RADIOTAP_MCS = 19,
0078     IEEE80211_RADIOTAP_AMPDU_STATUS = 20,
0079     IEEE80211_RADIOTAP_VHT = 21,
0080     IEEE80211_RADIOTAP_TIMESTAMP = 22,
0081     IEEE80211_RADIOTAP_HE = 23,
0082     IEEE80211_RADIOTAP_HE_MU = 24,
0083     IEEE80211_RADIOTAP_ZERO_LEN_PSDU = 26,
0084     IEEE80211_RADIOTAP_LSIG = 27,
0085 
0086     /* valid in every it_present bitmap, even vendor namespaces */
0087     IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
0088     IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30,
0089     IEEE80211_RADIOTAP_EXT = 31
0090 };
0091 
0092 /* for IEEE80211_RADIOTAP_FLAGS */
0093 enum ieee80211_radiotap_flags {
0094     IEEE80211_RADIOTAP_F_CFP = 0x01,
0095     IEEE80211_RADIOTAP_F_SHORTPRE = 0x02,
0096     IEEE80211_RADIOTAP_F_WEP = 0x04,
0097     IEEE80211_RADIOTAP_F_FRAG = 0x08,
0098     IEEE80211_RADIOTAP_F_FCS = 0x10,
0099     IEEE80211_RADIOTAP_F_DATAPAD = 0x20,
0100     IEEE80211_RADIOTAP_F_BADFCS = 0x40,
0101 };
0102 
0103 /* for IEEE80211_RADIOTAP_CHANNEL */
0104 enum ieee80211_radiotap_channel_flags {
0105     IEEE80211_CHAN_CCK = 0x0020,
0106     IEEE80211_CHAN_OFDM = 0x0040,
0107     IEEE80211_CHAN_2GHZ = 0x0080,
0108     IEEE80211_CHAN_5GHZ = 0x0100,
0109     IEEE80211_CHAN_DYN = 0x0400,
0110     IEEE80211_CHAN_HALF = 0x4000,
0111     IEEE80211_CHAN_QUARTER = 0x8000,
0112 };
0113 
0114 /* for IEEE80211_RADIOTAP_RX_FLAGS */
0115 enum ieee80211_radiotap_rx_flags {
0116     IEEE80211_RADIOTAP_F_RX_BADPLCP = 0x0002,
0117 };
0118 
0119 /* for IEEE80211_RADIOTAP_TX_FLAGS */
0120 enum ieee80211_radiotap_tx_flags {
0121     IEEE80211_RADIOTAP_F_TX_FAIL = 0x0001,
0122     IEEE80211_RADIOTAP_F_TX_CTS = 0x0002,
0123     IEEE80211_RADIOTAP_F_TX_RTS = 0x0004,
0124     IEEE80211_RADIOTAP_F_TX_NOACK = 0x0008,
0125     IEEE80211_RADIOTAP_F_TX_NOSEQNO = 0x0010,
0126     IEEE80211_RADIOTAP_F_TX_ORDER = 0x0020,
0127 };
0128 
0129 /* for IEEE80211_RADIOTAP_MCS "have" flags */
0130 enum ieee80211_radiotap_mcs_have {
0131     IEEE80211_RADIOTAP_MCS_HAVE_BW = 0x01,
0132     IEEE80211_RADIOTAP_MCS_HAVE_MCS = 0x02,
0133     IEEE80211_RADIOTAP_MCS_HAVE_GI = 0x04,
0134     IEEE80211_RADIOTAP_MCS_HAVE_FMT = 0x08,
0135     IEEE80211_RADIOTAP_MCS_HAVE_FEC = 0x10,
0136     IEEE80211_RADIOTAP_MCS_HAVE_STBC = 0x20,
0137 };
0138 
0139 enum ieee80211_radiotap_mcs_flags {
0140     IEEE80211_RADIOTAP_MCS_BW_MASK = 0x03,
0141     IEEE80211_RADIOTAP_MCS_BW_20 = 0,
0142     IEEE80211_RADIOTAP_MCS_BW_40 = 1,
0143     IEEE80211_RADIOTAP_MCS_BW_20L = 2,
0144     IEEE80211_RADIOTAP_MCS_BW_20U = 3,
0145 
0146     IEEE80211_RADIOTAP_MCS_SGI = 0x04,
0147     IEEE80211_RADIOTAP_MCS_FMT_GF = 0x08,
0148     IEEE80211_RADIOTAP_MCS_FEC_LDPC = 0x10,
0149     IEEE80211_RADIOTAP_MCS_STBC_MASK = 0x60,
0150     IEEE80211_RADIOTAP_MCS_STBC_1 = 1,
0151     IEEE80211_RADIOTAP_MCS_STBC_2 = 2,
0152     IEEE80211_RADIOTAP_MCS_STBC_3 = 3,
0153     IEEE80211_RADIOTAP_MCS_STBC_SHIFT = 5,
0154 };
0155 
0156 /* for IEEE80211_RADIOTAP_AMPDU_STATUS */
0157 enum ieee80211_radiotap_ampdu_flags {
0158     IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN = 0x0001,
0159     IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN = 0x0002,
0160     IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN = 0x0004,
0161     IEEE80211_RADIOTAP_AMPDU_IS_LAST = 0x0008,
0162     IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR = 0x0010,
0163     IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN = 0x0020,
0164     IEEE80211_RADIOTAP_AMPDU_EOF = 0x0040,
0165     IEEE80211_RADIOTAP_AMPDU_EOF_KNOWN = 0x0080,
0166 };
0167 
0168 /* for IEEE80211_RADIOTAP_VHT */
0169 enum ieee80211_radiotap_vht_known {
0170     IEEE80211_RADIOTAP_VHT_KNOWN_STBC = 0x0001,
0171     IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA = 0x0002,
0172     IEEE80211_RADIOTAP_VHT_KNOWN_GI = 0x0004,
0173     IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS = 0x0008,
0174     IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM = 0x0010,
0175     IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED = 0x0020,
0176     IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH = 0x0040,
0177     IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID = 0x0080,
0178     IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID = 0x0100,
0179 };
0180 
0181 enum ieee80211_radiotap_vht_flags {
0182     IEEE80211_RADIOTAP_VHT_FLAG_STBC = 0x01,
0183     IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA = 0x02,
0184     IEEE80211_RADIOTAP_VHT_FLAG_SGI = 0x04,
0185     IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 = 0x08,
0186     IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM = 0x10,
0187     IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED = 0x20,
0188 };
0189 
0190 enum ieee80211_radiotap_vht_coding {
0191     IEEE80211_RADIOTAP_CODING_LDPC_USER0 = 0x01,
0192     IEEE80211_RADIOTAP_CODING_LDPC_USER1 = 0x02,
0193     IEEE80211_RADIOTAP_CODING_LDPC_USER2 = 0x04,
0194     IEEE80211_RADIOTAP_CODING_LDPC_USER3 = 0x08,
0195 };
0196 
0197 /* for IEEE80211_RADIOTAP_TIMESTAMP */
0198 enum ieee80211_radiotap_timestamp_unit_spos {
0199     IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MASK = 0x000F,
0200     IEEE80211_RADIOTAP_TIMESTAMP_UNIT_MS = 0x0000,
0201     IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US = 0x0001,
0202     IEEE80211_RADIOTAP_TIMESTAMP_UNIT_NS = 0x0003,
0203     IEEE80211_RADIOTAP_TIMESTAMP_SPOS_MASK = 0x00F0,
0204     IEEE80211_RADIOTAP_TIMESTAMP_SPOS_BEGIN_MDPU = 0x0000,
0205     IEEE80211_RADIOTAP_TIMESTAMP_SPOS_PLCP_SIG_ACQ = 0x0010,
0206     IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_PPDU = 0x0020,
0207     IEEE80211_RADIOTAP_TIMESTAMP_SPOS_EO_MPDU = 0x0030,
0208     IEEE80211_RADIOTAP_TIMESTAMP_SPOS_UNKNOWN = 0x00F0,
0209 };
0210 
0211 enum ieee80211_radiotap_timestamp_flags {
0212     IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT = 0x00,
0213     IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT = 0x01,
0214     IEEE80211_RADIOTAP_TIMESTAMP_FLAG_ACCURACY = 0x02,
0215 };
0216 
0217 struct ieee80211_radiotap_he {
0218     __le16 data1, data2, data3, data4, data5, data6;
0219 };
0220 
0221 enum ieee80211_radiotap_he_bits {
0222     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MASK     = 3,
0223     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_SU       = 0,
0224     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_EXT_SU   = 1,
0225     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_MU       = 2,
0226     IEEE80211_RADIOTAP_HE_DATA1_FORMAT_TRIG     = 3,
0227 
0228     IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN = 0x0004,
0229     IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN   = 0x0008,
0230     IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN     = 0x0010,
0231     IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN  = 0x0020,
0232     IEEE80211_RADIOTAP_HE_DATA1_DATA_DCM_KNOWN  = 0x0040,
0233     IEEE80211_RADIOTAP_HE_DATA1_CODING_KNOWN    = 0x0080,
0234     IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN  = 0x0100,
0235     IEEE80211_RADIOTAP_HE_DATA1_STBC_KNOWN      = 0x0200,
0236     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN    = 0x0400,
0237     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE2_KNOWN   = 0x0800,
0238     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE3_KNOWN   = 0x1000,
0239     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE4_KNOWN   = 0x2000,
0240     IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN   = 0x4000,
0241     IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN   = 0x8000,
0242 
0243     IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_KNOWN = 0x0001,
0244     IEEE80211_RADIOTAP_HE_DATA2_GI_KNOWN        = 0x0002,
0245     IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN  = 0x0004,
0246     IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN   = 0x0008,
0247     IEEE80211_RADIOTAP_HE_DATA2_TXBF_KNOWN      = 0x0010,
0248     IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN   = 0x0020,
0249     IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN      = 0x0040,
0250     IEEE80211_RADIOTAP_HE_DATA2_MIDAMBLE_KNOWN  = 0x0080,
0251     IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET       = 0x3f00,
0252     IEEE80211_RADIOTAP_HE_DATA2_RU_OFFSET_KNOWN = 0x4000,
0253     IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC   = 0x8000,
0254 
0255     IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR       = 0x003f,
0256     IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE     = 0x0040,
0257     IEEE80211_RADIOTAP_HE_DATA3_UL_DL       = 0x0080,
0258     IEEE80211_RADIOTAP_HE_DATA3_DATA_MCS        = 0x0f00,
0259     IEEE80211_RADIOTAP_HE_DATA3_DATA_DCM        = 0x1000,
0260     IEEE80211_RADIOTAP_HE_DATA3_CODING      = 0x2000,
0261     IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG    = 0x4000,
0262     IEEE80211_RADIOTAP_HE_DATA3_STBC        = 0x8000,
0263 
0264     IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE    = 0x000f,
0265     IEEE80211_RADIOTAP_HE_DATA4_MU_STA_ID       = 0x7ff0,
0266     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1  = 0x000f,
0267     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2  = 0x00f0,
0268     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3  = 0x0f00,
0269     IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE4  = 0xf000,
0270 
0271     IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC    = 0x000f,
0272         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_20MHZ  = 0,
0273         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_40MHZ  = 1,
0274         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_80MHZ  = 2,
0275         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_160MHZ = 3,
0276         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_26T    = 4,
0277         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_52T    = 5,
0278         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_106T   = 6,
0279         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_242T   = 7,
0280         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_484T   = 8,
0281         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_996T   = 9,
0282         IEEE80211_RADIOTAP_HE_DATA5_DATA_BW_RU_ALLOC_2x996T = 10,
0283 
0284     IEEE80211_RADIOTAP_HE_DATA5_GI          = 0x0030,
0285         IEEE80211_RADIOTAP_HE_DATA5_GI_0_8          = 0,
0286         IEEE80211_RADIOTAP_HE_DATA5_GI_1_6          = 1,
0287         IEEE80211_RADIOTAP_HE_DATA5_GI_3_2          = 2,
0288 
0289     IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE        = 0x00c0,
0290         IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_UNKNOWN        = 0,
0291         IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_1X         = 1,
0292         IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_2X         = 2,
0293         IEEE80211_RADIOTAP_HE_DATA5_LTF_SIZE_4X         = 3,
0294     IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS    = 0x0700,
0295     IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD     = 0x3000,
0296     IEEE80211_RADIOTAP_HE_DATA5_TXBF        = 0x4000,
0297     IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG     = 0x8000,
0298 
0299     IEEE80211_RADIOTAP_HE_DATA6_NSTS        = 0x000f,
0300     IEEE80211_RADIOTAP_HE_DATA6_DOPPLER     = 0x0010,
0301     IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN    = 0x0020,
0302     IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW      = 0x00c0,
0303         IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_20MHZ    = 0,
0304         IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_40MHZ    = 1,
0305         IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_80MHZ    = 2,
0306         IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_160MHZ   = 3,
0307     IEEE80211_RADIOTAP_HE_DATA6_TXOP        = 0x7f00,
0308     IEEE80211_RADIOTAP_HE_DATA6_MIDAMBLE_PDCTY  = 0x8000,
0309 };
0310 
0311 struct ieee80211_radiotap_he_mu {
0312     __le16 flags1, flags2;
0313     u8 ru_ch1[4];
0314     u8 ru_ch2[4];
0315 };
0316 
0317 enum ieee80211_radiotap_he_mu_bits {
0318     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS       = 0x000f,
0319     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_MCS_KNOWN     = 0x0010,
0320     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM       = 0x0020,
0321     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_DCM_KNOWN     = 0x0040,
0322     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_CTR_26T_RU_KNOWN    = 0x0080,
0323     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_RU_KNOWN        = 0x0100,
0324     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH2_RU_KNOWN        = 0x0200,
0325     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU_KNOWN    = 0x1000,
0326     IEEE80211_RADIOTAP_HE_MU_FLAGS1_CH1_CTR_26T_RU      = 0x2000,
0327     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_COMP_KNOWN    = 0x4000,
0328     IEEE80211_RADIOTAP_HE_MU_FLAGS1_SIG_B_SYMS_USERS_KNOWN  = 0x8000,
0329 
0330     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW    = 0x0003,
0331         IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_20MHZ  = 0x0000,
0332         IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_40MHZ  = 0x0001,
0333         IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_80MHZ  = 0x0002,
0334         IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_160MHZ = 0x0003,
0335     IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_KNOWN  = 0x0004,
0336     IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_COMP      = 0x0008,
0337     IEEE80211_RADIOTAP_HE_MU_FLAGS2_SIG_B_SYMS_USERS    = 0x00f0,
0338     IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW  = 0x0300,
0339     IEEE80211_RADIOTAP_HE_MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN= 0x0400,
0340     IEEE80211_RADIOTAP_HE_MU_FLAGS2_CH2_CTR_26T_RU      = 0x0800,
0341 };
0342 
0343 enum ieee80211_radiotap_lsig_data1 {
0344     IEEE80211_RADIOTAP_LSIG_DATA1_RATE_KNOWN        = 0x0001,
0345     IEEE80211_RADIOTAP_LSIG_DATA1_LENGTH_KNOWN      = 0x0002,
0346 };
0347 
0348 enum ieee80211_radiotap_lsig_data2 {
0349     IEEE80211_RADIOTAP_LSIG_DATA2_RATE          = 0x000f,
0350     IEEE80211_RADIOTAP_LSIG_DATA2_LENGTH            = 0xfff0,
0351 };
0352 
0353 struct ieee80211_radiotap_lsig {
0354     __le16 data1, data2;
0355 };
0356 
0357 enum ieee80211_radiotap_zero_len_psdu_type {
0358     IEEE80211_RADIOTAP_ZERO_LEN_PSDU_SOUNDING       = 0,
0359     IEEE80211_RADIOTAP_ZERO_LEN_PSDU_NOT_CAPTURED       = 1,
0360     IEEE80211_RADIOTAP_ZERO_LEN_PSDU_VENDOR         = 0xff,
0361 };
0362 
0363 /**
0364  * ieee80211_get_radiotap_len - get radiotap header length
0365  */
0366 static inline u16 ieee80211_get_radiotap_len(const char *data)
0367 {
0368     const struct ieee80211_radiotap_header *hdr = (const void *)data;
0369 
0370     return get_unaligned_le16(&hdr->it_len);
0371 }
0372 
0373 #endif /* __RADIOTAP_H */