xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/mlme/src/osif_cm_util.c (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
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  * @cm_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  * @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  * @key_index: key index
332  * @pairwise: true if pairwise
333  * @cipher_type: cipher type
334  *
335  * This callback indicates os_if that
336  * so that os_if can stop all the activity on this connection
337  *
338  * Return: QDF_STATUS
339  */
340 static QDF_STATUS
341 osif_cm_send_keys_cb(struct wlan_objmgr_vdev *vdev, uint8_t key_index,
342 		     bool pairwise, enum wlan_crypto_cipher_type cipher_type)
343 {
344 	return osif_cm_send_vdev_keys(vdev,
345 				       key_index,
346 				       pairwise,
347 				       cipher_type);
348 }
349 #else
350 static inline QDF_STATUS
351 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
352 {
353 	return QDF_STATUS_SUCCESS;
354 }
355 #endif
356 
357 /**
358  * osif_cm_disconnect_start_cb() - Disconnect start callback
359  * @vdev: vdev pointer
360  *
361  * This callback indicates os_if that disconnection is started
362  * so that os_if can stop all the activity on this connection
363  *
364  * Return: QDF_STATUS
365  */
366 static QDF_STATUS
367 osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev)
368 {
369 	/* Disable netif queue on disconnect start */
370 	return osif_cm_disable_netif_queue(vdev);
371 }
372 
373 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
374 /**
375  * osif_cm_roam_start_cb() - Roam start callback
376  * @vdev: vdev pointer
377  *
378  * This callback indicates os_if that roaming has started
379  * so that os_if can stop all the activity on this connection
380  *
381  * Return: QDF_STATUS
382  */
383 static QDF_STATUS
384 osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev)
385 {
386 	return osif_cm_netif_queue_ind(vdev,
387 				       WLAN_STOP_ALL_NETIF_QUEUE,
388 				       WLAN_CONTROL_PATH);
389 }
390 
391 /**
392  * osif_cm_roam_abort_cb() - Roam abort callback
393  * @vdev: vdev pointer
394  *
395  * This callback indicates os_if that roaming has been aborted
396  * so that os_if can resume all the activity on this connection
397  *
398  * Return: QDF_STATUS
399  */
400 static QDF_STATUS
401 osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev)
402 {
403 	osif_cm_napi_serialize(false);
404 	return osif_cm_netif_queue_ind(vdev,
405 				       WLAN_WAKE_ALL_NETIF_QUEUE,
406 				       WLAN_CONTROL_PATH);
407 }
408 
409 /**
410  * osif_cm_roam_cmpl_cb() - Roam sync complete callback
411  * @vdev: vdev pointer
412  *
413  * This callback indicates os_if that roam sync is complete
414  * so that os_if can stop all the activity on this connection
415  *
416  * Return: QDF_STATUS
417  */
418 
419 static QDF_STATUS
420 osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev)
421 {
422 	return osif_cm_napi_serialize(false);
423 }
424 
425 /**
426  * osif_cm_get_scan_ie_params() - Function to get scan ie params
427  * @vdev: vdev pointer
428  * @scan_ie: Pointer to scan_ie
429  * @dot11mode_filter: Pointer to dot11mode_filter
430  *
431  * Get scan IE params from adapter corresponds to given vdev
432  *
433  * Return: QDF_STATUS
434  */
435 static QDF_STATUS
436 osif_cm_get_scan_ie_params(struct wlan_objmgr_vdev *vdev,
437 			   struct element_info *scan_ie,
438 			   enum dot11_mode_filter *dot11mode_filter)
439 {
440 	osif_cm_get_scan_ie_params_cb cb = NULL;
441 
442 	if (osif_cm_legacy_ops)
443 		cb = osif_cm_legacy_ops->get_scan_ie_params_cb;
444 	if (cb)
445 		return cb(vdev, scan_ie, dot11mode_filter);
446 
447 	return QDF_STATUS_E_FAILURE;
448 }
449 
450 /**
451  * osif_cm_get_scan_ie_info_cb() - Roam get scan ie params callback
452  * @vdev: vdev pointer
453  * @scan_ie: pointer to scan ie
454  * @dot11mode_filter: pointer to dot11 mode filter
455  *
456  * This callback gets scan ie params from os_if
457  *
458  * Return: QDF_STATUS
459  */
460 
461 static QDF_STATUS
462 osif_cm_get_scan_ie_info_cb(struct wlan_objmgr_vdev *vdev,
463 			    struct element_info *scan_ie,
464 			    enum dot11_mode_filter *dot11mode_filter)
465 {
466 	return osif_cm_get_scan_ie_params(vdev, scan_ie, dot11mode_filter);
467 }
468 #endif
469 
470 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
471 /**
472  * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback
473  * @vdev: vdev pointer
474  * @rsp: preauth response
475  *
476  * This callback indicates os_if that roam ft preauth is complete
477  * so that os_if can send fast transition event
478  *
479  * Return: QDF_STATUS
480  */
481 
482 static QDF_STATUS
483 osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
484 			   struct wlan_preauth_rsp *rsp)
485 {
486 	osif_cm_ft_preauth_complete_cb cb = NULL;
487 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
488 
489 	if (osif_cm_legacy_ops)
490 		cb = osif_cm_legacy_ops->ft_preauth_complete_cb;
491 	if (cb)
492 		ret = cb(vdev, rsp);
493 
494 	return ret;
495 }
496 
497 #ifdef FEATURE_WLAN_ESE
498 /**
499  * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback
500  * @vdev: vdev pointer
501  * @rsp: preauth response
502  *
503  * This callback indicates os_if that roam cckm preauth is complete
504  * so that os_if can send cckm preauth indication to the supplicant
505  * via wireless custom event.
506  *
507  * Return: QDF_STATUS
508  */
509 
510 static QDF_STATUS
511 osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
512 			     struct wlan_preauth_rsp *rsp)
513 {
514 	osif_cm_cckm_preauth_complete_cb cb = NULL;
515 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
516 
517 	if (osif_cm_legacy_ops)
518 		cb = osif_cm_legacy_ops->cckm_preauth_complete_cb;
519 	if (cb)
520 		ret = cb(vdev, rsp);
521 
522 	return ret;
523 }
524 #endif
525 #endif
526 
527 static struct mlme_cm_ops cm_ops = {
528 	.mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb,
529 	.mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb,
530 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
531 	.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
532 	.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
533 #ifdef CONN_MGR_ADV_FEATURE
534 	.mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb,
535 	.mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb,
536 	.mlme_cm_send_keys_cb = osif_cm_send_keys_cb,
537 #endif
538 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
539 	.mlme_cm_roam_start_cb = osif_cm_roam_start_cb,
540 	.mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb,
541 	.mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb,
542 	.mlme_cm_roam_get_scan_ie_cb = osif_cm_get_scan_ie_info_cb,
543 #endif
544 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
545 	.mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb,
546 #ifdef FEATURE_WLAN_ESE
547 	.mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb,
548 #endif
549 #endif
550 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
551 	.mlme_cm_get_vendor_handoff_params_cb =
552 					osif_cm_vendor_handoff_params_cb,
553 #endif
554 };
555 
556 /**
557  * osif_cm_get_global_ops() - Get connection manager global ops
558  *
559  * Return: Connection manager global ops
560  */
561 static struct mlme_cm_ops *osif_cm_get_global_ops(void)
562 {
563 	return &cm_ops;
564 }
565 
566 QDF_STATUS osif_cm_register_cb(void)
567 {
568 	mlme_set_osif_cm_cb(osif_cm_get_global_ops);
569 
570 	return QDF_STATUS_SUCCESS;
571 }
572 
573 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev)
574 {
575 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
576 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
577 
578 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
579 		return QDF_STATUS_SUCCESS;
580 
581 	if (!osif_priv) {
582 		osif_err("Invalid vdev osif priv");
583 		return QDF_STATUS_E_INVAL;
584 	}
585 
586 	qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock);
587 
588 	return QDF_STATUS_SUCCESS;
589 }
590 
591 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
592 {
593 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
594 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
595 
596 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
597 		return QDF_STATUS_SUCCESS;
598 
599 	if (!osif_priv) {
600 		osif_err("Invalid vdev osif priv");
601 		return QDF_STATUS_E_INVAL;
602 	}
603 	qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock);
604 
605 	return QDF_STATUS_SUCCESS;
606 }
607 
608 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
609 				    struct wlan_cm_connect_resp *rsp,
610 				    enum osif_cb_type type)
611 {
612 	osif_cm_connect_comp_cb cb = NULL;
613 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
614 
615 	if (osif_cm_legacy_ops)
616 		cb = osif_cm_legacy_ops->connect_complete_cb;
617 	if (cb)
618 		ret = cb(vdev, rsp, type);
619 
620 	return ret;
621 }
622 
623 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
624 QDF_STATUS osif_cm_vendor_handoff_params_cb(struct wlan_objmgr_psoc *psoc,
625 					    void *vendor_handoff_context)
626 {
627 	osif_cm_get_vendor_handoff_params_cb cb = NULL;
628 
629 	if (osif_cm_legacy_ops)
630 		cb = osif_cm_legacy_ops->vendor_handoff_params_cb;
631 	if (cb)
632 		return cb(psoc, vendor_handoff_context);
633 
634 	return QDF_STATUS_E_FAILURE;
635 }
636 #endif
637 
638 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
639 				       struct wlan_cm_discon_rsp *rsp,
640 				       enum osif_cb_type type)
641 {
642 	osif_cm_disconnect_comp_cb cb = NULL;
643 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
644 
645 	if (osif_cm_legacy_ops)
646 		cb = osif_cm_legacy_ops->disconnect_complete_cb;
647 	if (cb)
648 		ret = cb(vdev, rsp, type);
649 
650 	return ret;
651 }
652 
653 #ifdef CONN_MGR_ADV_FEATURE
654 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev,
655 				   enum netif_action_type action,
656 				   enum netif_reason_type reason)
657 {
658 	osif_cm_netif_queue_ctrl_cb cb = NULL;
659 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
660 
661 	if (osif_cm_legacy_ops)
662 		cb = osif_cm_legacy_ops->netif_queue_control_cb;
663 	if (cb)
664 		ret = cb(vdev, action, reason);
665 
666 	return ret;
667 }
668 
669 QDF_STATUS osif_cm_napi_serialize(bool action)
670 {
671 	os_if_cm_napi_serialize_ctrl_cb cb = NULL;
672 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
673 
674 	if (osif_cm_legacy_ops)
675 		cb = osif_cm_legacy_ops->napi_serialize_control_cb;
676 	if (cb)
677 		ret = cb(action);
678 
679 	return ret;
680 }
681 
682 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev,
683 			    struct wlan_cm_connect_resp *rsp)
684 {
685 	osif_cm_save_gtk_cb cb = NULL;
686 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
687 
688 	if (osif_cm_legacy_ops)
689 		cb = osif_cm_legacy_ops->save_gtk_cb;
690 	if (cb)
691 		ret = cb(vdev, rsp);
692 
693 	return ret;
694 }
695 
696 QDF_STATUS
697 osif_cm_send_vdev_keys(struct wlan_objmgr_vdev *vdev,
698 		       uint8_t key_index,
699 		       bool pairwise,
700 		       enum wlan_crypto_cipher_type cipher_type)
701 {
702 	osif_cm_send_vdev_keys_cb cb = NULL;
703 
704 	if (osif_cm_legacy_ops)
705 		cb = osif_cm_legacy_ops->send_vdev_keys_cb;
706 	if (cb)
707 		return cb(vdev, key_index, pairwise, cipher_type);
708 
709 	return QDF_STATUS_E_FAILURE;
710 }
711 #endif
712 
713 #ifdef WLAN_FEATURE_FILS_SK
714 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev,
715 				struct wlan_objmgr_vdev *vdev,
716 				struct wlan_cm_connect_resp *rsp)
717 {
718 	osif_cm_set_hlp_data_cb cb = NULL;
719 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
720 
721 	if (osif_cm_legacy_ops)
722 		cb = osif_cm_legacy_ops->set_hlp_data_cb;
723 	if (cb)
724 		ret = cb(dev, vdev, rsp);
725 
726 	return ret;
727 }
728 #endif
729 
730 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops)
731 {
732 	osif_cm_legacy_ops = osif_legacy_ops;
733 }
734 
735 void osif_cm_reset_legacy_cb(void)
736 {
737 	osif_cm_legacy_ops = NULL;
738 }
739