• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "softbus_conn_manager.h"
17 
18 #include <securec.h>
19 
20 #include "common_list.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_adapter_thread.h"
23 #include "softbus_base_listener.h"
24 #include "softbus_conn_ble_manager.h"
25 #include "softbus_conn_br_manager.h"
26 #include "softbus_conn_interface.h"
27 #include "softbus_datahead_transform.h"
28 #include "softbus_def.h"
29 #include "softbus_errcode.h"
30 #include "softbus_feature_config.h"
31 #include "softbus_hisysevt_connreporter.h"
32 #include "softbus_log.h"
33 #include "softbus_socket.h"
34 #include "softbus_tcp_connect_manager.h"
35 #include "softbus_utils.h"
36 
37 ConnectFuncInterface *g_connManager[CONNECT_TYPE_MAX] = { 0 };
38 static SoftBusList *g_listenerList = NULL;
39 static bool g_isInited = false;
40 static SoftBusList *g_connTimeList = NULL;
41 #define SEC_TIME 1000LL
42 
43 typedef struct TagConnListenerNode {
44     ListNode node;
45     ConnModule moduleId;
46     ConnectCallback callback;
47 } ConnListenerNode;
48 
49 typedef struct TagConnTimeNode {
50     ListNode node;
51     ConnectionInfo info;
52     uint32_t startTime;
53 } ConnTimeNode;
54 
AddConnTimeNode(const ConnectionInfo * info,ConnTimeNode * timeNode)55 static int32_t AddConnTimeNode(const ConnectionInfo *info, ConnTimeNode *timeNode)
56 {
57     if (g_connTimeList == NULL) {
58         CLOGE("g_connTimeList is null");
59         return SOFTBUS_ERR;
60     }
61     SoftBusSysTime now = { 0 };
62     SoftBusGetTime(&now);
63     timeNode->startTime = (uint32_t)now.sec * SEC_TIME + (uint32_t)now.usec / SEC_TIME;
64     if (memcpy_s(&(timeNode->info), sizeof(ConnectionInfo), info, sizeof(ConnectionInfo)) != EOK) {
65         CLOGE("AddConnTimeNode:memcpy timenode failed");
66         return SOFTBUS_ERR;
67     }
68     if (SoftBusMutexLock(&g_connTimeList->lock) != 0) {
69         CLOGE("AddConnTimeNode:lock mutex failed");
70         return SOFTBUS_ERR;
71     }
72     ListAdd(&(g_connTimeList->list), &(timeNode->node));
73     (void)SoftBusMutexUnlock(&g_connTimeList->lock);
74     return SOFTBUS_OK;
75 }
76 
CompareConnectInfo(const ConnectionInfo * src,const ConnectionInfo * dst)77 static int32_t CompareConnectInfo(const ConnectionInfo *src, const ConnectionInfo *dst)
78 {
79     if (src->type != dst->type) {
80         return SOFTBUS_ERR;
81     }
82     switch (src->type) {
83         case CONNECT_BLE:
84             if (strcasecmp(src->bleInfo.bleMac, dst->bleInfo.bleMac) != 0) {
85                 return SOFTBUS_ERR;
86             }
87             break;
88         case CONNECT_BR:
89             if (strcasecmp(src->brInfo.brMac, dst->brInfo.brMac) != 0) {
90                 return SOFTBUS_ERR;
91             }
92             break;
93         case CONNECT_TCP:
94             if (strcasecmp(src->socketInfo.addr, dst->socketInfo.addr) != 0) {
95                 return SOFTBUS_ERR;
96             }
97             break;
98         default:
99             return SOFTBUS_ERR;
100     }
101     return SOFTBUS_OK;
102 }
103 
GetConnTimeNode(const ConnectionInfo * info)104 static ConnTimeNode *GetConnTimeNode(const ConnectionInfo *info)
105 {
106     ConnTimeNode *listNode = NULL;
107     if (SoftBusMutexLock(&g_connTimeList->lock) != 0) {
108         CLOGE("GetConnTimeNode lock mutex failed");
109         return NULL;
110     }
111     LIST_FOR_EACH_ENTRY(listNode, &g_connTimeList->list, ConnTimeNode, node) {
112         if (listNode != NULL) {
113             if (CompareConnectInfo(&listNode->info, info) == SOFTBUS_OK) {
114                 CLOGD("find connect info success, ConnectType=%d", listNode->info.type);
115                 (void)SoftBusMutexUnlock(&g_connTimeList->lock);
116                 return listNode;
117             }
118         }
119     }
120     (void)SoftBusMutexUnlock(&g_connTimeList->lock);
121     return NULL;
122 }
123 
FreeConnTimeNode(ConnTimeNode * timeNode)124 static void FreeConnTimeNode(ConnTimeNode *timeNode)
125 {
126     ConnTimeNode *removeNode = NULL;
127     ConnTimeNode *next = NULL;
128     if (g_connTimeList == NULL) {
129         CLOGE("connTimeList is null");
130         return;
131     }
132 
133     if (SoftBusMutexLock(&g_connTimeList->lock) != 0) {
134         CLOGE("lock mutex failed");
135         return;
136     }
137 
138     LIST_FOR_EACH_ENTRY_SAFE(removeNode, next, &g_connTimeList->list, ConnTimeNode, node) {
139         if (removeNode->info.type == timeNode->info.type) {
140             if (CompareConnectInfo(&removeNode->info, &timeNode->info) == SOFTBUS_OK) {
141                 CLOGD("find connect info success, ConnectType=%d", removeNode->info.type);
142                 ListDelete(&(removeNode->node));
143                 break;
144             }
145         }
146     }
147     (void)SoftBusMutexUnlock(&g_connTimeList->lock);
148     SoftBusFree(removeNode);
149     return;
150 }
151 
ModuleCheck(ConnModule moduleId)152 static int32_t ModuleCheck(ConnModule moduleId)
153 {
154     ConnModule id[] = { MODULE_TRUST_ENGINE, MODULE_HICHAIN, MODULE_AUTH_SDK, MODULE_AUTH_CONNECTION,
155         MODULE_MESSAGE_SERVICE, MODULE_AUTH_CHANNEL, MODULE_AUTH_MSG, MODULE_BLUETOOTH_MANAGER, MODULE_CONNECTION,
156         MODULE_DIRECT_CHANNEL, MODULE_PROXY_CHANNEL, MODULE_DEVICE_AUTH, MODULE_P2P_LINK, MODULE_UDP_INFO,
157         MODULE_PKG_VERIFY, MODULE_META_AUTH, MODULE_BLE_NET, MODULE_BLE_CONN };
158     int32_t i;
159     int32_t idNum = sizeof(id) / sizeof(ConnModule);
160 
161     for (i = 0; i < idNum; i++) {
162         if (moduleId == id[i]) {
163             return SOFTBUS_OK;
164         }
165     }
166     CLOGE("check module fail %d", moduleId);
167     return SOFTBUS_ERR;
168 }
169 
ConnTypeCheck(ConnectType type)170 static int32_t ConnTypeCheck(ConnectType type)
171 {
172     if (type >= CONNECT_TYPE_MAX) {
173         CLOGE("type is over max %d", type);
174         return SOFTBUS_CONN_INVALID_CONN_TYPE;
175     }
176 
177     if (g_connManager[type] == NULL) {
178         CLOGE("type is %d", type);
179         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
180     }
181     return SOFTBUS_OK;
182 }
183 
GetAllListener(ConnListenerNode ** node)184 static int32_t GetAllListener(ConnListenerNode **node)
185 {
186     ConnListenerNode *listenerNode = NULL;
187     int32_t cnt = 0;
188 
189     if (g_listenerList == NULL) {
190         CLOGE("listener list is null");
191         return cnt;
192     }
193 
194     if (g_listenerList->cnt == 0) {
195         CLOGE("listener cnt is null");
196         return cnt;
197     }
198 
199     if (SoftBusMutexLock(&g_listenerList->lock) != 0) {
200         CLOGE("lock mutex failed");
201         return 0;
202     }
203     *node = SoftBusCalloc(g_listenerList->cnt * sizeof(ConnListenerNode));
204     if (*node == NULL) {
205         (void)SoftBusMutexUnlock(&g_listenerList->lock);
206         return cnt;
207     }
208     LIST_FOR_EACH_ENTRY(listenerNode, &g_listenerList->list, ConnListenerNode, node) {
209         if (memcpy_s(*node + cnt, sizeof(ConnListenerNode), listenerNode, sizeof(ConnListenerNode)) != EOK) {
210             CLOGE("mem error");
211             continue;
212         }
213         cnt++;
214     }
215     (void)SoftBusMutexUnlock(&g_listenerList->lock);
216     return cnt;
217 }
218 
GetListenerByModuleId(ConnModule moduleId,ConnListenerNode * node)219 static int32_t GetListenerByModuleId(ConnModule moduleId, ConnListenerNode *node)
220 {
221     ConnListenerNode *listenerNode = NULL;
222 
223     if (g_listenerList == NULL) {
224         return SOFTBUS_ERR;
225     }
226     int ret = SOFTBUS_OK;
227     if (SoftBusMutexLock(&g_listenerList->lock) != 0) {
228         CLOGE("lock mutex failed");
229         return SOFTBUS_ERR;
230     }
231     LIST_FOR_EACH_ENTRY(listenerNode, &g_listenerList->list, ConnListenerNode, node) {
232         if (listenerNode->moduleId == moduleId) {
233             if (memcpy_s(node, sizeof(ConnListenerNode), listenerNode, sizeof(ConnListenerNode)) != EOK) {
234                 ret = SOFTBUS_ERR;
235             }
236             (void)SoftBusMutexUnlock(&g_listenerList->lock);
237             return ret;
238         }
239     }
240     (void)SoftBusMutexUnlock(&g_listenerList->lock);
241     return SOFTBUS_ERR;
242 }
243 
AddListener(ConnModule moduleId,const ConnectCallback * callback)244 static int32_t AddListener(ConnModule moduleId, const ConnectCallback *callback)
245 {
246     ConnListenerNode *item = NULL;
247     ConnListenerNode *listNode = NULL;
248 
249     if (g_listenerList == NULL) {
250         return SOFTBUS_ERR;
251     }
252     if (SoftBusMutexLock(&g_listenerList->lock) != 0) {
253         CLOGE("lock mutex failed");
254         return SOFTBUS_ERR;
255     }
256     LIST_FOR_EACH_ENTRY(listNode, &g_listenerList->list, ConnListenerNode, node) {
257         if (listNode->moduleId == moduleId) {
258             (void)SoftBusMutexUnlock(&g_listenerList->lock);
259             return SOFTBUS_ERR;
260         }
261     }
262     item = (ConnListenerNode *)SoftBusCalloc(sizeof(ConnListenerNode));
263     if (item == NULL) {
264         CLOGE("malloc failed");
265         (void)SoftBusMutexUnlock(&g_listenerList->lock);
266         return SOFTBUS_ERR;
267     }
268     item->moduleId = moduleId;
269     item->callback = *callback;
270 
271     ListAdd(&(g_listenerList->list), &(item->node));
272     g_listenerList->cnt++;
273     (void)SoftBusMutexUnlock(&g_listenerList->lock);
274     return SOFTBUS_OK;
275 }
276 
DelListener(ConnModule moduleId)277 static void DelListener(ConnModule moduleId)
278 {
279     ConnListenerNode *removeNode = NULL;
280     if (g_listenerList == NULL) {
281         CLOGE("listenerList is null");
282         return;
283     }
284 
285     if (SoftBusMutexLock(&g_listenerList->lock) != 0) {
286         CLOGE("lock mutex failed");
287         return;
288     }
289 
290     LIST_FOR_EACH_ENTRY(removeNode, &g_listenerList->list, ConnListenerNode, node) {
291         if (removeNode->moduleId == moduleId) {
292             ListDelete(&(removeNode->node));
293             SoftBusFree(removeNode);
294             g_listenerList->cnt--;
295             break;
296         }
297     }
298     (void)SoftBusMutexUnlock(&g_listenerList->lock);
299     return;
300 }
301 
ConnGetHeadSize(void)302 NO_SANITIZE("cfi") uint32_t ConnGetHeadSize(void)
303 {
304     return sizeof(ConnPktHead);
305 }
306 
ConnGetNewRequestId(ConnModule moduleId)307 NO_SANITIZE("cfi") uint32_t ConnGetNewRequestId(ConnModule moduleId)
308 {
309 #define REQID_MAX 1000000
310     (void)moduleId;
311     static uint32_t reqId = 1;
312     reqId++;
313     reqId = reqId % REQID_MAX + 1;
314     return reqId;
315 }
316 
317 NO_SANITIZE("cfi")
ConnManagerRecvData(uint32_t connectionId,ConnModule moduleId,int64_t seq,char * data,int32_t len)318 void ConnManagerRecvData(uint32_t connectionId, ConnModule moduleId, int64_t seq, char *data, int32_t len)
319 {
320     CONN_CHECK_AND_RETURN_LOG(
321         data != NULL, "dispatch data failed: data is null, connection id=%u, module=%d", connectionId, moduleId);
322     CONN_CHECK_AND_RETURN_LOG(len > (int32_t)sizeof(ConnPktHead),
323         "dispatch data failed: data length less than connection header size, connection id=%u, module=%d, dataLen=%d",
324         connectionId, moduleId, len);
325 
326     ConnListenerNode listener = { 0 };
327     int32_t status = GetListenerByModuleId(moduleId, &listener);
328     CONN_CHECK_AND_RETURN_LOG(status == SOFTBUS_OK,
329         "dispatch data failed: get module listener failed or not register, connection id=%u, module=%d, dataLen=%d, "
330         "err=%d", connectionId, moduleId, len, status);
331 
332     int32_t pktLen = len - sizeof(ConnPktHead);
333     char *pkt = data + sizeof(ConnPktHead);
334     listener.callback.OnDataReceived(connectionId, moduleId, seq, pkt, pktLen);
335 }
336 
ReportConnectTime(const ConnectionInfo * info)337 static void ReportConnectTime(const ConnectionInfo *info)
338 {
339     if (info == NULL) {
340         CLOGE("ReportConnectTime:info is null");
341         return;
342     }
343     ConnTimeNode *timeNode = GetConnTimeNode(info);
344     if (timeNode == NULL) {
345         CLOGE("ReportConnectTime:get timeNode failed");
346     } else {
347         FreeConnTimeNode(timeNode);
348     }
349 }
350 
RecordStartTime(const ConnectOption * info)351 static void RecordStartTime(const ConnectOption *info)
352 {
353     ConnectionInfo conInfo = { 0 };
354     conInfo.type = info->type;
355     switch (info->type) {
356         case CONNECT_BR:
357             if (memcpy_s(&conInfo.brInfo.brMac, BT_MAC_LEN, info->brOption.brMac, BT_MAC_LEN) != EOK) {
358                 CLOGE("RecordStartTime:brMac memcpy failed");
359                 return;
360             }
361             break;
362         case CONNECT_BLE:
363             if (memcpy_s(&conInfo.bleInfo.bleMac, BT_MAC_LEN, info->bleOption.bleMac, BT_MAC_LEN) != EOK) {
364                 CLOGE("RecordStartTime:bleMac memcpy failed");
365                 return;
366             }
367             conInfo.bleInfo.protocol = info->bleOption.protocol;
368             conInfo.bleInfo.psm = info->bleDirectOption.psm;
369             break;
370         case CONNECT_TCP:
371             if (memcpy_s(&conInfo.socketInfo.addr, MAX_SOCKET_ADDR_LEN, info->socketOption.addr, MAX_SOCKET_ADDR_LEN) !=
372                 EOK) {
373                 CLOGE("RecordStartTime:addr memcpy failed");
374                 return;
375             }
376             break;
377         default:
378             CLOGE("RecordStartTime:do nothing");
379             break;
380     }
381     ConnTimeNode *timeNode = GetConnTimeNode(&conInfo);
382     if (timeNode == NULL) {
383         timeNode = (ConnTimeNode *)SoftBusCalloc(sizeof(ConnTimeNode));
384         if (timeNode == NULL) {
385             CLOGE("malloc node failed");
386         } else if (AddConnTimeNode(&conInfo, timeNode) != SOFTBUS_OK) {
387             SoftBusFree(timeNode);
388             CLOGE("AddConnTimeNode failed");
389         }
390     }
391 }
InitTimeNodeList()392 static int32_t InitTimeNodeList()
393 {
394     if (g_connTimeList == NULL) {
395         g_connTimeList = CreateSoftBusList();
396         if (g_connTimeList == NULL) {
397             CLOGE("create list failed");
398             return SOFTBUS_ERR;
399         }
400     }
401     return SOFTBUS_OK;
402 }
403 
ConnManagerConnected(uint32_t connectionId,const ConnectionInfo * info)404 NO_SANITIZE("cfi") void ConnManagerConnected(uint32_t connectionId, const ConnectionInfo *info)
405 {
406     ConnListenerNode *node = NULL;
407     ConnListenerNode *listener = NULL;
408 
409     int32_t num = GetAllListener(&node);
410     if (num == 0 || node == NULL) {
411         CLOGE("get node failed connId %u", connectionId);
412         return;
413     }
414 
415     for (int32_t i = 0; i < num; i++) {
416         listener = node + i;
417         listener->callback.OnConnected(connectionId, info);
418     }
419     SoftBusFree(node);
420     ReportConnectTime(info);
421     return;
422 }
423 
ConnManagerDisconnected(uint32_t connectionId,const ConnectionInfo * info)424 NO_SANITIZE("cfi") void ConnManagerDisconnected(uint32_t connectionId, const ConnectionInfo *info)
425 {
426     ConnListenerNode *node = NULL;
427     ConnListenerNode *listener = NULL;
428 
429     int32_t num = GetAllListener(&node);
430     if (num == 0 || node == NULL) {
431         return;
432     }
433     for (int32_t i = 0; i < num; i++) {
434         listener = node + i;
435         listener->callback.OnDisconnected(connectionId, info);
436     }
437     SoftBusFree(node);
438     return;
439 }
440 
ConnSetConnectCallback(ConnModule moduleId,const ConnectCallback * callback)441 NO_SANITIZE("cfi") int32_t ConnSetConnectCallback(ConnModule moduleId, const ConnectCallback *callback)
442 {
443     if (ModuleCheck(moduleId) != SOFTBUS_OK) {
444         return SOFTBUS_INVALID_PARAM;
445     }
446 
447     if (callback == NULL) {
448         return SOFTBUS_INVALID_PARAM;
449     }
450 
451     if ((callback->OnConnected == NULL) || (callback->OnDisconnected == NULL) || (callback->OnDataReceived == NULL)) {
452         return SOFTBUS_INVALID_PARAM;
453     }
454     return AddListener(moduleId, callback);
455 }
456 
ConnUnSetConnectCallback(ConnModule moduleId)457 NO_SANITIZE("cfi") void ConnUnSetConnectCallback(ConnModule moduleId)
458 {
459     DelListener(moduleId);
460     return;
461 }
462 
ConnTypeIsSupport(ConnectType type)463 NO_SANITIZE("cfi") int32_t ConnTypeIsSupport(ConnectType type)
464 {
465     return ConnTypeCheck(type);
466 }
467 
ConnConnectDevice(const ConnectOption * info,uint32_t requestId,const ConnectResult * result)468 NO_SANITIZE("cfi") int32_t ConnConnectDevice(const ConnectOption *info, uint32_t requestId, const ConnectResult *result)
469 {
470     if (info == NULL) {
471         return SOFTBUS_INVALID_PARAM;
472     }
473 
474     if (ConnTypeCheck(info->type) != SOFTBUS_OK) {
475         CLOGE("connect type is err %d", info->type);
476         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
477     }
478 
479     if (g_connManager[info->type]->ConnectDevice == NULL) {
480         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
481     }
482     RecordStartTime(info);
483     return g_connManager[info->type]->ConnectDevice(info, requestId, result);
484 }
485 
ConnGetTypeByConnectionId(uint32_t connectionId,ConnectType * type)486 NO_SANITIZE("cfi") int32_t ConnGetTypeByConnectionId(uint32_t connectionId, ConnectType *type)
487 {
488     CONN_CHECK_AND_RETURN_RET_LOG(type != NULL, SOFTBUS_INVALID_PARAM, "param error");
489 
490     ConnectType temp;
491     temp = (connectionId >> CONNECT_TYPE_SHIFT);
492     if (ConnTypeCheck(temp) != SOFTBUS_OK) {
493         CLOGE("connectionId type is err %u", temp);
494         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
495     }
496     *type = temp;
497     return SOFTBUS_OK;
498 }
499 
ConnPostBytes(uint32_t connectionId,ConnPostData * data)500 NO_SANITIZE("cfi") int32_t ConnPostBytes(uint32_t connectionId, ConnPostData *data)
501 {
502     ConnectType type;
503     ConnPktHead *head = NULL;
504 
505     if (data == NULL || data->buf == NULL) {
506         return SOFTBUS_INVALID_PARAM;
507     }
508 
509     if (data->len <= sizeof(ConnPktHead) || data->len > INT32_MAX) {
510         SoftBusFree(data->buf);
511         return SOFTBUS_CONN_MANAGER_PKT_LEN_INVALID;
512     }
513 
514     if (ConnGetTypeByConnectionId(connectionId, &type) != SOFTBUS_OK) {
515         SoftBusFree(data->buf);
516         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
517     }
518 
519     if (g_connManager[type]->PostBytes == NULL) {
520         SoftBusFree(data->buf);
521         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
522     }
523 
524     head = (ConnPktHead *)data->buf;
525     head->magic = MAGIC_NUMBER;
526     head->flag = data->flag;
527     head->module = data->module;
528     head->len = data->len - sizeof(ConnPktHead);
529     head->seq = data->seq;
530     PackConnPktHead(head);
531     return g_connManager[type]->PostBytes(
532         connectionId, (uint8_t *)data->buf, data->len, data->pid, data->flag, data->module, data->seq);
533 }
534 
ConnDisconnectDevice(uint32_t connectionId)535 NO_SANITIZE("cfi") int32_t ConnDisconnectDevice(uint32_t connectionId)
536 {
537     ConnectType type;
538     if (ConnGetTypeByConnectionId(connectionId, &type) != SOFTBUS_OK) {
539         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
540     }
541 
542     if (g_connManager[type]->DisconnectDevice == NULL) {
543         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
544     }
545     return g_connManager[type]->DisconnectDevice(connectionId);
546 }
547 
ConnDisconnectDeviceAllConn(const ConnectOption * option)548 NO_SANITIZE("cfi") int32_t ConnDisconnectDeviceAllConn(const ConnectOption *option)
549 {
550     if (option == NULL) {
551         return SOFTBUS_INVALID_PARAM;
552     }
553 
554     if (ConnTypeCheck(option->type) != SOFTBUS_OK) {
555         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
556     }
557 
558     if (g_connManager[option->type]->DisconnectDeviceNow == NULL) {
559         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
560     }
561     return g_connManager[option->type]->DisconnectDeviceNow(option);
562 }
563 
ConnGetConnectionInfo(uint32_t connectionId,ConnectionInfo * info)564 NO_SANITIZE("cfi") int32_t ConnGetConnectionInfo(uint32_t connectionId, ConnectionInfo *info)
565 {
566     ConnectType type;
567     if (ConnGetTypeByConnectionId(connectionId, &type) != SOFTBUS_OK) {
568         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
569     }
570 
571     if (g_connManager[type]->GetConnectionInfo == NULL) {
572         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
573     }
574 
575     return g_connManager[type]->GetConnectionInfo(connectionId, info);
576 }
577 
ConnStartLocalListening(const LocalListenerInfo * info)578 NO_SANITIZE("cfi") int32_t ConnStartLocalListening(const LocalListenerInfo *info)
579 {
580     if (info == NULL) {
581         return SOFTBUS_INVALID_PARAM;
582     }
583 
584     if (ConnTypeCheck(info->type) != SOFTBUS_OK) {
585         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
586     }
587 
588     if (g_connManager[info->type]->StartLocalListening == NULL) {
589         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
590     }
591 
592     return g_connManager[info->type]->StartLocalListening(info);
593 }
594 
ConnStopLocalListening(const LocalListenerInfo * info)595 NO_SANITIZE("cfi") int32_t ConnStopLocalListening(const LocalListenerInfo *info)
596 {
597     if (info == NULL) {
598         return SOFTBUS_INVALID_PARAM;
599     }
600 
601     if (ConnTypeCheck(info->type) != SOFTBUS_OK) {
602         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
603     }
604 
605     if (g_connManager[info->type]->StopLocalListening == NULL) {
606         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
607     }
608 
609     return g_connManager[info->type]->StopLocalListening(info);
610 }
611 
612 ConnectCallback g_connManagerCb = { 0 };
613 
ConnServerInit(void)614 NO_SANITIZE("cfi") int32_t ConnServerInit(void)
615 {
616     ConnectFuncInterface *connectObj = NULL;
617 
618     if (g_isInited) {
619         return SOFTBUS_ERR;
620     }
621 
622     int32_t ret = ConnInitSockets();
623     if (ret != SOFTBUS_OK) {
624         SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "ConnInitSockets failed!ret=%" PRId32 " \r\n", ret);
625         return ret;
626     }
627 
628     ret = InitBaseListener();
629     if (ret != SOFTBUS_OK) {
630         SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "InitBaseListener failed!ret=%" PRId32 " \r\n", ret);
631         return ret;
632     }
633 
634     g_connManagerCb.OnConnected = ConnManagerConnected;
635     g_connManagerCb.OnDisconnected = ConnManagerDisconnected;
636     g_connManagerCb.OnDataReceived = ConnManagerRecvData;
637 
638     int isSupportTcp = 0;
639     (void)SoftbusGetConfig(SOFTBUS_INT_SUPPORT_TCP_PROXY, (unsigned char *)&isSupportTcp, sizeof(isSupportTcp));
640     if (isSupportTcp) {
641         connectObj = ConnInitTcp(&g_connManagerCb);
642         if (connectObj != NULL) {
643             g_connManager[CONNECT_TCP] = connectObj;
644             CLOGI("init tcp ok");
645         }
646     }
647 
648     connectObj = ConnInitBr(&g_connManagerCb);
649     if (connectObj != NULL) {
650         g_connManager[CONNECT_BR] = connectObj;
651         CLOGI("init br ok");
652     }
653 
654     connectObj = ConnInitBle(&g_connManagerCb);
655     if (connectObj != NULL) {
656         g_connManager[CONNECT_BLE] = connectObj;
657         CLOGI("init ble ok");
658     }
659 
660     if (g_listenerList == NULL) {
661         g_listenerList = CreateSoftBusList();
662         if (g_listenerList == NULL) {
663             CLOGE("create list failed");
664             return SOFTBUS_ERR;
665         }
666     }
667     InitTimeNodeList();
668 
669     g_isInited = true;
670     CLOGI("connect manager init success.");
671     return SOFTBUS_OK;
672 }
673 
ConnServerDeinit(void)674 NO_SANITIZE("cfi") void ConnServerDeinit(void)
675 {
676     if (!g_isInited) {
677         return;
678     }
679 
680     ConnListenerNode *item = NULL;
681     if (g_listenerList != NULL) {
682         while (!IsListEmpty(&g_listenerList->list)) {
683             item = LIST_ENTRY((&g_listenerList->list)->next, ConnListenerNode, node);
684             ListDelete(&item->node);
685             SoftBusFree(item);
686         }
687         DestroySoftBusList(g_listenerList);
688         g_listenerList = NULL;
689     }
690 
691     DeinitBaseListener();
692 
693     g_isInited = false;
694 }
695 
CheckActiveConnection(const ConnectOption * info)696 NO_SANITIZE("cfi") bool CheckActiveConnection(const ConnectOption *info)
697 {
698     if (info == NULL) {
699         return false;
700     }
701 
702     if (ConnTypeCheck(info->type) != SOFTBUS_OK) {
703         CLOGE("connect type is err %d", info->type);
704         return false;
705     }
706 
707     if (g_connManager[info->type]->CheckActiveConnection == NULL) {
708         return false;
709     }
710 
711     return g_connManager[info->type]->CheckActiveConnection(info);
712 }
713 
ConnUpdateConnection(uint32_t connectionId,UpdateOption * option)714 int32_t ConnUpdateConnection(uint32_t connectionId, UpdateOption *option)
715 {
716     if (option == NULL) {
717         return SOFTBUS_INVALID_PARAM;
718     }
719 
720     ConnectType type;
721     if (ConnGetTypeByConnectionId(connectionId, &type) != SOFTBUS_OK) {
722         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
723     }
724     if (g_connManager[type]->UpdateConnection == NULL) {
725         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
726     }
727     return g_connManager[type]->UpdateConnection(connectionId, option);
728 }
729 
ConnPreventConnection(const ConnectOption * option,uint32_t time)730 int32_t ConnPreventConnection(const ConnectOption *option, uint32_t time)
731 {
732     if (option == NULL) {
733         return SOFTBUS_INVALID_PARAM;
734     }
735 
736     if (ConnTypeCheck(option->type) != SOFTBUS_OK) {
737         return SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT;
738     }
739 
740     if (g_connManager[option->type]->PreventConnection == NULL) {
741         return SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT;
742     }
743     return g_connManager[option->type]->PreventConnection(option, time);
744 }