1 /* 2 * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 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 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 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 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 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 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 92 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev, 93 struct wlan_cm_connect_resp *resp) 94 { 95 return cm_connect_rsp(vdev, resp); 96 } 97 98 QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev, 99 struct qdf_mac_addr *peer_mac) 100 { 101 return cm_bss_peer_delete_req(vdev, peer_mac); 102 } 103 104 QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev, 105 uint32_t status) 106 { 107 return cm_vdev_down_req(vdev, status); 108 } 109 110 QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev, 111 struct wlan_cm_discon_rsp *resp) 112 { 113 uint32_t prefix; 114 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 115 116 if (!cm_ctx) 117 return QDF_STATUS_E_INVAL; 118 119 prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id); 120 if (prefix == ROAM_REQ_PREFIX) 121 return cm_roam_disconnect_rsp(vdev, resp); 122 else 123 return cm_disconnect_rsp(vdev, resp); 124 } 125 126 #ifdef WLAN_FEATURE_HOST_ROAM 127 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev, 128 struct wlan_cm_connect_resp *resp) 129 { 130 return cm_reassoc_rsp(vdev, resp); 131 } 132 #endif 133 134 void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev, 135 uint8_t max_connect_attempts) 136 { 137 cm_set_max_connect_attempts(vdev, max_connect_attempts); 138 } 139 140 void wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev, 141 uint32_t max_connect_timeout) 142 { 143 cm_set_max_connect_timeout(vdev, max_connect_timeout); 144 } 145 146 bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev) 147 { 148 return cm_is_vdev_connecting(vdev); 149 } 150 151 bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev) 152 { 153 return cm_is_vdev_connected(vdev); 154 } 155 156 bool wlan_cm_is_vdev_active(struct wlan_objmgr_vdev *vdev) 157 { 158 return cm_is_vdev_active(vdev); 159 } 160 161 bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev) 162 { 163 return cm_is_vdev_disconnecting(vdev); 164 } 165 166 bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev) 167 { 168 return cm_is_vdev_disconnected(vdev); 169 } 170 171 bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev) 172 { 173 return cm_is_vdev_roaming(vdev); 174 } 175 176 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 177 bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev) 178 { 179 return cm_is_vdev_roam_started(vdev); 180 } 181 182 bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev) 183 { 184 return cm_is_vdev_roam_sync_inprogress(vdev); 185 } 186 #endif 187 188 #ifdef WLAN_FEATURE_HOST_ROAM 189 bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev) 190 { 191 return cm_is_vdev_roam_preauth_state(vdev); 192 } 193 194 bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev) 195 { 196 return cm_is_vdev_roam_reassoc_state(vdev); 197 } 198 #endif 199 200 enum wlan_cm_active_request_type 201 wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev) 202 { 203 return cm_get_active_req_type(vdev); 204 } 205 206 bool wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev, 207 struct wlan_cm_vdev_connect_req *req) 208 { 209 return cm_get_active_connect_req(vdev, req); 210 } 211 212 cm_ext_t *wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev *vdev) 213 { 214 return cm_get_ext_hdl(vdev); 215 } 216 217 #ifdef WLAN_FEATURE_HOST_ROAM 218 bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev, 219 struct wlan_cm_vdev_reassoc_req *req) 220 { 221 return cm_get_active_reassoc_req(vdev, req); 222 } 223 #endif 224 225 bool wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev, 226 struct wlan_cm_vdev_discon_req *req) 227 { 228 return cm_get_active_disconnect_req(vdev, req); 229 } 230 231 const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason) 232 { 233 if (reason > REASON_PROP_START) 234 return ""; 235 236 switch (reason) { 237 CASE_RETURN_STRING(REASON_UNSPEC_FAILURE); 238 CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID); 239 CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING); 240 CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY); 241 CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY); 242 CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA); 243 CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA); 244 CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING); 245 CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED); 246 CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY); 247 CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS); 248 CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION); 249 CASE_RETURN_STRING(REASON_INVALID_IE); 250 CASE_RETURN_STRING(REASON_MIC_FAILURE); 251 CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT); 252 CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT); 253 CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS); 254 CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER); 255 CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER); 256 CASE_RETURN_STRING(REASON_INVALID_AKMP); 257 CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER); 258 CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES); 259 CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE); 260 CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED); 261 CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE); 262 CASE_RETURN_STRING(REASON_TDLS_UNSPEC); 263 CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED); 264 CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT); 265 CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM); 266 CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED); 267 CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS); 268 CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED); 269 CASE_RETURN_STRING(REASON_NO_BANDWIDTH); 270 CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES); 271 CASE_RETURN_STRING(REASON_EXCEEDED_TXOP); 272 CASE_RETURN_STRING(REASON_STA_LEAVING); 273 CASE_RETURN_STRING(REASON_END_TS_BA_DLS); 274 CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA); 275 CASE_RETURN_STRING(REASON_TIMEDOUT); 276 CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH); 277 CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED); 278 CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS); 279 CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT); 280 CASE_RETURN_STRING(REASON_INVALID_PMKID); 281 CASE_RETURN_STRING(REASON_INVALID_MDE); 282 CASE_RETURN_STRING(REASON_INVALID_FTE); 283 CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED); 284 CASE_RETURN_STRING(REASON_MESH_MAX_PEERS); 285 CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION); 286 CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD); 287 CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES); 288 CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT); 289 CASE_RETURN_STRING(REASON_MESH_INVALID_GTK); 290 CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS); 291 CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP); 292 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO); 293 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO); 294 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE); 295 CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS); 296 CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ); 297 CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED); 298 CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS); 299 default: 300 return "Unknown"; 301 } 302 } 303 304 #ifdef WLAN_POLICY_MGR_ENABLE 305 void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 306 wlan_cm_id cm_id, QDF_STATUS status) 307 { 308 uint32_t prefix; 309 310 prefix = CM_ID_GET_PREFIX(cm_id); 311 if (prefix == ROAM_REQ_PREFIX) 312 cm_reassoc_hw_mode_change_resp(pdev, vdev_id, cm_id, status); 313 else 314 cm_hw_mode_change_resp(pdev, vdev_id, cm_id, status); 315 } 316 #endif /* ifdef POLICY_MGR_ENABLE */ 317 318 #ifdef SM_ENG_HIST_ENABLE 319 void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev) 320 { 321 return cm_sm_history_print(vdev); 322 } 323 324 void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev) 325 { 326 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 327 328 if (!cm_ctx) 329 return; 330 331 cm_req_history_print(cm_ctx); 332 } 333 #endif /* SM_ENG_HIST_ENABLE */ 334 335 #ifndef CONN_MGR_ADV_FEATURE 336 void wlan_cm_set_candidate_advance_filter_cb( 337 struct wlan_objmgr_vdev *vdev, 338 void (*filter_fun)(struct wlan_objmgr_vdev *vdev, 339 struct scan_filter *filter)) 340 { 341 cm_set_candidate_advance_filter_cb(vdev, filter_fun); 342 } 343 344 void wlan_cm_set_candidate_custom_sort_cb( 345 struct wlan_objmgr_vdev *vdev, 346 void (*sort_fun)(struct wlan_objmgr_vdev *vdev, 347 qdf_list_t *list)) 348 { 349 cm_set_candidate_custom_sort_cb(vdev, sort_fun); 350 } 351 352 #endif 353 354 struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev, 355 wlan_cm_id cm_id) 356 { 357 enum QDF_OPMODE op_mode = wlan_vdev_mlme_get_opmode(vdev); 358 struct cm_req *cm_req; 359 struct cnx_mgr *cm_ctx; 360 361 if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE) { 362 mlme_err("vdev %d Invalid mode %d", 363 wlan_vdev_get_id(vdev), op_mode); 364 return NULL; 365 } 366 367 cm_ctx = cm_get_cm_ctx(vdev); 368 if (!cm_ctx) 369 return NULL; 370 cm_req = cm_get_req_by_cm_id(cm_ctx, cm_id); 371 if (!cm_req) 372 return NULL; 373 374 if (cm_req->connect_req.cur_candidate && 375 cm_req->connect_req.cur_candidate->entry) 376 return &cm_req->connect_req.cur_candidate->entry->rnr; 377 378 return NULL; 379 } 380 381 QDF_STATUS 382 wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev, 383 struct wlan_cm_vdev_discon_req *req) 384 { 385 return cm_handle_rso_stop_rsp(vdev, req); 386 } 387 388 #ifdef WLAN_FEATURE_11BE 389 QDF_STATUS wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev *vdev, 390 qdf_freq_t ch_freq, 391 enum phy_ch_width ori_bw, 392 uint16_t ori_punc, 393 uint8_t ccfs0, uint8_t ccfs1, 394 struct ch_params *chan_param) 395 { 396 uint16_t primary_puncture_bitmap = 0; 397 struct wlan_objmgr_pdev *pdev; 398 struct reg_channel_list chan_list; 399 qdf_freq_t sec_ch_2g_freq = 0; 400 qdf_freq_t center_freq_320 = 0; 401 qdf_freq_t center_freq_40 = 0; 402 uint8_t band_mask; 403 uint16_t new_punc; 404 405 if (!vdev || !chan_param) { 406 mlme_err("invalid input parameters"); 407 return QDF_STATUS_E_INVAL; 408 } 409 pdev = wlan_vdev_get_pdev(vdev); 410 if (!pdev) { 411 mlme_err("invalid pdev"); 412 return QDF_STATUS_E_INVAL; 413 } 414 if (ori_bw == CH_WIDTH_320MHZ) { 415 if (WLAN_REG_IS_6GHZ_CHAN_FREQ(ch_freq)) 416 band_mask = BIT(REG_BAND_6G); 417 else 418 band_mask = BIT(REG_BAND_5G); 419 center_freq_320 = wlan_reg_chan_band_to_freq(pdev, ccfs1, 420 band_mask); 421 } else if (ori_bw == CH_WIDTH_40MHZ) { 422 if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) { 423 band_mask = BIT(REG_BAND_2G); 424 center_freq_40 = wlan_reg_chan_band_to_freq(pdev, 425 ccfs0, 426 band_mask); 427 if (center_freq_40 == ch_freq + BW_10_MHZ) 428 sec_ch_2g_freq = ch_freq + BW_20_MHZ; 429 if (center_freq_40 == ch_freq - BW_10_MHZ) 430 sec_ch_2g_freq = ch_freq - BW_20_MHZ; 431 } 432 } 433 wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc, 434 ch_freq, 435 center_freq_320, 436 CH_WIDTH_20MHZ, 437 &primary_puncture_bitmap); 438 if (primary_puncture_bitmap) { 439 mlme_err("sta vdev %d freq %d RX bw %d puncture 0x%x primary chan is punctured", 440 wlan_vdev_get_id(vdev), ch_freq, 441 ori_bw, ori_punc); 442 return QDF_STATUS_E_FAULT; 443 } 444 if (chan_param->ch_width != CH_WIDTH_320MHZ) 445 center_freq_320 = 0; 446 qdf_mem_zero(&chan_list, sizeof(chan_list)); 447 wlan_reg_fill_channel_list_for_pwrmode(pdev, ch_freq, 448 sec_ch_2g_freq, 449 chan_param->ch_width, 450 center_freq_320, &chan_list, 451 REG_CURRENT_PWR_MODE, true); 452 *chan_param = chan_list.chan_param[0]; 453 if (chan_param->ch_width == ori_bw) 454 new_punc = ori_punc; 455 else 456 wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc, 457 ch_freq, 458 chan_param->mhz_freq_seg1, 459 chan_param->ch_width, 460 &new_punc); 461 462 chan_param->reg_punc_bitmap = new_punc; 463 464 return QDF_STATUS_SUCCESS; 465 } 466 467 QDF_STATUS wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev *vdev, 468 uint8_t *peer_mac, 469 uint16_t ori_punc, 470 enum phy_ch_width ori_bw, 471 uint8_t ccfs0, uint8_t ccfs1, 472 enum phy_ch_width new_bw) 473 { 474 struct wlan_channel *des_chan; 475 struct ch_params ch_param; 476 uint32_t bw_puncture = 0; 477 QDF_STATUS status = QDF_STATUS_E_INVAL; 478 479 if (!vdev || !peer_mac) { 480 mlme_err("invalid input parameters"); 481 return status; 482 } 483 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 484 if (!des_chan) { 485 mlme_err("invalid des chan"); 486 return status; 487 } 488 qdf_mem_zero(&ch_param, sizeof(ch_param)); 489 ch_param.ch_width = new_bw; 490 status = wlan_cm_sta_set_chan_param(vdev, des_chan->ch_freq, 491 ori_bw, ori_punc, ccfs0, 492 ccfs1, &ch_param); 493 if (QDF_IS_STATUS_ERROR(status)) 494 return status; 495 496 if (des_chan->puncture_bitmap == ch_param.reg_punc_bitmap && 497 des_chan->ch_width == ch_param.ch_width) 498 return status; 499 500 des_chan->ch_freq_seg1 = ch_param.center_freq_seg0; 501 des_chan->ch_freq_seg2 = ch_param.center_freq_seg1; 502 des_chan->ch_cfreq1 = ch_param.mhz_freq_seg0; 503 des_chan->ch_cfreq2 = ch_param.mhz_freq_seg1; 504 des_chan->puncture_bitmap = ch_param.reg_punc_bitmap; 505 des_chan->ch_width = ch_param.ch_width; 506 mlme_debug("sta vdev %d freq %d bw %d puncture 0x%x ch_cfreq1 %d ch_cfreq2 %d", 507 wlan_vdev_get_id(vdev), des_chan->ch_freq, 508 des_chan->ch_width, des_chan->puncture_bitmap, 509 des_chan->ch_cfreq1, des_chan->ch_cfreq2); 510 QDF_SET_BITS(bw_puncture, 0, 8, des_chan->ch_width); 511 QDF_SET_BITS(bw_puncture, 8, 16, des_chan->puncture_bitmap); 512 return wlan_util_vdev_peer_set_param_send(vdev, peer_mac, 513 WLAN_MLME_PEER_BW_PUNCTURE, 514 bw_puncture); 515 } 516 #endif /* WLAN_FEATURE_11BE */ 517 518 #ifdef WLAN_FEATURE_11BE_MLO 519 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 520 bool 521 wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev *vdev) 522 { 523 return mlo_roam_is_auth_status_connected(wlan_vdev_get_psoc(vdev), 524 wlan_vdev_get_id(vdev)); 525 } 526 #endif 527 #endif 528