1 /*
2 * Copyright (c) 2021 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 "p2plink_adapter.h"
17
18 #include <arpa/inet.h>
19 #include <net/if.h>
20 #include <sys/ioctl.h>
21 #include <sys/socket.h>
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26
27 #include "p2plink_channel_freq.h"
28 #include "p2plink_type.h"
29 #include "securec.h"
30 #include "softbus_adapter_crypto.h"
31 #include "softbus_adapter_mem.h"
32 #include "softbus_def.h"
33 #include "softbus_errcode.h"
34 #include "softbus_log.h"
35 #include "softbus_utils.h"
36 #include "wifi_device.h"
37 #include "wifi_hid2d.h"
38 #include "wifi_p2p.h"
39 #include "wifi_p2p_config.h"
40
41 #define MAC_BIN_LEN 6
42 #define FREQ_MAX_LEN 4
43 #define MAC_HEX 16
44 #define SSID_INDEX 0
45 #define BSSID_INDEX 1
46 #define SHARE_KEY_INDEX 2
47 #define FREQ_INDEX 3
48 #define CONNECT_MODE_INDEX 4
49 #define DEFAULT_NET_MASK "255.255.255.0"
50
51 static BroadcastRecvCb g_p2pLinkCallBack = {0};
52
ConvertMacStrToBinary(char * macStr,const char * delimit,uint8_t * binMac,int32_t binMacLen)53 static void ConvertMacStrToBinary(char *macStr, const char *delimit, uint8_t *binMac, int32_t binMacLen)
54 {
55 char *itemStr = NULL;
56 char *saveItemPtr = NULL;
57 char *endptr = NULL;
58 itemStr = strtok_s(macStr, delimit, &saveItemPtr);
59 int32_t i = 0;
60 while (itemStr != NULL) {
61 if (i == binMacLen) {
62 CLOGE("mac string over max mac bin len.");
63 break;
64 }
65 binMac[i++] = strtoul(itemStr, &endptr, MAC_HEX);
66 itemStr = strtok_s(NULL, delimit, &saveItemPtr);
67 }
68 }
69
ConvertMacBinToStr(char * macStr,int32_t macStrSize,unsigned char macBin[MAC_BIN_LEN])70 static void ConvertMacBinToStr(char *macStr, int32_t macStrSize, unsigned char macBin[MAC_BIN_LEN])
71 {
72 #define MAC_INDEX_ZERO 0
73 #define MAC_INDEX_ONE 1
74 #define MAC_INDEX_TWO 2
75 #define MAC_INDEX_TREE 3
76 #define MAC_INDEX_FOUR 4
77 #define MAC_INDEX_FIVE 5
78 (void)sprintf_s(macStr, macStrSize, "%02x:%02x:%02x:%02x:%02x:%02x",
79 macBin[MAC_INDEX_ZERO], macBin[MAC_INDEX_ONE], macBin[MAC_INDEX_TWO],
80 macBin[MAC_INDEX_TREE], macBin[MAC_INDEX_FOUR], macBin[MAC_INDEX_FIVE]);
81 }
82
DumpGroupInfo(WifiP2pGroupInfo * groupInfo)83 static void DumpGroupInfo(WifiP2pGroupInfo *groupInfo)
84 {
85 int32_t i;
86 char macStr[P2P_MAC_LEN] = {0};
87
88 CLOGI("group owner %d size %d.", groupInfo->isP2pGroupOwner, groupInfo->clientDevicesSize);
89 for (i = 0; i < groupInfo->clientDevicesSize; i++) {
90 macStr[0] = '\0';
91 ConvertMacBinToStr(macStr, sizeof(macStr), groupInfo->clientDevices[i].devAddr);
92 CLOGI("mac dev[%d].", i);
93 }
94 CLOGI("group interface %s.", groupInfo->interface);
95 }
96
P2pLinkRequetGroupInfo(void)97 NO_SANITIZE("cfi") P2pLinkGroup *P2pLinkRequetGroupInfo(void)
98 {
99 WifiP2pGroupInfo *groupInfo;
100 P2pLinkGroup *grp = NULL;
101 int32_t grpSize;
102 int32_t i;
103 int32_t ret;
104 char macStr[P2P_MAC_LEN] = {0};
105
106 groupInfo = (WifiP2pGroupInfo*)SoftBusCalloc(sizeof(WifiP2pGroupInfo));
107 if (groupInfo == NULL) {
108 CLOGE("malloc groupInfo fail.");
109 return NULL;
110 }
111 ret = GetCurrentGroup(groupInfo);
112 if (ret != WIFI_SUCCESS) {
113 SoftBusFree(groupInfo);
114 CLOGE("get current group fail[%d].", ret);
115 return NULL;
116 }
117 DumpGroupInfo(groupInfo);
118
119 grpSize = sizeof(P2pLinkGroup) + groupInfo->clientDevicesSize * sizeof(P2pLinkPeerMacList);
120 grp = (P2pLinkGroup*)SoftBusCalloc(grpSize);
121 if (grp == NULL) {
122 SoftBusFree(groupInfo);
123 CLOGE("malloc link group fail.");
124 return NULL;
125 }
126
127 grp->peerMacNum = groupInfo->clientDevicesSize;
128 grp->role = (groupInfo->isP2pGroupOwner == 1) ? ROLE_GO : ROLE_GC;
129 for (i = 0; i < grp->peerMacNum; i++) {
130 macStr[0] = '\0';
131 ConvertMacBinToStr(macStr, sizeof(macStr), groupInfo->clientDevices[i].devAddr);
132 ret = strcpy_s(grp->peerMacs + i * sizeof(P2pLinkPeerMacList), sizeof(P2pLinkPeerMacList), macStr);
133 if (ret != EOK) {
134 CLOGI("strcpy error.");
135 }
136 }
137 SoftBusFree(groupInfo);
138 CLOGI("requet groupInfo ok.");
139 return grp;
140 }
141
InnerP2pStateChangedProc(P2pState state)142 NO_SANITIZE("cfi") static void InnerP2pStateChangedProc(P2pState state)
143 {
144 bool res = true;
145
146 CLOGI("recv p2p state change %d.", state);
147 if (state == P2P_STATE_CLOSED) {
148 res = false;
149 } else if (state == P2P_STATE_STARTED) {
150 res = true;
151 } else {
152 return;
153 }
154 if (g_p2pLinkCallBack.p2pStateChanged != NULL) {
155 g_p2pLinkCallBack.p2pStateChanged(res);
156 }
157 }
158
InnerGroupStateChangedProc(void)159 static void InnerGroupStateChangedProc(void)
160 {
161 CLOGI("recv group state change");
162 }
163
InnerConnResultProc(WifiP2pLinkedInfo info)164 NO_SANITIZE("cfi") static void InnerConnResultProc(WifiP2pLinkedInfo info)
165 {
166 char mac[P2P_MAC_LEN] = {0};
167
168 ConvertMacBinToStr(mac, sizeof(mac), info.groupOwnerAddress);
169 CLOGI("recv conn state change conn %d grp %d", info.connectState, info.isP2pGroupOwner);
170
171 if (info.isP2pGroupOwner == 0) {
172 if (info.connectState == P2P_CONNECTED) {
173 if (g_p2pLinkCallBack.connResult != NULL) {
174 g_p2pLinkCallBack.connResult(P2PLINK_CONNECTED);
175 }
176 } else {
177 if (g_p2pLinkCallBack.groupStateChanged != NULL) {
178 g_p2pLinkCallBack.groupStateChanged(NULL);
179 }
180 }
181 } else {
182 if (g_p2pLinkCallBack.groupStateChanged != NULL) {
183 P2pLinkGroup *grp = P2pLinkRequetGroupInfo();
184 g_p2pLinkCallBack.groupStateChanged(grp);
185 if (grp != NULL) {
186 SoftBusFree(grp);
187 }
188 }
189 }
190 }
191
InnerP2pPeersChangedCallback(WifiP2pDevice * devices,int len)192 NO_SANITIZE("cfi") static void InnerP2pPeersChangedCallback(WifiP2pDevice* devices, int len)
193 {
194 (void)devices;
195 CLOGI("InnerP2pPeersChangedCallback len %d.", len);
196 }
197
P2pLinkAdapterInit(const BroadcastRecvCb * cb)198 NO_SANITIZE("cfi") int32_t P2pLinkAdapterInit(const BroadcastRecvCb *cb)
199 {
200 WifiErrorCode ret;
201
202 if (cb == NULL) {
203 CLOGE("P2pLinkAdapterInit input para illegal.");
204 return SOFTBUS_ERR;
205 }
206
207 g_p2pLinkCallBack.p2pStateChanged = cb->p2pStateChanged;
208 g_p2pLinkCallBack.groupStateChanged = cb->groupStateChanged;
209 g_p2pLinkCallBack.connResult = cb->connResult;
210 g_p2pLinkCallBack.wifiCfgChanged = cb->wifiCfgChanged;
211 g_p2pLinkCallBack.enterDiscState = cb->enterDiscState;
212 ret = RegisterP2pStateChangedCallback(InnerP2pStateChangedProc);
213 if (ret != WIFI_SUCCESS) {
214 CLOGE("reg p2p state fail %d.", ret);
215 return SOFTBUS_ERR;
216 }
217 ret = RegisterP2pPersistentGroupsChangedCallback(InnerGroupStateChangedProc);
218 if (ret != WIFI_SUCCESS) {
219 CLOGE("reg group state fail %d.", ret);
220 return SOFTBUS_ERR;
221 }
222 ret = RegisterP2pConnectionChangedCallback(InnerConnResultProc);
223 if (ret != WIFI_SUCCESS) {
224 CLOGE("reg connect state fail %d.", ret);
225 return SOFTBUS_ERR;
226 }
227
228 ret = RegisterP2pPeersChangedCallback(InnerP2pPeersChangedCallback);
229 if (ret != WIFI_SUCCESS) {
230 CLOGE("reg peer change fail %d.", ret);
231 return SOFTBUS_ERR;
232 }
233 CLOGI("P2pLink Adapter Init ok.");
234 return SOFTBUS_OK;
235 }
236
GetMacAddr(const char * ifName,unsigned char * macAddr,int32_t len)237 static bool GetMacAddr(const char *ifName, unsigned char *macAddr, int32_t len)
238 {
239 struct ifreq ifr;
240 if (memset_s(&ifr, sizeof(ifr), 0, sizeof(ifr)) != EOK ||
241 strcpy_s(ifr.ifr_name, sizeof(ifr.ifr_name), ifName) != EOK) {
242 CLOGE("init ifreq failed.");
243 return false;
244 }
245 int fd = socket(AF_INET, SOCK_DGRAM, 0);
246 if (fd < 0) {
247 CLOGE("create socket failed.");
248 return false;
249 }
250
251 if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
252 CLOGE("ioctl SIOCGIFHWADDR failed.");
253 close(fd);
254 return false;
255 }
256 close(fd);
257 if (memcpy_s(macAddr, len, ifr.ifr_hwaddr.sa_data, len) != EOK) {
258 CLOGE("memcpy_s macAddr failed.");
259 return false;
260 }
261 return true;
262 }
263
GetIpAddr(const char * ifName,char * ipAddr,int32_t len)264 static bool GetIpAddr(const char *ifName, char *ipAddr, int32_t len)
265 {
266 struct ifreq ifr;
267 if (memset_s(&ifr, sizeof(ifr), 0, sizeof(ifr)) != EOK ||
268 strcpy_s(ifr.ifr_name, sizeof(ifr.ifr_name), ifName) != EOK) {
269 CLOGE("init ifreq failed.");
270 return false;
271 }
272 int fd = socket(AF_INET, SOCK_DGRAM, 0);
273 if (fd < 0) {
274 CLOGE("create socket failed.");
275 return false;
276 }
277 if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
278 CLOGE("ioctl SIOCGIFADDR failed.");
279 close(fd);
280 return false;
281 }
282 close(fd);
283 struct sockaddr_in *sin = (struct sockaddr_in *)(&ifr.ifr_addr);
284 if (inet_ntop(sin->sin_family, &sin->sin_addr, ipAddr, len) == NULL) {
285 CLOGE("inet_ntop ip addr failed.");
286 return false;
287 }
288 return true;
289 }
290
P2pLinkGetP2pIpAddress(char * ip,int32_t len)291 NO_SANITIZE("cfi") int32_t P2pLinkGetP2pIpAddress(char *ip, int32_t len)
292 {
293 WifiP2pGroupInfo* groupInfo;
294 char ipAddr[P2P_IP_LEN] = {0};
295 WifiErrorCode ret;
296
297 groupInfo = (WifiP2pGroupInfo*)SoftBusCalloc(sizeof(WifiP2pGroupInfo));
298 if (groupInfo == NULL) {
299 CLOGE("malloc groupInfo fail.");
300 return SOFTBUS_ERR;
301 }
302
303 ret = GetCurrentGroup(groupInfo);
304 if (ret != WIFI_SUCCESS) {
305 SoftBusFree(groupInfo);
306 CLOGE("P2pLinkGetP2pIpAddress GetCurrentGroup fail[%d].", ret);
307 return SOFTBUS_ERR;
308 }
309 CLOGI("interface name %s.", groupInfo->interface);
310
311 if (!GetIpAddr(groupInfo->interface, ipAddr, sizeof(ipAddr))) {
312 SoftBusFree(groupInfo);
313 CLOGE("GetIpAddr fail.");
314 return SOFTBUS_ERR;
315 }
316 SoftBusFree(groupInfo);
317 ret = strcpy_s(ip, len, ipAddr);
318 if (ret != EOK) {
319 CLOGE("strcpy fail.");
320 return SOFTBUS_ERR;
321 }
322 CLOGI("P2pLinkGet P2p IpAddress.");
323 return SOFTBUS_OK;
324 }
325
326 #define P2P_BASE_INTERFACE "p2p0"
P2pLinkGetBaseMacAddress(char * mac,int32_t len)327 NO_SANITIZE("cfi") int32_t P2pLinkGetBaseMacAddress(char *mac, int32_t len)
328 {
329 unsigned char macAddr[MAC_BIN_LEN] = {0};
330
331 if (GetMacAddr(P2P_BASE_INTERFACE, macAddr, sizeof(macAddr))) {
332 ConvertMacBinToStr(mac, len, macAddr);
333 CLOGI("get p2p0 mac.");
334 return SOFTBUS_OK;
335 }
336 if (GetMacAddr("wlan0", macAddr, sizeof(macAddr))) {
337 ConvertMacBinToStr(mac, len, macAddr);
338 CLOGI("get wlan0 mac.");
339 return SOFTBUS_OK;
340 }
341 CLOGE("get p2p base mac fail.");
342 return SOFTBUS_ERR;
343 }
344
345
P2pLinkSharelinkRemoveGroup(void)346 NO_SANITIZE("cfi") int32_t P2pLinkSharelinkRemoveGroup(void)
347 {
348 WifiErrorCode ret = Hid2dSharedlinkDecrease();
349 if (ret != WIFI_SUCCESS) {
350 CLOGE(" Hid2dSharedlinkDecrease fail[%d]", ret);
351 return SOFTBUS_ERR;
352 }
353 CLOGI("P2pLinkSharelinkRemoveGroup ok.");
354 return SOFTBUS_OK;
355 }
356
P2pLinkSharelinkReuse(void)357 NO_SANITIZE("cfi") int32_t P2pLinkSharelinkReuse(void)
358 {
359 WifiErrorCode ret = Hid2dSharedlinkIncrease();
360 if (ret != WIFI_SUCCESS) {
361 CLOGE("Hid2dSharedlinkIncrease fail[%d]", ret);
362 return SOFTBUS_ERR;
363 }
364 CLOGI("P2pLinkSharelinkReuse ok.");
365 return SOFTBUS_OK;
366 }
367
368
P2pLinkGetChannelListFor5G(void)369 NO_SANITIZE("cfi") P2pLink5GList *P2pLinkGetChannelListFor5G(void)
370 {
371 int32_t chanList[CHAN_LIST_LEN] = {0};
372 int32_t ret = Hid2dGetChannelListFor5G(chanList, CHAN_LIST_LEN);
373 if (ret != WIFI_SUCCESS) {
374 CLOGE("get channel 5g list failed, ret = %d", ret);
375 return NULL;
376 }
377
378 int32_t useCnt = 0;
379 for (int32_t i = 0; i < CHAN_LIST_LEN; i++) {
380 if (chanList[i] == 0) {
381 break;
382 }
383 useCnt++;
384 }
385
386 if (useCnt == 0) {
387 CLOGW("get channel 5g list, no list");
388 return NULL;
389 }
390
391 P2pLink5GList *channelList = (P2pLink5GList *)SoftBusCalloc(sizeof(P2pLink5GList) + useCnt * sizeof(int32_t));
392 if (channelList == NULL) {
393 CLOGE("calloc fail.");
394 return NULL;
395 }
396 channelList->num = useCnt;
397 for (int32_t i = 0; i < useCnt; i++) {
398 channelList->chans[i] = chanList[i];
399 CLOGD("channel 5g list %d : %d.", i, chanList[i]);
400 }
401
402 CLOGD("get channel 5g list success.");
403 return channelList;
404 }
405
406
P2pLinkGetFrequency(void)407 NO_SANITIZE("cfi") int32_t P2pLinkGetFrequency(void)
408 {
409 int32_t ret;
410 WifiLinkedInfo wifiInfo;
411 (void)memset_s(&wifiInfo, sizeof(WifiLinkedInfo), 0, sizeof(WifiLinkedInfo));
412 ret = GetLinkedInfo(&wifiInfo);
413 if (ret != WIFI_SUCCESS) {
414 CLOGE("get wifi station freq failed, ret = %d", ret);
415 return -1;
416 }
417 CLOGD("get wifi freq success : %d", wifiInfo.frequency);
418 return wifiInfo.frequency;
419 }
420
P2pLinkCreateGroup(int32_t freq,bool isWideBandSupport)421 NO_SANITIZE("cfi") int32_t P2pLinkCreateGroup(int32_t freq, bool isWideBandSupport)
422 {
423 FreqType type = FREQUENCY_DEFAULT;
424 if (isWideBandSupport) {
425 type = FREQUENCY_160M;
426 }
427 int32_t ret = Hid2dCreateGroup(freq, type);
428 if (ret != WIFI_SUCCESS) {
429 return SOFTBUS_ERR;
430 }
431
432 CLOGD("rcreate group end.");
433 return SOFTBUS_OK;
434 }
435
P2pLinkGetRecommendChannel(int32_t * freq)436 NO_SANITIZE("cfi") int32_t P2pLinkGetRecommendChannel(int32_t *freq)
437 {
438 if (freq == NULL) {
439 CLOGE("get recommand channel, invalid param.");
440 return SOFTBUS_INVALID_PARAM;
441 }
442
443 RecommendChannelRequest request;
444 RecommendChannelResponse response;
445 int32_t ret = Hid2dGetRecommendChannel(&request, &response);
446 if (ret != WIFI_SUCCESS) {
447 CLOGE("get recommand channel failed, ret = %d.", ret);
448 return SOFTBUS_ERR;
449 }
450
451 if (response.centerFreq != 0) {
452 *freq = response.centerFreq;
453 return SOFTBUS_OK;
454 }
455
456 if (response.centerFreq1 != 0) {
457 *freq = response.centerFreq1;
458 return SOFTBUS_OK;
459 }
460
461 CLOGE("no suitable 2.4G and 5G recommnad channel.");
462 return SOFTBUS_ERR;
463 }
464
P2pLinkGetGroupConfigInfo(void)465 NO_SANITIZE("cfi") char *P2pLinkGetGroupConfigInfo(void)
466 {
467 WifiP2pGroupInfo *groupInfo = NULL;
468 int32_t ret;
469 char macStr[P2P_MAC_LEN] = {0};
470 unsigned char macAddr[MAC_BIN_LEN] = {0};
471
472 groupInfo = (WifiP2pGroupInfo *)SoftBusCalloc(sizeof(WifiP2pGroupInfo));
473 if (groupInfo == NULL) {
474 CLOGE("calloc groupInfo fail.");
475 return NULL;
476 }
477
478 ret = GetCurrentGroup(groupInfo);
479 if (ret != WIFI_SUCCESS) {
480 SoftBusFree(groupInfo);
481 CLOGE("get current group fail[%d].", ret);
482 return NULL;
483 }
484
485 if (!GetMacAddr(groupInfo->interface, macAddr, sizeof(macAddr))) {
486 CLOGE("get p2p mac by interface name failed.");
487 SoftBusFree(groupInfo);
488 return NULL;
489 }
490
491 ConvertMacBinToStr(macStr, sizeof(macStr), macAddr);
492 CLOGD("p2p interface = %s", groupInfo->interface);
493 // 4: \n and \0
494 int32_t cfgSize = strlen(groupInfo->groupName) + strlen(macStr) + strlen(groupInfo->passphrase) + FREQ_MAX_LEN + 4;
495 char *groupCfgStr = (char *)SoftBusCalloc(cfgSize);
496
497 if (groupCfgStr == NULL) {
498 CLOGE("calloc group config str fail");
499 SoftBusFree(groupInfo);
500 return NULL;
501 }
502
503 ret = sprintf_s(groupCfgStr, cfgSize, "%s\n%s\n%s\n%d", groupInfo->groupName,
504 macStr, groupInfo->passphrase, groupInfo->frequency);
505 SoftBusFree(groupInfo);
506 if (ret == -1) {
507 CLOGE("sprintf_s group config string failed.");
508 SoftBusFree(groupCfgStr);
509 return NULL;
510 }
511
512 return groupCfgStr;
513 }
514
P2pLinkConnectGroup(const char * groupConfig)515 NO_SANITIZE("cfi") int32_t P2pLinkConnectGroup(const char *groupConfig)
516 {
517 if (groupConfig == NULL) {
518 CLOGE("connect group, invalid param.");
519 return SOFTBUS_INVALID_PARAM;
520 }
521
522 char groupCfg[GROUP_CONFIG_LEN] = {0};
523 if (strcpy_s(groupCfg, sizeof(groupCfg), groupConfig) != EOK) {
524 CLOGE("strcpy_s group config string failed.");
525 return SOFTBUS_MEM_ERR;
526 }
527
528 char *parseList[MAX_GROUP_CONFIG_ITEM_NUM] = {0};
529 int32_t outNum;
530 int32_t ret;
531 P2pLinkParseItemDataByDelimit(groupCfg, "\n", parseList, MAX_GROUP_CONFIG_ITEM_NUM, &outNum);
532 if (outNum < GROUP_CONFIG_ITEM_NUM) {
533 CLOGE("group config string is not enough.");
534 return SOFTBUS_MEM_ERR;
535 }
536
537 Hid2dConnectConfig config;
538 (void)memset_s(&config, sizeof(config), 0, sizeof(config));
539 ConvertMacStrToBinary(parseList[BSSID_INDEX], ":", config.bssid, sizeof(config.bssid));
540 if (strcpy_s(config.ssid, sizeof(config.ssid), parseList[SSID_INDEX]) != EOK ||
541 strcpy_s(config.preSharedKey, sizeof(config.preSharedKey), parseList[SHARE_KEY_INDEX]) != EOK) {
542 CLOGE("strcpy_s failed.");
543 return SOFTBUS_MEM_ERR;
544 }
545
546 config.frequency = atoi(parseList[FREQ_INDEX]);
547 config.dhcpMode = CONNECT_GO_NODHCP;
548 if (outNum == MAX_GROUP_CONFIG_ITEM_NUM && !strcmp(parseList[CONNECT_MODE_INDEX], "1")) {
549 config.dhcpMode = CONNECT_AP_DHCP;
550 }
551 ret = Hid2dConnect(&config);
552 if (ret != WIFI_SUCCESS) {
553 CLOGE("connect group failed, ret = %d.", ret);
554 return SOFTBUS_ERR;
555 }
556
557 return SOFTBUS_OK;
558 }
559
P2pLinkRequestGcIp(const char * mac,char * ip,int32_t len)560 NO_SANITIZE("cfi") int32_t P2pLinkRequestGcIp(const char *mac, char *ip, int32_t len)
561 {
562 #define IP_INDEX_ZERO 0
563 #define IP_INDEX_ONE 1
564 #define IP_INDEX_TWO 2
565 #define IP_INDEX_TREE 3
566 if (mac == NULL || ip == NULL || len == 0) {
567 CLOGE("apply ip, invalid param.");
568 return SOFTBUS_INVALID_PARAM;
569 }
570 unsigned char p2pBaseMac[MAC_LEN] = {0};
571 unsigned int ipAddr[IPV4_ARRAY_LEN] = {0};
572 char macClone[P2P_MAC_LEN] = {0};
573 if (strcpy_s(macClone, sizeof(macClone), mac) != EOK) {
574 CLOGE("strcpy_s failed.");
575 return SOFTBUS_MEM_ERR;
576 }
577
578 ConvertMacStrToBinary(macClone, ":", p2pBaseMac, sizeof(p2pBaseMac));
579 int32_t ret = Hid2dRequestGcIp(p2pBaseMac, ipAddr);
580 if (ret != WIFI_SUCCESS) {
581 CLOGE("request ip failed, ret = %d.", ret);
582 return SOFTBUS_ERR;
583 }
584
585 char ipString[P2P_IP_LEN] = {0};
586 ret = sprintf_s(ipString, sizeof(ipString), "%u.%u.%u.%u",
587 ipAddr[IP_INDEX_ZERO], ipAddr[IP_INDEX_ONE], ipAddr[IP_INDEX_TWO], ipAddr[IP_INDEX_TREE]);
588 if (ret == -1) {
589 CLOGE("sprintf_s request ip failed, ret = %d.", ret);
590 return SOFTBUS_MEM_ERR;
591 }
592 CLOGI("P2pLinkRequestGcIp success");
593 if (strcpy_s(ip, len, (char *)ipString) != EOK) {
594 CLOGE("strcpy_s failed.");
595 return SOFTBUS_MEM_ERR;
596 }
597
598 return SOFTBUS_OK;
599 }
600
ConvertIpStringToIntArray(unsigned int dest[IPV4_ARRAY_LEN],const char * src)601 static int32_t ConvertIpStringToIntArray(unsigned int dest[IPV4_ARRAY_LEN], const char *src)
602 {
603 int32_t ret = sscanf_s(src, "%u.%u.%u.%u", &dest[0], &dest[1], &dest[2], &dest[3]);
604 if (ret == -1) {
605 CLOGE("sscanf_s failed, src = %s.", src);
606 return SOFTBUS_MEM_ERR;
607 }
608
609 return SOFTBUS_OK;
610 }
611
P2pLinkConfigGcIp(const char * ip)612 NO_SANITIZE("cfi") int32_t P2pLinkConfigGcIp(const char *ip)
613 {
614 if (ip == NULL) {
615 CLOGE("config ip, invalid param.");
616 return SOFTBUS_INVALID_PARAM;
617 }
618
619 WifiP2pGroupInfo *groupInfo;
620 int32_t ret;
621
622 groupInfo = (WifiP2pGroupInfo *)SoftBusCalloc(sizeof(WifiP2pGroupInfo));
623 if (groupInfo == NULL) {
624 CLOGE("calloc groupInfo fail.");
625 return SOFTBUS_MEM_ERR;
626 }
627
628 ret = GetCurrentGroup(groupInfo);
629 if (ret != WIFI_SUCCESS) {
630 SoftBusFree(groupInfo);
631 CLOGE("get current group failed, ret = %d.", ret);
632 return SOFTBUS_ERR;
633 }
634
635 CLOGI("config ip, interface = %s.", groupInfo->interface);
636 IpAddrInfo addrInfo;
637 (void)memset_s(&addrInfo, sizeof(addrInfo), 0, sizeof(addrInfo));
638 if (ConvertIpStringToIntArray(addrInfo.ip, ip) != SOFTBUS_OK ||
639 ConvertIpStringToIntArray(addrInfo.gateway, ip) != SOFTBUS_OK ||
640 ConvertIpStringToIntArray(addrInfo.netmask, DEFAULT_NET_MASK) != SOFTBUS_OK) {
641 SoftBusFree(groupInfo);
642 CLOGE("convert ipaddr string to int array failed.");
643 return SOFTBUS_ERR;
644 }
645 ret = Hid2dConfigIPAddr(groupInfo->interface, &addrInfo);
646 SoftBusFree(groupInfo);
647
648 if (ret != WIFI_SUCCESS) {
649 CLOGE("config ip failed, ret = %d.", ret);
650 return SOFTBUS_ERR;
651 }
652
653 return SOFTBUS_OK;
654 }
655
P2pLinkGetSelfWifiCfgInfo(char * cfgData,int32_t len)656 NO_SANITIZE("cfi") int32_t P2pLinkGetSelfWifiCfgInfo(char *cfgData, int32_t len)
657 {
658 if (cfgData == NULL || len == 0) {
659 CLOGE("get self wifi config, invalid param.");
660 return SOFTBUS_INVALID_PARAM;
661 }
662
663 char wifiCfg[CFG_DATA_MAX_BYTES] = {0};
664 int32_t outLen;
665 size_t encodeLen;
666 int32_t ret = Hid2dGetSelfWifiCfgInfo(TYPE_OF_GET_SELF_CONFIG, wifiCfg, &outLen);
667 if (ret != WIFI_SUCCESS) {
668 CLOGE("get self wifi config failed, ret = %d.", ret);
669 return SOFTBUS_ERR;
670 }
671
672 ret = SoftBusBase64Encode((unsigned char *)cfgData, len, &encodeLen, (unsigned char *)wifiCfg, outLen);
673 if (ret != 0) {
674 CLOGE("softbus encode wifi config data failed, ret = %d.", ret);
675 return SOFTBUS_ERR;
676 }
677
678 return SOFTBUS_OK;
679 }
680
P2pLinkSetPeerWifiCfgInfo(const char * cfgData)681 NO_SANITIZE("cfi") int32_t P2pLinkSetPeerWifiCfgInfo(const char *cfgData)
682 {
683 if (cfgData == NULL || strlen(cfgData) == 0) {
684 CLOGW("peer wifi config data is null.");
685 return SOFTBUS_OK;
686 }
687
688 int32_t cfgStrLen = strlen(cfgData) + 1;
689 size_t useLen;
690 int32_t ret;
691 char *peerWifiCfg = (char *)SoftBusCalloc(cfgStrLen);
692 if (peerWifiCfg == NULL) {
693 CLOGE("calloc peer wifi config data failed.");
694 return SOFTBUS_MEM_ERR;
695 }
696
697 ret = SoftBusBase64Decode((unsigned char *)peerWifiCfg, cfgStrLen, &useLen,
698 (unsigned char *)cfgData, strlen(cfgData));
699 if (ret != 0) {
700 CLOGE("softbus decode peer wifi config data failed, ret = %d.", ret);
701 SoftBusFree(peerWifiCfg);
702 return SOFTBUS_ERR;
703 }
704
705 ret = Hid2dSetPeerWifiCfgInfo(TYPE_OF_SET_PEER_CONFIG, peerWifiCfg, useLen);
706 if (ret != WIFI_SUCCESS) {
707 CLOGE("set peer wifi config data failed, ret = %d.", ret);
708 SoftBusFree(peerWifiCfg);
709 return SOFTBUS_ERR;
710 }
711
712 SoftBusFree(peerWifiCfg);
713 return SOFTBUS_OK;
714 }
715
P2pLinkIsWideBandwidthSupported(void)716 NO_SANITIZE("cfi") bool P2pLinkIsWideBandwidthSupported(void)
717 {
718 if (Hid2dIsWideBandwidthSupported() == 0) {
719 CLOGD("don't support wide band.");
720 return false;
721 }
722
723 return true;
724 }
725
P2pLinkReleaseIPAddr(void)726 NO_SANITIZE("cfi") int32_t P2pLinkReleaseIPAddr(void)
727 {
728 WifiP2pGroupInfo *groupInfo = NULL;
729 int32_t ret;
730
731 groupInfo = (WifiP2pGroupInfo*)SoftBusCalloc(sizeof(WifiP2pGroupInfo));
732 if (groupInfo == NULL) {
733 CLOGE("malloc groupInfo fail.");
734 return SOFTBUS_ERR;
735 }
736 ret = GetCurrentGroup(groupInfo);
737 if (ret != WIFI_SUCCESS) {
738 SoftBusFree(groupInfo);
739 CLOGE("P2pLinkReleaseIPAddr GetCurrentGroup fail[%d].", ret);
740 return SOFTBUS_ERR;
741 }
742
743 ret = Hid2dReleaseIPAddr(groupInfo->interface);
744 if (ret != WIFI_SUCCESS) {
745 SoftBusFree(groupInfo);
746 CLOGE("P2pLinkReleaseIPAddr releaseIPAddr fail[%d].", ret);
747 return SOFTBUS_ERR;
748 }
749 SoftBusFree(groupInfo);
750 CLOGI("P2pLinkReleaseIPAddr ok.");
751 return SOFTBUS_OK;
752 }
753
P2pLinkGetWifiState(void)754 NO_SANITIZE("cfi") int32_t P2pLinkGetWifiState(void)
755 {
756 int wifiState;
757
758 wifiState = IsWifiActive();
759 CLOGI("wifi state %d", wifiState);
760 if (wifiState == WIFI_STA_ACTIVE) {
761 return SOFTBUS_OK;
762 }
763 return SOFTBUS_ERR;
764 }
765
P2pLinkStopPeerDiscovery(void)766 NO_SANITIZE("cfi") void P2pLinkStopPeerDiscovery(void)
767 {
768 (void)StopDiscoverDevices();
769 }
770
P2pLinkRemoveGroup(void)771 NO_SANITIZE("cfi") void P2pLinkRemoveGroup(void)
772 {
773 WifiErrorCode ret;
774
775 ret = RemoveGroup();
776 if (ret != WIFI_SUCCESS) {
777 CLOGE("remove group faul [%d].", ret);
778 }
779 CLOGI("remove group ok");
780 if (g_p2pLinkCallBack.enterDiscState != 0) {
781 g_p2pLinkCallBack.enterDiscState();
782 }
783 }
784
P2pLinkRemoveGcGroup(void)785 NO_SANITIZE("cfi") void P2pLinkRemoveGcGroup(void)
786 {
787 WifiP2pGroupInfo* groupInfo = NULL;
788 WifiErrorCode ret;
789
790 groupInfo = (WifiP2pGroupInfo*)SoftBusCalloc(sizeof(WifiP2pGroupInfo));
791 if (groupInfo == NULL) {
792 CLOGE("malloc groupInfo fail.");
793 return;
794 }
795 ret = GetCurrentGroup(groupInfo);
796 if (ret != WIFI_SUCCESS) {
797 SoftBusFree(groupInfo);
798 CLOGE("P2pLinkRemoveGcGroup GetCurrentGroup fail[%d].", ret);
799 return;
800 }
801
802 ret = Hid2dRemoveGcGroup(groupInfo->interface);
803 if (ret != WIFI_SUCCESS) {
804 SoftBusFree(groupInfo);
805 CLOGE("P2pLinkRemoveGcGroup removeGcGroup fail[%d].", ret);
806 return;
807 }
808 SoftBusFree(groupInfo);
809 CLOGI("P2pLinkRemoveGcGroup ok.");
810 if (g_p2pLinkCallBack.enterDiscState != 0) {
811 g_p2pLinkCallBack.enterDiscState();
812 }
813 }