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