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