1 /* 2 * Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /** 18 * DOC: osif_cm_util.c 19 * 20 * This file maintains definitaions of connect, disconnect, roam 21 * common apis. 22 */ 23 #include <include/wlan_mlme_cmn.h> 24 #include "osif_cm_util.h" 25 #include "wlan_osif_priv.h" 26 #include "wlan_cfg80211.h" 27 #include "osif_cm_rsp.h" 28 #include "wlan_cfg80211_scan.h" 29 30 enum qca_sta_connect_fail_reason_codes 31 osif_cm_mac_to_qca_connect_fail_reason(enum wlan_status_code internal_reason) 32 { 33 enum qca_sta_connect_fail_reason_codes reason = 0; 34 35 if (internal_reason < STATUS_PROP_START) 36 return reason; 37 38 switch (internal_reason) { 39 case STATUS_NO_NETWORK_FOUND: 40 reason = QCA_STA_CONNECT_FAIL_REASON_NO_BSS_FOUND; 41 break; 42 case STATUS_AUTH_TX_FAIL: 43 reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL; 44 break; 45 case STATUS_AUTH_NO_ACK_RECEIVED: 46 reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED; 47 break; 48 case STATUS_AUTH_NO_RESP_RECEIVED: 49 reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED; 50 break; 51 case STATUS_ASSOC_TX_FAIL: 52 reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL; 53 break; 54 case STATUS_ASSOC_NO_ACK_RECEIVED: 55 reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED; 56 break; 57 case STATUS_ASSOC_NO_RESP_RECEIVED: 58 reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED; 59 break; 60 default: 61 osif_debug("QCA code not present for internal status code %d", 62 internal_reason); 63 } 64 65 return reason; 66 } 67 68 const char * 69 osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason) 70 { 71 switch (reason) { 72 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE); 73 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE); 74 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE); 75 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA); 76 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR); 77 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED); 78 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_DEVICE_RECOVERY); 79 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_KEY_TIMEOUT); 80 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE); 81 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_IFACE_DOWN); 82 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL); 83 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_INACTIVITY); 84 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT); 85 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE); 86 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE); 87 CASE_RETURN_STRING(QCA_DISCONNECT_REASON_USER_TRIGGERED); 88 case QCA_DISCONNECT_REASON_UNSPECIFIED: 89 return ""; 90 default: 91 return "Unknown"; 92 } 93 } 94 95 enum qca_disconnect_reason_codes 96 osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason) 97 { 98 enum qca_disconnect_reason_codes reason = 99 QCA_DISCONNECT_REASON_UNSPECIFIED; 100 101 if (internal_reason < REASON_PROP_START) 102 return reason; 103 104 switch (internal_reason) { 105 case REASON_HOST_TRIGGERED_ROAM_FAILURE: 106 case REASON_FW_TRIGGERED_ROAM_FAILURE: 107 reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE; 108 break; 109 case REASON_USER_TRIGGERED_ROAM_FAILURE: 110 reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE; 111 break; 112 case REASON_GATEWAY_REACHABILITY_FAILURE: 113 reason = 114 QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE; 115 break; 116 case REASON_UNSUPPORTED_CHANNEL_CSA: 117 reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA; 118 break; 119 case REASON_OPER_CHANNEL_DISABLED_INDOOR: 120 reason = 121 QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR; 122 break; 123 case REASON_OPER_CHANNEL_USER_DISABLED: 124 reason = 125 QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED; 126 break; 127 case REASON_DEVICE_RECOVERY: 128 reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY; 129 break; 130 case REASON_KEY_TIMEOUT: 131 reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT; 132 break; 133 case REASON_OPER_CHANNEL_BAND_CHANGE: 134 reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE; 135 break; 136 case REASON_IFACE_DOWN: 137 reason = QCA_DISCONNECT_REASON_IFACE_DOWN; 138 break; 139 case REASON_PEER_XRETRY_FAIL: 140 reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL; 141 break; 142 case REASON_PEER_INACTIVITY: 143 reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY; 144 break; 145 case REASON_SA_QUERY_TIMEOUT: 146 reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT; 147 break; 148 case REASON_CHANNEL_SWITCH_FAILED: 149 reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE; 150 break; 151 case REASON_BEACON_MISSED: 152 reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE; 153 break; 154 default: 155 osif_debug("No QCA reason code for mac reason: %u", 156 internal_reason); 157 /* Unspecified reason by default */ 158 } 159 160 return reason; 161 } 162 163 static struct osif_cm_ops *osif_cm_legacy_ops; 164 165 void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv) 166 { 167 osif_priv->cm_info.last_id = CM_ID_INVALID; 168 osif_priv->cm_info.last_source = CM_SOURCE_INVALID; 169 } 170 171 QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev) 172 { 173 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 174 175 if (!osif_priv) { 176 osif_err("Invalid vdev osif priv"); 177 return QDF_STATUS_E_INVAL; 178 } 179 qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); 180 osif_cm_reset_id_and_src_no_lock(osif_priv); 181 qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); 182 183 return QDF_STATUS_SUCCESS; 184 } 185 186 /** 187 * osif_cm_connect_complete_cb() - Connect complete callback 188 * @vdev: vdev pointer 189 * @rsp: connect response 190 * 191 * Return: QDF_STATUS 192 */ 193 static QDF_STATUS 194 osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev, 195 struct wlan_cm_connect_resp *rsp) 196 { 197 return osif_connect_handler(vdev, rsp); 198 } 199 200 /** 201 * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate 202 * @vdev: vdev pointer 203 * @rsp: connect response 204 * 205 * Return: QDF_STATUS 206 */ 207 static QDF_STATUS 208 osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev, 209 struct wlan_cm_connect_resp *rsp) 210 { 211 return osif_failed_candidate_handler(vdev, rsp); 212 } 213 214 /** 215 * osif_cm_update_id_and_src_cb() - Callback to update id and 216 * source of the connect/disconnect request 217 * @vdev: vdev pointer 218 * @Source: Source of the connect req 219 * @id: Connect/disconnect id 220 * 221 * Context: Any context. Takes and releases cmd id spinlock 222 * Return: QDF_STATUS 223 */ 224 static QDF_STATUS 225 osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev *vdev, 226 enum wlan_cm_source source, wlan_cm_id cm_id) 227 { 228 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 229 230 if (!osif_priv) { 231 osif_err("Invalid vdev osif priv"); 232 return QDF_STATUS_E_INVAL; 233 } 234 235 qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); 236 osif_priv->cm_info.last_id = cm_id; 237 osif_priv->cm_info.last_source = source; 238 qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); 239 240 return QDF_STATUS_SUCCESS; 241 } 242 243 /** 244 * osif_cm_disconnect_complete_cb() - Disconnect done callback 245 * @vdev: vdev pointer 246 * @disconnect_rsp: Disconnect response 247 * 248 * Context: Any context 249 * Return: QDF_STATUS 250 */ 251 252 static QDF_STATUS 253 osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev *vdev, 254 struct wlan_cm_discon_rsp *rsp) 255 { 256 return osif_disconnect_handler(vdev, rsp); 257 } 258 259 #ifdef CONN_MGR_ADV_FEATURE 260 void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev, 261 struct vdev_osif_priv *osif_priv, 262 struct qdf_mac_addr *bssid, 263 uint8_t *ssid, uint8_t ssid_len) 264 { 265 struct wiphy *wiphy = osif_priv->wdev->wiphy; 266 struct scan_filter *filter; 267 QDF_STATUS status; 268 269 status = __wlan_cfg80211_unlink_bss_list(wiphy, wlan_vdev_get_pdev(vdev), 270 bssid->bytes, ssid_len ? ssid : NULL, 271 ssid_len); 272 if (QDF_IS_STATUS_ERROR(status)) 273 return; 274 filter = qdf_mem_malloc(sizeof(*filter)); 275 if (!filter) 276 return; 277 278 filter->num_of_bssid = 1; 279 qdf_copy_macaddr(&filter->bssid_list[0], bssid); 280 ucfg_scan_flush_results(wlan_vdev_get_pdev(vdev), filter); 281 qdf_mem_free(filter); 282 } 283 284 static QDF_STATUS 285 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev) 286 { 287 return osif_cm_netif_queue_ind(vdev, 288 WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER, 289 WLAN_CONTROL_PATH); 290 } 291 292 /** 293 * osif_cm_roam_sync_cb() - Roam sync callback 294 * @vdev: vdev pointer 295 * 296 * This callback indicates os_if that roam sync ind received 297 * so that os_if can stop all the activity on this connection 298 * 299 * Return: QDF_STATUS 300 */ 301 static QDF_STATUS 302 osif_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev) 303 { 304 osif_cm_napi_serialize(true); 305 return osif_cm_netif_queue_ind(vdev, 306 WLAN_STOP_ALL_NETIF_QUEUE, 307 WLAN_CONTROL_PATH); 308 } 309 310 /** 311 * @osif_pmksa_candidate_notify_cb: Roam pmksa candidate notify callback 312 * @vdev: vdev pointer 313 * @bssid: bssid 314 * @index: index 315 * @preauth: preauth flag 316 * 317 * Return: QDF_STATUS 318 */ 319 static QDF_STATUS 320 osif_pmksa_candidate_notify_cb(struct wlan_objmgr_vdev *vdev, 321 struct qdf_mac_addr *bssid, 322 int index, bool preauth) 323 { 324 return osif_pmksa_candidate_notify(vdev, bssid, index, preauth); 325 } 326 #else 327 static inline QDF_STATUS 328 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev) 329 { 330 return QDF_STATUS_SUCCESS; 331 } 332 #endif 333 334 /** 335 * osif_cm_disconnect_start_cb() - Disconnect start callback 336 * @vdev: vdev pointer 337 * 338 * This callback indicates os_if that disconnection is started 339 * so that os_if can stop all the activity on this connection 340 * 341 * Return: QDF_STATUS 342 */ 343 static QDF_STATUS 344 osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev) 345 { 346 /* Disable netif queue on disconnect start */ 347 return osif_cm_disable_netif_queue(vdev); 348 } 349 350 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 351 /** 352 * osif_cm_roam_start_cb() - Roam start callback 353 * @vdev: vdev pointer 354 * 355 * This callback indicates os_if that roaming has started 356 * so that os_if can stop all the activity on this connection 357 * 358 * Return: QDF_STATUS 359 */ 360 static QDF_STATUS 361 osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev) 362 { 363 return osif_cm_netif_queue_ind(vdev, 364 WLAN_STOP_ALL_NETIF_QUEUE, 365 WLAN_CONTROL_PATH); 366 } 367 368 /** 369 * osif_cm_roam_abort_cb() - Roam abort callback 370 * @vdev: vdev pointer 371 * 372 * This callback indicates os_if that roaming has been aborted 373 * so that os_if can resume all the activity on this connection 374 * 375 * Return: QDF_STATUS 376 */ 377 static QDF_STATUS 378 osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev) 379 { 380 osif_cm_napi_serialize(false); 381 return osif_cm_netif_queue_ind(vdev, 382 WLAN_WAKE_ALL_NETIF_QUEUE, 383 WLAN_CONTROL_PATH); 384 } 385 386 /** 387 * osif_cm_roam_cmpl_cb() - Roam sync complete callback 388 * @vdev: vdev pointer 389 * @rsp: connect rsp 390 * 391 * This callback indicates os_if that roam sync is complete 392 * so that os_if can stop all the activity on this connection 393 * 394 * Return: QDF_STATUS 395 */ 396 397 static QDF_STATUS 398 osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev) 399 { 400 return osif_cm_napi_serialize(false); 401 } 402 #endif 403 404 #ifdef WLAN_FEATURE_PREAUTH_ENABLE 405 /** 406 * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback 407 * @vdev: vdev pointer 408 * @rsp: preauth response 409 * 410 * This callback indicates os_if that roam ft preauth is complete 411 * so that os_if can send fast transition event 412 * 413 * Return: QDF_STATUS 414 */ 415 416 static QDF_STATUS 417 osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev, 418 struct wlan_preauth_rsp *rsp) 419 { 420 osif_cm_ft_preauth_complete_cb cb = NULL; 421 QDF_STATUS ret = QDF_STATUS_SUCCESS; 422 423 if (osif_cm_legacy_ops) 424 cb = osif_cm_legacy_ops->ft_preauth_complete_cb; 425 if (cb) 426 ret = cb(vdev, rsp); 427 428 return ret; 429 } 430 431 #ifdef FEATURE_WLAN_ESE 432 /** 433 * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback 434 * @vdev: vdev pointer 435 * @rsp: preauth response 436 * 437 * This callback indicates os_if that roam cckm preauth is complete 438 * so that os_if can send cckm preauth indication to the supplicant 439 * via wireless custom event. 440 * 441 * Return: QDF_STATUS 442 */ 443 444 static QDF_STATUS 445 osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev, 446 struct wlan_preauth_rsp *rsp) 447 { 448 osif_cm_cckm_preauth_complete_cb cb = NULL; 449 QDF_STATUS ret = QDF_STATUS_SUCCESS; 450 451 if (osif_cm_legacy_ops) 452 cb = osif_cm_legacy_ops->cckm_preauth_complete_cb; 453 if (cb) 454 ret = cb(vdev, rsp); 455 456 return ret; 457 } 458 #endif 459 #endif 460 461 static struct mlme_cm_ops cm_ops = { 462 .mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb, 463 .mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb, 464 .mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb, 465 .mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb, 466 .mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb, 467 #ifdef CONN_MGR_ADV_FEATURE 468 .mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb, 469 .mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb, 470 #endif 471 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 472 .mlme_cm_roam_start_cb = osif_cm_roam_start_cb, 473 .mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb, 474 .mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb, 475 #endif 476 #ifdef WLAN_FEATURE_PREAUTH_ENABLE 477 .mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb, 478 #ifdef FEATURE_WLAN_ESE 479 .mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb, 480 #endif 481 #endif 482 }; 483 484 /** 485 * osif_cm_get_global_ops() - Get connection manager global ops 486 * 487 * Return: Connection manager global ops 488 */ 489 static struct mlme_cm_ops *osif_cm_get_global_ops(void) 490 { 491 return &cm_ops; 492 } 493 494 QDF_STATUS osif_cm_register_cb(void) 495 { 496 mlme_set_osif_cm_cb(osif_cm_get_global_ops); 497 498 return QDF_STATUS_SUCCESS; 499 } 500 501 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev) 502 { 503 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 504 enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev); 505 506 if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE) 507 return QDF_STATUS_SUCCESS; 508 509 if (!osif_priv) { 510 osif_err("Invalid vdev osif priv"); 511 return QDF_STATUS_E_INVAL; 512 } 513 514 qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock); 515 516 return QDF_STATUS_SUCCESS; 517 } 518 519 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev) 520 { 521 struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); 522 enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev); 523 524 if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE) 525 return QDF_STATUS_SUCCESS; 526 527 if (!osif_priv) { 528 osif_err("Invalid vdev osif priv"); 529 return QDF_STATUS_E_INVAL; 530 } 531 qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock); 532 533 return QDF_STATUS_SUCCESS; 534 } 535 536 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev, 537 struct wlan_cm_connect_resp *rsp, 538 enum osif_cb_type type) 539 { 540 osif_cm_connect_comp_cb cb = NULL; 541 QDF_STATUS ret = QDF_STATUS_SUCCESS; 542 543 if (osif_cm_legacy_ops) 544 cb = osif_cm_legacy_ops->connect_complete_cb; 545 if (cb) 546 ret = cb(vdev, rsp, type); 547 548 return ret; 549 } 550 551 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev, 552 struct wlan_cm_discon_rsp *rsp, 553 enum osif_cb_type type) 554 { 555 osif_cm_disconnect_comp_cb cb = NULL; 556 QDF_STATUS ret = QDF_STATUS_SUCCESS; 557 558 if (osif_cm_legacy_ops) 559 cb = osif_cm_legacy_ops->disconnect_complete_cb; 560 if (cb) 561 ret = cb(vdev, rsp, type); 562 563 return ret; 564 } 565 566 #ifdef CONN_MGR_ADV_FEATURE 567 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev, 568 enum netif_action_type action, 569 enum netif_reason_type reason) 570 { 571 osif_cm_netif_queue_ctrl_cb cb = NULL; 572 QDF_STATUS ret = QDF_STATUS_SUCCESS; 573 574 if (osif_cm_legacy_ops) 575 cb = osif_cm_legacy_ops->netif_queue_control_cb; 576 if (cb) 577 ret = cb(vdev, action, reason); 578 579 return ret; 580 } 581 582 QDF_STATUS osif_cm_napi_serialize(bool action) 583 { 584 os_if_cm_napi_serialize_ctrl_cb cb = NULL; 585 QDF_STATUS ret = QDF_STATUS_SUCCESS; 586 587 if (osif_cm_legacy_ops) 588 cb = osif_cm_legacy_ops->napi_serialize_control_cb; 589 if (cb) 590 ret = cb(action); 591 592 return ret; 593 } 594 595 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev, 596 struct wlan_cm_connect_resp *rsp) 597 { 598 osif_cm_save_gtk_cb cb = NULL; 599 QDF_STATUS ret = QDF_STATUS_SUCCESS; 600 601 if (osif_cm_legacy_ops) 602 cb = osif_cm_legacy_ops->save_gtk_cb; 603 if (cb) 604 ret = cb(vdev, rsp); 605 606 return ret; 607 } 608 #endif 609 610 #ifdef WLAN_FEATURE_FILS_SK 611 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev, 612 struct wlan_objmgr_vdev *vdev, 613 struct wlan_cm_connect_resp *rsp) 614 { 615 osif_cm_set_hlp_data_cb cb = NULL; 616 QDF_STATUS ret = QDF_STATUS_SUCCESS; 617 618 if (osif_cm_legacy_ops) 619 cb = osif_cm_legacy_ops->set_hlp_data_cb; 620 if (cb) 621 ret = cb(dev, vdev, rsp); 622 623 return ret; 624 } 625 #endif 626 627 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops) 628 { 629 osif_cm_legacy_ops = osif_legacy_ops; 630 } 631 632 void osif_cm_reset_legacy_cb(void) 633 { 634 osif_cm_legacy_ops = NULL; 635 } 636