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