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