xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/mlme_objmgr/dispatcher/src/wlan_cmn_mlme_main.c (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
1 /*
2  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /**
19  * DOC: Implements MLME global APIs
20  */
21 
22 #include <wlan_objmgr_cmn.h>
23 #include <include/wlan_mlme_cmn.h>
24 #include <include/wlan_pdev_mlme.h>
25 #include <include/wlan_vdev_mlme.h>
26 #include <include/wlan_mlme_cmn.h>
27 #include <wlan_psoc_mlme_main.h>
28 #include <wlan_pdev_mlme_main.h>
29 #include <wlan_vdev_mlme_main.h>
30 #include <wlan_psoc_mlme_api.h>
31 
32 struct mlme_ext_ops *glbl_ops;
33 mlme_get_global_ops_cb glbl_ops_cb;
34 
35 struct mlme_cm_ops *glbl_cm_ops;
36 osif_cm_get_global_ops_cb glbl_cm_ops_cb;
37 
38 struct mlme_twt_ops *glbl_twt_ops;
39 osif_twt_get_global_ops_cb glbl_twt_ops_cb;
40 
41 static void mlme_cm_ops_init(void)
42 {
43 	if (glbl_cm_ops_cb)
44 		glbl_cm_ops = glbl_cm_ops_cb();
45 }
46 
47 static void mlme_cm_ops_deinit(void)
48 {
49 	if (glbl_cm_ops_cb)
50 		glbl_cm_ops = NULL;
51 }
52 
53 struct mlme_vdev_mgr_ops *glbl_vdev_mgr_ops;
54 osif_vdev_mgr_get_global_ops_cb glbl_vdev_mgr_ops_cb;
55 
56 static void mlme_vdev_mgr_ops_init(void)
57 {
58 	if (glbl_vdev_mgr_ops_cb)
59 		glbl_vdev_mgr_ops = glbl_vdev_mgr_ops_cb();
60 }
61 
62 static void mlme_vdev_mgr_ops_deinit(void)
63 {
64 	if (glbl_vdev_mgr_ops_cb)
65 		glbl_vdev_mgr_ops = NULL;
66 }
67 
68 static void mlme_twt_ops_init(void)
69 {
70 	if (glbl_twt_ops_cb)
71 		glbl_twt_ops = glbl_twt_ops_cb();
72 }
73 
74 static void mlme_twt_ops_deinit(void)
75 {
76 	if (glbl_twt_ops_cb)
77 		glbl_twt_ops = NULL;
78 }
79 
80 QDF_STATUS wlan_cmn_mlme_init(void)
81 {
82 	QDF_STATUS status;
83 
84 	status = wlan_psoc_mlme_init();
85 	if (status != QDF_STATUS_SUCCESS)
86 		return status;
87 
88 	status = wlan_pdev_mlme_init();
89 	if (status != QDF_STATUS_SUCCESS)
90 		return status;
91 
92 	status = wlan_vdev_mlme_init();
93 	if (status != QDF_STATUS_SUCCESS)
94 		return status;
95 
96 	if (glbl_ops_cb)
97 		glbl_ops = glbl_ops_cb();
98 
99 	mlme_cm_ops_init();
100 
101 	mlme_vdev_mgr_ops_init();
102 
103 	mlme_twt_ops_init();
104 
105 	return QDF_STATUS_SUCCESS;
106 }
107 
108 QDF_STATUS wlan_cmn_mlme_deinit(void)
109 {
110 	QDF_STATUS status;
111 
112 	mlme_twt_ops_deinit();
113 
114 	mlme_vdev_mgr_ops_deinit();
115 
116 	mlme_cm_ops_deinit();
117 
118 	status = wlan_vdev_mlme_deinit();
119 	if (status != QDF_STATUS_SUCCESS)
120 		return status;
121 
122 	status = wlan_pdev_mlme_deinit();
123 	if (status != QDF_STATUS_SUCCESS)
124 		return status;
125 
126 	status = wlan_psoc_mlme_deinit();
127 	if (status != QDF_STATUS_SUCCESS)
128 		return status;
129 
130 	return QDF_STATUS_SUCCESS;
131 }
132 
133 QDF_STATUS mlme_psoc_ops_ext_hdl_create(struct psoc_mlme_obj *psoc_mlme)
134 {
135 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
136 
137 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_create)
138 		ret = glbl_ops->mlme_psoc_ext_hdl_create(psoc_mlme);
139 
140 	return ret;
141 }
142 
143 QDF_STATUS mlme_psoc_ops_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme)
144 {
145 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
146 
147 	if (glbl_ops && glbl_ops->mlme_psoc_ext_hdl_destroy)
148 		ret = glbl_ops->mlme_psoc_ext_hdl_destroy(psoc_mlme);
149 
150 	return ret;
151 }
152 
153 QDF_STATUS mlme_pdev_ops_ext_hdl_create(struct pdev_mlme_obj *pdev_mlme)
154 {
155 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
156 
157 	if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_create)
158 		ret = glbl_ops->mlme_pdev_ext_hdl_create(pdev_mlme);
159 
160 	return ret;
161 }
162 
163 QDF_STATUS mlme_pdev_ops_ext_hdl_destroy(struct pdev_mlme_obj *pdev_mlme)
164 {
165 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
166 
167 	if (glbl_ops && glbl_ops->mlme_pdev_ext_hdl_destroy)
168 		ret = glbl_ops->mlme_pdev_ext_hdl_destroy(pdev_mlme);
169 
170 	return ret;
171 }
172 
173 QDF_STATUS mlme_vdev_ops_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
174 {
175 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
176 
177 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_create)
178 		ret = glbl_ops->mlme_vdev_ext_hdl_create(vdev_mlme);
179 
180 	return ret;
181 }
182 
183 QDF_STATUS mlme_vdev_ops_ext_hdl_post_create(struct vdev_mlme_obj *vdev_mlme)
184 {
185 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
186 
187 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_post_create)
188 		ret = glbl_ops->mlme_vdev_ext_hdl_post_create(vdev_mlme);
189 
190 	return ret;
191 }
192 
193 QDF_STATUS mlme_vdev_ops_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme)
194 {
195 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
196 
197 	if (glbl_ops && glbl_ops->mlme_vdev_ext_hdl_destroy)
198 		ret = glbl_ops->mlme_vdev_ext_hdl_destroy(vdev_mlme);
199 
200 	return ret;
201 }
202 
203 QDF_STATUS mlme_vdev_ops_start_fw_send(struct wlan_objmgr_vdev *vdev,
204 				       uint8_t restart)
205 {
206 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
207 
208 	if (glbl_ops && glbl_ops->mlme_vdev_start_fw_send)
209 		ret = glbl_ops->mlme_vdev_start_fw_send(vdev, restart);
210 
211 	return ret;
212 }
213 
214 QDF_STATUS mlme_vdev_ops_multivdev_restart_fw_cmd_send(
215 						struct wlan_objmgr_pdev *pdev)
216 {
217 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
218 
219 	if (glbl_ops && glbl_ops->mlme_multivdev_restart_fw_send)
220 		ret = glbl_ops->mlme_multivdev_restart_fw_send(pdev);
221 
222 	return ret;
223 }
224 
225 QDF_STATUS mlme_vdev_ops_stop_fw_send(struct wlan_objmgr_vdev *vdev)
226 {
227 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
228 
229 	if (glbl_ops && glbl_ops->mlme_vdev_stop_fw_send)
230 		ret = glbl_ops->mlme_vdev_stop_fw_send(vdev);
231 
232 	return ret;
233 }
234 
235 QDF_STATUS mlme_vdev_ops_down_fw_send(struct wlan_objmgr_vdev *vdev)
236 {
237 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
238 
239 	if (glbl_ops && glbl_ops->mlme_vdev_down_fw_send)
240 		ret = glbl_ops->mlme_vdev_down_fw_send(vdev);
241 
242 	return ret;
243 }
244 
245 QDF_STATUS mlme_vdev_enqueue_exp_ser_cmd(struct vdev_mlme_obj *vdev_mlme,
246 					 uint8_t cmd_type)
247 {
248 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
249 
250 	if (glbl_ops && glbl_ops->mlme_vdev_enqueue_exp_cmd)
251 		ret = glbl_ops->mlme_vdev_enqueue_exp_cmd(vdev_mlme, cmd_type);
252 
253 	return ret;
254 }
255 
256 QDF_STATUS mlme_vdev_ops_ext_hdl_delete_rsp(struct wlan_objmgr_psoc *psoc,
257 					    struct vdev_delete_response *rsp)
258 {
259 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
260 
261 	if ((glbl_ops) && glbl_ops->mlme_vdev_ext_delete_rsp)
262 		ret = glbl_ops->mlme_vdev_ext_delete_rsp(psoc, rsp);
263 
264 	return ret;
265 }
266 
267 QDF_STATUS mlme_vdev_ops_ext_hdl_multivdev_restart_resp(
268 					struct wlan_objmgr_psoc *psoc,
269 					struct multi_vdev_restart_resp *resp)
270 {
271 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
272 
273 	if ((glbl_ops) && glbl_ops->mlme_multi_vdev_restart_resp)
274 		ret = glbl_ops->mlme_multi_vdev_restart_resp(psoc, resp);
275 
276 	return ret;
277 }
278 
279 QDF_STATUS mlme_cm_ext_hdl_create(struct wlan_objmgr_vdev *vdev,
280 				  cm_ext_t **ext_cm_ptr)
281 {
282 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
283 
284 	if (glbl_ops && glbl_ops->mlme_cm_ext_hdl_create_cb)
285 		ret = glbl_ops->mlme_cm_ext_hdl_create_cb(vdev, ext_cm_ptr);
286 
287 	return ret;
288 }
289 
290 QDF_STATUS mlme_cm_ext_hdl_destroy(struct wlan_objmgr_vdev *vdev,
291 				   cm_ext_t *ext_cm_ptr)
292 {
293 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
294 
295 	if (glbl_ops && glbl_ops->mlme_cm_ext_hdl_destroy_cb)
296 		ret = glbl_ops->mlme_cm_ext_hdl_destroy_cb(vdev, ext_cm_ptr);
297 
298 	return ret;
299 }
300 
301 QDF_STATUS mlme_cm_connect_start_ind(struct wlan_objmgr_vdev *vdev,
302 				     struct wlan_cm_connect_req *req)
303 {
304 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
305 
306 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_start_ind_cb)
307 		ret = glbl_ops->mlme_cm_ext_connect_start_ind_cb(vdev, req);
308 
309 	return ret;
310 }
311 
312 QDF_STATUS mlme_ext_hdl_get_acs_in_progress(struct wlan_objmgr_vdev *vdev,
313 					    bool *acs_in_progress)
314 {
315 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
316 
317 	if ((glbl_ops) && glbl_ops->mlme_ext_get_acs_inprogress)
318 		ret = glbl_ops->mlme_ext_get_acs_inprogress(vdev,
319 							    acs_in_progress);
320 
321 	return ret;
322 }
323 
324 QDF_STATUS mlme_cm_bss_select_ind(struct wlan_objmgr_vdev *vdev,
325 				  struct wlan_cm_vdev_connect_req *req)
326 {
327 	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
328 
329 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_select_ind_cb)
330 		ret = glbl_ops->mlme_cm_ext_bss_select_ind_cb(vdev, req);
331 
332 	return ret;
333 }
334 
335 QDF_STATUS mlme_cm_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
336 				       struct qdf_mac_addr *peer_mac,
337 				       struct qdf_mac_addr *mld_mac,
338 				       bool is_assoc_link)
339 {
340 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
341 
342 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_peer_create_req_cb)
343 		ret = glbl_ops->mlme_cm_ext_bss_peer_create_req_cb(
344 				vdev, peer_mac, mld_mac, is_assoc_link);
345 
346 	return ret;
347 }
348 
349 QDF_STATUS mlme_cm_connect_req(struct wlan_objmgr_vdev *vdev,
350 			       struct wlan_cm_vdev_connect_req *req)
351 {
352 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
353 
354 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_req_cb)
355 		ret = glbl_ops->mlme_cm_ext_connect_req_cb(vdev, req);
356 
357 	return ret;
358 }
359 
360 QDF_STATUS mlme_cm_roam_start_ind(struct wlan_objmgr_vdev *vdev,
361 				  struct wlan_cm_roam_req *req)
362 {
363 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
364 
365 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_roam_start_ind_cb)
366 		ret = glbl_ops->mlme_cm_ext_roam_start_ind_cb(vdev, req);
367 
368 	return ret;
369 }
370 
371 QDF_STATUS mlme_cm_rso_stop_req(struct wlan_objmgr_vdev *vdev)
372 {
373 	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
374 
375 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_rso_stop_cb)
376 		ret = glbl_ops->mlme_cm_ext_rso_stop_cb(vdev);
377 
378 	return ret;
379 }
380 
381 QDF_STATUS mlme_cm_reassoc_req(struct wlan_objmgr_vdev *vdev,
382 			       struct wlan_cm_vdev_reassoc_req *req)
383 {
384 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
385 
386 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_reassoc_req_cb)
387 		ret = glbl_ops->mlme_cm_ext_reassoc_req_cb(vdev, req);
388 
389 	return ret;
390 }
391 
392 QDF_STATUS mlme_cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
393 					struct wlan_cm_connect_resp *rsp)
394 {
395 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
396 
397 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_connect_complete_ind_cb)
398 		ret = glbl_ops->mlme_cm_ext_connect_complete_ind_cb(vdev, rsp);
399 
400 	return ret;
401 }
402 
403 QDF_STATUS mlme_cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
404 					struct wlan_cm_disconnect_req *req)
405 {
406 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
407 
408 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_start_ind_cb)
409 		ret = glbl_ops->mlme_cm_ext_disconnect_start_ind_cb(vdev, req);
410 
411 	return ret;
412 }
413 
414 QDF_STATUS mlme_cm_disconnect_req(struct wlan_objmgr_vdev *vdev,
415 				  struct wlan_cm_vdev_discon_req *req)
416 {
417 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
418 
419 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_req_cb)
420 		ret = glbl_ops->mlme_cm_ext_disconnect_req_cb(vdev, req);
421 
422 	return ret;
423 }
424 
425 QDF_STATUS mlme_cm_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev)
426 {
427 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
428 
429 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_bss_peer_delete_req_cb)
430 		ret = glbl_ops->mlme_cm_ext_bss_peer_delete_req_cb(vdev);
431 
432 	return ret;
433 }
434 
435 QDF_STATUS mlme_cm_disconnect_complete_ind(struct wlan_objmgr_vdev *vdev,
436 					   struct wlan_cm_discon_rsp *rsp)
437 {
438 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
439 
440 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_disconnect_complete_ind_cb)
441 		ret = glbl_ops->mlme_cm_ext_disconnect_complete_ind_cb(vdev,
442 								       rsp);
443 
444 	return ret;
445 }
446 
447 QDF_STATUS mlme_cm_vdev_down_req(struct wlan_objmgr_vdev *vdev)
448 {
449 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
450 
451 	if ((glbl_ops) && glbl_ops->mlme_cm_ext_vdev_down_req_cb)
452 		ret = glbl_ops->mlme_cm_ext_vdev_down_req_cb(vdev);
453 	return ret;
454 }
455 
456 QDF_STATUS mlme_cm_osif_connect_complete(struct wlan_objmgr_vdev *vdev,
457 				    struct wlan_cm_connect_resp *rsp)
458 {
459 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
460 
461 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_connect_complete_cb)
462 		ret = glbl_cm_ops->mlme_cm_connect_complete_cb(vdev, rsp);
463 
464 	return ret;
465 }
466 
467 QDF_STATUS
468 mlme_cm_osif_failed_candidate_ind(struct wlan_objmgr_vdev *vdev,
469 				  struct wlan_cm_connect_resp *rsp)
470 {
471 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
472 
473 	if (glbl_cm_ops &&
474 	    glbl_cm_ops->mlme_cm_failed_candidate_cb)
475 		ret = glbl_cm_ops->mlme_cm_failed_candidate_cb(vdev, rsp);
476 
477 	return ret;
478 }
479 
480 QDF_STATUS mlme_cm_osif_update_id_and_src(struct wlan_objmgr_vdev *vdev,
481 					  enum wlan_cm_source source,
482 					  wlan_cm_id cm_id)
483 {
484 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
485 
486 	if (glbl_cm_ops &&
487 	    glbl_cm_ops->mlme_cm_update_id_and_src_cb)
488 		ret = glbl_cm_ops->mlme_cm_update_id_and_src_cb(vdev, source,
489 								cm_id);
490 
491 	return ret;
492 }
493 
494 QDF_STATUS mlme_cm_osif_disconnect_complete(struct wlan_objmgr_vdev *vdev,
495 					    struct wlan_cm_discon_rsp *rsp)
496 {
497 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
498 
499 	if (glbl_cm_ops &&
500 	    glbl_cm_ops->mlme_cm_disconnect_complete_cb)
501 		ret = glbl_cm_ops->mlme_cm_disconnect_complete_cb(vdev, rsp);
502 
503 	return ret;
504 }
505 
506 QDF_STATUS mlme_cm_osif_disconnect_start_ind(struct wlan_objmgr_vdev *vdev)
507 {
508 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
509 
510 	if (glbl_cm_ops &&
511 	    glbl_cm_ops->mlme_cm_disconnect_start_cb)
512 		ret = glbl_cm_ops->mlme_cm_disconnect_start_cb(vdev);
513 
514 	return ret;
515 }
516 
517 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
518 QDF_STATUS mlme_cm_osif_get_vendor_handoff_params(struct wlan_objmgr_psoc *psoc,
519 						  void *vendor_handoff_context)
520 {
521 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_get_vendor_handoff_params_cb)
522 		return glbl_cm_ops->mlme_cm_get_vendor_handoff_params_cb(psoc,
523 							vendor_handoff_context);
524 
525 	return QDF_STATUS_E_FAILURE;
526 }
527 #endif
528 
529 #ifdef CONN_MGR_ADV_FEATURE
530 QDF_STATUS mlme_cm_osif_roam_sync_ind(struct wlan_objmgr_vdev *vdev)
531 {
532 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
533 
534 	if (glbl_cm_ops &&
535 	    glbl_cm_ops->mlme_cm_roam_sync_cb)
536 		ret = glbl_cm_ops->mlme_cm_roam_sync_cb(vdev);
537 
538 	return ret;
539 }
540 
541 QDF_STATUS mlme_cm_osif_pmksa_candidate_notify(struct wlan_objmgr_vdev *vdev,
542 					       struct qdf_mac_addr *bssid,
543 					       int index, bool preauth)
544 {
545 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
546 
547 	if (glbl_cm_ops &&
548 	    glbl_cm_ops->mlme_cm_pmksa_candidate_notify_cb)
549 		ret = glbl_cm_ops->mlme_cm_pmksa_candidate_notify_cb(
550 						vdev, bssid, index, preauth);
551 
552 	return ret;
553 }
554 
555 QDF_STATUS mlme_cm_osif_send_keys(struct wlan_objmgr_vdev *vdev,
556 				  uint8_t key_index, bool pairwise,
557 				  enum wlan_crypto_cipher_type cipher_type)
558 {
559 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
560 
561 	if (glbl_cm_ops && glbl_cm_ops->mlme_cm_send_keys_cb)
562 		ret = glbl_cm_ops->mlme_cm_send_keys_cb(vdev, key_index,
563 							pairwise,
564 							cipher_type);
565 
566 	return ret;
567 }
568 #endif
569 
570 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
571 QDF_STATUS mlme_cm_osif_roam_start_ind(struct wlan_objmgr_vdev *vdev)
572 {
573 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
574 
575 	if (glbl_cm_ops &&
576 	    glbl_cm_ops->mlme_cm_roam_start_cb)
577 		ret = glbl_cm_ops->mlme_cm_roam_start_cb(vdev);
578 
579 	return ret;
580 }
581 
582 QDF_STATUS mlme_cm_osif_roam_abort_ind(struct wlan_objmgr_vdev *vdev)
583 {
584 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
585 
586 	if (glbl_cm_ops &&
587 	    glbl_cm_ops->mlme_cm_roam_abort_cb)
588 		ret = glbl_cm_ops->mlme_cm_roam_abort_cb(vdev);
589 
590 	return ret;
591 }
592 
593 QDF_STATUS
594 mlme_cm_osif_roam_complete(struct wlan_objmgr_vdev *vdev)
595 {
596 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
597 
598 	if (glbl_cm_ops &&
599 	    glbl_cm_ops->mlme_cm_roam_cmpl_cb)
600 		ret = glbl_cm_ops->mlme_cm_roam_cmpl_cb(vdev);
601 
602 	return ret;
603 }
604 
605 QDF_STATUS
606 mlme_cm_osif_roam_get_scan_params(struct wlan_objmgr_vdev *vdev,
607 				  struct element_info *scan_ie,
608 				  enum dot11_mode_filter *dot11mode_filter)
609 {
610 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
611 
612 	if (glbl_cm_ops &&
613 	    glbl_cm_ops->mlme_cm_roam_get_scan_ie_cb)
614 		ret = glbl_cm_ops->mlme_cm_roam_get_scan_ie_cb(vdev,
615 						scan_ie, dot11mode_filter);
616 
617 	return ret;
618 }
619 
620 #endif
621 
622 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
623 QDF_STATUS
624 mlme_cm_osif_ft_preauth_complete(struct wlan_objmgr_vdev *vdev,
625 				 struct wlan_preauth_rsp *rsp)
626 {
627 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
628 
629 	if (glbl_cm_ops &&
630 	    glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb)
631 		ret = glbl_cm_ops->mlme_cm_ft_preauth_cmpl_cb(vdev, rsp);
632 
633 	return ret;
634 }
635 
636 #ifdef FEATURE_WLAN_ESE
637 QDF_STATUS
638 mlme_cm_osif_cckm_preauth_complete(struct wlan_objmgr_vdev *vdev,
639 				   struct wlan_preauth_rsp *rsp)
640 {
641 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
642 
643 	if (glbl_cm_ops &&
644 	    glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb)
645 		ret = glbl_cm_ops->mlme_cm_cckm_preauth_cmpl_cb(vdev, rsp);
646 
647 	return ret;
648 }
649 #endif
650 #endif
651 
652 void mlme_set_osif_cm_cb(osif_cm_get_global_ops_cb osif_cm_ops)
653 {
654 	glbl_cm_ops_cb = osif_cm_ops;
655 }
656 
657 void mlme_set_osif_twt_cb(osif_twt_get_global_ops_cb osif_twt_ops)
658 {
659 	glbl_twt_ops_cb = osif_twt_ops;
660 }
661 
662 void mlme_set_ops_register_cb(mlme_get_global_ops_cb ops_cb)
663 {
664 	glbl_ops_cb = ops_cb;
665 }
666 
667 bool mlme_max_chan_switch_is_set(struct wlan_objmgr_psoc *psoc)
668 {
669 	struct psoc_mlme_obj *mlme_psoc_obj;
670 	struct psoc_phy_config *phy_config;
671 
672 	if (!psoc)
673 		return false;
674 
675 	mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
676 	if (!mlme_psoc_obj)
677 		return false;
678 
679 	phy_config = &mlme_psoc_obj->psoc_cfg.phy_config;
680 
681 	return phy_config->max_chan_switch_ie;
682 }
683 
684 void mlme_set_osif_vdev_mgr_cb(
685 			osif_vdev_mgr_get_global_ops_cb mlme_vdev_mgr_osif_ops)
686 {
687 	glbl_vdev_mgr_ops_cb = mlme_vdev_mgr_osif_ops;
688 }
689 
690 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
691 QDF_STATUS mlme_vdev_ops_send_set_mac_address(struct qdf_mac_addr mac_addr,
692 					      struct qdf_mac_addr mld_addr,
693 					      struct wlan_objmgr_vdev *vdev)
694 {
695 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
696 
697 	if (glbl_ops && glbl_ops->mlme_vdev_send_set_mac_addr)
698 		ret = glbl_ops->mlme_vdev_send_set_mac_addr(mac_addr, mld_addr,
699 							    vdev);
700 
701 	return ret;
702 }
703 
704 void mlme_vdev_mgr_notify_set_mac_addr_response(uint8_t vdev_id,
705 						uint8_t resp_status)
706 {
707 	if (glbl_vdev_mgr_ops &&
708 	    glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response)
709 		glbl_vdev_mgr_ops->mlme_vdev_mgr_set_mac_addr_response(
710 							vdev_id, resp_status);
711 }
712 #endif
713 
714 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
715 QDF_STATUS
716 mlme_twt_osif_enable_complete_ind(struct wlan_objmgr_psoc *psoc,
717 				  struct twt_enable_complete_event_param *event,
718 				  void *context)
719 {
720 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
721 
722 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_enable_complete_cb)
723 		ret = glbl_twt_ops->mlme_twt_enable_complete_cb(psoc,
724 								event, context);
725 
726 	return ret;
727 }
728 
729 QDF_STATUS
730 mlme_twt_osif_disable_complete_ind(struct wlan_objmgr_psoc *psoc,
731 				 struct twt_disable_complete_event_param *event,
732 				 void *context)
733 {
734 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
735 
736 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_disable_complete_cb)
737 		ret = glbl_twt_ops->mlme_twt_disable_complete_cb(psoc,
738 								event, context);
739 
740 	return ret;
741 }
742 
743 QDF_STATUS
744 mlme_twt_osif_ack_complete_ind(struct wlan_objmgr_psoc *psoc,
745 			       struct twt_ack_complete_event_param *event,
746 			       void *context)
747 {
748 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
749 
750 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_ack_complete_cb)
751 		ret = glbl_twt_ops->mlme_twt_ack_complete_cb(psoc,
752 							     event, context);
753 
754 	return ret;
755 }
756 
757 QDF_STATUS
758 mlme_twt_osif_setup_complete_ind(struct wlan_objmgr_psoc *psoc,
759 				 struct twt_add_dialog_complete_event *event,
760 				 bool renego)
761 {
762 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
763 
764 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_setup_complete_cb)
765 		ret = glbl_twt_ops->mlme_twt_setup_complete_cb(psoc, event,
766 							       renego);
767 
768 	return ret;
769 }
770 
771 QDF_STATUS
772 mlme_twt_osif_teardown_complete_ind(struct wlan_objmgr_psoc *psoc,
773 			    struct twt_del_dialog_complete_event_param *event)
774 {
775 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
776 
777 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_teardown_complete_cb)
778 		ret = glbl_twt_ops->mlme_twt_teardown_complete_cb(psoc, event);
779 
780 	return ret;
781 }
782 
783 QDF_STATUS
784 mlme_twt_osif_pause_complete_ind(struct wlan_objmgr_psoc *psoc,
785 			    struct twt_pause_dialog_complete_event_param *event)
786 {
787 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
788 
789 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_pause_complete_cb)
790 		ret = glbl_twt_ops->mlme_twt_pause_complete_cb(psoc, event);
791 
792 	return ret;
793 }
794 
795 QDF_STATUS
796 mlme_twt_osif_resume_complete_ind(struct wlan_objmgr_psoc *psoc,
797 			   struct twt_resume_dialog_complete_event_param *event)
798 {
799 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
800 
801 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_resume_complete_cb)
802 		ret = glbl_twt_ops->mlme_twt_resume_complete_cb(psoc, event);
803 
804 	return ret;
805 }
806 
807 QDF_STATUS
808 mlme_twt_osif_nudge_complete_ind(struct wlan_objmgr_psoc *psoc,
809 			    struct twt_nudge_dialog_complete_event_param *event)
810 {
811 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
812 
813 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_nudge_complete_cb)
814 		ret = glbl_twt_ops->mlme_twt_nudge_complete_cb(psoc, event);
815 
816 	return ret;
817 }
818 
819 QDF_STATUS
820 mlme_twt_osif_notify_complete_ind(struct wlan_objmgr_psoc *psoc,
821 				  struct twt_notify_event_param *event)
822 {
823 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
824 
825 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_notify_complete_cb)
826 		ret = glbl_twt_ops->mlme_twt_notify_complete_cb(psoc, event);
827 
828 	return ret;
829 }
830 
831 QDF_STATUS
832 mlme_twt_vdev_create_notification(struct wlan_objmgr_vdev *vdev)
833 {
834 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
835 
836 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_create_cb)
837 		ret = glbl_twt_ops->mlme_twt_vdev_create_cb(vdev);
838 
839 	return ret;
840 }
841 
842 QDF_STATUS
843 mlme_twt_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev)
844 {
845 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
846 
847 	if (glbl_twt_ops && glbl_twt_ops->mlme_twt_vdev_destroy_cb)
848 		ret = glbl_twt_ops->mlme_twt_vdev_destroy_cb(vdev);
849 
850 	return ret;
851 }
852 
853 #endif
854 
855 void mlme_vdev_reconfig_timer_cb(void *arg)
856 {
857 	struct vdev_mlme_obj *vdev_mlme;
858 
859 	vdev_mlme = (struct vdev_mlme_obj *)arg;
860 	if (!vdev_mlme)
861 		return;
862 
863 	if ((vdev_mlme->ops) &&
864 	    vdev_mlme->ops->mlme_vdev_reconfig_timer_complete)
865 		vdev_mlme->ops->mlme_vdev_reconfig_timer_complete(vdev_mlme);
866 }
867 
868 bool mlme_mlo_is_reconfig_reassoc_enable(struct wlan_objmgr_psoc *psoc)
869 {
870 	struct psoc_mlme_obj *mlme_psoc_obj;
871 	struct psoc_mlo_config *mlo_config;
872 
873 	if (!psoc)
874 		return false;
875 
876 	mlme_psoc_obj = wlan_psoc_mlme_get_cmpt_obj(psoc);
877 	if (!mlme_psoc_obj)
878 		return false;
879 
880 	mlo_config = &mlme_psoc_obj->psoc_cfg.mlo_config;
881 
882 	return mlo_config->reconfig_reassoc_en;
883 }
884