xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/connection_mgr/core/src/wlan_cm_roam.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
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