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