xref: /wlan-driver/qca-wifi-host-cmn/umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1 /*
2  * Copyright (c) 2020-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: contains interface manager public api
20  */
21 #include "wlan_if_mgr_public_struct.h"
22 #include "wlan_if_mgr_api.h"
23 #include "wlan_if_mgr_sta.h"
24 #include "wlan_if_mgr_ap.h"
25 #include "wlan_if_mgr_main.h"
26 #if !defined WLAN_MBSS
27 #include "wlan_if_mgr_roam.h"
28 #endif
29 
if_mgr_get_event_str(enum wlan_if_mgr_evt event)30 const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event)
31 {
32 	if (event > WLAN_IF_MGR_EV_MAX)
33 		return "";
34 
35 	switch (event) {
36 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_START);
37 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_COMPLETE);
38 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_START);
39 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_COMPLETE);
40 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_VALIDATE_CANDIDATE);
41 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS);
42 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE);
43 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS);
44 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE);
45 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_ACS);
46 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_ACS);
47 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_ACS);
48 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_ACS);
49 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_HT40);
50 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_HT40);
51 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_HT40);
52 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_HT40);
53 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CSA_START);
54 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CSA_COMPLETE);
55 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_STA_CSA_COMPLETE);
56 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_ACTIVE);
57 	default:
58 		return "Unknown";
59 	}
60 }
61 
62 #if defined WLAN_MBSS
if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev * vdev,enum wlan_if_mgr_evt event,struct if_mgr_event_data * event_data)63 QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
64 				     enum wlan_if_mgr_evt event,
65 				     struct if_mgr_event_data *event_data)
66 {
67 	QDF_STATUS status;
68 
69 	switch (event) {
70 	case WLAN_IF_MGR_EV_AP_START_ACS:
71 		status = if_mgr_ap_start_acs(vdev, event_data);
72 		break;
73 	case WLAN_IF_MGR_EV_AP_STOP_ACS:
74 		status = if_mgr_ap_stop_acs(vdev, event_data);
75 		break;
76 	case WLAN_IF_MGR_EV_AP_CANCEL_ACS:
77 		status = if_mgr_ap_cancel_acs(vdev, event_data);
78 		break;
79 	case WLAN_IF_MGR_EV_AP_DONE_ACS:
80 		status = if_mgr_ap_done_acs(vdev, event_data);
81 		break;
82 	case WLAN_IF_MGR_EV_AP_START_HT40:
83 		status = if_mgr_ap_start_ht40(vdev, event_data);
84 		break;
85 	case WLAN_IF_MGR_EV_AP_STOP_HT40:
86 		status = if_mgr_ap_stop_ht40(vdev, event_data);
87 		break;
88 	case WLAN_IF_MGR_EV_AP_DONE_HT40:
89 		status = if_mgr_ap_done_ht40(vdev, event_data);
90 		break;
91 	case WLAN_IF_MGR_EV_AP_CANCEL_HT40:
92 		status = if_mgr_ap_cancel_ht40(vdev, event_data);
93 		break;
94 	default:
95 		status = QDF_STATUS_E_INVAL;
96 		ifmgr_err("Invalid event");
97 		break;
98 	}
99 	return status;
100 }
101 #else
if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev * vdev,enum wlan_if_mgr_evt event,struct if_mgr_event_data * event_data)102 QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
103 				     enum wlan_if_mgr_evt event,
104 				     struct if_mgr_event_data *event_data)
105 {
106 	QDF_STATUS status;
107 
108 	switch (event) {
109 	default:
110 		status = QDF_STATUS_E_INVAL;
111 		ifmgr_err("Invalid event");
112 		break;
113 	}
114 
115 	return status;
116 }
117 #endif
118 
if_mgr_deliver_event(struct wlan_objmgr_vdev * vdev,enum wlan_if_mgr_evt event,struct if_mgr_event_data * event_data)119 QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
120 				enum wlan_if_mgr_evt event,
121 				struct if_mgr_event_data *event_data)
122 {
123 	struct wlan_objmgr_psoc *psoc;
124 	QDF_STATUS status;
125 
126 	psoc = wlan_vdev_get_psoc(vdev);
127 	if (!psoc)
128 		return QDF_STATUS_E_FAILURE;
129 
130 	ifmgr_debug("IF MGR event received: %s(%d)",
131 		    if_mgr_get_event_str(event), event);
132 
133 	switch (event) {
134 	case WLAN_IF_MGR_EV_CONNECT_START:
135 		status = if_mgr_connect_start(vdev, event_data);
136 		break;
137 	case WLAN_IF_MGR_EV_CONNECT_COMPLETE:
138 		status = if_mgr_connect_complete(vdev, event_data);
139 		break;
140 	case WLAN_IF_MGR_EV_AP_START_BSS:
141 		status = if_mgr_ap_start_bss(vdev, event_data);
142 		break;
143 	case WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE:
144 		status = if_mgr_ap_start_bss_complete(vdev, event_data);
145 		break;
146 	case WLAN_IF_MGR_EV_AP_STOP_BSS:
147 		status = if_mgr_ap_stop_bss(vdev, event_data);
148 		break;
149 	case WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE:
150 		status = if_mgr_ap_stop_bss_complete(vdev, event_data);
151 		break;
152 	case WLAN_IF_MGR_EV_DISCONNECT_START:
153 		status = if_mgr_disconnect_start(vdev, event_data);
154 		break;
155 	case WLAN_IF_MGR_EV_DISCONNECT_COMPLETE:
156 		status = if_mgr_disconnect_complete(vdev, event_data);
157 		break;
158 	case WLAN_IF_MGR_EV_VALIDATE_CANDIDATE:
159 		status = if_mgr_validate_candidate(vdev, event_data);
160 		break;
161 	case WLAN_IF_MGR_EV_AP_CSA_START:
162 		status = if_mgr_ap_csa_start(vdev, event_data);
163 		break;
164 	case WLAN_IF_MGR_EV_AP_CSA_COMPLETE:
165 		status = if_mgr_ap_csa_complete(vdev, event_data);
166 		break;
167 	case WLAN_IF_MGR_EV_STA_CSA_COMPLETE:
168 		status = if_mgr_sta_csa_complete(vdev, event_data);
169 		break;
170 	case WLAN_IF_MGR_EV_CONNECT_ACTIVE:
171 		status = if_mgr_connect_active(vdev, event_data);
172 		break;
173 
174 	default:
175 		status = if_mgr_deliver_mbss_event(vdev, event, event_data);
176 	}
177 
178 	return status;
179 }
180