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