1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * RadioTap utility routines for WL and Apps 3*4882a593Smuzhiyun * This header file housing the define and function prototype use by 4*4882a593Smuzhiyun * both the wl driver, tools & Apps. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 9*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 10*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 11*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 12*4882a593Smuzhiyun * following added to such license: 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 15*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 16*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 17*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 18*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 19*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 20*4882a593Smuzhiyun * modifications of the software. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Dual:>> 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifndef _BCMWIFI_RADIOTAP_H_ 27*4882a593Smuzhiyun #define _BCMWIFI_RADIOTAP_H_ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #include <ieee80211_radiotap.h> 30*4882a593Smuzhiyun #include <siutils.h> 31*4882a593Smuzhiyun #include <monitor.h> 32*4882a593Smuzhiyun #include <802.11.h> 33*4882a593Smuzhiyun #include <802.11ax.h> 34*4882a593Smuzhiyun #include "bcmwifi_monitor.h" 35*4882a593Smuzhiyun #include <bcmwifi_rspec.h> 36*4882a593Smuzhiyun #include <bcmwifi_rates.h> 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* This marks the start of a packed structure section. */ 39*4882a593Smuzhiyun #include <packed_section_start.h> 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun * RadioTap header specific implementation. Used by MacOS implementation only. 42*4882a593Smuzhiyun */ 43*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_hdr { 44*4882a593Smuzhiyun struct ieee80211_radiotap_header ieee_radiotap; 45*4882a593Smuzhiyun uint64 tsft; 46*4882a593Smuzhiyun uint8 flags; 47*4882a593Smuzhiyun union { 48*4882a593Smuzhiyun uint8 rate; 49*4882a593Smuzhiyun uint8 pad; 50*4882a593Smuzhiyun } u; 51*4882a593Smuzhiyun uint16 channel_freq; 52*4882a593Smuzhiyun uint16 channel_flags; 53*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_sna { 56*4882a593Smuzhiyun uint8 signal; 57*4882a593Smuzhiyun uint8 noise; 58*4882a593Smuzhiyun uint8 antenna; 59*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_xchan { 62*4882a593Smuzhiyun uint32 xchannel_flags; 63*4882a593Smuzhiyun uint16 xchannel_freq; 64*4882a593Smuzhiyun uint8 xchannel_channel; 65*4882a593Smuzhiyun uint8 xchannel_maxpower; 66*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_ampdu { 69*4882a593Smuzhiyun uint32 ref_num; 70*4882a593Smuzhiyun uint16 flags; 71*4882a593Smuzhiyun uint8 delimiter_crc; 72*4882a593Smuzhiyun uint8 reserved; 73*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_htmcs { 76*4882a593Smuzhiyun uint8 mcs_known; 77*4882a593Smuzhiyun uint8 mcs_flags; 78*4882a593Smuzhiyun uint8 mcs_index; 79*4882a593Smuzhiyun uint8 pad; /* pad to 32 bit aligned */ 80*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_vhtmcs { 83*4882a593Smuzhiyun uint16 vht_known; /* IEEE80211_RADIOTAP_VHT */ 84*4882a593Smuzhiyun uint8 vht_flags; 85*4882a593Smuzhiyun uint8 vht_bw; 86*4882a593Smuzhiyun uint8 vht_mcs_nss[4]; 87*4882a593Smuzhiyun uint8 vht_coding; 88*4882a593Smuzhiyun uint8 vht_group_id; 89*4882a593Smuzhiyun uint16 vht_partial_aid; 90*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_ht_tail { 93*4882a593Smuzhiyun struct wl_radiotap_xchan xc; 94*4882a593Smuzhiyun struct wl_radiotap_ampdu ampdu; 95*4882a593Smuzhiyun union { 96*4882a593Smuzhiyun struct wl_htmcs ht; 97*4882a593Smuzhiyun struct wl_vhtmcs vht; 98*4882a593Smuzhiyun } u; 99*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun typedef struct bsd_header_rx { 102*4882a593Smuzhiyun struct wl_radiotap_hdr hdr; 103*4882a593Smuzhiyun /* 104*4882a593Smuzhiyun * include extra space beyond wl_radiotap_ht size 105*4882a593Smuzhiyun * (larger of two structs in union): 106*4882a593Smuzhiyun * signal/noise/ant plus max of 3 pad for xchannel 107*4882a593Smuzhiyun * tail struct (xchannel and MCS info) 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun uint8 pad[3]; 110*4882a593Smuzhiyun uint8 ht[sizeof(struct wl_radiotap_ht_tail)]; 111*4882a593Smuzhiyun } bsd_header_rx_t; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun typedef struct radiotap_parse { 114*4882a593Smuzhiyun struct ieee80211_radiotap_header *hdr; 115*4882a593Smuzhiyun void *fields; 116*4882a593Smuzhiyun uint fields_len; 117*4882a593Smuzhiyun uint idx; 118*4882a593Smuzhiyun uint offset; 119*4882a593Smuzhiyun } radiotap_parse_t; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun struct rtap_field { 122*4882a593Smuzhiyun uint len; 123*4882a593Smuzhiyun uint align; 124*4882a593Smuzhiyun }; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* he radiotap - https://www.radiotap.org/fields/HE.html */ 127*4882a593Smuzhiyun #define HE_RADIOTAP_BSS_COLOR_SHIFT 0u 128*4882a593Smuzhiyun #define HE_RADIOTAP_BEAM_CHANGE_SHIFT 6u 129*4882a593Smuzhiyun #define HE_RADIOTAP_DL_UL_SHIFT 7u 130*4882a593Smuzhiyun #define HE_RADIOTAP_MCS_SHIFT 8u 131*4882a593Smuzhiyun #define HE_RADIOTAP_DCM_SHIFT 12u 132*4882a593Smuzhiyun #define HE_RADIOTAP_CODING_SHIFT 13u 133*4882a593Smuzhiyun #define HE_RADIOTAP_LDPC_SHIFT 14u 134*4882a593Smuzhiyun #define HE_RADIOTAP_STBC_SHIFT 15u 135*4882a593Smuzhiyun #define HE_RADIOTAP_SR_SHIFT 0u 136*4882a593Smuzhiyun #define HE_RADIOTAP_STAID_SHIFT 4u 137*4882a593Smuzhiyun #define HE_RADIOTAP_SR1_SHIFT 0u 138*4882a593Smuzhiyun #define HE_RADIOTAP_SR2_SHIFT 4u 139*4882a593Smuzhiyun #define HE_RADIOTAP_SR3_SHIFT 8u 140*4882a593Smuzhiyun #define HE_RADIOTAP_SR4_SHIFT 12u 141*4882a593Smuzhiyun #define HE_RADIOTAP_BW_SHIFT 0u 142*4882a593Smuzhiyun #define HE_RADIOTAP_RU_ALLOC_SHIFT 0u 143*4882a593Smuzhiyun #define HE_RADIOTAP_GI_SHIFT 4u 144*4882a593Smuzhiyun #define HE_RADIOTAP_LTF_SIZE_SHIFT 6u 145*4882a593Smuzhiyun #define HE_RADIOTAP_NUM_LTF_SHIFT 8u 146*4882a593Smuzhiyun #define HE_RADIOTAP_PADDING_SHIFT 12u 147*4882a593Smuzhiyun #define HE_RADIOTAP_TXBF_SHIFT 14u 148*4882a593Smuzhiyun #define HE_RADIOTAP_PE_SHIFT 15u 149*4882a593Smuzhiyun #define HE_RADIOTAP_NSTS_SHIFT 0u 150*4882a593Smuzhiyun #define HE_RADIOTAP_DOPPLER_SHIFT 4u 151*4882a593Smuzhiyun #define HE_RADIOTAP_TXOP_SHIFT 8u 152*4882a593Smuzhiyun #define HE_RADIOTAP_MIDAMBLE_SHIFT 15u 153*4882a593Smuzhiyun #define HE_RADIOTAP_DOPPLER_SET_NSTS_SHIFT 0u 154*4882a593Smuzhiyun #define HE_RADIOTAP_DOPPLER_NOTSET_NSTS_SHIFT 0u 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* he mu radiotap - https://www.radiotap.org/fields/HE-MU.html */ 157*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_MCS_SHIFT 0u 158*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_MCS_KNOWN_SHIFT 4u 159*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_DCM_SHIFT 5u 160*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_DCM_KNOWN_SHIFT 6u 161*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_COMP_KNOWN_SHIFT 14u 162*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_COMP_SHIFT 3u 163*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_SYMB_SHIFT 18u 164*4882a593Smuzhiyun #define HE_RADIOTAP_BW_SIGA_SHIFT 0u 165*4882a593Smuzhiyun #define HE_RADIOTAP_BW_SIGA_KNOWN_SHIFT 2u 166*4882a593Smuzhiyun #define HE_RADIOTAP_SIGB_SYM_MU_MIMO_USER_SHIFT 4u 167*4882a593Smuzhiyun #define HE_RADIOTAP_PRE_PUNCR_SIGA_SHIFT 8u 168*4882a593Smuzhiyun #define HE_RADIOTAP_PRE_PUNCR_SIGA_KNOWN_SHIFT 10u 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define WL_RADIOTAP_BRCM_SNS 0x01 171*4882a593Smuzhiyun #define WL_RADIOTAP_BRCM_MCS 0x00000001 172*4882a593Smuzhiyun #define WL_RADIOTAP_LEGACY_SNS 0x02 173*4882a593Smuzhiyun #define WL_RADIOTAP_LEGACY_VHT 0x00000001 174*4882a593Smuzhiyun #define WL_RADIOTAP_BRCM_PAD_SNS 0x3 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define IEEE80211_RADIOTAP_HTMOD_40 0x01 177*4882a593Smuzhiyun #define IEEE80211_RADIOTAP_HTMOD_SGI 0x02 178*4882a593Smuzhiyun #define IEEE80211_RADIOTAP_HTMOD_GF 0x04 179*4882a593Smuzhiyun #define IEEE80211_RADIOTAP_HTMOD_LDPC 0x08 180*4882a593Smuzhiyun #define IEEE80211_RADIOTAP_HTMOD_STBC_MASK 0x30 181*4882a593Smuzhiyun #define IEEE80211_RADIOTAP_HTMOD_STBC_SHIFT 4 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* Dyanmic bandwidth for VHT signaled in NONHT */ 184*4882a593Smuzhiyun #define WL_RADIOTAP_F_NONHT_VHT_DYN_BW 0x01 185*4882a593Smuzhiyun /* VHT BW is valid in NONHT */ 186*4882a593Smuzhiyun #define WL_RADIOTAP_F_NONHT_VHT_BW 0x02 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun typedef struct ieee80211_radiotap_header ieee80211_radiotap_header_t; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* VHT information in non-HT frames; primarily VHT b/w signaling 191*4882a593Smuzhiyun * in frames received at legacy rates. 192*4882a593Smuzhiyun */ 193*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_nonht_vht { 194*4882a593Smuzhiyun uint8 len; /* length of the field excluding 'len' field */ 195*4882a593Smuzhiyun uint8 flags; 196*4882a593Smuzhiyun uint8 bw; 197*4882a593Smuzhiyun uint8 PAD; /* Add a pad so the next vendor entry, if any, will be 16 bit aligned */ 198*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun typedef struct wl_radiotap_nonht_vht wl_radiotap_nonht_vht_t; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_basic { 203*4882a593Smuzhiyun uint32 tsft_l; 204*4882a593Smuzhiyun uint32 tsft_h; 205*4882a593Smuzhiyun uint8 flags; 206*4882a593Smuzhiyun uint8 rate; /* this field acts as a pad for non legacy packets */ 207*4882a593Smuzhiyun uint16 channel_freq; 208*4882a593Smuzhiyun uint16 channel_flags; 209*4882a593Smuzhiyun uint8 signal; 210*4882a593Smuzhiyun uint8 noise; 211*4882a593Smuzhiyun int8 antenna; 212*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun typedef struct wl_radiotap_basic wl_radiotap_basic_t; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* radiotap standard - non-HT, non-VHT information with Broadcom vendor namespace extension 217*4882a593Smuzhiyun * that includes VHT information. 218*4882a593Smuzhiyun * Used with monitor type 3 when received by HT/Legacy PHY and received rate is legacy. 219*4882a593Smuzhiyun * Struct ieee80211_radiotap_header is of variable length due to possible 220*4882a593Smuzhiyun * extra it_present bitmap fields. 221*4882a593Smuzhiyun * It should not be included as a static length field here 222*4882a593Smuzhiyun */ 223*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_legacy { 224*4882a593Smuzhiyun wl_radiotap_basic_t basic; 225*4882a593Smuzhiyun uint8 PAD; 226*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun typedef struct wl_radiotap_legacy wl_radiotap_legacy_t; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #define WL_RADIOTAP_LEGACY_SKIP_LEN htol16(sizeof(struct wl_radiotap_legacy) - \ 231*4882a593Smuzhiyun OFFSETOF(struct wl_radiotap_legacy, nonht_vht)) 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #define WL_RADIOTAP_NONHT_VHT_LEN (sizeof(wl_radiotap_nonht_vht_t) - 1) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun /* Radiotap standard that includes HT information. This is for use with monitor type 3 236*4882a593Smuzhiyun * whenever frame is received by HT-PHY, and received rate is non-VHT. 237*4882a593Smuzhiyun * Struct ieee80211_radiotap_header is of variable length due to possible 238*4882a593Smuzhiyun * extra it_present bitmap fields. 239*4882a593Smuzhiyun * It should not be included as a static length field here 240*4882a593Smuzhiyun */ 241*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_ht { 242*4882a593Smuzhiyun wl_radiotap_basic_t basic; 243*4882a593Smuzhiyun uint8 PAD[3]; 244*4882a593Smuzhiyun uint32 xchannel_flags; 245*4882a593Smuzhiyun uint16 xchannel_freq; 246*4882a593Smuzhiyun uint8 xchannel_channel; 247*4882a593Smuzhiyun uint8 xchannel_maxpower; 248*4882a593Smuzhiyun uint8 mcs_known; 249*4882a593Smuzhiyun uint8 mcs_flags; 250*4882a593Smuzhiyun uint8 mcs_index; 251*4882a593Smuzhiyun uint8 PAD; 252*4882a593Smuzhiyun uint32 ampdu_ref_num; /* A-MPDU ID */ 253*4882a593Smuzhiyun uint16 ampdu_flags; /* A-MPDU flags */ 254*4882a593Smuzhiyun uint8 ampdu_delim_crc; /* Delimiter CRC if present in flags */ 255*4882a593Smuzhiyun uint8 ampdu_reserved; 256*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun typedef struct wl_radiotap_ht wl_radiotap_ht_t; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* Radiotap standard that includes VHT information. 261*4882a593Smuzhiyun * This is for use with monitor type 3 whenever frame is 262*4882a593Smuzhiyun * received by HT-PHY (VHT-PHY), and received rate is VHT. 263*4882a593Smuzhiyun * Struct ieee80211_radiotap_header is of variable length due to possible 264*4882a593Smuzhiyun * extra it_present bitmap fields. 265*4882a593Smuzhiyun * It should not be included as a static length field here 266*4882a593Smuzhiyun */ 267*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_vht { 268*4882a593Smuzhiyun wl_radiotap_basic_t basic; 269*4882a593Smuzhiyun uint8 PAD[3]; 270*4882a593Smuzhiyun uint32 ampdu_ref_num; /* A-MPDU ID */ 271*4882a593Smuzhiyun uint16 ampdu_flags; /* A-MPDU flags */ 272*4882a593Smuzhiyun uint8 ampdu_delim_crc; /* Delimiter CRC if present in flags */ 273*4882a593Smuzhiyun uint8 ampdu_reserved; 274*4882a593Smuzhiyun uint16 vht_known; /* IEEE80211_RADIOTAP_VHT */ 275*4882a593Smuzhiyun uint8 vht_flags; /* IEEE80211_RADIOTAP_VHT */ 276*4882a593Smuzhiyun uint8 vht_bw; /* IEEE80211_RADIOTAP_VHT */ 277*4882a593Smuzhiyun uint8 vht_mcs_nss[4]; /* IEEE80211_RADIOTAP_VHT */ 278*4882a593Smuzhiyun uint8 vht_coding; /* IEEE80211_RADIOTAP_VHT */ 279*4882a593Smuzhiyun uint8 vht_group_id; /* IEEE80211_RADIOTAP_VHT */ 280*4882a593Smuzhiyun uint16 vht_partial_aid; /* IEEE80211_RADIOTAP_VHT */ 281*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun typedef struct wl_radiotap_vht wl_radiotap_vht_t; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* Radiotap standard that includes HE information. */ 286*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct wl_radiotap_he { 287*4882a593Smuzhiyun wl_radiotap_basic_t basic; 288*4882a593Smuzhiyun uint8 PAD[3]; 289*4882a593Smuzhiyun uint32 ampdu_ref_num; /* A-MPDU ID */ 290*4882a593Smuzhiyun uint16 ampdu_flags; /* A-MPDU flags */ 291*4882a593Smuzhiyun uint8 ampdu_delim_crc; /* Delimiter CRC if present in flags */ 292*4882a593Smuzhiyun uint8 ampdu_reserved; 293*4882a593Smuzhiyun uint16 data1; 294*4882a593Smuzhiyun uint16 data2; 295*4882a593Smuzhiyun uint16 data3; 296*4882a593Smuzhiyun uint16 data4; 297*4882a593Smuzhiyun uint16 data5; 298*4882a593Smuzhiyun uint16 data6; 299*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun typedef struct wl_radiotap_he wl_radiotap_he_t; 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct radiotap_vendor_ns { 304*4882a593Smuzhiyun uint8 vend_oui[3]; 305*4882a593Smuzhiyun uint8 sns; 306*4882a593Smuzhiyun uint16 skip_len; 307*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT; 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun typedef struct radiotap_vendor_ns radiotap_vendor_ns_t; 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun #define WL_RADIOTAP_PRESENT_BASIC \ 312*4882a593Smuzhiyun ((1 << IEEE80211_RADIOTAP_TSFT) | \ 313*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_FLAGS) | \ 314*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 315*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 316*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ 317*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_ANTENNA)) 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun #define WL_RADIOTAP_PRESENT_LEGACY \ 320*4882a593Smuzhiyun WL_RADIOTAP_PRESENT_BASIC | \ 321*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_RATE) 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun #define WL_RADIOTAP_PRESENT_HT \ 324*4882a593Smuzhiyun WL_RADIOTAP_PRESENT_BASIC | \ 325*4882a593Smuzhiyun ((1 << IEEE80211_RADIOTAP_XCHANNEL) | \ 326*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_MCS) | \ 327*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_AMPDU)) 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun #define WL_RADIOTAP_PRESENT_VHT \ 330*4882a593Smuzhiyun WL_RADIOTAP_PRESENT_BASIC | \ 331*4882a593Smuzhiyun ((1 << IEEE80211_RADIOTAP_AMPDU) | \ 332*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_VHT)) 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun #define WL_RADIOTAP_PRESENT_HE \ 335*4882a593Smuzhiyun WL_RADIOTAP_PRESENT_BASIC | \ 336*4882a593Smuzhiyun ((1 << IEEE80211_RADIOTAP_AMPDU) | \ 337*4882a593Smuzhiyun (1 << IEEE80211_RADIOTAP_HE)) 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun /* include/linux/if_arp.h 340*4882a593Smuzhiyun * #define ARPHRD_IEEE80211_PRISM 802 IEEE 802.11 + Prism2 header 341*4882a593Smuzhiyun * #define ARPHRD_IEEE80211_RADIOTAP 803 IEEE 802.11 + radiotap header 342*4882a593Smuzhiyun * include/net/ieee80211_radiotap.h 343*4882a593Smuzhiyun * radiotap structure 344*4882a593Smuzhiyun */ 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun #ifndef ARPHRD_IEEE80211_RADIOTAP 347*4882a593Smuzhiyun #define ARPHRD_IEEE80211_RADIOTAP 803 348*4882a593Smuzhiyun #endif 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun /* This marks the end of a packed structure section. */ 351*4882a593Smuzhiyun #include <packed_section_end.h> 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun extern void wl_rtapParseInit(radiotap_parse_t *rtap, uint8 *rtap_header); 354*4882a593Smuzhiyun extern ratespec_t wl_calcRspecFromRTap(uint8 *rtap_header); 355*4882a593Smuzhiyun extern bool wl_rtapFlags(uint8 *rtap_header, uint8* flags); 356*4882a593Smuzhiyun extern uint wl_radiotap_rx(struct dot11_header *mac_header, wl_rxsts_t *rxsts, 357*4882a593Smuzhiyun bsd_header_rx_t *bsd_header); 358*4882a593Smuzhiyun extern uint wl_radiotap_rx_legacy(struct dot11_header *mac_header, wl_rxsts_t *rxsts, 359*4882a593Smuzhiyun ieee80211_radiotap_header_t* rtap_hdr); 360*4882a593Smuzhiyun extern uint wl_radiotap_rx_ht(struct dot11_header *mac_header, wl_rxsts_t *rxsts, 361*4882a593Smuzhiyun ieee80211_radiotap_header_t* rtap_hdr); 362*4882a593Smuzhiyun extern uint wl_radiotap_rx_vht(struct dot11_header *mac_header, wl_rxsts_t *rxsts, 363*4882a593Smuzhiyun ieee80211_radiotap_header_t* rtap_hdr); 364*4882a593Smuzhiyun extern uint wl_radiotap_rx_he(struct dot11_header *mac_header, wl_rxsts_t *rxsts, 365*4882a593Smuzhiyun ieee80211_radiotap_header_t* rtap_hdr); 366*4882a593Smuzhiyun extern uint wl_radiotap_rx_eht(struct dot11_header *mac_header, wl_rxsts_t *rxsts, 367*4882a593Smuzhiyun ieee80211_radiotap_header_t *rtap_hdr); 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun /* Legacy phy radiotap header may include VHT bw signaling VS element */ 370*4882a593Smuzhiyun #define MAX_RADIOTAP_LEGACY_SIZE (sizeof(wl_radiotap_legacy_t) + \ 371*4882a593Smuzhiyun sizeof(radiotap_vendor_ns_t) + sizeof(wl_radiotap_nonht_vht_t)) 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun /* RadioTap header starts with a fixed struct ieee80211_radiotap_header, 374*4882a593Smuzhiyun * followed by variable fields for the 4 encodings supported, HE, VHT, HT, and Legacy 375*4882a593Smuzhiyun */ 376*4882a593Smuzhiyun #define MAX_RADIOTAP_SIZE (sizeof(struct ieee80211_radiotap_header) + \ 377*4882a593Smuzhiyun MAX(sizeof(wl_radiotap_he_t), \ 378*4882a593Smuzhiyun MAX(sizeof(wl_radiotap_vht_t), \ 379*4882a593Smuzhiyun MAX(sizeof(wl_radiotap_ht_t), MAX_RADIOTAP_LEGACY_SIZE)))) 380*4882a593Smuzhiyun #define MAX_MON_PKT_SIZE (4096 + MAX_RADIOTAP_SIZE) 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun #endif /* _BCMWIFI_RADIOTAP_H_ */ 383