xref: /wlan-driver/qca-wifi-host-cmn/umac/scan/dispatcher/inc/wlan_scan_utils_api.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /*
21*5113495bSYour Name  * DOC: contains scan public utility functions
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #ifndef _WLAN_SCAN_UTILS_H_
25*5113495bSYour Name #define _WLAN_SCAN_UTILS_H_
26*5113495bSYour Name 
27*5113495bSYour Name #include <wlan_objmgr_cmn.h>
28*5113495bSYour Name #include <qdf_mc_timer.h>
29*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
30*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
31*5113495bSYour Name #include <wlan_objmgr_vdev_obj.h>
32*5113495bSYour Name #include <wlan_scan_public_structs.h>
33*5113495bSYour Name #include<wlan_mgmt_txrx_utils_api.h>
34*5113495bSYour Name #include <wlan_reg_services_api.h>
35*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
36*5113495bSYour Name #include "wlan_mlo_mgr_public_structs.h"
37*5113495bSYour Name #endif
38*5113495bSYour Name 
39*5113495bSYour Name #define ASCII_SPACE_CHARACTER 32
40*5113495bSYour Name 
41*5113495bSYour Name /**
42*5113495bSYour Name  * util_is_scan_entry_match() - func to check if both scan entry
43*5113495bSYour Name  * are from same AP
44*5113495bSYour Name  * @entry1: scan entry 1
45*5113495bSYour Name  * @entry2: scan entry 2
46*5113495bSYour Name  *
47*5113495bSYour Name  * match the two scan entries
48*5113495bSYour Name  *
49*5113495bSYour Name  * Return: true if entry match else false.
50*5113495bSYour Name  */
51*5113495bSYour Name bool util_is_scan_entry_match(
52*5113495bSYour Name 	struct scan_cache_entry *entry1,
53*5113495bSYour Name 	struct scan_cache_entry *entry2);
54*5113495bSYour Name 
55*5113495bSYour Name /**
56*5113495bSYour Name  * util_scan_unpack_beacon_frame() - func to unpack beacon frame to scan entry
57*5113495bSYour Name  * @pdev: pdev pointer
58*5113495bSYour Name  * @frame: beacon/probe frame
59*5113495bSYour Name  * @frame_len: beacon frame len
60*5113495bSYour Name  * @frm_subtype: beacon or probe
61*5113495bSYour Name  * @rx_param: rx meta data
62*5113495bSYour Name  *
63*5113495bSYour Name  * get the defaults scan params
64*5113495bSYour Name  *
65*5113495bSYour Name  * Return: unpacked list of scan entries.
66*5113495bSYour Name  */
67*5113495bSYour Name qdf_list_t *util_scan_unpack_beacon_frame(
68*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev,
69*5113495bSYour Name 	uint8_t *frame, qdf_size_t frame_len, uint32_t frm_subtype,
70*5113495bSYour Name 	struct mgmt_rx_event_params *rx_param);
71*5113495bSYour Name 
72*5113495bSYour Name /**
73*5113495bSYour Name  * util_scan_add_hidden_ssid() - func to add hidden ssid
74*5113495bSYour Name  * @pdev: pdev pointer
75*5113495bSYour Name  * @bcnbuf: beacon buf
76*5113495bSYour Name  *
77*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success, otherwise a QDF_STATUS error
78*5113495bSYour Name  */
79*5113495bSYour Name #ifdef WLAN_DFS_CHAN_HIDDEN_SSID
80*5113495bSYour Name QDF_STATUS
81*5113495bSYour Name util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf);
82*5113495bSYour Name #else
83*5113495bSYour Name static inline QDF_STATUS
util_scan_add_hidden_ssid(struct wlan_objmgr_pdev * pdev,qdf_nbuf_t bcnbuf)84*5113495bSYour Name util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf)
85*5113495bSYour Name {
86*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
87*5113495bSYour Name }
88*5113495bSYour Name #endif /* WLAN_DFS_CHAN_HIDDEN_SSID */
89*5113495bSYour Name 
90*5113495bSYour Name /**
91*5113495bSYour Name  * util_scan_get_ev_type_name() - converts enum event to printable string
92*5113495bSYour Name  * @event:      event of type scan_event_type
93*5113495bSYour Name  *
94*5113495bSYour Name  * API, converts enum event to printable character string
95*5113495bSYour Name  *
96*5113495bSYour Name  * Return:      pointer to printable string
97*5113495bSYour Name  */
98*5113495bSYour Name const char *util_scan_get_ev_type_name(enum scan_event_type event);
99*5113495bSYour Name 
100*5113495bSYour Name /**
101*5113495bSYour Name  * util_scan_get_ev_reason_name() - converts enum reason to printable string
102*5113495bSYour Name  * @reason: enum of scan completion reason
103*5113495bSYour Name  *
104*5113495bSYour Name  * API, converts enum event to printable character string
105*5113495bSYour Name  *
106*5113495bSYour Name  * Return:      pointer to printable string
107*5113495bSYour Name  */
108*5113495bSYour Name const char *util_scan_get_ev_reason_name(enum scan_completion_reason reason);
109*5113495bSYour Name 
110*5113495bSYour Name /**
111*5113495bSYour Name  * util_scan_entry_macaddr() - function to read transmitter address
112*5113495bSYour Name  * @scan_entry: scan entry
113*5113495bSYour Name  *
114*5113495bSYour Name  * API, function to read transmitter address of scan entry
115*5113495bSYour Name  *
116*5113495bSYour Name  * Return:      pointer to mac address
117*5113495bSYour Name  */
118*5113495bSYour Name static inline uint8_t*
util_scan_entry_macaddr(struct scan_cache_entry * scan_entry)119*5113495bSYour Name util_scan_entry_macaddr(struct scan_cache_entry *scan_entry)
120*5113495bSYour Name {
121*5113495bSYour Name 	return &(scan_entry->mac_addr.bytes[0]);
122*5113495bSYour Name }
123*5113495bSYour Name 
124*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
125*5113495bSYour Name /**
126*5113495bSYour Name  * util_scan_entry_mldaddr() - Function to get MLD address
127*5113495bSYour Name  * @scan_entry: Scan entry
128*5113495bSYour Name  *
129*5113495bSYour Name  * API will return the MLD address of the scan entry.
130*5113495bSYour Name  *
131*5113495bSYour Name  * Return: Pointer to MLD address.
132*5113495bSYour Name  */
133*5113495bSYour Name 
134*5113495bSYour Name static inline struct qdf_mac_addr *
util_scan_entry_mldaddr(struct scan_cache_entry * scan_entry)135*5113495bSYour Name util_scan_entry_mldaddr(struct scan_cache_entry *scan_entry)
136*5113495bSYour Name {
137*5113495bSYour Name 	struct qdf_mac_addr *mld_addr = &scan_entry->ml_info.mld_mac_addr;
138*5113495bSYour Name 
139*5113495bSYour Name 	if (qdf_is_macaddr_zero(mld_addr))
140*5113495bSYour Name 		return NULL;
141*5113495bSYour Name 
142*5113495bSYour Name 	return mld_addr;
143*5113495bSYour Name }
144*5113495bSYour Name #else
145*5113495bSYour Name static inline struct qdf_mac_addr *
util_scan_entry_mldaddr(struct scan_cache_entry * scan_entry)146*5113495bSYour Name util_scan_entry_mldaddr(struct scan_cache_entry *scan_entry)
147*5113495bSYour Name {
148*5113495bSYour Name 	return NULL;
149*5113495bSYour Name }
150*5113495bSYour Name #endif
151*5113495bSYour Name 
152*5113495bSYour Name /**
153*5113495bSYour Name  * util_scan_entry_bssid() - function to read bssid
154*5113495bSYour Name  * @scan_entry: scan entry
155*5113495bSYour Name  *
156*5113495bSYour Name  * API, function to read bssid of scan entry
157*5113495bSYour Name  *
158*5113495bSYour Name  * Return: pointer to mac address
159*5113495bSYour Name  */
160*5113495bSYour Name static inline uint8_t*
util_scan_entry_bssid(struct scan_cache_entry * scan_entry)161*5113495bSYour Name util_scan_entry_bssid(struct scan_cache_entry *scan_entry)
162*5113495bSYour Name {
163*5113495bSYour Name 	return &(scan_entry->bssid.bytes[0]);
164*5113495bSYour Name }
165*5113495bSYour Name 
166*5113495bSYour Name /**
167*5113495bSYour Name  * util_scan_entry_capinfo() - function to read capibility info
168*5113495bSYour Name  * @scan_entry: scan entry
169*5113495bSYour Name  *
170*5113495bSYour Name  * API, function to read capibility info of scan entry
171*5113495bSYour Name  *
172*5113495bSYour Name  * Return: capability info
173*5113495bSYour Name  */
174*5113495bSYour Name static inline union wlan_capability
util_scan_entry_capinfo(struct scan_cache_entry * scan_entry)175*5113495bSYour Name util_scan_entry_capinfo(struct scan_cache_entry *scan_entry)
176*5113495bSYour Name {
177*5113495bSYour Name 	return scan_entry->cap_info;
178*5113495bSYour Name }
179*5113495bSYour Name 
180*5113495bSYour Name /**
181*5113495bSYour Name  * util_scan_entry_beacon_interval() - function to read beacon interval
182*5113495bSYour Name  * @scan_entry: scan entry
183*5113495bSYour Name  *
184*5113495bSYour Name  * API, function to read beacon interval of scan entry
185*5113495bSYour Name  *
186*5113495bSYour Name  * Return: beacon interval
187*5113495bSYour Name  */
188*5113495bSYour Name static inline uint16_t
util_scan_entry_beacon_interval(struct scan_cache_entry * scan_entry)189*5113495bSYour Name util_scan_entry_beacon_interval(struct scan_cache_entry *scan_entry)
190*5113495bSYour Name {
191*5113495bSYour Name 	return scan_entry->bcn_int;
192*5113495bSYour Name }
193*5113495bSYour Name 
194*5113495bSYour Name /**
195*5113495bSYour Name  * util_scan_entry_sequence_number() - function to read sequence number
196*5113495bSYour Name  * @scan_entry: scan entry
197*5113495bSYour Name  *
198*5113495bSYour Name  * API, function to read sequence number of scan entry
199*5113495bSYour Name  *
200*5113495bSYour Name  * Return: sequence number
201*5113495bSYour Name  */
202*5113495bSYour Name static inline uint16_t
util_scan_entry_sequence_number(struct scan_cache_entry * scan_entry)203*5113495bSYour Name util_scan_entry_sequence_number(struct scan_cache_entry *scan_entry)
204*5113495bSYour Name {
205*5113495bSYour Name 	return scan_entry->seq_num;
206*5113495bSYour Name }
207*5113495bSYour Name 
208*5113495bSYour Name /**
209*5113495bSYour Name  * util_scan_entry_tsf() - function to read tsf
210*5113495bSYour Name  * @scan_entry: scan entry
211*5113495bSYour Name  *
212*5113495bSYour Name  * API, function to read tsf of scan entry
213*5113495bSYour Name  *
214*5113495bSYour Name  * Return: tsf
215*5113495bSYour Name  */
216*5113495bSYour Name static inline uint8_t*
util_scan_entry_tsf(struct scan_cache_entry * scan_entry)217*5113495bSYour Name util_scan_entry_tsf(struct scan_cache_entry *scan_entry)
218*5113495bSYour Name {
219*5113495bSYour Name 	return scan_entry->tsf_info.data;
220*5113495bSYour Name }
221*5113495bSYour Name 
222*5113495bSYour Name /**
223*5113495bSYour Name  * util_scan_entry_reset_timestamp() - function to reset bcn receive timestamp
224*5113495bSYour Name  * @scan_entry: scan entry
225*5113495bSYour Name  *
226*5113495bSYour Name  * API, function to reset bcn receive timestamp of scan entry
227*5113495bSYour Name  *
228*5113495bSYour Name  * Return: void
229*5113495bSYour Name  */
230*5113495bSYour Name static inline void
util_scan_entry_reset_timestamp(struct scan_cache_entry * scan_entry)231*5113495bSYour Name util_scan_entry_reset_timestamp(struct scan_cache_entry *scan_entry)
232*5113495bSYour Name {
233*5113495bSYour Name 	scan_entry->scan_entry_time = 0;
234*5113495bSYour Name }
235*5113495bSYour Name 
236*5113495bSYour Name /*
237*5113495bSYour Name  * Macros used for RSSI calculation.
238*5113495bSYour Name  */
239*5113495bSYour Name #define WLAN_RSSI_AVERAGING_TIME (5 * 1000) /* 5 seconds */
240*5113495bSYour Name 
241*5113495bSYour Name #define WLAN_RSSI_EP_MULTIPLIER (1<<7)  /* pow2 to optimize out * and / */
242*5113495bSYour Name 
243*5113495bSYour Name #define WLAN_RSSI_LPF_LEN       0
244*5113495bSYour Name #define WLAN_RSSI_DUMMY_MARKER  0x127
245*5113495bSYour Name 
246*5113495bSYour Name #define WLAN_EP_MUL(x, mul) ((x) * (mul))
247*5113495bSYour Name 
248*5113495bSYour Name #define WLAN_EP_RND(x, mul) ((((x)%(mul)) >= ((mul)/2)) ?\
249*5113495bSYour Name 	((x) + ((mul) - 1)) / (mul) : (x)/(mul))
250*5113495bSYour Name 
251*5113495bSYour Name #define WLAN_RSSI_GET(x) WLAN_EP_RND(x, WLAN_RSSI_EP_MULTIPLIER)
252*5113495bSYour Name 
253*5113495bSYour Name #define RSSI_LPF_THRESHOLD      -20
254*5113495bSYour Name 
255*5113495bSYour Name 
256*5113495bSYour Name #define WLAN_RSSI_OUT(x) (((x) != WLAN_RSSI_DUMMY_MARKER) ?     \
257*5113495bSYour Name 	(WLAN_EP_RND((x), WLAN_RSSI_EP_MULTIPLIER)) :  WLAN_RSSI_DUMMY_MARKER)
258*5113495bSYour Name 
259*5113495bSYour Name 
260*5113495bSYour Name #define WLAN_RSSI_IN(x)         (WLAN_EP_MUL((x), WLAN_RSSI_EP_MULTIPLIER))
261*5113495bSYour Name 
262*5113495bSYour Name #define WLAN_LPF_RSSI(x, y, len) \
263*5113495bSYour Name 	((x != WLAN_RSSI_DUMMY_MARKER) ? ((((x) << 3) + (y) - (x)) >> 3) : (y))
264*5113495bSYour Name 
265*5113495bSYour Name #define WLAN_RSSI_LPF(x, y) do { \
266*5113495bSYour Name 	if ((y) < RSSI_LPF_THRESHOLD) \
267*5113495bSYour Name 		x = WLAN_LPF_RSSI((x), WLAN_RSSI_IN((y)), WLAN_RSSI_LPF_LEN); \
268*5113495bSYour Name 	} while (0)
269*5113495bSYour Name 
270*5113495bSYour Name #define WLAN_ABS_RSSI_LPF(x, y) do { \
271*5113495bSYour Name 	if ((y) >= (RSSI_LPF_THRESHOLD + WLAN_DEFAULT_NOISE_FLOOR)) \
272*5113495bSYour Name 		x = WLAN_LPF_RSSI((x), WLAN_RSSI_IN((y)), WLAN_RSSI_LPF_LEN); \
273*5113495bSYour Name 	} while (0)
274*5113495bSYour Name 
275*5113495bSYour Name #define WLAN_SNR_EP_MULTIPLIER BIT(7) /* pow2 to optimize out * and / */
276*5113495bSYour Name #define WLAN_SNR_DUMMY_MARKER  127
277*5113495bSYour Name #define SNR_LPF_THRESHOLD      0
278*5113495bSYour Name #define WLAN_SNR_LPF_LEN       10
279*5113495bSYour Name 
280*5113495bSYour Name #define WLAN_SNR_OUT(x) (((x) != WLAN_SNR_DUMMY_MARKER) ?     \
281*5113495bSYour Name 	(WLAN_EP_RND((x), WLAN_SNR_EP_MULTIPLIER)) :  WLAN_SNR_DUMMY_MARKER)
282*5113495bSYour Name 
283*5113495bSYour Name #define WLAN_SNR_IN(x)         (WLAN_EP_MUL((x), WLAN_SNR_EP_MULTIPLIER))
284*5113495bSYour Name 
285*5113495bSYour Name #define WLAN_LPF_SNR(x, y, len) \
286*5113495bSYour Name 	((x != WLAN_SNR_DUMMY_MARKER) ? ((((x) << 3) + (y) - (x)) >> 3) : (y))
287*5113495bSYour Name 
288*5113495bSYour Name #define WLAN_SNR_LPF(x, y) do { \
289*5113495bSYour Name 	if ((y) > SNR_LPF_THRESHOLD) \
290*5113495bSYour Name 		x = WLAN_LPF_SNR((x), WLAN_SNR_IN((y)), WLAN_SNR_LPF_LEN); \
291*5113495bSYour Name 	} while (0)
292*5113495bSYour Name 
293*5113495bSYour Name /**
294*5113495bSYour Name  * util_scan_entry_rssi() - function to read rssi of scan entry
295*5113495bSYour Name  * @scan_entry: scan entry
296*5113495bSYour Name  *
297*5113495bSYour Name  * API, function to read rssi value of scan entry
298*5113495bSYour Name  *
299*5113495bSYour Name  * Return: rssi
300*5113495bSYour Name  */
301*5113495bSYour Name static inline int32_t
util_scan_entry_rssi(struct scan_cache_entry * scan_entry)302*5113495bSYour Name util_scan_entry_rssi(struct scan_cache_entry *scan_entry)
303*5113495bSYour Name {
304*5113495bSYour Name 	return WLAN_RSSI_OUT(scan_entry->avg_rssi);
305*5113495bSYour Name }
306*5113495bSYour Name 
307*5113495bSYour Name /**
308*5113495bSYour Name  * util_scan_entry_snr() - function to read snr of scan entry
309*5113495bSYour Name  * @scan_entry: scan entry
310*5113495bSYour Name  *
311*5113495bSYour Name  * API, function to read snr value of scan entry
312*5113495bSYour Name  *
313*5113495bSYour Name  * Return: snr
314*5113495bSYour Name  */
315*5113495bSYour Name static inline uint8_t
util_scan_entry_snr(struct scan_cache_entry * scan_entry)316*5113495bSYour Name util_scan_entry_snr(struct scan_cache_entry *scan_entry)
317*5113495bSYour Name {
318*5113495bSYour Name 	uint32_t snr = WLAN_SNR_OUT(scan_entry->avg_snr);
319*5113495bSYour Name 	/*
320*5113495bSYour Name 	 * An entry is in the BSS list means we've received at least one beacon
321*5113495bSYour Name 	 * from the corresponding AP, so the snr must be initialized.
322*5113495bSYour Name 	 *
323*5113495bSYour Name 	 * If the SNR is not initialized, return 0 (i.e. SNR == Noise Floor).
324*5113495bSYour Name 	 * Once se_avgsnr field has been initialized, ATH_SNR_OUT always
325*5113495bSYour Name 	 * returns values that fit in an 8-bit variable.
326*5113495bSYour Name 	 */
327*5113495bSYour Name 	return (snr >= WLAN_SNR_DUMMY_MARKER) ? 0 : (uint8_t)snr;
328*5113495bSYour Name }
329*5113495bSYour Name 
330*5113495bSYour Name /**
331*5113495bSYour Name  * util_scan_entry_phymode() - function to read phymode of scan entry
332*5113495bSYour Name  * @scan_entry: scan entry
333*5113495bSYour Name  *
334*5113495bSYour Name  * API, function to read phymode of scan entry
335*5113495bSYour Name  *
336*5113495bSYour Name  * Return: phymode
337*5113495bSYour Name  */
338*5113495bSYour Name static inline enum wlan_phymode
util_scan_entry_phymode(struct scan_cache_entry * scan_entry)339*5113495bSYour Name util_scan_entry_phymode(struct scan_cache_entry *scan_entry)
340*5113495bSYour Name {
341*5113495bSYour Name 	return scan_entry->phy_mode;
342*5113495bSYour Name }
343*5113495bSYour Name 
344*5113495bSYour Name /**
345*5113495bSYour Name  * util_scan_entry_nss() - function to read nss of scan entry
346*5113495bSYour Name  * @scan_entry: scan entry
347*5113495bSYour Name  *
348*5113495bSYour Name  * API, function to read nss of scan entry
349*5113495bSYour Name  *
350*5113495bSYour Name  * Return: nss
351*5113495bSYour Name  */
352*5113495bSYour Name static inline u_int8_t
util_scan_entry_nss(struct scan_cache_entry * scan_entry)353*5113495bSYour Name util_scan_entry_nss(struct scan_cache_entry *scan_entry)
354*5113495bSYour Name {
355*5113495bSYour Name 	return scan_entry->nss;
356*5113495bSYour Name }
357*5113495bSYour Name 
358*5113495bSYour Name /**
359*5113495bSYour Name  * util_is_ssid_match() - to check if ssid match
360*5113495bSYour Name  * @ssid1: ssid 1
361*5113495bSYour Name  * @ssid2: ssid 2
362*5113495bSYour Name  *
363*5113495bSYour Name  * Return: true if ssid match
364*5113495bSYour Name  */
365*5113495bSYour Name static inline bool
util_is_ssid_match(struct wlan_ssid * ssid1,struct wlan_ssid * ssid2)366*5113495bSYour Name util_is_ssid_match(struct wlan_ssid *ssid1,
367*5113495bSYour Name 		struct wlan_ssid *ssid2)
368*5113495bSYour Name {
369*5113495bSYour Name 	if (ssid1->length != ssid2->length)
370*5113495bSYour Name 		return false;
371*5113495bSYour Name 
372*5113495bSYour Name 	if (!qdf_mem_cmp(ssid1->ssid,
373*5113495bSYour Name 	   ssid2->ssid, ssid1->length))
374*5113495bSYour Name 		return true;
375*5113495bSYour Name 
376*5113495bSYour Name 	return false;
377*5113495bSYour Name }
378*5113495bSYour Name 
379*5113495bSYour Name /**
380*5113495bSYour Name  * util_is_bssid_match() - to check if bssid match
381*5113495bSYour Name  * @bssid1: bssid 1
382*5113495bSYour Name  * @bssid2: bssid 2
383*5113495bSYour Name  *
384*5113495bSYour Name  * Return: true if bssid match
385*5113495bSYour Name  */
util_is_bssid_match(struct qdf_mac_addr * bssid1,struct qdf_mac_addr * bssid2)386*5113495bSYour Name static inline bool util_is_bssid_match(struct qdf_mac_addr *bssid1,
387*5113495bSYour Name 	struct qdf_mac_addr *bssid2)
388*5113495bSYour Name {
389*5113495bSYour Name 
390*5113495bSYour Name 	if (qdf_is_macaddr_zero(bssid1) ||
391*5113495bSYour Name 	   qdf_is_macaddr_broadcast(bssid1))
392*5113495bSYour Name 		return true;
393*5113495bSYour Name 
394*5113495bSYour Name 	if (qdf_is_macaddr_equal(bssid1, bssid2))
395*5113495bSYour Name 		return true;
396*5113495bSYour Name 
397*5113495bSYour Name 	return false;
398*5113495bSYour Name }
399*5113495bSYour Name 
400*5113495bSYour Name /**
401*5113495bSYour Name  * util_is_bss_type_match() - to check if bss type
402*5113495bSYour Name  * @bss_type: bss type
403*5113495bSYour Name  * @cap: capability
404*5113495bSYour Name  *
405*5113495bSYour Name  * Return: true if bss type match
406*5113495bSYour Name  */
util_is_bss_type_match(enum wlan_bss_type bss_type,union wlan_capability cap)407*5113495bSYour Name static inline bool util_is_bss_type_match(enum wlan_bss_type bss_type,
408*5113495bSYour Name 	union wlan_capability cap)
409*5113495bSYour Name {
410*5113495bSYour Name 	bool match = true;
411*5113495bSYour Name 
412*5113495bSYour Name 	switch (bss_type) {
413*5113495bSYour Name 	case WLAN_TYPE_ANY:
414*5113495bSYour Name 		break;
415*5113495bSYour Name 	case WLAN_TYPE_IBSS:
416*5113495bSYour Name 		if (!cap.wlan_caps.ibss)
417*5113495bSYour Name 			match = false;
418*5113495bSYour Name 		break;
419*5113495bSYour Name 	case WLAN_TYPE_BSS:
420*5113495bSYour Name 		if (!cap.wlan_caps.ess)
421*5113495bSYour Name 			match = false;
422*5113495bSYour Name 		break;
423*5113495bSYour Name 	default:
424*5113495bSYour Name 		match = false;
425*5113495bSYour Name 	}
426*5113495bSYour Name 
427*5113495bSYour Name 	return match;
428*5113495bSYour Name }
429*5113495bSYour Name 
430*5113495bSYour Name /**
431*5113495bSYour Name  * util_country_code_match() - to check if country match
432*5113495bSYour Name  * @country: country code pointer
433*5113495bSYour Name  * @cc: country IE in beacon
434*5113495bSYour Name  *
435*5113495bSYour Name  * Return: true if country match
436*5113495bSYour Name  */
util_country_code_match(uint8_t * country,struct wlan_country_ie * cc)437*5113495bSYour Name static inline bool util_country_code_match(uint8_t *country,
438*5113495bSYour Name 					   struct wlan_country_ie *cc)
439*5113495bSYour Name {
440*5113495bSYour Name 	if (!country || !country[0])
441*5113495bSYour Name 		return true;
442*5113495bSYour Name 
443*5113495bSYour Name 	if (!cc)
444*5113495bSYour Name 		return false;
445*5113495bSYour Name 
446*5113495bSYour Name 	if (cc->cc[0] == country[0] &&
447*5113495bSYour Name 	    cc->cc[1] == country[1])
448*5113495bSYour Name 		return true;
449*5113495bSYour Name 
450*5113495bSYour Name 	return false;
451*5113495bSYour Name }
452*5113495bSYour Name 
453*5113495bSYour Name /**
454*5113495bSYour Name  * util_mdie_match() - to check if mdie match
455*5113495bSYour Name  * @mobility_domain: mobility domain
456*5113495bSYour Name  * @mdie: mobility domain ie
457*5113495bSYour Name  *
458*5113495bSYour Name  * Return: true if country match
459*5113495bSYour Name  */
util_mdie_match(uint16_t mobility_domain,struct rsn_mdie * mdie)460*5113495bSYour Name static inline bool util_mdie_match(uint16_t mobility_domain,
461*5113495bSYour Name 	struct rsn_mdie *mdie)
462*5113495bSYour Name {
463*5113495bSYour Name 	uint16_t md;
464*5113495bSYour Name 
465*5113495bSYour Name 	if (!mobility_domain)
466*5113495bSYour Name 		return true;
467*5113495bSYour Name 
468*5113495bSYour Name 	if (!mdie)
469*5113495bSYour Name 		return false;
470*5113495bSYour Name 
471*5113495bSYour Name 	md =
472*5113495bSYour Name 	  (mdie->mobility_domain[1] << 8) |
473*5113495bSYour Name 	   mdie->mobility_domain[0];
474*5113495bSYour Name 
475*5113495bSYour Name 	if (md == mobility_domain)
476*5113495bSYour Name 		return true;
477*5113495bSYour Name 
478*5113495bSYour Name 	return false;
479*5113495bSYour Name }
480*5113495bSYour Name 
481*5113495bSYour Name /**
482*5113495bSYour Name  * util_scan_entry_ssid() - function to read ssid of scan entry
483*5113495bSYour Name  * @scan_entry: scan entry
484*5113495bSYour Name  *
485*5113495bSYour Name  * API, function to read ssid of scan entry
486*5113495bSYour Name  *
487*5113495bSYour Name  * Return: ssid
488*5113495bSYour Name  */
489*5113495bSYour Name static inline struct wlan_ssid*
util_scan_entry_ssid(struct scan_cache_entry * scan_entry)490*5113495bSYour Name util_scan_entry_ssid(struct scan_cache_entry *scan_entry)
491*5113495bSYour Name {
492*5113495bSYour Name 	return &(scan_entry->ssid);
493*5113495bSYour Name }
494*5113495bSYour Name 
495*5113495bSYour Name /**
496*5113495bSYour Name  * util_scan_entry_dtimperiod() - function to read dtim period of scan entry
497*5113495bSYour Name  * @scan_entry: scan entry
498*5113495bSYour Name  *
499*5113495bSYour Name  * API, function to read dtim period of scan entry
500*5113495bSYour Name  *
501*5113495bSYour Name  * Return: dtim period
502*5113495bSYour Name  */
503*5113495bSYour Name static inline uint8_t
util_scan_entry_dtimperiod(struct scan_cache_entry * scan_entry)504*5113495bSYour Name util_scan_entry_dtimperiod(struct scan_cache_entry *scan_entry)
505*5113495bSYour Name {
506*5113495bSYour Name 	return scan_entry->dtim_period;
507*5113495bSYour Name }
508*5113495bSYour Name 
509*5113495bSYour Name /**
510*5113495bSYour Name  * util_scan_entry_tim() - function to read tim ie of scan entry
511*5113495bSYour Name  * @scan_entry: scan entry
512*5113495bSYour Name  *
513*5113495bSYour Name  * API, function to read tim ie of scan entry
514*5113495bSYour Name  *
515*5113495bSYour Name  * Return: timie or NULL if ie is not present
516*5113495bSYour Name  */
517*5113495bSYour Name static inline uint8_t*
util_scan_entry_tim(struct scan_cache_entry * scan_entry)518*5113495bSYour Name util_scan_entry_tim(struct scan_cache_entry *scan_entry)
519*5113495bSYour Name {
520*5113495bSYour Name 	return scan_entry->ie_list.tim;
521*5113495bSYour Name }
522*5113495bSYour Name 
523*5113495bSYour Name /**
524*5113495bSYour Name  * util_scan_entry_beacon_frame() - function to read full beacon or
525*5113495bSYour Name  * probe resp frame
526*5113495bSYour Name  * @scan_entry: scan entry
527*5113495bSYour Name  *
528*5113495bSYour Name  * API, function to read full beacon or probe resp frame including frame header
529*5113495bSYour Name  *
530*5113495bSYour Name  * Return: beacon/probe resp frame
531*5113495bSYour Name  */
532*5113495bSYour Name static inline struct element_info
util_scan_entry_beacon_frame(struct scan_cache_entry * scan_entry)533*5113495bSYour Name util_scan_entry_beacon_frame(struct scan_cache_entry *scan_entry)
534*5113495bSYour Name {
535*5113495bSYour Name 	/* util_scan_entry_beacon_data */
536*5113495bSYour Name 	return scan_entry->raw_frame;
537*5113495bSYour Name }
538*5113495bSYour Name 
539*5113495bSYour Name /**
540*5113495bSYour Name  * util_scan_entry_ie_data() - function to read tagged IEs
541*5113495bSYour Name  * @scan_entry: scan entry
542*5113495bSYour Name  *
543*5113495bSYour Name  * API, function to read beacon/probe response frames starting from tagged IEs
544*5113495bSYour Name  * (excluding frame header and fixed parameters)
545*5113495bSYour Name  *
546*5113495bSYour Name  * Return: tagged IES of beacon/probe resp frame
547*5113495bSYour Name  */
548*5113495bSYour Name static inline uint8_t*
util_scan_entry_ie_data(struct scan_cache_entry * scan_entry)549*5113495bSYour Name util_scan_entry_ie_data(struct scan_cache_entry *scan_entry)
550*5113495bSYour Name {
551*5113495bSYour Name 	struct element_info bcn_frm;
552*5113495bSYour Name 	uint8_t *ie_data = NULL;
553*5113495bSYour Name 
554*5113495bSYour Name 	bcn_frm = util_scan_entry_beacon_frame(scan_entry);
555*5113495bSYour Name 	ie_data = (uint8_t *) (bcn_frm.ptr +
556*5113495bSYour Name 		 sizeof(struct wlan_frame_hdr) +
557*5113495bSYour Name 		 offsetof(struct wlan_bcn_frame, ie));
558*5113495bSYour Name 	return ie_data;
559*5113495bSYour Name }
560*5113495bSYour Name 
561*5113495bSYour Name /**
562*5113495bSYour Name  * util_scan_entry_ie_len() - function to read length of all tagged IEs
563*5113495bSYour Name  * @scan_entry: scan entry
564*5113495bSYour Name  *
565*5113495bSYour Name  * API, function to read length of all tagged IEs
566*5113495bSYour Name  *
567*5113495bSYour Name  * Return: length of all tagged IEs
568*5113495bSYour Name  */
569*5113495bSYour Name static inline uint16_t
util_scan_entry_ie_len(struct scan_cache_entry * scan_entry)570*5113495bSYour Name util_scan_entry_ie_len(struct scan_cache_entry *scan_entry)
571*5113495bSYour Name {
572*5113495bSYour Name 	struct element_info bcn_frm;
573*5113495bSYour Name 	uint16_t ie_len = 0;
574*5113495bSYour Name 
575*5113495bSYour Name 	bcn_frm = util_scan_entry_beacon_frame(scan_entry);
576*5113495bSYour Name 	ie_len = (uint16_t) (bcn_frm.len -
577*5113495bSYour Name 		sizeof(struct wlan_frame_hdr) -
578*5113495bSYour Name 		offsetof(struct wlan_bcn_frame, ie));
579*5113495bSYour Name 	return ie_len;
580*5113495bSYour Name }
581*5113495bSYour Name 
582*5113495bSYour Name /**
583*5113495bSYour Name  * util_scan_entry_frame_len() - function to frame length
584*5113495bSYour Name  * @scan_entry: scan entry
585*5113495bSYour Name  *
586*5113495bSYour Name  * API, function to read frame length
587*5113495bSYour Name  *
588*5113495bSYour Name  * Return: frame length
589*5113495bSYour Name  */
590*5113495bSYour Name static inline uint32_t
util_scan_entry_frame_len(struct scan_cache_entry * scan_entry)591*5113495bSYour Name util_scan_entry_frame_len(struct scan_cache_entry *scan_entry)
592*5113495bSYour Name {
593*5113495bSYour Name 	return scan_entry->raw_frame.len;
594*5113495bSYour Name }
595*5113495bSYour Name 
596*5113495bSYour Name /**
597*5113495bSYour Name  * util_scan_entry_frame_ptr() - function to get frame ptr
598*5113495bSYour Name  * @scan_entry: scan entry
599*5113495bSYour Name  *
600*5113495bSYour Name  * API, function to read frame ptr
601*5113495bSYour Name  *
602*5113495bSYour Name  * Return: frame ptr
603*5113495bSYour Name  */
604*5113495bSYour Name static inline uint8_t*
util_scan_entry_frame_ptr(struct scan_cache_entry * scan_entry)605*5113495bSYour Name util_scan_entry_frame_ptr(struct scan_cache_entry *scan_entry)
606*5113495bSYour Name {
607*5113495bSYour Name 	return scan_entry->raw_frame.ptr;
608*5113495bSYour Name }
609*5113495bSYour Name 
610*5113495bSYour Name /**
611*5113495bSYour Name  * util_scan_entry_copy_ie_data() - function to get a copy of all tagged IEs
612*5113495bSYour Name  * @scan_entry: scan entry
613*5113495bSYour Name  * @iebuf: destination IE buffer. May be NULL if only the
614*5113495bSYour Name  * @ie_len: pointer to the ie buffer length. On input must hold the size of
615*5113495bSYour Name  *          @iebuf. On output it will be filled with the length of the IEs.
616*5113495bSYour Name  *
617*5113495bSYour Name  * API, function to get a copy of all tagged IEs in passed memory
618*5113495bSYour Name  *
619*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if tagged IEs copied successfully
620*5113495bSYour Name  *         QDF_STATUS_E_NOMEM if passed memory/length can't hold all tagged IEs
621*5113495bSYour Name  */
622*5113495bSYour Name static inline QDF_STATUS
util_scan_entry_copy_ie_data(struct scan_cache_entry * scan_entry,uint8_t * iebuf,uint16_t * ie_len)623*5113495bSYour Name util_scan_entry_copy_ie_data(struct scan_cache_entry *scan_entry,
624*5113495bSYour Name 	uint8_t *iebuf, uint16_t *ie_len)
625*5113495bSYour Name {
626*5113495bSYour Name 	u_int8_t     *buff;
627*5113495bSYour Name 	u_int16_t    buff_len;
628*5113495bSYour Name 
629*5113495bSYour Name 	/* iebuf can be NULL, ie_len must be a valid pointer. */
630*5113495bSYour Name 	QDF_ASSERT(ie_len);
631*5113495bSYour Name 	if (!ie_len)
632*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
633*5113495bSYour Name 
634*5113495bSYour Name 	buff = util_scan_entry_ie_data(scan_entry);
635*5113495bSYour Name 	buff_len = util_scan_entry_ie_len(scan_entry);
636*5113495bSYour Name 	/*
637*5113495bSYour Name 	 * If caller passed a buffer, check the length to make sure
638*5113495bSYour Name 	 * it's large enough.
639*5113495bSYour Name 	 * If no buffer is passed, just return the length of the IE blob.
640*5113495bSYour Name 	 */
641*5113495bSYour Name 	if (iebuf) {
642*5113495bSYour Name 		if (*ie_len >= buff_len) {
643*5113495bSYour Name 			qdf_mem_copy(iebuf, buff, buff_len);
644*5113495bSYour Name 			*ie_len = buff_len;
645*5113495bSYour Name 			return QDF_STATUS_SUCCESS;
646*5113495bSYour Name 		}
647*5113495bSYour Name 	}
648*5113495bSYour Name 
649*5113495bSYour Name 	*ie_len = buff_len;
650*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
651*5113495bSYour Name }
652*5113495bSYour Name 
653*5113495bSYour Name /**
654*5113495bSYour Name  * util_scan_free_cache_entry() - function to free scan
655*5113495bSYour Name  * cache entry
656*5113495bSYour Name  * @scan_entry: scan entry
657*5113495bSYour Name  *
658*5113495bSYour Name  * API, function to free scan cache entry
659*5113495bSYour Name  *
660*5113495bSYour Name  * Return: void
661*5113495bSYour Name  */
662*5113495bSYour Name static inline void
util_scan_free_cache_entry(struct scan_cache_entry * scan_entry)663*5113495bSYour Name util_scan_free_cache_entry(struct scan_cache_entry *scan_entry)
664*5113495bSYour Name {
665*5113495bSYour Name 	if (!scan_entry)
666*5113495bSYour Name 		return;
667*5113495bSYour Name 	if (scan_entry->alt_wcn_ie.ptr)
668*5113495bSYour Name 		qdf_mem_free(scan_entry->alt_wcn_ie.ptr);
669*5113495bSYour Name 	if (scan_entry->raw_frame.ptr)
670*5113495bSYour Name 		qdf_mem_free(scan_entry->raw_frame.ptr);
671*5113495bSYour Name 
672*5113495bSYour Name 	qdf_mem_free(scan_entry);
673*5113495bSYour Name }
674*5113495bSYour Name 
675*5113495bSYour Name #define conv_ptr(_address, _base1, _base2) \
676*5113495bSYour Name 	((_address) ? (((u_int8_t *) (_address) - \
677*5113495bSYour Name 	(u_int8_t *) (_base1)) + (u_int8_t *) (_base2)) : NULL)
678*5113495bSYour Name 
679*5113495bSYour Name /**
680*5113495bSYour Name  * util_scan_copy_beacon_data() - copy beacon and update ie ptrs
681*5113495bSYour Name  * cache entry
682*5113495bSYour Name  * @new_entry: new scan entry
683*5113495bSYour Name  * @scan_entry: entry from where data is copied
684*5113495bSYour Name  *
685*5113495bSYour Name  * API, function to copy beacon and update ie ptrs
686*5113495bSYour Name  *
687*5113495bSYour Name  * Return: QDF_STATUS
688*5113495bSYour Name  */
689*5113495bSYour Name static inline QDF_STATUS
util_scan_copy_beacon_data(struct scan_cache_entry * new_entry,struct scan_cache_entry * scan_entry)690*5113495bSYour Name util_scan_copy_beacon_data(struct scan_cache_entry *new_entry,
691*5113495bSYour Name 	struct scan_cache_entry *scan_entry)
692*5113495bSYour Name {
693*5113495bSYour Name 	u_int8_t *new_ptr, *old_ptr;
694*5113495bSYour Name 	struct ie_list *ie_lst;
695*5113495bSYour Name 	uint8_t i;
696*5113495bSYour Name 
697*5113495bSYour Name 	new_entry->raw_frame.ptr =
698*5113495bSYour Name 		qdf_mem_malloc_atomic(scan_entry->raw_frame.len);
699*5113495bSYour Name 	if (!new_entry->raw_frame.ptr)
700*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
701*5113495bSYour Name 
702*5113495bSYour Name 	qdf_mem_copy(new_entry->raw_frame.ptr,
703*5113495bSYour Name 		scan_entry->raw_frame.ptr,
704*5113495bSYour Name 		scan_entry->raw_frame.len);
705*5113495bSYour Name 	new_entry->raw_frame.len = scan_entry->raw_frame.len;
706*5113495bSYour Name 	new_ptr = new_entry->raw_frame.ptr;
707*5113495bSYour Name 	old_ptr = scan_entry->raw_frame.ptr;
708*5113495bSYour Name 
709*5113495bSYour Name 	new_entry->ie_list = scan_entry->ie_list;
710*5113495bSYour Name 
711*5113495bSYour Name 	ie_lst = &new_entry->ie_list;
712*5113495bSYour Name 
713*5113495bSYour Name 	/* New info_element needs also be added in ieee80211_parse_beacon */
714*5113495bSYour Name 	ie_lst->tim = conv_ptr(ie_lst->tim, old_ptr, new_ptr);
715*5113495bSYour Name 	ie_lst->country = conv_ptr(ie_lst->country, old_ptr, new_ptr);
716*5113495bSYour Name 	ie_lst->ssid = conv_ptr(ie_lst->ssid, old_ptr, new_ptr);
717*5113495bSYour Name 	ie_lst->rates = conv_ptr(ie_lst->rates, old_ptr, new_ptr);
718*5113495bSYour Name 	ie_lst->xrates = conv_ptr(ie_lst->xrates, old_ptr, new_ptr);
719*5113495bSYour Name 	ie_lst->ds_param = conv_ptr(ie_lst->ds_param, old_ptr, new_ptr);
720*5113495bSYour Name 	ie_lst->csa = conv_ptr(ie_lst->csa, old_ptr, new_ptr);
721*5113495bSYour Name 	ie_lst->xcsa = conv_ptr(ie_lst->xcsa, old_ptr, new_ptr);
722*5113495bSYour Name 	ie_lst->mcst = conv_ptr(ie_lst->mcst, old_ptr, new_ptr);
723*5113495bSYour Name 	ie_lst->secchanoff = conv_ptr(ie_lst->secchanoff, old_ptr, new_ptr);
724*5113495bSYour Name 	ie_lst->wpa = conv_ptr(ie_lst->wpa, old_ptr, new_ptr);
725*5113495bSYour Name 	ie_lst->wcn = conv_ptr(ie_lst->wcn, old_ptr, new_ptr);
726*5113495bSYour Name 	ie_lst->rsn = conv_ptr(ie_lst->rsn, old_ptr, new_ptr);
727*5113495bSYour Name 	ie_lst->wps = conv_ptr(ie_lst->wps, old_ptr, new_ptr);
728*5113495bSYour Name 	ie_lst->wmeinfo = conv_ptr(ie_lst->wmeinfo, old_ptr, new_ptr);
729*5113495bSYour Name 	ie_lst->wmeparam = conv_ptr(ie_lst->wmeparam, old_ptr, new_ptr);
730*5113495bSYour Name 	ie_lst->quiet = conv_ptr(ie_lst->quiet, old_ptr, new_ptr);
731*5113495bSYour Name 	ie_lst->htcap = conv_ptr(ie_lst->htcap, old_ptr, new_ptr);
732*5113495bSYour Name 	ie_lst->htinfo = conv_ptr(ie_lst->htinfo, old_ptr, new_ptr);
733*5113495bSYour Name 	ie_lst->athcaps = conv_ptr(ie_lst->athcaps, old_ptr, new_ptr);
734*5113495bSYour Name 	ie_lst->athextcaps = conv_ptr(ie_lst->athextcaps, old_ptr, new_ptr);
735*5113495bSYour Name 	ie_lst->sfa = conv_ptr(ie_lst->sfa, old_ptr, new_ptr);
736*5113495bSYour Name 	ie_lst->vendor = conv_ptr(ie_lst->vendor, old_ptr, new_ptr);
737*5113495bSYour Name 	ie_lst->qbssload = conv_ptr(ie_lst->qbssload, old_ptr, new_ptr);
738*5113495bSYour Name 	ie_lst->wapi = conv_ptr(ie_lst->wapi, old_ptr, new_ptr);
739*5113495bSYour Name 	ie_lst->p2p = conv_ptr(ie_lst->p2p, old_ptr, new_ptr);
740*5113495bSYour Name 	ie_lst->alt_wcn = conv_ptr(ie_lst->alt_wcn, old_ptr, new_ptr);
741*5113495bSYour Name 	ie_lst->extcaps = conv_ptr(ie_lst->extcaps, old_ptr, new_ptr);
742*5113495bSYour Name 	ie_lst->ibssdfs = conv_ptr(ie_lst->ibssdfs, old_ptr, new_ptr);
743*5113495bSYour Name 	ie_lst->sonadv = conv_ptr(ie_lst->sonadv, old_ptr, new_ptr);
744*5113495bSYour Name 	ie_lst->vhtcap = conv_ptr(ie_lst->vhtcap, old_ptr, new_ptr);
745*5113495bSYour Name 	ie_lst->vhtop = conv_ptr(ie_lst->vhtop, old_ptr, new_ptr);
746*5113495bSYour Name 	ie_lst->opmode = conv_ptr(ie_lst->opmode, old_ptr, new_ptr);
747*5113495bSYour Name 	ie_lst->cswrp = conv_ptr(ie_lst->cswrp, old_ptr, new_ptr);
748*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_NUM_TPE_IE; i++)
749*5113495bSYour Name 		ie_lst->tpe[i] = conv_ptr(ie_lst->tpe[i], old_ptr, new_ptr);
750*5113495bSYour Name 	ie_lst->widebw = conv_ptr(ie_lst->widebw, old_ptr, new_ptr);
751*5113495bSYour Name 	ie_lst->txpwrenvlp = conv_ptr(ie_lst->txpwrenvlp, old_ptr, new_ptr);
752*5113495bSYour Name 	ie_lst->bwnss_map = conv_ptr(ie_lst->bwnss_map, old_ptr, new_ptr);
753*5113495bSYour Name 	ie_lst->mdie = conv_ptr(ie_lst->mdie, old_ptr, new_ptr);
754*5113495bSYour Name 	ie_lst->hecap = conv_ptr(ie_lst->hecap, old_ptr, new_ptr);
755*5113495bSYour Name 	ie_lst->hecap_6g = conv_ptr(ie_lst->hecap_6g, old_ptr, new_ptr);
756*5113495bSYour Name 	ie_lst->heop = conv_ptr(ie_lst->heop, old_ptr, new_ptr);
757*5113495bSYour Name 	ie_lst->srp = conv_ptr(ie_lst->srp, old_ptr, new_ptr);
758*5113495bSYour Name 	ie_lst->fils_indication = conv_ptr(ie_lst->fils_indication,
759*5113495bSYour Name 					   old_ptr, new_ptr);
760*5113495bSYour Name 	ie_lst->esp = conv_ptr(ie_lst->esp, old_ptr, new_ptr);
761*5113495bSYour Name 	ie_lst->mbo_oce = conv_ptr(ie_lst->mbo_oce, old_ptr, new_ptr);
762*5113495bSYour Name 	ie_lst->muedca = conv_ptr(ie_lst->muedca, old_ptr, new_ptr);
763*5113495bSYour Name 	ie_lst->rnrie = conv_ptr(ie_lst->rnrie, old_ptr, new_ptr);
764*5113495bSYour Name 	ie_lst->extender = conv_ptr(ie_lst->extender, old_ptr, new_ptr);
765*5113495bSYour Name 	ie_lst->adaptive_11r = conv_ptr(ie_lst->adaptive_11r, old_ptr, new_ptr);
766*5113495bSYour Name 	ie_lst->single_pmk = conv_ptr(ie_lst->single_pmk, old_ptr, new_ptr);
767*5113495bSYour Name 	ie_lst->rsnxe = conv_ptr(ie_lst->rsnxe, old_ptr, new_ptr);
768*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
769*5113495bSYour Name 	/* This macro will be removed once 11be is enabled */
770*5113495bSYour Name 	ie_lst->ehtcap = conv_ptr(ie_lst->ehtcap, old_ptr, new_ptr);
771*5113495bSYour Name 	ie_lst->ehtop = conv_ptr(ie_lst->ehtop, old_ptr, new_ptr);
772*5113495bSYour Name 	ie_lst->bw_ind =
773*5113495bSYour Name 		conv_ptr(ie_lst->bw_ind, old_ptr, new_ptr);
774*5113495bSYour Name #endif
775*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
776*5113495bSYour Name 	ie_lst->multi_link_bv =
777*5113495bSYour Name 			conv_ptr(ie_lst->multi_link_bv, old_ptr, new_ptr);
778*5113495bSYour Name 	ie_lst->multi_link_rv =
779*5113495bSYour Name 			conv_ptr(ie_lst->multi_link_rv, old_ptr, new_ptr);
780*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_T2LM_IE; i++)
781*5113495bSYour Name 		ie_lst->t2lm[i] = conv_ptr(ie_lst->t2lm[i], old_ptr, new_ptr);
782*5113495bSYour Name #endif
783*5113495bSYour Name 	ie_lst->qcn = conv_ptr(ie_lst->qcn, old_ptr, new_ptr);
784*5113495bSYour Name 
785*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
786*5113495bSYour Name }
787*5113495bSYour Name 
788*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
789*5113495bSYour Name /**
790*5113495bSYour Name  * util_scan_get_ml_partner_info() - Get partner links info of an ML connection
791*5113495bSYour Name  * @scan_entry: scan entry
792*5113495bSYour Name  * @partner_info: partner link info
793*5113495bSYour Name  *
794*5113495bSYour Name  * API, function to get partner link information from an ML scan cache entry
795*5113495bSYour Name  *
796*5113495bSYour Name  * Return: QDF_STATUS
797*5113495bSYour Name  */
798*5113495bSYour Name static inline QDF_STATUS
util_scan_get_ml_partner_info(struct scan_cache_entry * scan_entry,struct mlo_partner_info * partner_info)799*5113495bSYour Name util_scan_get_ml_partner_info(struct scan_cache_entry *scan_entry,
800*5113495bSYour Name 			      struct mlo_partner_info *partner_info)
801*5113495bSYour Name {
802*5113495bSYour Name 	uint8_t i;
803*5113495bSYour Name 
804*5113495bSYour Name 	if (!scan_entry->ml_info.num_links)
805*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
806*5113495bSYour Name 
807*5113495bSYour Name 	partner_info->num_partner_links =
808*5113495bSYour Name 				scan_entry->ml_info.num_links;
809*5113495bSYour Name 	/* TODO: Make sure that scan_entry->ml_info->link_info is a sorted
810*5113495bSYour Name 	 * list */
811*5113495bSYour Name 	for (i = 0; i < partner_info->num_partner_links; i++) {
812*5113495bSYour Name 		partner_info->partner_link_info[i].link_addr =
813*5113495bSYour Name 				scan_entry->ml_info.link_info[i].link_addr;
814*5113495bSYour Name 		partner_info->partner_link_info[i].link_id =
815*5113495bSYour Name 				scan_entry->ml_info.link_info[i].link_id;
816*5113495bSYour Name 	}
817*5113495bSYour Name 
818*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
819*5113495bSYour Name }
820*5113495bSYour Name #endif
821*5113495bSYour Name 
822*5113495bSYour Name /**
823*5113495bSYour Name  * util_scan_copy_cache_entry() - function to create a copy
824*5113495bSYour Name  * of scan cache entry
825*5113495bSYour Name  * @scan_entry: scan entry
826*5113495bSYour Name  *
827*5113495bSYour Name  * API, function to create a copy of scan cache entry
828*5113495bSYour Name  *
829*5113495bSYour Name  * Return: copy of scan_entry
830*5113495bSYour Name  */
831*5113495bSYour Name static inline struct scan_cache_entry *
util_scan_copy_cache_entry(struct scan_cache_entry * scan_entry)832*5113495bSYour Name util_scan_copy_cache_entry(struct scan_cache_entry *scan_entry)
833*5113495bSYour Name {
834*5113495bSYour Name 	struct scan_cache_entry *new_entry;
835*5113495bSYour Name 	QDF_STATUS status;
836*5113495bSYour Name 
837*5113495bSYour Name 	if (!scan_entry)
838*5113495bSYour Name 		return NULL;
839*5113495bSYour Name 
840*5113495bSYour Name 	new_entry =
841*5113495bSYour Name 	   qdf_mem_malloc_atomic(sizeof(*scan_entry));
842*5113495bSYour Name 	if (!new_entry)
843*5113495bSYour Name 		return NULL;
844*5113495bSYour Name 
845*5113495bSYour Name 	qdf_mem_copy(new_entry,
846*5113495bSYour Name 		scan_entry, sizeof(*scan_entry));
847*5113495bSYour Name 
848*5113495bSYour Name 	if (scan_entry->alt_wcn_ie.ptr) {
849*5113495bSYour Name 		new_entry->alt_wcn_ie.ptr =
850*5113495bSYour Name 		    qdf_mem_malloc_atomic(scan_entry->alt_wcn_ie.len);
851*5113495bSYour Name 		if (!new_entry->alt_wcn_ie.ptr) {
852*5113495bSYour Name 			qdf_mem_free(new_entry);
853*5113495bSYour Name 			return NULL;
854*5113495bSYour Name 		}
855*5113495bSYour Name 		qdf_mem_copy(new_entry->alt_wcn_ie.ptr,
856*5113495bSYour Name 		   scan_entry->alt_wcn_ie.ptr,
857*5113495bSYour Name 		   scan_entry->alt_wcn_ie.len);
858*5113495bSYour Name 		new_entry->alt_wcn_ie.len =
859*5113495bSYour Name 			scan_entry->alt_wcn_ie.len;
860*5113495bSYour Name 	}
861*5113495bSYour Name 
862*5113495bSYour Name 	status = util_scan_copy_beacon_data(new_entry, scan_entry);
863*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
864*5113495bSYour Name 		util_scan_free_cache_entry(new_entry);
865*5113495bSYour Name 		return NULL;
866*5113495bSYour Name 	}
867*5113495bSYour Name 
868*5113495bSYour Name 	return new_entry;
869*5113495bSYour Name }
870*5113495bSYour Name 
871*5113495bSYour Name /**
872*5113495bSYour Name  * util_scan_entry_channel() - function to read channel info
873*5113495bSYour Name  * @scan_entry: scan entry
874*5113495bSYour Name  *
875*5113495bSYour Name  * API, function to read channel info
876*5113495bSYour Name  *
877*5113495bSYour Name  * Return: channel info
878*5113495bSYour Name  */
879*5113495bSYour Name static inline struct channel_info*
util_scan_entry_channel(struct scan_cache_entry * scan_entry)880*5113495bSYour Name util_scan_entry_channel(struct scan_cache_entry *scan_entry)
881*5113495bSYour Name {
882*5113495bSYour Name 	return &(scan_entry->channel);
883*5113495bSYour Name }
884*5113495bSYour Name 
885*5113495bSYour Name /**
886*5113495bSYour Name  * util_scan_entry_channel_frequency() - function to read channel number
887*5113495bSYour Name  * @scan_entry: scan entry
888*5113495bSYour Name  *
889*5113495bSYour Name  * API, function to read channel number
890*5113495bSYour Name  *
891*5113495bSYour Name  * Return: channel number
892*5113495bSYour Name  */
893*5113495bSYour Name static inline uint32_t
util_scan_entry_channel_frequency(struct scan_cache_entry * scan_entry)894*5113495bSYour Name util_scan_entry_channel_frequency(struct scan_cache_entry *scan_entry)
895*5113495bSYour Name {
896*5113495bSYour Name 	return scan_entry->channel.chan_freq;
897*5113495bSYour Name }
898*5113495bSYour Name 
899*5113495bSYour Name /**
900*5113495bSYour Name  * util_scan_entry_erpinfo() - function to read erp info
901*5113495bSYour Name  * @scan_entry: scan entry
902*5113495bSYour Name  *
903*5113495bSYour Name  * API, function to read erp info
904*5113495bSYour Name  *
905*5113495bSYour Name  * Return: erp info
906*5113495bSYour Name  */
907*5113495bSYour Name static inline uint8_t
util_scan_entry_erpinfo(struct scan_cache_entry * scan_entry)908*5113495bSYour Name util_scan_entry_erpinfo(struct scan_cache_entry *scan_entry)
909*5113495bSYour Name {
910*5113495bSYour Name 	return scan_entry->erp;
911*5113495bSYour Name }
912*5113495bSYour Name 
913*5113495bSYour Name /**
914*5113495bSYour Name  * util_scan_entry_rates() - function to read supported rates IE
915*5113495bSYour Name  * @scan_entry: scan entry
916*5113495bSYour Name  *
917*5113495bSYour Name  * API, function to read supported rates IE
918*5113495bSYour Name  *
919*5113495bSYour Name  * Return: basic ratesie or NULL if ie is not present
920*5113495bSYour Name  */
921*5113495bSYour Name static inline uint8_t*
util_scan_entry_rates(struct scan_cache_entry * scan_entry)922*5113495bSYour Name util_scan_entry_rates(struct scan_cache_entry *scan_entry)
923*5113495bSYour Name {
924*5113495bSYour Name 	return scan_entry->ie_list.rates;
925*5113495bSYour Name }
926*5113495bSYour Name 
927*5113495bSYour Name /**
928*5113495bSYour Name  * util_scan_entry_xrates()- function to read extended supported rates IE
929*5113495bSYour Name  * @scan_entry: scan entry
930*5113495bSYour Name  *
931*5113495bSYour Name  * API, function to read extended supported rates IE
932*5113495bSYour Name  *
933*5113495bSYour Name  * Return: extended supported ratesie or NULL if ie is not present
934*5113495bSYour Name  */
935*5113495bSYour Name static inline uint8_t*
util_scan_entry_xrates(struct scan_cache_entry * scan_entry)936*5113495bSYour Name util_scan_entry_xrates(struct scan_cache_entry *scan_entry)
937*5113495bSYour Name {
938*5113495bSYour Name 	return scan_entry->ie_list.xrates;
939*5113495bSYour Name }
940*5113495bSYour Name 
941*5113495bSYour Name /**
942*5113495bSYour Name  * util_scan_entry_rsn()- function to read rsn IE
943*5113495bSYour Name  * @scan_entry: scan entry
944*5113495bSYour Name  *
945*5113495bSYour Name  * API, function to read rsn IE
946*5113495bSYour Name  *
947*5113495bSYour Name  * Return: rsnie or NULL if ie is not present
948*5113495bSYour Name  */
949*5113495bSYour Name static inline uint8_t*
util_scan_entry_rsn(struct scan_cache_entry * scan_entry)950*5113495bSYour Name util_scan_entry_rsn(struct scan_cache_entry *scan_entry)
951*5113495bSYour Name {
952*5113495bSYour Name 	return scan_entry->ie_list.rsn;
953*5113495bSYour Name }
954*5113495bSYour Name 
955*5113495bSYour Name /**
956*5113495bSYour Name  * util_scan_entry_adaptive_11r()- function to read adaptive 11r Vendor IE
957*5113495bSYour Name  * @scan_entry: scan entry
958*5113495bSYour Name  *
959*5113495bSYour Name  * API, function to read adaptive 11r IE
960*5113495bSYour Name  *
961*5113495bSYour Name  * Return:  apaptive 11r ie or NULL if ie is not present
962*5113495bSYour Name  */
963*5113495bSYour Name static inline uint8_t*
util_scan_entry_adaptive_11r(struct scan_cache_entry * scan_entry)964*5113495bSYour Name util_scan_entry_adaptive_11r(struct scan_cache_entry *scan_entry)
965*5113495bSYour Name {
966*5113495bSYour Name 	return scan_entry->ie_list.adaptive_11r;
967*5113495bSYour Name }
968*5113495bSYour Name 
969*5113495bSYour Name #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
970*5113495bSYour Name /**
971*5113495bSYour Name  * util_scan_entry_single_pmk()- function to read single pmk Vendor IE
972*5113495bSYour Name  * @psoc: Pointer to global psoc object
973*5113495bSYour Name  * @scan_entry: scan entry
974*5113495bSYour Name  *
975*5113495bSYour Name  * API, function to read sae single pmk IE
976*5113495bSYour Name  *
977*5113495bSYour Name  * Return: true if single_pmk ie is present or false if ie is not present
978*5113495bSYour Name  */
979*5113495bSYour Name bool
980*5113495bSYour Name util_scan_entry_single_pmk(struct wlan_objmgr_psoc *psoc,
981*5113495bSYour Name 			   struct scan_cache_entry *scan_entry);
982*5113495bSYour Name #else
983*5113495bSYour Name static inline bool
util_scan_entry_single_pmk(struct wlan_objmgr_psoc * psoc,struct scan_cache_entry * scan_entry)984*5113495bSYour Name util_scan_entry_single_pmk(struct wlan_objmgr_psoc *psoc,
985*5113495bSYour Name 			   struct scan_cache_entry *scan_entry)
986*5113495bSYour Name {
987*5113495bSYour Name 	return false;
988*5113495bSYour Name }
989*5113495bSYour Name #endif
990*5113495bSYour Name 
991*5113495bSYour Name /**
992*5113495bSYour Name  * util_scan_get_rsn_len()- function to read rsn IE length if present
993*5113495bSYour Name  * @scan_entry: scan entry
994*5113495bSYour Name  *
995*5113495bSYour Name  * API, function to read rsn length if present
996*5113495bSYour Name  *
997*5113495bSYour Name  * Return: rsnie length
998*5113495bSYour Name  */
999*5113495bSYour Name static inline uint8_t
util_scan_get_rsn_len(struct scan_cache_entry * scan_entry)1000*5113495bSYour Name util_scan_get_rsn_len(struct scan_cache_entry *scan_entry)
1001*5113495bSYour Name {
1002*5113495bSYour Name 	if (scan_entry && scan_entry->ie_list.rsn)
1003*5113495bSYour Name 		return scan_entry->ie_list.rsn[1] + 2;
1004*5113495bSYour Name 	else
1005*5113495bSYour Name 		return 0;
1006*5113495bSYour Name }
1007*5113495bSYour Name 
1008*5113495bSYour Name 
1009*5113495bSYour Name /**
1010*5113495bSYour Name  * util_scan_entry_wpa() - function to read wpa IE
1011*5113495bSYour Name  * @scan_entry: scan entry
1012*5113495bSYour Name  *
1013*5113495bSYour Name  * API, function to read wpa IE
1014*5113495bSYour Name  *
1015*5113495bSYour Name  * Return: wpaie or NULL if ie is not present
1016*5113495bSYour Name  */
1017*5113495bSYour Name static inline uint8_t*
util_scan_entry_wpa(struct scan_cache_entry * scan_entry)1018*5113495bSYour Name util_scan_entry_wpa(struct scan_cache_entry *scan_entry)
1019*5113495bSYour Name {
1020*5113495bSYour Name 	return scan_entry->ie_list.wpa;
1021*5113495bSYour Name }
1022*5113495bSYour Name 
1023*5113495bSYour Name /**
1024*5113495bSYour Name  * util_scan_get_wpa_len()- function to read wpa IE length if present
1025*5113495bSYour Name  * @scan_entry: scan entry
1026*5113495bSYour Name  *
1027*5113495bSYour Name  * API, function to read wpa ie length if present
1028*5113495bSYour Name  *
1029*5113495bSYour Name  * Return: wpa ie length
1030*5113495bSYour Name  */
1031*5113495bSYour Name static inline uint8_t
util_scan_get_wpa_len(struct scan_cache_entry * scan_entry)1032*5113495bSYour Name util_scan_get_wpa_len(struct scan_cache_entry *scan_entry)
1033*5113495bSYour Name {
1034*5113495bSYour Name 	if (scan_entry && scan_entry->ie_list.wpa)
1035*5113495bSYour Name 		return scan_entry->ie_list.wpa[1] + 2;
1036*5113495bSYour Name 	else
1037*5113495bSYour Name 		return 0;
1038*5113495bSYour Name }
1039*5113495bSYour Name 
1040*5113495bSYour Name 
1041*5113495bSYour Name /**
1042*5113495bSYour Name  * util_scan_entry_wapi() - function to read wapi IE
1043*5113495bSYour Name  * @scan_entry: scan entry
1044*5113495bSYour Name  *
1045*5113495bSYour Name  * API, function to read wapi IE
1046*5113495bSYour Name  *
1047*5113495bSYour Name  * Return: wapiie or NULL if ie is not present
1048*5113495bSYour Name  */
1049*5113495bSYour Name static inline uint8_t*
util_scan_entry_wapi(struct scan_cache_entry * scan_entry)1050*5113495bSYour Name util_scan_entry_wapi(struct scan_cache_entry *scan_entry)
1051*5113495bSYour Name {
1052*5113495bSYour Name 	return scan_entry->ie_list.wapi;
1053*5113495bSYour Name }
1054*5113495bSYour Name 
1055*5113495bSYour Name /**
1056*5113495bSYour Name  * util_scan_entry_wps() - function to read wps IE
1057*5113495bSYour Name  * @scan_entry: scan entry
1058*5113495bSYour Name  *
1059*5113495bSYour Name  * API, function to read wps IE
1060*5113495bSYour Name  *
1061*5113495bSYour Name  * Return: wpsie or NULL if ie is not present
1062*5113495bSYour Name  */
1063*5113495bSYour Name static inline uint8_t*
util_scan_entry_wps(struct scan_cache_entry * scan_entry)1064*5113495bSYour Name util_scan_entry_wps(struct scan_cache_entry *scan_entry)
1065*5113495bSYour Name {
1066*5113495bSYour Name 	return scan_entry->ie_list.wps;
1067*5113495bSYour Name }
1068*5113495bSYour Name 
1069*5113495bSYour Name /**
1070*5113495bSYour Name  * util_scan_entry_sfa() - function to read sfa IE
1071*5113495bSYour Name  * @scan_entry: scan entry
1072*5113495bSYour Name  *
1073*5113495bSYour Name  * API, function to read sfa IE
1074*5113495bSYour Name  *
1075*5113495bSYour Name  * Return: sfaie or NULL if ie is not present
1076*5113495bSYour Name  */
1077*5113495bSYour Name static inline uint8_t*
util_scan_entry_sfa(struct scan_cache_entry * scan_entry)1078*5113495bSYour Name util_scan_entry_sfa(struct scan_cache_entry *scan_entry)
1079*5113495bSYour Name {
1080*5113495bSYour Name 	return scan_entry->ie_list.sfa;
1081*5113495bSYour Name }
1082*5113495bSYour Name 
1083*5113495bSYour Name /**
1084*5113495bSYour Name  * util_scan_entry_ds_param() - function to read ds params
1085*5113495bSYour Name  * @scan_entry: scan entry
1086*5113495bSYour Name  *
1087*5113495bSYour Name  * API, function to read ds params
1088*5113495bSYour Name  *
1089*5113495bSYour Name  * Return: ds params or NULL if ie is not present
1090*5113495bSYour Name  */
1091*5113495bSYour Name static inline uint8_t*
util_scan_entry_ds_param(struct scan_cache_entry * scan_entry)1092*5113495bSYour Name util_scan_entry_ds_param(struct scan_cache_entry *scan_entry)
1093*5113495bSYour Name {
1094*5113495bSYour Name 	if (scan_entry)
1095*5113495bSYour Name 		return scan_entry->ie_list.ds_param;
1096*5113495bSYour Name 	else
1097*5113495bSYour Name 		return NULL;
1098*5113495bSYour Name }
1099*5113495bSYour Name 
1100*5113495bSYour Name /**
1101*5113495bSYour Name  * util_scan_entry_csa() - function to read csa IE
1102*5113495bSYour Name  * @scan_entry: scan entry
1103*5113495bSYour Name  *
1104*5113495bSYour Name  * API, function to read csa IE
1105*5113495bSYour Name  *
1106*5113495bSYour Name  * Return: csaie or NULL if ie is not present
1107*5113495bSYour Name  */
1108*5113495bSYour Name static inline uint8_t*
util_scan_entry_csa(struct scan_cache_entry * scan_entry)1109*5113495bSYour Name util_scan_entry_csa(struct scan_cache_entry *scan_entry)
1110*5113495bSYour Name {
1111*5113495bSYour Name 	return scan_entry->ie_list.csa;
1112*5113495bSYour Name }
1113*5113495bSYour Name 
1114*5113495bSYour Name /**
1115*5113495bSYour Name  * util_scan_entry_xcsa() - function to read extended csa IE
1116*5113495bSYour Name  * @scan_entry: scan entry
1117*5113495bSYour Name  *
1118*5113495bSYour Name  * API, function to read extended csa IE
1119*5113495bSYour Name  *
1120*5113495bSYour Name  * Return: extended csaie or NULL if ie is not present
1121*5113495bSYour Name  */
1122*5113495bSYour Name static inline uint8_t*
util_scan_entry_xcsa(struct scan_cache_entry * scan_entry)1123*5113495bSYour Name util_scan_entry_xcsa(struct scan_cache_entry *scan_entry)
1124*5113495bSYour Name {
1125*5113495bSYour Name 	return scan_entry->ie_list.xcsa;
1126*5113495bSYour Name }
1127*5113495bSYour Name 
1128*5113495bSYour Name /**
1129*5113495bSYour Name  * util_scan_entry_htinfo() - function to read htinfo IE
1130*5113495bSYour Name  * @scan_entry: scan entry
1131*5113495bSYour Name  *
1132*5113495bSYour Name  * API, function to read htinfo IE
1133*5113495bSYour Name  *
1134*5113495bSYour Name  * Return: htinfoie or NULL if ie is not present
1135*5113495bSYour Name  */
1136*5113495bSYour Name static inline uint8_t*
util_scan_entry_htinfo(struct scan_cache_entry * scan_entry)1137*5113495bSYour Name util_scan_entry_htinfo(struct scan_cache_entry *scan_entry)
1138*5113495bSYour Name {
1139*5113495bSYour Name 	return scan_entry->ie_list.htinfo;
1140*5113495bSYour Name }
1141*5113495bSYour Name 
1142*5113495bSYour Name 
1143*5113495bSYour Name /**
1144*5113495bSYour Name  * util_scan_entry_htcap() - function to read htcap IE
1145*5113495bSYour Name  * @scan_entry: scan entry
1146*5113495bSYour Name  *
1147*5113495bSYour Name  * API, function to read htcap IE
1148*5113495bSYour Name  *
1149*5113495bSYour Name  * Return: htcapie or NULL if ie is not present
1150*5113495bSYour Name  */
1151*5113495bSYour Name static inline uint8_t*
util_scan_entry_htcap(struct scan_cache_entry * scan_entry)1152*5113495bSYour Name util_scan_entry_htcap(struct scan_cache_entry *scan_entry)
1153*5113495bSYour Name {
1154*5113495bSYour Name 	return scan_entry->ie_list.htcap;
1155*5113495bSYour Name }
1156*5113495bSYour Name 
1157*5113495bSYour Name /**
1158*5113495bSYour Name  * util_scan_entry_vhtcap() - function to read vhtcap IE
1159*5113495bSYour Name  * @scan_entry: scan entry
1160*5113495bSYour Name  *
1161*5113495bSYour Name  * API, function to read vhtcap IE
1162*5113495bSYour Name  *
1163*5113495bSYour Name  * Return: vhtcapie or NULL if ie is not present
1164*5113495bSYour Name  */
1165*5113495bSYour Name static inline uint8_t*
util_scan_entry_vhtcap(struct scan_cache_entry * scan_entry)1166*5113495bSYour Name util_scan_entry_vhtcap(struct scan_cache_entry *scan_entry)
1167*5113495bSYour Name {
1168*5113495bSYour Name 	return scan_entry->ie_list.vhtcap;
1169*5113495bSYour Name }
1170*5113495bSYour Name 
1171*5113495bSYour Name /**
1172*5113495bSYour Name  * util_scan_entry_vhtop() - function to read vhtop IE
1173*5113495bSYour Name  * @scan_entry: scan entry
1174*5113495bSYour Name  *
1175*5113495bSYour Name  * API, function to read vhtop IE
1176*5113495bSYour Name  *
1177*5113495bSYour Name  * Return: vhtopie or NULL if ie is not present
1178*5113495bSYour Name  */
1179*5113495bSYour Name static inline uint8_t*
util_scan_entry_vhtop(struct scan_cache_entry * scan_entry)1180*5113495bSYour Name util_scan_entry_vhtop(struct scan_cache_entry *scan_entry)
1181*5113495bSYour Name {
1182*5113495bSYour Name 	return scan_entry->ie_list.vhtop;
1183*5113495bSYour Name }
1184*5113495bSYour Name 
1185*5113495bSYour Name /**
1186*5113495bSYour Name  * util_scan_entry_quiet() - function to read quiet IE
1187*5113495bSYour Name  * @scan_entry: scan entry
1188*5113495bSYour Name  *
1189*5113495bSYour Name  * API, function to read quiet IE
1190*5113495bSYour Name  *
1191*5113495bSYour Name  * Return: quietie or NULL if ie is not present
1192*5113495bSYour Name  */
1193*5113495bSYour Name static inline uint8_t*
util_scan_entry_quiet(struct scan_cache_entry * scan_entry)1194*5113495bSYour Name util_scan_entry_quiet(struct scan_cache_entry *scan_entry)
1195*5113495bSYour Name {
1196*5113495bSYour Name 	return scan_entry->ie_list.quiet;
1197*5113495bSYour Name }
1198*5113495bSYour Name 
1199*5113495bSYour Name /**
1200*5113495bSYour Name  * util_scan_entry_qbssload() - function to read qbss load IE
1201*5113495bSYour Name  * @scan_entry: scan entry
1202*5113495bSYour Name  *
1203*5113495bSYour Name  * API, function to read qbss load IE
1204*5113495bSYour Name  *
1205*5113495bSYour Name  * Return: qbss loadie or NULL if ie is not present
1206*5113495bSYour Name  */
1207*5113495bSYour Name static inline uint8_t*
util_scan_entry_qbssload(struct scan_cache_entry * scan_entry)1208*5113495bSYour Name util_scan_entry_qbssload(struct scan_cache_entry *scan_entry)
1209*5113495bSYour Name {
1210*5113495bSYour Name 	return scan_entry->ie_list.qbssload;
1211*5113495bSYour Name }
1212*5113495bSYour Name 
1213*5113495bSYour Name /**
1214*5113495bSYour Name  * util_scan_entry_vendor() - function to read vendor IE
1215*5113495bSYour Name  * @scan_entry: scan entry
1216*5113495bSYour Name  *
1217*5113495bSYour Name  * API, function to read vendor IE
1218*5113495bSYour Name  *
1219*5113495bSYour Name  * Return: vendorie or NULL if ie is not present
1220*5113495bSYour Name  */
1221*5113495bSYour Name static inline uint8_t*
util_scan_entry_vendor(struct scan_cache_entry * scan_entry)1222*5113495bSYour Name util_scan_entry_vendor(struct scan_cache_entry *scan_entry)
1223*5113495bSYour Name {
1224*5113495bSYour Name 	return scan_entry->ie_list.vendor;
1225*5113495bSYour Name }
1226*5113495bSYour Name 
1227*5113495bSYour Name /**
1228*5113495bSYour Name  * util_scan_entry_country() - function to read country IE
1229*5113495bSYour Name  * @scan_entry: scan entry
1230*5113495bSYour Name  *
1231*5113495bSYour Name  * API, function to read country IE
1232*5113495bSYour Name  *
1233*5113495bSYour Name  * Return: countryie or NULL if ie is not present
1234*5113495bSYour Name  */
1235*5113495bSYour Name static inline struct wlan_country_ie*
util_scan_entry_country(struct scan_cache_entry * scan_entry)1236*5113495bSYour Name util_scan_entry_country(struct scan_cache_entry *scan_entry)
1237*5113495bSYour Name {
1238*5113495bSYour Name 	return (struct wlan_country_ie *)scan_entry->ie_list.country;
1239*5113495bSYour Name }
1240*5113495bSYour Name 
1241*5113495bSYour Name /**
1242*5113495bSYour Name  * util_scan_entry_copy_country() - function to copy country name
1243*5113495bSYour Name  * @scan_entry: scan entry
1244*5113495bSYour Name  * @cntry:      out buffer
1245*5113495bSYour Name  *
1246*5113495bSYour Name  * API, function to copy country name code string in given memory @centry
1247*5113495bSYour Name  *
1248*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if successfully copied country name
1249*5113495bSYour Name  *         QDF_STATUS_E_INVAL if passed buffer is null
1250*5113495bSYour Name  *         QDF_STATUS_E_NOMEM if scan entry dont have country IE
1251*5113495bSYour Name  */
1252*5113495bSYour Name static inline QDF_STATUS
util_scan_entry_copy_country(struct scan_cache_entry * scan_entry,uint8_t * cntry)1253*5113495bSYour Name util_scan_entry_copy_country(struct scan_cache_entry *scan_entry,
1254*5113495bSYour Name 	uint8_t *cntry)
1255*5113495bSYour Name {
1256*5113495bSYour Name 	struct wlan_country_ie *country_ie;
1257*5113495bSYour Name 
1258*5113495bSYour Name 	if (!cntry)
1259*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1260*5113495bSYour Name 
1261*5113495bSYour Name 	country_ie = util_scan_entry_country(scan_entry);
1262*5113495bSYour Name 
1263*5113495bSYour Name 	if (!country_ie)
1264*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1265*5113495bSYour Name 
1266*5113495bSYour Name 	qdf_mem_copy(cntry, country_ie->cc, 3);
1267*5113495bSYour Name 
1268*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1269*5113495bSYour Name }
1270*5113495bSYour Name 
1271*5113495bSYour Name /**
1272*5113495bSYour Name  * util_scan_entry_wmeinfo() - function to read wme info ie
1273*5113495bSYour Name  * @scan_entry: scan entry
1274*5113495bSYour Name  *
1275*5113495bSYour Name  * API, function to read wme info ie
1276*5113495bSYour Name  *
1277*5113495bSYour Name  * Return: wme infoie or NULL if ie is not present
1278*5113495bSYour Name  */
1279*5113495bSYour Name static inline uint8_t*
util_scan_entry_wmeinfo(struct scan_cache_entry * scan_entry)1280*5113495bSYour Name util_scan_entry_wmeinfo(struct scan_cache_entry *scan_entry)
1281*5113495bSYour Name {
1282*5113495bSYour Name 	return scan_entry->ie_list.wmeinfo;
1283*5113495bSYour Name }
1284*5113495bSYour Name 
1285*5113495bSYour Name /**
1286*5113495bSYour Name  * util_scan_entry_wmeparam() - function to read wme param ie
1287*5113495bSYour Name  * @scan_entry: scan entry
1288*5113495bSYour Name  *
1289*5113495bSYour Name  * API, function to read wme param ie
1290*5113495bSYour Name  *
1291*5113495bSYour Name  * Return: wme paramie or NULL if ie is not present
1292*5113495bSYour Name  */
1293*5113495bSYour Name static inline uint8_t*
util_scan_entry_wmeparam(struct scan_cache_entry * scan_entry)1294*5113495bSYour Name util_scan_entry_wmeparam(struct scan_cache_entry *scan_entry)
1295*5113495bSYour Name {
1296*5113495bSYour Name 	return scan_entry->ie_list.wmeparam;
1297*5113495bSYour Name }
1298*5113495bSYour Name 
1299*5113495bSYour Name /**
1300*5113495bSYour Name  * util_scan_entry_age() - function to read age of scan entry
1301*5113495bSYour Name  * @scan_entry: scan entry
1302*5113495bSYour Name  *
1303*5113495bSYour Name  * API, function to read age of scan entry
1304*5113495bSYour Name  *
1305*5113495bSYour Name  * Return: age in ms
1306*5113495bSYour Name  */
1307*5113495bSYour Name static inline qdf_time_t
util_scan_entry_age(struct scan_cache_entry * scan_entry)1308*5113495bSYour Name util_scan_entry_age(struct scan_cache_entry *scan_entry)
1309*5113495bSYour Name {
1310*5113495bSYour Name 	qdf_time_t ts = scan_entry->scan_entry_time;
1311*5113495bSYour Name 
1312*5113495bSYour Name 	return qdf_mc_timer_get_system_time() - ts;
1313*5113495bSYour Name }
1314*5113495bSYour Name 
1315*5113495bSYour Name /**
1316*5113495bSYour Name  * util_scan_mlme_info() - function to read mlme info struct
1317*5113495bSYour Name  * @scan_entry: scan entry
1318*5113495bSYour Name  *
1319*5113495bSYour Name  * API, function to read mlme info struct
1320*5113495bSYour Name  *
1321*5113495bSYour Name  * Return: mlme info
1322*5113495bSYour Name  */
1323*5113495bSYour Name static inline struct mlme_info*
util_scan_mlme_info(struct scan_cache_entry * scan_entry)1324*5113495bSYour Name util_scan_mlme_info(struct scan_cache_entry *scan_entry)
1325*5113495bSYour Name {
1326*5113495bSYour Name 	return &scan_entry->mlme_info;
1327*5113495bSYour Name }
1328*5113495bSYour Name 
1329*5113495bSYour Name /**
1330*5113495bSYour Name  * util_scan_entry_bss_type() - function to read bss type
1331*5113495bSYour Name  * @scan_entry: scan entry
1332*5113495bSYour Name  *
1333*5113495bSYour Name  * API, function to read bss type
1334*5113495bSYour Name  *
1335*5113495bSYour Name  * Return: bss type
1336*5113495bSYour Name  */
1337*5113495bSYour Name static inline enum wlan_bss_type
util_scan_entry_bss_type(struct scan_cache_entry * scan_entry)1338*5113495bSYour Name util_scan_entry_bss_type(struct scan_cache_entry *scan_entry)
1339*5113495bSYour Name {
1340*5113495bSYour Name 	if (scan_entry->cap_info.value & WLAN_CAPINFO_ESS)
1341*5113495bSYour Name 		return WLAN_TYPE_BSS;
1342*5113495bSYour Name 	else if (scan_entry->cap_info.value & WLAN_CAPINFO_IBSS)
1343*5113495bSYour Name 		return WLAN_TYPE_IBSS;
1344*5113495bSYour Name 	else
1345*5113495bSYour Name 		return WLAN_TYPE_ANY;
1346*5113495bSYour Name }
1347*5113495bSYour Name 
1348*5113495bSYour Name /**
1349*5113495bSYour Name  * util_scan_entry_privacy() - function to check if privacy is enebled
1350*5113495bSYour Name  * @scan_entry: scan entry
1351*5113495bSYour Name  *
1352*5113495bSYour Name  * API, function to check if privacy is enebled
1353*5113495bSYour Name  *
1354*5113495bSYour Name  * Return: true if privacy is enabled, false other wise
1355*5113495bSYour Name  */
1356*5113495bSYour Name static inline bool
util_scan_entry_privacy(struct scan_cache_entry * scan_entry)1357*5113495bSYour Name util_scan_entry_privacy(struct scan_cache_entry *scan_entry)
1358*5113495bSYour Name {
1359*5113495bSYour Name 	return (scan_entry->cap_info.value &
1360*5113495bSYour Name 		WLAN_CAPINFO_PRIVACY) ? true : false;
1361*5113495bSYour Name }
1362*5113495bSYour Name 
1363*5113495bSYour Name /**
1364*5113495bSYour Name  * util_scan_entry_athcaps() - function to read ath caps vendor ie
1365*5113495bSYour Name  * @scan_entry: scan entry
1366*5113495bSYour Name  *
1367*5113495bSYour Name  * API, function to read ath caps vendor ie
1368*5113495bSYour Name  *
1369*5113495bSYour Name  * Return: ath caps vendorie or NULL if ie is not present
1370*5113495bSYour Name  */
1371*5113495bSYour Name static inline uint8_t*
util_scan_entry_athcaps(struct scan_cache_entry * scan_entry)1372*5113495bSYour Name util_scan_entry_athcaps(struct scan_cache_entry *scan_entry)
1373*5113495bSYour Name {
1374*5113495bSYour Name 	return scan_entry->ie_list.athcaps;
1375*5113495bSYour Name }
1376*5113495bSYour Name 
1377*5113495bSYour Name /**
1378*5113495bSYour Name  * util_scan_entry_athextcaps() - function to read ath extcaps vendor ie
1379*5113495bSYour Name  * @scan_entry: scan entry
1380*5113495bSYour Name  *
1381*5113495bSYour Name  * API, function to read ath extcaps vendor ie
1382*5113495bSYour Name  *
1383*5113495bSYour Name  * Return: ath extcaps vendorie or NULL if ie is not present
1384*5113495bSYour Name  */
1385*5113495bSYour Name static inline uint8_t*
util_scan_entry_athextcaps(struct scan_cache_entry * scan_entry)1386*5113495bSYour Name util_scan_entry_athextcaps(struct scan_cache_entry *scan_entry)
1387*5113495bSYour Name {
1388*5113495bSYour Name 	return scan_entry->ie_list.athextcaps;
1389*5113495bSYour Name }
1390*5113495bSYour Name 
1391*5113495bSYour Name /**
1392*5113495bSYour Name  * util_scan_entry_bwnss_map() - function to read bwnss_map ie
1393*5113495bSYour Name  * @scan_entry: scan entry
1394*5113495bSYour Name  *
1395*5113495bSYour Name  * API, function to read bwnss_map ie
1396*5113495bSYour Name  *
1397*5113495bSYour Name  * Return: bwnss_map ie or NULL if ie is not present
1398*5113495bSYour Name  */
1399*5113495bSYour Name static inline uint8_t*
util_scan_entry_bwnss_map(struct scan_cache_entry * scan_entry)1400*5113495bSYour Name util_scan_entry_bwnss_map(struct scan_cache_entry *scan_entry)
1401*5113495bSYour Name {
1402*5113495bSYour Name 	return scan_entry->ie_list.bwnss_map;
1403*5113495bSYour Name }
1404*5113495bSYour Name 
1405*5113495bSYour Name /**
1406*5113495bSYour Name  * util_scan_entry_sonie() - function to read son ie
1407*5113495bSYour Name  * @scan_entry: scan entry
1408*5113495bSYour Name  *
1409*5113495bSYour Name  * API, function to read son ie
1410*5113495bSYour Name  *
1411*5113495bSYour Name  * Return: son ie or NULL if ie is not present
1412*5113495bSYour Name  */
1413*5113495bSYour Name static inline uint8_t*
util_scan_entry_sonie(struct scan_cache_entry * scan_entry)1414*5113495bSYour Name util_scan_entry_sonie(struct scan_cache_entry *scan_entry)
1415*5113495bSYour Name {
1416*5113495bSYour Name 	return scan_entry->ie_list.sonadv;
1417*5113495bSYour Name }
1418*5113495bSYour Name 
1419*5113495bSYour Name /**
1420*5113495bSYour Name  * util_scan_entry_widebw() - function to read wide band chan switch sub elem ie
1421*5113495bSYour Name  * @scan_entry: scan entry
1422*5113495bSYour Name  *
1423*5113495bSYour Name  * API, function to read wide band chan switch sub elem ie
1424*5113495bSYour Name  *
1425*5113495bSYour Name  * Return: wide band chan switch sub elem or NULL if ie is not present
1426*5113495bSYour Name  */
1427*5113495bSYour Name static inline uint8_t*
util_scan_entry_widebw(struct scan_cache_entry * scan_entry)1428*5113495bSYour Name util_scan_entry_widebw(struct scan_cache_entry *scan_entry)
1429*5113495bSYour Name {
1430*5113495bSYour Name 	return scan_entry->ie_list.widebw;
1431*5113495bSYour Name }
1432*5113495bSYour Name 
1433*5113495bSYour Name /**
1434*5113495bSYour Name  * util_scan_entry_secchanoff() - function to read secondary channel offset ie
1435*5113495bSYour Name  * @scan_entry: scan entry
1436*5113495bSYour Name  *
1437*5113495bSYour Name  * API, function to read secondary channel offset ie
1438*5113495bSYour Name  *
1439*5113495bSYour Name  * Return: secondary channel offset element or NULL if ie is not present
1440*5113495bSYour Name  */
1441*5113495bSYour Name static inline uint8_t*
util_scan_entry_secchanoff(struct scan_cache_entry * scan_entry)1442*5113495bSYour Name util_scan_entry_secchanoff(struct scan_cache_entry *scan_entry)
1443*5113495bSYour Name {
1444*5113495bSYour Name 	return scan_entry->ie_list.secchanoff;
1445*5113495bSYour Name }
1446*5113495bSYour Name 
1447*5113495bSYour Name /**
1448*5113495bSYour Name  * util_scan_entry_cswrp() - function to read channel switch wrapper ie
1449*5113495bSYour Name  * @scan_entry: scan entry
1450*5113495bSYour Name  *
1451*5113495bSYour Name  * API, function to read channel switch wrapper ie
1452*5113495bSYour Name  *
1453*5113495bSYour Name  * Return: channel switch wrapper element or NULL if ie is not present
1454*5113495bSYour Name  */
1455*5113495bSYour Name static inline uint8_t*
util_scan_entry_cswrp(struct scan_cache_entry * scan_entry)1456*5113495bSYour Name util_scan_entry_cswrp(struct scan_cache_entry *scan_entry)
1457*5113495bSYour Name {
1458*5113495bSYour Name 	return scan_entry->ie_list.cswrp;
1459*5113495bSYour Name }
1460*5113495bSYour Name 
1461*5113495bSYour Name /**
1462*5113495bSYour Name  * util_scan_entry_omn() - function to read operating mode notification ie
1463*5113495bSYour Name  * @scan_entry: scan entry
1464*5113495bSYour Name  *
1465*5113495bSYour Name  * API, function to read operating mode notification
1466*5113495bSYour Name  *
1467*5113495bSYour Name  * Return: operating mode notification element or NULL if ie is not present
1468*5113495bSYour Name  */
1469*5113495bSYour Name static inline uint8_t*
util_scan_entry_omn(struct scan_cache_entry * scan_entry)1470*5113495bSYour Name util_scan_entry_omn(struct scan_cache_entry *scan_entry)
1471*5113495bSYour Name {
1472*5113495bSYour Name 	return scan_entry->ie_list.opmode;
1473*5113495bSYour Name }
1474*5113495bSYour Name 
1475*5113495bSYour Name /**
1476*5113495bSYour Name  * util_scan_entry_extcaps() - function to read extcap ie
1477*5113495bSYour Name  * @scan_entry: scan entry
1478*5113495bSYour Name  *
1479*5113495bSYour Name  * API, function to read extcap ie
1480*5113495bSYour Name  *
1481*5113495bSYour Name  * Return: extcap element or NULL if ie is not present
1482*5113495bSYour Name  */
1483*5113495bSYour Name static inline uint8_t*
util_scan_entry_extcaps(struct scan_cache_entry * scan_entry)1484*5113495bSYour Name util_scan_entry_extcaps(struct scan_cache_entry *scan_entry)
1485*5113495bSYour Name {
1486*5113495bSYour Name 	return scan_entry->ie_list.extcaps;
1487*5113495bSYour Name }
1488*5113495bSYour Name 
1489*5113495bSYour Name /**
1490*5113495bSYour Name  * util_scan_entry_get_extcap() - function to read extended capability field ie
1491*5113495bSYour Name  * @scan_entry: scan entry
1492*5113495bSYour Name  * @extcap_bit_field: extended capability bit field
1493*5113495bSYour Name  * @extcap_value: pointer to fill extended capability field value
1494*5113495bSYour Name  *
1495*5113495bSYour Name  * API, function to read extended capability field
1496*5113495bSYour Name  *
1497*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if extended capability field is found
1498*5113495bSYour Name  *         QDF_STATUS_E_NOMEM if extended capability field is not found
1499*5113495bSYour Name  */
1500*5113495bSYour Name static inline QDF_STATUS
util_scan_entry_get_extcap(struct scan_cache_entry * scan_entry,enum ext_cap_bit_field extcap_bit_field,uint8_t * extcap_value)1501*5113495bSYour Name util_scan_entry_get_extcap(struct scan_cache_entry *scan_entry,
1502*5113495bSYour Name 			   enum ext_cap_bit_field extcap_bit_field,
1503*5113495bSYour Name 			   uint8_t *extcap_value)
1504*5113495bSYour Name {
1505*5113495bSYour Name 	struct wlan_ext_cap_ie *ext_cap =
1506*5113495bSYour Name 		(struct wlan_ext_cap_ie *)util_scan_entry_extcaps(scan_entry);
1507*5113495bSYour Name 
1508*5113495bSYour Name 	uint8_t ext_caps_byte = (extcap_bit_field >> 3);
1509*5113495bSYour Name 	uint8_t ext_caps_bit_pos = extcap_bit_field & 0x7;
1510*5113495bSYour Name 
1511*5113495bSYour Name 	*extcap_value = 0;
1512*5113495bSYour Name 
1513*5113495bSYour Name 	if (!ext_cap)
1514*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
1515*5113495bSYour Name 
1516*5113495bSYour Name 	if (ext_cap->ext_cap_len <= ext_caps_byte)
1517*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
1518*5113495bSYour Name 
1519*5113495bSYour Name 	*extcap_value =
1520*5113495bSYour Name 		((ext_cap->ext_caps[ext_caps_byte] >> ext_caps_bit_pos) & 0x1);
1521*5113495bSYour Name 
1522*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1523*5113495bSYour Name }
1524*5113495bSYour Name 
1525*5113495bSYour Name /**
1526*5113495bSYour Name  * util_scan_entry_mlme_info() - function to read MLME info
1527*5113495bSYour Name  * @scan_entry: scan entry
1528*5113495bSYour Name  *
1529*5113495bSYour Name  * API, function to read MLME info
1530*5113495bSYour Name  *
1531*5113495bSYour Name  * Return: MLME info or NULL if it is not present
1532*5113495bSYour Name  */
1533*5113495bSYour Name static inline struct mlme_info*
util_scan_entry_mlme_info(struct scan_cache_entry * scan_entry)1534*5113495bSYour Name util_scan_entry_mlme_info(struct scan_cache_entry *scan_entry)
1535*5113495bSYour Name {
1536*5113495bSYour Name 	return &(scan_entry->mlme_info);
1537*5113495bSYour Name }
1538*5113495bSYour Name 
1539*5113495bSYour Name /**
1540*5113495bSYour Name * util_scan_entry_mcst() - function to read mcst IE
1541*5113495bSYour Name * @scan_entry:scan entry
1542*5113495bSYour Name *
1543*5113495bSYour Name * API, function to read mcst IE
1544*5113495bSYour Name *
1545*5113495bSYour Name * Return: mcst or NULL if ie is not present
1546*5113495bSYour Name */
1547*5113495bSYour Name static inline uint8_t*
util_scan_entry_mcst(struct scan_cache_entry * scan_entry)1548*5113495bSYour Name util_scan_entry_mcst(struct scan_cache_entry *scan_entry)
1549*5113495bSYour Name {
1550*5113495bSYour Name 	return scan_entry->ie_list.mcst;
1551*5113495bSYour Name }
1552*5113495bSYour Name 
1553*5113495bSYour Name /**
1554*5113495bSYour Name  * util_scan_entry_hecap() - function to read he caps vendor ie
1555*5113495bSYour Name  * @scan_entry: scan entry
1556*5113495bSYour Name  *
1557*5113495bSYour Name  * API, function to read he caps vendor ie
1558*5113495bSYour Name  *
1559*5113495bSYour Name  * Return: he caps vendorie or NULL if ie is not present
1560*5113495bSYour Name  */
1561*5113495bSYour Name static inline uint8_t*
util_scan_entry_hecap(struct scan_cache_entry * scan_entry)1562*5113495bSYour Name util_scan_entry_hecap(struct scan_cache_entry *scan_entry)
1563*5113495bSYour Name {
1564*5113495bSYour Name 	return scan_entry->ie_list.hecap;
1565*5113495bSYour Name }
1566*5113495bSYour Name 
1567*5113495bSYour Name /**
1568*5113495bSYour Name  * util_scan_entry_he_6g_cap() - function to read  he 6GHz caps vendor ie
1569*5113495bSYour Name  * @scan_entry: scan entry
1570*5113495bSYour Name  *
1571*5113495bSYour Name  * API, function to read he 6GHz caps vendor ie
1572*5113495bSYour Name  *
1573*5113495bSYour Name  * Return: he caps vendorie or NULL if ie is not present
1574*5113495bSYour Name  */
1575*5113495bSYour Name static inline uint8_t*
util_scan_entry_he_6g_cap(struct scan_cache_entry * scan_entry)1576*5113495bSYour Name util_scan_entry_he_6g_cap(struct scan_cache_entry *scan_entry)
1577*5113495bSYour Name {
1578*5113495bSYour Name 	return scan_entry->ie_list.hecap_6g;
1579*5113495bSYour Name }
1580*5113495bSYour Name 
1581*5113495bSYour Name /**
1582*5113495bSYour Name  * util_scan_entry_heop() - function to read heop vendor ie
1583*5113495bSYour Name  * @scan_entry: scan entry
1584*5113495bSYour Name  *
1585*5113495bSYour Name  * API, function to read heop vendor ie
1586*5113495bSYour Name  *
1587*5113495bSYour Name  * Return, heop vendorie or NULL if ie is not present
1588*5113495bSYour Name  */
1589*5113495bSYour Name static inline uint8_t*
util_scan_entry_heop(struct scan_cache_entry * scan_entry)1590*5113495bSYour Name util_scan_entry_heop(struct scan_cache_entry *scan_entry)
1591*5113495bSYour Name {
1592*5113495bSYour Name 	return scan_entry->ie_list.heop;
1593*5113495bSYour Name }
1594*5113495bSYour Name 
1595*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1596*5113495bSYour Name /**
1597*5113495bSYour Name  * util_scan_entry_ehtcap() - function to read eht caps vendor ie
1598*5113495bSYour Name  * @scan_entry: scan entry
1599*5113495bSYour Name  *
1600*5113495bSYour Name  * API, function to read eht caps vendor ie
1601*5113495bSYour Name  *
1602*5113495bSYour Name  * Return: eht caps vendorie or NULL if ie is not present
1603*5113495bSYour Name  */
1604*5113495bSYour Name static inline uint8_t*
util_scan_entry_ehtcap(struct scan_cache_entry * scan_entry)1605*5113495bSYour Name util_scan_entry_ehtcap(struct scan_cache_entry *scan_entry)
1606*5113495bSYour Name {
1607*5113495bSYour Name 	return scan_entry->ie_list.ehtcap;
1608*5113495bSYour Name }
1609*5113495bSYour Name 
1610*5113495bSYour Name /**
1611*5113495bSYour Name  * util_scan_entry_ehtop() - function to read ehtop vendor ie
1612*5113495bSYour Name  * @scan_entry: scan entry
1613*5113495bSYour Name  *
1614*5113495bSYour Name  * API, function to read ehtop vendor ie
1615*5113495bSYour Name  *
1616*5113495bSYour Name  * Return, ehtop vendorie or NULL if ie is not present
1617*5113495bSYour Name  */
1618*5113495bSYour Name static inline uint8_t*
util_scan_entry_ehtop(struct scan_cache_entry * scan_entry)1619*5113495bSYour Name util_scan_entry_ehtop(struct scan_cache_entry *scan_entry)
1620*5113495bSYour Name {
1621*5113495bSYour Name 	return scan_entry->ie_list.ehtop;
1622*5113495bSYour Name }
1623*5113495bSYour Name 
1624*5113495bSYour Name static inline uint8_t*
util_scan_entry_bw_ind(struct scan_cache_entry * scan_entry)1625*5113495bSYour Name util_scan_entry_bw_ind(struct scan_cache_entry *scan_entry)
1626*5113495bSYour Name {
1627*5113495bSYour Name 	return scan_entry->ie_list.bw_ind;
1628*5113495bSYour Name }
1629*5113495bSYour Name #else
1630*5113495bSYour Name 
1631*5113495bSYour Name static inline uint8_t*
util_scan_entry_ehtcap(struct scan_cache_entry * scan_entry)1632*5113495bSYour Name util_scan_entry_ehtcap(struct scan_cache_entry *scan_entry)
1633*5113495bSYour Name {
1634*5113495bSYour Name 	return NULL;
1635*5113495bSYour Name }
1636*5113495bSYour Name 
1637*5113495bSYour Name static inline uint8_t*
util_scan_entry_bw_ind(struct scan_cache_entry * scan_entry)1638*5113495bSYour Name util_scan_entry_bw_ind(struct scan_cache_entry *scan_entry)
1639*5113495bSYour Name {
1640*5113495bSYour Name 	return NULL;
1641*5113495bSYour Name }
1642*5113495bSYour Name #endif
1643*5113495bSYour Name 
1644*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
1645*5113495bSYour Name static inline uint8_t*
util_scan_entry_t2lm(struct scan_cache_entry * scan_entry)1646*5113495bSYour Name util_scan_entry_t2lm(struct scan_cache_entry *scan_entry)
1647*5113495bSYour Name {
1648*5113495bSYour Name 	return scan_entry->ie_list.t2lm[0];
1649*5113495bSYour Name }
1650*5113495bSYour Name 
1651*5113495bSYour Name /**
1652*5113495bSYour Name  * util_scan_entry_t2lm_len() - API to get t2lm IE length
1653*5113495bSYour Name  * @scan_entry: scan entry
1654*5113495bSYour Name  *
1655*5113495bSYour Name  * Return, Length or 0 if ie is not present
1656*5113495bSYour Name  */
1657*5113495bSYour Name uint32_t util_scan_entry_t2lm_len(struct scan_cache_entry *scan_entry);
1658*5113495bSYour Name #else
1659*5113495bSYour Name static inline uint8_t*
util_scan_entry_t2lm(struct scan_cache_entry * scan_entry)1660*5113495bSYour Name util_scan_entry_t2lm(struct scan_cache_entry *scan_entry)
1661*5113495bSYour Name {
1662*5113495bSYour Name 	return NULL;
1663*5113495bSYour Name }
1664*5113495bSYour Name 
1665*5113495bSYour Name static inline uint32_t
util_scan_entry_t2lm_len(struct scan_cache_entry * scan_entry)1666*5113495bSYour Name util_scan_entry_t2lm_len(struct scan_cache_entry *scan_entry)
1667*5113495bSYour Name {
1668*5113495bSYour Name 	return 0;
1669*5113495bSYour Name }
1670*5113495bSYour Name #endif
1671*5113495bSYour Name 
1672*5113495bSYour Name /**
1673*5113495bSYour Name  * util_scan_entry_tpe() - function to read tpe ie
1674*5113495bSYour Name  * @scan_entry: scan entry
1675*5113495bSYour Name  *
1676*5113495bSYour Name  * API, function to read tpe ie
1677*5113495bSYour Name  *
1678*5113495bSYour Name  * Return, tpe ie or NULL if ie is not present
1679*5113495bSYour Name  */
1680*5113495bSYour Name static inline uint8_t**
util_scan_entry_tpe(struct scan_cache_entry * scan_entry)1681*5113495bSYour Name util_scan_entry_tpe(struct scan_cache_entry *scan_entry)
1682*5113495bSYour Name {
1683*5113495bSYour Name 	return scan_entry->ie_list.tpe;
1684*5113495bSYour Name }
1685*5113495bSYour Name 
1686*5113495bSYour Name /**
1687*5113495bSYour Name  * util_scan_entry_muedca() - function to read MU-EDCA IE
1688*5113495bSYour Name  * @scan_entry: scan entry
1689*5113495bSYour Name  *
1690*5113495bSYour Name  * API, function to read MU-EDCA IE
1691*5113495bSYour Name  *
1692*5113495bSYour Name  * Return, MUEDCA IE or NULL if IE is not present
1693*5113495bSYour Name  */
1694*5113495bSYour Name static inline uint8_t*
util_scan_entry_muedca(struct scan_cache_entry * scan_entry)1695*5113495bSYour Name util_scan_entry_muedca(struct scan_cache_entry *scan_entry)
1696*5113495bSYour Name {
1697*5113495bSYour Name 	return scan_entry->ie_list.muedca;
1698*5113495bSYour Name }
1699*5113495bSYour Name 
1700*5113495bSYour Name /**
1701*5113495bSYour Name  * util_scan_entry_spatial_reuse_parameter() - function to read spatial reuse
1702*5113495bSYour Name  *                                             parameter ie
1703*5113495bSYour Name  * @scan_entry: scan entry
1704*5113495bSYour Name  *
1705*5113495bSYour Name  * API, function to read scan_entry reuse parameter ie
1706*5113495bSYour Name  *
1707*5113495bSYour Name  * Return, spatial reuse parameter ie or NULL if ie is not present
1708*5113495bSYour Name  */
1709*5113495bSYour Name static inline uint8_t*
util_scan_entry_spatial_reuse_parameter(struct scan_cache_entry * scan_entry)1710*5113495bSYour Name util_scan_entry_spatial_reuse_parameter(struct scan_cache_entry *scan_entry)
1711*5113495bSYour Name {
1712*5113495bSYour Name 	return scan_entry->ie_list.srp;
1713*5113495bSYour Name }
1714*5113495bSYour Name 
1715*5113495bSYour Name /**
1716*5113495bSYour Name  * util_scan_entry_fils_indication() - function to read FILS indication ie
1717*5113495bSYour Name  * @scan_entry: scan entry
1718*5113495bSYour Name  *
1719*5113495bSYour Name  * API, function to read FILS indication ie
1720*5113495bSYour Name  *
1721*5113495bSYour Name  * Return, FILS indication ie or NULL if ie is not present
1722*5113495bSYour Name  */
1723*5113495bSYour Name static inline uint8_t*
util_scan_entry_fils_indication(struct scan_cache_entry * scan_entry)1724*5113495bSYour Name util_scan_entry_fils_indication(struct scan_cache_entry *scan_entry)
1725*5113495bSYour Name {
1726*5113495bSYour Name 	return scan_entry->ie_list.fils_indication;
1727*5113495bSYour Name }
1728*5113495bSYour Name 
1729*5113495bSYour Name /**
1730*5113495bSYour Name  * util_get_last_scan_time() - function to get last scan time on this pdev
1731*5113495bSYour Name  * @vdev: vdev object
1732*5113495bSYour Name  *
1733*5113495bSYour Name  * API, function to read last scan time on this pdev
1734*5113495bSYour Name  *
1735*5113495bSYour Name  * Return: qdf_time_t
1736*5113495bSYour Name  */
1737*5113495bSYour Name qdf_time_t
1738*5113495bSYour Name util_get_last_scan_time(struct wlan_objmgr_vdev *vdev);
1739*5113495bSYour Name 
1740*5113495bSYour Name /**
1741*5113495bSYour Name  * util_scan_entry_update_mlme_info() - function to update mlme info
1742*5113495bSYour Name  * @pdev: pdev object
1743*5113495bSYour Name  * @scan_entry: scan entry object
1744*5113495bSYour Name  *
1745*5113495bSYour Name  * API, function to update mlme info in scan DB
1746*5113495bSYour Name  *
1747*5113495bSYour Name  * Return: QDF_STATUS
1748*5113495bSYour Name  */
1749*5113495bSYour Name QDF_STATUS
1750*5113495bSYour Name util_scan_entry_update_mlme_info(struct wlan_objmgr_pdev *pdev,
1751*5113495bSYour Name 	struct scan_cache_entry *scan_entry);
1752*5113495bSYour Name 
1753*5113495bSYour Name /**
1754*5113495bSYour Name  * util_scan_is_hidden_ssid() - function to check if ssid is hidden
1755*5113495bSYour Name  * @ssid: struct ie_ssid object
1756*5113495bSYour Name  *
1757*5113495bSYour Name  * API, function to check if ssid is hidden
1758*5113495bSYour Name  *
1759*5113495bSYour Name  * Return: true if ap is hidden, false otherwise
1760*5113495bSYour Name  */
1761*5113495bSYour Name bool
1762*5113495bSYour Name util_scan_is_hidden_ssid(struct ie_ssid *ssid);
1763*5113495bSYour Name 
1764*5113495bSYour Name /**
1765*5113495bSYour Name  * util_scan_entry_is_hidden_ap() - function to check if ap is hidden
1766*5113495bSYour Name  * @scan_entry: scan entry
1767*5113495bSYour Name  *
1768*5113495bSYour Name  * API, function to check if ap is hidden
1769*5113495bSYour Name  *
1770*5113495bSYour Name  * Return: true if ap is hidden, false otherwise
1771*5113495bSYour Name  */
1772*5113495bSYour Name static inline bool
util_scan_entry_is_hidden_ap(struct scan_cache_entry * scan_entry)1773*5113495bSYour Name util_scan_entry_is_hidden_ap(struct scan_cache_entry *scan_entry)
1774*5113495bSYour Name {
1775*5113495bSYour Name     return util_scan_is_hidden_ssid(
1776*5113495bSYour Name 			(struct ie_ssid *)scan_entry->ie_list.ssid);
1777*5113495bSYour Name }
1778*5113495bSYour Name 
1779*5113495bSYour Name /**
1780*5113495bSYour Name  * util_scan_entry_esp_info() - function to read ESP info
1781*5113495bSYour Name  * @scan_entry: scan entry
1782*5113495bSYour Name  *
1783*5113495bSYour Name  * API, function to read ESP info
1784*5113495bSYour Name  *
1785*5113495bSYour Name  * Return: erp info
1786*5113495bSYour Name  */
1787*5113495bSYour Name static inline uint8_t *
util_scan_entry_esp_info(struct scan_cache_entry * scan_entry)1788*5113495bSYour Name util_scan_entry_esp_info(struct scan_cache_entry *scan_entry)
1789*5113495bSYour Name {
1790*5113495bSYour Name 	return scan_entry->ie_list.esp;
1791*5113495bSYour Name }
1792*5113495bSYour Name 
1793*5113495bSYour Name /**
1794*5113495bSYour Name  * util_scan_entry_mbo_oce() - function to read MBO/OCE ie
1795*5113495bSYour Name  * @scan_entry: scan entry
1796*5113495bSYour Name  *
1797*5113495bSYour Name  * API, function to read MBO/OCE ie
1798*5113495bSYour Name  *
1799*5113495bSYour Name  * Return: MBO/OCE ie
1800*5113495bSYour Name  */
1801*5113495bSYour Name static inline uint8_t *
util_scan_entry_mbo_oce(struct scan_cache_entry * scan_entry)1802*5113495bSYour Name util_scan_entry_mbo_oce(struct scan_cache_entry *scan_entry)
1803*5113495bSYour Name {
1804*5113495bSYour Name 	return scan_entry->ie_list.mbo_oce;
1805*5113495bSYour Name }
1806*5113495bSYour Name 
1807*5113495bSYour Name /**
1808*5113495bSYour Name  * util_scan_entry_rsnxe() - function to read RSNXE ie
1809*5113495bSYour Name  * @scan_entry: scan entry
1810*5113495bSYour Name  *
1811*5113495bSYour Name  * API, function to read RSNXE ie
1812*5113495bSYour Name  *
1813*5113495bSYour Name  * Return: RSNXE ie
1814*5113495bSYour Name  */
1815*5113495bSYour Name static inline uint8_t *
util_scan_entry_rsnxe(struct scan_cache_entry * scan_entry)1816*5113495bSYour Name util_scan_entry_rsnxe(struct scan_cache_entry *scan_entry)
1817*5113495bSYour Name {
1818*5113495bSYour Name 	return scan_entry->ie_list.rsnxe;
1819*5113495bSYour Name }
1820*5113495bSYour Name 
1821*5113495bSYour Name /**
1822*5113495bSYour Name  * util_is_rsnxe_h2e_capable() - API to check whether the RSNXE has
1823*5113495bSYour Name  * H2E capable or not.
1824*5113495bSYour Name  * @rsnxe: Pointer to RSNXE IE.
1825*5113495bSYour Name  *
1826*5113495bSYour Name  * Returns true if RSNXE caps has H2E capable bit set or else false.
1827*5113495bSYour Name  *
1828*5113495bSYour Name  * Return: bool
1829*5113495bSYour Name  */
1830*5113495bSYour Name bool util_is_rsnxe_h2e_capable(const uint8_t *rsnxe);
1831*5113495bSYour Name 
1832*5113495bSYour Name /**
1833*5113495bSYour Name  * util_scan_entry_sae_h2e_capable() - API to check whether the
1834*5113495bSYour Name  * current scan entry is SAE-H2E capable
1835*5113495bSYour Name  * @scan_entry: Scan cache entry
1836*5113495bSYour Name  *
1837*5113495bSYour Name  * Returns true if the current scan entry has RSNXE IE with H2E bit
1838*5113495bSYour Name  * set.
1839*5113495bSYour Name  *
1840*5113495bSYour Name  * Return: bool
1841*5113495bSYour Name  */
1842*5113495bSYour Name bool util_scan_entry_sae_h2e_capable(struct scan_cache_entry *scan_entry);
1843*5113495bSYour Name 
1844*5113495bSYour Name /**
1845*5113495bSYour Name  * util_scan_scm_freq_to_band() - API to get band from frequency
1846*5113495bSYour Name  * @freq: Channel frequency
1847*5113495bSYour Name  *
1848*5113495bSYour Name  * Return: Band information as per frequency
1849*5113495bSYour Name  */
1850*5113495bSYour Name enum wlan_band util_scan_scm_freq_to_band(uint16_t freq);
1851*5113495bSYour Name 
1852*5113495bSYour Name /**
1853*5113495bSYour Name  * util_is_scan_completed() - function to get scan complete status
1854*5113495bSYour Name  * @event: scan event
1855*5113495bSYour Name  * @success: true if scan complete success, false otherwise
1856*5113495bSYour Name  *
1857*5113495bSYour Name  * API, function to get the scan result
1858*5113495bSYour Name  *
1859*5113495bSYour Name  * Return: true if scan complete, false otherwise
1860*5113495bSYour Name  */
1861*5113495bSYour Name bool util_is_scan_completed(struct scan_event *event, bool *success);
1862*5113495bSYour Name 
1863*5113495bSYour Name /**
1864*5113495bSYour Name  * util_scan_entry_extenderie() - function to read extender IE
1865*5113495bSYour Name  * @scan_entry: scan entry
1866*5113495bSYour Name  *
1867*5113495bSYour Name  * API, function to read extender IE
1868*5113495bSYour Name  *
1869*5113495bSYour Name  * Return: extenderie or NULL if ie is not present
1870*5113495bSYour Name  */
1871*5113495bSYour Name static inline uint8_t*
util_scan_entry_extenderie(struct scan_cache_entry * scan_entry)1872*5113495bSYour Name util_scan_entry_extenderie(struct scan_cache_entry *scan_entry)
1873*5113495bSYour Name {
1874*5113495bSYour Name 	return scan_entry->ie_list.extender;
1875*5113495bSYour Name }
1876*5113495bSYour Name 
1877*5113495bSYour Name /**
1878*5113495bSYour Name  * util_scan_entry_mdie() - function to read Mobility Domain IE
1879*5113495bSYour Name  * @scan_entry: scan entry
1880*5113495bSYour Name  *
1881*5113495bSYour Name  * API, function to read Mobility Domain IE
1882*5113495bSYour Name  *
1883*5113495bSYour Name  * Return: MDIE or NULL if IE is not present
1884*5113495bSYour Name  */
1885*5113495bSYour Name static inline uint8_t*
util_scan_entry_mdie(struct scan_cache_entry * scan_entry)1886*5113495bSYour Name util_scan_entry_mdie(struct scan_cache_entry *scan_entry)
1887*5113495bSYour Name {
1888*5113495bSYour Name 	return scan_entry->ie_list.mdie;
1889*5113495bSYour Name }
1890*5113495bSYour Name 
1891*5113495bSYour Name /**
1892*5113495bSYour Name  * util_scan_is_null_ssid() - to check for NULL ssid
1893*5113495bSYour Name  * @ssid: ssid
1894*5113495bSYour Name  *
1895*5113495bSYour Name  * Return: true if NULL ssid else false
1896*5113495bSYour Name  */
util_scan_is_null_ssid(struct wlan_ssid * ssid)1897*5113495bSYour Name static inline bool util_scan_is_null_ssid(struct wlan_ssid *ssid)
1898*5113495bSYour Name {
1899*5113495bSYour Name 	uint32_t ssid_length;
1900*5113495bSYour Name 	uint8_t *ssid_str;
1901*5113495bSYour Name 
1902*5113495bSYour Name 	if (ssid->length == 0)
1903*5113495bSYour Name 		return true;
1904*5113495bSYour Name 
1905*5113495bSYour Name 	/* Consider 0 or space for hidden SSID */
1906*5113495bSYour Name 	if (0 == ssid->ssid[0])
1907*5113495bSYour Name 		return true;
1908*5113495bSYour Name 
1909*5113495bSYour Name 	ssid_length = ssid->length;
1910*5113495bSYour Name 	ssid_str = ssid->ssid;
1911*5113495bSYour Name 
1912*5113495bSYour Name 	while (ssid_length) {
1913*5113495bSYour Name 		if (*ssid_str != ASCII_SPACE_CHARACTER &&
1914*5113495bSYour Name 		    *ssid_str)
1915*5113495bSYour Name 			break;
1916*5113495bSYour Name 		ssid_str++;
1917*5113495bSYour Name 		ssid_length--;
1918*5113495bSYour Name 	}
1919*5113495bSYour Name 
1920*5113495bSYour Name 	if (ssid_length == 0)
1921*5113495bSYour Name 		return true;
1922*5113495bSYour Name 
1923*5113495bSYour Name 	return false;
1924*5113495bSYour Name }
1925*5113495bSYour Name 
1926*5113495bSYour Name /**
1927*5113495bSYour Name  * util_scan_get_6g_oper_channel() - function to get primary channel
1928*5113495bSYour Name  * from he op IE
1929*5113495bSYour Name  * @he_op_ie : ie pointer
1930*5113495bSYour Name  *
1931*5113495bSYour Name  * Return: primary channel or 0 if 6g params is not present.
1932*5113495bSYour Name  */
1933*5113495bSYour Name #ifdef CONFIG_BAND_6GHZ
1934*5113495bSYour Name uint8_t util_scan_get_6g_oper_channel(uint8_t *he_op_ie);
1935*5113495bSYour Name #else
1936*5113495bSYour Name static inline uint8_t
util_scan_get_6g_oper_channel(uint8_t * he_op_ie)1937*5113495bSYour Name util_scan_get_6g_oper_channel(uint8_t *he_op_ie)
1938*5113495bSYour Name {
1939*5113495bSYour Name 	return 0;
1940*5113495bSYour Name }
1941*5113495bSYour Name #endif
1942*5113495bSYour Name /*
1943*5113495bSYour Name  * util_is_bssid_non_tx() - Is the given BSSID a non-tx neighbor
1944*5113495bSYour Name  * entry in the RNR db
1945*5113495bSYour Name  * @psoc: psoc
1946*5113495bSYour Name  * @bssid: bssid
1947*5113495bSYour Name  * @freq: frequency corresponding to the bssid
1948*5113495bSYour Name  *
1949*5113495bSYour Name  * Return: Is bssid non tx
1950*5113495bSYour Name  */
1951*5113495bSYour Name bool util_is_bssid_non_tx(struct wlan_objmgr_psoc *psoc,
1952*5113495bSYour Name 			  struct qdf_mac_addr *bssid, qdf_freq_t freq);
1953*5113495bSYour Name #endif
1954