1 /* 2 * Copyright (c) 2012-2015, 2020, 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: wlan_cm_main_api.h 19 * 20 * This header file maintain connect, disconnect APIs of connection manager 21 */ 22 23 #ifndef __WLAN_CM_MAIN_API_H__ 24 #define __WLAN_CM_MAIN_API_H__ 25 26 #include "wlan_cm_main.h" 27 #include "wlan_cm_sm.h" 28 #include <include/wlan_mlme_cmn.h> 29 #include <wlan_crypto_global_api.h> 30 #ifdef WLAN_FEATURE_INTERFACE_MGR 31 #include <wlan_if_mgr_api.h> 32 #endif 33 34 #define CONNECT_REQ_PREFIX 0x00C00000 35 #define DISCONNECT_REQ_PREFIX 0x00D00000 36 #define CM_ID_MASK 0x0000FFFF 37 38 #define CM_ID_GET_PREFIX(cm_id) cm_id & 0xFFFF0000 39 40 #define CM_PREFIX_FMT "vdev %d cm_id 0x%x: " 41 #define CM_PREFIX_REF(vdev_id, cm_id) (vdev_id), (cm_id) 42 43 /*************** CONNECT APIs ****************/ 44 45 /** 46 * cm_connect_start() - This API will be called to initiate the connect 47 * process 48 * @cm_ctx: connection manager context 49 * @req: Connect request. 50 * 51 * Return: QDF status 52 */ 53 QDF_STATUS cm_connect_start(struct cnx_mgr *cm_ctx, struct cm_connect_req *req); 54 55 /** 56 * cm_handle_connect_req_in_non_init_state() - Handle connect request in non 57 * init state. 58 * @cm_ctx: connection manager context 59 * @cm_req: cm request 60 * @cm_state_substate: state of CM SM 61 * 62 * Context: Can be called only while handling connection manager event 63 * ie holding state machine lock 64 * 65 * Return: QDF_STATUS 66 */ 67 QDF_STATUS 68 cm_handle_connect_req_in_non_init_state(struct cnx_mgr *cm_ctx, 69 struct cm_connect_req *cm_req, 70 enum wlan_cm_sm_state cm_state_substate); 71 72 /** 73 * cm_handle_discon_req_in_non_connected_state() - Handle disconnect req in non 74 * connected state. 75 * @cm_ctx: connection manager context 76 * @cm_req: cm request 77 * @cm_state_substate: state of CM SM 78 * 79 * Context: Can be called only while handling connection manager event 80 * ie holding state machine lock 81 * 82 * Return: QDF_STATUS 83 */ 84 QDF_STATUS 85 cm_handle_discon_req_in_non_connected_state(struct cnx_mgr *cm_ctx, 86 struct cm_disconnect_req *cm_req, 87 enum wlan_cm_sm_state cm_state_substate); 88 89 /** 90 * cm_connect_scan_start() - This API will be called to initiate the connect 91 * scan if no candidate are found in scan db. 92 * @cm_ctx: connection manager context 93 * @req: Connect request. 94 * 95 * Return: QDF status 96 */ 97 QDF_STATUS cm_connect_scan_start(struct cnx_mgr *cm_ctx, 98 struct cm_connect_req *req); 99 100 /** 101 * cm_connect_scan_resp() - Handle the connect scan resp and next action 102 * scan if no candidate are found in scan db. 103 * @scan_id: scan id of the req 104 * @status: Connect scan status 105 * 106 * Return: QDF status 107 */ 108 QDF_STATUS cm_connect_scan_resp(struct cnx_mgr *cm_ctx, wlan_scan_id *scan_id, 109 QDF_STATUS status); 110 111 /** 112 * cm_connect_handle_event_post_fail() - initiate connect failure if msg posting 113 * to SM fails 114 * @cm_ctx: connection manager context 115 * @cm_id: cm_id for connect req for which post fails 116 * 117 * Context: Can be called from any context and to be used only after posting a 118 * msg to SM fails from external event e.g. peer create resp, 119 * HW mode change resp serialization cb. 120 * 121 * Return: QDF_STATUS 122 */ 123 void 124 cm_connect_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id); 125 126 /** 127 * wlan_cm_scan_cb() - Callback function for scan for ssid 128 * @vdev: VDEV MLME comp object 129 * @event: scan event definition 130 * @arg: reference to connection manager context 131 * 132 * API handles scan success/failure case 133 * 134 * Context: Can be called from any context. 135 * Return: None 136 */ 137 void wlan_cm_scan_cb(struct wlan_objmgr_vdev *vdev, 138 struct scan_event *event, void *arg); 139 140 /** 141 * cm_connect_resp_cmid_match_list_head() - Check if resp cmid is same as list 142 * head 143 * @cm_ctx: connection manager context 144 * @resp: connect resp 145 * 146 * Return: bool 147 */ 148 bool cm_connect_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx, 149 struct wlan_cm_connect_resp *resp); 150 151 /** 152 * cm_connect_active() - This API would be called after the connect 153 * request gets activated in serialization. 154 * @cm_ctx: connection manager context 155 * @cm_id: Connection mgr ID assigned to this connect request. 156 * 157 * Return: QDF status 158 */ 159 QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 160 161 /** 162 * cm_try_next_candidate() - This API would try to connect to next valid 163 * candidate and fail if no candidate left 164 * request gets activated in serialization. 165 * @cm_ctx: connection manager context 166 * @connect_resp: connect resp. 167 * 168 * Return: QDF status 169 */ 170 QDF_STATUS cm_try_next_candidate(struct cnx_mgr *cm_ctx, 171 struct wlan_cm_connect_resp *connect_resp); 172 173 /** 174 * cm_peer_create_on_bss_select_ind_resp() - Called to create peer 175 * if bss select inidication's resp was success 176 * @cm_ctx: connection manager context 177 * @cm_id: Connection mgr ID assigned to this connect request. 178 * 179 * Return: QDF status 180 */ 181 QDF_STATUS 182 cm_peer_create_on_bss_select_ind_resp(struct cnx_mgr *cm_ctx, 183 wlan_cm_id *cm_id); 184 185 /** 186 * cm_resume_connect_after_peer_create() - Called after bss create rsp 187 * @cm_ctx: connection manager context 188 * @cm_id: Connection mgr ID assigned to this connect request. 189 * 190 * Return: QDF status 191 */ 192 QDF_STATUS 193 cm_resume_connect_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 194 195 /** 196 * cm_bss_select_ind_rsp() - Connection manager resp for bss 197 * select indication 198 * @vdev: vdev pointer 199 * @status: Status 200 * 201 * Return: QDF_STATUS 202 */ 203 QDF_STATUS cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev, 204 QDF_STATUS status); 205 206 /** 207 * cm_bss_peer_create_rsp() - handle bss peer create response 208 * @vdev: vdev 209 * @status: bss peer create status 210 * @peer_mac: peer mac 211 * 212 * Return: QDF status 213 */ 214 QDF_STATUS cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev, 215 QDF_STATUS status, 216 struct qdf_mac_addr *peer_mac); 217 218 /** 219 * cm_connect_rsp() - Connection manager connect response 220 * @vdev: vdev pointer 221 * @resp: Connect response 222 * 223 * Return: QDF_STATUS 224 */ 225 QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev, 226 struct wlan_cm_connect_resp *resp); 227 228 /** 229 * cm_connect_complete() - This API would be called after connect complete 230 * request from the serialization. 231 * @cm_ctx: connection manager context 232 * @resp: Connection complete resp. 233 * 234 * This API would be called after connection completion resp from VDEV mgr 235 * 236 * Return: QDF status 237 */ 238 QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx, 239 struct wlan_cm_connect_resp *resp); 240 241 /** 242 * cm_add_connect_req_to_list() - add connect req to the connection manager 243 * req list 244 * @vdev: vdev on which connect is received 245 * @req: Connection req provided 246 * 247 * Return: QDF status 248 */ 249 QDF_STATUS cm_add_connect_req_to_list(struct cnx_mgr *cm_ctx, 250 struct cm_connect_req *req); 251 252 /** 253 * cm_connect_start_req() - Connect start req from the requester 254 * @vdev: vdev on which connect is received 255 * @req: Connection req provided 256 * 257 * Return: QDF status 258 */ 259 QDF_STATUS cm_connect_start_req(struct wlan_objmgr_vdev *vdev, 260 struct wlan_cm_connect_req *req); 261 262 /** 263 * cm_send_connect_start_fail() - initiate connect failure 264 * @cm_ctx: connection manager context 265 * @req: connect req for which connect failed 266 * @reason: failure reason 267 * 268 * Context: Can be called from any context and to be used only after posting a 269 * msg to SM (ie holding the SM lock) to avoid use after free for req. 270 * 271 * Return: QDF_STATUS 272 */ 273 QDF_STATUS 274 cm_send_connect_start_fail(struct cnx_mgr *cm_ctx, 275 struct cm_connect_req *req, 276 enum wlan_cm_connect_fail_reason reason); 277 278 #ifdef WLAN_POLICY_MGR_ENABLE 279 /** 280 * cm_hw_mode_change_resp() - HW mode change response 281 * @pdev: pdev pointer 282 * @vdev_id: vdev id 283 * @cm_id: connection ID which gave the hw mode change request 284 * @status: status of the HW mode change. 285 * 286 * Return: void 287 */ 288 void cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 289 wlan_cm_id cm_id, QDF_STATUS status); 290 291 /** 292 * cm_handle_hw_mode_change() - SM handling of hw mode change resp 293 * @cm_ctx: connection manager context 294 * @cm_id: Connection mgr ID assigned to this connect request. 295 * @event: HW mode success or failure event 296 * 297 * Return: QDF_STATUS 298 */ 299 QDF_STATUS cm_handle_hw_mode_change(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id, 300 enum wlan_cm_sm_evt event); 301 #else 302 static inline 303 QDF_STATUS cm_handle_hw_mode_change(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id, 304 enum wlan_cm_sm_evt event) 305 { 306 return QDF_STATUS_SUCCESS; 307 } 308 #endif 309 310 /*************** DISCONNECT APIs ****************/ 311 312 /** 313 * cm_disconnect_start() - Initiate the disconnect process 314 * @cm_ctx: connection manager context 315 * @req: Disconnect request. 316 * 317 * Return: QDF status 318 */ 319 QDF_STATUS cm_disconnect_start(struct cnx_mgr *cm_ctx, 320 struct cm_disconnect_req *req); 321 322 /** 323 * cm_disconnect_active() - This API would be called after the disconnect 324 * request gets activated in serialization. 325 * @cm_ctx: connection manager context 326 * @cm_id: Connection mgr ID assigned to this connect request. 327 * 328 * Return: QDF status 329 */ 330 QDF_STATUS cm_disconnect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 331 332 /** 333 * cm_disconnect_complete() - This API would be called after disconnect complete 334 * request from the serialization. 335 * @cm_ctx: connection manager context 336 * @resp: disconnection complete resp. 337 * 338 * This API would be called after connection completion resp from VDEV mgr 339 * 340 * Return: QDF status 341 */ 342 QDF_STATUS cm_disconnect_complete(struct cnx_mgr *cm_ctx, 343 struct wlan_cm_discon_rsp *resp); 344 345 /** 346 * cm_add_disconnect_req_to_list() - add disconnect req to the connection 347 * manager req list 348 * @vdev: vdev on which connect is received 349 * @req: Disconnection req provided 350 * 351 * Return: QDF status 352 */ 353 QDF_STATUS cm_add_disconnect_req_to_list(struct cnx_mgr *cm_ctx, 354 struct cm_disconnect_req *req); 355 356 /** 357 * cm_disconnect_start_req() - Disconnect start req from the requester 358 * @vdev: vdev on which connect is received 359 * @req: disconnection req provided 360 * 361 * Return: QDF status 362 */ 363 QDF_STATUS cm_disconnect_start_req(struct wlan_objmgr_vdev *vdev, 364 struct wlan_cm_disconnect_req *req); 365 366 /** 367 * cm_disconnect_start_req_sync() - disconnect request with wait till 368 * completed 369 * @vdev: vdev pointer 370 * @req: disconnect req 371 * 372 * Context: Only call for north bound disconnect req, if wait till complete 373 * is required, e.g. during vdev delete. Do not call from scheduler context. 374 * 375 * Return: QDF_STATUS 376 */ 377 QDF_STATUS cm_disconnect_start_req_sync(struct wlan_objmgr_vdev *vdev, 378 struct wlan_cm_disconnect_req *req); 379 380 /** 381 * cm_bss_peer_delete_req() - Connection manager bss peer delete 382 * request 383 * @vdev: VDEV object 384 * @peer_mac: Peer mac address 385 * 386 * This function is called on peer delete indication and sends peer delete 387 * request to mlme. 388 * 389 * Context: Any context. 390 * 391 * Return: QDF_STATUS 392 */ 393 QDF_STATUS cm_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev, 394 struct qdf_mac_addr *peer_mac); 395 396 /** 397 * cm_vdev_down_req() - Connection manager req to send vdev down to FW 398 * @vdev: VDEV object 399 * @status: status 400 * 401 * This function is called when peer delete response is received, to send 402 * vdev down request to mlme 403 * 404 * Context: Any context. 405 * 406 * Return: QDF_STATUS 407 */ 408 QDF_STATUS cm_vdev_down_req(struct wlan_objmgr_vdev *vdev, uint32_t status); 409 410 /** 411 * cm_disconnect_rsp() - Connection manager api to post connect event 412 * @vdev: VDEV object 413 * @cm_discon_rsp: Disconnect response 414 * 415 * This function is called when disconnecte response is received, to deliver 416 * disconnect event to SM 417 * 418 * Context: Any context. 419 * 420 * Return: QDF_STATUS 421 */ 422 QDF_STATUS cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev, 423 struct wlan_cm_discon_rsp *resp); 424 425 /** 426 * cm_initiate_internal_disconnect() - Initiate internal disconnect to cleanup 427 * a active connect in case of back to back request 428 * @cm_ctx: connection manager context 429 * 430 * Context: Can be called from any context. Hold the SM lock while calling this 431 * api. 432 * 433 * Return: void 434 */ 435 void cm_initiate_internal_disconnect(struct cnx_mgr *cm_ctx); 436 437 /** 438 * cm_send_disconnect_resp() - Initiate disconnect resp for the cm_id 439 * @cm_ctx: connection manager context 440 * @cm_id: cm id to send disconnect resp for 441 * 442 * Context: Can be called from any context. Hold the SM lock while calling this 443 * api. 444 * 445 * Return: void 446 */ 447 void cm_send_disconnect_resp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id); 448 449 /*************** UTIL APIs ****************/ 450 451 /** 452 * cm_ser_get_blocking_cmd() - check if serialization command needs to be 453 * blocking 454 * 455 * Return: bool 456 */ 457 static inline bool cm_ser_get_blocking_cmd(void) 458 { 459 return true; 460 } 461 462 /** 463 * cm_get_cm_id() - Get unique cm id for connect/disconnect request 464 * @cm_ctx: connection manager context 465 * @source: source of the request (can be connect or disconnect request) 466 * 467 * Return: cm id 468 */ 469 wlan_cm_id cm_get_cm_id(struct cnx_mgr *cm_ctx, enum wlan_cm_source source); 470 471 struct cnx_mgr *cm_get_cm_ctx_fl(struct wlan_objmgr_vdev *vdev, 472 const char *func, uint32_t line); 473 474 /** 475 * cm_get_cm_ctx() - Get connection manager context from vdev 476 * @vdev: vdev object pointer 477 * 478 * Return: pointer to connection manager context 479 */ 480 #define cm_get_cm_ctx(vdev) \ 481 cm_get_cm_ctx_fl(vdev, __func__, __LINE__) 482 483 /** 484 * cm_reset_active_cm_id() - Reset active cm_id from cm context, if its same as 485 * passed cm_id 486 * @vdev: vdev object pointer 487 * @cm_id: cmid to match 488 * 489 * Return: void 490 */ 491 void cm_reset_active_cm_id(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id); 492 493 #ifdef CRYPTO_SET_KEY_CONVERGED 494 /** 495 * cm_set_key() - set wep or fils key on connection completion 496 * @cm_ctx: connection manager context 497 * @unicast: if key is unicast 498 * @key_idx: Key index 499 * @bssid: bssid of the connected AP 500 * 501 * Return: void 502 */ 503 QDF_STATUS cm_set_key(struct cnx_mgr *cm_ctx, bool unicast, 504 uint8_t key_idx, struct qdf_mac_addr *bssid); 505 #endif 506 507 #ifdef CONN_MGR_ADV_FEATURE 508 /** 509 * cm_store_wep_key() - store wep keys in crypto on connect active 510 * @cm_ctx: connection manager context 511 * @crypto: connection crypto info 512 * @cm_id: cm_id of the connection 513 * 514 * Return: void 515 */ 516 void cm_store_wep_key(struct cnx_mgr *cm_ctx, 517 struct wlan_cm_connect_crypto_info *crypto, 518 wlan_cm_id cm_id); 519 #else 520 static inline void cm_store_wep_key(struct cnx_mgr *cm_ctx, 521 struct wlan_cm_connect_crypto_info *crypto, 522 wlan_cm_id cm_id) 523 {} 524 #endif 525 526 #ifdef WLAN_FEATURE_FILS_SK 527 /** 528 * cm_store_fils_key() - store fils keys in crypto on connection complete 529 * @cm_ctx: connection manager context 530 * @unicast: if key is unicast 531 * @key_id: Key index 532 * @key_length: key length 533 * @key: key data 534 * @bssid: bssid of the connected AP 535 * @cm_id: cm_id of the connection 536 * 537 * Return: void 538 */ 539 void cm_store_fils_key(struct cnx_mgr *cm_ctx, bool unicast, 540 uint8_t key_id, uint16_t key_length, 541 uint8_t *key, struct qdf_mac_addr *bssid, 542 wlan_cm_id cm_id); 543 #endif 544 545 /** 546 * cm_check_cmid_match_list_head() - check if list head command matches the 547 * given cm_id 548 * @cm_ctx: connection manager context 549 * @cm_id: cm id of connect/disconnect req 550 * 551 * Check if front req command matches the given 552 * cm_id, this can be used to check if the latest (head) is same we are 553 * trying to processing 554 * 555 * Return: true if match else false 556 */ 557 bool cm_check_cmid_match_list_head(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 558 559 /** 560 * cm_check_scanid_match_list_head() - check if list head command matches the 561 * given scan_id 562 * @cm_ctx: connection manager context 563 * @scan_id: scan_id of connect req 564 * 565 * Check if front req command is connect command and matches the given 566 * scan_id, this can be used to check if the latest (head) is same we are 567 * trying to processing 568 * 569 * Return: true if match else false 570 */ 571 bool cm_check_scanid_match_list_head(struct cnx_mgr *cm_ctx, 572 wlan_scan_id *scan_id); 573 574 /** 575 * cm_free_connect_req_mem() - free connect req internal memory, to be called 576 * before cm_req is freed 577 * @connect_req: connect req 578 * 579 * Return: void 580 */ 581 void cm_free_connect_req_mem(struct cm_connect_req *connect_req); 582 583 /** 584 * cm_delete_req_from_list() - Delete the request matching cm id 585 * @cm_ctx: connection manager context 586 * @cm_id: cm id of connect/disconnect req 587 * 588 * Context: Can be called from any context. 589 * 590 * Return: QDF_STATUS 591 */ 592 QDF_STATUS cm_delete_req_from_list(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id); 593 594 /** 595 * cm_fill_bss_info_in_connect_rsp_by_cm_id() - fill bss info for the cm id 596 * @cm_ctx: connection manager context 597 * @cm_id: cm id of connect/disconnect req 598 * @resp: resp to copy bss info like ssid/bssid and freq 599 * 600 * Fill the SSID form the connect req. 601 * Fill freq and bssid from current candidate if available (i.e the connection 602 * has tried to connect to a candidate), else get the bssid from req bssid or 603 * bssid hint which ever is present. 604 * 605 * Return: Success if entry was found else failure 606 */ 607 QDF_STATUS 608 cm_fill_bss_info_in_connect_rsp_by_cm_id(struct cnx_mgr *cm_ctx, 609 wlan_cm_id cm_id, 610 struct wlan_cm_connect_resp *resp); 611 612 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD) 613 bool cm_is_cm_id_current_candidate_single_pmk(struct cnx_mgr *cm_ctx, 614 wlan_cm_id cm_id); 615 #else 616 static inline 617 bool cm_is_cm_id_current_candidate_single_pmk(struct cnx_mgr *cm_ctx, 618 wlan_cm_id cm_id) 619 { 620 return false; 621 } 622 #endif 623 624 /** 625 * cm_flush_pending_request() - Flush all pending requests matching flush prefix 626 * @cm_ctx: connection manager context 627 * @prefix: prefix for the type of command to flush 628 * @only_failed_req: flush only the failed pending req 629 * 630 * Context: Can be called from any context. 631 * 632 * Return: void 633 */ 634 void cm_flush_pending_request(struct cnx_mgr *cm_ctx, uint32_t prefix, 635 bool only_failed_req); 636 637 /** 638 * cm_remove_cmd() - Remove cmd from req list and serialization 639 * @cm_ctx: connection manager context 640 * @cm_id: cm id of connect/disconnect req 641 * 642 * Return: void 643 */ 644 void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id); 645 646 /** 647 * cm_add_req_to_list_and_indicate_osif() - Add the request to request list in 648 * cm ctx and indicate same to osif 649 * @cm_ctx: connection manager context 650 * @cm_req: cm request 651 * @source: source of request 652 * 653 * Context: Can be called from any context. 654 * 655 * Return: QDF_STATUS 656 */ 657 QDF_STATUS cm_add_req_to_list_and_indicate_osif(struct cnx_mgr *cm_ctx, 658 struct cm_req *cm_req, 659 enum wlan_cm_source source); 660 661 struct cm_req *cm_get_req_by_cm_id_fl(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id, 662 const char *func, uint32_t line); 663 664 /** 665 * cm_get_req_by_cm_id() - Get cm req matching the cm id 666 * @cm_ctx: connection manager context 667 * @cm_id: cm id of connect/disconnect req 668 * 669 * Context: Can be called from any context and to be used only after posting a 670 * msg to SM (ie holding the SM lock) to avoid use after free. also returned req 671 * should only be used till SM lock is hold. 672 * 673 * Return: cm req from the req list whose cm id matches the argument 674 */ 675 #define cm_get_req_by_cm_id(cm_ctx, cm_id) \ 676 cm_get_req_by_cm_id_fl(cm_ctx, cm_id, __func__, __LINE__) 677 678 /** 679 * cm_vdev_scan_cancel() - cancel all scans for vdev 680 * @pdev: pdev pointer 681 * @vdev: vdev for which scan to be canceled 682 * 683 * Return: void 684 */ 685 void cm_vdev_scan_cancel(struct wlan_objmgr_pdev *pdev, 686 struct wlan_objmgr_vdev *vdev); 687 688 /** 689 * cm_fill_disconnect_resp_from_cm_id() - Fill disconnect response 690 * @cm_ctx: connection manager context 691 * @cm_id: cm id of connect/disconnect req 692 * @resp: Disconnect response which needs to filled 693 * 694 * This function is called to fill disconnect response from cm id 695 * 696 * Context: Any Context. 697 * 698 * Return: Success if disconnect 699 */ 700 QDF_STATUS 701 cm_fill_disconnect_resp_from_cm_id(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id, 702 struct wlan_cm_discon_rsp *resp); 703 704 /** 705 * cm_inform_bcn_probe() - update scan db with beacon or probe resp 706 * @cm_ctx: connection manager context 707 * @bcn_probe: beacon or probe resp received during connect 708 * @len: beacon or probe resp length 709 * @rssi: rssi of the beacon or probe resp 710 * @cm_id: cm id of connect/disconnect req 711 * 712 * update scan db, so that kernel and driver do not age out 713 * the connected AP entry. 714 * 715 * Context: Any Context. 716 * 717 * Return: void 718 */ 719 void cm_inform_bcn_probe(struct cnx_mgr *cm_ctx, uint8_t *bcn_probe, 720 uint32_t len, qdf_freq_t freq, int32_t rssi, 721 wlan_cm_id cm_id); 722 723 /** 724 * cm_set_max_connect_attempts() - Set max connect attempts 725 * @vdev: vdev pointer 726 * @max_connect_attempts: max connect attempts to be set. 727 * 728 * Set max connect attempts. Max value is limited to CM_MAX_CONNECT_ATTEMPTS. 729 * 730 * Return: void 731 */ 732 void cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev, 733 uint8_t max_connect_attempts); 734 735 /** 736 * cm_is_vdev_connecting() - check if vdev is in conneting state 737 * @vdev: vdev pointer 738 * 739 * Return: bool 740 */ 741 bool cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev); 742 743 /** 744 * cm_is_vdev_connected() - check if vdev is in conneted state 745 * @vdev: vdev pointer 746 * 747 * Return: bool 748 */ 749 bool cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev); 750 751 /** 752 * cm_is_vdev_disconnecting() - check if vdev is in disconneting state 753 * @vdev: vdev pointer 754 * 755 * Return: bool 756 */ 757 bool cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev); 758 759 /** 760 * cm_is_vdev_disconnected() - check if vdev is disconnected/init state 761 * @vdev: vdev pointer 762 * 763 * Return: bool 764 */ 765 bool cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev); 766 767 /** 768 * cm_is_vdev_roaming() - check if vdev is in roaming state 769 * @vdev: vdev pointer 770 * 771 * Return: bool 772 */ 773 bool cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev); 774 775 /* 776 * cm_connect_handle_event_post_fail() - initiate connect failure if msg posting 777 * to SM fails 778 * @cm_ctx: connection manager context 779 * @cm_id: cm_id for connect req for which post fails 780 * 781 * Context: Can be called from any context and to be used only after posting a 782 * msg to SM fails from external event e.g. peer create resp, 783 * HW mode change resp serialization cb. 784 * 785 * Return: QDF_STATUS 786 */ 787 void 788 cm_connect_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id); 789 790 /** 791 * cm_get_req_by_scan_id() - Get cm req matching the scan id 792 * @cm_ctx: connection manager context 793 * @scan_id: scan id of scan req 794 * 795 * Context: Can be called from any context and to be used only after posting a 796 * msg to SM (ie holding the SM lock) to avoid use after free. also returned req 797 * should only be used till SM lock is hold. 798 * 799 * Return: cm req from the req list whose scan id matches the argument 800 */ 801 struct cm_req *cm_get_req_by_scan_id(struct cnx_mgr *cm_ctx, 802 wlan_scan_id scan_id); 803 804 /** 805 * cm_get_cm_id_by_scan_id() - Get cm id by matching the scan id 806 * @cm_ctx: connection manager context 807 * @scan_id: scan id of scan req 808 * 809 * Context: Can be called from any context and used to get cm_id 810 * from scan id when SM lock is not held 811 * 812 * Return: cm id from the req list whose scan id matches the argument 813 */ 814 wlan_cm_id cm_get_cm_id_by_scan_id(struct cnx_mgr *cm_ctx, 815 wlan_scan_id scan_id); 816 817 #endif /* __WLAN_CM_MAIN_API_H__ */ 818