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 &param, 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(&param, 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(&param);
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(&param, 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(&param, &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