• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "auth_connection.h"
17 
18 #include <securec.h>
19 
20 #include "auth_common.h"
21 #include "auth_log.h"
22 #include "auth_manager.h"
23 #include "auth_request.h"
24 #include "auth_pre_link.h"
25 #include "auth_tcp_connection.h"
26 #include "lnn_async_callback_utils.h"
27 #include "softbus_adapter_bt_common.h"
28 #include "softbus_adapter_errcode.h"
29 #include "softbus_adapter_mem.h"
30 #include "softbus_adapter_socket.h"
31 #include "softbus_conn_interface.h"
32 #include "softbus_def.h"
33 #include "wifi_direct_manager.h"
34 
35 #define AUTH_CONN_DATA_HEAD_SIZE             24
36 #define AUTH_ENHANCE_P2P_CONNECT_TIMEOUT_MS  4500
37 #define AUTH_CONN_CONNECT_TIMEOUT_MS         11000
38 #define AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY   1000
39 #define AUTH_CONN_MAX_RETRY_TIMES            1
40 #define AUTH_CONN_RETRY_DELAY_MILLIS         3000
41 
42 typedef struct {
43     uint32_t requestId;
44     AuthConnInfo connInfo;
45     uint32_t retryTimes;
46 } ConnCmdInfo;
47 
48 typedef struct {
49     uint32_t requestId;
50     int32_t fd;
51     AuthConnInfo connInfo;
52     uint32_t retryTimes;
53     ListNode node;
54 } ConnRequest;
55 
56 static ListNode g_connRequestList = { &g_connRequestList, &g_connRequestList };
57 static AuthConnListener g_listener = { 0 };
58 
59 static void OnWiFiConnected(ListenerModule module, int32_t fd, bool isClient);
60 static void OnTcpSessionConnected(ListenerModule module, int32_t fd, bool isClient);
61 
RouteBuildClientAuthManager(int32_t cfd)62 void __attribute__((weak)) RouteBuildClientAuthManager(int32_t cfd)
63 {
64     (void)cfd;
65 }
RouteClearAuthChannelId(int32_t cfd)66 void __attribute__((weak)) RouteClearAuthChannelId(int32_t cfd)
67 {
68     (void)cfd;
69 }
70 
IsEnhanceP2pModuleId(ListenerModule moduleId)71 static bool IsEnhanceP2pModuleId(ListenerModule moduleId)
72 {
73     if (moduleId >= AUTH_ENHANCED_P2P_START && moduleId <= AUTH_ENHANCED_P2P_END) {
74         return true;
75     }
76     return false;
77 }
78 
GenConnId(int32_t connType,int32_t id)79 uint64_t GenConnId(int32_t connType, int32_t id)
80 {
81     uint64_t connId = (uint64_t)connType;
82     connId = (connId << INT32_BIT_NUM) & MASK_UINT64_H32;
83     connId |= (((uint64_t)id) & MASK_UINT64_L32);
84     return connId;
85 }
86 
GetConnType(uint64_t connId)87 int32_t GetConnType(uint64_t connId)
88 {
89     return (int32_t)((connId >> INT32_BIT_NUM) & MASK_UINT64_L32);
90 }
91 
GetConnTypeStr(uint64_t connId)92 const char *GetConnTypeStr(uint64_t connId)
93 {
94     int32_t type = GetConnType(connId);
95     switch (type) {
96         case AUTH_LINK_TYPE_WIFI:
97             return "wifi/eth";
98         case AUTH_LINK_TYPE_BR:
99             return "br";
100         case AUTH_LINK_TYPE_BLE:
101             return "ble";
102         case AUTH_LINK_TYPE_P2P:
103             return "p2p";
104         case AUTH_LINK_TYPE_ENHANCED_P2P:
105             return "enhanced_p2p";
106         case AUTH_LINK_TYPE_SESSION:
107         case AUTH_LINK_TYPE_SESSION_KEY:
108             return "session";
109         default:
110             break;
111     }
112     return "unknown";
113 }
114 
GetConnId(uint64_t connId)115 uint32_t GetConnId(uint64_t connId)
116 {
117     return (uint32_t)(connId & MASK_UINT64_L32);
118 }
119 
GetFd(uint64_t connId)120 int32_t GetFd(uint64_t connId)
121 {
122     return (int32_t)(connId & MASK_UINT64_L32);
123 }
124 
UpdateFd(uint64_t * connId,int32_t id)125 void UpdateFd(uint64_t *connId, int32_t id)
126 {
127     CHECK_NULL_PTR_RETURN_VOID(connId);
128     *connId &= MASK_UINT64_H32;
129     *connId |= (((uint64_t)id) & MASK_UINT64_L32);
130 }
131 
132 /* Conn Request */
AddConnRequest(const AuthConnInfo * connInfo,uint32_t requestId,int32_t fd)133 static int32_t AddConnRequest(const AuthConnInfo *connInfo, uint32_t requestId, int32_t fd)
134 {
135     ConnRequest *item = (ConnRequest *)SoftBusMalloc(sizeof(ConnRequest));
136     if (item == NULL) {
137         AUTH_LOGE(AUTH_CONN, "malloc ConnRequest fail");
138         return SOFTBUS_MALLOC_ERR;
139     }
140     item->fd = fd;
141     item->requestId = requestId;
142     if (memcpy_s(&item->connInfo, sizeof(item->connInfo), connInfo, sizeof(AuthConnInfo)) != EOK) {
143         AUTH_LOGE(AUTH_CONN, "set AuthConnInfo fail");
144         SoftBusFree(item);
145         return SOFTBUS_MEM_ERR;
146     }
147     ListTailInsert(&g_connRequestList, &item->node);
148     return SOFTBUS_OK;
149 }
150 
FindConnRequestByFd(int32_t fd)151 static ConnRequest *FindConnRequestByFd(int32_t fd)
152 {
153     ConnRequest *item = NULL;
154     LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
155         if (item->fd == fd) {
156             return item;
157         }
158     }
159     return NULL;
160 }
161 
FindConnRequestByRequestId(uint32_t requestId)162 static ConnRequest *FindConnRequestByRequestId(uint32_t requestId)
163 {
164     ConnRequest *item = NULL;
165     LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
166         if (item->requestId == requestId) {
167             return item;
168         }
169     }
170     return NULL;
171 }
172 
DelConnRequest(ConnRequest * item)173 static void DelConnRequest(ConnRequest *item)
174 {
175     CHECK_NULL_PTR_RETURN_VOID(item);
176     ListDelete(&item->node);
177     SoftBusFree(item);
178 }
179 
ClearConnRequest(void)180 static void ClearConnRequest(void)
181 {
182     ConnRequest *item = NULL;
183     ConnRequest *next = NULL;
184     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_connRequestList, ConnRequest, node) {
185         DelConnRequest(item);
186     }
187 }
188 
189 /* Notify Conn Listener */
190 
NotifyClientConnected(uint32_t requestId,uint64_t connId,int32_t result,const AuthConnInfo * connInfo)191 static void NotifyClientConnected(uint32_t requestId, uint64_t connId, int32_t result, const AuthConnInfo *connInfo)
192 {
193     if (g_listener.onConnectResult != NULL) {
194         g_listener.onConnectResult(requestId, connId, result, connInfo);
195     }
196 }
197 
NotifyDisconnected(uint64_t connId,const AuthConnInfo * connInfo)198 static void NotifyDisconnected(uint64_t connId, const AuthConnInfo *connInfo)
199 {
200     if (g_listener.onDisconnected != NULL) {
201         g_listener.onDisconnected(connId, connInfo);
202     }
203 }
204 
NotifyDataReceived(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)205 static void NotifyDataReceived(
206     uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data)
207 {
208     if (g_listener.onDataReceived != NULL) {
209         g_listener.onDataReceived(connId, connInfo, fromServer, head, data);
210     }
211 }
212 
213 /* AuthData */
GetAuthDataSize(uint32_t len)214 uint32_t GetAuthDataSize(uint32_t len)
215 {
216     return AUTH_CONN_DATA_HEAD_SIZE + len;
217 }
218 
PackAuthData(const AuthDataHead * head,const uint8_t * data,uint8_t * buf,uint32_t size)219 int32_t PackAuthData(const AuthDataHead *head, const uint8_t *data,
220     uint8_t *buf, uint32_t size)
221 {
222     if (head == NULL || data == NULL || buf == NULL) {
223         AUTH_LOGE(AUTH_CONN, "param error");
224         return SOFTBUS_INVALID_PARAM;
225     }
226     if (size < GetAuthDataSize(head->len)) {
227         return SOFTBUS_NO_ENOUGH_DATA;
228     }
229     uint32_t offset = 0;
230     *(uint32_t *)buf = SoftBusHtoLl(head->dataType);
231     offset += sizeof(uint32_t);
232     *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->module);
233     offset += sizeof(uint32_t);
234     *(uint64_t *)(buf + offset) = SoftBusHtoLll((uint64_t)head->seq);
235     offset += sizeof(uint64_t);
236     *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->flag);
237     offset += sizeof(uint32_t);
238     *(uint32_t *)(buf + offset) = SoftBusHtoLl(head->len);
239     offset += sizeof(uint32_t);
240 
241     if (memcpy_s(buf + offset, size - offset, data, head->len) != EOK) {
242         AUTH_LOGE(AUTH_CONN, "pack AuthData fail");
243         return SOFTBUS_MEM_ERR;
244     }
245     return SOFTBUS_OK;
246 }
247 
UnpackAuthData(const uint8_t * data,uint32_t len,AuthDataHead * head)248 const uint8_t *UnpackAuthData(const uint8_t *data, uint32_t len, AuthDataHead *head)
249 {
250     if (len < GetAuthDataSize(0)) {
251         AUTH_LOGE(AUTH_CONN, "head not enough");
252         return NULL;
253     }
254     uint32_t offset = 0;
255     head->dataType = SoftBusLtoHl(*(uint32_t *)data);
256     offset += sizeof(uint32_t);
257     head->module = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
258     offset += sizeof(uint32_t);
259     head->seq = (int64_t)SoftBusLtoHll(*(uint64_t *)(data + offset));
260     offset += sizeof(uint64_t);
261     head->flag = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
262     offset += sizeof(uint32_t);
263     head->len = SoftBusLtoHl(*(uint32_t *)(data + offset));
264     offset += sizeof(uint32_t);
265     uint32_t dataLen = GetAuthDataSize(head->len);
266     if (len < dataLen || dataLen < GetAuthDataSize(0)) {
267         AUTH_LOGE(AUTH_CONN, "data not enough");
268         return NULL;
269     }
270     return (data + offset);
271 }
272 
GetAuthTimeoutErrCode(AuthLinkType type)273 static int32_t GetAuthTimeoutErrCode(AuthLinkType type)
274 {
275     switch (type) {
276         case AUTH_LINK_TYPE_WIFI:
277             return SOFTBUS_AUTH_WIFI_CONN_TIMEOUT;
278         case AUTH_LINK_TYPE_BR:
279             return SOFTBUS_AUTH_BR_CONN_TIMEOUT;
280         case AUTH_LINK_TYPE_BLE:
281             return SOFTBUS_AUTH_BLE_CONN_TIMEOUT;
282         case AUTH_LINK_TYPE_P2P:
283             return SOFTBUS_AUTH_P2P_CONN_TIMEOUT;
284         case AUTH_LINK_TYPE_ENHANCED_P2P:
285             return SOFTBUS_AUTH_ENHANCEP2P_CONN_TIMEOUT;
286         case AUTH_LINK_TYPE_SESSION_KEY:
287             return SOFTBUS_AUTH_SESSION_KEY_CONN_TIMEOUT;
288         default:
289             AUTH_LOGE(AUTH_CONN, "auth conn timeout type=%{public}d", type);
290     }
291     return SOFTBUS_AUTH_CONN_TIMEOUT;
292 }
293 
294 /* EVENT_CONNECT_TIMEOUT */
HandleConnConnectTimeout(const void * para)295 static void HandleConnConnectTimeout(const void *para)
296 {
297     CHECK_NULL_PTR_RETURN_VOID(para);
298     uint32_t requestId = *(uint32_t *)(para);
299     AUTH_LOGE(AUTH_CONN, "connect timeout, requestId=%{public}u", requestId);
300     ConnRequest *item = FindConnRequestByRequestId(requestId);
301     if (item != NULL) {
302         ListenerModule module = item->connInfo.type == AUTH_LINK_TYPE_RAW_ENHANCED_P2P ? AUTH_RAW_P2P_SERVER : AUTH;
303         SocketDisconnectDevice(module, item->fd);
304         DelConnRequest(item);
305     }
306     int32_t errCode = SOFTBUS_AUTH_CONN_TIMEOUT;
307     AuthRequest request = { 0 };
308     if (GetAuthRequest(requestId, &request) == SOFTBUS_OK) {
309         errCode = GetAuthTimeoutErrCode(request.connInfo.type);
310         AUTH_LOGE(AUTH_CONN, "errCode=%{public}d", errCode);
311     }
312     NotifyClientConnected(requestId, 0, errCode, NULL);
313 }
314 
PostConnConnectTimeout(uint32_t requestId,AuthLinkType type)315 static void PostConnConnectTimeout(uint32_t requestId, AuthLinkType type)
316 {
317     if (type == AUTH_LINK_TYPE_ENHANCED_P2P) {
318         PostAuthEvent(EVENT_CONNECT_TIMEOUT, HandleConnConnectTimeout, &requestId, sizeof(requestId),
319             AUTH_ENHANCE_P2P_CONNECT_TIMEOUT_MS);
320     } else {
321         PostAuthEvent(EVENT_CONNECT_TIMEOUT, HandleConnConnectTimeout, &requestId, sizeof(requestId),
322             AUTH_CONN_CONNECT_TIMEOUT_MS);
323     }
324 }
325 
RemoveFunc(const void * obj,void * param)326 static int32_t RemoveFunc(const void *obj, void *param)
327 {
328     CHECK_NULL_PTR_RETURN_VALUE(obj, SOFTBUS_INVALID_PARAM);
329     CHECK_NULL_PTR_RETURN_VALUE(param, SOFTBUS_INVALID_PARAM);
330     return ((*(uint32_t *)(obj) == *(uint32_t *)(param)) ? SOFTBUS_OK : SOFTBUS_INVALID_PARAM);
331 }
332 
RemoveConnConnectTimeout(uint32_t requestId)333 static void RemoveConnConnectTimeout(uint32_t requestId)
334 {
335     RemoveAuthEvent(EVENT_CONNECT_TIMEOUT, RemoveFunc, (void *)(&requestId));
336 }
337 
338 /* EVENT_CONNECT_CMD */
HandleConnConnectCmd(const void * para)339 static void HandleConnConnectCmd(const void *para)
340 {
341     int32_t fd = AUTH_INVALID_FD;
342     CHECK_NULL_PTR_RETURN_VOID(para);
343     ConnCmdInfo *info = (ConnCmdInfo *)para;
344     bool isFindAuthPreLinkNode = false;
345     if (info->connInfo.type != AUTH_LINK_TYPE_WIFI) {
346         AUTH_LOGE(AUTH_CONN, "invalid connType=%{public}d", info->connInfo.type);
347         return;
348     }
349     AuthPreLinkNode reuseKeyNode;
350     (void)memset_s(&reuseKeyNode, sizeof(AuthPreLinkNode), 0, sizeof(AuthPreLinkNode));
351     if (FindAuthPreLinkNodeById(info->requestId, &reuseKeyNode) == SOFTBUS_OK) {
352         AUTH_LOGI(AUTH_CONN, "find reuse devicekey id");
353         fd = reuseKeyNode.fd;
354         isFindAuthPreLinkNode = true;
355         SocketSetDevice(fd, true);
356     } else {
357         fd = SocketConnectDevice(info->connInfo.info.ipInfo.ip, info->connInfo.info.ipInfo.port, false);
358     }
359     if (fd < 0) {
360         AUTH_LOGE(AUTH_CONN, "SocketConnectDevice fail");
361         RemoveConnConnectTimeout(info->requestId);
362         NotifyClientConnected(info->requestId, 0, SOFTBUS_AUTH_CONN_FAIL, NULL);
363         DelAuthPreLinkById(info->requestId);
364         return;
365     }
366     (void)AddConnRequest(&info->connInfo, info->requestId, fd);
367     if (isFindAuthPreLinkNode) {
368         AUTH_LOGI(AUTH_CONN, "reuse socket directly");
369         OnWiFiConnected(AUTH, fd, true);
370     }
371 }
372 
HandleTcpSessionConnConnectCmd(const void * para)373 static void HandleTcpSessionConnConnectCmd(const void *para)
374 {
375     int32_t fd = AUTH_INVALID_FD;
376     CHECK_NULL_PTR_RETURN_VOID(para);
377     ConnCmdInfo *info = (ConnCmdInfo *)para;
378     if (info->connInfo.type != AUTH_LINK_TYPE_SESSION_KEY) {
379         AUTH_LOGE(AUTH_CONN, "invalid connType=%{public}d", info->connInfo.type);
380         return;
381     }
382     AuthPreLinkNode reuseKeyNode;
383     (void)memset_s(&reuseKeyNode, sizeof(AuthPreLinkNode), 0, sizeof(AuthPreLinkNode));
384     if (FindAuthPreLinkNodeById(info->requestId, &reuseKeyNode) != SOFTBUS_OK) {
385         AUTH_LOGE(AUTH_CONN, "not find reuse devicekey id");
386         return;
387     }
388     AUTH_LOGI(AUTH_CONN, "find reuse devicekey id");
389     fd = reuseKeyNode.fd;
390     if (fd < 0) {
391         AUTH_LOGE(AUTH_CONN, "SocketConnectDevice fail");
392         RemoveConnConnectTimeout(info->requestId);
393         NotifyClientConnected(info->requestId, 0, SOFTBUS_AUTH_CONN_FAIL, NULL);
394         DelAuthPreLinkById(info->requestId);
395         return;
396     }
397     SocketSetDevice(fd, true);
398     (void)AddConnRequest(&info->connInfo, info->requestId, fd);
399     AUTH_LOGI(AUTH_CONN, "reuse socket directly");
400     OnTcpSessionConnected(AUTH, fd, true);
401 }
402 
403 /* EVENT_CONNECT_RESULT */
HandleConnConnectResult(const void * para)404 static void HandleConnConnectResult(const void *para)
405 {
406     CHECK_NULL_PTR_RETURN_VOID(para);
407     AuthConnectResult *connResult = (AuthConnectResult *)(para);
408     RouteBuildClientAuthManager(connResult->fd);
409     ConnRequest *item = FindConnRequestByFd(connResult->fd);
410     if (item == NULL) {
411         AUTH_LOGE(AUTH_CONN, "ConnRequest not found, fd=%{public}d", connResult->fd);
412         return;
413     }
414     RemoveConnConnectTimeout(item->requestId);
415     if (connResult->ret == SOFTBUS_OK) {
416         NotifyClientConnected(item->requestId, GenConnId(AUTH_LINK_TYPE_WIFI, connResult->fd),
417             SOFTBUS_OK, &item->connInfo);
418     } else {
419         NotifyClientConnected(item->requestId, 0, connResult->ret, NULL);
420     }
421     DelConnRequest(item);
422 }
423 
HandleTcpSessionConnConnectResult(const void * para)424 static void HandleTcpSessionConnConnectResult(const void *para)
425 {
426     CHECK_NULL_PTR_RETURN_VOID(para);
427     AuthConnectResult *connResult = (AuthConnectResult *)(para);
428     RouteBuildClientAuthManager(connResult->fd);
429     ConnRequest *item = FindConnRequestByFd(connResult->fd);
430     if (item == NULL) {
431         AUTH_LOGE(AUTH_CONN, "ConnRequest not found, fd=%{public}d", connResult->fd);
432         return;
433     }
434     RemoveConnConnectTimeout(item->requestId);
435     if (connResult->ret == SOFTBUS_OK) {
436         NotifyClientConnected(item->requestId, GenConnId(AUTH_LINK_TYPE_SESSION_KEY, connResult->fd),
437             SOFTBUS_OK, &item->connInfo);
438     } else {
439         NotifyClientConnected(item->requestId, 0, connResult->ret, NULL);
440     }
441     DelConnRequest(item);
442 }
443 
AsyncCallDeviceIdReceived(void * para)444 static void AsyncCallDeviceIdReceived(void *para)
445 {
446     RepeatDeviceIdData *recvData = (RepeatDeviceIdData *)para;
447     if (recvData == NULL) {
448         return;
449     }
450     NotifyDataReceived(recvData->connId, &recvData->connInfo, recvData->fromServer, &recvData->head, recvData->data);
451     SoftBusFree(para);
452 }
453 
HandleDataReceivedProcess(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)454 static void HandleDataReceivedProcess(
455     uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data)
456 {
457     RepeatDeviceIdData *request = (RepeatDeviceIdData *)SoftBusCalloc(sizeof(RepeatDeviceIdData) + head->len);
458     if (request == NULL) {
459         AUTH_LOGE(AUTH_CONN, "malloc RepeatDeviceIdData fail");
460         return;
461     }
462     request->len = head->len;
463     if (data != NULL && head->len > 0 && memcpy_s(request->data, head->len, data, head->len) != EOK) {
464         AUTH_LOGE(AUTH_CONN, "copy data fail");
465         SoftBusFree(request);
466         return;
467     }
468     request->connId = connId;
469     request->connInfo = *connInfo;
470     request->fromServer = fromServer;
471     request->head = *head;
472     if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), AsyncCallDeviceIdReceived, request, 0) !=
473         SOFTBUS_OK) {
474         SoftBusFree(request);
475     }
476 }
477 
478 /* WiFi Connection */
OnWiFiConnected(ListenerModule module,int32_t fd,bool isClient)479 static void OnWiFiConnected(ListenerModule module, int32_t fd, bool isClient)
480 {
481     AUTH_LOGI(AUTH_CONN, "OnWiFiConnected: fd=%{public}d, side=%{public}s", fd,
482         isClient ? "client" : "server(ignored)");
483     if (!isClient) {
484         /* do nothing, wait auth message. */
485         return;
486     }
487     AuthConnectResult info = {
488         .fd = fd,
489         .ret = SOFTBUS_OK,
490     };
491     (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleConnConnectResult, &info, sizeof(AuthConnectResult), 0);
492 }
493 
OnTcpSessionConnected(ListenerModule module,int32_t fd,bool isClient)494 static void OnTcpSessionConnected(ListenerModule module, int32_t fd, bool isClient)
495 {
496     AUTH_LOGI(AUTH_CONN, "OnTcpSessionConnected: fd=%{public}d, side=%{public}s", fd,
497         isClient ? "client" : "server(ignored)");
498     if (!isClient) {
499         /* do nothing, wait auth message. */
500         return;
501     }
502     AuthConnectResult info = {
503         .fd = fd,
504         .ret = SOFTBUS_OK,
505     };
506     (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleTcpSessionConnConnectResult, &info, sizeof(AuthConnectResult), 0);
507 }
508 
OnWiFiDisconnected(int32_t fd)509 static void OnWiFiDisconnected(int32_t fd)
510 {
511     AUTH_LOGI(AUTH_CONN, "OnWiFiDisconnected: fd=%{public}d", fd);
512     AuthConnInfo connInfo;
513     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
514     connInfo.type = AUTH_LINK_TYPE_WIFI;
515     bool isWifiType = IsHaveAuthIdByConnId(GenConnId(connInfo.type, fd));
516     if (!isWifiType) {
517         AUTH_LOGI(AUTH_CONN, "select session key auth link type");
518         connInfo.type = AUTH_LINK_TYPE_SESSION_KEY;
519         NotifyDisconnected(GenConnId(connInfo.type, fd), &connInfo);
520         AuthConnectResult info = {
521             .fd = fd,
522             .ret = SOFTBUS_AUTH_CONN_FAIL,
523         };
524         (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleTcpSessionConnConnectResult, &info,
525             sizeof(AuthConnectResult), 0);
526         RouteClearAuthChannelId(fd);
527         return;
528     }
529     NotifyDisconnected(GenConnId(connInfo.type, fd), &connInfo);
530     AuthConnectResult info = {
531         .fd = fd,
532         .ret = SOFTBUS_AUTH_CONN_FAIL,
533     };
534     (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleConnConnectResult, &info, sizeof(AuthConnectResult), 0);
535     RouteClearAuthChannelId(fd);
536 }
537 
IsSessionAuth(int32_t module)538 static bool IsSessionAuth(int32_t module)
539 {
540     return (module == MODULE_SESSION_AUTH);
541 }
542 
OnWiFiDataReceived(ListenerModule module,int32_t fd,const AuthDataHead * head,const uint8_t * data)543 static void OnWiFiDataReceived(ListenerModule module, int32_t fd, const AuthDataHead *head, const uint8_t *data)
544 {
545     CHECK_NULL_PTR_RETURN_VOID(head);
546     CHECK_NULL_PTR_RETURN_VOID(data);
547 
548     if (module != AUTH && module != AUTH_P2P && module != AUTH_RAW_P2P_SERVER && !IsEnhanceP2pModuleId(module) &&
549         !IsSessionAuth(head->module)) {
550         return;
551     }
552     bool fromServer = false;
553     AuthConnInfo connInfo;
554     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
555     if (IsSessionAuth(head->module)) {
556         connInfo.type = AUTH_LINK_TYPE_SESSION;
557         connInfo.info.sessionInfo.connId = (uint32_t)fd;
558         AUTH_LOGI(AUTH_CONN, "set connInfo for AUTH_LINK_TYPE_SESSION, fd=%{public}d", fd);
559     } else {
560         if (SocketGetConnInfo(fd, &connInfo, &fromServer) != SOFTBUS_OK) {
561             AUTH_LOGE(AUTH_CONN, "get connInfo fail, fd=%{public}d", fd);
562             return;
563         }
564     }
565     HandleDataReceivedProcess(GenConnId(connInfo.type, fd), &connInfo, fromServer, head, data);
566 }
567 
InitWiFiConn(void)568 static int32_t InitWiFiConn(void)
569 {
570     SocketCallback socketCb = {
571         .onConnected = OnWiFiConnected,
572         .onDisconnected = OnWiFiDisconnected,
573         .onDataReceived = OnWiFiDataReceived,
574     };
575     return SetSocketCallback(&socketCb);
576 }
577 
578 /* BR/BLE/P2P Connection */
OnCommConnected(uint32_t connectionId,const ConnectionInfo * info)579 static void OnCommConnected(uint32_t connectionId, const ConnectionInfo *info)
580 {
581     AUTH_LOGI(AUTH_CONN, "(ignored)OnCommConnected: connectionId=%{public}u", connectionId);
582 }
583 
OnCommDisconnected(uint32_t connectionId,const ConnectionInfo * info)584 static void OnCommDisconnected(uint32_t connectionId, const ConnectionInfo *info)
585 {
586     AUTH_LOGI(AUTH_CONN, "connectionId=%{public}u", connectionId);
587     CHECK_NULL_PTR_RETURN_VOID(info);
588     AuthConnInfo connInfo;
589     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
590     (void)ConvertToAuthConnInfo(info, &connInfo);
591     NotifyDisconnected(GenConnId(connInfo.type, connectionId), &connInfo);
592 }
593 
GetConnInfoByConnectionId(uint32_t connectionId,AuthConnInfo * connInfo)594 int32_t GetConnInfoByConnectionId(uint32_t connectionId, AuthConnInfo *connInfo)
595 {
596     ConnectionInfo info = { 0 };
597     int32_t ret = ConnGetConnectionInfo(connectionId, &info);
598     if (ret != SOFTBUS_OK) {
599         AUTH_LOGE(AUTH_CONN, "GetConnectionInfo err=%{public}d, connectionId=%{public}u", ret, connectionId);
600         return ret;
601     }
602     return ConvertToAuthConnInfo(&info, connInfo);
603 }
604 
OnCommDataReceived(uint32_t connectionId,ConnModule moduleId,int64_t seq,char * data,int32_t len)605 static void OnCommDataReceived(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len)
606 {
607     if (data == NULL || moduleId != MODULE_DEVICE_AUTH || len <= 0) {
608         AUTH_LOGE(AUTH_CONN, "invalid param");
609         return;
610     }
611     bool fromServer = ((seq % SEQ_INTERVAL) != 0);
612     AUTH_LOGI(AUTH_CONN,
613         "connectionId=%{public}u, module=%{public}d, seq=%{public}" PRId64 ", len=%{public}d, from=%{public}s",
614         connectionId, moduleId, seq, len, GetAuthSideStr(fromServer));
615     AuthConnInfo connInfo;
616     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
617     if (GetConnInfoByConnectionId(connectionId, &connInfo) != SOFTBUS_OK) {
618         return;
619     }
620     AuthDataHead head = { 0 };
621     const uint8_t *body = UnpackAuthData((const uint8_t *)data, (uint32_t)len, &head);
622     if (body == NULL) {
623         AUTH_LOGE(AUTH_CONN, "empty body");
624         return;
625     }
626     HandleDataReceivedProcess(GenConnId(connInfo.type, connectionId), &connInfo, fromServer, &head, body);
627 }
628 
HandleRepeatDeviceIdDataDelay(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)629 void HandleRepeatDeviceIdDataDelay(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
630     const AuthDataHead *head, const uint8_t *data)
631 {
632     if (connInfo == NULL || head == NULL || data == NULL) {
633         AUTH_LOGE(AUTH_CONN, "param error");
634         return;
635     }
636     RepeatDeviceIdData *request = (RepeatDeviceIdData *)SoftBusCalloc(sizeof(RepeatDeviceIdData) + head->len);
637     if (request == NULL) {
638         AUTH_LOGE(AUTH_CONN, "malloc RepeatDeviceIdData fail");
639         return;
640     }
641     request->len = head->len;
642     if (data != NULL && head->len > 0 && memcpy_s(request->data, head->len, data, head->len) != EOK) {
643         AUTH_LOGE(AUTH_CONN, "copy data fail");
644         SoftBusFree(request);
645         return;
646     }
647     request->connId = connId;
648     request->connInfo = *connInfo;
649     request->fromServer = fromServer;
650     request->head = *head;
651     if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), AsyncCallDeviceIdReceived, request,
652         AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY) != SOFTBUS_OK) {
653         SoftBusFree(request);
654     }
655 }
656 
InitCommConn(void)657 static int32_t InitCommConn(void)
658 {
659     ConnectCallback connCb = {
660         .OnConnected = OnCommConnected,
661         .OnDisconnected = OnCommDisconnected,
662         .OnDataReceived = OnCommDataReceived,
663     };
664     return ConnSetConnectCallback(MODULE_DEVICE_AUTH, &connCb);
665 }
666 
OnCommConnectSucc(uint32_t requestId,uint32_t connectionId,const ConnectionInfo * info)667 static void OnCommConnectSucc(uint32_t requestId, uint32_t connectionId, const ConnectionInfo *info)
668 {
669     AuthConnInfo connInfo;
670     AUTH_LOGI(AUTH_CONN, "requestId=%{public}u, connectionId=%{public}u", requestId, connectionId);
671     CHECK_NULL_PTR_RETURN_VOID(info);
672     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
673     (void)ConvertToAuthConnInfo(info, &connInfo);
674     RemoveConnConnectTimeout(requestId);
675     uint64_t connId = GenConnId(connInfo.type, connectionId);
676     NotifyClientConnected(requestId, connId, SOFTBUS_OK, &connInfo);
677 }
678 
OnCommConnectFail(uint32_t requestId,int32_t reason)679 static void OnCommConnectFail(uint32_t requestId, int32_t reason)
680 {
681     AUTH_LOGI(AUTH_CONN, "requestId=%{public}u, reason=%{public}d", requestId, reason);
682     RemoveConnConnectTimeout(requestId);
683     NotifyClientConnected(requestId, 0, reason, NULL);
684 }
685 
ConnectCommDevice(const AuthConnInfo * info,uint32_t requestId,ConnSideType sideType)686 static int32_t ConnectCommDevice(const AuthConnInfo *info, uint32_t requestId, ConnSideType sideType)
687 {
688     ConnectOption option;
689     (void)memset_s(&option, sizeof(ConnectOption), 0, sizeof(ConnectOption));
690     int32_t ret = ConvertToConnectOption(info, &option);
691     if (ret != SOFTBUS_OK) {
692         AUTH_LOGE(AUTH_CONN, "ConvertToConnectOption fail=%{public}d", ret);
693         return ret;
694     }
695     if (option.type == CONNECT_BR) {
696         option.brOption.sideType = sideType;
697     }
698     ConnectResult result = {
699         .OnConnectSuccessed = OnCommConnectSucc,
700         .OnConnectFailed = OnCommConnectFail,
701     };
702     ret = ConnConnectDevice(&option, requestId, &result);
703     if (ret != SOFTBUS_OK) {
704         AUTH_LOGE(AUTH_CONN, "ConnConnectDevice fail. ret=%{public}d", ret);
705         return ret;
706     }
707     return SOFTBUS_OK;
708 }
709 
PostCommData(uint32_t connectionId,bool toServer,const AuthDataHead * head,const uint8_t * data)710 static int32_t PostCommData(uint32_t connectionId, bool toServer, const AuthDataHead *head, const uint8_t *data)
711 {
712     uint32_t size = ConnGetHeadSize() + GetAuthDataSize(head->len);
713     uint8_t *buf = (uint8_t *)SoftBusMalloc(size);
714     if (buf == NULL) {
715         AUTH_LOGE(AUTH_CONN, "malloc fail");
716         return SOFTBUS_MALLOC_ERR;
717     }
718     int32_t ret = PackAuthData(head, data, buf + ConnGetHeadSize(), size - ConnGetHeadSize());
719     if (ret != SOFTBUS_OK) {
720         AUTH_LOGE(AUTH_CONN, "pack data fail=%{public}d", ret);
721         SoftBusFree(buf);
722         return ret;
723     }
724     ConnPostData connData = {
725         .module = MODULE_DEVICE_AUTH,
726         .seq = GenSeq(!toServer),
727         .flag = CONN_HIGH,
728         .pid = 0,
729         .len = size,
730         .buf = (char *)buf,
731     };
732     AUTH_LOGI(AUTH_CONN,
733         "dataSeq=%{public}" PRId64 ", dataLen=%{public}u, "
734         "connId=%{public}u, connSeq=%{public}" PRId64 ", connLen=%{public}u}",
735         head->seq, head->len, connectionId, connData.seq, connData.len);
736     return ConnPostBytes(connectionId, &connData);
737 }
738 
AuthConnInit(const AuthConnListener * listener)739 int32_t AuthConnInit(const AuthConnListener *listener)
740 {
741     CHECK_NULL_PTR_RETURN_VALUE(listener, SOFTBUS_INVALID_PARAM);
742     g_listener = *listener;
743     ListInit(&g_connRequestList);
744     if (InitCommConn() != SOFTBUS_OK) {
745         (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
746         AUTH_LOGE(AUTH_CONN, "init br/ble/p2p conn fail");
747         return SOFTBUS_AUTH_CONN_INIT_FAIL;
748     }
749     if (WifiConnListLockInit() != SOFTBUS_OK) {
750         (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
751         AUTH_LOGE(AUTH_CONN, "init WifiConnListLock fail");
752         return SOFTBUS_LOCK_ERR;
753     }
754     if (InitWiFiConn() != SOFTBUS_OK) {
755         (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
756         AUTH_LOGE(AUTH_CONN, "init wifi conn fail");
757         return SOFTBUS_AUTH_CONN_INIT_FAIL;
758     }
759     return SOFTBUS_OK;
760 }
761 
AuthConnDeinit(void)762 void AuthConnDeinit(void)
763 {
764     UnsetSocketCallback();
765     ConnUnSetConnectCallback(MODULE_DEVICE_AUTH);
766     ClearConnRequest();
767     WifiConnListLockDeinit();
768     (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
769 }
770 
SessionConnectSucc(uint32_t requestId,const AuthConnInfo * connInfo)771 static void SessionConnectSucc(uint32_t requestId, const AuthConnInfo *connInfo)
772 {
773     AUTH_LOGI(AUTH_CONN, "no need connect.");
774     uint64_t connId = GenConnId(connInfo->type, (int32_t)connInfo->info.sessionInfo.connId);
775     NotifyClientConnected(requestId, connId, SOFTBUS_OK, connInfo);
776 }
777 
ConnectAuthDevice(uint32_t requestId,const AuthConnInfo * connInfo,ConnSideType sideType)778 int32_t ConnectAuthDevice(uint32_t requestId, const AuthConnInfo *connInfo, ConnSideType sideType)
779 {
780     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
781     AUTH_LOGI(AUTH_CONN, "requestId=%{public}u, connType=%{public}d, sideType=%{public}d", requestId,
782         connInfo->type, sideType);
783     PostConnConnectTimeout(requestId, connInfo->type);
784     int32_t ret = 0;
785     switch (connInfo->type) {
786         case AUTH_LINK_TYPE_WIFI: {
787             ConnCmdInfo info = {
788                 .requestId = requestId,
789                 .connInfo = *connInfo,
790                 .retryTimes = 0,
791             };
792             ret = PostAuthEvent(EVENT_CONNECT_CMD, HandleConnConnectCmd, &info, sizeof(ConnCmdInfo), 0);
793             break;
794         }
795         case AUTH_LINK_TYPE_BLE:
796             __attribute__((fallthrough));
797         case AUTH_LINK_TYPE_BR:
798             if (SoftBusGetBtState() != BLE_ENABLE) {
799                 ret = SOFTBUS_AUTH_CONN_FAIL;
800                 break;
801             }
802             __attribute__((fallthrough));
803         case AUTH_LINK_TYPE_P2P:
804         case AUTH_LINK_TYPE_ENHANCED_P2P:
805             ret = ConnectCommDevice(connInfo, requestId, sideType);
806             break;
807         case AUTH_LINK_TYPE_SESSION:
808             SessionConnectSucc(requestId, connInfo);
809             break;
810         case AUTH_LINK_TYPE_SESSION_KEY: {
811             ConnCmdInfo info = {
812                 .requestId = requestId,
813                 .connInfo = *connInfo,
814                 .retryTimes = 0,
815             };
816             ret = PostAuthEvent(EVENT_CONNECT_CMD, HandleTcpSessionConnConnectCmd, &info, sizeof(ConnCmdInfo), 0);
817             break;
818         }
819         default:
820             ret = SOFTBUS_OK;
821             break;
822     }
823     if (ret != SOFTBUS_OK) {
824         RemoveConnConnectTimeout(requestId);
825         AUTH_LOGE(AUTH_CONN, "ConnectDevice fail, requestId=%{public}u", requestId);
826     }
827     return ret;
828 }
829 
UpdateAuthDevicePriority(uint64_t connId)830 void UpdateAuthDevicePriority(uint64_t connId)
831 {
832     if (GetConnType(connId) != AUTH_LINK_TYPE_BLE) {
833         return;
834     }
835     UpdateOption option = {
836         .type = CONNECT_BLE,
837         .bleOption = {
838             .priority = CONN_BLE_PRIORITY_BALANCED,
839         }
840     };
841     int32_t ret = ConnUpdateConnection(GetConnId(connId), &option);
842     AUTH_LOGI(AUTH_CONN, "update connecton priority to balanced, connType=%{public}d, id=%{public}u, ret=%{public}d",
843         GetConnType(connId), GetConnId(connId), ret);
844 }
845 
DisconnectAuthDevice(uint64_t * connId)846 void DisconnectAuthDevice(uint64_t *connId)
847 {
848     if (connId == NULL) {
849         AUTH_LOGW(AUTH_CONN, "connId nulptr");
850         return;
851     }
852     AUTH_LOGI(AUTH_CONN, "connType=%{public}d, connectionId=%{public}u", GetConnType(*connId), GetConnId(*connId));
853     switch (GetConnType(*connId)) {
854         case AUTH_LINK_TYPE_RAW_ENHANCED_P2P:
855             SocketDisconnectDevice(AUTH_RAW_P2P_SERVER, GetFd(*connId));
856             UpdateFd(connId, AUTH_INVALID_FD);
857             break;
858         case AUTH_LINK_TYPE_WIFI:
859             SocketDisconnectDevice(AUTH, GetFd(*connId));
860             UpdateFd(connId, AUTH_INVALID_FD);
861             break;
862         case AUTH_LINK_TYPE_BLE:
863             __attribute__((fallthrough));
864         case AUTH_LINK_TYPE_BR:
865             ConnDisconnectDevice(GetConnId(*connId));
866             __attribute__((fallthrough));
867         case AUTH_LINK_TYPE_P2P:
868         case AUTH_LINK_TYPE_ENHANCED_P2P:
869         case AUTH_LINK_TYPE_SESSION_KEY:
870             break;
871         default:
872             AUTH_LOGI(AUTH_CONN, "unknown connType");
873             break;
874     }
875 }
876 
PostBytesForSession(int32_t fd,const AuthDataHead * head,const uint8_t * data)877 static int32_t PostBytesForSession(int32_t fd, const AuthDataHead *head, const uint8_t *data)
878 {
879     uint32_t size = GetAuthDataSize(head->len);
880     uint8_t *buf = (uint8_t *)SoftBusCalloc(size);
881     if (buf == NULL) {
882         AUTH_LOGE(AUTH_CONN, "calloc fail");
883         return SOFTBUS_MALLOC_ERR;
884     }
885     AuthDataHead tmpHead = *head;
886     tmpHead.module = MODULE_SESSION_AUTH;
887     int32_t ret = PackAuthData(&tmpHead, data, buf, size);
888     if (ret != SOFTBUS_OK) {
889         AUTH_LOGE(AUTH_CONN, "PackAuthData fail");
890         SoftBusFree(buf);
891         return ret;
892     }
893     tmpHead.len = size;
894     ret = SocketPostBytes(fd, &tmpHead, buf);
895     if (ret != SOFTBUS_OK) {
896         AUTH_LOGE(AUTH_CONN, "SocketPostBytes fail");
897     }
898     SoftBusFree(buf);
899     return ret;
900 }
901 
PostAuthData(uint64_t connId,bool toServer,const AuthDataHead * head,const uint8_t * data)902 int32_t PostAuthData(uint64_t connId, bool toServer, const AuthDataHead *head, const uint8_t *data)
903 {
904     CHECK_NULL_PTR_RETURN_VALUE(head, SOFTBUS_INVALID_PARAM);
905     CHECK_NULL_PTR_RETURN_VALUE(data, SOFTBUS_INVALID_PARAM);
906     AUTH_LOGI(AUTH_CONN,
907         "auth post dataType=0x%{public}x, dataModule=%{public}d, dataSeq=%{public}" PRId64 ", "
908         "dataFlag=%{public}d, dataLen=%{public}u, " CONN_INFO ", toServer=%{public}s",
909         head->dataType, head->module, head->seq, head->flag, head->len, CONN_DATA(connId),
910         GetAuthSideStr(toServer));
911     switch (GetConnType(connId)) {
912         case AUTH_LINK_TYPE_WIFI:
913         case AUTH_LINK_TYPE_SESSION_KEY:
914             return SocketPostBytes(GetFd(connId), head, data);
915         case AUTH_LINK_TYPE_BLE:
916         case AUTH_LINK_TYPE_BR:
917         case AUTH_LINK_TYPE_P2P:
918         case AUTH_LINK_TYPE_ENHANCED_P2P:
919             return PostCommData(GetConnId(connId), toServer, head, data);
920         case AUTH_LINK_TYPE_SESSION:
921             return PostBytesForSession(GetFd(connId), head, data);
922         default:
923             AUTH_LOGI(AUTH_CONN, "unknown connType");
924             break;
925     }
926     return SOFTBUS_AUTH_SEND_FAIL;
927 }
928 
GetConnSideType(uint64_t connId)929 ConnSideType GetConnSideType(uint64_t connId)
930 {
931     if (GetConnType(connId) == AUTH_LINK_TYPE_WIFI) {
932         AUTH_LOGE(AUTH_CONN, "WiFi not supported, " CONN_INFO, CONN_DATA(connId));
933         return CONN_SIDE_ANY;
934     }
935     ConnectionInfo info;
936     (void)memset_s(&info, sizeof(ConnectionInfo), 0, sizeof(ConnectionInfo));
937     if (ConnGetConnectionInfo(GetConnId(connId), &info)) {
938         AUTH_LOGE(AUTH_CONN, "ConnGetConnectionInfo fail, " CONN_INFO, CONN_DATA(connId));
939         return CONN_SIDE_ANY;
940     }
941     if (!info.isAvailable) {
942         AUTH_LOGE(AUTH_CONN, "connection not available, " CONN_INFO, CONN_DATA(connId));
943     }
944     return info.isServer ? CONN_SIDE_SERVER : CONN_SIDE_CLIENT;
945 }
946 
CheckActiveAuthConnection(const AuthConnInfo * connInfo)947 bool CheckActiveAuthConnection(const AuthConnInfo *connInfo)
948 {
949     ConnectOption connOpt;
950     CHECK_NULL_PTR_RETURN_VALUE(connInfo, false);
951     (void)memset_s(&connOpt, sizeof(ConnectOption), 0, sizeof(ConnectOption));
952     if (ConvertToConnectOption(connInfo, &connOpt) != SOFTBUS_OK) {
953         AUTH_LOGE(AUTH_CONN, "convert to connect option fail, connType=%{public}d.", connInfo->type);
954         return false;
955     }
956     if (connInfo->type == AUTH_LINK_TYPE_BLE) {
957         connOpt.bleOption.protocol = BLE_PROTOCOL_ANY;
958     }
959     return CheckActiveConnection(&connOpt, true);
960 }
961 
AuthStartListening(AuthLinkType type,const char * ip,int32_t port)962 int32_t AuthStartListening(AuthLinkType type, const char *ip, int32_t port)
963 {
964     if (ip == NULL) {
965         AUTH_LOGW(AUTH_CONN, "invalid param");
966         return SOFTBUS_INVALID_PARAM;
967     }
968     AUTH_LOGI(AUTH_CONN, "start auth listening, linkType=%{public}d, port=%{public}d", type, port);
969     LocalListenerInfo info = {
970         .type = CONNECT_TCP,
971         .socketOption = {
972             .addr = "",
973             .port = port,
974             .moduleId = AUTH,
975             .protocol = LNN_PROTOCOL_IP,
976         },
977     };
978 
979     if (strcpy_s(info.socketOption.addr, sizeof(info.socketOption.addr), ip) != EOK) {
980         AUTH_LOGE(AUTH_CONN, "strcpy_s ip fail");
981         return SOFTBUS_STRCPY_ERR;
982     }
983     switch (type) {
984         case AUTH_LINK_TYPE_WIFI: {
985             info.socketOption.moduleId = AUTH;
986             return StartSocketListening(AUTH, &info);
987         }
988         case AUTH_LINK_TYPE_RAW_ENHANCED_P2P: {
989             info.socketOption.moduleId = AUTH_RAW_P2P_SERVER;
990             info.socketOption.port = 0;
991             return StartSocketListening(AUTH_RAW_P2P_SERVER, &info);
992         }
993         default:
994             AUTH_LOGE(AUTH_CONN, "unsupport linkType=%{public}d", type);
995             break;
996     }
997     return SOFTBUS_INVALID_PARAM;
998 }
999 
AuthStopListening(AuthLinkType type)1000 void AuthStopListening(AuthLinkType type)
1001 {
1002     AUTH_LOGI(AUTH_CONN, "stop auth listening, linkType=%{public}d", type);
1003     switch (type) {
1004         case AUTH_LINK_TYPE_WIFI:
1005             StopSocketListening(AUTH);
1006             break;
1007         case AUTH_LINK_TYPE_RAW_ENHANCED_P2P:
1008             StopSocketListening(AUTH_RAW_P2P_SERVER);
1009             break;
1010         default:
1011             AUTH_LOGE(AUTH_CONN, "unsupport linkType=%{public}d", type);
1012             break;
1013     }
1014 }
1015 
AuthStartListeningForWifiDirect(AuthLinkType type,const char * ip,int32_t port,ListenerModule * moduleId)1016 int32_t AuthStartListeningForWifiDirect(AuthLinkType type, const char *ip, int32_t port, ListenerModule *moduleId)
1017 {
1018     AUTH_CHECK_AND_RETURN_RET_LOGE(ip != NULL, SOFTBUS_INVALID_PARAM, AUTH_CONN, "ip is null");
1019     AUTH_CHECK_AND_RETURN_RET_LOGE(moduleId != NULL, SOFTBUS_INVALID_PARAM, AUTH_CONN, "moduleId is null");
1020 
1021     LocalListenerInfo local;
1022     local.type = CONNECT_TCP;
1023     local.socketOption.port = port;
1024     local.socketOption.protocol = LNN_PROTOCOL_IP;
1025     int32_t ret = strcpy_s(local.socketOption.addr, sizeof(local.socketOption.addr), ip);
1026     AUTH_CHECK_AND_RETURN_RET_LOGE(ret == EOK, SOFTBUS_STRCPY_ERR, AUTH_CONN, "copy ip failed");
1027 
1028     if (type == AUTH_LINK_TYPE_P2P) {
1029         local.socketOption.moduleId = AUTH_P2P;
1030     } else if (type == AUTH_LINK_TYPE_ENHANCED_P2P) {
1031         local.socketOption.moduleId = (ListenerModule)(GetWifiDirectManager()->allocateListenerModuleId());
1032         AUTH_CHECK_AND_RETURN_RET_LOGE(local.socketOption.moduleId < UNUSE_BUTT,
1033             SOFTBUS_AUTH_LISTENER_MODULE_INVALID, AUTH_CONN, "alloc listener module id failed");
1034     } else {
1035         AUTH_LOGE(AUTH_CONN, "invalid type=%{public}d", type);
1036         return SOFTBUS_INVALID_PARAM;
1037     }
1038 
1039     int32_t realPort = ConnStartLocalListening(&local);
1040     if (realPort <= 0) {
1041         if (type == AUTH_LINK_TYPE_ENHANCED_P2P) {
1042             GetWifiDirectManager()->freeListenerModuleId(local.socketOption.moduleId);
1043         }
1044         AUTH_LOGE(AUTH_CONN, "start local listening failed");
1045         return realPort;
1046     }
1047     AUTH_LOGI(AUTH_CONN, "moduleId=%{public}u, port=%{public}d", local.socketOption.moduleId, realPort);
1048     *moduleId = local.socketOption.moduleId;
1049     return realPort;
1050 }
1051 
AuthStopListeningForWifiDirect(AuthLinkType type,ListenerModule moduleId)1052 void AuthStopListeningForWifiDirect(AuthLinkType type, ListenerModule moduleId)
1053 {
1054     AUTH_CHECK_AND_RETURN_LOGE(type == AUTH_LINK_TYPE_P2P || type == AUTH_LINK_TYPE_ENHANCED_P2P, AUTH_CONN,
1055                                "invalid type=%{public}d", type);
1056     LocalListenerInfo local = {
1057         .type = CONNECT_TCP,
1058         .socketOption = {
1059             .moduleId = moduleId,
1060             .protocol = LNN_PROTOCOL_IP,
1061         },
1062     };
1063 
1064     if (ConnStopLocalListening(&local) != SOFTBUS_OK) {
1065         AUTH_LOGE(AUTH_CONN, "ConnStopLocalListening fail");
1066     }
1067     GetWifiDirectManager()->freeListenerModuleId(moduleId);
1068 }