1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * DOC: contains scan api
22  */
23 
24 #ifndef _WLAN_SCAN_API_H_
25 #define _WLAN_SCAN_API_H_
26 
27 #include <wlan_objmgr_psoc_obj.h>
28 #include <wlan_objmgr_pdev_obj.h>
29 #include <wlan_objmgr_vdev_obj.h>
30 #include "../../core/src/wlan_scan_main.h"
31 
32 #ifdef FEATURE_SET
33 /**
34  * wlan_scan_get_feature_info() - Get scan feature set info
35  * @psoc: pointer to psoc object
36  * @scan_feature_set: feature set info which needs to be filled
37  *
38  * Return: none
39  */
40 void wlan_scan_get_feature_info(struct wlan_objmgr_psoc *psoc,
41 				struct wlan_scan_features *scan_feature_set);
42 #endif
43 
44 /**
45  * wlan_scan_get_scan_entry_by_mac_freq() - API to get scan entry
46  * info from scan db by mac addr
47  * @pdev: pointer to pdev object
48  * @bssid: pointer to mac addr
49  * @freq: frequency for scan filter
50  *
51  * Return: scan entry if found, else NULL
52  */
53 struct scan_cache_entry *
54 wlan_scan_get_scan_entry_by_mac_freq(struct wlan_objmgr_pdev *pdev,
55 				     struct qdf_mac_addr *bssid,
56 				     uint16_t freq);
57 
58 /**
59  * wlan_scan_cfg_set_active_2g_dwelltime() - API to set scan active 2g dwelltime
60  * @psoc: pointer to psoc object
61  * @dwell_time: scan active dwell time
62  *
63  * Return: none
64  */
65 void wlan_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
66 					   uint32_t dwell_time);
67 
68 /**
69  * wlan_scan_cfg_get_active_2g_dwelltime() - API to get active 2g dwelltime
70  * @psoc: pointer to psoc object
71  * @dwell_time: scan active dwelltime
72  *
73  * Return: scan active dwell time
74  */
75 void wlan_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc,
76 					   uint32_t *dwell_time);
77 
78 #ifdef CONFIG_BAND_6GHZ
79 /**
80  * wlan_scan_cfg_set_active_6g_dwelltime() - API to set scan active 6g dwelltime
81  * @psoc: pointer to psoc object
82  * @dwell_time: scan active dwell time
83  *
84  * Return: QDF_STATUS
85  */
86 QDF_STATUS wlan_scan_cfg_set_active_6g_dwelltime(struct wlan_objmgr_psoc *psoc,
87 						 uint32_t dwell_time);
88 
89 /**
90  * wlan_scan_cfg_get_active_6g_dwelltime() - API to get active 6g dwelltime
91  * @psoc: pointer to psoc object
92  * @dwell_time: scan active dwelltime
93  *
94  * Return: QDF_STATUS
95  */
96 QDF_STATUS wlan_scan_cfg_get_active_6g_dwelltime(struct wlan_objmgr_psoc *psoc,
97 						 uint32_t *dwell_time);
98 
99 /**
100  * wlan_scan_cfg_set_passive_6g_dwelltime() - API to set scan passive 6g
101  *                                            dwelltime
102  * @psoc: pointer to psoc object
103  * @dwell_time: scan passive dwell time
104  *
105  * Return: QDF_STATUS
106  */
107 QDF_STATUS wlan_scan_cfg_set_passive_6g_dwelltime(struct wlan_objmgr_psoc *psoc,
108 						  uint32_t dwell_time);
109 
110 /**
111  * wlan_scan_cfg_get_passive_6g_dwelltime() - API to get passive 6g dwelltime
112  * @psoc: pointer to psoc object
113  * @dwell_time: scan passive dwelltime
114  *
115  * Return: QDF_STATUS
116  */
117 QDF_STATUS wlan_scan_cfg_get_passive_6g_dwelltime(struct wlan_objmgr_psoc *psoc,
118 						  uint32_t *dwell_time);
119 
120 /**
121  * wlan_scan_cfg_get_min_dwelltime_6g() - API to get minimum 6g dwelltime
122  * @psoc: pointer to psoc object
123  * @min_dwell_time_6ghz: minimum dwelltime 6g
124  *
125  * Return: QDF_STATUS
126  */
127 void wlan_scan_cfg_get_min_dwelltime_6g(struct wlan_objmgr_psoc *psoc,
128 					uint32_t *min_dwell_time_6ghz);
129 
130 /**
131  * wlan_scan_cfg_set_scan_mode_6g() - API to set scan mode for 6 GHz
132  * @psoc: pointer to psoc object
133  * @scan_mode_6g: scan mode value for 6 GHz
134  *
135  * Return: QDF_STATUS
136  */
137 QDF_STATUS wlan_scan_cfg_set_scan_mode_6g(struct wlan_objmgr_psoc *psoc,
138 					  enum scan_mode_6ghz scan_mode_6g);
139 #else
140 static inline
wlan_scan_cfg_get_min_dwelltime_6g(struct wlan_objmgr_psoc * psoc,uint32_t * min_dwell_time_6ghz)141 void wlan_scan_cfg_get_min_dwelltime_6g(struct wlan_objmgr_psoc *psoc,
142 					uint32_t *min_dwell_time_6ghz)
143 {
144 }
145 
146 static inline
wlan_scan_cfg_set_scan_mode_6g(struct wlan_objmgr_psoc * psoc,enum scan_mode_6ghz scan_mode_6g)147 QDF_STATUS wlan_scan_cfg_set_scan_mode_6g(struct wlan_objmgr_psoc *psoc,
148 					  enum scan_mode_6ghz scan_mode_6g)
149 {
150 	return QDF_STATUS_E_NOSUPPORT;
151 }
152 #endif
153 
154 /**
155  * wlan_scan_cfg_set_active_dwelltime() - API to set scan active dwelltime
156  * @psoc: pointer to psoc object
157  * @dwell_time: scan active dwell time
158  *
159  * Return: none
160  */
161 void wlan_scan_cfg_set_active_dwelltime(struct wlan_objmgr_psoc *psoc,
162 					uint32_t dwell_time);
163 /**
164  * wlan_scan_cfg_get_active_dwelltime() - API to get active dwelltime
165  * @psoc: pointer to psoc object
166  * @dwell_time: scan active dwelltime
167  *
168  * Return: scan active dwell time
169  */
170 void wlan_scan_cfg_get_active_dwelltime(struct wlan_objmgr_psoc *psoc,
171 					uint32_t *dwell_time);
172 
173 /**
174  * wlan_scan_cfg_set_passive_dwelltime() - API to set scan passive dwelltime
175  * @psoc: pointer to psoc object
176  * @dwell_time: scan passive dwell time
177  *
178  * Return: none
179  */
180 void wlan_scan_cfg_set_passive_dwelltime(struct wlan_objmgr_psoc *psoc,
181 					 uint32_t dwell_time);
182 /**
183  * wlan_scan_cfg_get_passive_dwelltime() - API to get passive dwelltime
184  * @psoc: pointer to psoc object
185  * @dwell_time: scan passive dwelltime
186  *
187  * Return: scan passive dwell time
188  */
189 void wlan_scan_cfg_get_passive_dwelltime(struct wlan_objmgr_psoc *psoc,
190 					 uint32_t *dwell_time);
191 
192 #ifdef WLAN_POLICY_MGR_ENABLE
193 /*
194  * wlan_scan_update_pno_dwell_time() - update active and passive dwell time
195  * depending on active concurrency modes
196  * @vdev: vdev object pointer
197  * @req: scan request
198  *
199  * Return: void
200  */
201 void wlan_scan_update_pno_dwell_time(struct wlan_objmgr_vdev *vdev,
202 				     struct pno_scan_req_params *req,
203 				     struct scan_default_params *scan_def);
204 
205 /*
206  * wlan_scan_update_low_latency_profile_chnlist() - Low latency SAP + scan
207  * concurrencies
208  * @vdev: vdev object pointer
209  * @req: scan request
210  *
211  * Return: void
212  */
213 void wlan_scan_update_low_latency_profile_chnlist(
214 				struct wlan_objmgr_vdev *vdev,
215 				struct scan_start_request *req);
216 #else
217 static inline
wlan_scan_update_low_latency_profile_chnlist(struct wlan_objmgr_vdev * vdev,struct scan_start_request * req)218 void wlan_scan_update_low_latency_profile_chnlist(
219 				struct wlan_objmgr_vdev *vdev,
220 				struct scan_start_request *req)
221 {
222 }
223 
224 #endif
225 
226 /**
227  * wlan_scan_cfg_get_conc_active_dwelltime() - Get concurrent active dwelltime
228  * @psoc: pointer to psoc object
229  * @dwell_time: scan active dwelltime
230  *
231  * Return: scan concurrent active dwell time
232  */
233 void wlan_scan_cfg_get_conc_active_dwelltime(struct wlan_objmgr_psoc *psoc,
234 					     uint32_t *dwell_time);
235 
236 /**
237  * wlan_scan_cfg_set_conc_active_dwelltime() - Set concurrent active dwelltime
238  * @psoc: pointer to psoc object
239  * @dwell_time: scan active dwelltime
240  *
241  * Return: scan concurrent active dwell time
242  */
243 void wlan_scan_cfg_set_conc_active_dwelltime(struct wlan_objmgr_psoc *psoc,
244 					     uint32_t dwell_time);
245 
246 /**
247  * wlan_scan_cfg_get_conc_passive_dwelltime() - Get passive concurrent dwelltime
248  * @psoc: pointer to psoc object
249  * @dwell_time: scan passive dwelltime
250  *
251  * Return: scan concurrent passive dwell time
252  */
253 void wlan_scan_cfg_get_conc_passive_dwelltime(struct wlan_objmgr_psoc *psoc,
254 					      uint32_t *dwell_time);
255 
256 /**
257  * wlan_scan_cfg_set_conc_passive_dwelltime() - Set passive concurrent dwelltime
258  * @psoc: pointer to psoc object
259  * @dwell_time: scan passive dwelltime
260  *
261  * Return: scan concurrent passive dwell time
262  */
263 void wlan_scan_cfg_set_conc_passive_dwelltime(struct wlan_objmgr_psoc *psoc,
264 					      uint32_t dwell_time);
265 
266 /**
267  * wlan_scan_cfg_honour_nl_scan_policy_flags() - API to get nl scan policy
268  * flags honoured
269  * @psoc: pointer to psoc object
270  *
271  * Return: nl scan policy flags honoured or not
272  */
273 bool wlan_scan_cfg_honour_nl_scan_policy_flags(struct wlan_objmgr_psoc *psoc);
274 
275 /**
276  * wlan_scan_cfg_get_conc_max_resttime() - API to get max rest time
277  * @psoc: pointer to psoc object
278  * @rest_time: scan concurrent max resttime
279  *
280  * Return: scan concurrent max rest time
281  */
282 void wlan_scan_cfg_get_conc_max_resttime(struct wlan_objmgr_psoc *psoc,
283 					 uint32_t *rest_time);
284 
285 /**
286  * wlan_scan_cfg_get_dfs_chan_scan_allowed() - API to get dfs scan enabled
287  * @psoc: pointer to psoc object
288  * @enable_dfs_scan: DFS scan enabled or not.
289  *
290  * Return: None
291  */
292 void wlan_scan_cfg_get_dfs_chan_scan_allowed(struct wlan_objmgr_psoc *psoc,
293 					     bool *enable_dfs_scan);
294 
295 /**
296  * wlan_scan_cfg_set_dfs_chan_scan_allowed() - API to set dfs scan enabled.
297  * @psoc: pointer to psoc object
298  * @enable_dfs_scan: Set dfs scan enabled or not.
299  *
300  * Return: None
301  */
302 void wlan_scan_cfg_set_dfs_chan_scan_allowed(struct wlan_objmgr_psoc *psoc,
303 					     bool enable_dfs_scan);
304 
305 /**
306  * wlan_scan_cfg_get_conc_min_resttime() - API to get concurrent min rest time
307  * @psoc: pointer to psoc object
308  * @rest_time: scan concurrent min rest time
309  *
310  * Return: scan concurrent min rest time
311  */
312 void wlan_scan_cfg_get_conc_min_resttime(struct wlan_objmgr_psoc *psoc,
313 					 uint32_t *rest_time);
314 
315 /**
316  * wlan_scan_is_snr_monitor_enabled() - API to get SNR monitoring enabled or not
317  * @psoc: pointer to psoc object
318  *
319  * Return: enable/disable snr monitor mode.
320  */
321 bool wlan_scan_is_snr_monitor_enabled(struct wlan_objmgr_psoc *psoc);
322 
323 /**
324  * wlan_scan_process_bcn_probe_rx_sync() - handle bcn without posting to
325  * scheduler thread
326  * @psoc: psoc context
327  * @buf: frame buf
328  * @rx_param: rx event params
329  * @frm_type: frame type
330  *
331  * handle bcn without posting to scheduler thread, this should be called
332  * while caller is already in scheduler thread context
333  *
334  * Return: success or error code.
335  */
336 QDF_STATUS
337 wlan_scan_process_bcn_probe_rx_sync(struct wlan_objmgr_psoc *psoc,
338 				    qdf_nbuf_t buf,
339 				    struct mgmt_rx_event_params *rx_param,
340 				    enum mgmt_frame_type frm_type);
341 
342 /**
343  * wlan_scan_get_aging_time  - Get the scan aging time config
344  * @psoc: psoc context
345  *
346  * Return: Scan aging time config
347  */
348 qdf_time_t wlan_scan_get_aging_time(struct wlan_objmgr_psoc *psoc);
349 
350 /**
351  * wlan_scan_set_aging_time  - Set the scan aging time config
352  * @psoc: psoc context
353  * @time: scan aging time
354  *
355  * Return: success or error code.
356  */
357 QDF_STATUS wlan_scan_set_aging_time(struct wlan_objmgr_psoc *psoc,
358 				    qdf_time_t time);
359 
360 /**
361  * wlan_scan_purge_results() - purge the scan list
362  * @scan_list: scan list to be purged
363  *
364  * This function purge the temp scan list
365  *
366  * Return: QDF_STATUS
367  */
wlan_scan_purge_results(qdf_list_t * scan_list)368 static inline QDF_STATUS wlan_scan_purge_results(qdf_list_t *scan_list)
369 {
370 	return scm_purge_scan_results(scan_list);
371 }
372 
373 /**
374  * wlan_scan_get_result() - The Public API to get scan results
375  * @pdev: pdev info
376  * @filter: Filters
377  *
378  * This function fetches scan result
379  *
380  * Return: scan list pointer
381  */
wlan_scan_get_result(struct wlan_objmgr_pdev * pdev,struct scan_filter * filter)382 static inline qdf_list_t *wlan_scan_get_result(struct wlan_objmgr_pdev *pdev,
383 					       struct scan_filter *filter)
384 {
385 	return scm_get_scan_result(pdev, filter);
386 }
387 
388 /**
389  * wlan_scan_update_mlme_by_bssinfo() - The Public API to update mlme
390  * info in the scan entry
391  * @pdev: pdev object
392  * @bss_info: bssid info to find the matching scan entry
393  * @mlme_info: mlme info to be updated.
394  *
395  * Return: QDF_STATUS
396  */
397 static inline QDF_STATUS
wlan_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev * pdev,struct bss_info * bss_info,struct mlme_info * mlme_info)398 wlan_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev,
399 				 struct bss_info *bss_info,
400 				 struct mlme_info *mlme_info)
401 {
402 	return scm_scan_update_mlme_by_bssinfo(pdev, bss_info, mlme_info);
403 }
404 
405 /**
406  * wlan_scan_start() - Public API to start a scan
407  * @req: start scan req params
408  *
409  * The Public API to start a scan. Post a msg to target_if queue
410  *
411  * Return: QDF_STATUS.
412  */
413 QDF_STATUS wlan_scan_start(struct scan_start_request *req);
414 
415 /**
416  * wlan_scan_cancel() - Public API to stop a scan
417  * @req: stop scan request params
418  *
419  * The Public API to stop a scan. Post a msg to target_if queue
420  *
421  * Return: QDF_STATUS.
422  */
423 QDF_STATUS wlan_scan_cancel(struct scan_cancel_request *req);
424 
425 /**
426  * wlan_scan_get_scan_id() - Public API to allocate scan ID
427  * @psoc: psoc object
428  *
429  * Public API, allocates a new scan id for caller
430  *
431  * Return: newly allocated scan ID
432  */
433 wlan_scan_id
434 wlan_scan_get_scan_id(struct wlan_objmgr_psoc *psoc);
435 
436 /**
437  * wlan_scan_init_default_params() - Public API to initialize scan params
438  * @vdev: vdev object
439  * @req: scan request object
440  *
441  * Public API to initialize scan start request with defaults scan params
442  *
443  * Return: QDF_STATUS_SUCCESS or error code
444  */
445 QDF_STATUS
446 wlan_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
447 			      struct scan_start_request *req);
448 
449 /**
450  * wlan_scan_register_requester() - Public API, assigns requester ID
451  * to caller and registers scan event call back handler
452  * @psoc:       psoc object
453  * @module_name:name of requester module
454  * @event_cb:   event callback function pointer
455  * @arg:        argument to @event_cb
456  *
457  * API, allows other components to allocate requester id.
458  * Normally used by modules at init time to register their callback
459  * and get one requester id. @event_cb will be invoked for
460  * all scan events whose requester id matches with @requester.
461  *
462  * Return: assigned non zero requester id for success
463  *         zero (0) for failure
464  */
465 wlan_scan_requester
466 wlan_scan_register_requester(struct wlan_objmgr_psoc *psoc,
467 			     uint8_t *module_name,
468 			     scan_event_handler event_cb,
469 			     void *arg);
470 
471 /**
472  * wlan_scan_unregister_requester() -Public API, reclaims previously
473  * allocated requester ID
474  * @psoc:       psoc object
475  * @requester:  requester ID to reclaim.
476  *
477  * API, reclaims previously allocated requester id.
478  *
479  * Return: void
480  */
481 void
482 wlan_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
483 			       wlan_scan_requester requester);
484 
485 /**
486  * wlan_scan_cfg_skip_6g_and_indoor_freq() - API to get 6g and indoor freq
487  * scan ini val
488  * @psoc: psoc object
489  *
490  * Return: skip 6g and indoor freq scan or not
491  */
492 bool wlan_scan_cfg_skip_6g_and_indoor_freq(
493 			struct wlan_objmgr_psoc *psoc);
494 
495 /**
496  * wlan_scan_register_mbssid_cb() - register api to inform bcn/probe rsp
497  * @psoc: psoc object
498  * @cb: callback to be registered
499  *
500  * Return: QDF_STATUS
501  */
502 QDF_STATUS wlan_scan_register_mbssid_cb(struct wlan_objmgr_psoc *psoc,
503 					update_mbssid_bcn_prb_rsp cb);
504 
505 /**
506  * wlan_scan_get_entry_by_mac_addr() - Get bcn/probe rsp from scan db
507  * @pdev: pdev info
508  * @bssid: BSSID of the bcn/probe response to be fetched from scan db
509  * @frame: Frame from scan db with given bssid.
510  *
511  * This is a wrapper to fetch the bcn/probe rsp frame with given mac address
512  * through scm_scan_get_entry_by_mac_addr(). scm_scan_get_entry_by_mac_add()
513  * allocates memory for the frame and it's caller responsibility to free
514  * the memory once it's done with the usage i.e. frame->ptr.
515  *
516  * Return: QDF_STATUS_SUCCESS if scan entry is present in db
517  */
518 QDF_STATUS
519 wlan_scan_get_entry_by_mac_addr(struct wlan_objmgr_pdev *pdev,
520 				struct qdf_mac_addr *bssid,
521 				struct element_info *frame);
522 
523 /**
524  * wlan_scan_get_last_scan_ageout_time() - API to get last scan
525  * ageout time
526  * @psoc: psoc object
527  * @last_scan_ageout_time: last scan ageout time
528  *
529  * Return: void
530  */
531 void
532 wlan_scan_get_last_scan_ageout_time(struct wlan_objmgr_psoc *psoc,
533 				    uint32_t *last_scan_ageout_time);
534 /**
535  * wlan_scan_get_entry_by_bssid() - function to get scan entry by bssid
536  * @pdev: pdev object
537  * @bssid: bssid to be fetched from scan db
538  *
539  * Return : scan entry if found, else NULL
540  */
541 struct scan_cache_entry *
542 wlan_scan_get_entry_by_bssid(struct wlan_objmgr_pdev *pdev,
543 			     struct qdf_mac_addr *bssid);
544 
545 /**
546  * wlan_scan_get_mld_addr_by_link_addr() - Function to get MLD address
547  * in the scan entry from the link BSSID.
548  * @pdev: pdev object
549  * @link_addr: Link BSSID to match the scan filter
550  * @mld_mac_addr: Pointer to fill the MLD address.
551  *
552  * A wrapper API which fills @mld_mac_addr with MLD address of scan entry
553  * whose bssid field matches @link_addr.
554  *
555  * Return: QDF_STATUS
556  */
557 QDF_STATUS
558 wlan_scan_get_mld_addr_by_link_addr(struct wlan_objmgr_pdev *pdev,
559 				    struct qdf_mac_addr *link_addr,
560 				    struct qdf_mac_addr *mld_mac_addr);
561 
562 /**
563  * wlan_scan_get_aux_support() - get aux scan policy
564  * @psoc: psoc object
565  *
566  * Set aux scan bits in scan_ctrl_ext_flag value depending on scan type.
567  *
568  * Return: true/false
569  */
570 bool wlan_scan_get_aux_support(struct wlan_objmgr_psoc *psoc);
571 
572 static inline bool
wlan_scan_entries_contain_cmn_akm(struct scan_cache_entry * entry1,struct scan_cache_entry * entry2)573 wlan_scan_entries_contain_cmn_akm(struct scan_cache_entry *entry1,
574 				  struct scan_cache_entry *entry2)
575 {
576 	return scm_scan_entries_contain_cmn_akm(entry1, entry2);
577 }
578 #endif
579