• 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         for (int j = 0; j < results[i].ieSize; ++j) {
294             WifiInfoElem infoElemTmp;
295             int infoElemSize = results[i].infoElems[j].size;
296             infoElemTmp.id = results[i].infoElems[j].id;
297             for (int k = 0; k < infoElemSize; ++k) {
298                 infoElemTmp.content.emplace_back(results[i].infoElems[j].content[k]);
299             }
300             if (results[i].infoElems[j].content) {
301                 free(results[i].infoElems[j].content);
302             }
303             tmp.infoElems.emplace_back(infoElemTmp);
304         }
305         if (results[i].infoElems) {
306             free(results[i].infoElems);
307         }
308         scanInfos.emplace_back(tmp);
309     }
310     free(results);
311     results = nullptr;
312     return WIFI_IDL_OPT_OK;
313 }
314 
ConvertPnoScanParam(const WifiPnoScanParam & param,PnoScanSettings * pSettings) const315 WifiErrorNo WifiIdlClient::ConvertPnoScanParam(const WifiPnoScanParam &param, PnoScanSettings *pSettings) const
316 {
317     if (param.scanInterval > 0) {
318         pSettings->scanInterval = param.scanInterval;
319     }
320     pSettings->minRssi2Dot4Ghz = param.minRssi2Dot4Ghz;
321     pSettings->minRssi5Ghz = param.minRssi5Ghz;
322     if (param.hiddenSsid.size() > 0) {
323         pSettings->hiddenSsidSize = param.hiddenSsid.size();
324         pSettings->hiddenSsid = ConVectorToCArrayString(param.hiddenSsid);
325         if (pSettings->hiddenSsid == nullptr) {
326             return WIFI_IDL_OPT_FAILED;
327         }
328     }
329     if (param.savedSsid.size() > 0) {
330         pSettings->savedSsidSize = param.savedSsid.size();
331         pSettings->savedSsid = ConVectorToCArrayString(param.savedSsid);
332         if (pSettings->savedSsid == nullptr) {
333             return WIFI_IDL_OPT_FAILED;
334         }
335     }
336     if (param.scanFreqs.size() > 0) {
337         pSettings->freqSize = param.scanFreqs.size();
338         pSettings->freqs = (int *)calloc(pSettings->freqSize, sizeof(int));
339         if (pSettings->freqs == nullptr) {
340             return WIFI_IDL_OPT_FAILED;
341         }
342         for (int i = 0; i < pSettings->freqSize; ++i) {
343             pSettings->freqs[i] = param.scanFreqs[i];
344         }
345     }
346     return WIFI_IDL_OPT_OK;
347 }
348 
ReqStartPnoScan(const WifiPnoScanParam & scanParam)349 WifiErrorNo WifiIdlClient::ReqStartPnoScan(const WifiPnoScanParam &scanParam)
350 {
351     CHECK_CLIENT_NOT_NULL;
352     PnoScanSettings settings;
353     if (memset_s(&settings, sizeof(settings), 0, sizeof(settings)) != EOK) {
354         return WIFI_IDL_OPT_FAILED;
355     }
356     WifiErrorNo err = ConvertPnoScanParam(scanParam, &settings);
357     if (err == WIFI_IDL_OPT_OK) {
358         err = StartPnoScan(&settings);
359     }
360     if (settings.freqs != nullptr) {
361         free(settings.freqs);
362         settings.freqs = nullptr;
363     }
364     if (settings.hiddenSsid != nullptr) {
365         for (int i = 0; i < settings.hiddenSsidSize; ++i) {
366             free(settings.hiddenSsid[i]);
367             settings.hiddenSsid[i] = nullptr;
368         }
369         free(settings.hiddenSsid);
370         settings.hiddenSsid = nullptr;
371     }
372     if (settings.savedSsid != nullptr) {
373         for (int i = 0; i < settings.savedSsidSize; ++i) {
374             free(settings.savedSsid[i]);
375             settings.savedSsid[i] = nullptr;
376         }
377         free(settings.savedSsid);
378         settings.savedSsid = nullptr;
379     }
380     return err;
381 }
382 
ReqStopPnoScan(void)383 WifiErrorNo WifiIdlClient::ReqStopPnoScan(void)
384 {
385     CHECK_CLIENT_NOT_NULL;
386     return StopPnoScan();
387 }
388 
RemoveDevice(int networkId)389 WifiErrorNo WifiIdlClient::RemoveDevice(int networkId)
390 {
391     CHECK_CLIENT_NOT_NULL;
392     if (networkId < 0) {
393         return WIFI_IDL_OPT_INVALID_PARAM;
394     }
395     return RemoveNetwork(networkId);
396 }
397 
ClearDeviceConfig(void) const398 WifiErrorNo WifiIdlClient::ClearDeviceConfig(void) const
399 {
400     CHECK_CLIENT_NOT_NULL;
401     return RemoveNetwork(-1);
402 }
403 
GetNextNetworkId(int & networkId)404 WifiErrorNo WifiIdlClient::GetNextNetworkId(int &networkId)
405 {
406     CHECK_CLIENT_NOT_NULL;
407     return AddNetwork(&networkId);
408 }
409 
ReqEnableNetwork(int networkId)410 WifiErrorNo WifiIdlClient::ReqEnableNetwork(int networkId)
411 {
412     CHECK_CLIENT_NOT_NULL;
413     return EnableNetwork(networkId);
414 }
415 
ReqDisableNetwork(int networkId)416 WifiErrorNo WifiIdlClient::ReqDisableNetwork(int networkId)
417 {
418     CHECK_CLIENT_NOT_NULL;
419     return DisableNetwork(networkId);
420 }
421 
GetDeviceConfig(WifiIdlGetDeviceConfig & config)422 WifiErrorNo WifiIdlClient::GetDeviceConfig(WifiIdlGetDeviceConfig &config)
423 {
424     CHECK_CLIENT_NOT_NULL;
425     GetNetworkConfig conf;
426     if (memset_s(&conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
427         return WIFI_IDL_OPT_FAILED;
428     }
429     conf.networkId = config.networkId;
430     if (strncpy_s(conf.param, sizeof(conf.param), config.param.c_str(), config.param.length()) != EOK) {
431         return WIFI_IDL_OPT_FAILED;
432     }
433     int ret = WpaGetNetwork(&conf);
434     if (ret != WIFI_IDL_OPT_OK) {
435         return WIFI_IDL_OPT_FAILED;
436     }
437     config.value = conf.value;
438     return WIFI_IDL_OPT_OK;
439 }
440 
PushDeviceConfigString(SetNetworkConfig * pConfig,DeviceConfigType type,const std::string & msg) const441 int WifiIdlClient::PushDeviceConfigString(
442     SetNetworkConfig *pConfig, DeviceConfigType type, const std::string &msg) const
443 {
444     if (msg.length() > 0) {
445         pConfig->cfgParam = type;
446         if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), msg.c_str(), msg.length()) != EOK) {
447             return 0;
448         }
449         return 1;
450     } else {
451         return 0;
452     }
453 }
454 
PushDeviceConfigInt(SetNetworkConfig * pConfig,DeviceConfigType type,int i) const455 int WifiIdlClient::PushDeviceConfigInt(SetNetworkConfig *pConfig, DeviceConfigType type, int i) const
456 {
457     pConfig->cfgParam = type;
458     if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
459         return 0;
460     }
461     return 1;
462 }
463 
PushDeviceConfigAuthAlgorithm(SetNetworkConfig * pConfig,DeviceConfigType type,unsigned int alg) const464 int WifiIdlClient::PushDeviceConfigAuthAlgorithm(
465     SetNetworkConfig *pConfig, DeviceConfigType type, unsigned int alg) const
466 {
467     pConfig->cfgParam = type;
468     if (alg & 0x1) {
469         if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN ") != EOK) {
470             return 0;
471         }
472     }
473     if (alg & 0x2) {
474         if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "OPEN SHARED ") != EOK) {
475             return 0;
476         }
477     }
478     if (alg & 0x4) {
479         if (strcat_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), "LEAP ") != EOK) {
480             return 0;
481         }
482     }
483     return 1;
484 }
485 
CheckValidDeviceConfig(const WifiIdlDeviceConfig & config) const486 WifiErrorNo WifiIdlClient::CheckValidDeviceConfig(const WifiIdlDeviceConfig &config) const
487 {
488     if (config.psk.length() > 0) {
489         if (config.psk.length() < WIFI_IDL_PSK_MIN_LENGTH || config.psk.length() > WIFI_IDL_PSK_MAX_LENGTH) {
490             return WIFI_IDL_OPT_FAILED;
491         }
492     }
493     if (config.authAlgorithms >= AUTH_ALGORITHM_MAX) { /* max is 0111 */
494         return WIFI_IDL_OPT_FAILED;
495     }
496     return WIFI_IDL_OPT_OK;
497 }
498 
SetDeviceConfig(int networkId,const WifiIdlDeviceConfig & config)499 WifiErrorNo WifiIdlClient::SetDeviceConfig(int networkId, const WifiIdlDeviceConfig &config)
500 {
501     CHECK_CLIENT_NOT_NULL;
502     if (CheckValidDeviceConfig(config) != WIFI_IDL_OPT_OK) {
503         LOGE("SetDeviceConfig, CheckValidDeviceConfig return error!");
504         return WIFI_IDL_OPT_FAILED;
505     }
506     SetNetworkConfig conf[DEVICE_CONFIG_END_POS];
507     if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
508         LOGE("SetDeviceConfig, memset_s return error!");
509         return WIFI_IDL_OPT_FAILED;
510     }
511     int num = 0;
512     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_SSID, config.ssid);
513     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PSK, config.psk);
514     if (config.keyMgmt == KEY_MGMT_NONE || config.keyMgmt == KEY_MGMT_WEP) {
515         num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, KEY_MGMT_NONE);
516     } else {
517         num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_KEYMGMT, config.keyMgmt);
518     }
519     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP, config.eap);
520     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_IDENTITY, config.identity);
521     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_PASSWORD, config.password);
522     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_CLIENT_CERT, config.clientCert);
523     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PRIVATE_KEY, config.privateKey);
524     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_BSSID, config.bssid);
525     int i = 0;
526     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_0, config.wepKeys[i++]);
527     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_1, config.wepKeys[i++]);
528     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_2, config.wepKeys[i++]);
529     num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_WEP_KEY_3, config.wepKeys[i++]);
530     if (config.priority >= 0) {
531         num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_PRIORITY, config.priority);
532     }
533     if (config.scanSsid == 1) {
534         num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_SCAN_SSID, config.scanSsid);
535     }
536     if (config.wepKeyIdx >= 0) {
537         num += PushDeviceConfigInt(conf + num, DEVICE_CONFIG_WEP_KEY_IDX, config.wepKeyIdx);
538     }
539     if (config.authAlgorithms > 0) {
540         num += PushDeviceConfigAuthAlgorithm(conf + num, DEVICE_CONFIG_AUTH_ALGORITHMS, config.authAlgorithms);
541     }
542     if (config.phase2Method != static_cast<int>(Phase2Method::NONE)) {
543         std::string strPhase2Method = WifiEapConfig::Phase2MethodToStr(config.eap, config.phase2Method);
544         num += PushDeviceConfigString(conf + num, DEVICE_CONFIG_EAP_PHASE2METHOD, strPhase2Method);
545     }
546     if (num == 0) {
547         return WIFI_IDL_OPT_OK;
548     }
549     return SetNetwork(networkId, conf, num);
550 }
551 
SetWpsBssid(int networkId,const std::string & bssid)552 WifiErrorNo WifiIdlClient::SetWpsBssid(int networkId, const std::string &bssid)
553 {
554     CHECK_CLIENT_NOT_NULL;
555     SetNetworkConfig conf;
556     int num = PushDeviceConfigString(&conf, DEVICE_CONFIG_BSSID, bssid);
557     if (num == 0) {
558         LOGE("SetWpsBssid, PushDeviceConfigString return error!");
559         return WIFI_IDL_OPT_OK;
560     }
561 
562     return SetNetwork(networkId, &conf, num);
563 }
564 
SaveDeviceConfig(void)565 WifiErrorNo WifiIdlClient::SaveDeviceConfig(void)
566 {
567     CHECK_CLIENT_NOT_NULL;
568     return SaveNetworkConfig();
569 }
570 
ReqRegisterStaEventCallback(const WifiEventCallback & callback)571 WifiErrorNo WifiIdlClient::ReqRegisterStaEventCallback(const WifiEventCallback &callback)
572 {
573     CHECK_CLIENT_NOT_NULL;
574     IWifiEventCallback cEventCallback;
575     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
576         return WIFI_IDL_OPT_FAILED;
577     }
578     if (callback.onConnectChanged != nullptr) {
579         cEventCallback.onConnectChanged = OnConnectChanged;
580         cEventCallback.onBssidChanged = OnBssidChanged;
581         cEventCallback.onWpaStateChanged = OnWpaStateChanged;
582         cEventCallback.onSsidWrongkey = OnWpaSsidWrongKey;
583         cEventCallback.onWpsOverlap = OnWpsOverlap;
584         cEventCallback.onWpsTimeOut = OnWpsTimeOut;
585         cEventCallback.onWpsConnectionFull = OnWpaConnectionFull;
586         cEventCallback.onWpsConnectionReject = OnWpaConnectionReject;
587     }
588     return RegisterStaEventCallback(cEventCallback);
589 }
590 
ReqStartWpsPbcMode(const WifiIdlWpsConfig & config)591 WifiErrorNo WifiIdlClient::ReqStartWpsPbcMode(const WifiIdlWpsConfig &config)
592 {
593     CHECK_CLIENT_NOT_NULL;
594     WifiWpsParam param;
595     if (memset_s(&param, sizeof(param), 0, sizeof(param)) != EOK) {
596         return WIFI_IDL_OPT_FAILED;
597     }
598     param.anyFlag = config.anyFlag;
599     param.multiAp = config.multiAp;
600     if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
601         return WIFI_IDL_OPT_FAILED;
602     }
603     return StartWpsPbcMode(&param);
604 }
605 
ReqStartWpsPinMode(const WifiIdlWpsConfig & config,int & pinCode)606 WifiErrorNo WifiIdlClient::ReqStartWpsPinMode(const WifiIdlWpsConfig &config, int &pinCode)
607 {
608     CHECK_CLIENT_NOT_NULL;
609     WifiWpsParam param;
610     if (memset_s(&param, sizeof(param), 0, sizeof(param)) != EOK) {
611         return WIFI_IDL_OPT_FAILED;
612     }
613     param.anyFlag = config.anyFlag;
614     param.multiAp = config.multiAp;
615     if (strncpy_s(param.bssid, sizeof(param.bssid), config.bssid.c_str(), config.bssid.length()) != EOK) {
616         return WIFI_IDL_OPT_FAILED;
617     }
618     if (!config.pinCode.empty()) {
619         if (strncpy_s(param.pinCode, sizeof(param.pinCode), config.pinCode.c_str(), config.pinCode.length()) != EOK) {
620             return WIFI_IDL_OPT_FAILED;
621         }
622     }
623     return StartWpsPinMode(&param, &pinCode);
624 }
625 
ReqStopWps()626 WifiErrorNo WifiIdlClient::ReqStopWps()
627 {
628     CHECK_CLIENT_NOT_NULL;
629     return StopWps();
630 }
631 
ReqGetRoamingCapabilities(WifiIdlRoamCapability & capability)632 WifiErrorNo WifiIdlClient::ReqGetRoamingCapabilities(WifiIdlRoamCapability &capability)
633 {
634     CHECK_CLIENT_NOT_NULL;
635     WifiRoamCapability tmp;
636     if (memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)) != EOK) {
637         return WIFI_IDL_OPT_FAILED;
638     }
639     WifiErrorNo err = GetRoamingCapabilities(&tmp);
640     if (err == WIFI_IDL_OPT_OK) {
641         capability.maxBlocklistSize = tmp.maxBlocklistSize;
642         capability.maxTrustlistSize = tmp.maxTrustlistSize;
643     }
644     return err;
645 }
646 
ConVectorToCArrayString(const std::vector<std::string> & vec) const647 char **WifiIdlClient::ConVectorToCArrayString(const std::vector<std::string> &vec) const
648 {
649     int size = vec.size();
650     if (size == 0) {
651         return nullptr;
652     }
653     char **list = (char **)calloc(size, sizeof(char *));
654     if (list == nullptr) {
655         return nullptr;
656     }
657     int i = 0;
658     for (; i < size; ++i) {
659         int len = vec[i].length();
660         list[i] = (char *)calloc(len + 1, sizeof(char));
661         if (list[i] == nullptr) {
662             break;
663         }
664         if (strncpy_s(list[i], len + 1, vec[i].c_str(), len) != EOK) {
665             break;
666         }
667     }
668     if (i < size) {
669         for (int j = 0; j <= i; ++j) {
670             free(list[j]);
671         }
672         free(list);
673         list = nullptr;
674         return nullptr;
675     } else {
676         return list;
677     }
678 }
679 
ReqSetRoamConfig(const WifiIdlRoamConfig & config)680 WifiErrorNo WifiIdlClient::ReqSetRoamConfig(const WifiIdlRoamConfig &config)
681 {
682     CHECK_CLIENT_NOT_NULL;
683     char **blocklist = nullptr;
684     int blocksize = config.blocklistBssids.size();
685     char **trustlist = nullptr;
686     int trustsize = config.trustlistBssids.size();
687     if (blocksize == 0 && trustsize == 0) {
688         return WIFI_IDL_OPT_FAILED;
689     }
690     WifiErrorNo err = WIFI_IDL_OPT_FAILED;
691     do {
692         if (blocksize > 0) {
693             blocklist = ConVectorToCArrayString(config.blocklistBssids);
694             if (blocklist == nullptr) {
695                 break;
696             }
697         }
698         if (trustsize > 0) {
699             trustlist = ConVectorToCArrayString(config.trustlistBssids);
700             if (trustlist == nullptr) {
701                 break;
702             }
703         }
704         err = SetRoamConfig(blocklist, blocksize, trustlist, trustsize);
705     } while (0);
706     if (blocklist != nullptr) {
707         for (int i = 0; i < blocksize; ++i) {
708             free(blocklist[i]);
709             blocklist[i] = nullptr;
710         }
711         free(blocklist);
712         blocklist = nullptr;
713     }
714     if (trustlist != nullptr) {
715         for (int i = 0; i < trustsize; ++i) {
716             free(trustlist[i]);
717             trustlist[i] = nullptr;
718         }
719         free(trustlist);
720         trustlist = nullptr;
721     }
722     return err;
723 }
724 
ReqGetConnectSignalInfo(const std::string & endBssid,WifiWpaSignalInfo & info) const725 WifiErrorNo WifiIdlClient::ReqGetConnectSignalInfo(const std::string &endBssid, WifiWpaSignalInfo &info) const
726 {
727     CHECK_CLIENT_NOT_NULL;
728     WpaSignalInfo req = {0};
729     WifiErrorNo err = GetConnectSignalInfo(endBssid.c_str(), &req);
730     if (err == WIFI_IDL_OPT_OK) {
731         info.signal = req.signal;
732         info.txrate = req.txrate;
733         info.rxrate = req.rxrate;
734         info.noise = req.noise;
735         info.frequency = req.frequency;
736     }
737     return err;
738 }
739 
StartAp(int id)740 WifiErrorNo WifiIdlClient::StartAp(int id)
741 {
742     CHECK_CLIENT_NOT_NULL;
743     return StartSoftAp(id);
744 }
745 
StopAp(int id)746 WifiErrorNo WifiIdlClient::StopAp(int id)
747 {
748     CHECK_CLIENT_NOT_NULL;
749     return StopSoftAp(id);
750 }
751 
SetSoftApConfig(const HotspotConfig & config,int id)752 WifiErrorNo WifiIdlClient::SetSoftApConfig(const HotspotConfig &config, int id)
753 {
754     CHECK_CLIENT_NOT_NULL;
755     HostapdConfig tmp;
756     if (memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)) != EOK) {
757         return WIFI_IDL_OPT_FAILED;
758     }
759     tmp.ssidLen = config.GetSsid().length();
760     if (strncpy_s(tmp.ssid, sizeof(tmp.ssid), config.GetSsid().c_str(), tmp.ssidLen) != EOK) {
761         return WIFI_IDL_OPT_FAILED;
762     }
763     std::string preSharedKey = config.GetPreSharedKey();
764     tmp.preSharedKeyLen = preSharedKey.length();
765     if (strncpy_s(tmp.preSharedKey, sizeof(tmp.preSharedKey), preSharedKey.c_str(), tmp.preSharedKeyLen) != EOK) {
766         return WIFI_IDL_OPT_FAILED;
767     }
768     tmp.securityType = static_cast<int>(config.GetSecurityType());
769     tmp.band = static_cast<int>(config.GetBand());
770     tmp.channel = config.GetChannel();
771     tmp.maxConn = config.GetMaxConn();
772     return SetHostapdConfig(&tmp, id);
773 }
774 
GetStationList(std::vector<std::string> & result,int id)775 WifiErrorNo WifiIdlClient::GetStationList(std::vector<std::string> &result, int id)
776 {
777     CHECK_CLIENT_NOT_NULL;
778 
779     char *staInfos = new (std::nothrow) char[BUFFER_SIZE]();
780     if (staInfos == nullptr) {
781         return WIFI_IDL_OPT_FAILED;
782     }
783     int32_t size = BUFFER_SIZE;
784     WifiErrorNo err = GetStaInfos(staInfos, &size, id);
785     if (err != WIFI_IDL_OPT_OK) {
786         delete[] staInfos;
787         return WIFI_IDL_OPT_FAILED;
788     }
789     std::string strStaInfo = std::string(staInfos);
790     SplitString(strStaInfo, ",", result);
791     delete[] staInfos;
792     return WIFI_IDL_OPT_OK;
793 }
794 
AddBlockByMac(const std::string & mac,int id)795 WifiErrorNo WifiIdlClient::AddBlockByMac(const std::string &mac, int id)
796 {
797     CHECK_CLIENT_NOT_NULL;
798     if (CheckMacIsValid(mac) != 0) {
799         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
800     }
801     int len = mac.length();
802     return SetMacFilter((unsigned char *)mac.c_str(), len, id);
803 }
804 
DelBlockByMac(const std::string & mac,int id)805 WifiErrorNo WifiIdlClient::DelBlockByMac(const std::string &mac, int id)
806 {
807     CHECK_CLIENT_NOT_NULL;
808     if (CheckMacIsValid(mac) != 0) {
809         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
810     }
811     int len = mac.length();
812     return DelMacFilter((unsigned char *)mac.c_str(), len, id);
813 }
814 
RemoveStation(const std::string & mac,int id)815 WifiErrorNo WifiIdlClient::RemoveStation(const std::string &mac, int id)
816 {
817     CHECK_CLIENT_NOT_NULL;
818     if (CheckMacIsValid(mac) != 0) {
819         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
820     }
821     int len = mac.length();
822     return DisassociateSta((unsigned char *)mac.c_str(), len, id);
823 }
824 
GetFrequenciesByBand(int32_t band,std::vector<int> & frequencies,int id)825 WifiErrorNo WifiIdlClient::GetFrequenciesByBand(int32_t band, std::vector<int> &frequencies, int id)
826 {
827     CHECK_CLIENT_NOT_NULL;
828 
829     int values[WIFI_IDL_GET_MAX_BANDS] = {0};
830     int size = WIFI_IDL_GET_MAX_BANDS;
831     if (GetValidFrequenciesForBand(band, values, &size, id) != 0) {
832         return WIFI_IDL_OPT_FAILED;
833     }
834 
835     for (int i = 0; i < size; i++) {
836         frequencies.push_back(values[i]);
837     }
838 
839     return WIFI_IDL_OPT_OK;
840 }
841 
RegisterApEvent(IWifiApMonitorEventCallback callback,int id) const842 WifiErrorNo WifiIdlClient::RegisterApEvent(IWifiApMonitorEventCallback callback, int id) const
843 {
844     CHECK_CLIENT_NOT_NULL;
845     IWifiApEventCallback cEventCallback;
846     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
847         return WIFI_IDL_OPT_FAILED;
848     }
849     if (callback.onStaJoinOrLeave != nullptr) {
850         cEventCallback.onStaJoinOrLeave = OnApStaJoinOrLeave;
851         cEventCallback.onApEnableOrDisable = OnApEnableOrDisable;
852     }
853 
854     return RegisterAsscociatedEvent(cEventCallback, id);
855 }
856 
SetWifiCountryCode(const std::string & code,int id)857 WifiErrorNo WifiIdlClient::SetWifiCountryCode(const std::string &code, int id)
858 {
859     CHECK_CLIENT_NOT_NULL;
860     if (code.length() != WIFI_IDL_COUNTRY_CODE_LENGTH) {
861         return WIFI_IDL_OPT_INVALID_PARAM;
862     }
863     return SetCountryCode(code.c_str(), id);
864 }
865 
ReqDisconnectStaByMac(const std::string & mac,int id)866 WifiErrorNo WifiIdlClient::ReqDisconnectStaByMac(const std::string &mac, int id)
867 {
868     CHECK_CLIENT_NOT_NULL;
869     if (CheckMacIsValid(mac) != 0) {
870         return WIFI_IDL_OPT_INPUT_MAC_INVALID;
871     }
872     return DisassociateSta((unsigned char *)mac.c_str(), strlen(mac.c_str()), id);
873 }
874 
ReqGetPowerModel(int & model,int id)875 WifiErrorNo WifiIdlClient::ReqGetPowerModel(int& model, int id)
876 {
877     CHECK_CLIENT_NOT_NULL;
878     return WpaGetPowerModel(&model, id);
879 }
880 
ReqSetPowerModel(const int & model,int id)881 WifiErrorNo WifiIdlClient::ReqSetPowerModel(const int& model, int id)
882 {
883     CHECK_CLIENT_NOT_NULL;
884     return WpaSetPowerModel(model, id);
885 }
886 
GetWifiChipObject(int id,IWifiChip & chip)887 WifiErrorNo WifiIdlClient::GetWifiChipObject(int id, IWifiChip &chip)
888 {
889     CHECK_CLIENT_NOT_NULL;
890     LOGD("Get wifi chip object accord %{public}d, %{public}d", id, chip.i);
891     return WIFI_IDL_OPT_OK;
892 }
893 
GetChipIds(std::vector<int> & ids)894 WifiErrorNo WifiIdlClient::GetChipIds(std::vector<int> &ids)
895 {
896     CHECK_CLIENT_NOT_NULL;
897     LOGD("start GetChipIds %{public}zu", ids.size()); /* fixed compile error, -Werror,-Wunused-parameter */
898     return WIFI_IDL_OPT_OK;
899 }
900 
GetUsedChipId(int & id)901 WifiErrorNo WifiIdlClient::GetUsedChipId(int &id)
902 {
903     CHECK_CLIENT_NOT_NULL;
904     id = 0; /* fixed compile error, -Werror,-Wunused-parameter */
905     return WIFI_IDL_OPT_OK;
906 }
907 
GetChipCapabilities(int & capabilities)908 WifiErrorNo WifiIdlClient::GetChipCapabilities(int &capabilities)
909 {
910     CHECK_CLIENT_NOT_NULL;
911     capabilities = 0; /* fixed compile error, -Werror,-Wunused-parameter */
912     return WIFI_IDL_OPT_OK;
913 }
914 
GetSupportedModes(std::vector<int> & modes)915 WifiErrorNo WifiIdlClient::GetSupportedModes(std::vector<int> &modes)
916 {
917     CHECK_CLIENT_NOT_NULL;
918     int size = WIFI_IDL_INTERFACE_SUPPORT_COMBINATIONS;
919     int supportModes[WIFI_IDL_INTERFACE_SUPPORT_COMBINATIONS] = {0};
920     WifiErrorNo err = GetSupportedComboModes(supportModes, &size);
921     if (err == WIFI_IDL_OPT_OK) {
922         for (int i = 0; i < size; ++i) {
923             modes.push_back(supportModes[i]);
924         }
925     }
926     return err;
927 }
928 
ConfigRunModes(int mode)929 WifiErrorNo WifiIdlClient::ConfigRunModes(int mode)
930 {
931     CHECK_CLIENT_NOT_NULL;
932     LOGD("start ConfigRunModes mode %{public}d", mode);
933     return WIFI_IDL_OPT_OK;
934 }
935 
GetCurrentMode(int & mode)936 WifiErrorNo WifiIdlClient::GetCurrentMode(int &mode)
937 {
938     CHECK_CLIENT_NOT_NULL;
939     mode = 0; /* fixed compile error, -Werror,-Wunused-parameter */
940     return WIFI_IDL_OPT_OK;
941 }
942 
RegisterChipEventCallback(WifiChipEventCallback & callback)943 WifiErrorNo WifiIdlClient::RegisterChipEventCallback(WifiChipEventCallback &callback)
944 {
945     CHECK_CLIENT_NOT_NULL;
946     IWifiChipEventCallback cEventCallback;
947     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
948         return WIFI_IDL_OPT_FAILED;
949     }
950     cEventCallback.onIfaceAdded = callback.onIfaceAdded;
951     cEventCallback.onIfaceRemoved = callback.onIfaceRemoved;
952     return RegisterEventCallback(cEventCallback);
953 }
954 
RequestFirmwareDebugInfo(std::string & debugInfo)955 WifiErrorNo WifiIdlClient::RequestFirmwareDebugInfo(std::string &debugInfo)
956 {
957     CHECK_CLIENT_NOT_NULL;
958     debugInfo.clear(); /* fixed compile error, -Werror,-Wunused-parameter */
959     return WIFI_IDL_OPT_OK;
960 }
961 
ReqIsSupportDbdc(bool & isSupport) const962 WifiErrorNo WifiIdlClient::ReqIsSupportDbdc(bool &isSupport) const
963 {
964     CHECK_CLIENT_NOT_NULL;
965     return IsChipSupportDbdc(&isSupport);
966 }
967 
ReqIsSupportCsa(bool & isSupport) const968 WifiErrorNo WifiIdlClient::ReqIsSupportCsa(bool &isSupport) const
969 {
970     CHECK_CLIENT_NOT_NULL;
971     return IsChipSupportCsa(&isSupport);
972 }
973 
ReqIsSupportRadarDetect(bool & isSupport) const974 WifiErrorNo WifiIdlClient::ReqIsSupportRadarDetect(bool &isSupport) const
975 {
976     CHECK_CLIENT_NOT_NULL;
977     return IsChipSupportRadarDetect(&isSupport);
978 }
979 
ReqIsSupportDfsChannel(bool & isSupport) const980 WifiErrorNo WifiIdlClient::ReqIsSupportDfsChannel(bool &isSupport) const
981 {
982     CHECK_CLIENT_NOT_NULL;
983     return IsChipSupportDfsChannel(&isSupport);
984 }
985 
ReqIsSupportIndoorChannel(bool & isSupport) const986 WifiErrorNo WifiIdlClient::ReqIsSupportIndoorChannel(bool &isSupport) const
987 {
988     CHECK_CLIENT_NOT_NULL;
989     return IsChipSupportIndoorChannel(&isSupport);
990 }
991 
ReqStartSupplicant(void)992 WifiErrorNo WifiIdlClient::ReqStartSupplicant(void)
993 {
994     CHECK_CLIENT_NOT_NULL;
995     return StartSupplicant();
996 }
997 
ReqStopSupplicant(void)998 WifiErrorNo WifiIdlClient::ReqStopSupplicant(void)
999 {
1000     CHECK_CLIENT_NOT_NULL;
1001     return StopSupplicant();
1002 }
1003 
ReqConnectSupplicant(void)1004 WifiErrorNo WifiIdlClient::ReqConnectSupplicant(void)
1005 {
1006     CHECK_CLIENT_NOT_NULL;
1007     return ConnectSupplicant();
1008 }
1009 
ReqDisconnectSupplicant(void)1010 WifiErrorNo WifiIdlClient::ReqDisconnectSupplicant(void)
1011 {
1012     CHECK_CLIENT_NOT_NULL;
1013     return DisconnectSupplicant();
1014 }
1015 
ReqRequestToSupplicant(const std::string & request)1016 WifiErrorNo WifiIdlClient::ReqRequestToSupplicant(const std::string &request)
1017 {
1018     CHECK_CLIENT_NOT_NULL;
1019     unsigned char *p = (unsigned char *)request.c_str();
1020     return RequestToSupplicant(p, request.length());
1021 }
1022 
ReqRegisterSupplicantEventCallback(SupplicantEventCallback & callback)1023 WifiErrorNo WifiIdlClient::ReqRegisterSupplicantEventCallback(SupplicantEventCallback &callback)
1024 {
1025     CHECK_CLIENT_NOT_NULL;
1026     ISupplicantEventCallback cEventCallback;
1027     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1028         return WIFI_IDL_OPT_FAILED;
1029     }
1030     if (callback.onScanNotify != nullptr) {
1031         cEventCallback.onScanNotify = OnScanNotify;
1032     }
1033     return RegisterSupplicantEventCallback(cEventCallback);
1034 }
1035 
ReqUnRegisterSupplicantEventCallback(void)1036 WifiErrorNo WifiIdlClient::ReqUnRegisterSupplicantEventCallback(void)
1037 {
1038     CHECK_CLIENT_NOT_NULL;
1039     ISupplicantEventCallback cEventCallback;
1040     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1041         return WIFI_IDL_OPT_FAILED;
1042     }
1043     return RegisterSupplicantEventCallback(cEventCallback);
1044 }
1045 
ReqSetPowerSave(bool enable)1046 WifiErrorNo WifiIdlClient::ReqSetPowerSave(bool enable)
1047 {
1048     CHECK_CLIENT_NOT_NULL;
1049     int mode = 0;
1050     if (enable) {
1051         mode = 1;
1052     }
1053 
1054     return SetPowerSave(mode);
1055 }
1056 
ReqWpaSetCountryCode(const std::string & countryCode)1057 WifiErrorNo WifiIdlClient::ReqWpaSetCountryCode(const std::string &countryCode)
1058 {
1059     CHECK_CLIENT_NOT_NULL;
1060     if (countryCode.length() != WIFI_IDL_COUNTRY_CODE_LENGTH) {
1061         return WIFI_IDL_OPT_INVALID_PARAM;
1062     }
1063     return WpaSetCountryCode(countryCode.c_str());
1064 }
1065 
ReqWpaGetCountryCode(std::string & countryCode)1066 WifiErrorNo WifiIdlClient::ReqWpaGetCountryCode(std::string &countryCode)
1067 {
1068     CHECK_CLIENT_NOT_NULL;
1069     const int idlCountryCodeLen = 32;
1070     char code[idlCountryCodeLen] = {0};
1071     WifiErrorNo ret = WpaGetCountryCode(code, idlCountryCodeLen);
1072     if (ret == WIFI_IDL_OPT_OK) {
1073         countryCode = code;
1074     }
1075     return ret;
1076 }
1077 
ReqWpaAutoConnect(int enable)1078 WifiErrorNo WifiIdlClient::ReqWpaAutoConnect(int enable)
1079 {
1080     CHECK_CLIENT_NOT_NULL;
1081     return WpaAutoConnect(enable);
1082 }
1083 
ReqWpaBlocklistClear()1084 WifiErrorNo WifiIdlClient::ReqWpaBlocklistClear()
1085 {
1086     CHECK_CLIENT_NOT_NULL;
1087     return WpaBlocklistClear();
1088 }
1089 
ReqP2pStart(void) const1090 WifiErrorNo WifiIdlClient::ReqP2pStart(void) const
1091 {
1092     CHECK_CLIENT_NOT_NULL;
1093     return P2pStart();
1094 }
1095 
ReqP2pStop(void) const1096 WifiErrorNo WifiIdlClient::ReqP2pStop(void) const
1097 {
1098     CHECK_CLIENT_NOT_NULL;
1099     return P2pStop();
1100 }
1101 
ReqP2pSetDeviceName(const std::string & name) const1102 WifiErrorNo WifiIdlClient::ReqP2pSetDeviceName(const std::string &name) const
1103 {
1104     CHECK_CLIENT_NOT_NULL;
1105     return P2pSetDeviceName(name.c_str());
1106 }
1107 
ReqP2pSetSsidPostfixName(const std::string & postfixName) const1108 WifiErrorNo WifiIdlClient::ReqP2pSetSsidPostfixName(const std::string &postfixName) const
1109 {
1110     CHECK_CLIENT_NOT_NULL;
1111     return P2pSetSsidPostfixName(postfixName.c_str());
1112 }
1113 
ReqP2pSetWpsDeviceType(const std::string & type) const1114 WifiErrorNo WifiIdlClient::ReqP2pSetWpsDeviceType(const std::string &type) const
1115 {
1116     CHECK_CLIENT_NOT_NULL;
1117     return P2pSetWpsDeviceType(type.c_str());
1118 }
1119 
ReqP2pSetWpsSecondaryDeviceType(const std::string & type) const1120 WifiErrorNo WifiIdlClient::ReqP2pSetWpsSecondaryDeviceType(const std::string &type) const
1121 {
1122     CHECK_CLIENT_NOT_NULL;
1123     return P2pSetWpsSecondaryDeviceType(type.c_str());
1124 }
1125 
ReqP2pSetWpsConfigMethods(const std::string & config) const1126 WifiErrorNo WifiIdlClient::ReqP2pSetWpsConfigMethods(const std::string &config) const
1127 {
1128     CHECK_CLIENT_NOT_NULL;
1129     return P2pSetWpsConfigMethods(config.c_str());
1130 }
1131 
ReqP2pGetDeviceAddress(std::string & deviceAddress) const1132 WifiErrorNo WifiIdlClient::ReqP2pGetDeviceAddress(std::string &deviceAddress) const
1133 {
1134     CHECK_CLIENT_NOT_NULL;
1135     char address[WIFI_IDL_P2P_DEV_ADDRESS_LEN] = {0};
1136     WifiErrorNo ret = P2pGetDeviceAddress(address, WIFI_IDL_P2P_DEV_ADDRESS_LEN);
1137     if (ret == WIFI_IDL_OPT_OK) {
1138         deviceAddress = address;
1139     }
1140     return ret;
1141 }
1142 
ReqP2pFlush() const1143 WifiErrorNo WifiIdlClient::ReqP2pFlush() const
1144 {
1145     CHECK_CLIENT_NOT_NULL;
1146     return P2pFlush();
1147 }
1148 
ReqP2pFlushService() const1149 WifiErrorNo WifiIdlClient::ReqP2pFlushService() const
1150 {
1151     CHECK_CLIENT_NOT_NULL;
1152     return P2pFlushService();
1153 }
1154 
ReqP2pSaveConfig() const1155 WifiErrorNo WifiIdlClient::ReqP2pSaveConfig() const
1156 {
1157     CHECK_CLIENT_NOT_NULL;
1158     return P2pSaveConfig();
1159 }
1160 
ReqP2pRegisterCallback(const P2pHalCallback & callbacks) const1161 WifiErrorNo WifiIdlClient::ReqP2pRegisterCallback(const P2pHalCallback &callbacks) const
1162 {
1163     CHECK_CLIENT_NOT_NULL;
1164 
1165     IWifiEventP2pCallback cEventCallback;
1166     if (memset_s(&cEventCallback, sizeof(cEventCallback), 0, sizeof(cEventCallback)) != EOK) {
1167         return WIFI_IDL_OPT_FAILED;
1168     }
1169     if (callbacks.onConnectSupplicant != nullptr) {
1170         cEventCallback.onP2pSupplicantConnect = OnP2pConnectSupplicant;
1171         cEventCallback.onDeviceFound = OnP2pDeviceFound;
1172         cEventCallback.onDeviceLost = OnP2pDeviceLost;
1173         cEventCallback.onGoNegotiationRequest = OnP2pGoNegotiationRequest;
1174         cEventCallback.onGoNegotiationSuccess = OnP2pGoNegotiationSuccess;
1175         cEventCallback.onGoNegotiationFailure = OnP2pGoNegotiationFailure;
1176         cEventCallback.onInvitationReceived = OnP2pInvitationReceived;
1177         cEventCallback.onInvitationResult = OnP2pInvitationResult;
1178         cEventCallback.onGroupFormationSuccess = OnP2pGroupFormationSuccess;
1179         cEventCallback.onGroupFormationFailure = OnP2pGroupFormationFailure;
1180         cEventCallback.onGroupStarted = OnP2pGroupStarted;
1181         cEventCallback.onGroupRemoved = OnP2pGroupRemoved;
1182         cEventCallback.onProvisionDiscoveryPbcRequest = OnP2pProvisionDiscoveryPbcRequest;
1183         cEventCallback.onProvisionDiscoveryPbcResponse = OnP2pProvisionDiscoveryPbcResponse;
1184         cEventCallback.onProvisionDiscoveryEnterPin = OnP2pProvisionDiscoveryEnterPin;
1185         cEventCallback.onProvisionDiscoveryShowPin = OnP2pProvisionDiscoveryShowPin;
1186         cEventCallback.onProvisionDiscoveryFailure = OnP2pProvisionDiscoveryFailure;
1187         cEventCallback.onFindStopped = OnP2pFindStopped;
1188         cEventCallback.onServiceDiscoveryResponse = OnP2pServiceDiscoveryResponse;
1189         cEventCallback.onStaDeauthorized = OnP2pStaDeauthorized;
1190         cEventCallback.onStaAuthorized = OnP2pStaAuthorized;
1191         cEventCallback.connectSupplicantFailed = OnP2pConnectSupplicantFailed;
1192         cEventCallback.onP2pServDiscReq = OnP2pServDiscReq;
1193         cEventCallback.onP2pIfaceCreated = OnP2pIfaceCreated;
1194     }
1195 
1196     return RegisterP2pEventCallback(cEventCallback);
1197 }
1198 
ReqP2pSetupWpsPbc(const std::string & groupInterface,const std::string & bssid) const1199 WifiErrorNo WifiIdlClient::ReqP2pSetupWpsPbc(const std::string &groupInterface, const std::string &bssid) const
1200 {
1201     CHECK_CLIENT_NOT_NULL;
1202     return P2pSetupWpsPbc(groupInterface.c_str(), bssid.c_str());
1203 }
1204 
ReqP2pSetupWpsPin(const std::string & groupInterface,const std::string & address,const std::string & pin,std::string & result) const1205 WifiErrorNo WifiIdlClient::ReqP2pSetupWpsPin(
1206     const std::string &groupInterface, const std::string &address, const std::string &pin, std::string &result) const
1207 {
1208     CHECK_CLIENT_NOT_NULL;
1209     if (!pin.empty() && pin.size() != WIFI_IDL_PIN_CODE_LENGTH) {
1210         return WIFI_IDL_OPT_INVALID_PARAM;
1211     }
1212     char szPinCode[WIFI_IDL_PIN_CODE_LENGTH + 1] = {0};
1213     WifiErrorNo ret =
1214         P2pSetupWpsPin(groupInterface.c_str(), address.c_str(), pin.c_str(), szPinCode, sizeof(szPinCode));
1215     if (ret == WIFI_IDL_OPT_OK) {
1216         result = szPinCode;
1217     }
1218     return ret;
1219 }
1220 
ReqP2pRemoveNetwork(int networkId) const1221 WifiErrorNo WifiIdlClient::ReqP2pRemoveNetwork(int networkId) const
1222 {
1223     CHECK_CLIENT_NOT_NULL;
1224     return P2pRemoveNetwork(networkId);
1225 }
1226 
ReqP2pListNetworks(std::map<int,WifiP2pGroupInfo> & mapGroups) const1227 WifiErrorNo WifiIdlClient::ReqP2pListNetworks(std::map<int, WifiP2pGroupInfo> &mapGroups) const
1228 {
1229     CHECK_CLIENT_NOT_NULL;
1230     P2pNetworkList infoList = {0};
1231     WifiErrorNo ret = P2pListNetworks(&infoList);
1232     if (ret != WIFI_IDL_OPT_OK) {
1233         return ret;
1234     }
1235     if (infoList.infos == nullptr) {
1236         return ret;
1237     }
1238     for (int i = 0; i < infoList.infoNum; ++i) {
1239         WifiP2pGroupInfo groupInfo;
1240         groupInfo.SetNetworkId(infoList.infos[i].id);
1241         groupInfo.SetGroupName(infoList.infos[i].ssid);
1242         WifiP2pDevice device;
1243         device.SetDeviceAddress(infoList.infos[i].bssid);
1244         groupInfo.SetOwner(device);
1245         if (strstr(infoList.infos[i].flags, "P2P-PERSISTENT") != nullptr) {
1246             groupInfo.SetIsPersistent(true);
1247         }
1248         mapGroups.insert(std::pair<int, WifiP2pGroupInfo>(infoList.infos[i].id, groupInfo));
1249     }
1250     free(infoList.infos);
1251     infoList.infos = nullptr;
1252     return ret;
1253 }
1254 
ReqP2pSetGroupMaxIdle(const std::string & groupInterface,size_t time) const1255 WifiErrorNo WifiIdlClient::ReqP2pSetGroupMaxIdle(const std::string &groupInterface, size_t time) const
1256 {
1257     CHECK_CLIENT_NOT_NULL;
1258     return P2pSetGroupMaxIdle(groupInterface.c_str(), time);
1259 }
1260 
ReqP2pSetPowerSave(const std::string & groupInterface,bool enable) const1261 WifiErrorNo WifiIdlClient::ReqP2pSetPowerSave(const std::string &groupInterface, bool enable) const
1262 {
1263     CHECK_CLIENT_NOT_NULL;
1264     int flag = enable;
1265     return P2pSetPowerSave(groupInterface.c_str(), flag);
1266 }
1267 
ReqP2pSetWfdEnable(bool enable) const1268 WifiErrorNo WifiIdlClient::ReqP2pSetWfdEnable(bool enable) const
1269 {
1270     CHECK_CLIENT_NOT_NULL;
1271     int flag = enable;
1272     return P2pSetWfdEnable(flag);
1273 }
1274 
ReqP2pSetWfdDeviceConfig(const std::string & config) const1275 WifiErrorNo WifiIdlClient::ReqP2pSetWfdDeviceConfig(const std::string &config) const
1276 {
1277     CHECK_CLIENT_NOT_NULL;
1278     return P2pSetWfdDeviceConfig(config.c_str());
1279 }
1280 
ReqP2pStartFind(size_t timeout) const1281 WifiErrorNo WifiIdlClient::ReqP2pStartFind(size_t timeout) const
1282 {
1283     CHECK_CLIENT_NOT_NULL;
1284     return P2pStartFind(timeout);
1285 }
1286 
ReqP2pStopFind() const1287 WifiErrorNo WifiIdlClient::ReqP2pStopFind() const
1288 {
1289     CHECK_CLIENT_NOT_NULL;
1290     return P2pStopFind();
1291 }
1292 
ReqP2pSetExtListen(bool enable,size_t period,size_t interval) const1293 WifiErrorNo WifiIdlClient::ReqP2pSetExtListen(bool enable, size_t period, size_t interval) const
1294 {
1295     CHECK_CLIENT_NOT_NULL;
1296     if (enable) {
1297         if (period < WIFI_IDL_P2P_LISTEN_MIN_TIME || period > WIFI_IDL_P2P_LISTEN_MAX_TIME ||
1298             interval < WIFI_IDL_P2P_LISTEN_MIN_TIME || interval > WIFI_IDL_P2P_LISTEN_MAX_TIME || period > interval) {
1299             return WIFI_IDL_OPT_INVALID_PARAM;
1300         }
1301     }
1302     int flag = enable;
1303     return P2pSetExtListen(flag, period, interval);
1304 }
1305 
ReqP2pSetListenChannel(size_t channel,unsigned char regClass) const1306 WifiErrorNo WifiIdlClient::ReqP2pSetListenChannel(size_t channel, unsigned char regClass) const
1307 {
1308     CHECK_CLIENT_NOT_NULL;
1309     return P2pSetListenChannel(channel, regClass);
1310 }
1311 
ReqP2pConnect(const WifiP2pConfigInternal & config,bool isJoinExistingGroup,std::string & pin) const1312 WifiErrorNo WifiIdlClient::ReqP2pConnect(const WifiP2pConfigInternal &config, bool isJoinExistingGroup,
1313     std::string &pin) const
1314 {
1315     CHECK_CLIENT_NOT_NULL;
1316     P2pConnectInfo info = {0};
1317     info.mode = isJoinExistingGroup;
1318     info.persistent = config.GetNetId();
1319     if (isJoinExistingGroup) {
1320         info.goIntent = 0;
1321     } else {
1322         info.goIntent = config.GetGroupOwnerIntent();
1323     }
1324     if (info.goIntent < WIFI_IDL_P2P_MIN_GO_INTENT || info.goIntent > WIFI_IDL_P2P_MAX_GO_INTENT) {
1325         info.goIntent = WIFI_IDL_P2P_DEFAULT_GO_INTENT;
1326     }
1327     std::string address = config.GetDeviceAddress();
1328     if (address.size() < WIFI_IDL_BSSID_LENGTH) {
1329         LOGI("ReqP2pConnect Device Address is too short");
1330         return WIFI_IDL_OPT_INVALID_PARAM;
1331     }
1332     WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1333     if (mode == WpsMethod::WPS_METHOD_LABEL) {
1334         mode = WpsMethod::WPS_METHOD_KEYPAD;
1335     }
1336     info.provdisc = (int)mode;
1337     std::string pinCode = config.GetWpsInfo().GetPin();
1338     if (mode == WpsMethod::WPS_METHOD_PBC && !pinCode.empty()) {
1339         LOGI("ReqP2pConnect Expected empty pin for PBC.");
1340         return WIFI_IDL_OPT_INVALID_PARAM;
1341     }
1342     if (strncpy_s(info.peerDevAddr, sizeof(info.peerDevAddr), address.c_str(), address.length()) != EOK ||
1343         strncpy_s(info.pin, sizeof(info.pin), pinCode.c_str(), pinCode.length()) != EOK) {
1344         return WIFI_IDL_OPT_FAILED;
1345     }
1346     WifiErrorNo ret = P2pConnect(&info);
1347     if (ret == WIFI_IDL_OPT_OK) {
1348         pin = info.pin;
1349     }
1350     return ret;
1351 }
1352 
ReqP2pCancelConnect() const1353 WifiErrorNo WifiIdlClient::ReqP2pCancelConnect() const
1354 {
1355     CHECK_CLIENT_NOT_NULL;
1356     return P2pCancelConnect();
1357 }
1358 
ReqP2pProvisionDiscovery(const WifiP2pConfigInternal & config) const1359 WifiErrorNo WifiIdlClient::ReqP2pProvisionDiscovery(const WifiP2pConfigInternal &config) const
1360 {
1361     CHECK_CLIENT_NOT_NULL;
1362     WpsMethod mode = config.GetWpsInfo().GetWpsMethod();
1363     if (mode == WpsMethod::WPS_METHOD_LABEL) {
1364         mode = WpsMethod::WPS_METHOD_DISPLAY;
1365     } else if (mode == WpsMethod::WPS_METHOD_DISPLAY) {
1366         mode = WpsMethod::WPS_METHOD_KEYPAD;
1367     } else if (mode == WpsMethod::WPS_METHOD_KEYPAD) {
1368         mode = WpsMethod::WPS_METHOD_DISPLAY;
1369     } else if (mode != WpsMethod::WPS_METHOD_PBC) {
1370         return WIFI_IDL_OPT_FAILED;
1371     }
1372     return P2pProvisionDiscovery(config.GetDeviceAddress().c_str(), static_cast<int>(mode));
1373 }
1374 
ReqP2pAddGroup(bool isPersistent,int networkId,int freq) const1375 WifiErrorNo WifiIdlClient::ReqP2pAddGroup(bool isPersistent, int networkId, int freq) const
1376 {
1377     CHECK_CLIENT_NOT_NULL;
1378     int flag = isPersistent;
1379     return P2pAddGroup(flag, networkId, freq);
1380 }
1381 
ReqP2pRemoveGroup(const std::string & groupInterface) const1382 WifiErrorNo WifiIdlClient::ReqP2pRemoveGroup(const std::string &groupInterface) const
1383 {
1384     CHECK_CLIENT_NOT_NULL;
1385     return P2pRemoveGroup(groupInterface.c_str());
1386 }
1387 
ReqP2pInvite(const WifiP2pGroupInfo & group,const std::string & deviceAddr) const1388 WifiErrorNo WifiIdlClient::ReqP2pInvite(const WifiP2pGroupInfo &group, const std::string &deviceAddr) const
1389 {
1390     CHECK_CLIENT_NOT_NULL;
1391     return P2pInvite(group.IsPersistent(),
1392         deviceAddr.c_str(),
1393         group.GetOwner().GetDeviceAddress().c_str(),
1394         group.GetInterface().c_str());
1395 }
1396 
ReqP2pReinvoke(int networkId,const std::string & deviceAddr) const1397 WifiErrorNo WifiIdlClient::ReqP2pReinvoke(int networkId, const std::string &deviceAddr) const
1398 {
1399     CHECK_CLIENT_NOT_NULL;
1400     return P2pReinvoke(networkId, deviceAddr.c_str());
1401 }
1402 
ReqP2pGetGroupCapability(const std::string & deviceAddress,uint32_t & cap) const1403 WifiErrorNo WifiIdlClient::ReqP2pGetGroupCapability(const std::string &deviceAddress, uint32_t &cap) const
1404 {
1405     CHECK_CLIENT_NOT_NULL;
1406     int capacity = 0;
1407     WifiErrorNo ret = P2pGetGroupCapability(deviceAddress.c_str(), &capacity);
1408     if (ret == WIFI_IDL_OPT_OK) {
1409         cap = capacity;
1410     }
1411     return ret;
1412 }
1413 
ReqP2pAddService(const WifiP2pServiceInfo & info) const1414 WifiErrorNo WifiIdlClient::ReqP2pAddService(const WifiP2pServiceInfo &info) const
1415 {
1416     CHECK_CLIENT_NOT_NULL;
1417     WifiErrorNo ret = WIFI_IDL_OPT_OK;
1418     P2pServiceInfo servInfo = {0};
1419     std::vector<std::string> queryList = info.GetQueryList();
1420     for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1421         std::vector<std::string> vec;
1422         SplitString(*iter, " ", vec);
1423         if (vec.size() < WIFI_IDL_P2P_SERVICE_TYPE_MIN_SIZE) {
1424             return WIFI_IDL_OPT_FAILED;
1425         }
1426         if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1427             return WIFI_IDL_OPT_FAILED;
1428         }
1429         const std::string &tmp = vec[WIFI_IDL_P2P_SERVICE_TYPE_2_POS];
1430         if (vec[0] == "upnp") {
1431             servInfo.mode = 0;
1432             servInfo.version = atoi(vec[1].c_str());
1433             if (strncpy_s(servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1434                 return WIFI_IDL_OPT_FAILED;
1435             }
1436             ret = P2pAddService(&servInfo);
1437         } else if (vec[0] == "bonjour") {
1438             servInfo.mode = 1;
1439             if (strncpy_s(servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK ||
1440                 strncpy_s(servInfo.resp, sizeof(servInfo.resp), tmp.c_str(), tmp.length()) != EOK) {
1441                 return WIFI_IDL_OPT_FAILED;
1442             }
1443             ret = P2pAddService(&servInfo);
1444         } else {
1445             ret = WIFI_IDL_OPT_FAILED;
1446         }
1447         if (ret != WIFI_IDL_OPT_OK) {
1448             break;
1449         }
1450     }
1451     return ret;
1452 }
1453 
ReqP2pRemoveService(const WifiP2pServiceInfo & info) const1454 WifiErrorNo WifiIdlClient::ReqP2pRemoveService(const WifiP2pServiceInfo &info) const
1455 {
1456     CHECK_CLIENT_NOT_NULL;
1457     WifiErrorNo ret = WIFI_IDL_OPT_OK;
1458     P2pServiceInfo servInfo = {0};
1459     std::vector<std::string> queryList = info.GetQueryList();
1460     for (auto iter = queryList.begin(); iter != queryList.end(); iter++) {
1461         std::vector<std::string> vec;
1462         SplitString(*iter, " ", vec);
1463         if (vec.size() < WIFI_IDL_P2P_SERVICE_TYPE_MIN_SIZE) {
1464             return WIFI_IDL_OPT_FAILED;
1465         }
1466         if (memset_s(&servInfo, sizeof(servInfo), 0, sizeof(servInfo)) != EOK) {
1467             return WIFI_IDL_OPT_FAILED;
1468         }
1469         const std::string &tmp = vec[WIFI_IDL_P2P_SERVICE_TYPE_2_POS];
1470         if (vec[0] == "upnp") {
1471             servInfo.mode = 0;
1472             servInfo.version = atoi(vec[1].c_str());
1473             if (strncpy_s(servInfo.name, sizeof(servInfo.name), tmp.c_str(), tmp.length()) != EOK) {
1474                 return WIFI_IDL_OPT_FAILED;
1475             }
1476             ret = P2pRemoveService(&servInfo);
1477         } else if (vec[0] == "bonjour") {
1478             servInfo.mode = 1;
1479             if (strncpy_s(servInfo.query, sizeof(servInfo.query), vec[1].c_str(), vec[1].length()) != EOK) {
1480                 return WIFI_IDL_OPT_FAILED;
1481             }
1482             ret = P2pRemoveService(&servInfo);
1483         } else {
1484             ret = WIFI_IDL_OPT_FAILED;
1485         }
1486         if (ret != WIFI_IDL_OPT_OK) {
1487             break;
1488         }
1489     }
1490     return ret;
1491 }
1492 
ReqP2pReqServiceDiscovery(const std::string & deviceAddress,const std::vector<unsigned char> & tlvs,std::string & reqID) const1493 WifiErrorNo WifiIdlClient::ReqP2pReqServiceDiscovery(
1494     const std::string &deviceAddress, const std::vector<unsigned char> &tlvs, std::string &reqID) const
1495 {
1496     CHECK_CLIENT_NOT_NULL;
1497     if (deviceAddress.size() != WIFI_IDL_BSSID_LENGTH || tlvs.empty()) {
1498         return WIFI_IDL_OPT_INVALID_PARAM;
1499     }
1500     unsigned size = (tlvs.size() << 1) + 1;
1501     char *pTlvs = (char *)calloc(size, sizeof(char));
1502     if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1503         free(pTlvs);
1504         pTlvs = nullptr;
1505         return WIFI_IDL_OPT_FAILED;
1506     }
1507     char retBuf[WIFI_IDL_P2P_TMP_BUFFER_SIZE_128] = {0};
1508     WifiErrorNo ret = P2pReqServiceDiscovery(deviceAddress.c_str(), pTlvs, retBuf, sizeof(retBuf));
1509     if (ret == WIFI_IDL_OPT_OK) {
1510         reqID = retBuf;
1511     }
1512     free(pTlvs);
1513     pTlvs = nullptr;
1514     return ret;
1515 }
1516 
ReqP2pCancelServiceDiscovery(const std::string & id) const1517 WifiErrorNo WifiIdlClient::ReqP2pCancelServiceDiscovery(const std::string &id) const
1518 {
1519     CHECK_CLIENT_NOT_NULL;
1520     return P2pCancelServiceDiscovery(id.c_str());
1521 }
1522 
ReqP2pSetRandomMac(bool enable) const1523 WifiErrorNo WifiIdlClient::ReqP2pSetRandomMac(bool enable) const
1524 {
1525     CHECK_CLIENT_NOT_NULL;
1526     int flag = enable;
1527     return P2pSetRandomMac(flag);
1528 }
1529 
ReqP2pSetMiracastType(int type) const1530 WifiErrorNo WifiIdlClient::ReqP2pSetMiracastType(int type) const
1531 {
1532     CHECK_CLIENT_NOT_NULL;
1533     return P2pSetMiracastType(type);
1534 }
1535 
ReqSetPersistentReconnect(int mode) const1536 WifiErrorNo WifiIdlClient::ReqSetPersistentReconnect(int mode) const
1537 {
1538     CHECK_CLIENT_NOT_NULL;
1539     return P2pSetPersistentReconnect(mode);
1540 }
1541 
ReqRespServiceDiscovery(const WifiP2pDevice & device,int frequency,int dialogToken,const std::vector<unsigned char> & tlvs) const1542 WifiErrorNo WifiIdlClient::ReqRespServiceDiscovery(
1543     const WifiP2pDevice &device, int frequency, int dialogToken, const std::vector<unsigned char> &tlvs) const
1544 {
1545     CHECK_CLIENT_NOT_NULL;
1546     if (tlvs.empty()) {
1547         return WIFI_IDL_OPT_INVALID_PARAM;
1548     }
1549     unsigned size = (tlvs.size() << 1) + 1;
1550     char *pTlvs = (char *)calloc(size, sizeof(char));
1551     if (pTlvs == nullptr || Val2HexChar(tlvs, pTlvs, size) < 0) {
1552         if (pTlvs != nullptr) {
1553             free(pTlvs);
1554             pTlvs = nullptr;
1555         }
1556         return WIFI_IDL_OPT_FAILED;
1557     }
1558     WifiErrorNo ret = P2pRespServerDiscovery(device.GetDeviceAddress().c_str(), frequency, dialogToken, pTlvs);
1559     free(pTlvs);
1560     pTlvs = nullptr;
1561     return ret;
1562 }
1563 
ReqSetServiceDiscoveryExternal(bool isExternalProcess) const1564 WifiErrorNo WifiIdlClient::ReqSetServiceDiscoveryExternal(bool isExternalProcess) const
1565 {
1566     CHECK_CLIENT_NOT_NULL;
1567     return P2pSetServDiscExternal(isExternalProcess);
1568 }
1569 
ReqGetP2pPeer(const std::string & deviceAddress,WifiP2pDevice & device) const1570 WifiErrorNo WifiIdlClient::ReqGetP2pPeer(const std::string &deviceAddress, WifiP2pDevice &device) const
1571 {
1572     CHECK_CLIENT_NOT_NULL;
1573     P2pDeviceInfo peerInfo;
1574     if (memset_s(&peerInfo, sizeof(peerInfo), 0, sizeof(peerInfo)) != EOK) {
1575         return WIFI_IDL_OPT_FAILED;
1576     }
1577     WifiErrorNo ret = P2pGetPeer(deviceAddress.c_str(), &peerInfo);
1578     if (ret == WIFI_IDL_OPT_OK) {
1579         device.SetDeviceAddress(peerInfo.p2pDeviceAddress);
1580         device.SetDeviceName(peerInfo.deviceName);
1581         device.SetPrimaryDeviceType(peerInfo.primaryDeviceType);
1582         device.SetWpsConfigMethod(peerInfo.configMethods);
1583         device.SetDeviceCapabilitys(peerInfo.deviceCapabilities);
1584         device.SetGroupCapabilitys(peerInfo.groupCapabilities);
1585         device.SetNetworkName(peerInfo.operSsid);
1586     }
1587     return ret;
1588 }
1589 
ReqP2pGetSupportFrequencies(int band,std::vector<int> & frequencies) const1590 WifiErrorNo WifiIdlClient::ReqP2pGetSupportFrequencies(int band, std::vector<int> &frequencies) const
1591 {
1592     CHECK_CLIENT_NOT_NULL;
1593     int values[WIFI_IDL_GET_MAX_BANDS] = {0};
1594     int size = WIFI_IDL_GET_MAX_BANDS;
1595 
1596     if (P2pGetFrequencies(band, values, &size) != 0) {
1597         return WIFI_IDL_OPT_FAILED;
1598     }
1599 
1600     for (int i = 0; i < size; i++) {
1601         frequencies.push_back(values[i]);
1602     }
1603 
1604     return WIFI_IDL_OPT_OK;
1605 }
1606 
PushP2pGroupConfigString(P2pGroupConfig * pConfig,P2pGroupConfigType type,const std::string & str) const1607 int WifiIdlClient::PushP2pGroupConfigString(
1608     P2pGroupConfig *pConfig, P2pGroupConfigType type, const std::string &str) const
1609 {
1610     if (str.length() > 0) {
1611         pConfig->cfgParam = type;
1612         if (strncpy_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), str.c_str(), str.length()) != EOK) {
1613             return 0;
1614         }
1615         return 1;
1616     } else {
1617         return 0;
1618     }
1619 }
1620 
PushP2pGroupConfigInt(P2pGroupConfig * pConfig,P2pGroupConfigType type,int i) const1621 int WifiIdlClient::PushP2pGroupConfigInt(P2pGroupConfig *pConfig, P2pGroupConfigType type, int i) const
1622 {
1623     pConfig->cfgParam = type;
1624     if (snprintf_s(pConfig->cfgValue, sizeof(pConfig->cfgValue), sizeof(pConfig->cfgValue) - 1, "%d", i) < 0) {
1625         return 0;
1626     }
1627     return 1;
1628 }
1629 
ReqP2pSetGroupConfig(int networkId,const IdlP2pGroupConfig & config) const1630 WifiErrorNo WifiIdlClient::ReqP2pSetGroupConfig(int networkId, const IdlP2pGroupConfig &config) const
1631 {
1632     CHECK_CLIENT_NOT_NULL;
1633     P2pGroupConfig conf[GROUP_CONFIG_END_POS];
1634     if (memset_s(conf, sizeof(conf), 0, sizeof(conf)) != EOK) {
1635         return WIFI_IDL_OPT_FAILED;
1636     }
1637     int num = 0;
1638     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_SSID, config.ssid);
1639     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_BSSID, config.bssid);
1640     // If the PSK length is less than 8 or greater than 63, Do not set this psk field.
1641     if (config.psk.length() >= WIFI_IDL_PSK_MIN_LENGTH && config.psk.length() < WIFI_IDL_PSK_MAX_LENGTH) {
1642         std::string tmp = "\"" + config.psk + "\"";
1643         num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, tmp);
1644     } else if (config.psk.length() == WIFI_IDL_PSK_MAX_LENGTH) {
1645         num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PSK, config.psk);
1646     }
1647     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PROTO, config.proto);
1648     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_KEY_MGMT, config.keyMgmt);
1649     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_PAIRWISE, config.pairwise);
1650     num += PushP2pGroupConfigString(conf + num, GROUP_CONFIG_AUTH_ALG, config.authAlg);
1651 
1652     num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_MODE, config.mode);
1653     num += PushP2pGroupConfigInt(conf + num, GROUP_CONFIG_DISABLED, config.disabled);
1654     if (num == 0) {
1655         return WIFI_IDL_OPT_OK;
1656     }
1657     return P2pSetGroupConfig(networkId, conf, num);
1658 }
1659 
ReqP2pGetGroupConfig(int networkId,IdlP2pGroupConfig & config) const1660 WifiErrorNo WifiIdlClient::ReqP2pGetGroupConfig(int networkId, IdlP2pGroupConfig &config) const
1661 {
1662     CHECK_CLIENT_NOT_NULL;
1663     P2pGroupConfig confs[GROUP_CONFIG_END_POS];
1664     if (memset_s(confs, sizeof(confs), 0, sizeof(confs)) != EOK) {
1665         return WIFI_IDL_OPT_FAILED;
1666     }
1667     int size = static_cast<P2pGroupConfigType>(GROUP_CONFIG_SSID);
1668     for (; size < GROUP_CONFIG_END_POS; size++) {
1669         confs[size].cfgParam = static_cast<P2pGroupConfigType>(size);
1670     }
1671     if (P2pGetGroupConfig(networkId, confs, size) != 0) {
1672         return WIFI_IDL_OPT_FAILED;
1673     }
1674     config.ssid = confs[GROUP_CONFIG_SSID].cfgValue;
1675     config.bssid = confs[GROUP_CONFIG_BSSID].cfgValue;
1676     config.psk = confs[GROUP_CONFIG_PSK].cfgValue;
1677     config.proto = confs[GROUP_CONFIG_PROTO].cfgValue;
1678     config.keyMgmt = confs[GROUP_CONFIG_KEY_MGMT].cfgValue;
1679     config.pairwise = confs[GROUP_CONFIG_PAIRWISE].cfgValue;
1680     config.authAlg = confs[GROUP_CONFIG_AUTH_ALG].cfgValue;
1681     config.mode = atoi(confs[GROUP_CONFIG_MODE].cfgValue);
1682     config.disabled = atoi(confs[GROUP_CONFIG_DISABLED].cfgValue);
1683     return WIFI_IDL_OPT_OK;
1684 }
1685 
ReqP2pAddNetwork(int & networkId) const1686 WifiErrorNo WifiIdlClient::ReqP2pAddNetwork(int &networkId) const
1687 {
1688     CHECK_CLIENT_NOT_NULL;
1689     return P2pAddNetwork(&networkId);
1690 }
1691 
ReqP2pHid2dConnect(const Hid2dConnectConfig & config) const1692 WifiErrorNo WifiIdlClient::ReqP2pHid2dConnect(const Hid2dConnectConfig &config) const
1693 {
1694     CHECK_CLIENT_NOT_NULL;
1695     Hid2dConnectInfo info;
1696     if (memset_s(&info, sizeof(info), 0, sizeof(info)) != EOK) {
1697         return WIFI_IDL_OPT_FAILED;
1698     }
1699     if (strncpy_s(info.ssid, sizeof(info.ssid), config.GetSsid().c_str(), config.GetSsid().length()) != EOK) {
1700         return WIFI_IDL_OPT_FAILED;
1701     }
1702     if (strncpy_s(info.bssid, sizeof(info.bssid), config.GetBssid().c_str(), config.GetBssid().length()) != EOK) {
1703         return WIFI_IDL_OPT_FAILED;
1704     }
1705     if (strncpy_s(info.passphrase, sizeof(info.passphrase),
1706         config.GetPreSharedKey().c_str(), config.GetPreSharedKey().length()) != EOK) {
1707         return WIFI_IDL_OPT_FAILED;
1708     }
1709     info.frequency = config.GetFrequency();
1710     WifiErrorNo ret = Hid2dConnect(&info);
1711     return ret;
1712 }
1713 
ReqWpaSetSuspendMode(bool mode) const1714 WifiErrorNo WifiIdlClient::ReqWpaSetSuspendMode(bool mode) const
1715 {
1716     CHECK_CLIENT_NOT_NULL;
1717     return SetSuspendMode(mode);
1718 }
1719 }  // namespace Wifi
1720 }  // namespace OHOS
1721