xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/mlme/src/osif_cm_util.c (revision 70a19e16789e308182f63b15c75decec7bf0b342)
1 /*
2  * Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-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: osif_cm_util.c
20  *
21  * This file maintains definitaions of connect, disconnect, roam
22  * common apis.
23  */
24 #include <include/wlan_mlme_cmn.h>
25 #include "osif_cm_util.h"
26 #include "wlan_osif_priv.h"
27 #include "wlan_cfg80211.h"
28 #include "osif_cm_rsp.h"
29 #include "wlan_cfg80211_scan.h"
30 
31 enum qca_sta_connect_fail_reason_codes
32 osif_cm_mac_to_qca_connect_fail_reason(enum wlan_status_code internal_reason)
33 {
34 	enum qca_sta_connect_fail_reason_codes reason = 0;
35 
36 	if (internal_reason < STATUS_PROP_START)
37 		return reason;
38 
39 	switch (internal_reason) {
40 	case STATUS_NO_NETWORK_FOUND:
41 		reason = QCA_STA_CONNECT_FAIL_REASON_NO_BSS_FOUND;
42 		break;
43 	case STATUS_AUTH_TX_FAIL:
44 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL;
45 		break;
46 	case STATUS_AUTH_NO_ACK_RECEIVED:
47 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED;
48 		break;
49 	case STATUS_AUTH_NO_RESP_RECEIVED:
50 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED;
51 		break;
52 	case STATUS_ASSOC_TX_FAIL:
53 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL;
54 		break;
55 	case STATUS_ASSOC_NO_ACK_RECEIVED:
56 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED;
57 		break;
58 	case STATUS_ASSOC_NO_RESP_RECEIVED:
59 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED;
60 		break;
61 	default:
62 		osif_debug("QCA code not present for internal status code %d",
63 			   internal_reason);
64 	}
65 
66 	return reason;
67 }
68 
69 const char *
70 osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason)
71 {
72 	switch (reason) {
73 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE);
74 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE);
75 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE);
76 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA);
77 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR);
78 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED);
79 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_DEVICE_RECOVERY);
80 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_KEY_TIMEOUT);
81 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE);
82 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_IFACE_DOWN);
83 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL);
84 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_INACTIVITY);
85 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT);
86 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE);
87 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE);
88 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_USER_TRIGGERED);
89 	case QCA_DISCONNECT_REASON_UNSPECIFIED:
90 		return "";
91 	default:
92 		return "Unknown";
93 	}
94 }
95 
96 enum qca_disconnect_reason_codes
97 osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason)
98 {
99 	enum qca_disconnect_reason_codes reason =
100 					QCA_DISCONNECT_REASON_UNSPECIFIED;
101 
102 	if (internal_reason < REASON_PROP_START)
103 		return reason;
104 
105 	switch (internal_reason) {
106 	case REASON_HOST_TRIGGERED_ROAM_FAILURE:
107 	case REASON_FW_TRIGGERED_ROAM_FAILURE:
108 		reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE;
109 		break;
110 	case REASON_USER_TRIGGERED_ROAM_FAILURE:
111 		reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE;
112 		break;
113 	case REASON_GATEWAY_REACHABILITY_FAILURE:
114 		reason =
115 		QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE;
116 		break;
117 	case REASON_UNSUPPORTED_CHANNEL_CSA:
118 		reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA;
119 		break;
120 	case REASON_OPER_CHANNEL_DISABLED_INDOOR:
121 		reason =
122 		QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR;
123 		break;
124 	case REASON_OPER_CHANNEL_USER_DISABLED:
125 		reason =
126 		QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED;
127 		break;
128 	case REASON_DEVICE_RECOVERY:
129 		reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY;
130 		break;
131 	case REASON_KEY_TIMEOUT:
132 		reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT;
133 		break;
134 	case REASON_OPER_CHANNEL_BAND_CHANGE:
135 		reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE;
136 		break;
137 	case REASON_IFACE_DOWN:
138 		reason = QCA_DISCONNECT_REASON_IFACE_DOWN;
139 		break;
140 	case REASON_PEER_XRETRY_FAIL:
141 		reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL;
142 		break;
143 	case REASON_PEER_INACTIVITY:
144 		reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY;
145 		break;
146 	case REASON_SA_QUERY_TIMEOUT:
147 		reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT;
148 		break;
149 	case REASON_CHANNEL_SWITCH_FAILED:
150 		reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE;
151 		break;
152 	case REASON_BEACON_MISSED:
153 		reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE;
154 		break;
155 	default:
156 		osif_debug("No QCA reason code for mac reason: %u",
157 			   internal_reason);
158 		/* Unspecified reason by default */
159 	}
160 
161 	return reason;
162 }
163 
164 static struct osif_cm_ops *osif_cm_legacy_ops;
165 
166 void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv)
167 {
168 	osif_priv->cm_info.last_id = CM_ID_INVALID;
169 	osif_priv->cm_info.last_source = CM_SOURCE_INVALID;
170 }
171 
172 QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev)
173 {
174 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
175 
176 	if (!osif_priv) {
177 		osif_err("Invalid vdev osif priv");
178 		return QDF_STATUS_E_INVAL;
179 	}
180 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
181 	osif_cm_reset_id_and_src_no_lock(osif_priv);
182 	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
183 
184 	return QDF_STATUS_SUCCESS;
185 }
186 
187 /**
188  * osif_cm_connect_complete_cb() - Connect complete callback
189  * @vdev: vdev pointer
190  * @rsp: connect response
191  *
192  * Return: QDF_STATUS
193  */
194 static QDF_STATUS
195 osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
196 			    struct wlan_cm_connect_resp *rsp)
197 {
198 	return osif_connect_handler(vdev, rsp);
199 }
200 
201 /**
202  * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate
203  * @vdev: vdev pointer
204  * @rsp: connect response
205  *
206  * Return: QDF_STATUS
207  */
208 static QDF_STATUS
209 osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev,
210 			    struct wlan_cm_connect_resp *rsp)
211 {
212 	return osif_failed_candidate_handler(vdev, rsp);
213 }
214 
215 /**
216  * osif_cm_update_id_and_src_cb() - Callback to update id and
217  * source of the connect/disconnect request
218  * @vdev: vdev pointer
219  * @Source: Source of the connect req
220  * @id: Connect/disconnect id
221  *
222  * Context: Any context. Takes and releases cmd id spinlock
223  * Return: QDF_STATUS
224  */
225 static QDF_STATUS
226 osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev *vdev,
227 			     enum wlan_cm_source source, wlan_cm_id cm_id)
228 {
229 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
230 
231 	if (!osif_priv) {
232 		osif_err("Invalid vdev osif priv");
233 		return QDF_STATUS_E_INVAL;
234 	}
235 
236 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
237 	osif_priv->cm_info.last_id = cm_id;
238 	osif_priv->cm_info.last_source = source;
239 	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
240 
241 	return QDF_STATUS_SUCCESS;
242 }
243 
244 /**
245  * osif_cm_disconnect_complete_cb() - Disconnect done callback
246  * @vdev: vdev pointer
247  * @disconnect_rsp: Disconnect response
248  *
249  * Context: Any context
250  * Return: QDF_STATUS
251  */
252 
253 static QDF_STATUS
254 osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev *vdev,
255 			       struct wlan_cm_discon_rsp *rsp)
256 {
257 	return osif_disconnect_handler(vdev, rsp);
258 }
259 
260 #ifdef CONN_MGR_ADV_FEATURE
261 void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
262 			struct vdev_osif_priv *osif_priv,
263 			struct qdf_mac_addr *bssid,
264 			uint8_t *ssid, uint8_t ssid_len)
265 {
266 	struct wiphy *wiphy = osif_priv->wdev->wiphy;
267 	struct scan_filter *filter;
268 	QDF_STATUS status;
269 
270 	status = __wlan_cfg80211_unlink_bss_list(wiphy, wlan_vdev_get_pdev(vdev),
271 					bssid->bytes, ssid_len ? ssid : NULL,
272 					ssid_len);
273 	if (QDF_IS_STATUS_ERROR(status))
274 		return;
275 	filter = qdf_mem_malloc(sizeof(*filter));
276 	if (!filter)
277 		return;
278 
279 	filter->num_of_bssid = 1;
280 	qdf_copy_macaddr(&filter->bssid_list[0], bssid);
281 	ucfg_scan_flush_results(wlan_vdev_get_pdev(vdev), filter);
282 	qdf_mem_free(filter);
283 }
284 
285 static QDF_STATUS
286 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
287 {
288 	return osif_cm_netif_queue_ind(vdev,
289 				       WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER,
290 				       WLAN_CONTROL_PATH);
291 }
292 
293 /**
294  * osif_cm_roam_sync_cb() - Roam sync callback
295  * @vdev: vdev pointer
296  *
297  * This callback indicates os_if that roam sync ind received
298  * so that os_if can stop all the activity on this connection
299  *
300  * Return: QDF_STATUS
301  */
302 static QDF_STATUS
303 osif_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev)
304 {
305 	osif_cm_napi_serialize(true);
306 	return osif_cm_netif_queue_ind(vdev,
307 				       WLAN_STOP_ALL_NETIF_QUEUE,
308 				       WLAN_CONTROL_PATH);
309 }
310 
311 /**
312  * @osif_pmksa_candidate_notify_cb: Roam pmksa candidate notify callback
313  * @vdev: vdev pointer
314  * @bssid: bssid
315  * @index: index
316  * @preauth: preauth flag
317  *
318  * Return: QDF_STATUS
319  */
320 static QDF_STATUS
321 osif_pmksa_candidate_notify_cb(struct wlan_objmgr_vdev *vdev,
322 			       struct qdf_mac_addr *bssid,
323 			       int index, bool preauth)
324 {
325 	return osif_pmksa_candidate_notify(vdev, bssid, index, preauth);
326 }
327 
328 /**
329  * osif_cm_send_keys_cb() - Send keys callback
330  * @vdev: vdev pointer
331  *
332  * This callback indicates os_if that
333  * so that os_if can stop all the activity on this connection
334  *
335  * Return: QDF_STATUS
336  */
337 static QDF_STATUS
338 osif_cm_send_keys_cb(struct wlan_objmgr_vdev *vdev, uint8_t key_index,
339 		     bool pairwise, enum wlan_crypto_cipher_type cipher_type)
340 {
341 	return osif_cm_send_vdev_keys(vdev,
342 				       key_index,
343 				       pairwise,
344 				       cipher_type);
345 }
346 #else
347 static inline QDF_STATUS
348 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
349 {
350 	return QDF_STATUS_SUCCESS;
351 }
352 #endif
353 
354 /**
355  * osif_cm_disconnect_start_cb() - Disconnect start callback
356  * @vdev: vdev pointer
357  *
358  * This callback indicates os_if that disconnection is started
359  * so that os_if can stop all the activity on this connection
360  *
361  * Return: QDF_STATUS
362  */
363 static QDF_STATUS
364 osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev)
365 {
366 	/* Disable netif queue on disconnect start */
367 	return osif_cm_disable_netif_queue(vdev);
368 }
369 
370 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
371 /**
372  * osif_cm_roam_start_cb() - Roam start callback
373  * @vdev: vdev pointer
374  *
375  * This callback indicates os_if that roaming has started
376  * so that os_if can stop all the activity on this connection
377  *
378  * Return: QDF_STATUS
379  */
380 static QDF_STATUS
381 osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev)
382 {
383 	return osif_cm_netif_queue_ind(vdev,
384 				       WLAN_STOP_ALL_NETIF_QUEUE,
385 				       WLAN_CONTROL_PATH);
386 }
387 
388 /**
389  * osif_cm_roam_abort_cb() - Roam abort callback
390  * @vdev: vdev pointer
391  *
392  * This callback indicates os_if that roaming has been aborted
393  * so that os_if can resume all the activity on this connection
394  *
395  * Return: QDF_STATUS
396  */
397 static QDF_STATUS
398 osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev)
399 {
400 	osif_cm_napi_serialize(false);
401 	return osif_cm_netif_queue_ind(vdev,
402 				       WLAN_WAKE_ALL_NETIF_QUEUE,
403 				       WLAN_CONTROL_PATH);
404 }
405 
406 /**
407  * osif_cm_roam_cmpl_cb() - Roam sync complete callback
408  * @vdev: vdev pointer
409  * @rsp: connect rsp
410  *
411  * This callback indicates os_if that roam sync is complete
412  * so that os_if can stop all the activity on this connection
413  *
414  * Return: QDF_STATUS
415  */
416 
417 static QDF_STATUS
418 osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev)
419 {
420 	return osif_cm_napi_serialize(false);
421 }
422 
423 /**
424  * osif_cm_get_scan_ie_params() - Function to get scan ie params
425  * @vdev: vdev pointer
426  * @scan_ie: Pointer to scan_ie
427  * @dot11mode_filter: Pointer to dot11mode_filter
428  *
429  * Get scan IE params from adapter corresponds to given vdev
430  *
431  * Return: QDF_STATUS
432  */
433 static QDF_STATUS
434 osif_cm_get_scan_ie_params(struct wlan_objmgr_vdev *vdev,
435 			   struct element_info *scan_ie,
436 			   enum dot11_mode_filter *dot11mode_filter)
437 {
438 	osif_cm_get_scan_ie_params_cb cb = NULL;
439 
440 	if (osif_cm_legacy_ops)
441 		cb = osif_cm_legacy_ops->get_scan_ie_params_cb;
442 	if (cb)
443 		return cb(vdev, scan_ie, dot11mode_filter);
444 
445 	return QDF_STATUS_E_FAILURE;
446 }
447 
448 /**
449  * osif_cm_get_scan_ie_info_cb() - Roam get scan ie params callback
450  * @vdev: vdev pointer
451  * @scan_ie: pointer to scan ie
452  * @dot11mode_filter: pointer to dot11 mode filter
453  *
454  * This callback gets scan ie params from os_if
455  *
456  * Return: QDF_STATUS
457  */
458 
459 static QDF_STATUS
460 osif_cm_get_scan_ie_info_cb(struct wlan_objmgr_vdev *vdev,
461 			    struct element_info *scan_ie,
462 			    enum dot11_mode_filter *dot11mode_filter)
463 {
464 	return osif_cm_get_scan_ie_params(vdev, scan_ie, dot11mode_filter);
465 }
466 #endif
467 
468 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
469 /**
470  * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback
471  * @vdev: vdev pointer
472  * @rsp: preauth response
473  *
474  * This callback indicates os_if that roam ft preauth is complete
475  * so that os_if can send fast transition event
476  *
477  * Return: QDF_STATUS
478  */
479 
480 static QDF_STATUS
481 osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
482 			   struct wlan_preauth_rsp *rsp)
483 {
484 	osif_cm_ft_preauth_complete_cb cb = NULL;
485 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
486 
487 	if (osif_cm_legacy_ops)
488 		cb = osif_cm_legacy_ops->ft_preauth_complete_cb;
489 	if (cb)
490 		ret = cb(vdev, rsp);
491 
492 	return ret;
493 }
494 
495 #ifdef FEATURE_WLAN_ESE
496 /**
497  * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback
498  * @vdev: vdev pointer
499  * @rsp: preauth response
500  *
501  * This callback indicates os_if that roam cckm preauth is complete
502  * so that os_if can send cckm preauth indication to the supplicant
503  * via wireless custom event.
504  *
505  * Return: QDF_STATUS
506  */
507 
508 static QDF_STATUS
509 osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
510 			     struct wlan_preauth_rsp *rsp)
511 {
512 	osif_cm_cckm_preauth_complete_cb cb = NULL;
513 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
514 
515 	if (osif_cm_legacy_ops)
516 		cb = osif_cm_legacy_ops->cckm_preauth_complete_cb;
517 	if (cb)
518 		ret = cb(vdev, rsp);
519 
520 	return ret;
521 }
522 #endif
523 #endif
524 
525 static struct mlme_cm_ops cm_ops = {
526 	.mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb,
527 	.mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb,
528 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
529 	.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
530 	.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
531 #ifdef CONN_MGR_ADV_FEATURE
532 	.mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb,
533 	.mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb,
534 	.mlme_cm_send_keys_cb = osif_cm_send_keys_cb,
535 #endif
536 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
537 	.mlme_cm_roam_start_cb = osif_cm_roam_start_cb,
538 	.mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb,
539 	.mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb,
540 	.mlme_cm_roam_get_scan_ie_cb = osif_cm_get_scan_ie_info_cb,
541 #endif
542 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
543 	.mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb,
544 #ifdef FEATURE_WLAN_ESE
545 	.mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb,
546 #endif
547 #endif
548 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
549 	.mlme_cm_get_vendor_handoff_params_cb =
550 					osif_cm_vendor_handoff_params_cb,
551 #endif
552 };
553 
554 /**
555  * osif_cm_get_global_ops() - Get connection manager global ops
556  *
557  * Return: Connection manager global ops
558  */
559 static struct mlme_cm_ops *osif_cm_get_global_ops(void)
560 {
561 	return &cm_ops;
562 }
563 
564 QDF_STATUS osif_cm_register_cb(void)
565 {
566 	mlme_set_osif_cm_cb(osif_cm_get_global_ops);
567 
568 	return QDF_STATUS_SUCCESS;
569 }
570 
571 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev)
572 {
573 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
574 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
575 
576 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
577 		return QDF_STATUS_SUCCESS;
578 
579 	if (!osif_priv) {
580 		osif_err("Invalid vdev osif priv");
581 		return QDF_STATUS_E_INVAL;
582 	}
583 
584 	qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock);
585 
586 	return QDF_STATUS_SUCCESS;
587 }
588 
589 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
590 {
591 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
592 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
593 
594 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
595 		return QDF_STATUS_SUCCESS;
596 
597 	if (!osif_priv) {
598 		osif_err("Invalid vdev osif priv");
599 		return QDF_STATUS_E_INVAL;
600 	}
601 	qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock);
602 
603 	return QDF_STATUS_SUCCESS;
604 }
605 
606 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
607 				    struct wlan_cm_connect_resp *rsp,
608 				    enum osif_cb_type type)
609 {
610 	osif_cm_connect_comp_cb cb = NULL;
611 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
612 
613 	if (osif_cm_legacy_ops)
614 		cb = osif_cm_legacy_ops->connect_complete_cb;
615 	if (cb)
616 		ret = cb(vdev, rsp, type);
617 
618 	return ret;
619 }
620 
621 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
622 QDF_STATUS osif_cm_vendor_handoff_params_cb(struct wlan_objmgr_psoc *psoc,
623 					    void *vendor_handoff_context)
624 {
625 	osif_cm_get_vendor_handoff_params_cb cb = NULL;
626 
627 	if (osif_cm_legacy_ops)
628 		cb = osif_cm_legacy_ops->vendor_handoff_params_cb;
629 	if (cb)
630 		return cb(psoc, vendor_handoff_context);
631 
632 	return QDF_STATUS_E_FAILURE;
633 }
634 #endif
635 
636 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
637 				       struct wlan_cm_discon_rsp *rsp,
638 				       enum osif_cb_type type)
639 {
640 	osif_cm_disconnect_comp_cb cb = NULL;
641 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
642 
643 	if (osif_cm_legacy_ops)
644 		cb = osif_cm_legacy_ops->disconnect_complete_cb;
645 	if (cb)
646 		ret = cb(vdev, rsp, type);
647 
648 	return ret;
649 }
650 
651 #ifdef CONN_MGR_ADV_FEATURE
652 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev,
653 				   enum netif_action_type action,
654 				   enum netif_reason_type reason)
655 {
656 	osif_cm_netif_queue_ctrl_cb cb = NULL;
657 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
658 
659 	if (osif_cm_legacy_ops)
660 		cb = osif_cm_legacy_ops->netif_queue_control_cb;
661 	if (cb)
662 		ret = cb(vdev, action, reason);
663 
664 	return ret;
665 }
666 
667 QDF_STATUS osif_cm_napi_serialize(bool action)
668 {
669 	os_if_cm_napi_serialize_ctrl_cb cb = NULL;
670 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
671 
672 	if (osif_cm_legacy_ops)
673 		cb = osif_cm_legacy_ops->napi_serialize_control_cb;
674 	if (cb)
675 		ret = cb(action);
676 
677 	return ret;
678 }
679 
680 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev,
681 			    struct wlan_cm_connect_resp *rsp)
682 {
683 	osif_cm_save_gtk_cb cb = NULL;
684 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
685 
686 	if (osif_cm_legacy_ops)
687 		cb = osif_cm_legacy_ops->save_gtk_cb;
688 	if (cb)
689 		ret = cb(vdev, rsp);
690 
691 	return ret;
692 }
693 
694 QDF_STATUS
695 osif_cm_send_vdev_keys(struct wlan_objmgr_vdev *vdev,
696 		       uint8_t key_index,
697 		       bool pairwise,
698 		       enum wlan_crypto_cipher_type cipher_type)
699 {
700 	osif_cm_send_vdev_keys_cb cb = NULL;
701 
702 	if (osif_cm_legacy_ops)
703 		cb = osif_cm_legacy_ops->send_vdev_keys_cb;
704 	if (cb)
705 		return cb(vdev, key_index, pairwise, cipher_type);
706 
707 	return QDF_STATUS_E_FAILURE;
708 }
709 #endif
710 
711 #ifdef WLAN_FEATURE_FILS_SK
712 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev,
713 				struct wlan_objmgr_vdev *vdev,
714 				struct wlan_cm_connect_resp *rsp)
715 {
716 	osif_cm_set_hlp_data_cb cb = NULL;
717 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
718 
719 	if (osif_cm_legacy_ops)
720 		cb = osif_cm_legacy_ops->set_hlp_data_cb;
721 	if (cb)
722 		ret = cb(dev, vdev, rsp);
723 
724 	return ret;
725 }
726 #endif
727 
728 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops)
729 {
730 	osif_cm_legacy_ops = osif_legacy_ops;
731 }
732 
733 void osif_cm_reset_legacy_cb(void)
734 {
735 	osif_cm_legacy_ops = NULL;
736 }
737