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: osif_cm_util.c 20 * 21 * This file maintains definitaions of connect, disconnect, roam 22 * common apis. 23 */ 24 #include <include/wlan_mlme_cmn.h> 25 #include "osif_cm_util.h" 26 #include "wlan_osif_priv.h" 27 #include "wlan_cfg80211.h" 28 #include "osif_cm_rsp.h" 29 #include "wlan_cfg80211_scan.h" 30 31 enum qca_sta_connect_fail_reason_codes 32 osif_cm_mac_to_qca_connect_fail_reason(enum wlan_status_code internal_reason) 33 { 34 enum qca_sta_connect_fail_reason_codes reason = 0; 35 36 if (internal_reason < STATUS_PROP_START) 37 return reason; 38 39 switch (internal_reason) { 40 case STATUS_NO_NETWORK_FOUND: 41 reason = QCA_STA_CONNECT_FAIL_REASON_NO_BSS_FOUND; 42 break; 43 case STATUS_AUTH_TX_FAIL: 44 reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL; 45 break; 46 case STATUS_AUTH_NO_ACK_RECEIVED: 47 reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED; 48 break; 49 case STATUS_AUTH_NO_RESP_RECEIVED: 50 reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED; 51 break; 52 case STATUS_ASSOC_TX_FAIL: 53 reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL; 54 break; 55 case STATUS_ASSOC_NO_ACK_RECEIVED: 56 reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED; 57 break; 58 case STATUS_ASSOC_NO_RESP_RECEIVED: 59 reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED; 60 break; 61 default: 62 osif_debug("QCA code not present for internal status code %d", 63 internal_reason); 64 } 65 66 return reason; 67 } 68 69 const char * 70 osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason) 71 { 72 switch (reason) { 73 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE); 74 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE); 75 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE); 76 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA); 77 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR); 78 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED); 79 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_DEVICE_RECOVERY); 80 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_KEY_TIMEOUT); 81 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE); 82 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_IFACE_DOWN); 83 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL); 84 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_INACTIVITY); 85 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT); 86 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE); 87 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE); 88 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_USER_TRIGGERED); 89 case QCA_DISCONNECT_REASON_UNSPECIFIED: 90 return ""; 91 default: 92 return "Unknown"; 93 } 94 } 95 96 enum qca_disconnect_reason_codes 97 osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason) 98 { 99 enum qca_disconnect_reason_codes reason = 100 QCA_DISCONNECT_REASON_UNSPECIFIED; 101 102 if (internal_reason < REASON_PROP_START) 103 return reason; 104 105 switch (internal_reason) { 106 case REASON_HOST_TRIGGERED_ROAM_FAILURE: 107 case REASON_FW_TRIGGERED_ROAM_FAILURE: 108 reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE; 109 break; 110 case REASON_USER_TRIGGERED_ROAM_FAILURE: 111 reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE; 112 break; 113 case REASON_GATEWAY_REACHABILITY_FAILURE: 114 reason = 115 QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE; 116 break; 117 case REASON_UNSUPPORTED_CHANNEL_CSA: 118 reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA; 119 break; 120 case REASON_OPER_CHANNEL_DISABLED_INDOOR: 121 reason = 122 QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR; 123 break; 124 case REASON_OPER_CHANNEL_USER_DISABLED: 125 reason = 126 QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED; 127 break; 128 case REASON_DEVICE_RECOVERY: 129 reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY; 130 break; 131 case REASON_KEY_TIMEOUT: 132 reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT; 133 break; 134 case REASON_OPER_CHANNEL_BAND_CHANGE: 135 reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE; 136 break; 137 case REASON_IFACE_DOWN: 138 reason = QCA_DISCONNECT_REASON_IFACE_DOWN; 139 break; 140 case REASON_PEER_XRETRY_FAIL: 141 reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL; 142 break; 143 case REASON_PEER_INACTIVITY: 144 reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY; 145 break; 146 case REASON_SA_QUERY_TIMEOUT: 147 reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT; 148 break; 149 case REASON_CHANNEL_SWITCH_FAILED: 150 reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE; 151 break; 152 case REASON_BEACON_MISSED: 153 reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE; 154 break; 155 default: 156 osif_debug("No QCA reason code for mac reason: %u", 157 internal_reason); 158 /* Unspecified reason by default */ 159 } 160 161 return reason; 162 } 163 164 static struct osif_cm_ops *osif_cm_legacy_ops; 165 166 void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv) 167 { 168 osif_priv->cm_info.last_id = CM_ID_INVALID; 169 osif_priv->cm_info.last_source = CM_SOURCE_INVALID; 170 } 171 172 QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev) 173 { 174 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 175 176 if (!osif_priv) { 177 osif_err("Invalid vdev osif priv"); 178 return QDF_STATUS_E_INVAL; 179 } 180 qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); 181 osif_cm_reset_id_and_src_no_lock(osif_priv); 182 qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); 183 184 return QDF_STATUS_SUCCESS; 185 } 186 187 /** 188 * osif_cm_connect_complete_cb() - Connect complete callback 189 * @vdev: vdev pointer 190 * @rsp: connect response 191 * 192 * Return: QDF_STATUS 193 */ 194 static QDF_STATUS 195 osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev, 196 struct wlan_cm_connect_resp *rsp) 197 { 198 return osif_connect_handler(vdev, rsp); 199 } 200 201 /** 202 * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate 203 * @vdev: vdev pointer 204 * @rsp: connect response 205 * 206 * Return: QDF_STATUS 207 */ 208 static QDF_STATUS 209 osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev, 210 struct wlan_cm_connect_resp *rsp) 211 { 212 return osif_failed_candidate_handler(vdev, rsp); 213 } 214 215 /** 216 * osif_cm_update_id_and_src_cb() - Callback to update id and 217 * source of the connect/disconnect request 218 * @vdev: vdev pointer 219 * @source: Source of the connect req 220 * @cm_id: Connect/disconnect id 221 * 222 * Context: Any context. Takes and releases cmd id spinlock 223 * Return: QDF_STATUS 224 */ 225 static QDF_STATUS 226 osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev *vdev, 227 enum wlan_cm_source source, wlan_cm_id cm_id) 228 { 229 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 230 231 if (!osif_priv) { 232 osif_err("Invalid vdev osif priv"); 233 return QDF_STATUS_E_INVAL; 234 } 235 236 qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); 237 osif_priv->cm_info.last_id = cm_id; 238 osif_priv->cm_info.last_source = source; 239 qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); 240 241 return QDF_STATUS_SUCCESS; 242 } 243 244 /** 245 * osif_cm_disconnect_complete_cb() - Disconnect done callback 246 * @vdev: vdev pointer 247 * @rsp: Disconnect response 248 * 249 * Context: Any context 250 * Return: QDF_STATUS 251 */ 252 253 static QDF_STATUS 254 osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev *vdev, 255 struct wlan_cm_discon_rsp *rsp) 256 { 257 return osif_disconnect_handler(vdev, rsp); 258 } 259 260 #ifdef CONN_MGR_ADV_FEATURE 261 void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev, 262 struct vdev_osif_priv *osif_priv, 263 struct qdf_mac_addr *bssid, 264 uint8_t *ssid, uint8_t ssid_len) 265 { 266 struct wiphy *wiphy = osif_priv->wdev->wiphy; 267 struct scan_filter *filter; 268 QDF_STATUS status; 269 270 status = __wlan_cfg80211_unlink_bss_list(wiphy, wlan_vdev_get_pdev(vdev), 271 bssid->bytes, ssid_len ? ssid : NULL, 272 ssid_len); 273 if (QDF_IS_STATUS_ERROR(status)) 274 return; 275 filter = qdf_mem_malloc(sizeof(*filter)); 276 if (!filter) 277 return; 278 279 filter->num_of_bssid = 1; 280 qdf_copy_macaddr(&filter->bssid_list[0], bssid); 281 ucfg_scan_flush_results(wlan_vdev_get_pdev(vdev), filter); 282 qdf_mem_free(filter); 283 } 284 285 static QDF_STATUS 286 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev) 287 { 288 return osif_cm_netif_queue_ind(vdev, 289 WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER, 290 WLAN_CONTROL_PATH); 291 } 292 293 /** 294 * osif_cm_roam_sync_cb() - Roam sync callback 295 * @vdev: vdev pointer 296 * 297 * This callback indicates os_if that roam sync ind received 298 * so that os_if can stop all the activity on this connection 299 * 300 * Return: QDF_STATUS 301 */ 302 static QDF_STATUS 303 osif_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev) 304 { 305 osif_cm_napi_serialize(true); 306 return osif_cm_netif_queue_ind(vdev, 307 WLAN_STOP_ALL_NETIF_QUEUE, 308 WLAN_CONTROL_PATH); 309 } 310 311 /** 312 * osif_pmksa_candidate_notify_cb() - Roam pmksa candidate notify callback 313 * @vdev: vdev pointer 314 * @bssid: bssid 315 * @index: index 316 * @preauth: preauth flag 317 * 318 * Return: QDF_STATUS 319 */ 320 static QDF_STATUS 321 osif_pmksa_candidate_notify_cb(struct wlan_objmgr_vdev *vdev, 322 struct qdf_mac_addr *bssid, 323 int index, bool preauth) 324 { 325 return osif_pmksa_candidate_notify(vdev, bssid, index, preauth); 326 } 327 328 /** 329 * osif_cm_send_keys_cb() - Send keys callback 330 * @vdev: vdev pointer 331 * @key_index: key index 332 * @pairwise: true if pairwise 333 * @cipher_type: cipher type 334 * 335 * This callback indicates os_if that 336 * so that os_if can stop all the activity on this connection 337 * 338 * Return: QDF_STATUS 339 */ 340 static QDF_STATUS 341 osif_cm_send_keys_cb(struct wlan_objmgr_vdev *vdev, uint8_t key_index, 342 bool pairwise, enum wlan_crypto_cipher_type cipher_type) 343 { 344 return osif_cm_send_vdev_keys(vdev, 345 key_index, 346 pairwise, 347 cipher_type); 348 } 349 #else 350 static inline QDF_STATUS 351 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev) 352 { 353 return QDF_STATUS_SUCCESS; 354 } 355 #endif 356 357 /** 358 * osif_cm_disconnect_start_cb() - Disconnect start callback 359 * @vdev: vdev pointer 360 * 361 * This callback indicates os_if that disconnection is started 362 * so that os_if can stop all the activity on this connection 363 * 364 * Return: QDF_STATUS 365 */ 366 static QDF_STATUS 367 osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev) 368 { 369 /* Disable netif queue on disconnect start */ 370 return osif_cm_disable_netif_queue(vdev); 371 } 372 373 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 374 /** 375 * osif_cm_roam_start_cb() - Roam start callback 376 * @vdev: vdev pointer 377 * 378 * This callback indicates os_if that roaming has started 379 * so that os_if can stop all the activity on this connection 380 * 381 * Return: QDF_STATUS 382 */ 383 static QDF_STATUS 384 osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev) 385 { 386 return osif_cm_netif_queue_ind(vdev, 387 WLAN_STOP_ALL_NETIF_QUEUE, 388 WLAN_CONTROL_PATH); 389 } 390 391 /** 392 * osif_cm_roam_abort_cb() - Roam abort callback 393 * @vdev: vdev pointer 394 * 395 * This callback indicates os_if that roaming has been aborted 396 * so that os_if can resume all the activity on this connection 397 * 398 * Return: QDF_STATUS 399 */ 400 static QDF_STATUS 401 osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev) 402 { 403 osif_cm_napi_serialize(false); 404 return osif_cm_netif_queue_ind(vdev, 405 WLAN_WAKE_ALL_NETIF_QUEUE, 406 WLAN_CONTROL_PATH); 407 } 408 409 /** 410 * osif_cm_roam_cmpl_cb() - Roam sync complete callback 411 * @vdev: vdev pointer 412 * 413 * This callback indicates os_if that roam sync is complete 414 * so that os_if can stop all the activity on this connection 415 * 416 * Return: QDF_STATUS 417 */ 418 419 static QDF_STATUS 420 osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev) 421 { 422 return osif_cm_napi_serialize(false); 423 } 424 425 /** 426 * osif_cm_get_scan_ie_params() - Function to get scan ie params 427 * @vdev: vdev pointer 428 * @scan_ie: Pointer to scan_ie 429 * @dot11mode_filter: Pointer to dot11mode_filter 430 * 431 * Get scan IE params from adapter corresponds to given vdev 432 * 433 * Return: QDF_STATUS 434 */ 435 static QDF_STATUS 436 osif_cm_get_scan_ie_params(struct wlan_objmgr_vdev *vdev, 437 struct element_info *scan_ie, 438 enum dot11_mode_filter *dot11mode_filter) 439 { 440 osif_cm_get_scan_ie_params_cb cb = NULL; 441 442 if (osif_cm_legacy_ops) 443 cb = osif_cm_legacy_ops->get_scan_ie_params_cb; 444 if (cb) 445 return cb(vdev, scan_ie, dot11mode_filter); 446 447 return QDF_STATUS_E_FAILURE; 448 } 449 450 /** 451 * osif_cm_get_scan_ie_info_cb() - Roam get scan ie params callback 452 * @vdev: vdev pointer 453 * @scan_ie: pointer to scan ie 454 * @dot11mode_filter: pointer to dot11 mode filter 455 * 456 * This callback gets scan ie params from os_if 457 * 458 * Return: QDF_STATUS 459 */ 460 461 static QDF_STATUS 462 osif_cm_get_scan_ie_info_cb(struct wlan_objmgr_vdev *vdev, 463 struct element_info *scan_ie, 464 enum dot11_mode_filter *dot11mode_filter) 465 { 466 return osif_cm_get_scan_ie_params(vdev, scan_ie, dot11mode_filter); 467 } 468 #endif 469 470 #ifdef WLAN_FEATURE_PREAUTH_ENABLE 471 /** 472 * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback 473 * @vdev: vdev pointer 474 * @rsp: preauth response 475 * 476 * This callback indicates os_if that roam ft preauth is complete 477 * so that os_if can send fast transition event 478 * 479 * Return: QDF_STATUS 480 */ 481 482 static QDF_STATUS 483 osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev, 484 struct wlan_preauth_rsp *rsp) 485 { 486 osif_cm_ft_preauth_complete_cb cb = NULL; 487 QDF_STATUS ret = QDF_STATUS_SUCCESS; 488 489 if (osif_cm_legacy_ops) 490 cb = osif_cm_legacy_ops->ft_preauth_complete_cb; 491 if (cb) 492 ret = cb(vdev, rsp); 493 494 return ret; 495 } 496 497 #ifdef FEATURE_WLAN_ESE 498 /** 499 * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback 500 * @vdev: vdev pointer 501 * @rsp: preauth response 502 * 503 * This callback indicates os_if that roam cckm preauth is complete 504 * so that os_if can send cckm preauth indication to the supplicant 505 * via wireless custom event. 506 * 507 * Return: QDF_STATUS 508 */ 509 510 static QDF_STATUS 511 osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev, 512 struct wlan_preauth_rsp *rsp) 513 { 514 osif_cm_cckm_preauth_complete_cb cb = NULL; 515 QDF_STATUS ret = QDF_STATUS_SUCCESS; 516 517 if (osif_cm_legacy_ops) 518 cb = osif_cm_legacy_ops->cckm_preauth_complete_cb; 519 if (cb) 520 ret = cb(vdev, rsp); 521 522 return ret; 523 } 524 #endif 525 #endif 526 527 static struct mlme_cm_ops cm_ops = { 528 .mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb, 529 .mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb, 530 .mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb, 531 .mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb, 532 .mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb, 533 #ifdef CONN_MGR_ADV_FEATURE 534 .mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb, 535 .mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb, 536 .mlme_cm_send_keys_cb = osif_cm_send_keys_cb, 537 #endif 538 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 539 .mlme_cm_roam_start_cb = osif_cm_roam_start_cb, 540 .mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb, 541 .mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb, 542 .mlme_cm_roam_get_scan_ie_cb = osif_cm_get_scan_ie_info_cb, 543 #endif 544 #ifdef WLAN_FEATURE_PREAUTH_ENABLE 545 .mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb, 546 #ifdef FEATURE_WLAN_ESE 547 .mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb, 548 #endif 549 #endif 550 #ifdef WLAN_VENDOR_HANDOFF_CONTROL 551 .mlme_cm_get_vendor_handoff_params_cb = 552 osif_cm_vendor_handoff_params_cb, 553 #endif 554 }; 555 556 /** 557 * osif_cm_get_global_ops() - Get connection manager global ops 558 * 559 * Return: Connection manager global ops 560 */ 561 static struct mlme_cm_ops *osif_cm_get_global_ops(void) 562 { 563 return &cm_ops; 564 } 565 566 QDF_STATUS osif_cm_register_cb(void) 567 { 568 mlme_set_osif_cm_cb(osif_cm_get_global_ops); 569 570 return QDF_STATUS_SUCCESS; 571 } 572 573 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev) 574 { 575 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 576 enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev); 577 578 if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE) 579 return QDF_STATUS_SUCCESS; 580 581 if (!osif_priv) { 582 osif_err("Invalid vdev osif priv"); 583 return QDF_STATUS_E_INVAL; 584 } 585 586 qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock); 587 588 return QDF_STATUS_SUCCESS; 589 } 590 591 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev) 592 { 593 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 594 enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev); 595 596 if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE) 597 return QDF_STATUS_SUCCESS; 598 599 if (!osif_priv) { 600 osif_err("Invalid vdev osif priv"); 601 return QDF_STATUS_E_INVAL; 602 } 603 qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock); 604 605 return QDF_STATUS_SUCCESS; 606 } 607 608 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev, 609 struct wlan_cm_connect_resp *rsp, 610 enum osif_cb_type type) 611 { 612 osif_cm_connect_comp_cb cb = NULL; 613 QDF_STATUS ret = QDF_STATUS_SUCCESS; 614 615 if (osif_cm_legacy_ops) 616 cb = osif_cm_legacy_ops->connect_complete_cb; 617 if (cb) 618 ret = cb(vdev, rsp, type); 619 620 return ret; 621 } 622 623 #ifdef WLAN_VENDOR_HANDOFF_CONTROL 624 QDF_STATUS osif_cm_vendor_handoff_params_cb(struct wlan_objmgr_psoc *psoc, 625 void *vendor_handoff_context) 626 { 627 osif_cm_get_vendor_handoff_params_cb cb = NULL; 628 629 if (osif_cm_legacy_ops) 630 cb = osif_cm_legacy_ops->vendor_handoff_params_cb; 631 if (cb) 632 return cb(psoc, vendor_handoff_context); 633 634 return QDF_STATUS_E_FAILURE; 635 } 636 #endif 637 638 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev, 639 struct wlan_cm_discon_rsp *rsp, 640 enum osif_cb_type type) 641 { 642 osif_cm_disconnect_comp_cb cb = NULL; 643 QDF_STATUS ret = QDF_STATUS_SUCCESS; 644 645 if (osif_cm_legacy_ops) 646 cb = osif_cm_legacy_ops->disconnect_complete_cb; 647 if (cb) 648 ret = cb(vdev, rsp, type); 649 650 return ret; 651 } 652 653 #ifdef CONN_MGR_ADV_FEATURE 654 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev, 655 enum netif_action_type action, 656 enum netif_reason_type reason) 657 { 658 osif_cm_netif_queue_ctrl_cb cb = NULL; 659 QDF_STATUS ret = QDF_STATUS_SUCCESS; 660 661 if (osif_cm_legacy_ops) 662 cb = osif_cm_legacy_ops->netif_queue_control_cb; 663 if (cb) 664 ret = cb(vdev, action, reason); 665 666 return ret; 667 } 668 669 QDF_STATUS osif_cm_napi_serialize(bool action) 670 { 671 os_if_cm_napi_serialize_ctrl_cb cb = NULL; 672 QDF_STATUS ret = QDF_STATUS_SUCCESS; 673 674 if (osif_cm_legacy_ops) 675 cb = osif_cm_legacy_ops->napi_serialize_control_cb; 676 if (cb) 677 ret = cb(action); 678 679 return ret; 680 } 681 682 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev, 683 struct wlan_cm_connect_resp *rsp) 684 { 685 osif_cm_save_gtk_cb cb = NULL; 686 QDF_STATUS ret = QDF_STATUS_SUCCESS; 687 688 if (osif_cm_legacy_ops) 689 cb = osif_cm_legacy_ops->save_gtk_cb; 690 if (cb) 691 ret = cb(vdev, rsp); 692 693 return ret; 694 } 695 696 QDF_STATUS 697 osif_cm_send_vdev_keys(struct wlan_objmgr_vdev *vdev, 698 uint8_t key_index, 699 bool pairwise, 700 enum wlan_crypto_cipher_type cipher_type) 701 { 702 osif_cm_send_vdev_keys_cb cb = NULL; 703 704 if (osif_cm_legacy_ops) 705 cb = osif_cm_legacy_ops->send_vdev_keys_cb; 706 if (cb) 707 return cb(vdev, key_index, pairwise, cipher_type); 708 709 return QDF_STATUS_E_FAILURE; 710 } 711 #endif 712 713 #ifdef WLAN_FEATURE_FILS_SK 714 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev, 715 struct wlan_objmgr_vdev *vdev, 716 struct wlan_cm_connect_resp *rsp) 717 { 718 osif_cm_set_hlp_data_cb cb = NULL; 719 QDF_STATUS ret = QDF_STATUS_SUCCESS; 720 721 if (osif_cm_legacy_ops) 722 cb = osif_cm_legacy_ops->set_hlp_data_cb; 723 if (cb) 724 ret = cb(dev, vdev, rsp); 725 726 return ret; 727 } 728 #endif 729 730 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops) 731 { 732 osif_cm_legacy_ops = osif_legacy_ops; 733 } 734 735 void osif_cm_reset_legacy_cb(void) 736 { 737 osif_cm_legacy_ops = NULL; 738 } 739