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