• 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_tcp_connection.h"
22 #include "lnn_async_callback_utils.h"
23 #include "softbus_adapter_bt_common.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_adapter_socket.h"
26 #include "softbus_base_listener.h"
27 #include "softbus_conn_interface.h"
28 #include "softbus_def.h"
29 
30 #define AUTH_CONN_DATA_HEAD_SIZE           24
31 #define AUTH_CONN_CONNECT_TIMEOUT_MS       10000
32 #define AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY 1000
33 
34 typedef struct {
35     uint32_t requestId;
36     AuthConnInfo connInfo;
37 } ConnCmdInfo;
38 
39 typedef struct {
40     uint32_t requestId;
41     int32_t fd;
42     AuthConnInfo connInfo;
43     ListNode node;
44 } ConnRequest;
45 
46 static ListNode g_connRequestList = { &g_connRequestList, &g_connRequestList };
47 static AuthConnListener g_listener = { 0 };
RouteBuildClientAuthManager(int32_t cfd)48 void __attribute__((weak)) RouteBuildClientAuthManager(int32_t cfd)
49 {
50     (void)cfd;
51 }
RouteClearAuthChannelId(int32_t cfd)52 void __attribute__((weak)) RouteClearAuthChannelId(int32_t cfd)
53 {
54     (void)cfd;
55 }
56 
GenConnId(int32_t connType,int32_t id)57 uint64_t GenConnId(int32_t connType, int32_t id)
58 {
59     uint64_t connId = (uint64_t)connType;
60     connId = (connId << INT32_BIT_NUM) & MASK_UINT64_H32;
61     connId |= (((uint64_t)id) & MASK_UINT64_L32);
62     return connId;
63 }
64 
GetConnType(uint64_t connId)65 int32_t GetConnType(uint64_t connId)
66 {
67     return (int32_t)((connId >> INT32_BIT_NUM) & MASK_UINT64_L32);
68 }
69 
GetConnTypeStr(uint64_t connId)70 NO_SANITIZE("cfi") const char *GetConnTypeStr(uint64_t connId)
71 {
72     int32_t type = GetConnType(connId);
73     switch (type) {
74         case AUTH_LINK_TYPE_WIFI:
75             return "wifi/eth";
76         case AUTH_LINK_TYPE_BR:
77             return "br";
78         case AUTH_LINK_TYPE_BLE:
79             return "ble";
80         case AUTH_LINK_TYPE_P2P:
81             return "p2p";
82         default:
83             break;
84     }
85     return "unknown";
86 }
87 
GetConnId(uint64_t connId)88 uint32_t GetConnId(uint64_t connId)
89 {
90     return (uint32_t)(connId & MASK_UINT64_L32);
91 }
92 
GetFd(uint64_t connId)93 static int32_t GetFd(uint64_t connId)
94 {
95     return (int32_t)(connId & MASK_UINT64_L32);
96 }
97 
98 /* Conn Request */
AddConnRequest(const AuthConnInfo * connInfo,uint32_t requestId,int32_t fd)99 static int32_t AddConnRequest(const AuthConnInfo *connInfo, uint32_t requestId, int32_t fd)
100 {
101     ConnRequest *item = (ConnRequest *)SoftBusMalloc(sizeof(ConnRequest));
102     if (item == NULL) {
103         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: malloc ConnRequest fail.");
104         return SOFTBUS_MALLOC_ERR;
105     }
106     item->fd = fd;
107     item->requestId = requestId;
108     if (memcpy_s(&item->connInfo, sizeof(item->connInfo), connInfo, sizeof(AuthConnInfo)) != EOK) {
109         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: set AuthConnInfo fail.");
110         SoftBusFree(item);
111         return SOFTBUS_MEM_ERR;
112     }
113     ListTailInsert(&g_connRequestList, &item->node);
114     return SOFTBUS_OK;
115 }
116 
FindConnRequestByFd(int32_t fd)117 static ConnRequest *FindConnRequestByFd(int32_t fd)
118 {
119     ConnRequest *item = NULL;
120     LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
121         if (item->fd == fd) {
122             return item;
123         }
124     }
125     return NULL;
126 }
127 
FindConnRequestByRequestId(uint32_t requestId)128 static ConnRequest *FindConnRequestByRequestId(uint32_t requestId)
129 {
130     ConnRequest *item = NULL;
131     LIST_FOR_EACH_ENTRY(item, &g_connRequestList, ConnRequest, node) {
132         if (item->requestId == requestId) {
133             return item;
134         }
135     }
136     return NULL;
137 }
138 
DelConnRequest(ConnRequest * item)139 static void DelConnRequest(ConnRequest *item)
140 {
141     CHECK_NULL_PTR_RETURN_VOID(item);
142     ListDelete(&item->node);
143     SoftBusFree(item);
144 }
145 
ClearConnRequest(void)146 static void ClearConnRequest(void)
147 {
148     ConnRequest *item = NULL;
149     ConnRequest *next = NULL;
150     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_connRequestList, ConnRequest, node) {
151         DelConnRequest(item);
152     }
153 }
154 
155 /* Notify Conn Listener */
156 NO_SANITIZE("cfi")
NotifyClientConnected(uint32_t requestId,uint64_t connId,int32_t result,const AuthConnInfo * connInfo)157 static void NotifyClientConnected(uint32_t requestId, uint64_t connId, int32_t result, const AuthConnInfo *connInfo)
158 {
159     if (g_listener.onConnectResult != NULL) {
160         g_listener.onConnectResult(requestId, connId, result, connInfo);
161     }
162 }
163 
NotifyDisconnected(uint64_t connId,const AuthConnInfo * connInfo)164 NO_SANITIZE("cfi") static void NotifyDisconnected(uint64_t connId, const AuthConnInfo *connInfo)
165 {
166     if (g_listener.onDisconnected != NULL) {
167         g_listener.onDisconnected(connId, connInfo);
168     }
169 }
170 
171 NO_SANITIZE("cfi")
NotifyDataReceived(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)172 static void NotifyDataReceived(
173     uint64_t connId, const AuthConnInfo *connInfo, bool fromServer, const AuthDataHead *head, const uint8_t *data)
174 {
175     if (g_listener.onDataReceived != NULL) {
176         g_listener.onDataReceived(connId, connInfo, fromServer, head, data);
177     }
178 }
179 
180 /* AuthData */
GetAuthDataSize(uint32_t len)181 NO_SANITIZE("cfi") uint32_t GetAuthDataSize(uint32_t len)
182 {
183     return AUTH_CONN_DATA_HEAD_SIZE + len;
184 }
185 
PackAuthData(const AuthDataHead * head,const uint8_t * data,uint8_t * buf,uint32_t size)186 NO_SANITIZE("cfi") int32_t PackAuthData(const AuthDataHead *head, const uint8_t *data,
187     uint8_t *buf, uint32_t size)
188 {
189     if (size < GetAuthDataSize(head->len)) {
190         return SOFTBUS_NO_ENOUGH_DATA;
191     }
192     uint32_t offset = 0;
193     *(uint32_t *)buf = SoftBusHtoLl(head->dataType);
194     offset += sizeof(uint32_t);
195     *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->module);
196     offset += sizeof(uint32_t);
197     *(uint64_t *)(buf + offset) = SoftBusHtoLll((uint64_t)head->seq);
198     offset += sizeof(uint64_t);
199     *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)head->flag);
200     offset += sizeof(uint32_t);
201     *(uint32_t *)(buf + offset) = SoftBusHtoLl(head->len);
202     offset += sizeof(uint32_t);
203 
204     if (memcpy_s(buf + offset, size - offset, data, head->len) != EOK) {
205         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "pack AuthData fail.");
206         return SOFTBUS_MEM_ERR;
207     }
208     return SOFTBUS_OK;
209 }
210 
UnpackAuthData(const uint8_t * data,uint32_t len,AuthDataHead * head)211 NO_SANITIZE("cfi") const uint8_t *UnpackAuthData(const uint8_t *data, uint32_t len, AuthDataHead *head)
212 {
213     if (len < GetAuthDataSize(0)) {
214         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthData: head not enough.");
215         return NULL;
216     }
217     uint32_t offset = 0;
218     head->dataType = SoftBusLtoHl(*(uint32_t *)data);
219     offset += sizeof(uint32_t);
220     head->module = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
221     offset += sizeof(uint32_t);
222     head->seq = (int64_t)SoftBusLtoHll(*(uint64_t *)(data + offset));
223     offset += sizeof(uint64_t);
224     head->flag = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
225     offset += sizeof(uint32_t);
226     head->len = SoftBusLtoHl(*(uint32_t *)(data + offset));
227     offset += sizeof(uint32_t);
228     uint32_t dataLen = GetAuthDataSize(head->len);
229     if (len < dataLen || dataLen < GetAuthDataSize(0)) {
230         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthData: data not enough.");
231         return NULL;
232     }
233     return (data + offset);
234 }
235 
236 /* EVENT_CONNECT_TIMEOUT */
HandleConnConnectTimeout(const void * para)237 static void HandleConnConnectTimeout(const void *para)
238 {
239     CHECK_NULL_PTR_RETURN_VOID(para);
240     uint32_t requestId = *(uint32_t *)(para);
241     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: connect timeout, requestId=%u.", requestId);
242     ConnRequest *item = FindConnRequestByRequestId(requestId);
243     if (item != NULL) {
244         SocketDisconnectDevice(AUTH, item->fd);
245         DelConnRequest(item);
246     }
247     NotifyClientConnected(requestId, 0, SOFTBUS_AUTH_CONN_TIMEOUT, NULL);
248 }
249 
PostConnConnectTimeout(uint32_t requestId)250 static void PostConnConnectTimeout(uint32_t requestId)
251 {
252     PostAuthEvent(
253         EVENT_CONNECT_TIMEOUT, HandleConnConnectTimeout, &requestId, sizeof(requestId), AUTH_CONN_CONNECT_TIMEOUT_MS);
254 }
255 
RemoveFunc(const void * obj,void * param)256 static int32_t RemoveFunc(const void *obj, void *param)
257 {
258     CHECK_NULL_PTR_RETURN_VALUE(obj, SOFTBUS_ERR);
259     CHECK_NULL_PTR_RETURN_VALUE(param, SOFTBUS_ERR);
260     return ((*(uint32_t *)(obj) == *(uint32_t *)(param)) ? SOFTBUS_OK : SOFTBUS_ERR);
261 }
262 
RemoveConnConnectTimeout(uint32_t requestId)263 static void RemoveConnConnectTimeout(uint32_t requestId)
264 {
265     RemoveAuthEvent(EVENT_CONNECT_TIMEOUT, RemoveFunc, (void *)(&requestId));
266 }
267 
268 /* EVENT_CONNECT_CMD */
HandleConnConnectCmd(const void * para)269 static void HandleConnConnectCmd(const void *para)
270 {
271     CHECK_NULL_PTR_RETURN_VOID(para);
272     ConnCmdInfo *info = (ConnCmdInfo *)para;
273     if (info->connInfo.type != AUTH_LINK_TYPE_WIFI) {
274         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: invalid connType(=%d).", info->connInfo.type);
275         return;
276     }
277     int32_t fd = SocketConnectDevice(info->connInfo.info.ipInfo.ip, info->connInfo.info.ipInfo.port, false);
278     if (fd < 0) {
279         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthConn: SocketConnectDevice fail.");
280         RemoveConnConnectTimeout(info->requestId);
281         NotifyClientConnected(info->requestId, 0, SOFTBUS_AUTH_CONN_FAIL, NULL);
282         return;
283     }
284     (void)AddConnRequest(&info->connInfo, info->requestId, fd);
285 }
286 
287 /* EVENT_CONNECT_RESULT */
HandleConnConnectResult(const void * para)288 static void HandleConnConnectResult(const void *para)
289 {
290     CHECK_NULL_PTR_RETURN_VOID(para);
291     int32_t fd = *(int32_t *)(para);
292     RouteBuildClientAuthManager(fd);
293     ConnRequest *item = FindConnRequestByFd(fd);
294     if (item == NULL) {
295         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnRequest not found, fd=%d.", fd);
296         return;
297     }
298     RemoveConnConnectTimeout(item->requestId);
299     NotifyClientConnected(item->requestId, GenConnId(AUTH_LINK_TYPE_WIFI, fd), SOFTBUS_OK, &item->connInfo);
300     DelConnRequest(item);
301 }
302 
303 /* WiFi Connection */
OnWiFiConnected(ListenerModule module,int32_t fd,bool isClient)304 static void OnWiFiConnected(ListenerModule module, int32_t fd, bool isClient)
305 {
306     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnWiFiConnected: fd=%d, side=%s.", fd,
307         isClient ? "client" : "server(ignored)");
308     if (!isClient) {
309         /* do nothing, wait auth message. */
310         return;
311     }
312     (void)PostAuthEvent(EVENT_CONNECT_RESULT, HandleConnConnectResult, &fd, sizeof(fd), 0);
313 }
314 
OnWiFiDisconnected(int32_t fd)315 static void OnWiFiDisconnected(int32_t fd)
316 {
317     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnWiFiDisconnected: fd=%d.", fd);
318     AuthConnInfo connInfo;
319     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
320     connInfo.type = AUTH_LINK_TYPE_WIFI;
321     NotifyDisconnected(GenConnId(connInfo.type, fd), &connInfo);
322     RouteClearAuthChannelId(fd);
323 }
324 
OnWiFiDataReceived(ListenerModule module,int32_t fd,const AuthDataHead * head,const uint8_t * data)325 static void OnWiFiDataReceived(ListenerModule module, int32_t fd, const AuthDataHead *head, const uint8_t *data)
326 {
327     CHECK_NULL_PTR_RETURN_VOID(head);
328     CHECK_NULL_PTR_RETURN_VOID(data);
329 
330     if (module != AUTH && module != AUTH_P2P) {
331         return;
332     }
333     bool fromServer = false;
334     AuthConnInfo connInfo;
335     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
336     if (SocketGetConnInfo(fd, &connInfo, &fromServer) != SOFTBUS_OK) {
337         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get connInfo fail, fd=%d.", fd);
338         return;
339     }
340     NotifyDataReceived(GenConnId(connInfo.type, fd), &connInfo, fromServer, head, data);
341 }
342 
InitWiFiConn(void)343 static int32_t InitWiFiConn(void)
344 {
345     SocketCallback socketCb = {
346         .onConnected = OnWiFiConnected,
347         .onDisconnected = OnWiFiDisconnected,
348         .onDataReceived = OnWiFiDataReceived,
349     };
350     return SetSocketCallback(&socketCb);
351 }
352 
353 /* BR/BLE/P2P Connection */
OnCommConnected(uint32_t connectionId,const ConnectionInfo * info)354 static void OnCommConnected(uint32_t connectionId, const ConnectionInfo *info)
355 {
356     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "(ignored)OnCommConnected: connectionId=%u.", connectionId);
357 }
358 
OnCommDisconnected(uint32_t connectionId,const ConnectionInfo * info)359 static void OnCommDisconnected(uint32_t connectionId, const ConnectionInfo *info)
360 {
361     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnCommDisconnected: connectionId=%u.", connectionId);
362     CHECK_NULL_PTR_RETURN_VOID(info);
363     AuthConnInfo connInfo;
364     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
365     (void)ConvertToAuthConnInfo(info, &connInfo);
366     NotifyDisconnected(GenConnId(connInfo.type, connectionId), &connInfo);
367 }
368 
GetConnInfoByConnectionId(uint32_t connectionId,AuthConnInfo * connInfo)369 NO_SANITIZE("cfi") int32_t GetConnInfoByConnectionId(uint32_t connectionId, AuthConnInfo *connInfo)
370 {
371     ConnectionInfo info = { 0 };
372     int32_t ret = ConnGetConnectionInfo(connectionId, &info);
373     if (ret != SOFTBUS_OK) {
374         SoftBusLog(
375             SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "GetConnectionInfo fail(=%d), connectionId=%u.", ret, connectionId);
376         return SOFTBUS_ERR;
377     }
378     return ConvertToAuthConnInfo(&info, connInfo);
379 }
380 
OnCommDataReceived(uint32_t connectionId,ConnModule moduleId,int64_t seq,char * data,int32_t len)381 static void OnCommDataReceived(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len)
382 {
383     if (data == NULL || moduleId != MODULE_DEVICE_AUTH || len <= 0) {
384         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "RecvCommData: invalid param.");
385         return;
386     }
387     bool fromServer = ((seq % SEQ_INTERVAL) != 0);
388     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
389         "RecvCommData: connectionId=%u, module=%d, seq=%" PRId64 ", len=%d, from=%s.", connectionId, moduleId, seq, len,
390         GetAuthSideStr(fromServer));
391     AuthConnInfo connInfo;
392     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
393     if (GetConnInfoByConnectionId(connectionId, &connInfo) != SOFTBUS_OK) {
394         return;
395     }
396     AuthDataHead head = { 0 };
397     const uint8_t *body = UnpackAuthData((const uint8_t *)data, (uint32_t)len, &head);
398     if (body == NULL) {
399         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "RecvCommData: empty body.");
400         return;
401     }
402     NotifyDataReceived(GenConnId(connInfo.type, connectionId), &connInfo, fromServer, &head, body);
403 }
404 
AsyncCallDeviceIdReceived(void * para)405 static void AsyncCallDeviceIdReceived(void *para)
406 {
407     RepeatDeviceIdData *recvData = (RepeatDeviceIdData *)para;
408     if (recvData == NULL) {
409         return;
410     }
411     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
412         "Delay handle RecvCommData: connectionId=%u, len=%d, from=%s.", recvData->connId, recvData->len,
413         GetAuthSideStr(recvData->fromServer));
414     NotifyDataReceived(recvData->connId, &recvData->connInfo, recvData->fromServer, &recvData->head, recvData->data);
415     SoftBusFree(para);
416 }
417 
HandleRepeatDeviceIdDataDelay(uint64_t connId,const AuthConnInfo * connInfo,bool fromServer,const AuthDataHead * head,const uint8_t * data)418 void HandleRepeatDeviceIdDataDelay(uint64_t connId, const AuthConnInfo *connInfo, bool fromServer,
419     const AuthDataHead *head, const uint8_t *data)
420 {
421     RepeatDeviceIdData *request = (RepeatDeviceIdData *)SoftBusCalloc(sizeof(RepeatDeviceIdData) + head->len);
422     if (request == NULL) {
423         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc RepeatDeviceIdData fail");
424         return;
425     }
426     request->len = head->len;
427     if (data != NULL && head->len > 0 && memcpy_s(request->data, head->len, data, head->len) != EOK) {
428         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy data fail");
429         SoftBusFree(request);
430         return;
431     }
432     request->connId = connId;
433     request->connInfo = *connInfo;
434     request->fromServer = fromServer;
435     request->head = *head;
436     if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), AsyncCallDeviceIdReceived, request,
437         AUTH_REPEAT_DEVICE_ID_HANDLE_DELAY) != SOFTBUS_OK) {
438         SoftBusFree(request);
439     }
440 }
441 
InitCommConn(void)442 static int32_t InitCommConn(void)
443 {
444     ConnectCallback connCb = {
445         .OnConnected = OnCommConnected,
446         .OnDisconnected = OnCommDisconnected,
447         .OnDataReceived = OnCommDataReceived,
448     };
449     return ConnSetConnectCallback(MODULE_DEVICE_AUTH, &connCb);
450 }
451 
OnCommConnectSucc(uint32_t requestId,uint32_t connectionId,const ConnectionInfo * info)452 static void OnCommConnectSucc(uint32_t requestId, uint32_t connectionId, const ConnectionInfo *info)
453 {
454     AuthConnInfo connInfo;
455     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnCommConnectSucc: requestId=%u, connectionId=%u.", requestId,
456         connectionId);
457     CHECK_NULL_PTR_RETURN_VOID(info);
458     (void)memset_s(&connInfo, sizeof(AuthConnInfo), 0, sizeof(AuthConnInfo));
459     (void)ConvertToAuthConnInfo(info, &connInfo);
460     RemoveConnConnectTimeout(requestId);
461     NotifyClientConnected(requestId, GenConnId(connInfo.type, connectionId), SOFTBUS_OK, &connInfo);
462 }
463 
OnCommConnectFail(uint32_t requestId,int32_t reason)464 static void OnCommConnectFail(uint32_t requestId, int32_t reason)
465 {
466     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "OnCommConnectFail: requestId=%u, reason=%d.", requestId, reason);
467     RemoveConnConnectTimeout(requestId);
468     NotifyClientConnected(requestId, 0, SOFTBUS_CONN_FAIL, NULL);
469 }
470 
ConnectCommDevice(const AuthConnInfo * info,uint32_t requestId,ConnSideType sideType)471 static int32_t ConnectCommDevice(const AuthConnInfo *info, uint32_t requestId, ConnSideType sideType)
472 {
473     ConnectOption option;
474     (void)memset_s(&option, sizeof(ConnectOption), 0, sizeof(ConnectOption));
475     int32_t ret = ConvertToConnectOption(info, &option);
476     if (ret != SOFTBUS_OK) {
477         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConvertToConnectOption fail(=%d).", ret);
478         return SOFTBUS_ERR;
479     }
480     if (option.type == CONNECT_BR) {
481         option.brOption.sideType = sideType;
482     }
483     ConnectResult result = {
484         .OnConnectSuccessed = OnCommConnectSucc,
485         .OnConnectFailed = OnCommConnectFail,
486     };
487     ret = ConnConnectDevice(&option, requestId, &result);
488     if (ret != SOFTBUS_OK) {
489         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnConnectDevice fail(=%d).", ret);
490         return SOFTBUS_CONN_FAIL;
491     }
492     return SOFTBUS_OK;
493 }
494 
PostCommData(uint32_t connectionId,bool toServer,const AuthDataHead * head,const uint8_t * data)495 static int32_t PostCommData(uint32_t connectionId, bool toServer, const AuthDataHead *head, const uint8_t *data)
496 {
497     uint32_t size = ConnGetHeadSize() + GetAuthDataSize(head->len);
498     uint8_t *buf = (uint8_t *)SoftBusMalloc(size);
499     if (buf == NULL) {
500         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "PostCommData: malloc fail.");
501         return SOFTBUS_ERR;
502     }
503     int32_t ret = PackAuthData(head, data, buf + ConnGetHeadSize(), size - ConnGetHeadSize());
504     if (ret != SOFTBUS_OK) {
505         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "PostCommData: pack data fail(=%d).", ret);
506         SoftBusFree(buf);
507         return ret;
508     }
509     ConnPostData connData = {
510         .module = MODULE_DEVICE_AUTH,
511         .seq = GenSeq(!toServer),
512         .flag = CONN_HIGH,
513         .pid = 0,
514         .len = size,
515         .buf = (char *)buf,
516     };
517     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
518         "PostCommData: data{seq=%" PRId64 ", len=%u} conn{id=%u, seq=%" PRId64 ", len=%u}",
519         head->seq, head->len, connectionId, connData.seq, connData.len);
520     return ConnPostBytes(connectionId, &connData);
521 }
522 
AuthConnInit(const AuthConnListener * listener)523 NO_SANITIZE("cfi") int32_t AuthConnInit(const AuthConnListener *listener)
524 {
525     CHECK_NULL_PTR_RETURN_VALUE(listener, SOFTBUS_INVALID_PARAM);
526     g_listener = *listener;
527     ListInit(&g_connRequestList);
528     if (InitCommConn() != SOFTBUS_OK) {
529         (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
530         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "init br/ble/p2p conn fail.");
531         return SOFTBUS_ERR;
532     }
533     if (InitWiFiConn() != SOFTBUS_OK) {
534         (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
535         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "init wifi conn fail.");
536         return SOFTBUS_ERR;
537     }
538     return SOFTBUS_OK;
539 }
540 
AuthConnDeinit(void)541 NO_SANITIZE("cfi") void AuthConnDeinit(void)
542 {
543     UnsetSocketCallback();
544     ConnUnSetConnectCallback(MODULE_DEVICE_AUTH);
545     ClearConnRequest();
546     (void)memset_s(&g_listener, sizeof(g_listener), 0, sizeof(AuthConnListener));
547 }
548 
ConnectAuthDevice(uint32_t requestId,const AuthConnInfo * connInfo,ConnSideType sideType)549 NO_SANITIZE("cfi") int32_t ConnectAuthDevice(uint32_t requestId, const AuthConnInfo *connInfo, ConnSideType sideType)
550 {
551     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
552     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "ConnectDevice: requestId=%u, connType=%d, sideType=%d.", requestId,
553         connInfo->type, sideType);
554     PostConnConnectTimeout(requestId);
555     int32_t ret = 0;
556     switch (connInfo->type) {
557         case AUTH_LINK_TYPE_WIFI: {
558             ConnCmdInfo info = {
559                 .requestId = requestId,
560                 .connInfo = *connInfo,
561             };
562             ret = PostAuthEvent(EVENT_CONNECT_CMD, HandleConnConnectCmd, &info, sizeof(ConnCmdInfo), 0);
563             break;
564         }
565         case AUTH_LINK_TYPE_BLE:
566             /* fall-through */
567         case AUTH_LINK_TYPE_BR:
568             if (SoftBusGetBtState() != BLE_ENABLE) {
569                 ret = SOFTBUS_AUTH_CONN_FAIL;
570                 break;
571             }
572             /* fall-through */
573         case AUTH_LINK_TYPE_P2P:
574             ret = ConnectCommDevice(connInfo, requestId, sideType);
575             break;
576         default:
577             ret = SOFTBUS_OK;
578             break;
579     }
580     if (ret != SOFTBUS_OK) {
581         RemoveConnConnectTimeout(requestId);
582         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnectDevice fail, requestId=%u.", requestId);
583     }
584     return ret;
585 }
586 
UpdateAuthDevicePriority(uint64_t connId)587 void UpdateAuthDevicePriority(uint64_t connId)
588 {
589     if (GetConnType(connId) != AUTH_LINK_TYPE_BLE) {
590         return;
591     }
592     UpdateOption option = {
593         .type = CONNECT_BLE,
594         .bleOption = {
595             .priority = CONN_BLE_PRIORITY_BALANCED,
596         }
597     };
598     int32_t ret = ConnUpdateConnection(GetConnId(connId), &option);
599     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "update connecton priority to balanced, connType=%d, id=%u, ret: %d",
600         GetConnType(connId), GetConnId(connId), ret);
601 }
602 
DisconnectAuthDevice(uint64_t connId)603 NO_SANITIZE("cfi") void DisconnectAuthDevice(uint64_t connId)
604 {
605     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "DisconnectDevice: connType=%d, id=%u.", GetConnType(connId),
606         GetConnId(connId));
607     switch (GetConnType(connId)) {
608         case AUTH_LINK_TYPE_WIFI:
609             SocketDisconnectDevice(AUTH, GetFd(connId));
610             break;
611         case AUTH_LINK_TYPE_BLE:
612             /* fall-through */
613         case AUTH_LINK_TYPE_BR:
614             ConnDisconnectDevice(GetConnId(connId));
615             /* fall-through */
616         case AUTH_LINK_TYPE_P2P:
617             break;
618         default:
619             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "unknown connType.");
620             break;
621     }
622 }
623 
PostAuthData(uint64_t connId,bool toServer,const AuthDataHead * head,const uint8_t * data)624 NO_SANITIZE("cfi") int32_t PostAuthData(uint64_t connId, bool toServer, const AuthDataHead *head, const uint8_t *data)
625 {
626     CHECK_NULL_PTR_RETURN_VALUE(head, SOFTBUS_INVALID_PARAM);
627     CHECK_NULL_PTR_RETURN_VALUE(data, SOFTBUS_INVALID_PARAM);
628     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
629         "auth post data{type=0x%x, module=%d, seq=%" PRId64 ", flag=%d, len=%u} " CONN_INFO " to[%s]", head->dataType,
630         head->module, head->seq, head->flag, head->len, CONN_DATA(connId), GetAuthSideStr(toServer));
631     switch (GetConnType(connId)) {
632         case AUTH_LINK_TYPE_WIFI:
633             return SocketPostBytes(GetFd(connId), head, data);
634         case AUTH_LINK_TYPE_BLE:
635         case AUTH_LINK_TYPE_BR:
636         case AUTH_LINK_TYPE_P2P:
637             return PostCommData(GetConnId(connId), toServer, head, data);
638         default:
639             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "unknown connType.");
640             break;
641     }
642     return SOFTBUS_ERR;
643 }
644 
GetConnSideType(uint64_t connId)645 NO_SANITIZE("cfi") ConnSideType GetConnSideType(uint64_t connId)
646 {
647     if (GetConnType(connId) == AUTH_LINK_TYPE_WIFI) {
648         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "WiFi not supported, " CONN_INFO, CONN_DATA(connId));
649         return CONN_SIDE_ANY;
650     }
651     ConnectionInfo info;
652     (void)memset_s(&info, sizeof(ConnectionInfo), 0, sizeof(ConnectionInfo));
653     if (ConnGetConnectionInfo(GetConnId(connId), &info)) {
654         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnGetConnectionInfo fail, " CONN_INFO, CONN_DATA(connId));
655         return CONN_SIDE_ANY;
656     }
657     if (!info.isAvailable) {
658         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "connection not available, " CONN_INFO, CONN_DATA(connId));
659     }
660     return info.isServer ? CONN_SIDE_SERVER : CONN_SIDE_CLIENT;
661 }
662 
CheckActiveAuthConnection(const AuthConnInfo * connInfo)663 NO_SANITIZE("cfi") bool CheckActiveAuthConnection(const AuthConnInfo *connInfo)
664 {
665     ConnectOption connOpt;
666     CHECK_NULL_PTR_RETURN_VALUE(connInfo, false);
667     (void)memset_s(&connOpt, sizeof(ConnectOption), 0, sizeof(ConnectOption));
668     if (ConvertToConnectOption(connInfo, &connOpt) != SOFTBUS_OK) {
669         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "convert to connect option fail, connType=%d.", connInfo->type);
670         return false;
671     }
672     return CheckActiveConnection(&connOpt);
673 }
674 
AuthStartListening(AuthLinkType type,const char * ip,int32_t port)675 NO_SANITIZE("cfi") int32_t AuthStartListening(AuthLinkType type, const char *ip, int32_t port)
676 {
677     if (ip == NULL) {
678         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid param.");
679         return SOFTBUS_INVALID_PARAM;
680     }
681     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "start auth listening, type=%d, port=%d.", type, port);
682     switch (type) {
683         case AUTH_LINK_TYPE_WIFI: {
684             LocalListenerInfo info = {
685                 .type = CONNECT_TCP,
686                 .socketOption = {
687                     .addr = "",
688                     .port = port,
689                     .moduleId = AUTH,
690                     .protocol = LNN_PROTOCOL_IP,
691                 },
692             };
693 
694             if (strcpy_s(info.socketOption.addr, sizeof(info.socketOption.addr), ip) != EOK) {
695                 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "strcpy_s ip fail.");
696                 return SOFTBUS_MEM_ERR;
697             }
698             return StartSocketListening(AUTH, &info);
699         }
700         case AUTH_LINK_TYPE_P2P: {
701             LocalListenerInfo local = {
702                 .type = CONNECT_TCP,
703                 .socketOption = {
704                     .addr = "",
705                     .port = port,
706                     .moduleId = AUTH_P2P,
707                     .protocol = LNN_PROTOCOL_IP,
708                 },
709             };
710             if (strcpy_s(local.socketOption.addr, sizeof(local.socketOption.addr), ip) != EOK) {
711                 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "strcpy_s ip fail.");
712                 return SOFTBUS_MEM_ERR;
713             }
714             return ConnStartLocalListening(&local);
715         }
716         default:
717             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "unsupport link type:%d.", type);
718             break;
719     }
720     return SOFTBUS_INVALID_PARAM;
721 }
722 
AuthStopListening(AuthLinkType type)723 NO_SANITIZE("cfi") void AuthStopListening(AuthLinkType type)
724 {
725     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "stop auth listening, type=%d.", type);
726     switch (type) {
727         case AUTH_LINK_TYPE_WIFI:
728             StopSocketListening();
729             break;
730         case AUTH_LINK_TYPE_P2P: {
731             LocalListenerInfo local = {
732                 .type = CONNECT_TCP,
733                 .socketOption = {
734                     .moduleId = AUTH_P2P,
735                     .protocol = LNN_PROTOCOL_IP,
736                 },
737             };
738             if (ConnStopLocalListening(&local) != SOFTBUS_OK) {
739                 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnStopLocalListening fail.");
740             }
741             break;
742         }
743         default:
744             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "unsupport link type:%d.", type);
745             break;
746     }
747 }
748