1 /* 2 * Copyright (c) 2012-2015, 2020-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 any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: wlan_cm_api.c 20 * 21 * This file maintains definitaions public apis. 22 */ 23 24 #include <wlan_cm_api.h> 25 #include "connection_mgr/core/src/wlan_cm_main_api.h" 26 #include "connection_mgr/core/src/wlan_cm_roam.h" 27 #include <wlan_vdev_mgr_utils_api.h> 28 #ifdef WLAN_FEATURE_11BE_MLO 29 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 30 #include "wlan_mlo_mgr_roam.h" 31 #endif 32 #endif 33 wlan_cm_start_connect(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_req * req)34 QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev, 35 struct wlan_cm_connect_req *req) 36 { 37 return cm_connect_start_req(vdev, req); 38 } 39 wlan_cm_disconnect(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,enum wlan_reason_code reason_code,struct qdf_mac_addr * bssid)40 QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev, 41 enum wlan_cm_source source, 42 enum wlan_reason_code reason_code, 43 struct qdf_mac_addr *bssid) 44 { 45 struct wlan_cm_disconnect_req req = {0}; 46 47 req.vdev_id = wlan_vdev_get_id(vdev); 48 req.source = source; 49 req.reason_code = reason_code; 50 if (bssid) 51 qdf_copy_macaddr(&req.bssid, bssid); 52 53 return cm_disconnect_start_req(vdev, &req); 54 } 55 wlan_cm_disconnect_sync(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,enum wlan_reason_code reason_code)56 QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev, 57 enum wlan_cm_source source, 58 enum wlan_reason_code reason_code) 59 { 60 struct wlan_cm_disconnect_req req = {0}; 61 62 req.vdev_id = wlan_vdev_get_id(vdev); 63 req.source = source; 64 req.reason_code = reason_code; 65 66 return cm_disconnect_start_req_sync(vdev, &req); 67 } 68 wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev * vdev,QDF_STATUS status)69 QDF_STATUS wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev, 70 QDF_STATUS status) 71 { 72 return cm_bss_select_ind_rsp(vdev, status); 73 } 74 wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev * vdev,QDF_STATUS status,struct qdf_mac_addr * peer_mac)75 QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev, 76 QDF_STATUS status, 77 struct qdf_mac_addr *peer_mac) 78 { 79 uint32_t prefix; 80 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 81 82 if (!cm_ctx) 83 return QDF_STATUS_E_INVAL; 84 85 prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id); 86 if (prefix == ROAM_REQ_PREFIX) 87 return cm_roam_bss_peer_create_rsp(vdev, status, peer_mac); 88 else 89 return cm_bss_peer_create_rsp(vdev, status, peer_mac); 90 } 91 wlan_cm_update_scan_mlme_info(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)92 void wlan_cm_update_scan_mlme_info(struct wlan_objmgr_vdev *vdev, 93 struct wlan_cm_connect_resp *resp) 94 { 95 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 96 97 if (!cm_ctx) 98 return; 99 100 return cm_update_scan_mlme_info(cm_ctx, resp); 101 } 102 wlan_cm_connect_rsp(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)103 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev, 104 struct wlan_cm_connect_resp *resp) 105 { 106 return cm_connect_rsp(vdev, resp); 107 } 108 wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * peer_mac)109 QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev, 110 struct qdf_mac_addr *peer_mac) 111 { 112 return cm_bss_peer_delete_req(vdev, peer_mac); 113 } 114 wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev * vdev,uint32_t status)115 QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev, 116 uint32_t status) 117 { 118 return cm_vdev_down_req(vdev, status); 119 } 120 wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev * vdev,struct wlan_cm_discon_rsp * resp)121 QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev, 122 struct wlan_cm_discon_rsp *resp) 123 { 124 uint32_t prefix; 125 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 126 127 if (!cm_ctx) 128 return QDF_STATUS_E_INVAL; 129 130 prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id); 131 if (prefix == ROAM_REQ_PREFIX) 132 return cm_roam_disconnect_rsp(vdev, resp); 133 else 134 return cm_disconnect_rsp(vdev, resp); 135 } 136 137 #ifdef WLAN_FEATURE_HOST_ROAM wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)138 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev, 139 struct wlan_cm_connect_resp *resp) 140 { 141 return cm_reassoc_rsp(vdev, resp); 142 } 143 #endif 144 wlan_cm_free_connect_req(struct wlan_cm_connect_req * connect_req)145 void wlan_cm_free_connect_req(struct wlan_cm_connect_req *connect_req) 146 { 147 if (!connect_req) 148 return; 149 150 cm_free_connect_req(connect_req); 151 } 152 wlan_cm_free_connect_resp(struct wlan_cm_connect_resp * connect_rsp)153 void wlan_cm_free_connect_resp(struct wlan_cm_connect_resp *connect_rsp) 154 { 155 if (!connect_rsp) 156 return; 157 158 cm_free_connect_rsp(connect_rsp); 159 } 160 wlan_cm_free_connect_req_param(struct wlan_cm_connect_req * req)161 void wlan_cm_free_connect_req_param(struct wlan_cm_connect_req *req) 162 { 163 if (!req) 164 return; 165 166 cm_free_connect_req_param(req); 167 } 168 wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev * vdev,uint8_t max_connect_attempts)169 void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev, 170 uint8_t max_connect_attempts) 171 { 172 cm_set_max_connect_attempts(vdev, max_connect_attempts); 173 } 174 wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev * vdev,uint32_t max_connect_timeout)175 void wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev, 176 uint32_t max_connect_timeout) 177 { 178 cm_set_max_connect_timeout(vdev, max_connect_timeout); 179 } 180 wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev * vdev)181 bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev) 182 { 183 return cm_is_vdev_connecting(vdev); 184 } 185 wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev * vdev)186 bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev) 187 { 188 return cm_is_vdev_connected(vdev); 189 } 190 wlan_cm_is_vdev_active(struct wlan_objmgr_vdev * vdev)191 bool wlan_cm_is_vdev_active(struct wlan_objmgr_vdev *vdev) 192 { 193 return cm_is_vdev_active(vdev); 194 } 195 wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev * vdev)196 bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev) 197 { 198 return cm_is_vdev_disconnecting(vdev); 199 } 200 wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev * vdev)201 bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev) 202 { 203 return cm_is_vdev_disconnected(vdev); 204 } 205 wlan_cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev * vdev)206 bool wlan_cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev *vdev) 207 { 208 return cm_is_vdev_idle_due_to_link_switch(vdev); 209 } 210 wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev * vdev)211 bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev) 212 { 213 return cm_is_vdev_roaming(vdev); 214 } 215 216 #ifdef WLAN_FEATURE_ROAM_OFFLOAD wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev * vdev)217 bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev) 218 { 219 return cm_is_vdev_roam_started(vdev); 220 } 221 wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev * vdev)222 bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev) 223 { 224 return cm_is_vdev_roam_sync_inprogress(vdev); 225 } 226 #endif 227 228 #ifdef WLAN_FEATURE_HOST_ROAM wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev * vdev)229 bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev) 230 { 231 return cm_is_vdev_roam_preauth_state(vdev); 232 } 233 wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev * vdev)234 bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev) 235 { 236 return cm_is_vdev_roam_reassoc_state(vdev); 237 } 238 #endif 239 240 enum wlan_cm_active_request_type wlan_cm_get_active_req_type(struct wlan_objmgr_vdev * vdev)241 wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev) 242 { 243 return cm_get_active_req_type(vdev); 244 } 245 wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_connect_req * req)246 bool wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev, 247 struct wlan_cm_vdev_connect_req *req) 248 { 249 return cm_get_active_connect_req(vdev, req); 250 } 251 252 QDF_STATUS wlan_cm_get_active_connect_req_param(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_req * req)253 wlan_cm_get_active_connect_req_param(struct wlan_objmgr_vdev *vdev, 254 struct wlan_cm_connect_req *req) 255 { 256 return cm_get_active_connect_req_param(vdev, req); 257 } 258 wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev * vdev)259 cm_ext_t *wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev *vdev) 260 { 261 return cm_get_ext_hdl(vdev); 262 } 263 wlan_cm_is_first_candidate_connect_attempt(struct wlan_objmgr_vdev * vdev)264 bool wlan_cm_is_first_candidate_connect_attempt(struct wlan_objmgr_vdev *vdev) 265 { 266 return cm_is_first_candidate_connect_attempt(vdev); 267 } 268 wlan_cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp * resp)269 bool wlan_cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp *resp) 270 { 271 return cm_is_link_switch_disconnect_resp(resp); 272 } 273 wlan_cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp * resp)274 bool wlan_cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp *resp) 275 { 276 return cm_is_link_switch_connect_resp(resp); 277 } 278 wlan_cm_trigger_panic_on_cmd_timeout(struct wlan_objmgr_vdev * vdev,enum qdf_hang_reason reason)279 void wlan_cm_trigger_panic_on_cmd_timeout(struct wlan_objmgr_vdev *vdev, 280 enum qdf_hang_reason reason) 281 { 282 cm_trigger_panic_on_cmd_timeout(vdev, reason); 283 } 284 285 #ifdef WLAN_FEATURE_HOST_ROAM wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_reassoc_req * req)286 bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev, 287 struct wlan_cm_vdev_reassoc_req *req) 288 { 289 return cm_get_active_reassoc_req(vdev, req); 290 } 291 #endif 292 wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_discon_req * req)293 bool wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev, 294 struct wlan_cm_vdev_discon_req *req) 295 { 296 return cm_get_active_disconnect_req(vdev, req); 297 } 298 wlan_cm_reason_code_to_str(enum wlan_reason_code reason)299 const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason) 300 { 301 if (reason > REASON_PROP_START) 302 return ""; 303 304 switch (reason) { 305 CASE_RETURN_STRING(REASON_UNSPEC_FAILURE); 306 CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID); 307 CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING); 308 CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY); 309 CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY); 310 CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA); 311 CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA); 312 CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING); 313 CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED); 314 CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY); 315 CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS); 316 CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION); 317 CASE_RETURN_STRING(REASON_INVALID_IE); 318 CASE_RETURN_STRING(REASON_MIC_FAILURE); 319 CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT); 320 CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT); 321 CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS); 322 CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER); 323 CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER); 324 CASE_RETURN_STRING(REASON_INVALID_AKMP); 325 CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER); 326 CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES); 327 CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE); 328 CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED); 329 CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE); 330 CASE_RETURN_STRING(REASON_TDLS_UNSPEC); 331 CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED); 332 CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT); 333 CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM); 334 CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED); 335 CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS); 336 CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED); 337 CASE_RETURN_STRING(REASON_NO_BANDWIDTH); 338 CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES); 339 CASE_RETURN_STRING(REASON_EXCEEDED_TXOP); 340 CASE_RETURN_STRING(REASON_STA_LEAVING); 341 CASE_RETURN_STRING(REASON_END_TS_BA_DLS); 342 CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA); 343 CASE_RETURN_STRING(REASON_TIMEDOUT); 344 CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH); 345 CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED); 346 CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS); 347 CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT); 348 CASE_RETURN_STRING(REASON_INVALID_PMKID); 349 CASE_RETURN_STRING(REASON_INVALID_MDE); 350 CASE_RETURN_STRING(REASON_INVALID_FTE); 351 CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED); 352 CASE_RETURN_STRING(REASON_MESH_MAX_PEERS); 353 CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION); 354 CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD); 355 CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES); 356 CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT); 357 CASE_RETURN_STRING(REASON_MESH_INVALID_GTK); 358 CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS); 359 CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP); 360 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO); 361 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO); 362 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE); 363 CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS); 364 CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ); 365 CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED); 366 CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS); 367 default: 368 return "Unknown"; 369 } 370 } 371 372 #ifdef WLAN_POLICY_MGR_ENABLE wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,wlan_cm_id cm_id,QDF_STATUS status)373 void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 374 wlan_cm_id cm_id, QDF_STATUS status) 375 { 376 uint32_t prefix; 377 378 prefix = CM_ID_GET_PREFIX(cm_id); 379 if (prefix == ROAM_REQ_PREFIX) 380 cm_reassoc_hw_mode_change_resp(pdev, vdev_id, cm_id, status); 381 else 382 cm_hw_mode_change_resp(pdev, vdev_id, cm_id, status); 383 } 384 #endif /* ifdef POLICY_MGR_ENABLE */ 385 386 #ifdef WLAN_FEATURE_LL_LT_SAP wlan_cm_bearer_switch_resp(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_cm_id cm_id,QDF_STATUS status)387 void wlan_cm_bearer_switch_resp(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 388 wlan_cm_id cm_id, QDF_STATUS status) 389 { 390 cm_bearer_switch_resp(psoc, vdev_id, cm_id, status); 391 } 392 #endif 393 394 #ifdef SM_ENG_HIST_ENABLE wlan_cm_sm_history_print(struct wlan_objmgr_vdev * vdev)395 void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev) 396 { 397 return cm_sm_history_print(vdev); 398 } 399 wlan_cm_req_history_print(struct wlan_objmgr_vdev * vdev)400 void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev) 401 { 402 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 403 404 if (!cm_ctx) 405 return; 406 407 cm_req_history_print(cm_ctx); 408 } 409 #endif /* SM_ENG_HIST_ENABLE */ 410 411 #ifndef CONN_MGR_ADV_FEATURE wlan_cm_set_candidate_advance_filter_cb(struct wlan_objmgr_vdev * vdev,void (* filter_fun)(struct wlan_objmgr_vdev * vdev,struct scan_filter * filter))412 void wlan_cm_set_candidate_advance_filter_cb( 413 struct wlan_objmgr_vdev *vdev, 414 void (*filter_fun)(struct wlan_objmgr_vdev *vdev, 415 struct scan_filter *filter)) 416 { 417 cm_set_candidate_advance_filter_cb(vdev, filter_fun); 418 } 419 wlan_cm_set_candidate_custom_sort_cb(struct wlan_objmgr_vdev * vdev,void (* sort_fun)(struct wlan_objmgr_vdev * vdev,qdf_list_t * list))420 void wlan_cm_set_candidate_custom_sort_cb( 421 struct wlan_objmgr_vdev *vdev, 422 void (*sort_fun)(struct wlan_objmgr_vdev *vdev, 423 qdf_list_t *list)) 424 { 425 cm_set_candidate_custom_sort_cb(vdev, sort_fun); 426 } 427 428 #endif 429 wlan_cm_get_rnr(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id,struct reduced_neighbor_report * rnr)430 QDF_STATUS wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id, 431 struct reduced_neighbor_report *rnr) 432 { 433 enum QDF_OPMODE op_mode = wlan_vdev_mlme_get_opmode(vdev); 434 435 if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE) { 436 mlme_err("vdev %d Invalid mode %d", 437 wlan_vdev_get_id(vdev), op_mode); 438 return QDF_STATUS_E_NOSUPPORT; 439 } 440 441 return cm_get_rnr(vdev, cm_id, rnr); 442 } 443 444 struct scan_cache_entry * wlan_cm_get_curr_candidate_entry(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id)445 wlan_cm_get_curr_candidate_entry(struct wlan_objmgr_vdev *vdev, 446 wlan_cm_id cm_id) 447 { 448 return cm_get_curr_candidate_entry(vdev, cm_id); 449 } 450 451 void wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id,struct wlan_cm_connect_resp * rsp)452 wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev, 453 wlan_cm_id cm_id, 454 struct wlan_cm_connect_resp *rsp) 455 { 456 return cm_connect_resp_fill_mld_addr_from_cm_id(vdev, cm_id, rsp); 457 } 458 459 #ifdef WLAN_FEATURE_11BE_MLO 460 void wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,struct scan_cache_entry * entry,struct wlan_cm_connect_resp * rsp)461 wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc *psoc, 462 uint8_t vdev_id, 463 struct scan_cache_entry *entry, 464 struct wlan_cm_connect_resp *rsp) 465 { 466 struct wlan_objmgr_vdev *vdev; 467 468 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 469 WLAN_MLME_CM_ID); 470 if (!vdev) 471 return; 472 473 cm_connect_resp_fill_mld_addr_from_candidate(vdev, entry, rsp); 474 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); 475 } 476 #endif 477 478 QDF_STATUS wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_discon_req * req)479 wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev, 480 struct wlan_cm_vdev_discon_req *req) 481 { 482 return cm_handle_rso_stop_rsp(vdev, req); 483 } 484 485 #ifdef WLAN_FEATURE_11BE wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev * vdev,qdf_freq_t ch_freq,enum phy_ch_width ori_bw,uint16_t ori_punc,uint8_t ccfs0,uint8_t ccfs1,struct ch_params * chan_param)486 QDF_STATUS wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev *vdev, 487 qdf_freq_t ch_freq, 488 enum phy_ch_width ori_bw, 489 uint16_t ori_punc, 490 uint8_t ccfs0, uint8_t ccfs1, 491 struct ch_params *chan_param) 492 { 493 uint16_t primary_puncture_bitmap = 0; 494 struct wlan_objmgr_pdev *pdev; 495 struct reg_channel_list chan_list; 496 qdf_freq_t sec_ch_2g_freq = 0; 497 qdf_freq_t center_freq_320 = 0; 498 qdf_freq_t center_freq_40 = 0; 499 uint8_t band_mask; 500 uint16_t new_punc = 0; 501 502 if (!vdev || !chan_param) { 503 mlme_err("invalid input parameters"); 504 return QDF_STATUS_E_INVAL; 505 } 506 pdev = wlan_vdev_get_pdev(vdev); 507 if (!pdev) { 508 mlme_err("invalid pdev"); 509 return QDF_STATUS_E_INVAL; 510 } 511 if (ori_bw == CH_WIDTH_320MHZ) { 512 if (WLAN_REG_IS_6GHZ_CHAN_FREQ(ch_freq)) 513 band_mask = BIT(REG_BAND_6G); 514 else 515 band_mask = BIT(REG_BAND_5G); 516 center_freq_320 = wlan_reg_chan_band_to_freq(pdev, ccfs1, 517 band_mask); 518 } else if (ori_bw == CH_WIDTH_40MHZ) { 519 if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) { 520 band_mask = BIT(REG_BAND_2G); 521 center_freq_40 = wlan_reg_chan_band_to_freq(pdev, 522 ccfs0, 523 band_mask); 524 if (center_freq_40 == ch_freq + BW_10_MHZ) 525 sec_ch_2g_freq = ch_freq + BW_20_MHZ; 526 if (center_freq_40 == ch_freq - BW_10_MHZ) 527 sec_ch_2g_freq = ch_freq - BW_20_MHZ; 528 } 529 } 530 wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc, 531 ch_freq, 532 center_freq_320, 533 CH_WIDTH_20MHZ, 534 &primary_puncture_bitmap); 535 if (primary_puncture_bitmap) { 536 mlme_err("sta vdev %d freq %d RX bw %d puncture 0x%x primary chan is punctured", 537 wlan_vdev_get_id(vdev), ch_freq, 538 ori_bw, ori_punc); 539 return QDF_STATUS_E_FAULT; 540 } 541 if (chan_param->ch_width != CH_WIDTH_320MHZ) 542 center_freq_320 = 0; 543 qdf_mem_zero(&chan_list, sizeof(chan_list)); 544 wlan_reg_fill_channel_list_for_pwrmode(pdev, ch_freq, 545 sec_ch_2g_freq, 546 chan_param->ch_width, 547 center_freq_320, &chan_list, 548 REG_CURRENT_PWR_MODE, true); 549 *chan_param = chan_list.chan_param[0]; 550 if (chan_param->ch_width == ori_bw) 551 new_punc = ori_punc; 552 else 553 wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc, 554 ch_freq, 555 chan_param->mhz_freq_seg1, 556 chan_param->ch_width, 557 &new_punc); 558 559 chan_param->reg_punc_bitmap = new_punc; 560 561 return QDF_STATUS_SUCCESS; 562 } 563 wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev * vdev,uint8_t * peer_mac,uint16_t ori_punc,enum phy_ch_width ori_bw,uint8_t ccfs0,uint8_t ccfs1,enum phy_ch_width new_bw)564 QDF_STATUS wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev *vdev, 565 uint8_t *peer_mac, 566 uint16_t ori_punc, 567 enum phy_ch_width ori_bw, 568 uint8_t ccfs0, uint8_t ccfs1, 569 enum phy_ch_width new_bw) 570 { 571 struct wlan_channel *des_chan; 572 struct ch_params ch_param; 573 uint32_t bw_puncture = 0; 574 QDF_STATUS status = QDF_STATUS_E_INVAL; 575 576 if (!vdev || !peer_mac) { 577 mlme_err("invalid input parameters"); 578 return status; 579 } 580 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 581 if (!des_chan) { 582 mlme_err("invalid des chan"); 583 return status; 584 } 585 qdf_mem_zero(&ch_param, sizeof(ch_param)); 586 ch_param.ch_width = new_bw; 587 status = wlan_cm_sta_set_chan_param(vdev, des_chan->ch_freq, 588 ori_bw, ori_punc, ccfs0, 589 ccfs1, &ch_param); 590 if (QDF_IS_STATUS_ERROR(status)) 591 return status; 592 593 if (des_chan->puncture_bitmap == ch_param.reg_punc_bitmap && 594 des_chan->ch_width == ch_param.ch_width) 595 return status; 596 597 des_chan->ch_freq_seg1 = ch_param.center_freq_seg0; 598 des_chan->ch_freq_seg2 = ch_param.center_freq_seg1; 599 des_chan->ch_cfreq1 = ch_param.mhz_freq_seg0; 600 des_chan->ch_cfreq2 = ch_param.mhz_freq_seg1; 601 des_chan->puncture_bitmap = ch_param.reg_punc_bitmap; 602 des_chan->ch_width = ch_param.ch_width; 603 mlme_debug("sta vdev %d freq %d bw %d puncture 0x%x ch_cfreq1 %d ch_cfreq2 %d", 604 wlan_vdev_get_id(vdev), des_chan->ch_freq, 605 des_chan->ch_width, des_chan->puncture_bitmap, 606 des_chan->ch_cfreq1, des_chan->ch_cfreq2); 607 QDF_SET_BITS(bw_puncture, 0, 8, des_chan->ch_width); 608 QDF_SET_BITS(bw_puncture, 8, 16, des_chan->puncture_bitmap); 609 return wlan_util_vdev_peer_set_param_send(vdev, peer_mac, 610 WLAN_MLME_PEER_BW_PUNCTURE, 611 bw_puncture); 612 } 613 #endif /* WLAN_FEATURE_11BE */ 614 615 #ifdef WLAN_FEATURE_11BE_MLO 616 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 617 bool wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev * vdev)618 wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev *vdev) 619 { 620 return mlo_roam_is_auth_status_connected(wlan_vdev_get_psoc(vdev), 621 wlan_vdev_get_id(vdev)); 622 } 623 #endif 624 #endif 625 enum MLO_TYPE wlan_cm_bss_mlo_type(struct wlan_objmgr_psoc * psoc,struct scan_cache_entry * entry,qdf_list_t * scan_list)626 wlan_cm_bss_mlo_type(struct wlan_objmgr_psoc *psoc, 627 struct scan_cache_entry *entry, 628 qdf_list_t *scan_list) 629 { 630 return cm_bss_mlo_type(psoc, entry, scan_list); 631 } 632