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 }