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