1 /*
2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <mutex>
17 #include "wifi_ap_hal_interface.h"
18 #include "hal_device_manage.h"
19 #include "wifi_log.h"
20 #include "wifi_error_no.h"
21
22 #undef LOG_TAG
23 #define LOG_TAG "WifiApHalInterface"
24
25 namespace OHOS {
26 namespace Wifi {
27 static IWifiApMonitorEventCallback g_cb = {nullptr, nullptr};
GetInstance(void)28 WifiApHalInterface &WifiApHalInterface::GetInstance(void)
29 {
30 static WifiApHalInterface inst;
31 static int initFlag = 0;
32 static std::mutex initMutex;
33 if (initFlag == 0) {
34 std::unique_lock<std::mutex> lock(initMutex);
35 if (initFlag == 0) {
36 #ifdef HDI_WPA_INTERFACE_SUPPORT
37 if (inst.InitHdiWpaClient()) {
38 initFlag = 1;
39 }
40 #endif
41 }
42 }
43 return inst;
44 }
45
StartAp(int id,const std::string & ifaceName)46 WifiErrorNo WifiApHalInterface::StartAp(int id, const std::string &ifaceName)
47 {
48 WifiErrorNo ret = WIFI_HAL_OPT_FAILED;
49 #ifdef HDI_WPA_INTERFACE_SUPPORT
50 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
51 ret = mHdiWpaClient->StartAp(id, ifaceName);
52 #endif
53 return ret;
54 }
55
StopAp(int id)56 WifiErrorNo WifiApHalInterface::StopAp(int id)
57 {
58 WifiErrorNo ret = WIFI_HAL_OPT_FAILED;
59 #ifdef HDI_WPA_INTERFACE_SUPPORT
60 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
61 ret = mHdiWpaClient->StopAp(id);
62 #endif
63 return ret;
64 }
65
SetSoftApConfig(const std::string & ifName,const HotspotConfig & config,int id)66 WifiErrorNo WifiApHalInterface::SetSoftApConfig(const std::string &ifName, const HotspotConfig &config, int id)
67 {
68 #ifdef HDI_WPA_INTERFACE_SUPPORT
69 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
70 return mHdiWpaClient->SetSoftApConfig(ifName, config, id);
71 #endif
72 return WIFI_HAL_OPT_FAILED;
73 }
74
SetMaxConnectNum(const std::string & ifName,int32_t channel,int32_t maxConn)75 WifiErrorNo WifiApHalInterface::SetMaxConnectNum(const std::string &ifName, int32_t channel, int32_t maxConn)
76 {
77 #ifdef HDI_WPA_INTERFACE_SUPPORT
78 if (!HalDeviceManager::GetInstance().SetMaxConnectNum(ifName, channel, maxConn)) {
79 return WIFI_HAL_OPT_FAILED;
80 }
81 return WIFI_HAL_OPT_OK;
82 #endif
83 return WIFI_HAL_OPT_FAILED;
84 }
85
EnableAp(int id)86 WifiErrorNo WifiApHalInterface::EnableAp(int id)
87 {
88 #ifdef HDI_WPA_INTERFACE_SUPPORT
89 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
90 return mHdiWpaClient->EnableAp(id);
91 #endif
92 return WIFI_HAL_OPT_FAILED;
93 }
94
SetApPasswd(const char * pass,int id)95 WifiErrorNo WifiApHalInterface::SetApPasswd(const char *pass, int id)
96 {
97 #ifdef HDI_WPA_INTERFACE_SUPPORT
98 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
99 return mHdiWpaClient->SetApPasswd(pass, id);
100 #endif
101 return WIFI_HAL_OPT_FAILED;
102 }
103
GetStationList(std::vector<std::string> & result,int id)104 WifiErrorNo WifiApHalInterface::GetStationList(std::vector<std::string> &result, int id)
105 {
106 #ifdef HDI_WPA_INTERFACE_SUPPORT
107 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
108 return mHdiWpaClient->GetStationList(result, id);
109 #endif
110 return WIFI_HAL_OPT_FAILED;
111 }
112
SetSoftApBlockList(const std::string & ifaceName,const std::vector<std::string> & blockList)113 WifiErrorNo WifiApHalInterface::SetSoftApBlockList(const std::string &ifaceName,
114 const std::vector<std::string> &blockList)
115 {
116 #ifdef HDI_CHIP_INTERFACE_SUPPORT
117 if (!HalDeviceManager::GetInstance().SetBlockList(ifaceName, ifaceName, blockList)) {
118 return WIFI_HAL_OPT_FAILED;
119 }
120 return WIFI_HAL_OPT_OK;
121 #endif
122 return WIFI_HAL_OPT_FAILED;
123 }
124
DisAssociateSta(const std::string & ifaceName,const std::string & mac)125 WifiErrorNo WifiApHalInterface::DisAssociateSta(const std::string &ifaceName, const std::string &mac)
126 {
127 #ifdef HDI_CHIP_INTERFACE_SUPPORT
128 if (!HalDeviceManager::GetInstance().DisAssociateSta(ifaceName, ifaceName, mac)) {
129 return WIFI_HAL_OPT_FAILED;
130 }
131 return WIFI_HAL_OPT_OK;
132 #endif
133 return WIFI_HAL_OPT_FAILED;
134 }
135
AddBlockByMac(const std::string & mac,int id)136 WifiErrorNo WifiApHalInterface::AddBlockByMac(const std::string &mac, int id)
137 {
138 #ifdef HDI_WPA_INTERFACE_SUPPORT
139 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
140 return mHdiWpaClient->AddBlockByMac(mac, id);
141 #endif
142 return WIFI_HAL_OPT_FAILED;
143 }
144
DelBlockByMac(const std::string & mac,int id)145 WifiErrorNo WifiApHalInterface::DelBlockByMac(const std::string &mac, int id)
146 {
147 #ifdef HDI_WPA_INTERFACE_SUPPORT
148 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
149 return mHdiWpaClient->DelBlockByMac(mac, id);
150 #endif
151 return WIFI_HAL_OPT_FAILED;
152 }
153
RemoveStation(const std::string & mac,int id)154 WifiErrorNo WifiApHalInterface::RemoveStation(const std::string &mac, int id)
155 {
156 #ifdef HDI_WPA_INTERFACE_SUPPORT
157 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
158 return mHdiWpaClient->RemoveStation(mac, id);
159 #endif
160 return WIFI_HAL_OPT_FAILED;
161 }
162
GetFrequenciesByBand(const std::string & ifaceName,int band,std::vector<int> & frequencies)163 WifiErrorNo WifiApHalInterface::GetFrequenciesByBand(const std::string &ifaceName, int band,
164 std::vector<int> &frequencies)
165 {
166 #ifdef HDI_CHIP_INTERFACE_SUPPORT
167 if (!HalDeviceManager::GetInstance().GetFrequenciesByBand(ifaceName, band, frequencies)) {
168 return WIFI_HAL_OPT_FAILED;
169 }
170 return WIFI_HAL_OPT_OK;
171 #endif
172 return WIFI_HAL_OPT_FAILED;
173 }
174
RegisterApEvent(IWifiApMonitorEventCallback callback,int id)175 WifiErrorNo WifiApHalInterface::RegisterApEvent(IWifiApMonitorEventCallback callback, int id)
176 {
177 WifiErrorNo err = WIFI_HAL_OPT_FAILED;
178 #ifdef HDI_WPA_INTERFACE_SUPPORT
179 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
180 err = mHdiWpaClient->RegisterApEvent(callback, id);
181 #endif
182 if (err == WIFI_HAL_OPT_OK || callback.onStaJoinOrLeave == nullptr) {
183 mApCallback[id] = callback;
184 }
185 return err;
186 }
187
SetWifiCountryCode(const std::string & ifaceName,const std::string & code)188 WifiErrorNo WifiApHalInterface::SetWifiCountryCode(const std::string &ifaceName, const std::string &code)
189 {
190 #ifdef HDI_CHIP_INTERFACE_SUPPORT
191 if (!HalDeviceManager::GetInstance().SetWifiCountryCode(ifaceName, code)) {
192 return WIFI_HAL_OPT_FAILED;
193 }
194 return WIFI_HAL_OPT_OK;
195 #endif
196 return WIFI_HAL_OPT_FAILED;
197 }
198
DisconnectStaByMac(const std::string & mac,int id)199 WifiErrorNo WifiApHalInterface::DisconnectStaByMac(const std::string &mac, int id)
200 {
201 #ifdef HDI_WPA_INTERFACE_SUPPORT
202 CHECK_NULL_AND_RETURN(mHdiWpaClient, WIFI_HAL_OPT_FAILED);
203 return mHdiWpaClient->ReqDisconnectStaByMac(mac, id);
204 #endif
205 return WIFI_HAL_OPT_FAILED;
206 }
207
GetApCallbackInst(int id) const208 const IWifiApMonitorEventCallback &WifiApHalInterface::GetApCallbackInst(int id) const
209 {
210 auto iter = mApCallback.find(id);
211 if (iter != mApCallback.end()) {
212 return iter->second;
213 }
214 return g_cb;
215 }
216
GetPowerModel(const std::string & ifaceName,int & model)217 WifiErrorNo WifiApHalInterface::GetPowerModel(const std::string &ifaceName, int& model)
218 {
219 #ifdef HDI_CHIP_INTERFACE_SUPPORT
220 if (!HalDeviceManager::GetInstance().GetPowerModel(ifaceName, model)) {
221 return WIFI_HAL_OPT_FAILED;
222 }
223 return WIFI_HAL_OPT_OK;
224 #endif
225 return WIFI_HAL_OPT_FAILED;
226 }
227
SetPowerModel(const std::string & ifaceName,int model)228 WifiErrorNo WifiApHalInterface::SetPowerModel(const std::string &ifaceName, int model)
229 {
230 #ifdef HDI_CHIP_INTERFACE_SUPPORT
231 if (!HalDeviceManager::GetInstance().SetPowerModel(ifaceName, model)) {
232 return WIFI_HAL_OPT_FAILED;
233 }
234 return WIFI_HAL_OPT_OK;
235 #endif
236 return WIFI_HAL_OPT_FAILED;
237 }
238
SetConnectMacAddr(const std::string & ifaceName,const std::string & mac)239 WifiErrorNo WifiApHalInterface::SetConnectMacAddr(const std::string &ifaceName, const std::string &mac)
240 {
241 #ifdef HDI_CHIP_INTERFACE_SUPPORT
242 if (!HalDeviceManager::GetInstance().SetApMacAddress(ifaceName, mac)) {
243 return WIFI_HAL_OPT_FAILED;
244 }
245 return WIFI_HAL_OPT_OK;
246 #endif
247 return WIFI_HAL_OPT_FAILED;
248 }
249 } // namespace Wifi
250 } // namespace OHOS