xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/bcmwifi_radiotap.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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