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