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