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 }