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