xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021 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 
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_CSA_COMPLETE);
54 	default:
55 		return "Unknown";
56 	}
57 }
58 
59 #if defined WLAN_MBSS
60 QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
61 				     enum wlan_if_mgr_evt event,
62 				     struct if_mgr_event_data *event_data)
63 {
64 	QDF_STATUS status;
65 
66 	switch (event) {
67 	case WLAN_IF_MGR_EV_AP_START_ACS:
68 		status = if_mgr_ap_start_acs(vdev, event_data);
69 		break;
70 	case WLAN_IF_MGR_EV_AP_STOP_ACS:
71 		status = if_mgr_ap_stop_acs(vdev, event_data);
72 		break;
73 	case WLAN_IF_MGR_EV_AP_CANCEL_ACS:
74 		status = if_mgr_ap_cancel_acs(vdev, event_data);
75 		break;
76 	case WLAN_IF_MGR_EV_AP_DONE_ACS:
77 		status = if_mgr_ap_done_acs(vdev, event_data);
78 		break;
79 	case WLAN_IF_MGR_EV_AP_START_HT40:
80 		status = if_mgr_ap_start_ht40(vdev, event_data);
81 		break;
82 	case WLAN_IF_MGR_EV_AP_STOP_HT40:
83 		status = if_mgr_ap_stop_ht40(vdev, event_data);
84 		break;
85 	case WLAN_IF_MGR_EV_AP_DONE_HT40:
86 		status = if_mgr_ap_done_ht40(vdev, event_data);
87 		break;
88 	case WLAN_IF_MGR_EV_AP_CANCEL_HT40:
89 		status = if_mgr_ap_cancel_ht40(vdev, event_data);
90 		break;
91 	default:
92 		status = QDF_STATUS_E_INVAL;
93 		ifmgr_err("Invalid event");
94 		break;
95 	}
96 	return status;
97 }
98 #else
99 QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
100 				     enum wlan_if_mgr_evt event,
101 				     struct if_mgr_event_data *event_data)
102 {
103 	QDF_STATUS status;
104 
105 	switch (event) {
106 	default:
107 		status = QDF_STATUS_E_INVAL;
108 		ifmgr_err("Invalid event");
109 		break;
110 	}
111 
112 	return status;
113 }
114 #endif
115 
116 QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
117 				enum wlan_if_mgr_evt event,
118 				struct if_mgr_event_data *event_data)
119 {
120 	struct wlan_objmgr_psoc *psoc;
121 	QDF_STATUS status;
122 
123 	psoc = wlan_vdev_get_psoc(vdev);
124 	if (!psoc)
125 		return QDF_STATUS_E_FAILURE;
126 
127 	ifmgr_debug("IF MGR event received: %s(%d)",
128 		    if_mgr_get_event_str(event), event);
129 
130 	switch (event) {
131 	case WLAN_IF_MGR_EV_CONNECT_START:
132 		status = if_mgr_connect_start(vdev, event_data);
133 		break;
134 	case WLAN_IF_MGR_EV_CONNECT_COMPLETE:
135 		status = if_mgr_connect_complete(vdev, event_data);
136 		break;
137 	case WLAN_IF_MGR_EV_AP_START_BSS:
138 		status = if_mgr_ap_start_bss(vdev, event_data);
139 		break;
140 	case WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE:
141 		status = if_mgr_ap_start_bss_complete(vdev, event_data);
142 		break;
143 	case WLAN_IF_MGR_EV_AP_STOP_BSS:
144 		status = if_mgr_ap_stop_bss(vdev, event_data);
145 		break;
146 	case WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE:
147 		status = if_mgr_ap_stop_bss_complete(vdev, event_data);
148 		break;
149 	case WLAN_IF_MGR_EV_DISCONNECT_START:
150 		status = if_mgr_disconnect_start(vdev, event_data);
151 		break;
152 	case WLAN_IF_MGR_EV_DISCONNECT_COMPLETE:
153 		status = if_mgr_disconnect_complete(vdev, event_data);
154 		break;
155 	case WLAN_IF_MGR_EV_VALIDATE_CANDIDATE:
156 		status = if_mgr_validate_candidate(vdev, event_data);
157 		break;
158 	case WLAN_IF_MGR_EV_CSA_COMPLETE:
159 		status = if_mgr_csa_complete(vdev, event_data);
160 		break;
161 	default:
162 		status = if_mgr_deliver_mbss_event(vdev, event, event_data);
163 	}
164 
165 	return status;
166 }
167