1 /*
2  * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2024 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_main_api.h
20  *
21  * This header file maintain connect, disconnect APIs of connection manager
22  */
23 
24 #ifndef __WLAN_CM_MAIN_API_H__
25 #define __WLAN_CM_MAIN_API_H__
26 
27 #include "wlan_cm_main.h"
28 #include "wlan_cm_sm.h"
29 #include <include/wlan_mlme_cmn.h>
30 #include <wlan_crypto_global_api.h>
31 #include <wlan_if_mgr_api.h>
32 #ifdef WLAN_CM_USE_SPINLOCK
33 #include <scheduler_api.h>
34 #endif
35 #include <wlan_cp_stats_chipset_stats.h>
36 
37 #define CONNECT_REQ_PREFIX          0x0C000000
38 #define DISCONNECT_REQ_PREFIX       0x0D000000
39 #define ROAM_REQ_PREFIX             0x0F000000
40 
41 #define CM_ID_MASK                  0x0000FFFF
42 
43 #define CM_ID_GET_PREFIX(cm_id)     cm_id & 0x0F000000
44 #define CM_VDEV_ID_SHIFT            16
45 #define CM_VDEV_ID_MASK             0x00FF0000
46 #define CM_ID_GET_VDEV_ID(cm_id) (cm_id & CM_VDEV_ID_MASK) >> CM_VDEV_ID_SHIFT
47 #define CM_ID_SET_VDEV_ID(cm_id, vdev_id) ((vdev_id << CM_VDEV_ID_SHIFT) & \
48 					   CM_VDEV_ID_MASK) | cm_id
49 
50 #define CM_PREFIX_FMT "vdev %d cm_id 0x%x: "
51 #define CM_PREFIX_REF(vdev_id, cm_id) (vdev_id), (cm_id)
52 
53 /*************** CONNECT APIs ****************/
54 
55 /**
56  * cm_fill_failure_resp_from_cm_id() - This API will fill failure connect
57  * response
58  * @cm_ctx: connection manager context
59  * @resp: connect failure resp
60  * @cm_id: cm_id for connect response to be filled.
61  * @reason: connect failure reason
62  *
63  * This function will fill connect failure response structure with the provided
64  * reason with the help of given cm id.
65  *
66  * Return: void
67  */
68 void cm_fill_failure_resp_from_cm_id(struct cnx_mgr *cm_ctx,
69 				     struct wlan_cm_connect_resp *resp,
70 				     wlan_cm_id cm_id,
71 				     enum wlan_cm_connect_fail_reason reason);
72 
73 /**
74  * cm_connect_start() - This API will be called to initiate the connect
75  * process
76  * @cm_ctx: connection manager context
77  * @req: Connect request.
78  *
79  * Return: QDF status
80  */
81 QDF_STATUS cm_connect_start(struct cnx_mgr *cm_ctx, struct cm_connect_req *req);
82 
83 /**
84  * cm_if_mgr_inform_connect_complete() - inform ifmanager the connect complete
85  * @vdev: vdev for which connect cmpleted
86  * @connect_status: connect status
87  *
88  * Return: QDF_STATUS
89  */
90 QDF_STATUS cm_if_mgr_inform_connect_complete(struct wlan_objmgr_vdev *vdev,
91 					     QDF_STATUS connect_status);
92 
93 /**
94  * cm_handle_connect_req_in_non_init_state() - Handle connect request in non
95  * init state.
96  * @cm_ctx: connection manager context
97  * @cm_req: cm request
98  * @cm_state_substate: state of CM SM
99  *
100  * Context: Can be called only while handling connection manager event
101  *          ie holding state machine lock
102  *
103  * Return: QDF_STATUS
104  */
105 QDF_STATUS
106 cm_handle_connect_req_in_non_init_state(struct cnx_mgr *cm_ctx,
107 					struct cm_connect_req *cm_req,
108 					enum wlan_cm_sm_state cm_state_substate);
109 
110 /**
111  * cm_handle_discon_req_in_non_connected_state() - Handle disconnect req in non
112  * connected state.
113  * @cm_ctx: connection manager context
114  * @cm_req: cm request
115  * @cm_state_substate: state of CM SM
116  *
117  * Context: Can be called only while handling connection manager event
118  *          ie holding state machine lock
119  *
120  * Return: QDF_STATUS
121  */
122 QDF_STATUS
123 cm_handle_discon_req_in_non_connected_state(struct cnx_mgr *cm_ctx,
124 					struct cm_disconnect_req *cm_req,
125 					enum wlan_cm_sm_state cm_state_substate);
126 
127 /**
128  * cm_connect_scan_start() - This API will be called to initiate the connect
129  * scan if no candidate are found in scan db.
130  * @cm_ctx: connection manager context
131  * @req: Connect request.
132  *
133  * Return: QDF status
134  */
135 QDF_STATUS cm_connect_scan_start(struct cnx_mgr *cm_ctx,
136 				 struct cm_connect_req *req);
137 
138 /**
139  * cm_connect_scan_resp() - Handle the connect scan resp and next action
140  * scan if no candidate are found in scan db.
141  * @cm_ctx: connection manager context
142  * @scan_id: scan id of the req
143  * @status: Connect scan status
144  *
145  * Return: QDF status
146  */
147 QDF_STATUS cm_connect_scan_resp(struct cnx_mgr *cm_ctx, wlan_scan_id *scan_id,
148 				QDF_STATUS status);
149 
150 /**
151  * cm_connect_handle_event_post_fail() - initiate connect failure if msg posting
152  * to SM fails
153  * @cm_ctx: connection manager context
154  * @cm_id: cm_id for connect req for which post fails
155  *
156  * Context: Can be called from any context and to be used only after posting a
157  * msg to SM fails from external event e.g. peer create resp,
158  * HW mode change resp  serialization cb.
159  *
160  * Return: QDF_STATUS
161  */
162 void
163 cm_connect_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
164 
165 /**
166  * wlan_cm_scan_cb() - Callback function for scan for ssid
167  * @vdev: VDEV MLME comp object
168  * @event: scan event definition
169  * @arg: reference to connection manager context
170  *
171  * API handles scan success/failure case
172  *
173  * Context: Can be called from any context.
174  * Return: None
175  */
176 void wlan_cm_scan_cb(struct wlan_objmgr_vdev *vdev,
177 		     struct scan_event *event, void *arg);
178 
179 /**
180  * cm_connect_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_connect_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx,
188 					  struct wlan_cm_connect_resp *resp);
189 
190 /**
191  * cm_connect_active() - This API would be called after the connect
192  * request gets activated in serialization.
193  * @cm_ctx: connection manager context
194  * @cm_id: Connection mgr ID assigned to this connect request.
195  *
196  * Return: QDF status
197  */
198 QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
199 
200 /**
201  * cm_try_next_candidate() - This API would try to connect to next valid
202  * candidate and fail if no candidate left
203  * request gets activated in serialization.
204  * @cm_ctx: connection manager context
205  * @connect_resp: connect resp.
206  *
207  * Return: QDF status
208  */
209 QDF_STATUS cm_try_next_candidate(struct cnx_mgr *cm_ctx,
210 				 struct wlan_cm_connect_resp *connect_resp);
211 
212 /**
213  * cm_resume_connect_after_peer_create() - Called after bss create rsp
214  * @cm_ctx: connection manager context
215  * @cm_id: Connection mgr ID assigned to this connect request.
216  *
217  * Return: QDF status
218  */
219 QDF_STATUS
220 cm_resume_connect_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
221 
222 #if defined(CONN_MGR_ADV_FEATURE) && defined(WLAN_FEATURE_11BE_MLO)
223 /**
224  * cm_bss_peer_create_resp_mlo_attach() - Create MLO peer and attach objmgr peer
225  * @vdev: VDEV object manager pointer
226  * @peer_mac: MAC addr pointer for BSS peer created
227  *
228  * Creates MLO peer for the peer with @peer_mac and adds the objmgr peer to
229  * the created MLO peer context and holds reference for the MLO peer.
230  *
231  * Return: QDF_STATUS
232  */
233 QDF_STATUS cm_bss_peer_create_resp_mlo_attach(struct wlan_objmgr_vdev *vdev,
234 					      struct qdf_mac_addr *peer_mac);
235 #else
236 static inline QDF_STATUS
cm_bss_peer_create_resp_mlo_attach(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * peer_mac)237 cm_bss_peer_create_resp_mlo_attach(struct wlan_objmgr_vdev *vdev,
238 				   struct qdf_mac_addr *peer_mac)
239 {
240 	return QDF_STATUS_SUCCESS;
241 }
242 #endif
243 
244 /**
245  * cm_bss_peer_create_rsp() - handle bss peer create response
246  * @vdev: vdev
247  * @status: bss peer create status
248  * @peer_mac: peer mac
249  *
250  * Return: QDF status
251  */
252 QDF_STATUS cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
253 				  QDF_STATUS status,
254 				  struct qdf_mac_addr *peer_mac);
255 
256 /**
257  * cm_connect_rsp() - Connection manager connect response
258  * @vdev: vdev pointer
259  * @resp: Connect response
260  *
261  * Return: QDF_STATUS
262  */
263 QDF_STATUS cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
264 			  struct wlan_cm_connect_resp *resp);
265 
266 /**
267  * cm_notify_connect_complete() - This API would be called for sending
268  * connect response notification
269  * @cm_ctx: connection manager context
270  * @resp: connection complete resp.
271  * @acquire_lock: Flag to indicate whether this function needs
272  * cm_ctx lock or not.
273  *
274  * This API would be called after connection completion resp from VDEV mgr
275  *
276  * Return: QDF status
277  */
278 QDF_STATUS cm_notify_connect_complete(struct cnx_mgr *cm_ctx,
279 				      struct wlan_cm_connect_resp *resp,
280 				      bool acquire_lock);
281 
282 /**
283  * cm_update_scan_mlme_info() - This API would be called after connect complete
284  * request or roam synch completion.
285  * @cm_ctx: connection manager context
286  * @resp: Connection complete resp.
287  *
288  * This API would be called after connection completion resp or roam synch
289  * propagation completion. This will update the assoc state in the scan
290  * entries
291  *
292  * Return: QDF status
293  */
294 void cm_update_scan_mlme_info(struct cnx_mgr *cm_ctx,
295 			      struct wlan_cm_connect_resp *resp);
296 
297 /**
298  * cm_update_scan_mlme_info() - This API would be called after connect complete
299  * request or roam synch completion.
300  * @cm_ctx: connection manager context
301  * @resp: Connection complete resp.
302  *
303  * This API would be called after connection completion resp or roam synch
304  * propagation completion. This will update the assoc state in the scan
305  * entries
306  *
307  * Return: QDF status
308  */
309 void cm_update_scan_mlme_info(struct cnx_mgr *cm_ctx,
310 			      struct wlan_cm_connect_resp *resp);
311 
312 /**
313  * cm_connect_complete() - This API would be called after connect complete
314  * request from the serialization.
315  * @cm_ctx: connection manager context
316  * @resp: Connection complete resp.
317  *
318  * This API would be called after connection completion resp from VDEV mgr
319  *
320  * Return: QDF status
321  */
322 QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx,
323 			       struct wlan_cm_connect_resp *resp);
324 
325 /**
326  * cm_add_connect_req_to_list() - add connect req to the connection manager
327  * req list
328  * @cm_ctx: connection manager context
329  * @req: Connection req provided
330  *
331  * Return: QDF status
332  */
333 QDF_STATUS cm_add_connect_req_to_list(struct cnx_mgr *cm_ctx,
334 				      struct cm_connect_req *req);
335 
336 /**
337  * cm_connect_start_req() - Connect start req from the requester
338  * @vdev: vdev on which connect is received
339  * @req: Connection req provided
340  *
341  * Return: QDF status
342  */
343 QDF_STATUS cm_connect_start_req(struct wlan_objmgr_vdev *vdev,
344 				struct wlan_cm_connect_req *req);
345 
346 /**
347  * cm_send_connect_start_fail() - initiate connect failure
348  * @cm_ctx: connection manager context
349  * @req: connect req for which connect failed
350  * @reason: failure reason
351  *
352  * Context: Can be called from any context and to be used only after posting a
353  * msg to SM (ie holding the SM lock) to avoid use after free for req.
354  *
355  * Return: QDF_STATUS
356  */
357 QDF_STATUS
358 cm_send_connect_start_fail(struct cnx_mgr *cm_ctx,
359 			   struct cm_connect_req *req,
360 			   enum wlan_cm_connect_fail_reason reason);
361 
362 /**
363  * cm_find_bss_from_candidate_list() - get bss entry by bssid value
364  * @candidate_list: candidate list
365  * @bssid: bssid to find
366  * @entry_found: found bss entry
367  *
368  * Return: true if find bss entry with bssid
369  */
370 bool cm_find_bss_from_candidate_list(qdf_list_t *candidate_list,
371 				     struct qdf_mac_addr *bssid,
372 				     struct scan_cache_node **entry_found);
373 
374 #ifdef WLAN_POLICY_MGR_ENABLE
375 /**
376  * cm_hw_mode_change_resp() - HW mode change response
377  * @pdev: pdev pointer
378  * @vdev_id: vdev id
379  * @cm_id: connection ID which gave the hw mode change request
380  * @status: status of the HW mode change.
381  *
382  * Return: void
383  */
384 void cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
385 			    wlan_cm_id cm_id, QDF_STATUS status);
386 
387 /**
388  * cm_ser_connect_after_mode_change_resp() - SM handling of
389  * hw mode change/bearer switch resp
390  * @cm_ctx: connection manager context
391  * @cm_id: Connection mgr ID assigned to this connect request.
392  * @event: success or failure event
393  *
394  * Return: QDF_STATUS
395  */
396 QDF_STATUS cm_ser_connect_after_mode_change_resp(struct cnx_mgr *cm_ctx,
397 						wlan_cm_id *cm_id,
398 						enum wlan_cm_sm_evt event);
399 #else
400 static inline
cm_ser_connect_after_mode_change_resp(struct cnx_mgr * cm_ctx,wlan_cm_id * cm_id,enum wlan_cm_sm_evt event)401 QDF_STATUS cm_ser_connect_after_mode_change_resp(struct cnx_mgr *cm_ctx,
402 						wlan_cm_id *cm_id,
403 						enum wlan_cm_sm_evt event)
404 {
405 	return QDF_STATUS_SUCCESS;
406 }
407 #endif
408 
409 /*************** DISCONNECT APIs ****************/
410 
411 /**
412  * cm_disconnect_start() - Initiate the disconnect process
413  * @cm_ctx: connection manager context
414  * @req: Disconnect request.
415  *
416  * Return: QDF status
417  */
418 QDF_STATUS cm_disconnect_start(struct cnx_mgr *cm_ctx,
419 			       struct cm_disconnect_req *req);
420 
421 /**
422  * cm_disconnect_active() - This API would be called after the disconnect
423  * request gets activated in serialization.
424  * @cm_ctx: connection manager context
425  * @cm_id: Connection mgr ID assigned to this connect request.
426  *
427  * Return: QDF status
428  */
429 QDF_STATUS cm_disconnect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
430 
431 /**
432  * cm_notify_disconnect_complete() - This API would be called for sending
433  * disconnect response notification
434  * @cm_ctx: connection manager context
435  * @resp: disconnection complete resp.
436  *
437  * This API would be called after disconnect completion resp from VDEV mgr
438  *
439  * Return: QDF status
440  */
441 QDF_STATUS cm_notify_disconnect_complete(struct cnx_mgr *cm_ctx,
442 					 struct wlan_cm_discon_rsp *resp);
443 /**
444  * cm_disconnect_complete() - This API would be called after disconnect complete
445  * request from the serialization.
446  * @cm_ctx: connection manager context
447  * @resp: disconnection complete resp.
448  *
449  * This API would be called after connection completion resp from VDEV mgr
450  *
451  * Return: QDF status
452  */
453 QDF_STATUS cm_disconnect_complete(struct cnx_mgr *cm_ctx,
454 				  struct wlan_cm_discon_rsp *resp);
455 
456 /**
457  * cm_add_disconnect_req_to_list() - add disconnect req to the connection
458  * manager req list
459  * @cm_ctx: connection manager context
460  * @req: Disconnection req provided
461  *
462  * Return: QDF status
463  */
464 QDF_STATUS cm_add_disconnect_req_to_list(struct cnx_mgr *cm_ctx,
465 					 struct cm_disconnect_req *req);
466 
467 /**
468  * cm_disconnect_start_req() - Disconnect start req from the requester
469  * @vdev: vdev on which connect is received
470  * @req: disconnection req provided
471  *
472  * Return: QDF status
473  */
474 QDF_STATUS cm_disconnect_start_req(struct wlan_objmgr_vdev *vdev,
475 				   struct wlan_cm_disconnect_req *req);
476 
477 /**
478  * cm_disconnect_start_req_sync() - disconnect request with wait till
479  * completed
480  * @vdev: vdev pointer
481  * @req: disconnect req
482  *
483  * Context: Only call for north bound disconnect req, if wait till complete
484  * is required, e.g. during vdev delete. Do not call from scheduler context.
485  *
486  * Return: QDF_STATUS
487  */
488 QDF_STATUS cm_disconnect_start_req_sync(struct wlan_objmgr_vdev *vdev,
489 					struct wlan_cm_disconnect_req *req);
490 
491 /**
492  * cm_bss_peer_delete_req() - Connection manager bss peer delete
493  * request
494  * @vdev: VDEV object
495  * @peer_mac: Peer mac address
496  *
497  * This function is called on peer delete indication and sends peer delete
498  * request to mlme.
499  *
500  * Context: Any context.
501  *
502  * Return: QDF_STATUS
503  */
504 QDF_STATUS cm_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev,
505 				  struct qdf_mac_addr *peer_mac);
506 
507 /**
508  * cm_vdev_down_req() - Connection manager req to send vdev down to FW
509  * @vdev: VDEV object
510  * @status: status
511  *
512  * This function is called when peer delete response is received, to send
513  * vdev down request to mlme
514  *
515  * Context: Any context.
516  *
517  * Return: QDF_STATUS
518  */
519 QDF_STATUS cm_vdev_down_req(struct wlan_objmgr_vdev *vdev, uint32_t status);
520 
521 /**
522  * cm_disconnect_rsp() - Connection manager api to post connect event
523  * @vdev: VDEV object
524  * @resp: Disconnect response
525  *
526  * This function is called when disconnect response is received, to deliver
527  * disconnect event to SM
528  *
529  * Context: Any context.
530  *
531  * Return: QDF_STATUS
532  */
533 QDF_STATUS cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
534 			     struct wlan_cm_discon_rsp *resp);
535 
536 /**
537  * cm_initiate_internal_disconnect() - Initiate internal disconnect to cleanup
538  * a active connect in case of back to back request
539  * @cm_ctx: connection manager context
540  *
541  * Context: Can be called from any context. Hold the SM lock while calling this
542  * api.
543  *
544  * Return: void
545  */
546 void cm_initiate_internal_disconnect(struct cnx_mgr *cm_ctx);
547 
548 /**
549  * cm_send_disconnect_resp() - Initiate disconnect resp for the cm_id
550  * @cm_ctx: connection manager context
551  * @cm_id: cm id to send disconnect resp for
552  *
553  * Context: Can be called from any context. Hold the SM lock while calling this
554  * api.
555  *
556  * Return: void
557  */
558 void cm_send_disconnect_resp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
559 
560 /**
561  * cm_disconnect_continue_after_rso_stop() - Continue disconnect after RSO stop
562  * @vdev: Objmgr vdev
563  * @req: pointer to cm vdev disconnect req
564  *
565  * Return: QDF_STATUS
566  */
567 QDF_STATUS
568 cm_disconnect_continue_after_rso_stop(struct wlan_objmgr_vdev *vdev,
569 				      struct wlan_cm_vdev_discon_req *req);
570 
571 /**
572  * cm_handle_rso_stop_rsp() - Handle RSO stop response
573  * @vdev: Objmgr vdev
574  * @req: pointer to cm vdev disconnect req
575  *
576  * Return: QDF_STATUS
577  */
578 QDF_STATUS
579 cm_handle_rso_stop_rsp(struct wlan_objmgr_vdev *vdev,
580 		       struct wlan_cm_vdev_discon_req *req);
581 
582 /*************** UTIL APIs ****************/
583 
584 /**
585  * cm_ser_get_blocking_cmd() - check if serialization command needs to be
586  * blocking
587  *
588  * Return: bool
589  */
590 #ifdef CONN_MGR_ADV_FEATURE
cm_ser_get_blocking_cmd(void)591 static inline bool cm_ser_get_blocking_cmd(void)
592 {
593 	return true;
594 }
595 #else
cm_ser_get_blocking_cmd(void)596 static inline bool cm_ser_get_blocking_cmd(void)
597 {
598 	return false;
599 }
600 #endif
601 
602 /**
603  * cm_get_cm_id() - Get unique cm id for connect/disconnect request
604  * @cm_ctx: connection manager context
605  * @source: source of the request (can be connect or disconnect request)
606  *
607  * Return: cm id
608  */
609 wlan_cm_id cm_get_cm_id(struct cnx_mgr *cm_ctx, enum wlan_cm_source source);
610 
611 struct cnx_mgr *cm_get_cm_ctx_fl(struct wlan_objmgr_vdev *vdev,
612 				 const char *func, uint32_t line);
613 
614 /**
615  * cm_get_cm_ctx() - Get connection manager context from vdev
616  * @vdev: vdev object pointer
617  *
618  * Return: pointer to connection manager context
619  */
620 #define cm_get_cm_ctx(vdev) \
621 	cm_get_cm_ctx_fl(vdev, __func__, __LINE__)
622 
623 cm_ext_t *cm_get_ext_hdl_fl(struct wlan_objmgr_vdev *vdev,
624 			    const char *func, uint32_t line);
625 
626 /**
627  * cm_get_ext_hdl() - Get connection manager ext context from vdev
628  * @vdev: vdev object pointer
629  *
630  * Return: pointer to connection manager ext context
631  */
632 #define cm_get_ext_hdl(vdev) \
633 	cm_get_ext_hdl_fl(vdev, __func__, __LINE__)
634 
635 /**
636  * cm_reset_active_cm_id() - Reset active cm_id from cm context, if its same as
637  * passed cm_id
638  * @vdev: vdev object pointer
639  * @cm_id: cmid to match
640  *
641  * Return: void
642  */
643 void cm_reset_active_cm_id(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id);
644 
645 #ifdef CRYPTO_SET_KEY_CONVERGED
646 /**
647  * cm_set_key() - set wep or fils key on connection completion
648  * @cm_ctx: connection manager context
649  * @unicast: if key is unicast
650  * @key_idx: Key index
651  * @bssid: bssid of the connected AP
652  *
653  * Return: void
654  */
655 QDF_STATUS cm_set_key(struct cnx_mgr *cm_ctx, bool unicast,
656 		      uint8_t key_idx, struct qdf_mac_addr *bssid);
657 #endif
658 
659 #ifdef CONN_MGR_ADV_FEATURE
660 /**
661  * cm_store_wep_key() - store wep keys in crypto on connect active
662  * @cm_ctx: connection manager context
663  * @crypto: connection crypto info
664  * @cm_id: cm_id of the connection
665  *
666  * Return: void
667  */
668 void cm_store_wep_key(struct cnx_mgr *cm_ctx,
669 		      struct wlan_cm_connect_crypto_info *crypto,
670 		      wlan_cm_id cm_id);
671 
672 /**
673  * cm_inform_dlm_connect_complete() - inform bsl about connect complete
674  * @vdev: vdev
675  * @resp: connect resp
676  *
677  * Return: QDF_STATUS
678  */
679 QDF_STATUS
680 cm_inform_dlm_connect_complete(struct wlan_objmgr_vdev *vdev,
681 			       struct wlan_cm_connect_resp *resp);
682 
683 static inline QDF_STATUS
cm_peer_create_on_bss_select_ind_resp(struct cnx_mgr * cm_ctx,wlan_cm_id * cm_id)684 cm_peer_create_on_bss_select_ind_resp(struct cnx_mgr *cm_ctx,
685 				      wlan_cm_id *cm_id)
686 {
687 	return QDF_STATUS_SUCCESS;
688 }
689 
690 static inline
cm_bss_select_ind_rsp(struct wlan_objmgr_vdev * vdev,QDF_STATUS status)691 QDF_STATUS cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev,
692 				 QDF_STATUS status)
693 {
694 	return QDF_STATUS_SUCCESS;
695 }
696 
697 /**
698  * cm_is_link_switch_connect_req() - API to check if connect request
699  * is for link switch.
700  * @req: Connect request
701  *
702  * Return true if the request for connection is due to link switch or else
703  * return false.
704  *
705  * Return: bool
706  */
cm_is_link_switch_connect_req(struct cm_connect_req * req)707 static inline bool cm_is_link_switch_connect_req(struct cm_connect_req *req)
708 {
709 	return req->req.source == CM_MLO_LINK_SWITCH_CONNECT;
710 }
711 
712 /**
713  * cm_is_link_switch_disconnect_req() - API to check if disconnect request is
714  * for link switch.
715  * @req: Disconnect request.
716  *
717  * Return true if the request for disconnection is due to link switch or else
718  * return false.
719  *
720  * Return: bool
721  */
722 static inline bool
cm_is_link_switch_disconnect_req(struct cm_disconnect_req * req)723 cm_is_link_switch_disconnect_req(struct cm_disconnect_req *req)
724 {
725 	return req->req.source == CM_MLO_LINK_SWITCH_DISCONNECT;
726 }
727 
728 /**
729  * cm_is_link_switch_cmd() - Check if the CM ID is for link switch
730  * @cm_id: Connection manager request ID
731  *
732  * Return true if the bit corresponding to link switch is set for @cm_id or
733  * else return false.
734  *
735  * Return: bool
736  */
cm_is_link_switch_cmd(wlan_cm_id cm_id)737 static inline bool cm_is_link_switch_cmd(wlan_cm_id cm_id)
738 {
739 	return cm_id & CM_ID_LSWITCH_BIT;
740 }
741 
742 /**
743  * cm_is_link_switch_disconnect_resp() - API to check if the disconnect
744  * response is for link switch.
745  * @resp: Disconnect response.
746  *
747  * Return true if the disconnect response is for link switch or else return
748  * false.
749  *
750  * Return: bool
751  */
752 static inline bool
cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp * resp)753 cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp *resp)
754 {
755 	return cm_is_link_switch_cmd(resp->req.cm_id);
756 }
757 
758 /**
759  * cm_is_link_switch_connect_resp() - API to check if the connect response
760  * is for link switch.
761  * @resp: Connect response.
762  *
763  * Return true if the connect response is for link switch or else return
764  * false.
765  *
766  * Return: bool
767  */
768 static inline bool
cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp * resp)769 cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp *resp)
770 {
771 	return cm_is_link_switch_cmd(resp->cm_id);
772 }
773 #else
cm_store_wep_key(struct cnx_mgr * cm_ctx,struct wlan_cm_connect_crypto_info * crypto,wlan_cm_id cm_id)774 static inline void cm_store_wep_key(struct cnx_mgr *cm_ctx,
775 				    struct wlan_cm_connect_crypto_info *crypto,
776 				    wlan_cm_id cm_id)
777 {}
778 
779 static inline QDF_STATUS
cm_inform_dlm_connect_complete(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)780 cm_inform_dlm_connect_complete(struct wlan_objmgr_vdev *vdev,
781 			       struct wlan_cm_connect_resp *resp)
782 {
783 	return QDF_STATUS_SUCCESS;
784 }
785 
786 /**
787  * cm_peer_create_on_bss_select_ind_resp() - Called to create peer
788  * if bss select inidication's resp was success
789  * @cm_ctx: connection manager context
790  * @cm_id: Connection mgr ID assigned to this connect request.
791  *
792  * Return: QDF status
793  */
794 QDF_STATUS
795 cm_peer_create_on_bss_select_ind_resp(struct cnx_mgr *cm_ctx,
796 				      wlan_cm_id *cm_id);
797 
798 /**
799  * cm_bss_select_ind_rsp() - Connection manager resp for bss
800  * select indication
801  * @vdev: vdev pointer
802  * @status: Status
803  *
804  * Return: QDF_STATUS
805  */
806 QDF_STATUS cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev,
807 				 QDF_STATUS status);
808 
cm_is_link_switch_connect_req(struct cm_connect_req * req)809 static inline bool cm_is_link_switch_connect_req(struct cm_connect_req *req)
810 {
811 	return false;
812 }
813 
814 static inline bool
cm_is_link_switch_disconnect_req(struct cm_disconnect_req * req)815 cm_is_link_switch_disconnect_req(struct cm_disconnect_req *req)
816 {
817 	return false;
818 }
819 
cm_is_link_switch_cmd(wlan_cm_id cm_id)820 static inline bool cm_is_link_switch_cmd(wlan_cm_id cm_id)
821 {
822 	return false;
823 }
824 
825 static inline bool
cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp * resp)826 cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp *resp)
827 {
828 	return false;
829 }
830 
831 static inline bool
cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp * resp)832 cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp *resp)
833 {
834 	return false;
835 }
836 #endif
837 
838 #ifdef WLAN_FEATURE_FILS_SK
839 /**
840  * cm_store_fils_key() - store fils keys in crypto on connection complete
841  * @cm_ctx: connection manager context
842  * @unicast: if key is unicast
843  * @key_id: Key index
844  * @key_length: key length
845  * @key: key data
846  * @bssid: bssid of the connected AP
847  * @cm_id: cm_id of the connection
848  *
849  * Return: void
850  */
851 void cm_store_fils_key(struct cnx_mgr *cm_ctx, bool unicast,
852 		       uint8_t key_id, uint16_t key_length,
853 		       uint8_t *key, struct qdf_mac_addr *bssid,
854 		       wlan_cm_id cm_id);
855 #endif
856 
857 /**
858  * cm_check_cmid_match_list_head() - check if list head command matches the
859  * given cm_id
860  * @cm_ctx: connection manager context
861  * @cm_id: cm id of connect/disconnect req
862  *
863  * Check if front req command matches the given
864  * cm_id, this can be used to check if the latest (head) is same we are
865  * trying to processing
866  *
867  * Return: true if match else false
868  */
869 bool cm_check_cmid_match_list_head(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
870 
871 /**
872  * cm_check_scanid_match_list_head() - check if list head command matches the
873  * given scan_id
874  * @cm_ctx: connection manager context
875  * @scan_id: scan_id of connect req
876  *
877  * Check if front req command is connect command and matches the given
878  * scan_id, this can be used to check if the latest (head) is same we are
879  * trying to processing
880  *
881  * Return: true if match else false
882  */
883 bool cm_check_scanid_match_list_head(struct cnx_mgr *cm_ctx,
884 				     wlan_scan_id *scan_id);
885 
886 /**
887  * cm_free_connect_req_mem() - free connect req internal memory, to be called
888  * before cm_req is freed
889  * @connect_req: connect req
890  *
891  * Return: void
892  */
893 void cm_free_connect_req_mem(struct cm_connect_req *connect_req);
894 
895 /**
896  * cm_delete_req_from_list() - Delete the request matching cm id
897  * @cm_ctx: connection manager context
898  * @cm_id: cm id of connect/disconnect req
899  *
900  * Context: Can be called from any context.
901  *
902  * Return: QDF_STATUS
903  */
904 QDF_STATUS cm_delete_req_from_list(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
905 
906 /**
907  * cm_fill_bss_info_in_connect_rsp_by_cm_id() - fill bss info for the cm id
908  * @cm_ctx: connection manager context
909  * @cm_id: cm id of connect/disconnect req
910  * @resp: resp to copy bss info like ssid/bssid and freq
911  *
912  * Fill the SSID form the connect req.
913  * Fill freq and bssid from current candidate if available (i.e the connection
914  * has tried to connect to a candidate), else get the bssid from req bssid or
915  * bssid hint which ever is present.
916  *
917  * Return: Success if entry was found else failure
918  */
919 QDF_STATUS
920 cm_fill_bss_info_in_connect_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
921 					 wlan_cm_id cm_id,
922 					 struct wlan_cm_connect_resp *resp);
923 
924 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
925 bool cm_is_cm_id_current_candidate_single_pmk(struct cnx_mgr *cm_ctx,
926 					      wlan_cm_id cm_id);
927 #else
928 static inline
cm_is_cm_id_current_candidate_single_pmk(struct cnx_mgr * cm_ctx,wlan_cm_id cm_id)929 bool cm_is_cm_id_current_candidate_single_pmk(struct cnx_mgr *cm_ctx,
930 					      wlan_cm_id cm_id)
931 {
932 	return false;
933 }
934 #endif
935 
936 /**
937  * cm_remove_cmd_from_serialization() - Remove requests matching cm id
938  * from serialization.
939  * @cm_ctx: connection manager context
940  * @cm_id: cmd id to remove from serialization
941  *
942  * Context: Can be called from any context.
943  *
944  * Return: void
945  */
946 void cm_remove_cmd_from_serialization(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
947 
948 /**
949  * cm_flush_pending_request() - Flush all pending requests matching flush prefix
950  * @cm_ctx: connection manager context
951  * @prefix: prefix for the type of command to flush
952  * @only_failed_req: flush only the failed pending req
953  *
954  * Context: Can be called from any context.
955  *
956  * Return: void
957  */
958 void cm_flush_pending_request(struct cnx_mgr *cm_ctx, uint32_t prefix,
959 			      bool only_failed_req);
960 
961 /**
962  * cm_remove_cmd() - Remove cmd from req list and serialization
963  * @cm_ctx: connection manager context
964  * @cm_id_to_remove: cm id of connect/disconnect/roam req
965  *
966  * Return: void
967  */
968 void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id_to_remove);
969 
970 /**
971  * cm_add_req_to_list_and_indicate_osif() - Add the request to request list in
972  * cm ctx and indicate same to osif
973  * @cm_ctx: connection manager context
974  * @cm_req: cm request
975  * @source: source of request
976  *
977  * Context: Can be called from any context.
978  *
979  * Return: QDF_STATUS
980  */
981 QDF_STATUS cm_add_req_to_list_and_indicate_osif(struct cnx_mgr *cm_ctx,
982 						struct cm_req *cm_req,
983 						enum wlan_cm_source source);
984 
985 struct cm_req *cm_get_req_by_cm_id_fl(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
986 				      const char *func, uint32_t line);
987 
988 /**
989  * cm_get_req_by_cm_id() - Get cm req matching the cm id
990  * @cm_ctx: connection manager context
991  * @cm_id: cm id of connect/disconnect req
992  *
993  * Context: Can be called from any context and to be used only after posting a
994  * msg to SM (ie holding the SM lock) to avoid use after free. also returned req
995  * should only be used till SM lock is hold.
996  *
997  * Return: cm req from the req list whose cm id matches the argument
998  */
999 #define cm_get_req_by_cm_id(cm_ctx, cm_id) \
1000 	cm_get_req_by_cm_id_fl(cm_ctx, cm_id, __func__, __LINE__)
1001 
1002 /**
1003  * cm_vdev_scan_cancel() - cancel all scans for vdev
1004  * @pdev: pdev pointer
1005  * @vdev: vdev for which scan to be canceled
1006  *
1007  * Return: void
1008  */
1009 void cm_vdev_scan_cancel(struct wlan_objmgr_pdev *pdev,
1010 			 struct wlan_objmgr_vdev *vdev);
1011 
1012 /**
1013  * cm_fill_disconnect_resp_from_cm_id() - Fill disconnect response
1014  * @cm_ctx: connection manager context
1015  * @cm_id: cm id of connect/disconnect req
1016  * @resp: Disconnect response which needs to filled
1017  *
1018  * This function is called to fill disconnect response from cm id
1019  *
1020  * Context: Any Context.
1021  *
1022  * Return: Success if disconnect
1023  */
1024 QDF_STATUS
1025 cm_fill_disconnect_resp_from_cm_id(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
1026 				   struct wlan_cm_discon_rsp *resp);
1027 
1028 /**
1029  * cm_inform_bcn_probe() - update scan db with beacon or probe resp
1030  * @cm_ctx: connection manager context
1031  * @bcn_probe: beacon or probe resp received during connect
1032  * @len: beacon or probe resp length
1033  * @freq: scan frequency in MHz
1034  * @rssi: rssi of the beacon or probe resp
1035  * @cm_id: cm id of connect/disconnect req
1036  *
1037  * update scan db, so that kernel and driver do not age out
1038  * the connected AP entry.
1039  *
1040  * Context: Any Context.
1041  *
1042  * Return: void
1043  */
1044 void cm_inform_bcn_probe(struct cnx_mgr *cm_ctx, uint8_t *bcn_probe,
1045 			 uint32_t len, qdf_freq_t freq, int32_t rssi,
1046 			 wlan_cm_id cm_id);
1047 
1048 /**
1049  * cm_set_max_connect_attempts() - Set max connect attempts
1050  * @vdev: vdev pointer
1051  * @max_connect_attempts: max connect attempts to be set.
1052  *
1053  * Set max connect attempts. Max value is limited to CM_MAX_CONNECT_ATTEMPTS.
1054  *
1055  * Return: void
1056  */
1057 void cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev,
1058 				 uint8_t max_connect_attempts);
1059 
1060 /**
1061  * cm_trigger_panic_on_cmd_timeout() - trigger panic on active command timeout
1062  * @vdev: vdev pointer
1063  * @reason: Hang reason code
1064  *
1065  * Return: void
1066  */
1067 void cm_trigger_panic_on_cmd_timeout(struct wlan_objmgr_vdev *vdev,
1068 				     enum qdf_hang_reason reason);
1069 
1070 /**
1071  * cm_set_max_connect_timeout() - Set max connect timeout
1072  * @vdev: vdev pointer
1073  * @max_connect_timeout: max connect timeout to be set.
1074  *
1075  * Set max connect timeout.
1076  *
1077  * Return: void
1078  */
1079 void cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev,
1080 				uint32_t max_connect_timeout);
1081 
1082 /**
1083  * cm_is_vdev_connecting() - check if vdev is in conneting state
1084  * @vdev: vdev pointer
1085  *
1086  * Return: bool
1087  */
1088 bool cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev);
1089 
1090 /**
1091  * cm_is_vdev_connected() - check if vdev is in conneted state
1092  * @vdev: vdev pointer
1093  *
1094  * Return: bool
1095  */
1096 bool cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev);
1097 
1098 /**
1099  * cm_is_vdev_active() - check if vdev is in active state ie conneted or roaming
1100  * state
1101  * @vdev: vdev pointer
1102  *
1103  * Return: bool
1104  */
1105 bool cm_is_vdev_active(struct wlan_objmgr_vdev *vdev);
1106 
1107 /**
1108  * cm_is_vdev_disconnecting() - check if vdev is in disconnecting state
1109  * @vdev: vdev pointer
1110  *
1111  * Return: bool
1112  */
1113 bool cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev);
1114 
1115 /**
1116  * cm_is_vdev_disconnected() - check if vdev is disconnected/init state
1117  * @vdev: vdev pointer
1118  *
1119  * Return: bool
1120  */
1121 bool cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev);
1122 
1123 #ifdef CONN_MGR_ADV_FEATURE
1124 /**
1125  * cm_is_vdev_idle_due_to_link_switch() - Check if VDEV is in
1126  * IDLE state due to link switch
1127  * @vdev: VDEV objmgr pointer
1128  *
1129  * Returns true if the current CM SS is WLAN_CM_SS_IDLE_DUE_TO_LINK_SWITCH or
1130  * returns false.
1131  *
1132  * Return: bool
1133  */
1134 bool cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev *vdev);
1135 #else
1136 static inline bool
cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev * vdev)1137 cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev *vdev)
1138 {
1139 	return false;
1140 }
1141 #endif
1142 
1143 /**
1144  * cm_is_vdev_roaming() - check if vdev is in roaming state
1145  * @vdev: vdev pointer
1146  *
1147  * Return: bool
1148  */
1149 bool cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev);
1150 
1151 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
1152 /**
1153  * cm_is_vdev_roam_started() - check if vdev is in roaming state and
1154  * roam started sub stated
1155  * @vdev: vdev pointer
1156  *
1157  * Return: bool
1158  */
1159 bool cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev);
1160 
1161 /**
1162  * cm_is_vdev_roam_sync_inprogress() - check if vdev is in roaming state
1163  * and roam sync substate
1164  * @vdev: vdev pointer
1165  *
1166  * Return: bool
1167  */
1168 bool cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev);
1169 #endif
1170 
1171 #ifdef WLAN_FEATURE_HOST_ROAM
1172 /**
1173  * cm_is_vdev_roam_preauth_state() - check if vdev is in roaming state and
1174  * preauth is in progress
1175  * @vdev: vdev pointer
1176  *
1177  * Return: bool
1178  */
1179 bool cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev);
1180 
1181 /**
1182  * cm_is_vdev_roam_reassoc_state() - check if vdev is in roaming state
1183  * and reassoc is in progress
1184  * @vdev: vdev pointer
1185  *
1186  * Return: bool
1187  */
1188 bool cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev);
1189 #endif
1190 
1191 /**
1192  * cm_get_active_req_type() - CM active req type
1193  * @vdev: vdev pointer
1194  *
1195  * Return: CM active req type
1196  */
1197 enum wlan_cm_active_request_type
1198 cm_get_active_req_type(struct wlan_objmgr_vdev *vdev);
1199 
1200 /**
1201  * cm_get_active_connect_req() - Get copy of active connect request
1202  * @vdev: vdev pointer
1203  * @req: pointer to the copy of the active connect request
1204  * *
1205  * Context: Should be called only in the context of the
1206  * cm request activation
1207  *
1208  * Return: true and connect req if any request is active
1209  */
1210 bool cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev,
1211 			       struct wlan_cm_vdev_connect_req *req);
1212 
1213 /**
1214  * cm_get_active_disconnect_req() - Get copy of active disconnect request
1215  * @vdev: vdev pointer
1216  * @req: pointer to the copy of the active disconnect request
1217  * *
1218  * Context: Should be called only in the context of the
1219  * cm request activation
1220  *
1221  * Return: true and disconnect req if any request is active
1222  */
1223 bool cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev,
1224 				  struct wlan_cm_vdev_discon_req *req);
1225 
1226 /**
1227  * cm_connect_handle_event_post_fail() - initiate connect failure if msg posting
1228  * to SM fails
1229  * @cm_ctx: connection manager context
1230  * @cm_id: cm_id for connect req for which post fails
1231  *
1232  * Context: Can be called from any context and to be used only after posting a
1233  * msg to SM fails from external event e.g. peer create resp,
1234  * HW mode change resp  serialization cb.
1235  *
1236  * Return: QDF_STATUS
1237  */
1238 void
1239 cm_connect_handle_event_post_fail(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
1240 
1241 /**
1242  * cm_get_req_by_scan_id() - Get cm req matching the scan id
1243  * @cm_ctx: connection manager context
1244  * @scan_id: scan id of scan req
1245  *
1246  * Context: Can be called from any context and to be used only after posting a
1247  * msg to SM (ie holding the SM lock) to avoid use after free. also returned req
1248  * should only be used till SM lock is hold.
1249  *
1250  * Return: cm req from the req list whose scan id matches the argument
1251  */
1252 struct cm_req *cm_get_req_by_scan_id(struct cnx_mgr *cm_ctx,
1253 				     wlan_scan_id scan_id);
1254 
1255 #ifdef WLAN_FEATURE_11BE_MLO
1256 /**
1257  * cm_connect_resp_fill_mld_addr_from_candidate() - API to fill MLD
1258  * address in connect resp from scan entry.
1259  * @vdev: VDEV objmgr pointer.
1260  * @entry: Scan entry.
1261  * @resp: connect response pointer.
1262  *
1263  * If the MLO VDEV flag is set, get the MLD address from the scan
1264  * entry and fill in MLD address field in @resp.
1265  *
1266  * Return: void
1267  */
1268 void
1269 cm_connect_resp_fill_mld_addr_from_candidate(struct wlan_objmgr_vdev *vdev,
1270 					     struct scan_cache_entry *entry,
1271 					     struct wlan_cm_connect_resp *resp);
1272 /**
1273  * cm_connect_resp_fill_mld_addr_from_cm_id() - API to fill MLD address
1274  * in connect resp from connect request ID.
1275  * @vdev: VDEV objmgr pointer.
1276  * @cm_id: connect request ID.
1277  * @rsp: connect resp pointer.
1278  *
1279  * The API gets scan entry from the connect request using the connect request
1280  * ID and fills MLD address from the scan entry into the connect response.
1281  *
1282  * Return: void
1283  */
1284 void
1285 cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
1286 					 wlan_cm_id cm_id,
1287 					 struct wlan_cm_connect_resp *rsp);
1288 
1289 static inline void
cm_connect_rsp_get_mld_addr_or_bssid(struct wlan_cm_connect_resp * resp,struct qdf_mac_addr * bssid)1290 cm_connect_rsp_get_mld_addr_or_bssid(struct wlan_cm_connect_resp *resp,
1291 				     struct qdf_mac_addr *bssid)
1292 {
1293 	if (!qdf_is_macaddr_zero(&resp->mld_addr))
1294 		qdf_copy_macaddr(bssid, &resp->mld_addr);
1295 	else
1296 		qdf_copy_macaddr(bssid, &resp->bssid);
1297 }
1298 #else
1299 static inline void
cm_connect_resp_fill_mld_addr_from_candidate(struct wlan_objmgr_vdev * vdev,struct scan_cache_entry * entry,struct wlan_cm_connect_resp * resp)1300 cm_connect_resp_fill_mld_addr_from_candidate(struct wlan_objmgr_vdev *vdev,
1301 					     struct scan_cache_entry *entry,
1302 					     struct wlan_cm_connect_resp *resp)
1303 {
1304 }
1305 
1306 static inline void
cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id,struct wlan_cm_connect_resp * rsp)1307 cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
1308 					 wlan_cm_id cm_id,
1309 					 struct wlan_cm_connect_resp *rsp)
1310 {
1311 }
1312 
1313 static inline void
cm_connect_rsp_get_mld_addr_or_bssid(struct wlan_cm_connect_resp * resp,struct qdf_mac_addr * bssid)1314 cm_connect_rsp_get_mld_addr_or_bssid(struct wlan_cm_connect_resp *resp,
1315 				     struct qdf_mac_addr *bssid)
1316 {
1317 	qdf_copy_macaddr(bssid, &resp->bssid);
1318 }
1319 #endif
1320 
1321 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
1322 /**
1323  * cm_standby_link_update_mlme_by_bssid() - update the scan mlme info for
1324  * standby_link
1325  * @vdev: Object manager vdev
1326  * @assoc_state: association state
1327  * @ssid: SSID of the connection
1328  *
1329  * Return: void
1330  */
1331 void cm_standby_link_update_mlme_by_bssid(struct wlan_objmgr_vdev *vdev,
1332 					  uint32_t assoc_state,
1333 					  struct wlan_ssid ssid);
1334 #else
1335 static inline void
cm_standby_link_update_mlme_by_bssid(struct wlan_objmgr_vdev * vdev,uint32_t assoc_state,struct wlan_ssid ssid)1336 cm_standby_link_update_mlme_by_bssid(struct wlan_objmgr_vdev *vdev,
1337 				     uint32_t assoc_state,
1338 				     struct wlan_ssid ssid)
1339 {
1340 }
1341 #endif
1342 
1343 /**
1344  * cm_get_cm_id_by_scan_id() - Get cm id by matching the scan id
1345  * @cm_ctx: connection manager context
1346  * @scan_id: scan id of scan req
1347  *
1348  * Context: Can be called from any context and used to get cm_id
1349  * from scan id when SM lock is not held
1350  *
1351  * Return: cm id from the req list whose scan id matches the argument
1352  */
1353 wlan_cm_id cm_get_cm_id_by_scan_id(struct cnx_mgr *cm_ctx,
1354 				   wlan_scan_id scan_id);
1355 
1356 /**
1357  * cm_update_scan_mlme_on_disconnect() - update the scan mlme info
1358  * on disconnect completion
1359  * @vdev: Object manager vdev
1360  * @req: Disconnect request
1361  *
1362  * Return: void
1363  */
1364 void
1365 cm_update_scan_mlme_on_disconnect(struct wlan_objmgr_vdev *vdev,
1366 				  struct cm_disconnect_req *req);
1367 
1368 /**
1369  * cm_calculate_scores() - Score the candidates obtained from scan
1370  * manager after filtering
1371  * @cm_ctx: Connection manager context
1372  * @pdev: Object manager pdev
1373  * @filter: Scan filter params
1374  * @list: List of candidates to be scored
1375  *
1376  * Return: void
1377  */
1378 void cm_calculate_scores(struct cnx_mgr *cm_ctx,
1379 			 struct wlan_objmgr_pdev *pdev,
1380 			 struct scan_filter *filter, qdf_list_t *list);
1381 
1382 /**
1383  * cm_req_lock_acquire() - Acquire connection manager request lock
1384  * @cm_ctx: Connection manager context
1385  *
1386  * Return: void
1387  */
1388 void cm_req_lock_acquire(struct cnx_mgr *cm_ctx);
1389 
1390 /**
1391  * cm_req_lock_release() - Release connection manager request lock
1392  * @cm_ctx: Connection manager context
1393  *
1394  * Return: void
1395  */
1396 void cm_req_lock_release(struct cnx_mgr *cm_ctx);
1397 
1398 #ifdef SM_ENG_HIST_ENABLE
1399 /**
1400  * cm_req_history_add() - Save request history
1401  * @cm_ctx: Connection manager context
1402  * @cm_req: Connection manager request
1403  *
1404  * Return: void
1405  */
1406 void cm_req_history_add(struct cnx_mgr *cm_ctx,
1407 			struct cm_req *cm_req);
1408 /**
1409  * cm_req_history_del() - Update history on request deletion
1410  * @cm_ctx: Connection manager context
1411  * @cm_req: Connection manager request
1412  * @del_type: Context in which the request is deleted
1413  *
1414  * Return: void
1415  */
1416 void cm_req_history_del(struct cnx_mgr *cm_ctx,
1417 			struct cm_req *cm_req,
1418 			enum cm_req_del_type del_type);
1419 
1420 /**
1421  * cm_req_history_init() - Initialize the history data struct
1422  * @cm_ctx: Connection manager context
1423  *
1424  * Return: void
1425  */
1426 void cm_req_history_init(struct cnx_mgr *cm_ctx);
1427 
1428 /**
1429  * cm_req_history_deinit() - Deinitialize the history data struct
1430  * @cm_ctx: Connection manager context
1431  *
1432  * Return: void
1433  */
1434 void cm_req_history_deinit(struct cnx_mgr *cm_ctx);
1435 
1436 /**
1437  * cm_req_history_print() - Print the history data struct
1438  * @cm_ctx: Connection manager context
1439  *
1440  * Return: void
1441  */
1442 void cm_req_history_print(struct cnx_mgr *cm_ctx);
1443 extern struct wlan_sm_state_info cm_sm_info[];
1444 #else
1445 static inline
cm_req_history_add(struct cnx_mgr * cm_ctx,struct cm_req * cm_req)1446 void cm_req_history_add(struct cnx_mgr *cm_ctx,
1447 			struct cm_req *cm_req)
1448 {}
1449 
1450 static inline
cm_req_history_del(struct cnx_mgr * cm_ctx,struct cm_req * cm_req,enum cm_req_del_type del_type)1451 void cm_req_history_del(struct cnx_mgr *cm_ctx,
1452 			struct cm_req *cm_req,
1453 			enum cm_req_del_type del_type)
1454 {}
1455 
cm_req_history_init(struct cnx_mgr * cm_ctx)1456 static inline void cm_req_history_init(struct cnx_mgr *cm_ctx)
1457 {}
1458 
cm_req_history_deinit(struct cnx_mgr * cm_ctx)1459 static inline void cm_req_history_deinit(struct cnx_mgr *cm_ctx)
1460 {}
1461 
cm_req_history_print(struct cnx_mgr * cm_ctx)1462 static inline void cm_req_history_print(struct cnx_mgr *cm_ctx)
1463 {}
1464 #endif
1465 
1466 #ifdef WLAN_CM_USE_SPINLOCK
1467 /**
1468  * cm_activate_cmd_req_flush_cb() - Callback when the scheduler msg is flushed
1469  * @msg: scheduler message
1470  *
1471  * Return: QDF_STATUS
1472  */
1473 QDF_STATUS cm_activate_cmd_req_flush_cb(struct scheduler_msg *msg);
1474 #endif
1475 
1476 #ifndef CONN_MGR_ADV_FEATURE
1477 /**
1478  * cm_set_candidate_advance_filter_cb() - Set CM candidate advance
1479  * filter cb
1480  * @vdev: Objmgr vdev
1481  * @filter_fun: CM candidate advance filter cb
1482  *
1483  * Return: void
1484  */
1485 void cm_set_candidate_advance_filter_cb(
1486 		struct wlan_objmgr_vdev *vdev,
1487 		void (*filter_fun)(struct wlan_objmgr_vdev *vdev,
1488 				   struct scan_filter *filter));
1489 
1490 /**
1491  * cm_set_candidate_custom_sort_cb() - Set CM candidate custom sort cb
1492  * @vdev: Objmgr vdev
1493  * @sort_fun: CM candidate custom sort cb
1494  *
1495  * Return: void
1496  */
1497 void cm_set_candidate_custom_sort_cb(
1498 		struct wlan_objmgr_vdev *vdev,
1499 		void (*sort_fun)(struct wlan_objmgr_vdev *vdev,
1500 				 qdf_list_t *list));
1501 
1502 #endif
1503 
1504 /**
1505  * cm_is_connect_req_reassoc() - Is connect req for reassoc
1506  * @req: connect req
1507  *
1508  * Return: void
1509  */
1510 bool cm_is_connect_req_reassoc(struct wlan_cm_connect_req *req);
1511 
1512 /**
1513  * cm_is_first_candidate_connect_attempt() - Is it a first attempt to
1514  * connect to a candidate after receiving connect request
1515  * @vdev: vdev pointer
1516  *
1517  * Return: True if it is the first connect attempt to a candidate
1518  * after receiving the connect request from the userspace
1519  */
1520 bool cm_is_first_candidate_connect_attempt(struct wlan_objmgr_vdev *vdev);
1521 
1522 /**
1523  * cm_get_active_connect_req_param() - Get Connect request parameter
1524  * @vdev: vdev pointer
1525  * @req: Connection request buffer to be filled
1526  *
1527  * Return: QDF_STATUS
1528  */
1529 QDF_STATUS
1530 cm_get_active_connect_req_param(struct wlan_objmgr_vdev *vdev,
1531 				struct wlan_cm_connect_req *req);
1532 
1533 /**
1534  * cm_get_rnr() - get rnr
1535  * @vdev:vdev
1536  * @cm_id: connect mgr id
1537  * @rnr: pointer to copy rnr info
1538  *
1539  * Return: QDF_STATUS
1540  */
1541 QDF_STATUS cm_get_rnr(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id,
1542 		      struct reduced_neighbor_report *rnr);
1543 
1544 /**
1545  * cm_get_curr_candidate_entry() - Get the current candidate from cnx mgr
1546  * @vdev: VDEV object manager.
1547  * @cm_id: cnx mgr ID.
1548  *
1549  * Get current entry of connection from the cnx mgr list.
1550  * Caller to free the returned scan entry if not NULL.
1551  *
1552  * Return: Scan entry
1553  */
1554 struct scan_cache_entry *
1555 cm_get_curr_candidate_entry(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id);
1556 
1557 /**
1558  * cm_free_connect_rsp_ies() - Function to free all connection IEs.
1559  * @connect_rsp: pointer to connect rsp
1560  *
1561  * Function to free up all the IE in connect response structure.
1562  *
1563  * Return: void
1564  */
1565 void cm_free_connect_rsp_ies(struct wlan_cm_connect_resp *connect_rsp);
1566 
1567 /**
1568  * cm_free_connect_req() - Function to free up connect request and its sub memory.
1569  * @connect_req: pointer to connect req
1570  *
1571  * Function to free up connect request and its sub memory.
1572  *
1573  * Return: void
1574  */
1575 void cm_free_connect_req(struct wlan_cm_connect_req *connect_req);
1576 
1577 /**
1578  * cm_free_connect_rsp() - Function to free up connect response and its sub memory.
1579  * @connect_rsp: pointer to connect rsp
1580  *
1581  * Function to free up connect response and its sub memory.
1582  *
1583  * Return: void
1584  */
1585 void cm_free_connect_rsp(struct wlan_cm_connect_resp *connect_rsp);
1586 
1587 /**
1588  * cm_free_connect_req_param() - Function to free up connect request sub memory.
1589  * @req: pointer to connect req
1590  *
1591  * Function to free up connect request sub memory parameters.
1592  *
1593  * Return: void
1594  */
1595 void cm_free_connect_req_param(struct wlan_cm_connect_req *req);
1596 
1597 /**
1598  * cm_free_wep_key_params() - Function to free up connect request wep key params
1599  * sub memory
1600  * @req: pointer to connect req
1601  *
1602  * Function to free up connect request wep key params sub memory.
1603  *
1604  * Return: void
1605  */
1606 void cm_free_wep_key_params(struct wlan_cm_connect_req *req);
1607 
1608 #ifdef CONN_MGR_ADV_FEATURE
1609 /**
1610  * cm_store_first_candidate_rsp() - store the connection failure response
1611  * @cm_ctx: connection manager context
1612  * @cm_id: cm_id for connect response to be filled
1613  * @resp: first connect failure response
1614  *
1615  * This API would be called when candidate fails to connect. It will cache the
1616  * first connect failure response in connect req structure.
1617  *
1618  * Return: void
1619  */
1620 void cm_store_first_candidate_rsp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
1621 				  struct wlan_cm_connect_resp *resp);
1622 
1623 /**
1624  * cm_get_first_candidate_rsp() - fetch first candidate response
1625  * @cm_ctx: connection manager context
1626  * @cm_id: cm_id for connect response to be filled
1627  * @first_candid_rsp: first connect failure response
1628  *
1629  * This API would be called when last candidate is failed to connect. It will
1630  * fetch the first candidate failure response which was cached in connect
1631  * request structure.
1632  *
1633  * Return: QDF_STATUS_SUCCESS when rsp is fetch successfully
1634  */
1635 QDF_STATUS
1636 cm_get_first_candidate_rsp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
1637 			   struct wlan_cm_connect_resp *first_candid_rsp);
1638 
1639 /**
1640  * cm_store_n_send_failed_candidate() - stored failed connect response and sent
1641  * it to osif.
1642  * @cm_ctx: connection manager context
1643  * @cm_id: connection manager id
1644  *
1645  * This API will stored failed connect response in connect request structure
1646  * and sent it to osif layer.
1647  *
1648  * Return: void
1649  */
1650 void cm_store_n_send_failed_candidate(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
1651 #else
1652 static inline
cm_store_first_candidate_rsp(struct cnx_mgr * cm_ctx,wlan_cm_id cm_id,struct wlan_cm_connect_resp * resp)1653 void cm_store_first_candidate_rsp(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id,
1654 				  struct wlan_cm_connect_resp *resp)
1655 {
1656 }
1657 
1658 static inline
cm_store_n_send_failed_candidate(struct cnx_mgr * cm_ctx,wlan_cm_id cm_id)1659 void cm_store_n_send_failed_candidate(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id)
1660 {
1661 }
1662 #endif /* CONN_MGR_ADV_FEATURE */
1663 
1664 #ifdef WLAN_FEATURE_11BE_MLO
1665 /**
1666  * cm_bss_mlo_type() - Check if the scan entry is of MLO type
1667  * @psoc: Pointer to psoc
1668  * @entry: scan cache entry
1669  * @scan_list: list of scan entries to look for if @entry is of ML type
1670  *
1671  * Return: MLO AP type: SLO, MLMR or EMLSR.
1672  */
1673 enum MLO_TYPE cm_bss_mlo_type(struct wlan_objmgr_psoc *psoc,
1674 			      struct scan_cache_entry *entry,
1675 			      qdf_list_t *scan_list);
1676 #else
1677 static inline enum MLO_TYPE
cm_bss_mlo_type(struct wlan_objmgr_psoc * psoc,struct scan_cache_entry * entry,qdf_list_t * scan_list)1678 cm_bss_mlo_type(struct wlan_objmgr_psoc *psoc,
1679 		struct scan_cache_entry *entry,
1680 		qdf_list_t *scan_list)
1681 {
1682 	return SLO;
1683 }
1684 #endif
1685 
1686 #ifdef WLAN_FEATURE_LL_LT_SAP
1687 /**
1688  * cm_bearer_switch_resp() - Bearer switch response
1689  * @psoc: Psoc pointer
1690  * @vdev_id: vdev id
1691  * @cm_id: connection ID which gave the hw mode change request
1692  * @status: status of the bearer switch
1693  *
1694  * Return: void
1695  */
1696 void cm_bearer_switch_resp(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
1697 			   wlan_cm_id cm_id, QDF_STATUS status);
1698 #endif
1699 #ifdef WLAN_CHIPSET_STATS
1700 /**
1701  * cm_cp_stats_cstats_log_connecting_event : Chipset stats connecting event
1702  * @vdev: pointer to vdev object
1703  * @req: pointer to wlan_cm_vdev_connect_req object
1704  * @cm_req: pointer to cm_req object
1705  *
1706  * Return: void
1707  */
1708 void
1709 cm_cp_stats_cstats_log_connecting_event(struct wlan_objmgr_vdev *vdev,
1710 					struct wlan_cm_vdev_connect_req *req,
1711 					struct cm_req *cm_req);
1712 #else
1713 static inline void
cm_cp_stats_cstats_log_connecting_event(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_connect_req * req,struct cm_req * cm_req)1714 cm_cp_stats_cstats_log_connecting_event(struct wlan_objmgr_vdev *vdev,
1715 					struct wlan_cm_vdev_connect_req *req,
1716 					struct cm_req *cm_req)
1717 {
1718 }
1719 #endif /* WLAN_CHIPSET_STATS */
1720 #endif /* __WLAN_CM_MAIN_API_H__ */
1721