• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }