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