1 /* 2 * Copyright (c) 2011-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: wlan_cm_roam.h 19 * 20 * This header file maintain APIs required for connection mgr roam functions 21 */ 22 23 #ifndef __WLAN_CM_ROAM_H__ 24 #define __WLAN_CM_ROAM_H__ 25 26 #include "wlan_cm_main.h" 27 #include "wlan_cm_sm.h" 28 29 #ifdef WLAN_FEATURE_HOST_ROAM 30 /** 31 * cm_roam_bss_peer_create_rsp() - handle bss peer create response for roam 32 * @vdev: vdev 33 * @status: bss peer create status 34 * @peer_mac: peer mac 35 * 36 * Return: QDF status 37 */ 38 QDF_STATUS cm_roam_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev, 39 QDF_STATUS status, 40 struct qdf_mac_addr *peer_mac); 41 42 /** 43 * cm_reassoc_rsp() - Connection manager reassoc response 44 * @vdev: vdev pointer 45 * @resp: Connect response 46 * 47 * Return: QDF_STATUS 48 */ 49 QDF_STATUS cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev, 50 struct wlan_cm_connect_resp *resp); 51 52 /** 53 * cm_roam_disconnect_rsp() - Connection manager api to post connect event 54 * @vdev: VDEV object 55 * @cm_discon_rsp: Disconnect response 56 * 57 * Context: Any context. 58 * 59 * Return: QDF_STATUS 60 */ 61 QDF_STATUS cm_roam_disconnect_rsp(struct wlan_objmgr_vdev *vdev, 62 struct wlan_cm_discon_rsp *resp); 63 64 /** 65 * cm_reassoc_complete() - This API would be called after reassoc complete 66 * request from the serialization. 67 * @cm_ctx: connection manager context 68 * @resp: connect resp. 69 * 70 * This API would be called after roam completion resp from VDEV mgr 71 * 72 * Return: QDF status 73 */ 74 QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx, 75 struct wlan_cm_connect_resp *resp); 76 77 /** 78 * cm_get_active_reassoc_req() - Get copy of active reassoc request 79 * @vdev: vdev pointer 80 * @req: pointer to the copy of the active reassoc request 81 * * 82 * Context: Should be called only in the conext of the 83 * cm request activation 84 * 85 * Return: true and reassoc req if any request is active 86 */ 87 bool cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev, 88 struct wlan_cm_vdev_reassoc_req *req); 89 /** 90 * cm_host_roam_start_req() - Start host roam request 91 * @cm_ctx: Connection manager context 92 * @cm_req: Struct containing the roam request 93 * 94 * Return: QDF_STATUS_SUCCESS on delivering the event 95 * to connection state machine else error value. 96 */ 97 QDF_STATUS cm_host_roam_start_req(struct cnx_mgr *cm_ctx, 98 struct cm_req *cm_req); 99 100 /** 101 * cm_reassoc_start() - This API will be called to initiate the reassoc 102 * process 103 * @cm_ctx: connection manager context 104 * @req: roam request. 105 * 106 * Return: QDF status 107 */ 108 QDF_STATUS cm_reassoc_start(struct cnx_mgr *cm_ctx, struct cm_roam_req *req); 109 110 #ifdef WLAN_POLICY_MGR_ENABLE 111 /** 112 * cm_reassoc_hw_mode_change_resp() - HW mode change response 113 * @pdev: pdev pointer 114 * @vdev_id: vdev id 115 * @cm_id: reassoc ID which gave the hw mode change request 116 * @status: status of the HW mode change. 117 * 118 * Return: void 119 */ 120 void cm_reassoc_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, 121 uint8_t vdev_id, 122 wlan_cm_id cm_id, QDF_STATUS status); 123 124 /** 125 * cm_handle_reassoc_hw_mode_change() - SM handling of reassoc hw mode change 126 * resp 127 * @cm_ctx: connection manager context 128 * @cm_id: Connection mgr ID assigned to this connect request. 129 * @event: HW mode success or failure event 130 * 131 * Return: QDF_STATUS 132 */ 133 QDF_STATUS 134 cm_handle_reassoc_hw_mode_change(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id, 135 enum wlan_cm_sm_evt event); 136 #else 137 static inline QDF_STATUS 138 cm_handle_reassoc_hw_mode_change(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id, 139 enum wlan_cm_sm_evt event) 140 { 141 return QDF_STATUS_SUCCESS; 142 } 143 #endif 144 145 /** 146 * cm_reassoc_active() - This API would be called after the reassoc 147 * request gets activated in serialization. 148 * @cm_ctx: connection manager context 149 * @cm_id: Connection mgr ID assigned to this reassoc request. 150 * 151 * Return: QDF status 152 */ 153 QDF_STATUS cm_reassoc_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 154 155 /** 156 * cm_reassoc_disconnect_complete() - This API would be called after 157 * disconnect complete due to reassoc request. 158 * @cm_ctx: connection manager context 159 * @resp: disconnection complete resp. 160 * 161 * This API would be called after disconnection completion resp from VDEV mgr 162 * 163 * Return: QDF status 164 */ 165 166 QDF_STATUS cm_reassoc_disconnect_complete(struct cnx_mgr *cm_ctx, 167 struct wlan_cm_discon_rsp *resp); 168 169 /** 170 * cm_resume_reassoc_after_peer_create() - Called after bss create rsp 171 * @cm_ctx: connection manager context 172 * @cm_id: Connection mgr ID assigned to this reassoc request. 173 * 174 * Return: QDF status 175 */ 176 QDF_STATUS 177 cm_resume_reassoc_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 178 179 /** 180 * cm_roam_resp_cmid_match_list_head() - Check if resp cmid is same as list 181 * head 182 * @cm_ctx: connection manager context 183 * @resp: connect resp 184 * 185 * Return: bool 186 */ 187 bool cm_roam_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx, 188 struct wlan_cm_connect_resp *resp); 189 190 /** 191 * cm_send_reassoc_start_fail() - initiate reassoc failure 192 * @cm_ctx: connection manager context 193 * @cm_id: active command id 194 * @reason: failure reason 195 * @sync: Indicate if the event has to be dispatched in sync or async mode 196 * 197 * Return: QDF_STATUS 198 */ 199 QDF_STATUS 200 cm_send_reassoc_start_fail(struct cnx_mgr *cm_ctx, 201 wlan_cm_id cm_id, 202 enum wlan_cm_connect_fail_reason reason, 203 bool sync); 204 205 #ifdef CONN_MGR_ADV_FEATURE 206 /* 207 * cm_update_advance_roam_scan_filter() - fill scan filter for roam 208 * @vdev: vdev 209 * @filter: scan filter 210 * 211 * Return QDF_STATUS 212 */ 213 QDF_STATUS cm_update_advance_roam_scan_filter( 214 struct wlan_objmgr_vdev *vdev, struct scan_filter *filter); 215 #endif 216 217 #ifdef WLAN_FEATURE_PREAUTH_ENABLE 218 /* 219 * cm_host_roam_preauth_start() - start preauth process 220 * @cm_ctx: Connection manager context 221 * @cm_req: Struct containing the roam request 222 * 223 * Return QDF_STATUS 224 */ 225 QDF_STATUS cm_host_roam_preauth_start(struct cnx_mgr *cm_ctx, 226 struct cm_req *cm_req); 227 228 /** 229 * cm_preauth_active() - This API would be called after the preauth 230 * request gets activated in serialization. 231 * @cm_ctx: connection manager context 232 * @cm_id: Connection mgr ID assigned to this preauth request. 233 * 234 * Return: QDF status 235 */ 236 QDF_STATUS cm_preauth_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 237 238 /** 239 * cm_preauth_done_resp() - This API would be called when preauth 240 * response msg handling 241 * @cm_ctx: connection manager context 242 * @cm_id: Connection mgr ID assigned to this preauth request. 243 * 244 * Return: void 245 */ 246 void cm_preauth_done_resp(struct cnx_mgr *cm_ctx, struct wlan_preauth_rsp *rsp); 247 248 /** 249 * cm_preauth_success() - Preauth is successfully completed 250 * @cm_ctx: connection manager context 251 * @rsp: Preauth resp 252 * 253 * Return: void 254 */ 255 void cm_preauth_success(struct cnx_mgr *cm_ctx, struct wlan_preauth_rsp *rsp); 256 257 /** 258 * cm_preauth_fail() - This API would be called after the preauth 259 * request gets failed. 260 * @cm_ctx: connection manager context 261 * @preauth_fail_rsp: preauth fail response 262 * 263 * Return: none 264 */ 265 void cm_preauth_fail(struct cnx_mgr *cm_ctx, 266 struct wlan_cm_preauth_fail *preauth_fail_rsp); 267 268 /** 269 * cm_send_preauth_start_fail() - This API would be called after send preauth 270 * request failed. 271 * @cm_ctx: connection manager context 272 * @cm_id: connection mgr ID assigned to this preauth request. 273 * @reason: connect fail reason 274 * 275 * Return: QDF status 276 */ 277 QDF_STATUS cm_send_preauth_start_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id, 278 enum wlan_cm_connect_fail_reason reason); 279 280 /** 281 * cm_handle_reassoc_timer() - handle ressoc timer expiry 282 * @cm_ctx: connection manager context 283 * @cm_id: connection mgr ID assigned to this preauth request. 284 * 285 * Return: QDF status 286 */ 287 QDF_STATUS cm_handle_reassoc_timer(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); 288 #endif /* WLAN_FEATURE_PREAUTH_ENABLE */ 289 #else /* WLAN_FEATURE_HOST_ROAM */ 290 291 #ifdef WLAN_POLICY_MGR_ENABLE 292 static inline 293 void cm_reassoc_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, 294 uint8_t vdev_id, 295 wlan_cm_id cm_id, QDF_STATUS status) {} 296 #endif 297 298 static inline QDF_STATUS cm_reassoc_complete(struct cnx_mgr *cm_ctx, 299 struct wlan_cm_connect_resp *resp) 300 { 301 return QDF_STATUS_SUCCESS; 302 } 303 304 static inline 305 QDF_STATUS cm_roam_disconnect_rsp(struct wlan_objmgr_vdev *vdev, 306 struct wlan_cm_discon_rsp *resp) 307 { 308 return QDF_STATUS_SUCCESS; 309 } 310 311 static inline 312 QDF_STATUS cm_roam_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev, 313 QDF_STATUS status, 314 struct qdf_mac_addr *peer_mac) 315 { 316 return QDF_STATUS_SUCCESS; 317 } 318 #endif /* WLAN_FEATURE_HOST_ROAM */ 319 320 /** 321 * cm_check_and_prepare_roam_req() - Initiate roam request 322 * @cm_ctx: connection manager context 323 * @connect_req: connection manager request 324 * @roam_req: Roam request 325 * 326 * Context: Can be called only while handling connection manager event 327 * ie holding state machine lock 328 * 329 * Return: QDF_STATUS 330 */ 331 QDF_STATUS 332 cm_check_and_prepare_roam_req(struct cnx_mgr *cm_ctx, 333 struct cm_connect_req *connect_req, 334 struct cm_req **roam_req); 335 /** 336 * cm_free_roam_req_mem() - free croam req internal memory, to be called 337 * before cm_req is freed 338 * @roam_req: roam req 339 * 340 * Return: void 341 */ 342 void cm_free_roam_req_mem(struct cm_roam_req *roam_req); 343 344 /** 345 * cm_add_roam_req_to_list() - add connect req to the connection manager 346 * req list 347 * @vdev: vdev on which connect is received 348 * @cm_req: Roam req provided 349 * 350 * Return: QDF status 351 */ 352 QDF_STATUS cm_add_roam_req_to_list(struct cnx_mgr *cm_ctx, 353 struct cm_req *cm_req); 354 355 /** 356 * cm_fill_bss_info_in_roam_rsp_by_cm_id() - fill bss info for the cm id 357 * @cm_ctx: connection manager context 358 * @cm_id: cm id of connect/disconnect req 359 * @resp: resp to copy bss info like ssid/bssid and freq 360 * 361 * Return: Success if entry was found else failure 362 */ 363 QDF_STATUS 364 cm_fill_bss_info_in_roam_rsp_by_cm_id(struct cnx_mgr *cm_ctx, 365 wlan_cm_id cm_id, 366 struct wlan_cm_connect_resp *resp); 367 368 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 369 /** 370 * cm_fw_roam_start() - Handle roam start event 371 * @cm_ctx: connection mgr context 372 * 373 * This function handles the roam start event received from FW. 374 * 375 * Return: QDF_STATUS 376 */ 377 QDF_STATUS cm_fw_roam_start(struct cnx_mgr *cm_ctx); 378 379 /** 380 * cm_send_roam_invoke_req() - Send Roam invoke req to FW 381 * @cm_ctx: connection manager context 382 * @req: connection manager request 383 * 384 * Return: QDF_STATUS 385 */ 386 QDF_STATUS 387 cm_send_roam_invoke_req(struct cnx_mgr *cm_ctx, struct cm_req *req); 388 389 /** 390 * cm_roam_offload_enabled() - check if roam offload(LFR3) is enabled 391 * @psoc: psoc pointer to get the INI 392 * 393 * Return: bool 394 */ 395 bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc); 396 397 /** 398 * cm_get_first_roam_command() - Get first roam request from list 399 * @vdev: vdev pointer 400 * 401 * Context: Can be called from any context and to be used only after posting a 402 * msg to SM (ie holding the SM lock) to avoid use after free. also returned req 403 * should only be used till SM lock is hold. 404 * 405 * Return: cm roam req from the req list 406 */ 407 struct cm_roam_req *cm_get_first_roam_command(struct wlan_objmgr_vdev *vdev); 408 409 /** 410 * cm_prepare_roam_cmd() - Prepare roam req 411 * @cm_ctx: connection mgr context 412 * @cm_req: connection mgr req 413 * @source: connection mgr req source 414 * 415 * This function prepares roam request when roam start ind is received 416 * when CM SM is in connected state. 417 * 418 * Return: QDF_STATUS 419 */ 420 QDF_STATUS cm_prepare_roam_cmd(struct cnx_mgr *cm_ctx, 421 struct cm_req **roam_req, 422 enum wlan_cm_source source); 423 424 /** 425 * cm_add_fw_roam_cmd_to_list_n_ser() - Add roam req to list and serialize req 426 * @cm_ctx: connection mgr context 427 * @cm_req: connection mgr req 428 * 429 * This function adds roam request to list and the serialization queue. 430 * 431 * Return: QDF_STATUS 432 */ 433 QDF_STATUS cm_add_fw_roam_cmd_to_list_n_ser(struct cnx_mgr *cm_ctx, 434 struct cm_req *cm_req); 435 436 /** 437 * cm_fw_send_vdev_roam_event() - CM send VDEV ROAM Event 438 * @cm_ctx: connection mgr context 439 * @data_len: data size 440 * @data: event data 441 * 442 * This function sends ROAM Event to vdev manager 443 * state machine 444 * 445 * Return: QDF_STATUS 446 */ 447 QDF_STATUS 448 cm_fw_send_vdev_roam_event(struct cnx_mgr *cm_ctx, uint16_t data_len, 449 void *data); 450 451 /** 452 * cm_fw_roam_complete() - CM handle roam complete 453 * @cm_ctx: connection mgr context 454 * @data: join rsp data 455 * 456 * This function CM handle roam complete 457 * 458 * Return: QDF_STATUS 459 */ 460 QDF_STATUS 461 cm_fw_roam_complete(struct cnx_mgr *cm_ctx, void *data); 462 463 #else 464 static inline bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc) 465 { 466 return false; 467 } 468 #endif 469 470 #endif /* __WLAN_CM_ROAM_H__ */ 471