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 "wifi_idl_client.h"
17 #include <cstdio>
18 #include "wifi_global_func.h"
19 #include "wifi_log.h"
20 #include "wifi_idl_inner_interface.h"
21 #include "i_wifi.h"
22 #include "i_wifi_chip.h"
23 #include "i_wifi_chip_event_callback.h"
24 #include "i_wifi_hotspot_iface.h"
25 #include "i_wifi_sta_iface.h"
26 #include "i_wifi_supplicant_iface.h"
27 #include "i_wifi_p2p_iface.h"
28 #include "wifi_common_def.h"
29 #include "wifi_common_util.h"
30
31 #undef LOG_TAG
32 #define LOG_TAG "WifiIdlClient"
33
34 namespace OHOS {
35 namespace Wifi {
36 const int BUFFER_SIZE = 4096;
37 const int PMF_OPTIONAL = 1;
38 const int PMF_REQUIRED = 2;
39
40 #define CHECK_CLIENT_NOT_NULL \
41 do { \
42 if (pRpcClient == nullptr) { \
43 return WIFI_HAL_OPT_FAILED; \
44 } \
45 } while (0)
46
WifiIdlClient()47 WifiIdlClient::WifiIdlClient()
48 {
49 pRpcClient = nullptr;
50 }
51
~WifiIdlClient()52 WifiIdlClient::~WifiIdlClient()
53 {
54 if (pRpcClient != nullptr) {
55 ReleaseRpcClient(pRpcClient);
56 pRpcClient = nullptr;
57 }
58 }
59
InitClient(void)60 int WifiIdlClient::InitClient(void)
61 {
62 const std::string idlSockPath = CONFIG_ROOR_DIR"/unix_sock.sock";
63 pRpcClient = CreateRpcClient(idlSockPath.c_str());
64 if (pRpcClient == nullptr) {
65 LOGE("init rpc client failed!");
66 return -1;
67 }
68 return 0;
69 }
70
ExitAllClient(void)71 void WifiIdlClient::ExitAllClient(void)
72 {
73 LOGI("Exit all client!");
74 if (pRpcClient == nullptr) {
75 return;
76 }
77 NotifyClear();
78 return;
79 }
80
StartWifi(void)81 WifiErrorNo WifiIdlClient::StartWifi(void)
82 {
83 CHECK_CLIENT_NOT_NULL;
84 return Start();
85 }
86
StopWifi(void)87 WifiErrorNo WifiIdlClient::StopWifi(void)
88 {
89 CHECK_CLIENT_NOT_NULL;
90 return Stop();
91 }
92
ReqConnect(int networkId)93 WifiErrorNo WifiIdlClient::ReqConnect(int networkId)
94 {
95 CHECK_CLIENT_NOT_NULL;
96 return Connect(networkId);
97 }
98
ReqReconnect(void)99 WifiErrorNo WifiIdlClient::ReqReconnect(void)
100 {
101 CHECK_CLIENT_NOT_NULL;
102 return Reconnect();
103 }
104
ReqReassociate(void)105 WifiErrorNo WifiIdlClient::ReqReassociate(void)
106 {
107 CHECK_CLIENT_NOT_NULL;
108 return Reassociate();
109 }
110
ReqDisconnect(void)111 WifiErrorNo WifiIdlClient::ReqDisconnect(void)
112 {
113 CHECK_CLIENT_NOT_NULL;
114 return Disconnect();
115 }
116
GetStaCapabilities(unsigned int & capabilities)117 WifiErrorNo WifiIdlClient::GetStaCapabilities(unsigned int &capabilities)
118 {
119 CHECK_CLIENT_NOT_NULL;
120 return GetCapabilities(static_cast<uint32_t *>(&capabilities));
121 }
122
GetStaDeviceMacAddress(std::string & mac)123 WifiErrorNo WifiIdlClient::GetStaDeviceMacAddress(std::string &mac)
124 {
125 CHECK_CLIENT_NOT_NULL;
126 char szMac[HAL_BSSID_LENGTH + 1] = {0};
127 int len = HAL_BSSID_LENGTH + 1;
128 WifiErrorNo err = GetDeviceMacAddress((unsigned char *)szMac, &len);
129 if (err == WIFI_HAL_OPT_OK) {
130 mac = std::string(szMac);
131 }
132 return err;
133 }
134
GetSupportFrequencies(int band,std::vector<int> & frequencies)135 WifiErrorNo WifiIdlClient::GetSupportFrequencies(int band, std::vector<int> &frequencies)
136 {
137 CHECK_CLIENT_NOT_NULL;
138
139 int values[HAL_GET_MAX_BANDS] = {0};
140 int size = HAL_GET_MAX_BANDS;
141
142 if (GetFrequencies(band, values, &size) != 0) {
143 return WIFI_HAL_OPT_FAILED;
144 }
145
146 for (int i = 0; i < size; i++) {
147 frequencies.push_back(values[i]);
148 }
149
150 return WIFI_HAL_OPT_OK;
151 }
152
SetConnectMacAddr(const std::string & mac,const int portType)153 WifiErrorNo WifiIdlClient::SetConnectMacAddr(const std::string &mac, const int portType)
154 {
155 CHECK_CLIENT_NOT_NULL;
156 if (CheckMacIsValid(mac) != 0) {
157 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
158 }
159 if (portType == 0) {
160 if (IsOtherVapConnect()) {
161 LOGI("SetConnectMacAddr: p2p or hml connected, and hotspot is enable");
162 return WIFI_HAL_OPT_OK;
163 }
164 }
165 int len = mac.length();
166 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
167 unsigned char* macStr = macBytes.data();
168 return SetAssocMacAddr(macStr, len, portType);
169 }
170
SetScanMacAddress(const std::string & mac)171 WifiErrorNo WifiIdlClient::SetScanMacAddress(const std::string &mac)
172 {
173 CHECK_CLIENT_NOT_NULL;
174 if (CheckMacIsValid(mac) != 0) {
175 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
176 }
177 int len = mac.length();
178 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
179 unsigned char* macStr = macBytes.data();
180 return SetScanningMacAddress(macStr, len);
181 }
182
DisconnectLastRoamingBssid(const std::string & mac)183 WifiErrorNo WifiIdlClient::DisconnectLastRoamingBssid(const std::string &mac)
184 {
185 CHECK_CLIENT_NOT_NULL;
186 if (CheckMacIsValid(mac) != 0) {
187 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
188 }
189 int len = mac.length();
190 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
191 unsigned char* macStr = macBytes.data();
192 return DeauthLastRoamingBssid(macStr, len);
193 }
194
ReqGetSupportFeature(long & feature)195 WifiErrorNo WifiIdlClient::ReqGetSupportFeature(long &feature)
196 {
197 CHECK_CLIENT_NOT_NULL;
198 return GetSupportFeature(&feature);
199 }
200
SetTxPower(int power)201 WifiErrorNo WifiIdlClient::SetTxPower(int power)
202 {
203 CHECK_CLIENT_NOT_NULL;
204 return SetWifiTxPower(static_cast<int32_t>(power));
205 }
206
Scan(const WifiHalScanParam & scanParam)207 WifiErrorNo WifiIdlClient::Scan(const WifiHalScanParam &scanParam)
208 {
209 CHECK_CLIENT_NOT_NULL;
210 ScanSettings settings;
211 if (memset_s(&settings, sizeof(settings), 0, sizeof(settings)) != EOK) {
212 return WIFI_HAL_OPT_FAILED;
213 }
214 bool bfail = false;
215 do {
216 if (scanParam.hiddenNetworkSsid.size() > 0) {
217 settings.hiddenSsidSize = scanParam.hiddenNetworkSsid.size();
218 settings.hiddenSsid = ConVectorToCArrayString(scanParam.hiddenNetworkSsid);
219 if (settings.hiddenSsid == nullptr) {
220 bfail = true;
221 break;
222 }
223 }
224 if (scanParam.scanFreqs.size() > 0) {
225 settings.freqSize = scanParam.scanFreqs.size();
226 settings.freqs = (int *)calloc(settings.freqSize, sizeof(int));
227 if (settings.freqs == nullptr) {
228 bfail = true;
229 break;
230 }
231 for (int i = 0; i < settings.freqSize; ++i) {
232 settings.freqs[i] = scanParam.scanFreqs[i];
233 }
234 }
235 if (scanParam.scanStyle > 0) {
236 settings.scanStyle = scanParam.scanStyle;
237 }
238 } while (0);
239 WifiErrorNo err = WIFI_HAL_OPT_FAILED;
240 if (!bfail) {
241 err = StartScan(&settings);
242 }
243 if (settings.freqs != nullptr) {
244 free(settings.freqs);
245 settings.freqs = nullptr;
246 }
247 if (settings.hiddenSsid != nullptr) {
248 for (int i = 0; i < settings.hiddenSsidSize; ++i) {
249 free(settings.hiddenSsid[i]);
250 settings.hiddenSsid[i] = nullptr;
251 }
252 free(settings.hiddenSsid);
253 settings.hiddenSsid = nullptr;
254 }
255 return err;
256 }
257
ReqGetNetworkList(std::vector<WifiHalWpaNetworkInfo> & networkList)258 WifiErrorNo WifiIdlClient::ReqGetNetworkList(std::vector<WifiHalWpaNetworkInfo> &networkList)
259 {
260 CHECK_CLIENT_NOT_NULL;
261 WifiNetworkInfo infos[HAL_GET_MAX_NETWORK_LIST];
262 if (memset_s(infos, sizeof(infos), 0, sizeof(infos)) != EOK) {
263 return WIFI_HAL_OPT_FAILED;
264 }
265 int size = HAL_GET_MAX_NETWORK_LIST;
266 WifiErrorNo err = GetNetworkList(infos, &size);
267 if (err != WIFI_HAL_OPT_OK) {
268 return err;
269 }
270 for (int i = 0; i < size; ++i) {
271 WifiHalWpaNetworkInfo tmp;
272 tmp.id = infos[i].id;
273 tmp.ssid = infos[i].ssid;
274 tmp.bssid = infos[i].bssid;
275 tmp.flag = infos[i].flags;
276 networkList.emplace_back(tmp);
277 }
278 return err;
279 }
280
QueryScanInfos(std::vector<InterScanInfo> & scanInfos)281 WifiErrorNo WifiIdlClient::QueryScanInfos(std::vector<InterScanInfo> &scanInfos)
282 {
283 CHECK_CLIENT_NOT_NULL;
284 int size = HAL_GET_MAX_SCAN_INFO;
285 ScanInfo* results = GetScanInfos(&size);
286 if (results == NULL) {
287 return size == 0 ? WIFI_HAL_OPT_OK : WIFI_HAL_OPT_FAILED;
288 }
289 for (int i = 0; i < size; ++i) {
290 InterScanInfo tmp;
291 tmp.ssid = results[i].ssid;
292 tmp.bssid = results[i].bssid;
293 tmp.frequency = results[i].freq;
294 tmp.rssi = results[i].siglv;
295 tmp.timestamp = results[i].timestamp;
296 tmp.capabilities = results[i].flags;
297 tmp.channelWidth = (WifiChannelWidth)results[i].channelWidth;
298 tmp.centerFrequency0 = results[i].centerFrequency0;
299 tmp.centerFrequency1 = results[i].centerFrequency1;
300 tmp.isVhtInfoExist = results[i].isVhtInfoExist;
301 tmp.isHtInfoExist = results[i].isHtInfoExist;
302 tmp.isHeInfoExist = results[i].isHeInfoExist;
303 tmp.isErpExist = results[i].isErpExist;
304 tmp.maxRates = results[i].maxRates > results[i].extMaxRates ? results[i].maxRates : results[i].extMaxRates;
305
306 for (int j = 0; j < results[i].ieSize; ++j) {
307 WifiInfoElem infoElemTmp;
308 int infoElemSize = results[i].infoElems[j].size;
309 infoElemTmp.id = results[i].infoElems[j].id;
310 for (int k = 0; k < infoElemSize; ++k) {
311 infoElemTmp.content.emplace_back(results[i].infoElems[j].content[k]);
312 }
313 if (results[i].infoElems[j].content) {
314 free(results[i].infoElems[j].content);
315 }
316 tmp.infoElems.emplace_back(infoElemTmp);
317 }
318 if (results[i].infoElems) {
319 free(results[i].infoElems);
320 }
321 tmp.isHiLinkNetwork = results[i].isHiLinkNetwork;
322 scanInfos.emplace_back(tmp);
323 }
324 free(results);
325 results = nullptr;
326 return WIFI_HAL_OPT_OK;
327 }
328
ConvertPnoScanParam(const WifiHalPnoScanParam & param,PnoScanSettings * pSettings) const329 WifiErrorNo WifiIdlClient::ConvertPnoScanParam(const WifiHalPnoScanParam ¶m, PnoScanSettings *pSettings) const
330 {
331 if (param.scanInterval > 0) {
332 pSettings->scanInterval = param.scanInterval;
333 }
334 pSettings->minRssi2Dot4Ghz = param.minRssi2Dot4Ghz;
335 pSettings->minRssi5Ghz = param.minRssi5Ghz;
336 if (param.hiddenSsid.size() > 0) {
337 pSettings->hiddenSsidSize = param.hiddenSsid.size();
338 pSettings->hiddenSsid = ConVectorToCArrayString(param.hiddenSsid);
339 if (pSettings->hiddenSsid == nullptr) {
340 return WIFI_HAL_OPT_FAILED;
341 }
342 }
343 if (param.savedSsid.size() > 0) {
344 pSettings->savedSsidSize = param.savedSsid.size();
345 pSettings->savedSsid = ConVectorToCArrayString(param.savedSsid);
346 if (pSettings->savedSsid == nullptr) {
347 return WIFI_HAL_OPT_FAILED;
348 }
349 }
350 if (param.scanFreqs.size() > 0) {
351 pSettings->freqSize = param.scanFreqs.size();
352 pSettings->freqs = (int *)calloc(pSettings->freqSize, sizeof(int));
353 if (pSettings->freqs == nullptr) {
354 return WIFI_HAL_OPT_FAILED;
355 }
356 for (int i = 0; i < pSettings->freqSize; ++i) {
357 pSettings->freqs[i] = param.scanFreqs[i];
358 }
359 }
360 return WIFI_HAL_OPT_OK;
361 }
362
ReqStartPnoScan(const WifiHalPnoScanParam & scanParam)363 WifiErrorNo WifiIdlClient::ReqStartPnoScan(const WifiHalPnoScanParam &scanParam)
364 {
365 CHECK_CLIENT_NOT_NULL;
366 PnoScanSettings settings;
367 if (memset_s(&settings, sizeof(settings), 0, sizeof(settings)) != EOK) {
368 return WIFI_HAL_OPT_FAILED;
369 }
370 WifiErrorNo err = ConvertPnoScanParam(scanParam, &settings);
371 if (err == WIFI_HAL_OPT_OK) {
372 err = StartPnoScan(&settings);
373 }
374 if (settings.freqs != nullptr) {
375 free(settings.freqs);
376 settings.freqs = nullptr;
377 }
378 if (settings.hiddenSsid != nullptr) {
379 for (int i = 0; i < settings.hiddenSsidSize; ++i) {
380 free(settings.hiddenSsid[i]);
381 settings.hiddenSsid[i] = nullptr;
382 }
383 free(settings.hiddenSsid);
384 settings.hiddenSsid = nullptr;
385 }
386 if (settings.savedSsid != nullptr) {
387 for (int i = 0; i < settings.savedSsidSize; ++i) {
388 free(settings.savedSsid[i]);
389 settings.savedSsid[i] = nullptr;
390 }
391 free(settings.savedSsid);
392 settings.savedSsid = nullptr;
393 }
394 return err;
395 }
396
ReqStopPnoScan(void)397 WifiErrorNo WifiIdlClient::ReqStopPnoScan(void)
398 {
399 CHECK_CLIENT_NOT_NULL;
400 return StopPnoScan();
401 }
402
RemoveDevice(int networkId)403 WifiErrorNo WifiIdlClient::RemoveDevice(int networkId)
404 {
405 CHECK_CLIENT_NOT_NULL;
406 if (networkId < 0) {
407 return WIFI_HAL_OPT_INVALID_PARAM;
408 }
409 return RemoveNetwork(networkId);
410 }
411
ClearDeviceConfig(void) const412 WifiErrorNo WifiIdlClient::ClearDeviceConfig(void) const
413 {
414 CHECK_CLIENT_NOT_NULL;
415 return RemoveNetwork(-1);
416 }
417
GetNextNetworkId(int & networkId)418 WifiErrorNo WifiIdlClient::GetNextNetworkId(int &networkId)
419 {
420 CHECK_CLIENT_NOT_NULL;
421 return AddNetwork(&networkId);
422 }
423
ReqEnableNetwork(int networkId)424 WifiErrorNo WifiIdlClient::ReqEnableNetwork(int networkId)
425 {
426 CHECK_CLIENT_NOT_NULL;
427 return EnableNetwork(networkId);
428 }
429
ReqDisableNetwork(int networkId)430 WifiErrorNo WifiIdlClient::ReqDisableNetwork(int networkId)
431 {
432 CHECK_CLIENT_NOT_NULL;
433 return DisableNetwork(networkId);
434 }
435
GetDeviceConfig(WifiHalGetDeviceConfig & config)436 WifiErrorNo WifiIdlClient::GetDeviceConfig(WifiHalGetDeviceConfig &config)
437 {
438 CHECK_CLIENT_NOT_NULL;
439 GetNetworkConfig conf;
440 if (memset_s(&conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
441 return WIFI_HAL_OPT_FAILED;
442 }
443 conf.networkId = config.networkId;
444 if (strncpy_s(conf.param, sizeof(conf.param), config.param.c_str(), config.param.length()) != EOK) {
445 return WIFI_HAL_OPT_FAILED;
446 }
447 int ret = WpaGetNetwork(&conf);
448 if (ret != WIFI_HAL_OPT_OK) {
449 return WIFI_HAL_OPT_FAILED;
450 }
451 config.value = conf.value;
452 return WIFI_HAL_OPT_OK;
453 }
454
PushDeviceConfigString(SetNetworkConfig * pConfig,DeviceConfigType type,const std::string & msg,bool checkEmpty) const455 int WifiIdlClient::PushDeviceConfigString(
456 SetNetworkConfig *pConfig, DeviceConfigType type, const std::string &msg, bool checkEmpty) const
457 {
458 if (!checkEmpty || msg.length() > 0) {
459 pConfig->cfgParam = type;
460 if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), msg.c_str(), msg.length()) != EOK) {
461 return 0;
462 }
463 return 1;
464 } else {
465 return 0;
466 }
467 }
468
PushDeviceConfigInt(SetNetworkConfig * pConfig,DeviceConfigType type,int i) const469 int WifiIdlClient::PushDeviceConfigInt(SetNetworkConfig *pConfig, DeviceConfigType type, int i) const
470 {
471 pConfig->cfgParam = type;
472 if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
473 return 0;
474 }
475 return 1;
476 }
477
PushDeviceConfigAuthAlgorithm(SetNetworkConfig * pConfig,DeviceConfigType type,unsigned int alg) const478 int WifiIdlClient::PushDeviceConfigAuthAlgorithm(
479 SetNetworkConfig *pConfig, DeviceConfigType type, unsigned int alg) const
480 {
481 pConfig->cfgParam = type;
482 if (alg & 0x1) {
483 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN ") != EOK) {
484 return 0;
485 }
486 }
487 if (alg & 0x2) {
488 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN SHARED ") != EOK) {
489 return 0;
490 }
491 }
492 if (alg & 0x4) {
493 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "LEAP ") != EOK) {
494 return 0;
495 }
496 }
497 return 1;
498 }
499
PushDeviceConfigParseMask(SetNetworkConfig * pConfig,DeviceConfigType type,unsigned int mask,const std::string parseStr[],int size) const500 int WifiIdlClient::PushDeviceConfigParseMask(
501 SetNetworkConfig *pConfig, DeviceConfigType type,
502 unsigned int mask, const std::string parseStr[], int size) const
503 {
504 pConfig->cfgParam = type;
505 for (int i = 0; i < size; i++) {
506 if (mask & (0x1 << i)) {
507 if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), parseStr[i].c_str()) != EOK) {
508 return 0;
509 }
510 }
511 }
512 return 1;
513 }
514
CheckValidDeviceConfig(const WifiHalDeviceConfig & config) const515 WifiErrorNo WifiIdlClient::CheckValidDeviceConfig(const WifiHalDeviceConfig &config) const
516 {
517 if (config.authAlgorithms >= HAL_AUTH_ALGORITHM_MAX) { /* max is 0111 */
518 return WIFI_HAL_OPT_FAILED;
519 }
520 return WIFI_HAL_OPT_OK;
521 }
522
SetDeviceConfig(int networkId,const WifiHalDeviceConfig & config)523 WifiErrorNo WifiIdlClient::SetDeviceConfig(int networkId, const WifiHalDeviceConfig &config)
524 {
525 CHECK_CLIENT_NOT_NULL;
526 if (CheckValidDeviceConfig(config) != WIFI_HAL_OPT_OK) {
527 LOGE("SetDeviceConfig, CheckValidDeviceConfig return error!");
528 return WIFI_HAL_OPT_FAILED;
529 }
530 SetNetworkConfig conf[DEVICE_CONFIG_END_POS];
531 if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
532 LOGE("SetDeviceConfig, memset_s return error!");
533 return WIFI_HAL_OPT_FAILED;
534 }
535 int num = 0;
536 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_SSID, config.ssid);
537 if (config.keyMgmt.find(KEY_MGMT_WPA_PSK) != std::string::npos) {
538 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PSK, config.psk);
539 }
540 if (config.keyMgmt.find(KEY_MGMT_SAE) != std::string::npos) {
541 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_SAE_PASSWD, config.psk);
542 }
543 if (config.keyMgmt == KEY_MGMT_NONE || config.keyMgmt == KEY_MGMT_WEP) {
544 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, KEY_MGMT_NONE);
545 } else {
546 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, config.keyMgmt);
547 }
548 EapMethod eapMethod = WifiEapConfig::Str2EapMethod(config.eapConfig.eap);
549 LOGI("%{public}s, eap:%{public}s, eapMethod:%{public}d, num:%{public}d",
550 __func__, config.eapConfig.eap.c_str(), eapMethod, num);
551 switch (eapMethod) {
552 case EapMethod::EAP_PEAP:
553 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
554 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
555 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
556 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CA_CERT, config.eapConfig.caCertPath);
557 if (config.eapConfig.phase2Method != static_cast<int>(Phase2Method::NONE)) {
558 std::string strPhase2Method = WifiEapConfig::Phase2MethodToStr(config.eapConfig.eap,
559 config.eapConfig.phase2Method);
560 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PHASE2METHOD, strPhase2Method);
561 }
562 break;
563 case EapMethod::EAP_TLS:
564 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
565 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
566 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CA_CERT, config.eapConfig.caCertPath);
567 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CLIENT_CERT, config.eapConfig.clientCert);
568 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PRIVATE_KEY, config.eapConfig.privateKey);
569 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
570 break;
571 case EapMethod::EAP_TTLS:
572 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
573 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
574 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CA_CERT, config.eapConfig.caCertPath);
575 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
576 if (config.eapConfig.phase2Method != static_cast<int>(Phase2Method::NONE)) {
577 std::string strPhase2Method = WifiEapConfig::Phase2MethodToStr(config.eapConfig.eap,
578 config.eapConfig.phase2Method);
579 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PHASE2METHOD, strPhase2Method);
580 }
581 break;
582 case EapMethod::EAP_PWD:
583 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
584 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
585 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.eapConfig.password);
586 break;
587 case EapMethod::EAP_SIM:
588 case EapMethod::EAP_AKA:
589 case EapMethod::EAP_AKA_PRIME:
590 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eapConfig.eap);
591 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.eapConfig.identity);
592 break;
593 default:
594 LOGE("%{public}s, invalid eapMethod:%{public}d", __func__, eapMethod);
595 break;
596 }
597
598 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_BSSID, config.bssid);
599 int i = 0;
600 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_0, config.wepKeys[i++]);
601 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_1, config.wepKeys[i++]);
602 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_2, config.wepKeys[i++]);
603 num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_3, config.wepKeys[i++]);
604 if (config.priority >= 0) {
605 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_PRIORITY, config.priority);
606 }
607 if (config.scanSsid == 1) {
608 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_SCAN_SSID, config.scanSsid);
609 }
610 if (config.wepKeyIdx >= 0) {
611 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_WEP_KEY_IDX, config.wepKeyIdx);
612 }
613 if (config.authAlgorithms > 0) {
614 num += PushDeviceConfigAuthAlgorithm(conf + num, DEVICE_CONFIG_AUTH_ALGORITHMS, config.authAlgorithms);
615 }
616 if (config.isRequirePmf) {
617 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_IEEE80211W, PMF_REQUIRED);
618 } else {
619 num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_IEEE80211W, PMF_OPTIONAL);
620 }
621 if (config.allowedProtocols > 0) {
622 std::string protocolsStr[] = {"WPA ", "RSN ", "WPA2 ", "OSEN "};
623 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_ALLOW_PROTOCOLS, config.allowedProtocols,
624 protocolsStr, sizeof(protocolsStr)/sizeof(protocolsStr[0]));
625 }
626 if (config.allowedPairwiseCiphers > 0) {
627 std::string pairwiseCipherStr[] = {"NONE ", "TKIP ", "CCMP ", "GCMP ", "CCMP-256 ", "GCMP-256 "};
628 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_PAIRWISE_CIPHERS, config.allowedPairwiseCiphers,
629 pairwiseCipherStr, sizeof(pairwiseCipherStr)/sizeof(pairwiseCipherStr[0]));
630 }
631 if (config.allowedGroupCiphers > 0) {
632 std::string groupCipherStr[] = {"GTK_NOT_USED ", "TKIP ", "CCMP ", "GCMP ", "CCMP-256 ", "GCMP-256 "};
633 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_GROUP_CIPHERS, config.allowedGroupCiphers,
634 groupCipherStr, sizeof(groupCipherStr)/sizeof(groupCipherStr[0]));
635 }
636 if (config.allowedGroupMgmtCiphers > 0) {
637 std::string groupMgmtCipherStr[] = {"AES-128-CMAC ", "BIP-GMAC-128 ", "BIP-GMAC-256 ", "BIP-CMAC-256 "};
638 num += PushDeviceConfigParseMask(conf + num, DEVICE_CONFIG_GROUP_MGMT_CIPHERS, config.allowedGroupMgmtCiphers,
639 groupMgmtCipherStr, sizeof(groupMgmtCipherStr)/sizeof(groupMgmtCipherStr[0]));
640 }
641 if (num == 0) {
642 return WIFI_HAL_OPT_OK;
643 }
644 return SetNetwork(networkId, conf, num);
645 }
646
SetBssid(int networkId,const std::string & bssid)647 WifiErrorNo WifiIdlClient::SetBssid(int networkId, const std::string &bssid)
648 {
649 CHECK_CLIENT_NOT_NULL;
650 SetNetworkConfig conf;
651 int num = PushDeviceConfigString(&conf, DEVICE_CONFIG_BSSID, bssid, false);
652 if (num == 0) {
653 LOGE("SetBssid, PushDeviceConfigString return error!");
654 return WIFI_HAL_OPT_OK;
655 }
656
657 return SetNetwork(networkId, &conf, num);
658 }
659
SaveDeviceConfig(void)660 WifiErrorNo WifiIdlClient::SaveDeviceConfig(void)
661 {
662 CHECK_CLIENT_NOT_NULL;
663 return SaveNetworkConfig();
664 }
665
ReqRegisterStaEventCallback(const WifiEventCallback & callback)666 WifiErrorNo WifiIdlClient::ReqRegisterStaEventCallback(const WifiEventCallback &callback)
667 {
668 CHECK_CLIENT_NOT_NULL;
669 IWifiEventCallback cEventCallback;
670 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
671 return WIFI_HAL_OPT_FAILED;
672 }
673 if (callback.onConnectChanged != nullptr) {
674 cEventCallback.onConnectChanged = OnConnectChanged;
675 cEventCallback.onBssidChanged = OnBssidChanged;
676 cEventCallback.onWpaStateChanged = OnWpaStateChanged;
677 cEventCallback.onSsidWrongkey = OnWpaSsidWrongKey;
678 cEventCallback.onWpsOverlap = OnWpsOverlap;
679 cEventCallback.onWpsTimeOut = OnWpsTimeOut;
680 cEventCallback.onWpsConnectionFull = OnWpaConnectionFull;
681 cEventCallback.onWpsConnectionReject = OnWpaConnectionReject;
682 cEventCallback.onEventStaNotify = OnWpaStaNotifyCallBack;
683 cEventCallback.onDisConnectReasonNotify = OnDisConnectReasonCallback;
684 }
685 return RegisterStaEventCallback(cEventCallback);
686 }
687
ReqStartWpsPbcMode(const WifiHalWpsConfig & config)688 WifiErrorNo WifiIdlClient::ReqStartWpsPbcMode(const WifiHalWpsConfig &config)
689 {
690 CHECK_CLIENT_NOT_NULL;
691 WifiWpsParam param;
692 if (memset_s(¶m, sizeof(param), 0, sizeof(param)) != EOK) {
693 return WIFI_HAL_OPT_FAILED;
694 }
695 param.anyFlag = config.anyFlag;
696 param.multiAp = config.multiAp;
697 if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
698 return WIFI_HAL_OPT_FAILED;
699 }
700 return StartWpsPbcMode(¶m);
701 }
702
ReqStartWpsPinMode(const WifiHalWpsConfig & config,int & pinCode)703 WifiErrorNo WifiIdlClient::ReqStartWpsPinMode(const WifiHalWpsConfig &config, int &pinCode)
704 {
705 CHECK_CLIENT_NOT_NULL;
706 WifiWpsParam param;
707 if (memset_s(¶m, sizeof(param), 0, sizeof(param)) != EOK) {
708 return WIFI_HAL_OPT_FAILED;
709 }
710 param.anyFlag = config.anyFlag;
711 param.multiAp = config.multiAp;
712 if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
713 return WIFI_HAL_OPT_FAILED;
714 }
715 if (!config.pinCode.empty()) {
716 if (strncpy_s(param.pinCode, sizeof(param.pinCode), config.pinCode.c_str(), config.pinCode.length()) != EOK) {
717 return WIFI_HAL_OPT_FAILED;
718 }
719 }
720 return StartWpsPinMode(¶m, &pinCode);
721 }
722
ReqStopWps()723 WifiErrorNo WifiIdlClient::ReqStopWps()
724 {
725 CHECK_CLIENT_NOT_NULL;
726 return StopWps();
727 }
728
ReqGetRoamingCapabilities(WifiHalRoamCapability & capability)729 WifiErrorNo WifiIdlClient::ReqGetRoamingCapabilities(WifiHalRoamCapability &capability)
730 {
731 CHECK_CLIENT_NOT_NULL;
732 WifiRoamCapability tmp;
733 if (memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)) != EOK) {
734 return WIFI_HAL_OPT_FAILED;
735 }
736 WifiErrorNo err = GetRoamingCapabilities(&tmp);
737 if (err == WIFI_HAL_OPT_OK) {
738 capability.maxBlocklistSize = tmp.maxBlocklistSize;
739 capability.maxTrustlistSize = tmp.maxTrustlistSize;
740 }
741 return err;
742 }
743
ConVectorToCArrayString(const std::vector<std::string> & vec) const744 char **WifiIdlClient::ConVectorToCArrayString(const std::vector<std::string> &vec) const
745 {
746 int size = vec.size();
747 if (size == 0) {
748 return nullptr;
749 }
750 char **list = (char **)calloc(size, sizeof(char *));
751 if (list == nullptr) {
752 return nullptr;
753 }
754 int i = 0;
755 for (; i < size; ++i) {
756 int len = vec[i].length();
757 list[i] = (char *)calloc(len + 1, sizeof(char));
758 if (list[i] == nullptr) {
759 break;
760 }
761 if (strncpy_s(list[i], len + 1, vec[i].c_str(), len) != EOK) {
762 break;
763 }
764 }
765 if (i < size) {
766 for (int j = 0; j <= i; ++j) {
767 free(list[j]);
768 list[j] = nullptr;
769 }
770 free(list);
771 list = nullptr;
772 return nullptr;
773 } else {
774 return list;
775 }
776 }
777
ReqSetRoamConfig(const WifiHalRoamConfig & config)778 WifiErrorNo WifiIdlClient::ReqSetRoamConfig(const WifiHalRoamConfig &config)
779 {
780 CHECK_CLIENT_NOT_NULL;
781 char **blocklist = nullptr;
782 int blocksize = config.blocklistBssids.size();
783 char **trustlist = nullptr;
784 int trustsize = config.trustlistBssids.size();
785 if (blocksize == 0 && trustsize == 0) {
786 return WIFI_HAL_OPT_FAILED;
787 }
788 WifiErrorNo err = WIFI_HAL_OPT_FAILED;
789 do {
790 if (blocksize > 0) {
791 blocklist = ConVectorToCArrayString(config.blocklistBssids);
792 if (blocklist == nullptr) {
793 break;
794 }
795 }
796 if (trustsize > 0) {
797 trustlist = ConVectorToCArrayString(config.trustlistBssids);
798 if (trustlist == nullptr) {
799 break;
800 }
801 }
802 err = SetRoamConfig(blocklist, blocksize, trustlist, trustsize);
803 } while (0);
804 if (blocklist != nullptr) {
805 for (int i = 0; i < blocksize; ++i) {
806 free(blocklist[i]);
807 blocklist[i] = nullptr;
808 }
809 free(blocklist);
810 blocklist = nullptr;
811 }
812 if (trustlist != nullptr) {
813 for (int i = 0; i < trustsize; ++i) {
814 free(trustlist[i]);
815 trustlist[i] = nullptr;
816 }
817 free(trustlist);
818 trustlist = nullptr;
819 }
820 return err;
821 }
822
ReqGetConnectSignalInfo(const std::string & endBssid,WifiHalWpaSignalInfo & info) const823 WifiErrorNo WifiIdlClient::ReqGetConnectSignalInfo(const std::string &endBssid, WifiHalWpaSignalInfo &info) const
824 {
825 CHECK_CLIENT_NOT_NULL;
826 WpaSignalInfo req = {0};
827 WifiErrorNo err = GetConnectSignalInfo(endBssid.c_str(), &req);
828 if (err == WIFI_HAL_OPT_OK) {
829 info.signal = req.signal;
830 info.txrate = req.txrate;
831 info.rxrate = req.rxrate;
832 info.noise = req.noise;
833 info.frequency = req.frequency;
834 info.txPackets = req.txPackets;
835 info.rxPackets = req.rxPackets;
836 info.snr = req.snr;
837 info.chload = req.chload;
838 info.ulDelay = req.ulDelay;
839 info.txBytes = req.txBytes;
840 info.rxBytes = req.rxBytes;
841 info.txFailed = req.txFailed;
842 }
843 return err;
844 }
845
ReqSetPmMode(int frequency,int mode) const846 WifiErrorNo WifiIdlClient::ReqSetPmMode(int frequency, int mode) const
847 {
848 CHECK_CLIENT_NOT_NULL;
849 LOGE("not support set pm mode.");
850 return WIFI_HAL_OPT_NOT_SUPPORT;
851 }
852
ReqSetDpiMarkRule(int uid,int protocol,int enable) const853 WifiErrorNo WifiIdlClient::ReqSetDpiMarkRule(int uid, int protocol, int enable) const
854 {
855 CHECK_CLIENT_NOT_NULL;
856 LOGE("not support set dpi mark rule.");
857 return WIFI_HAL_OPT_NOT_SUPPORT;
858 }
859
StartAp(int id,const std::string & ifaceName)860 WifiErrorNo WifiIdlClient::StartAp(int id, const std::string &ifaceName)
861 {
862 CHECK_CLIENT_NOT_NULL;
863 return StartSoftAp(id, ifaceName.c_str());
864 }
865
StopAp(int id)866 WifiErrorNo WifiIdlClient::StopAp(int id)
867 {
868 CHECK_CLIENT_NOT_NULL;
869 return StopSoftAp(id);
870 }
871
SetSoftApConfig(const HotspotConfig & config,int id)872 WifiErrorNo WifiIdlClient::SetSoftApConfig(const HotspotConfig &config, int id)
873 {
874 CHECK_CLIENT_NOT_NULL;
875 HostapdConfig tmp;
876 if (memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)) != EOK) {
877 return WIFI_HAL_OPT_FAILED;
878 }
879 tmp.ssidLen = config.GetSsid().length();
880 if (strncpy_s(tmp.ssid, sizeof(tmp.ssid), config.GetSsid().c_str(), tmp.ssidLen) != EOK) {
881 return WIFI_HAL_OPT_FAILED;
882 }
883 std::string preSharedKey = config.GetPreSharedKey();
884 tmp.preSharedKeyLen = preSharedKey.length();
885 if (strncpy_s(tmp.preSharedKey, sizeof(tmp.preSharedKey), preSharedKey.c_str(), tmp.preSharedKeyLen) != EOK) {
886 std::string().swap(preSharedKey);
887 return WIFI_HAL_OPT_FAILED;
888 }
889 std::string().swap(preSharedKey);
890 tmp.securityType = static_cast<int>(config.GetSecurityType());
891 tmp.band = static_cast<int>(config.GetBand());
892 tmp.channel = config.GetChannel();
893 tmp.maxConn = config.GetMaxConn();
894 return SetHostapdConfig(&tmp, id);
895 }
896
GetStationList(std::vector<std::string> & result,int id)897 WifiErrorNo WifiIdlClient::GetStationList(std::vector<std::string> &result, int id)
898 {
899 CHECK_CLIENT_NOT_NULL;
900
901 char *staInfos = new (std::nothrow) char[BUFFER_SIZE]();
902 if (staInfos == nullptr) {
903 return WIFI_HAL_OPT_FAILED;
904 }
905 int32_t size = BUFFER_SIZE;
906 WifiErrorNo err = GetStaInfos(staInfos, &size, id);
907 if (err != WIFI_HAL_OPT_OK) {
908 delete[] staInfos;
909 staInfos = nullptr;
910 return WIFI_HAL_OPT_FAILED;
911 }
912 std::string strStaInfo = std::string(staInfos);
913 SplitString(strStaInfo, ",", result);
914 delete[] staInfos;
915 staInfos = nullptr;
916 return WIFI_HAL_OPT_OK;
917 }
918
AddBlockByMac(const std::string & mac,int id)919 WifiErrorNo WifiIdlClient::AddBlockByMac(const std::string &mac, int id)
920 {
921 CHECK_CLIENT_NOT_NULL;
922 if (CheckMacIsValid(mac) != 0) {
923 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
924 }
925 int len = mac.length();
926 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
927 unsigned char* macStr = macBytes.data();
928 return SetMacFilter(macStr, len, id);
929 }
930
DelBlockByMac(const std::string & mac,int id)931 WifiErrorNo WifiIdlClient::DelBlockByMac(const std::string &mac, int id)
932 {
933 CHECK_CLIENT_NOT_NULL;
934 if (CheckMacIsValid(mac) != 0) {
935 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
936 }
937 int len = mac.length();
938 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
939 unsigned char* macStr = macBytes.data();
940 return DelMacFilter(macStr, len, id);
941 }
942
RemoveStation(const std::string & mac,int id)943 WifiErrorNo WifiIdlClient::RemoveStation(const std::string &mac, int id)
944 {
945 CHECK_CLIENT_NOT_NULL;
946 if (CheckMacIsValid(mac) != 0) {
947 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
948 }
949 int len = mac.length();
950 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
951 unsigned char* macStr = macBytes.data();
952 return DisassociateSta(macStr, len, id);
953 }
954
GetFrequenciesByBand(int32_t band,std::vector<int> & frequencies,int id)955 WifiErrorNo WifiIdlClient::GetFrequenciesByBand(int32_t band, std::vector<int> &frequencies, int id)
956 {
957 CHECK_CLIENT_NOT_NULL;
958
959 int values[HAL_GET_MAX_BANDS] = {0};
960 int size = HAL_GET_MAX_BANDS;
961 if (GetValidFrequenciesForBand(band, values, &size, id) != 0) {
962 return WIFI_HAL_OPT_FAILED;
963 }
964
965 for (int i = 0; i < size; i++) {
966 frequencies.push_back(values[i]);
967 }
968
969 return WIFI_HAL_OPT_OK;
970 }
971
RegisterApEvent(IWifiApMonitorEventCallback callback,int id) const972 WifiErrorNo WifiIdlClient::RegisterApEvent(IWifiApMonitorEventCallback callback, int id) const
973 {
974 CHECK_CLIENT_NOT_NULL;
975 IWifiApEventCallback cEventCallback;
976 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
977 return WIFI_HAL_OPT_FAILED;
978 }
979 if (callback.onStaJoinOrLeave != nullptr) {
980 cEventCallback.onStaJoinOrLeave = OnApStaJoinOrLeave;
981 cEventCallback.onApEnableOrDisable = OnApEnableOrDisable;
982 }
983
984 return RegisterAsscociatedEvent(cEventCallback, id);
985 }
986
SetWifiCountryCode(const std::string & code,int id)987 WifiErrorNo WifiIdlClient::SetWifiCountryCode(const std::string &code, int id)
988 {
989 CHECK_CLIENT_NOT_NULL;
990 if (code.length() != HAL_COUNTRY_CODE_LENGTH) {
991 return WIFI_HAL_OPT_INVALID_PARAM;
992 }
993 return SetCountryCode(code.c_str(), id);
994 }
995
ReqDisconnectStaByMac(const std::string & mac,int id)996 WifiErrorNo WifiIdlClient::ReqDisconnectStaByMac(const std::string &mac, int id)
997 {
998 CHECK_CLIENT_NOT_NULL;
999 if (CheckMacIsValid(mac) != 0) {
1000 return WIFI_HAL_OPT_INPUT_MAC_INVALID;
1001 }
1002 std::vector<unsigned char> macBytes(mac.begin(), mac.end());
1003 unsigned char* macStr = macBytes.data();
1004 return DisassociateSta(macStr, strlen(mac.c_str()), id);
1005 }
1006
ReqGetPowerModel(int & model,int id)1007 WifiErrorNo WifiIdlClient::ReqGetPowerModel(int& model, int id)
1008 {
1009 CHECK_CLIENT_NOT_NULL;
1010 return WpaGetPowerModel(&model, id);
1011 }
1012
ReqSetPowerModel(const int & model,int id)1013 WifiErrorNo WifiIdlClient::ReqSetPowerModel(const int& model, int id)
1014 {
1015 CHECK_CLIENT_NOT_NULL;
1016 return WpaSetPowerModel(model, id);
1017 }
1018
GetWifiChipObject(int id,IWifiChip & chip)1019 WifiErrorNo WifiIdlClient::GetWifiChipObject(int id, IWifiChip &chip)
1020 {
1021 CHECK_CLIENT_NOT_NULL;
1022 LOGD("Get wifi chip object accord %{public}d, %{public}d", id, chip.i);
1023 return WIFI_HAL_OPT_OK;
1024 }
1025
GetChipIds(std::vector<int> & ids)1026 WifiErrorNo WifiIdlClient::GetChipIds(std::vector<int> &ids)
1027 {
1028 CHECK_CLIENT_NOT_NULL;
1029 LOGD("start GetChipIds %{public}zu", ids.size()); /* fixed compile error, -Werror,-Wunused-parameter */
1030 return WIFI_HAL_OPT_OK;
1031 }
1032
GetUsedChipId(int & id)1033 WifiErrorNo WifiIdlClient::GetUsedChipId(int &id)
1034 {
1035 CHECK_CLIENT_NOT_NULL;
1036 id = 0; /* fixed compile error, -Werror,-Wunused-parameter */
1037 return WIFI_HAL_OPT_OK;
1038 }
1039
GetChipCapabilities(int & capabilities)1040 WifiErrorNo WifiIdlClient::GetChipCapabilities(int &capabilities)
1041 {
1042 CHECK_CLIENT_NOT_NULL;
1043 capabilities = 0; /* fixed compile error, -Werror,-Wunused-parameter */
1044 return WIFI_HAL_OPT_OK;
1045 }
1046
GetSupportedModes(std::vector<int> & modes)1047 WifiErrorNo WifiIdlClient::GetSupportedModes(std::vector<int> &modes)
1048 {
1049 CHECK_CLIENT_NOT_NULL;
1050 int size = HAL_INTERFACE_SUPPORT_COMBINATIONS;
1051 int supportModes[HAL_INTERFACE_SUPPORT_COMBINATIONS] = {0};
1052 WifiErrorNo err = GetSupportedComboModes(supportModes, &size);
1053 if (err == WIFI_HAL_OPT_OK) {
1054 for (int i = 0; i < size; ++i) {
1055 modes.push_back(supportModes[i]);
1056 }
1057 }
1058 return err;
1059 }
1060
ConfigRunModes(int mode)1061 WifiErrorNo WifiIdlClient::ConfigRunModes(int mode)
1062 {
1063 CHECK_CLIENT_NOT_NULL;
1064 LOGD("start ConfigRunModes mode %{public}d", mode);
1065 return WIFI_HAL_OPT_OK;
1066 }
1067
GetCurrentMode(int & mode)1068 WifiErrorNo WifiIdlClient::GetCurrentMode(int &mode)
1069 {
1070 CHECK_CLIENT_NOT_NULL;
1071 mode = 0; /* fixed compile error, -Werror,-Wunused-parameter */
1072 return WIFI_HAL_OPT_OK;
1073 }
1074
RegisterChipEventCallback(WifiChipEventCallback & callback)1075 WifiErrorNo WifiIdlClient::RegisterChipEventCallback(WifiChipEventCallback &callback)
1076 {
1077 CHECK_CLIENT_NOT_NULL;
1078 IWifiChipEventCallback cEventCallback;
1079 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1080 return WIFI_HAL_OPT_FAILED;
1081 }
1082 cEventCallback.onIfaceAdded = callback.onIfaceAdded;
1083 cEventCallback.onIfaceRemoved = callback.onIfaceRemoved;
1084 return RegisterEventCallback(cEventCallback);
1085 }
1086
RequestFirmwareDebugInfo(std::string & debugInfo)1087 WifiErrorNo WifiIdlClient::RequestFirmwareDebugInfo(std::string &debugInfo)
1088 {
1089 CHECK_CLIENT_NOT_NULL;
1090 debugInfo.clear(); /* fixed compile error, -Werror,-Wunused-parameter */
1091 return WIFI_HAL_OPT_OK;
1092 }
1093
ReqIsSupportDbdc(bool & isSupport) const1094 WifiErrorNo WifiIdlClient::ReqIsSupportDbdc(bool &isSupport) const
1095 {
1096 CHECK_CLIENT_NOT_NULL;
1097 return IsChipSupportDbdc(&isSupport);
1098 }
1099
ReqIsSupportCsa(bool & isSupport) const1100 WifiErrorNo WifiIdlClient::ReqIsSupportCsa(bool &isSupport) const
1101 {
1102 CHECK_CLIENT_NOT_NULL;
1103 return IsChipSupportCsa(&isSupport);
1104 }
1105
ReqIsSupportRadarDetect(bool & isSupport) const1106 WifiErrorNo WifiIdlClient::ReqIsSupportRadarDetect(bool &isSupport) const
1107 {
1108 CHECK_CLIENT_NOT_NULL;
1109 return IsChipSupportRadarDetect(&isSupport);
1110 }
1111
ReqIsSupportDfsChannel(bool & isSupport) const1112 WifiErrorNo WifiIdlClient::ReqIsSupportDfsChannel(bool &isSupport) const
1113 {
1114 CHECK_CLIENT_NOT_NULL;
1115 return IsChipSupportDfsChannel(&isSupport);
1116 }
1117
ReqIsSupportIndoorChannel(bool & isSupport) const1118 WifiErrorNo WifiIdlClient::ReqIsSupportIndoorChannel(bool &isSupport) const
1119 {
1120 CHECK_CLIENT_NOT_NULL;
1121 return IsChipSupportIndoorChannel(&isSupport);
1122 }
1123
ReqStartSupplicant(void)1124 WifiErrorNo WifiIdlClient::ReqStartSupplicant(void)
1125 {
1126 CHECK_CLIENT_NOT_NULL;
1127 return StartSupplicant();
1128 }
1129
ReqStopSupplicant(void)1130 WifiErrorNo WifiIdlClient::ReqStopSupplicant(void)
1131 {
1132 CHECK_CLIENT_NOT_NULL;
1133 return StopSupplicant();
1134 }
1135
ReqConnectSupplicant(void)1136 WifiErrorNo WifiIdlClient::ReqConnectSupplicant(void)
1137 {
1138 CHECK_CLIENT_NOT_NULL;
1139 return ConnectSupplicant();
1140 }
1141
ReqDisconnectSupplicant(void)1142 WifiErrorNo WifiIdlClient::ReqDisconnectSupplicant(void)
1143 {
1144 CHECK_CLIENT_NOT_NULL;
1145 return DisconnectSupplicant();
1146 }
1147
ReqRequestToSupplicant(const std::string & request)1148 WifiErrorNo WifiIdlClient::ReqRequestToSupplicant(const std::string &request)
1149 {
1150 CHECK_CLIENT_NOT_NULL;
1151 std::vector<unsigned char> requestBytes(request.begin(), request.end());
1152 unsigned char* requestStr = requestBytes.data();
1153 return RequestToSupplicant(requestStr, request.length());
1154 }
1155
ReqRegisterSupplicantEventCallback(SupplicantEventCallback & callback)1156 WifiErrorNo WifiIdlClient::ReqRegisterSupplicantEventCallback(SupplicantEventCallback &callback)
1157 {
1158 CHECK_CLIENT_NOT_NULL;
1159 ISupplicantEventCallback cEventCallback;
1160 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1161 return WIFI_HAL_OPT_FAILED;
1162 }
1163 if (callback.onScanNotify != nullptr) {
1164 cEventCallback.onScanNotify = OnScanNotify;
1165 }
1166 return RegisterSupplicantEventCallback(cEventCallback);
1167 }
1168
ReqUnRegisterSupplicantEventCallback(void)1169 WifiErrorNo WifiIdlClient::ReqUnRegisterSupplicantEventCallback(void)
1170 {
1171 CHECK_CLIENT_NOT_NULL;
1172 ISupplicantEventCallback cEventCallback;
1173 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1174 return WIFI_HAL_OPT_FAILED;
1175 }
1176 return RegisterSupplicantEventCallback(cEventCallback);
1177 }
1178
ReqSetPowerSave(bool enable)1179 WifiErrorNo WifiIdlClient::ReqSetPowerSave(bool enable)
1180 {
1181 CHECK_CLIENT_NOT_NULL;
1182 int mode = 0;
1183 if (enable) {
1184 mode = 1;
1185 }
1186
1187 return SetPowerSave(mode);
1188 }
1189
ReqWpaSetCountryCode(const std::string & countryCode)1190 WifiErrorNo WifiIdlClient::ReqWpaSetCountryCode(const std::string &countryCode)
1191 {
1192 CHECK_CLIENT_NOT_NULL;
1193 if (countryCode.length() != HAL_COUNTRY_CODE_LENGTH) {
1194 return WIFI_HAL_OPT_INVALID_PARAM;
1195 }
1196 return WpaSetCountryCode(countryCode.c_str());
1197 }
1198
ReqWpaGetCountryCode(std::string & countryCode)1199 WifiErrorNo WifiIdlClient::ReqWpaGetCountryCode(std::string &countryCode)
1200 {
1201 CHECK_CLIENT_NOT_NULL;
1202 const int idlCountryCodeLen = 32;
1203 char code[idlCountryCodeLen] = {0};
1204 WifiErrorNo ret = WpaGetCountryCode(code, idlCountryCodeLen);
1205 if (ret == WIFI_HAL_OPT_OK) {
1206 countryCode = code;
1207 }
1208 return ret;
1209 }
1210
ReqWpaAutoConnect(int enable)1211 WifiErrorNo WifiIdlClient::ReqWpaAutoConnect(int enable)
1212 {
1213 CHECK_CLIENT_NOT_NULL;
1214 return WpaAutoConnect(enable);
1215 }
1216
ReqWpaBlocklistClear()1217 WifiErrorNo WifiIdlClient::ReqWpaBlocklistClear()
1218 {
1219 CHECK_CLIENT_NOT_NULL;
1220 return WpaBlocklistClear();
1221 }
1222
ReqP2pStart(void) const1223 WifiErrorNo WifiIdlClient::ReqP2pStart(void) const
1224 {
1225 CHECK_CLIENT_NOT_NULL;
1226 return P2pStart();
1227 }
1228
ReqP2pStop(void) const1229 WifiErrorNo WifiIdlClient::ReqP2pStop(void) const
1230 {
1231 CHECK_CLIENT_NOT_NULL;
1232 return P2pStop();
1233 }
1234
ReqP2pSetDeviceName(const std::string & name) const1235 WifiErrorNo WifiIdlClient::ReqP2pSetDeviceName(const std::string &name) const
1236 {
1237 CHECK_CLIENT_NOT_NULL;
1238 return P2pSetDeviceName(name.c_str());
1239 }
1240
ReqP2pSetSsidPostfixName(const std::string & postfixName) const1241 WifiErrorNo WifiIdlClient::ReqP2pSetSsidPostfixName(const std::string &postfixName) const
1242 {
1243 CHECK_CLIENT_NOT_NULL;
1244 return P2pSetSsidPostfixName(postfixName.c_str());
1245 }
1246
ReqP2pSetWpsDeviceType(const std::string & type) const1247 WifiErrorNo WifiIdlClient::ReqP2pSetWpsDeviceType(const std::string &type) const
1248 {
1249 CHECK_CLIENT_NOT_NULL;
1250 return P2pSetWpsDeviceType(type.c_str());
1251 }
1252
ReqP2pSetWpsSecondaryDeviceType(const std::string & type) const1253 WifiErrorNo WifiIdlClient::ReqP2pSetWpsSecondaryDeviceType(const std::string &type) const
1254 {
1255 CHECK_CLIENT_NOT_NULL;
1256 return P2pSetWpsSecondaryDeviceType(type.c_str());
1257 }
1258
ReqP2pSetWpsConfigMethods(const std::string & config) const1259 WifiErrorNo WifiIdlClient::ReqP2pSetWpsConfigMethods(const std::string &config) const
1260 {
1261 CHECK_CLIENT_NOT_NULL;
1262 return P2pSetWpsConfigMethods(config.c_str());
1263 }
1264
ReqP2pGetDeviceAddress(std::string & deviceAddress) const1265 WifiErrorNo WifiIdlClient::ReqP2pGetDeviceAddress(std::string &deviceAddress) const
1266 {
1267 CHECK_CLIENT_NOT_NULL;
1268 char address[HAL_P2P_DEV_ADDRESS_LEN] = {0};
1269 WifiErrorNo ret = P2pGetDeviceAddress(address, HAL_P2P_DEV_ADDRESS_LEN);
1270 if (ret == WIFI_HAL_OPT_OK) {
1271 deviceAddress = address;
1272 }
1273 return ret;
1274 }
1275
ReqP2pFlush() const1276 WifiErrorNo WifiIdlClient::ReqP2pFlush() const
1277 {
1278 CHECK_CLIENT_NOT_NULL;
1279 return P2pFlush();
1280 }
1281
ReqP2pFlushService() const1282 WifiErrorNo WifiIdlClient::ReqP2pFlushService() const
1283 {
1284 CHECK_CLIENT_NOT_NULL;
1285 return P2pFlushService();
1286 }
1287
ReqP2pSaveConfig() const1288 WifiErrorNo WifiIdlClient::ReqP2pSaveConfig() const
1289 {
1290 CHECK_CLIENT_NOT_NULL;
1291 return P2pSaveConfig();
1292 }
1293
ReqP2pRegisterCallback(const P2pHalCallback & callbacks) const1294 WifiErrorNo WifiIdlClient::ReqP2pRegisterCallback(const P2pHalCallback &callbacks) const
1295 {
1296 CHECK_CLIENT_NOT_NULL;
1297
1298 IWifiEventP2pCallback cEventCallback;
1299 if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1300 return WIFI_HAL_OPT_FAILED;
1301 }
1302 if (callbacks.onConnectSupplicant != nullptr) {
1303 cEventCallback.onP2pSupplicantConnect = OnP2pConnectSupplicant;
1304 cEventCallback.onDeviceFound = OnP2pDeviceFound;
1305 cEventCallback.onDeviceLost = OnP2pDeviceLost;
1306 cEventCallback.onGoNegotiationRequest = OnP2pGoNegotiationRequest;
1307 cEventCallback.onGoNegotiationSuccess = OnP2pGoNegotiationSuccess;
1308 cEventCallback.onGoNegotiationFailure = OnP2pGoNegotiationFailure;
1309 cEventCallback.onInvitationReceived = OnP2pInvitationReceived;
1310 cEventCallback.onInvitationResult = OnP2pInvitationResult;
1311 cEventCallback.onGroupFormationSuccess = OnP2pGroupFormationSuccess;
1312 cEventCallback.onGroupFormationFailure = OnP2pGroupFormationFailure;
1313 cEventCallback.onGroupStarted = OnP2pGroupStarted;
1314 cEventCallback.onGroupRemoved = OnP2pGroupRemoved;
1315 cEventCallback.onProvisionDiscoveryPbcRequest = OnP2pProvisionDiscoveryPbcRequest;
1316 cEventCallback.onProvisionDiscoveryPbcResponse = OnP2pProvisionDiscoveryPbcResponse;
1317 cEventCallback.onProvisionDiscoveryEnterPin = OnP2pProvisionDiscoveryEnterPin;
1318 cEventCallback.onProvisionDiscoveryShowPin = OnP2pProvisionDiscoveryShowPin;
1319 cEventCallback.onProvisionDiscoveryFailure = OnP2pProvisionDiscoveryFailure;
1320 cEventCallback.onFindStopped = OnP2pFindStopped;
1321 cEventCallback.onServiceDiscoveryResponse = OnP2pServiceDiscoveryResponse;
1322 cEventCallback.onStaDeauthorized = OnP2pStaDeauthorized;
1323 cEventCallback.onStaAuthorized = OnP2pStaAuthorized;
1324 cEventCallback.connectSupplicantFailed = OnP2pConnectSupplicantFailed;
1325 cEventCallback.onP2pServDiscReq = OnP2pServDiscReq;
1326 cEventCallback.onP2pIfaceCreated = OnP2pIfaceCreated;
1327 cEventCallback.onP2pConnectFailed = OnP2pConnectFailed;
1328 cEventCallback.onP2pChannelSwitch = OnP2pChannelSwitch;
1329 }
1330
1331 return RegisterP2pEventCallback(cEventCallback);
1332 }
1333
ReqP2pSetupWpsPbc(const std::string & groupInterface,const std::string & bssid) const1334 WifiErrorNo WifiIdlClient::ReqP2pSetupWpsPbc(const std::string &groupInterface, const std::string &bssid) const
1335 {
1336 CHECK_CLIENT_NOT_NULL;
1337 return P2pSetupWpsPbc(groupInterface.c_str(), bssid.c_str());
1338 }
1339
ReqP2pSetupWpsPin(const std::string & groupInterface,const std::string & address,const std::string & pin,std::string & result) const1340 WifiErrorNo WifiIdlClient::ReqP2pSetupWpsPin(
1341 const std::string &groupInterface, const std::string &address, const std::string &pin, std::string &result) const
1342 {
1343 CHECK_CLIENT_NOT_NULL;
1344 if (!pin.empty() && pin.size() != HAL_PIN_CODE_LENGTH) {
1345 return WIFI_HAL_OPT_INVALID_PARAM;
1346 }
1347 char szPinCode[HAL_PIN_CODE_LENGTH + 1] = {0};
1348 WifiErrorNo ret =
1349 P2pSetupWpsPin(groupInterface.c_str(), address.c_str(), pin.c_str(), szPinCode, sizeof(szPinCode));
1350 if (ret == WIFI_HAL_OPT_OK) {
1351 result = szPinCode;
1352 }
1353 return ret;
1354 }
1355
ReqP2pRemoveNetwork(int networkId) const1356 WifiErrorNo WifiIdlClient::ReqP2pRemoveNetwork(int networkId) const
1357 {
1358 CHECK_CLIENT_NOT_NULL;
1359 return P2pRemoveNetwork(networkId);
1360 }
1361
ReqP2pListNetworks(std::map<int,WifiP2pGroupInfo> & mapGroups) const1362 WifiErrorNo WifiIdlClient::ReqP2pListNetworks(std::map<int, WifiP2pGroupInfo> &mapGroups) const
1363 {
1364 CHECK_CLIENT_NOT_NULL;
1365 P2pNetworkList infoList = {0};
1366 WifiErrorNo ret = P2pListNetworks(&infoList);
1367 if (ret != WIFI_HAL_OPT_OK) {
1368 return ret;
1369 }
1370 if (infoList.infos == nullptr) {
1371 return ret;
1372 }
1373 for (int i = 0; i < infoList.infoNum; ++i) {
1374 WifiP2pGroupInfo groupInfo;
1375 groupInfo.SetNetworkId(infoList.infos[i].id);
1376 groupInfo.SetGroupName(infoList.infos[i].ssid);
1377 WifiP2pDevice device;
1378 device.SetDeviceAddress(infoList.infos[i].bssid);
1379 groupInfo.SetOwner(device);
1380 if (strstr(infoList.infos[i].flags, "P2P-PERSISTENT") != nullptr) {
1381 groupInfo.SetIsPersistent(true);
1382 }
1383 mapGroups.insert(std::pair<int, WifiP2pGroupInfo>(infoList.infos[i].id, groupInfo));
1384 }
1385 free(infoList.infos);
1386 infoList.infos = nullptr;
1387 return ret;
1388 }
1389
ReqP2pSetGroupMaxIdle(const std::string & groupInterface,size_t time) const1390 WifiErrorNo WifiIdlClient::ReqP2pSetGroupMaxIdle(const std::string &groupInterface, size_t time) const
1391 {
1392 CHECK_CLIENT_NOT_NULL;
1393 return P2pSetGroupMaxIdle(groupInterface.c_str(), time);
1394 }
1395
ReqP2pSetPowerSave(const std::string & groupInterface,bool enable) const1396 WifiErrorNo WifiIdlClient::ReqP2pSetPowerSave(const std::string &groupInterface, bool enable) const
1397 {
1398 CHECK_CLIENT_NOT_NULL;
1399 int flag = enable;
1400 return P2pSetPowerSave(groupInterface.c_str(), flag);
1401 }
1402
ReqP2pSetWfdEnable(bool enable) const1403 WifiErrorNo WifiIdlClient::ReqP2pSetWfdEnable(bool enable) const
1404 {
1405 CHECK_CLIENT_NOT_NULL;
1406 int flag = enable;
1407 return P2pSetWfdEnable(flag);
1408 }
1409
ReqP2pSetWfdDeviceConfig(const std::string & config) const1410 WifiErrorNo WifiIdlClient::ReqP2pSetWfdDeviceConfig(const std::string &config) const
1411 {
1412 CHECK_CLIENT_NOT_NULL;
1413 return P2pSetWfdDeviceConfig(config.c_str());
1414 }
1415
ReqP2pStartFind(size_t timeout) const1416 WifiErrorNo WifiIdlClient::ReqP2pStartFind(size_t timeout) const
1417 {
1418 CHECK_CLIENT_NOT_NULL;
1419 return P2pStartFind(timeout);
1420 }
1421
ReqP2pStopFind() const1422 WifiErrorNo WifiIdlClient::ReqP2pStopFind() const
1423 {
1424 CHECK_CLIENT_NOT_NULL;
1425 return P2pStopFind();
1426 }
1427
ReqP2pSetExtListen(bool enable,size_t period,size_t interval) const1428 WifiErrorNo WifiIdlClient::ReqP2pSetExtListen(bool enable, size_t period, size_t interval) const
1429 {
1430 CHECK_CLIENT_NOT_NULL;
1431 if (enable) {
1432 if (period < HAL_P2P_LISTEN_MIN_TIME || period > HAL_P2P_LISTEN_MAX_TIME ||
1433 interval < HAL_P2P_LISTEN_MIN_TIME || interval > HAL_P2P_LISTEN_MAX_TIME || period > interval) {
1434 return WIFI_HAL_OPT_INVALID_PARAM;
1435 }
1436 }
1437 int flag = enable;
1438 return P2pSetExtListen(flag, period, interval);
1439 }
1440
ReqP2pSetListenChannel(size_t channel,unsigned char regClass) const1441 WifiErrorNo WifiIdlClient::ReqP2pSetListenChannel(size_t channel, unsigned char regClass) const
1442 {
1443 CHECK_CLIENT_NOT_NULL;
1444 return P2pSetListenChannel(channel, regClass);
1445 }
1446
ReqP2pConnect(const WifiP2pConfigInternal & config,bool isJoinExistingGroup,std::string & pin) const1447 WifiErrorNo WifiIdlClient::ReqP2pConnect(const WifiP2pConfigInternal &config, bool isJoinExistingGroup,
1448 std::string &pin) const
1449 {
1450 CHECK_CLIENT_NOT_NULL;
1451 P2pConnectInfo info = {0};
1452 info.mode = isJoinExistingGroup;
1453 info.persistent = config.GetNetId();
1454 if (isJoinExistingGroup) {
1455 info.goIntent = 0;
1456 } else {
1457 info.goIntent = config.GetGroupOwnerIntent();
1458 }
1459 if (info.goIntent < HAL_P2P_GO_INTENT_MIN_LENGTH || info.goIntent > HAL_P2P_GO_INTENT_MAX_LENGTH) {
1460 info.goIntent = HAL_P2P_GO_INTENT_DEFAULT_LENGTH;
1461 }
1462 std::string address = config.GetDeviceAddress();
1463 if (address.size() < HAL_BSSID_LENGTH) {
1464 LOGI("ReqP2pConnect Device Address is too short");
1465 return WIFI_HAL_OPT_INVALID_PARAM;
1466 }
1467 WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1468 if (mode == WpsMethod::WPS_METHOD_LABEL) {
1469 mode = WpsMethod::WPS_METHOD_KEYPAD;
1470 }
1471 info.provdisc = (int)mode;
1472 std::string pinCode = config.GetWpsInfo().GetPin();
1473 if (mode == WpsMethod::WPS_METHOD_PBC && !pinCode.empty()) {
1474 LOGI("ReqP2pConnect Expected empty pin for PBC.");
1475 return WIFI_HAL_OPT_INVALID_PARAM;
1476 }
1477 if (strncpy_s(info.peerDevAddr, sizeof(info.peerDevAddr), address.c_str(), address.length()) != EOK ||
1478 strncpy_s(info.pin, sizeof(info.pin), pinCode.c_str(), pinCode.length()) != EOK) {
1479 return WIFI_HAL_OPT_FAILED;
1480 }
1481 WifiErrorNo ret = P2pConnect(&info);
1482 if (ret == WIFI_HAL_OPT_OK) {
1483 pin = info.pin;
1484 }
1485 return ret;
1486 }
1487
ReqP2pCancelConnect() const1488 WifiErrorNo WifiIdlClient::ReqP2pCancelConnect() const
1489 {
1490 CHECK_CLIENT_NOT_NULL;
1491 return P2pCancelConnect();
1492 }
1493
ReqP2pProvisionDiscovery(const WifiP2pConfigInternal & config) const1494 WifiErrorNo WifiIdlClient::ReqP2pProvisionDiscovery(const WifiP2pConfigInternal &config) const
1495 {
1496 CHECK_CLIENT_NOT_NULL;
1497 WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1498 if (mode == WpsMethod::WPS_METHOD_LABEL) {
1499 mode = WpsMethod::WPS_METHOD_DISPLAY;
1500 } else if (mode == WpsMethod::WPS_METHOD_DISPLAY) {
1501 mode = WpsMethod::WPS_METHOD_KEYPAD;
1502 } else if (mode == WpsMethod::WPS_METHOD_KEYPAD) {
1503 mode = WpsMethod::WPS_METHOD_DISPLAY;
1504 } else if (mode != WpsMethod::WPS_METHOD_PBC) {
1505 return WIFI_HAL_OPT_FAILED;
1506 }
1507 return P2pProvisionDiscovery(config.GetDeviceAddress().c_str(), static_cast<int>(mode));
1508 }
1509
ReqP2pAddGroup(bool isPersistent,int networkId,int freq) const1510 WifiErrorNo WifiIdlClient::ReqP2pAddGroup(bool isPersistent, int networkId, int freq) const
1511 {
1512 CHECK_CLIENT_NOT_NULL;
1513 int flag = isPersistent;
1514 return P2pAddGroup(flag, networkId, freq);
1515 }
1516
ReqP2pRemoveGroup(const std::string & groupInterface) const1517 WifiErrorNo WifiIdlClient::ReqP2pRemoveGroup(const std::string &groupInterface) const
1518 {
1519 CHECK_CLIENT_NOT_NULL;
1520 return P2pRemoveGroup(groupInterface.c_str());
1521 }
1522
ReqP2pRemoveGroupClient(const std::string & deviceMac) const1523 WifiErrorNo WifiIdlClient::ReqP2pRemoveGroupClient(const std::string &deviceMac) const
1524 {
1525 CHECK_CLIENT_NOT_NULL;
1526 return P2pRemoveGroupClient(deviceMac.c_str());
1527 }
1528
ReqP2pInvite(const WifiP2pGroupInfo & group,const std::string & deviceAddr) const1529 WifiErrorNo WifiIdlClient::ReqP2pInvite(const WifiP2pGroupInfo &group, const std::string &deviceAddr) const
1530 {
1531 CHECK_CLIENT_NOT_NULL;
1532 return P2pInvite(group.IsPersistent(),
1533 deviceAddr.c_str(),
1534 group.GetOwner().GetDeviceAddress().c_str(),
1535 group.GetInterface().c_str());
1536 }
1537
ReqP2pReinvoke(int networkId,const std::string & deviceAddr) const1538 WifiErrorNo WifiIdlClient::ReqP2pReinvoke(int networkId, const std::string &deviceAddr) const
1539 {
1540 CHECK_CLIENT_NOT_NULL;
1541 return P2pReinvoke(networkId, deviceAddr.c_str());
1542 }
1543
ReqP2pGetGroupCapability(const std::string & deviceAddress,uint32_t & cap) const1544 WifiErrorNo WifiIdlClient::ReqP2pGetGroupCapability(const std::string &deviceAddress, uint32_t &cap) const
1545 {
1546 CHECK_CLIENT_NOT_NULL;
1547 int capacity = 0;
1548 WifiErrorNo ret = P2pGetGroupCapability(deviceAddress.c_str(), &capacity);
1549 if (ret == WIFI_HAL_OPT_OK) {
1550 cap = capacity;
1551 }
1552 return ret;
1553 }
1554
ReqP2pAddService(const WifiP2pServiceInfo & info) const1555 WifiErrorNo WifiIdlClient::ReqP2pAddService(const WifiP2pServiceInfo &info) const
1556 {
1557 CHECK_CLIENT_NOT_NULL;
1558 WifiErrorNo ret = WIFI_HAL_OPT_OK;
1559 P2pServiceInfo servInfo = {0};
1560 std::vector<std::string> queryList = info.GetQueryList();
1561 for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1562 std::vector<std::string> vec;
1563 SplitString(*iter, " ", vec);
1564 if (vec.size() < HAL_P2P_SERVICE_TYPE_MIN_SIZE) {
1565 return WIFI_HAL_OPT_FAILED;
1566 }
1567 if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1568 return WIFI_HAL_OPT_FAILED;
1569 }
1570 const std::string &tmp = vec[HAL_P2P_SERVICE_TYPE_2_POS];
1571 if (vec[0] == "upnp") {
1572 servInfo.mode = 0;
1573 servInfo.version = atoi(vec[1].c_str());
1574 if (strncpy_s(servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1575 return WIFI_HAL_OPT_FAILED;
1576 }
1577 ret = P2pAddService(&servInfo);
1578 } else if (vec[0] == "bonjour") {
1579 servInfo.mode = 1;
1580 if (strncpy_s(servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK ||
1581 strncpy_s(servInfo.resp, sizeof(servInfo.resp), tmp.c_str(), tmp.length()) != EOK) {
1582 return WIFI_HAL_OPT_FAILED;
1583 }
1584 ret = P2pAddService(&servInfo);
1585 } else {
1586 ret = WIFI_HAL_OPT_FAILED;
1587 }
1588 if (ret != WIFI_HAL_OPT_OK) {
1589 break;
1590 }
1591 }
1592 return ret;
1593 }
1594
ReqP2pRemoveService(const WifiP2pServiceInfo & info) const1595 WifiErrorNo WifiIdlClient::ReqP2pRemoveService(const WifiP2pServiceInfo &info) const
1596 {
1597 CHECK_CLIENT_NOT_NULL;
1598 WifiErrorNo ret = WIFI_HAL_OPT_OK;
1599 P2pServiceInfo servInfo = {0};
1600 std::vector<std::string> queryList = info.GetQueryList();
1601 for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1602 std::vector<std::string> vec;
1603 SplitString(*iter, " ", vec);
1604 if (vec.size() < HAL_P2P_SERVICE_TYPE_MIN_SIZE) {
1605 return WIFI_HAL_OPT_FAILED;
1606 }
1607 if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1608 return WIFI_HAL_OPT_FAILED;
1609 }
1610 const std::string &tmp = vec[HAL_P2P_SERVICE_TYPE_2_POS];
1611 if (vec[0] == "upnp") {
1612 servInfo.mode = 0;
1613 servInfo.version = atoi(vec[1].c_str());
1614 if (strncpy_s(servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1615 return WIFI_HAL_OPT_FAILED;
1616 }
1617 ret = P2pRemoveService(&servInfo);
1618 } else if (vec[0] == "bonjour") {
1619 servInfo.mode = 1;
1620 if (strncpy_s(servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK) {
1621 return WIFI_HAL_OPT_FAILED;
1622 }
1623 ret = P2pRemoveService(&servInfo);
1624 } else {
1625 ret = WIFI_HAL_OPT_FAILED;
1626 }
1627 if (ret != WIFI_HAL_OPT_OK) {
1628 break;
1629 }
1630 }
1631 return ret;
1632 }
1633
ReqP2pReqServiceDiscovery(const std::string & deviceAddress,const std::vector<unsigned char> & tlvs,std::string & reqID) const1634 WifiErrorNo WifiIdlClient::ReqP2pReqServiceDiscovery(
1635 const std::string &deviceAddress, const std::vector<unsigned char> &tlvs, std::string &reqID) const
1636 {
1637 CHECK_CLIENT_NOT_NULL;
1638 if (deviceAddress.size() != HAL_BSSID_LENGTH || tlvs.empty()) {
1639 return WIFI_HAL_OPT_INVALID_PARAM;
1640 }
1641 unsigned size = (tlvs.size() << 1) + 1;
1642 char *pTlvs = (char *)calloc(size, sizeof(char));
1643 if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1644 free(pTlvs);
1645 pTlvs = nullptr;
1646 return WIFI_HAL_OPT_FAILED;
1647 }
1648 char retBuf[HAL_P2P_TMP_BUFFER_SIZE_128] = {0};
1649 WifiErrorNo ret = P2pReqServiceDiscovery(deviceAddress.c_str(), pTlvs, retBuf, sizeof(retBuf));
1650 if (ret == WIFI_HAL_OPT_OK) {
1651 reqID = retBuf;
1652 }
1653 free(pTlvs);
1654 pTlvs = nullptr;
1655 return ret;
1656 }
1657
ReqP2pCancelServiceDiscovery(const std::string & id) const1658 WifiErrorNo WifiIdlClient::ReqP2pCancelServiceDiscovery(const std::string &id) const
1659 {
1660 CHECK_CLIENT_NOT_NULL;
1661 return P2pCancelServiceDiscovery(id.c_str());
1662 }
1663
ReqP2pSetRandomMac(bool enable) const1664 WifiErrorNo WifiIdlClient::ReqP2pSetRandomMac(bool enable) const
1665 {
1666 CHECK_CLIENT_NOT_NULL;
1667 int flag = enable;
1668 return P2pSetRandomMac(flag);
1669 }
1670
ReqP2pSetMiracastType(int type) const1671 WifiErrorNo WifiIdlClient::ReqP2pSetMiracastType(int type) const
1672 {
1673 CHECK_CLIENT_NOT_NULL;
1674 return P2pSetMiracastType(type);
1675 }
1676
ReqSetPersistentReconnect(int mode) const1677 WifiErrorNo WifiIdlClient::ReqSetPersistentReconnect(int mode) const
1678 {
1679 CHECK_CLIENT_NOT_NULL;
1680 return P2pSetPersistentReconnect(mode);
1681 }
1682
ReqRespServiceDiscovery(const WifiP2pDevice & device,int frequency,int dialogToken,const std::vector<unsigned char> & tlvs) const1683 WifiErrorNo WifiIdlClient::ReqRespServiceDiscovery(
1684 const WifiP2pDevice &device, int frequency, int dialogToken, const std::vector<unsigned char> &tlvs) const
1685 {
1686 CHECK_CLIENT_NOT_NULL;
1687 if (tlvs.empty()) {
1688 return WIFI_HAL_OPT_INVALID_PARAM;
1689 }
1690 unsigned size = (tlvs.size() << 1) + 1;
1691 char *pTlvs = (char *)calloc(size, sizeof(char));
1692 if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1693 if (pTlvs != nullptr) {
1694 free(pTlvs);
1695 pTlvs = nullptr;
1696 }
1697 return WIFI_HAL_OPT_FAILED;
1698 }
1699 WifiErrorNo ret = P2pRespServerDiscovery(device.GetDeviceAddress().c_str(), frequency, dialogToken, pTlvs);
1700 free(pTlvs);
1701 pTlvs = nullptr;
1702 return ret;
1703 }
1704
ReqSetServiceDiscoveryExternal(bool isExternalProcess) const1705 WifiErrorNo WifiIdlClient::ReqSetServiceDiscoveryExternal(bool isExternalProcess) const
1706 {
1707 CHECK_CLIENT_NOT_NULL;
1708 return P2pSetServDiscExternal(isExternalProcess);
1709 }
1710
ReqGetP2pPeer(const std::string & deviceAddress,WifiP2pDevice & device) const1711 WifiErrorNo WifiIdlClient::ReqGetP2pPeer(const std::string &deviceAddress, WifiP2pDevice &device) const
1712 {
1713 CHECK_CLIENT_NOT_NULL;
1714 P2pDeviceInfo peerInfo;
1715 if (memset_s(&peerInfo, sizeof(peerInfo), 0, sizeof(peerInfo)) != EOK) {
1716 return WIFI_HAL_OPT_FAILED;
1717 }
1718 WifiErrorNo ret = P2pGetPeer(deviceAddress.c_str(), &peerInfo);
1719 if (ret == WIFI_HAL_OPT_OK) {
1720 device.SetDeviceAddress(peerInfo.p2pDeviceAddress);
1721 device.SetDeviceName(peerInfo.deviceName);
1722 device.SetPrimaryDeviceType(peerInfo.primaryDeviceType);
1723 device.SetWpsConfigMethod(peerInfo.configMethods);
1724 device.SetDeviceCapabilitys(peerInfo.deviceCapabilities);
1725 device.SetGroupCapabilitys(peerInfo.groupCapabilities);
1726 device.SetNetworkName(peerInfo.operSsid);
1727 }
1728 return ret;
1729 }
1730
ReqP2pGetChba0Freq(int & chba0Freq) const1731 WifiErrorNo WifiIdlClient::ReqP2pGetChba0Freq(int &chba0Freq) const
1732 {
1733 CHECK_CLIENT_NOT_NULL;
1734 return P2pGetChba0Freq(&chba0Freq);
1735 }
1736
ReqP2pGetSupportFrequencies(int band,std::vector<int> & frequencies) const1737 WifiErrorNo WifiIdlClient::ReqP2pGetSupportFrequencies(int band, std::vector<int> &frequencies) const
1738 {
1739 CHECK_CLIENT_NOT_NULL;
1740 int values[HAL_GET_MAX_BANDS] = {0};
1741 int size = HAL_GET_MAX_BANDS;
1742
1743 if (P2pGetFrequencies(band, values, &size) != 0) {
1744 return WIFI_HAL_OPT_FAILED;
1745 }
1746
1747 for (int i = 0; i < size; i++) {
1748 frequencies.push_back(values[i]);
1749 }
1750
1751 return WIFI_HAL_OPT_OK;
1752 }
1753
PushP2pGroupConfigString(P2pGroupConfig * pConfig,P2pGroupConfigType type,const std::string & str) const1754 int WifiIdlClient::PushP2pGroupConfigString(
1755 P2pGroupConfig *pConfig, P2pGroupConfigType type, const std::string &str) const
1756 {
1757 if (str.length() > 0) {
1758 pConfig->cfgParam = type;
1759 if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), str.c_str(), str.length()) != EOK) {
1760 return 0;
1761 }
1762 return 1;
1763 } else {
1764 return 0;
1765 }
1766 }
1767
PushP2pGroupConfigInt(P2pGroupConfig * pConfig,P2pGroupConfigType type,int i) const1768 int WifiIdlClient::PushP2pGroupConfigInt(P2pGroupConfig *pConfig, P2pGroupConfigType type, int i) const
1769 {
1770 pConfig->cfgParam = type;
1771 if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
1772 return 0;
1773 }
1774 return 1;
1775 }
1776
ReqP2pSetGroupConfig(int networkId,const HalP2pGroupConfig & config) const1777 WifiErrorNo WifiIdlClient::ReqP2pSetGroupConfig(int networkId, const HalP2pGroupConfig &config) const
1778 {
1779 CHECK_CLIENT_NOT_NULL;
1780 P2pGroupConfig conf[GROUP_CONFIG_END_POS];
1781 if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
1782 return WIFI_HAL_OPT_FAILED;
1783 }
1784 int num = 0;
1785 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_SSID, config.ssid);
1786 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_BSSID, config.bssid);
1787 // If the PSK length is less than 8 or greater than 63, Do not set this psk field.
1788 if (config.psk.length() >= HAL_PSK_MIN_LENGTH && config.psk.length() < HAL_PSK_MAX_LENGTH) {
1789 std::string tmp = "\"" + config.psk + "\"";
1790 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, tmp);
1791 } else if (config.psk.length() == HAL_PSK_MAX_LENGTH) {
1792 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, config.psk);
1793 }
1794 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PROTO, config.proto);
1795 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_KEY_MGMT, config.keyMgmt);
1796 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PAIRWISE, config.pairwise);
1797 num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_AUTH_ALG, config.authAlg);
1798
1799 num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_MODE, config.mode);
1800 num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_DISABLED, config.disabled);
1801 if (num == 0) {
1802 return WIFI_HAL_OPT_OK;
1803 }
1804 return P2pSetGroupConfig(networkId, conf, num);
1805 }
1806
ReqP2pGetGroupConfig(int networkId,HalP2pGroupConfig & config) const1807 WifiErrorNo WifiIdlClient::ReqP2pGetGroupConfig(int networkId, HalP2pGroupConfig &config) const
1808 {
1809 CHECK_CLIENT_NOT_NULL;
1810 P2pGroupConfig confs[GROUP_CONFIG_END_POS];
1811 if (memset_s(confs, sizeof(confs), 0, sizeof(confs)) != EOK) {
1812 return WIFI_HAL_OPT_FAILED;
1813 }
1814 int size = static_cast<P2pGroupConfigType>(GROUP_CONFIG_SSID);
1815 for (; size < GROUP_CONFIG_END_POS; size++) {
1816 confs[size].cfgParam = static_cast<P2pGroupConfigType>(size);
1817 }
1818 if (P2pGetGroupConfig(networkId, confs, size) != 0) {
1819 return WIFI_HAL_OPT_FAILED;
1820 }
1821 config.ssid = confs[GROUP_CONFIG_SSID].cfgValue;
1822 config.bssid = confs[GROUP_CONFIG_BSSID].cfgValue;
1823 config.psk = confs[GROUP_CONFIG_PSK].cfgValue;
1824 config.proto = confs[GROUP_CONFIG_PROTO].cfgValue;
1825 config.keyMgmt = confs[GROUP_CONFIG_KEY_MGMT].cfgValue;
1826 config.pairwise = confs[GROUP_CONFIG_PAIRWISE].cfgValue;
1827 config.authAlg = confs[GROUP_CONFIG_AUTH_ALG].cfgValue;
1828 config.mode = atoi(confs[GROUP_CONFIG_MODE].cfgValue);
1829 config.disabled = atoi(confs[GROUP_CONFIG_DISABLED].cfgValue);
1830 return WIFI_HAL_OPT_OK;
1831 }
1832
ReqP2pAddNetwork(int & networkId) const1833 WifiErrorNo WifiIdlClient::ReqP2pAddNetwork(int &networkId) const
1834 {
1835 CHECK_CLIENT_NOT_NULL;
1836 return P2pAddNetwork(&networkId);
1837 }
1838
ReqP2pHid2dConnect(const Hid2dConnectConfig & config) const1839 WifiErrorNo WifiIdlClient::ReqP2pHid2dConnect(const Hid2dConnectConfig &config) const
1840 {
1841 CHECK_CLIENT_NOT_NULL;
1842 Hid2dConnectInfo info;
1843 if (memset_s(&info, sizeof(info), 0, sizeof(info)) != EOK) {
1844 return WIFI_HAL_OPT_FAILED;
1845 }
1846 if (strncpy_s(info.ssid, sizeof(info.ssid), config.GetSsid().c_str(), config.GetSsid().length()) != EOK) {
1847 return WIFI_HAL_OPT_FAILED;
1848 }
1849 if (strncpy_s(info.bssid, sizeof(info.bssid), config.GetBssid().c_str(), config.GetBssid().length()) != EOK) {
1850 return WIFI_HAL_OPT_FAILED;
1851 }
1852 if (strncpy_s(info.passphrase, sizeof(info.passphrase),
1853 config.GetPreSharedKey().c_str(), config.GetPreSharedKey().length()) != EOK) {
1854 return WIFI_HAL_OPT_FAILED;
1855 }
1856 info.frequency = config.GetFrequency();
1857 if (config.GetDhcpMode() == DhcpMode::CONNECT_AP_DHCP ||
1858 config.GetDhcpMode() == DhcpMode::CONNECT_AP_NODHCP) {
1859 info.isLegacyGo = 1;
1860 } else {
1861 info.isLegacyGo = 0;
1862 }
1863 WifiErrorNo ret = Hid2dConnect(&info);
1864 return ret;
1865 }
1866
ReqWpaSetSuspendMode(bool mode) const1867 WifiErrorNo WifiIdlClient::ReqWpaSetSuspendMode(bool mode) const
1868 {
1869 CHECK_CLIENT_NOT_NULL;
1870 return SetSuspendMode(mode);
1871 }
1872
ReqWpaSetPowerMode(bool mode) const1873 WifiErrorNo WifiIdlClient::ReqWpaSetPowerMode(bool mode) const
1874 {
1875 CHECK_CLIENT_NOT_NULL;
1876 return SetPowerMode(mode);
1877 }
1878 } // namespace Wifi
1879 } // namespace OHOS
1880