xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 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: wlan_cm_api.h
19  *
20  * This file maintains declarations of public apis
21  */
22 
23 #ifndef __WLAN_CM_API_H
24 #define __WLAN_CM_API_H
25 
26 #include "wlan_cm_public_struct.h"
27 #include "wlan_ext_mlme_obj_types.h"
28 
29 /**
30  * wlan_cm_start_connect() - connect start request
31  * @vdev: vdev pointer
32  * @req: connect req
33  *
34  * Return: QDF_STATUS
35  */
36 QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev,
37 				 struct wlan_cm_connect_req *req);
38 
39 /**
40  * wlan_cm_disconnect() - disconnect start request
41  * @vdev: vdev pointer
42  * @source: disconnect source
43  * @reason_code: disconnect reason
44  * @bssid: bssid of AP to disconnect, can be null if not known
45  *
46  * Context: can be called from any context
47  *
48  * Return: QDF_STATUS
49  */
50 QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev,
51 			      enum wlan_cm_source source,
52 			      enum wlan_reason_code reason_code,
53 			      struct qdf_mac_addr *bssid);
54 
55 /**
56  * wlan_cm_disconnect_sync() - disconnect request with wait till
57  * completed
58  * @vdev: vdev pointer
59  * @source: disconnect source
60  * @reason_code: disconnect reason
61  *
62  * Context: Only call for north bound disconnect req, if wait till complete
63  * is required, e.g. during vdev delete. Do not call from scheduler context.
64  *
65  * Return: QDF_STATUS
66  */
67 QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
68 				   enum wlan_cm_source source,
69 				   enum wlan_reason_code reason_code);
70 
71 /**
72  * wlan_cm_bss_select_ind_rsp() - Connection manager resp for bss
73  * select indication
74  * @vdev: vdev pointer
75  * @status: Status
76  *
77  * Return: QDF_STATUS
78  */
79 QDF_STATUS wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev,
80 				      QDF_STATUS status);
81 
82 /**
83  * wlan_cm_bss_peer_create_rsp() - Connection manager bss peer create response
84  * @vdev: vdev pointer
85  * @status: Status
86  * @peer_mac: Peer mac address
87  *
88  * Return: QDF_STATUS
89  */
90 QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
91 				       QDF_STATUS status,
92 				       struct qdf_mac_addr *peer_mac);
93 
94 /**
95  * wlan_cm_connect_rsp() - Connection manager connect response
96  * @vdev: vdev pointer
97  * @resp: Connect response
98  *
99  * Return: QDF_STATUS
100  */
101 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
102 			       struct wlan_cm_connect_resp *resp);
103 
104 /**
105  * wlan_cm_bss_peer_delete_ind() - Connection manager peer delete indication
106  * @vdev: vdev pointer
107  * @peer_mac: Peer mac address
108  *
109  * Return: QDF_STATUS
110  */
111 QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev,
112 				       struct qdf_mac_addr *peer_mac);
113 
114 /**
115  * wlan_cm_bss_peer_delete_rsp() - Connection manager peer delete response
116  * @vdev: vdev pointer
117  * @status: status
118  *
119  * Return: QDF_STATUS
120  */
121 QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev,
122 				       uint32_t status);
123 
124 /**
125  * wlan_cm_disconnect_rsp() - Connection manager disconnect response
126  * @vdev: vdev pointer
127  * @resp: disconnect response
128  *
129  * Return: QDF_STATUS
130  */
131 QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
132 				  struct wlan_cm_discon_rsp *resp);
133 
134 /**
135  * wlan_cm_set_max_connect_attempts() - Set max connect attempts
136  * @vdev: vdev pointer
137  * @max_connect_attempts: max connect attempts to be set.
138  *
139  * Set max connect attempts. Max value is limited to CM_MAX_CONNECT_ATTEMPTS.
140  *
141  * Return: void
142  */
143 void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev,
144 				      uint8_t max_connect_attempts);
145 
146 /**
147  * wlan_cm_set_max_connect_timeout() - Set max connect timeout
148  * @vdev: vdev pointer
149  * @max_connect_timeout: max connect timeout to be set.
150  *
151  * Set max connect timeout.
152  *
153  * Return: void
154  */
155 void wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev,
156 				     uint32_t max_connect_timeout);
157 
158 /**
159  * wlan_cm_is_vdev_connecting() - check if vdev is in conneting state
160  * @vdev: vdev pointer
161  *
162  * Return: bool
163  */
164 bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev);
165 
166 /**
167  * wlan_cm_is_vdev_connected() - check if vdev is in conneted state
168  * @vdev: vdev pointer
169  *
170  * Return: bool
171  */
172 bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev);
173 
174 /**
175  * wlan_cm_is_vdev_active() - check if vdev is in active state ie conneted or
176  * roaming state
177  * @vdev: vdev pointer
178  *
179  * Return: bool
180  */
181 bool wlan_cm_is_vdev_active(struct wlan_objmgr_vdev *vdev);
182 
183 /**
184  * wlan_cm_is_vdev_disconnecting() - check if vdev is in disconneting state
185  * @vdev: vdev pointer
186  *
187  * Return: bool
188  */
189 bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev);
190 
191 /**
192  * wlan_cm_is_vdev_disconnected() - check if vdev is disconnected/init state
193  * @vdev: vdev pointer
194  *
195  * Return: bool
196  */
197 bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev);
198 
199 /**
200  * wlan_cm_is_vdev_roaming() - check if vdev is in roaming state
201  * @vdev: vdev pointer
202  *
203  * Return: bool
204  */
205 bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev);
206 
207 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
208 /**
209  * wlan_cm_is_vdev_roam_started() - check if vdev is in roaming state and
210  * roam started sub stated
211  * @vdev: vdev pointer
212  *
213  * Return: bool
214  */
215 bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev);
216 
217 /**
218  * wlan_cm_is_vdev_roam_sync_inprogress() - check if vdev is in roaming state
219  * and roam sync substate
220  * @vdev: vdev pointer
221  *
222  * Return: bool
223  */
224 bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev);
225 #else
226 static inline bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev)
227 {
228 	return false;
229 }
230 
231 static inline
232 bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev)
233 {
234 	return false;
235 }
236 #endif
237 
238 #ifdef WLAN_FEATURE_HOST_ROAM
239 /**
240  * wlan_cm_is_vdev_roam_preauth_state() - check if vdev is in roaming state and
241  * preauth is in progress
242  * @vdev: vdev pointer
243  *
244  * Return: bool
245  */
246 bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev);
247 
248 /**
249  * wlan_cm_is_vdev_roam_reassoc_state() - check if vdev is in roaming state
250  * and reassoc is in progress
251  * @vdev: vdev pointer
252  *
253  * Return: bool
254  */
255 bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev);
256 #else
257 static inline
258 bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev)
259 {
260 	return false;
261 }
262 
263 static inline
264 bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev)
265 {
266 	return false;
267 }
268 #endif
269 
270 /**
271  * wlan_cm_get_active_connect_req() - Get copy of active connect request
272  * @vdev: vdev pointer
273  * @req: pointer to the copy of the active connect request
274  * *
275  * Context: Should be called only in the conext of the
276  * cm request activation
277  *
278  * Return: true and connect req if any request is active
279  */
280 bool wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev,
281 				    struct wlan_cm_vdev_connect_req *req);
282 
283 #ifdef WLAN_FEATURE_HOST_ROAM
284 /**
285  * wlan_cm_get_active_reassoc_req() - Get copy of active reassoc request
286  * @vdev: vdev pointer
287  * @req: pointer to the copy of the active reassoc request
288  * *
289  * Context: Should be called only in the conext of the
290  * cm request activation
291  *
292  * Return: true and reassoc req if any request is active
293  */
294 bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev,
295 				    struct wlan_cm_vdev_reassoc_req *req);
296 #else
297 static inline
298 bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev,
299 				    struct wlan_cm_vdev_reassoc_req *req)
300 {
301 	return false;
302 }
303 #endif
304 
305 /**
306  * wlan_cm_get_active_disconnect_req() - Get copy of active disconnect request
307  * @vdev: vdev pointer
308  * @req: pointer to the copy of the active disconnect request
309  * *
310  * Context: Should be called only in the conext of the
311  * cm request activation
312  *
313  * Return: true and disconnect req if any request is active
314  */
315 bool wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev,
316 				       struct wlan_cm_vdev_discon_req *req);
317 
318 /**
319  * wlan_cm_reason_code_to_str() - return string conversion of reason code
320  * @reason: reason code.
321  *
322  * This utility function helps log string conversion of reason code.
323  *
324  * Return: string conversion of reason code, if match found;
325  *         "Unknown" otherwise.
326  */
327 const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason);
328 
329 /**
330  * wlan_cm_get_active_req_type() - return cm  active request type
331  * @vdev: vdev pointer
332  *
333  * This function returns the cm active request type
334  *
335  * Return: active request type if any, otherwise return 0
336  */
337 enum wlan_cm_active_request_type
338 wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev);
339 
340 /**
341  * wlan_cm_get_ext_hdl() - Get connection manager ext context from vdev
342  * @vdev: vdev pointer
343  *
344  * Return: pointer to connection manager ext context
345  */
346 cm_ext_t *wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev *vdev);
347 
348 #ifdef WLAN_FEATURE_HOST_ROAM
349 /**
350  * wlan_cm_reassoc_rsp() - Connection manager reassoc response
351  * @vdev: vdev pointer
352  * @resp: Connect response
353  *
354  * Return: QDF_STATUS
355  */
356 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
357 			       struct wlan_cm_connect_resp *resp);
358 #else
359 static inline
360 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
361 			       struct wlan_cm_connect_resp *resp)
362 {
363 	return QDF_STATUS_SUCCESS;
364 }
365 #endif
366 
367 /**
368  * wlan_cm_hw_mode_change_resp() - HW mode change response
369  * @pdev: pdev pointer
370  * @vdev_id: vdev id
371  * @cm_id: connection ID which gave the hw mode change request
372  * @status: status of the HW mode change.
373  *
374  * Return: void
375  */
376 #ifdef WLAN_POLICY_MGR_ENABLE
377 void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
378 				 wlan_cm_id cm_id, QDF_STATUS status);
379 #endif /* ifdef POLICY_MGR_ENABLE */
380 
381 #ifdef SM_ENG_HIST_ENABLE
382 /**
383  * wlan_cm_sm_history_print() - Prints SM history
384  * @vdev: Objmgr vdev
385  *
386  * API to print CM SM history
387  *
388  * Return: void
389  */
390 void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev);
391 
392 /**
393  * wlan_cm_req_history_print() - Prints CM request history
394  * @vdev: Objmgr vdev
395  *
396  * API to print CM request history
397  *
398  * Return: void
399  */
400 void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev);
401 #else
402 static inline void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev)
403 {
404 }
405 
406 static inline void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev)
407 {}
408 #endif
409 
410 #ifdef CONN_MGR_ADV_FEATURE
411 /**
412  * wlan_cm_set_candidate_advance_filter_cb() - Set CM candidate advance
413  * filter cb
414  * @vdev: Objmgr vdev
415  * @filter_fun: CM candidate advance filter cb
416  *
417  * Return: void
418  */
419 static inline
420 void wlan_cm_set_candidate_advance_filter_cb(
421 		struct wlan_objmgr_vdev *vdev,
422 		void (*filter_fun)(struct wlan_objmgr_vdev *vdev,
423 				   struct scan_filter *filter))
424 {
425 }
426 
427 /**
428  * wlan_cm_set_candidate_custom_sort_cb() - Set CM candidate custom sort cb
429  * @vdev: Objmgr vdev
430  * @sort_fun: CM candidate custom sort cb
431  *
432  * Return: void
433  */
434 static inline
435 void wlan_cm_set_candidate_custom_sort_cb(
436 		struct wlan_objmgr_vdev *vdev,
437 		void (*sort_fun)(struct wlan_objmgr_vdev *vdev,
438 				 qdf_list_t *list))
439 {
440 }
441 #else
442 void wlan_cm_set_candidate_advance_filter_cb(
443 		struct wlan_objmgr_vdev *vdev,
444 		void (*filter_fun)(struct wlan_objmgr_vdev *vdev,
445 				   struct scan_filter *filter));
446 
447 void wlan_cm_set_candidate_custom_sort_cb(
448 		struct wlan_objmgr_vdev *vdev,
449 		void (*sort_fun)(struct wlan_objmgr_vdev *vdev,
450 				 qdf_list_t *list));
451 #endif
452 
453 /**
454  * wlan_cm_get_rnr() - get rnr
455  * @vdev:vdev
456  * @cm_id: connect mgr id
457  *
458  * Return: rnr pointer
459  */
460 struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev,
461 						wlan_cm_id cm_id);
462 #endif /* __WLAN_CM_UCFG_API_H */
463