1 /*
2 * Copyright (c) 2023 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 #ifdef HDI_WPA_INTERFACE_SUPPORT
17 #include "wifi_hdi_wpa_client.h"
18
19 #include <codecvt>
20 #include <fstream>
21 #include <iostream>
22 #include <locale>
23 #include <securec.h>
24 #include <unistd.h>
25
26 #include "wifi_hdi_wpa_sta_impl.h"
27 #include "wifi_hdi_wpa_callback.h"
28 #include "wifi_hdi_wpa_ap_impl.h"
29 #include "wifi_hdi_wpa_p2p_impl.h"
30 #include "wifi_hdi_util.h"
31 #include "wifi_common_util.h"
32 #include "wifi_common_def.h"
33 #include "hdi_struct_toolkit.h"
34 #include "wifi_hdi_wpa_proxy.h"
35 #include "define.h"
36
37 #ifndef UT_TEST
38 #include "wifi_log.h"
39 #else
40 #define static
41 #define LOGI(...)
42 #define LOGE(...)
43 #endif
44
45 #undef LOG_TAG
46 #define LOG_TAG "WifiHdiWpaClient"
47
48 #define HOSTAPD_CFG_VALUE_ON 1
49 #define DEFAULT_HOSTAPD_CONF_PATH CONFIG_ROOR_DIR"/wpa_supplicant/hostapd.conf"
50
51 namespace OHOS {
52 namespace Wifi {
53 #define MAX_IFACENAME_LEN 6
54 #define MAX_CMD_BUFFER_SIZE 1024
55 #define MAX_PASSWORD_LEN 32
56 constexpr int PMF_OPTIONAL = 1;
57 constexpr int PMF_REQUIRED = 2;
58 const int BUFFER_SIZE = 4096;
59 constexpr int WIFI_HDI_STR_MAC_LENGTH = 17;
60 constexpr int WIFI_HDI_MAX_STR_LENGTH = 512;
61 constexpr int WIFI_MAX_SCAN_COUNT = 256;
62 constexpr int P2P_SUPPLICANT_DISCONNECTED = 0;
63 constexpr int P2P_SUPPLICANT_CONNECTED = 1;
64 constexpr int SSID_ASSIC_WIDTH = 2;
65 constexpr int BAND_WIDTH_OFFSET = 16;
66
StartWifi(const std::string & ifaceName,int instId)67 WifiErrorNo WifiHdiWpaClient::StartWifi(const std::string &ifaceName, int instId)
68 {
69 WifiEventCallback callback;
70 callback.onConnectChanged = [](int param1, int param2, const std::string ¶m3) {};
71 ReqRegisterStaEventCallback(callback, ifaceName.c_str(), instId);
72 LOGI("WifiHdiWpaClient StartWifi ifaceName:%{public}s instId:%{public}d", ifaceName.c_str(), instId);
73 return HdiWpaStaStart(ifaceName.c_str(), instId);
74 }
75
StopWifi(int instId)76 WifiErrorNo WifiHdiWpaClient::StopWifi(int instId)
77 {
78 return HdiWpaStaStop(instId);
79 }
80
ReqConnect(int networkId,const char * ifaceName)81 WifiErrorNo WifiHdiWpaClient::ReqConnect(int networkId, const char *ifaceName)
82 {
83 return HdiWpaStaConnect(networkId, ifaceName);
84 }
85
ReqReconnect(const char * ifaceName)86 WifiErrorNo WifiHdiWpaClient::ReqReconnect(const char *ifaceName)
87 {
88 return HdiWpaStaReconnect(ifaceName);
89 }
90
ReqReassociate(const char * ifaceName)91 WifiErrorNo WifiHdiWpaClient::ReqReassociate(const char *ifaceName)
92 {
93 return HdiWpaStaReassociate(ifaceName);
94 }
95
ReqDisconnect(const char * ifaceName)96 WifiErrorNo WifiHdiWpaClient::ReqDisconnect(const char *ifaceName)
97 {
98 return HdiWpaStaDisconnect(ifaceName);
99 }
100
GetStaCapabilities(unsigned int & capabilities)101 WifiErrorNo WifiHdiWpaClient::GetStaCapabilities(unsigned int &capabilities)
102 {
103 capabilities = 0;
104 return WIFI_HAL_OPT_OK;
105 }
106
GetStaDeviceMacAddress(std::string & mac,const char * ifaceName)107 WifiErrorNo WifiHdiWpaClient::GetStaDeviceMacAddress(std::string &mac, const char *ifaceName)
108 {
109 char macAddr[HAL_BSSID_LENGTH + 1] = {0};
110 int macAddrLen = HAL_BSSID_LENGTH + 1;
111 WifiErrorNo err = HdiWpaStaGetDeviceMacAddress(macAddr, macAddrLen, ifaceName);
112 if (err == WIFI_HAL_OPT_OK) {
113 mac = std::string(macAddr);
114 }
115 return err;
116 }
117
GetSupportFrequencies(int band,std::vector<int> & frequencies)118 WifiErrorNo WifiHdiWpaClient::GetSupportFrequencies(int band, std::vector<int> &frequencies)
119 {
120 return WIFI_HAL_OPT_NOT_SUPPORT;
121 }
122
SetConnectMacAddr(const std::string & mac)123 WifiErrorNo WifiHdiWpaClient::SetConnectMacAddr(const std::string &mac)
124 {
125 return WIFI_HAL_OPT_NOT_SUPPORT;
126 }
127
Scan(const WifiHalScanParam & scanParam)128 WifiErrorNo WifiHdiWpaClient::Scan(const WifiHalScanParam &scanParam)
129 {
130 return HdiWpaStaScan();
131 }
132
QueryScanInfos(std::vector<InterScanInfo> & scanInfos)133 WifiErrorNo WifiHdiWpaClient::QueryScanInfos(std::vector<InterScanInfo> &scanInfos)
134 {
135 LOGI("WifiHdiWpaClient::%{public}s enter", __func__);
136 int size = HAL_GET_MAX_SCAN_INFO;
137 ScanInfo *results = HdiWpaStaGetScanInfos(&size, GetHdiStaIfaceName(INSTID_WLAN0));
138 if (results == NULL) {
139 return size == 0 ? WIFI_HAL_OPT_OK : WIFI_HAL_OPT_FAILED;
140 }
141 for (int i = 0; i < size; ++i) {
142 InterScanInfo tmp;
143 tmp.ssid = results[i].ssid;
144 tmp.bssid = results[i].bssid;
145 tmp.frequency = results[i].freq;
146 tmp.rssi = results[i].siglv;
147 tmp.timestamp = results[i].timestamp;
148 tmp.capabilities = results[i].flags;
149 tmp.channelWidth = (WifiChannelWidth)results[i].channelWidth;
150 tmp.centerFrequency0 = results[i].centerFrequency0;
151 tmp.centerFrequency1 = results[i].centerFrequency1;
152 tmp.isVhtInfoExist = results[i].isVhtInfoExist;
153 tmp.isHtInfoExist = results[i].isHtInfoExist;
154 tmp.isHeInfoExist = results[i].isHeInfoExist;
155 tmp.isErpExist = results[i].isErpExist;
156 tmp.maxRates = results[i].maxRates > results[i].extMaxRates ? results[i].maxRates : results[i].extMaxRates;
157 LOGI("WifiHdiWpaClient::QueryScanInfos ssid = %{public}s, ssid = %{public}s",
158 SsidAnonymize(results[i].ssid).c_str(), MacAnonymize(results[i].bssid).c_str());
159 for (int j = 0; j < results[i].ieSize; ++j) {
160 WifiInfoElem infoElemTmp;
161 int infoElemSize = results[i].infoElems[j].size;
162 infoElemTmp.id = results[i].infoElems[j].id;
163 for (int k = 0; k < infoElemSize; ++k) {
164 infoElemTmp.content.emplace_back(results[i].infoElems[j].content[k]);
165 }
166 if (results[i].infoElems[j].content) {
167 free(results[i].infoElems[j].content);
168 }
169 tmp.infoElems.emplace_back(infoElemTmp);
170 }
171 if (results[i].infoElems) {
172 free(results[i].infoElems);
173 }
174 tmp.isHiLinkNetwork = results[i].isHiLinkNetwork;
175 scanInfos.emplace_back(tmp);
176 }
177 free(results);
178 results = nullptr;
179 return WIFI_HAL_OPT_OK;
180 }
181
ReqStartPnoScan(const WifiHalPnoScanParam & scanParam)182 WifiErrorNo WifiHdiWpaClient::ReqStartPnoScan(const WifiHalPnoScanParam &scanParam)
183 {
184 return WIFI_HAL_OPT_NOT_SUPPORT;
185 }
186
ReqStopPnoScan(void)187 WifiErrorNo WifiHdiWpaClient::ReqStopPnoScan(void)
188 {
189 return WIFI_HAL_OPT_NOT_SUPPORT;
190 }
191
RemoveDevice(int networkId,const char * ifaceName)192 WifiErrorNo WifiHdiWpaClient::RemoveDevice(int networkId, const char *ifaceName)
193 {
194 if (networkId < 0) {
195 return WIFI_HAL_OPT_INVALID_PARAM;
196 }
197
198 return HdiWpaStaRemoveNetwork(networkId, ifaceName);
199 }
200
ClearDeviceConfig(const char * ifaceName) const201 WifiErrorNo WifiHdiWpaClient::ClearDeviceConfig(const char *ifaceName) const
202 {
203 return HdiWpaStaRemoveNetwork(-1, ifaceName);
204 }
205
GetNextNetworkId(int & networkId,const char * ifaceName)206 WifiErrorNo WifiHdiWpaClient::GetNextNetworkId(int &networkId, const char *ifaceName)
207 {
208 return HdiWpaStaAddNetwork(&networkId, ifaceName);
209 }
210
ReqEnableNetwork(int networkId,const char * ifaceName)211 WifiErrorNo WifiHdiWpaClient::ReqEnableNetwork(int networkId, const char *ifaceName)
212 {
213 return HdiWpaStaEnableNetwork(networkId, ifaceName);
214 }
215
ReqDisableNetwork(int networkId,const char * ifaceName)216 WifiErrorNo WifiHdiWpaClient::ReqDisableNetwork(int networkId, const char *ifaceName)
217 {
218 return HdiWpaStaDisableNetwork(networkId, ifaceName);
219 }
220
SetWapiConfig(const WifiHalDeviceConfig & config,SetNetworkConfig * conf,int & num)221 void WifiHdiWpaClient::SetWapiConfig(const WifiHalDeviceConfig &config, SetNetworkConfig *conf, int &num)
222 {
223 LOGI("Enter SetWapiConfig, keyMgmt is %{public}s, pskType is %{public}d", config.keyMgmt.c_str(),
224 config.wapiPskType);
225 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, config.keyMgmt);
226 if (config.keyMgmt == KEY_MGMT_WAPI_PSK) {
227 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_WAPI_PSK_TYPE, config.wapiPskType);
228 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WAPI_PSK, config.psk);
229 } else if (config.keyMgmt == KEY_MGMT_WAPI_CERT) {
230 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WAPI_USER_CERT, config.wapiUserCertData);
231 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WAPI_CA_CERT, config.wapiAsCertData);
232 }
233 }
234
SetDeviceConfig(int networkId,const WifiHalDeviceConfig & config,const char * ifaceName)235 WifiErrorNo WifiHdiWpaClient::SetDeviceConfig(int networkId, const WifiHalDeviceConfig &config, const char *ifaceName)
236 {
237 if (CheckValidDeviceConfig(config) != WIFI_HAL_OPT_OK) {
238 LOGE("SetDeviceConfig, CheckValidDeviceConfig return error!");
239 return WIFI_HAL_OPT_FAILED;
240 }
241 SetNetworkConfig conf[DEVICE_CONFIG_END_POS];
242 if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
243 LOGE("SetDeviceConfig, memset_s return error!");
244 return WIFI_HAL_OPT_FAILED;
245 }
246 int num = 0;
247 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_SSID, config.ssid);
248 do {
249 if (config.keyMgmt.find(KEY_MGMT_WAPI) != std::string::npos) {
250 SetWapiConfig(config, conf, num);
251 break;
252 }
253 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PSK, config.psk);
254 if (config.keyMgmt.find(KEY_MGMT_SAE) != std::string::npos) {
255 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_SAE_PASSWD, config.psk);
256 }
257 if (config.keyMgmt == KEY_MGMT_NONE || config.keyMgmt == KEY_MGMT_WEP) {
258 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, KEY_MGMT_NONE);
259 } else {
260 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, config.keyMgmt);
261 }
262 } while (0);
263 EapMethod eapMethod = WifiEapConfig::Str2EapMethod(config.eapConfig.eap);
264 LOGI("%{public}s, eap:%{public}s, eapMethod:%{public}d, identity:%{private}s, num:%{public}d",
265 __func__, config.eapConfig.eap.c_str(), eapMethod, config.eapConfig.identity.c_str(), num);
266 switch (eapMethod) {
267 case EapMethod::EAP_PEAP:
268 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
269 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
270 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
271 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CA_CERT, config.eapConfig.caCertPath);
272 if (config.eapConfig.phase2Method != static_cast<int>(Phase2Method::NONE)) {
273 std::string strPhase2Method = WifiEapConfig::Phase2MethodToStr(config.eapConfig.eap,
274 config.eapConfig.phase2Method);
275 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PHASE2METHOD, strPhase2Method);
276 }
277 break;
278 case EapMethod::EAP_TLS:
279 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
280 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
281 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CA_CERT, config.eapConfig.caCertPath);
282 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CLIENT_CERT, config.eapConfig.clientCert);
283 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PRIVATE_KEY, config.eapConfig.privateKey);
284 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
285 break;
286 case EapMethod::EAP_TTLS:
287 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
288 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
289 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CA_CERT, config.eapConfig.caCertPath);
290 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
291 if (config.eapConfig.phase2Method != static_cast<int>(Phase2Method::NONE)) {
292 std::string strPhase2Method = WifiEapConfig::Phase2MethodToStr(config.eapConfig.eap,
293 config.eapConfig.phase2Method);
294 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PHASE2METHOD, strPhase2Method);
295 }
296 break;
297 case EapMethod::EAP_PWD:
298 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
299 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
300 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
301 break;
302 case EapMethod::EAP_SIM:
303 case EapMethod::EAP_AKA:
304 case EapMethod::EAP_AKA_PRIME:
305 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
306 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
307 break;
308 default:
309 LOGE("%{public}s, invalid eapMethod:%{public}d", __func__, eapMethod);
310 break;
311 }
312
313 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_BSSID, config.bssid);
314 int i = 0;
315 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_0, config.wepKeys[i++]);
316 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_1, config.wepKeys[i++]);
317 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_2, config.wepKeys[i++]);
318 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_3, config.wepKeys[i++]);
319 if (config.priority >= 0) {
320 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_PRIORITY, config.priority);
321 }
322 if (config.scanSsid == 1) {
323 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_SCAN_SSID, config.scanSsid);
324 }
325 if (config.wepKeyIdx >= 0) {
326 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_WEP_KEY_IDX, config.wepKeyIdx);
327 }
328 if (config.authAlgorithms > 0) {
329 num += PushDeviceConfigAuthAlgorithm(conf + num, DEVICE_CONFIG_AUTH_ALGORITHMS, config.authAlgorithms);
330 }
331 if (config.isRequirePmf) {
332 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_IEEE80211W, PMF_REQUIRED);
333 } else {
334 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_IEEE80211W, PMF_OPTIONAL);
335 }
336 if (config.allowedProtocols > 0) {
337 std::string protocolsStr[] = {"WPA ", "RSN ", "WPA2 ", "OSEN ", "WAPI "};
338 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_ALLOW_PROTOCOLS, config.allowedProtocols,
339 protocolsStr, sizeof(protocolsStr)/sizeof(protocolsStr[0]));
340 }
341 if (config.allowedPairwiseCiphers > 0) {
342 std::string pairwiseCipherStr[] = {"NONE ", "TKIP ", "CCMP ", "GCMP ", "CCMP-256 ", "GCMP-256 ", "SMS4 "};
343 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_PAIRWISE_CIPHERS, config.allowedPairwiseCiphers,
344 pairwiseCipherStr, sizeof(pairwiseCipherStr)/sizeof(pairwiseCipherStr[0]));
345 }
346 if (config.allowedGroupCiphers > 0) {
347 std::string groupCipherStr[] = {"GTK_NOT_USED ", "TKIP ", "CCMP ", "GCMP ", "CCMP-256 ", "GCMP-256 ", "SMS4 "};
348 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_GROUP_CIPHERS, config.allowedGroupCiphers,
349 groupCipherStr, sizeof(groupCipherStr)/sizeof(groupCipherStr[0]));
350 }
351 if (config.allowedGroupMgmtCiphers > 0) {
352 std::string groupMgmtCipherStr[] = {"AES-128-CMAC ", "BIP-GMAC-128 ", "BIP-GMAC-256 ", "BIP-CMAC-256 "};
353 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_GROUP_MGMT_CIPHERS, config.allowedGroupMgmtCiphers,
354 groupMgmtCipherStr, sizeof(groupMgmtCipherStr)/sizeof(groupMgmtCipherStr[0]));
355 }
356 if (num == 0) {
357 return WIFI_HAL_OPT_OK;
358 }
359 return HdiWpaStaSetNetwork(networkId, conf, num, ifaceName);
360 }
361
SetBssid(int networkId,const std::string & bssid,const char * ifaceName)362 WifiErrorNo WifiHdiWpaClient::SetBssid(int networkId, const std::string &bssid, const char *ifaceName)
363 {
364 SetNetworkConfig conf;
365 int num = PushDeviceConfigString(&conf, DEVICE_CONFIG_BSSID, bssid, false);
366 if (num == 0) {
367 LOGE("SetBssid, PushDeviceConfigString return error!");
368 return WIFI_HAL_OPT_OK;
369 }
370
371 return HdiWpaStaSetNetwork(networkId, &conf, num, ifaceName);
372 }
373
SaveDeviceConfig(const char * ifaceName)374 WifiErrorNo WifiHdiWpaClient::SaveDeviceConfig(const char *ifaceName)
375 {
376 return HdiWpaStaSaveConfig(ifaceName);
377 }
378
ReqRegisterStaEventCallback(const WifiEventCallback & callback,const char * ifaceName,int instId)379 WifiErrorNo WifiHdiWpaClient::ReqRegisterStaEventCallback(
380 const WifiEventCallback &callback, const char *ifaceName, int instId)
381 {
382 struct IWpaCallback cWifiHdiWpaCallback;
383 if (memset_s(&cWifiHdiWpaCallback, sizeof(cWifiHdiWpaCallback), 0, sizeof(cWifiHdiWpaCallback)) != EOK) {
384 return WIFI_HAL_OPT_FAILED;
385 }
386
387 if (callback.onConnectChanged != nullptr) {
388 cWifiHdiWpaCallback.OnEventDisconnected = OnEventDisconnected;
389 cWifiHdiWpaCallback.OnEventConnected = OnEventConnected;
390 cWifiHdiWpaCallback.OnEventBssidChanged = OnEventBssidChanged;
391 cWifiHdiWpaCallback.OnEventStateChanged = OnEventStateChanged;
392 cWifiHdiWpaCallback.OnEventTempDisabled = OnEventTempDisabled;
393 cWifiHdiWpaCallback.OnEventAssociateReject = OnEventAssociateReject;
394 cWifiHdiWpaCallback.OnEventWpsOverlap = OnEventWpsOverlap;
395 cWifiHdiWpaCallback.OnEventWpsTimeout = OnEventWpsTimeout;
396 cWifiHdiWpaCallback.OnEventAuthTimeout = OnEventAuthTimeout;
397 cWifiHdiWpaCallback.OnEventScanResult = OnEventScanResult;
398 cWifiHdiWpaCallback.OnEventStaNotify = OnEventStaNotify;
399 }
400
401 return RegisterHdiWpaStaEventCallback(&cWifiHdiWpaCallback, ifaceName, instId);
402 }
403
ReqStartWpsPbcMode(const WifiHalWpsConfig & config,const char * ifaceName)404 WifiErrorNo WifiHdiWpaClient::ReqStartWpsPbcMode(const WifiHalWpsConfig &config, const char *ifaceName)
405 {
406 WifiWpsParam param;
407 if (memset_s(¶m, sizeof(param), 0, sizeof(param)) != EOK) {
408 return WIFI_HAL_OPT_FAILED;
409 }
410 param.anyFlag = config.anyFlag;
411 param.multiAp = config.multiAp;
412 if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
413 return WIFI_HAL_OPT_FAILED;
414 }
415 return HdiWpaStaStartWpsPbcMode(¶m, ifaceName);
416 }
417
ReqStartWpsPinMode(const WifiHalWpsConfig & config,int & pinCode,const char * ifaceName)418 WifiErrorNo WifiHdiWpaClient::ReqStartWpsPinMode(const WifiHalWpsConfig &config, int &pinCode, const char *ifaceName)
419 {
420 WifiWpsParam param;
421 if (memset_s(¶m, sizeof(param), 0, sizeof(param)) != EOK) {
422 return WIFI_HAL_OPT_FAILED;
423 }
424 param.anyFlag = config.anyFlag;
425 param.multiAp = config.multiAp;
426 if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
427 return WIFI_HAL_OPT_FAILED;
428 }
429 if (!config.pinCode.empty()) {
430 if (strncpy_s(param.pinCode, sizeof(param.pinCode), config.pinCode.c_str(), config.pinCode.length()) != EOK) {
431 return WIFI_HAL_OPT_FAILED;
432 }
433 }
434 return HdiWpaStaStartWpsPinMode(¶m, &pinCode, ifaceName);
435 }
436
ReqStopWps(const char * ifaceName)437 WifiErrorNo WifiHdiWpaClient::ReqStopWps(const char *ifaceName)
438 {
439 return HdiStopWpsSta(ifaceName);
440 }
441
ReqGetRoamingCapabilities(WifiHalRoamCapability & capability)442 WifiErrorNo WifiHdiWpaClient::ReqGetRoamingCapabilities(WifiHalRoamCapability &capability)
443 {
444 return WIFI_HAL_OPT_NOT_SUPPORT;
445 }
446
ReqSetRoamConfig(const WifiHalRoamConfig & config)447 WifiErrorNo WifiHdiWpaClient::ReqSetRoamConfig(const WifiHalRoamConfig &config)
448 {
449 return WIFI_HAL_OPT_NOT_SUPPORT;
450 }
451
ReqGetConnectSignalInfo(const std::string & endBssid,WifiHalWpaSignalInfo & info) const452 WifiErrorNo WifiHdiWpaClient::ReqGetConnectSignalInfo(const std::string &endBssid, WifiHalWpaSignalInfo &info) const
453 {
454 return WIFI_HAL_OPT_NOT_SUPPORT;
455 }
456
ReqWpaAutoConnect(int enable,const char * ifaceName)457 WifiErrorNo WifiHdiWpaClient::ReqWpaAutoConnect(int enable, const char *ifaceName)
458 {
459 return HdiWpaStaAutoConnect(enable, ifaceName);
460 }
461
ReqWpaBlocklistClear(const char * ifaceName)462 WifiErrorNo WifiHdiWpaClient::ReqWpaBlocklistClear(const char *ifaceName)
463 {
464 return HdiWpaStaBlocklistClear(ifaceName);
465 }
466
ReqSetPowerSave(bool enable,const char * ifaceName)467 WifiErrorNo WifiHdiWpaClient::ReqSetPowerSave(bool enable, const char *ifaceName)
468 {
469 return HdiWpaStaSetPowerSave(enable, ifaceName);
470 }
471
ReqWpaSetCountryCode(const std::string & countryCode,const char * ifaceName)472 WifiErrorNo WifiHdiWpaClient::ReqWpaSetCountryCode(const std::string &countryCode, const char *ifaceName)
473 {
474 return HdiWpaStaSetCountryCode(countryCode.c_str(), ifaceName);
475 }
476
ReqWpaGetCountryCode(std::string & countryCode,const char * ifaceName)477 WifiErrorNo WifiHdiWpaClient::ReqWpaGetCountryCode(std::string &countryCode, const char *ifaceName)
478 {
479 char szCountryCode[HAL_COUNTRY_CODE_LENGTH + 1] = "";
480 if (WIFI_HAL_OPT_OK != HdiWpaStaGetCountryCode(szCountryCode, HAL_COUNTRY_CODE_LENGTH, ifaceName)) {
481 return WIFI_HAL_OPT_FAILED;
482 }
483 countryCode = szCountryCode;
484 return WIFI_HAL_OPT_OK;
485 }
486
ReqWpaSetSuspendMode(bool mode,const char * ifaceName) const487 WifiErrorNo WifiHdiWpaClient::ReqWpaSetSuspendMode(bool mode, const char *ifaceName) const
488 {
489 return HdiWpaStaSetSuspendMode(mode, ifaceName);
490 }
491
ReqWpaShellCmd(const std::string & ifName,const std::string & cmd)492 WifiErrorNo WifiHdiWpaClient::ReqWpaShellCmd(const std::string &ifName, const std::string &cmd)
493 {
494 char ifNameBuf[MAX_IFACENAME_LEN];
495 if (strncpy_s(ifNameBuf, sizeof(ifNameBuf), ifName.c_str(), ifName.length()) != EOK) {
496 LOGE("%{public}s: failed to copy", __func__);
497 return WIFI_HAL_OPT_FAILED;
498 }
499
500 char cmdBuf[MAX_CMD_BUFFER_SIZE];
501 if (strncpy_s(cmdBuf, sizeof(cmdBuf), cmd.c_str(), cmd.length()) != EOK) {
502 LOGE("%{public}s: failed to copy", __func__);
503 return WIFI_HAL_OPT_FAILED;
504 }
505 return HdiWpaStaSetShellCmd(ifNameBuf, cmdBuf);
506 }
507
ReqWpaGetPskPassphrase(const std::string & ifName,std::string & psk)508 WifiErrorNo WifiHdiWpaClient::ReqWpaGetPskPassphrase(const std::string &ifName, std::string &psk)
509 {
510 char ifNameBuf[MAX_IFACENAME_LEN];
511 char tmpPsk[MAX_CMD_BUFFER_SIZE] = {0};
512 uint32_t pskLen = MAX_PASSWORD_LEN;
513 if (strncpy_s(ifNameBuf, sizeof(ifNameBuf), ifName.c_str(), ifName.length()) != EOK) {
514 LOGE("%{public}s: failed to copy", __func__);
515 return WIFI_HAL_OPT_FAILED;
516 }
517
518 if (HdiWpaStaGetPskPassphrase(ifNameBuf, tmpPsk, pskLen) != WIFI_HAL_OPT_OK) {
519 LOGE("%{public}s: GetPskPassphrase failed", __func__);
520 return WIFI_HAL_OPT_FAILED;
521 }
522 psk = tmpPsk;
523 return WIFI_HAL_OPT_OK;
524 }
525
PushDeviceConfigString(SetNetworkConfig * pConfig,DeviceConfigType type,const std::string & msg,bool checkEmpty) const526 int WifiHdiWpaClient::PushDeviceConfigString(
527 SetNetworkConfig *pConfig, DeviceConfigType type, const std::string &msg, bool checkEmpty) const
528 {
529 if (!checkEmpty || msg.length() > 0) {
530 pConfig->cfgParam = type;
531 if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), msg.c_str(), msg.length()) != EOK) {
532 return 0;
533 }
534 return 1;
535 } else {
536 return 0;
537 }
538 }
539
PushDeviceConfigInt(SetNetworkConfig * pConfig,DeviceConfigType type,int i) const540 int WifiHdiWpaClient::PushDeviceConfigInt(SetNetworkConfig *pConfig, DeviceConfigType type, int i) const
541 {
542 pConfig->cfgParam = type;
543 if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
544 return 0;
545 }
546 return 1;
547 }
548
PushDeviceConfigAuthAlgorithm(SetNetworkConfig * pConfig,DeviceConfigType type,unsigned int alg) const549 int WifiHdiWpaClient::PushDeviceConfigAuthAlgorithm(
550 SetNetworkConfig *pConfig, DeviceConfigType type, unsigned int alg) const
551 {
552 pConfig->cfgParam = type;
553 if (alg & 0x1) {
554 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN ") != EOK) {
555 return 0;
556 }
557 }
558 if (alg & 0x2) {
559 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN SHARED ") != EOK) {
560 return 0;
561 }
562 }
563 if (alg & 0x4) {
564 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "LEAP ") != EOK) {
565 return 0;
566 }
567 }
568 return 1;
569 }
570
PushDeviceConfigParseMask(SetNetworkConfig * pConfig,DeviceConfigType type,unsigned int mask,const std::string parseStr[],int size) const571 int WifiHdiWpaClient::PushDeviceConfigParseMask(
572 SetNetworkConfig *pConfig, DeviceConfigType type,
573 unsigned int mask, const std::string parseStr[], int size) const
574 {
575 pConfig->cfgParam = type;
576 for (int i = 0; i < size; i++) {
577 if (mask & (0x1 << i)) {
578 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), parseStr[i].c_str()) != EOK) {
579 return 0;
580 }
581 }
582 }
583 return 1;
584 }
585
CheckValidDeviceConfig(const WifiHalDeviceConfig & config) const586 WifiErrorNo WifiHdiWpaClient::CheckValidDeviceConfig(const WifiHalDeviceConfig &config) const
587 {
588 if (config.psk.length() > 0) {
589 if (config.psk.length() < HAL_PSK_MIN_LENGTH || config.psk.length() > HAL_PSK_MAX_LENGTH) {
590 return WIFI_HAL_OPT_FAILED;
591 }
592 }
593 if (config.authAlgorithms >= HAL_AUTH_ALGORITHM_MAX) { /* max is 0111 */
594 return WIFI_HAL_OPT_FAILED;
595 }
596 return WIFI_HAL_OPT_OK;
597 }
598
GetNetworkList(std::vector<WifiHalWpaNetworkInfo> & networkList,const char * ifaceName)599 WifiErrorNo WifiHdiWpaClient::GetNetworkList(std::vector<WifiHalWpaNetworkInfo> &networkList, const char *ifaceName)
600 {
601 HdiWifiWpaNetworkInfo *listNetwork = new HdiWifiWpaNetworkInfo[WIFI_MAX_SCAN_COUNT];
602 if (listNetwork == nullptr) {
603 LOGE("WifiHdiWpaClient::%{public}s alloc mem failed", __func__);
604 return WIFI_HAL_OPT_FAILED;
605 }
606 uint32_t size = WIFI_MAX_SCAN_COUNT;
607 if (WIFI_HAL_OPT_OK != HdiWpaListNetworks(listNetwork, &size, ifaceName)) {
608 if (listNetwork != nullptr) {
609 delete[] listNetwork;
610 listNetwork = nullptr;
611 }
612 LOGE("WifiHdiWpaClient::%{public}s failed", __func__);
613 return WIFI_HAL_OPT_FAILED;
614 }
615 for (uint32_t i = 0; i < size; i++) {
616 WifiHalWpaNetworkInfo networkInfo;
617 networkInfo.id = listNetwork[i].id;
618 char szssid[WIFI_HDI_MAX_STR_LENGTH +1] = {0};
619 for (uint32_t j = 0; j < listNetwork[i].ssidLen; j++) {
620 szssid[j] = listNetwork[i].ssid[j];
621 }
622 networkInfo.ssid = szssid;
623 char szBssid[WIFI_HDI_STR_MAC_LENGTH +1] = {0};
624 ConvertMacArr2String(listNetwork[i].bssid, listNetwork[i].bssidLen, szBssid, sizeof(szBssid));
625 networkInfo.bssid = szBssid;
626 char flags[WIFI_HDI_MAX_STR_LENGTH +1] = {0};
627 for (uint32_t j = 0; j < listNetwork[i].flagsLen;j++) {
628 flags[j] = listNetwork[i].flags[j];
629 }
630 networkInfo.flag = flags;
631 networkList.push_back(networkInfo);
632 FreeHdiWifiWpaNetworkInfo(&listNetwork[i]);
633 }
634 if (listNetwork != nullptr) {
635 delete[] listNetwork;
636 listNetwork = nullptr;
637 }
638 return WIFI_HAL_OPT_OK;
639 }
640
GetDeviceConfig(WifiHalGetDeviceConfig & config,const char * ifaceName)641 WifiErrorNo WifiHdiWpaClient::GetDeviceConfig(WifiHalGetDeviceConfig &config, const char *ifaceName)
642 {
643 int32_t networkId = config.networkId;
644 char param[WIFI_HDI_MAX_STR_LENGTH +1] = {0};
645 if (memcpy_s(param, WIFI_HDI_MAX_STR_LENGTH, config.param.c_str(), config.param.length()) != EOK) {
646 LOGE("WifiHdiWpaClient::%{public}s memcpy_s failed", __func__);
647 return WIFI_HAL_OPT_FAILED;
648 }
649 char value[WIFI_HDI_MAX_STR_LENGTH +1] = {0};
650 uint32_t valueLen = WIFI_HDI_MAX_STR_LENGTH;
651 if (WIFI_HAL_OPT_OK != HdiWpaGetNetwork(networkId, param, value, valueLen, ifaceName)) {
652 LOGE("WifiHdiWpaClient::%{public}s failed", __func__);
653 return WIFI_HAL_OPT_FAILED;
654 }
655 config.value = value;
656 return WIFI_HAL_OPT_OK;
657 }
658
StartAp(int id,const std::string & ifaceName)659 WifiErrorNo WifiHdiWpaClient::StartAp(int id, const std::string &ifaceName)
660 {
661 return HdiStartAp(ifaceName.c_str(), id);
662 }
663
StopAp(int id)664 WifiErrorNo WifiHdiWpaClient::StopAp(int id)
665 {
666 return HdiStopAp(id);
667 }
668
RegisterApEvent(IWifiApMonitorEventCallback callback,int id) const669 WifiErrorNo WifiHdiWpaClient::RegisterApEvent(IWifiApMonitorEventCallback callback, int id) const
670 {
671 IHostapdCallback cEventCallback;
672 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
673 return WIFI_HAL_OPT_FAILED;
674 }
675 if (callback.onStaJoinOrLeave != nullptr) {
676 cEventCallback.OnEventStaJoin = onEventStaJoin;
677 cEventCallback.OnEventApState = onEventApState;
678 }
679 return HdiRegisterApEventCallback(&cEventCallback);
680 }
681
AppendStr(std::string & dst,const char * format,va_list args)682 void WifiHdiWpaClient::AppendStr(std::string &dst, const char* format, va_list args)
683 {
684 char space[MAX_CMD_BUFFER_SIZE] __attribute__((__uninitialized__));
685 va_list argsTmp;
686
687 va_copy(argsTmp, args);
688 int result = vsnprintf_s(space, sizeof(space), sizeof(space) - 1, format, argsTmp);
689 va_end(argsTmp);
690 if (result >= 0) {
691 dst.append(space, result);
692 return;
693 }
694 if (result < 0) {
695 LOGE("AppendStr failed");
696 return;
697 }
698 }
699
StringCombination(const char * fmt,...)700 std::string WifiHdiWpaClient::StringCombination(const char* fmt, ...)
701 {
702 va_list args;
703 va_start(args, fmt);
704 std::string result;
705 AppendStr(result, fmt, args);
706 va_end(args);
707 return result;
708 }
709
ConvertToUtf8(const std::string ssid,std::vector<uint8_t> & ssidUtf8)710 void WifiHdiWpaClient::ConvertToUtf8(const std::string ssid, std::vector<uint8_t> &ssidUtf8)
711 {
712 std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
713 std::wstring wideStr = conv.from_bytes(ssid);
714 std::string utf8Str = conv.to_bytes(wideStr);
715 std::vector<uint8_t> utf8U8(utf8Str.begin(), utf8Str.end());
716 ssidUtf8 = utf8U8;
717 }
718
GetSsidString(std::string & ssidString,std::vector<uint8_t> & ssidUtf8)719 void WifiHdiWpaClient::GetSsidString(std::string &ssidString, std::vector<uint8_t> &ssidUtf8)
720 {
721 std::stringstream ss;
722 ss << std::hex;
723 ss << std::setfill('0');
724 for (uint8_t b : ssidUtf8) {
725 ss << std::setw(SSID_ASSIC_WIDTH) << static_cast<unsigned int>(b);
726 }
727 ssidString = ss.str();
728 }
729
GetEncryptionString(const HotspotConfig & config,std::string & encryptionString)730 bool WifiHdiWpaClient::GetEncryptionString(const HotspotConfig &config, std::string &encryptionString)
731 {
732 switch (config.GetSecurityType()) {
733 case KeyMgmt::WPA_PSK:
734 encryptionString = StringCombination(
735 "wpa=3\n"
736 "wpa_pairwise=TKIP CCMP\n"
737 "wpa_passphrase=%s",
738 config.GetPreSharedKey().c_str());
739 break;
740 case KeyMgmt::WPA2_PSK:
741 encryptionString = StringCombination(
742 "wpa=2\n"
743 "rsn_pairwise=CCMP\n"
744 "wpa_passphrase=%s\n"
745 "ieee80211w=1",
746 config.GetPreSharedKey().c_str());
747 break;
748 default:
749 LOGE("unsupport security type");
750 encryptionString = "";
751 return false;
752 }
753 return true;
754 }
755
GetChannelString(const HotspotConfig & config,std::string & channelString)756 void WifiHdiWpaClient::GetChannelString(const HotspotConfig &config, std::string &channelString)
757 {
758 uint32_t channel = (static_cast<uint32_t>(config.GetChannel()) |
759 (static_cast<uint32_t>(config.GetBandWidth()) << BAND_WIDTH_OFFSET));
760 LOGI("set ap channel mix info is %{public}u", channel);
761 channelString = StringCombination(
762 "channel=%u\n"
763 "op_class=0",
764 channel);
765 }
766
GetModeString(const HotspotConfig & config,std::string & modeString)767 void WifiHdiWpaClient::GetModeString(const HotspotConfig &config, std::string &modeString)
768 {
769 /* configure hardware mode */
770 if (config.GetBand() == BandType::BAND_2GHZ) {
771 modeString = "hw_mode=g";
772 } else if (config.GetBand() == BandType::BAND_5GHZ) {
773 modeString = "hw_mode=a";
774 } else {
775 LOGE("unsupport band");
776 modeString = "";
777 }
778 }
779
WriteConfigToFile(const std::string & fileContext)780 bool WifiHdiWpaClient::WriteConfigToFile(const std::string &fileContext)
781 {
782 std::string destPath = DEFAULT_HOSTAPD_CONF_PATH;
783 std::ofstream file;
784 file.open(destPath, std::ios::out);
785 if (!file.is_open()) {
786 LOGE("hostapd file open failed");
787 return false;
788 }
789 file << fileContext << std::endl;
790 file.close();
791 return true;
792 }
793
SetSoftApConfig(const std::string & ifName,const HotspotConfig & config,int id)794 WifiErrorNo WifiHdiWpaClient::SetSoftApConfig(const std::string &ifName, const HotspotConfig &config, int id)
795 {
796 std::string ssid2String;
797 std::string encryptionString;
798 std::string channelString;
799 std::vector<uint8_t> ssidUtf8;
800 std::string modeString;
801 std::string fileContext;
802 ConvertToUtf8(config.GetSsid(), ssidUtf8);
803 GetSsidString(ssid2String, ssidUtf8);
804 if (!GetEncryptionString(config, encryptionString)) {
805 LOGE("set psk failed");
806 return WIFI_HAL_OPT_FAILED;
807 }
808 GetChannelString(config, channelString);
809 GetModeString(config, modeString);
810 fileContext = StringCombination(
811 "interface=%s\n"
812 "driver=nl80211\n"
813 "ctrl_interface=/data/service/el1/public/wifi/sockets/wpa\n"
814 "ssid2=%s\n"
815 "%s\n"
816 "ieee80211n=1\n"
817 "%s\n"
818 "ignore_broadcast_ssid=0\n"
819 "wowlan_triggers=any\n"
820 "%s\n",
821 ifName.c_str(), ssid2String.c_str(),
822 channelString.c_str(),
823 modeString.c_str(),
824 encryptionString.c_str());
825 if (!WriteConfigToFile(fileContext)) {
826 LOGE("write config failed");
827 return WIFI_HAL_OPT_FAILED;
828 }
829 return WIFI_HAL_OPT_OK;
830 }
831
EnableAp(int id)832 WifiErrorNo WifiHdiWpaClient::EnableAp(int id)
833 {
834 if (HdiEnableAp(id) != WIFI_HAL_OPT_OK) {
835 return WIFI_HAL_OPT_FAILED;
836 }
837 return WIFI_HAL_OPT_OK;
838 }
839
GetStationList(std::vector<std::string> & result,int id)840 WifiErrorNo WifiHdiWpaClient::GetStationList(std::vector<std::string> &result, int id)
841 {
842 char *staInfos = new (std::nothrow) char[BUFFER_SIZE]();
843 if (staInfos == nullptr) {
844 return WIFI_HAL_OPT_FAILED;
845 }
846 WifiErrorNo err = HdiGetStaInfos(staInfos, BUFFER_SIZE, id);
847 if (err != WIFI_HAL_OPT_OK) {
848 delete[] staInfos;
849 staInfos = nullptr;
850 return WIFI_HAL_OPT_FAILED;
851 }
852 std::string strStaInfo = std::string(staInfos);
853 SplitString(strStaInfo, ",", result);
854 delete[] staInfos;
855 staInfos = nullptr;
856 return WIFI_HAL_OPT_OK;
857 }
858
AddBlockByMac(const std::string & mac,int id)859 WifiErrorNo WifiHdiWpaClient::AddBlockByMac(const std::string &mac, int id)
860 {
861 if (CheckMacIsValid(mac) != 0) {
862 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
863 }
864 return HdiSetMacFilter(mac.c_str(), id);
865 }
866
DelBlockByMac(const std::string & mac,int id)867 WifiErrorNo WifiHdiWpaClient::DelBlockByMac(const std::string &mac, int id)
868 {
869 if (CheckMacIsValid(mac) != 0) {
870 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
871 }
872 return HdiDelMacFilter(mac.c_str(), id);
873 }
874
RemoveStation(const std::string & mac,int id)875 WifiErrorNo WifiHdiWpaClient::RemoveStation(const std::string &mac, int id)
876 {
877 if (CheckMacIsValid(mac) != 0) {
878 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
879 }
880 return HdiDisassociateSta(mac.c_str(), id);
881 }
882
ReqDisconnectStaByMac(const std::string & mac,int id)883 WifiErrorNo WifiHdiWpaClient::ReqDisconnectStaByMac(const std::string &mac, int id)
884 {
885 if (CheckMacIsValid(mac) != 0) {
886 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
887 }
888 return HdiDisassociateSta(mac.c_str(), id);
889 }
890
ReqP2pStart(const std::string & ifaceName,const bool hasPersisentGroup)891 WifiErrorNo WifiHdiWpaClient::ReqP2pStart(const std::string &ifaceName, const bool hasPersisentGroup)
892 {
893 WifiErrorNo ret = HdiWpaP2pStart(ifaceName.c_str(), hasPersisentGroup);
894 if (ret == WIFI_HAL_OPT_OK) {
895 OnEventP2pStateChanged(P2P_SUPPLICANT_CONNECTED);
896 }
897 return ret;
898 }
899
ReqP2pStop()900 WifiErrorNo WifiHdiWpaClient::ReqP2pStop()
901 {
902 WifiErrorNo ret = HdiWpaP2pStop();
903 if (ret == WIFI_HAL_OPT_OK) {
904 OnEventP2pStateChanged(P2P_SUPPLICANT_DISCONNECTED);
905 }
906 return ret;
907 }
908
ReqP2pSetDeviceName(const std::string & name) const909 WifiErrorNo WifiHdiWpaClient::ReqP2pSetDeviceName(const std::string &name) const
910 {
911 return HdiP2pSetDeviceName(name.c_str());
912 }
913
ReqP2pSetSsidPostfixName(const std::string & postfixName) const914 WifiErrorNo WifiHdiWpaClient::ReqP2pSetSsidPostfixName(const std::string &postfixName) const
915 {
916 return HdiP2pSetSsidPostfixName(postfixName.c_str());
917 }
918
ReqP2pSetWpsDeviceType(const std::string & type) const919 WifiErrorNo WifiHdiWpaClient::ReqP2pSetWpsDeviceType(const std::string &type) const
920 {
921 return HdiP2pSetWpsDeviceType(type.c_str());
922 }
923
ReqP2pSetWpsSecondaryDeviceType(const std::string & type) const924 WifiErrorNo WifiHdiWpaClient::ReqP2pSetWpsSecondaryDeviceType(const std::string &type) const
925 {
926 return HdiP2pSetWpsSecondaryDeviceType(type.c_str());
927 }
928
ReqP2pSetWpsConfigMethods(const std::string & config) const929 WifiErrorNo WifiHdiWpaClient::ReqP2pSetWpsConfigMethods(const std::string &config) const
930 {
931 return HdiP2pSetWpsConfigMethods(config.c_str());
932 }
933
ReqP2pGetDeviceAddress(std::string & deviceAddress) const934 WifiErrorNo WifiHdiWpaClient::ReqP2pGetDeviceAddress(std::string &deviceAddress) const
935 {
936 char address[HAL_P2P_DEV_ADDRESS_LEN] = {0};
937 WifiErrorNo ret = HdiP2pGetDeviceAddress(address, HAL_P2P_DEV_ADDRESS_LEN);
938 if (ret == WIFI_HAL_OPT_OK) {
939 deviceAddress = address;
940 }
941 return ret;
942 }
943
ReqP2pFlush() const944 WifiErrorNo WifiHdiWpaClient::ReqP2pFlush() const
945 {
946 return HdiP2pFlush();
947 }
948
ReqP2pFlushService() const949 WifiErrorNo WifiHdiWpaClient::ReqP2pFlushService() const
950 {
951 return HdiP2pFlushService();
952 }
953
ReqP2pSaveConfig() const954 WifiErrorNo WifiHdiWpaClient::ReqP2pSaveConfig() const
955 {
956 return HdiP2pSaveConfig();
957 }
958
ReqP2pRegisterCallback(const P2pHalCallback & callbacks) const959 WifiErrorNo WifiHdiWpaClient::ReqP2pRegisterCallback(const P2pHalCallback &callbacks) const
960 {
961 struct IWpaCallback cWifiHdiWpaCallback;
962 if (memset_s(&cWifiHdiWpaCallback, sizeof(cWifiHdiWpaCallback), 0, sizeof(cWifiHdiWpaCallback)) != EOK) {
963 return WIFI_HAL_OPT_FAILED;
964 }
965
966 if (callbacks.onConnectSupplicant != nullptr) {
967 cWifiHdiWpaCallback.OnEventDeviceFound = OnEventDeviceFound;
968 cWifiHdiWpaCallback.OnEventDeviceLost = OnEventDeviceLost;
969 cWifiHdiWpaCallback.OnEventGoNegotiationRequest = OnEventGoNegotiationRequest;
970 cWifiHdiWpaCallback.OnEventGoNegotiationCompleted = OnEventGoNegotiationCompleted;
971 cWifiHdiWpaCallback.OnEventInvitationReceived = OnEventInvitationReceived;
972 cWifiHdiWpaCallback.OnEventInvitationResult = OnEventInvitationResult;
973 cWifiHdiWpaCallback.OnEventGroupFormationSuccess = OnEventGroupFormationSuccess;
974 cWifiHdiWpaCallback.OnEventGroupFormationFailure = OnEventGroupFormationFailure;
975 cWifiHdiWpaCallback.OnEventGroupStarted = OnEventGroupStarted;
976 cWifiHdiWpaCallback.OnEventGroupInfoStarted = OnEventGroupInfoStarted;
977 cWifiHdiWpaCallback.OnEventGroupRemoved = OnEventGroupRemoved;
978 cWifiHdiWpaCallback.OnEventProvisionDiscoveryCompleted = OnEventProvisionDiscoveryCompleted;
979 cWifiHdiWpaCallback.OnEventFindStopped = OnEventFindStopped;
980 cWifiHdiWpaCallback.OnEventServDiscReq = OnEventServDiscReq;
981 cWifiHdiWpaCallback.OnEventServDiscResp = OnEventServDiscResp;
982 cWifiHdiWpaCallback.OnEventStaConnectState = OnEventStaConnectState;
983 cWifiHdiWpaCallback.OnEventIfaceCreated = OnEventIfaceCreated;
984 cWifiHdiWpaCallback.OnEventStaNotify = OnEventStaNotify;
985 }
986
987 return RegisterHdiWpaP2pEventCallback(&cWifiHdiWpaCallback);
988 }
989
ReqP2pSetupWpsPbc(const std::string & groupInterface,const std::string & bssid) const990 WifiErrorNo WifiHdiWpaClient::ReqP2pSetupWpsPbc(const std::string &groupInterface, const std::string &bssid) const
991 {
992 return HdiP2pSetupWpsPbc(groupInterface.c_str(), bssid.c_str());
993 }
994
ReqP2pSetupWpsPin(const std::string & groupInterface,const std::string & address,const std::string & pin,std::string & result) const995 WifiErrorNo WifiHdiWpaClient::ReqP2pSetupWpsPin(
996 const std::string &groupInterface, const std::string &address, const std::string &pin, std::string &result) const
997 {
998 if (!pin.empty() && pin.size() != HAL_PIN_CODE_LENGTH) {
999 return WIFI_HAL_OPT_INVALID_PARAM;
1000 }
1001 char szPinCode[1024] = {0};
1002 WifiErrorNo ret = HdiP2pSetupWpsPin(groupInterface.c_str(), address.c_str(), pin.c_str(), szPinCode);
1003 if (ret == WIFI_HAL_OPT_OK) {
1004 result = szPinCode;
1005 }
1006 return ret;
1007 }
1008
ReqP2pRemoveNetwork(int networkId) const1009 WifiErrorNo WifiHdiWpaClient::ReqP2pRemoveNetwork(int networkId) const
1010 {
1011 return HdiP2pRemoveNetwork(networkId);
1012 }
1013
ReqP2pListNetworks(std::map<int,WifiP2pGroupInfo> & mapGroups) const1014 WifiErrorNo WifiHdiWpaClient::ReqP2pListNetworks(std::map<int, WifiP2pGroupInfo> &mapGroups) const
1015 {
1016 HdiP2pNetworkList infoList = {0};
1017 WifiErrorNo ret = HdiP2pListNetworks(&infoList);
1018 if (ret != WIFI_HAL_OPT_OK) {
1019 return ret;
1020 }
1021 if (infoList.infos == nullptr) {
1022 return ret;
1023 }
1024 LOGI("ReqP2pListNetworks size=%{public}d", infoList.infoNum);
1025 for (int i = 0; i < infoList.infoNum; ++i) {
1026 WifiP2pGroupInfo groupInfo;
1027 groupInfo.SetNetworkId(infoList.infos[i].id);
1028 groupInfo.SetGroupName((char *)infoList.infos[i].ssid);
1029
1030 char address[18] = {0};
1031 ConvertMacArr2String(infoList.infos[i].bssid, ETH_ALEN, address, sizeof(address));
1032 WifiP2pDevice device;
1033 device.SetDeviceAddress(address);
1034 groupInfo.SetOwner(device);
1035 if (strstr((char *)infoList.infos[i].flags, "P2P-PERSISTENT") != nullptr) {
1036 groupInfo.SetIsPersistent(true);
1037 }
1038 mapGroups.insert(std::pair<int, WifiP2pGroupInfo>(infoList.infos[i].id, groupInfo));
1039 std::string ssid(reinterpret_cast<const char*>(infoList.infos[i].ssid));
1040 LOGI("ReqP2pListNetworks id=%{public}d ssid=%{public}s address=%{private}s",
1041 infoList.infos[i].id, SsidAnonymize(ssid).c_str(), address);
1042 }
1043 FreeHdiP2pNetworkList(&infoList);
1044 return ret;
1045 }
1046
ReqP2pSetGroupMaxIdle(const std::string & groupInterface,size_t time) const1047 WifiErrorNo WifiHdiWpaClient::ReqP2pSetGroupMaxIdle(const std::string &groupInterface, size_t time) const
1048 {
1049 return HdiP2pSetGroupMaxIdle(groupInterface.c_str(), time);
1050 }
1051
ReqP2pSetPowerSave(const std::string & groupInterface,bool enable) const1052 WifiErrorNo WifiHdiWpaClient::ReqP2pSetPowerSave(const std::string &groupInterface, bool enable) const
1053 {
1054 int flag = enable;
1055 return HdiP2pSetPowerSave(groupInterface.c_str(), flag);
1056 }
1057
ReqP2pSetWfdEnable(bool enable) const1058 WifiErrorNo WifiHdiWpaClient::ReqP2pSetWfdEnable(bool enable) const
1059 {
1060 int flag = enable;
1061 return HdiP2pSetWfdEnable(flag);
1062 }
1063
ReqP2pSetWfdDeviceConfig(const std::string & config) const1064 WifiErrorNo WifiHdiWpaClient::ReqP2pSetWfdDeviceConfig(const std::string &config) const
1065 {
1066 return HdiP2pSetWfdDeviceConfig(config.c_str());
1067 }
1068
ReqP2pStartFind(size_t timeout) const1069 WifiErrorNo WifiHdiWpaClient::ReqP2pStartFind(size_t timeout) const
1070 {
1071 return HdiP2pStartFind(timeout);
1072 }
1073
ReqP2pStopFind() const1074 WifiErrorNo WifiHdiWpaClient::ReqP2pStopFind() const
1075 {
1076 return HdiP2pStopFind();
1077 }
1078
ReqP2pSetExtListen(bool enable,size_t period,size_t interval) const1079 WifiErrorNo WifiHdiWpaClient::ReqP2pSetExtListen(bool enable, size_t period, size_t interval) const
1080 {
1081 if (enable) {
1082 if (period < HAL_P2P_LISTEN_MIN_TIME || period > HAL_P2P_LISTEN_MAX_TIME ||
1083 interval < HAL_P2P_LISTEN_MIN_TIME || interval > HAL_P2P_LISTEN_MAX_TIME || period > interval) {
1084 return WIFI_HAL_OPT_INVALID_PARAM;
1085 }
1086 }
1087 int flag = enable;
1088 return HdiP2pSetExtListen(flag, period, interval);
1089 }
1090
ReqP2pSetListenChannel(size_t channel,unsigned char regClass) const1091 WifiErrorNo WifiHdiWpaClient::ReqP2pSetListenChannel(size_t channel, unsigned char regClass) const
1092 {
1093 return HdiP2pSetListenChannel(channel, regClass);
1094 }
1095
ReqP2pConnect(const WifiP2pConfigInternal & config,bool isJoinExistingGroup,std::string & pin) const1096 WifiErrorNo WifiHdiWpaClient::ReqP2pConnect(const WifiP2pConfigInternal &config, bool isJoinExistingGroup,
1097 std::string &pin) const
1098 {
1099 LOGI("ReqP2pConnect");
1100 P2pConnectInfo info = {0};
1101 info.mode = isJoinExistingGroup;
1102 info.persistent = config.GetNetId();
1103 if (isJoinExistingGroup) {
1104 info.goIntent = 0;
1105 } else {
1106 info.goIntent = config.GetGroupOwnerIntent();
1107 }
1108 if (info.goIntent < HAL_P2P_GO_INTENT_MIN_LENGTH || info.goIntent > HAL_P2P_GO_INTENT_MAX_LENGTH) {
1109 info.goIntent = HAL_P2P_GO_INTENT_DEFAULT_LENGTH;
1110 }
1111 std::string address = config.GetDeviceAddress();
1112 if (address.size() < HAL_BSSID_LENGTH) {
1113 LOGI("ReqP2pConnect Device Address is too short");
1114 return WIFI_HAL_OPT_INVALID_PARAM;
1115 }
1116 WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1117 if (mode == WpsMethod::WPS_METHOD_LABEL) {
1118 mode = WpsMethod::WPS_METHOD_KEYPAD;
1119 }
1120 info.provdisc = (int)mode;
1121 std::string pinCode = config.GetWpsInfo().GetPin();
1122 if (mode == WpsMethod::WPS_METHOD_PBC && !pinCode.empty()) {
1123 LOGI("ReqP2pConnect Expected empty pin for PBC.");
1124 return WIFI_HAL_OPT_INVALID_PARAM;
1125 }
1126 if (strncpy_s(info.peerDevAddr, sizeof(info.peerDevAddr), address.c_str(), address.length()) != EOK ||
1127 strncpy_s(info.pin, sizeof(info.pin), pinCode.c_str(), pinCode.length()) != EOK) {
1128 LOGI("ReqP2pConnect failed");
1129 return WIFI_HAL_OPT_FAILED;
1130 }
1131 char resPin[HAL_PIN_CODE_LENGTH + 1] = {0};
1132 WifiErrorNo ret = HdiP2pConnect(&info, resPin, HAL_PIN_CODE_LENGTH + 1);
1133 if (ret == WIFI_HAL_OPT_OK) {
1134 pin = resPin;
1135 }
1136 return ret;
1137 }
1138
ReqP2pCancelConnect() const1139 WifiErrorNo WifiHdiWpaClient::ReqP2pCancelConnect() const
1140 {
1141 return HdiP2pCancelConnect();
1142 }
1143
ReqP2pProvisionDiscovery(const WifiP2pConfigInternal & config) const1144 WifiErrorNo WifiHdiWpaClient::ReqP2pProvisionDiscovery(const WifiP2pConfigInternal &config) const
1145 {
1146 WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1147 if (mode == WpsMethod::WPS_METHOD_LABEL) {
1148 mode = WpsMethod::WPS_METHOD_DISPLAY;
1149 } else if (mode == WpsMethod::WPS_METHOD_DISPLAY) {
1150 mode = WpsMethod::WPS_METHOD_KEYPAD;
1151 } else if (mode == WpsMethod::WPS_METHOD_KEYPAD) {
1152 mode = WpsMethod::WPS_METHOD_DISPLAY;
1153 } else if (mode != WpsMethod::WPS_METHOD_PBC) {
1154 return WIFI_HAL_OPT_FAILED;
1155 }
1156 return HdiP2pProvisionDiscovery(config.GetDeviceAddress().c_str(), static_cast<int>(mode));
1157 }
1158
ReqP2pAddGroup(bool isPersistent,int networkId,int freq) const1159 WifiErrorNo WifiHdiWpaClient::ReqP2pAddGroup(bool isPersistent, int networkId, int freq) const
1160 {
1161 int flag = isPersistent;
1162 return HdiP2pAddGroup(flag, networkId, freq);
1163 }
1164
ReqP2pRemoveGroup(const std::string & groupInterface) const1165 WifiErrorNo WifiHdiWpaClient::ReqP2pRemoveGroup(const std::string &groupInterface) const
1166 {
1167 return HdiP2pRemoveGroup(groupInterface.c_str());
1168 }
1169
ReqP2pInvite(const WifiP2pGroupInfo & group,const std::string & deviceAddr) const1170 WifiErrorNo WifiHdiWpaClient::ReqP2pInvite(const WifiP2pGroupInfo &group, const std::string &deviceAddr) const
1171 {
1172 return HdiP2pInvite(deviceAddr.c_str(), group.GetOwner().GetDeviceAddress().c_str(),
1173 group.GetInterface().c_str());
1174 }
1175
ReqP2pReinvoke(int networkId,const std::string & deviceAddr) const1176 WifiErrorNo WifiHdiWpaClient::ReqP2pReinvoke(int networkId, const std::string &deviceAddr) const
1177 {
1178 LOGI("HdiP2pReinvoke networkId=%{public}d, bssid=%{public}s", networkId, MacAnonymize(deviceAddr).c_str());
1179 return HdiP2pReinvoke(networkId, deviceAddr.c_str());
1180 }
1181
ReqP2pGetGroupCapability(const std::string & deviceAddress,uint32_t & cap) const1182 WifiErrorNo WifiHdiWpaClient::ReqP2pGetGroupCapability(const std::string &deviceAddress, uint32_t &cap) const
1183 {
1184 int capacity = 0;
1185 WifiErrorNo ret = HdiP2pGetGroupCapability(deviceAddress.c_str(), capacity);
1186 if (ret == WIFI_HAL_OPT_OK) {
1187 cap = capacity;
1188 }
1189 return ret;
1190 }
1191
ReqP2pAddService(const WifiP2pServiceInfo & info) const1192 WifiErrorNo WifiHdiWpaClient::ReqP2pAddService(const WifiP2pServiceInfo &info) const
1193 {
1194 WifiErrorNo ret = WIFI_HAL_OPT_OK;
1195 HdiP2pServiceInfo servInfo = {0};
1196 std::vector<std::string> queryList = info.GetQueryList();
1197 for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1198 std::vector<std::string> vec;
1199 SplitString(*iter, " ", vec);
1200 if (vec.size() < HAL_P2P_SERVICE_TYPE_MIN_SIZE) {
1201 return WIFI_HAL_OPT_FAILED;
1202 }
1203 if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1204 return WIFI_HAL_OPT_FAILED;
1205 }
1206 const std::string &tmp = vec[HAL_P2P_SERVICE_TYPE_2_POS];
1207 if (vec[0] == "upnp") {
1208 servInfo.mode = 0;
1209 servInfo.version = atoi(vec[1].c_str());
1210 if (strncpy_s((char *)servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1211 return WIFI_HAL_OPT_FAILED;
1212 }
1213 ret = HdiP2pAddService(&servInfo);
1214 } else if (vec[0] == "bonjour") {
1215 servInfo.mode = 1;
1216 if (strncpy_s((char *)servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK ||
1217 strncpy_s((char *)servInfo.resp, sizeof(servInfo.resp), tmp.c_str(), tmp.length()) != EOK) {
1218 return WIFI_HAL_OPT_FAILED;
1219 }
1220 ret = HdiP2pAddService(&servInfo);
1221 } else {
1222 ret = WIFI_HAL_OPT_FAILED;
1223 }
1224 if (ret != WIFI_HAL_OPT_OK) {
1225 break;
1226 }
1227 }
1228 return ret;
1229 }
1230
ReqP2pRemoveService(const WifiP2pServiceInfo & info) const1231 WifiErrorNo WifiHdiWpaClient::ReqP2pRemoveService(const WifiP2pServiceInfo &info) const
1232 {
1233 WifiErrorNo ret = WIFI_HAL_OPT_OK;
1234 HdiP2pServiceInfo servInfo = {0};
1235 std::vector<std::string> queryList = info.GetQueryList();
1236 for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1237 std::vector<std::string> vec;
1238 SplitString(*iter, " ", vec);
1239 if (vec.size() < HAL_P2P_SERVICE_TYPE_MIN_SIZE) {
1240 return WIFI_HAL_OPT_FAILED;
1241 }
1242 if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1243 return WIFI_HAL_OPT_FAILED;
1244 }
1245 const std::string &tmp = vec[HAL_P2P_SERVICE_TYPE_2_POS];
1246 if (vec[0] == "upnp") {
1247 servInfo.mode = 0;
1248 servInfo.version = atoi(vec[1].c_str());
1249 if (strncpy_s((char *)servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1250 return WIFI_HAL_OPT_FAILED;
1251 }
1252 ret = HdiP2pRemoveService(&servInfo);
1253 } else if (vec[0] == "bonjour") {
1254 servInfo.mode = 1;
1255 if (strncpy_s((char *)servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK) {
1256 return WIFI_HAL_OPT_FAILED;
1257 }
1258 ret = HdiP2pRemoveService(&servInfo);
1259 } else {
1260 ret = WIFI_HAL_OPT_FAILED;
1261 }
1262 if (ret != WIFI_HAL_OPT_OK) {
1263 break;
1264 }
1265 }
1266 return ret;
1267 }
1268
ReqP2pReqServiceDiscovery(const std::string & deviceAddress,const std::vector<unsigned char> & tlvs,std::string & reqID) const1269 WifiErrorNo WifiHdiWpaClient::ReqP2pReqServiceDiscovery(
1270 const std::string &deviceAddress, const std::vector<unsigned char> &tlvs, std::string &reqID) const
1271 {
1272 if (deviceAddress.size() != HAL_BSSID_LENGTH || tlvs.empty()) {
1273 return WIFI_HAL_OPT_INVALID_PARAM;
1274 }
1275 unsigned size = (tlvs.size() << 1) + 1;
1276 char *pTlvs = (char *)calloc(size, sizeof(char));
1277 if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1278 free(pTlvs);
1279 pTlvs = nullptr;
1280 return WIFI_HAL_OPT_FAILED;
1281 }
1282 struct HdiP2pReqService wpsParam = {0};
1283 wpsParam.bssid = (unsigned char *)deviceAddress.c_str();
1284 wpsParam.msg = (unsigned char *)pTlvs;
1285 char retBuf[HAL_P2P_TMP_BUFFER_SIZE_128] = {0};
1286 WifiErrorNo ret = HdiP2pReqServiceDiscovery(&wpsParam, retBuf, HAL_P2P_TMP_BUFFER_SIZE_128);
1287 if (ret == WIFI_HAL_OPT_OK) {
1288 reqID = retBuf;
1289 }
1290 free(pTlvs);
1291 pTlvs = nullptr;
1292 return ret;
1293 }
1294
ReqP2pCancelServiceDiscovery(const std::string & id) const1295 WifiErrorNo WifiHdiWpaClient::ReqP2pCancelServiceDiscovery(const std::string &id) const
1296 {
1297 return HdiP2pCancelServiceDiscovery(id.c_str());
1298 }
1299
ReqP2pSetRandomMac(bool enable) const1300 WifiErrorNo WifiHdiWpaClient::ReqP2pSetRandomMac(bool enable) const
1301 {
1302 return HdiP2pSetRandomMac(enable ? 1 : 0);
1303 }
1304
ReqP2pSetMiracastType(int type) const1305 WifiErrorNo WifiHdiWpaClient::ReqP2pSetMiracastType(int type) const
1306 {
1307 return WIFI_HAL_OPT_FAILED;
1308 }
1309
ReqSetPersistentReconnect(int mode) const1310 WifiErrorNo WifiHdiWpaClient::ReqSetPersistentReconnect(int mode) const
1311 {
1312 return HdiP2pSetPersistentReconnect(mode);
1313 }
1314
ReqRespServiceDiscovery(const WifiP2pDevice & device,int frequency,int dialogToken,const std::vector<unsigned char> & tlvs) const1315 WifiErrorNo WifiHdiWpaClient::ReqRespServiceDiscovery(
1316 const WifiP2pDevice &device, int frequency, int dialogToken, const std::vector<unsigned char> &tlvs) const
1317 {
1318 if (tlvs.empty()) {
1319 return WIFI_HAL_OPT_INVALID_PARAM;
1320 }
1321 unsigned size = (tlvs.size() << 1) + 1;
1322 char *pTlvs = (char *)calloc(size, sizeof(char));
1323 if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1324 if (pTlvs != nullptr) {
1325 free(pTlvs);
1326 pTlvs = nullptr;
1327 }
1328 return WIFI_HAL_OPT_FAILED;
1329 }
1330 struct HdiP2pServDiscReqInfo wpsParam = {0};
1331 wpsParam.freq = frequency;
1332 wpsParam.dialogToken = dialogToken;
1333 wpsParam.mac = (unsigned char *)device.GetDeviceAddress().c_str();
1334 wpsParam.tlvs = (unsigned char *)pTlvs;
1335 WifiErrorNo ret = HdiP2pRespServerDiscovery(&wpsParam);
1336 free(pTlvs);
1337 pTlvs = nullptr;
1338 return ret;
1339 }
1340
ReqSetServiceDiscoveryExternal(bool isExternalProcess) const1341 WifiErrorNo WifiHdiWpaClient::ReqSetServiceDiscoveryExternal(bool isExternalProcess) const
1342 {
1343 return HdiP2pSetServDiscExternal(isExternalProcess);
1344 }
1345
ReqGetP2pPeer(const std::string & deviceAddress,WifiP2pDevice & device) const1346 WifiErrorNo WifiHdiWpaClient::ReqGetP2pPeer(const std::string &deviceAddress, WifiP2pDevice &device) const
1347 {
1348 HdiP2pDeviceInfo peerInfo;
1349 if (memset_s(&peerInfo, sizeof(peerInfo), 0, sizeof(peerInfo)) != EOK) {
1350 return WIFI_HAL_OPT_FAILED;
1351 }
1352 WifiErrorNo ret = HdiP2pGetPeer(deviceAddress.c_str(), &peerInfo);
1353 if (ret == WIFI_HAL_OPT_OK) {
1354 device.SetDeviceAddress((char *)peerInfo.p2pDeviceAddress);
1355 device.SetDeviceName((char *)peerInfo.deviceName);
1356 device.SetPrimaryDeviceType((char *)peerInfo.primaryDeviceType);
1357 device.SetWpsConfigMethod(peerInfo.configMethods);
1358 device.SetDeviceCapabilitys(peerInfo.deviceCapabilities);
1359 device.SetGroupCapabilitys(peerInfo.groupCapabilities);
1360 device.SetNetworkName((char *)peerInfo.operSsid);
1361 }
1362 FreeHdiP2pDeviceInfo(&peerInfo);
1363 return ret;
1364 }
1365
ReqP2pGetSupportFrequencies(int band,std::vector<int> & frequencies) const1366 WifiErrorNo WifiHdiWpaClient::ReqP2pGetSupportFrequencies(int band, std::vector<int> &frequencies) const
1367 {
1368 return WIFI_HAL_OPT_FAILED;
1369 }
1370
ReqP2pSetGroupConfig(int networkId,const HalP2pGroupConfig & config) const1371 WifiErrorNo WifiHdiWpaClient::ReqP2pSetGroupConfig(int networkId, const HalP2pGroupConfig &config) const
1372 {
1373 P2pGroupConfig conf[GROUP_CONFIG_END_POS];
1374 if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
1375 return WIFI_HAL_OPT_FAILED;
1376 }
1377 int num = 0;
1378 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_SSID, "\"" + config.ssid + "\"");
1379 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_BSSID, config.bssid);
1380 // If the PSK length is less than 8 or greater than 63, Do not set this psk field.
1381 if (config.psk.length() >= HAL_PSK_MIN_LENGTH && config.psk.length() < HAL_PSK_MAX_LENGTH) {
1382 std::string tmp = "\"" + config.psk + "\"";
1383 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, tmp);
1384 } else if (config.psk.length() == HAL_PSK_MAX_LENGTH) {
1385 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, config.psk);
1386 }
1387 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PROTO, config.proto);
1388 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_KEY_MGMT, config.keyMgmt);
1389 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PAIRWISE, config.pairwise);
1390 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_AUTH_ALG, config.authAlg);
1391
1392 num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_MODE, config.mode);
1393 num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_DISABLED, config.disabled);
1394 if (num == 0) {
1395 return WIFI_HAL_OPT_OK;
1396 }
1397 LOGI("WifiHdiWpaClient::%{public}s enter, mode=%{public}d", __func__, config.mode);
1398 return HdiP2pSetGroupConfig(networkId, conf, num);
1399 }
1400
PushP2pGroupConfigString(P2pGroupConfig * pConfig,P2pGroupConfigType type,const std::string & str) const1401 int WifiHdiWpaClient::PushP2pGroupConfigString(
1402 P2pGroupConfig *pConfig, P2pGroupConfigType type, const std::string &str) const
1403 {
1404 if (str.length() > 0) {
1405 pConfig->cfgParam = type;
1406 if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), str.c_str(), str.length()) != EOK) {
1407 return 0;
1408 }
1409 return 1;
1410 } else {
1411 return 0;
1412 }
1413 }
1414
PushP2pGroupConfigInt(P2pGroupConfig * pConfig,P2pGroupConfigType type,int i) const1415 int WifiHdiWpaClient::PushP2pGroupConfigInt(P2pGroupConfig *pConfig, P2pGroupConfigType type, int i) const
1416 {
1417 pConfig->cfgParam = type;
1418 if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
1419 return 0;
1420 }
1421 return 1;
1422 }
1423
ReqP2pGetGroupConfig(int networkId,HalP2pGroupConfig & config) const1424 WifiErrorNo WifiHdiWpaClient::ReqP2pGetGroupConfig(int networkId, HalP2pGroupConfig &config) const
1425 {
1426 char ssid[] = "ssid";
1427 char cfgValue[WIFI_P2P_GROUP_CONFIG_VALUE_LENGTH];
1428 if (HdiP2pGetGroupConfig(networkId, ssid, cfgValue) != 0) {
1429 return WIFI_HAL_OPT_FAILED;
1430 }
1431 config.ssid = cfgValue;
1432 return WIFI_HAL_OPT_OK;
1433 }
1434
ReqP2pAddNetwork(int & networkId) const1435 WifiErrorNo WifiHdiWpaClient::ReqP2pAddNetwork(int &networkId) const
1436 {
1437 return HdiP2pAddNetwork(&networkId);
1438 }
1439
ReqP2pHid2dConnect(const Hid2dConnectConfig & config) const1440 WifiErrorNo WifiHdiWpaClient::ReqP2pHid2dConnect(const Hid2dConnectConfig &config) const
1441 {
1442 Hid2dConnectInfo info;
1443 if (memset_s(&info, sizeof(info), 0, sizeof(info)) != EOK) {
1444 return WIFI_HAL_OPT_FAILED;
1445 }
1446 if (strncpy_s(info.ssid, sizeof(info.ssid), config.GetSsid().c_str(), config.GetSsid().length()) != EOK) {
1447 return WIFI_HAL_OPT_FAILED;
1448 }
1449 if (strncpy_s(info.bssid, sizeof(info.bssid), config.GetBssid().c_str(),
1450 config.GetBssid().length()) != EOK) {
1451 return WIFI_HAL_OPT_FAILED;
1452 }
1453 if (strncpy_s(info.passphrase, sizeof(info.passphrase),
1454 config.GetPreSharedKey().c_str(), config.GetPreSharedKey().length()) != EOK) {
1455 return WIFI_HAL_OPT_FAILED;
1456 }
1457 info.frequency = config.GetFrequency();
1458 if (config.GetDhcpMode() == DhcpMode::CONNECT_AP_DHCP ||
1459 config.GetDhcpMode() == DhcpMode::CONNECT_AP_NODHCP) {
1460 info.isLegacyGo = 1;
1461 } else {
1462 info.isLegacyGo = 0;
1463 }
1464 WifiErrorNo ret = HdiP2pHid2dConnect(&info);
1465 return ret;
1466 }
1467
DeliverP2pData(int32_t cmdType,int32_t dataType,const std::string & carryData) const1468 WifiErrorNo WifiHdiWpaClient::DeliverP2pData(int32_t cmdType, int32_t dataType, const std::string& carryData) const
1469 {
1470 return HdiDeliverP2pData(cmdType, dataType, carryData.c_str());
1471 }
1472
ReqRegisterNativeProcessCallback(const std::function<void (int)> & callback) const1473 WifiErrorNo WifiHdiWpaClient::ReqRegisterNativeProcessCallback(const std::function<void(int)> &callback) const
1474 {
1475 if (callback) {
1476 return HdiSetNativeProcessCallback(OnNativeProcessDeath);
1477 }
1478 return WIFI_HAL_OPT_FAILED;
1479 }
1480 } // namespace Wifi
1481 } // namespace OHOS
1482 #endif