1 /* 2 * Copyright (c) 2017-2020 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 cache entry api 22 */ 23 24 #ifndef _WLAN_SCAN_CACHE_DB_H_ 25 #define _WLAN_SCAN_CACHE_DB_H_ 26 27 #include <scheduler_api.h> 28 #include <wlan_objmgr_psoc_obj.h> 29 #include <wlan_objmgr_pdev_obj.h> 30 #include <wlan_objmgr_vdev_obj.h> 31 #include <wlan_scan_public_structs.h> 32 33 #define SCAN_HASH_SIZE 64 34 #define SCAN_GET_HASH(addr) \ 35 (((const uint8_t *)(addr))[QDF_MAC_ADDR_SIZE - 1] % SCAN_HASH_SIZE) 36 37 #define ADJACENT_CHANNEL_RSSI_THRESHOLD -80 38 #define ADJACENT_CHANNEL_RSSI_DIFF_THRESHOLD 40 39 40 /** 41 * struct scan_dbs - scan cache data base definition 42 * @num_entries: number of scan entries 43 * @scan_db_lock: lock for @scan_hash_tbl 44 * @scan_hash_tbl: link list of bssid hashed scan cache entries for a pdev 45 */ 46 struct scan_dbs { 47 uint32_t num_entries; 48 qdf_spinlock_t scan_db_lock; 49 qdf_list_t scan_hash_tbl[SCAN_HASH_SIZE]; 50 }; 51 52 /** 53 * struct scan_bcn_probe_event - beacon/probe info 54 * @frm_type: frame type 55 * @rx_data: mgmt rx data 56 * @psoc: psoc pointer 57 * @save_rnr_info: save the RNR entries into RNR db 58 * @buf: rx frame 59 */ 60 struct scan_bcn_probe_event { 61 uint32_t frm_type; 62 struct mgmt_rx_event_params *rx_data; 63 struct wlan_objmgr_psoc *psoc; 64 bool save_rnr_info; 65 qdf_nbuf_t buf; 66 }; 67 68 /** 69 * scm_handle_bcn_probe() - Process beacon and probe rsp 70 * @msg: schedular msg with bcn info; 71 * 72 * API to handle the beacon/probe resp. msg->bodyptr will be consumed and freed 73 * by this func 74 * 75 * Return: QDF status. 76 */ 77 QDF_STATUS scm_handle_bcn_probe(struct scheduler_msg *msg); 78 79 /** 80 * __scm_handle_bcn_probe() - Process beacon and probe rsp 81 * @bcn: beacon info; 82 * 83 * API to handle the beacon/probe resp. bcn will be consumed and freed by this 84 * func 85 * 86 * Return: QDF status. 87 */ 88 QDF_STATUS __scm_handle_bcn_probe(struct scan_bcn_probe_event *bcn); 89 90 /** 91 * scm_age_out_entries() - Age out entries older than aging time 92 * @psoc: psoc pointer 93 * @scan_db: scan database 94 * 95 * Return: void. 96 */ 97 void scm_age_out_entries(struct wlan_objmgr_psoc *psoc, 98 struct scan_dbs *scan_db); 99 100 /** 101 * scm_get_scan_result() - fetches scan result 102 * @pdev: pdev info 103 * @filter: Filters 104 * 105 * This function fetches scan result 106 * 107 * Return: scan list 108 */ 109 qdf_list_t *scm_get_scan_result(struct wlan_objmgr_pdev *pdev, 110 struct scan_filter *filter); 111 112 /** 113 * scm_purge_scan_results() - purge the scan list 114 * @scan_result: scan list to be purged 115 * 116 * This function purge the temp scan list 117 * 118 * Return: QDF_STATUS 119 */ 120 QDF_STATUS scm_purge_scan_results(qdf_list_t *scan_result); 121 122 /** 123 * scm_update_scan_mlme_info() - updates scan entry with mlme data 124 * @pdev: pdev object 125 * @scan_entry: source scan entry to read mlme info 126 * 127 * This function updates scan db with scan_entry->mlme_info 128 * 129 * Return: QDF_STATUS 130 */ 131 QDF_STATUS scm_update_scan_mlme_info(struct wlan_objmgr_pdev *pdev, 132 struct scan_cache_entry *scan_entry); 133 134 /** 135 * scm_flush_results() - flush scan entries matching the filter 136 * @pdev: vdev object 137 * @filter: filter to flush the scan entries 138 * 139 * Flush scan entries matching the filter. 140 * 141 * Return: QDF status. 142 */ 143 QDF_STATUS scm_flush_results(struct wlan_objmgr_pdev *pdev, 144 struct scan_filter *filter); 145 146 /** 147 * scm_filter_valid_channel() - The Public API to filter scan result 148 * based on valid channel list 149 * @pdev: pdev object 150 * @chan_freq_list: valid channel frequency (in MHz) list 151 * @num_chan: number of valid channels 152 * 153 * The Public API to to filter scan result 154 * based on valid channel list. 155 * 156 * Return: void. 157 */ 158 void scm_filter_valid_channel(struct wlan_objmgr_pdev *pdev, 159 uint32_t *chan_freq_list, uint32_t num_chan); 160 161 /** 162 * scm_iterate_scan_db() - function to iterate scan table 163 * @pdev: pdev object 164 * @func: iterator function pointer 165 * @arg: argument to be passed to func() 166 * 167 * API, this API iterates scan table and invokes func 168 * on each scan enetry by passing scan entry and arg. 169 * 170 * Return: QDF_STATUS 171 */ 172 QDF_STATUS 173 scm_iterate_scan_db(struct wlan_objmgr_pdev *pdev, 174 scan_iterator_func func, void *arg); 175 176 /** 177 * scm_scan_register_bcn_cb() - API to register api to indicate bcn/probe 178 * as soon as they are received 179 * @psoc: psoc 180 * @cb: callback to be registered 181 * @type: Type of callback to be registered 182 * 183 * Return: enum scm_scan_status 184 */ 185 QDF_STATUS scm_scan_register_bcn_cb(struct wlan_objmgr_psoc *psoc, 186 update_beacon_cb cb, enum scan_cb_type type); 187 188 /** 189 * scm_scan_register_mbssid_cb() - API to register api to handle bcn/probe 190 * as soon as they are generated 191 * @psoc: psoc object 192 * @cb: callback to be registered 193 * 194 * Return: QDF_STATUS 195 */ 196 QDF_STATUS scm_scan_register_mbssid_cb(struct wlan_objmgr_psoc *psoc, 197 update_mbssid_bcn_prb_rsp cb); 198 199 /** 200 * scm_reset_scan_chan_info() - API to reset the scan channel info 201 * @psoc: psoc object 202 * @pdev_id: pdev id of which info need to be reset 203 * 204 * Return: void 205 */ 206 void scm_reset_scan_chan_info(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id); 207 208 /** 209 * scm_db_init() - API to init scan db 210 * @psoc: psoc 211 * 212 * Return: QDF_STATUS 213 */ 214 QDF_STATUS scm_db_init(struct wlan_objmgr_psoc *psoc); 215 216 /** 217 * scm_db_deinit() - API to deinit scan db 218 * @psoc: psoc 219 * 220 * Return: QDF_STATUS 221 */ 222 QDF_STATUS scm_db_deinit(struct wlan_objmgr_psoc *psoc); 223 224 #ifdef FEATURE_6G_SCAN_CHAN_SORT_ALGO 225 226 /** 227 * scm_get_rnr_channel_db() - API to get rnr db 228 * @psoc: psoc 229 * 230 * Return: rnr db 231 */ 232 struct channel_list_db *scm_get_rnr_channel_db(struct wlan_objmgr_psoc *psoc); 233 234 /** 235 * scm_get_chan_meta() - API to return channel meta 236 * @psoc: psoc 237 * @chan_freq: channel frequency 238 * 239 * Return: channel meta information 240 */ 241 struct meta_rnr_channel *scm_get_chan_meta(struct wlan_objmgr_psoc *psoc, 242 uint32_t chan_freq); 243 244 /** 245 * scm_channel_list_db_init() - API to init scan list priority list db 246 * @psoc: psoc 247 * 248 * Return: QDF_STATUS 249 */ 250 QDF_STATUS scm_channel_list_db_init(struct wlan_objmgr_psoc *psoc); 251 252 /** 253 * scm_channel_list_db_deinit() - API to deinit scan list priority list db 254 * @psoc: psoc 255 * 256 * Return: QDF_STATUS 257 */ 258 QDF_STATUS scm_channel_list_db_deinit(struct wlan_objmgr_psoc *psoc); 259 260 /** 261 * scm_rnr_db_flush() - API to flush rnr entries 262 * @psoc: psoc 263 * 264 * Return: QDF_STATUS 265 */ 266 QDF_STATUS scm_rnr_db_flush(struct wlan_objmgr_psoc *psoc); 267 268 /** 269 * scm_update_rnr_from_scan_cache() - API to update rnr info from scan cache 270 * @pdev: pdev 271 * 272 * Return: void 273 */ 274 void scm_update_rnr_from_scan_cache(struct wlan_objmgr_pdev *pdev); 275 276 /** 277 * scm_filter_rnr_flag_pno() - Remove FLAG_SCAN_ONLY_IF_RNR_FOUND flag 278 * in channel if ssid is different for colocated AP, 279 * during pno scan request 280 * @vdev: vdev 281 * @short_ssid: short ssid 282 * @chan_list: channel list 283 * 284 * Remove FLAG_SCAN_ONLY_IF_RNR_FOUND flag in channel if ssid is different for 285 * colocated AP, in pno scan request 286 * 287 * Return: None 288 */ 289 void 290 scm_filter_rnr_flag_pno(struct wlan_objmgr_vdev *vdev, 291 uint32_t short_ssid, 292 struct chan_list *chan_list); 293 294 #else 295 static inline struct channel_list_db * 296 scm_get_rnr_channel_db(struct wlan_objmgr_psoc *psoc) 297 { 298 return NULL; 299 } 300 301 static inline QDF_STATUS scm_channel_list_db_init(struct wlan_objmgr_psoc *psoc) 302 { 303 return QDF_STATUS_SUCCESS; 304 } 305 306 static inline 307 QDF_STATUS scm_channel_list_db_deinit(struct wlan_objmgr_psoc *psoc) 308 { 309 return QDF_STATUS_SUCCESS; 310 } 311 312 static inline void 313 scm_filter_rnr_flag_pno(struct wlan_objmgr_vdev *vdev, 314 uint32_t short_ssid, 315 struct chan_list *chan_list) 316 { 317 } 318 #endif 319 320 /** 321 * scm_scan_update_mlme_by_bssinfo() - updates scan entry with mlme data 322 * @pdev: pdev object 323 * @bss_info: BSS information 324 * @mlme: scan entry MLME info 325 * 326 * This function updates scan db with scan_entry->mlme_info 327 * 328 * Return: QDF_STATUS 329 */ 330 QDF_STATUS scm_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev, 331 struct bss_info *bss_info, struct mlme_info *mlme); 332 333 uint32_t scm_get_last_scan_time_per_channel(struct wlan_objmgr_vdev *vdev, 334 uint32_t freq); 335 336 /** 337 * scm_scan_get_scan_entry_by_mac_freq() - Get scan entry by mac and freq 338 * @pdev: pdev info 339 * @bssid: BSSID of the bcn/probe response to be fetched from scan db 340 * @freq: freq for scan filter 341 * 342 * Return: scan entry if found, else NULL 343 */ 344 struct scan_cache_entry * 345 scm_scan_get_scan_entry_by_mac_freq(struct wlan_objmgr_pdev *pdev, 346 struct qdf_mac_addr *bssid, 347 uint16_t freq); 348 349 /** 350 * scm_scan_get_entry_by_mac_addr() - Get bcn/probe rsp from scan db 351 * @pdev: pdev info 352 * @bssid: BSSID of the bcn/probe response to be fetched from scan db 353 * @frame: Frame from scan db with given bssid. 354 * 355 * This API allocates the memory for bcn/probe rsp frame and returns 356 * to caller through @frame->ptr. It's caller responsibility to free 357 * the memory once it's done with the usage. 358 * 359 * Return: QDF_STATUS_SUCCESS if scan entry is present in db 360 */ 361 QDF_STATUS 362 scm_scan_get_entry_by_mac_addr(struct wlan_objmgr_pdev *pdev, 363 struct qdf_mac_addr *bssid, 364 struct element_info *frame); 365 366 /** 367 * scm_scan_get_entry_by_bssid() - function to get scan entry by bssid 368 * @pdev: pdev object 369 * @bssid: bssid to be fetched from scan db 370 * 371 * Return : scan entry if found, else NULL 372 */ 373 struct scan_cache_entry * 374 scm_scan_get_entry_by_bssid(struct wlan_objmgr_pdev *pdev, 375 struct qdf_mac_addr *bssid); 376 377 #ifdef WLAN_FEATURE_11BE_MLO 378 /** 379 * scm_get_mld_addr_by_link_addr() - function to fetch the peer mld address from 380 * the scan entry for the given link address. 381 * @pdev: pdev object 382 * @link_addr: link address 383 * @mld_mac_addr: pointer to mld_mac_address 384 * 385 * Return : scan entry if found, else NULL 386 */ 387 QDF_STATUS 388 scm_get_mld_addr_by_link_addr(struct wlan_objmgr_pdev *pdev, 389 struct qdf_mac_addr *link_addr, 390 struct qdf_mac_addr *mld_mac_addr); 391 #else 392 static inline QDF_STATUS 393 scm_get_mld_addr_by_link_addr(struct wlan_objmgr_pdev *pdev, 394 struct qdf_mac_addr *link_addr, 395 struct qdf_mac_addr *mld_mac_addr) 396 { 397 return QDF_STATUS_E_NOSUPPORT; 398 } 399 #endif 400 401 /** 402 * scm_scan_entries_contain_cmn_akm() - Check if two entries have common 403 * RSN capabilities. 404 * @entry1: Primary scan entry for comparison 405 * @entry2: Secondary scan entry for comparison 406 * 407 * Checks various RSN parameters of two scan entries to determine 408 * whether both have similar capabilities or not. 409 * 410 * Return: bool 411 */ 412 bool scm_scan_entries_contain_cmn_akm(struct scan_cache_entry *entry1, 413 struct scan_cache_entry *entry2); 414 #endif 415